pax_global_header00006660000000000000000000000064126041750230014512gustar00rootroot0000000000000052 comment=724404f8f0637d55d145462b7e44abbc7ac67ae8 clementine-1.2.3+git1354-gdaddbde+dfsg/000077500000000000000000000000001260417502300173675ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/000077500000000000000000000000001260417502300211375ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/000077500000000000000000000000001260417502300222375ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/CHANGES000066400000000000000000000055251260417502300232410ustar00rootroot00000000000000Changes for 1.5.0: * New feature: Google Mock can be safely used in multi-threaded tests on platforms having pthreads. * New feature: function for printing a value of arbitrary type. * New feature: function ExplainMatchResult() for easy definition of composite matchers. * The new matcher API lets user-defined matchers generate custom explanations more directly and efficiently. * Better failure messages all around. * NotNull() and IsNull() now work with smart pointers. * Field() and Property() now work when the matcher argument is a pointer passed by reference. * Regular expression matchers on all platforms. * Added GCC 4.0 support for Google Mock Doctor. * Added gmock_all_test.cc for compiling most Google Mock tests in a single file. * Significantly cleaned up compiler warnings. * Bug fixes, better test coverage, and implementation clean-ups. Potentially breaking changes: * Custom matchers defined using MatcherInterface or MakePolymorphicMatcher() need to be updated after upgrading to Google Mock 1.5.0; matchers defined using MATCHER or MATCHER_P* aren't affected. * Dropped support for 'make install'. Changes for 1.4.0 (we skipped 1.2.* and 1.3.* to match the version of Google Test): * Works in more environments: Symbian and minGW, Visual C++ 7.1. * Lighter weight: comes with our own implementation of TR1 tuple (no more dependency on Boost!). * New feature: --gmock_catch_leaked_mocks for detecting leaked mocks. * New feature: ACTION_TEMPLATE for defining templatized actions. * New feature: the .After() clause for specifying expectation order. * New feature: the .With() clause for for specifying inter-argument constraints. * New feature: actions ReturnArg(), ReturnNew(...), and DeleteArg(). * New feature: matchers Key(), Pair(), Args<...>(), AllArgs(), IsNull(), and Contains(). * New feature: utility class MockFunction, useful for checkpoints, etc. * New feature: functions Value(x, m) and SafeMatcherCast(m). * New feature: copying a mock object is rejected at compile time. * New feature: a script for fusing all Google Mock and Google Test source files for easy deployment. * Improved the Google Mock doctor to diagnose more diseases. * Improved the Google Mock generator script. * Compatibility fixes for Mac OS X and gcc. * Bug fixes and implementation clean-ups. Changes for 1.1.0: * New feature: ability to use Google Mock with any testing framework. * New feature: macros for easily defining new matchers * New feature: macros for easily defining new actions. * New feature: more container matchers. * New feature: actions for accessing function arguments and throwing exceptions. * Improved the Google Mock doctor script for diagnosing compiler errors. * Bug fixes and implementation clean-ups. Changes for 1.0.0: * Initial Open Source release of Google Mock clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/CONTRIBUTORS000066400000000000000000000025311260417502300241200ustar00rootroot00000000000000# This file contains a list of people who've made non-trivial # contribution to the Google C++ Mocking Framework project. People # who commit code to the project are encouraged to add their names # here. Please keep the list sorted by first names. Benoit Sigoure Bogdan Piloca Chandler Carruth Dave MacLachlan David Anderson Dean Sturtevant Gene Volovich Hal Burch Jeffrey Yasskin Jim Keller Joe Walnes Jon Wray Keir Mierle Keith Ray Kostya Serebryany Lev Makhlis Manuel Klimek Mario Tanev Mark Paskin Markus Heule Matthew Simmons Mike Bland Neal Norwitz Nermin Ozkiranartli Owen Carlsen Paneendra Ba Paul Menage Piotr Kaminski Russ Rufer Sverre Sundsdal Takeshi Yoshino Vadim Berman Vlad Losev Wolfgang Klier Zhanyong Wan clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/COPYING000066400000000000000000000027031260417502300232740ustar00rootroot00000000000000Copyright 2008, Google Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/README000066400000000000000000000322661260417502300231300ustar00rootroot00000000000000Google C++ Mocking Framework ============================ http://code.google.com/p/googlemock/ Overview -------- Google's framework for writing and using C++ mock classes on a variety of platforms (Linux, Mac OS X, Windows, Windows CE, Symbian, etc). Inspired by jMock, EasyMock, and Hamcrest, and designed with C++'s specifics in mind, it can help you derive better designs of your system and write better tests. Google Mock: - provides a declarative syntax for defining mocks, - can easily define partial (hybrid) mocks, which are a cross of real and mock objects, - handles functions of arbitrary types and overloaded functions, - comes with a rich set of matchers for validating function arguments, - uses an intuitive syntax for controlling the behavior of a mock, - does automatic verification of expectations (no record-and-replay needed), - allows arbitrary (partial) ordering constraints on function calls to be expressed, - lets a user extend it by defining new matchers and actions. - does not use exceptions, and - is easy to learn and use. Please see the project page above for more information as well as the mailing list for questions, discussions, and development. There is also an IRC channel on OFTC (irc.oftc.net) #gtest available. Please join us! Please note that code under scripts/generator/ is from the cppclean project (http://code.google.com/p/cppclean/) and under the Apache License, which is different from Google Mock's license. Requirements for End Users -------------------------- Google Mock is implemented on top of the Google Test C++ testing framework (http://code.google.com/p/googletest/), and includes the latter as part of the SVN repositary and distribution package. You must use the bundled version of Google Test when using Google Mock, or you may get compiler/linker errors. You can also easily configure Google Mock to work with another testing framework of your choice; although it will still need Google Test as an internal dependency. Please read http://code.google.com/p/googlemock/wiki/ForDummies#Using_Google_Mock_with_Any_Testing_Framework for how to do it. Google Mock depends on advanced C++ features and thus requires a more modern compiler. The following are needed to use Google Mock: ### Linux Requirements ### These are the base requirements to build and use Google Mock from a source package (as described below): * GNU-compatible Make or "gmake" * POSIX-standard shell * POSIX(-2) Regular Expressions (regex.h) * C++98-standard-compliant compiler (e.g. GCC 3.4 or newer) ### Windows Requirements ### * Microsoft Visual C++ 8.0 SP1 or newer ### Mac OS X Requirements ### * Mac OS X 10.4 Tiger or newer * Developer Tools Installed Requirements for Contributors ----------------------------- We welcome patches. If you plan to contribute a patch, you need to build Google Mock and its own tests from an SVN checkout (described below), which has further requirements: * Automake version 1.9 or newer * Autoconf version 2.59 or newer * Libtool / Libtoolize * Python version 2.3 or newer (for running some of the tests and re-generating certain source files from templates) Getting the Source ------------------ There are two primary ways of getting Google Mock's source code: you can download a stable source release in your preferred archive format, or directly check out the source from our Subversion (SVN) repositary. The SVN checkout requires a few extra steps and some extra software packages on your system, but lets you track development and make patches much more easily, so we highly encourage it. ### Source Package ### Google Mock is released in versioned source packages which can be downloaded from the download page [1]. Several different archive formats are provided, but the only difference is the tools needed to extract their contents, and the size of the resulting file. Download whichever you are most comfortable with. [1] http://code.google.com/p/googlemock/downloads/list Once downloaded expand the archive using whichever tools you prefer for that type. This will always result in a new directory with the name "gmock-X.Y.Z" which contains all of the source code. Here are some examples on Linux: tar -xvzf gmock-X.Y.Z.tar.gz tar -xvjf gmock-X.Y.Z.tar.bz2 unzip gmock-X.Y.Z.zip ### SVN Checkout ### To check out the main branch (also known as the "trunk") of Google Mock, run the following Subversion command: svn checkout http://googlemock.googlecode.com/svn/trunk/ gmock-svn If you are using a *nix system and plan to use the GNU Autotools build system to build Google Mock (described below), you'll need to configure it now. Otherwise you are done with getting the source files. To prepare the Autotools build system, enter the target directory of the checkout command you used ('gmock-svn') and proceed with the following command: autoreconf -fvi Once you have completed this step, you are ready to build the library. Note that you should only need to complete this step once. The subsequent 'make' invocations will automatically re-generate the bits of the build system that need to be changed. If your system uses older versions of the autotools, the above command will fail. You may need to explicitly specify a version to use. For instance, if you have both GNU Automake 1.4 and 1.9 installed and 'automake' would invoke the 1.4, use instead: AUTOMAKE=automake-1.9 ACLOCAL=aclocal-1.9 autoreconf -fvi Make sure you're using the same version of automake and aclocal. Setting up the Build -------------------- To build Google Mock and your tests that use it, you need to tell your build system where to find its headers and source files. The exact way to do it depends on which build system you use, and is usually straightforward. ### Generic Build Instructions ### This section shows how you can integrate Google Mock into your existing build system. Suppose you put Google Mock in directory ${GMOCK_DIR} and Google Test in ${GTEST_DIR} (the latter is ${GMOCK_DIR}/gtest by default). To build Google Mock, create a library build target (or a project as called by Visual Studio and Xcode) to compile ${GTEST_DIR}/src/gtest-all.cc and ${GMOCK_DIR}/src/gmock-all.cc with ${GTEST_DIR}/include, ${GTEST_DIR}, ${GMOCK_DIR}/include, and ${GMOCK_DIR} in the header search path. Assuming a Linux-like system and gcc, something like the following will do: g++ -I${GTEST_DIR}/include -I${GTEST_DIR} -I${GMOCK_DIR}/include \ -I${GMOCK_DIR} -c ${GTEST_DIR}/src/gtest-all.cc g++ -I${GTEST_DIR}/include -I${GTEST_DIR} -I${GMOCK_DIR}/include \ -I${GMOCK_DIR} -c ${GMOCK_DIR}/src/gmock-all.cc ar -rv libgmock.a gtest-all.o gmock-all.o Next, you should compile your test source file with ${GTEST_DIR}/include and ${GMOCK_DIR}/include in the header search path, and link it with gmock and any other necessary libraries: g++ -I${GTEST_DIR}/include -I${GMOCK_DIR}/include \ path/to/your_test.cc libgmock.a -o your_test As an example, the make/ directory contains a Makefile that you can use to build Google Mock on systems where GNU make is available (e.g. Linux, Mac OS X, and Cygwin). It doesn't try to build Google Mock's own tests. Instead, it just builds the Google Mock library and a sample test. You can use it as a starting point for your own build script. If the default settings are correct for your environment, the following commands should succeed: cd ${GMOCK_DIR}/make make ./gmock_test If you see errors, try to tweak the contents of make/Makefile to make them go away. There are instructions in make/Makefile on how to do it. ### Windows ### The msvc/ directory contains VC++ 2005 projects for building Google Mock and selected tests. Open msvc/gmock.sln and build the library and tests. If you want to create your own project to use with Google Mock, you'll have to configure it to use the gmock_config propety sheet. For that: * Open the Property Manager window (View | Other Windows | Property Manager) * Right-click on your project and select "Add Existing Property Sheet..." * Navigate to gmock_config.vsprops and select it. * In Project Properties | Configuration Properties | General | Additional Include Directories, type /include. Tweaking Google Mock -------------------- Google Mock can be used in diverse environments. The default configuration may not work (or may not work well) out of the box in some environments. However, you can easily tweak Google Mock by defining control macros on the compiler command line. Generally, these macros are named like GTEST_XYZ and you define them to either 1 or 0 to enable or disable a certain feature. We list the most frequently used macros below. For a complete list, see file ${GTEST_DIR}/include/gtest/internal/gtest-port.h. ### Choosing a TR1 Tuple Library ### Google Mock uses the C++ Technical Report 1 (TR1) tuple library heavily. Unfortunately TR1 tuple is not yet widely available with all compilers. The good news is that Google Test 1.4.0+ implements a subset of TR1 tuple that's enough for Google Mock's need. Google Mock will automatically use that implementation when the compiler doesn't provide TR1 tuple. Usually you don't need to care about which tuple library Google Test and Google Mock use. However, if your project already uses TR1 tuple, you need to tell Google Test and Google Mock to use the same TR1 tuple library the rest of your project uses, or the two tuple implementations will clash. To do that, add -DGTEST_USE_OWN_TR1_TUPLE=0 to the compiler flags while compiling Google Test, Google Mock, and your tests. If you want to force Google Test and Google Mock to use their own tuple library, just add -DGTEST_USE_OWN_TR1_TUPLE=1 to the compiler flags instead. If you want to use Boost's TR1 tuple library with Google Mock, please refer to the Boost website (http://www.boost.org/) for how to obtain it and set it up. ### Tweaking Google Test ### Most of Google Test's control macros apply to Google Mock as well. Please see file ${GTEST_DIR}/README for how to tweak them. Upgrading from an Earlier Version --------------------------------- We strive to keep Google Mock releases backward compatible. Sometimes, though, we have to make some breaking changes for the users' long-term benefits. This section describes what you'll need to do if you are upgrading from an earlier version of Google Mock. ### Upgrading from 1.1.0 or Earlier ### You may need to explicitly enable or disable Google Test's own TR1 tuple library. See the instructions in section "Choosing a TR1 Tuple Library". ### Upgrading from 1.4.0 or Earlier ### On platforms where the pthread library is available, Google Test and Google Mock use it in order to be thread-safe. For this to work, you may need to tweak your compiler and/or linker flags. Please see the "Multi-threaded Tests" section in file ${GTEST_DIR}/README for what you may need to do. If you have custom matchers defined using MatcherInterface or MakePolymorphicMatcher(), you'll need to update their definitions to use the new matcher API [2]. Matchers defined using MATCHER() or MATCHER_P*() aren't affected. [2] http://code.google.com/p/googlemock/wiki/CookBook#Writing_New_Monomorphic_Matchers, http://code.google.com/p/googlemock/wiki/CookBook#Writing_New_Polymorphic_Matchers Developing Google Mock ---------------------- This section discusses how to make your own changes to Google Mock. ### Testing Google Mock Itself ### To make sure your changes work as intended and don't break existing functionality, you'll want to compile and run Google Test's own tests. For that you'll need Autotools. First, make sure you have followed the instructions in section "SVN Checkout" to configure Google Mock. Then, create a build output directory and enter it. Next, ${GMOCK_DIR}/configure # Standard GNU configure script, --help for more info Once you have successfully configured Google Mock, the build steps are standard for GNU-style OSS packages. make # Standard makefile following GNU conventions make check # Builds and runs all tests - all should pass. Note that when building your project against Google Mock, you are building against Google Test as well. There is no need to configure Google Test separately. ### Regenerating Source Files ### Some of Google Mock's source files are generated from templates (not in the C++ sense) using a script. A template file is named FOO.pump, where FOO is the name of the file it will generate. For example, the file include/gmock/gmock-generated-actions.h.pump is used to generate gmock-generated-actions.h in the same directory. Normally you don't need to worry about regenerating the source files, unless you need to modify them. In that case, you should modify the corresponding .pump files instead and run the 'pump' script (for Pump is Useful for Meta Programming) to regenerate them. You can find pump.py in the ${GTEST_DIR}/scripts/ directory. Read the Pump manual [3] for how to use it. [3] http://code.google.com/p/googletest/wiki/PumpManual. ### Contributing a Patch ### We welcome patches. Please read the Google Mock developer's guide [4] for how you can contribute. In particular, make sure you have signed the Contributor License Agreement, or we won't be able to accept the patch. [4] http://code.google.com/p/googlemock/wiki/DevGuide Happy testing! clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/000077500000000000000000000000001260417502300233655ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/CHANGES000066400000000000000000000073001260417502300243600ustar00rootroot00000000000000Changes for 1.5.0: * New feature: assertions can be safely called in multiple threads where the pthreads library is available. * New feature: predicates used inside EXPECT_TRUE() and friends can now generate custom failure messages. * New feature: Google Test can now be compiled as a DLL. * New feature: fused source files are included. * New feature: prints help when encountering unrecognized Google Test flags. * Experimental feature: CMake build script (requires CMake 2.6.4+). * Experimental feature: the Pump script for meta programming. * double values streamed to an assertion are printed with enough precision to differentiate any two different values. * Google Test now works on Solaris and AIX. * Build and test script improvements. * Bug fixes and implementation clean-ups. Potentially breaking changes: * Stopped supporting VC++ 7.1 with exceptions disabled. * Dropped support for 'make install'. Changes for 1.4.0: * New feature: the event listener API * New feature: test shuffling * New feature: the XML report format is closer to junitreport and can be parsed by Hudson now. * New feature: when a test runs under Visual Studio, its failures are integrated in the IDE. * New feature: /MD(d) versions of VC++ projects. * New feature: elapsed time for the tests is printed by default. * New feature: comes with a TR1 tuple implementation such that Boost is no longer needed for Combine(). * New feature: EXPECT_DEATH_IF_SUPPORTED macro and friends. * New feature: the Xcode project can now produce static gtest libraries in addition to a framework. * Compatibility fixes for Solaris, Cygwin, minGW, Windows Mobile, Symbian, gcc, and C++Builder. * Bug fixes and implementation clean-ups. Changes for 1.3.0: * New feature: death tests on Windows, Cygwin, and Mac. * New feature: ability to use Google Test assertions in other testing frameworks. * New feature: ability to run disabled test via --gtest_also_run_disabled_tests. * New feature: the --help flag for printing the usage. * New feature: access to Google Test flag values in user code. * New feature: a script that packs Google Test into one .h and one .cc file for easy deployment. * New feature: support for distributing test functions to multiple machines (requires support from the test runner). * Bug fixes and implementation clean-ups. Changes for 1.2.1: * Compatibility fixes for Linux IA-64 and IBM z/OS. * Added support for using Boost and other TR1 implementations. * Changes to the build scripts to support upcoming release of Google C++ Mocking Framework. * Added Makefile to the distribution package. * Improved build instructions in README. Changes for 1.2.0: * New feature: value-parameterized tests. * New feature: the ASSERT/EXPECT_(NON)FATAL_FAILURE(_ON_ALL_THREADS) macros. * Changed the XML report format to match JUnit/Ant's. * Added tests to the Xcode project. * Added scons/SConscript for building with SCons. * Added src/gtest-all.cc for building Google Test from a single file. * Fixed compatibility with Solaris and z/OS. * Enabled running Python tests on systems with python 2.3 installed, e.g. Mac OS X 10.4. * Bug fixes. Changes for 1.1.0: * New feature: type-parameterized tests. * New feature: exception assertions. * New feature: printing elapsed time of tests. * Improved the robustness of death tests. * Added an Xcode project and samples. * Adjusted the output format on Windows to be understandable by Visual Studio. * Minor bug fixes. Changes for 1.0.1: * Added project files for Visual Studio 7.1. * Fixed issues with compiling on Mac OS X. * Fixed issues with compiling on Cygwin. Changes for 1.0.0: * Initial Open Source release of Google Test clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/CONTRIBUTORS000066400000000000000000000024461260417502300252530ustar00rootroot00000000000000# This file contains a list of people who've made non-trivial # contribution to the Google C++ Testing Framework project. People # who commit code to the project are encouraged to add their names # here. Please keep the list sorted by first names. Ajay Joshi Balázs Dán Bharat Mediratta Chandler Carruth Chris Prince Chris Taylor Dan Egnor Eric Roman Hady Zalek Jeffrey Yasskin Jói Sigurðsson Keir Mierle Keith Ray Kenton Varda Manuel Klimek Markus Heule Mika Raento Miklós Fazekas Patrick Hanna Patrick Riley Peter Kaminski Preston Jackson Rainer Klaffenboeck Russ Cox Russ Rufer Sean Mcafee Sigurður Ásgeirsson Tracy Bialik Vadim Berman Vlad Losev Zhanyong Wan clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/COPYING000066400000000000000000000027031260417502300244220ustar00rootroot00000000000000Copyright 2008, Google Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/README000066400000000000000000000352671260417502300242620ustar00rootroot00000000000000Google C++ Testing Framework ============================ http://code.google.com/p/googletest/ Overview -------- Google's framework for writing C++ tests on a variety of platforms (Linux, Mac OS X, Windows, Windows CE, Symbian, etc). Based on the xUnit architecture. Supports automatic test discovery, a rich set of assertions, user-defined assertions, death tests, fatal and non-fatal failures, various options for running the tests, and XML test report generation. Please see the project page above for more information as well as the mailing list for questions, discussions, and development. There is also an IRC channel on OFTC (irc.oftc.net) #gtest available. Please join us! Requirements for End Users -------------------------- Google Test is designed to have fairly minimal requirements to build and use with your projects, but there are some. Currently, we support Linux, Windows, Mac OS X, and Cygwin. We will also make our best effort to support other platforms (e.g. Solaris, AIX, and z/OS). However, since core members of the Google Test project have no access to these platforms, Google Test may have outstanding issues there. If you notice any problems on your platform, please notify googletestframework@googlegroups.com. Patches for fixing them are even more welcome! ### Linux Requirements ### These are the base requirements to build and use Google Test from a source package (as described below): * GNU-compatible Make or gmake * POSIX-standard shell * POSIX(-2) Regular Expressions (regex.h) * A C++98-standard-compliant compiler ### Windows Requirements ### * Microsoft Visual C++ 7.1 or newer ### Cygwin Requirements ### * Cygwin 1.5.25-14 or newer ### Mac OS X Requirements ### * Mac OS X 10.4 Tiger or newer * Developer Tools Installed Also, you'll need CMake 2.6.4 or higher if you want to build the samples using the provided CMake script, regardless of the platform. Requirements for Contributors ----------------------------- We welcome patches. If you plan to contribute a patch, you need to build Google Test and its own tests from an SVN checkout (described below), which has further requirements: * Python version 2.3 or newer (for running some of the tests and re-generating certain source files from templates) * CMake 2.6.4 or newer Getting the Source ------------------ There are two primary ways of getting Google Test's source code: you can download a stable source release in your preferred archive format, or directly check out the source from our Subversion (SVN) repositary. The SVN checkout requires a few extra steps and some extra software packages on your system, but lets you track the latest development and make patches much more easily, so we highly encourage it. ### Source Package ### Google Test is released in versioned source packages which can be downloaded from the download page [1]. Several different archive formats are provided, but the only difference is the tools used to manipulate them, and the size of the resulting file. Download whichever you are most comfortable with. [1] http://code.google.com/p/googletest/downloads/list Once the package is downloaded, expand it using whichever tools you prefer for that type. This will result in a new directory with the name "gtest-X.Y.Z" which contains all of the source code. Here are some examples on Linux: tar -xvzf gtest-X.Y.Z.tar.gz tar -xvjf gtest-X.Y.Z.tar.bz2 unzip gtest-X.Y.Z.zip ### SVN Checkout ### To check out the main branch (also known as the "trunk") of Google Test, run the following Subversion command: svn checkout http://googletest.googlecode.com/svn/trunk/ gtest-svn Setting up the Build -------------------- To build Google Test and your tests that use it, you need to tell your build system where to find its headers and source files. The exact way to do it depends on which build system you use, and is usually straightforward. ### Generic Build Instructions ### Suppose you put Google Test in directory ${GTEST_DIR}. To build it, create a library build target (or a project as called by Visual Studio and Xcode) to compile ${GTEST_DIR}/src/gtest-all.cc with ${GTEST_DIR}/include and ${GTEST_DIR} in the header search path. Assuming a Linux-like system and gcc, something like the following will do: g++ -I${GTEST_DIR}/include -I${GTEST_DIR} -c ${GTEST_DIR}/src/gtest-all.cc ar -rv libgtest.a gtest-all.o Next, you should compile your test source file with ${GTEST_DIR}/include in the header search path, and link it with gtest and any other necessary libraries: g++ -I${GTEST_DIR}/include path/to/your_test.cc libgtest.a -o your_test As an example, the make/ directory contains a Makefile that you can use to build Google Test on systems where GNU make is available (e.g. Linux, Mac OS X, and Cygwin). It doesn't try to build Google Test's own tests. Instead, it just builds the Google Test library and a sample test. You can use it as a starting point for your own build script. If the default settings are correct for your environment, the following commands should succeed: cd ${GTEST_DIR}/make make ./sample1_unittest If you see errors, try to tweak the contents of make/Makefile to make them go away. There are instructions in make/Makefile on how to do it. ### Using CMake ### Google Test comes with a CMake build script (CMakeLists.txt) that can be used on a wide range of platforms ("C" stands for cross-platofrm.). If you don't have CMake installed already, you can download it for free from http://www.cmake.org/. CMake works by generating native makefiles or build projects that can be used in the compiler environment of your choice. The typical workflow starts with: mkdir mybuild # Create a directory to hold the build output. cd mybuild cmake ${GTEST_DIR} # Generate native build scripts. If you want to build Google Test's samples, you should replace the last command with cmake -Dbuild_gtest_samples=ON ${GTEST_DIR} If you are on a *nix system, you should now see a Makefile in the current directory. Just type 'make' to build gtest. If you use Windows and have Vistual Studio installed, a gtest.sln file and several .vcproj files will be created. You can then build them using Visual Studio. On Mac OS X with Xcode installed, a .xcodeproj file will be generated. ### Legacy Build Scripts ### Before settling on CMake, we have been providing hand-maintained build projects/scripts for Visual Studio, Xcode, and Autotools. While we continue to provide them for convenience, they are not actively maintained any more. We highly recommend that you follow the instructions in the previous two sections to integrate Google Test with your existing build system. If you still need to use the legacy build scripts, here's how: The msvc\ folder contains two solutions with Visual C++ projects. Open the gtest.sln or gtest-md.sln file using Visual Studio, and you are ready to build Google Test the same way you build any Visual Studio project. Files that have names ending with -md use DLL versions of Microsoft runtime libraries (the /MD or the /MDd compiler option). Files without that suffix use static versions of the runtime libraries (the /MT or the /MTd option). Please note that one must use the same option to compile both gtest and the test code. If you use Visual Studio 2005 or above, we recommend the -md version as /MD is the default for new projects in these versions of Visual Studio. On Mac OS X, open the gtest.xcodeproj in the xcode/ folder using Xcode. Build the "gtest" target. The universal binary framework will end up in your selected build directory (selected in the Xcode "Preferences..." -> "Building" pane and defaults to xcode/build). Alternatively, at the command line, enter: xcodebuild This will build the "Release" configuration of gtest.framework in your default build location. See the "xcodebuild" man page for more information about building different configurations and building in different locations. Tweaking Google Test -------------------- Google Test can be used in diverse environments. The default configuration may not work (or may not work well) out of the box in some environments. However, you can easily tweak Google Test by defining control macros on the compiler command line. Generally, these macros are named like GTEST_XYZ and you define them to either 1 or 0 to enable or disable a certain feature. We list the most frequently used macros below. For a complete list, see file include/gtest/internal/gtest-port.h. ### Choosing a TR1 Tuple Library ### Some Google Test features require the C++ Technical Report 1 (TR1) tuple library, which is not yet available with all compilers. The good news is that Google Test implements a subset of TR1 tuple that's enough for its own need, and will automatically use this when the compiler doesn't provide TR1 tuple. Usually you don't need to care about which tuple library Google Test uses. However, if your project already uses TR1 tuple, you need to tell Google Test to use the same TR1 tuple library the rest of your project uses, or the two tuple implementations will clash. To do that, add -DGTEST_USE_OWN_TR1_TUPLE=0 to the compiler flags while compiling Google Test and your tests. If you want to force Google Test to use its own tuple library, just add -DGTEST_USE_OWN_TR1_TUPLE=1 to the compiler flags instead. If you don't want Google Test to use tuple at all, add -DGTEST_HAS_TR1_TUPLE=0 and all features using tuple will be disabled. ### Multi-threaded Tests ### Google Test is thread-safe where the pthread library is available. After #include , you can check the GTEST_IS_THREADSAFE macro to see whether this is the case (yes if the macro is #defined to 1, no if it's undefined.). If Google Test doesn't correctly detect whether pthread is available in your environment, you can force it with -DGTEST_HAS_PTHREAD=1 or -DGTEST_HAS_PTHREAD=0 When Google Test uses pthread, you may need to add flags to your compiler and/or linker to select the pthread library, or you'll get link errors. If you use the CMake script or the deprecated Autotools script, this is taken care of for you. If you use your own build script, you'll need to read your compiler and linker's manual to figure out what flags to add. ### As a Shared Library (DLL) ### Google Test is compact, so most users can build and link it as a static library for the simplicity. You can choose to use Google Test as a shared library (known as a DLL on Windows) if you prefer. To compile gtest as a shared library, add -DGTEST_CREATE_SHARED_LIBRARY=1 to the compiler flags. You'll also need to tell the linker to produce a shared library instead - consult your linker's manual for how to do it. To compile your tests that use the gtest shared library, add -DGTEST_LINKED_AS_SHARED_LIBRARY=1 to the compiler flags. ### Avoiding Macro Name Clashes ### In C++, macros don't obey namespaces. Therefore two libraries that both define a macro of the same name will clash if you #include both definitions. In case a Google Test macro clashes with another library, you can force Google Test to rename its macro to avoid the conflict. Specifically, if both Google Test and some other code define macro FOO, you can add -DGTEST_DONT_DEFINE_FOO=1 to the compiler flags to tell Google Test to change the macro's name from FOO to GTEST_FOO. Currently FOO can be FAIL, SUCCEED, or TEST. For example, with -DGTEST_DONT_DEFINE_TEST=1, you'll need to write GTEST_TEST(SomeTest, DoesThis) { ... } instead of TEST(SomeTest, DoesThis) { ... } in order to define a test. Upgrating from an Earlier Version --------------------------------- We strive to keep Google Test releases backward compatible. Sometimes, though, we have to make some breaking changes for the users' long-term benefits. This section describes what you'll need to do if you are upgrading from an earlier version of Google Test. ### Upgrading from 1.3.0 or Earlier ### You may need to explicitly enable or disable Google Test's own TR1 tuple library. See the instructions in section "Choosing a TR1 Tuple Library". ### Upgrading from 1.4.0 or Earlier ### The Autotools build script (configure + make) is no longer officially supportted. You are encouraged to migrate to your own build system or use CMake. If you still need to use Autotools, you can find instructions in the README file from Google Test 1.4.0. On platforms where the pthread library is available, Google Test uses it in order to be thread-safe. See the "Multi-threaded Tests" section for what this means to your build script. If you use Microsoft Visual C++ 7.1 with exceptions disabled, Google Test will no longer compile. This should affect very few people, as a large portion of STL (including ) doesn't compile in this mode anyway. We decided to stop supporting it in order to greatly simplify Google Test's implementation. Developing Google Test ---------------------- This section discusses how to make your own changes to Google Test. ### Testing Google Test Itself ### To make sure your changes work as intended and don't break existing functionality, you'll want to compile and run Google Test's own tests. For that you can use CMake: mkdir mybuild cd mybuild cmake -Dbuild_all_gtest_tests=ON ${GTEST_DIR} Make sure you have Python installed, as some of Google Test's tests are written in Python. If the cmake command complains about not being able to find Python ("Could NOT find PythonInterp (missing: PYTHON_EXECUTABLE)"), try telling it explicitly where your Python executable can be found: cmake -DPYTHON_EXECUTABLE=path/to/python -Dbuild_all_gtest_tests=ON \ ${GTEST_DIR} Next, you can build Google Test and all of its own tests. On *nix, this is usually done by 'make'. To run the tests, do make test All tests should pass. ### Regenerating Source Files ### Some of Google Test's source files are generated from templates (not in the C++ sense) using a script. A template file is named FOO.pump, where FOO is the name of the file it will generate. For example, the file include/gtest/internal/gtest-type-util.h.pump is used to generate gtest-type-util.h in the same directory. Normally you don't need to worry about regenerating the source files, unless you need to modify them. In that case, you should modify the corresponding .pump files instead and run the pump.py Python script to regenerate them. You can find pump.py in the scripts/ directory. Read the Pump manual [2] for how to use it. [2] http://code.google.com/p/googletest/wiki/PumpManual ### Contributing a Patch ### We welcome patches. Please read the Google Test developer's guide [3] for how you can contribute. In particular, make sure you have signed the Contributor License Agreement, or we won't be able to accept the patch. [3] http://code.google.com/p/googletest/wiki/GoogleTestDevGuide Happy testing! clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/codegear/000077500000000000000000000000001260417502300251365ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/codegear/gtest.cbproj000066400000000000000000000245771260417502300275040ustar00rootroot00000000000000 {bca37a72-5b07-46cf-b44e-89f8e06451a2} Release true true true Base true true Base true lib JPHNE NO_STRICT true true CppStaticLibrary true rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;dclZipForged11.bpi;vclZipForged11.bpi;GR32_BDS2006.bpi;GR32_DSGN_BDS2006.bpi;Jcl.bpi;JclVcl.bpi;JvCoreD11R.bpi;JvSystemD11R.bpi;JvStdCtrlsD11R.bpi;JvAppFrmD11R.bpi;JvBandsD11R.bpi;JvDBD11R.bpi;JvDlgsD11R.bpi;JvBDED11R.bpi;JvCmpD11R.bpi;JvCryptD11R.bpi;JvCtrlsD11R.bpi;JvCustomD11R.bpi;JvDockingD11R.bpi;JvDotNetCtrlsD11R.bpi;JvEDID11R.bpi;JvGlobusD11R.bpi;JvHMID11R.bpi;JvInterpreterD11R.bpi;JvJansD11R.bpi;JvManagedThreadsD11R.bpi;JvMMD11R.bpi;JvNetD11R.bpi;JvPageCompsD11R.bpi;JvPluginD11R.bpi;JvPrintPreviewD11R.bpi;JvRuntimeDesignD11R.bpi;JvTimeFrameworkD11R.bpi;JvValidatorsD11R.bpi;JvWizardD11R.bpi;JvXPCtrlsD11R.bpi;VclSmp.bpi;CExceptionExpert11.bpi false $(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;.. rtl.lib;vcl.lib 32 $(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk false false true _DEBUG;$(Defines) true false true None DEBUG true Debug true true true $(BDS)\lib\debug;$(ILINK_LibraryPath) Full true NDEBUG;$(Defines) Release $(BDS)\lib\release;$(ILINK_LibraryPath) None CPlusPlusBuilder.Personality CppStaticLibrary FalseFalse1000FalseFalseFalseFalseFalse103312521.0.0.01.0.0.0FalseFalseFalseTrueFalse CodeGear C++Builder Office 2000 Servers Package CodeGear C++Builder Office XP Servers Package FalseTrueTrue3$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\src;..\include1$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk1NO_STRICT13216 3 4 5 6 7 8 0 1 2 9 10 11 12 14 13 15 16 17 18 Cfg_1 Cfg_2 clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/codegear/gtest.groupproj000066400000000000000000000040151260417502300302350ustar00rootroot00000000000000 {c1d923e0-6cba-4332-9b6f-3420acbf5091} Default.Personality clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/codegear/gtest_all.cc000066400000000000000000000035571260417502300274350ustar00rootroot00000000000000// Copyright 2009, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: Josh Kelley (joshkel@gmail.com) // // Google C++ Testing Framework (Google Test) // // C++Builder's IDE cannot build a static library from files with hyphens // in their name. See http://qc.codegear.com/wc/qcmain.aspx?d=70977 . // This file serves as a workaround. #include "src/gtest-all.cc" clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/codegear/gtest_link.cc000066400000000000000000000037611260417502300276170ustar00rootroot00000000000000// Copyright 2009, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: Josh Kelley (joshkel@gmail.com) // // Google C++ Testing Framework (Google Test) // // Links gtest.lib and gtest_main.lib into the current project in C++Builder. // This means that these libraries can't be renamed, but it's the only way to // ensure that Debug versus Release test builds are linked against the // appropriate Debug or Release build of the libraries. #pragma link "gtest.lib" #pragma link "gtest_main.lib" clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/codegear/gtest_main.cbproj000066400000000000000000000207261260417502300305000ustar00rootroot00000000000000 {bca37a72-5b07-46cf-b44e-89f8e06451a2} Release true true true Base true true Base true lib JPHNE NO_STRICT true true CppStaticLibrary true rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;dclZipForged11.bpi;vclZipForged11.bpi;GR32_BDS2006.bpi;GR32_DSGN_BDS2006.bpi;Jcl.bpi;JclVcl.bpi;JvCoreD11R.bpi;JvSystemD11R.bpi;JvStdCtrlsD11R.bpi;JvAppFrmD11R.bpi;JvBandsD11R.bpi;JvDBD11R.bpi;JvDlgsD11R.bpi;JvBDED11R.bpi;JvCmpD11R.bpi;JvCryptD11R.bpi;JvCtrlsD11R.bpi;JvCustomD11R.bpi;JvDockingD11R.bpi;JvDotNetCtrlsD11R.bpi;JvEDID11R.bpi;JvGlobusD11R.bpi;JvHMID11R.bpi;JvInterpreterD11R.bpi;JvJansD11R.bpi;JvManagedThreadsD11R.bpi;JvMMD11R.bpi;JvNetD11R.bpi;JvPageCompsD11R.bpi;JvPluginD11R.bpi;JvPrintPreviewD11R.bpi;JvRuntimeDesignD11R.bpi;JvTimeFrameworkD11R.bpi;JvValidatorsD11R.bpi;JvWizardD11R.bpi;JvXPCtrlsD11R.bpi;VclSmp.bpi;CExceptionExpert11.bpi false $(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;.. rtl.lib;vcl.lib 32 $(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk false false true _DEBUG;$(Defines) true false true None DEBUG true Debug true true true $(BDS)\lib\debug;$(ILINK_LibraryPath) Full true NDEBUG;$(Defines) Release $(BDS)\lib\release;$(ILINK_LibraryPath) None CPlusPlusBuilder.Personality CppStaticLibrary FalseFalse1000FalseFalseFalseFalseFalse103312521.0.0.01.0.0.0FalseFalseFalseTrueFalse CodeGear C++Builder Office 2000 Servers Package CodeGear C++Builder Office XP Servers Package FalseTrueTrue3$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\src;..\include1$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk1NO_STRICT13216 0 Cfg_1 Cfg_2 clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/codegear/gtest_unittest.cbproj000066400000000000000000000211121260417502300314210ustar00rootroot00000000000000 {eea63393-5ac5-4b9c-8909-d75fef2daa41} Release true true true Base true true Base exe true NO_STRICT JPHNE true ..\test true CppConsoleApplication true true rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;Jcl.bpi;JclVcl.bpi;JvCoreD11R.bpi;JvSystemD11R.bpi;JvStdCtrlsD11R.bpi;JvAppFrmD11R.bpi;JvBandsD11R.bpi;JvDBD11R.bpi;JvDlgsD11R.bpi;JvBDED11R.bpi;JvCmpD11R.bpi;JvCryptD11R.bpi;JvCtrlsD11R.bpi;JvCustomD11R.bpi;JvDockingD11R.bpi;JvDotNetCtrlsD11R.bpi;JvEDID11R.bpi;JvGlobusD11R.bpi;JvHMID11R.bpi;JvInterpreterD11R.bpi;JvJansD11R.bpi;JvManagedThreadsD11R.bpi;JvMMD11R.bpi;JvNetD11R.bpi;JvPageCompsD11R.bpi;JvPluginD11R.bpi;JvPrintPreviewD11R.bpi;JvRuntimeDesignD11R.bpi;JvTimeFrameworkD11R.bpi;JvValidatorsD11R.bpi;JvWizardD11R.bpi;JvXPCtrlsD11R.bpi;VclSmp.bpi false $(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\include;..\test;.. $(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;..\test true false false true _DEBUG;$(Defines) true false true None DEBUG true Debug true true true $(BDS)\lib\debug;$(ILINK_LibraryPath) Full true NDEBUG;$(Defines) Release $(BDS)\lib\release;$(ILINK_LibraryPath) None CPlusPlusBuilder.Personality CppConsoleApplication FalseFalse1000FalseFalseFalseFalseFalse103312521.0.0.01.0.0.0FalseFalseFalseTrueFalse CodeGear C++Builder Office 2000 Servers Package CodeGear C++Builder Office XP Servers Package FalseTrueTrue3$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\include;..\test;..$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\include;..\test$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\include1$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;..\test$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;..\test$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;$(OUTPUTDIR);..\test2NO_STRICTSTRICT 0 1 Cfg_1 Cfg_2 clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/include/000077500000000000000000000000001260417502300250105ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/include/gtest/000077500000000000000000000000001260417502300261365ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/include/gtest/gtest-death-test.h000066400000000000000000000255101260417502300315000ustar00rootroot00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // // The Google C++ Testing Framework (Google Test) // // This header file defines the public API for death tests. It is // #included by gtest.h so a user doesn't need to include this // directly. #ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ #define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ #include namespace testing { // This flag controls the style of death tests. Valid values are "threadsafe", // meaning that the death test child process will re-execute the test binary // from the start, running only a single death test, or "fast", // meaning that the child process will execute the test logic immediately // after forking. GTEST_DECLARE_string_(death_test_style); #if GTEST_HAS_DEATH_TEST // The following macros are useful for writing death tests. // Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is // executed: // // 1. It generates a warning if there is more than one active // thread. This is because it's safe to fork() or clone() only // when there is a single thread. // // 2. The parent process clone()s a sub-process and runs the death // test in it; the sub-process exits with code 0 at the end of the // death test, if it hasn't exited already. // // 3. The parent process waits for the sub-process to terminate. // // 4. The parent process checks the exit code and error message of // the sub-process. // // Examples: // // ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number"); // for (int i = 0; i < 5; i++) { // EXPECT_DEATH(server.ProcessRequest(i), // "Invalid request .* in ProcessRequest()") // << "Failed to die on request " << i); // } // // ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting"); // // bool KilledBySIGHUP(int exit_code) { // return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP; // } // // ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!"); // // On the regular expressions used in death tests: // // On POSIX-compliant systems (*nix), we use the library, // which uses the POSIX extended regex syntax. // // On other platforms (e.g. Windows), we only support a simple regex // syntax implemented as part of Google Test. This limited // implementation should be enough most of the time when writing // death tests; though it lacks many features you can find in PCRE // or POSIX extended regex syntax. For example, we don't support // union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and // repetition count ("x{5,7}"), among others. // // Below is the syntax that we do support. We chose it to be a // subset of both PCRE and POSIX extended regex, so it's easy to // learn wherever you come from. In the following: 'A' denotes a // literal character, period (.), or a single \\ escape sequence; // 'x' and 'y' denote regular expressions; 'm' and 'n' are for // natural numbers. // // c matches any literal character c // \\d matches any decimal digit // \\D matches any character that's not a decimal digit // \\f matches \f // \\n matches \n // \\r matches \r // \\s matches any ASCII whitespace, including \n // \\S matches any character that's not a whitespace // \\t matches \t // \\v matches \v // \\w matches any letter, _, or decimal digit // \\W matches any character that \\w doesn't match // \\c matches any literal character c, which must be a punctuation // . matches any single character except \n // A? matches 0 or 1 occurrences of A // A* matches 0 or many occurrences of A // A+ matches 1 or many occurrences of A // ^ matches the beginning of a string (not that of each line) // $ matches the end of a string (not that of each line) // xy matches x followed by y // // If you accidentally use PCRE or POSIX extended regex features // not implemented by us, you will get a run-time failure. In that // case, please try to rewrite your regular expression within the // above syntax. // // This implementation is *not* meant to be as highly tuned or robust // as a compiled regex library, but should perform well enough for a // death test, which already incurs significant overhead by launching // a child process. // // Known caveats: // // A "threadsafe" style death test obtains the path to the test // program from argv[0] and re-executes it in the sub-process. For // simplicity, the current implementation doesn't search the PATH // when launching the sub-process. This means that the user must // invoke the test program via a path that contains at least one // path separator (e.g. path/to/foo_test and // /absolute/path/to/bar_test are fine, but foo_test is not). This // is rarely a problem as people usually don't put the test binary // directory in PATH. // // TODO(wan@google.com): make thread-safe death tests search the PATH. // Asserts that a given statement causes the program to exit, with an // integer exit status that satisfies predicate, and emitting error output // that matches regex. #define ASSERT_EXIT(statement, predicate, regex) \ GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_) // Like ASSERT_EXIT, but continues on to successive tests in the // test case, if any: #define EXPECT_EXIT(statement, predicate, regex) \ GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_) // Asserts that a given statement causes the program to exit, either by // explicitly exiting with a nonzero exit code or being killed by a // signal, and emitting error output that matches regex. #define ASSERT_DEATH(statement, regex) \ ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex) // Like ASSERT_DEATH, but continues on to successive tests in the // test case, if any: #define EXPECT_DEATH(statement, regex) \ EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex) // Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*: // Tests that an exit code describes a normal exit with a given exit code. class GTEST_API_ ExitedWithCode { public: explicit ExitedWithCode(int exit_code); bool operator()(int exit_status) const; private: // No implementation - assignment is unsupported. void operator=(const ExitedWithCode& other); const int exit_code_; }; #if !GTEST_OS_WINDOWS // Tests that an exit code describes an exit due to termination by a // given signal. class GTEST_API_ KilledBySignal { public: explicit KilledBySignal(int signum); bool operator()(int exit_status) const; private: const int signum_; }; #endif // !GTEST_OS_WINDOWS // EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode. // The death testing framework causes this to have interesting semantics, // since the sideeffects of the call are only visible in opt mode, and not // in debug mode. // // In practice, this can be used to test functions that utilize the // LOG(DFATAL) macro using the following style: // // int DieInDebugOr12(int* sideeffect) { // if (sideeffect) { // *sideeffect = 12; // } // LOG(DFATAL) << "death"; // return 12; // } // // TEST(TestCase, TestDieOr12WorksInDgbAndOpt) { // int sideeffect = 0; // // Only asserts in dbg. // EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death"); // // #ifdef NDEBUG // // opt-mode has sideeffect visible. // EXPECT_EQ(12, sideeffect); // #else // // dbg-mode no visible sideeffect. // EXPECT_EQ(0, sideeffect); // #endif // } // // This will assert that DieInDebugReturn12InOpt() crashes in debug // mode, usually due to a DCHECK or LOG(DFATAL), but returns the // appropriate fallback value (12 in this case) in opt mode. If you // need to test that a function has appropriate side-effects in opt // mode, include assertions against the side-effects. A general // pattern for this is: // // EXPECT_DEBUG_DEATH({ // // Side-effects here will have an effect after this statement in // // opt mode, but none in debug mode. // EXPECT_EQ(12, DieInDebugOr12(&sideeffect)); // }, "death"); // #ifdef NDEBUG #define EXPECT_DEBUG_DEATH(statement, regex) \ do { statement; } while (::testing::internal::AlwaysFalse()) #define ASSERT_DEBUG_DEATH(statement, regex) \ do { statement; } while (::testing::internal::AlwaysFalse()) #else #define EXPECT_DEBUG_DEATH(statement, regex) \ EXPECT_DEATH(statement, regex) #define ASSERT_DEBUG_DEATH(statement, regex) \ ASSERT_DEATH(statement, regex) #endif // NDEBUG for EXPECT_DEBUG_DEATH #endif // GTEST_HAS_DEATH_TEST // EXPECT_DEATH_IF_SUPPORTED(statement, regex) and // ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if // death tests are supported; otherwise they just issue a warning. This is // useful when you are combining death test assertions with normal test // assertions in one test. #if GTEST_HAS_DEATH_TEST #define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \ EXPECT_DEATH(statement, regex) #define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \ ASSERT_DEATH(statement, regex) #else #define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \ GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, ) #define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \ GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return) #endif } // namespace testing #endif // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/include/gtest/gtest-message.h000066400000000000000000000202521260417502300310600ustar00rootroot00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // // The Google C++ Testing Framework (Google Test) // // This header file defines the Message class. // // IMPORTANT NOTE: Due to limitation of the C++ language, we have to // leave some internal implementation details in this header file. // They are clearly marked by comments like this: // // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. // // Such code is NOT meant to be used by a user directly, and is subject // to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user // program! #ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ #define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ #include #include #include namespace testing { // The Message class works like an ostream repeater. // // Typical usage: // // 1. You stream a bunch of values to a Message object. // It will remember the text in a StrStream. // 2. Then you stream the Message object to an ostream. // This causes the text in the Message to be streamed // to the ostream. // // For example; // // testing::Message foo; // foo << 1 << " != " << 2; // std::cout << foo; // // will print "1 != 2". // // Message is not intended to be inherited from. In particular, its // destructor is not virtual. // // Note that StrStream behaves differently in gcc and in MSVC. You // can stream a NULL char pointer to it in the former, but not in the // latter (it causes an access violation if you do). The Message // class hides this difference by treating a NULL char pointer as // "(null)". class GTEST_API_ Message { private: // The type of basic IO manipulators (endl, ends, and flush) for // narrow streams. typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&); public: // Constructs an empty Message. // We allocate the StrStream separately because it otherwise each use of // ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's // stack frame leading to huge stack frames in some cases; gcc does not reuse // the stack space. Message() : ss_(new internal::StrStream) { // By default, we want there to be enough precision when printing // a double to a Message. *ss_ << std::setprecision(std::numeric_limits::digits10 + 2); } // Copy constructor. Message(const Message& msg) : ss_(new internal::StrStream) { // NOLINT *ss_ << msg.GetString(); } // Constructs a Message from a C-string. explicit Message(const char* str) : ss_(new internal::StrStream) { *ss_ << str; } ~Message() { delete ss_; } #if GTEST_OS_SYMBIAN // Streams a value (either a pointer or not) to this object. template inline Message& operator <<(const T& value) { StreamHelper(typename internal::is_pointer::type(), value); return *this; } #else // Streams a non-pointer value to this object. template inline Message& operator <<(const T& val) { ::GTestStreamToHelper(ss_, val); return *this; } // Streams a pointer value to this object. // // This function is an overload of the previous one. When you // stream a pointer to a Message, this definition will be used as it // is more specialized. (The C++ Standard, section // [temp.func.order].) If you stream a non-pointer, then the // previous definition will be used. // // The reason for this overload is that streaming a NULL pointer to // ostream is undefined behavior. Depending on the compiler, you // may get "0", "(nil)", "(null)", or an access violation. To // ensure consistent result across compilers, we always treat NULL // as "(null)". template inline Message& operator <<(T* const& pointer) { // NOLINT if (pointer == NULL) { *ss_ << "(null)"; } else { ::GTestStreamToHelper(ss_, pointer); } return *this; } #endif // GTEST_OS_SYMBIAN // Since the basic IO manipulators are overloaded for both narrow // and wide streams, we have to provide this specialized definition // of operator <<, even though its body is the same as the // templatized version above. Without this definition, streaming // endl or other basic IO manipulators to Message will confuse the // compiler. Message& operator <<(BasicNarrowIoManip val) { *ss_ << val; return *this; } // Instead of 1/0, we want to see true/false for bool values. Message& operator <<(bool b) { return *this << (b ? "true" : "false"); } // These two overloads allow streaming a wide C string to a Message // using the UTF-8 encoding. Message& operator <<(const wchar_t* wide_c_str) { return *this << internal::String::ShowWideCString(wide_c_str); } Message& operator <<(wchar_t* wide_c_str) { return *this << internal::String::ShowWideCString(wide_c_str); } #if GTEST_HAS_STD_WSTRING // Converts the given wide string to a narrow string using the UTF-8 // encoding, and streams the result to this Message object. Message& operator <<(const ::std::wstring& wstr); #endif // GTEST_HAS_STD_WSTRING #if GTEST_HAS_GLOBAL_WSTRING // Converts the given wide string to a narrow string using the UTF-8 // encoding, and streams the result to this Message object. Message& operator <<(const ::wstring& wstr); #endif // GTEST_HAS_GLOBAL_WSTRING // Gets the text streamed to this object so far as a String. // Each '\0' character in the buffer is replaced with "\\0". // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. internal::String GetString() const { return internal::StrStreamToString(ss_); } private: #if GTEST_OS_SYMBIAN // These are needed as the Nokia Symbian Compiler cannot decide between // const T& and const T* in a function template. The Nokia compiler _can_ // decide between class template specializations for T and T*, so a // tr1::type_traits-like is_pointer works, and we can overload on that. template inline void StreamHelper(internal::true_type /*dummy*/, T* pointer) { if (pointer == NULL) { *ss_ << "(null)"; } else { ::GTestStreamToHelper(ss_, pointer); } } template inline void StreamHelper(internal::false_type /*dummy*/, const T& value) { ::GTestStreamToHelper(ss_, value); } #endif // GTEST_OS_SYMBIAN // We'll hold the text streamed to this object here. internal::StrStream* const ss_; // We declare (but don't implement) this to prevent the compiler // from implementing the assignment operator. void operator=(const Message&); }; // Streams a Message to an ostream. inline std::ostream& operator <<(std::ostream& os, const Message& sb) { return os << sb.GetString(); } } // namespace testing #endif // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/include/gtest/gtest-param-test.h000066400000000000000000002217741260417502300315250ustar00rootroot00000000000000// This file was GENERATED by a script. DO NOT EDIT BY HAND!!! // Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Authors: vladl@google.com (Vlad Losev) // // Macros and functions for implementing parameterized tests // in Google C++ Testing Framework (Google Test) // // This file is generated by a SCRIPT. DO NOT EDIT BY HAND! // #ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ #define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ // Value-parameterized tests allow you to test your code with different // parameters without writing multiple copies of the same test. // // Here is how you use value-parameterized tests: #if 0 // To write value-parameterized tests, first you should define a fixture // class. It must be derived from testing::TestWithParam, where T is // the type of your parameter values. TestWithParam is itself derived // from testing::Test. T can be any copyable type. If it's a raw pointer, // you are responsible for managing the lifespan of the pointed values. class FooTest : public ::testing::TestWithParam { // You can implement all the usual class fixture members here. }; // Then, use the TEST_P macro to define as many parameterized tests // for this fixture as you want. The _P suffix is for "parameterized" // or "pattern", whichever you prefer to think. TEST_P(FooTest, DoesBlah) { // Inside a test, access the test parameter with the GetParam() method // of the TestWithParam class: EXPECT_TRUE(foo.Blah(GetParam())); ... } TEST_P(FooTest, HasBlahBlah) { ... } // Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test // case with any set of parameters you want. Google Test defines a number // of functions for generating test parameters. They return what we call // (surprise!) parameter generators. Here is a summary of them, which // are all in the testing namespace: // // // Range(begin, end [, step]) - Yields values {begin, begin+step, // begin+step+step, ...}. The values do not // include end. step defaults to 1. // Values(v1, v2, ..., vN) - Yields values {v1, v2, ..., vN}. // ValuesIn(container) - Yields values from a C-style array, an STL // ValuesIn(begin,end) container, or an iterator range [begin, end). // Bool() - Yields sequence {false, true}. // Combine(g1, g2, ..., gN) - Yields all combinations (the Cartesian product // for the math savvy) of the values generated // by the N generators. // // For more details, see comments at the definitions of these functions below // in this file. // // The following statement will instantiate tests from the FooTest test case // each with parameter values "meeny", "miny", and "moe". INSTANTIATE_TEST_CASE_P(InstantiationName, FooTest, Values("meeny", "miny", "moe")); // To distinguish different instances of the pattern, (yes, you // can instantiate it more then once) the first argument to the // INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the // actual test case name. Remember to pick unique prefixes for different // instantiations. The tests from the instantiation above will have // these names: // // * InstantiationName/FooTest.DoesBlah/0 for "meeny" // * InstantiationName/FooTest.DoesBlah/1 for "miny" // * InstantiationName/FooTest.DoesBlah/2 for "moe" // * InstantiationName/FooTest.HasBlahBlah/0 for "meeny" // * InstantiationName/FooTest.HasBlahBlah/1 for "miny" // * InstantiationName/FooTest.HasBlahBlah/2 for "moe" // // You can use these names in --gtest_filter. // // This statement will instantiate all tests from FooTest again, each // with parameter values "cat" and "dog": const char* pets[] = {"cat", "dog"}; INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets)); // The tests from the instantiation above will have these names: // // * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat" // * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog" // * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat" // * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog" // // Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests // in the given test case, whether their definitions come before or // AFTER the INSTANTIATE_TEST_CASE_P statement. // // Please also note that generator expressions (including parameters to the // generators) are evaluated in InitGoogleTest(), after main() has started. // This allows the user on one hand, to adjust generator parameters in order // to dynamically determine a set of tests to run and on the other hand, // give the user a chance to inspect the generated tests with Google Test // reflection API before RUN_ALL_TESTS() is executed. // // You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc // for more examples. // // In the future, we plan to publish the API for defining new parameter // generators. But for now this interface remains part of the internal // implementation and is subject to change. #endif // 0 #include #if !GTEST_OS_SYMBIAN #include #endif // scripts/fuse_gtest.py depends on gtest's own header being #included // *unconditionally*. Therefore these #includes cannot be moved // inside #if GTEST_HAS_PARAM_TEST. #include #include #include #if GTEST_HAS_PARAM_TEST namespace testing { // Functions producing parameter generators. // // Google Test uses these generators to produce parameters for value- // parameterized tests. When a parameterized test case is instantiated // with a particular generator, Google Test creates and runs tests // for each element in the sequence produced by the generator. // // In the following sample, tests from test case FooTest are instantiated // each three times with parameter values 3, 5, and 8: // // class FooTest : public TestWithParam { ... }; // // TEST_P(FooTest, TestThis) { // } // TEST_P(FooTest, TestThat) { // } // INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8)); // // Range() returns generators providing sequences of values in a range. // // Synopsis: // Range(start, end) // - returns a generator producing a sequence of values {start, start+1, // start+2, ..., }. // Range(start, end, step) // - returns a generator producing a sequence of values {start, start+step, // start+step+step, ..., }. // Notes: // * The generated sequences never include end. For example, Range(1, 5) // returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2) // returns a generator producing {1, 3, 5, 7}. // * start and end must have the same type. That type may be any integral or // floating-point type or a user defined type satisfying these conditions: // * It must be assignable (have operator=() defined). // * It must have operator+() (operator+(int-compatible type) for // two-operand version). // * It must have operator<() defined. // Elements in the resulting sequences will also have that type. // * Condition start < end must be satisfied in order for resulting sequences // to contain any elements. // template internal::ParamGenerator Range(T start, T end, IncrementT step) { return internal::ParamGenerator( new internal::RangeGenerator(start, end, step)); } template internal::ParamGenerator Range(T start, T end) { return Range(start, end, 1); } // ValuesIn() function allows generation of tests with parameters coming from // a container. // // Synopsis: // ValuesIn(const T (&array)[N]) // - returns a generator producing sequences with elements from // a C-style array. // ValuesIn(const Container& container) // - returns a generator producing sequences with elements from // an STL-style container. // ValuesIn(Iterator begin, Iterator end) // - returns a generator producing sequences with elements from // a range [begin, end) defined by a pair of STL-style iterators. These // iterators can also be plain C pointers. // // Please note that ValuesIn copies the values from the containers // passed in and keeps them to generate tests in RUN_ALL_TESTS(). // // Examples: // // This instantiates tests from test case StringTest // each with C-string values of "foo", "bar", and "baz": // // const char* strings[] = {"foo", "bar", "baz"}; // INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings)); // // This instantiates tests from test case StlStringTest // each with STL strings with values "a" and "b": // // ::std::vector< ::std::string> GetParameterStrings() { // ::std::vector< ::std::string> v; // v.push_back("a"); // v.push_back("b"); // return v; // } // // INSTANTIATE_TEST_CASE_P(CharSequence, // StlStringTest, // ValuesIn(GetParameterStrings())); // // // This will also instantiate tests from CharTest // each with parameter values 'a' and 'b': // // ::std::list GetParameterChars() { // ::std::list list; // list.push_back('a'); // list.push_back('b'); // return list; // } // ::std::list l = GetParameterChars(); // INSTANTIATE_TEST_CASE_P(CharSequence2, // CharTest, // ValuesIn(l.begin(), l.end())); // template internal::ParamGenerator< typename ::std::iterator_traits::value_type> ValuesIn( ForwardIterator begin, ForwardIterator end) { typedef typename ::std::iterator_traits::value_type ParamType; return internal::ParamGenerator( new internal::ValuesInIteratorRangeGenerator(begin, end)); } template internal::ParamGenerator ValuesIn(const T (&array)[N]) { return ValuesIn(array, array + N); } template internal::ParamGenerator ValuesIn( const Container& container) { return ValuesIn(container.begin(), container.end()); } // Values() allows generating tests from explicitly specified list of // parameters. // // Synopsis: // Values(T v1, T v2, ..., T vN) // - returns a generator producing sequences with elements v1, v2, ..., vN. // // For example, this instantiates tests from test case BarTest each // with values "one", "two", and "three": // // INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three")); // // This instantiates tests from test case BazTest each with values 1, 2, 3.5. // The exact type of values will depend on the type of parameter in BazTest. // // INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5)); // // Currently, Values() supports from 1 to 50 parameters. // template internal::ValueArray1 Values(T1 v1) { return internal::ValueArray1(v1); } template internal::ValueArray2 Values(T1 v1, T2 v2) { return internal::ValueArray2(v1, v2); } template internal::ValueArray3 Values(T1 v1, T2 v2, T3 v3) { return internal::ValueArray3(v1, v2, v3); } template internal::ValueArray4 Values(T1 v1, T2 v2, T3 v3, T4 v4) { return internal::ValueArray4(v1, v2, v3, v4); } template internal::ValueArray5 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) { return internal::ValueArray5(v1, v2, v3, v4, v5); } template internal::ValueArray6 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) { return internal::ValueArray6(v1, v2, v3, v4, v5, v6); } template internal::ValueArray7 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) { return internal::ValueArray7(v1, v2, v3, v4, v5, v6, v7); } template internal::ValueArray8 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) { return internal::ValueArray8(v1, v2, v3, v4, v5, v6, v7, v8); } template internal::ValueArray9 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) { return internal::ValueArray9(v1, v2, v3, v4, v5, v6, v7, v8, v9); } template internal::ValueArray10 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) { return internal::ValueArray10(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10); } template internal::ValueArray11 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11) { return internal::ValueArray11(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11); } template internal::ValueArray12 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12) { return internal::ValueArray12(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12); } template internal::ValueArray13 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13) { return internal::ValueArray13(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13); } template internal::ValueArray14 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) { return internal::ValueArray14(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14); } template internal::ValueArray15 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) { return internal::ValueArray15(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15); } template internal::ValueArray16 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) { return internal::ValueArray16(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16); } template internal::ValueArray17 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17) { return internal::ValueArray17(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17); } template internal::ValueArray18 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18) { return internal::ValueArray18(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18); } template internal::ValueArray19 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) { return internal::ValueArray19(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19); } template internal::ValueArray20 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) { return internal::ValueArray20(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20); } template internal::ValueArray21 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) { return internal::ValueArray21(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21); } template internal::ValueArray22 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) { return internal::ValueArray22(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22); } template internal::ValueArray23 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) { return internal::ValueArray23(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23); } template internal::ValueArray24 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) { return internal::ValueArray24(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24); } template internal::ValueArray25 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) { return internal::ValueArray25(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25); } template internal::ValueArray26 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26) { return internal::ValueArray26(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26); } template internal::ValueArray27 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27) { return internal::ValueArray27(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27); } template internal::ValueArray28 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28) { return internal::ValueArray28(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28); } template internal::ValueArray29 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29) { return internal::ValueArray29(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29); } template internal::ValueArray30 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) { return internal::ValueArray30(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30); } template internal::ValueArray31 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) { return internal::ValueArray31(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31); } template internal::ValueArray32 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) { return internal::ValueArray32(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32); } template internal::ValueArray33 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33) { return internal::ValueArray33(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33); } template internal::ValueArray34 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34) { return internal::ValueArray34(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34); } template internal::ValueArray35 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) { return internal::ValueArray35(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35); } template internal::ValueArray36 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) { return internal::ValueArray36(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36); } template internal::ValueArray37 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37) { return internal::ValueArray37(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37); } template internal::ValueArray38 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) { return internal::ValueArray38(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38); } template internal::ValueArray39 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) { return internal::ValueArray39(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39); } template internal::ValueArray40 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) { return internal::ValueArray40(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40); } template internal::ValueArray41 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) { return internal::ValueArray41(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41); } template internal::ValueArray42 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42) { return internal::ValueArray42(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42); } template internal::ValueArray43 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43) { return internal::ValueArray43(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43); } template internal::ValueArray44 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44) { return internal::ValueArray44(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44); } template internal::ValueArray45 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) { return internal::ValueArray45(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45); } template internal::ValueArray46 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) { return internal::ValueArray46(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46); } template internal::ValueArray47 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) { return internal::ValueArray47(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47); } template internal::ValueArray48 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) { return internal::ValueArray48(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48); } template internal::ValueArray49 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49) { return internal::ValueArray49(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49); } template internal::ValueArray50 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) { return internal::ValueArray50(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50); } // Bool() allows generating tests with parameters in a set of (false, true). // // Synopsis: // Bool() // - returns a generator producing sequences with elements {false, true}. // // It is useful when testing code that depends on Boolean flags. Combinations // of multiple flags can be tested when several Bool()'s are combined using // Combine() function. // // In the following example all tests in the test case FlagDependentTest // will be instantiated twice with parameters false and true. // // class FlagDependentTest : public testing::TestWithParam { // virtual void SetUp() { // external_flag = GetParam(); // } // } // INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool()); // inline internal::ParamGenerator Bool() { return Values(false, true); } #if GTEST_HAS_COMBINE // Combine() allows the user to combine two or more sequences to produce // values of a Cartesian product of those sequences' elements. // // Synopsis: // Combine(gen1, gen2, ..., genN) // - returns a generator producing sequences with elements coming from // the Cartesian product of elements from the sequences generated by // gen1, gen2, ..., genN. The sequence elements will have a type of // tuple where T1, T2, ..., TN are the types // of elements from sequences produces by gen1, gen2, ..., genN. // // Combine can have up to 10 arguments. This number is currently limited // by the maximum number of elements in the tuple implementation used by Google // Test. // // Example: // // This will instantiate tests in test case AnimalTest each one with // the parameter values tuple("cat", BLACK), tuple("cat", WHITE), // tuple("dog", BLACK), and tuple("dog", WHITE): // // enum Color { BLACK, GRAY, WHITE }; // class AnimalTest // : public testing::TestWithParam > {...}; // // TEST_P(AnimalTest, AnimalLooksNice) {...} // // INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest, // Combine(Values("cat", "dog"), // Values(BLACK, WHITE))); // // This will instantiate tests in FlagDependentTest with all variations of two // Boolean flags: // // class FlagDependentTest // : public testing::TestWithParam > { // virtual void SetUp() { // // Assigns external_flag_1 and external_flag_2 values from the tuple. // tie(external_flag_1, external_flag_2) = GetParam(); // } // }; // // TEST_P(FlagDependentTest, TestFeature1) { // // Test your code using external_flag_1 and external_flag_2 here. // } // INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest, // Combine(Bool(), Bool())); // template internal::CartesianProductHolder2 Combine( const Generator1& g1, const Generator2& g2) { return internal::CartesianProductHolder2( g1, g2); } template internal::CartesianProductHolder3 Combine( const Generator1& g1, const Generator2& g2, const Generator3& g3) { return internal::CartesianProductHolder3( g1, g2, g3); } template internal::CartesianProductHolder4 Combine( const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4) { return internal::CartesianProductHolder4( g1, g2, g3, g4); } template internal::CartesianProductHolder5 Combine( const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5) { return internal::CartesianProductHolder5( g1, g2, g3, g4, g5); } template internal::CartesianProductHolder6 Combine( const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6) { return internal::CartesianProductHolder6( g1, g2, g3, g4, g5, g6); } template internal::CartesianProductHolder7 Combine( const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7) { return internal::CartesianProductHolder7( g1, g2, g3, g4, g5, g6, g7); } template internal::CartesianProductHolder8 Combine( const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7, const Generator8& g8) { return internal::CartesianProductHolder8( g1, g2, g3, g4, g5, g6, g7, g8); } template internal::CartesianProductHolder9 Combine( const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7, const Generator8& g8, const Generator9& g9) { return internal::CartesianProductHolder9( g1, g2, g3, g4, g5, g6, g7, g8, g9); } template internal::CartesianProductHolder10 Combine( const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7, const Generator8& g8, const Generator9& g9, const Generator10& g10) { return internal::CartesianProductHolder10( g1, g2, g3, g4, g5, g6, g7, g8, g9, g10); } #endif // GTEST_HAS_COMBINE #define TEST_P(test_case_name, test_name) \ class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \ : public test_case_name { \ public: \ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \ virtual void TestBody(); \ private: \ static int AddToRegistry() { \ ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \ GetTestCasePatternHolder(\ #test_case_name, __FILE__, __LINE__)->AddTestPattern(\ #test_case_name, \ #test_name, \ new ::testing::internal::TestMetaFactory< \ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \ return 0; \ } \ static int gtest_registering_dummy_; \ GTEST_DISALLOW_COPY_AND_ASSIGN_(\ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \ }; \ int GTEST_TEST_CLASS_NAME_(test_case_name, \ test_name)::gtest_registering_dummy_ = \ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \ void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() #define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \ ::testing::internal::ParamGenerator \ gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \ int gtest_##prefix##test_case_name##_dummy_ = \ ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \ GetTestCasePatternHolder(\ #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\ #prefix, \ >est_##prefix##test_case_name##_EvalGenerator_, \ __FILE__, __LINE__) } // namespace testing #endif // GTEST_HAS_PARAM_TEST #endif // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/include/gtest/gtest-param-test.h.pump000066400000000000000000000421061260417502300324730ustar00rootroot00000000000000$$ -*- mode: c++; -*- $var n = 50 $$ Maximum length of Values arguments we want to support. $var maxtuple = 10 $$ Maximum number of Combine arguments we want to support. // Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Authors: vladl@google.com (Vlad Losev) // // Macros and functions for implementing parameterized tests // in Google C++ Testing Framework (Google Test) // // This file is generated by a SCRIPT. DO NOT EDIT BY HAND! // #ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ #define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ // Value-parameterized tests allow you to test your code with different // parameters without writing multiple copies of the same test. // // Here is how you use value-parameterized tests: #if 0 // To write value-parameterized tests, first you should define a fixture // class. It must be derived from testing::TestWithParam, where T is // the type of your parameter values. TestWithParam is itself derived // from testing::Test. T can be any copyable type. If it's a raw pointer, // you are responsible for managing the lifespan of the pointed values. class FooTest : public ::testing::TestWithParam { // You can implement all the usual class fixture members here. }; // Then, use the TEST_P macro to define as many parameterized tests // for this fixture as you want. The _P suffix is for "parameterized" // or "pattern", whichever you prefer to think. TEST_P(FooTest, DoesBlah) { // Inside a test, access the test parameter with the GetParam() method // of the TestWithParam class: EXPECT_TRUE(foo.Blah(GetParam())); ... } TEST_P(FooTest, HasBlahBlah) { ... } // Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test // case with any set of parameters you want. Google Test defines a number // of functions for generating test parameters. They return what we call // (surprise!) parameter generators. Here is a summary of them, which // are all in the testing namespace: // // // Range(begin, end [, step]) - Yields values {begin, begin+step, // begin+step+step, ...}. The values do not // include end. step defaults to 1. // Values(v1, v2, ..., vN) - Yields values {v1, v2, ..., vN}. // ValuesIn(container) - Yields values from a C-style array, an STL // ValuesIn(begin,end) container, or an iterator range [begin, end). // Bool() - Yields sequence {false, true}. // Combine(g1, g2, ..., gN) - Yields all combinations (the Cartesian product // for the math savvy) of the values generated // by the N generators. // // For more details, see comments at the definitions of these functions below // in this file. // // The following statement will instantiate tests from the FooTest test case // each with parameter values "meeny", "miny", and "moe". INSTANTIATE_TEST_CASE_P(InstantiationName, FooTest, Values("meeny", "miny", "moe")); // To distinguish different instances of the pattern, (yes, you // can instantiate it more then once) the first argument to the // INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the // actual test case name. Remember to pick unique prefixes for different // instantiations. The tests from the instantiation above will have // these names: // // * InstantiationName/FooTest.DoesBlah/0 for "meeny" // * InstantiationName/FooTest.DoesBlah/1 for "miny" // * InstantiationName/FooTest.DoesBlah/2 for "moe" // * InstantiationName/FooTest.HasBlahBlah/0 for "meeny" // * InstantiationName/FooTest.HasBlahBlah/1 for "miny" // * InstantiationName/FooTest.HasBlahBlah/2 for "moe" // // You can use these names in --gtest_filter. // // This statement will instantiate all tests from FooTest again, each // with parameter values "cat" and "dog": const char* pets[] = {"cat", "dog"}; INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets)); // The tests from the instantiation above will have these names: // // * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat" // * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog" // * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat" // * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog" // // Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests // in the given test case, whether their definitions come before or // AFTER the INSTANTIATE_TEST_CASE_P statement. // // Please also note that generator expressions are evaluated in // RUN_ALL_TESTS(), after main() has started. This allows evaluation of // parameter list based on command line parameters. // // You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc // for more examples. // // In the future, we plan to publish the API for defining new parameter // generators. But for now this interface remains part of the internal // implementation and is subject to change. #endif // 0 #include #if !GTEST_OS_SYMBIAN #include #endif // scripts/fuse_gtest.py depends on gtest's own header being #included // *unconditionally*. Therefore these #includes cannot be moved // inside #if GTEST_HAS_PARAM_TEST. #include #include #include #if GTEST_HAS_PARAM_TEST namespace testing { // Functions producing parameter generators. // // Google Test uses these generators to produce parameters for value- // parameterized tests. When a parameterized test case is instantiated // with a particular generator, Google Test creates and runs tests // for each element in the sequence produced by the generator. // // In the following sample, tests from test case FooTest are instantiated // each three times with parameter values 3, 5, and 8: // // class FooTest : public TestWithParam { ... }; // // TEST_P(FooTest, TestThis) { // } // TEST_P(FooTest, TestThat) { // } // INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8)); // // Range() returns generators providing sequences of values in a range. // // Synopsis: // Range(start, end) // - returns a generator producing a sequence of values {start, start+1, // start+2, ..., }. // Range(start, end, step) // - returns a generator producing a sequence of values {start, start+step, // start+step+step, ..., }. // Notes: // * The generated sequences never include end. For example, Range(1, 5) // returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2) // returns a generator producing {1, 3, 5, 7}. // * start and end must have the same type. That type may be any integral or // floating-point type or a user defined type satisfying these conditions: // * It must be assignable (have operator=() defined). // * It must have operator+() (operator+(int-compatible type) for // two-operand version). // * It must have operator<() defined. // Elements in the resulting sequences will also have that type. // * Condition start < end must be satisfied in order for resulting sequences // to contain any elements. // template internal::ParamGenerator Range(T start, T end, IncrementT step) { return internal::ParamGenerator( new internal::RangeGenerator(start, end, step)); } template internal::ParamGenerator Range(T start, T end) { return Range(start, end, 1); } // ValuesIn() function allows generation of tests with parameters coming from // a container. // // Synopsis: // ValuesIn(const T (&array)[N]) // - returns a generator producing sequences with elements from // a C-style array. // ValuesIn(const Container& container) // - returns a generator producing sequences with elements from // an STL-style container. // ValuesIn(Iterator begin, Iterator end) // - returns a generator producing sequences with elements from // a range [begin, end) defined by a pair of STL-style iterators. These // iterators can also be plain C pointers. // // Please note that ValuesIn copies the values from the containers // passed in and keeps them to generate tests in RUN_ALL_TESTS(). // // Examples: // // This instantiates tests from test case StringTest // each with C-string values of "foo", "bar", and "baz": // // const char* strings[] = {"foo", "bar", "baz"}; // INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings)); // // This instantiates tests from test case StlStringTest // each with STL strings with values "a" and "b": // // ::std::vector< ::std::string> GetParameterStrings() { // ::std::vector< ::std::string> v; // v.push_back("a"); // v.push_back("b"); // return v; // } // // INSTANTIATE_TEST_CASE_P(CharSequence, // StlStringTest, // ValuesIn(GetParameterStrings())); // // // This will also instantiate tests from CharTest // each with parameter values 'a' and 'b': // // ::std::list GetParameterChars() { // ::std::list list; // list.push_back('a'); // list.push_back('b'); // return list; // } // ::std::list l = GetParameterChars(); // INSTANTIATE_TEST_CASE_P(CharSequence2, // CharTest, // ValuesIn(l.begin(), l.end())); // template internal::ParamGenerator< typename ::std::iterator_traits::value_type> ValuesIn( ForwardIterator begin, ForwardIterator end) { typedef typename ::std::iterator_traits::value_type ParamType; return internal::ParamGenerator( new internal::ValuesInIteratorRangeGenerator(begin, end)); } template internal::ParamGenerator ValuesIn(const T (&array)[N]) { return ValuesIn(array, array + N); } template internal::ParamGenerator ValuesIn( const Container& container) { return ValuesIn(container.begin(), container.end()); } // Values() allows generating tests from explicitly specified list of // parameters. // // Synopsis: // Values(T v1, T v2, ..., T vN) // - returns a generator producing sequences with elements v1, v2, ..., vN. // // For example, this instantiates tests from test case BarTest each // with values "one", "two", and "three": // // INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three")); // // This instantiates tests from test case BazTest each with values 1, 2, 3.5. // The exact type of values will depend on the type of parameter in BazTest. // // INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5)); // // Currently, Values() supports from 1 to $n parameters. // $range i 1..n $for i [[ $range j 1..i template <$for j, [[typename T$j]]> internal::ValueArray$i<$for j, [[T$j]]> Values($for j, [[T$j v$j]]) { return internal::ValueArray$i<$for j, [[T$j]]>($for j, [[v$j]]); } ]] // Bool() allows generating tests with parameters in a set of (false, true). // // Synopsis: // Bool() // - returns a generator producing sequences with elements {false, true}. // // It is useful when testing code that depends on Boolean flags. Combinations // of multiple flags can be tested when several Bool()'s are combined using // Combine() function. // // In the following example all tests in the test case FlagDependentTest // will be instantiated twice with parameters false and true. // // class FlagDependentTest : public testing::TestWithParam { // virtual void SetUp() { // external_flag = GetParam(); // } // } // INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool()); // inline internal::ParamGenerator Bool() { return Values(false, true); } #if GTEST_HAS_COMBINE // Combine() allows the user to combine two or more sequences to produce // values of a Cartesian product of those sequences' elements. // // Synopsis: // Combine(gen1, gen2, ..., genN) // - returns a generator producing sequences with elements coming from // the Cartesian product of elements from the sequences generated by // gen1, gen2, ..., genN. The sequence elements will have a type of // tuple where T1, T2, ..., TN are the types // of elements from sequences produces by gen1, gen2, ..., genN. // // Combine can have up to $maxtuple arguments. This number is currently limited // by the maximum number of elements in the tuple implementation used by Google // Test. // // Example: // // This will instantiate tests in test case AnimalTest each one with // the parameter values tuple("cat", BLACK), tuple("cat", WHITE), // tuple("dog", BLACK), and tuple("dog", WHITE): // // enum Color { BLACK, GRAY, WHITE }; // class AnimalTest // : public testing::TestWithParam > {...}; // // TEST_P(AnimalTest, AnimalLooksNice) {...} // // INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest, // Combine(Values("cat", "dog"), // Values(BLACK, WHITE))); // // This will instantiate tests in FlagDependentTest with all variations of two // Boolean flags: // // class FlagDependentTest // : public testing::TestWithParam > { // virtual void SetUp() { // // Assigns external_flag_1 and external_flag_2 values from the tuple. // tie(external_flag_1, external_flag_2) = GetParam(); // } // }; // // TEST_P(FlagDependentTest, TestFeature1) { // // Test your code using external_flag_1 and external_flag_2 here. // } // INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest, // Combine(Bool(), Bool())); // $range i 2..maxtuple $for i [[ $range j 1..i template <$for j, [[typename Generator$j]]> internal::CartesianProductHolder$i<$for j, [[Generator$j]]> Combine( $for j, [[const Generator$j& g$j]]) { return internal::CartesianProductHolder$i<$for j, [[Generator$j]]>( $for j, [[g$j]]); } ]] #endif // GTEST_HAS_COMBINE #define TEST_P(test_case_name, test_name) \ class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \ : public test_case_name { \ public: \ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \ virtual void TestBody(); \ private: \ static int AddToRegistry() { \ ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \ GetTestCasePatternHolder(\ #test_case_name, __FILE__, __LINE__)->AddTestPattern(\ #test_case_name, \ #test_name, \ new ::testing::internal::TestMetaFactory< \ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \ return 0; \ } \ static int gtest_registering_dummy_; \ GTEST_DISALLOW_COPY_AND_ASSIGN_(\ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \ }; \ int GTEST_TEST_CLASS_NAME_(test_case_name, \ test_name)::gtest_registering_dummy_ = \ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \ void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() #define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \ ::testing::internal::ParamGenerator \ gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \ int gtest_##prefix##test_case_name##_dummy_ = \ ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \ GetTestCasePatternHolder(\ #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\ #prefix, \ >est_##prefix##test_case_name##_EvalGenerator_, \ __FILE__, __LINE__) } // namespace testing #endif // GTEST_HAS_PARAM_TEST #endif // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/include/gtest/gtest-spi.h000066400000000000000000000233351260417502300302340ustar00rootroot00000000000000// Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // // Utilities for testing Google Test itself and code that uses Google Test // (e.g. frameworks built on top of Google Test). #ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_ #define GTEST_INCLUDE_GTEST_GTEST_SPI_H_ #include namespace testing { // This helper class can be used to mock out Google Test failure reporting // so that we can test Google Test or code that builds on Google Test. // // An object of this class appends a TestPartResult object to the // TestPartResultArray object given in the constructor whenever a Google Test // failure is reported. It can either intercept only failures that are // generated in the same thread that created this object or it can intercept // all generated failures. The scope of this mock object can be controlled with // the second argument to the two arguments constructor. class GTEST_API_ ScopedFakeTestPartResultReporter : public TestPartResultReporterInterface { public: // The two possible mocking modes of this object. enum InterceptMode { INTERCEPT_ONLY_CURRENT_THREAD, // Intercepts only thread local failures. INTERCEPT_ALL_THREADS // Intercepts all failures. }; // The c'tor sets this object as the test part result reporter used // by Google Test. The 'result' parameter specifies where to report the // results. This reporter will only catch failures generated in the current // thread. DEPRECATED explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result); // Same as above, but you can choose the interception scope of this object. ScopedFakeTestPartResultReporter(InterceptMode intercept_mode, TestPartResultArray* result); // The d'tor restores the previous test part result reporter. virtual ~ScopedFakeTestPartResultReporter(); // Appends the TestPartResult object to the TestPartResultArray // received in the constructor. // // This method is from the TestPartResultReporterInterface // interface. virtual void ReportTestPartResult(const TestPartResult& result); private: void Init(); const InterceptMode intercept_mode_; TestPartResultReporterInterface* old_reporter_; TestPartResultArray* const result_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter); }; namespace internal { // A helper class for implementing EXPECT_FATAL_FAILURE() and // EXPECT_NONFATAL_FAILURE(). Its destructor verifies that the given // TestPartResultArray contains exactly one failure that has the given // type and contains the given substring. If that's not the case, a // non-fatal failure will be generated. class GTEST_API_ SingleFailureChecker { public: // The constructor remembers the arguments. SingleFailureChecker(const TestPartResultArray* results, TestPartResult::Type type, const char* substr); ~SingleFailureChecker(); private: const TestPartResultArray* const results_; const TestPartResult::Type type_; const String substr_; GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker); }; } // namespace internal } // namespace testing // A set of macros for testing Google Test assertions or code that's expected // to generate Google Test fatal failures. It verifies that the given // statement will cause exactly one fatal Google Test failure with 'substr' // being part of the failure message. // // There are two different versions of this macro. EXPECT_FATAL_FAILURE only // affects and considers failures generated in the current thread and // EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads. // // The verification of the assertion is done correctly even when the statement // throws an exception or aborts the current function. // // Known restrictions: // - 'statement' cannot reference local non-static variables or // non-static members of the current object. // - 'statement' cannot return a value. // - You cannot stream a failure message to this macro. // // Note that even though the implementations of the following two // macros are much alike, we cannot refactor them to use a common // helper macro, due to some peculiarity in how the preprocessor // works. The AcceptsMacroThatExpandsToUnprotectedComma test in // gtest_unittest.cc will fail to compile if we do that. #define EXPECT_FATAL_FAILURE(statement, substr) \ do { \ class GTestExpectFatalFailureHelper {\ public:\ static void Execute() { statement; }\ };\ ::testing::TestPartResultArray gtest_failures;\ ::testing::internal::SingleFailureChecker gtest_checker(\ >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\ {\ ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ ::testing::ScopedFakeTestPartResultReporter:: \ INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\ GTestExpectFatalFailureHelper::Execute();\ }\ } while (::testing::internal::AlwaysFalse()) #define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \ do { \ class GTestExpectFatalFailureHelper {\ public:\ static void Execute() { statement; }\ };\ ::testing::TestPartResultArray gtest_failures;\ ::testing::internal::SingleFailureChecker gtest_checker(\ >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\ {\ ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ ::testing::ScopedFakeTestPartResultReporter:: \ INTERCEPT_ALL_THREADS, >est_failures);\ GTestExpectFatalFailureHelper::Execute();\ }\ } while (::testing::internal::AlwaysFalse()) // A macro for testing Google Test assertions or code that's expected to // generate Google Test non-fatal failures. It asserts that the given // statement will cause exactly one non-fatal Google Test failure with 'substr' // being part of the failure message. // // There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only // affects and considers failures generated in the current thread and // EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads. // // 'statement' is allowed to reference local variables and members of // the current object. // // The verification of the assertion is done correctly even when the statement // throws an exception or aborts the current function. // // Known restrictions: // - You cannot stream a failure message to this macro. // // Note that even though the implementations of the following two // macros are much alike, we cannot refactor them to use a common // helper macro, due to some peculiarity in how the preprocessor // works. If we do that, the code won't compile when the user gives // EXPECT_NONFATAL_FAILURE() a statement that contains a macro that // expands to code containing an unprotected comma. The // AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc // catches that. // // For the same reason, we have to write // if (::testing::internal::AlwaysTrue()) { statement; } // instead of // GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) // to avoid an MSVC warning on unreachable code. #define EXPECT_NONFATAL_FAILURE(statement, substr) \ do {\ ::testing::TestPartResultArray gtest_failures;\ ::testing::internal::SingleFailureChecker gtest_checker(\ >est_failures, ::testing::TestPartResult::kNonFatalFailure, \ (substr));\ {\ ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ ::testing::ScopedFakeTestPartResultReporter:: \ INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\ if (::testing::internal::AlwaysTrue()) { statement; }\ }\ } while (::testing::internal::AlwaysFalse()) #define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \ do {\ ::testing::TestPartResultArray gtest_failures;\ ::testing::internal::SingleFailureChecker gtest_checker(\ >est_failures, ::testing::TestPartResult::kNonFatalFailure, \ (substr));\ {\ ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS,\ >est_failures);\ if (::testing::internal::AlwaysTrue()) { statement; }\ }\ } while (::testing::internal::AlwaysFalse()) #endif // GTEST_INCLUDE_GTEST_GTEST_SPI_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/include/gtest/gtest-test-part.h000066400000000000000000000145051260417502300313630ustar00rootroot00000000000000// Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: mheule@google.com (Markus Heule) // #ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ #define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ #include #include #include #include namespace testing { // A copyable object representing the result of a test part (i.e. an // assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()). // // Don't inherit from TestPartResult as its destructor is not virtual. class GTEST_API_ TestPartResult { public: // The possible outcomes of a test part (i.e. an assertion or an // explicit SUCCEED(), FAIL(), or ADD_FAILURE()). enum Type { kSuccess, // Succeeded. kNonFatalFailure, // Failed but the test can continue. kFatalFailure // Failed and the test should be terminated. }; // C'tor. TestPartResult does NOT have a default constructor. // Always use this constructor (with parameters) to create a // TestPartResult object. TestPartResult(Type a_type, const char* a_file_name, int a_line_number, const char* a_message) : type_(a_type), file_name_(a_file_name), line_number_(a_line_number), summary_(ExtractSummary(a_message)), message_(a_message) { } // Gets the outcome of the test part. Type type() const { return type_; } // Gets the name of the source file where the test part took place, or // NULL if it's unknown. const char* file_name() const { return file_name_.c_str(); } // Gets the line in the source file where the test part took place, // or -1 if it's unknown. int line_number() const { return line_number_; } // Gets the summary of the failure message. const char* summary() const { return summary_.c_str(); } // Gets the message associated with the test part. const char* message() const { return message_.c_str(); } // Returns true iff the test part passed. bool passed() const { return type_ == kSuccess; } // Returns true iff the test part failed. bool failed() const { return type_ != kSuccess; } // Returns true iff the test part non-fatally failed. bool nonfatally_failed() const { return type_ == kNonFatalFailure; } // Returns true iff the test part fatally failed. bool fatally_failed() const { return type_ == kFatalFailure; } private: Type type_; // Gets the summary of the failure message by omitting the stack // trace in it. static internal::String ExtractSummary(const char* message); // The name of the source file where the test part took place, or // NULL if the source file is unknown. internal::String file_name_; // The line in the source file where the test part took place, or -1 // if the line number is unknown. int line_number_; internal::String summary_; // The test failure summary. internal::String message_; // The test failure message. }; // Prints a TestPartResult object. std::ostream& operator<<(std::ostream& os, const TestPartResult& result); // An array of TestPartResult objects. // // Don't inherit from TestPartResultArray as its destructor is not // virtual. class GTEST_API_ TestPartResultArray { public: TestPartResultArray() {} // Appends the given TestPartResult to the array. void Append(const TestPartResult& result); // Returns the TestPartResult at the given index (0-based). const TestPartResult& GetTestPartResult(int index) const; // Returns the number of TestPartResult objects in the array. int size() const; private: std::vector array_; GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray); }; // This interface knows how to report a test part result. class TestPartResultReporterInterface { public: virtual ~TestPartResultReporterInterface() {} virtual void ReportTestPartResult(const TestPartResult& result) = 0; }; namespace internal { // This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a // statement generates new fatal failures. To do so it registers itself as the // current test part result reporter. Besides checking if fatal failures were // reported, it only delegates the reporting to the former result reporter. // The original result reporter is restored in the destructor. // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. class GTEST_API_ HasNewFatalFailureHelper : public TestPartResultReporterInterface { public: HasNewFatalFailureHelper(); virtual ~HasNewFatalFailureHelper(); virtual void ReportTestPartResult(const TestPartResult& result); bool has_new_fatal_failure() const { return has_new_fatal_failure_; } private: bool has_new_fatal_failure_; TestPartResultReporterInterface* original_reporter_; GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper); }; } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/include/gtest/gtest-typed-test.h000066400000000000000000000236601260417502300315440ustar00rootroot00000000000000// Copyright 2008 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) #ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ #define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ // This header implements typed tests and type-parameterized tests. // Typed (aka type-driven) tests repeat the same test for types in a // list. You must know which types you want to test with when writing // typed tests. Here's how you do it: #if 0 // First, define a fixture class template. It should be parameterized // by a type. Remember to derive it from testing::Test. template class FooTest : public testing::Test { public: ... typedef std::list List; static T shared_; T value_; }; // Next, associate a list of types with the test case, which will be // repeated for each type in the list. The typedef is necessary for // the macro to parse correctly. typedef testing::Types MyTypes; TYPED_TEST_CASE(FooTest, MyTypes); // If the type list contains only one type, you can write that type // directly without Types<...>: // TYPED_TEST_CASE(FooTest, int); // Then, use TYPED_TEST() instead of TEST_F() to define as many typed // tests for this test case as you want. TYPED_TEST(FooTest, DoesBlah) { // Inside a test, refer to TypeParam to get the type parameter. // Since we are inside a derived class template, C++ requires use to // visit the members of FooTest via 'this'. TypeParam n = this->value_; // To visit static members of the fixture, add the TestFixture:: // prefix. n += TestFixture::shared_; // To refer to typedefs in the fixture, add the "typename // TestFixture::" prefix. typename TestFixture::List values; values.push_back(n); ... } TYPED_TEST(FooTest, HasPropertyA) { ... } #endif // 0 // Type-parameterized tests are abstract test patterns parameterized // by a type. Compared with typed tests, type-parameterized tests // allow you to define the test pattern without knowing what the type // parameters are. The defined pattern can be instantiated with // different types any number of times, in any number of translation // units. // // If you are designing an interface or concept, you can define a // suite of type-parameterized tests to verify properties that any // valid implementation of the interface/concept should have. Then, // each implementation can easily instantiate the test suite to verify // that it conforms to the requirements, without having to write // similar tests repeatedly. Here's an example: #if 0 // First, define a fixture class template. It should be parameterized // by a type. Remember to derive it from testing::Test. template class FooTest : public testing::Test { ... }; // Next, declare that you will define a type-parameterized test case // (the _P suffix is for "parameterized" or "pattern", whichever you // prefer): TYPED_TEST_CASE_P(FooTest); // Then, use TYPED_TEST_P() to define as many type-parameterized tests // for this type-parameterized test case as you want. TYPED_TEST_P(FooTest, DoesBlah) { // Inside a test, refer to TypeParam to get the type parameter. TypeParam n = 0; ... } TYPED_TEST_P(FooTest, HasPropertyA) { ... } // Now the tricky part: you need to register all test patterns before // you can instantiate them. The first argument of the macro is the // test case name; the rest are the names of the tests in this test // case. REGISTER_TYPED_TEST_CASE_P(FooTest, DoesBlah, HasPropertyA); // Finally, you are free to instantiate the pattern with the types you // want. If you put the above code in a header file, you can #include // it in multiple C++ source files and instantiate it multiple times. // // To distinguish different instances of the pattern, the first // argument to the INSTANTIATE_* macro is a prefix that will be added // to the actual test case name. Remember to pick unique prefixes for // different instances. typedef testing::Types MyTypes; INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes); // If the type list contains only one type, you can write that type // directly without Types<...>: // INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int); #endif // 0 #include #include // Implements typed tests. #if GTEST_HAS_TYPED_TEST // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Expands to the name of the typedef for the type parameters of the // given test case. #define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_ // The 'Types' template argument below must have spaces around it // since some compilers may choke on '>>' when passing a template // instance (e.g. Types) #define TYPED_TEST_CASE(CaseName, Types) \ typedef ::testing::internal::TypeList< Types >::type \ GTEST_TYPE_PARAMS_(CaseName) #define TYPED_TEST(CaseName, TestName) \ template \ class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \ : public CaseName { \ private: \ typedef CaseName TestFixture; \ typedef gtest_TypeParam_ TypeParam; \ virtual void TestBody(); \ }; \ bool gtest_##CaseName##_##TestName##_registered_ = \ ::testing::internal::TypeParameterizedTest< \ CaseName, \ ::testing::internal::TemplateSel< \ GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \ GTEST_TYPE_PARAMS_(CaseName)>::Register(\ "", #CaseName, #TestName, 0); \ template \ void GTEST_TEST_CLASS_NAME_(CaseName, TestName)::TestBody() #endif // GTEST_HAS_TYPED_TEST // Implements type-parameterized tests. #if GTEST_HAS_TYPED_TEST_P // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Expands to the namespace name that the type-parameterized tests for // the given type-parameterized test case are defined in. The exact // name of the namespace is subject to change without notice. #define GTEST_CASE_NAMESPACE_(TestCaseName) \ gtest_case_##TestCaseName##_ // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Expands to the name of the variable used to remember the names of // the defined tests in the given test case. #define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \ gtest_typed_test_case_p_state_##TestCaseName##_ // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY. // // Expands to the name of the variable used to remember the names of // the registered tests in the given test case. #define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \ gtest_registered_test_names_##TestCaseName##_ // The variables defined in the type-parameterized test macros are // static as typically these macros are used in a .h file that can be // #included in multiple translation units linked together. #define TYPED_TEST_CASE_P(CaseName) \ static ::testing::internal::TypedTestCasePState \ GTEST_TYPED_TEST_CASE_P_STATE_(CaseName) #define TYPED_TEST_P(CaseName, TestName) \ namespace GTEST_CASE_NAMESPACE_(CaseName) { \ template \ class TestName : public CaseName { \ private: \ typedef CaseName TestFixture; \ typedef gtest_TypeParam_ TypeParam; \ virtual void TestBody(); \ }; \ static bool gtest_##TestName##_defined_ = \ GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\ __FILE__, __LINE__, #CaseName, #TestName); \ } \ template \ void GTEST_CASE_NAMESPACE_(CaseName)::TestName::TestBody() #define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \ namespace GTEST_CASE_NAMESPACE_(CaseName) { \ typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \ } \ static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \ GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\ __FILE__, __LINE__, #__VA_ARGS__) // The 'Types' template argument below must have spaces around it // since some compilers may choke on '>>' when passing a template // instance (e.g. Types) #define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \ bool gtest_##Prefix##_##CaseName = \ ::testing::internal::TypeParameterizedTestCase::type>::Register(\ #Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName)) #endif // GTEST_HAS_TYPED_TEST_P #endif // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/include/gtest/gtest.h000066400000000000000000002300241260417502300274360ustar00rootroot00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // // The Google C++ Testing Framework (Google Test) // // This header file defines the public API for Google Test. It should be // included by any test program that uses Google Test. // // IMPORTANT NOTE: Due to limitation of the C++ language, we have to // leave some internal implementation details in this header file. // They are clearly marked by comments like this: // // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. // // Such code is NOT meant to be used by a user directly, and is subject // to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user // program! // // Acknowledgment: Google Test borrowed the idea of automatic test // registration from Barthelemy Dagenais' (barthelemy@prologique.com) // easyUnit framework. #ifndef GTEST_INCLUDE_GTEST_GTEST_H_ #define GTEST_INCLUDE_GTEST_GTEST_H_ #include #include #include #include #include #include #include #include #include #include // Depending on the platform, different string classes are available. // On Linux, in addition to ::std::string, Google also makes use of // class ::string, which has the same interface as ::std::string, but // has a different implementation. // // The user can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that // ::string is available AND is a distinct type to ::std::string, or // define it to 0 to indicate otherwise. // // If the user's ::std::string and ::string are the same class due to // aliasing, he should define GTEST_HAS_GLOBAL_STRING to 0. // // If the user doesn't define GTEST_HAS_GLOBAL_STRING, it is defined // heuristically. namespace testing { // Declares the flags. // This flag temporary enables the disabled tests. GTEST_DECLARE_bool_(also_run_disabled_tests); // This flag brings the debugger on an assertion failure. GTEST_DECLARE_bool_(break_on_failure); // This flag controls whether Google Test catches all test-thrown exceptions // and logs them as failures. GTEST_DECLARE_bool_(catch_exceptions); // This flag enables using colors in terminal output. Available values are // "yes" to enable colors, "no" (disable colors), or "auto" (the default) // to let Google Test decide. GTEST_DECLARE_string_(color); // This flag sets up the filter to select by name using a glob pattern // the tests to run. If the filter is not given all tests are executed. GTEST_DECLARE_string_(filter); // This flag causes the Google Test to list tests. None of the tests listed // are actually run if the flag is provided. GTEST_DECLARE_bool_(list_tests); // This flag controls whether Google Test emits a detailed XML report to a file // in addition to its normal textual output. GTEST_DECLARE_string_(output); // This flags control whether Google Test prints the elapsed time for each // test. GTEST_DECLARE_bool_(print_time); // This flag specifies the random number seed. GTEST_DECLARE_int32_(random_seed); // This flag sets how many times the tests are repeated. The default value // is 1. If the value is -1 the tests are repeating forever. GTEST_DECLARE_int32_(repeat); // This flag controls whether Google Test includes Google Test internal // stack frames in failure stack traces. GTEST_DECLARE_bool_(show_internal_stack_frames); // When this flag is specified, tests' order is randomized on every iteration. GTEST_DECLARE_bool_(shuffle); // This flag specifies the maximum number of stack frames to be // printed in a failure message. GTEST_DECLARE_int32_(stack_trace_depth); // When this flag is specified, a failed assertion will throw an // exception if exceptions are enabled, or exit the program with a // non-zero code otherwise. GTEST_DECLARE_bool_(throw_on_failure); // The upper limit for valid stack trace depths. const int kMaxStackTraceDepth = 100; namespace internal { class AssertHelper; class DefaultGlobalTestPartResultReporter; class ExecDeathTest; class NoExecDeathTest; class FinalSuccessChecker; class GTestFlagSaver; class TestInfoImpl; class TestResultAccessor; class TestEventListenersAccessor; class TestEventRepeater; class WindowsDeathTest; class UnitTestImpl* GetUnitTestImpl(); void ReportFailureInUnknownLocation(TestPartResult::Type result_type, const String& message); class PrettyUnitTestResultPrinter; class XmlUnitTestResultPrinter; // Converts a streamable value to a String. A NULL pointer is // converted to "(null)". When the input value is a ::string, // ::std::string, ::wstring, or ::std::wstring object, each NUL // character in it is replaced with "\\0". // Declared in gtest-internal.h but defined here, so that it has access // to the definition of the Message class, required by the ARM // compiler. template String StreamableToString(const T& streamable) { return (Message() << streamable).GetString(); } } // namespace internal // A class for indicating whether an assertion was successful. When // the assertion wasn't successful, the AssertionResult object // remembers a non-empty message that describes how it failed. // // To create an instance of this class, use one of the factory functions // (AssertionSuccess() and AssertionFailure()). // // This class is useful for two purposes: // 1. Defining predicate functions to be used with Boolean test assertions // EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts // 2. Defining predicate-format functions to be // used with predicate assertions (ASSERT_PRED_FORMAT*, etc). // // For example, if you define IsEven predicate: // // testing::AssertionResult IsEven(int n) { // if ((n % 2) == 0) // return testing::AssertionSuccess(); // else // return testing::AssertionFailure() << n << " is odd"; // } // // Then the failed expectation EXPECT_TRUE(IsEven(Fib(5))) // will print the message // // Value of: IsEven(Fib(5)) // Actual: false (5 is odd) // Expected: true // // instead of a more opaque // // Value of: IsEven(Fib(5)) // Actual: false // Expected: true // // in case IsEven is a simple Boolean predicate. // // If you expect your predicate to be reused and want to support informative // messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up // about half as often as positive ones in our tests), supply messages for // both success and failure cases: // // testing::AssertionResult IsEven(int n) { // if ((n % 2) == 0) // return testing::AssertionSuccess() << n << " is even"; // else // return testing::AssertionFailure() << n << " is odd"; // } // // Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print // // Value of: IsEven(Fib(6)) // Actual: true (8 is even) // Expected: false // // NB: Predicates that support negative Boolean assertions have reduced // performance in positive ones so be careful not to use them in tests // that have lots (tens of thousands) of positive Boolean assertions. // // To use this class with EXPECT_PRED_FORMAT assertions such as: // // // Verifies that Foo() returns an even number. // EXPECT_PRED_FORMAT1(IsEven, Foo()); // // you need to define: // // testing::AssertionResult IsEven(const char* expr, int n) { // if ((n % 2) == 0) // return testing::AssertionSuccess(); // else // return testing::AssertionFailure() // << "Expected: " << expr << " is even\n Actual: it's " << n; // } // // If Foo() returns 5, you will see the following message: // // Expected: Foo() is even // Actual: it's 5 // class GTEST_API_ AssertionResult { public: // Copy constructor. // Used in EXPECT_TRUE/FALSE(assertion_result). AssertionResult(const AssertionResult& other); // Used in the EXPECT_TRUE/FALSE(bool_expression). explicit AssertionResult(bool success) : success_(success) {} // Returns true iff the assertion succeeded. operator bool() const { return success_; } // NOLINT // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE. AssertionResult operator!() const; // Returns the text streamed into this AssertionResult. Test assertions // use it when they fail (i.e., the predicate's outcome doesn't match the // assertion's expectation). When nothing has been streamed into the // object, returns an empty string. const char* message() const { return message_.get() != NULL && message_->c_str() != NULL ? message_->c_str() : ""; } // TODO(vladl@google.com): Remove this after making sure no clients use it. // Deprecated; please use message() instead. const char* failure_message() const { return message(); } // Streams a custom failure message into this object. template AssertionResult& operator<<(const T& value); private: // No implementation - we want AssertionResult to be // copy-constructible but not assignable. void operator=(const AssertionResult& other); // Stores result of the assertion predicate. bool success_; // Stores the message describing the condition in case the expectation // construct is not satisfied with the predicate's outcome. // Referenced via a pointer to avoid taking too much stack frame space // with test assertions. internal::scoped_ptr message_; }; // class AssertionResult // Streams a custom failure message into this object. template AssertionResult& AssertionResult::operator<<(const T& value) { Message msg; if (message_.get() != NULL) msg << *message_; msg << value; message_.reset(new internal::String(msg.GetString())); return *this; } // Makes a successful assertion result. GTEST_API_ AssertionResult AssertionSuccess(); // Makes a failed assertion result. GTEST_API_ AssertionResult AssertionFailure(); // Makes a failed assertion result with the given failure message. // Deprecated; use AssertionFailure() << msg. GTEST_API_ AssertionResult AssertionFailure(const Message& msg); // The abstract class that all tests inherit from. // // In Google Test, a unit test program contains one or many TestCases, and // each TestCase contains one or many Tests. // // When you define a test using the TEST macro, you don't need to // explicitly derive from Test - the TEST macro automatically does // this for you. // // The only time you derive from Test is when defining a test fixture // to be used a TEST_F. For example: // // class FooTest : public testing::Test { // protected: // virtual void SetUp() { ... } // virtual void TearDown() { ... } // ... // }; // // TEST_F(FooTest, Bar) { ... } // TEST_F(FooTest, Baz) { ... } // // Test is not copyable. class GTEST_API_ Test { public: friend class internal::TestInfoImpl; // Defines types for pointers to functions that set up and tear down // a test case. typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc; typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc; // The d'tor is virtual as we intend to inherit from Test. virtual ~Test(); // Sets up the stuff shared by all tests in this test case. // // Google Test will call Foo::SetUpTestCase() before running the first // test in test case Foo. Hence a sub-class can define its own // SetUpTestCase() method to shadow the one defined in the super // class. static void SetUpTestCase() {} // Tears down the stuff shared by all tests in this test case. // // Google Test will call Foo::TearDownTestCase() after running the last // test in test case Foo. Hence a sub-class can define its own // TearDownTestCase() method to shadow the one defined in the super // class. static void TearDownTestCase() {} // Returns true iff the current test has a fatal failure. static bool HasFatalFailure(); // Returns true iff the current test has a non-fatal failure. static bool HasNonfatalFailure(); // Returns true iff the current test has a (either fatal or // non-fatal) failure. static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); } // Logs a property for the current test. Only the last value for a given // key is remembered. // These are public static so they can be called from utility functions // that are not members of the test fixture. // The arguments are const char* instead strings, as Google Test is used // on platforms where string doesn't compile. // // Note that a driving consideration for these RecordProperty methods // was to produce xml output suited to the Greenspan charting utility, // which at present will only chart values that fit in a 32-bit int. It // is the user's responsibility to restrict their values to 32-bit ints // if they intend them to be used with Greenspan. static void RecordProperty(const char* key, const char* value); static void RecordProperty(const char* key, int value); protected: // Creates a Test object. Test(); // Sets up the test fixture. virtual void SetUp(); // Tears down the test fixture. virtual void TearDown(); private: // Returns true iff the current test has the same fixture class as // the first test in the current test case. static bool HasSameFixtureClass(); // Runs the test after the test fixture has been set up. // // A sub-class must implement this to define the test logic. // // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM. // Instead, use the TEST or TEST_F macro. virtual void TestBody() = 0; // Sets up, executes, and tears down the test. void Run(); // Uses a GTestFlagSaver to save and restore all Google Test flags. const internal::GTestFlagSaver* const gtest_flag_saver_; // Often a user mis-spells SetUp() as Setup() and spends a long time // wondering why it is never called by Google Test. The declaration of // the following method is solely for catching such an error at // compile time: // // - The return type is deliberately chosen to be not void, so it // will be a conflict if a user declares void Setup() in his test // fixture. // // - This method is private, so it will be another compiler error // if a user calls it from his test fixture. // // DO NOT OVERRIDE THIS FUNCTION. // // If you see an error about overriding the following function or // about it being private, you have mis-spelled SetUp() as Setup(). struct Setup_should_be_spelled_SetUp {}; virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; } // We disallow copying Tests. GTEST_DISALLOW_COPY_AND_ASSIGN_(Test); }; typedef internal::TimeInMillis TimeInMillis; // A copyable object representing a user specified test property which can be // output as a key/value string pair. // // Don't inherit from TestProperty as its destructor is not virtual. class TestProperty { public: // C'tor. TestProperty does NOT have a default constructor. // Always use this constructor (with parameters) to create a // TestProperty object. TestProperty(const char* a_key, const char* a_value) : key_(a_key), value_(a_value) { } // Gets the user supplied key. const char* key() const { return key_.c_str(); } // Gets the user supplied value. const char* value() const { return value_.c_str(); } // Sets a new value, overriding the one supplied in the constructor. void SetValue(const char* new_value) { value_ = new_value; } private: // The key supplied by the user. internal::String key_; // The value supplied by the user. internal::String value_; }; // The result of a single Test. This includes a list of // TestPartResults, a list of TestProperties, a count of how many // death tests there are in the Test, and how much time it took to run // the Test. // // TestResult is not copyable. class GTEST_API_ TestResult { public: // Creates an empty TestResult. TestResult(); // D'tor. Do not inherit from TestResult. ~TestResult(); // Gets the number of all test parts. This is the sum of the number // of successful test parts and the number of failed test parts. int total_part_count() const; // Returns the number of the test properties. int test_property_count() const; // Returns true iff the test passed (i.e. no test part failed). bool Passed() const { return !Failed(); } // Returns true iff the test failed. bool Failed() const; // Returns true iff the test fatally failed. bool HasFatalFailure() const; // Returns true iff the test has a non-fatal failure. bool HasNonfatalFailure() const; // Returns the elapsed time, in milliseconds. TimeInMillis elapsed_time() const { return elapsed_time_; } // Returns the i-th test part result among all the results. i can range // from 0 to test_property_count() - 1. If i is not in that range, aborts // the program. const TestPartResult& GetTestPartResult(int i) const; // Returns the i-th test property. i can range from 0 to // test_property_count() - 1. If i is not in that range, aborts the // program. const TestProperty& GetTestProperty(int i) const; private: friend class TestInfo; friend class UnitTest; friend class internal::DefaultGlobalTestPartResultReporter; friend class internal::ExecDeathTest; friend class internal::TestInfoImpl; friend class internal::TestResultAccessor; friend class internal::UnitTestImpl; friend class internal::WindowsDeathTest; // Gets the vector of TestPartResults. const std::vector& test_part_results() const { return test_part_results_; } // Gets the vector of TestProperties. const std::vector& test_properties() const { return test_properties_; } // Sets the elapsed time. void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; } // Adds a test property to the list. The property is validated and may add // a non-fatal failure if invalid (e.g., if it conflicts with reserved // key names). If a property is already recorded for the same key, the // value will be updated, rather than storing multiple values for the same // key. void RecordProperty(const TestProperty& test_property); // Adds a failure if the key is a reserved attribute of Google Test // testcase tags. Returns true if the property is valid. // TODO(russr): Validate attribute names are legal and human readable. static bool ValidateTestProperty(const TestProperty& test_property); // Adds a test part result to the list. void AddTestPartResult(const TestPartResult& test_part_result); // Returns the death test count. int death_test_count() const { return death_test_count_; } // Increments the death test count, returning the new count. int increment_death_test_count() { return ++death_test_count_; } // Clears the test part results. void ClearTestPartResults(); // Clears the object. void Clear(); // Protects mutable state of the property vector and of owned // properties, whose values may be updated. internal::Mutex test_properites_mutex_; // The vector of TestPartResults std::vector test_part_results_; // The vector of TestProperties std::vector test_properties_; // Running count of death tests. int death_test_count_; // The elapsed time, in milliseconds. TimeInMillis elapsed_time_; // We disallow copying TestResult. GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult); }; // class TestResult // A TestInfo object stores the following information about a test: // // Test case name // Test name // Whether the test should be run // A function pointer that creates the test object when invoked // Test result // // The constructor of TestInfo registers itself with the UnitTest // singleton such that the RUN_ALL_TESTS() macro knows which tests to // run. class GTEST_API_ TestInfo { public: // Destructs a TestInfo object. This function is not virtual, so // don't inherit from TestInfo. ~TestInfo(); // Returns the test case name. const char* test_case_name() const; // Returns the test name. const char* name() const; // Returns the test case comment. const char* test_case_comment() const; // Returns the test comment. const char* comment() const; // Returns true if this test should run, that is if the test is not disabled // (or it is disabled but the also_run_disabled_tests flag has been specified) // and its full name matches the user-specified filter. // // Google Test allows the user to filter the tests by their full names. // The full name of a test Bar in test case Foo is defined as // "Foo.Bar". Only the tests that match the filter will run. // // A filter is a colon-separated list of glob (not regex) patterns, // optionally followed by a '-' and a colon-separated list of // negative patterns (tests to exclude). A test is run if it // matches one of the positive patterns and does not match any of // the negative patterns. // // For example, *A*:Foo.* is a filter that matches any string that // contains the character 'A' or starts with "Foo.". bool should_run() const; // Returns the result of the test. const TestResult* result() const; private: #if GTEST_HAS_DEATH_TEST friend class internal::DefaultDeathTestFactory; #endif // GTEST_HAS_DEATH_TEST friend class Test; friend class TestCase; friend class internal::TestInfoImpl; friend class internal::UnitTestImpl; friend TestInfo* internal::MakeAndRegisterTestInfo( const char* test_case_name, const char* name, const char* test_case_comment, const char* comment, internal::TypeId fixture_class_id, Test::SetUpTestCaseFunc set_up_tc, Test::TearDownTestCaseFunc tear_down_tc, internal::TestFactoryBase* factory); // Returns true if this test matches the user-specified filter. bool matches_filter() const; // Increments the number of death tests encountered in this test so // far. int increment_death_test_count(); // Accessors for the implementation object. internal::TestInfoImpl* impl() { return impl_; } const internal::TestInfoImpl* impl() const { return impl_; } // Constructs a TestInfo object. The newly constructed instance assumes // ownership of the factory object. TestInfo(const char* test_case_name, const char* name, const char* test_case_comment, const char* comment, internal::TypeId fixture_class_id, internal::TestFactoryBase* factory); // An opaque implementation object. internal::TestInfoImpl* impl_; GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo); }; // A test case, which consists of a vector of TestInfos. // // TestCase is not copyable. class GTEST_API_ TestCase { public: // Creates a TestCase with the given name. // // TestCase does NOT have a default constructor. Always use this // constructor to create a TestCase object. // // Arguments: // // name: name of the test case // set_up_tc: pointer to the function that sets up the test case // tear_down_tc: pointer to the function that tears down the test case TestCase(const char* name, const char* comment, Test::SetUpTestCaseFunc set_up_tc, Test::TearDownTestCaseFunc tear_down_tc); // Destructor of TestCase. virtual ~TestCase(); // Gets the name of the TestCase. const char* name() const { return name_.c_str(); } // Returns the test case comment. const char* comment() const { return comment_.c_str(); } // Returns true if any test in this test case should run. bool should_run() const { return should_run_; } // Gets the number of successful tests in this test case. int successful_test_count() const; // Gets the number of failed tests in this test case. int failed_test_count() const; // Gets the number of disabled tests in this test case. int disabled_test_count() const; // Get the number of tests in this test case that should run. int test_to_run_count() const; // Gets the number of all tests in this test case. int total_test_count() const; // Returns true iff the test case passed. bool Passed() const { return !Failed(); } // Returns true iff the test case failed. bool Failed() const { return failed_test_count() > 0; } // Returns the elapsed time, in milliseconds. TimeInMillis elapsed_time() const { return elapsed_time_; } // Returns the i-th test among all the tests. i can range from 0 to // total_test_count() - 1. If i is not in that range, returns NULL. const TestInfo* GetTestInfo(int i) const; private: friend class Test; friend class internal::UnitTestImpl; // Gets the (mutable) vector of TestInfos in this TestCase. std::vector& test_info_list() { return test_info_list_; } // Gets the (immutable) vector of TestInfos in this TestCase. const std::vector& test_info_list() const { return test_info_list_; } // Returns the i-th test among all the tests. i can range from 0 to // total_test_count() - 1. If i is not in that range, returns NULL. TestInfo* GetMutableTestInfo(int i); // Sets the should_run member. void set_should_run(bool should) { should_run_ = should; } // Adds a TestInfo to this test case. Will delete the TestInfo upon // destruction of the TestCase object. void AddTestInfo(TestInfo * test_info); // Clears the results of all tests in this test case. void ClearResult(); // Clears the results of all tests in the given test case. static void ClearTestCaseResult(TestCase* test_case) { test_case->ClearResult(); } // Runs every test in this TestCase. void Run(); // Returns true iff test passed. static bool TestPassed(const TestInfo * test_info); // Returns true iff test failed. static bool TestFailed(const TestInfo * test_info); // Returns true iff test is disabled. static bool TestDisabled(const TestInfo * test_info); // Returns true if the given test should run. static bool ShouldRunTest(const TestInfo *test_info); // Shuffles the tests in this test case. void ShuffleTests(internal::Random* random); // Restores the test order to before the first shuffle. void UnshuffleTests(); // Name of the test case. internal::String name_; // Comment on the test case. internal::String comment_; // The vector of TestInfos in their original order. It owns the // elements in the vector. std::vector test_info_list_; // Provides a level of indirection for the test list to allow easy // shuffling and restoring the test order. The i-th element in this // vector is the index of the i-th test in the shuffled test list. std::vector test_indices_; // Pointer to the function that sets up the test case. Test::SetUpTestCaseFunc set_up_tc_; // Pointer to the function that tears down the test case. Test::TearDownTestCaseFunc tear_down_tc_; // True iff any test in this test case should run. bool should_run_; // Elapsed time, in milliseconds. TimeInMillis elapsed_time_; // We disallow copying TestCases. GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase); }; // An Environment object is capable of setting up and tearing down an // environment. The user should subclass this to define his own // environment(s). // // An Environment object does the set-up and tear-down in virtual // methods SetUp() and TearDown() instead of the constructor and the // destructor, as: // // 1. You cannot safely throw from a destructor. This is a problem // as in some cases Google Test is used where exceptions are enabled, and // we may want to implement ASSERT_* using exceptions where they are // available. // 2. You cannot use ASSERT_* directly in a constructor or // destructor. class Environment { public: // The d'tor is virtual as we need to subclass Environment. virtual ~Environment() {} // Override this to define how to set up the environment. virtual void SetUp() {} // Override this to define how to tear down the environment. virtual void TearDown() {} private: // If you see an error about overriding the following function or // about it being private, you have mis-spelled SetUp() as Setup(). struct Setup_should_be_spelled_SetUp {}; virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; } }; // The interface for tracing execution of tests. The methods are organized in // the order the corresponding events are fired. class TestEventListener { public: virtual ~TestEventListener() {} // Fired before any test activity starts. virtual void OnTestProgramStart(const UnitTest& unit_test) = 0; // Fired before each iteration of tests starts. There may be more than // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration // index, starting from 0. virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration) = 0; // Fired before environment set-up for each iteration of tests starts. virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0; // Fired after environment set-up for each iteration of tests ends. virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0; // Fired before the test case starts. virtual void OnTestCaseStart(const TestCase& test_case) = 0; // Fired before the test starts. virtual void OnTestStart(const TestInfo& test_info) = 0; // Fired after a failed assertion or a SUCCESS(). virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0; // Fired after the test ends. virtual void OnTestEnd(const TestInfo& test_info) = 0; // Fired after the test case ends. virtual void OnTestCaseEnd(const TestCase& test_case) = 0; // Fired before environment tear-down for each iteration of tests starts. virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0; // Fired after environment tear-down for each iteration of tests ends. virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0; // Fired after each iteration of tests finishes. virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration) = 0; // Fired after all test activities have ended. virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0; }; // The convenience class for users who need to override just one or two // methods and are not concerned that a possible change to a signature of // the methods they override will not be caught during the build. For // comments about each method please see the definition of TestEventListener // above. class EmptyTestEventListener : public TestEventListener { public: virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {} virtual void OnTestIterationStart(const UnitTest& /*unit_test*/, int /*iteration*/) {} virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {} virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {} virtual void OnTestCaseStart(const TestCase& /*test_case*/) {} virtual void OnTestStart(const TestInfo& /*test_info*/) {} virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {} virtual void OnTestEnd(const TestInfo& /*test_info*/) {} virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {} virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {} virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {} virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/, int /*iteration*/) {} virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {} }; // TestEventListeners lets users add listeners to track events in Google Test. class GTEST_API_ TestEventListeners { public: TestEventListeners(); ~TestEventListeners(); // Appends an event listener to the end of the list. Google Test assumes // the ownership of the listener (i.e. it will delete the listener when // the test program finishes). void Append(TestEventListener* listener); // Removes the given event listener from the list and returns it. It then // becomes the caller's responsibility to delete the listener. Returns // NULL if the listener is not found in the list. TestEventListener* Release(TestEventListener* listener); // Returns the standard listener responsible for the default console // output. Can be removed from the listeners list to shut down default // console output. Note that removing this object from the listener list // with Release transfers its ownership to the caller and makes this // function return NULL the next time. TestEventListener* default_result_printer() const { return default_result_printer_; } // Returns the standard listener responsible for the default XML output // controlled by the --gtest_output=xml flag. Can be removed from the // listeners list by users who want to shut down the default XML output // controlled by this flag and substitute it with custom one. Note that // removing this object from the listener list with Release transfers its // ownership to the caller and makes this function return NULL the next // time. TestEventListener* default_xml_generator() const { return default_xml_generator_; } private: friend class TestCase; friend class internal::DefaultGlobalTestPartResultReporter; friend class internal::NoExecDeathTest; friend class internal::TestEventListenersAccessor; friend class internal::TestInfoImpl; friend class internal::UnitTestImpl; // Returns repeater that broadcasts the TestEventListener events to all // subscribers. TestEventListener* repeater(); // Sets the default_result_printer attribute to the provided listener. // The listener is also added to the listener list and previous // default_result_printer is removed from it and deleted. The listener can // also be NULL in which case it will not be added to the list. Does // nothing if the previous and the current listener objects are the same. void SetDefaultResultPrinter(TestEventListener* listener); // Sets the default_xml_generator attribute to the provided listener. The // listener is also added to the listener list and previous // default_xml_generator is removed from it and deleted. The listener can // also be NULL in which case it will not be added to the list. Does // nothing if the previous and the current listener objects are the same. void SetDefaultXmlGenerator(TestEventListener* listener); // Controls whether events will be forwarded by the repeater to the // listeners in the list. bool EventForwardingEnabled() const; void SuppressEventForwarding(); // The actual list of listeners. internal::TestEventRepeater* repeater_; // Listener responsible for the standard result output. TestEventListener* default_result_printer_; // Listener responsible for the creation of the XML output file. TestEventListener* default_xml_generator_; // We disallow copying TestEventListeners. GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners); }; // A UnitTest consists of a vector of TestCases. // // This is a singleton class. The only instance of UnitTest is // created when UnitTest::GetInstance() is first called. This // instance is never deleted. // // UnitTest is not copyable. // // This class is thread-safe as long as the methods are called // according to their specification. class GTEST_API_ UnitTest { public: // Gets the singleton UnitTest object. The first time this method // is called, a UnitTest object is constructed and returned. // Consecutive calls will return the same object. static UnitTest* GetInstance(); // Runs all tests in this UnitTest object and prints the result. // Returns 0 if successful, or 1 otherwise. // // This method can only be called from the main thread. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. int Run() GTEST_MUST_USE_RESULT_; // Returns the working directory when the first TEST() or TEST_F() // was executed. The UnitTest object owns the string. const char* original_working_dir() const; // Returns the TestCase object for the test that's currently running, // or NULL if no test is running. const TestCase* current_test_case() const; // Returns the TestInfo object for the test that's currently running, // or NULL if no test is running. const TestInfo* current_test_info() const; // Returns the random seed used at the start of the current test run. int random_seed() const; #if GTEST_HAS_PARAM_TEST // Returns the ParameterizedTestCaseRegistry object used to keep track of // value-parameterized tests and instantiate and register them. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. internal::ParameterizedTestCaseRegistry& parameterized_test_registry(); #endif // GTEST_HAS_PARAM_TEST // Gets the number of successful test cases. int successful_test_case_count() const; // Gets the number of failed test cases. int failed_test_case_count() const; // Gets the number of all test cases. int total_test_case_count() const; // Gets the number of all test cases that contain at least one test // that should run. int test_case_to_run_count() const; // Gets the number of successful tests. int successful_test_count() const; // Gets the number of failed tests. int failed_test_count() const; // Gets the number of disabled tests. int disabled_test_count() const; // Gets the number of all tests. int total_test_count() const; // Gets the number of tests that should run. int test_to_run_count() const; // Gets the elapsed time, in milliseconds. TimeInMillis elapsed_time() const; // Returns true iff the unit test passed (i.e. all test cases passed). bool Passed() const; // Returns true iff the unit test failed (i.e. some test case failed // or something outside of all tests failed). bool Failed() const; // Gets the i-th test case among all the test cases. i can range from 0 to // total_test_case_count() - 1. If i is not in that range, returns NULL. const TestCase* GetTestCase(int i) const; // Returns the list of event listeners that can be used to track events // inside Google Test. TestEventListeners& listeners(); private: // Registers and returns a global test environment. When a test // program is run, all global test environments will be set-up in // the order they were registered. After all tests in the program // have finished, all global test environments will be torn-down in // the *reverse* order they were registered. // // The UnitTest object takes ownership of the given environment. // // This method can only be called from the main thread. Environment* AddEnvironment(Environment* env); // Adds a TestPartResult to the current TestResult object. All // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) // eventually call this to report their results. The user code // should use the assertion macros instead of calling this directly. void AddTestPartResult(TestPartResult::Type result_type, const char* file_name, int line_number, const internal::String& message, const internal::String& os_stack_trace); // Adds a TestProperty to the current TestResult object. If the result already // contains a property with the same key, the value will be updated. void RecordPropertyForCurrentTest(const char* key, const char* value); // Gets the i-th test case among all the test cases. i can range from 0 to // total_test_case_count() - 1. If i is not in that range, returns NULL. TestCase* GetMutableTestCase(int i); // Accessors for the implementation object. internal::UnitTestImpl* impl() { return impl_; } const internal::UnitTestImpl* impl() const { return impl_; } // These classes and funcions are friends as they need to access private // members of UnitTest. friend class Test; friend class internal::AssertHelper; friend class internal::ScopedTrace; friend Environment* AddGlobalTestEnvironment(Environment* env); friend internal::UnitTestImpl* internal::GetUnitTestImpl(); friend void internal::ReportFailureInUnknownLocation( TestPartResult::Type result_type, const internal::String& message); // Creates an empty UnitTest. UnitTest(); // D'tor virtual ~UnitTest(); // Pushes a trace defined by SCOPED_TRACE() on to the per-thread // Google Test trace stack. void PushGTestTrace(const internal::TraceInfo& trace); // Pops a trace from the per-thread Google Test trace stack. void PopGTestTrace(); // Protects mutable state in *impl_. This is mutable as some const // methods need to lock it too. mutable internal::Mutex mutex_; // Opaque implementation object. This field is never changed once // the object is constructed. We don't mark it as const here, as // doing so will cause a warning in the constructor of UnitTest. // Mutable state in *impl_ is protected by mutex_. internal::UnitTestImpl* impl_; // We disallow copying UnitTest. GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest); }; // A convenient wrapper for adding an environment for the test // program. // // You should call this before RUN_ALL_TESTS() is called, probably in // main(). If you use gtest_main, you need to call this before main() // starts for it to take effect. For example, you can define a global // variable like this: // // testing::Environment* const foo_env = // testing::AddGlobalTestEnvironment(new FooEnvironment); // // However, we strongly recommend you to write your own main() and // call AddGlobalTestEnvironment() there, as relying on initialization // of global variables makes the code harder to read and may cause // problems when you register multiple environments from different // translation units and the environments have dependencies among them // (remember that the compiler doesn't guarantee the order in which // global variables from different translation units are initialized). inline Environment* AddGlobalTestEnvironment(Environment* env) { return UnitTest::GetInstance()->AddEnvironment(env); } // Initializes Google Test. This must be called before calling // RUN_ALL_TESTS(). In particular, it parses a command line for the // flags that Google Test recognizes. Whenever a Google Test flag is // seen, it is removed from argv, and *argc is decremented. // // No value is returned. Instead, the Google Test flag variables are // updated. // // Calling the function for the second time has no user-visible effect. GTEST_API_ void InitGoogleTest(int* argc, char** argv); // This overloaded version can be used in Windows programs compiled in // UNICODE mode. GTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv); namespace internal { // These overloaded versions handle ::std::string and ::std::wstring. GTEST_API_ inline String FormatForFailureMessage(const ::std::string& str) { return (Message() << '"' << str << '"').GetString(); } #if GTEST_HAS_STD_WSTRING GTEST_API_ inline String FormatForFailureMessage(const ::std::wstring& wstr) { return (Message() << "L\"" << wstr << '"').GetString(); } #endif // GTEST_HAS_STD_WSTRING // These overloaded versions handle ::string and ::wstring. #if GTEST_HAS_GLOBAL_STRING GTEST_API_ inline String FormatForFailureMessage(const ::string& str) { return (Message() << '"' << str << '"').GetString(); } #endif // GTEST_HAS_GLOBAL_STRING #if GTEST_HAS_GLOBAL_WSTRING GTEST_API_ inline String FormatForFailureMessage(const ::wstring& wstr) { return (Message() << "L\"" << wstr << '"').GetString(); } #endif // GTEST_HAS_GLOBAL_WSTRING // Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc) // operand to be used in a failure message. The type (but not value) // of the other operand may affect the format. This allows us to // print a char* as a raw pointer when it is compared against another // char*, and print it as a C string when it is compared against an // std::string object, for example. // // The default implementation ignores the type of the other operand. // Some specialized versions are used to handle formatting wide or // narrow C strings. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. template String FormatForComparisonFailureMessage(const T1& value, const T2& /* other_operand */) { return FormatForFailureMessage(value); } // The helper function for {ASSERT|EXPECT}_EQ. template AssertionResult CmpHelperEQ(const char* expected_expression, const char* actual_expression, const T1& expected, const T2& actual) { #ifdef _MSC_VER #pragma warning(push) // Saves the current warning state. #pragma warning(disable:4389) // Temporarily disables warning on // signed/unsigned mismatch. #endif if (expected == actual) { return AssertionSuccess(); } #ifdef _MSC_VER #pragma warning(pop) // Restores the warning state. #endif return EqFailure(expected_expression, actual_expression, FormatForComparisonFailureMessage(expected, actual), FormatForComparisonFailureMessage(actual, expected), false); } // With this overloaded version, we allow anonymous enums to be used // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums // can be implicitly cast to BiggestInt. GTEST_API_ AssertionResult CmpHelperEQ(const char* expected_expression, const char* actual_expression, BiggestInt expected, BiggestInt actual); // The helper class for {ASSERT|EXPECT}_EQ. The template argument // lhs_is_null_literal is true iff the first argument to ASSERT_EQ() // is a null pointer literal. The following default implementation is // for lhs_is_null_literal being false. template class EqHelper { public: // This templatized version is for the general case. template static AssertionResult Compare(const char* expected_expression, const char* actual_expression, const T1& expected, const T2& actual) { return CmpHelperEQ(expected_expression, actual_expression, expected, actual); } // With this overloaded version, we allow anonymous enums to be used // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous // enums can be implicitly cast to BiggestInt. // // Even though its body looks the same as the above version, we // cannot merge the two, as it will make anonymous enums unhappy. static AssertionResult Compare(const char* expected_expression, const char* actual_expression, BiggestInt expected, BiggestInt actual) { return CmpHelperEQ(expected_expression, actual_expression, expected, actual); } }; // This specialization is used when the first argument to ASSERT_EQ() // is a null pointer literal. template <> class EqHelper { public: // We define two overloaded versions of Compare(). The first // version will be picked when the second argument to ASSERT_EQ() is // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or // EXPECT_EQ(false, a_bool). template static AssertionResult Compare(const char* expected_expression, const char* actual_expression, const T1& expected, const T2& actual) { return CmpHelperEQ(expected_expression, actual_expression, expected, actual); } // This version will be picked when the second argument to // ASSERT_EQ() is a pointer, e.g. ASSERT_EQ(NULL, a_pointer). template static AssertionResult Compare(const char* expected_expression, const char* actual_expression, const T1& /* expected */, T2* actual) { // We already know that 'expected' is a null pointer. return CmpHelperEQ(expected_expression, actual_expression, static_cast(NULL), actual); } }; // A macro for implementing the helper functions needed to implement // ASSERT_?? and EXPECT_??. It is here just to avoid copy-and-paste // of similar code. // // For each templatized helper function, we also define an overloaded // version for BiggestInt in order to reduce code bloat and allow // anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled // with gcc 4. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. #define GTEST_IMPL_CMP_HELPER_(op_name, op)\ template \ AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \ const T1& val1, const T2& val2) {\ if (val1 op val2) {\ return AssertionSuccess();\ } else {\ Message msg;\ msg << "Expected: (" << expr1 << ") " #op " (" << expr2\ << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\ << " vs " << FormatForComparisonFailureMessage(val2, val1);\ return AssertionFailure(msg);\ }\ }\ GTEST_API_ AssertionResult CmpHelper##op_name(\ const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2) // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. // Implements the helper function for {ASSERT|EXPECT}_NE GTEST_IMPL_CMP_HELPER_(NE, !=); // Implements the helper function for {ASSERT|EXPECT}_LE GTEST_IMPL_CMP_HELPER_(LE, <=); // Implements the helper function for {ASSERT|EXPECT}_LT GTEST_IMPL_CMP_HELPER_(LT, < ); // Implements the helper function for {ASSERT|EXPECT}_GE GTEST_IMPL_CMP_HELPER_(GE, >=); // Implements the helper function for {ASSERT|EXPECT}_GT GTEST_IMPL_CMP_HELPER_(GT, > ); #undef GTEST_IMPL_CMP_HELPER_ // The helper function for {ASSERT|EXPECT}_STREQ. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression, const char* actual_expression, const char* expected, const char* actual); // The helper function for {ASSERT|EXPECT}_STRCASEEQ. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression, const char* actual_expression, const char* expected, const char* actual); // The helper function for {ASSERT|EXPECT}_STRNE. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression, const char* s2_expression, const char* s1, const char* s2); // The helper function for {ASSERT|EXPECT}_STRCASENE. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression, const char* s2_expression, const char* s1, const char* s2); // Helper function for *_STREQ on wide strings. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression, const char* actual_expression, const wchar_t* expected, const wchar_t* actual); // Helper function for *_STRNE on wide strings. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression, const char* s2_expression, const wchar_t* s1, const wchar_t* s2); } // namespace internal // IsSubstring() and IsNotSubstring() are intended to be used as the // first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by // themselves. They check whether needle is a substring of haystack // (NULL is considered a substring of itself only), and return an // appropriate error message when they fail. // // The {needle,haystack}_expr arguments are the stringified // expressions that generated the two real arguments. GTEST_API_ AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const char* needle, const char* haystack); GTEST_API_ AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const wchar_t* needle, const wchar_t* haystack); GTEST_API_ AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const char* needle, const char* haystack); GTEST_API_ AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const wchar_t* needle, const wchar_t* haystack); GTEST_API_ AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const ::std::string& needle, const ::std::string& haystack); GTEST_API_ AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const ::std::string& needle, const ::std::string& haystack); #if GTEST_HAS_STD_WSTRING GTEST_API_ AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const ::std::wstring& needle, const ::std::wstring& haystack); GTEST_API_ AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const ::std::wstring& needle, const ::std::wstring& haystack); #endif // GTEST_HAS_STD_WSTRING namespace internal { // Helper template function for comparing floating-points. // // Template parameter: // // RawType: the raw floating-point type (either float or double) // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. template AssertionResult CmpHelperFloatingPointEQ(const char* expected_expression, const char* actual_expression, RawType expected, RawType actual) { const FloatingPoint lhs(expected), rhs(actual); if (lhs.AlmostEquals(rhs)) { return AssertionSuccess(); } StrStream expected_ss; expected_ss << std::setprecision(std::numeric_limits::digits10 + 2) << expected; StrStream actual_ss; actual_ss << std::setprecision(std::numeric_limits::digits10 + 2) << actual; return EqFailure(expected_expression, actual_expression, StrStreamToString(&expected_ss), StrStreamToString(&actual_ss), false); } // Helper function for implementing ASSERT_NEAR. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1, const char* expr2, const char* abs_error_expr, double val1, double val2, double abs_error); // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // A class that enables one to stream messages to assertion macros class GTEST_API_ AssertHelper { public: // Constructor. AssertHelper(TestPartResult::Type type, const char* file, int line, const char* message); ~AssertHelper(); // Message assignment is a semantic trick to enable assertion // streaming; see the GTEST_MESSAGE_ macro below. void operator=(const Message& message) const; private: // We put our data in a struct so that the size of the AssertHelper class can // be as small as possible. This is important because gcc is incapable of // re-using stack space even for temporary variables, so every EXPECT_EQ // reserves stack space for another AssertHelper. struct AssertHelperData { AssertHelperData(TestPartResult::Type t, const char* srcfile, int line_num, const char* msg) : type(t), file(srcfile), line(line_num), message(msg) { } TestPartResult::Type const type; const char* const file; int const line; String const message; private: GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData); }; AssertHelperData* const data_; GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper); }; } // namespace internal #if GTEST_HAS_PARAM_TEST // The abstract base class that all value-parameterized tests inherit from. // // This class adds support for accessing the test parameter value via // the GetParam() method. // // Use it with one of the parameter generator defining functions, like Range(), // Values(), ValuesIn(), Bool(), and Combine(). // // class FooTest : public ::testing::TestWithParam { // protected: // FooTest() { // // Can use GetParam() here. // } // virtual ~FooTest() { // // Can use GetParam() here. // } // virtual void SetUp() { // // Can use GetParam() here. // } // virtual void TearDown { // // Can use GetParam() here. // } // }; // TEST_P(FooTest, DoesBar) { // // Can use GetParam() method here. // Foo foo; // ASSERT_TRUE(foo.DoesBar(GetParam())); // } // INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10)); template class TestWithParam : public Test { public: typedef T ParamType; // The current parameter value. Is also available in the test fixture's // constructor. const ParamType& GetParam() const { return *parameter_; } private: // Sets parameter value. The caller is responsible for making sure the value // remains alive and unchanged throughout the current test. static void SetParam(const ParamType* parameter) { parameter_ = parameter; } // Static value used for accessing parameter during a test lifetime. static const ParamType* parameter_; // TestClass must be a subclass of TestWithParam. template friend class internal::ParameterizedTestFactory; }; template const T* TestWithParam::parameter_ = NULL; #endif // GTEST_HAS_PARAM_TEST // Macros for indicating success/failure in test code. // ADD_FAILURE unconditionally adds a failure to the current test. // SUCCEED generates a success - it doesn't automatically make the // current test successful, as a test is only successful when it has // no failure. // // EXPECT_* verifies that a certain condition is satisfied. If not, // it behaves like ADD_FAILURE. In particular: // // EXPECT_TRUE verifies that a Boolean condition is true. // EXPECT_FALSE verifies that a Boolean condition is false. // // FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except // that they will also abort the current function on failure. People // usually want the fail-fast behavior of FAIL and ASSERT_*, but those // writing data-driven tests often find themselves using ADD_FAILURE // and EXPECT_* more. // // Examples: // // EXPECT_TRUE(server.StatusIsOK()); // ASSERT_FALSE(server.HasPendingRequest(port)) // << "There are still pending requests " << "on port " << port; // Generates a nonfatal failure with a generic message. #define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed") // Generates a fatal failure with a generic message. #define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed") // Define this macro to 1 to omit the definition of FAIL(), which is a // generic name and clashes with some other libraries. #if !GTEST_DONT_DEFINE_FAIL #define FAIL() GTEST_FAIL() #endif // Generates a success with a generic message. #define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded") // Define this macro to 1 to omit the definition of SUCCEED(), which // is a generic name and clashes with some other libraries. #if !GTEST_DONT_DEFINE_SUCCEED #define SUCCEED() GTEST_SUCCEED() #endif // Macros for testing exceptions. // // * {ASSERT|EXPECT}_THROW(statement, expected_exception): // Tests that the statement throws the expected exception. // * {ASSERT|EXPECT}_NO_THROW(statement): // Tests that the statement doesn't throw any exception. // * {ASSERT|EXPECT}_ANY_THROW(statement): // Tests that the statement throws an exception. #define EXPECT_THROW(statement, expected_exception) \ GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_) #define EXPECT_NO_THROW(statement) \ GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_) #define EXPECT_ANY_THROW(statement) \ GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_) #define ASSERT_THROW(statement, expected_exception) \ GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_) #define ASSERT_NO_THROW(statement) \ GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_) #define ASSERT_ANY_THROW(statement) \ GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_) // Boolean assertions. Condition can be either a Boolean expression or an // AssertionResult. For more information on how to use AssertionResult with // these macros see comments on that class. #define EXPECT_TRUE(condition) \ GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \ GTEST_NONFATAL_FAILURE_) #define EXPECT_FALSE(condition) \ GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \ GTEST_NONFATAL_FAILURE_) #define ASSERT_TRUE(condition) \ GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \ GTEST_FATAL_FAILURE_) #define ASSERT_FALSE(condition) \ GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \ GTEST_FATAL_FAILURE_) // Includes the auto-generated header that implements a family of // generic predicate assertion macros. #include // Macros for testing equalities and inequalities. // // * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual // * {ASSERT|EXPECT}_NE(v1, v2): Tests that v1 != v2 // * {ASSERT|EXPECT}_LT(v1, v2): Tests that v1 < v2 // * {ASSERT|EXPECT}_LE(v1, v2): Tests that v1 <= v2 // * {ASSERT|EXPECT}_GT(v1, v2): Tests that v1 > v2 // * {ASSERT|EXPECT}_GE(v1, v2): Tests that v1 >= v2 // // When they are not, Google Test prints both the tested expressions and // their actual values. The values must be compatible built-in types, // or you will get a compiler error. By "compatible" we mean that the // values can be compared by the respective operator. // // Note: // // 1. It is possible to make a user-defined type work with // {ASSERT|EXPECT}_??(), but that requires overloading the // comparison operators and is thus discouraged by the Google C++ // Usage Guide. Therefore, you are advised to use the // {ASSERT|EXPECT}_TRUE() macro to assert that two objects are // equal. // // 2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on // pointers (in particular, C strings). Therefore, if you use it // with two C strings, you are testing how their locations in memory // are related, not how their content is related. To compare two C // strings by content, use {ASSERT|EXPECT}_STR*(). // // 3. {ASSERT|EXPECT}_EQ(expected, actual) is preferred to // {ASSERT|EXPECT}_TRUE(expected == actual), as the former tells you // what the actual value is when it fails, and similarly for the // other comparisons. // // 4. Do not depend on the order in which {ASSERT|EXPECT}_??() // evaluate their arguments, which is undefined. // // 5. These macros evaluate their arguments exactly once. // // Examples: // // EXPECT_NE(5, Foo()); // EXPECT_EQ(NULL, a_pointer); // ASSERT_LT(i, array_size); // ASSERT_GT(records.size(), 0) << "There is no record left."; #define EXPECT_EQ(expected, actual) \ EXPECT_PRED_FORMAT2(::testing::internal:: \ EqHelper::Compare, \ expected, actual) #define EXPECT_NE(expected, actual) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, expected, actual) #define EXPECT_LE(val1, val2) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2) #define EXPECT_LT(val1, val2) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2) #define EXPECT_GE(val1, val2) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2) #define EXPECT_GT(val1, val2) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2) #define ASSERT_EQ(expected, actual) \ ASSERT_PRED_FORMAT2(::testing::internal:: \ EqHelper::Compare, \ expected, actual) #define ASSERT_NE(val1, val2) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2) #define ASSERT_LE(val1, val2) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2) #define ASSERT_LT(val1, val2) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2) #define ASSERT_GE(val1, val2) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2) #define ASSERT_GT(val1, val2) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2) // C String Comparisons. All tests treat NULL and any non-NULL string // as different. Two NULLs are equal. // // * {ASSERT|EXPECT}_STREQ(s1, s2): Tests that s1 == s2 // * {ASSERT|EXPECT}_STRNE(s1, s2): Tests that s1 != s2 // * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case // * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case // // For wide or narrow string objects, you can use the // {ASSERT|EXPECT}_??() macros. // // Don't depend on the order in which the arguments are evaluated, // which is undefined. // // These macros evaluate their arguments exactly once. #define EXPECT_STREQ(expected, actual) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual) #define EXPECT_STRNE(s1, s2) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2) #define EXPECT_STRCASEEQ(expected, actual) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual) #define EXPECT_STRCASENE(s1, s2)\ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2) #define ASSERT_STREQ(expected, actual) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual) #define ASSERT_STRNE(s1, s2) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2) #define ASSERT_STRCASEEQ(expected, actual) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual) #define ASSERT_STRCASENE(s1, s2)\ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2) // Macros for comparing floating-point numbers. // // * {ASSERT|EXPECT}_FLOAT_EQ(expected, actual): // Tests that two float values are almost equal. // * {ASSERT|EXPECT}_DOUBLE_EQ(expected, actual): // Tests that two double values are almost equal. // * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error): // Tests that v1 and v2 are within the given distance to each other. // // Google Test uses ULP-based comparison to automatically pick a default // error bound that is appropriate for the operands. See the // FloatingPoint template class in gtest-internal.h if you are // interested in the implementation details. #define EXPECT_FLOAT_EQ(expected, actual)\ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ, \ expected, actual) #define EXPECT_DOUBLE_EQ(expected, actual)\ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ, \ expected, actual) #define ASSERT_FLOAT_EQ(expected, actual)\ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ, \ expected, actual) #define ASSERT_DOUBLE_EQ(expected, actual)\ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ, \ expected, actual) #define EXPECT_NEAR(val1, val2, abs_error)\ EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \ val1, val2, abs_error) #define ASSERT_NEAR(val1, val2, abs_error)\ ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \ val1, val2, abs_error) // These predicate format functions work on floating-point values, and // can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g. // // EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0); // Asserts that val1 is less than, or almost equal to, val2. Fails // otherwise. In particular, it fails if either val1 or val2 is NaN. GTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2, float val1, float val2); GTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2, double val1, double val2); #if GTEST_OS_WINDOWS // Macros that test for HRESULT failure and success, these are only useful // on Windows, and rely on Windows SDK macros and APIs to compile. // // * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr) // // When expr unexpectedly fails or succeeds, Google Test prints the // expected result and the actual result with both a human-readable // string representation of the error, if available, as well as the // hex result code. #define EXPECT_HRESULT_SUCCEEDED(expr) \ EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr)) #define ASSERT_HRESULT_SUCCEEDED(expr) \ ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr)) #define EXPECT_HRESULT_FAILED(expr) \ EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr)) #define ASSERT_HRESULT_FAILED(expr) \ ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr)) #endif // GTEST_OS_WINDOWS // Macros that execute statement and check that it doesn't generate new fatal // failures in the current thread. // // * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement); // // Examples: // // EXPECT_NO_FATAL_FAILURE(Process()); // ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed"; // #define ASSERT_NO_FATAL_FAILURE(statement) \ GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_) #define EXPECT_NO_FATAL_FAILURE(statement) \ GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_) // Causes a trace (including the source file path, the current line // number, and the given message) to be included in every test failure // message generated by code in the current scope. The effect is // undone when the control leaves the current scope. // // The message argument can be anything streamable to std::ostream. // // In the implementation, we include the current line number as part // of the dummy variable name, thus allowing multiple SCOPED_TRACE()s // to appear in the same block - as long as they are on different // lines. #define SCOPED_TRACE(message) \ ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\ __FILE__, __LINE__, ::testing::Message() << (message)) namespace internal { // This template is declared, but intentionally undefined. template struct StaticAssertTypeEqHelper; template struct StaticAssertTypeEqHelper {}; } // namespace internal // Compile-time assertion for type equality. // StaticAssertTypeEq() compiles iff type1 and type2 are // the same type. The value it returns is not interesting. // // Instead of making StaticAssertTypeEq a class template, we make it a // function template that invokes a helper class template. This // prevents a user from misusing StaticAssertTypeEq by // defining objects of that type. // // CAVEAT: // // When used inside a method of a class template, // StaticAssertTypeEq() is effective ONLY IF the method is // instantiated. For example, given: // // template class Foo { // public: // void Bar() { testing::StaticAssertTypeEq(); } // }; // // the code: // // void Test1() { Foo foo; } // // will NOT generate a compiler error, as Foo::Bar() is never // actually instantiated. Instead, you need: // // void Test2() { Foo foo; foo.Bar(); } // // to cause a compiler error. template bool StaticAssertTypeEq() { internal::StaticAssertTypeEqHelper(); return true; } // Defines a test. // // The first parameter is the name of the test case, and the second // parameter is the name of the test within the test case. // // The convention is to end the test case name with "Test". For // example, a test case for the Foo class can be named FooTest. // // The user should put his test code between braces after using this // macro. Example: // // TEST(FooTest, InitializesCorrectly) { // Foo foo; // EXPECT_TRUE(foo.StatusIsOK()); // } // Note that we call GetTestTypeId() instead of GetTypeId< // ::testing::Test>() here to get the type ID of testing::Test. This // is to work around a suspected linker bug when using Google Test as // a framework on Mac OS X. The bug causes GetTypeId< // ::testing::Test>() to return different values depending on whether // the call is from the Google Test framework itself or from user test // code. GetTestTypeId() is guaranteed to always return the same // value, as it always calls GetTypeId<>() from the Google Test // framework. #define GTEST_TEST(test_case_name, test_name)\ GTEST_TEST_(test_case_name, test_name, \ ::testing::Test, ::testing::internal::GetTestTypeId()) // Define this macro to 1 to omit the definition of TEST(), which // is a generic name and clashes with some other libraries. #if !GTEST_DONT_DEFINE_TEST #define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name) #endif // Defines a test that uses a test fixture. // // The first parameter is the name of the test fixture class, which // also doubles as the test case name. The second parameter is the // name of the test within the test case. // // A test fixture class must be declared earlier. The user should put // his test code between braces after using this macro. Example: // // class FooTest : public testing::Test { // protected: // virtual void SetUp() { b_.AddElement(3); } // // Foo a_; // Foo b_; // }; // // TEST_F(FooTest, InitializesCorrectly) { // EXPECT_TRUE(a_.StatusIsOK()); // } // // TEST_F(FooTest, ReturnsElementCountCorrectly) { // EXPECT_EQ(0, a_.size()); // EXPECT_EQ(1, b_.size()); // } #define TEST_F(test_fixture, test_name)\ GTEST_TEST_(test_fixture, test_name, test_fixture, \ ::testing::internal::GetTypeId()) // Use this macro in main() to run all tests. It returns 0 if all // tests are successful, or 1 otherwise. // // RUN_ALL_TESTS() should be invoked after the command line has been // parsed by InitGoogleTest(). #define RUN_ALL_TESTS()\ (::testing::UnitTest::GetInstance()->Run()) } // namespace testing #endif // GTEST_INCLUDE_GTEST_GTEST_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/include/gtest/gtest_pred_impl.h000066400000000000000000000344141260417502300314760ustar00rootroot00000000000000// Copyright 2006, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // This file is AUTOMATICALLY GENERATED on 10/02/2008 by command // 'gen_gtest_pred_impl.py 5'. DO NOT EDIT BY HAND! // // Implements a family of generic predicate assertion macros. #ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ #define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ // Makes sure this header is not included before gtest.h. #ifndef GTEST_INCLUDE_GTEST_GTEST_H_ #error Do not include gtest_pred_impl.h directly. Include gtest.h instead. #endif // GTEST_INCLUDE_GTEST_GTEST_H_ // This header implements a family of generic predicate assertion // macros: // // ASSERT_PRED_FORMAT1(pred_format, v1) // ASSERT_PRED_FORMAT2(pred_format, v1, v2) // ... // // where pred_format is a function or functor that takes n (in the // case of ASSERT_PRED_FORMATn) values and their source expression // text, and returns a testing::AssertionResult. See the definition // of ASSERT_EQ in gtest.h for an example. // // If you don't care about formatting, you can use the more // restrictive version: // // ASSERT_PRED1(pred, v1) // ASSERT_PRED2(pred, v1, v2) // ... // // where pred is an n-ary function or functor that returns bool, // and the values v1, v2, ..., must support the << operator for // streaming to std::ostream. // // We also define the EXPECT_* variations. // // For now we only support predicates whose arity is at most 5. // Please email googletestframework@googlegroups.com if you need // support for higher arities. // GTEST_ASSERT_ is the basic statement to which all of the assertions // in this file reduce. Don't use this in your code. #define GTEST_ASSERT_(expression, on_failure) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (const ::testing::AssertionResult gtest_ar = (expression)) \ ; \ else \ on_failure(gtest_ar.failure_message()) // Helper function for implementing {EXPECT|ASSERT}_PRED1. Don't use // this in your code. template AssertionResult AssertPred1Helper(const char* pred_text, const char* e1, Pred pred, const T1& v1) { if (pred(v1)) return AssertionSuccess(); Message msg; msg << pred_text << "(" << e1 << ") evaluates to false, where" << "\n" << e1 << " evaluates to " << v1; return AssertionFailure(msg); } // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1. // Don't use this in your code. #define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\ GTEST_ASSERT_(pred_format(#v1, v1),\ on_failure) // Internal macro for implementing {EXPECT|ASSERT}_PRED1. Don't use // this in your code. #define GTEST_PRED1_(pred, v1, on_failure)\ GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \ #v1, \ pred, \ v1), on_failure) // Unary predicate assertion macros. #define EXPECT_PRED_FORMAT1(pred_format, v1) \ GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_) #define EXPECT_PRED1(pred, v1) \ GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_) #define ASSERT_PRED_FORMAT1(pred_format, v1) \ GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_) #define ASSERT_PRED1(pred, v1) \ GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_) // Helper function for implementing {EXPECT|ASSERT}_PRED2. Don't use // this in your code. template AssertionResult AssertPred2Helper(const char* pred_text, const char* e1, const char* e2, Pred pred, const T1& v1, const T2& v2) { if (pred(v1, v2)) return AssertionSuccess(); Message msg; msg << pred_text << "(" << e1 << ", " << e2 << ") evaluates to false, where" << "\n" << e1 << " evaluates to " << v1 << "\n" << e2 << " evaluates to " << v2; return AssertionFailure(msg); } // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2. // Don't use this in your code. #define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\ GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2),\ on_failure) // Internal macro for implementing {EXPECT|ASSERT}_PRED2. Don't use // this in your code. #define GTEST_PRED2_(pred, v1, v2, on_failure)\ GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \ #v1, \ #v2, \ pred, \ v1, \ v2), on_failure) // Binary predicate assertion macros. #define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \ GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_) #define EXPECT_PRED2(pred, v1, v2) \ GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_) #define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \ GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_) #define ASSERT_PRED2(pred, v1, v2) \ GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_) // Helper function for implementing {EXPECT|ASSERT}_PRED3. Don't use // this in your code. template AssertionResult AssertPred3Helper(const char* pred_text, const char* e1, const char* e2, const char* e3, Pred pred, const T1& v1, const T2& v2, const T3& v3) { if (pred(v1, v2, v3)) return AssertionSuccess(); Message msg; msg << pred_text << "(" << e1 << ", " << e2 << ", " << e3 << ") evaluates to false, where" << "\n" << e1 << " evaluates to " << v1 << "\n" << e2 << " evaluates to " << v2 << "\n" << e3 << " evaluates to " << v3; return AssertionFailure(msg); } // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3. // Don't use this in your code. #define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\ GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3),\ on_failure) // Internal macro for implementing {EXPECT|ASSERT}_PRED3. Don't use // this in your code. #define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\ GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \ #v1, \ #v2, \ #v3, \ pred, \ v1, \ v2, \ v3), on_failure) // Ternary predicate assertion macros. #define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \ GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_) #define EXPECT_PRED3(pred, v1, v2, v3) \ GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_) #define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \ GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_) #define ASSERT_PRED3(pred, v1, v2, v3) \ GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_) // Helper function for implementing {EXPECT|ASSERT}_PRED4. Don't use // this in your code. template AssertionResult AssertPred4Helper(const char* pred_text, const char* e1, const char* e2, const char* e3, const char* e4, Pred pred, const T1& v1, const T2& v2, const T3& v3, const T4& v4) { if (pred(v1, v2, v3, v4)) return AssertionSuccess(); Message msg; msg << pred_text << "(" << e1 << ", " << e2 << ", " << e3 << ", " << e4 << ") evaluates to false, where" << "\n" << e1 << " evaluates to " << v1 << "\n" << e2 << " evaluates to " << v2 << "\n" << e3 << " evaluates to " << v3 << "\n" << e4 << " evaluates to " << v4; return AssertionFailure(msg); } // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4. // Don't use this in your code. #define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\ GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4),\ on_failure) // Internal macro for implementing {EXPECT|ASSERT}_PRED4. Don't use // this in your code. #define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\ GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \ #v1, \ #v2, \ #v3, \ #v4, \ pred, \ v1, \ v2, \ v3, \ v4), on_failure) // 4-ary predicate assertion macros. #define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \ GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_) #define EXPECT_PRED4(pred, v1, v2, v3, v4) \ GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_) #define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \ GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_) #define ASSERT_PRED4(pred, v1, v2, v3, v4) \ GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_) // Helper function for implementing {EXPECT|ASSERT}_PRED5. Don't use // this in your code. template AssertionResult AssertPred5Helper(const char* pred_text, const char* e1, const char* e2, const char* e3, const char* e4, const char* e5, Pred pred, const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5) { if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess(); Message msg; msg << pred_text << "(" << e1 << ", " << e2 << ", " << e3 << ", " << e4 << ", " << e5 << ") evaluates to false, where" << "\n" << e1 << " evaluates to " << v1 << "\n" << e2 << " evaluates to " << v2 << "\n" << e3 << " evaluates to " << v3 << "\n" << e4 << " evaluates to " << v4 << "\n" << e5 << " evaluates to " << v5; return AssertionFailure(msg); } // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5. // Don't use this in your code. #define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\ GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5),\ on_failure) // Internal macro for implementing {EXPECT|ASSERT}_PRED5. Don't use // this in your code. #define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\ GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \ #v1, \ #v2, \ #v3, \ #v4, \ #v5, \ pred, \ v1, \ v2, \ v3, \ v4, \ v5), on_failure) // 5-ary predicate assertion macros. #define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \ GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_) #define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \ GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_) #define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \ GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_) #define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \ GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_) #endif // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/include/gtest/gtest_prod.h000066400000000000000000000044241260417502300304650ustar00rootroot00000000000000// Copyright 2006, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // // Google C++ Testing Framework definitions useful in production code. #ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_ #define GTEST_INCLUDE_GTEST_GTEST_PROD_H_ // When you need to test the private or protected members of a class, // use the FRIEND_TEST macro to declare your tests as friends of the // class. For example: // // class MyClass { // private: // void MyMethod(); // FRIEND_TEST(MyClassTest, MyMethod); // }; // // class MyClassTest : public testing::Test { // // ... // }; // // TEST_F(MyClassTest, MyMethod) { // // Can call MyClass::MyMethod() here. // } #define FRIEND_TEST(test_case_name, test_name)\ friend class test_case_name##_##test_name##_Test #endif // GTEST_INCLUDE_GTEST_GTEST_PROD_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/include/gtest/internal/000077500000000000000000000000001260417502300277525ustar00rootroot00000000000000gtest-death-test-internal.h000066400000000000000000000270361260417502300350540ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/include/gtest/internal// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee) // // The Google C++ Testing Framework (Google Test) // // This header file defines internal utilities needed for implementing // death tests. They are subject to change without notice. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ #include namespace testing { namespace internal { GTEST_DECLARE_string_(internal_run_death_test); // Names of the flags (needed for parsing Google Test flags). const char kDeathTestStyleFlag[] = "death_test_style"; const char kDeathTestUseFork[] = "death_test_use_fork"; const char kInternalRunDeathTestFlag[] = "internal_run_death_test"; #if GTEST_HAS_DEATH_TEST // DeathTest is a class that hides much of the complexity of the // GTEST_DEATH_TEST_ macro. It is abstract; its static Create method // returns a concrete class that depends on the prevailing death test // style, as defined by the --gtest_death_test_style and/or // --gtest_internal_run_death_test flags. // In describing the results of death tests, these terms are used with // the corresponding definitions: // // exit status: The integer exit information in the format specified // by wait(2) // exit code: The integer code passed to exit(3), _exit(2), or // returned from main() class GTEST_API_ DeathTest { public: // Create returns false if there was an error determining the // appropriate action to take for the current death test; for example, // if the gtest_death_test_style flag is set to an invalid value. // The LastMessage method will return a more detailed message in that // case. Otherwise, the DeathTest pointer pointed to by the "test" // argument is set. If the death test should be skipped, the pointer // is set to NULL; otherwise, it is set to the address of a new concrete // DeathTest object that controls the execution of the current test. static bool Create(const char* statement, const RE* regex, const char* file, int line, DeathTest** test); DeathTest(); virtual ~DeathTest() { } // A helper class that aborts a death test when it's deleted. class ReturnSentinel { public: explicit ReturnSentinel(DeathTest* test) : test_(test) { } ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); } private: DeathTest* const test_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel); } GTEST_ATTRIBUTE_UNUSED_; // An enumeration of possible roles that may be taken when a death // test is encountered. EXECUTE means that the death test logic should // be executed immediately. OVERSEE means that the program should prepare // the appropriate environment for a child process to execute the death // test, then wait for it to complete. enum TestRole { OVERSEE_TEST, EXECUTE_TEST }; // An enumeration of the two reasons that a test might be aborted. enum AbortReason { TEST_ENCOUNTERED_RETURN_STATEMENT, TEST_DID_NOT_DIE }; // Assumes one of the above roles. virtual TestRole AssumeRole() = 0; // Waits for the death test to finish and returns its status. virtual int Wait() = 0; // Returns true if the death test passed; that is, the test process // exited during the test, its exit status matches a user-supplied // predicate, and its stderr output matches a user-supplied regular // expression. // The user-supplied predicate may be a macro expression rather // than a function pointer or functor, or else Wait and Passed could // be combined. virtual bool Passed(bool exit_status_ok) = 0; // Signals that the death test did not die as expected. virtual void Abort(AbortReason reason) = 0; // Returns a human-readable outcome message regarding the outcome of // the last death test. static const char* LastMessage(); static void set_last_death_test_message(const String& message); private: // A string containing a description of the outcome of the last death test. static String last_death_test_message_; GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest); }; // Factory interface for death tests. May be mocked out for testing. class DeathTestFactory { public: virtual ~DeathTestFactory() { } virtual bool Create(const char* statement, const RE* regex, const char* file, int line, DeathTest** test) = 0; }; // A concrete DeathTestFactory implementation for normal use. class DefaultDeathTestFactory : public DeathTestFactory { public: virtual bool Create(const char* statement, const RE* regex, const char* file, int line, DeathTest** test); }; // Returns true if exit_status describes a process that was terminated // by a signal, or exited normally with a nonzero exit code. GTEST_API_ bool ExitedUnsuccessfully(int exit_status); // This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*, // ASSERT_EXIT*, and EXPECT_EXIT*. #define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::AlwaysTrue()) { \ const ::testing::internal::RE& gtest_regex = (regex); \ ::testing::internal::DeathTest* gtest_dt; \ if (!::testing::internal::DeathTest::Create(#statement, >est_regex, \ __FILE__, __LINE__, >est_dt)) { \ goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ } \ if (gtest_dt != NULL) { \ ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \ gtest_dt_ptr(gtest_dt); \ switch (gtest_dt->AssumeRole()) { \ case ::testing::internal::DeathTest::OVERSEE_TEST: \ if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \ goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ } \ break; \ case ::testing::internal::DeathTest::EXECUTE_TEST: { \ ::testing::internal::DeathTest::ReturnSentinel \ gtest_sentinel(gtest_dt); \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \ break; \ } \ } \ } \ } else \ GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \ fail(::testing::internal::DeathTest::LastMessage()) // The symbol "fail" here expands to something into which a message // can be streamed. // A class representing the parsed contents of the // --gtest_internal_run_death_test flag, as it existed when // RUN_ALL_TESTS was called. class InternalRunDeathTestFlag { public: InternalRunDeathTestFlag(const String& a_file, int a_line, int an_index, int a_write_fd) : file_(a_file), line_(a_line), index_(an_index), write_fd_(a_write_fd) {} ~InternalRunDeathTestFlag() { if (write_fd_ >= 0) posix::Close(write_fd_); } String file() const { return file_; } int line() const { return line_; } int index() const { return index_; } int write_fd() const { return write_fd_; } private: String file_; int line_; int index_; int write_fd_; GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag); }; // Returns a newly created InternalRunDeathTestFlag object with fields // initialized from the GTEST_FLAG(internal_run_death_test) flag if // the flag is specified; otherwise returns NULL. InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag(); #else // GTEST_HAS_DEATH_TEST // This macro is used for implementing macros such as // EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where // death tests are not supported. Those macros must compile on such systems // iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on // systems that support death tests. This allows one to write such a macro // on a system that does not support death tests and be sure that it will // compile on a death-test supporting system. // // Parameters: // statement - A statement that a macro such as EXPECT_DEATH would test // for program termination. This macro has to make sure this // statement is compiled but not executed, to ensure that // EXPECT_DEATH_IF_SUPPORTED compiles with a certain // parameter iff EXPECT_DEATH compiles with it. // regex - A regex that a macro such as EXPECT_DEATH would use to test // the output of statement. This parameter has to be // compiled but not evaluated by this macro, to ensure that // this macro only accepts expressions that a macro such as // EXPECT_DEATH would accept. // terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED // and a return statement for ASSERT_DEATH_IF_SUPPORTED. // This ensures that ASSERT_DEATH_IF_SUPPORTED will not // compile inside functions where ASSERT_DEATH doesn't // compile. // // The branch that has an always false condition is used to ensure that // statement and regex are compiled (and thus syntactically correct) but // never executed. The unreachable code macro protects the terminator // statement from generating an 'unreachable code' warning in case // statement unconditionally returns or throws. The Message constructor at // the end allows the syntax of streaming additional messages into the // macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH. #define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::AlwaysTrue()) { \ GTEST_LOG_(WARNING) \ << "Death tests are not supported on this platform.\n" \ << "Statement '" #statement "' cannot be verified."; \ } else if (::testing::internal::AlwaysFalse()) { \ ::testing::internal::RE::PartialMatch(".*", (regex)); \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ terminator; \ } else \ ::testing::Message() #endif // GTEST_HAS_DEATH_TEST } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/include/gtest/internal/gtest-filepath.h000066400000000000000000000227411260417502300330510ustar00rootroot00000000000000// Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: keith.ray@gmail.com (Keith Ray) // // Google Test filepath utilities // // This header file declares classes and functions used internally by // Google Test. They are subject to change without notice. // // This file is #included in . // Do not include this header file separately! #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ #include namespace testing { namespace internal { // FilePath - a class for file and directory pathname manipulation which // handles platform-specific conventions (like the pathname separator). // Used for helper functions for naming files in a directory for xml output. // Except for Set methods, all methods are const or static, which provides an // "immutable value object" -- useful for peace of mind. // A FilePath with a value ending in a path separator ("like/this/") represents // a directory, otherwise it is assumed to represent a file. In either case, // it may or may not represent an actual file or directory in the file system. // Names are NOT checked for syntax correctness -- no checking for illegal // characters, malformed paths, etc. class GTEST_API_ FilePath { public: FilePath() : pathname_("") { } FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { } explicit FilePath(const char* pathname) : pathname_(pathname) { Normalize(); } explicit FilePath(const String& pathname) : pathname_(pathname) { Normalize(); } FilePath& operator=(const FilePath& rhs) { Set(rhs); return *this; } void Set(const FilePath& rhs) { pathname_ = rhs.pathname_; } String ToString() const { return pathname_; } const char* c_str() const { return pathname_.c_str(); } // Returns the current working directory, or "" if unsuccessful. static FilePath GetCurrentDir(); // Given directory = "dir", base_name = "test", number = 0, // extension = "xml", returns "dir/test.xml". If number is greater // than zero (e.g., 12), returns "dir/test_12.xml". // On Windows platform, uses \ as the separator rather than /. static FilePath MakeFileName(const FilePath& directory, const FilePath& base_name, int number, const char* extension); // Given directory = "dir", relative_path = "test.xml", // returns "dir/test.xml". // On Windows, uses \ as the separator rather than /. static FilePath ConcatPaths(const FilePath& directory, const FilePath& relative_path); // Returns a pathname for a file that does not currently exist. The pathname // will be directory/base_name.extension or // directory/base_name_.extension if directory/base_name.extension // already exists. The number will be incremented until a pathname is found // that does not already exist. // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'. // There could be a race condition if two or more processes are calling this // function at the same time -- they could both pick the same filename. static FilePath GenerateUniqueFileName(const FilePath& directory, const FilePath& base_name, const char* extension); // Returns true iff the path is NULL or "". bool IsEmpty() const { return c_str() == NULL || *c_str() == '\0'; } // If input name has a trailing separator character, removes it and returns // the name, otherwise return the name string unmodified. // On Windows platform, uses \ as the separator, other platforms use /. FilePath RemoveTrailingPathSeparator() const; // Returns a copy of the FilePath with the directory part removed. // Example: FilePath("path/to/file").RemoveDirectoryName() returns // FilePath("file"). If there is no directory part ("just_a_file"), it returns // the FilePath unmodified. If there is no file part ("just_a_dir/") it // returns an empty FilePath (""). // On Windows platform, '\' is the path separator, otherwise it is '/'. FilePath RemoveDirectoryName() const; // RemoveFileName returns the directory path with the filename removed. // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/". // If the FilePath is "a_file" or "/a_file", RemoveFileName returns // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does // not have a file, like "just/a/dir/", it returns the FilePath unmodified. // On Windows platform, '\' is the path separator, otherwise it is '/'. FilePath RemoveFileName() const; // Returns a copy of the FilePath with the case-insensitive extension removed. // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns // FilePath("dir/file"). If a case-insensitive extension is not // found, returns a copy of the original FilePath. FilePath RemoveExtension(const char* extension) const; // Creates directories so that path exists. Returns true if successful or if // the directories already exist; returns false if unable to create // directories for any reason. Will also return false if the FilePath does // not represent a directory (that is, it doesn't end with a path separator). bool CreateDirectoriesRecursively() const; // Create the directory so that path exists. Returns true if successful or // if the directory already exists; returns false if unable to create the // directory for any reason, including if the parent directory does not // exist. Not named "CreateDirectory" because that's a macro on Windows. bool CreateFolder() const; // Returns true if FilePath describes something in the file-system, // either a file, directory, or whatever, and that something exists. bool FileOrDirectoryExists() const; // Returns true if pathname describes a directory in the file-system // that exists. bool DirectoryExists() const; // Returns true if FilePath ends with a path separator, which indicates that // it is intended to represent a directory. Returns false otherwise. // This does NOT check that a directory (or file) actually exists. bool IsDirectory() const; // Returns true if pathname describes a root directory. (Windows has one // root directory per disk drive.) bool IsRootDirectory() const; // Returns true if pathname describes an absolute path. bool IsAbsolutePath() const; private: // Replaces multiple consecutive separators with a single separator. // For example, "bar///foo" becomes "bar/foo". Does not eliminate other // redundancies that might be in a pathname involving "." or "..". // // A pathname with multiple consecutive separators may occur either through // user error or as a result of some scripts or APIs that generate a pathname // with a trailing separator. On other platforms the same API or script // may NOT generate a pathname with a trailing "/". Then elsewhere that // pathname may have another "/" and pathname components added to it, // without checking for the separator already being there. // The script language and operating system may allow paths like "foo//bar" // but some of the functions in FilePath will not handle that correctly. In // particular, RemoveTrailingPathSeparator() only removes one separator, and // it is called in CreateDirectoriesRecursively() assuming that it will change // a pathname from directory syntax (trailing separator) to filename syntax. // // On Windows this method also replaces the alternate path separator '/' with // the primary path separator '\\', so that for example "bar\\/\\foo" becomes // "bar\\foo". void Normalize(); // Returns a pointer to the last occurence of a valid path separator in // the FilePath. On Windows, for example, both '/' and '\' are valid path // separators. Returns NULL if no path separator was found. const char* FindLastPathSeparator() const; String pathname_; }; // class FilePath } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/include/gtest/internal/gtest-internal.h000066400000000000000000001053141260417502300330670ustar00rootroot00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee) // // The Google C++ Testing Framework (Google Test) // // This header file declares functions and macros used internally by // Google Test. They are subject to change without notice. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ #include #if GTEST_OS_LINUX #include #include #include #include #endif // GTEST_OS_LINUX #include #include #include #include #include #include #include #include // Due to C++ preprocessor weirdness, we need double indirection to // concatenate two tokens when one of them is __LINE__. Writing // // foo ## __LINE__ // // will result in the token foo__LINE__, instead of foo followed by // the current line number. For more details, see // http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6 #define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar) #define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar // Google Test defines the testing::Message class to allow construction of // test messages via the << operator. The idea is that anything // streamable to std::ostream can be streamed to a testing::Message. // This allows a user to use his own types in Google Test assertions by // overloading the << operator. // // util/gtl/stl_logging-inl.h overloads << for STL containers. These // overloads cannot be defined in the std namespace, as that will be // undefined behavior. Therefore, they are defined in the global // namespace instead. // // C++'s symbol lookup rule (i.e. Koenig lookup) says that these // overloads are visible in either the std namespace or the global // namespace, but not other namespaces, including the testing // namespace which Google Test's Message class is in. // // To allow STL containers (and other types that has a << operator // defined in the global namespace) to be used in Google Test assertions, // testing::Message must access the custom << operator from the global // namespace. Hence this helper function. // // Note: Jeffrey Yasskin suggested an alternative fix by "using // ::operator<<;" in the definition of Message's operator<<. That fix // doesn't require a helper function, but unfortunately doesn't // compile with MSVC. template inline void GTestStreamToHelper(std::ostream* os, const T& val) { *os << val; } namespace testing { // Forward declaration of classes. class AssertionResult; // Result of an assertion. class Message; // Represents a failure message. class Test; // Represents a test. class TestInfo; // Information about a test. class TestPartResult; // Result of a test part. class UnitTest; // A collection of test cases. namespace internal { struct TraceInfo; // Information about a trace point. class ScopedTrace; // Implements scoped trace. class TestInfoImpl; // Opaque implementation of TestInfo class UnitTestImpl; // Opaque implementation of UnitTest // How many times InitGoogleTest() has been called. extern int g_init_gtest_count; // The text used in failure messages to indicate the start of the // stack trace. GTEST_API_ extern const char kStackTraceMarker[]; // A secret type that Google Test users don't know about. It has no // definition on purpose. Therefore it's impossible to create a // Secret object, which is what we want. class Secret; // Two overloaded helpers for checking at compile time whether an // expression is a null pointer literal (i.e. NULL or any 0-valued // compile-time integral constant). Their return values have // different sizes, so we can use sizeof() to test which version is // picked by the compiler. These helpers have no implementations, as // we only need their signatures. // // Given IsNullLiteralHelper(x), the compiler will pick the first // version if x can be implicitly converted to Secret*, and pick the // second version otherwise. Since Secret is a secret and incomplete // type, the only expression a user can write that has type Secret* is // a null pointer literal. Therefore, we know that x is a null // pointer literal if and only if the first version is picked by the // compiler. char IsNullLiteralHelper(Secret* p); char (&IsNullLiteralHelper(...))[2]; // NOLINT // A compile-time bool constant that is true if and only if x is a // null pointer literal (i.e. NULL or any 0-valued compile-time // integral constant). #ifdef GTEST_ELLIPSIS_NEEDS_POD_ // We lose support for NULL detection where the compiler doesn't like // passing non-POD classes through ellipsis (...). #define GTEST_IS_NULL_LITERAL_(x) false #else #define GTEST_IS_NULL_LITERAL_(x) \ (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1) #endif // GTEST_ELLIPSIS_NEEDS_POD_ // Appends the user-supplied message to the Google-Test-generated message. GTEST_API_ String AppendUserMessage(const String& gtest_msg, const Message& user_msg); // A helper class for creating scoped traces in user programs. class GTEST_API_ ScopedTrace { public: // The c'tor pushes the given source file location and message onto // a trace stack maintained by Google Test. ScopedTrace(const char* file, int line, const Message& message); // The d'tor pops the info pushed by the c'tor. // // Note that the d'tor is not virtual in order to be efficient. // Don't inherit from ScopedTrace! ~ScopedTrace(); private: GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace); } GTEST_ATTRIBUTE_UNUSED_; // A ScopedTrace object does its job in its // c'tor and d'tor. Therefore it doesn't // need to be used otherwise. // Converts a streamable value to a String. A NULL pointer is // converted to "(null)". When the input value is a ::string, // ::std::string, ::wstring, or ::std::wstring object, each NUL // character in it is replaced with "\\0". // Declared here but defined in gtest.h, so that it has access // to the definition of the Message class, required by the ARM // compiler. template String StreamableToString(const T& streamable); // Formats a value to be used in a failure message. #ifdef GTEST_NEEDS_IS_POINTER_ // These are needed as the Nokia Symbian and IBM XL C/C++ compilers // cannot decide between const T& and const T* in a function template. // These compilers _can_ decide between class template specializations // for T and T*, so a tr1::type_traits-like is_pointer works, and we // can overload on that. // This overload makes sure that all pointers (including // those to char or wchar_t) are printed as raw pointers. template inline String FormatValueForFailureMessage(internal::true_type /*dummy*/, T* pointer) { return StreamableToString(static_cast(pointer)); } template inline String FormatValueForFailureMessage(internal::false_type /*dummy*/, const T& value) { return StreamableToString(value); } template inline String FormatForFailureMessage(const T& value) { return FormatValueForFailureMessage( typename internal::is_pointer::type(), value); } #else // These are needed as the above solution using is_pointer has the // limitation that T cannot be a type without external linkage, when // compiled using MSVC. template inline String FormatForFailureMessage(const T& value) { return StreamableToString(value); } // This overload makes sure that all pointers (including // those to char or wchar_t) are printed as raw pointers. template inline String FormatForFailureMessage(T* pointer) { return StreamableToString(static_cast(pointer)); } #endif // GTEST_NEEDS_IS_POINTER_ // These overloaded versions handle narrow and wide characters. GTEST_API_ String FormatForFailureMessage(char ch); GTEST_API_ String FormatForFailureMessage(wchar_t wchar); // When this operand is a const char* or char*, and the other operand // is a ::std::string or ::string, we print this operand as a C string // rather than a pointer. We do the same for wide strings. // This internal macro is used to avoid duplicated code. #define GTEST_FORMAT_IMPL_(operand2_type, operand1_printer)\ inline String FormatForComparisonFailureMessage(\ operand2_type::value_type* str, const operand2_type& /*operand2*/) {\ return operand1_printer(str);\ }\ inline String FormatForComparisonFailureMessage(\ const operand2_type::value_type* str, const operand2_type& /*operand2*/) {\ return operand1_printer(str);\ } GTEST_FORMAT_IMPL_(::std::string, String::ShowCStringQuoted) #if GTEST_HAS_STD_WSTRING GTEST_FORMAT_IMPL_(::std::wstring, String::ShowWideCStringQuoted) #endif // GTEST_HAS_STD_WSTRING #if GTEST_HAS_GLOBAL_STRING GTEST_FORMAT_IMPL_(::string, String::ShowCStringQuoted) #endif // GTEST_HAS_GLOBAL_STRING #if GTEST_HAS_GLOBAL_WSTRING GTEST_FORMAT_IMPL_(::wstring, String::ShowWideCStringQuoted) #endif // GTEST_HAS_GLOBAL_WSTRING #undef GTEST_FORMAT_IMPL_ // Constructs and returns the message for an equality assertion // (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure. // // The first four parameters are the expressions used in the assertion // and their values, as strings. For example, for ASSERT_EQ(foo, bar) // where foo is 5 and bar is 6, we have: // // expected_expression: "foo" // actual_expression: "bar" // expected_value: "5" // actual_value: "6" // // The ignoring_case parameter is true iff the assertion is a // *_STRCASEEQ*. When it's true, the string " (ignoring case)" will // be inserted into the message. GTEST_API_ AssertionResult EqFailure(const char* expected_expression, const char* actual_expression, const String& expected_value, const String& actual_value, bool ignoring_case); // Constructs a failure message for Boolean assertions such as EXPECT_TRUE. GTEST_API_ String GetBoolAssertionFailureMessage( const AssertionResult& assertion_result, const char* expression_text, const char* actual_predicate_value, const char* expected_predicate_value); // This template class represents an IEEE floating-point number // (either single-precision or double-precision, depending on the // template parameters). // // The purpose of this class is to do more sophisticated number // comparison. (Due to round-off error, etc, it's very unlikely that // two floating-points will be equal exactly. Hence a naive // comparison by the == operation often doesn't work.) // // Format of IEEE floating-point: // // The most-significant bit being the leftmost, an IEEE // floating-point looks like // // sign_bit exponent_bits fraction_bits // // Here, sign_bit is a single bit that designates the sign of the // number. // // For float, there are 8 exponent bits and 23 fraction bits. // // For double, there are 11 exponent bits and 52 fraction bits. // // More details can be found at // http://en.wikipedia.org/wiki/IEEE_floating-point_standard. // // Template parameter: // // RawType: the raw floating-point type (either float or double) template class FloatingPoint { public: // Defines the unsigned integer type that has the same size as the // floating point number. typedef typename TypeWithSize::UInt Bits; // Constants. // # of bits in a number. static const size_t kBitCount = 8*sizeof(RawType); // # of fraction bits in a number. static const size_t kFractionBitCount = std::numeric_limits::digits - 1; // # of exponent bits in a number. static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount; // The mask for the sign bit. static const Bits kSignBitMask = static_cast(1) << (kBitCount - 1); // The mask for the fraction bits. static const Bits kFractionBitMask = ~static_cast(0) >> (kExponentBitCount + 1); // The mask for the exponent bits. static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask); // How many ULP's (Units in the Last Place) we want to tolerate when // comparing two numbers. The larger the value, the more error we // allow. A 0 value means that two numbers must be exactly the same // to be considered equal. // // The maximum error of a single floating-point operation is 0.5 // units in the last place. On Intel CPU's, all floating-point // calculations are done with 80-bit precision, while double has 64 // bits. Therefore, 4 should be enough for ordinary use. // // See the following article for more details on ULP: // http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm. static const size_t kMaxUlps = 4; // Constructs a FloatingPoint from a raw floating-point number. // // On an Intel CPU, passing a non-normalized NAN (Not a Number) // around may change its bits, although the new value is guaranteed // to be also a NAN. Therefore, don't expect this constructor to // preserve the bits in x when x is a NAN. explicit FloatingPoint(const RawType& x) { u_.value_ = x; } // Static methods // Reinterprets a bit pattern as a floating-point number. // // This function is needed to test the AlmostEquals() method. static RawType ReinterpretBits(const Bits bits) { FloatingPoint fp(0); fp.u_.bits_ = bits; return fp.u_.value_; } // Returns the floating-point number that represent positive infinity. static RawType Infinity() { return ReinterpretBits(kExponentBitMask); } // Non-static methods // Returns the bits that represents this number. const Bits &bits() const { return u_.bits_; } // Returns the exponent bits of this number. Bits exponent_bits() const { return kExponentBitMask & u_.bits_; } // Returns the fraction bits of this number. Bits fraction_bits() const { return kFractionBitMask & u_.bits_; } // Returns the sign bit of this number. Bits sign_bit() const { return kSignBitMask & u_.bits_; } // Returns true iff this is NAN (not a number). bool is_nan() const { // It's a NAN if the exponent bits are all ones and the fraction // bits are not entirely zeros. return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0); } // Returns true iff this number is at most kMaxUlps ULP's away from // rhs. In particular, this function: // // - returns false if either number is (or both are) NAN. // - treats really large numbers as almost equal to infinity. // - thinks +0.0 and -0.0 are 0 DLP's apart. bool AlmostEquals(const FloatingPoint& rhs) const { // The IEEE standard says that any comparison operation involving // a NAN must return false. if (is_nan() || rhs.is_nan()) return false; return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_) <= kMaxUlps; } private: // The data type used to store the actual floating-point number. union FloatingPointUnion { RawType value_; // The raw floating-point number. Bits bits_; // The bits that represent the number. }; // Converts an integer from the sign-and-magnitude representation to // the biased representation. More precisely, let N be 2 to the // power of (kBitCount - 1), an integer x is represented by the // unsigned number x + N. // // For instance, // // -N + 1 (the most negative number representable using // sign-and-magnitude) is represented by 1; // 0 is represented by N; and // N - 1 (the biggest number representable using // sign-and-magnitude) is represented by 2N - 1. // // Read http://en.wikipedia.org/wiki/Signed_number_representations // for more details on signed number representations. static Bits SignAndMagnitudeToBiased(const Bits &sam) { if (kSignBitMask & sam) { // sam represents a negative number. return ~sam + 1; } else { // sam represents a positive number. return kSignBitMask | sam; } } // Given two numbers in the sign-and-magnitude representation, // returns the distance between them as an unsigned number. static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1, const Bits &sam2) { const Bits biased1 = SignAndMagnitudeToBiased(sam1); const Bits biased2 = SignAndMagnitudeToBiased(sam2); return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1); } FloatingPointUnion u_; }; // Typedefs the instances of the FloatingPoint template class that we // care to use. typedef FloatingPoint Float; typedef FloatingPoint Double; // In order to catch the mistake of putting tests that use different // test fixture classes in the same test case, we need to assign // unique IDs to fixture classes and compare them. The TypeId type is // used to hold such IDs. The user should treat TypeId as an opaque // type: the only operation allowed on TypeId values is to compare // them for equality using the == operator. typedef const void* TypeId; template class TypeIdHelper { public: // dummy_ must not have a const type. Otherwise an overly eager // compiler (e.g. MSVC 7.1 & 8.0) may try to merge // TypeIdHelper::dummy_ for different Ts as an "optimization". static bool dummy_; }; template bool TypeIdHelper::dummy_ = false; // GetTypeId() returns the ID of type T. Different values will be // returned for different types. Calling the function twice with the // same type argument is guaranteed to return the same ID. template TypeId GetTypeId() { // The compiler is required to allocate a different // TypeIdHelper::dummy_ variable for each T used to instantiate // the template. Therefore, the address of dummy_ is guaranteed to // be unique. return &(TypeIdHelper::dummy_); } // Returns the type ID of ::testing::Test. Always call this instead // of GetTypeId< ::testing::Test>() to get the type ID of // ::testing::Test, as the latter may give the wrong result due to a // suspected linker bug when compiling Google Test as a Mac OS X // framework. GTEST_API_ TypeId GetTestTypeId(); // Defines the abstract factory interface that creates instances // of a Test object. class TestFactoryBase { public: virtual ~TestFactoryBase() {} // Creates a test instance to run. The instance is both created and destroyed // within TestInfoImpl::Run() virtual Test* CreateTest() = 0; protected: TestFactoryBase() {} private: GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase); }; // This class provides implementation of TeastFactoryBase interface. // It is used in TEST and TEST_F macros. template class TestFactoryImpl : public TestFactoryBase { public: virtual Test* CreateTest() { return new TestClass; } }; #if GTEST_OS_WINDOWS // Predicate-formatters for implementing the HRESULT checking macros // {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED} // We pass a long instead of HRESULT to avoid causing an // include dependency for the HRESULT type. GTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr, long hr); // NOLINT GTEST_API_ AssertionResult IsHRESULTFailure(const char* expr, long hr); // NOLINT #endif // GTEST_OS_WINDOWS // Formats a source file path and a line number as they would appear // in a compiler error message. inline String FormatFileLocation(const char* file, int line) { const char* const file_name = file == NULL ? "unknown file" : file; if (line < 0) { return String::Format("%s:", file_name); } #ifdef _MSC_VER return String::Format("%s(%d):", file_name, line); #else return String::Format("%s:%d:", file_name, line); #endif // _MSC_VER } // Types of SetUpTestCase() and TearDownTestCase() functions. typedef void (*SetUpTestCaseFunc)(); typedef void (*TearDownTestCaseFunc)(); // Creates a new TestInfo object and registers it with Google Test; // returns the created object. // // Arguments: // // test_case_name: name of the test case // name: name of the test // test_case_comment: a comment on the test case that will be included in // the test output // comment: a comment on the test that will be included in the // test output // fixture_class_id: ID of the test fixture class // set_up_tc: pointer to the function that sets up the test case // tear_down_tc: pointer to the function that tears down the test case // factory: pointer to the factory that creates a test object. // The newly created TestInfo instance will assume // ownership of the factory object. GTEST_API_ TestInfo* MakeAndRegisterTestInfo( const char* test_case_name, const char* name, const char* test_case_comment, const char* comment, TypeId fixture_class_id, SetUpTestCaseFunc set_up_tc, TearDownTestCaseFunc tear_down_tc, TestFactoryBase* factory); // If *pstr starts with the given prefix, modifies *pstr to be right // past the prefix and returns true; otherwise leaves *pstr unchanged // and returns false. None of pstr, *pstr, and prefix can be NULL. bool SkipPrefix(const char* prefix, const char** pstr); #if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P // State of the definition of a type-parameterized test case. class GTEST_API_ TypedTestCasePState { public: TypedTestCasePState() : registered_(false) {} // Adds the given test name to defined_test_names_ and return true // if the test case hasn't been registered; otherwise aborts the // program. bool AddTestName(const char* file, int line, const char* case_name, const char* test_name) { if (registered_) { fprintf(stderr, "%s Test %s must be defined before " "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n", FormatFileLocation(file, line).c_str(), test_name, case_name); fflush(stderr); posix::Abort(); } defined_test_names_.insert(test_name); return true; } // Verifies that registered_tests match the test names in // defined_test_names_; returns registered_tests if successful, or // aborts the program otherwise. const char* VerifyRegisteredTestNames( const char* file, int line, const char* registered_tests); private: bool registered_; ::std::set defined_test_names_; }; // Skips to the first non-space char after the first comma in 'str'; // returns NULL if no comma is found in 'str'. inline const char* SkipComma(const char* str) { const char* comma = strchr(str, ','); if (comma == NULL) { return NULL; } while (isspace(*(++comma))) {} return comma; } // Returns the prefix of 'str' before the first comma in it; returns // the entire string if it contains no comma. inline String GetPrefixUntilComma(const char* str) { const char* comma = strchr(str, ','); return comma == NULL ? String(str) : String(str, comma - str); } // TypeParameterizedTest::Register() // registers a list of type-parameterized tests with Google Test. The // return value is insignificant - we just need to return something // such that we can call this function in a namespace scope. // // Implementation note: The GTEST_TEMPLATE_ macro declares a template // template parameter. It's defined in gtest-type-util.h. template class TypeParameterizedTest { public: // 'index' is the index of the test in the type list 'Types' // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase, // Types). Valid values for 'index' are [0, N - 1] where N is the // length of Types. static bool Register(const char* prefix, const char* case_name, const char* test_names, int index) { typedef typename Types::Head Type; typedef Fixture FixtureClass; typedef typename GTEST_BIND_(TestSel, Type) TestClass; // First, registers the first type-parameterized test in the type // list. MakeAndRegisterTestInfo( String::Format("%s%s%s/%d", prefix, prefix[0] == '\0' ? "" : "/", case_name, index).c_str(), GetPrefixUntilComma(test_names).c_str(), String::Format("TypeParam = %s", GetTypeName().c_str()).c_str(), "", GetTypeId(), TestClass::SetUpTestCase, TestClass::TearDownTestCase, new TestFactoryImpl); // Next, recurses (at compile time) with the tail of the type list. return TypeParameterizedTest ::Register(prefix, case_name, test_names, index + 1); } }; // The base case for the compile time recursion. template class TypeParameterizedTest { public: static bool Register(const char* /*prefix*/, const char* /*case_name*/, const char* /*test_names*/, int /*index*/) { return true; } }; // TypeParameterizedTestCase::Register() // registers *all combinations* of 'Tests' and 'Types' with Google // Test. The return value is insignificant - we just need to return // something such that we can call this function in a namespace scope. template class TypeParameterizedTestCase { public: static bool Register(const char* prefix, const char* case_name, const char* test_names) { typedef typename Tests::Head Head; // First, register the first test in 'Test' for each type in 'Types'. TypeParameterizedTest::Register( prefix, case_name, test_names, 0); // Next, recurses (at compile time) with the tail of the test list. return TypeParameterizedTestCase ::Register(prefix, case_name, SkipComma(test_names)); } }; // The base case for the compile time recursion. template class TypeParameterizedTestCase { public: static bool Register(const char* /*prefix*/, const char* /*case_name*/, const char* /*test_names*/) { return true; } }; #endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P // Returns the current OS stack trace as a String. // // The maximum number of stack frames to be included is specified by // the gtest_stack_trace_depth flag. The skip_count parameter // specifies the number of top frames to be skipped, which doesn't // count against the number of frames to be included. // // For example, if Foo() calls Bar(), which in turn calls // GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in // the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't. GTEST_API_ String GetCurrentOsStackTraceExceptTop(UnitTest* unit_test, int skip_count); // Helpers for suppressing warnings on unreachable code or constant // condition. // Always returns true. GTEST_API_ bool AlwaysTrue(); // Always returns false. inline bool AlwaysFalse() { return !AlwaysTrue(); } // A simple Linear Congruential Generator for generating random // numbers with a uniform distribution. Unlike rand() and srand(), it // doesn't use global state (and therefore can't interfere with user // code). Unlike rand_r(), it's portable. An LCG isn't very random, // but it's good enough for our purposes. class GTEST_API_ Random { public: static const UInt32 kMaxRange = 1u << 31; explicit Random(UInt32 seed) : state_(seed) {} void Reseed(UInt32 seed) { state_ = seed; } // Generates a random number from [0, range). Crashes if 'range' is // 0 or greater than kMaxRange. UInt32 Generate(UInt32 range); private: UInt32 state_; GTEST_DISALLOW_COPY_AND_ASSIGN_(Random); }; } // namespace internal } // namespace testing #define GTEST_MESSAGE_(message, result_type) \ ::testing::internal::AssertHelper(result_type, __FILE__, __LINE__, message) \ = ::testing::Message() #define GTEST_FATAL_FAILURE_(message) \ return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure) #define GTEST_NONFATAL_FAILURE_(message) \ GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure) #define GTEST_SUCCESS_(message) \ GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess) // Suppresses MSVC warnings 4072 (unreachable code) for the code following // statement if it returns or throws (or doesn't return or throw in some // situations). #define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \ if (::testing::internal::AlwaysTrue()) { statement; } #define GTEST_TEST_THROW_(statement, expected_exception, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (const char* gtest_msg = "") { \ bool gtest_caught_expected = false; \ try { \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ } \ catch (expected_exception const&) { \ gtest_caught_expected = true; \ } \ catch (...) { \ gtest_msg = "Expected: " #statement " throws an exception of type " \ #expected_exception ".\n Actual: it throws a different " \ "type."; \ goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ } \ if (!gtest_caught_expected) { \ gtest_msg = "Expected: " #statement " throws an exception of type " \ #expected_exception ".\n Actual: it throws nothing."; \ goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ } \ } else \ GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \ fail(gtest_msg) #define GTEST_TEST_NO_THROW_(statement, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (const char* gtest_msg = "") { \ try { \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ } \ catch (...) { \ gtest_msg = "Expected: " #statement " doesn't throw an exception.\n" \ " Actual: it throws."; \ goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \ } \ } else \ GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \ fail(gtest_msg) #define GTEST_TEST_ANY_THROW_(statement, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (const char* gtest_msg = "") { \ bool gtest_caught_any = false; \ try { \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ } \ catch (...) { \ gtest_caught_any = true; \ } \ if (!gtest_caught_any) { \ gtest_msg = "Expected: " #statement " throws an exception.\n" \ " Actual: it doesn't."; \ goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \ } \ } else \ GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \ fail(gtest_msg) // Implements Boolean test assertions such as EXPECT_TRUE. expression can be // either a boolean expression or an AssertionResult. text is a textual // represenation of expression as it was passed into the EXPECT_TRUE. #define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (const ::testing::AssertionResult gtest_ar_ = \ ::testing::AssertionResult(expression)) \ ; \ else \ fail(::testing::internal::GetBoolAssertionFailureMessage(\ gtest_ar_, text, #actual, #expected).c_str()) #define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (const char* gtest_msg = "") { \ ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \ gtest_msg = "Expected: " #statement " doesn't generate new fatal " \ "failures in the current thread.\n" \ " Actual: it does."; \ goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \ } \ } else \ GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \ fail(gtest_msg) // Expands to the name of the class that implements the given test. #define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \ test_case_name##_##test_name##_Test // Helper macro for defining tests. #define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\ class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\ public:\ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\ private:\ virtual void TestBody();\ static ::testing::TestInfo* const test_info_;\ GTEST_DISALLOW_COPY_AND_ASSIGN_(\ GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\ };\ \ ::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\ ::test_info_ =\ ::testing::internal::MakeAndRegisterTestInfo(\ #test_case_name, #test_name, "", "", \ (parent_id), \ parent_class::SetUpTestCase, \ parent_class::TearDownTestCase, \ new ::testing::internal::TestFactoryImpl<\ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\ void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ gtest-linked_ptr.h000066400000000000000000000201621260417502300333240ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/include/gtest/internal// Copyright 2003 Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Authors: Dan Egnor (egnor@google.com) // // A "smart" pointer type with reference tracking. Every pointer to a // particular object is kept on a circular linked list. When the last pointer // to an object is destroyed or reassigned, the object is deleted. // // Used properly, this deletes the object when the last reference goes away. // There are several caveats: // - Like all reference counting schemes, cycles lead to leaks. // - Each smart pointer is actually two pointers (8 bytes instead of 4). // - Every time a pointer is assigned, the entire list of pointers to that // object is traversed. This class is therefore NOT SUITABLE when there // will often be more than two or three pointers to a particular object. // - References are only tracked as long as linked_ptr<> objects are copied. // If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS // will happen (double deletion). // // A good use of this class is storing object references in STL containers. // You can safely put linked_ptr<> in a vector<>. // Other uses may not be as good. // // Note: If you use an incomplete type with linked_ptr<>, the class // *containing* linked_ptr<> must have a constructor and destructor (even // if they do nothing!). // // Bill Gibbons suggested we use something like this. // // Thread Safety: // Unlike other linked_ptr implementations, in this implementation // a linked_ptr object is thread-safe in the sense that: // - it's safe to copy linked_ptr objects concurrently, // - it's safe to copy *from* a linked_ptr and read its underlying // raw pointer (e.g. via get()) concurrently, and // - it's safe to write to two linked_ptrs that point to the same // shared object concurrently. // TODO(wan@google.com): rename this to safe_linked_ptr to avoid // confusion with normal linked_ptr. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_ #include #include #include namespace testing { namespace internal { // Protects copying of all linked_ptr objects. GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex); // This is used internally by all instances of linked_ptr<>. It needs to be // a non-template class because different types of linked_ptr<> can refer to // the same object (linked_ptr(obj) vs linked_ptr(obj)). // So, it needs to be possible for different types of linked_ptr to participate // in the same circular linked list, so we need a single class type here. // // DO NOT USE THIS CLASS DIRECTLY YOURSELF. Use linked_ptr. class linked_ptr_internal { public: // Create a new circle that includes only this instance. void join_new() { next_ = this; } // Many linked_ptr operations may change p.link_ for some linked_ptr // variable p in the same circle as this object. Therefore we need // to prevent two such operations from occurring concurrently. // // Note that different types of linked_ptr objects can coexist in a // circle (e.g. linked_ptr, linked_ptr, and // linked_ptr). Therefore we must use a single mutex to // protect all linked_ptr objects. This can create serious // contention in production code, but is acceptable in a testing // framework. // Join an existing circle. // L < g_linked_ptr_mutex void join(linked_ptr_internal const* ptr) { MutexLock lock(&g_linked_ptr_mutex); linked_ptr_internal const* p = ptr; while (p->next_ != ptr) p = p->next_; p->next_ = this; next_ = ptr; } // Leave whatever circle we're part of. Returns true if we were the // last member of the circle. Once this is done, you can join() another. // L < g_linked_ptr_mutex bool depart() { MutexLock lock(&g_linked_ptr_mutex); if (next_ == this) return true; linked_ptr_internal const* p = next_; while (p->next_ != this) p = p->next_; p->next_ = next_; return false; } private: mutable linked_ptr_internal const* next_; }; template class linked_ptr { public: typedef T element_type; // Take over ownership of a raw pointer. This should happen as soon as // possible after the object is created. explicit linked_ptr(T* ptr = NULL) { capture(ptr); } ~linked_ptr() { depart(); } // Copy an existing linked_ptr<>, adding ourselves to the list of references. template linked_ptr(linked_ptr const& ptr) { copy(&ptr); } linked_ptr(linked_ptr const& ptr) { // NOLINT assert(&ptr != this); copy(&ptr); } // Assignment releases the old value and acquires the new. template linked_ptr& operator=(linked_ptr const& ptr) { depart(); copy(&ptr); return *this; } linked_ptr& operator=(linked_ptr const& ptr) { if (&ptr != this) { depart(); copy(&ptr); } return *this; } // Smart pointer members. void reset(T* ptr = NULL) { depart(); capture(ptr); } T* get() const { return value_; } T* operator->() const { return value_; } T& operator*() const { return *value_; } // Release ownership of the pointed object and returns it. // Sole ownership by this linked_ptr object is required. T* release() { bool last = link_.depart(); assert(last); T* v = value_; value_ = NULL; return v; } bool operator==(T* p) const { return value_ == p; } bool operator!=(T* p) const { return value_ != p; } template bool operator==(linked_ptr const& ptr) const { return value_ == ptr.get(); } template bool operator!=(linked_ptr const& ptr) const { return value_ != ptr.get(); } private: template friend class linked_ptr; T* value_; linked_ptr_internal link_; void depart() { if (link_.depart()) delete value_; } void capture(T* ptr) { value_ = ptr; link_.join_new(); } template void copy(linked_ptr const* ptr) { value_ = ptr->get(); if (value_) link_.join(&ptr->link_); else link_.join_new(); } }; template inline bool operator==(T* ptr, const linked_ptr& x) { return ptr == x.get(); } template inline bool operator!=(T* ptr, const linked_ptr& x) { return ptr != x.get(); } // A function to convert T* into linked_ptr // Doing e.g. make_linked_ptr(new FooBarBaz(arg)) is a shorter notation // for linked_ptr >(new FooBarBaz(arg)) template linked_ptr make_linked_ptr(T* ptr) { return linked_ptr(ptr); } } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_ gtest-param-util-generated.h000066400000000000000000005123221260417502300352040ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/include/gtest/internal// This file was GENERATED by a script. DO NOT EDIT BY HAND!!! // Copyright 2008 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: vladl@google.com (Vlad Losev) // Type and function utilities for implementing parameterized tests. // This file is generated by a SCRIPT. DO NOT EDIT BY HAND! // // Currently Google Test supports at most 50 arguments in Values, // and at most 10 arguments in Combine. Please contact // googletestframework@googlegroups.com if you need more. // Please note that the number of arguments to Combine is limited // by the maximum arity of the implementation of tr1::tuple which is // currently set at 10. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ // scripts/fuse_gtest.py depends on gtest's own header being #included // *unconditionally*. Therefore these #includes cannot be moved // inside #if GTEST_HAS_PARAM_TEST. #include #include #if GTEST_HAS_PARAM_TEST namespace testing { // Forward declarations of ValuesIn(), which is implemented in // include/gtest/gtest-param-test.h. template internal::ParamGenerator< typename ::std::iterator_traits::value_type> ValuesIn( ForwardIterator begin, ForwardIterator end); template internal::ParamGenerator ValuesIn(const T (&array)[N]); template internal::ParamGenerator ValuesIn( const Container& container); namespace internal { // Used in the Values() function to provide polymorphic capabilities. template class ValueArray1 { public: explicit ValueArray1(T1 v1) : v1_(v1) {} template operator ParamGenerator() const { return ValuesIn(&v1_, &v1_ + 1); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray1& other); const T1 v1_; }; template class ValueArray2 { public: ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray2& other); const T1 v1_; const T2 v2_; }; template class ValueArray3 { public: ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray3& other); const T1 v1_; const T2 v2_; const T3 v3_; }; template class ValueArray4 { public: ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3), v4_(v4) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray4& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; }; template class ValueArray5 { public: ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray5& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; }; template class ValueArray6 { public: ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray6& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; }; template class ValueArray7 { public: ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray7& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; }; template class ValueArray8 { public: ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray8& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; }; template class ValueArray9 { public: ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray9& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; }; template class ValueArray10 { public: ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray10& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; }; template class ValueArray11 { public: ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray11& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; }; template class ValueArray12 { public: ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray12& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; }; template class ValueArray13 { public: ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray13& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; }; template class ValueArray14 { public: ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray14& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; }; template class ValueArray15 { public: ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray15& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; }; template class ValueArray16 { public: ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray16& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; }; template class ValueArray17 { public: ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray17& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; }; template class ValueArray18 { public: ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray18& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; }; template class ValueArray19 { public: ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray19& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; }; template class ValueArray20 { public: ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray20& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; }; template class ValueArray21 { public: ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray21& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; }; template class ValueArray22 { public: ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray22& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; }; template class ValueArray23 { public: ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray23& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; }; template class ValueArray24 { public: ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray24& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; }; template class ValueArray25 { public: ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray25& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; }; template class ValueArray26 { public: ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray26& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; }; template class ValueArray27 { public: ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray27& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; }; template class ValueArray28 { public: ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray28& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; }; template class ValueArray29 { public: ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray29& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; }; template class ValueArray30 { public: ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray30& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; }; template class ValueArray31 { public: ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray31& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; }; template class ValueArray32 { public: ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray32& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; }; template class ValueArray33 { public: ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray33& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; }; template class ValueArray34 { public: ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray34& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; }; template class ValueArray35 { public: ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray35& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; }; template class ValueArray36 { public: ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray36& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; }; template class ValueArray37 { public: ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray37& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; }; template class ValueArray38 { public: ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_, v38_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray38& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; }; template class ValueArray39 { public: ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_, v38_, v39_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray39& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; }; template class ValueArray40 { public: ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_, v38_, v39_, v40_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray40& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; }; template class ValueArray41 { public: ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_, v38_, v39_, v40_, v41_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray41& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; }; template class ValueArray42 { public: ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_, v38_, v39_, v40_, v41_, v42_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray42& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; }; template class ValueArray43 { public: ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray43& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; }; template class ValueArray44 { public: ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray44& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; }; template class ValueArray45 { public: ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray45& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; const T45 v45_; }; template class ValueArray46 { public: ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray46& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; const T45 v45_; const T46 v46_; }; template class ValueArray47 { public: ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46), v47_(v47) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray47& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; const T45 v45_; const T46 v46_; const T47 v47_; }; template class ValueArray48 { public: ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46), v47_(v47), v48_(v48) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_, v48_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray48& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; const T45 v45_; const T46 v46_; const T47 v47_; const T48 v48_; }; template class ValueArray49 { public: ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_, v48_, v49_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray49& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; const T45 v45_; const T46 v46_; const T47 v47_; const T48 v48_; const T49 v49_; }; template class ValueArray50 { public: ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {} template operator ParamGenerator() const { const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_, v48_, v49_, v50_}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray50& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; const T45 v45_; const T46 v46_; const T47 v47_; const T48 v48_; const T49 v49_; const T50 v50_; }; #if GTEST_HAS_COMBINE // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Generates values from the Cartesian product of values produced // by the argument generators. // template class CartesianProductGenerator2 : public ParamGeneratorInterface< ::std::tr1::tuple > { public: typedef ::std::tr1::tuple ParamType; CartesianProductGenerator2(const ParamGenerator& g1, const ParamGenerator& g2) : g1_(g1), g2_(g2) {} virtual ~CartesianProductGenerator2() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current2_; if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; ParamType current_value_; }; // class CartesianProductGenerator2::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator2& other); const ParamGenerator g1_; const ParamGenerator g2_; }; // class CartesianProductGenerator2 template class CartesianProductGenerator3 : public ParamGeneratorInterface< ::std::tr1::tuple > { public: typedef ::std::tr1::tuple ParamType; CartesianProductGenerator3(const ParamGenerator& g1, const ParamGenerator& g2, const ParamGenerator& g3) : g1_(g1), g2_(g2), g3_(g3) {} virtual ~CartesianProductGenerator3() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2, const ParamGenerator& g3, const typename ParamGenerator::iterator& current3) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current3_; if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_, *current3_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; const typename ParamGenerator::iterator begin3_; const typename ParamGenerator::iterator end3_; typename ParamGenerator::iterator current3_; ParamType current_value_; }; // class CartesianProductGenerator3::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator3& other); const ParamGenerator g1_; const ParamGenerator g2_; const ParamGenerator g3_; }; // class CartesianProductGenerator3 template class CartesianProductGenerator4 : public ParamGeneratorInterface< ::std::tr1::tuple > { public: typedef ::std::tr1::tuple ParamType; CartesianProductGenerator4(const ParamGenerator& g1, const ParamGenerator& g2, const ParamGenerator& g3, const ParamGenerator& g4) : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {} virtual ~CartesianProductGenerator4() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2, const ParamGenerator& g3, const typename ParamGenerator::iterator& current3, const ParamGenerator& g4, const typename ParamGenerator::iterator& current4) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current4_; if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_, *current3_, *current4_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; const typename ParamGenerator::iterator begin3_; const typename ParamGenerator::iterator end3_; typename ParamGenerator::iterator current3_; const typename ParamGenerator::iterator begin4_; const typename ParamGenerator::iterator end4_; typename ParamGenerator::iterator current4_; ParamType current_value_; }; // class CartesianProductGenerator4::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator4& other); const ParamGenerator g1_; const ParamGenerator g2_; const ParamGenerator g3_; const ParamGenerator g4_; }; // class CartesianProductGenerator4 template class CartesianProductGenerator5 : public ParamGeneratorInterface< ::std::tr1::tuple > { public: typedef ::std::tr1::tuple ParamType; CartesianProductGenerator5(const ParamGenerator& g1, const ParamGenerator& g2, const ParamGenerator& g3, const ParamGenerator& g4, const ParamGenerator& g5) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {} virtual ~CartesianProductGenerator5() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end(), g5_, g5_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2, const ParamGenerator& g3, const typename ParamGenerator::iterator& current3, const ParamGenerator& g4, const typename ParamGenerator::iterator& current4, const ParamGenerator& g5, const typename ParamGenerator::iterator& current5) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4), begin5_(g5.begin()), end5_(g5.end()), current5_(current5) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current5_; if (current5_ == end5_) { current5_ = begin5_; ++current4_; } if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_ && current5_ == typed_other->current5_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_), begin5_(other.begin5_), end5_(other.end5_), current5_(other.current5_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_, *current3_, *current4_, *current5_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_ || current5_ == end5_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; const typename ParamGenerator::iterator begin3_; const typename ParamGenerator::iterator end3_; typename ParamGenerator::iterator current3_; const typename ParamGenerator::iterator begin4_; const typename ParamGenerator::iterator end4_; typename ParamGenerator::iterator current4_; const typename ParamGenerator::iterator begin5_; const typename ParamGenerator::iterator end5_; typename ParamGenerator::iterator current5_; ParamType current_value_; }; // class CartesianProductGenerator5::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator5& other); const ParamGenerator g1_; const ParamGenerator g2_; const ParamGenerator g3_; const ParamGenerator g4_; const ParamGenerator g5_; }; // class CartesianProductGenerator5 template class CartesianProductGenerator6 : public ParamGeneratorInterface< ::std::tr1::tuple > { public: typedef ::std::tr1::tuple ParamType; CartesianProductGenerator6(const ParamGenerator& g1, const ParamGenerator& g2, const ParamGenerator& g3, const ParamGenerator& g4, const ParamGenerator& g5, const ParamGenerator& g6) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {} virtual ~CartesianProductGenerator6() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2, const ParamGenerator& g3, const typename ParamGenerator::iterator& current3, const ParamGenerator& g4, const typename ParamGenerator::iterator& current4, const ParamGenerator& g5, const typename ParamGenerator::iterator& current5, const ParamGenerator& g6, const typename ParamGenerator::iterator& current6) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4), begin5_(g5.begin()), end5_(g5.end()), current5_(current5), begin6_(g6.begin()), end6_(g6.end()), current6_(current6) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current6_; if (current6_ == end6_) { current6_ = begin6_; ++current5_; } if (current5_ == end5_) { current5_ = begin5_; ++current4_; } if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_ && current5_ == typed_other->current5_ && current6_ == typed_other->current6_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_), begin5_(other.begin5_), end5_(other.end5_), current5_(other.current5_), begin6_(other.begin6_), end6_(other.end6_), current6_(other.current6_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_, *current3_, *current4_, *current5_, *current6_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_ || current5_ == end5_ || current6_ == end6_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; const typename ParamGenerator::iterator begin3_; const typename ParamGenerator::iterator end3_; typename ParamGenerator::iterator current3_; const typename ParamGenerator::iterator begin4_; const typename ParamGenerator::iterator end4_; typename ParamGenerator::iterator current4_; const typename ParamGenerator::iterator begin5_; const typename ParamGenerator::iterator end5_; typename ParamGenerator::iterator current5_; const typename ParamGenerator::iterator begin6_; const typename ParamGenerator::iterator end6_; typename ParamGenerator::iterator current6_; ParamType current_value_; }; // class CartesianProductGenerator6::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator6& other); const ParamGenerator g1_; const ParamGenerator g2_; const ParamGenerator g3_; const ParamGenerator g4_; const ParamGenerator g5_; const ParamGenerator g6_; }; // class CartesianProductGenerator6 template class CartesianProductGenerator7 : public ParamGeneratorInterface< ::std::tr1::tuple > { public: typedef ::std::tr1::tuple ParamType; CartesianProductGenerator7(const ParamGenerator& g1, const ParamGenerator& g2, const ParamGenerator& g3, const ParamGenerator& g4, const ParamGenerator& g5, const ParamGenerator& g6, const ParamGenerator& g7) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {} virtual ~CartesianProductGenerator7() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_, g7_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2, const ParamGenerator& g3, const typename ParamGenerator::iterator& current3, const ParamGenerator& g4, const typename ParamGenerator::iterator& current4, const ParamGenerator& g5, const typename ParamGenerator::iterator& current5, const ParamGenerator& g6, const typename ParamGenerator::iterator& current6, const ParamGenerator& g7, const typename ParamGenerator::iterator& current7) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4), begin5_(g5.begin()), end5_(g5.end()), current5_(current5), begin6_(g6.begin()), end6_(g6.end()), current6_(current6), begin7_(g7.begin()), end7_(g7.end()), current7_(current7) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current7_; if (current7_ == end7_) { current7_ = begin7_; ++current6_; } if (current6_ == end6_) { current6_ = begin6_; ++current5_; } if (current5_ == end5_) { current5_ = begin5_; ++current4_; } if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_ && current5_ == typed_other->current5_ && current6_ == typed_other->current6_ && current7_ == typed_other->current7_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_), begin5_(other.begin5_), end5_(other.end5_), current5_(other.current5_), begin6_(other.begin6_), end6_(other.end6_), current6_(other.current6_), begin7_(other.begin7_), end7_(other.end7_), current7_(other.current7_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_, *current3_, *current4_, *current5_, *current6_, *current7_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_ || current5_ == end5_ || current6_ == end6_ || current7_ == end7_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; const typename ParamGenerator::iterator begin3_; const typename ParamGenerator::iterator end3_; typename ParamGenerator::iterator current3_; const typename ParamGenerator::iterator begin4_; const typename ParamGenerator::iterator end4_; typename ParamGenerator::iterator current4_; const typename ParamGenerator::iterator begin5_; const typename ParamGenerator::iterator end5_; typename ParamGenerator::iterator current5_; const typename ParamGenerator::iterator begin6_; const typename ParamGenerator::iterator end6_; typename ParamGenerator::iterator current6_; const typename ParamGenerator::iterator begin7_; const typename ParamGenerator::iterator end7_; typename ParamGenerator::iterator current7_; ParamType current_value_; }; // class CartesianProductGenerator7::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator7& other); const ParamGenerator g1_; const ParamGenerator g2_; const ParamGenerator g3_; const ParamGenerator g4_; const ParamGenerator g5_; const ParamGenerator g6_; const ParamGenerator g7_; }; // class CartesianProductGenerator7 template class CartesianProductGenerator8 : public ParamGeneratorInterface< ::std::tr1::tuple > { public: typedef ::std::tr1::tuple ParamType; CartesianProductGenerator8(const ParamGenerator& g1, const ParamGenerator& g2, const ParamGenerator& g3, const ParamGenerator& g4, const ParamGenerator& g5, const ParamGenerator& g6, const ParamGenerator& g7, const ParamGenerator& g8) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8) {} virtual ~CartesianProductGenerator8() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_, g7_.begin(), g8_, g8_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_, g8_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2, const ParamGenerator& g3, const typename ParamGenerator::iterator& current3, const ParamGenerator& g4, const typename ParamGenerator::iterator& current4, const ParamGenerator& g5, const typename ParamGenerator::iterator& current5, const ParamGenerator& g6, const typename ParamGenerator::iterator& current6, const ParamGenerator& g7, const typename ParamGenerator::iterator& current7, const ParamGenerator& g8, const typename ParamGenerator::iterator& current8) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4), begin5_(g5.begin()), end5_(g5.end()), current5_(current5), begin6_(g6.begin()), end6_(g6.end()), current6_(current6), begin7_(g7.begin()), end7_(g7.end()), current7_(current7), begin8_(g8.begin()), end8_(g8.end()), current8_(current8) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current8_; if (current8_ == end8_) { current8_ = begin8_; ++current7_; } if (current7_ == end7_) { current7_ = begin7_; ++current6_; } if (current6_ == end6_) { current6_ = begin6_; ++current5_; } if (current5_ == end5_) { current5_ = begin5_; ++current4_; } if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_ && current5_ == typed_other->current5_ && current6_ == typed_other->current6_ && current7_ == typed_other->current7_ && current8_ == typed_other->current8_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_), begin5_(other.begin5_), end5_(other.end5_), current5_(other.current5_), begin6_(other.begin6_), end6_(other.end6_), current6_(other.current6_), begin7_(other.begin7_), end7_(other.end7_), current7_(other.current7_), begin8_(other.begin8_), end8_(other.end8_), current8_(other.current8_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_, *current3_, *current4_, *current5_, *current6_, *current7_, *current8_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_ || current5_ == end5_ || current6_ == end6_ || current7_ == end7_ || current8_ == end8_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; const typename ParamGenerator::iterator begin3_; const typename ParamGenerator::iterator end3_; typename ParamGenerator::iterator current3_; const typename ParamGenerator::iterator begin4_; const typename ParamGenerator::iterator end4_; typename ParamGenerator::iterator current4_; const typename ParamGenerator::iterator begin5_; const typename ParamGenerator::iterator end5_; typename ParamGenerator::iterator current5_; const typename ParamGenerator::iterator begin6_; const typename ParamGenerator::iterator end6_; typename ParamGenerator::iterator current6_; const typename ParamGenerator::iterator begin7_; const typename ParamGenerator::iterator end7_; typename ParamGenerator::iterator current7_; const typename ParamGenerator::iterator begin8_; const typename ParamGenerator::iterator end8_; typename ParamGenerator::iterator current8_; ParamType current_value_; }; // class CartesianProductGenerator8::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator8& other); const ParamGenerator g1_; const ParamGenerator g2_; const ParamGenerator g3_; const ParamGenerator g4_; const ParamGenerator g5_; const ParamGenerator g6_; const ParamGenerator g7_; const ParamGenerator g8_; }; // class CartesianProductGenerator8 template class CartesianProductGenerator9 : public ParamGeneratorInterface< ::std::tr1::tuple > { public: typedef ::std::tr1::tuple ParamType; CartesianProductGenerator9(const ParamGenerator& g1, const ParamGenerator& g2, const ParamGenerator& g3, const ParamGenerator& g4, const ParamGenerator& g5, const ParamGenerator& g6, const ParamGenerator& g7, const ParamGenerator& g8, const ParamGenerator& g9) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8), g9_(g9) {} virtual ~CartesianProductGenerator9() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_, g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_, g8_.end(), g9_, g9_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2, const ParamGenerator& g3, const typename ParamGenerator::iterator& current3, const ParamGenerator& g4, const typename ParamGenerator::iterator& current4, const ParamGenerator& g5, const typename ParamGenerator::iterator& current5, const ParamGenerator& g6, const typename ParamGenerator::iterator& current6, const ParamGenerator& g7, const typename ParamGenerator::iterator& current7, const ParamGenerator& g8, const typename ParamGenerator::iterator& current8, const ParamGenerator& g9, const typename ParamGenerator::iterator& current9) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4), begin5_(g5.begin()), end5_(g5.end()), current5_(current5), begin6_(g6.begin()), end6_(g6.end()), current6_(current6), begin7_(g7.begin()), end7_(g7.end()), current7_(current7), begin8_(g8.begin()), end8_(g8.end()), current8_(current8), begin9_(g9.begin()), end9_(g9.end()), current9_(current9) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current9_; if (current9_ == end9_) { current9_ = begin9_; ++current8_; } if (current8_ == end8_) { current8_ = begin8_; ++current7_; } if (current7_ == end7_) { current7_ = begin7_; ++current6_; } if (current6_ == end6_) { current6_ = begin6_; ++current5_; } if (current5_ == end5_) { current5_ = begin5_; ++current4_; } if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_ && current5_ == typed_other->current5_ && current6_ == typed_other->current6_ && current7_ == typed_other->current7_ && current8_ == typed_other->current8_ && current9_ == typed_other->current9_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_), begin5_(other.begin5_), end5_(other.end5_), current5_(other.current5_), begin6_(other.begin6_), end6_(other.end6_), current6_(other.current6_), begin7_(other.begin7_), end7_(other.end7_), current7_(other.current7_), begin8_(other.begin8_), end8_(other.end8_), current8_(other.current8_), begin9_(other.begin9_), end9_(other.end9_), current9_(other.current9_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_, *current3_, *current4_, *current5_, *current6_, *current7_, *current8_, *current9_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_ || current5_ == end5_ || current6_ == end6_ || current7_ == end7_ || current8_ == end8_ || current9_ == end9_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; const typename ParamGenerator::iterator begin3_; const typename ParamGenerator::iterator end3_; typename ParamGenerator::iterator current3_; const typename ParamGenerator::iterator begin4_; const typename ParamGenerator::iterator end4_; typename ParamGenerator::iterator current4_; const typename ParamGenerator::iterator begin5_; const typename ParamGenerator::iterator end5_; typename ParamGenerator::iterator current5_; const typename ParamGenerator::iterator begin6_; const typename ParamGenerator::iterator end6_; typename ParamGenerator::iterator current6_; const typename ParamGenerator::iterator begin7_; const typename ParamGenerator::iterator end7_; typename ParamGenerator::iterator current7_; const typename ParamGenerator::iterator begin8_; const typename ParamGenerator::iterator end8_; typename ParamGenerator::iterator current8_; const typename ParamGenerator::iterator begin9_; const typename ParamGenerator::iterator end9_; typename ParamGenerator::iterator current9_; ParamType current_value_; }; // class CartesianProductGenerator9::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator9& other); const ParamGenerator g1_; const ParamGenerator g2_; const ParamGenerator g3_; const ParamGenerator g4_; const ParamGenerator g5_; const ParamGenerator g6_; const ParamGenerator g7_; const ParamGenerator g8_; const ParamGenerator g9_; }; // class CartesianProductGenerator9 template class CartesianProductGenerator10 : public ParamGeneratorInterface< ::std::tr1::tuple > { public: typedef ::std::tr1::tuple ParamType; CartesianProductGenerator10(const ParamGenerator& g1, const ParamGenerator& g2, const ParamGenerator& g3, const ParamGenerator& g4, const ParamGenerator& g5, const ParamGenerator& g6, const ParamGenerator& g7, const ParamGenerator& g8, const ParamGenerator& g9, const ParamGenerator& g10) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8), g9_(g9), g10_(g10) {} virtual ~CartesianProductGenerator10() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_, g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_, g8_.end(), g9_, g9_.end(), g10_, g10_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2, const ParamGenerator& g3, const typename ParamGenerator::iterator& current3, const ParamGenerator& g4, const typename ParamGenerator::iterator& current4, const ParamGenerator& g5, const typename ParamGenerator::iterator& current5, const ParamGenerator& g6, const typename ParamGenerator::iterator& current6, const ParamGenerator& g7, const typename ParamGenerator::iterator& current7, const ParamGenerator& g8, const typename ParamGenerator::iterator& current8, const ParamGenerator& g9, const typename ParamGenerator::iterator& current9, const ParamGenerator& g10, const typename ParamGenerator::iterator& current10) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4), begin5_(g5.begin()), end5_(g5.end()), current5_(current5), begin6_(g6.begin()), end6_(g6.end()), current6_(current6), begin7_(g7.begin()), end7_(g7.end()), current7_(current7), begin8_(g8.begin()), end8_(g8.end()), current8_(current8), begin9_(g9.begin()), end9_(g9.end()), current9_(current9), begin10_(g10.begin()), end10_(g10.end()), current10_(current10) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current10_; if (current10_ == end10_) { current10_ = begin10_; ++current9_; } if (current9_ == end9_) { current9_ = begin9_; ++current8_; } if (current8_ == end8_) { current8_ = begin8_; ++current7_; } if (current7_ == end7_) { current7_ = begin7_; ++current6_; } if (current6_ == end6_) { current6_ = begin6_; ++current5_; } if (current5_ == end5_) { current5_ = begin5_; ++current4_; } if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_ && current5_ == typed_other->current5_ && current6_ == typed_other->current6_ && current7_ == typed_other->current7_ && current8_ == typed_other->current8_ && current9_ == typed_other->current9_ && current10_ == typed_other->current10_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_), begin5_(other.begin5_), end5_(other.end5_), current5_(other.current5_), begin6_(other.begin6_), end6_(other.end6_), current6_(other.current6_), begin7_(other.begin7_), end7_(other.end7_), current7_(other.current7_), begin8_(other.begin8_), end8_(other.end8_), current8_(other.current8_), begin9_(other.begin9_), end9_(other.end9_), current9_(other.current9_), begin10_(other.begin10_), end10_(other.end10_), current10_(other.current10_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_, *current3_, *current4_, *current5_, *current6_, *current7_, *current8_, *current9_, *current10_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_ || current5_ == end5_ || current6_ == end6_ || current7_ == end7_ || current8_ == end8_ || current9_ == end9_ || current10_ == end10_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; const typename ParamGenerator::iterator begin3_; const typename ParamGenerator::iterator end3_; typename ParamGenerator::iterator current3_; const typename ParamGenerator::iterator begin4_; const typename ParamGenerator::iterator end4_; typename ParamGenerator::iterator current4_; const typename ParamGenerator::iterator begin5_; const typename ParamGenerator::iterator end5_; typename ParamGenerator::iterator current5_; const typename ParamGenerator::iterator begin6_; const typename ParamGenerator::iterator end6_; typename ParamGenerator::iterator current6_; const typename ParamGenerator::iterator begin7_; const typename ParamGenerator::iterator end7_; typename ParamGenerator::iterator current7_; const typename ParamGenerator::iterator begin8_; const typename ParamGenerator::iterator end8_; typename ParamGenerator::iterator current8_; const typename ParamGenerator::iterator begin9_; const typename ParamGenerator::iterator end9_; typename ParamGenerator::iterator current9_; const typename ParamGenerator::iterator begin10_; const typename ParamGenerator::iterator end10_; typename ParamGenerator::iterator current10_; ParamType current_value_; }; // class CartesianProductGenerator10::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator10& other); const ParamGenerator g1_; const ParamGenerator g2_; const ParamGenerator g3_; const ParamGenerator g4_; const ParamGenerator g5_; const ParamGenerator g6_; const ParamGenerator g7_; const ParamGenerator g8_; const ParamGenerator g9_; const ParamGenerator g10_; }; // class CartesianProductGenerator10 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Helper classes providing Combine() with polymorphic features. They allow // casting CartesianProductGeneratorN to ParamGenerator if T is // convertible to U. // template class CartesianProductHolder2 { public: CartesianProductHolder2(const Generator1& g1, const Generator2& g2) : g1_(g1), g2_(g2) {} template operator ParamGenerator< ::std::tr1::tuple >() const { return ParamGenerator< ::std::tr1::tuple >( new CartesianProductGenerator2( static_cast >(g1_), static_cast >(g2_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder2& other); const Generator1 g1_; const Generator2 g2_; }; // class CartesianProductHolder2 template class CartesianProductHolder3 { public: CartesianProductHolder3(const Generator1& g1, const Generator2& g2, const Generator3& g3) : g1_(g1), g2_(g2), g3_(g3) {} template operator ParamGenerator< ::std::tr1::tuple >() const { return ParamGenerator< ::std::tr1::tuple >( new CartesianProductGenerator3( static_cast >(g1_), static_cast >(g2_), static_cast >(g3_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder3& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; }; // class CartesianProductHolder3 template class CartesianProductHolder4 { public: CartesianProductHolder4(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4) : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {} template operator ParamGenerator< ::std::tr1::tuple >() const { return ParamGenerator< ::std::tr1::tuple >( new CartesianProductGenerator4( static_cast >(g1_), static_cast >(g2_), static_cast >(g3_), static_cast >(g4_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder4& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; }; // class CartesianProductHolder4 template class CartesianProductHolder5 { public: CartesianProductHolder5(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {} template operator ParamGenerator< ::std::tr1::tuple >() const { return ParamGenerator< ::std::tr1::tuple >( new CartesianProductGenerator5( static_cast >(g1_), static_cast >(g2_), static_cast >(g3_), static_cast >(g4_), static_cast >(g5_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder5& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; const Generator5 g5_; }; // class CartesianProductHolder5 template class CartesianProductHolder6 { public: CartesianProductHolder6(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {} template operator ParamGenerator< ::std::tr1::tuple >() const { return ParamGenerator< ::std::tr1::tuple >( new CartesianProductGenerator6( static_cast >(g1_), static_cast >(g2_), static_cast >(g3_), static_cast >(g4_), static_cast >(g5_), static_cast >(g6_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder6& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; const Generator5 g5_; const Generator6 g6_; }; // class CartesianProductHolder6 template class CartesianProductHolder7 { public: CartesianProductHolder7(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {} template operator ParamGenerator< ::std::tr1::tuple >() const { return ParamGenerator< ::std::tr1::tuple >( new CartesianProductGenerator7( static_cast >(g1_), static_cast >(g2_), static_cast >(g3_), static_cast >(g4_), static_cast >(g5_), static_cast >(g6_), static_cast >(g7_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder7& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; const Generator5 g5_; const Generator6 g6_; const Generator7 g7_; }; // class CartesianProductHolder7 template class CartesianProductHolder8 { public: CartesianProductHolder8(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7, const Generator8& g8) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8) {} template operator ParamGenerator< ::std::tr1::tuple >() const { return ParamGenerator< ::std::tr1::tuple >( new CartesianProductGenerator8( static_cast >(g1_), static_cast >(g2_), static_cast >(g3_), static_cast >(g4_), static_cast >(g5_), static_cast >(g6_), static_cast >(g7_), static_cast >(g8_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder8& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; const Generator5 g5_; const Generator6 g6_; const Generator7 g7_; const Generator8 g8_; }; // class CartesianProductHolder8 template class CartesianProductHolder9 { public: CartesianProductHolder9(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7, const Generator8& g8, const Generator9& g9) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8), g9_(g9) {} template operator ParamGenerator< ::std::tr1::tuple >() const { return ParamGenerator< ::std::tr1::tuple >( new CartesianProductGenerator9( static_cast >(g1_), static_cast >(g2_), static_cast >(g3_), static_cast >(g4_), static_cast >(g5_), static_cast >(g6_), static_cast >(g7_), static_cast >(g8_), static_cast >(g9_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder9& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; const Generator5 g5_; const Generator6 g6_; const Generator7 g7_; const Generator8 g8_; const Generator9 g9_; }; // class CartesianProductHolder9 template class CartesianProductHolder10 { public: CartesianProductHolder10(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7, const Generator8& g8, const Generator9& g9, const Generator10& g10) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8), g9_(g9), g10_(g10) {} template operator ParamGenerator< ::std::tr1::tuple >() const { return ParamGenerator< ::std::tr1::tuple >( new CartesianProductGenerator10( static_cast >(g1_), static_cast >(g2_), static_cast >(g3_), static_cast >(g4_), static_cast >(g5_), static_cast >(g6_), static_cast >(g7_), static_cast >(g8_), static_cast >(g9_), static_cast >(g10_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder10& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; const Generator5 g5_; const Generator6 g6_; const Generator7 g7_; const Generator8 g8_; const Generator9 g9_; const Generator10 g10_; }; // class CartesianProductHolder10 #endif // GTEST_HAS_COMBINE } // namespace internal } // namespace testing #endif // GTEST_HAS_PARAM_TEST #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ gtest-param-util-generated.h.pump000066400000000000000000000222641260417502300361650ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/include/gtest/internal$$ -*- mode: c++; -*- $var n = 50 $$ Maximum length of Values arguments we want to support. $var maxtuple = 10 $$ Maximum number of Combine arguments we want to support. // Copyright 2008 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: vladl@google.com (Vlad Losev) // Type and function utilities for implementing parameterized tests. // This file is generated by a SCRIPT. DO NOT EDIT BY HAND! // // Currently Google Test supports at most $n arguments in Values, // and at most $maxtuple arguments in Combine. Please contact // googletestframework@googlegroups.com if you need more. // Please note that the number of arguments to Combine is limited // by the maximum arity of the implementation of tr1::tuple which is // currently set at $maxtuple. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ // scripts/fuse_gtest.py depends on gtest's own header being #included // *unconditionally*. Therefore these #includes cannot be moved // inside #if GTEST_HAS_PARAM_TEST. #include #include #if GTEST_HAS_PARAM_TEST namespace testing { // Forward declarations of ValuesIn(), which is implemented in // include/gtest/gtest-param-test.h. template internal::ParamGenerator< typename ::std::iterator_traits::value_type> ValuesIn( ForwardIterator begin, ForwardIterator end); template internal::ParamGenerator ValuesIn(const T (&array)[N]); template internal::ParamGenerator ValuesIn( const Container& container); namespace internal { // Used in the Values() function to provide polymorphic capabilities. template class ValueArray1 { public: explicit ValueArray1(T1 v1) : v1_(v1) {} template operator ParamGenerator() const { return ValuesIn(&v1_, &v1_ + 1); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray1& other); const T1 v1_; }; $range i 2..n $for i [[ $range j 1..i template <$for j, [[typename T$j]]> class ValueArray$i { public: ValueArray$i($for j, [[T$j v$j]]) : $for j, [[v$(j)_(v$j)]] {} template operator ParamGenerator() const { const T array[] = {$for j, [[v$(j)_]]}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray$i& other); $for j [[ const T$j v$(j)_; ]] }; ]] #if GTEST_HAS_COMBINE // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Generates values from the Cartesian product of values produced // by the argument generators. // $range i 2..maxtuple $for i [[ $range j 1..i $range k 2..i template <$for j, [[typename T$j]]> class CartesianProductGenerator$i : public ParamGeneratorInterface< ::std::tr1::tuple<$for j, [[T$j]]> > { public: typedef ::std::tr1::tuple<$for j, [[T$j]]> ParamType; CartesianProductGenerator$i($for j, [[const ParamGenerator& g$j]]) : $for j, [[g$(j)_(g$j)]] {} virtual ~CartesianProductGenerator$i() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, $for j, [[g$(j)_, g$(j)_.begin()]]); } virtual ParamIteratorInterface* End() const { return new Iterator(this, $for j, [[g$(j)_, g$(j)_.end()]]); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, $for j, [[ const ParamGenerator& g$j, const typename ParamGenerator::iterator& current$(j)]]) : base_(base), $for j, [[ begin$(j)_(g$j.begin()), end$(j)_(g$j.end()), current$(j)_(current$j) ]] { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current$(i)_; $for k [[ if (current$(i+2-k)_ == end$(i+2-k)_) { current$(i+2-k)_ = begin$(i+2-k)_; ++current$(i+2-k-1)_; } ]] ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ($for j && [[ current$(j)_ == typed_other->current$(j)_ ]]); } private: Iterator(const Iterator& other) : base_(other.base_), $for j, [[ begin$(j)_(other.begin$(j)_), end$(j)_(other.end$(j)_), current$(j)_(other.current$(j)_) ]] { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType($for j, [[*current$(j)_]]); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return $for j || [[ current$(j)_ == end$(j)_ ]]; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. $for j [[ const typename ParamGenerator::iterator begin$(j)_; const typename ParamGenerator::iterator end$(j)_; typename ParamGenerator::iterator current$(j)_; ]] ParamType current_value_; }; // class CartesianProductGenerator$i::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator$i& other); $for j [[ const ParamGenerator g$(j)_; ]] }; // class CartesianProductGenerator$i ]] // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Helper classes providing Combine() with polymorphic features. They allow // casting CartesianProductGeneratorN to ParamGenerator if T is // convertible to U. // $range i 2..maxtuple $for i [[ $range j 1..i template <$for j, [[class Generator$j]]> class CartesianProductHolder$i { public: CartesianProductHolder$i($for j, [[const Generator$j& g$j]]) : $for j, [[g$(j)_(g$j)]] {} template <$for j, [[typename T$j]]> operator ParamGenerator< ::std::tr1::tuple<$for j, [[T$j]]> >() const { return ParamGenerator< ::std::tr1::tuple<$for j, [[T$j]]> >( new CartesianProductGenerator$i<$for j, [[T$j]]>( $for j,[[ static_cast >(g$(j)_) ]])); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder$i& other); $for j [[ const Generator$j g$(j)_; ]] }; // class CartesianProductHolder$i ]] #endif // GTEST_HAS_COMBINE } // namespace internal } // namespace testing #endif // GTEST_HAS_PARAM_TEST #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ gtest-param-util.h000066400000000000000000000574451260417502300332620ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/include/gtest/internal// Copyright 2008 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: vladl@google.com (Vlad Losev) // Type and function utilities for implementing parameterized tests. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ #include #include #include // scripts/fuse_gtest.py depends on gtest's own header being #included // *unconditionally*. Therefore these #includes cannot be moved // inside #if GTEST_HAS_PARAM_TEST. #include #include #include #if GTEST_HAS_PARAM_TEST namespace testing { namespace internal { // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Outputs a message explaining invalid registration of different // fixture class for the same test case. This may happen when // TEST_P macro is used to define two tests with the same name // but in different namespaces. GTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name, const char* file, int line); template class ParamGeneratorInterface; template class ParamGenerator; // Interface for iterating over elements provided by an implementation // of ParamGeneratorInterface. template class ParamIteratorInterface { public: virtual ~ParamIteratorInterface() {} // A pointer to the base generator instance. // Used only for the purposes of iterator comparison // to make sure that two iterators belong to the same generator. virtual const ParamGeneratorInterface* BaseGenerator() const = 0; // Advances iterator to point to the next element // provided by the generator. The caller is responsible // for not calling Advance() on an iterator equal to // BaseGenerator()->End(). virtual void Advance() = 0; // Clones the iterator object. Used for implementing copy semantics // of ParamIterator. virtual ParamIteratorInterface* Clone() const = 0; // Dereferences the current iterator and provides (read-only) access // to the pointed value. It is the caller's responsibility not to call // Current() on an iterator equal to BaseGenerator()->End(). // Used for implementing ParamGenerator::operator*(). virtual const T* Current() const = 0; // Determines whether the given iterator and other point to the same // element in the sequence generated by the generator. // Used for implementing ParamGenerator::operator==(). virtual bool Equals(const ParamIteratorInterface& other) const = 0; }; // Class iterating over elements provided by an implementation of // ParamGeneratorInterface. It wraps ParamIteratorInterface // and implements the const forward iterator concept. template class ParamIterator { public: typedef T value_type; typedef const T& reference; typedef ptrdiff_t difference_type; // ParamIterator assumes ownership of the impl_ pointer. ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {} ParamIterator& operator=(const ParamIterator& other) { if (this != &other) impl_.reset(other.impl_->Clone()); return *this; } const T& operator*() const { return *impl_->Current(); } const T* operator->() const { return impl_->Current(); } // Prefix version of operator++. ParamIterator& operator++() { impl_->Advance(); return *this; } // Postfix version of operator++. ParamIterator operator++(int /*unused*/) { ParamIteratorInterface* clone = impl_->Clone(); impl_->Advance(); return ParamIterator(clone); } bool operator==(const ParamIterator& other) const { return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_); } bool operator!=(const ParamIterator& other) const { return !(*this == other); } private: friend class ParamGenerator; explicit ParamIterator(ParamIteratorInterface* impl) : impl_(impl) {} scoped_ptr > impl_; }; // ParamGeneratorInterface is the binary interface to access generators // defined in other translation units. template class ParamGeneratorInterface { public: typedef T ParamType; virtual ~ParamGeneratorInterface() {} // Generator interface definition virtual ParamIteratorInterface* Begin() const = 0; virtual ParamIteratorInterface* End() const = 0; }; // Wraps ParamGeneratorInterface and provides general generator syntax // compatible with the STL Container concept. // This class implements copy initialization semantics and the contained // ParamGeneratorInterface instance is shared among all copies // of the original object. This is possible because that instance is immutable. template class ParamGenerator { public: typedef ParamIterator iterator; explicit ParamGenerator(ParamGeneratorInterface* impl) : impl_(impl) {} ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {} ParamGenerator& operator=(const ParamGenerator& other) { impl_ = other.impl_; return *this; } iterator begin() const { return iterator(impl_->Begin()); } iterator end() const { return iterator(impl_->End()); } private: ::testing::internal::linked_ptr > impl_; }; // Generates values from a range of two comparable values. Can be used to // generate sequences of user-defined types that implement operator+() and // operator<(). // This class is used in the Range() function. template class RangeGenerator : public ParamGeneratorInterface { public: RangeGenerator(T begin, T end, IncrementT step) : begin_(begin), end_(end), step_(step), end_index_(CalculateEndIndex(begin, end, step)) {} virtual ~RangeGenerator() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, begin_, 0, step_); } virtual ParamIteratorInterface* End() const { return new Iterator(this, end_, end_index_, step_); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, T value, int index, IncrementT step) : base_(base), value_(value), index_(index), step_(step) {} virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } virtual void Advance() { value_ = value_ + step_; index_++; } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const T* Current() const { return &value_; } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const int other_index = CheckedDowncastToActualType(&other)->index_; return index_ == other_index; } private: Iterator(const Iterator& other) : ParamIteratorInterface(), base_(other.base_), value_(other.value_), index_(other.index_), step_(other.step_) {} // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; T value_; int index_; const IncrementT step_; }; // class RangeGenerator::Iterator static int CalculateEndIndex(const T& begin, const T& end, const IncrementT& step) { int end_index = 0; for (T i = begin; i < end; i = i + step) end_index++; return end_index; } // No implementation - assignment is unsupported. void operator=(const RangeGenerator& other); const T begin_; const T end_; const IncrementT step_; // The index for the end() iterator. All the elements in the generated // sequence are indexed (0-based) to aid iterator comparison. const int end_index_; }; // class RangeGenerator // Generates values from a pair of STL-style iterators. Used in the // ValuesIn() function. The elements are copied from the source range // since the source can be located on the stack, and the generator // is likely to persist beyond that stack frame. template class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface { public: template ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end) : container_(begin, end) {} virtual ~ValuesInIteratorRangeGenerator() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, container_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, container_.end()); } private: typedef typename ::std::vector ContainerType; class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, typename ContainerType::const_iterator iterator) : base_(base), iterator_(iterator) {} virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } virtual void Advance() { ++iterator_; value_.reset(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } // We need to use cached value referenced by iterator_ because *iterator_ // can return a temporary object (and of type other then T), so just // having "return &*iterator_;" doesn't work. // value_ is updated here and not in Advance() because Advance() // can advance iterator_ beyond the end of the range, and we cannot // detect that fact. The client code, on the other hand, is // responsible for not calling Current() on an out-of-range iterator. virtual const T* Current() const { if (value_.get() == NULL) value_.reset(new T(*iterator_)); return value_.get(); } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; return iterator_ == CheckedDowncastToActualType(&other)->iterator_; } private: Iterator(const Iterator& other) // The explicit constructor call suppresses a false warning // emitted by gcc when supplied with the -Wextra option. : ParamIteratorInterface(), base_(other.base_), iterator_(other.iterator_) {} const ParamGeneratorInterface* const base_; typename ContainerType::const_iterator iterator_; // A cached value of *iterator_. We keep it here to allow access by // pointer in the wrapping iterator's operator->(). // value_ needs to be mutable to be accessed in Current(). // Use of scoped_ptr helps manage cached value's lifetime, // which is bound by the lifespan of the iterator itself. mutable scoped_ptr value_; }; // class ValuesInIteratorRangeGenerator::Iterator // No implementation - assignment is unsupported. void operator=(const ValuesInIteratorRangeGenerator& other); const ContainerType container_; }; // class ValuesInIteratorRangeGenerator // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Stores a parameter value and later creates tests parameterized with that // value. template class ParameterizedTestFactory : public TestFactoryBase { public: typedef typename TestClass::ParamType ParamType; explicit ParameterizedTestFactory(ParamType parameter) : parameter_(parameter) {} virtual Test* CreateTest() { TestClass::SetParam(¶meter_); return new TestClass(); } private: const ParamType parameter_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory); }; // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // TestMetaFactoryBase is a base class for meta-factories that create // test factories for passing into MakeAndRegisterTestInfo function. template class TestMetaFactoryBase { public: virtual ~TestMetaFactoryBase() {} virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0; }; // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // TestMetaFactory creates test factories for passing into // MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives // ownership of test factory pointer, same factory object cannot be passed // into that method twice. But ParameterizedTestCaseInfo is going to call // it for each Test/Parameter value combination. Thus it needs meta factory // creator class. template class TestMetaFactory : public TestMetaFactoryBase { public: typedef typename TestCase::ParamType ParamType; TestMetaFactory() {} virtual TestFactoryBase* CreateTestFactory(ParamType parameter) { return new ParameterizedTestFactory(parameter); } private: GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory); }; // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // ParameterizedTestCaseInfoBase is a generic interface // to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase // accumulates test information provided by TEST_P macro invocations // and generators provided by INSTANTIATE_TEST_CASE_P macro invocations // and uses that information to register all resulting test instances // in RegisterTests method. The ParameterizeTestCaseRegistry class holds // a collection of pointers to the ParameterizedTestCaseInfo objects // and calls RegisterTests() on each of them when asked. class ParameterizedTestCaseInfoBase { public: virtual ~ParameterizedTestCaseInfoBase() {} // Base part of test case name for display purposes. virtual const String& GetTestCaseName() const = 0; // Test case id to verify identity. virtual TypeId GetTestCaseTypeId() const = 0; // UnitTest class invokes this method to register tests in this // test case right before running them in RUN_ALL_TESTS macro. // This method should not be called more then once on any single // instance of a ParameterizedTestCaseInfoBase derived class. virtual void RegisterTests() = 0; protected: ParameterizedTestCaseInfoBase() {} private: GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase); }; // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // ParameterizedTestCaseInfo accumulates tests obtained from TEST_P // macro invocations for a particular test case and generators // obtained from INSTANTIATE_TEST_CASE_P macro invocations for that // test case. It registers tests with all values generated by all // generators when asked. template class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase { public: // ParamType and GeneratorCreationFunc are private types but are required // for declarations of public methods AddTestPattern() and // AddTestCaseInstantiation(). typedef typename TestCase::ParamType ParamType; // A function that returns an instance of appropriate generator type. typedef ParamGenerator(GeneratorCreationFunc)(); explicit ParameterizedTestCaseInfo(const char* name) : test_case_name_(name) {} // Test case base name for display purposes. virtual const String& GetTestCaseName() const { return test_case_name_; } // Test case id to verify identity. virtual TypeId GetTestCaseTypeId() const { return GetTypeId(); } // TEST_P macro uses AddTestPattern() to record information // about a single test in a LocalTestInfo structure. // test_case_name is the base name of the test case (without invocation // prefix). test_base_name is the name of an individual test without // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is // test case base name and DoBar is test base name. void AddTestPattern(const char* test_case_name, const char* test_base_name, TestMetaFactoryBase* meta_factory) { tests_.push_back(linked_ptr(new TestInfo(test_case_name, test_base_name, meta_factory))); } // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information // about a generator. int AddTestCaseInstantiation(const char* instantiation_name, GeneratorCreationFunc* func, const char* /* file */, int /* line */) { instantiations_.push_back(::std::make_pair(instantiation_name, func)); return 0; // Return value used only to run this method in namespace scope. } // UnitTest class invokes this method to register tests in this test case // test cases right before running tests in RUN_ALL_TESTS macro. // This method should not be called more then once on any single // instance of a ParameterizedTestCaseInfoBase derived class. // UnitTest has a guard to prevent from calling this method more then once. virtual void RegisterTests() { for (typename TestInfoContainer::iterator test_it = tests_.begin(); test_it != tests_.end(); ++test_it) { linked_ptr test_info = *test_it; for (typename InstantiationContainer::iterator gen_it = instantiations_.begin(); gen_it != instantiations_.end(); ++gen_it) { const String& instantiation_name = gen_it->first; ParamGenerator generator((*gen_it->second)()); Message test_case_name_stream; if ( !instantiation_name.empty() ) test_case_name_stream << instantiation_name.c_str() << "/"; test_case_name_stream << test_info->test_case_base_name.c_str(); int i = 0; for (typename ParamGenerator::iterator param_it = generator.begin(); param_it != generator.end(); ++param_it, ++i) { Message test_name_stream; test_name_stream << test_info->test_base_name.c_str() << "/" << i; ::testing::internal::MakeAndRegisterTestInfo( test_case_name_stream.GetString().c_str(), test_name_stream.GetString().c_str(), "", // test_case_comment "", // comment; TODO(vladl@google.com): provide parameter value // representation. GetTestCaseTypeId(), TestCase::SetUpTestCase, TestCase::TearDownTestCase, test_info->test_meta_factory->CreateTestFactory(*param_it)); } // for param_it } // for gen_it } // for test_it } // RegisterTests private: // LocalTestInfo structure keeps information about a single test registered // with TEST_P macro. struct TestInfo { TestInfo(const char* a_test_case_base_name, const char* a_test_base_name, TestMetaFactoryBase* a_test_meta_factory) : test_case_base_name(a_test_case_base_name), test_base_name(a_test_base_name), test_meta_factory(a_test_meta_factory) {} const String test_case_base_name; const String test_base_name; const scoped_ptr > test_meta_factory; }; typedef ::std::vector > TestInfoContainer; // Keeps pairs of // received from INSTANTIATE_TEST_CASE_P macros. typedef ::std::vector > InstantiationContainer; const String test_case_name_; TestInfoContainer tests_; InstantiationContainer instantiations_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo); }; // class ParameterizedTestCaseInfo // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase // classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P // macros use it to locate their corresponding ParameterizedTestCaseInfo // descriptors. class ParameterizedTestCaseRegistry { public: ParameterizedTestCaseRegistry() {} ~ParameterizedTestCaseRegistry() { for (TestCaseInfoContainer::iterator it = test_case_infos_.begin(); it != test_case_infos_.end(); ++it) { delete *it; } } // Looks up or creates and returns a structure containing information about // tests and instantiations of a particular test case. template ParameterizedTestCaseInfo* GetTestCasePatternHolder( const char* test_case_name, const char* file, int line) { ParameterizedTestCaseInfo* typed_test_info = NULL; for (TestCaseInfoContainer::iterator it = test_case_infos_.begin(); it != test_case_infos_.end(); ++it) { if ((*it)->GetTestCaseName() == test_case_name) { if ((*it)->GetTestCaseTypeId() != GetTypeId()) { // Complain about incorrect usage of Google Test facilities // and terminate the program since we cannot guaranty correct // test case setup and tear-down in this case. ReportInvalidTestCaseType(test_case_name, file, line); abort(); } else { // At this point we are sure that the object we found is of the same // type we are looking for, so we downcast it to that type // without further checks. typed_test_info = CheckedDowncastToActualType< ParameterizedTestCaseInfo >(*it); } break; } } if (typed_test_info == NULL) { typed_test_info = new ParameterizedTestCaseInfo(test_case_name); test_case_infos_.push_back(typed_test_info); } return typed_test_info; } void RegisterTests() { for (TestCaseInfoContainer::iterator it = test_case_infos_.begin(); it != test_case_infos_.end(); ++it) { (*it)->RegisterTests(); } } private: typedef ::std::vector TestCaseInfoContainer; TestCaseInfoContainer test_case_infos_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry); }; } // namespace internal } // namespace testing #endif // GTEST_HAS_PARAM_TEST #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/include/gtest/internal/gtest-port.h000066400000000000000000001452441260417502300322450ustar00rootroot00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Authors: wan@google.com (Zhanyong Wan) // // Low-level types and utilities for porting Google Test to various // platforms. They are subject to change without notice. DO NOT USE // THEM IN USER CODE. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ // The user can define the following macros in the build script to // control Google Test's behavior. If the user doesn't define a macro // in this list, Google Test will define it. // // GTEST_HAS_CLONE - Define it to 1/0 to indicate that clone(2) // is/isn't available. // GTEST_HAS_EXCEPTIONS - Define it to 1/0 to indicate that exceptions // are enabled. // GTEST_HAS_GLOBAL_STRING - Define it to 1/0 to indicate that ::string // is/isn't available (some systems define // ::string, which is different to std::string). // GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string // is/isn't available (some systems define // ::wstring, which is different to std::wstring). // GTEST_HAS_PTHREAD - Define it to 1/0 to indicate that // is/isn't available. // GTEST_HAS_RTTI - Define it to 1/0 to indicate that RTTI is/isn't // enabled. // GTEST_HAS_STD_WSTRING - Define it to 1/0 to indicate that // std::wstring does/doesn't work (Google Test can // be used where std::wstring is unavailable). // GTEST_HAS_TR1_TUPLE - Define it to 1/0 to indicate tr1::tuple // is/isn't available. // GTEST_HAS_SEH - Define it to 1/0 to indicate whether the // compiler supports Microsoft's "Structured // Exception Handling". // GTEST_USE_OWN_TR1_TUPLE - Define it to 1/0 to indicate whether Google // Test's own tr1 tuple implementation should be // used. Unused when the user sets // GTEST_HAS_TR1_TUPLE to 0. // GTEST_LINKED_AS_SHARED_LIBRARY // - Define to 1 when compiling tests that use // Google Test as a shared library (known as // DLL on Windows). // GTEST_CREATE_SHARED_LIBRARY // - Define to 1 when compiling Google Test itself // as a shared library. // This header defines the following utilities: // // Macros indicating the current platform (defined to 1 if compiled on // the given platform; otherwise undefined): // GTEST_OS_AIX - IBM AIX // GTEST_OS_CYGWIN - Cygwin // GTEST_OS_LINUX - Linux // GTEST_OS_MAC - Mac OS X // GTEST_OS_SOLARIS - Sun Solaris // GTEST_OS_SYMBIAN - Symbian // GTEST_OS_WINDOWS - Windows (Desktop, MinGW, or Mobile) // GTEST_OS_WINDOWS_DESKTOP - Windows Desktop // GTEST_OS_WINDOWS_MINGW - MinGW // GTEST_OS_WINDOWS_MOBILE - Windows Mobile // GTEST_OS_ZOS - z/OS // // Among the platforms, Cygwin, Linux, Max OS X, and Windows have the // most stable support. Since core members of the Google Test project // don't have access to other platforms, support for them may be less // stable. If you notice any problems on your platform, please notify // googletestframework@googlegroups.com (patches for fixing them are // even more welcome!). // // Note that it is possible that none of the GTEST_OS_* macros are defined. // // Macros indicating available Google Test features (defined to 1 if // the corresponding feature is supported; otherwise undefined): // GTEST_HAS_COMBINE - the Combine() function (for value-parameterized // tests) // GTEST_HAS_DEATH_TEST - death tests // GTEST_HAS_PARAM_TEST - value-parameterized tests // GTEST_HAS_TYPED_TEST - typed tests // GTEST_HAS_TYPED_TEST_P - type-parameterized tests // GTEST_USES_POSIX_RE - enhanced POSIX regex is used. // GTEST_USES_SIMPLE_RE - our own simple regex is used; // the above two are mutually exclusive. // GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ(). // // Macros for basic C++ coding: // GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning. // GTEST_ATTRIBUTE_UNUSED_ - declares that a class' instances or a // variable don't have to be used. // GTEST_DISALLOW_ASSIGN_ - disables operator=. // GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=. // GTEST_MUST_USE_RESULT_ - declares that a function's result must be used. // // Synchronization: // Mutex, MutexLock, ThreadLocal, GetThreadCount() // - synchronization primitives. // GTEST_IS_THREADSAFE - defined to 1 to indicate that the above // synchronization primitives have real implementations // and Google Test is thread-safe; or 0 otherwise. // // Template meta programming: // is_pointer - as in TR1; needed on Symbian and IBM XL C/C++ only. // // Smart pointers: // scoped_ptr - as in TR2. // // Regular expressions: // RE - a simple regular expression class using the POSIX // Extended Regular Expression syntax. Not available on // Windows. // // Logging: // GTEST_LOG_() - logs messages at the specified severity level. // LogToStderr() - directs all log messages to stderr. // FlushInfoLog() - flushes informational log messages. // // Stdout and stderr capturing: // CaptureStdout() - starts capturing stdout. // GetCapturedStdout() - stops capturing stdout and returns the captured // string. // CaptureStderr() - starts capturing stderr. // GetCapturedStderr() - stops capturing stderr and returns the captured // string. // // Integer types: // TypeWithSize - maps an integer to a int type. // Int32, UInt32, Int64, UInt64, TimeInMillis // - integers of known sizes. // BiggestInt - the biggest signed integer type. // // Command-line utilities: // GTEST_FLAG() - references a flag. // GTEST_DECLARE_*() - declares a flag. // GTEST_DEFINE_*() - defines a flag. // GetArgvs() - returns the command line as a vector of strings. // // Environment variable utilities: // GetEnv() - gets the value of an environment variable. // BoolFromGTestEnv() - parses a bool environment variable. // Int32FromGTestEnv() - parses an Int32 environment variable. // StringFromGTestEnv() - parses a string environment variable. #include // For ptrdiff_t #include #include #include #ifndef _WIN32_WCE #include #endif // !_WIN32_WCE #include // NOLINT #include // NOLINT #include // NOLINT #define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com" #define GTEST_FLAG_PREFIX_ "gtest_" #define GTEST_FLAG_PREFIX_DASH_ "gtest-" #define GTEST_FLAG_PREFIX_UPPER_ "GTEST_" #define GTEST_NAME_ "Google Test" #define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/" // Determines the version of gcc that is used to compile this. #ifdef __GNUC__ // 40302 means version 4.3.2. #define GTEST_GCC_VER_ \ (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__) #endif // __GNUC__ // Determines the platform on which Google Test is compiled. #ifdef __CYGWIN__ #define GTEST_OS_CYGWIN 1 #elif defined __SYMBIAN32__ #define GTEST_OS_SYMBIAN 1 #elif defined _WIN32 #define GTEST_OS_WINDOWS 1 #ifdef _WIN32_WCE #define GTEST_OS_WINDOWS_MOBILE 1 #elif defined(__MINGW__) || defined(__MINGW32__) #define GTEST_OS_WINDOWS_MINGW 1 #else #define GTEST_OS_WINDOWS_DESKTOP 1 #endif // _WIN32_WCE #elif defined __APPLE__ #define GTEST_OS_MAC 1 #elif defined __linux__ #define GTEST_OS_LINUX 1 #elif defined __MVS__ #define GTEST_OS_ZOS 1 #elif defined(__sun) && defined(__SVR4) #define GTEST_OS_SOLARIS 1 #elif defined(_AIX) #define GTEST_OS_AIX 1 #endif // __CYGWIN__ #if GTEST_OS_CYGWIN || GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_SYMBIAN || \ GTEST_OS_SOLARIS || GTEST_OS_AIX // On some platforms, needs someone to define size_t, and // won't compile otherwise. We can #include it here as we already // included , which is guaranteed to define size_t through // . #include // NOLINT #include // NOLINT #include // NOLINT #include // NOLINT #include // NOLINT #define GTEST_USES_POSIX_RE 1 #elif GTEST_OS_WINDOWS #if !GTEST_OS_WINDOWS_MOBILE #include // NOLINT #include // NOLINT #endif // is not available on Windows. Use our own simple regex // implementation instead. #define GTEST_USES_SIMPLE_RE 1 #else // may not be available on this platform. Use our own // simple regex implementation instead. #define GTEST_USES_SIMPLE_RE 1 #endif // GTEST_OS_CYGWIN || GTEST_OS_LINUX || GTEST_OS_MAC || // GTEST_OS_SYMBIAN || GTEST_OS_SOLARIS || GTEST_OS_AIX #ifndef GTEST_HAS_EXCEPTIONS // The user didn't tell us whether exceptions are enabled, so we need // to figure it out. #if defined(_MSC_VER) || defined(__BORLANDC__) // MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS // macro to enable exceptions, so we'll do the same. // Assumes that exceptions are enabled by default. #ifndef _HAS_EXCEPTIONS #define _HAS_EXCEPTIONS 1 #endif // _HAS_EXCEPTIONS #define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS #elif defined(__GNUC__) && __EXCEPTIONS // gcc defines __EXCEPTIONS to 1 iff exceptions are enabled. #define GTEST_HAS_EXCEPTIONS 1 #elif defined(__SUNPRO_CC) // Sun Pro CC supports exceptions. However, there is no compile-time way of // detecting whether they are enabled or not. Therefore, we assume that // they are enabled unless the user tells us otherwise. #define GTEST_HAS_EXCEPTIONS 1 #elif defined(__IBMCPP__) && __EXCEPTIONS // xlC defines __EXCEPTIONS to 1 iff exceptions are enabled. #define GTEST_HAS_EXCEPTIONS 1 #else // For other compilers, we assume exceptions are disabled to be // conservative. #define GTEST_HAS_EXCEPTIONS 0 #endif // defined(_MSC_VER) || defined(__BORLANDC__) #endif // GTEST_HAS_EXCEPTIONS #if !defined(GTEST_HAS_STD_STRING) // Even though we don't use this macro any longer, we keep it in case // some clients still depend on it. #define GTEST_HAS_STD_STRING 1 #elif !GTEST_HAS_STD_STRING // The user told us that ::std::string isn't available. #error "Google Test cannot be used where ::std::string isn't available." #endif // !defined(GTEST_HAS_STD_STRING) #ifndef GTEST_HAS_GLOBAL_STRING // The user didn't tell us whether ::string is available, so we need // to figure it out. #define GTEST_HAS_GLOBAL_STRING 0 #endif // GTEST_HAS_GLOBAL_STRING #ifndef GTEST_HAS_STD_WSTRING // The user didn't tell us whether ::std::wstring is available, so we need // to figure it out. // TODO(wan@google.com): uses autoconf to detect whether ::std::wstring // is available. // Cygwin 1.5 and below doesn't support ::std::wstring. // Cygwin 1.7 might add wstring support; this should be updated when clear. // Solaris' libc++ doesn't support it either. #define GTEST_HAS_STD_WSTRING (!(GTEST_OS_CYGWIN || GTEST_OS_SOLARIS)) #endif // GTEST_HAS_STD_WSTRING #ifndef GTEST_HAS_GLOBAL_WSTRING // The user didn't tell us whether ::wstring is available, so we need // to figure it out. #define GTEST_HAS_GLOBAL_WSTRING \ (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING) #endif // GTEST_HAS_GLOBAL_WSTRING // Determines whether RTTI is available. #ifndef GTEST_HAS_RTTI // The user didn't tell us whether RTTI is enabled, so we need to // figure it out. #ifdef _MSC_VER #ifdef _CPPRTTI // MSVC defines this macro iff RTTI is enabled. #define GTEST_HAS_RTTI 1 #else #define GTEST_HAS_RTTI 0 #endif // Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled. #elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302) #ifdef __GXX_RTTI #define GTEST_HAS_RTTI 1 #else #define GTEST_HAS_RTTI 0 #endif // __GXX_RTTI // Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if // both the typeid and dynamic_cast features are present. #elif defined(__IBMCPP__) && (__IBMCPP__ >= 900) #ifdef __RTTI_ALL__ #define GTEST_HAS_RTTI 1 #else #define GTEST_HAS_RTTI 0 #endif #else // For all other compilers, we assume RTTI is enabled. #define GTEST_HAS_RTTI 1 #endif // _MSC_VER #endif // GTEST_HAS_RTTI // It's this header's responsibility to #include when RTTI // is enabled. #if GTEST_HAS_RTTI #include #endif // Determines whether Google Test can use the pthreads library. #ifndef GTEST_HAS_PTHREAD // The user didn't tell us explicitly, so we assume pthreads support is // available on Linux and Mac. // // To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0 // to your compiler flags. #define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC) #endif // GTEST_HAS_PTHREAD // Determines whether Google Test can use tr1/tuple. You can define // this macro to 0 to prevent Google Test from using tuple (any // feature depending on tuple with be disabled in this mode). #ifndef GTEST_HAS_TR1_TUPLE // The user didn't tell us not to do it, so we assume it's OK. #define GTEST_HAS_TR1_TUPLE 1 #endif // GTEST_HAS_TR1_TUPLE // Determines whether Google Test's own tr1 tuple implementation // should be used. #ifndef GTEST_USE_OWN_TR1_TUPLE // The user didn't tell us, so we need to figure it out. // We use our own TR1 tuple if we aren't sure the user has an // implementation of it already. At this time, GCC 4.0.0+ and MSVC // 2010 are the only mainstream compilers that come with a TR1 tuple // implementation. NVIDIA's CUDA NVCC compiler pretends to be GCC by // defining __GNUC__ and friends, but cannot compile GCC's tuple // implementation. MSVC 2008 (9.0) provides TR1 tuple in a 323 MB // Feature Pack download, which we cannot assume the user has. #if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000)) \ || _MSC_VER >= 1600 #define GTEST_USE_OWN_TR1_TUPLE 0 #else #define GTEST_USE_OWN_TR1_TUPLE 1 #endif #endif // GTEST_USE_OWN_TR1_TUPLE // To avoid conditional compilation everywhere, we make it // gtest-port.h's responsibility to #include the header implementing // tr1/tuple. #if GTEST_HAS_TR1_TUPLE #if GTEST_USE_OWN_TR1_TUPLE #include #elif GTEST_OS_SYMBIAN // On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to // use STLport's tuple implementation, which unfortunately doesn't // work as the copy of STLport distributed with Symbian is incomplete. // By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to // use its own tuple implementation. #ifdef BOOST_HAS_TR1_TUPLE #undef BOOST_HAS_TR1_TUPLE #endif // BOOST_HAS_TR1_TUPLE // This prevents , which defines // BOOST_HAS_TR1_TUPLE, from being #included by Boost's . #define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED #include #elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000) // GCC 4.0+ implements tr1/tuple in the header. This does // not conform to the TR1 spec, which requires the header to be . #if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302 // Until version 4.3.2, gcc has a bug that causes , // which is #included by , to not compile when RTTI is // disabled. _TR1_FUNCTIONAL is the header guard for // . Hence the following #define is a hack to prevent // from being included. #define _TR1_FUNCTIONAL 1 #include #undef _TR1_FUNCTIONAL // Allows the user to #include // if he chooses to. #else #include // NOLINT #endif // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302 #else // If the compiler is not GCC 4.0+, we assume the user is using a // spec-conforming TR1 implementation. #include // NOLINT #endif // GTEST_USE_OWN_TR1_TUPLE #endif // GTEST_HAS_TR1_TUPLE // Determines whether clone(2) is supported. // Usually it will only be available on Linux, excluding // Linux on the Itanium architecture. // Also see http://linux.die.net/man/2/clone. #ifndef GTEST_HAS_CLONE // The user didn't tell us, so we need to figure it out. #if GTEST_OS_LINUX && !defined(__ia64__) #define GTEST_HAS_CLONE 1 #else #define GTEST_HAS_CLONE 0 #endif // GTEST_OS_LINUX && !defined(__ia64__) #endif // GTEST_HAS_CLONE // Determines whether to support stream redirection. This is used to test // output correctness and to implement death tests. #if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN #define GTEST_HAS_STREAM_REDIRECTION_ 1 #endif // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN // Determines whether to support death tests. // Google Test does not support death tests for VC 7.1 and earlier as // abort() in a VC 7.1 application compiled as GUI in debug config // pops up a dialog window that cannot be suppressed programmatically. #if (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \ (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \ GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX) #define GTEST_HAS_DEATH_TEST 1 #include // NOLINT #endif // We don't support MSVC 7.1 with exceptions disabled now. Therefore // all the compilers we care about are adequate for supporting // value-parameterized tests. #define GTEST_HAS_PARAM_TEST 1 // Determines whether to support type-driven tests. // Typed tests need and variadic macros, which GCC, VC++ 8.0, // Sun Pro CC, and IBM Visual Age support. #if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \ defined(__IBMCPP__) #define GTEST_HAS_TYPED_TEST 1 #define GTEST_HAS_TYPED_TEST_P 1 #endif // Determines whether to support Combine(). This only makes sense when // value-parameterized tests are enabled. The implementation doesn't // work on Sun Studio since it doesn't understand templated conversion // operators. #if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC) #define GTEST_HAS_COMBINE 1 #endif // Determines whether the system compiler uses UTF-16 for encoding wide strings. #define GTEST_WIDE_STRING_USES_UTF16_ \ (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX) // Defines some utility macros. // The GNU compiler emits a warning if nested "if" statements are followed by // an "else" statement and braces are not used to explicitly disambiguate the // "else" binding. This leads to problems with code like: // // if (gate) // ASSERT_*(condition) << "Some message"; // // The "switch (0) case 0:" idiom is used to suppress this. #ifdef __INTEL_COMPILER #define GTEST_AMBIGUOUS_ELSE_BLOCKER_ #else #define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: // NOLINT #endif // Use this annotation at the end of a struct/class definition to // prevent the compiler from optimizing away instances that are never // used. This is useful when all interesting logic happens inside the // c'tor and / or d'tor. Example: // // struct Foo { // Foo() { ... } // } GTEST_ATTRIBUTE_UNUSED_; // // Also use it after a variable or parameter declaration to tell the // compiler the variable/parameter does not have to be used. #if defined(__GNUC__) && !defined(COMPILER_ICC) #define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused)) #else #define GTEST_ATTRIBUTE_UNUSED_ #endif // A macro to disallow operator= // This should be used in the private: declarations for a class. #define GTEST_DISALLOW_ASSIGN_(type)\ void operator=(type const &) // A macro to disallow copy constructor and operator= // This should be used in the private: declarations for a class. #define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\ type(type const &);\ GTEST_DISALLOW_ASSIGN_(type) // Tell the compiler to warn about unused return values for functions declared // with this macro. The macro should be used on function declarations // following the argument list: // // Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_; #if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC) #define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result)) #else #define GTEST_MUST_USE_RESULT_ #endif // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC // Determine whether the compiler supports Microsoft's Structured Exception // Handling. This is supported by several Windows compilers but generally // does not exist on any other system. #ifndef GTEST_HAS_SEH // The user didn't tell us, so we need to figure it out. #if defined(_MSC_VER) || defined(__BORLANDC__) // These two compilers are known to support SEH. #define GTEST_HAS_SEH 1 #else // Assume no SEH. #define GTEST_HAS_SEH 0 #endif #endif // GTEST_HAS_SEH #ifdef _MSC_VER #if GTEST_LINKED_AS_SHARED_LIBRARY #define GTEST_API_ __declspec(dllimport) #elif GTEST_CREATE_SHARED_LIBRARY #define GTEST_API_ __declspec(dllexport) #endif #endif // _MSC_VER #ifndef GTEST_API_ #define GTEST_API_ #endif namespace testing { class Message; namespace internal { class String; typedef ::std::stringstream StrStream; // A helper for suppressing warnings on constant condition. It just // returns 'condition'. GTEST_API_ bool IsTrue(bool condition); // Defines scoped_ptr. // This implementation of scoped_ptr is PARTIAL - it only contains // enough stuff to satisfy Google Test's need. template class scoped_ptr { public: typedef T element_type; explicit scoped_ptr(T* p = NULL) : ptr_(p) {} ~scoped_ptr() { reset(); } T& operator*() const { return *ptr_; } T* operator->() const { return ptr_; } T* get() const { return ptr_; } T* release() { T* const ptr = ptr_; ptr_ = NULL; return ptr; } void reset(T* p = NULL) { if (p != ptr_) { if (IsTrue(sizeof(T) > 0)) { // Makes sure T is a complete type. delete ptr_; } ptr_ = p; } } private: T* ptr_; GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr); }; // Defines RE. // A simple C++ wrapper for . It uses the POSIX Extended // Regular Expression syntax. class GTEST_API_ RE { public: // A copy constructor is required by the Standard to initialize object // references from r-values. RE(const RE& other) { Init(other.pattern()); } // Constructs an RE from a string. RE(const ::std::string& regex) { Init(regex.c_str()); } // NOLINT #if GTEST_HAS_GLOBAL_STRING RE(const ::string& regex) { Init(regex.c_str()); } // NOLINT #endif // GTEST_HAS_GLOBAL_STRING RE(const char* regex) { Init(regex); } // NOLINT ~RE(); // Returns the string representation of the regex. const char* pattern() const { return pattern_; } // FullMatch(str, re) returns true iff regular expression re matches // the entire str. // PartialMatch(str, re) returns true iff regular expression re // matches a substring of str (including str itself). // // TODO(wan@google.com): make FullMatch() and PartialMatch() work // when str contains NUL characters. static bool FullMatch(const ::std::string& str, const RE& re) { return FullMatch(str.c_str(), re); } static bool PartialMatch(const ::std::string& str, const RE& re) { return PartialMatch(str.c_str(), re); } #if GTEST_HAS_GLOBAL_STRING static bool FullMatch(const ::string& str, const RE& re) { return FullMatch(str.c_str(), re); } static bool PartialMatch(const ::string& str, const RE& re) { return PartialMatch(str.c_str(), re); } #endif // GTEST_HAS_GLOBAL_STRING static bool FullMatch(const char* str, const RE& re); static bool PartialMatch(const char* str, const RE& re); private: void Init(const char* regex); // We use a const char* instead of a string, as Google Test may be used // where string is not available. We also do not use Google Test's own // String type here, in order to simplify dependencies between the // files. const char* pattern_; bool is_valid_; #if GTEST_USES_POSIX_RE regex_t full_regex_; // For FullMatch(). regex_t partial_regex_; // For PartialMatch(). #else // GTEST_USES_SIMPLE_RE const char* full_pattern_; // For FullMatch(); #endif GTEST_DISALLOW_ASSIGN_(RE); }; // Defines logging utilities: // GTEST_LOG_(severity) - logs messages at the specified severity level. The // message itself is streamed into the macro. // LogToStderr() - directs all log messages to stderr. // FlushInfoLog() - flushes informational log messages. enum GTestLogSeverity { GTEST_INFO, GTEST_WARNING, GTEST_ERROR, GTEST_FATAL }; // Formats log entry severity, provides a stream object for streaming the // log message, and terminates the message with a newline when going out of // scope. class GTEST_API_ GTestLog { public: GTestLog(GTestLogSeverity severity, const char* file, int line); // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program. ~GTestLog(); ::std::ostream& GetStream() { return ::std::cerr; } private: const GTestLogSeverity severity_; GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog); }; #define GTEST_LOG_(severity) \ ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \ __FILE__, __LINE__).GetStream() inline void LogToStderr() {} inline void FlushInfoLog() { fflush(NULL); } // INTERNAL IMPLEMENTATION - DO NOT USE. // // GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition // is not satisfied. // Synopsys: // GTEST_CHECK_(boolean_condition); // or // GTEST_CHECK_(boolean_condition) << "Additional message"; // // This checks the condition and if the condition is not satisfied // it prints message about the condition violation, including the // condition itself, plus additional message streamed into it, if any, // and then it aborts the program. It aborts the program irrespective of // whether it is built in the debug mode or not. #define GTEST_CHECK_(condition) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::IsTrue(condition)) \ ; \ else \ GTEST_LOG_(FATAL) << "Condition " #condition " failed. " // An all-mode assert to verify that the given POSIX-style function // call returns 0 (indicating success). Known limitation: this // doesn't expand to a balanced 'if' statement, so enclose the macro // in {} if you need to use it as the only statement in an 'if' // branch. #define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \ if (const int gtest_error = (posix_call)) \ GTEST_LOG_(FATAL) << #posix_call << "failed with error " \ << gtest_error // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Downcasts the pointer of type Base to Derived. // Derived must be a subclass of Base. The parameter MUST // point to a class of type Derived, not any subclass of it. // When RTTI is available, the function performs a runtime // check to enforce this. template Derived* CheckedDowncastToActualType(Base* base) { #if GTEST_HAS_RTTI GTEST_CHECK_(typeid(*base) == typeid(Derived)); return dynamic_cast(base); // NOLINT #else return static_cast(base); // Poor man's downcast. #endif } #if GTEST_HAS_STREAM_REDIRECTION_ // Defines the stderr capturer: // CaptureStdout - starts capturing stdout. // GetCapturedStdout - stops capturing stdout and returns the captured string. // CaptureStderr - starts capturing stderr. // GetCapturedStderr - stops capturing stderr and returns the captured string. // GTEST_API_ void CaptureStdout(); GTEST_API_ String GetCapturedStdout(); GTEST_API_ void CaptureStderr(); GTEST_API_ String GetCapturedStderr(); #endif // GTEST_HAS_STREAM_REDIRECTION_ #if GTEST_HAS_DEATH_TEST // A copy of all command line arguments. Set by InitGoogleTest(). extern ::std::vector g_argvs; // GTEST_HAS_DEATH_TEST implies we have ::std::string. const ::std::vector& GetArgvs(); #endif // GTEST_HAS_DEATH_TEST // Defines synchronization primitives. #if GTEST_HAS_PTHREAD // Sleeps for (roughly) n milli-seconds. This function is only for // testing Google Test's own constructs. Don't use it in user tests, // either directly or indirectly. inline void SleepMilliseconds(int n) { const timespec time = { 0, // 0 seconds. n * 1000L * 1000L, // And n ms. }; nanosleep(&time, NULL); } // Allows a controller thread to pause execution of newly created // threads until notified. Instances of this class must be created // and destroyed in the controller thread. // // This class is only for testing Google Test's own constructs. Do not // use it in user tests, either directly or indirectly. class Notification { public: Notification() : notified_(false) {} // Notifies all threads created with this notification to start. Must // be called from the controller thread. void Notify() { notified_ = true; } // Blocks until the controller thread notifies. Must be called from a test // thread. void WaitForNotification() { while(!notified_) { SleepMilliseconds(10); } } private: volatile bool notified_; GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification); }; // As a C-function, ThreadFuncWithCLinkage cannot be templated itself. // Consequently, it cannot select a correct instantiation of ThreadWithParam // in order to call its Run(). Introducing ThreadWithParamBase as a // non-templated base class for ThreadWithParam allows us to bypass this // problem. class ThreadWithParamBase { public: virtual ~ThreadWithParamBase() {} virtual void Run() = 0; }; // pthread_create() accepts a pointer to a function type with the C linkage. // According to the Standard (7.5/1), function types with different linkages // are different even if they are otherwise identical. Some compilers (for // example, SunStudio) treat them as different types. Since class methods // cannot be defined with C-linkage we need to define a free C-function to // pass into pthread_create(). extern "C" inline void* ThreadFuncWithCLinkage(void* thread) { static_cast(thread)->Run(); return NULL; } // Helper class for testing Google Test's multi-threading constructs. // To use it, write: // // void ThreadFunc(int param) { /* Do things with param */ } // Notification thread_can_start; // ... // // The thread_can_start parameter is optional; you can supply NULL. // ThreadWithParam thread(&ThreadFunc, 5, &thread_can_start); // thread_can_start.Notify(); // // These classes are only for testing Google Test's own constructs. Do // not use them in user tests, either directly or indirectly. template class ThreadWithParam : public ThreadWithParamBase { public: typedef void (*UserThreadFunc)(T); ThreadWithParam( UserThreadFunc func, T param, Notification* thread_can_start) : func_(func), param_(param), thread_can_start_(thread_can_start), finished_(false) { ThreadWithParamBase* const base = this; // The thread can be created only after all fields except thread_ // have been initialized. GTEST_CHECK_POSIX_SUCCESS_( pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base)); } ~ThreadWithParam() { Join(); } void Join() { if (!finished_) { GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0)); finished_ = true; } } virtual void Run() { if (thread_can_start_ != NULL) thread_can_start_->WaitForNotification(); func_(param_); } private: const UserThreadFunc func_; // User-supplied thread function. const T param_; // User-supplied parameter to the thread function. // When non-NULL, used to block execution until the controller thread // notifies. Notification* const thread_can_start_; bool finished_; // true iff we know that the thread function has finished. pthread_t thread_; // The native thread object. GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam); }; // gtest-port.h guarantees to #include when GTEST_HAS_PTHREAD is // true. #include // MutexBase and Mutex implement mutex on pthreads-based platforms. They // are used in conjunction with class MutexLock: // // Mutex mutex; // ... // MutexLock lock(&mutex); // Acquires the mutex and releases it at the end // // of the current scope. // // MutexBase implements behavior for both statically and dynamically // allocated mutexes. Do not use MutexBase directly. Instead, write // the following to define a static mutex: // // GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex); // // You can forward declare a static mutex like this: // // GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex); // // To create a dynamic mutex, just define an object of type Mutex. class MutexBase { public: // Acquires this mutex. void Lock() { GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_)); owner_ = pthread_self(); } // Releases this mutex. void Unlock() { // We don't protect writing to owner_ here, as it's the caller's // responsibility to ensure that the current thread holds the // mutex when this is called. owner_ = 0; GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_)); } // Does nothing if the current thread holds the mutex. Otherwise, crashes // with high probability. void AssertHeld() const { GTEST_CHECK_(owner_ == pthread_self()) << "The current thread is not holding the mutex @" << this; } // A static mutex may be used before main() is entered. It may even // be used before the dynamic initialization stage. Therefore we // must be able to initialize a static mutex object at link time. // This means MutexBase has to be a POD and its member variables // have to be public. public: pthread_mutex_t mutex_; // The underlying pthread mutex. pthread_t owner_; // The thread holding the mutex; 0 means no one holds it. }; // Forward-declares a static mutex. #define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ extern ::testing::internal::MutexBase mutex // Defines and statically (i.e. at link time) initializes a static mutex. #define GTEST_DEFINE_STATIC_MUTEX_(mutex) \ ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, 0 } // The Mutex class can only be used for mutexes created at runtime. It // shares its API with MutexBase otherwise. class Mutex : public MutexBase { public: Mutex() { GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL)); owner_ = 0; } ~Mutex() { GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_)); } private: GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex); }; // We cannot name this class MutexLock as the ctor declaration would // conflict with a macro named MutexLock, which is defined on some // platforms. Hence the typedef trick below. class GTestMutexLock { public: explicit GTestMutexLock(MutexBase* mutex) : mutex_(mutex) { mutex_->Lock(); } ~GTestMutexLock() { mutex_->Unlock(); } private: MutexBase* const mutex_; GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock); }; typedef GTestMutexLock MutexLock; // Helpers for ThreadLocal. // pthread_key_create() requires DeleteThreadLocalValue() to have // C-linkage. Therefore it cannot be templatized to access // ThreadLocal. Hence the need for class // ThreadLocalValueHolderBase. class ThreadLocalValueHolderBase { public: virtual ~ThreadLocalValueHolderBase() {} }; // Called by pthread to delete thread-local data stored by // pthread_setspecific(). extern "C" inline void DeleteThreadLocalValue(void* value_holder) { delete static_cast(value_holder); } // Implements thread-local storage on pthreads-based systems. // // // Thread 1 // ThreadLocal tl(100); // 100 is the default value for each thread. // // // Thread 2 // tl.set(150); // Changes the value for thread 2 only. // EXPECT_EQ(150, tl.get()); // // // Thread 1 // EXPECT_EQ(100, tl.get()); // In thread 1, tl has the original value. // tl.set(200); // EXPECT_EQ(200, tl.get()); // // The template type argument T must have a public copy constructor. // In addition, the default ThreadLocal constructor requires T to have // a public default constructor. // // An object managed for a thread by a ThreadLocal instance is deleted // when the thread exits. Or, if the ThreadLocal instance dies in // that thread, when the ThreadLocal dies. It's the user's // responsibility to ensure that all other threads using a ThreadLocal // have exited when it dies, or the per-thread objects for those // threads will not be deleted. // // Google Test only uses global ThreadLocal objects. That means they // will die after main() has returned. Therefore, no per-thread // object managed by Google Test will be leaked as long as all threads // using Google Test have exited when main() returns. template class ThreadLocal { public: ThreadLocal() : key_(CreateKey()), default_() {} explicit ThreadLocal(const T& value) : key_(CreateKey()), default_(value) {} ~ThreadLocal() { // Destroys the managed object for the current thread, if any. DeleteThreadLocalValue(pthread_getspecific(key_)); // Releases resources associated with the key. This will *not* // delete managed objects for other threads. GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_)); } T* pointer() { return GetOrCreateValue(); } const T* pointer() const { return GetOrCreateValue(); } const T& get() const { return *pointer(); } void set(const T& value) { *pointer() = value; } private: // Holds a value of type T. class ValueHolder : public ThreadLocalValueHolderBase { public: explicit ValueHolder(const T& value) : value_(value) {} T* pointer() { return &value_; } private: T value_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder); }; static pthread_key_t CreateKey() { pthread_key_t key; // When a thread exits, DeleteThreadLocalValue() will be called on // the object managed for that thread. GTEST_CHECK_POSIX_SUCCESS_( pthread_key_create(&key, &DeleteThreadLocalValue)); return key; } T* GetOrCreateValue() const { ThreadLocalValueHolderBase* const holder = static_cast(pthread_getspecific(key_)); if (holder != NULL) { return CheckedDowncastToActualType(holder)->pointer(); } ValueHolder* const new_holder = new ValueHolder(default_); ThreadLocalValueHolderBase* const holder_base = new_holder; GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base)); return new_holder->pointer(); } // A key pthreads uses for looking up per-thread values. const pthread_key_t key_; const T default_; // The default value for each thread. GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal); }; #define GTEST_IS_THREADSAFE 1 #else // GTEST_HAS_PTHREAD // A dummy implementation of synchronization primitives (mutex, lock, // and thread-local variable). Necessary for compiling Google Test where // mutex is not supported - using Google Test in multiple threads is not // supported on such platforms. class Mutex { public: Mutex() {} void AssertHeld() const {} }; #define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ extern ::testing::internal::Mutex mutex #define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex class GTestMutexLock { public: explicit GTestMutexLock(Mutex*) {} // NOLINT }; typedef GTestMutexLock MutexLock; template class ThreadLocal { public: ThreadLocal() : value_() {} explicit ThreadLocal(const T& value) : value_(value) {} T* pointer() { return &value_; } const T* pointer() const { return &value_; } const T& get() const { return value_; } void set(const T& value) { value_ = value; } private: T value_; }; // The above synchronization primitives have dummy implementations. // Therefore Google Test is not thread-safe. #define GTEST_IS_THREADSAFE 0 #endif // GTEST_HAS_PTHREAD // Returns the number of threads running in the process, or 0 to indicate that // we cannot detect it. GTEST_API_ size_t GetThreadCount(); // Passing non-POD classes through ellipsis (...) crashes the ARM // compiler and generates a warning in Sun Studio. The Nokia Symbian // and the IBM XL C/C++ compiler try to instantiate a copy constructor // for objects passed through ellipsis (...), failing for uncopyable // objects. We define this to ensure that only POD is passed through // ellipsis on these systems. #if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC) // We lose support for NULL detection where the compiler doesn't like // passing non-POD classes through ellipsis (...). #define GTEST_ELLIPSIS_NEEDS_POD_ 1 #else #define GTEST_CAN_COMPARE_NULL 1 #endif // The Nokia Symbian and IBM XL C/C++ compilers cannot decide between // const T& and const T* in a function template. These compilers // _can_ decide between class template specializations for T and T*, // so a tr1::type_traits-like is_pointer works. #if defined(__SYMBIAN32__) || defined(__IBMCPP__) #define GTEST_NEEDS_IS_POINTER_ 1 #endif template struct bool_constant { typedef bool_constant type; static const bool value = bool_value; }; template const bool bool_constant::value; typedef bool_constant false_type; typedef bool_constant true_type; template struct is_pointer : public false_type {}; template struct is_pointer : public true_type {}; #if GTEST_OS_WINDOWS #define GTEST_PATH_SEP_ "\\" #define GTEST_HAS_ALT_PATH_SEP_ 1 // The biggest signed integer type the compiler supports. typedef __int64 BiggestInt; #else #define GTEST_PATH_SEP_ "/" #define GTEST_HAS_ALT_PATH_SEP_ 0 typedef long long BiggestInt; // NOLINT #endif // GTEST_OS_WINDOWS // The testing::internal::posix namespace holds wrappers for common // POSIX functions. These wrappers hide the differences between // Windows/MSVC and POSIX systems. Since some compilers define these // standard functions as macros, the wrapper cannot have the same name // as the wrapped function. namespace posix { // Functions with a different name on Windows. #if GTEST_OS_WINDOWS typedef struct _stat StatStruct; #ifdef __BORLANDC__ inline int IsATTY(int fd) { return isatty(fd); } inline int StrCaseCmp(const char* s1, const char* s2) { return stricmp(s1, s2); } inline char* StrDup(const char* src) { return strdup(src); } #else // !__BORLANDC__ #if GTEST_OS_WINDOWS_MOBILE inline int IsATTY(int /* fd */) { return 0; } #else inline int IsATTY(int fd) { return _isatty(fd); } #endif // GTEST_OS_WINDOWS_MOBILE inline int StrCaseCmp(const char* s1, const char* s2) { return _stricmp(s1, s2); } inline char* StrDup(const char* src) { return _strdup(src); } #endif // __BORLANDC__ #if GTEST_OS_WINDOWS_MOBILE inline int FileNo(FILE* file) { return reinterpret_cast(_fileno(file)); } // Stat(), RmDir(), and IsDir() are not needed on Windows CE at this // time and thus not defined there. #else inline int FileNo(FILE* file) { return _fileno(file); } inline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); } inline int RmDir(const char* dir) { return _rmdir(dir); } inline bool IsDir(const StatStruct& st) { return (_S_IFDIR & st.st_mode) != 0; } #endif // GTEST_OS_WINDOWS_MOBILE #else typedef struct stat StatStruct; inline int FileNo(FILE* file) { return fileno(file); } inline int IsATTY(int fd) { return isatty(fd); } inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); } inline int StrCaseCmp(const char* s1, const char* s2) { return strcasecmp(s1, s2); } inline char* StrDup(const char* src) { return strdup(src); } inline int RmDir(const char* dir) { return rmdir(dir); } inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); } #endif // GTEST_OS_WINDOWS // Functions deprecated by MSVC 8.0. #ifdef _MSC_VER // Temporarily disable warning 4996 (deprecated function). #pragma warning(push) #pragma warning(disable:4996) #endif inline const char* StrNCpy(char* dest, const char* src, size_t n) { return strncpy(dest, src, n); } // ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and // StrError() aren't needed on Windows CE at this time and thus not // defined there. #if !GTEST_OS_WINDOWS_MOBILE inline int ChDir(const char* dir) { return chdir(dir); } #endif inline FILE* FOpen(const char* path, const char* mode) { return fopen(path, mode); } #if !GTEST_OS_WINDOWS_MOBILE inline FILE *FReopen(const char* path, const char* mode, FILE* stream) { return freopen(path, mode, stream); } inline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); } #endif inline int FClose(FILE* fp) { return fclose(fp); } #if !GTEST_OS_WINDOWS_MOBILE inline int Read(int fd, void* buf, unsigned int count) { return static_cast(read(fd, buf, count)); } inline int Write(int fd, const void* buf, unsigned int count) { return static_cast(write(fd, buf, count)); } inline int Close(int fd) { return close(fd); } inline const char* StrError(int errnum) { return strerror(errnum); } #endif inline const char* GetEnv(const char* name) { #if GTEST_OS_WINDOWS_MOBILE // We are on Windows CE, which has no environment variables. return NULL; #elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9) // Environment variables which we programmatically clear will be set to the // empty string rather than unset (NULL). Handle that case. const char* const env = getenv(name); return (env != NULL && env[0] != '\0') ? env : NULL; #else return getenv(name); #endif } #ifdef _MSC_VER #pragma warning(pop) // Restores the warning state. #endif #if GTEST_OS_WINDOWS_MOBILE // Windows CE has no C library. The abort() function is used in // several places in Google Test. This implementation provides a reasonable // imitation of standard behaviour. void Abort(); #else inline void Abort() { abort(); } #endif // GTEST_OS_WINDOWS_MOBILE } // namespace posix // The maximum number a BiggestInt can represent. This definition // works no matter BiggestInt is represented in one's complement or // two's complement. // // We cannot rely on numeric_limits in STL, as __int64 and long long // are not part of standard C++ and numeric_limits doesn't need to be // defined for them. const BiggestInt kMaxBiggestInt = ~(static_cast(1) << (8*sizeof(BiggestInt) - 1)); // This template class serves as a compile-time function from size to // type. It maps a size in bytes to a primitive type with that // size. e.g. // // TypeWithSize<4>::UInt // // is typedef-ed to be unsigned int (unsigned integer made up of 4 // bytes). // // Such functionality should belong to STL, but I cannot find it // there. // // Google Test uses this class in the implementation of floating-point // comparison. // // For now it only handles UInt (unsigned int) as that's all Google Test // needs. Other types can be easily added in the future if need // arises. template class TypeWithSize { public: // This prevents the user from using TypeWithSize with incorrect // values of N. typedef void UInt; }; // The specialization for size 4. template <> class TypeWithSize<4> { public: // unsigned int has size 4 in both gcc and MSVC. // // As base/basictypes.h doesn't compile on Windows, we cannot use // uint32, uint64, and etc here. typedef int Int; typedef unsigned int UInt; }; // The specialization for size 8. template <> class TypeWithSize<8> { public: #if GTEST_OS_WINDOWS typedef __int64 Int; typedef unsigned __int64 UInt; #else typedef long long Int; // NOLINT typedef unsigned long long UInt; // NOLINT #endif // GTEST_OS_WINDOWS }; // Integer types of known sizes. typedef TypeWithSize<4>::Int Int32; typedef TypeWithSize<4>::UInt UInt32; typedef TypeWithSize<8>::Int Int64; typedef TypeWithSize<8>::UInt UInt64; typedef TypeWithSize<8>::Int TimeInMillis; // Represents time in milliseconds. // Utilities for command line flags and environment variables. // Macro for referencing flags. #define GTEST_FLAG(name) FLAGS_gtest_##name // Macros for declaring flags. #define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name) #define GTEST_DECLARE_int32_(name) \ GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name) #define GTEST_DECLARE_string_(name) \ GTEST_API_ extern ::testing::internal::String GTEST_FLAG(name) // Macros for defining flags. #define GTEST_DEFINE_bool_(name, default_val, doc) \ GTEST_API_ bool GTEST_FLAG(name) = (default_val) #define GTEST_DEFINE_int32_(name, default_val, doc) \ GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val) #define GTEST_DEFINE_string_(name, default_val, doc) \ GTEST_API_ ::testing::internal::String GTEST_FLAG(name) = (default_val) // Parses 'str' for a 32-bit signed integer. If successful, writes the result // to *value and returns true; otherwise leaves *value unchanged and returns // false. // TODO(chandlerc): Find a better way to refactor flag and environment parsing // out of both gtest-port.cc and gtest.cc to avoid exporting this utility // function. bool ParseInt32(const Message& src_text, const char* str, Int32* value); // Parses a bool/Int32/string from the environment variable // corresponding to the given Google Test flag. bool BoolFromGTestEnv(const char* flag, bool default_val); GTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val); const char* StringFromGTestEnv(const char* flag, const char* default_val); } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/include/gtest/internal/gtest-string.h000066400000000000000000000324111260417502300325560ustar00rootroot00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee) // // The Google C++ Testing Framework (Google Test) // // This header file declares the String class and functions used internally by // Google Test. They are subject to change without notice. They should not used // by code external to Google Test. // // This header file is #included by . // It should not be #included by other files. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ #ifdef __BORLANDC__ // string.h is not guaranteed to provide strcpy on C++ Builder. #include #endif #include #include #include namespace testing { namespace internal { // String - a UTF-8 string class. // // For historic reasons, we don't use std::string. // // TODO(wan@google.com): replace this class with std::string or // implement it in terms of the latter. // // Note that String can represent both NULL and the empty string, // while std::string cannot represent NULL. // // NULL and the empty string are considered different. NULL is less // than anything (including the empty string) except itself. // // This class only provides minimum functionality necessary for // implementing Google Test. We do not intend to implement a full-fledged // string class here. // // Since the purpose of this class is to provide a substitute for // std::string on platforms where it cannot be used, we define a copy // constructor and assignment operators such that we don't need // conditional compilation in a lot of places. // // In order to make the representation efficient, the d'tor of String // is not virtual. Therefore DO NOT INHERIT FROM String. class GTEST_API_ String { public: // Static utility methods // Returns the input enclosed in double quotes if it's not NULL; // otherwise returns "(null)". For example, "\"Hello\"" is returned // for input "Hello". // // This is useful for printing a C string in the syntax of a literal. // // Known issue: escape sequences are not handled yet. static String ShowCStringQuoted(const char* c_str); // Clones a 0-terminated C string, allocating memory using new. The // caller is responsible for deleting the return value using // delete[]. Returns the cloned string, or NULL if the input is // NULL. // // This is different from strdup() in string.h, which allocates // memory using malloc(). static const char* CloneCString(const char* c_str); #if GTEST_OS_WINDOWS_MOBILE // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be // able to pass strings to Win32 APIs on CE we need to convert them // to 'Unicode', UTF-16. // Creates a UTF-16 wide string from the given ANSI string, allocating // memory using new. The caller is responsible for deleting the return // value using delete[]. Returns the wide string, or NULL if the // input is NULL. // // The wide string is created using the ANSI codepage (CP_ACP) to // match the behaviour of the ANSI versions of Win32 calls and the // C runtime. static LPCWSTR AnsiToUtf16(const char* c_str); // Creates an ANSI string from the given wide string, allocating // memory using new. The caller is responsible for deleting the return // value using delete[]. Returns the ANSI string, or NULL if the // input is NULL. // // The returned string is created using the ANSI codepage (CP_ACP) to // match the behaviour of the ANSI versions of Win32 calls and the // C runtime. static const char* Utf16ToAnsi(LPCWSTR utf16_str); #endif // Compares two C strings. Returns true iff they have the same content. // // Unlike strcmp(), this function can handle NULL argument(s). A // NULL C string is considered different to any non-NULL C string, // including the empty string. static bool CStringEquals(const char* lhs, const char* rhs); // Converts a wide C string to a String using the UTF-8 encoding. // NULL will be converted to "(null)". If an error occurred during // the conversion, "(failed to convert from wide string)" is // returned. static String ShowWideCString(const wchar_t* wide_c_str); // Similar to ShowWideCString(), except that this function encloses // the converted string in double quotes. static String ShowWideCStringQuoted(const wchar_t* wide_c_str); // Compares two wide C strings. Returns true iff they have the same // content. // // Unlike wcscmp(), this function can handle NULL argument(s). A // NULL C string is considered different to any non-NULL C string, // including the empty string. static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs); // Compares two C strings, ignoring case. Returns true iff they // have the same content. // // Unlike strcasecmp(), this function can handle NULL argument(s). // A NULL C string is considered different to any non-NULL C string, // including the empty string. static bool CaseInsensitiveCStringEquals(const char* lhs, const char* rhs); // Compares two wide C strings, ignoring case. Returns true iff they // have the same content. // // Unlike wcscasecmp(), this function can handle NULL argument(s). // A NULL C string is considered different to any non-NULL wide C string, // including the empty string. // NB: The implementations on different platforms slightly differ. // On windows, this method uses _wcsicmp which compares according to LC_CTYPE // environment variable. On GNU platform this method uses wcscasecmp // which compares according to LC_CTYPE category of the current locale. // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the // current locale. static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs, const wchar_t* rhs); // Formats a list of arguments to a String, using the same format // spec string as for printf. // // We do not use the StringPrintf class as it is not universally // available. // // The result is limited to 4096 characters (including the tailing // 0). If 4096 characters are not enough to format the input, // "" is returned. static String Format(const char* format, ...); // C'tors // The default c'tor constructs a NULL string. String() : c_str_(NULL), length_(0) {} // Constructs a String by cloning a 0-terminated C string. String(const char* a_c_str) { // NOLINT if (a_c_str == NULL) { c_str_ = NULL; length_ = 0; } else { ConstructNonNull(a_c_str, strlen(a_c_str)); } } // Constructs a String by copying a given number of chars from a // buffer. E.g. String("hello", 3) creates the string "hel", // String("a\0bcd", 4) creates "a\0bc", String(NULL, 0) creates "", // and String(NULL, 1) results in access violation. String(const char* buffer, size_t a_length) { ConstructNonNull(buffer, a_length); } // The copy c'tor creates a new copy of the string. The two // String objects do not share content. String(const String& str) : c_str_(NULL), length_(0) { *this = str; } // D'tor. String is intended to be a final class, so the d'tor // doesn't need to be virtual. ~String() { delete[] c_str_; } // Allows a String to be implicitly converted to an ::std::string or // ::string, and vice versa. Converting a String containing a NULL // pointer to ::std::string or ::string is undefined behavior. // Converting a ::std::string or ::string containing an embedded NUL // character to a String will result in the prefix up to the first // NUL character. String(const ::std::string& str) { ConstructNonNull(str.c_str(), str.length()); } operator ::std::string() const { return ::std::string(c_str(), length()); } #if GTEST_HAS_GLOBAL_STRING String(const ::string& str) { ConstructNonNull(str.c_str(), str.length()); } operator ::string() const { return ::string(c_str(), length()); } #endif // GTEST_HAS_GLOBAL_STRING // Returns true iff this is an empty string (i.e. ""). bool empty() const { return (c_str() != NULL) && (length() == 0); } // Compares this with another String. // Returns < 0 if this is less than rhs, 0 if this is equal to rhs, or > 0 // if this is greater than rhs. int Compare(const String& rhs) const; // Returns true iff this String equals the given C string. A NULL // string and a non-NULL string are considered not equal. bool operator==(const char* a_c_str) const { return Compare(a_c_str) == 0; } // Returns true iff this String is less than the given String. A // NULL string is considered less than "". bool operator<(const String& rhs) const { return Compare(rhs) < 0; } // Returns true iff this String doesn't equal the given C string. A NULL // string and a non-NULL string are considered not equal. bool operator!=(const char* a_c_str) const { return !(*this == a_c_str); } // Returns true iff this String ends with the given suffix. *Any* // String is considered to end with a NULL or empty suffix. bool EndsWith(const char* suffix) const; // Returns true iff this String ends with the given suffix, not considering // case. Any String is considered to end with a NULL or empty suffix. bool EndsWithCaseInsensitive(const char* suffix) const; // Returns the length of the encapsulated string, or 0 if the // string is NULL. size_t length() const { return length_; } // Gets the 0-terminated C string this String object represents. // The String object still owns the string. Therefore the caller // should NOT delete the return value. const char* c_str() const { return c_str_; } // Assigns a C string to this object. Self-assignment works. const String& operator=(const char* a_c_str) { return *this = String(a_c_str); } // Assigns a String object to this object. Self-assignment works. const String& operator=(const String& rhs) { if (this != &rhs) { delete[] c_str_; if (rhs.c_str() == NULL) { c_str_ = NULL; length_ = 0; } else { ConstructNonNull(rhs.c_str(), rhs.length()); } } return *this; } private: // Constructs a non-NULL String from the given content. This // function can only be called when data_ has not been allocated. // ConstructNonNull(NULL, 0) results in an empty string (""). // ConstructNonNull(NULL, non_zero) is undefined behavior. void ConstructNonNull(const char* buffer, size_t a_length) { char* const str = new char[a_length + 1]; memcpy(str, buffer, a_length); str[a_length] = '\0'; c_str_ = str; length_ = a_length; } const char* c_str_; size_t length_; }; // class String // Streams a String to an ostream. Each '\0' character in the String // is replaced with "\\0". inline ::std::ostream& operator<<(::std::ostream& os, const String& str) { if (str.c_str() == NULL) { os << "(null)"; } else { const char* const c_str = str.c_str(); for (size_t i = 0; i != str.length(); i++) { if (c_str[i] == '\0') { os << "\\0"; } else { os << c_str[i]; } } } return os; } // Gets the content of the StrStream's buffer as a String. Each '\0' // character in the buffer is replaced with "\\0". GTEST_API_ String StrStreamToString(StrStream* stream); // Converts a streamable value to a String. A NULL pointer is // converted to "(null)". When the input value is a ::string, // ::std::string, ::wstring, or ::std::wstring object, each NUL // character in it is replaced with "\\0". // Declared here but defined in gtest.h, so that it has access // to the definition of the Message class, required by the ARM // compiler. template String StreamableToString(const T& streamable); } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/include/gtest/internal/gtest-tuple.h000066400000000000000000000667311260417502300324150ustar00rootroot00000000000000// This file was GENERATED by a script. DO NOT EDIT BY HAND!!! // Copyright 2009 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Implements a subset of TR1 tuple needed by Google Test and Google Mock. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ #include // For ::std::pair. // The compiler used in Symbian has a bug that prevents us from declaring the // tuple template as a friend (it complains that tuple is redefined). This // hack bypasses the bug by declaring the members that should otherwise be // private as public. // Sun Studio versions < 12 also have the above bug. #if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590) #define GTEST_DECLARE_TUPLE_AS_FRIEND_ public: #else #define GTEST_DECLARE_TUPLE_AS_FRIEND_ \ template friend class tuple; \ private: #endif // GTEST_n_TUPLE_(T) is the type of an n-tuple. #define GTEST_0_TUPLE_(T) tuple<> #define GTEST_1_TUPLE_(T) tuple #define GTEST_2_TUPLE_(T) tuple #define GTEST_3_TUPLE_(T) tuple #define GTEST_4_TUPLE_(T) tuple #define GTEST_5_TUPLE_(T) tuple #define GTEST_6_TUPLE_(T) tuple #define GTEST_7_TUPLE_(T) tuple #define GTEST_8_TUPLE_(T) tuple #define GTEST_9_TUPLE_(T) tuple #define GTEST_10_TUPLE_(T) tuple // GTEST_n_TYPENAMES_(T) declares a list of n typenames. #define GTEST_0_TYPENAMES_(T) #define GTEST_1_TYPENAMES_(T) typename T##0 #define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1 #define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2 #define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3 #define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3, typename T##4 #define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3, typename T##4, typename T##5 #define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3, typename T##4, typename T##5, typename T##6 #define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3, typename T##4, typename T##5, typename T##6, typename T##7 #define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3, typename T##4, typename T##5, typename T##6, \ typename T##7, typename T##8 #define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3, typename T##4, typename T##5, typename T##6, \ typename T##7, typename T##8, typename T##9 // In theory, defining stuff in the ::std namespace is undefined // behavior. We can do this as we are playing the role of a standard // library vendor. namespace std { namespace tr1 { template class tuple; // Anything in namespace gtest_internal is Google Test's INTERNAL // IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code. namespace gtest_internal { // ByRef::type is T if T is a reference; otherwise it's const T&. template struct ByRef { typedef const T& type; }; // NOLINT template struct ByRef { typedef T& type; }; // NOLINT // A handy wrapper for ByRef. #define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef::type // AddRef::type is T if T is a reference; otherwise it's T&. This // is the same as tr1::add_reference::type. template struct AddRef { typedef T& type; }; // NOLINT template struct AddRef { typedef T& type; }; // NOLINT // A handy wrapper for AddRef. #define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef::type // A helper for implementing get(). template class Get; // A helper for implementing tuple_element. kIndexValid is true // iff k < the number of fields in tuple type T. template struct TupleElement; template struct TupleElement { typedef T0 type; }; template struct TupleElement { typedef T1 type; }; template struct TupleElement { typedef T2 type; }; template struct TupleElement { typedef T3 type; }; template struct TupleElement { typedef T4 type; }; template struct TupleElement { typedef T5 type; }; template struct TupleElement { typedef T6 type; }; template struct TupleElement { typedef T7 type; }; template struct TupleElement { typedef T8 type; }; template struct TupleElement { typedef T9 type; }; } // namespace gtest_internal template <> class tuple<> { public: tuple() {} tuple(const tuple& /* t */) {} tuple& operator=(const tuple& /* t */) { return *this; } }; template class GTEST_1_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_() {} explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {} tuple(const tuple& t) : f0_(t.f0_) {} template tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_1_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) { f0_ = t.f0_; return *this; } T0 f0_; }; template class GTEST_2_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0), f1_(f1) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {} template tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {} template tuple(const ::std::pair& p) : f0_(p.first), f1_(p.second) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_2_TUPLE_(U)& t) { return CopyFrom(t); } template tuple& operator=(const ::std::pair& p) { f0_ = p.first; f1_ = p.second; return *this; } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; return *this; } T0 f0_; T1 f1_; }; template class GTEST_3_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {} template tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_3_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; return *this; } T0 f0_; T1 f1_; T2 f2_; }; template class GTEST_4_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2), f3_(f3) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {} template tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_4_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; }; template class GTEST_5_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_) {} template tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_5_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; f4_ = t.f4_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; T4 f4_; }; template class GTEST_6_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4), f5_(f5) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {} template tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_6_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; f4_ = t.f4_; f5_ = t.f5_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; T4 f4_; T5 f5_; }; template class GTEST_7_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4), f5_(f5), f6_(f6) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {} template tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_7_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; f4_ = t.f4_; f5_ = t.f5_; f6_ = t.f6_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; T4 f4_; T5 f5_; T6 f6_; }; template class GTEST_8_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {} template tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_8_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; f4_ = t.f4_; f5_ = t.f5_; f6_ = t.f6_; f7_ = t.f7_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; T4 f4_; T5 f5_; T6 f6_; T7 f7_; }; template class GTEST_9_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7, GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {} template tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_9_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; f4_ = t.f4_; f5_ = t.f5_; f6_ = t.f6_; f7_ = t.f7_; f8_ = t.f8_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; T4 f4_; T5 f5_; T6 f6_; T7 f7_; T8 f8_; }; template class tuple { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(), f9_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7, GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {} template tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_10_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; f4_ = t.f4_; f5_ = t.f5_; f6_ = t.f6_; f7_ = t.f7_; f8_ = t.f8_; f9_ = t.f9_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; T4 f4_; T5 f5_; T6 f6_; T7 f7_; T8 f8_; T9 f9_; }; // 6.1.3.2 Tuple creation functions. // Known limitations: we don't support passing an // std::tr1::reference_wrapper to make_tuple(). And we don't // implement tie(). inline tuple<> make_tuple() { return tuple<>(); } template inline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) { return GTEST_1_TUPLE_(T)(f0); } template inline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) { return GTEST_2_TUPLE_(T)(f0, f1); } template inline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) { return GTEST_3_TUPLE_(T)(f0, f1, f2); } template inline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3) { return GTEST_4_TUPLE_(T)(f0, f1, f2, f3); } template inline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3, const T4& f4) { return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4); } template inline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3, const T4& f4, const T5& f5) { return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5); } template inline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3, const T4& f4, const T5& f5, const T6& f6) { return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6); } template inline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) { return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7); } template inline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7, const T8& f8) { return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8); } template inline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7, const T8& f8, const T9& f9) { return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9); } // 6.1.3.3 Tuple helper classes. template struct tuple_size; template struct tuple_size { static const int value = 0; }; template struct tuple_size { static const int value = 1; }; template struct tuple_size { static const int value = 2; }; template struct tuple_size { static const int value = 3; }; template struct tuple_size { static const int value = 4; }; template struct tuple_size { static const int value = 5; }; template struct tuple_size { static const int value = 6; }; template struct tuple_size { static const int value = 7; }; template struct tuple_size { static const int value = 8; }; template struct tuple_size { static const int value = 9; }; template struct tuple_size { static const int value = 10; }; template struct tuple_element { typedef typename gtest_internal::TupleElement< k < (tuple_size::value), k, Tuple>::type type; }; #define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element::type // 6.1.3.4 Element access. namespace gtest_internal { template <> class Get<0> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple)) Field(Tuple& t) { return t.f0_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple)) ConstField(const Tuple& t) { return t.f0_; } }; template <> class Get<1> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple)) Field(Tuple& t) { return t.f1_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple)) ConstField(const Tuple& t) { return t.f1_; } }; template <> class Get<2> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple)) Field(Tuple& t) { return t.f2_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple)) ConstField(const Tuple& t) { return t.f2_; } }; template <> class Get<3> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple)) Field(Tuple& t) { return t.f3_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple)) ConstField(const Tuple& t) { return t.f3_; } }; template <> class Get<4> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple)) Field(Tuple& t) { return t.f4_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple)) ConstField(const Tuple& t) { return t.f4_; } }; template <> class Get<5> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple)) Field(Tuple& t) { return t.f5_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple)) ConstField(const Tuple& t) { return t.f5_; } }; template <> class Get<6> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple)) Field(Tuple& t) { return t.f6_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple)) ConstField(const Tuple& t) { return t.f6_; } }; template <> class Get<7> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple)) Field(Tuple& t) { return t.f7_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple)) ConstField(const Tuple& t) { return t.f7_; } }; template <> class Get<8> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple)) Field(Tuple& t) { return t.f8_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple)) ConstField(const Tuple& t) { return t.f8_; } }; template <> class Get<9> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple)) Field(Tuple& t) { return t.f9_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple)) ConstField(const Tuple& t) { return t.f9_; } }; } // namespace gtest_internal template GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T))) get(GTEST_10_TUPLE_(T)& t) { return gtest_internal::Get::Field(t); } template GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T))) get(const GTEST_10_TUPLE_(T)& t) { return gtest_internal::Get::ConstField(t); } // 6.1.3.5 Relational operators // We only implement == and !=, as we don't have a need for the rest yet. namespace gtest_internal { // SameSizeTuplePrefixComparator::Eq(t1, t2) returns true if the // first k fields of t1 equals the first k fields of t2. // SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if // k1 != k2. template struct SameSizeTuplePrefixComparator; template <> struct SameSizeTuplePrefixComparator<0, 0> { template static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) { return true; } }; template struct SameSizeTuplePrefixComparator { template static bool Eq(const Tuple1& t1, const Tuple2& t2) { return SameSizeTuplePrefixComparator::Eq(t1, t2) && ::std::tr1::get(t1) == ::std::tr1::get(t2); } }; } // namespace gtest_internal template inline bool operator==(const GTEST_10_TUPLE_(T)& t, const GTEST_10_TUPLE_(U)& u) { return gtest_internal::SameSizeTuplePrefixComparator< tuple_size::value, tuple_size::value>::Eq(t, u); } template inline bool operator!=(const GTEST_10_TUPLE_(T)& t, const GTEST_10_TUPLE_(U)& u) { return !(t == u); } // 6.1.4 Pairs. // Unimplemented. } // namespace tr1 } // namespace std #undef GTEST_0_TUPLE_ #undef GTEST_1_TUPLE_ #undef GTEST_2_TUPLE_ #undef GTEST_3_TUPLE_ #undef GTEST_4_TUPLE_ #undef GTEST_5_TUPLE_ #undef GTEST_6_TUPLE_ #undef GTEST_7_TUPLE_ #undef GTEST_8_TUPLE_ #undef GTEST_9_TUPLE_ #undef GTEST_10_TUPLE_ #undef GTEST_0_TYPENAMES_ #undef GTEST_1_TYPENAMES_ #undef GTEST_2_TYPENAMES_ #undef GTEST_3_TYPENAMES_ #undef GTEST_4_TYPENAMES_ #undef GTEST_5_TYPENAMES_ #undef GTEST_6_TYPENAMES_ #undef GTEST_7_TYPENAMES_ #undef GTEST_8_TYPENAMES_ #undef GTEST_9_TYPENAMES_ #undef GTEST_10_TYPENAMES_ #undef GTEST_DECLARE_TUPLE_AS_FRIEND_ #undef GTEST_BY_REF_ #undef GTEST_ADD_REF_ #undef GTEST_TUPLE_ELEMENT_ #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ gtest-tuple.h.pump000066400000000000000000000220051260417502300333000ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/include/gtest/internal$$ -*- mode: c++; -*- $var n = 10 $$ Maximum number of tuple fields we want to support. $$ This meta comment fixes auto-indentation in Emacs. }} // Copyright 2009 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Implements a subset of TR1 tuple needed by Google Test and Google Mock. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ #include // For ::std::pair. // The compiler used in Symbian has a bug that prevents us from declaring the // tuple template as a friend (it complains that tuple is redefined). This // hack bypasses the bug by declaring the members that should otherwise be // private as public. // Sun Studio versions < 12 also have the above bug. #if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590) #define GTEST_DECLARE_TUPLE_AS_FRIEND_ public: #else #define GTEST_DECLARE_TUPLE_AS_FRIEND_ \ template friend class tuple; \ private: #endif $range i 0..n-1 $range j 0..n $range k 1..n // GTEST_n_TUPLE_(T) is the type of an n-tuple. #define GTEST_0_TUPLE_(T) tuple<> $for k [[ $range m 0..k-1 $range m2 k..n-1 #define GTEST_$(k)_TUPLE_(T) tuple<$for m, [[T##$m]]$for m2 [[, void]]> ]] // GTEST_n_TYPENAMES_(T) declares a list of n typenames. $for j [[ $range m 0..j-1 #define GTEST_$(j)_TYPENAMES_(T) $for m, [[typename T##$m]] ]] // In theory, defining stuff in the ::std namespace is undefined // behavior. We can do this as we are playing the role of a standard // library vendor. namespace std { namespace tr1 { template <$for i, [[typename T$i = void]]> class tuple; // Anything in namespace gtest_internal is Google Test's INTERNAL // IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code. namespace gtest_internal { // ByRef::type is T if T is a reference; otherwise it's const T&. template struct ByRef { typedef const T& type; }; // NOLINT template struct ByRef { typedef T& type; }; // NOLINT // A handy wrapper for ByRef. #define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef::type // AddRef::type is T if T is a reference; otherwise it's T&. This // is the same as tr1::add_reference::type. template struct AddRef { typedef T& type; }; // NOLINT template struct AddRef { typedef T& type; }; // NOLINT // A handy wrapper for AddRef. #define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef::type // A helper for implementing get(). template class Get; // A helper for implementing tuple_element. kIndexValid is true // iff k < the number of fields in tuple type T. template struct TupleElement; $for i [[ template struct TupleElement [[]] { typedef T$i type; }; ]] } // namespace gtest_internal template <> class tuple<> { public: tuple() {} tuple(const tuple& /* t */) {} tuple& operator=(const tuple& /* t */) { return *this; } }; $for k [[ $range m 0..k-1 template class $if k < n [[GTEST_$(k)_TUPLE_(T)]] $else [[tuple]] { public: template friend class gtest_internal::Get; tuple() : $for m, [[f$(m)_()]] {} explicit tuple($for m, [[GTEST_BY_REF_(T$m) f$m]]) : [[]] $for m, [[f$(m)_(f$m)]] {} tuple(const tuple& t) : $for m, [[f$(m)_(t.f$(m)_)]] {} template tuple(const GTEST_$(k)_TUPLE_(U)& t) : $for m, [[f$(m)_(t.f$(m)_)]] {} $if k == 2 [[ template tuple(const ::std::pair& p) : f0_(p.first), f1_(p.second) {} ]] tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_$(k)_TUPLE_(U)& t) { return CopyFrom(t); } $if k == 2 [[ template tuple& operator=(const ::std::pair& p) { f0_ = p.first; f1_ = p.second; return *this; } ]] GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_$(k)_TUPLE_(U)& t) { $for m [[ f$(m)_ = t.f$(m)_; ]] return *this; } $for m [[ T$m f$(m)_; ]] }; ]] // 6.1.3.2 Tuple creation functions. // Known limitations: we don't support passing an // std::tr1::reference_wrapper to make_tuple(). And we don't // implement tie(). inline tuple<> make_tuple() { return tuple<>(); } $for k [[ $range m 0..k-1 template inline GTEST_$(k)_TUPLE_(T) make_tuple($for m, [[const T$m& f$m]]) { return GTEST_$(k)_TUPLE_(T)($for m, [[f$m]]); } ]] // 6.1.3.3 Tuple helper classes. template struct tuple_size; $for j [[ template struct tuple_size { static const int value = $j; }; ]] template struct tuple_element { typedef typename gtest_internal::TupleElement< k < (tuple_size::value), k, Tuple>::type type; }; #define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element::type // 6.1.3.4 Element access. namespace gtest_internal { $for i [[ template <> class Get<$i> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_($i, Tuple)) Field(Tuple& t) { return t.f$(i)_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_($i, Tuple)) ConstField(const Tuple& t) { return t.f$(i)_; } }; ]] } // namespace gtest_internal template GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_$(n)_TUPLE_(T))) get(GTEST_$(n)_TUPLE_(T)& t) { return gtest_internal::Get::Field(t); } template GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_$(n)_TUPLE_(T))) get(const GTEST_$(n)_TUPLE_(T)& t) { return gtest_internal::Get::ConstField(t); } // 6.1.3.5 Relational operators // We only implement == and !=, as we don't have a need for the rest yet. namespace gtest_internal { // SameSizeTuplePrefixComparator::Eq(t1, t2) returns true if the // first k fields of t1 equals the first k fields of t2. // SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if // k1 != k2. template struct SameSizeTuplePrefixComparator; template <> struct SameSizeTuplePrefixComparator<0, 0> { template static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) { return true; } }; template struct SameSizeTuplePrefixComparator { template static bool Eq(const Tuple1& t1, const Tuple2& t2) { return SameSizeTuplePrefixComparator::Eq(t1, t2) && ::std::tr1::get(t1) == ::std::tr1::get(t2); } }; } // namespace gtest_internal template inline bool operator==(const GTEST_$(n)_TUPLE_(T)& t, const GTEST_$(n)_TUPLE_(U)& u) { return gtest_internal::SameSizeTuplePrefixComparator< tuple_size::value, tuple_size::value>::Eq(t, u); } template inline bool operator!=(const GTEST_$(n)_TUPLE_(T)& t, const GTEST_$(n)_TUPLE_(U)& u) { return !(t == u); } // 6.1.4 Pairs. // Unimplemented. } // namespace tr1 } // namespace std $for j [[ #undef GTEST_$(j)_TUPLE_ ]] $for j [[ #undef GTEST_$(j)_TYPENAMES_ ]] #undef GTEST_DECLARE_TUPLE_AS_FRIEND_ #undef GTEST_BY_REF_ #undef GTEST_ADD_REF_ #undef GTEST_TUPLE_ELEMENT_ #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/include/gtest/internal/gtest-type-util.h000066400000000000000000005520241260417502300332130ustar00rootroot00000000000000// This file was GENERATED by command: // pump.py gtest-type-util.h.pump // DO NOT EDIT BY HAND!!! // Copyright 2008 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Type utilities needed for implementing typed and type-parameterized // tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND! // // Currently we support at most 50 types in a list, and at most 50 // type-parameterized tests in one type-parameterized test case. // Please contact googletestframework@googlegroups.com if you need // more. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ #include #include #if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P // #ifdef __GNUC__ is too general here. It is possible to use gcc without using // libstdc++ (which is where cxxabi.h comes from). #ifdef __GLIBCXX__ #include #endif // __GLIBCXX__ namespace testing { namespace internal { // AssertyTypeEq::type is defined iff T1 and T2 are the same // type. This can be used as a compile-time assertion to ensure that // two types are equal. template struct AssertTypeEq; template struct AssertTypeEq { typedef bool type; }; // GetTypeName() returns a human-readable name of type T. template String GetTypeName() { #if GTEST_HAS_RTTI const char* const name = typeid(T).name(); #ifdef __GLIBCXX__ int status = 0; // gcc's implementation of typeid(T).name() mangles the type name, // so we have to demangle it. char* const readable_name = abi::__cxa_demangle(name, 0, 0, &status); const String name_str(status == 0 ? readable_name : name); free(readable_name); return name_str; #else return name; #endif // __GLIBCXX__ #else return ""; #endif // GTEST_HAS_RTTI } // A unique type used as the default value for the arguments of class // template Types. This allows us to simulate variadic templates // (e.g. Types, Type, and etc), which C++ doesn't // support directly. struct None {}; // The following family of struct and struct templates are used to // represent type lists. In particular, TypesN // represents a type list with N types (T1, T2, ..., and TN) in it. // Except for Types0, every struct in the family has two member types: // Head for the first type in the list, and Tail for the rest of the // list. // The empty type list. struct Types0 {}; // Type lists of length 1, 2, 3, and so on. template struct Types1 { typedef T1 Head; typedef Types0 Tail; }; template struct Types2 { typedef T1 Head; typedef Types1 Tail; }; template struct Types3 { typedef T1 Head; typedef Types2 Tail; }; template struct Types4 { typedef T1 Head; typedef Types3 Tail; }; template struct Types5 { typedef T1 Head; typedef Types4 Tail; }; template struct Types6 { typedef T1 Head; typedef Types5 Tail; }; template struct Types7 { typedef T1 Head; typedef Types6 Tail; }; template struct Types8 { typedef T1 Head; typedef Types7 Tail; }; template struct Types9 { typedef T1 Head; typedef Types8 Tail; }; template struct Types10 { typedef T1 Head; typedef Types9 Tail; }; template struct Types11 { typedef T1 Head; typedef Types10 Tail; }; template struct Types12 { typedef T1 Head; typedef Types11 Tail; }; template struct Types13 { typedef T1 Head; typedef Types12 Tail; }; template struct Types14 { typedef T1 Head; typedef Types13 Tail; }; template struct Types15 { typedef T1 Head; typedef Types14 Tail; }; template struct Types16 { typedef T1 Head; typedef Types15 Tail; }; template struct Types17 { typedef T1 Head; typedef Types16 Tail; }; template struct Types18 { typedef T1 Head; typedef Types17 Tail; }; template struct Types19 { typedef T1 Head; typedef Types18 Tail; }; template struct Types20 { typedef T1 Head; typedef Types19 Tail; }; template struct Types21 { typedef T1 Head; typedef Types20 Tail; }; template struct Types22 { typedef T1 Head; typedef Types21 Tail; }; template struct Types23 { typedef T1 Head; typedef Types22 Tail; }; template struct Types24 { typedef T1 Head; typedef Types23 Tail; }; template struct Types25 { typedef T1 Head; typedef Types24 Tail; }; template struct Types26 { typedef T1 Head; typedef Types25 Tail; }; template struct Types27 { typedef T1 Head; typedef Types26 Tail; }; template struct Types28 { typedef T1 Head; typedef Types27 Tail; }; template struct Types29 { typedef T1 Head; typedef Types28 Tail; }; template struct Types30 { typedef T1 Head; typedef Types29 Tail; }; template struct Types31 { typedef T1 Head; typedef Types30 Tail; }; template struct Types32 { typedef T1 Head; typedef Types31 Tail; }; template struct Types33 { typedef T1 Head; typedef Types32 Tail; }; template struct Types34 { typedef T1 Head; typedef Types33 Tail; }; template struct Types35 { typedef T1 Head; typedef Types34 Tail; }; template struct Types36 { typedef T1 Head; typedef Types35 Tail; }; template struct Types37 { typedef T1 Head; typedef Types36 Tail; }; template struct Types38 { typedef T1 Head; typedef Types37 Tail; }; template struct Types39 { typedef T1 Head; typedef Types38 Tail; }; template struct Types40 { typedef T1 Head; typedef Types39 Tail; }; template struct Types41 { typedef T1 Head; typedef Types40 Tail; }; template struct Types42 { typedef T1 Head; typedef Types41 Tail; }; template struct Types43 { typedef T1 Head; typedef Types42 Tail; }; template struct Types44 { typedef T1 Head; typedef Types43 Tail; }; template struct Types45 { typedef T1 Head; typedef Types44 Tail; }; template struct Types46 { typedef T1 Head; typedef Types45 Tail; }; template struct Types47 { typedef T1 Head; typedef Types46 Tail; }; template struct Types48 { typedef T1 Head; typedef Types47 Tail; }; template struct Types49 { typedef T1 Head; typedef Types48 Tail; }; template struct Types50 { typedef T1 Head; typedef Types49 Tail; }; } // namespace internal // We don't want to require the users to write TypesN<...> directly, // as that would require them to count the length. Types<...> is much // easier to write, but generates horrible messages when there is a // compiler error, as gcc insists on printing out each template // argument, even if it has the default value (this means Types // will appear as Types in the compiler // errors). // // Our solution is to combine the best part of the two approaches: a // user would write Types, and Google Test will translate // that to TypesN internally to make error messages // readable. The translation is done by the 'type' member of the // Types template. template struct Types { typedef internal::Types50 type; }; template <> struct Types { typedef internal::Types0 type; }; template struct Types { typedef internal::Types1 type; }; template struct Types { typedef internal::Types2 type; }; template struct Types { typedef internal::Types3 type; }; template struct Types { typedef internal::Types4 type; }; template struct Types { typedef internal::Types5 type; }; template struct Types { typedef internal::Types6 type; }; template struct Types { typedef internal::Types7 type; }; template struct Types { typedef internal::Types8 type; }; template struct Types { typedef internal::Types9 type; }; template struct Types { typedef internal::Types10 type; }; template struct Types { typedef internal::Types11 type; }; template struct Types { typedef internal::Types12 type; }; template struct Types { typedef internal::Types13 type; }; template struct Types { typedef internal::Types14 type; }; template struct Types { typedef internal::Types15 type; }; template struct Types { typedef internal::Types16 type; }; template struct Types { typedef internal::Types17 type; }; template struct Types { typedef internal::Types18 type; }; template struct Types { typedef internal::Types19 type; }; template struct Types { typedef internal::Types20 type; }; template struct Types { typedef internal::Types21 type; }; template struct Types { typedef internal::Types22 type; }; template struct Types { typedef internal::Types23 type; }; template struct Types { typedef internal::Types24 type; }; template struct Types { typedef internal::Types25 type; }; template struct Types { typedef internal::Types26 type; }; template struct Types { typedef internal::Types27 type; }; template struct Types { typedef internal::Types28 type; }; template struct Types { typedef internal::Types29 type; }; template struct Types { typedef internal::Types30 type; }; template struct Types { typedef internal::Types31 type; }; template struct Types { typedef internal::Types32 type; }; template struct Types { typedef internal::Types33 type; }; template struct Types { typedef internal::Types34 type; }; template struct Types { typedef internal::Types35 type; }; template struct Types { typedef internal::Types36 type; }; template struct Types { typedef internal::Types37 type; }; template struct Types { typedef internal::Types38 type; }; template struct Types { typedef internal::Types39 type; }; template struct Types { typedef internal::Types40 type; }; template struct Types { typedef internal::Types41 type; }; template struct Types { typedef internal::Types42 type; }; template struct Types { typedef internal::Types43 type; }; template struct Types { typedef internal::Types44 type; }; template struct Types { typedef internal::Types45 type; }; template struct Types { typedef internal::Types46 type; }; template struct Types { typedef internal::Types47 type; }; template struct Types { typedef internal::Types48 type; }; template struct Types { typedef internal::Types49 type; }; namespace internal { #define GTEST_TEMPLATE_ template class // The template "selector" struct TemplateSel is used to // represent Tmpl, which must be a class template with one type // parameter, as a type. TemplateSel::Bind::type is defined // as the type Tmpl. This allows us to actually instantiate the // template "selected" by TemplateSel. // // This trick is necessary for simulating typedef for class templates, // which C++ doesn't support directly. template struct TemplateSel { template struct Bind { typedef Tmpl type; }; }; #define GTEST_BIND_(TmplSel, T) \ TmplSel::template Bind::type // A unique struct template used as the default value for the // arguments of class template Templates. This allows us to simulate // variadic templates (e.g. Templates, Templates, // and etc), which C++ doesn't support directly. template struct NoneT {}; // The following family of struct and struct templates are used to // represent template lists. In particular, TemplatesN represents a list of N templates (T1, T2, ..., and TN). Except // for Templates0, every struct in the family has two member types: // Head for the selector of the first template in the list, and Tail // for the rest of the list. // The empty template list. struct Templates0 {}; // Template lists of length 1, 2, 3, and so on. template struct Templates1 { typedef TemplateSel Head; typedef Templates0 Tail; }; template struct Templates2 { typedef TemplateSel Head; typedef Templates1 Tail; }; template struct Templates3 { typedef TemplateSel Head; typedef Templates2 Tail; }; template struct Templates4 { typedef TemplateSel Head; typedef Templates3 Tail; }; template struct Templates5 { typedef TemplateSel Head; typedef Templates4 Tail; }; template struct Templates6 { typedef TemplateSel Head; typedef Templates5 Tail; }; template struct Templates7 { typedef TemplateSel Head; typedef Templates6 Tail; }; template struct Templates8 { typedef TemplateSel Head; typedef Templates7 Tail; }; template struct Templates9 { typedef TemplateSel Head; typedef Templates8 Tail; }; template struct Templates10 { typedef TemplateSel Head; typedef Templates9 Tail; }; template struct Templates11 { typedef TemplateSel Head; typedef Templates10 Tail; }; template struct Templates12 { typedef TemplateSel Head; typedef Templates11 Tail; }; template struct Templates13 { typedef TemplateSel Head; typedef Templates12 Tail; }; template struct Templates14 { typedef TemplateSel Head; typedef Templates13 Tail; }; template struct Templates15 { typedef TemplateSel Head; typedef Templates14 Tail; }; template struct Templates16 { typedef TemplateSel Head; typedef Templates15 Tail; }; template struct Templates17 { typedef TemplateSel Head; typedef Templates16 Tail; }; template struct Templates18 { typedef TemplateSel Head; typedef Templates17 Tail; }; template struct Templates19 { typedef TemplateSel Head; typedef Templates18 Tail; }; template struct Templates20 { typedef TemplateSel Head; typedef Templates19 Tail; }; template struct Templates21 { typedef TemplateSel Head; typedef Templates20 Tail; }; template struct Templates22 { typedef TemplateSel Head; typedef Templates21 Tail; }; template struct Templates23 { typedef TemplateSel Head; typedef Templates22 Tail; }; template struct Templates24 { typedef TemplateSel Head; typedef Templates23 Tail; }; template struct Templates25 { typedef TemplateSel Head; typedef Templates24 Tail; }; template struct Templates26 { typedef TemplateSel Head; typedef Templates25 Tail; }; template struct Templates27 { typedef TemplateSel Head; typedef Templates26 Tail; }; template struct Templates28 { typedef TemplateSel Head; typedef Templates27 Tail; }; template struct Templates29 { typedef TemplateSel Head; typedef Templates28 Tail; }; template struct Templates30 { typedef TemplateSel Head; typedef Templates29 Tail; }; template struct Templates31 { typedef TemplateSel Head; typedef Templates30 Tail; }; template struct Templates32 { typedef TemplateSel Head; typedef Templates31 Tail; }; template struct Templates33 { typedef TemplateSel Head; typedef Templates32 Tail; }; template struct Templates34 { typedef TemplateSel Head; typedef Templates33 Tail; }; template struct Templates35 { typedef TemplateSel Head; typedef Templates34 Tail; }; template struct Templates36 { typedef TemplateSel Head; typedef Templates35 Tail; }; template struct Templates37 { typedef TemplateSel Head; typedef Templates36 Tail; }; template struct Templates38 { typedef TemplateSel Head; typedef Templates37 Tail; }; template struct Templates39 { typedef TemplateSel Head; typedef Templates38 Tail; }; template struct Templates40 { typedef TemplateSel Head; typedef Templates39 Tail; }; template struct Templates41 { typedef TemplateSel Head; typedef Templates40 Tail; }; template struct Templates42 { typedef TemplateSel Head; typedef Templates41 Tail; }; template struct Templates43 { typedef TemplateSel Head; typedef Templates42 Tail; }; template struct Templates44 { typedef TemplateSel Head; typedef Templates43 Tail; }; template struct Templates45 { typedef TemplateSel Head; typedef Templates44 Tail; }; template struct Templates46 { typedef TemplateSel Head; typedef Templates45 Tail; }; template struct Templates47 { typedef TemplateSel Head; typedef Templates46 Tail; }; template struct Templates48 { typedef TemplateSel Head; typedef Templates47 Tail; }; template struct Templates49 { typedef TemplateSel Head; typedef Templates48 Tail; }; template struct Templates50 { typedef TemplateSel Head; typedef Templates49 Tail; }; // We don't want to require the users to write TemplatesN<...> directly, // as that would require them to count the length. Templates<...> is much // easier to write, but generates horrible messages when there is a // compiler error, as gcc insists on printing out each template // argument, even if it has the default value (this means Templates // will appear as Templates in the compiler // errors). // // Our solution is to combine the best part of the two approaches: a // user would write Templates, and Google Test will translate // that to TemplatesN internally to make error messages // readable. The translation is done by the 'type' member of the // Templates template. template struct Templates { typedef Templates50 type; }; template <> struct Templates { typedef Templates0 type; }; template struct Templates { typedef Templates1 type; }; template struct Templates { typedef Templates2 type; }; template struct Templates { typedef Templates3 type; }; template struct Templates { typedef Templates4 type; }; template struct Templates { typedef Templates5 type; }; template struct Templates { typedef Templates6 type; }; template struct Templates { typedef Templates7 type; }; template struct Templates { typedef Templates8 type; }; template struct Templates { typedef Templates9 type; }; template struct Templates { typedef Templates10 type; }; template struct Templates { typedef Templates11 type; }; template struct Templates { typedef Templates12 type; }; template struct Templates { typedef Templates13 type; }; template struct Templates { typedef Templates14 type; }; template struct Templates { typedef Templates15 type; }; template struct Templates { typedef Templates16 type; }; template struct Templates { typedef Templates17 type; }; template struct Templates { typedef Templates18 type; }; template struct Templates { typedef Templates19 type; }; template struct Templates { typedef Templates20 type; }; template struct Templates { typedef Templates21 type; }; template struct Templates { typedef Templates22 type; }; template struct Templates { typedef Templates23 type; }; template struct Templates { typedef Templates24 type; }; template struct Templates { typedef Templates25 type; }; template struct Templates { typedef Templates26 type; }; template struct Templates { typedef Templates27 type; }; template struct Templates { typedef Templates28 type; }; template struct Templates { typedef Templates29 type; }; template struct Templates { typedef Templates30 type; }; template struct Templates { typedef Templates31 type; }; template struct Templates { typedef Templates32 type; }; template struct Templates { typedef Templates33 type; }; template struct Templates { typedef Templates34 type; }; template struct Templates { typedef Templates35 type; }; template struct Templates { typedef Templates36 type; }; template struct Templates { typedef Templates37 type; }; template struct Templates { typedef Templates38 type; }; template struct Templates { typedef Templates39 type; }; template struct Templates { typedef Templates40 type; }; template struct Templates { typedef Templates41 type; }; template struct Templates { typedef Templates42 type; }; template struct Templates { typedef Templates43 type; }; template struct Templates { typedef Templates44 type; }; template struct Templates { typedef Templates45 type; }; template struct Templates { typedef Templates46 type; }; template struct Templates { typedef Templates47 type; }; template struct Templates { typedef Templates48 type; }; template struct Templates { typedef Templates49 type; }; // The TypeList template makes it possible to use either a single type // or a Types<...> list in TYPED_TEST_CASE() and // INSTANTIATE_TYPED_TEST_CASE_P(). template struct TypeList { typedef Types1 type; }; template struct TypeList > { typedef typename Types::type type; }; } // namespace internal } // namespace testing #endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ gtest-type-util.h.pump000066400000000000000000000214671260417502300341160ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/include/gtest/internal$$ -*- mode: c++; -*- $var n = 50 $$ Maximum length of type lists we want to support. // Copyright 2008 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Type utilities needed for implementing typed and type-parameterized // tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND! // // Currently we support at most $n types in a list, and at most $n // type-parameterized tests in one type-parameterized test case. // Please contact googletestframework@googlegroups.com if you need // more. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ #include #include #if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P // #ifdef __GNUC__ is too general here. It is possible to use gcc without using // libstdc++ (which is where cxxabi.h comes from). #ifdef __GLIBCXX__ #include #endif // __GLIBCXX__ namespace testing { namespace internal { // AssertyTypeEq::type is defined iff T1 and T2 are the same // type. This can be used as a compile-time assertion to ensure that // two types are equal. template struct AssertTypeEq; template struct AssertTypeEq { typedef bool type; }; // GetTypeName() returns a human-readable name of type T. template String GetTypeName() { #if GTEST_HAS_RTTI const char* const name = typeid(T).name(); #ifdef __GLIBCXX__ int status = 0; // gcc's implementation of typeid(T).name() mangles the type name, // so we have to demangle it. char* const readable_name = abi::__cxa_demangle(name, 0, 0, &status); const String name_str(status == 0 ? readable_name : name); free(readable_name); return name_str; #else return name; #endif // __GLIBCXX__ #else return ""; #endif // GTEST_HAS_RTTI } // A unique type used as the default value for the arguments of class // template Types. This allows us to simulate variadic templates // (e.g. Types, Type, and etc), which C++ doesn't // support directly. struct None {}; // The following family of struct and struct templates are used to // represent type lists. In particular, TypesN // represents a type list with N types (T1, T2, ..., and TN) in it. // Except for Types0, every struct in the family has two member types: // Head for the first type in the list, and Tail for the rest of the // list. // The empty type list. struct Types0 {}; // Type lists of length 1, 2, 3, and so on. template struct Types1 { typedef T1 Head; typedef Types0 Tail; }; $range i 2..n $for i [[ $range j 1..i $range k 2..i template <$for j, [[typename T$j]]> struct Types$i { typedef T1 Head; typedef Types$(i-1)<$for k, [[T$k]]> Tail; }; ]] } // namespace internal // We don't want to require the users to write TypesN<...> directly, // as that would require them to count the length. Types<...> is much // easier to write, but generates horrible messages when there is a // compiler error, as gcc insists on printing out each template // argument, even if it has the default value (this means Types // will appear as Types in the compiler // errors). // // Our solution is to combine the best part of the two approaches: a // user would write Types, and Google Test will translate // that to TypesN internally to make error messages // readable. The translation is done by the 'type' member of the // Types template. $range i 1..n template <$for i, [[typename T$i = internal::None]]> struct Types { typedef internal::Types$n<$for i, [[T$i]]> type; }; template <> struct Types<$for i, [[internal::None]]> { typedef internal::Types0 type; }; $range i 1..n-1 $for i [[ $range j 1..i $range k i+1..n template <$for j, [[typename T$j]]> struct Types<$for j, [[T$j]]$for k[[, internal::None]]> { typedef internal::Types$i<$for j, [[T$j]]> type; }; ]] namespace internal { #define GTEST_TEMPLATE_ template class // The template "selector" struct TemplateSel is used to // represent Tmpl, which must be a class template with one type // parameter, as a type. TemplateSel::Bind::type is defined // as the type Tmpl. This allows us to actually instantiate the // template "selected" by TemplateSel. // // This trick is necessary for simulating typedef for class templates, // which C++ doesn't support directly. template struct TemplateSel { template struct Bind { typedef Tmpl type; }; }; #define GTEST_BIND_(TmplSel, T) \ TmplSel::template Bind::type // A unique struct template used as the default value for the // arguments of class template Templates. This allows us to simulate // variadic templates (e.g. Templates, Templates, // and etc), which C++ doesn't support directly. template struct NoneT {}; // The following family of struct and struct templates are used to // represent template lists. In particular, TemplatesN represents a list of N templates (T1, T2, ..., and TN). Except // for Templates0, every struct in the family has two member types: // Head for the selector of the first template in the list, and Tail // for the rest of the list. // The empty template list. struct Templates0 {}; // Template lists of length 1, 2, 3, and so on. template struct Templates1 { typedef TemplateSel Head; typedef Templates0 Tail; }; $range i 2..n $for i [[ $range j 1..i $range k 2..i template <$for j, [[GTEST_TEMPLATE_ T$j]]> struct Templates$i { typedef TemplateSel Head; typedef Templates$(i-1)<$for k, [[T$k]]> Tail; }; ]] // We don't want to require the users to write TemplatesN<...> directly, // as that would require them to count the length. Templates<...> is much // easier to write, but generates horrible messages when there is a // compiler error, as gcc insists on printing out each template // argument, even if it has the default value (this means Templates // will appear as Templates in the compiler // errors). // // Our solution is to combine the best part of the two approaches: a // user would write Templates, and Google Test will translate // that to TemplatesN internally to make error messages // readable. The translation is done by the 'type' member of the // Templates template. $range i 1..n template <$for i, [[GTEST_TEMPLATE_ T$i = NoneT]]> struct Templates { typedef Templates$n<$for i, [[T$i]]> type; }; template <> struct Templates<$for i, [[NoneT]]> { typedef Templates0 type; }; $range i 1..n-1 $for i [[ $range j 1..i $range k i+1..n template <$for j, [[GTEST_TEMPLATE_ T$j]]> struct Templates<$for j, [[T$j]]$for k[[, NoneT]]> { typedef Templates$i<$for j, [[T$j]]> type; }; ]] // The TypeList template makes it possible to use either a single type // or a Types<...> list in TYPED_TEST_CASE() and // INSTANTIATE_TYPED_TEST_CASE_P(). template struct TypeList { typedef Types1 type; }; $range i 1..n template <$for i, [[typename T$i]]> struct TypeList > { typedef typename Types<$for i, [[T$i]]>::type type; }; } // namespace internal } // namespace testing #endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/src/000077500000000000000000000000001260417502300241545ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/src/gtest-all.cc000066400000000000000000000041201260417502300263540ustar00rootroot00000000000000// Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: mheule@google.com (Markus Heule) // // Google C++ Testing Framework (Google Test) // // Sometimes it's desirable to build Google Test by compiling a single file. // This file serves this purpose. // This line ensures that gtest.h can be compiled on its own, even // when it's fused. #include // The following lines pull in the real gtest *.cc files. #include "src/gtest.cc" #include "src/gtest-death-test.cc" #include "src/gtest-filepath.cc" #include "src/gtest-port.cc" #include "src/gtest-test-part.cc" #include "src/gtest-typed-test.cc" clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/src/gtest-death-test.cc000066400000000000000000001265231260417502300276620ustar00rootroot00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan), vladl@google.com (Vlad Losev) // // This file implements death tests. #include #include #if GTEST_HAS_DEATH_TEST #if GTEST_OS_MAC #include #endif // GTEST_OS_MAC #include #include #include #include #if GTEST_OS_WINDOWS #include #else #include #include #endif // GTEST_OS_WINDOWS #endif // GTEST_HAS_DEATH_TEST #include #include // Indicates that this translation unit is part of Google Test's // implementation. It must come before gtest-internal-inl.h is // included, or there will be a compiler error. This trick is to // prevent a user from accidentally including gtest-internal-inl.h in // his code. #define GTEST_IMPLEMENTATION_ 1 #include "src/gtest-internal-inl.h" #undef GTEST_IMPLEMENTATION_ namespace testing { // Constants. // The default death test style. static const char kDefaultDeathTestStyle[] = "fast"; GTEST_DEFINE_string_( death_test_style, internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle), "Indicates how to run a death test in a forked child process: " "\"threadsafe\" (child process re-executes the test binary " "from the beginning, running only the specific death test) or " "\"fast\" (child process runs the death test immediately " "after forking)."); GTEST_DEFINE_bool_( death_test_use_fork, internal::BoolFromGTestEnv("death_test_use_fork", false), "Instructs to use fork()/_exit() instead of clone() in death tests. " "Ignored and always uses fork() on POSIX systems where clone() is not " "implemented. Useful when running under valgrind or similar tools if " "those do not support clone(). Valgrind 3.3.1 will just fail if " "it sees an unsupported combination of clone() flags. " "It is not recommended to use this flag w/o valgrind though it will " "work in 99% of the cases. Once valgrind is fixed, this flag will " "most likely be removed."); namespace internal { GTEST_DEFINE_string_( internal_run_death_test, "", "Indicates the file, line number, temporal index of " "the single death test to run, and a file descriptor to " "which a success code may be sent, all separated by " "colons. This flag is specified if and only if the current " "process is a sub-process launched for running a thread-safe " "death test. FOR INTERNAL USE ONLY."); } // namespace internal #if GTEST_HAS_DEATH_TEST // ExitedWithCode constructor. ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) { } // ExitedWithCode function-call operator. bool ExitedWithCode::operator()(int exit_status) const { #if GTEST_OS_WINDOWS return exit_status == exit_code_; #else return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_; #endif // GTEST_OS_WINDOWS } #if !GTEST_OS_WINDOWS // KilledBySignal constructor. KilledBySignal::KilledBySignal(int signum) : signum_(signum) { } // KilledBySignal function-call operator. bool KilledBySignal::operator()(int exit_status) const { return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_; } #endif // !GTEST_OS_WINDOWS namespace internal { // Utilities needed for death tests. // Generates a textual description of a given exit code, in the format // specified by wait(2). static String ExitSummary(int exit_code) { Message m; #if GTEST_OS_WINDOWS m << "Exited with exit status " << exit_code; #else if (WIFEXITED(exit_code)) { m << "Exited with exit status " << WEXITSTATUS(exit_code); } else if (WIFSIGNALED(exit_code)) { m << "Terminated by signal " << WTERMSIG(exit_code); } #ifdef WCOREDUMP if (WCOREDUMP(exit_code)) { m << " (core dumped)"; } #endif #endif // GTEST_OS_WINDOWS return m.GetString(); } // Returns true if exit_status describes a process that was terminated // by a signal, or exited normally with a nonzero exit code. bool ExitedUnsuccessfully(int exit_status) { return !ExitedWithCode(0)(exit_status); } #if !GTEST_OS_WINDOWS // Generates a textual failure message when a death test finds more than // one thread running, or cannot determine the number of threads, prior // to executing the given statement. It is the responsibility of the // caller not to pass a thread_count of 1. static String DeathTestThreadWarning(size_t thread_count) { Message msg; msg << "Death tests use fork(), which is unsafe particularly" << " in a threaded context. For this test, " << GTEST_NAME_ << " "; if (thread_count == 0) msg << "couldn't detect the number of threads."; else msg << "detected " << thread_count << " threads."; return msg.GetString(); } #endif // !GTEST_OS_WINDOWS // Flag characters for reporting a death test that did not die. static const char kDeathTestLived = 'L'; static const char kDeathTestReturned = 'R'; static const char kDeathTestInternalError = 'I'; // An enumeration describing all of the possible ways that a death test // can conclude. DIED means that the process died while executing the // test code; LIVED means that process lived beyond the end of the test // code; and RETURNED means that the test statement attempted a "return," // which is not allowed. IN_PROGRESS means the test has not yet // concluded. enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED }; // Routine for aborting the program which is safe to call from an // exec-style death test child process, in which case the error // message is propagated back to the parent process. Otherwise, the // message is simply printed to stderr. In either case, the program // then exits with status 1. void DeathTestAbort(const String& message) { // On a POSIX system, this function may be called from a threadsafe-style // death test child process, which operates on a very small stack. Use // the heap for any additional non-minuscule memory requirements. const InternalRunDeathTestFlag* const flag = GetUnitTestImpl()->internal_run_death_test_flag(); if (flag != NULL) { FILE* parent = posix::FDOpen(flag->write_fd(), "w"); fputc(kDeathTestInternalError, parent); fprintf(parent, "%s", message.c_str()); fflush(parent); _exit(1); } else { fprintf(stderr, "%s", message.c_str()); fflush(stderr); abort(); } } // A replacement for CHECK that calls DeathTestAbort if the assertion // fails. #define GTEST_DEATH_TEST_CHECK_(expression) \ do { \ if (!::testing::internal::IsTrue(expression)) { \ DeathTestAbort(::testing::internal::String::Format( \ "CHECK failed: File %s, line %d: %s", \ __FILE__, __LINE__, #expression)); \ } \ } while (::testing::internal::AlwaysFalse()) // This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for // evaluating any system call that fulfills two conditions: it must return // -1 on failure, and set errno to EINTR when it is interrupted and // should be tried again. The macro expands to a loop that repeatedly // evaluates the expression as long as it evaluates to -1 and sets // errno to EINTR. If the expression evaluates to -1 but errno is // something other than EINTR, DeathTestAbort is called. #define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \ do { \ int gtest_retval; \ do { \ gtest_retval = (expression); \ } while (gtest_retval == -1 && errno == EINTR); \ if (gtest_retval == -1) { \ DeathTestAbort(::testing::internal::String::Format( \ "CHECK failed: File %s, line %d: %s != -1", \ __FILE__, __LINE__, #expression)); \ } \ } while (::testing::internal::AlwaysFalse()) // Returns the message describing the last system error in errno. String GetLastErrnoDescription() { return String(errno == 0 ? "" : posix::StrError(errno)); } // This is called from a death test parent process to read a failure // message from the death test child process and log it with the FATAL // severity. On Windows, the message is read from a pipe handle. On other // platforms, it is read from a file descriptor. static void FailFromInternalError(int fd) { Message error; char buffer[256]; int num_read; do { while ((num_read = posix::Read(fd, buffer, 255)) > 0) { buffer[num_read] = '\0'; error << buffer; } } while (num_read == -1 && errno == EINTR); if (num_read == 0) { GTEST_LOG_(FATAL) << error.GetString(); } else { const int last_error = errno; GTEST_LOG_(FATAL) << "Error while reading death test internal: " << GetLastErrnoDescription() << " [" << last_error << "]"; } } // Death test constructor. Increments the running death test count // for the current test. DeathTest::DeathTest() { TestInfo* const info = GetUnitTestImpl()->current_test_info(); if (info == NULL) { DeathTestAbort("Cannot run a death test outside of a TEST or " "TEST_F construct"); } } // Creates and returns a death test by dispatching to the current // death test factory. bool DeathTest::Create(const char* statement, const RE* regex, const char* file, int line, DeathTest** test) { return GetUnitTestImpl()->death_test_factory()->Create( statement, regex, file, line, test); } const char* DeathTest::LastMessage() { return last_death_test_message_.c_str(); } void DeathTest::set_last_death_test_message(const String& message) { last_death_test_message_ = message; } String DeathTest::last_death_test_message_; // Provides cross platform implementation for some death functionality. class DeathTestImpl : public DeathTest { protected: DeathTestImpl(const char* a_statement, const RE* a_regex) : statement_(a_statement), regex_(a_regex), spawned_(false), status_(-1), outcome_(IN_PROGRESS), read_fd_(-1), write_fd_(-1) {} // read_fd_ is expected to be closed and cleared by a derived class. ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); } void Abort(AbortReason reason); virtual bool Passed(bool status_ok); const char* statement() const { return statement_; } const RE* regex() const { return regex_; } bool spawned() const { return spawned_; } void set_spawned(bool is_spawned) { spawned_ = is_spawned; } int status() const { return status_; } void set_status(int a_status) { status_ = a_status; } DeathTestOutcome outcome() const { return outcome_; } void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; } int read_fd() const { return read_fd_; } void set_read_fd(int fd) { read_fd_ = fd; } int write_fd() const { return write_fd_; } void set_write_fd(int fd) { write_fd_ = fd; } // Called in the parent process only. Reads the result code of the death // test child process via a pipe, interprets it to set the outcome_ // member, and closes read_fd_. Outputs diagnostics and terminates in // case of unexpected codes. void ReadAndInterpretStatusByte(); private: // The textual content of the code this object is testing. This class // doesn't own this string and should not attempt to delete it. const char* const statement_; // The regular expression which test output must match. DeathTestImpl // doesn't own this object and should not attempt to delete it. const RE* const regex_; // True if the death test child process has been successfully spawned. bool spawned_; // The exit status of the child process. int status_; // How the death test concluded. DeathTestOutcome outcome_; // Descriptor to the read end of the pipe to the child process. It is // always -1 in the child process. The child keeps its write end of the // pipe in write_fd_. int read_fd_; // Descriptor to the child's write end of the pipe to the parent process. // It is always -1 in the parent process. The parent keeps its end of the // pipe in read_fd_. int write_fd_; }; // Called in the parent process only. Reads the result code of the death // test child process via a pipe, interprets it to set the outcome_ // member, and closes read_fd_. Outputs diagnostics and terminates in // case of unexpected codes. void DeathTestImpl::ReadAndInterpretStatusByte() { char flag; int bytes_read; // The read() here blocks until data is available (signifying the // failure of the death test) or until the pipe is closed (signifying // its success), so it's okay to call this in the parent before // the child process has exited. do { bytes_read = posix::Read(read_fd(), &flag, 1); } while (bytes_read == -1 && errno == EINTR); if (bytes_read == 0) { set_outcome(DIED); } else if (bytes_read == 1) { switch (flag) { case kDeathTestReturned: set_outcome(RETURNED); break; case kDeathTestLived: set_outcome(LIVED); break; case kDeathTestInternalError: FailFromInternalError(read_fd()); // Does not return. break; default: GTEST_LOG_(FATAL) << "Death test child process reported " << "unexpected status byte (" << static_cast(flag) << ")"; } } else { GTEST_LOG_(FATAL) << "Read from death test child process failed: " << GetLastErrnoDescription(); } GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd())); set_read_fd(-1); } // Signals that the death test code which should have exited, didn't. // Should be called only in a death test child process. // Writes a status byte to the child's status file descriptor, then // calls _exit(1). void DeathTestImpl::Abort(AbortReason reason) { // The parent process considers the death test to be a failure if // it finds any data in our pipe. So, here we write a single flag byte // to the pipe, then exit. const char status_ch = reason == TEST_DID_NOT_DIE ? kDeathTestLived : kDeathTestReturned; GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1)); GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(write_fd())); _exit(1); // Exits w/o any normal exit hooks (we were supposed to crash) } // Assesses the success or failure of a death test, using both private // members which have previously been set, and one argument: // // Private data members: // outcome: An enumeration describing how the death test // concluded: DIED, LIVED, or RETURNED. The death test fails // in the latter two cases. // status: The exit status of the child process. On *nix, it is in the // in the format specified by wait(2). On Windows, this is the // value supplied to the ExitProcess() API or a numeric code // of the exception that terminated the program. // regex: A regular expression object to be applied to // the test's captured standard error output; the death test // fails if it does not match. // // Argument: // status_ok: true if exit_status is acceptable in the context of // this particular death test, which fails if it is false // // Returns true iff all of the above conditions are met. Otherwise, the // first failing condition, in the order given above, is the one that is // reported. Also sets the last death test message string. bool DeathTestImpl::Passed(bool status_ok) { if (!spawned()) return false; const String error_message = GetCapturedStderr(); bool success = false; Message buffer; buffer << "Death test: " << statement() << "\n"; switch (outcome()) { case LIVED: buffer << " Result: failed to die.\n" << " Error msg: " << error_message; break; case RETURNED: buffer << " Result: illegal return in test statement.\n" << " Error msg: " << error_message; break; case DIED: if (status_ok) { const bool matched = RE::PartialMatch(error_message.c_str(), *regex()); if (matched) { success = true; } else { buffer << " Result: died but not with expected error.\n" << " Expected: " << regex()->pattern() << "\n" << "Actual msg: " << error_message; } } else { buffer << " Result: died but not with expected exit code:\n" << " " << ExitSummary(status()) << "\n"; } break; case IN_PROGRESS: default: GTEST_LOG_(FATAL) << "DeathTest::Passed somehow called before conclusion of test"; } DeathTest::set_last_death_test_message(buffer.GetString()); return success; } #if GTEST_OS_WINDOWS // WindowsDeathTest implements death tests on Windows. Due to the // specifics of starting new processes on Windows, death tests there are // always threadsafe, and Google Test considers the // --gtest_death_test_style=fast setting to be equivalent to // --gtest_death_test_style=threadsafe there. // // A few implementation notes: Like the Linux version, the Windows // implementation uses pipes for child-to-parent communication. But due to // the specifics of pipes on Windows, some extra steps are required: // // 1. The parent creates a communication pipe and stores handles to both // ends of it. // 2. The parent starts the child and provides it with the information // necessary to acquire the handle to the write end of the pipe. // 3. The child acquires the write end of the pipe and signals the parent // using a Windows event. // 4. Now the parent can release the write end of the pipe on its side. If // this is done before step 3, the object's reference count goes down to // 0 and it is destroyed, preventing the child from acquiring it. The // parent now has to release it, or read operations on the read end of // the pipe will not return when the child terminates. // 5. The parent reads child's output through the pipe (outcome code and // any possible error messages) from the pipe, and its stderr and then // determines whether to fail the test. // // Note: to distinguish Win32 API calls from the local method and function // calls, the former are explicitly resolved in the global namespace. // class WindowsDeathTest : public DeathTestImpl { public: WindowsDeathTest(const char* statement, const RE* regex, const char* file, int line) : DeathTestImpl(statement, regex), file_(file), line_(line) {} // All of these virtual functions are inherited from DeathTest. virtual int Wait(); virtual TestRole AssumeRole(); private: // The name of the file in which the death test is located. const char* const file_; // The line number on which the death test is located. const int line_; // Handle to the write end of the pipe to the child process. AutoHandle write_handle_; // Child process handle. AutoHandle child_handle_; // Event the child process uses to signal the parent that it has // acquired the handle to the write end of the pipe. After seeing this // event the parent can release its own handles to make sure its // ReadFile() calls return when the child terminates. AutoHandle event_handle_; }; // Waits for the child in a death test to exit, returning its exit // status, or 0 if no child process exists. As a side effect, sets the // outcome data member. int WindowsDeathTest::Wait() { if (!spawned()) return 0; // Wait until the child either signals that it has acquired the write end // of the pipe or it dies. const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() }; switch (::WaitForMultipleObjects(2, wait_handles, FALSE, // Waits for any of the handles. INFINITE)) { case WAIT_OBJECT_0: case WAIT_OBJECT_0 + 1: break; default: GTEST_DEATH_TEST_CHECK_(false); // Should not get here. } // The child has acquired the write end of the pipe or exited. // We release the handle on our side and continue. write_handle_.Reset(); event_handle_.Reset(); ReadAndInterpretStatusByte(); // Waits for the child process to exit if it haven't already. This // returns immediately if the child has already exited, regardless of // whether previous calls to WaitForMultipleObjects synchronized on this // handle or not. GTEST_DEATH_TEST_CHECK_( WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(), INFINITE)); DWORD status; GTEST_DEATH_TEST_CHECK_(::GetExitCodeProcess(child_handle_.Get(), &status) != FALSE); child_handle_.Reset(); set_status(static_cast(status)); return this->status(); } // The AssumeRole process for a Windows death test. It creates a child // process with the same executable as the current process to run the // death test. The child process is given the --gtest_filter and // --gtest_internal_run_death_test flags such that it knows to run the // current death test only. DeathTest::TestRole WindowsDeathTest::AssumeRole() { const UnitTestImpl* const impl = GetUnitTestImpl(); const InternalRunDeathTestFlag* const flag = impl->internal_run_death_test_flag(); const TestInfo* const info = impl->current_test_info(); const int death_test_index = info->result()->death_test_count(); if (flag != NULL) { // ParseInternalRunDeathTestFlag() has performed all the necessary // processing. set_write_fd(flag->write_fd()); return EXECUTE_TEST; } // WindowsDeathTest uses an anonymous pipe to communicate results of // a death test. SECURITY_ATTRIBUTES handles_are_inheritable = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE }; HANDLE read_handle, write_handle; GTEST_DEATH_TEST_CHECK_( ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable, 0) // Default buffer size. != FALSE); set_read_fd(::_open_osfhandle(reinterpret_cast(read_handle), O_RDONLY)); write_handle_.Reset(write_handle); event_handle_.Reset(::CreateEvent( &handles_are_inheritable, TRUE, // The event will automatically reset to non-signaled state. FALSE, // The initial state is non-signalled. NULL)); // The even is unnamed. GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL); const String filter_flag = String::Format("--%s%s=%s.%s", GTEST_FLAG_PREFIX_, kFilterFlag, info->test_case_name(), info->name()); const String internal_flag = String::Format( "--%s%s=%s|%d|%d|%u|%Iu|%Iu", GTEST_FLAG_PREFIX_, kInternalRunDeathTestFlag, file_, line_, death_test_index, static_cast(::GetCurrentProcessId()), // size_t has the same with as pointers on both 32-bit and 64-bit // Windows platforms. // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx. reinterpret_cast(write_handle), reinterpret_cast(event_handle_.Get())); char executable_path[_MAX_PATH + 1]; // NOLINT GTEST_DEATH_TEST_CHECK_( _MAX_PATH + 1 != ::GetModuleFileNameA(NULL, executable_path, _MAX_PATH)); String command_line = String::Format("%s %s \"%s\"", ::GetCommandLineA(), filter_flag.c_str(), internal_flag.c_str()); DeathTest::set_last_death_test_message(""); CaptureStderr(); // Flush the log buffers since the log streams are shared with the child. FlushInfoLog(); // The child process will share the standard handles with the parent. STARTUPINFOA startup_info; memset(&startup_info, 0, sizeof(STARTUPINFO)); startup_info.dwFlags = STARTF_USESTDHANDLES; startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE); startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE); startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE); PROCESS_INFORMATION process_info; GTEST_DEATH_TEST_CHECK_(::CreateProcessA( executable_path, const_cast(command_line.c_str()), NULL, // Retuned process handle is not inheritable. NULL, // Retuned thread handle is not inheritable. TRUE, // Child inherits all inheritable handles (for write_handle_). 0x0, // Default creation flags. NULL, // Inherit the parent's environment. UnitTest::GetInstance()->original_working_dir(), &startup_info, &process_info) != FALSE); child_handle_.Reset(process_info.hProcess); ::CloseHandle(process_info.hThread); set_spawned(true); return OVERSEE_TEST; } #else // We are not on Windows. // ForkingDeathTest provides implementations for most of the abstract // methods of the DeathTest interface. Only the AssumeRole method is // left undefined. class ForkingDeathTest : public DeathTestImpl { public: ForkingDeathTest(const char* statement, const RE* regex); // All of these virtual functions are inherited from DeathTest. virtual int Wait(); protected: void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; } private: // PID of child process during death test; 0 in the child process itself. pid_t child_pid_; }; // Constructs a ForkingDeathTest. ForkingDeathTest::ForkingDeathTest(const char* a_statement, const RE* a_regex) : DeathTestImpl(a_statement, a_regex), child_pid_(-1) {} // Waits for the child in a death test to exit, returning its exit // status, or 0 if no child process exists. As a side effect, sets the // outcome data member. int ForkingDeathTest::Wait() { if (!spawned()) return 0; ReadAndInterpretStatusByte(); int status_value; GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0)); set_status(status_value); return status_value; } // A concrete death test class that forks, then immediately runs the test // in the child process. class NoExecDeathTest : public ForkingDeathTest { public: NoExecDeathTest(const char* a_statement, const RE* a_regex) : ForkingDeathTest(a_statement, a_regex) { } virtual TestRole AssumeRole(); }; // The AssumeRole process for a fork-and-run death test. It implements a // straightforward fork, with a simple pipe to transmit the status byte. DeathTest::TestRole NoExecDeathTest::AssumeRole() { const size_t thread_count = GetThreadCount(); if (thread_count != 1) { GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count); } int pipe_fd[2]; GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1); DeathTest::set_last_death_test_message(""); CaptureStderr(); // When we fork the process below, the log file buffers are copied, but the // file descriptors are shared. We flush all log files here so that closing // the file descriptors in the child process doesn't throw off the // synchronization between descriptors and buffers in the parent process. // This is as close to the fork as possible to avoid a race condition in case // there are multiple threads running before the death test, and another // thread writes to the log file. FlushInfoLog(); const pid_t child_pid = fork(); GTEST_DEATH_TEST_CHECK_(child_pid != -1); set_child_pid(child_pid); if (child_pid == 0) { GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0])); set_write_fd(pipe_fd[1]); // Redirects all logging to stderr in the child process to prevent // concurrent writes to the log files. We capture stderr in the parent // process and append the child process' output to a log. LogToStderr(); // Event forwarding to the listeners of event listener API mush be shut // down in death test subprocesses. GetUnitTestImpl()->listeners()->SuppressEventForwarding(); return EXECUTE_TEST; } else { GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1])); set_read_fd(pipe_fd[0]); set_spawned(true); return OVERSEE_TEST; } } // A concrete death test class that forks and re-executes the main // program from the beginning, with command-line flags set that cause // only this specific death test to be run. class ExecDeathTest : public ForkingDeathTest { public: ExecDeathTest(const char* a_statement, const RE* a_regex, const char* file, int line) : ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { } virtual TestRole AssumeRole(); private: // The name of the file in which the death test is located. const char* const file_; // The line number on which the death test is located. const int line_; }; // Utility class for accumulating command-line arguments. class Arguments { public: Arguments() { args_.push_back(NULL); } ~Arguments() { for (std::vector::iterator i = args_.begin(); i != args_.end(); ++i) { free(*i); } } void AddArgument(const char* argument) { args_.insert(args_.end() - 1, posix::StrDup(argument)); } template void AddArguments(const ::std::vector& arguments) { for (typename ::std::vector::const_iterator i = arguments.begin(); i != arguments.end(); ++i) { args_.insert(args_.end() - 1, posix::StrDup(i->c_str())); } } char* const* Argv() { return &args_[0]; } private: std::vector args_; }; // A struct that encompasses the arguments to the child process of a // threadsafe-style death test process. struct ExecDeathTestArgs { char* const* argv; // Command-line arguments for the child's call to exec int close_fd; // File descriptor to close; the read end of a pipe }; #if GTEST_OS_MAC inline char** GetEnviron() { // When Google Test is built as a framework on MacOS X, the environ variable // is unavailable. Apple's documentation (man environ) recommends using // _NSGetEnviron() instead. return *_NSGetEnviron(); } #else // Some POSIX platforms expect you to declare environ. extern "C" makes // it reside in the global namespace. extern "C" char** environ; inline char** GetEnviron() { return environ; } #endif // GTEST_OS_MAC // The main function for a threadsafe-style death test child process. // This function is called in a clone()-ed process and thus must avoid // any potentially unsafe operations like malloc or libc functions. static int ExecDeathTestChildMain(void* child_arg) { ExecDeathTestArgs* const args = static_cast(child_arg); GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd)); // We need to execute the test program in the same environment where // it was originally invoked. Therefore we change to the original // working directory first. const char* const original_dir = UnitTest::GetInstance()->original_working_dir(); // We can safely call chdir() as it's a direct system call. if (chdir(original_dir) != 0) { DeathTestAbort(String::Format("chdir(\"%s\") failed: %s", original_dir, GetLastErrnoDescription().c_str())); return EXIT_FAILURE; } // We can safely call execve() as it's a direct system call. We // cannot use execvp() as it's a libc function and thus potentially // unsafe. Since execve() doesn't search the PATH, the user must // invoke the test program via a valid path that contains at least // one path separator. execve(args->argv[0], args->argv, GetEnviron()); DeathTestAbort(String::Format("execve(%s, ...) in %s failed: %s", args->argv[0], original_dir, GetLastErrnoDescription().c_str())); return EXIT_FAILURE; } // Two utility routines that together determine the direction the stack // grows. // This could be accomplished more elegantly by a single recursive // function, but we want to guard against the unlikely possibility of // a smart compiler optimizing the recursion away. bool StackLowerThanAddress(const void* ptr) { int dummy; return &dummy < ptr; } bool StackGrowsDown() { int dummy; return StackLowerThanAddress(&dummy); } // A threadsafe implementation of fork(2) for threadsafe-style death tests // that uses clone(2). It dies with an error message if anything goes // wrong. static pid_t ExecDeathTestFork(char* const* argv, int close_fd) { ExecDeathTestArgs args = { argv, close_fd }; pid_t child_pid = -1; #if GTEST_HAS_CLONE const bool use_fork = GTEST_FLAG(death_test_use_fork); if (!use_fork) { static const bool stack_grows_down = StackGrowsDown(); const size_t stack_size = getpagesize(); // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead. void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED); void* const stack_top = static_cast(stack) + (stack_grows_down ? stack_size : 0); child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args); GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1); } #else const bool use_fork = true; #endif // GTEST_HAS_CLONE if (use_fork && (child_pid = fork()) == 0) { ExecDeathTestChildMain(&args); _exit(0); } GTEST_DEATH_TEST_CHECK_(child_pid != -1); return child_pid; } // The AssumeRole process for a fork-and-exec death test. It re-executes the // main program from the beginning, setting the --gtest_filter // and --gtest_internal_run_death_test flags to cause only the current // death test to be re-run. DeathTest::TestRole ExecDeathTest::AssumeRole() { const UnitTestImpl* const impl = GetUnitTestImpl(); const InternalRunDeathTestFlag* const flag = impl->internal_run_death_test_flag(); const TestInfo* const info = impl->current_test_info(); const int death_test_index = info->result()->death_test_count(); if (flag != NULL) { set_write_fd(flag->write_fd()); return EXECUTE_TEST; } int pipe_fd[2]; GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1); // Clear the close-on-exec flag on the write end of the pipe, lest // it be closed when the child process does an exec: GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1); const String filter_flag = String::Format("--%s%s=%s.%s", GTEST_FLAG_PREFIX_, kFilterFlag, info->test_case_name(), info->name()); const String internal_flag = String::Format("--%s%s=%s|%d|%d|%d", GTEST_FLAG_PREFIX_, kInternalRunDeathTestFlag, file_, line_, death_test_index, pipe_fd[1]); Arguments args; args.AddArguments(GetArgvs()); args.AddArgument(filter_flag.c_str()); args.AddArgument(internal_flag.c_str()); DeathTest::set_last_death_test_message(""); CaptureStderr(); // See the comment in NoExecDeathTest::AssumeRole for why the next line // is necessary. FlushInfoLog(); const pid_t child_pid = ExecDeathTestFork(args.Argv(), pipe_fd[0]); GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1])); set_child_pid(child_pid); set_read_fd(pipe_fd[0]); set_spawned(true); return OVERSEE_TEST; } #endif // !GTEST_OS_WINDOWS // Creates a concrete DeathTest-derived class that depends on the // --gtest_death_test_style flag, and sets the pointer pointed to // by the "test" argument to its address. If the test should be // skipped, sets that pointer to NULL. Returns true, unless the // flag is set to an invalid value. bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex, const char* file, int line, DeathTest** test) { UnitTestImpl* const impl = GetUnitTestImpl(); const InternalRunDeathTestFlag* const flag = impl->internal_run_death_test_flag(); const int death_test_index = impl->current_test_info() ->increment_death_test_count(); if (flag != NULL) { if (death_test_index > flag->index()) { DeathTest::set_last_death_test_message(String::Format( "Death test count (%d) somehow exceeded expected maximum (%d)", death_test_index, flag->index())); return false; } if (!(flag->file() == file && flag->line() == line && flag->index() == death_test_index)) { *test = NULL; return true; } } #if GTEST_OS_WINDOWS if (GTEST_FLAG(death_test_style) == "threadsafe" || GTEST_FLAG(death_test_style) == "fast") { *test = new WindowsDeathTest(statement, regex, file, line); } #else if (GTEST_FLAG(death_test_style) == "threadsafe") { *test = new ExecDeathTest(statement, regex, file, line); } else if (GTEST_FLAG(death_test_style) == "fast") { *test = new NoExecDeathTest(statement, regex); } #endif // GTEST_OS_WINDOWS else { // NOLINT - this is more readable than unbalanced brackets inside #if. DeathTest::set_last_death_test_message(String::Format( "Unknown death test style \"%s\" encountered", GTEST_FLAG(death_test_style).c_str())); return false; } return true; } // Splits a given string on a given delimiter, populating a given // vector with the fields. GTEST_HAS_DEATH_TEST implies that we have // ::std::string, so we can use it here. static void SplitString(const ::std::string& str, char delimiter, ::std::vector< ::std::string>* dest) { ::std::vector< ::std::string> parsed; ::std::string::size_type pos = 0; while (::testing::internal::AlwaysTrue()) { const ::std::string::size_type colon = str.find(delimiter, pos); if (colon == ::std::string::npos) { parsed.push_back(str.substr(pos)); break; } else { parsed.push_back(str.substr(pos, colon - pos)); pos = colon + 1; } } dest->swap(parsed); } #if GTEST_OS_WINDOWS // Recreates the pipe and event handles from the provided parameters, // signals the event, and returns a file descriptor wrapped around the pipe // handle. This function is called in the child process only. int GetStatusFileDescriptor(unsigned int parent_process_id, size_t write_handle_as_size_t, size_t event_handle_as_size_t) { AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE, FALSE, // Non-inheritable. parent_process_id)); if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) { DeathTestAbort(String::Format("Unable to open parent process %u", parent_process_id)); } // TODO(vladl@google.com): Replace the following check with a // compile-time assertion when available. GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t)); const HANDLE write_handle = reinterpret_cast(write_handle_as_size_t); HANDLE dup_write_handle; // The newly initialized handle is accessible only in in the parent // process. To obtain one accessible within the child, we need to use // DuplicateHandle. if (!::DuplicateHandle(parent_process_handle.Get(), write_handle, ::GetCurrentProcess(), &dup_write_handle, 0x0, // Requested privileges ignored since // DUPLICATE_SAME_ACCESS is used. FALSE, // Request non-inheritable handler. DUPLICATE_SAME_ACCESS)) { DeathTestAbort(String::Format( "Unable to duplicate the pipe handle %Iu from the parent process %u", write_handle_as_size_t, parent_process_id)); } const HANDLE event_handle = reinterpret_cast(event_handle_as_size_t); HANDLE dup_event_handle; if (!::DuplicateHandle(parent_process_handle.Get(), event_handle, ::GetCurrentProcess(), &dup_event_handle, 0x0, FALSE, DUPLICATE_SAME_ACCESS)) { DeathTestAbort(String::Format( "Unable to duplicate the event handle %Iu from the parent process %u", event_handle_as_size_t, parent_process_id)); } const int write_fd = ::_open_osfhandle(reinterpret_cast(dup_write_handle), O_APPEND); if (write_fd == -1) { DeathTestAbort(String::Format( "Unable to convert pipe handle %Iu to a file descriptor", write_handle_as_size_t)); } // Signals the parent that the write end of the pipe has been acquired // so the parent can release its own write end. ::SetEvent(dup_event_handle); return write_fd; } #endif // GTEST_OS_WINDOWS // Returns a newly created InternalRunDeathTestFlag object with fields // initialized from the GTEST_FLAG(internal_run_death_test) flag if // the flag is specified; otherwise returns NULL. InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() { if (GTEST_FLAG(internal_run_death_test) == "") return NULL; // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we // can use it here. int line = -1; int index = -1; ::std::vector< ::std::string> fields; SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields); int write_fd = -1; #if GTEST_OS_WINDOWS unsigned int parent_process_id = 0; size_t write_handle_as_size_t = 0; size_t event_handle_as_size_t = 0; if (fields.size() != 6 || !ParseNaturalNumber(fields[1], &line) || !ParseNaturalNumber(fields[2], &index) || !ParseNaturalNumber(fields[3], &parent_process_id) || !ParseNaturalNumber(fields[4], &write_handle_as_size_t) || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) { DeathTestAbort(String::Format( "Bad --gtest_internal_run_death_test flag: %s", GTEST_FLAG(internal_run_death_test).c_str())); } write_fd = GetStatusFileDescriptor(parent_process_id, write_handle_as_size_t, event_handle_as_size_t); #else if (fields.size() != 4 || !ParseNaturalNumber(fields[1], &line) || !ParseNaturalNumber(fields[2], &index) || !ParseNaturalNumber(fields[3], &write_fd)) { DeathTestAbort(String::Format( "Bad --gtest_internal_run_death_test flag: %s", GTEST_FLAG(internal_run_death_test).c_str())); } #endif // GTEST_OS_WINDOWS return new InternalRunDeathTestFlag(fields[0], line, index, write_fd); } } // namespace internal #endif // GTEST_HAS_DEATH_TEST } // namespace testing clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/src/gtest-filepath.cc000066400000000000000000000336071260417502300274140ustar00rootroot00000000000000// Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Authors: keith.ray@gmail.com (Keith Ray) #include #include #include #if GTEST_OS_WINDOWS_MOBILE #include #elif GTEST_OS_WINDOWS #include #include #elif GTEST_OS_SYMBIAN // Symbian OpenC has PATH_MAX in sys/syslimits.h #include #else #include #include // Some Linux distributions define PATH_MAX here. #endif // GTEST_OS_WINDOWS_MOBILE #if GTEST_OS_WINDOWS #define GTEST_PATH_MAX_ _MAX_PATH #elif defined(PATH_MAX) #define GTEST_PATH_MAX_ PATH_MAX #elif defined(_XOPEN_PATH_MAX) #define GTEST_PATH_MAX_ _XOPEN_PATH_MAX #else #define GTEST_PATH_MAX_ _POSIX_PATH_MAX #endif // GTEST_OS_WINDOWS #include namespace testing { namespace internal { #if GTEST_OS_WINDOWS // On Windows, '\\' is the standard path separator, but many tools and the // Windows API also accept '/' as an alternate path separator. Unless otherwise // noted, a file path can contain either kind of path separators, or a mixture // of them. const char kPathSeparator = '\\'; const char kAlternatePathSeparator = '/'; const char kPathSeparatorString[] = "\\"; const char kAlternatePathSeparatorString[] = "/"; #if GTEST_OS_WINDOWS_MOBILE // Windows CE doesn't have a current directory. You should not use // the current directory in tests on Windows CE, but this at least // provides a reasonable fallback. const char kCurrentDirectoryString[] = "\\"; // Windows CE doesn't define INVALID_FILE_ATTRIBUTES const DWORD kInvalidFileAttributes = 0xffffffff; #else const char kCurrentDirectoryString[] = ".\\"; #endif // GTEST_OS_WINDOWS_MOBILE #else const char kPathSeparator = '/'; const char kPathSeparatorString[] = "/"; const char kCurrentDirectoryString[] = "./"; #endif // GTEST_OS_WINDOWS // Returns whether the given character is a valid path separator. static bool IsPathSeparator(char c) { #if GTEST_HAS_ALT_PATH_SEP_ return (c == kPathSeparator) || (c == kAlternatePathSeparator); #else return c == kPathSeparator; #endif } // Returns the current working directory, or "" if unsuccessful. FilePath FilePath::GetCurrentDir() { #if GTEST_OS_WINDOWS_MOBILE // Windows CE doesn't have a current directory, so we just return // something reasonable. return FilePath(kCurrentDirectoryString); #elif GTEST_OS_WINDOWS char cwd[GTEST_PATH_MAX_ + 1] = { '\0' }; return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd); #else char cwd[GTEST_PATH_MAX_ + 1] = { '\0' }; return FilePath(getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd); #endif // GTEST_OS_WINDOWS_MOBILE } // Returns a copy of the FilePath with the case-insensitive extension removed. // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns // FilePath("dir/file"). If a case-insensitive extension is not // found, returns a copy of the original FilePath. FilePath FilePath::RemoveExtension(const char* extension) const { String dot_extension(String::Format(".%s", extension)); if (pathname_.EndsWithCaseInsensitive(dot_extension.c_str())) { return FilePath(String(pathname_.c_str(), pathname_.length() - 4)); } return *this; } // Returns a pointer to the last occurence of a valid path separator in // the FilePath. On Windows, for example, both '/' and '\' are valid path // separators. Returns NULL if no path separator was found. const char* FilePath::FindLastPathSeparator() const { const char* const last_sep = strrchr(c_str(), kPathSeparator); #if GTEST_HAS_ALT_PATH_SEP_ const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator); // Comparing two pointers of which only one is NULL is undefined. if (last_alt_sep != NULL && (last_sep == NULL || last_alt_sep > last_sep)) { return last_alt_sep; } #endif return last_sep; } // Returns a copy of the FilePath with the directory part removed. // Example: FilePath("path/to/file").RemoveDirectoryName() returns // FilePath("file"). If there is no directory part ("just_a_file"), it returns // the FilePath unmodified. If there is no file part ("just_a_dir/") it // returns an empty FilePath (""). // On Windows platform, '\' is the path separator, otherwise it is '/'. FilePath FilePath::RemoveDirectoryName() const { const char* const last_sep = FindLastPathSeparator(); return last_sep ? FilePath(String(last_sep + 1)) : *this; } // RemoveFileName returns the directory path with the filename removed. // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/". // If the FilePath is "a_file" or "/a_file", RemoveFileName returns // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does // not have a file, like "just/a/dir/", it returns the FilePath unmodified. // On Windows platform, '\' is the path separator, otherwise it is '/'. FilePath FilePath::RemoveFileName() const { const char* const last_sep = FindLastPathSeparator(); String dir; if (last_sep) { dir = String(c_str(), last_sep + 1 - c_str()); } else { dir = kCurrentDirectoryString; } return FilePath(dir); } // Helper functions for naming files in a directory for xml output. // Given directory = "dir", base_name = "test", number = 0, // extension = "xml", returns "dir/test.xml". If number is greater // than zero (e.g., 12), returns "dir/test_12.xml". // On Windows platform, uses \ as the separator rather than /. FilePath FilePath::MakeFileName(const FilePath& directory, const FilePath& base_name, int number, const char* extension) { String file; if (number == 0) { file = String::Format("%s.%s", base_name.c_str(), extension); } else { file = String::Format("%s_%d.%s", base_name.c_str(), number, extension); } return ConcatPaths(directory, FilePath(file)); } // Given directory = "dir", relative_path = "test.xml", returns "dir/test.xml". // On Windows, uses \ as the separator rather than /. FilePath FilePath::ConcatPaths(const FilePath& directory, const FilePath& relative_path) { if (directory.IsEmpty()) return relative_path; const FilePath dir(directory.RemoveTrailingPathSeparator()); return FilePath(String::Format("%s%c%s", dir.c_str(), kPathSeparator, relative_path.c_str())); } // Returns true if pathname describes something findable in the file-system, // either a file, directory, or whatever. bool FilePath::FileOrDirectoryExists() const { #if GTEST_OS_WINDOWS_MOBILE LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str()); const DWORD attributes = GetFileAttributes(unicode); delete [] unicode; return attributes != kInvalidFileAttributes; #else posix::StatStruct file_stat; return posix::Stat(pathname_.c_str(), &file_stat) == 0; #endif // GTEST_OS_WINDOWS_MOBILE } // Returns true if pathname describes a directory in the file-system // that exists. bool FilePath::DirectoryExists() const { bool result = false; #if GTEST_OS_WINDOWS // Don't strip off trailing separator if path is a root directory on // Windows (like "C:\\"). const FilePath& path(IsRootDirectory() ? *this : RemoveTrailingPathSeparator()); #else const FilePath& path(*this); #endif #if GTEST_OS_WINDOWS_MOBILE LPCWSTR unicode = String::AnsiToUtf16(path.c_str()); const DWORD attributes = GetFileAttributes(unicode); delete [] unicode; if ((attributes != kInvalidFileAttributes) && (attributes & FILE_ATTRIBUTE_DIRECTORY)) { result = true; } #else posix::StatStruct file_stat; result = posix::Stat(path.c_str(), &file_stat) == 0 && posix::IsDir(file_stat); #endif // GTEST_OS_WINDOWS_MOBILE return result; } // Returns true if pathname describes a root directory. (Windows has one // root directory per disk drive.) bool FilePath::IsRootDirectory() const { #if GTEST_OS_WINDOWS // TODO(wan@google.com): on Windows a network share like // \\server\share can be a root directory, although it cannot be the // current directory. Handle this properly. return pathname_.length() == 3 && IsAbsolutePath(); #else return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]); #endif } // Returns true if pathname describes an absolute path. bool FilePath::IsAbsolutePath() const { const char* const name = pathname_.c_str(); #if GTEST_OS_WINDOWS return pathname_.length() >= 3 && ((name[0] >= 'a' && name[0] <= 'z') || (name[0] >= 'A' && name[0] <= 'Z')) && name[1] == ':' && IsPathSeparator(name[2]); #else return IsPathSeparator(name[0]); #endif } // Returns a pathname for a file that does not currently exist. The pathname // will be directory/base_name.extension or // directory/base_name_.extension if directory/base_name.extension // already exists. The number will be incremented until a pathname is found // that does not already exist. // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'. // There could be a race condition if two or more processes are calling this // function at the same time -- they could both pick the same filename. FilePath FilePath::GenerateUniqueFileName(const FilePath& directory, const FilePath& base_name, const char* extension) { FilePath full_pathname; int number = 0; do { full_pathname.Set(MakeFileName(directory, base_name, number++, extension)); } while (full_pathname.FileOrDirectoryExists()); return full_pathname; } // Returns true if FilePath ends with a path separator, which indicates that // it is intended to represent a directory. Returns false otherwise. // This does NOT check that a directory (or file) actually exists. bool FilePath::IsDirectory() const { return !pathname_.empty() && IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]); } // Create directories so that path exists. Returns true if successful or if // the directories already exist; returns false if unable to create directories // for any reason. bool FilePath::CreateDirectoriesRecursively() const { if (!this->IsDirectory()) { return false; } if (pathname_.length() == 0 || this->DirectoryExists()) { return true; } const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName()); return parent.CreateDirectoriesRecursively() && this->CreateFolder(); } // Create the directory so that path exists. Returns true if successful or // if the directory already exists; returns false if unable to create the // directory for any reason, including if the parent directory does not // exist. Not named "CreateDirectory" because that's a macro on Windows. bool FilePath::CreateFolder() const { #if GTEST_OS_WINDOWS_MOBILE FilePath removed_sep(this->RemoveTrailingPathSeparator()); LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str()); int result = CreateDirectory(unicode, NULL) ? 0 : -1; delete [] unicode; #elif GTEST_OS_WINDOWS int result = _mkdir(pathname_.c_str()); #else int result = mkdir(pathname_.c_str(), 0777); #endif // GTEST_OS_WINDOWS_MOBILE if (result == -1) { return this->DirectoryExists(); // An error is OK if the directory exists. } return true; // No error. } // If input name has a trailing separator character, remove it and return the // name, otherwise return the name string unmodified. // On Windows platform, uses \ as the separator, other platforms use /. FilePath FilePath::RemoveTrailingPathSeparator() const { return IsDirectory() ? FilePath(String(pathname_.c_str(), pathname_.length() - 1)) : *this; } // Removes any redundant separators that might be in the pathname. // For example, "bar///foo" becomes "bar/foo". Does not eliminate other // redundancies that might be in a pathname involving "." or "..". // TODO(wan@google.com): handle Windows network shares (e.g. \\server\share). void FilePath::Normalize() { if (pathname_.c_str() == NULL) { pathname_ = ""; return; } const char* src = pathname_.c_str(); char* const dest = new char[pathname_.length() + 1]; char* dest_ptr = dest; memset(dest_ptr, 0, pathname_.length() + 1); while (*src != '\0') { *dest_ptr = *src; if (!IsPathSeparator(*src)) { src++; } else { #if GTEST_HAS_ALT_PATH_SEP_ if (*dest_ptr == kAlternatePathSeparator) { *dest_ptr = kPathSeparator; } #endif while (IsPathSeparator(*src)) src++; } dest_ptr++; } *dest_ptr = '\0'; pathname_ = dest; delete[] dest; } } // namespace internal } // namespace testing clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/src/gtest-internal-inl.h000066400000000000000000001216601260417502300300530ustar00rootroot00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Utility functions and classes used by the Google C++ testing framework. // // Author: wan@google.com (Zhanyong Wan) // // This file contains purely Google Test's internal implementation. Please // DO NOT #INCLUDE IT IN A USER PROGRAM. #ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_ #define GTEST_SRC_GTEST_INTERNAL_INL_H_ // GTEST_IMPLEMENTATION_ is defined to 1 iff the current translation unit is // part of Google Test's implementation; otherwise it's undefined. #if !GTEST_IMPLEMENTATION_ // A user is trying to include this from his code - just say no. #error "gtest-internal-inl.h is part of Google Test's internal implementation." #error "It must not be included except by Google Test itself." #endif // GTEST_IMPLEMENTATION_ #ifndef _WIN32_WCE #include #endif // !_WIN32_WCE #include #include // For strtoll/_strtoul64/malloc/free. #include // For memmove. #include #include #include #include #if GTEST_OS_WINDOWS #include // For DWORD. #endif // GTEST_OS_WINDOWS #include // NOLINT #include namespace testing { // Declares the flags. // // We don't want the users to modify this flag in the code, but want // Google Test's own unit tests to be able to access it. Therefore we // declare it here as opposed to in gtest.h. GTEST_DECLARE_bool_(death_test_use_fork); namespace internal { // The value of GetTestTypeId() as seen from within the Google Test // library. This is solely for testing GetTestTypeId(). GTEST_API_ extern const TypeId kTestTypeIdInGoogleTest; // Names of the flags (needed for parsing Google Test flags). const char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests"; const char kBreakOnFailureFlag[] = "break_on_failure"; const char kCatchExceptionsFlag[] = "catch_exceptions"; const char kColorFlag[] = "color"; const char kFilterFlag[] = "filter"; const char kListTestsFlag[] = "list_tests"; const char kOutputFlag[] = "output"; const char kPrintTimeFlag[] = "print_time"; const char kRandomSeedFlag[] = "random_seed"; const char kRepeatFlag[] = "repeat"; const char kShuffleFlag[] = "shuffle"; const char kStackTraceDepthFlag[] = "stack_trace_depth"; const char kThrowOnFailureFlag[] = "throw_on_failure"; // A valid random seed must be in [1, kMaxRandomSeed]. const int kMaxRandomSeed = 99999; // g_help_flag is true iff the --help flag or an equivalent form is // specified on the command line. GTEST_API_ extern bool g_help_flag; // Returns the current time in milliseconds. GTEST_API_ TimeInMillis GetTimeInMillis(); // Returns true iff Google Test should use colors in the output. GTEST_API_ bool ShouldUseColor(bool stdout_is_tty); // Formats the given time in milliseconds as seconds. GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms); // Parses a string for an Int32 flag, in the form of "--flag=value". // // On success, stores the value of the flag in *value, and returns // true. On failure, returns false without changing *value. GTEST_API_ bool ParseInt32Flag( const char* str, const char* flag, Int32* value); // Returns a random seed in range [1, kMaxRandomSeed] based on the // given --gtest_random_seed flag value. inline int GetRandomSeedFromFlag(Int32 random_seed_flag) { const unsigned int raw_seed = (random_seed_flag == 0) ? static_cast(GetTimeInMillis()) : static_cast(random_seed_flag); // Normalizes the actual seed to range [1, kMaxRandomSeed] such that // it's easy to type. const int normalized_seed = static_cast((raw_seed - 1U) % static_cast(kMaxRandomSeed)) + 1; return normalized_seed; } // Returns the first valid random seed after 'seed'. The behavior is // undefined if 'seed' is invalid. The seed after kMaxRandomSeed is // considered to be 1. inline int GetNextRandomSeed(int seed) { GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed) << "Invalid random seed " << seed << " - must be in [1, " << kMaxRandomSeed << "]."; const int next_seed = seed + 1; return (next_seed > kMaxRandomSeed) ? 1 : next_seed; } // This class saves the values of all Google Test flags in its c'tor, and // restores them in its d'tor. class GTestFlagSaver { public: // The c'tor. GTestFlagSaver() { also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests); break_on_failure_ = GTEST_FLAG(break_on_failure); catch_exceptions_ = GTEST_FLAG(catch_exceptions); color_ = GTEST_FLAG(color); death_test_style_ = GTEST_FLAG(death_test_style); death_test_use_fork_ = GTEST_FLAG(death_test_use_fork); filter_ = GTEST_FLAG(filter); internal_run_death_test_ = GTEST_FLAG(internal_run_death_test); list_tests_ = GTEST_FLAG(list_tests); output_ = GTEST_FLAG(output); print_time_ = GTEST_FLAG(print_time); random_seed_ = GTEST_FLAG(random_seed); repeat_ = GTEST_FLAG(repeat); shuffle_ = GTEST_FLAG(shuffle); stack_trace_depth_ = GTEST_FLAG(stack_trace_depth); throw_on_failure_ = GTEST_FLAG(throw_on_failure); } // The d'tor is not virtual. DO NOT INHERIT FROM THIS CLASS. ~GTestFlagSaver() { GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_; GTEST_FLAG(break_on_failure) = break_on_failure_; GTEST_FLAG(catch_exceptions) = catch_exceptions_; GTEST_FLAG(color) = color_; GTEST_FLAG(death_test_style) = death_test_style_; GTEST_FLAG(death_test_use_fork) = death_test_use_fork_; GTEST_FLAG(filter) = filter_; GTEST_FLAG(internal_run_death_test) = internal_run_death_test_; GTEST_FLAG(list_tests) = list_tests_; GTEST_FLAG(output) = output_; GTEST_FLAG(print_time) = print_time_; GTEST_FLAG(random_seed) = random_seed_; GTEST_FLAG(repeat) = repeat_; GTEST_FLAG(shuffle) = shuffle_; GTEST_FLAG(stack_trace_depth) = stack_trace_depth_; GTEST_FLAG(throw_on_failure) = throw_on_failure_; } private: // Fields for saving the original values of flags. bool also_run_disabled_tests_; bool break_on_failure_; bool catch_exceptions_; String color_; String death_test_style_; bool death_test_use_fork_; String filter_; String internal_run_death_test_; bool list_tests_; String output_; bool print_time_; bool pretty_; internal::Int32 random_seed_; internal::Int32 repeat_; bool shuffle_; internal::Int32 stack_trace_depth_; bool throw_on_failure_; } GTEST_ATTRIBUTE_UNUSED_; // Converts a Unicode code point to a narrow string in UTF-8 encoding. // code_point parameter is of type UInt32 because wchar_t may not be // wide enough to contain a code point. // The output buffer str must containt at least 32 characters. // The function returns the address of the output buffer. // If the code_point is not a valid Unicode code point // (i.e. outside of Unicode range U+0 to U+10FFFF) it will be output // as '(Invalid Unicode 0xXXXXXXXX)'. GTEST_API_ char* CodePointToUtf8(UInt32 code_point, char* str); // Converts a wide string to a narrow string in UTF-8 encoding. // The wide string is assumed to have the following encoding: // UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS) // UTF-32 if sizeof(wchar_t) == 4 (on Linux) // Parameter str points to a null-terminated wide string. // Parameter num_chars may additionally limit the number // of wchar_t characters processed. -1 is used when the entire string // should be processed. // If the string contains code points that are not valid Unicode code points // (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output // as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding // and contains invalid UTF-16 surrogate pairs, values in those pairs // will be encoded as individual Unicode characters from Basic Normal Plane. GTEST_API_ String WideStringToUtf8(const wchar_t* str, int num_chars); // Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file // if the variable is present. If a file already exists at this location, this // function will write over it. If the variable is present, but the file cannot // be created, prints an error and exits. void WriteToShardStatusFileIfNeeded(); // Checks whether sharding is enabled by examining the relevant // environment variable values. If the variables are present, // but inconsistent (e.g., shard_index >= total_shards), prints // an error and exits. If in_subprocess_for_death_test, sharding is // disabled because it must only be applied to the original test // process. Otherwise, we could filter out death tests we intended to execute. GTEST_API_ bool ShouldShard(const char* total_shards_str, const char* shard_index_str, bool in_subprocess_for_death_test); // Parses the environment variable var as an Int32. If it is unset, // returns default_val. If it is not an Int32, prints an error and // and aborts. GTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val); // Given the total number of shards, the shard index, and the test id, // returns true iff the test should be run on this shard. The test id is // some arbitrary but unique non-negative integer assigned to each test // method. Assumes that 0 <= shard_index < total_shards. GTEST_API_ bool ShouldRunTestOnShard( int total_shards, int shard_index, int test_id); // STL container utilities. // Returns the number of elements in the given container that satisfy // the given predicate. template inline int CountIf(const Container& c, Predicate predicate) { return static_cast(std::count_if(c.begin(), c.end(), predicate)); } // Applies a function/functor to each element in the container. template void ForEach(const Container& c, Functor functor) { std::for_each(c.begin(), c.end(), functor); } // Returns the i-th element of the vector, or default_value if i is not // in range [0, v.size()). template inline E GetElementOr(const std::vector& v, int i, E default_value) { return (i < 0 || i >= static_cast(v.size())) ? default_value : v[i]; } // Performs an in-place shuffle of a range of the vector's elements. // 'begin' and 'end' are element indices as an STL-style range; // i.e. [begin, end) are shuffled, where 'end' == size() means to // shuffle to the end of the vector. template void ShuffleRange(internal::Random* random, int begin, int end, std::vector* v) { const int size = static_cast(v->size()); GTEST_CHECK_(0 <= begin && begin <= size) << "Invalid shuffle range start " << begin << ": must be in range [0, " << size << "]."; GTEST_CHECK_(begin <= end && end <= size) << "Invalid shuffle range finish " << end << ": must be in range [" << begin << ", " << size << "]."; // Fisher-Yates shuffle, from // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle for (int range_width = end - begin; range_width >= 2; range_width--) { const int last_in_range = begin + range_width - 1; const int selected = begin + random->Generate(range_width); std::swap((*v)[selected], (*v)[last_in_range]); } } // Performs an in-place shuffle of the vector's elements. template inline void Shuffle(internal::Random* random, std::vector* v) { ShuffleRange(random, 0, static_cast(v->size()), v); } // A function for deleting an object. Handy for being used as a // functor. template static void Delete(T* x) { delete x; } // A predicate that checks the key of a TestProperty against a known key. // // TestPropertyKeyIs is copyable. class TestPropertyKeyIs { public: // Constructor. // // TestPropertyKeyIs has NO default constructor. explicit TestPropertyKeyIs(const char* key) : key_(key) {} // Returns true iff the test name of test property matches on key_. bool operator()(const TestProperty& test_property) const { return String(test_property.key()).Compare(key_) == 0; } private: String key_; }; class TestInfoImpl { public: TestInfoImpl(TestInfo* parent, const char* test_case_name, const char* name, const char* test_case_comment, const char* comment, TypeId fixture_class_id, internal::TestFactoryBase* factory); ~TestInfoImpl(); // Returns true if this test should run. bool should_run() const { return should_run_; } // Sets the should_run member. void set_should_run(bool should) { should_run_ = should; } // Returns true if this test is disabled. Disabled tests are not run. bool is_disabled() const { return is_disabled_; } // Sets the is_disabled member. void set_is_disabled(bool is) { is_disabled_ = is; } // Returns true if this test matches the filter specified by the user. bool matches_filter() const { return matches_filter_; } // Sets the matches_filter member. void set_matches_filter(bool matches) { matches_filter_ = matches; } // Returns the test case name. const char* test_case_name() const { return test_case_name_.c_str(); } // Returns the test name. const char* name() const { return name_.c_str(); } // Returns the test case comment. const char* test_case_comment() const { return test_case_comment_.c_str(); } // Returns the test comment. const char* comment() const { return comment_.c_str(); } // Returns the ID of the test fixture class. TypeId fixture_class_id() const { return fixture_class_id_; } // Returns the test result. TestResult* result() { return &result_; } const TestResult* result() const { return &result_; } // Creates the test object, runs it, records its result, and then // deletes it. void Run(); // Clears the test result. void ClearResult() { result_.Clear(); } // Clears the test result in the given TestInfo object. static void ClearTestResult(TestInfo * test_info) { test_info->impl()->ClearResult(); } private: // These fields are immutable properties of the test. TestInfo* const parent_; // The owner of this object const String test_case_name_; // Test case name const String name_; // Test name const String test_case_comment_; // Test case comment const String comment_; // Test comment const TypeId fixture_class_id_; // ID of the test fixture class bool should_run_; // True iff this test should run bool is_disabled_; // True iff this test is disabled bool matches_filter_; // True if this test matches the // user-specified filter. internal::TestFactoryBase* const factory_; // The factory that creates // the test object // This field is mutable and needs to be reset before running the // test for the second time. TestResult result_; GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfoImpl); }; // Class UnitTestOptions. // // This class contains functions for processing options the user // specifies when running the tests. It has only static members. // // In most cases, the user can specify an option using either an // environment variable or a command line flag. E.g. you can set the // test filter using either GTEST_FILTER or --gtest_filter. If both // the variable and the flag are present, the latter overrides the // former. class GTEST_API_ UnitTestOptions { public: // Functions for processing the gtest_output flag. // Returns the output format, or "" for normal printed output. static String GetOutputFormat(); // Returns the absolute path of the requested output file, or the // default (test_detail.xml in the original working directory) if // none was explicitly specified. static String GetAbsolutePathToOutputFile(); // Functions for processing the gtest_filter flag. // Returns true iff the wildcard pattern matches the string. The // first ':' or '\0' character in pattern marks the end of it. // // This recursive algorithm isn't very efficient, but is clear and // works well enough for matching test names, which are short. static bool PatternMatchesString(const char *pattern, const char *str); // Returns true iff the user-specified filter matches the test case // name and the test name. static bool FilterMatchesTest(const String &test_case_name, const String &test_name); #if GTEST_OS_WINDOWS // Function for supporting the gtest_catch_exception flag. // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise. // This function is useful as an __except condition. static int GTestShouldProcessSEH(DWORD exception_code); #endif // GTEST_OS_WINDOWS // Returns true if "name" matches the ':' separated list of glob-style // filters in "filter". static bool MatchesFilter(const String& name, const char* filter); }; // Returns the current application's name, removing directory path if that // is present. Used by UnitTestOptions::GetOutputFile. GTEST_API_ FilePath GetCurrentExecutableName(); // The role interface for getting the OS stack trace as a string. class OsStackTraceGetterInterface { public: OsStackTraceGetterInterface() {} virtual ~OsStackTraceGetterInterface() {} // Returns the current OS stack trace as a String. Parameters: // // max_depth - the maximum number of stack frames to be included // in the trace. // skip_count - the number of top frames to be skipped; doesn't count // against max_depth. virtual String CurrentStackTrace(int max_depth, int skip_count) = 0; // UponLeavingGTest() should be called immediately before Google Test calls // user code. It saves some information about the current stack that // CurrentStackTrace() will use to find and hide Google Test stack frames. virtual void UponLeavingGTest() = 0; private: GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface); }; // A working implementation of the OsStackTraceGetterInterface interface. class OsStackTraceGetter : public OsStackTraceGetterInterface { public: OsStackTraceGetter() : caller_frame_(NULL) {} virtual String CurrentStackTrace(int max_depth, int skip_count); virtual void UponLeavingGTest(); // This string is inserted in place of stack frames that are part of // Google Test's implementation. static const char* const kElidedFramesMarker; private: Mutex mutex_; // protects all internal state // We save the stack frame below the frame that calls user code. // We do this because the address of the frame immediately below // the user code changes between the call to UponLeavingGTest() // and any calls to CurrentStackTrace() from within the user code. void* caller_frame_; GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter); }; // Information about a Google Test trace point. struct TraceInfo { const char* file; int line; String message; }; // This is the default global test part result reporter used in UnitTestImpl. // This class should only be used by UnitTestImpl. class DefaultGlobalTestPartResultReporter : public TestPartResultReporterInterface { public: explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test); // Implements the TestPartResultReporterInterface. Reports the test part // result in the current test. virtual void ReportTestPartResult(const TestPartResult& result); private: UnitTestImpl* const unit_test_; GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter); }; // This is the default per thread test part result reporter used in // UnitTestImpl. This class should only be used by UnitTestImpl. class DefaultPerThreadTestPartResultReporter : public TestPartResultReporterInterface { public: explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test); // Implements the TestPartResultReporterInterface. The implementation just // delegates to the current global test part result reporter of *unit_test_. virtual void ReportTestPartResult(const TestPartResult& result); private: UnitTestImpl* const unit_test_; GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter); }; // The private implementation of the UnitTest class. We don't protect // the methods under a mutex, as this class is not accessible by a // user and the UnitTest class that delegates work to this class does // proper locking. class GTEST_API_ UnitTestImpl { public: explicit UnitTestImpl(UnitTest* parent); virtual ~UnitTestImpl(); // There are two different ways to register your own TestPartResultReporter. // You can register your own repoter to listen either only for test results // from the current thread or for results from all threads. // By default, each per-thread test result repoter just passes a new // TestPartResult to the global test result reporter, which registers the // test part result for the currently running test. // Returns the global test part result reporter. TestPartResultReporterInterface* GetGlobalTestPartResultReporter(); // Sets the global test part result reporter. void SetGlobalTestPartResultReporter( TestPartResultReporterInterface* reporter); // Returns the test part result reporter for the current thread. TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread(); // Sets the test part result reporter for the current thread. void SetTestPartResultReporterForCurrentThread( TestPartResultReporterInterface* reporter); // Gets the number of successful test cases. int successful_test_case_count() const; // Gets the number of failed test cases. int failed_test_case_count() const; // Gets the number of all test cases. int total_test_case_count() const; // Gets the number of all test cases that contain at least one test // that should run. int test_case_to_run_count() const; // Gets the number of successful tests. int successful_test_count() const; // Gets the number of failed tests. int failed_test_count() const; // Gets the number of disabled tests. int disabled_test_count() const; // Gets the number of all tests. int total_test_count() const; // Gets the number of tests that should run. int test_to_run_count() const; // Gets the elapsed time, in milliseconds. TimeInMillis elapsed_time() const { return elapsed_time_; } // Returns true iff the unit test passed (i.e. all test cases passed). bool Passed() const { return !Failed(); } // Returns true iff the unit test failed (i.e. some test case failed // or something outside of all tests failed). bool Failed() const { return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed(); } // Gets the i-th test case among all the test cases. i can range from 0 to // total_test_case_count() - 1. If i is not in that range, returns NULL. const TestCase* GetTestCase(int i) const { const int index = GetElementOr(test_case_indices_, i, -1); return index < 0 ? NULL : test_cases_[i]; } // Gets the i-th test case among all the test cases. i can range from 0 to // total_test_case_count() - 1. If i is not in that range, returns NULL. TestCase* GetMutableTestCase(int i) { const int index = GetElementOr(test_case_indices_, i, -1); return index < 0 ? NULL : test_cases_[index]; } // Provides access to the event listener list. TestEventListeners* listeners() { return &listeners_; } // Returns the TestResult for the test that's currently running, or // the TestResult for the ad hoc test if no test is running. TestResult* current_test_result(); // Returns the TestResult for the ad hoc test. const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; } // Sets the OS stack trace getter. // // Does nothing if the input and the current OS stack trace getter // are the same; otherwise, deletes the old getter and makes the // input the current getter. void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter); // Returns the current OS stack trace getter if it is not NULL; // otherwise, creates an OsStackTraceGetter, makes it the current // getter, and returns it. OsStackTraceGetterInterface* os_stack_trace_getter(); // Returns the current OS stack trace as a String. // // The maximum number of stack frames to be included is specified by // the gtest_stack_trace_depth flag. The skip_count parameter // specifies the number of top frames to be skipped, which doesn't // count against the number of frames to be included. // // For example, if Foo() calls Bar(), which in turn calls // CurrentOsStackTraceExceptTop(1), Foo() will be included in the // trace but Bar() and CurrentOsStackTraceExceptTop() won't. String CurrentOsStackTraceExceptTop(int skip_count); // Finds and returns a TestCase with the given name. If one doesn't // exist, creates one and returns it. // // Arguments: // // test_case_name: name of the test case // set_up_tc: pointer to the function that sets up the test case // tear_down_tc: pointer to the function that tears down the test case TestCase* GetTestCase(const char* test_case_name, const char* comment, Test::SetUpTestCaseFunc set_up_tc, Test::TearDownTestCaseFunc tear_down_tc); // Adds a TestInfo to the unit test. // // Arguments: // // set_up_tc: pointer to the function that sets up the test case // tear_down_tc: pointer to the function that tears down the test case // test_info: the TestInfo object void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc, Test::TearDownTestCaseFunc tear_down_tc, TestInfo * test_info) { // In order to support thread-safe death tests, we need to // remember the original working directory when the test program // was first invoked. We cannot do this in RUN_ALL_TESTS(), as // the user may have changed the current directory before calling // RUN_ALL_TESTS(). Therefore we capture the current directory in // AddTestInfo(), which is called to register a TEST or TEST_F // before main() is reached. if (original_working_dir_.IsEmpty()) { original_working_dir_.Set(FilePath::GetCurrentDir()); GTEST_CHECK_(!original_working_dir_.IsEmpty()) << "Failed to get the current working directory."; } GetTestCase(test_info->test_case_name(), test_info->test_case_comment(), set_up_tc, tear_down_tc)->AddTestInfo(test_info); } #if GTEST_HAS_PARAM_TEST // Returns ParameterizedTestCaseRegistry object used to keep track of // value-parameterized tests and instantiate and register them. internal::ParameterizedTestCaseRegistry& parameterized_test_registry() { return parameterized_test_registry_; } #endif // GTEST_HAS_PARAM_TEST // Sets the TestCase object for the test that's currently running. void set_current_test_case(TestCase* a_current_test_case) { current_test_case_ = a_current_test_case; } // Sets the TestInfo object for the test that's currently running. If // current_test_info is NULL, the assertion results will be stored in // ad_hoc_test_result_. void set_current_test_info(TestInfo* a_current_test_info) { current_test_info_ = a_current_test_info; } // Registers all parameterized tests defined using TEST_P and // INSTANTIATE_TEST_P, creating regular tests for each test/parameter // combination. This method can be called more then once; it has // guards protecting from registering the tests more then once. // If value-parameterized tests are disabled, RegisterParameterizedTests // is present but does nothing. void RegisterParameterizedTests(); // Runs all tests in this UnitTest object, prints the result, and // returns 0 if all tests are successful, or 1 otherwise. If any // exception is thrown during a test on Windows, this test is // considered to be failed, but the rest of the tests will still be // run. (We disable exceptions on Linux and Mac OS X, so the issue // doesn't apply there.) int RunAllTests(); // Clears the results of all tests, including the ad hoc test. void ClearResult() { ForEach(test_cases_, TestCase::ClearTestCaseResult); ad_hoc_test_result_.Clear(); } enum ReactionToSharding { HONOR_SHARDING_PROTOCOL, IGNORE_SHARDING_PROTOCOL }; // Matches the full name of each test against the user-specified // filter to decide whether the test should run, then records the // result in each TestCase and TestInfo object. // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests // based on sharding variables in the environment. // Returns the number of tests that should run. int FilterTests(ReactionToSharding shard_tests); // Prints the names of the tests matching the user-specified filter flag. void ListTestsMatchingFilter(); const TestCase* current_test_case() const { return current_test_case_; } TestInfo* current_test_info() { return current_test_info_; } const TestInfo* current_test_info() const { return current_test_info_; } // Returns the vector of environments that need to be set-up/torn-down // before/after the tests are run. std::vector& environments() { return environments_; } // Getters for the per-thread Google Test trace stack. std::vector& gtest_trace_stack() { return *(gtest_trace_stack_.pointer()); } const std::vector& gtest_trace_stack() const { return gtest_trace_stack_.get(); } #if GTEST_HAS_DEATH_TEST void InitDeathTestSubprocessControlInfo() { internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag()); } // Returns a pointer to the parsed --gtest_internal_run_death_test // flag, or NULL if that flag was not specified. // This information is useful only in a death test child process. // Must not be called before a call to InitGoogleTest. const InternalRunDeathTestFlag* internal_run_death_test_flag() const { return internal_run_death_test_flag_.get(); } // Returns a pointer to the current death test factory. internal::DeathTestFactory* death_test_factory() { return death_test_factory_.get(); } void SuppressTestEventsIfInSubprocess(); friend class ReplaceDeathTestFactory; #endif // GTEST_HAS_DEATH_TEST // Initializes the event listener performing XML output as specified by // UnitTestOptions. Must not be called before InitGoogleTest. void ConfigureXmlOutput(); // Performs initialization dependent upon flag values obtained in // ParseGoogleTestFlagsOnly. Is called from InitGoogleTest after the call to // ParseGoogleTestFlagsOnly. In case a user neglects to call InitGoogleTest // this function is also called from RunAllTests. Since this function can be // called more than once, it has to be idempotent. void PostFlagParsingInit(); // Gets the random seed used at the start of the current test iteration. int random_seed() const { return random_seed_; } // Gets the random number generator. internal::Random* random() { return &random_; } // Shuffles all test cases, and the tests within each test case, // making sure that death tests are still run first. void ShuffleTests(); // Restores the test cases and tests to their order before the first shuffle. void UnshuffleTests(); private: friend class ::testing::UnitTest; // The UnitTest object that owns this implementation object. UnitTest* const parent_; // The working directory when the first TEST() or TEST_F() was // executed. internal::FilePath original_working_dir_; // The default test part result reporters. DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_; DefaultPerThreadTestPartResultReporter default_per_thread_test_part_result_reporter_; // Points to (but doesn't own) the global test part result reporter. TestPartResultReporterInterface* global_test_part_result_repoter_; // Protects read and write access to global_test_part_result_reporter_. internal::Mutex global_test_part_result_reporter_mutex_; // Points to (but doesn't own) the per-thread test part result reporter. internal::ThreadLocal per_thread_test_part_result_reporter_; // The vector of environments that need to be set-up/torn-down // before/after the tests are run. std::vector environments_; // The vector of TestCases in their original order. It owns the // elements in the vector. std::vector test_cases_; // Provides a level of indirection for the test case list to allow // easy shuffling and restoring the test case order. The i-th // element of this vector is the index of the i-th test case in the // shuffled order. std::vector test_case_indices_; #if GTEST_HAS_PARAM_TEST // ParameterizedTestRegistry object used to register value-parameterized // tests. internal::ParameterizedTestCaseRegistry parameterized_test_registry_; // Indicates whether RegisterParameterizedTests() has been called already. bool parameterized_tests_registered_; #endif // GTEST_HAS_PARAM_TEST // Index of the last death test case registered. Initially -1. int last_death_test_case_; // This points to the TestCase for the currently running test. It // changes as Google Test goes through one test case after another. // When no test is running, this is set to NULL and Google Test // stores assertion results in ad_hoc_test_result_. Initially NULL. TestCase* current_test_case_; // This points to the TestInfo for the currently running test. It // changes as Google Test goes through one test after another. When // no test is running, this is set to NULL and Google Test stores // assertion results in ad_hoc_test_result_. Initially NULL. TestInfo* current_test_info_; // Normally, a user only writes assertions inside a TEST or TEST_F, // or inside a function called by a TEST or TEST_F. Since Google // Test keeps track of which test is current running, it can // associate such an assertion with the test it belongs to. // // If an assertion is encountered when no TEST or TEST_F is running, // Google Test attributes the assertion result to an imaginary "ad hoc" // test, and records the result in ad_hoc_test_result_. TestResult ad_hoc_test_result_; // The list of event listeners that can be used to track events inside // Google Test. TestEventListeners listeners_; // The OS stack trace getter. Will be deleted when the UnitTest // object is destructed. By default, an OsStackTraceGetter is used, // but the user can set this field to use a custom getter if that is // desired. OsStackTraceGetterInterface* os_stack_trace_getter_; // True iff PostFlagParsingInit() has been called. bool post_flag_parse_init_performed_; // The random number seed used at the beginning of the test run. int random_seed_; // Our random number generator. internal::Random random_; // How long the test took to run, in milliseconds. TimeInMillis elapsed_time_; #if GTEST_HAS_DEATH_TEST // The decomposed components of the gtest_internal_run_death_test flag, // parsed when RUN_ALL_TESTS is called. internal::scoped_ptr internal_run_death_test_flag_; internal::scoped_ptr death_test_factory_; #endif // GTEST_HAS_DEATH_TEST // A per-thread stack of traces created by the SCOPED_TRACE() macro. internal::ThreadLocal > gtest_trace_stack_; GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl); }; // class UnitTestImpl // Convenience function for accessing the global UnitTest // implementation object. inline UnitTestImpl* GetUnitTestImpl() { return UnitTest::GetInstance()->impl(); } // Internal helper functions for implementing the simple regular // expression matcher. GTEST_API_ bool IsInSet(char ch, const char* str); GTEST_API_ bool IsDigit(char ch); GTEST_API_ bool IsPunct(char ch); GTEST_API_ bool IsRepeat(char ch); GTEST_API_ bool IsWhiteSpace(char ch); GTEST_API_ bool IsWordChar(char ch); GTEST_API_ bool IsValidEscape(char ch); GTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch); GTEST_API_ bool ValidateRegex(const char* regex); GTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str); GTEST_API_ bool MatchRepetitionAndRegexAtHead( bool escaped, char ch, char repeat, const char* regex, const char* str); GTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str); // Parses the command line for Google Test flags, without initializing // other parts of Google Test. GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv); GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv); #if GTEST_HAS_DEATH_TEST // Returns the message describing the last system error, regardless of the // platform. String GetLastErrnoDescription(); #if GTEST_OS_WINDOWS // Provides leak-safe Windows kernel handle ownership. class AutoHandle { public: AutoHandle() : handle_(INVALID_HANDLE_VALUE) {} explicit AutoHandle(HANDLE handle) : handle_(handle) {} ~AutoHandle() { Reset(); } HANDLE Get() const { return handle_; } void Reset() { Reset(INVALID_HANDLE_VALUE); } void Reset(HANDLE handle) { if (handle != handle_) { if (handle_ != INVALID_HANDLE_VALUE) ::CloseHandle(handle_); handle_ = handle; } } private: HANDLE handle_; GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle); }; #endif // GTEST_OS_WINDOWS // Attempts to parse a string into a positive integer pointed to by the // number parameter. Returns true if that is possible. // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use // it here. template bool ParseNaturalNumber(const ::std::string& str, Integer* number) { // Fail fast if the given string does not begin with a digit; // this bypasses strtoXXX's "optional leading whitespace and plus // or minus sign" semantics, which are undesirable here. if (str.empty() || !isdigit(str[0])) { return false; } errno = 0; char* end; // BiggestConvertible is the largest integer type that system-provided // string-to-number conversion routines can return. #if GTEST_OS_WINDOWS && !defined(__GNUC__) // MSVC and C++ Builder define __int64 instead of the standard long long. typedef unsigned __int64 BiggestConvertible; const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10); #else typedef unsigned long long BiggestConvertible; // NOLINT const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10); #endif // GTEST_OS_WINDOWS && !defined(__GNUC__) const bool parse_success = *end == '\0' && errno == 0; // TODO(vladl@google.com): Convert this to compile time assertion when it is // available. GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed)); const Integer result = static_cast(parsed); if (parse_success && static_cast(result) == parsed) { *number = result; return true; } return false; } #endif // GTEST_HAS_DEATH_TEST // TestResult contains some private methods that should be hidden from // Google Test user but are required for testing. This class allow our tests // to access them. // // This class is supplied only for the purpose of testing Google Test's own // constructs. Do not use it in user tests, either directly or indirectly. class TestResultAccessor { public: static void RecordProperty(TestResult* test_result, const TestProperty& property) { test_result->RecordProperty(property); } static void ClearTestPartResults(TestResult* test_result) { test_result->ClearTestPartResults(); } static const std::vector& test_part_results( const TestResult& test_result) { return test_result.test_part_results(); } }; } // namespace internal } // namespace testing #endif // GTEST_SRC_GTEST_INTERNAL_INL_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/src/gtest-port.cc000066400000000000000000000567251260417502300266120ustar00rootroot00000000000000// Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) #include #include #include #include #if GTEST_OS_WINDOWS_MOBILE #include // For TerminateProcess() #elif GTEST_OS_WINDOWS #include #include #else #include #endif // GTEST_OS_WINDOWS_MOBILE #if GTEST_OS_MAC #include #include #include #endif // GTEST_OS_MAC #include #include #include // Indicates that this translation unit is part of Google Test's // implementation. It must come before gtest-internal-inl.h is // included, or there will be a compiler error. This trick is to // prevent a user from accidentally including gtest-internal-inl.h in // his code. #define GTEST_IMPLEMENTATION_ 1 #include "src/gtest-internal-inl.h" #undef GTEST_IMPLEMENTATION_ namespace testing { namespace internal { #if defined(_MSC_VER) || defined(__BORLANDC__) // MSVC and C++Builder do not provide a definition of STDERR_FILENO. const int kStdOutFileno = 1; const int kStdErrFileno = 2; #else const int kStdOutFileno = STDOUT_FILENO; const int kStdErrFileno = STDERR_FILENO; #endif // _MSC_VER #if GTEST_OS_MAC // Returns the number of threads running in the process, or 0 to indicate that // we cannot detect it. size_t GetThreadCount() { const task_t task = mach_task_self(); mach_msg_type_number_t thread_count; thread_act_array_t thread_list; const kern_return_t status = task_threads(task, &thread_list, &thread_count); if (status == KERN_SUCCESS) { // task_threads allocates resources in thread_list and we need to free them // to avoid leaks. vm_deallocate(task, reinterpret_cast(thread_list), sizeof(thread_t) * thread_count); return static_cast(thread_count); } else { return 0; } } #else size_t GetThreadCount() { // There's no portable way to detect the number of threads, so we just // return 0 to indicate that we cannot detect it. return 0; } #endif // GTEST_OS_MAC #if GTEST_USES_POSIX_RE // Implements RE. Currently only needed for death tests. RE::~RE() { if (is_valid_) { // regfree'ing an invalid regex might crash because the content // of the regex is undefined. Since the regex's are essentially // the same, one cannot be valid (or invalid) without the other // being so too. regfree(&partial_regex_); regfree(&full_regex_); } free(const_cast(pattern_)); } // Returns true iff regular expression re matches the entire str. bool RE::FullMatch(const char* str, const RE& re) { if (!re.is_valid_) return false; regmatch_t match; return regexec(&re.full_regex_, str, 1, &match, 0) == 0; } // Returns true iff regular expression re matches a substring of str // (including str itself). bool RE::PartialMatch(const char* str, const RE& re) { if (!re.is_valid_) return false; regmatch_t match; return regexec(&re.partial_regex_, str, 1, &match, 0) == 0; } // Initializes an RE from its string representation. void RE::Init(const char* regex) { pattern_ = posix::StrDup(regex); // Reserves enough bytes to hold the regular expression used for a // full match. const size_t full_regex_len = strlen(regex) + 10; char* const full_pattern = new char[full_regex_len]; snprintf(full_pattern, full_regex_len, "^(%s)$", regex); is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0; // We want to call regcomp(&partial_regex_, ...) even if the // previous expression returns false. Otherwise partial_regex_ may // not be properly initialized can may cause trouble when it's // freed. // // Some implementation of POSIX regex (e.g. on at least some // versions of Cygwin) doesn't accept the empty string as a valid // regex. We change it to an equivalent form "()" to be safe. if (is_valid_) { const char* const partial_regex = (*regex == '\0') ? "()" : regex; is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0; } EXPECT_TRUE(is_valid_) << "Regular expression \"" << regex << "\" is not a valid POSIX Extended regular expression."; delete[] full_pattern; } #elif GTEST_USES_SIMPLE_RE // Returns true iff ch appears anywhere in str (excluding the // terminating '\0' character). bool IsInSet(char ch, const char* str) { return ch != '\0' && strchr(str, ch) != NULL; } // Returns true iff ch belongs to the given classification. Unlike // similar functions in , these aren't affected by the // current locale. bool IsDigit(char ch) { return '0' <= ch && ch <= '9'; } bool IsPunct(char ch) { return IsInSet(ch, "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~"); } bool IsRepeat(char ch) { return IsInSet(ch, "?*+"); } bool IsWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); } bool IsWordChar(char ch) { return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || ('0' <= ch && ch <= '9') || ch == '_'; } // Returns true iff "\\c" is a supported escape sequence. bool IsValidEscape(char c) { return (IsPunct(c) || IsInSet(c, "dDfnrsStvwW")); } // Returns true iff the given atom (specified by escaped and pattern) // matches ch. The result is undefined if the atom is invalid. bool AtomMatchesChar(bool escaped, char pattern_char, char ch) { if (escaped) { // "\\p" where p is pattern_char. switch (pattern_char) { case 'd': return IsDigit(ch); case 'D': return !IsDigit(ch); case 'f': return ch == '\f'; case 'n': return ch == '\n'; case 'r': return ch == '\r'; case 's': return IsWhiteSpace(ch); case 'S': return !IsWhiteSpace(ch); case 't': return ch == '\t'; case 'v': return ch == '\v'; case 'w': return IsWordChar(ch); case 'W': return !IsWordChar(ch); } return IsPunct(pattern_char) && pattern_char == ch; } return (pattern_char == '.' && ch != '\n') || pattern_char == ch; } // Helper function used by ValidateRegex() to format error messages. String FormatRegexSyntaxError(const char* regex, int index) { return (Message() << "Syntax error at index " << index << " in simple regular expression \"" << regex << "\": ").GetString(); } // Generates non-fatal failures and returns false if regex is invalid; // otherwise returns true. bool ValidateRegex(const char* regex) { if (regex == NULL) { // TODO(wan@google.com): fix the source file location in the // assertion failures to match where the regex is used in user // code. ADD_FAILURE() << "NULL is not a valid simple regular expression."; return false; } bool is_valid = true; // True iff ?, *, or + can follow the previous atom. bool prev_repeatable = false; for (int i = 0; regex[i]; i++) { if (regex[i] == '\\') { // An escape sequence i++; if (regex[i] == '\0') { ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1) << "'\\' cannot appear at the end."; return false; } if (!IsValidEscape(regex[i])) { ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1) << "invalid escape sequence \"\\" << regex[i] << "\"."; is_valid = false; } prev_repeatable = true; } else { // Not an escape sequence. const char ch = regex[i]; if (ch == '^' && i > 0) { ADD_FAILURE() << FormatRegexSyntaxError(regex, i) << "'^' can only appear at the beginning."; is_valid = false; } else if (ch == '$' && regex[i + 1] != '\0') { ADD_FAILURE() << FormatRegexSyntaxError(regex, i) << "'$' can only appear at the end."; is_valid = false; } else if (IsInSet(ch, "()[]{}|")) { ADD_FAILURE() << FormatRegexSyntaxError(regex, i) << "'" << ch << "' is unsupported."; is_valid = false; } else if (IsRepeat(ch) && !prev_repeatable) { ADD_FAILURE() << FormatRegexSyntaxError(regex, i) << "'" << ch << "' can only follow a repeatable token."; is_valid = false; } prev_repeatable = !IsInSet(ch, "^$?*+"); } } return is_valid; } // Matches a repeated regex atom followed by a valid simple regular // expression. The regex atom is defined as c if escaped is false, // or \c otherwise. repeat is the repetition meta character (?, *, // or +). The behavior is undefined if str contains too many // characters to be indexable by size_t, in which case the test will // probably time out anyway. We are fine with this limitation as // std::string has it too. bool MatchRepetitionAndRegexAtHead( bool escaped, char c, char repeat, const char* regex, const char* str) { const size_t min_count = (repeat == '+') ? 1 : 0; const size_t max_count = (repeat == '?') ? 1 : static_cast(-1) - 1; // We cannot call numeric_limits::max() as it conflicts with the // max() macro on Windows. for (size_t i = 0; i <= max_count; ++i) { // We know that the atom matches each of the first i characters in str. if (i >= min_count && MatchRegexAtHead(regex, str + i)) { // We have enough matches at the head, and the tail matches too. // Since we only care about *whether* the pattern matches str // (as opposed to *how* it matches), there is no need to find a // greedy match. return true; } if (str[i] == '\0' || !AtomMatchesChar(escaped, c, str[i])) return false; } return false; } // Returns true iff regex matches a prefix of str. regex must be a // valid simple regular expression and not start with "^", or the // result is undefined. bool MatchRegexAtHead(const char* regex, const char* str) { if (*regex == '\0') // An empty regex matches a prefix of anything. return true; // "$" only matches the end of a string. Note that regex being // valid guarantees that there's nothing after "$" in it. if (*regex == '$') return *str == '\0'; // Is the first thing in regex an escape sequence? const bool escaped = *regex == '\\'; if (escaped) ++regex; if (IsRepeat(regex[1])) { // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so // here's an indirect recursion. It terminates as the regex gets // shorter in each recursion. return MatchRepetitionAndRegexAtHead( escaped, regex[0], regex[1], regex + 2, str); } else { // regex isn't empty, isn't "$", and doesn't start with a // repetition. We match the first atom of regex with the first // character of str and recurse. return (*str != '\0') && AtomMatchesChar(escaped, *regex, *str) && MatchRegexAtHead(regex + 1, str + 1); } } // Returns true iff regex matches any substring of str. regex must be // a valid simple regular expression, or the result is undefined. // // The algorithm is recursive, but the recursion depth doesn't exceed // the regex length, so we won't need to worry about running out of // stack space normally. In rare cases the time complexity can be // exponential with respect to the regex length + the string length, // but usually it's must faster (often close to linear). bool MatchRegexAnywhere(const char* regex, const char* str) { if (regex == NULL || str == NULL) return false; if (*regex == '^') return MatchRegexAtHead(regex + 1, str); // A successful match can be anywhere in str. do { if (MatchRegexAtHead(regex, str)) return true; } while (*str++ != '\0'); return false; } // Implements the RE class. RE::~RE() { free(const_cast(pattern_)); free(const_cast(full_pattern_)); } // Returns true iff regular expression re matches the entire str. bool RE::FullMatch(const char* str, const RE& re) { return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str); } // Returns true iff regular expression re matches a substring of str // (including str itself). bool RE::PartialMatch(const char* str, const RE& re) { return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str); } // Initializes an RE from its string representation. void RE::Init(const char* regex) { pattern_ = full_pattern_ = NULL; if (regex != NULL) { pattern_ = posix::StrDup(regex); } is_valid_ = ValidateRegex(regex); if (!is_valid_) { // No need to calculate the full pattern when the regex is invalid. return; } const size_t len = strlen(regex); // Reserves enough bytes to hold the regular expression used for a // full match: we need space to prepend a '^', append a '$', and // terminate the string with '\0'. char* buffer = static_cast(malloc(len + 3)); full_pattern_ = buffer; if (*regex != '^') *buffer++ = '^'; // Makes sure full_pattern_ starts with '^'. // We don't use snprintf or strncpy, as they trigger a warning when // compiled with VC++ 8.0. memcpy(buffer, regex, len); buffer += len; if (len == 0 || regex[len - 1] != '$') *buffer++ = '$'; // Makes sure full_pattern_ ends with '$'. *buffer = '\0'; } #endif // GTEST_USES_POSIX_RE GTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line) : severity_(severity) { const char* const marker = severity == GTEST_INFO ? "[ INFO ]" : severity == GTEST_WARNING ? "[WARNING]" : severity == GTEST_ERROR ? "[ ERROR ]" : "[ FATAL ]"; GetStream() << ::std::endl << marker << " " << FormatFileLocation(file, line).c_str() << ": "; } // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program. GTestLog::~GTestLog() { GetStream() << ::std::endl; if (severity_ == GTEST_FATAL) { fflush(stderr); posix::Abort(); } } // Disable Microsoft deprecation warnings for POSIX functions called from // this class (creat, dup, dup2, and close) #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable: 4996) #endif // _MSC_VER #if GTEST_HAS_STREAM_REDIRECTION_ // Object that captures an output stream (stdout/stderr). class CapturedStream { public: // The ctor redirects the stream to a temporary file. CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) { #if GTEST_OS_WINDOWS char temp_dir_path[MAX_PATH + 1] = { '\0' }; // NOLINT char temp_file_path[MAX_PATH + 1] = { '\0' }; // NOLINT ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path); const UINT success = ::GetTempFileNameA(temp_dir_path, "gtest_redir", 0, // Generate unique file name. temp_file_path); GTEST_CHECK_(success != 0) << "Unable to create a temporary file in " << temp_dir_path; const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE); GTEST_CHECK_(captured_fd != -1) << "Unable to open temporary file " << temp_file_path; filename_ = temp_file_path; #else // There's no guarantee that a test has write access to the // current directory, so we create the temporary file in the /tmp // directory instead. char name_template[] = "/tmp/captured_stream.XXXXXX"; const int captured_fd = mkstemp(name_template); filename_ = name_template; #endif // GTEST_OS_WINDOWS fflush(NULL); dup2(captured_fd, fd_); close(captured_fd); } ~CapturedStream() { remove(filename_.c_str()); } String GetCapturedString() { if (uncaptured_fd_ != -1) { // Restores the original stream. fflush(NULL); dup2(uncaptured_fd_, fd_); close(uncaptured_fd_); uncaptured_fd_ = -1; } FILE* const file = posix::FOpen(filename_.c_str(), "r"); const String content = ReadEntireFile(file); posix::FClose(file); return content; } private: // Reads the entire content of a file as a String. static String ReadEntireFile(FILE* file); // Returns the size (in bytes) of a file. static size_t GetFileSize(FILE* file); const int fd_; // A stream to capture. int uncaptured_fd_; // Name of the temporary file holding the stderr output. ::std::string filename_; GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream); }; // Returns the size (in bytes) of a file. size_t CapturedStream::GetFileSize(FILE* file) { fseek(file, 0, SEEK_END); return static_cast(ftell(file)); } // Reads the entire content of a file as a string. String CapturedStream::ReadEntireFile(FILE* file) { const size_t file_size = GetFileSize(file); char* const buffer = new char[file_size]; size_t bytes_last_read = 0; // # of bytes read in the last fread() size_t bytes_read = 0; // # of bytes read so far fseek(file, 0, SEEK_SET); // Keeps reading the file until we cannot read further or the // pre-determined file size is reached. do { bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file); bytes_read += bytes_last_read; } while (bytes_last_read > 0 && bytes_read < file_size); const String content(buffer, bytes_read); delete[] buffer; return content; } #ifdef _MSC_VER #pragma warning(pop) #endif // _MSC_VER static CapturedStream* g_captured_stderr = NULL; static CapturedStream* g_captured_stdout = NULL; // Starts capturing an output stream (stdout/stderr). void CaptureStream(int fd, const char* stream_name, CapturedStream** stream) { if (*stream != NULL) { GTEST_LOG_(FATAL) << "Only one " << stream_name << " capturer can exist at a time."; } *stream = new CapturedStream(fd); } // Stops capturing the output stream and returns the captured string. String GetCapturedStream(CapturedStream** captured_stream) { const String content = (*captured_stream)->GetCapturedString(); delete *captured_stream; *captured_stream = NULL; return content; } // Starts capturing stdout. void CaptureStdout() { CaptureStream(kStdOutFileno, "stdout", &g_captured_stdout); } // Starts capturing stderr. void CaptureStderr() { CaptureStream(kStdErrFileno, "stderr", &g_captured_stderr); } // Stops capturing stdout and returns the captured string. String GetCapturedStdout() { return GetCapturedStream(&g_captured_stdout); } // Stops capturing stderr and returns the captured string. String GetCapturedStderr() { return GetCapturedStream(&g_captured_stderr); } #endif // GTEST_HAS_STREAM_REDIRECTION_ #if GTEST_HAS_DEATH_TEST // A copy of all command line arguments. Set by InitGoogleTest(). ::std::vector g_argvs; // Returns the command line as a vector of strings. const ::std::vector& GetArgvs() { return g_argvs; } #endif // GTEST_HAS_DEATH_TEST #if GTEST_OS_WINDOWS_MOBILE namespace posix { void Abort() { DebugBreak(); TerminateProcess(GetCurrentProcess(), 1); } } // namespace posix #endif // GTEST_OS_WINDOWS_MOBILE // Returns the name of the environment variable corresponding to the // given flag. For example, FlagToEnvVar("foo") will return // "GTEST_FOO" in the open-source version. static String FlagToEnvVar(const char* flag) { const String full_flag = (Message() << GTEST_FLAG_PREFIX_ << flag).GetString(); Message env_var; for (size_t i = 0; i != full_flag.length(); i++) { env_var << static_cast(toupper(full_flag.c_str()[i])); } return env_var.GetString(); } // Parses 'str' for a 32-bit signed integer. If successful, writes // the result to *value and returns true; otherwise leaves *value // unchanged and returns false. bool ParseInt32(const Message& src_text, const char* str, Int32* value) { // Parses the environment variable as a decimal integer. char* end = NULL; const long long_value = strtol(str, &end, 10); // NOLINT // Has strtol() consumed all characters in the string? if (*end != '\0') { // No - an invalid character was encountered. Message msg; msg << "WARNING: " << src_text << " is expected to be a 32-bit integer, but actually" << " has value \"" << str << "\".\n"; printf("%s", msg.GetString().c_str()); fflush(stdout); return false; } // Is the parsed value in the range of an Int32? const Int32 result = static_cast(long_value); if (long_value == LONG_MAX || long_value == LONG_MIN || // The parsed value overflows as a long. (strtol() returns // LONG_MAX or LONG_MIN when the input overflows.) result != long_value // The parsed value overflows as an Int32. ) { Message msg; msg << "WARNING: " << src_text << " is expected to be a 32-bit integer, but actually" << " has value " << str << ", which overflows.\n"; printf("%s", msg.GetString().c_str()); fflush(stdout); return false; } *value = result; return true; } // Reads and returns the Boolean environment variable corresponding to // the given flag; if it's not set, returns default_value. // // The value is considered true iff it's not "0". bool BoolFromGTestEnv(const char* flag, bool default_value) { const String env_var = FlagToEnvVar(flag); const char* const string_value = posix::GetEnv(env_var.c_str()); return string_value == NULL ? default_value : strcmp(string_value, "0") != 0; } // Reads and returns a 32-bit integer stored in the environment // variable corresponding to the given flag; if it isn't set or // doesn't represent a valid 32-bit integer, returns default_value. Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) { const String env_var = FlagToEnvVar(flag); const char* const string_value = posix::GetEnv(env_var.c_str()); if (string_value == NULL) { // The environment variable is not set. return default_value; } Int32 result = default_value; if (!ParseInt32(Message() << "Environment variable " << env_var, string_value, &result)) { printf("The default value %s is used.\n", (Message() << default_value).GetString().c_str()); fflush(stdout); return default_value; } return result; } // Reads and returns the string environment variable corresponding to // the given flag; if it's not set, returns default_value. const char* StringFromGTestEnv(const char* flag, const char* default_value) { const String env_var = FlagToEnvVar(flag); const char* const value = posix::GetEnv(env_var.c_str()); return value == NULL ? default_value : value; } } // namespace internal } // namespace testing clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/src/gtest-test-part.cc000066400000000000000000000101451260417502300275330ustar00rootroot00000000000000// Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: mheule@google.com (Markus Heule) // // The Google C++ Testing Framework (Google Test) #include // Indicates that this translation unit is part of Google Test's // implementation. It must come before gtest-internal-inl.h is // included, or there will be a compiler error. This trick is to // prevent a user from accidentally including gtest-internal-inl.h in // his code. #define GTEST_IMPLEMENTATION_ 1 #include "src/gtest-internal-inl.h" #undef GTEST_IMPLEMENTATION_ namespace testing { using internal::GetUnitTestImpl; // Gets the summary of the failure message by omitting the stack trace // in it. internal::String TestPartResult::ExtractSummary(const char* message) { const char* const stack_trace = strstr(message, internal::kStackTraceMarker); return stack_trace == NULL ? internal::String(message) : internal::String(message, stack_trace - message); } // Prints a TestPartResult object. std::ostream& operator<<(std::ostream& os, const TestPartResult& result) { return os << result.file_name() << ":" << result.line_number() << ": " << (result.type() == TestPartResult::kSuccess ? "Success" : result.type() == TestPartResult::kFatalFailure ? "Fatal failure" : "Non-fatal failure") << ":\n" << result.message() << std::endl; } // Appends a TestPartResult to the array. void TestPartResultArray::Append(const TestPartResult& result) { array_.push_back(result); } // Returns the TestPartResult at the given index (0-based). const TestPartResult& TestPartResultArray::GetTestPartResult(int index) const { if (index < 0 || index >= size()) { printf("\nInvalid index (%d) into TestPartResultArray.\n", index); internal::posix::Abort(); } return array_[index]; } // Returns the number of TestPartResult objects in the array. int TestPartResultArray::size() const { return static_cast(array_.size()); } namespace internal { HasNewFatalFailureHelper::HasNewFatalFailureHelper() : has_new_fatal_failure_(false), original_reporter_(GetUnitTestImpl()-> GetTestPartResultReporterForCurrentThread()) { GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this); } HasNewFatalFailureHelper::~HasNewFatalFailureHelper() { GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread( original_reporter_); } void HasNewFatalFailureHelper::ReportTestPartResult( const TestPartResult& result) { if (result.fatally_failed()) has_new_fatal_failure_ = true; original_reporter_->ReportTestPartResult(result); } } // namespace internal } // namespace testing clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/src/gtest-typed-test.cc000066400000000000000000000072431260417502300277170ustar00rootroot00000000000000// Copyright 2008 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) #include #include namespace testing { namespace internal { #if GTEST_HAS_TYPED_TEST_P // Skips to the first non-space char in str. Returns an empty string if str // contains only whitespace characters. static const char* SkipSpaces(const char* str) { while (isspace(*str)) str++; return str; } // Verifies that registered_tests match the test names in // defined_test_names_; returns registered_tests if successful, or // aborts the program otherwise. const char* TypedTestCasePState::VerifyRegisteredTestNames( const char* file, int line, const char* registered_tests) { typedef ::std::set::const_iterator DefinedTestIter; registered_ = true; // Skip initial whitespace in registered_tests since some // preprocessors prefix stringizied literals with whitespace. registered_tests = SkipSpaces(registered_tests); Message errors; ::std::set tests; for (const char* names = registered_tests; names != NULL; names = SkipComma(names)) { const String name = GetPrefixUntilComma(names); if (tests.count(name) != 0) { errors << "Test " << name << " is listed more than once.\n"; continue; } bool found = false; for (DefinedTestIter it = defined_test_names_.begin(); it != defined_test_names_.end(); ++it) { if (name == *it) { found = true; break; } } if (found) { tests.insert(name); } else { errors << "No test named " << name << " can be found in this test case.\n"; } } for (DefinedTestIter it = defined_test_names_.begin(); it != defined_test_names_.end(); ++it) { if (tests.count(*it) == 0) { errors << "You forgot to list test " << *it << ".\n"; } } const String& errors_str = errors.GetString(); if (errors_str != "") { fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(), errors_str.c_str()); fflush(stderr); posix::Abort(); } return registered_tests; } #endif // GTEST_HAS_TYPED_TEST_P } // namespace internal } // namespace testing clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/src/gtest.cc000066400000000000000000005155331260417502300256250ustar00rootroot00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // // The Google C++ Testing Framework (Google Test) #include #include #include #include #include #include #include #include #include #include #include #include #include #if GTEST_OS_LINUX // TODO(kenton@google.com): Use autoconf to detect availability of // gettimeofday(). #define GTEST_HAS_GETTIMEOFDAY_ 1 #include #include #include // Declares vsnprintf(). This header is not available on Windows. #include #include #include #include #include #include #elif GTEST_OS_SYMBIAN #define GTEST_HAS_GETTIMEOFDAY_ 1 #include // NOLINT #elif GTEST_OS_ZOS #define GTEST_HAS_GETTIMEOFDAY_ 1 #include // NOLINT // On z/OS we additionally need strings.h for strcasecmp. #include // NOLINT #elif GTEST_OS_WINDOWS_MOBILE // We are on Windows CE. #include // NOLINT #elif GTEST_OS_WINDOWS // We are on Windows proper. #include // NOLINT #include // NOLINT #include // NOLINT #include // NOLINT #if GTEST_OS_WINDOWS_MINGW // MinGW has gettimeofday() but not _ftime64(). // TODO(kenton@google.com): Use autoconf to detect availability of // gettimeofday(). // TODO(kenton@google.com): There are other ways to get the time on // Windows, like GetTickCount() or GetSystemTimeAsFileTime(). MinGW // supports these. consider using them instead. #define GTEST_HAS_GETTIMEOFDAY_ 1 #include // NOLINT #endif // GTEST_OS_WINDOWS_MINGW // cpplint thinks that the header is already included, so we want to // silence it. #include // NOLINT #else // Assume other platforms have gettimeofday(). // TODO(kenton@google.com): Use autoconf to detect availability of // gettimeofday(). #define GTEST_HAS_GETTIMEOFDAY_ 1 // cpplint thinks that the header is already included, so we want to // silence it. #include // NOLINT #include // NOLINT #endif // GTEST_OS_LINUX #if GTEST_HAS_EXCEPTIONS #include #endif // Indicates that this translation unit is part of Google Test's // implementation. It must come before gtest-internal-inl.h is // included, or there will be a compiler error. This trick is to // prevent a user from accidentally including gtest-internal-inl.h in // his code. #define GTEST_IMPLEMENTATION_ 1 #include "src/gtest-internal-inl.h" #undef GTEST_IMPLEMENTATION_ #if GTEST_OS_WINDOWS #define vsnprintf _vsnprintf #endif // GTEST_OS_WINDOWS namespace testing { using internal::CountIf; using internal::ForEach; using internal::GetElementOr; using internal::Shuffle; // Constants. // A test whose test case name or test name matches this filter is // disabled and not run. static const char kDisableTestFilter[] = "DISABLED_*:*/DISABLED_*"; // A test case whose name matches this filter is considered a death // test case and will be run before test cases whose name doesn't // match this filter. static const char kDeathTestCaseFilter[] = "*DeathTest:*DeathTest/*"; // A test filter that matches everything. static const char kUniversalFilter[] = "*"; // The default output file for XML output. static const char kDefaultOutputFile[] = "test_detail.xml"; // The environment variable name for the test shard index. static const char kTestShardIndex[] = "GTEST_SHARD_INDEX"; // The environment variable name for the total number of test shards. static const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS"; // The environment variable name for the test shard status file. static const char kTestShardStatusFile[] = "GTEST_SHARD_STATUS_FILE"; namespace internal { // The text used in failure messages to indicate the start of the // stack trace. const char kStackTraceMarker[] = "\nStack trace:\n"; // g_help_flag is true iff the --help flag or an equivalent form is // specified on the command line. bool g_help_flag = false; } // namespace internal GTEST_DEFINE_bool_( also_run_disabled_tests, internal::BoolFromGTestEnv("also_run_disabled_tests", false), "Run disabled tests too, in addition to the tests normally being run."); GTEST_DEFINE_bool_( break_on_failure, internal::BoolFromGTestEnv("break_on_failure", false), "True iff a failed assertion should be a debugger break-point."); GTEST_DEFINE_bool_( catch_exceptions, internal::BoolFromGTestEnv("catch_exceptions", false), "True iff " GTEST_NAME_ " should catch exceptions and treat them as test failures."); GTEST_DEFINE_string_( color, internal::StringFromGTestEnv("color", "auto"), "Whether to use colors in the output. Valid values: yes, no, " "and auto. 'auto' means to use colors if the output is " "being sent to a terminal and the TERM environment variable " "is set to xterm, xterm-color, xterm-256color, linux or cygwin."); GTEST_DEFINE_string_( filter, internal::StringFromGTestEnv("filter", kUniversalFilter), "A colon-separated list of glob (not regex) patterns " "for filtering the tests to run, optionally followed by a " "'-' and a : separated list of negative patterns (tests to " "exclude). A test is run if it matches one of the positive " "patterns and does not match any of the negative patterns."); GTEST_DEFINE_bool_(list_tests, false, "List all tests without running them."); GTEST_DEFINE_string_( output, internal::StringFromGTestEnv("output", ""), "A format (currently must be \"xml\"), optionally followed " "by a colon and an output file name or directory. A directory " "is indicated by a trailing pathname separator. " "Examples: \"xml:filename.xml\", \"xml::directoryname/\". " "If a directory is specified, output files will be created " "within that directory, with file-names based on the test " "executable's name and, if necessary, made unique by adding " "digits."); GTEST_DEFINE_bool_( print_time, internal::BoolFromGTestEnv("print_time", true), "True iff " GTEST_NAME_ " should display elapsed time in text output."); GTEST_DEFINE_int32_( random_seed, internal::Int32FromGTestEnv("random_seed", 0), "Random number seed to use when shuffling test orders. Must be in range " "[1, 99999], or 0 to use a seed based on the current time."); GTEST_DEFINE_int32_( repeat, internal::Int32FromGTestEnv("repeat", 1), "How many times to repeat each test. Specify a negative number " "for repeating forever. Useful for shaking out flaky tests."); GTEST_DEFINE_bool_( show_internal_stack_frames, false, "True iff " GTEST_NAME_ " should include internal stack frames when " "printing test failure stack traces."); GTEST_DEFINE_bool_( shuffle, internal::BoolFromGTestEnv("shuffle", false), "True iff " GTEST_NAME_ " should randomize tests' order on every run."); GTEST_DEFINE_int32_( stack_trace_depth, internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth), "The maximum number of stack frames to print when an " "assertion fails. The valid range is 0 through 100, inclusive."); GTEST_DEFINE_bool_( throw_on_failure, internal::BoolFromGTestEnv("throw_on_failure", false), "When this flag is specified, a failed assertion will throw an exception " "if exceptions are enabled or exit the program with a non-zero code " "otherwise."); namespace internal { // Generates a random number from [0, range), using a Linear // Congruential Generator (LCG). Crashes if 'range' is 0 or greater // than kMaxRange. UInt32 Random::Generate(UInt32 range) { // These constants are the same as are used in glibc's rand(3). state_ = (1103515245U*state_ + 12345U) % kMaxRange; GTEST_CHECK_(range > 0) << "Cannot generate a number in the range [0, 0)."; GTEST_CHECK_(range <= kMaxRange) << "Generation of a number in [0, " << range << ") was requested, " << "but this can only generate numbers in [0, " << kMaxRange << ")."; // Converting via modulus introduces a bit of downward bias, but // it's simple, and a linear congruential generator isn't too good // to begin with. return state_ % range; } // GTestIsInitialized() returns true iff the user has initialized // Google Test. Useful for catching the user mistake of not initializing // Google Test before calling RUN_ALL_TESTS(). // // A user must call testing::InitGoogleTest() to initialize Google // Test. g_init_gtest_count is set to the number of times // InitGoogleTest() has been called. We don't protect this variable // under a mutex as it is only accessed in the main thread. int g_init_gtest_count = 0; static bool GTestIsInitialized() { return g_init_gtest_count != 0; } // Iterates over a vector of TestCases, keeping a running sum of the // results of calling a given int-returning method on each. // Returns the sum. static int SumOverTestCaseList(const std::vector& case_list, int (TestCase::*method)() const) { int sum = 0; for (size_t i = 0; i < case_list.size(); i++) { sum += (case_list[i]->*method)(); } return sum; } // Returns true iff the test case passed. static bool TestCasePassed(const TestCase* test_case) { return test_case->should_run() && test_case->Passed(); } // Returns true iff the test case failed. static bool TestCaseFailed(const TestCase* test_case) { return test_case->should_run() && test_case->Failed(); } // Returns true iff test_case contains at least one test that should // run. static bool ShouldRunTestCase(const TestCase* test_case) { return test_case->should_run(); } // AssertHelper constructor. AssertHelper::AssertHelper(TestPartResult::Type type, const char* file, int line, const char* message) : data_(new AssertHelperData(type, file, line, message)) { } AssertHelper::~AssertHelper() { delete data_; } // Message assignment, for assertion streaming support. void AssertHelper::operator=(const Message& message) const { UnitTest::GetInstance()-> AddTestPartResult(data_->type, data_->file, data_->line, AppendUserMessage(data_->message, message), UnitTest::GetInstance()->impl() ->CurrentOsStackTraceExceptTop(1) // Skips the stack frame for this function itself. ); // NOLINT } // Mutex for linked pointers. GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex); // Application pathname gotten in InitGoogleTest. String g_executable_path; // Returns the current application's name, removing directory path if that // is present. FilePath GetCurrentExecutableName() { FilePath result; #if GTEST_OS_WINDOWS result.Set(FilePath(g_executable_path).RemoveExtension("exe")); #else result.Set(FilePath(g_executable_path)); #endif // GTEST_OS_WINDOWS return result.RemoveDirectoryName(); } // Functions for processing the gtest_output flag. // Returns the output format, or "" for normal printed output. String UnitTestOptions::GetOutputFormat() { const char* const gtest_output_flag = GTEST_FLAG(output).c_str(); if (gtest_output_flag == NULL) return String(""); const char* const colon = strchr(gtest_output_flag, ':'); return (colon == NULL) ? String(gtest_output_flag) : String(gtest_output_flag, colon - gtest_output_flag); } // Returns the name of the requested output file, or the default if none // was explicitly specified. String UnitTestOptions::GetAbsolutePathToOutputFile() { const char* const gtest_output_flag = GTEST_FLAG(output).c_str(); if (gtest_output_flag == NULL) return String(""); const char* const colon = strchr(gtest_output_flag, ':'); if (colon == NULL) return String(internal::FilePath::ConcatPaths( internal::FilePath( UnitTest::GetInstance()->original_working_dir()), internal::FilePath(kDefaultOutputFile)).ToString() ); internal::FilePath output_name(colon + 1); if (!output_name.IsAbsolutePath()) // TODO(wan@google.com): on Windows \some\path is not an absolute // path (as its meaning depends on the current drive), yet the // following logic for turning it into an absolute path is wrong. // Fix it. output_name = internal::FilePath::ConcatPaths( internal::FilePath(UnitTest::GetInstance()->original_working_dir()), internal::FilePath(colon + 1)); if (!output_name.IsDirectory()) return output_name.ToString(); internal::FilePath result(internal::FilePath::GenerateUniqueFileName( output_name, internal::GetCurrentExecutableName(), GetOutputFormat().c_str())); return result.ToString(); } // Returns true iff the wildcard pattern matches the string. The // first ':' or '\0' character in pattern marks the end of it. // // This recursive algorithm isn't very efficient, but is clear and // works well enough for matching test names, which are short. bool UnitTestOptions::PatternMatchesString(const char *pattern, const char *str) { switch (*pattern) { case '\0': case ':': // Either ':' or '\0' marks the end of the pattern. return *str == '\0'; case '?': // Matches any single character. return *str != '\0' && PatternMatchesString(pattern + 1, str + 1); case '*': // Matches any string (possibly empty) of characters. return (*str != '\0' && PatternMatchesString(pattern, str + 1)) || PatternMatchesString(pattern + 1, str); default: // Non-special character. Matches itself. return *pattern == *str && PatternMatchesString(pattern + 1, str + 1); } } bool UnitTestOptions::MatchesFilter(const String& name, const char* filter) { const char *cur_pattern = filter; for (;;) { if (PatternMatchesString(cur_pattern, name.c_str())) { return true; } // Finds the next pattern in the filter. cur_pattern = strchr(cur_pattern, ':'); // Returns if no more pattern can be found. if (cur_pattern == NULL) { return false; } // Skips the pattern separater (the ':' character). cur_pattern++; } } // TODO(keithray): move String function implementations to gtest-string.cc. // Returns true iff the user-specified filter matches the test case // name and the test name. bool UnitTestOptions::FilterMatchesTest(const String &test_case_name, const String &test_name) { const String& full_name = String::Format("%s.%s", test_case_name.c_str(), test_name.c_str()); // Split --gtest_filter at '-', if there is one, to separate into // positive filter and negative filter portions const char* const p = GTEST_FLAG(filter).c_str(); const char* const dash = strchr(p, '-'); String positive; String negative; if (dash == NULL) { positive = GTEST_FLAG(filter).c_str(); // Whole string is a positive filter negative = String(""); } else { positive = String(p, dash - p); // Everything up to the dash negative = String(dash+1); // Everything after the dash if (positive.empty()) { // Treat '-test1' as the same as '*-test1' positive = kUniversalFilter; } } // A filter is a colon-separated list of patterns. It matches a // test if any pattern in it matches the test. return (MatchesFilter(full_name, positive.c_str()) && !MatchesFilter(full_name, negative.c_str())); } #if GTEST_OS_WINDOWS // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise. // This function is useful as an __except condition. int UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) { // Google Test should handle an exception if: // 1. the user wants it to, AND // 2. this is not a breakpoint exception. return (GTEST_FLAG(catch_exceptions) && exception_code != EXCEPTION_BREAKPOINT) ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH; } #endif // GTEST_OS_WINDOWS } // namespace internal // The c'tor sets this object as the test part result reporter used by // Google Test. The 'result' parameter specifies where to report the // results. Intercepts only failures from the current thread. ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter( TestPartResultArray* result) : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD), result_(result) { Init(); } // The c'tor sets this object as the test part result reporter used by // Google Test. The 'result' parameter specifies where to report the // results. ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter( InterceptMode intercept_mode, TestPartResultArray* result) : intercept_mode_(intercept_mode), result_(result) { Init(); } void ScopedFakeTestPartResultReporter::Init() { internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); if (intercept_mode_ == INTERCEPT_ALL_THREADS) { old_reporter_ = impl->GetGlobalTestPartResultReporter(); impl->SetGlobalTestPartResultReporter(this); } else { old_reporter_ = impl->GetTestPartResultReporterForCurrentThread(); impl->SetTestPartResultReporterForCurrentThread(this); } } // The d'tor restores the test part result reporter used by Google Test // before. ScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() { internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); if (intercept_mode_ == INTERCEPT_ALL_THREADS) { impl->SetGlobalTestPartResultReporter(old_reporter_); } else { impl->SetTestPartResultReporterForCurrentThread(old_reporter_); } } // Increments the test part result count and remembers the result. // This method is from the TestPartResultReporterInterface interface. void ScopedFakeTestPartResultReporter::ReportTestPartResult( const TestPartResult& result) { result_->Append(result); } namespace internal { // Returns the type ID of ::testing::Test. We should always call this // instead of GetTypeId< ::testing::Test>() to get the type ID of // testing::Test. This is to work around a suspected linker bug when // using Google Test as a framework on Mac OS X. The bug causes // GetTypeId< ::testing::Test>() to return different values depending // on whether the call is from the Google Test framework itself or // from user test code. GetTestTypeId() is guaranteed to always // return the same value, as it always calls GetTypeId<>() from the // gtest.cc, which is within the Google Test framework. TypeId GetTestTypeId() { return GetTypeId(); } // The value of GetTestTypeId() as seen from within the Google Test // library. This is solely for testing GetTestTypeId(). extern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId(); // This predicate-formatter checks that 'results' contains a test part // failure of the given type and that the failure message contains the // given substring. AssertionResult HasOneFailure(const char* /* results_expr */, const char* /* type_expr */, const char* /* substr_expr */, const TestPartResultArray& results, TestPartResult::Type type, const char* substr) { const String expected(type == TestPartResult::kFatalFailure ? "1 fatal failure" : "1 non-fatal failure"); Message msg; if (results.size() != 1) { msg << "Expected: " << expected << "\n" << " Actual: " << results.size() << " failures"; for (int i = 0; i < results.size(); i++) { msg << "\n" << results.GetTestPartResult(i); } return AssertionFailure(msg); } const TestPartResult& r = results.GetTestPartResult(0); if (r.type() != type) { msg << "Expected: " << expected << "\n" << " Actual:\n" << r; return AssertionFailure(msg); } if (strstr(r.message(), substr) == NULL) { msg << "Expected: " << expected << " containing \"" << substr << "\"\n" << " Actual:\n" << r; return AssertionFailure(msg); } return AssertionSuccess(); } // The constructor of SingleFailureChecker remembers where to look up // test part results, what type of failure we expect, and what // substring the failure message should contain. SingleFailureChecker:: SingleFailureChecker( const TestPartResultArray* results, TestPartResult::Type type, const char* substr) : results_(results), type_(type), substr_(substr) {} // The destructor of SingleFailureChecker verifies that the given // TestPartResultArray contains exactly one failure that has the given // type and contains the given substring. If that's not the case, a // non-fatal failure will be generated. SingleFailureChecker::~SingleFailureChecker() { EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_.c_str()); } DefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter( UnitTestImpl* unit_test) : unit_test_(unit_test) {} void DefaultGlobalTestPartResultReporter::ReportTestPartResult( const TestPartResult& result) { unit_test_->current_test_result()->AddTestPartResult(result); unit_test_->listeners()->repeater()->OnTestPartResult(result); } DefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter( UnitTestImpl* unit_test) : unit_test_(unit_test) {} void DefaultPerThreadTestPartResultReporter::ReportTestPartResult( const TestPartResult& result) { unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result); } // Returns the global test part result reporter. TestPartResultReporterInterface* UnitTestImpl::GetGlobalTestPartResultReporter() { internal::MutexLock lock(&global_test_part_result_reporter_mutex_); return global_test_part_result_repoter_; } // Sets the global test part result reporter. void UnitTestImpl::SetGlobalTestPartResultReporter( TestPartResultReporterInterface* reporter) { internal::MutexLock lock(&global_test_part_result_reporter_mutex_); global_test_part_result_repoter_ = reporter; } // Returns the test part result reporter for the current thread. TestPartResultReporterInterface* UnitTestImpl::GetTestPartResultReporterForCurrentThread() { return per_thread_test_part_result_reporter_.get(); } // Sets the test part result reporter for the current thread. void UnitTestImpl::SetTestPartResultReporterForCurrentThread( TestPartResultReporterInterface* reporter) { per_thread_test_part_result_reporter_.set(reporter); } // Gets the number of successful test cases. int UnitTestImpl::successful_test_case_count() const { return CountIf(test_cases_, TestCasePassed); } // Gets the number of failed test cases. int UnitTestImpl::failed_test_case_count() const { return CountIf(test_cases_, TestCaseFailed); } // Gets the number of all test cases. int UnitTestImpl::total_test_case_count() const { return static_cast(test_cases_.size()); } // Gets the number of all test cases that contain at least one test // that should run. int UnitTestImpl::test_case_to_run_count() const { return CountIf(test_cases_, ShouldRunTestCase); } // Gets the number of successful tests. int UnitTestImpl::successful_test_count() const { return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count); } // Gets the number of failed tests. int UnitTestImpl::failed_test_count() const { return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count); } // Gets the number of disabled tests. int UnitTestImpl::disabled_test_count() const { return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count); } // Gets the number of all tests. int UnitTestImpl::total_test_count() const { return SumOverTestCaseList(test_cases_, &TestCase::total_test_count); } // Gets the number of tests that should run. int UnitTestImpl::test_to_run_count() const { return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count); } // Returns the current OS stack trace as a String. // // The maximum number of stack frames to be included is specified by // the gtest_stack_trace_depth flag. The skip_count parameter // specifies the number of top frames to be skipped, which doesn't // count against the number of frames to be included. // // For example, if Foo() calls Bar(), which in turn calls // CurrentOsStackTraceExceptTop(1), Foo() will be included in the // trace but Bar() and CurrentOsStackTraceExceptTop() won't. String UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) { (void)skip_count; return String(""); } // Returns the current time in milliseconds. TimeInMillis GetTimeInMillis() { #if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__) // Difference between 1970-01-01 and 1601-01-01 in milliseconds. // http://analogous.blogspot.com/2005/04/epoch.html const TimeInMillis kJavaEpochToWinFileTimeDelta = static_cast(116444736UL) * 100000UL; const DWORD kTenthMicrosInMilliSecond = 10000; SYSTEMTIME now_systime; FILETIME now_filetime; ULARGE_INTEGER now_int64; // TODO(kenton@google.com): Shouldn't this just use // GetSystemTimeAsFileTime()? GetSystemTime(&now_systime); if (SystemTimeToFileTime(&now_systime, &now_filetime)) { now_int64.LowPart = now_filetime.dwLowDateTime; now_int64.HighPart = now_filetime.dwHighDateTime; now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) - kJavaEpochToWinFileTimeDelta; return now_int64.QuadPart; } return 0; #elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_ __timeb64 now; #ifdef _MSC_VER // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996 // (deprecated function) there. // TODO(kenton@google.com): Use GetTickCount()? Or use // SystemTimeToFileTime() #pragma warning(push) // Saves the current warning state. #pragma warning(disable:4996) // Temporarily disables warning 4996. _ftime64(&now); #pragma warning(pop) // Restores the warning state. #else _ftime64(&now); #endif // _MSC_VER return static_cast(now.time) * 1000 + now.millitm; #elif GTEST_HAS_GETTIMEOFDAY_ struct timeval now; gettimeofday(&now, NULL); return static_cast(now.tv_sec) * 1000 + now.tv_usec / 1000; #else #error "Don't know how to get the current time on your system." #endif } // Utilities // class String // Returns the input enclosed in double quotes if it's not NULL; // otherwise returns "(null)". For example, "\"Hello\"" is returned // for input "Hello". // // This is useful for printing a C string in the syntax of a literal. // // Known issue: escape sequences are not handled yet. String String::ShowCStringQuoted(const char* c_str) { return c_str ? String::Format("\"%s\"", c_str) : String("(null)"); } // Copies at most length characters from str into a newly-allocated // piece of memory of size length+1. The memory is allocated with new[]. // A terminating null byte is written to the memory, and a pointer to it // is returned. If str is NULL, NULL is returned. static char* CloneString(const char* str, size_t length) { if (str == NULL) { return NULL; } else { char* const clone = new char[length + 1]; posix::StrNCpy(clone, str, length); clone[length] = '\0'; return clone; } } // Clones a 0-terminated C string, allocating memory using new. The // caller is responsible for deleting[] the return value. Returns the // cloned string, or NULL if the input is NULL. const char * String::CloneCString(const char* c_str) { return (c_str == NULL) ? NULL : CloneString(c_str, strlen(c_str)); } #if GTEST_OS_WINDOWS_MOBILE // Creates a UTF-16 wide string from the given ANSI string, allocating // memory using new. The caller is responsible for deleting the return // value using delete[]. Returns the wide string, or NULL if the // input is NULL. LPCWSTR String::AnsiToUtf16(const char* ansi) { if (!ansi) return NULL; const int length = strlen(ansi); const int unicode_length = MultiByteToWideChar(CP_ACP, 0, ansi, length, NULL, 0); WCHAR* unicode = new WCHAR[unicode_length + 1]; MultiByteToWideChar(CP_ACP, 0, ansi, length, unicode, unicode_length); unicode[unicode_length] = 0; return unicode; } // Creates an ANSI string from the given wide string, allocating // memory using new. The caller is responsible for deleting the return // value using delete[]. Returns the ANSI string, or NULL if the // input is NULL. const char* String::Utf16ToAnsi(LPCWSTR utf16_str) { if (!utf16_str) return NULL; const int ansi_length = WideCharToMultiByte(CP_ACP, 0, utf16_str, -1, NULL, 0, NULL, NULL); char* ansi = new char[ansi_length + 1]; WideCharToMultiByte(CP_ACP, 0, utf16_str, -1, ansi, ansi_length, NULL, NULL); ansi[ansi_length] = 0; return ansi; } #endif // GTEST_OS_WINDOWS_MOBILE // Compares two C strings. Returns true iff they have the same content. // // Unlike strcmp(), this function can handle NULL argument(s). A NULL // C string is considered different to any non-NULL C string, // including the empty string. bool String::CStringEquals(const char * lhs, const char * rhs) { if ( lhs == NULL ) return rhs == NULL; if ( rhs == NULL ) return false; return strcmp(lhs, rhs) == 0; } #if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING // Converts an array of wide chars to a narrow string using the UTF-8 // encoding, and streams the result to the given Message object. static void StreamWideCharsToMessage(const wchar_t* wstr, size_t length, Message* msg) { // TODO(wan): consider allowing a testing::String object to // contain '\0'. This will make it behave more like std::string, // and will allow ToUtf8String() to return the correct encoding // for '\0' s.t. we can get rid of the conditional here (and in // several other places). for (size_t i = 0; i != length; ) { // NOLINT if (wstr[i] != L'\0') { *msg << WideStringToUtf8(wstr + i, static_cast(length - i)); while (i != length && wstr[i] != L'\0') i++; } else { *msg << '\0'; i++; } } } #endif // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING } // namespace internal #if GTEST_HAS_STD_WSTRING // Converts the given wide string to a narrow string using the UTF-8 // encoding, and streams the result to this Message object. Message& Message::operator <<(const ::std::wstring& wstr) { internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this); return *this; } #endif // GTEST_HAS_STD_WSTRING #if GTEST_HAS_GLOBAL_WSTRING // Converts the given wide string to a narrow string using the UTF-8 // encoding, and streams the result to this Message object. Message& Message::operator <<(const ::wstring& wstr) { internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this); return *this; } #endif // GTEST_HAS_GLOBAL_WSTRING namespace internal { // Formats a value to be used in a failure message. // For a char value, we print it as a C++ char literal and as an // unsigned integer (both in decimal and in hexadecimal). String FormatForFailureMessage(char ch) { const unsigned int ch_as_uint = ch; // A String object cannot contain '\0', so we print "\\0" when ch is // '\0'. return String::Format("'%s' (%u, 0x%X)", ch ? String::Format("%c", ch).c_str() : "\\0", ch_as_uint, ch_as_uint); } // For a wchar_t value, we print it as a C++ wchar_t literal and as an // unsigned integer (both in decimal and in hexidecimal). String FormatForFailureMessage(wchar_t wchar) { // The C++ standard doesn't specify the exact size of the wchar_t // type. It just says that it shall have the same size as another // integral type, called its underlying type. // // Therefore, in order to print a wchar_t value in the numeric form, // we first convert it to the largest integral type (UInt64) and // then print the converted value. // // We use streaming to print the value as "%llu" doesn't work // correctly with MSVC 7.1. const UInt64 wchar_as_uint64 = wchar; Message msg; // A String object cannot contain '\0', so we print "\\0" when wchar is // L'\0'. char buffer[32]; // CodePointToUtf8 requires a buffer that big. msg << "L'" << (wchar ? CodePointToUtf8(static_cast(wchar), buffer) : "\\0") << "' (" << wchar_as_uint64 << ", 0x" << ::std::setbase(16) << wchar_as_uint64 << ")"; return msg.GetString(); } } // namespace internal // AssertionResult constructors. // Used in EXPECT_TRUE/FALSE(assertion_result). AssertionResult::AssertionResult(const AssertionResult& other) : success_(other.success_), message_(other.message_.get() != NULL ? new internal::String(*other.message_) : static_cast(NULL)) { } // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE. AssertionResult AssertionResult::operator!() const { AssertionResult negation(!success_); if (message_.get() != NULL) negation << *message_; return negation; } // Makes a successful assertion result. AssertionResult AssertionSuccess() { return AssertionResult(true); } // Makes a failed assertion result. AssertionResult AssertionFailure() { return AssertionResult(false); } // Makes a failed assertion result with the given failure message. // Deprecated; use AssertionFailure() << message. AssertionResult AssertionFailure(const Message& message) { return AssertionFailure() << message; } namespace internal { // Constructs and returns the message for an equality assertion // (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure. // // The first four parameters are the expressions used in the assertion // and their values, as strings. For example, for ASSERT_EQ(foo, bar) // where foo is 5 and bar is 6, we have: // // expected_expression: "foo" // actual_expression: "bar" // expected_value: "5" // actual_value: "6" // // The ignoring_case parameter is true iff the assertion is a // *_STRCASEEQ*. When it's true, the string " (ignoring case)" will // be inserted into the message. AssertionResult EqFailure(const char* expected_expression, const char* actual_expression, const String& expected_value, const String& actual_value, bool ignoring_case) { Message msg; msg << "Value of: " << actual_expression; if (actual_value != actual_expression) { msg << "\n Actual: " << actual_value; } msg << "\nExpected: " << expected_expression; if (ignoring_case) { msg << " (ignoring case)"; } if (expected_value != expected_expression) { msg << "\nWhich is: " << expected_value; } return AssertionFailure(msg); } // Constructs a failure message for Boolean assertions such as EXPECT_TRUE. String GetBoolAssertionFailureMessage(const AssertionResult& assertion_result, const char* expression_text, const char* actual_predicate_value, const char* expected_predicate_value) { const char* actual_message = assertion_result.message(); Message msg; msg << "Value of: " << expression_text << "\n Actual: " << actual_predicate_value; if (actual_message[0] != '\0') msg << " (" << actual_message << ")"; msg << "\nExpected: " << expected_predicate_value; return msg.GetString(); } // Helper function for implementing ASSERT_NEAR. AssertionResult DoubleNearPredFormat(const char* expr1, const char* expr2, const char* abs_error_expr, double val1, double val2, double abs_error) { const double diff = fabs(val1 - val2); if (diff <= abs_error) return AssertionSuccess(); // TODO(wan): do not print the value of an expression if it's // already a literal. Message msg; msg << "The difference between " << expr1 << " and " << expr2 << " is " << diff << ", which exceeds " << abs_error_expr << ", where\n" << expr1 << " evaluates to " << val1 << ",\n" << expr2 << " evaluates to " << val2 << ", and\n" << abs_error_expr << " evaluates to " << abs_error << "."; return AssertionFailure(msg); } // Helper template for implementing FloatLE() and DoubleLE(). template AssertionResult FloatingPointLE(const char* expr1, const char* expr2, RawType val1, RawType val2) { // Returns success if val1 is less than val2, if (val1 < val2) { return AssertionSuccess(); } // or if val1 is almost equal to val2. const FloatingPoint lhs(val1), rhs(val2); if (lhs.AlmostEquals(rhs)) { return AssertionSuccess(); } // Note that the above two checks will both fail if either val1 or // val2 is NaN, as the IEEE floating-point standard requires that // any predicate involving a NaN must return false. StrStream val1_ss; val1_ss << std::setprecision(std::numeric_limits::digits10 + 2) << val1; StrStream val2_ss; val2_ss << std::setprecision(std::numeric_limits::digits10 + 2) << val2; Message msg; msg << "Expected: (" << expr1 << ") <= (" << expr2 << ")\n" << " Actual: " << StrStreamToString(&val1_ss) << " vs " << StrStreamToString(&val2_ss); return AssertionFailure(msg); } } // namespace internal // Asserts that val1 is less than, or almost equal to, val2. Fails // otherwise. In particular, it fails if either val1 or val2 is NaN. AssertionResult FloatLE(const char* expr1, const char* expr2, float val1, float val2) { return internal::FloatingPointLE(expr1, expr2, val1, val2); } // Asserts that val1 is less than, or almost equal to, val2. Fails // otherwise. In particular, it fails if either val1 or val2 is NaN. AssertionResult DoubleLE(const char* expr1, const char* expr2, double val1, double val2) { return internal::FloatingPointLE(expr1, expr2, val1, val2); } namespace internal { // The helper function for {ASSERT|EXPECT}_EQ with int or enum // arguments. AssertionResult CmpHelperEQ(const char* expected_expression, const char* actual_expression, BiggestInt expected, BiggestInt actual) { if (expected == actual) { return AssertionSuccess(); } return EqFailure(expected_expression, actual_expression, FormatForComparisonFailureMessage(expected, actual), FormatForComparisonFailureMessage(actual, expected), false); } // A macro for implementing the helper functions needed to implement // ASSERT_?? and EXPECT_?? with integer or enum arguments. It is here // just to avoid copy-and-paste of similar code. #define GTEST_IMPL_CMP_HELPER_(op_name, op)\ AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \ BiggestInt val1, BiggestInt val2) {\ if (val1 op val2) {\ return AssertionSuccess();\ } else {\ Message msg;\ msg << "Expected: (" << expr1 << ") " #op " (" << expr2\ << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\ << " vs " << FormatForComparisonFailureMessage(val2, val1);\ return AssertionFailure(msg);\ }\ } // Implements the helper function for {ASSERT|EXPECT}_NE with int or // enum arguments. GTEST_IMPL_CMP_HELPER_(NE, !=) // Implements the helper function for {ASSERT|EXPECT}_LE with int or // enum arguments. GTEST_IMPL_CMP_HELPER_(LE, <=) // Implements the helper function for {ASSERT|EXPECT}_LT with int or // enum arguments. GTEST_IMPL_CMP_HELPER_(LT, < ) // Implements the helper function for {ASSERT|EXPECT}_GE with int or // enum arguments. GTEST_IMPL_CMP_HELPER_(GE, >=) // Implements the helper function for {ASSERT|EXPECT}_GT with int or // enum arguments. GTEST_IMPL_CMP_HELPER_(GT, > ) #undef GTEST_IMPL_CMP_HELPER_ // The helper function for {ASSERT|EXPECT}_STREQ. AssertionResult CmpHelperSTREQ(const char* expected_expression, const char* actual_expression, const char* expected, const char* actual) { if (String::CStringEquals(expected, actual)) { return AssertionSuccess(); } return EqFailure(expected_expression, actual_expression, String::ShowCStringQuoted(expected), String::ShowCStringQuoted(actual), false); } // The helper function for {ASSERT|EXPECT}_STRCASEEQ. AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression, const char* actual_expression, const char* expected, const char* actual) { if (String::CaseInsensitiveCStringEquals(expected, actual)) { return AssertionSuccess(); } return EqFailure(expected_expression, actual_expression, String::ShowCStringQuoted(expected), String::ShowCStringQuoted(actual), true); } // The helper function for {ASSERT|EXPECT}_STRNE. AssertionResult CmpHelperSTRNE(const char* s1_expression, const char* s2_expression, const char* s1, const char* s2) { if (!String::CStringEquals(s1, s2)) { return AssertionSuccess(); } else { Message msg; msg << "Expected: (" << s1_expression << ") != (" << s2_expression << "), actual: \"" << s1 << "\" vs \"" << s2 << "\""; return AssertionFailure(msg); } } // The helper function for {ASSERT|EXPECT}_STRCASENE. AssertionResult CmpHelperSTRCASENE(const char* s1_expression, const char* s2_expression, const char* s1, const char* s2) { if (!String::CaseInsensitiveCStringEquals(s1, s2)) { return AssertionSuccess(); } else { Message msg; msg << "Expected: (" << s1_expression << ") != (" << s2_expression << ") (ignoring case), actual: \"" << s1 << "\" vs \"" << s2 << "\""; return AssertionFailure(msg); } } } // namespace internal namespace { // Helper functions for implementing IsSubString() and IsNotSubstring(). // This group of overloaded functions return true iff needle is a // substring of haystack. NULL is considered a substring of itself // only. bool IsSubstringPred(const char* needle, const char* haystack) { if (needle == NULL || haystack == NULL) return needle == haystack; return strstr(haystack, needle) != NULL; } bool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) { if (needle == NULL || haystack == NULL) return needle == haystack; return wcsstr(haystack, needle) != NULL; } // StringType here can be either ::std::string or ::std::wstring. template bool IsSubstringPred(const StringType& needle, const StringType& haystack) { return haystack.find(needle) != StringType::npos; } // This function implements either IsSubstring() or IsNotSubstring(), // depending on the value of the expected_to_be_substring parameter. // StringType here can be const char*, const wchar_t*, ::std::string, // or ::std::wstring. template AssertionResult IsSubstringImpl( bool expected_to_be_substring, const char* needle_expr, const char* haystack_expr, const StringType& needle, const StringType& haystack) { if (IsSubstringPred(needle, haystack) == expected_to_be_substring) return AssertionSuccess(); const bool is_wide_string = sizeof(needle[0]) > 1; const char* const begin_string_quote = is_wide_string ? "L\"" : "\""; return AssertionFailure( Message() << "Value of: " << needle_expr << "\n" << " Actual: " << begin_string_quote << needle << "\"\n" << "Expected: " << (expected_to_be_substring ? "" : "not ") << "a substring of " << haystack_expr << "\n" << "Which is: " << begin_string_quote << haystack << "\""); } } // namespace // IsSubstring() and IsNotSubstring() check whether needle is a // substring of haystack (NULL is considered a substring of itself // only), and return an appropriate error message when they fail. AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const char* needle, const char* haystack) { return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); } AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const wchar_t* needle, const wchar_t* haystack) { return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); } AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const char* needle, const char* haystack) { return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); } AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const wchar_t* needle, const wchar_t* haystack) { return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); } AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const ::std::string& needle, const ::std::string& haystack) { return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); } AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const ::std::string& needle, const ::std::string& haystack) { return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); } #if GTEST_HAS_STD_WSTRING AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const ::std::wstring& needle, const ::std::wstring& haystack) { return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); } AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const ::std::wstring& needle, const ::std::wstring& haystack) { return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); } #endif // GTEST_HAS_STD_WSTRING namespace internal { #if GTEST_OS_WINDOWS namespace { // Helper function for IsHRESULT{SuccessFailure} predicates AssertionResult HRESULTFailureHelper(const char* expr, const char* expected, long hr) { // NOLINT #if GTEST_OS_WINDOWS_MOBILE // Windows CE doesn't support FormatMessage. const char error_text[] = ""; #else // Looks up the human-readable system message for the HRESULT code // and since we're not passing any params to FormatMessage, we don't // want inserts expanded. const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS; const DWORD kBufSize = 4096; // String::Format can't exceed this length. // Gets the system's human readable message string for this HRESULT. char error_text[kBufSize] = { '\0' }; DWORD message_length = ::FormatMessageA(kFlags, 0, // no source, we're asking system hr, // the error 0, // no line width restrictions error_text, // output buffer kBufSize, // buf size NULL); // no arguments for inserts // Trims tailing white space (FormatMessage leaves a trailing cr-lf) for (; message_length && isspace(error_text[message_length - 1]); --message_length) { error_text[message_length - 1] = '\0'; } #endif // GTEST_OS_WINDOWS_MOBILE const String error_hex(String::Format("0x%08X ", hr)); Message msg; msg << "Expected: " << expr << " " << expected << ".\n" << " Actual: " << error_hex << error_text << "\n"; return ::testing::AssertionFailure(msg); } } // namespace AssertionResult IsHRESULTSuccess(const char* expr, long hr) { // NOLINT if (SUCCEEDED(hr)) { return AssertionSuccess(); } return HRESULTFailureHelper(expr, "succeeds", hr); } AssertionResult IsHRESULTFailure(const char* expr, long hr) { // NOLINT if (FAILED(hr)) { return AssertionSuccess(); } return HRESULTFailureHelper(expr, "fails", hr); } #endif // GTEST_OS_WINDOWS // Utility functions for encoding Unicode text (wide strings) in // UTF-8. // A Unicode code-point can have upto 21 bits, and is encoded in UTF-8 // like this: // // Code-point length Encoding // 0 - 7 bits 0xxxxxxx // 8 - 11 bits 110xxxxx 10xxxxxx // 12 - 16 bits 1110xxxx 10xxxxxx 10xxxxxx // 17 - 21 bits 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx // The maximum code-point a one-byte UTF-8 sequence can represent. const UInt32 kMaxCodePoint1 = (static_cast(1) << 7) - 1; // The maximum code-point a two-byte UTF-8 sequence can represent. const UInt32 kMaxCodePoint2 = (static_cast(1) << (5 + 6)) - 1; // The maximum code-point a three-byte UTF-8 sequence can represent. const UInt32 kMaxCodePoint3 = (static_cast(1) << (4 + 2*6)) - 1; // The maximum code-point a four-byte UTF-8 sequence can represent. const UInt32 kMaxCodePoint4 = (static_cast(1) << (3 + 3*6)) - 1; // Chops off the n lowest bits from a bit pattern. Returns the n // lowest bits. As a side effect, the original bit pattern will be // shifted to the right by n bits. inline UInt32 ChopLowBits(UInt32* bits, int n) { const UInt32 low_bits = *bits & ((static_cast(1) << n) - 1); *bits >>= n; return low_bits; } // Converts a Unicode code point to a narrow string in UTF-8 encoding. // code_point parameter is of type UInt32 because wchar_t may not be // wide enough to contain a code point. // The output buffer str must containt at least 32 characters. // The function returns the address of the output buffer. // If the code_point is not a valid Unicode code point // (i.e. outside of Unicode range U+0 to U+10FFFF) it will be output // as '(Invalid Unicode 0xXXXXXXXX)'. char* CodePointToUtf8(UInt32 code_point, char* str) { if (code_point <= kMaxCodePoint1) { str[1] = '\0'; str[0] = static_cast(code_point); // 0xxxxxxx } else if (code_point <= kMaxCodePoint2) { str[2] = '\0'; str[1] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx str[0] = static_cast(0xC0 | code_point); // 110xxxxx } else if (code_point <= kMaxCodePoint3) { str[3] = '\0'; str[2] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx str[1] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx str[0] = static_cast(0xE0 | code_point); // 1110xxxx } else if (code_point <= kMaxCodePoint4) { str[4] = '\0'; str[3] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx str[2] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx str[1] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx str[0] = static_cast(0xF0 | code_point); // 11110xxx } else { // The longest string String::Format can produce when invoked // with these parameters is 28 character long (not including // the terminating nul character). We are asking for 32 character // buffer just in case. This is also enough for strncpy to // null-terminate the destination string. posix::StrNCpy( str, String::Format("(Invalid Unicode 0x%X)", code_point).c_str(), 32); str[31] = '\0'; // Makes sure no change in the format to strncpy leaves // the result unterminated. } return str; } // The following two functions only make sense if the the system // uses UTF-16 for wide string encoding. All supported systems // with 16 bit wchar_t (Windows, Cygwin, Symbian OS) do use UTF-16. // Determines if the arguments constitute UTF-16 surrogate pair // and thus should be combined into a single Unicode code point // using CreateCodePointFromUtf16SurrogatePair. inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) { return sizeof(wchar_t) == 2 && (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00; } // Creates a Unicode code point from UTF16 surrogate pair. inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first, wchar_t second) { const UInt32 mask = (1 << 10) - 1; return (sizeof(wchar_t) == 2) ? (((first & mask) << 10) | (second & mask)) + 0x10000 : // This function should not be called when the condition is // false, but we provide a sensible default in case it is. static_cast(first); } // Converts a wide string to a narrow string in UTF-8 encoding. // The wide string is assumed to have the following encoding: // UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS) // UTF-32 if sizeof(wchar_t) == 4 (on Linux) // Parameter str points to a null-terminated wide string. // Parameter num_chars may additionally limit the number // of wchar_t characters processed. -1 is used when the entire string // should be processed. // If the string contains code points that are not valid Unicode code points // (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output // as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding // and contains invalid UTF-16 surrogate pairs, values in those pairs // will be encoded as individual Unicode characters from Basic Normal Plane. String WideStringToUtf8(const wchar_t* str, int num_chars) { if (num_chars == -1) num_chars = static_cast(wcslen(str)); StrStream stream; for (int i = 0; i < num_chars; ++i) { UInt32 unicode_code_point; if (str[i] == L'\0') { break; } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) { unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i], str[i + 1]); i++; } else { unicode_code_point = static_cast(str[i]); } char buffer[32]; // CodePointToUtf8 requires a buffer this big. stream << CodePointToUtf8(unicode_code_point, buffer); } return StrStreamToString(&stream); } // Converts a wide C string to a String using the UTF-8 encoding. // NULL will be converted to "(null)". String String::ShowWideCString(const wchar_t * wide_c_str) { if (wide_c_str == NULL) return String("(null)"); return String(internal::WideStringToUtf8(wide_c_str, -1).c_str()); } // Similar to ShowWideCString(), except that this function encloses // the converted string in double quotes. String String::ShowWideCStringQuoted(const wchar_t* wide_c_str) { if (wide_c_str == NULL) return String("(null)"); return String::Format("L\"%s\"", String::ShowWideCString(wide_c_str).c_str()); } // Compares two wide C strings. Returns true iff they have the same // content. // // Unlike wcscmp(), this function can handle NULL argument(s). A NULL // C string is considered different to any non-NULL C string, // including the empty string. bool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) { if (lhs == NULL) return rhs == NULL; if (rhs == NULL) return false; return wcscmp(lhs, rhs) == 0; } // Helper function for *_STREQ on wide strings. AssertionResult CmpHelperSTREQ(const char* expected_expression, const char* actual_expression, const wchar_t* expected, const wchar_t* actual) { if (String::WideCStringEquals(expected, actual)) { return AssertionSuccess(); } return EqFailure(expected_expression, actual_expression, String::ShowWideCStringQuoted(expected), String::ShowWideCStringQuoted(actual), false); } // Helper function for *_STRNE on wide strings. AssertionResult CmpHelperSTRNE(const char* s1_expression, const char* s2_expression, const wchar_t* s1, const wchar_t* s2) { if (!String::WideCStringEquals(s1, s2)) { return AssertionSuccess(); } Message msg; msg << "Expected: (" << s1_expression << ") != (" << s2_expression << "), actual: " << String::ShowWideCStringQuoted(s1) << " vs " << String::ShowWideCStringQuoted(s2); return AssertionFailure(msg); } // Compares two C strings, ignoring case. Returns true iff they have // the same content. // // Unlike strcasecmp(), this function can handle NULL argument(s). A // NULL C string is considered different to any non-NULL C string, // including the empty string. bool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) { if (lhs == NULL) return rhs == NULL; if (rhs == NULL) return false; return posix::StrCaseCmp(lhs, rhs) == 0; } // Compares two wide C strings, ignoring case. Returns true iff they // have the same content. // // Unlike wcscasecmp(), this function can handle NULL argument(s). // A NULL C string is considered different to any non-NULL wide C string, // including the empty string. // NB: The implementations on different platforms slightly differ. // On windows, this method uses _wcsicmp which compares according to LC_CTYPE // environment variable. On GNU platform this method uses wcscasecmp // which compares according to LC_CTYPE category of the current locale. // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the // current locale. bool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs, const wchar_t* rhs) { if ( lhs == NULL ) return rhs == NULL; if ( rhs == NULL ) return false; #if GTEST_OS_WINDOWS return _wcsicmp(lhs, rhs) == 0; #elif GTEST_OS_LINUX return wcscasecmp(lhs, rhs) == 0; #else // Mac OS X and Cygwin don't define wcscasecmp. Other unknown OSes // may not define it either. wint_t left, right; do { left = towlower(*lhs++); right = towlower(*rhs++); } while (left && left == right); return left == right; #endif // OS selector } // Compares this with another String. // Returns < 0 if this is less than rhs, 0 if this is equal to rhs, or > 0 // if this is greater than rhs. int String::Compare(const String & rhs) const { const char* const lhs_c_str = c_str(); const char* const rhs_c_str = rhs.c_str(); if (lhs_c_str == NULL) { return rhs_c_str == NULL ? 0 : -1; // NULL < anything except NULL } else if (rhs_c_str == NULL) { return 1; } const size_t shorter_str_len = length() <= rhs.length() ? length() : rhs.length(); for (size_t i = 0; i != shorter_str_len; i++) { if (lhs_c_str[i] < rhs_c_str[i]) { return -1; } else if (lhs_c_str[i] > rhs_c_str[i]) { return 1; } } return (length() < rhs.length()) ? -1 : (length() > rhs.length()) ? 1 : 0; } // Returns true iff this String ends with the given suffix. *Any* // String is considered to end with a NULL or empty suffix. bool String::EndsWith(const char* suffix) const { if (suffix == NULL || CStringEquals(suffix, "")) return true; if (c_str() == NULL) return false; const size_t this_len = strlen(c_str()); const size_t suffix_len = strlen(suffix); return (this_len >= suffix_len) && CStringEquals(c_str() + this_len - suffix_len, suffix); } // Returns true iff this String ends with the given suffix, ignoring case. // Any String is considered to end with a NULL or empty suffix. bool String::EndsWithCaseInsensitive(const char* suffix) const { if (suffix == NULL || CStringEquals(suffix, "")) return true; if (c_str() == NULL) return false; const size_t this_len = strlen(c_str()); const size_t suffix_len = strlen(suffix); return (this_len >= suffix_len) && CaseInsensitiveCStringEquals(c_str() + this_len - suffix_len, suffix); } // Formats a list of arguments to a String, using the same format // spec string as for printf. // // We do not use the StringPrintf class as it is not universally // available. // // The result is limited to 4096 characters (including the tailing 0). // If 4096 characters are not enough to format the input, or if // there's an error, "" is // returned. String String::Format(const char * format, ...) { va_list args; va_start(args, format); char buffer[4096]; const int kBufferSize = sizeof(buffer)/sizeof(buffer[0]); // MSVC 8 deprecates vsnprintf(), so we want to suppress warning // 4996 (deprecated function) there. #ifdef _MSC_VER // We are using MSVC. #pragma warning(push) // Saves the current warning state. #pragma warning(disable:4996) // Temporarily disables warning 4996. const int size = vsnprintf(buffer, kBufferSize, format, args); #pragma warning(pop) // Restores the warning state. #else // We are not using MSVC. const int size = vsnprintf(buffer, kBufferSize, format, args); #endif // _MSC_VER va_end(args); // vsnprintf()'s behavior is not portable. When the buffer is not // big enough, it returns a negative value in MSVC, and returns the // needed buffer size on Linux. When there is an output error, it // always returns a negative value. For simplicity, we lump the two // error cases together. if (size < 0 || size >= kBufferSize) { return String(""); } else { return String(buffer, size); } } // Converts the buffer in a StrStream to a String, converting NUL // bytes to "\\0" along the way. String StrStreamToString(StrStream* ss) { const ::std::string& str = ss->str(); const char* const start = str.c_str(); const char* const end = start + str.length(); // We need to use a helper StrStream to do this transformation // because String doesn't support push_back(). StrStream helper; for (const char* ch = start; ch != end; ++ch) { if (*ch == '\0') { helper << "\\0"; // Replaces NUL with "\\0"; } else { helper.put(*ch); } } return String(helper.str().c_str()); } // Appends the user-supplied message to the Google-Test-generated message. String AppendUserMessage(const String& gtest_msg, const Message& user_msg) { // Appends the user message if it's non-empty. const String user_msg_string = user_msg.GetString(); if (user_msg_string.empty()) { return gtest_msg; } Message msg; msg << gtest_msg << "\n" << user_msg_string; return msg.GetString(); } } // namespace internal // class TestResult // Creates an empty TestResult. TestResult::TestResult() : death_test_count_(0), elapsed_time_(0) { } // D'tor. TestResult::~TestResult() { } // Returns the i-th test part result among all the results. i can // range from 0 to total_part_count() - 1. If i is not in that range, // aborts the program. const TestPartResult& TestResult::GetTestPartResult(int i) const { if (i < 0 || i >= total_part_count()) internal::posix::Abort(); return test_part_results_.at(i); } // Returns the i-th test property. i can range from 0 to // test_property_count() - 1. If i is not in that range, aborts the // program. const TestProperty& TestResult::GetTestProperty(int i) const { if (i < 0 || i >= test_property_count()) internal::posix::Abort(); return test_properties_.at(i); } // Clears the test part results. void TestResult::ClearTestPartResults() { test_part_results_.clear(); } // Adds a test part result to the list. void TestResult::AddTestPartResult(const TestPartResult& test_part_result) { test_part_results_.push_back(test_part_result); } // Adds a test property to the list. If a property with the same key as the // supplied property is already represented, the value of this test_property // replaces the old value for that key. void TestResult::RecordProperty(const TestProperty& test_property) { if (!ValidateTestProperty(test_property)) { return; } internal::MutexLock lock(&test_properites_mutex_); const std::vector::iterator property_with_matching_key = std::find_if(test_properties_.begin(), test_properties_.end(), internal::TestPropertyKeyIs(test_property.key())); if (property_with_matching_key == test_properties_.end()) { test_properties_.push_back(test_property); return; } property_with_matching_key->SetValue(test_property.value()); } // Adds a failure if the key is a reserved attribute of Google Test // testcase tags. Returns true if the property is valid. bool TestResult::ValidateTestProperty(const TestProperty& test_property) { internal::String key(test_property.key()); if (key == "name" || key == "status" || key == "time" || key == "classname") { ADD_FAILURE() << "Reserved key used in RecordProperty(): " << key << " ('name', 'status', 'time', and 'classname' are reserved by " << GTEST_NAME_ << ")"; return false; } return true; } // Clears the object. void TestResult::Clear() { test_part_results_.clear(); test_properties_.clear(); death_test_count_ = 0; elapsed_time_ = 0; } // Returns true iff the test failed. bool TestResult::Failed() const { for (int i = 0; i < total_part_count(); ++i) { if (GetTestPartResult(i).failed()) return true; } return false; } // Returns true iff the test part fatally failed. static bool TestPartFatallyFailed(const TestPartResult& result) { return result.fatally_failed(); } // Returns true iff the test fatally failed. bool TestResult::HasFatalFailure() const { return CountIf(test_part_results_, TestPartFatallyFailed) > 0; } // Returns true iff the test part non-fatally failed. static bool TestPartNonfatallyFailed(const TestPartResult& result) { return result.nonfatally_failed(); } // Returns true iff the test has a non-fatal failure. bool TestResult::HasNonfatalFailure() const { return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0; } // Gets the number of all test parts. This is the sum of the number // of successful test parts and the number of failed test parts. int TestResult::total_part_count() const { return static_cast(test_part_results_.size()); } // Returns the number of the test properties. int TestResult::test_property_count() const { return static_cast(test_properties_.size()); } // class Test // Creates a Test object. // The c'tor saves the values of all Google Test flags. Test::Test() : gtest_flag_saver_(new internal::GTestFlagSaver) { } // The d'tor restores the values of all Google Test flags. Test::~Test() { delete gtest_flag_saver_; } // Sets up the test fixture. // // A sub-class may override this. void Test::SetUp() { } // Tears down the test fixture. // // A sub-class may override this. void Test::TearDown() { } // Allows user supplied key value pairs to be recorded for later output. void Test::RecordProperty(const char* key, const char* value) { UnitTest::GetInstance()->RecordPropertyForCurrentTest(key, value); } // Allows user supplied key value pairs to be recorded for later output. void Test::RecordProperty(const char* key, int value) { Message value_message; value_message << value; RecordProperty(key, value_message.GetString().c_str()); } namespace internal { void ReportFailureInUnknownLocation(TestPartResult::Type result_type, const String& message) { // This function is a friend of UnitTest and as such has access to // AddTestPartResult. UnitTest::GetInstance()->AddTestPartResult( result_type, NULL, // No info about the source file where the exception occurred. -1, // We have no info on which line caused the exception. message, String()); // No stack trace, either. } } // namespace internal #if GTEST_OS_WINDOWS // We are on Windows. // Adds an "exception thrown" fatal failure to the current test. static void AddExceptionThrownFailure(DWORD exception_code, const char* location) { Message message; message << "Exception thrown with code 0x" << std::setbase(16) << exception_code << std::setbase(10) << " in " << location << "."; internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure, message.GetString()); } #endif // GTEST_OS_WINDOWS // Google Test requires all tests in the same test case to use the same test // fixture class. This function checks if the current test has the // same fixture class as the first test in the current test case. If // yes, it returns true; otherwise it generates a Google Test failure and // returns false. bool Test::HasSameFixtureClass() { internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); const TestCase* const test_case = impl->current_test_case(); // Info about the first test in the current test case. const internal::TestInfoImpl* const first_test_info = test_case->test_info_list()[0]->impl(); const internal::TypeId first_fixture_id = first_test_info->fixture_class_id(); const char* const first_test_name = first_test_info->name(); // Info about the current test. const internal::TestInfoImpl* const this_test_info = impl->current_test_info()->impl(); const internal::TypeId this_fixture_id = this_test_info->fixture_class_id(); const char* const this_test_name = this_test_info->name(); if (this_fixture_id != first_fixture_id) { // Is the first test defined using TEST? const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId(); // Is this test defined using TEST? const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId(); if (first_is_TEST || this_is_TEST) { // The user mixed TEST and TEST_F in this test case - we'll tell // him/her how to fix it. // Gets the name of the TEST and the name of the TEST_F. Note // that first_is_TEST and this_is_TEST cannot both be true, as // the fixture IDs are different for the two tests. const char* const TEST_name = first_is_TEST ? first_test_name : this_test_name; const char* const TEST_F_name = first_is_TEST ? this_test_name : first_test_name; ADD_FAILURE() << "All tests in the same test case must use the same test fixture\n" << "class, so mixing TEST_F and TEST in the same test case is\n" << "illegal. In test case " << this_test_info->test_case_name() << ",\n" << "test " << TEST_F_name << " is defined using TEST_F but\n" << "test " << TEST_name << " is defined using TEST. You probably\n" << "want to change the TEST to TEST_F or move it to another test\n" << "case."; } else { // The user defined two fixture classes with the same name in // two namespaces - we'll tell him/her how to fix it. ADD_FAILURE() << "All tests in the same test case must use the same test fixture\n" << "class. However, in test case " << this_test_info->test_case_name() << ",\n" << "you defined test " << first_test_name << " and test " << this_test_name << "\n" << "using two different test fixture classes. This can happen if\n" << "the two classes are from different namespaces or translation\n" << "units and have the same name. You should probably rename one\n" << "of the classes to put the tests into different test cases."; } return false; } return true; } // Runs the test and updates the test result. void Test::Run() { if (!HasSameFixtureClass()) return; internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); #if GTEST_HAS_SEH // Catch SEH-style exceptions. impl->os_stack_trace_getter()->UponLeavingGTest(); __try { SetUp(); } __except(internal::UnitTestOptions::GTestShouldProcessSEH( GetExceptionCode())) { AddExceptionThrownFailure(GetExceptionCode(), "SetUp()"); } // We will run the test only if SetUp() had no fatal failure. if (!HasFatalFailure()) { impl->os_stack_trace_getter()->UponLeavingGTest(); __try { TestBody(); } __except(internal::UnitTestOptions::GTestShouldProcessSEH( GetExceptionCode())) { AddExceptionThrownFailure(GetExceptionCode(), "the test body"); } } // However, we want to clean up as much as possible. Hence we will // always call TearDown(), even if SetUp() or the test body has // failed. impl->os_stack_trace_getter()->UponLeavingGTest(); __try { TearDown(); } __except(internal::UnitTestOptions::GTestShouldProcessSEH( GetExceptionCode())) { AddExceptionThrownFailure(GetExceptionCode(), "TearDown()"); } #else // We are on a compiler or platform that doesn't support SEH. impl->os_stack_trace_getter()->UponLeavingGTest(); SetUp(); // We will run the test only if SetUp() was successful. if (!HasFatalFailure()) { impl->os_stack_trace_getter()->UponLeavingGTest(); TestBody(); } // However, we want to clean up as much as possible. Hence we will // always call TearDown(), even if SetUp() or the test body has // failed. impl->os_stack_trace_getter()->UponLeavingGTest(); TearDown(); #endif // GTEST_HAS_SEH } // Returns true iff the current test has a fatal failure. bool Test::HasFatalFailure() { return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure(); } // Returns true iff the current test has a non-fatal failure. bool Test::HasNonfatalFailure() { return internal::GetUnitTestImpl()->current_test_result()-> HasNonfatalFailure(); } // class TestInfo // Constructs a TestInfo object. It assumes ownership of the test factory // object via impl_. TestInfo::TestInfo(const char* a_test_case_name, const char* a_name, const char* a_test_case_comment, const char* a_comment, internal::TypeId fixture_class_id, internal::TestFactoryBase* factory) { impl_ = new internal::TestInfoImpl(this, a_test_case_name, a_name, a_test_case_comment, a_comment, fixture_class_id, factory); } // Destructs a TestInfo object. TestInfo::~TestInfo() { delete impl_; } namespace internal { // Creates a new TestInfo object and registers it with Google Test; // returns the created object. // // Arguments: // // test_case_name: name of the test case // name: name of the test // test_case_comment: a comment on the test case that will be included in // the test output // comment: a comment on the test that will be included in the // test output // fixture_class_id: ID of the test fixture class // set_up_tc: pointer to the function that sets up the test case // tear_down_tc: pointer to the function that tears down the test case // factory: pointer to the factory that creates a test object. // The newly created TestInfo instance will assume // ownership of the factory object. TestInfo* MakeAndRegisterTestInfo( const char* test_case_name, const char* name, const char* test_case_comment, const char* comment, TypeId fixture_class_id, SetUpTestCaseFunc set_up_tc, TearDownTestCaseFunc tear_down_tc, TestFactoryBase* factory) { TestInfo* const test_info = new TestInfo(test_case_name, name, test_case_comment, comment, fixture_class_id, factory); GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info); return test_info; } #if GTEST_HAS_PARAM_TEST void ReportInvalidTestCaseType(const char* test_case_name, const char* file, int line) { Message errors; errors << "Attempted redefinition of test case " << test_case_name << ".\n" << "All tests in the same test case must use the same test fixture\n" << "class. However, in test case " << test_case_name << ", you tried\n" << "to define a test using a fixture class different from the one\n" << "used earlier. This can happen if the two fixture classes are\n" << "from different namespaces and have the same name. You should\n" << "probably rename one of the classes to put the tests into different\n" << "test cases."; fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(), errors.GetString().c_str()); } #endif // GTEST_HAS_PARAM_TEST } // namespace internal // Returns the test case name. const char* TestInfo::test_case_name() const { return impl_->test_case_name(); } // Returns the test name. const char* TestInfo::name() const { return impl_->name(); } // Returns the test case comment. const char* TestInfo::test_case_comment() const { return impl_->test_case_comment(); } // Returns the test comment. const char* TestInfo::comment() const { return impl_->comment(); } // Returns true if this test should run. bool TestInfo::should_run() const { return impl_->should_run(); } // Returns true if this test matches the user-specified filter. bool TestInfo::matches_filter() const { return impl_->matches_filter(); } // Returns the result of the test. const TestResult* TestInfo::result() const { return impl_->result(); } // Increments the number of death tests encountered in this test so // far. int TestInfo::increment_death_test_count() { return impl_->result()->increment_death_test_count(); } namespace { // A predicate that checks the test name of a TestInfo against a known // value. // // This is used for implementation of the TestCase class only. We put // it in the anonymous namespace to prevent polluting the outer // namespace. // // TestNameIs is copyable. class TestNameIs { public: // Constructor. // // TestNameIs has NO default constructor. explicit TestNameIs(const char* name) : name_(name) {} // Returns true iff the test name of test_info matches name_. bool operator()(const TestInfo * test_info) const { return test_info && internal::String(test_info->name()).Compare(name_) == 0; } private: internal::String name_; }; } // namespace namespace internal { // This method expands all parameterized tests registered with macros TEST_P // and INSTANTIATE_TEST_CASE_P into regular tests and registers those. // This will be done just once during the program runtime. void UnitTestImpl::RegisterParameterizedTests() { #if GTEST_HAS_PARAM_TEST if (!parameterized_tests_registered_) { parameterized_test_registry_.RegisterTests(); parameterized_tests_registered_ = true; } #endif } // Creates the test object, runs it, records its result, and then // deletes it. void TestInfoImpl::Run() { if (!should_run_) return; // Tells UnitTest where to store test result. UnitTestImpl* const impl = internal::GetUnitTestImpl(); impl->set_current_test_info(parent_); TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater(); // Notifies the unit test event listeners that a test is about to start. repeater->OnTestStart(*parent_); const TimeInMillis start = GetTimeInMillis(); impl->os_stack_trace_getter()->UponLeavingGTest(); #if GTEST_HAS_SEH // Catch SEH-style exceptions. Test* test = NULL; __try { // Creates the test object. test = factory_->CreateTest(); } __except(internal::UnitTestOptions::GTestShouldProcessSEH( GetExceptionCode())) { AddExceptionThrownFailure(GetExceptionCode(), "the test fixture's constructor"); return; } #else // We are on a compiler or platform that doesn't support SEH. // TODO(wan): If test->Run() throws, test won't be deleted. This is // not a problem now as we don't use exceptions. If we were to // enable exceptions, we should revise the following to be // exception-safe. // Creates the test object. Test* test = factory_->CreateTest(); #endif // GTEST_HAS_SEH // Runs the test only if the constructor of the test fixture didn't // generate a fatal failure. if (!Test::HasFatalFailure()) { test->Run(); } // Deletes the test object. impl->os_stack_trace_getter()->UponLeavingGTest(); delete test; test = NULL; result_.set_elapsed_time(GetTimeInMillis() - start); // Notifies the unit test event listener that a test has just finished. repeater->OnTestEnd(*parent_); // Tells UnitTest to stop associating assertion results to this // test. impl->set_current_test_info(NULL); } } // namespace internal // class TestCase // Gets the number of successful tests in this test case. int TestCase::successful_test_count() const { return CountIf(test_info_list_, TestPassed); } // Gets the number of failed tests in this test case. int TestCase::failed_test_count() const { return CountIf(test_info_list_, TestFailed); } int TestCase::disabled_test_count() const { return CountIf(test_info_list_, TestDisabled); } // Get the number of tests in this test case that should run. int TestCase::test_to_run_count() const { return CountIf(test_info_list_, ShouldRunTest); } // Gets the number of all tests. int TestCase::total_test_count() const { return static_cast(test_info_list_.size()); } // Creates a TestCase with the given name. // // Arguments: // // name: name of the test case // set_up_tc: pointer to the function that sets up the test case // tear_down_tc: pointer to the function that tears down the test case TestCase::TestCase(const char* a_name, const char* a_comment, Test::SetUpTestCaseFunc set_up_tc, Test::TearDownTestCaseFunc tear_down_tc) : name_(a_name), comment_(a_comment), set_up_tc_(set_up_tc), tear_down_tc_(tear_down_tc), should_run_(false), elapsed_time_(0) { } // Destructor of TestCase. TestCase::~TestCase() { // Deletes every Test in the collection. ForEach(test_info_list_, internal::Delete); } // Returns the i-th test among all the tests. i can range from 0 to // total_test_count() - 1. If i is not in that range, returns NULL. const TestInfo* TestCase::GetTestInfo(int i) const { const int index = GetElementOr(test_indices_, i, -1); return index < 0 ? NULL : test_info_list_[index]; } // Returns the i-th test among all the tests. i can range from 0 to // total_test_count() - 1. If i is not in that range, returns NULL. TestInfo* TestCase::GetMutableTestInfo(int i) { const int index = GetElementOr(test_indices_, i, -1); return index < 0 ? NULL : test_info_list_[index]; } // Adds a test to this test case. Will delete the test upon // destruction of the TestCase object. void TestCase::AddTestInfo(TestInfo * test_info) { test_info_list_.push_back(test_info); test_indices_.push_back(static_cast(test_indices_.size())); } // Runs every test in this TestCase. void TestCase::Run() { if (!should_run_) return; internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); impl->set_current_test_case(this); TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater(); repeater->OnTestCaseStart(*this); impl->os_stack_trace_getter()->UponLeavingGTest(); set_up_tc_(); const internal::TimeInMillis start = internal::GetTimeInMillis(); for (int i = 0; i < total_test_count(); i++) { GetMutableTestInfo(i)->impl()->Run(); } elapsed_time_ = internal::GetTimeInMillis() - start; impl->os_stack_trace_getter()->UponLeavingGTest(); tear_down_tc_(); repeater->OnTestCaseEnd(*this); impl->set_current_test_case(NULL); } // Clears the results of all tests in this test case. void TestCase::ClearResult() { ForEach(test_info_list_, internal::TestInfoImpl::ClearTestResult); } // Returns true iff test passed. bool TestCase::TestPassed(const TestInfo * test_info) { const internal::TestInfoImpl* const impl = test_info->impl(); return impl->should_run() && impl->result()->Passed(); } // Returns true iff test failed. bool TestCase::TestFailed(const TestInfo * test_info) { const internal::TestInfoImpl* const impl = test_info->impl(); return impl->should_run() && impl->result()->Failed(); } // Returns true iff test is disabled. bool TestCase::TestDisabled(const TestInfo * test_info) { return test_info->impl()->is_disabled(); } // Returns true if the given test should run. bool TestCase::ShouldRunTest(const TestInfo *test_info) { return test_info->impl()->should_run(); } // Shuffles the tests in this test case. void TestCase::ShuffleTests(internal::Random* random) { Shuffle(random, &test_indices_); } // Restores the test order to before the first shuffle. void TestCase::UnshuffleTests() { for (size_t i = 0; i < test_indices_.size(); i++) { test_indices_[i] = static_cast(i); } } // Formats a countable noun. Depending on its quantity, either the // singular form or the plural form is used. e.g. // // FormatCountableNoun(1, "formula", "formuli") returns "1 formula". // FormatCountableNoun(5, "book", "books") returns "5 books". static internal::String FormatCountableNoun(int count, const char * singular_form, const char * plural_form) { return internal::String::Format("%d %s", count, count == 1 ? singular_form : plural_form); } // Formats the count of tests. static internal::String FormatTestCount(int test_count) { return FormatCountableNoun(test_count, "test", "tests"); } // Formats the count of test cases. static internal::String FormatTestCaseCount(int test_case_count) { return FormatCountableNoun(test_case_count, "test case", "test cases"); } // Converts a TestPartResult::Type enum to human-friendly string // representation. Both kNonFatalFailure and kFatalFailure are translated // to "Failure", as the user usually doesn't care about the difference // between the two when viewing the test result. static const char * TestPartResultTypeToString(TestPartResult::Type type) { switch (type) { case TestPartResult::kSuccess: return "Success"; case TestPartResult::kNonFatalFailure: case TestPartResult::kFatalFailure: #ifdef _MSC_VER return "error: "; #else return "Failure\n"; #endif } return "Unknown result type"; } // Prints a TestPartResult to a String. static internal::String PrintTestPartResultToString( const TestPartResult& test_part_result) { return (Message() << internal::FormatFileLocation(test_part_result.file_name(), test_part_result.line_number()) << " " << TestPartResultTypeToString(test_part_result.type()) << test_part_result.message()).GetString(); } // Prints a TestPartResult. static void PrintTestPartResult(const TestPartResult& test_part_result) { const internal::String& result = PrintTestPartResultToString(test_part_result); printf("%s\n", result.c_str()); fflush(stdout); // If the test program runs in Visual Studio or a debugger, the // following statements add the test part result message to the Output // window such that the user can double-click on it to jump to the // corresponding source code location; otherwise they do nothing. #if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE // We don't call OutputDebugString*() on Windows Mobile, as printing // to stdout is done by OutputDebugString() there already - we don't // want the same message printed twice. ::OutputDebugStringA(result.c_str()); ::OutputDebugStringA("\n"); #endif } // class PrettyUnitTestResultPrinter namespace internal { enum GTestColor { COLOR_DEFAULT, COLOR_RED, COLOR_GREEN, COLOR_YELLOW }; #if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE // Returns the character attribute for the given color. WORD GetColorAttribute(GTestColor color) { switch (color) { case COLOR_RED: return FOREGROUND_RED; case COLOR_GREEN: return FOREGROUND_GREEN; case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN; default: return 0; } } #else // Returns the ANSI color code for the given color. COLOR_DEFAULT is // an invalid input. const char* GetAnsiColorCode(GTestColor color) { switch (color) { case COLOR_RED: return "1"; case COLOR_GREEN: return "2"; case COLOR_YELLOW: return "3"; default: return NULL; }; } #endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE // Returns true iff Google Test should use colors in the output. bool ShouldUseColor(bool stdout_is_tty) { const char* const gtest_color = GTEST_FLAG(color).c_str(); if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) { #if GTEST_OS_WINDOWS // On Windows the TERM variable is usually not set, but the // console there does support colors. return stdout_is_tty; #else // On non-Windows platforms, we rely on the TERM variable. const char* const term = posix::GetEnv("TERM"); const bool term_supports_color = String::CStringEquals(term, "xterm") || String::CStringEquals(term, "xterm-color") || String::CStringEquals(term, "xterm-256color") || String::CStringEquals(term, "linux") || String::CStringEquals(term, "cygwin"); return stdout_is_tty && term_supports_color; #endif // GTEST_OS_WINDOWS } return String::CaseInsensitiveCStringEquals(gtest_color, "yes") || String::CaseInsensitiveCStringEquals(gtest_color, "true") || String::CaseInsensitiveCStringEquals(gtest_color, "t") || String::CStringEquals(gtest_color, "1"); // We take "yes", "true", "t", and "1" as meaning "yes". If the // value is neither one of these nor "auto", we treat it as "no" to // be conservative. } // Helpers for printing colored strings to stdout. Note that on Windows, we // cannot simply emit special characters and have the terminal change colors. // This routine must actually emit the characters rather than return a string // that would be colored when printed, as can be done on Linux. void ColoredPrintf(GTestColor color, const char* fmt, ...) { va_list args; va_start(args, fmt); #if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS const bool use_color = false; #else static const bool in_color_mode = ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0); const bool use_color = in_color_mode && (color != COLOR_DEFAULT); #endif // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS // The '!= 0' comparison is necessary to satisfy MSVC 7.1. if (!use_color) { vprintf(fmt, args); va_end(args); return; } #if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE); // Gets the current text color. CONSOLE_SCREEN_BUFFER_INFO buffer_info; GetConsoleScreenBufferInfo(stdout_handle, &buffer_info); const WORD old_color_attrs = buffer_info.wAttributes; // We need to flush the stream buffers into the console before each // SetConsoleTextAttribute call lest it affect the text that is already // printed but has not yet reached the console. fflush(stdout); SetConsoleTextAttribute(stdout_handle, GetColorAttribute(color) | FOREGROUND_INTENSITY); vprintf(fmt, args); fflush(stdout); // Restores the text color. SetConsoleTextAttribute(stdout_handle, old_color_attrs); #else printf("\033[0;3%sm", GetAnsiColorCode(color)); vprintf(fmt, args); printf("\033[m"); // Resets the terminal to default. #endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE va_end(args); } // This class implements the TestEventListener interface. // // Class PrettyUnitTestResultPrinter is copyable. class PrettyUnitTestResultPrinter : public TestEventListener { public: PrettyUnitTestResultPrinter() {} static void PrintTestName(const char * test_case, const char * test) { printf("%s.%s", test_case, test); } // The following methods override what's in the TestEventListener class. virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {} virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration); virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test); virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {} virtual void OnTestCaseStart(const TestCase& test_case); virtual void OnTestStart(const TestInfo& test_info); virtual void OnTestPartResult(const TestPartResult& result); virtual void OnTestEnd(const TestInfo& test_info); virtual void OnTestCaseEnd(const TestCase& test_case); virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test); virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {} virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration); virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {} private: static void PrintFailedTests(const UnitTest& unit_test); internal::String test_case_name_; }; // Fired before each iteration of tests starts. void PrettyUnitTestResultPrinter::OnTestIterationStart( const UnitTest& unit_test, int iteration) { if (GTEST_FLAG(repeat) != 1) printf("\nRepeating all tests (iteration %d) . . .\n\n", iteration + 1); const char* const filter = GTEST_FLAG(filter).c_str(); // Prints the filter if it's not *. This reminds the user that some // tests may be skipped. if (!internal::String::CStringEquals(filter, kUniversalFilter)) { ColoredPrintf(COLOR_YELLOW, "Note: %s filter = %s\n", GTEST_NAME_, filter); } if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) { ColoredPrintf(COLOR_YELLOW, "Note: This is test shard %s of %s.\n", internal::posix::GetEnv(kTestShardIndex), internal::posix::GetEnv(kTestTotalShards)); } if (GTEST_FLAG(shuffle)) { ColoredPrintf(COLOR_YELLOW, "Note: Randomizing tests' orders with a seed of %d .\n", unit_test.random_seed()); } ColoredPrintf(COLOR_GREEN, "[==========] "); printf("Running %s from %s.\n", FormatTestCount(unit_test.test_to_run_count()).c_str(), FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str()); fflush(stdout); } void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart( const UnitTest& /*unit_test*/) { ColoredPrintf(COLOR_GREEN, "[----------] "); printf("Global test environment set-up.\n"); fflush(stdout); } void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) { test_case_name_ = test_case.name(); const internal::String counts = FormatCountableNoun(test_case.test_to_run_count(), "test", "tests"); ColoredPrintf(COLOR_GREEN, "[----------] "); printf("%s from %s", counts.c_str(), test_case_name_.c_str()); if (test_case.comment()[0] == '\0') { printf("\n"); } else { printf(", where %s\n", test_case.comment()); } fflush(stdout); } void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) { ColoredPrintf(COLOR_GREEN, "[ RUN ] "); PrintTestName(test_case_name_.c_str(), test_info.name()); if (test_info.comment()[0] == '\0') { printf("\n"); } else { printf(", where %s\n", test_info.comment()); } fflush(stdout); } // Called after an assertion failure. void PrettyUnitTestResultPrinter::OnTestPartResult( const TestPartResult& result) { // If the test part succeeded, we don't need to do anything. if (result.type() == TestPartResult::kSuccess) return; // Print failure message from the assertion (e.g. expected this and got that). PrintTestPartResult(result); fflush(stdout); } void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) { if (test_info.result()->Passed()) { ColoredPrintf(COLOR_GREEN, "[ OK ] "); } else { ColoredPrintf(COLOR_RED, "[ FAILED ] "); } PrintTestName(test_case_name_.c_str(), test_info.name()); if (GTEST_FLAG(print_time)) { printf(" (%s ms)\n", internal::StreamableToString( test_info.result()->elapsed_time()).c_str()); } else { printf("\n"); } fflush(stdout); } void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) { if (!GTEST_FLAG(print_time)) return; test_case_name_ = test_case.name(); const internal::String counts = FormatCountableNoun(test_case.test_to_run_count(), "test", "tests"); ColoredPrintf(COLOR_GREEN, "[----------] "); printf("%s from %s (%s ms total)\n\n", counts.c_str(), test_case_name_.c_str(), internal::StreamableToString(test_case.elapsed_time()).c_str()); fflush(stdout); } void PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart( const UnitTest& /*unit_test*/) { ColoredPrintf(COLOR_GREEN, "[----------] "); printf("Global test environment tear-down\n"); fflush(stdout); } // Internal helper for printing the list of failed tests. void PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) { const int failed_test_count = unit_test.failed_test_count(); if (failed_test_count == 0) { return; } for (int i = 0; i < unit_test.total_test_case_count(); ++i) { const TestCase& test_case = *unit_test.GetTestCase(i); if (!test_case.should_run() || (test_case.failed_test_count() == 0)) { continue; } for (int j = 0; j < test_case.total_test_count(); ++j) { const TestInfo& test_info = *test_case.GetTestInfo(j); if (!test_info.should_run() || test_info.result()->Passed()) { continue; } ColoredPrintf(COLOR_RED, "[ FAILED ] "); printf("%s.%s", test_case.name(), test_info.name()); if (test_case.comment()[0] != '\0' || test_info.comment()[0] != '\0') { printf(", where %s", test_case.comment()); if (test_case.comment()[0] != '\0' && test_info.comment()[0] != '\0') { printf(" and "); } } printf("%s\n", test_info.comment()); } } } void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test, int /*iteration*/) { ColoredPrintf(COLOR_GREEN, "[==========] "); printf("%s from %s ran.", FormatTestCount(unit_test.test_to_run_count()).c_str(), FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str()); if (GTEST_FLAG(print_time)) { printf(" (%s ms total)", internal::StreamableToString(unit_test.elapsed_time()).c_str()); } printf("\n"); ColoredPrintf(COLOR_GREEN, "[ PASSED ] "); printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str()); int num_failures = unit_test.failed_test_count(); if (!unit_test.Passed()) { const int failed_test_count = unit_test.failed_test_count(); ColoredPrintf(COLOR_RED, "[ FAILED ] "); printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str()); PrintFailedTests(unit_test); printf("\n%2d FAILED %s\n", num_failures, num_failures == 1 ? "TEST" : "TESTS"); } int num_disabled = unit_test.disabled_test_count(); if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) { if (!num_failures) { printf("\n"); // Add a spacer if no FAILURE banner is displayed. } ColoredPrintf(COLOR_YELLOW, " YOU HAVE %d DISABLED %s\n\n", num_disabled, num_disabled == 1 ? "TEST" : "TESTS"); } // Ensure that Google Test output is printed before, e.g., heapchecker output. fflush(stdout); } // End PrettyUnitTestResultPrinter // class TestEventRepeater // // This class forwards events to other event listeners. class TestEventRepeater : public TestEventListener { public: TestEventRepeater() : forwarding_enabled_(true) {} virtual ~TestEventRepeater(); void Append(TestEventListener *listener); TestEventListener* Release(TestEventListener* listener); // Controls whether events will be forwarded to listeners_. Set to false // in death test child processes. bool forwarding_enabled() const { return forwarding_enabled_; } void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; } virtual void OnTestProgramStart(const UnitTest& unit_test); virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration); virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test); virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test); virtual void OnTestCaseStart(const TestCase& test_case); virtual void OnTestStart(const TestInfo& test_info); virtual void OnTestPartResult(const TestPartResult& result); virtual void OnTestEnd(const TestInfo& test_info); virtual void OnTestCaseEnd(const TestCase& test_case); virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test); virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test); virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration); virtual void OnTestProgramEnd(const UnitTest& unit_test); private: // Controls whether events will be forwarded to listeners_. Set to false // in death test child processes. bool forwarding_enabled_; // The list of listeners that receive events. std::vector listeners_; GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater); }; TestEventRepeater::~TestEventRepeater() { ForEach(listeners_, Delete); } void TestEventRepeater::Append(TestEventListener *listener) { listeners_.push_back(listener); } // TODO(vladl@google.com): Factor the search functionality into Vector::Find. TestEventListener* TestEventRepeater::Release(TestEventListener *listener) { for (size_t i = 0; i < listeners_.size(); ++i) { if (listeners_[i] == listener) { listeners_.erase(listeners_.begin() + i); return listener; } } return NULL; } // Since most methods are very similar, use macros to reduce boilerplate. // This defines a member that forwards the call to all listeners. #define GTEST_REPEATER_METHOD_(Name, Type) \ void TestEventRepeater::Name(const Type& parameter) { \ if (forwarding_enabled_) { \ for (size_t i = 0; i < listeners_.size(); i++) { \ listeners_[i]->Name(parameter); \ } \ } \ } // This defines a member that forwards the call to all listeners in reverse // order. #define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \ void TestEventRepeater::Name(const Type& parameter) { \ if (forwarding_enabled_) { \ for (int i = static_cast(listeners_.size()) - 1; i >= 0; i--) { \ listeners_[i]->Name(parameter); \ } \ } \ } GTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest) GTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest) GTEST_REPEATER_METHOD_(OnTestCaseStart, TestCase) GTEST_REPEATER_METHOD_(OnTestStart, TestInfo) GTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult) GTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest) GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest) GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest) GTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo) GTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestCase) GTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest) #undef GTEST_REPEATER_METHOD_ #undef GTEST_REVERSE_REPEATER_METHOD_ void TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test, int iteration) { if (forwarding_enabled_) { for (size_t i = 0; i < listeners_.size(); i++) { listeners_[i]->OnTestIterationStart(unit_test, iteration); } } } void TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test, int iteration) { if (forwarding_enabled_) { for (int i = static_cast(listeners_.size()) - 1; i >= 0; i--) { listeners_[i]->OnTestIterationEnd(unit_test, iteration); } } } // End TestEventRepeater // This class generates an XML output file. class XmlUnitTestResultPrinter : public EmptyTestEventListener { public: explicit XmlUnitTestResultPrinter(const char* output_file); virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration); private: // Is c a whitespace character that is normalized to a space character // when it appears in an XML attribute value? static bool IsNormalizableWhitespace(char c) { return c == 0x9 || c == 0xA || c == 0xD; } // May c appear in a well-formed XML document? static bool IsValidXmlCharacter(char c) { return IsNormalizableWhitespace(c) || c >= 0x20; } // Returns an XML-escaped copy of the input string str. If // is_attribute is true, the text is meant to appear as an attribute // value, and normalizable whitespace is preserved by replacing it // with character references. static String EscapeXml(const char* str, bool is_attribute); // Returns the given string with all characters invalid in XML removed. static String RemoveInvalidXmlCharacters(const char* str); // Convenience wrapper around EscapeXml when str is an attribute value. static String EscapeXmlAttribute(const char* str) { return EscapeXml(str, true); } // Convenience wrapper around EscapeXml when str is not an attribute value. static String EscapeXmlText(const char* str) { return EscapeXml(str, false); } // Streams an XML CDATA section, escaping invalid CDATA sequences as needed. static void OutputXmlCDataSection(::std::ostream* stream, const char* data); // Streams an XML representation of a TestInfo object. static void OutputXmlTestInfo(::std::ostream* stream, const char* test_case_name, const TestInfo& test_info); // Prints an XML representation of a TestCase object static void PrintXmlTestCase(FILE* out, const TestCase& test_case); // Prints an XML summary of unit_test to output stream out. static void PrintXmlUnitTest(FILE* out, const UnitTest& unit_test); // Produces a string representing the test properties in a result as space // delimited XML attributes based on the property key="value" pairs. // When the String is not empty, it includes a space at the beginning, // to delimit this attribute from prior attributes. static String TestPropertiesAsXmlAttributes(const TestResult& result); // The output file. const String output_file_; GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter); }; // Creates a new XmlUnitTestResultPrinter. XmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file) : output_file_(output_file) { if (output_file_.c_str() == NULL || output_file_.empty()) { fprintf(stderr, "XML output file may not be null\n"); fflush(stderr); exit(EXIT_FAILURE); } } // Called after the unit test ends. void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test, int /*iteration*/) { FILE* xmlout = NULL; FilePath output_file(output_file_); FilePath output_dir(output_file.RemoveFileName()); if (output_dir.CreateDirectoriesRecursively()) { xmlout = posix::FOpen(output_file_.c_str(), "w"); } if (xmlout == NULL) { // TODO(wan): report the reason of the failure. // // We don't do it for now as: // // 1. There is no urgent need for it. // 2. It's a bit involved to make the errno variable thread-safe on // all three operating systems (Linux, Windows, and Mac OS). // 3. To interpret the meaning of errno in a thread-safe way, // we need the strerror_r() function, which is not available on // Windows. fprintf(stderr, "Unable to open file \"%s\"\n", output_file_.c_str()); fflush(stderr); exit(EXIT_FAILURE); } PrintXmlUnitTest(xmlout, unit_test); fclose(xmlout); } // Returns an XML-escaped copy of the input string str. If is_attribute // is true, the text is meant to appear as an attribute value, and // normalizable whitespace is preserved by replacing it with character // references. // // Invalid XML characters in str, if any, are stripped from the output. // It is expected that most, if not all, of the text processed by this // module will consist of ordinary English text. // If this module is ever modified to produce version 1.1 XML output, // most invalid characters can be retained using character references. // TODO(wan): It might be nice to have a minimally invasive, human-readable // escaping scheme for invalid characters, rather than dropping them. String XmlUnitTestResultPrinter::EscapeXml(const char* str, bool is_attribute) { Message m; if (str != NULL) { for (const char* src = str; *src; ++src) { switch (*src) { case '<': m << "<"; break; case '>': m << ">"; break; case '&': m << "&"; break; case '\'': if (is_attribute) m << "'"; else m << '\''; break; case '"': if (is_attribute) m << """; else m << '"'; break; default: if (IsValidXmlCharacter(*src)) { if (is_attribute && IsNormalizableWhitespace(*src)) m << String::Format("&#x%02X;", unsigned(*src)); else m << *src; } break; } } } return m.GetString(); } // Returns the given string with all characters invalid in XML removed. // Currently invalid characters are dropped from the string. An // alternative is to replace them with certain characters such as . or ?. String XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(const char* str) { char* const output = new char[strlen(str) + 1]; char* appender = output; for (char ch = *str; ch != '\0'; ch = *++str) if (IsValidXmlCharacter(ch)) *appender++ = ch; *appender = '\0'; String ret_value(output); delete[] output; return ret_value; } // The following routines generate an XML representation of a UnitTest // object. // // This is how Google Test concepts map to the DTD: // // <-- corresponds to a UnitTest object // <-- corresponds to a TestCase object // <-- corresponds to a TestInfo object // ... // ... // ... // <-- individual assertion failures // // // // Formats the given time in milliseconds as seconds. std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) { ::std::stringstream ss; ss << ms/1000.0; return ss.str(); } // Streams an XML CDATA section, escaping invalid CDATA sequences as needed. void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream, const char* data) { const char* segment = data; *stream << ""); if (next_segment != NULL) { stream->write( segment, static_cast(next_segment - segment)); *stream << "]]>]]>"); } else { *stream << segment; break; } } *stream << "]]>"; } // Prints an XML representation of a TestInfo object. // TODO(wan): There is also value in printing properties with the plain printer. void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream, const char* test_case_name, const TestInfo& test_info) { const TestResult& result = *test_info.result(); *stream << " \n"; *stream << " "; const String message = RemoveInvalidXmlCharacters(String::Format( "%s:%d\n%s", part.file_name(), part.line_number(), part.message()).c_str()); OutputXmlCDataSection(stream, message.c_str()); *stream << "\n"; } } if (failures == 0) *stream << " />\n"; else *stream << " \n"; } // Prints an XML representation of a TestCase object void XmlUnitTestResultPrinter::PrintXmlTestCase(FILE* out, const TestCase& test_case) { fprintf(out, " \n", FormatTimeInMillisAsSeconds(test_case.elapsed_time()).c_str()); for (int i = 0; i < test_case.total_test_count(); ++i) { StrStream stream; OutputXmlTestInfo(&stream, test_case.name(), *test_case.GetTestInfo(i)); fprintf(out, "%s", StrStreamToString(&stream).c_str()); } fprintf(out, " \n"); } // Prints an XML summary of unit_test to output stream out. void XmlUnitTestResultPrinter::PrintXmlUnitTest(FILE* out, const UnitTest& unit_test) { fprintf(out, "\n"); fprintf(out, "\n"); for (int i = 0; i < unit_test.total_test_case_count(); ++i) PrintXmlTestCase(out, *unit_test.GetTestCase(i)); fprintf(out, "\n"); } // Produces a string representing the test properties in a result as space // delimited XML attributes based on the property key="value" pairs. String XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes( const TestResult& result) { Message attributes; for (int i = 0; i < result.test_property_count(); ++i) { const TestProperty& property = result.GetTestProperty(i); attributes << " " << property.key() << "=" << "\"" << EscapeXmlAttribute(property.value()) << "\""; } return attributes.GetString(); } // End XmlUnitTestResultPrinter // Class ScopedTrace // Pushes the given source file location and message onto a per-thread // trace stack maintained by Google Test. // L < UnitTest::mutex_ ScopedTrace::ScopedTrace(const char* file, int line, const Message& message) { TraceInfo trace; trace.file = file; trace.line = line; trace.message = message.GetString(); UnitTest::GetInstance()->PushGTestTrace(trace); } // Pops the info pushed by the c'tor. // L < UnitTest::mutex_ ScopedTrace::~ScopedTrace() { UnitTest::GetInstance()->PopGTestTrace(); } // class OsStackTraceGetter // Returns the current OS stack trace as a String. Parameters: // // max_depth - the maximum number of stack frames to be included // in the trace. // skip_count - the number of top frames to be skipped; doesn't count // against max_depth. // // L < mutex_ // We use "L < mutex_" to denote that the function may acquire mutex_. String OsStackTraceGetter::CurrentStackTrace(int, int) { return String(""); } // L < mutex_ void OsStackTraceGetter::UponLeavingGTest() { } const char* const OsStackTraceGetter::kElidedFramesMarker = "... " GTEST_NAME_ " internal frames ..."; } // namespace internal // class TestEventListeners TestEventListeners::TestEventListeners() : repeater_(new internal::TestEventRepeater()), default_result_printer_(NULL), default_xml_generator_(NULL) { } TestEventListeners::~TestEventListeners() { delete repeater_; } // Returns the standard listener responsible for the default console // output. Can be removed from the listeners list to shut down default // console output. Note that removing this object from the listener list // with Release transfers its ownership to the user. void TestEventListeners::Append(TestEventListener* listener) { repeater_->Append(listener); } // Removes the given event listener from the list and returns it. It then // becomes the caller's responsibility to delete the listener. Returns // NULL if the listener is not found in the list. TestEventListener* TestEventListeners::Release(TestEventListener* listener) { if (listener == default_result_printer_) default_result_printer_ = NULL; else if (listener == default_xml_generator_) default_xml_generator_ = NULL; return repeater_->Release(listener); } // Returns repeater that broadcasts the TestEventListener events to all // subscribers. TestEventListener* TestEventListeners::repeater() { return repeater_; } // Sets the default_result_printer attribute to the provided listener. // The listener is also added to the listener list and previous // default_result_printer is removed from it and deleted. The listener can // also be NULL in which case it will not be added to the list. Does // nothing if the previous and the current listener objects are the same. void TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) { if (default_result_printer_ != listener) { // It is an error to pass this method a listener that is already in the // list. delete Release(default_result_printer_); default_result_printer_ = listener; if (listener != NULL) Append(listener); } } // Sets the default_xml_generator attribute to the provided listener. The // listener is also added to the listener list and previous // default_xml_generator is removed from it and deleted. The listener can // also be NULL in which case it will not be added to the list. Does // nothing if the previous and the current listener objects are the same. void TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) { if (default_xml_generator_ != listener) { // It is an error to pass this method a listener that is already in the // list. delete Release(default_xml_generator_); default_xml_generator_ = listener; if (listener != NULL) Append(listener); } } // Controls whether events will be forwarded by the repeater to the // listeners in the list. bool TestEventListeners::EventForwardingEnabled() const { return repeater_->forwarding_enabled(); } void TestEventListeners::SuppressEventForwarding() { repeater_->set_forwarding_enabled(false); } // class UnitTest // Gets the singleton UnitTest object. The first time this method is // called, a UnitTest object is constructed and returned. Consecutive // calls will return the same object. // // We don't protect this under mutex_ as a user is not supposed to // call this before main() starts, from which point on the return // value will never change. UnitTest * UnitTest::GetInstance() { // When compiled with MSVC 7.1 in optimized mode, destroying the // UnitTest object upon exiting the program messes up the exit code, // causing successful tests to appear failed. We have to use a // different implementation in this case to bypass the compiler bug. // This implementation makes the compiler happy, at the cost of // leaking the UnitTest object. // CodeGear C++Builder insists on a public destructor for the // default implementation. Use this implementation to keep good OO // design with private destructor. #if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__) static UnitTest* const instance = new UnitTest; return instance; #else static UnitTest instance; return &instance; #endif // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__) } // Gets the number of successful test cases. int UnitTest::successful_test_case_count() const { return impl()->successful_test_case_count(); } // Gets the number of failed test cases. int UnitTest::failed_test_case_count() const { return impl()->failed_test_case_count(); } // Gets the number of all test cases. int UnitTest::total_test_case_count() const { return impl()->total_test_case_count(); } // Gets the number of all test cases that contain at least one test // that should run. int UnitTest::test_case_to_run_count() const { return impl()->test_case_to_run_count(); } // Gets the number of successful tests. int UnitTest::successful_test_count() const { return impl()->successful_test_count(); } // Gets the number of failed tests. int UnitTest::failed_test_count() const { return impl()->failed_test_count(); } // Gets the number of disabled tests. int UnitTest::disabled_test_count() const { return impl()->disabled_test_count(); } // Gets the number of all tests. int UnitTest::total_test_count() const { return impl()->total_test_count(); } // Gets the number of tests that should run. int UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); } // Gets the elapsed time, in milliseconds. internal::TimeInMillis UnitTest::elapsed_time() const { return impl()->elapsed_time(); } // Returns true iff the unit test passed (i.e. all test cases passed). bool UnitTest::Passed() const { return impl()->Passed(); } // Returns true iff the unit test failed (i.e. some test case failed // or something outside of all tests failed). bool UnitTest::Failed() const { return impl()->Failed(); } // Gets the i-th test case among all the test cases. i can range from 0 to // total_test_case_count() - 1. If i is not in that range, returns NULL. const TestCase* UnitTest::GetTestCase(int i) const { return impl()->GetTestCase(i); } // Gets the i-th test case among all the test cases. i can range from 0 to // total_test_case_count() - 1. If i is not in that range, returns NULL. TestCase* UnitTest::GetMutableTestCase(int i) { return impl()->GetMutableTestCase(i); } // Returns the list of event listeners that can be used to track events // inside Google Test. TestEventListeners& UnitTest::listeners() { return *impl()->listeners(); } // Registers and returns a global test environment. When a test // program is run, all global test environments will be set-up in the // order they were registered. After all tests in the program have // finished, all global test environments will be torn-down in the // *reverse* order they were registered. // // The UnitTest object takes ownership of the given environment. // // We don't protect this under mutex_, as we only support calling it // from the main thread. Environment* UnitTest::AddEnvironment(Environment* env) { if (env == NULL) { return NULL; } impl_->environments().push_back(env); return env; } #if GTEST_HAS_EXCEPTIONS // A failed Google Test assertion will throw an exception of this type // when exceptions are enabled. We derive it from std::runtime_error, // which is for errors presumably detectable only at run time. Since // std::runtime_error inherits from std::exception, many testing // frameworks know how to extract and print the message inside it. class GoogleTestFailureException : public ::std::runtime_error { public: explicit GoogleTestFailureException(const TestPartResult& failure) : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {} }; #endif // Adds a TestPartResult to the current TestResult object. All Google Test // assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call // this to report their results. The user code should use the // assertion macros instead of calling this directly. // L < mutex_ void UnitTest::AddTestPartResult(TestPartResult::Type result_type, const char* file_name, int line_number, const internal::String& message, const internal::String& os_stack_trace) { Message msg; msg << message; internal::MutexLock lock(&mutex_); if (impl_->gtest_trace_stack().size() > 0) { msg << "\n" << GTEST_NAME_ << " trace:"; for (int i = static_cast(impl_->gtest_trace_stack().size()); i > 0; --i) { const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1]; msg << "\n" << internal::FormatFileLocation(trace.file, trace.line) << " " << trace.message; } } if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) { msg << internal::kStackTraceMarker << os_stack_trace; } const TestPartResult result = TestPartResult(result_type, file_name, line_number, msg.GetString().c_str()); impl_->GetTestPartResultReporterForCurrentThread()-> ReportTestPartResult(result); if (result_type != TestPartResult::kSuccess) { // gtest_break_on_failure takes precedence over // gtest_throw_on_failure. This allows a user to set the latter // in the code (perhaps in order to use Google Test assertions // with another testing framework) and specify the former on the // command line for debugging. if (GTEST_FLAG(break_on_failure)) { #if GTEST_OS_WINDOWS // Using DebugBreak on Windows allows gtest to still break into a debugger // when a failure happens and both the --gtest_break_on_failure and // the --gtest_catch_exceptions flags are specified. DebugBreak(); #else *static_cast(NULL) = 1; #endif // GTEST_OS_WINDOWS } else if (GTEST_FLAG(throw_on_failure)) { #if GTEST_HAS_EXCEPTIONS throw GoogleTestFailureException(result); #else // We cannot call abort() as it generates a pop-up in debug mode // that cannot be suppressed in VC 7.1 or below. exit(1); #endif } } } // Creates and adds a property to the current TestResult. If a property matching // the supplied value already exists, updates its value instead. void UnitTest::RecordPropertyForCurrentTest(const char* key, const char* value) { const TestProperty test_property(key, value); impl_->current_test_result()->RecordProperty(test_property); } // Runs all tests in this UnitTest object and prints the result. // Returns 0 if successful, or 1 otherwise. // // We don't protect this under mutex_, as we only support calling it // from the main thread. int UnitTest::Run() { #if GTEST_HAS_SEH // Catch SEH-style exceptions. const bool in_death_test_child_process = internal::GTEST_FLAG(internal_run_death_test).length() > 0; // Either the user wants Google Test to catch exceptions thrown by the // tests or this is executing in the context of death test child // process. In either case the user does not want to see pop-up dialogs // about crashes - they are expected.. if (GTEST_FLAG(catch_exceptions) || in_death_test_child_process) { #if !GTEST_OS_WINDOWS_MOBILE // SetErrorMode doesn't exist on CE. SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX); #endif // !GTEST_OS_WINDOWS_MOBILE #if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE // Death test children can be terminated with _abort(). On Windows, // _abort() can show a dialog with a warning message. This forces the // abort message to go to stderr instead. _set_error_mode(_OUT_TO_STDERR); #endif #if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE // In the debug version, Visual Studio pops up a separate dialog // offering a choice to debug the aborted program. We need to suppress // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement // executed. Google Test will notify the user of any unexpected // failure via stderr. // // VC++ doesn't define _set_abort_behavior() prior to the version 8.0. // Users of prior VC versions shall suffer the agony and pain of // clicking through the countless debug dialogs. // TODO(vladl@google.com): find a way to suppress the abort dialog() in the // debug mode when compiled with VC 7.1 or lower. if (!GTEST_FLAG(break_on_failure)) _set_abort_behavior( 0x0, // Clear the following flags: _WRITE_ABORT_MSG | _CALL_REPORTFAULT); // pop-up window, core dump. #endif } __try { return impl_->RunAllTests(); } __except(internal::UnitTestOptions::GTestShouldProcessSEH( GetExceptionCode())) { printf("Exception thrown with code 0x%x.\nFAIL\n", GetExceptionCode()); fflush(stdout); return 1; } #else // We are on a compiler or platform that doesn't support SEH. return impl_->RunAllTests(); #endif // GTEST_HAS_SEH } // Returns the working directory when the first TEST() or TEST_F() was // executed. const char* UnitTest::original_working_dir() const { return impl_->original_working_dir_.c_str(); } // Returns the TestCase object for the test that's currently running, // or NULL if no test is running. // L < mutex_ const TestCase* UnitTest::current_test_case() const { internal::MutexLock lock(&mutex_); return impl_->current_test_case(); } // Returns the TestInfo object for the test that's currently running, // or NULL if no test is running. // L < mutex_ const TestInfo* UnitTest::current_test_info() const { internal::MutexLock lock(&mutex_); return impl_->current_test_info(); } // Returns the random seed used at the start of the current test run. int UnitTest::random_seed() const { return impl_->random_seed(); } #if GTEST_HAS_PARAM_TEST // Returns ParameterizedTestCaseRegistry object used to keep track of // value-parameterized tests and instantiate and register them. // L < mutex_ internal::ParameterizedTestCaseRegistry& UnitTest::parameterized_test_registry() { return impl_->parameterized_test_registry(); } #endif // GTEST_HAS_PARAM_TEST // Creates an empty UnitTest. UnitTest::UnitTest() { impl_ = new internal::UnitTestImpl(this); } // Destructor of UnitTest. UnitTest::~UnitTest() { delete impl_; } // Pushes a trace defined by SCOPED_TRACE() on to the per-thread // Google Test trace stack. // L < mutex_ void UnitTest::PushGTestTrace(const internal::TraceInfo& trace) { internal::MutexLock lock(&mutex_); impl_->gtest_trace_stack().push_back(trace); } // Pops a trace from the per-thread Google Test trace stack. // L < mutex_ void UnitTest::PopGTestTrace() { internal::MutexLock lock(&mutex_); impl_->gtest_trace_stack().pop_back(); } namespace internal { UnitTestImpl::UnitTestImpl(UnitTest* parent) : parent_(parent), #ifdef _MSC_VER #pragma warning(push) // Saves the current warning state. #pragma warning(disable:4355) // Temporarily disables warning 4355 // (using this in initializer). default_global_test_part_result_reporter_(this), default_per_thread_test_part_result_reporter_(this), #pragma warning(pop) // Restores the warning state again. #else default_global_test_part_result_reporter_(this), default_per_thread_test_part_result_reporter_(this), #endif // _MSC_VER global_test_part_result_repoter_( &default_global_test_part_result_reporter_), per_thread_test_part_result_reporter_( &default_per_thread_test_part_result_reporter_), #if GTEST_HAS_PARAM_TEST parameterized_test_registry_(), parameterized_tests_registered_(false), #endif // GTEST_HAS_PARAM_TEST last_death_test_case_(-1), current_test_case_(NULL), current_test_info_(NULL), ad_hoc_test_result_(), os_stack_trace_getter_(NULL), post_flag_parse_init_performed_(false), random_seed_(0), // Will be overridden by the flag before first use. random_(0), // Will be reseeded before first use. #if GTEST_HAS_DEATH_TEST elapsed_time_(0), internal_run_death_test_flag_(NULL), death_test_factory_(new DefaultDeathTestFactory) { #else elapsed_time_(0) { #endif // GTEST_HAS_DEATH_TEST listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter); } UnitTestImpl::~UnitTestImpl() { // Deletes every TestCase. ForEach(test_cases_, internal::Delete); // Deletes every Environment. ForEach(environments_, internal::Delete); delete os_stack_trace_getter_; } #if GTEST_HAS_DEATH_TEST // Disables event forwarding if the control is currently in a death test // subprocess. Must not be called before InitGoogleTest. void UnitTestImpl::SuppressTestEventsIfInSubprocess() { if (internal_run_death_test_flag_.get() != NULL) listeners()->SuppressEventForwarding(); } #endif // GTEST_HAS_DEATH_TEST // Initializes event listeners performing XML output as specified by // UnitTestOptions. Must not be called before InitGoogleTest. void UnitTestImpl::ConfigureXmlOutput() { const String& output_format = UnitTestOptions::GetOutputFormat(); if (output_format == "xml") { listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter( UnitTestOptions::GetAbsolutePathToOutputFile().c_str())); } else if (output_format != "") { printf("WARNING: unrecognized output format \"%s\" ignored.\n", output_format.c_str()); fflush(stdout); } } // Performs initialization dependent upon flag values obtained in // ParseGoogleTestFlagsOnly. Is called from InitGoogleTest after the call to // ParseGoogleTestFlagsOnly. In case a user neglects to call InitGoogleTest // this function is also called from RunAllTests. Since this function can be // called more than once, it has to be idempotent. void UnitTestImpl::PostFlagParsingInit() { // Ensures that this function does not execute more than once. if (!post_flag_parse_init_performed_) { post_flag_parse_init_performed_ = true; #if GTEST_HAS_DEATH_TEST InitDeathTestSubprocessControlInfo(); SuppressTestEventsIfInSubprocess(); #endif // GTEST_HAS_DEATH_TEST // Registers parameterized tests. This makes parameterized tests // available to the UnitTest reflection API without running // RUN_ALL_TESTS. RegisterParameterizedTests(); // Configures listeners for XML output. This makes it possible for users // to shut down the default XML output before invoking RUN_ALL_TESTS. ConfigureXmlOutput(); } } // A predicate that checks the name of a TestCase against a known // value. // // This is used for implementation of the UnitTest class only. We put // it in the anonymous namespace to prevent polluting the outer // namespace. // // TestCaseNameIs is copyable. class TestCaseNameIs { public: // Constructor. explicit TestCaseNameIs(const String& name) : name_(name) {} // Returns true iff the name of test_case matches name_. bool operator()(const TestCase* test_case) const { return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0; } private: String name_; }; // Finds and returns a TestCase with the given name. If one doesn't // exist, creates one and returns it. It's the CALLER'S // RESPONSIBILITY to ensure that this function is only called WHEN THE // TESTS ARE NOT SHUFFLED. // // Arguments: // // test_case_name: name of the test case // set_up_tc: pointer to the function that sets up the test case // tear_down_tc: pointer to the function that tears down the test case TestCase* UnitTestImpl::GetTestCase(const char* test_case_name, const char* comment, Test::SetUpTestCaseFunc set_up_tc, Test::TearDownTestCaseFunc tear_down_tc) { // Can we find a TestCase with the given name? const std::vector::const_iterator test_case = std::find_if(test_cases_.begin(), test_cases_.end(), TestCaseNameIs(test_case_name)); if (test_case != test_cases_.end()) return *test_case; // No. Let's create one. TestCase* const new_test_case = new TestCase(test_case_name, comment, set_up_tc, tear_down_tc); // Is this a death test case? if (internal::UnitTestOptions::MatchesFilter(String(test_case_name), kDeathTestCaseFilter)) { // Yes. Inserts the test case after the last death test case // defined so far. This only works when the test cases haven't // been shuffled. Otherwise we may end up running a death test // after a non-death test. ++last_death_test_case_; test_cases_.insert(test_cases_.begin() + last_death_test_case_, new_test_case); } else { // No. Appends to the end of the list. test_cases_.push_back(new_test_case); } test_case_indices_.push_back(static_cast(test_case_indices_.size())); return new_test_case; } // Helpers for setting up / tearing down the given environment. They // are for use in the ForEach() function. static void SetUpEnvironment(Environment* env) { env->SetUp(); } static void TearDownEnvironment(Environment* env) { env->TearDown(); } // Runs all tests in this UnitTest object, prints the result, and // returns 0 if all tests are successful, or 1 otherwise. If any // exception is thrown during a test on Windows, this test is // considered to be failed, but the rest of the tests will still be // run. (We disable exceptions on Linux and Mac OS X, so the issue // doesn't apply there.) // When parameterized tests are enabled, it expands and registers // parameterized tests first in RegisterParameterizedTests(). // All other functions called from RunAllTests() may safely assume that // parameterized tests are ready to be counted and run. int UnitTestImpl::RunAllTests() { // Makes sure InitGoogleTest() was called. if (!GTestIsInitialized()) { printf("%s", "\nThis test program did NOT call ::testing::InitGoogleTest " "before calling RUN_ALL_TESTS(). Please fix it.\n"); return 1; } // Do not run any test if the --help flag was specified. if (g_help_flag) return 0; // Repeats the call to the post-flag parsing initialization in case the // user didn't call InitGoogleTest. PostFlagParsingInit(); // Even if sharding is not on, test runners may want to use the // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding // protocol. internal::WriteToShardStatusFileIfNeeded(); // True iff we are in a subprocess for running a thread-safe-style // death test. bool in_subprocess_for_death_test = false; #if GTEST_HAS_DEATH_TEST in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL); #endif // GTEST_HAS_DEATH_TEST const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex, in_subprocess_for_death_test); // Compares the full test names with the filter to decide which // tests to run. const bool has_tests_to_run = FilterTests(should_shard ? HONOR_SHARDING_PROTOCOL : IGNORE_SHARDING_PROTOCOL) > 0; // Lists the tests and exits if the --gtest_list_tests flag was specified. if (GTEST_FLAG(list_tests)) { // This must be called *after* FilterTests() has been called. ListTestsMatchingFilter(); return 0; } random_seed_ = GTEST_FLAG(shuffle) ? GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0; // True iff at least one test has failed. bool failed = false; TestEventListener* repeater = listeners()->repeater(); repeater->OnTestProgramStart(*parent_); // How many times to repeat the tests? We don't want to repeat them // when we are inside the subprocess of a death test. const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat); // Repeats forever if the repeat count is negative. const bool forever = repeat < 0; for (int i = 0; forever || i != repeat; i++) { ClearResult(); const TimeInMillis start = GetTimeInMillis(); // Shuffles test cases and tests if requested. if (has_tests_to_run && GTEST_FLAG(shuffle)) { random()->Reseed(random_seed_); // This should be done before calling OnTestIterationStart(), // such that a test event listener can see the actual test order // in the event. ShuffleTests(); } // Tells the unit test event listeners that the tests are about to start. repeater->OnTestIterationStart(*parent_, i); // Runs each test case if there is at least one test to run. if (has_tests_to_run) { // Sets up all environments beforehand. repeater->OnEnvironmentsSetUpStart(*parent_); ForEach(environments_, SetUpEnvironment); repeater->OnEnvironmentsSetUpEnd(*parent_); // Runs the tests only if there was no fatal failure during global // set-up. if (!Test::HasFatalFailure()) { for (int test_index = 0; test_index < total_test_case_count(); test_index++) { GetMutableTestCase(test_index)->Run(); } } // Tears down all environments in reverse order afterwards. repeater->OnEnvironmentsTearDownStart(*parent_); std::for_each(environments_.rbegin(), environments_.rend(), TearDownEnvironment); repeater->OnEnvironmentsTearDownEnd(*parent_); } elapsed_time_ = GetTimeInMillis() - start; // Tells the unit test event listener that the tests have just finished. repeater->OnTestIterationEnd(*parent_, i); // Gets the result and clears it. if (!Passed()) { failed = true; } // Restores the original test order after the iteration. This // allows the user to quickly repro a failure that happens in the // N-th iteration without repeating the first (N - 1) iterations. // This is not enclosed in "if (GTEST_FLAG(shuffle)) { ... }", in // case the user somehow changes the value of the flag somewhere // (it's always safe to unshuffle the tests). UnshuffleTests(); if (GTEST_FLAG(shuffle)) { // Picks a new random seed for each iteration. random_seed_ = GetNextRandomSeed(random_seed_); } } repeater->OnTestProgramEnd(*parent_); // Returns 0 if all tests passed, or 1 other wise. return failed ? 1 : 0; } // Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file // if the variable is present. If a file already exists at this location, this // function will write over it. If the variable is present, but the file cannot // be created, prints an error and exits. void WriteToShardStatusFileIfNeeded() { const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile); if (test_shard_file != NULL) { FILE* const file = posix::FOpen(test_shard_file, "w"); if (file == NULL) { ColoredPrintf(COLOR_RED, "Could not write to the test shard status file \"%s\" " "specified by the %s environment variable.\n", test_shard_file, kTestShardStatusFile); fflush(stdout); exit(EXIT_FAILURE); } fclose(file); } } // Checks whether sharding is enabled by examining the relevant // environment variable values. If the variables are present, // but inconsistent (i.e., shard_index >= total_shards), prints // an error and exits. If in_subprocess_for_death_test, sharding is // disabled because it must only be applied to the original test // process. Otherwise, we could filter out death tests we intended to execute. bool ShouldShard(const char* total_shards_env, const char* shard_index_env, bool in_subprocess_for_death_test) { if (in_subprocess_for_death_test) { return false; } const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1); const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1); if (total_shards == -1 && shard_index == -1) { return false; } else if (total_shards == -1 && shard_index != -1) { const Message msg = Message() << "Invalid environment variables: you have " << kTestShardIndex << " = " << shard_index << ", but have left " << kTestTotalShards << " unset.\n"; ColoredPrintf(COLOR_RED, msg.GetString().c_str()); fflush(stdout); exit(EXIT_FAILURE); } else if (total_shards != -1 && shard_index == -1) { const Message msg = Message() << "Invalid environment variables: you have " << kTestTotalShards << " = " << total_shards << ", but have left " << kTestShardIndex << " unset.\n"; ColoredPrintf(COLOR_RED, msg.GetString().c_str()); fflush(stdout); exit(EXIT_FAILURE); } else if (shard_index < 0 || shard_index >= total_shards) { const Message msg = Message() << "Invalid environment variables: we require 0 <= " << kTestShardIndex << " < " << kTestTotalShards << ", but you have " << kTestShardIndex << "=" << shard_index << ", " << kTestTotalShards << "=" << total_shards << ".\n"; ColoredPrintf(COLOR_RED, msg.GetString().c_str()); fflush(stdout); exit(EXIT_FAILURE); } return total_shards > 1; } // Parses the environment variable var as an Int32. If it is unset, // returns default_val. If it is not an Int32, prints an error // and aborts. Int32 Int32FromEnvOrDie(const char* const var, Int32 default_val) { const char* str_val = posix::GetEnv(var); if (str_val == NULL) { return default_val; } Int32 result; if (!ParseInt32(Message() << "The value of environment variable " << var, str_val, &result)) { exit(EXIT_FAILURE); } return result; } // Given the total number of shards, the shard index, and the test id, // returns true iff the test should be run on this shard. The test id is // some arbitrary but unique non-negative integer assigned to each test // method. Assumes that 0 <= shard_index < total_shards. bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) { return (test_id % total_shards) == shard_index; } // Compares the name of each test with the user-specified filter to // decide whether the test should be run, then records the result in // each TestCase and TestInfo object. // If shard_tests == true, further filters tests based on sharding // variables in the environment - see // http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide. // Returns the number of tests that should run. int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) { const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ? Int32FromEnvOrDie(kTestTotalShards, -1) : -1; const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ? Int32FromEnvOrDie(kTestShardIndex, -1) : -1; // num_runnable_tests are the number of tests that will // run across all shards (i.e., match filter and are not disabled). // num_selected_tests are the number of tests to be run on // this shard. int num_runnable_tests = 0; int num_selected_tests = 0; for (size_t i = 0; i < test_cases_.size(); i++) { TestCase* const test_case = test_cases_[i]; const String &test_case_name = test_case->name(); test_case->set_should_run(false); for (size_t j = 0; j < test_case->test_info_list().size(); j++) { TestInfo* const test_info = test_case->test_info_list()[j]; const String test_name(test_info->name()); // A test is disabled if test case name or test name matches // kDisableTestFilter. const bool is_disabled = internal::UnitTestOptions::MatchesFilter(test_case_name, kDisableTestFilter) || internal::UnitTestOptions::MatchesFilter(test_name, kDisableTestFilter); test_info->impl()->set_is_disabled(is_disabled); const bool matches_filter = internal::UnitTestOptions::FilterMatchesTest(test_case_name, test_name); test_info->impl()->set_matches_filter(matches_filter); const bool is_runnable = (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) && matches_filter; const bool is_selected = is_runnable && (shard_tests == IGNORE_SHARDING_PROTOCOL || ShouldRunTestOnShard(total_shards, shard_index, num_runnable_tests)); num_runnable_tests += is_runnable; num_selected_tests += is_selected; test_info->impl()->set_should_run(is_selected); test_case->set_should_run(test_case->should_run() || is_selected); } } return num_selected_tests; } // Prints the names of the tests matching the user-specified filter flag. void UnitTestImpl::ListTestsMatchingFilter() { for (size_t i = 0; i < test_cases_.size(); i++) { const TestCase* const test_case = test_cases_[i]; bool printed_test_case_name = false; for (size_t j = 0; j < test_case->test_info_list().size(); j++) { const TestInfo* const test_info = test_case->test_info_list()[j]; if (test_info->matches_filter()) { if (!printed_test_case_name) { printed_test_case_name = true; printf("%s.\n", test_case->name()); } printf(" %s\n", test_info->name()); } } } fflush(stdout); } // Sets the OS stack trace getter. // // Does nothing if the input and the current OS stack trace getter are // the same; otherwise, deletes the old getter and makes the input the // current getter. void UnitTestImpl::set_os_stack_trace_getter( OsStackTraceGetterInterface* getter) { if (os_stack_trace_getter_ != getter) { delete os_stack_trace_getter_; os_stack_trace_getter_ = getter; } } // Returns the current OS stack trace getter if it is not NULL; // otherwise, creates an OsStackTraceGetter, makes it the current // getter, and returns it. OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() { if (os_stack_trace_getter_ == NULL) { os_stack_trace_getter_ = new OsStackTraceGetter; } return os_stack_trace_getter_; } // Returns the TestResult for the test that's currently running, or // the TestResult for the ad hoc test if no test is running. TestResult* UnitTestImpl::current_test_result() { return current_test_info_ ? current_test_info_->impl()->result() : &ad_hoc_test_result_; } // Shuffles all test cases, and the tests within each test case, // making sure that death tests are still run first. void UnitTestImpl::ShuffleTests() { // Shuffles the death test cases. ShuffleRange(random(), 0, last_death_test_case_ + 1, &test_case_indices_); // Shuffles the non-death test cases. ShuffleRange(random(), last_death_test_case_ + 1, static_cast(test_cases_.size()), &test_case_indices_); // Shuffles the tests inside each test case. for (size_t i = 0; i < test_cases_.size(); i++) { test_cases_[i]->ShuffleTests(random()); } } // Restores the test cases and tests to their order before the first shuffle. void UnitTestImpl::UnshuffleTests() { for (size_t i = 0; i < test_cases_.size(); i++) { // Unshuffles the tests in each test case. test_cases_[i]->UnshuffleTests(); // Resets the index of each test case. test_case_indices_[i] = static_cast(i); } } // TestInfoImpl constructor. The new instance assumes ownership of the test // factory object. TestInfoImpl::TestInfoImpl(TestInfo* parent, const char* a_test_case_name, const char* a_name, const char* a_test_case_comment, const char* a_comment, TypeId a_fixture_class_id, internal::TestFactoryBase* factory) : parent_(parent), test_case_name_(String(a_test_case_name)), name_(String(a_name)), test_case_comment_(String(a_test_case_comment)), comment_(String(a_comment)), fixture_class_id_(a_fixture_class_id), should_run_(false), is_disabled_(false), matches_filter_(false), factory_(factory) { } // TestInfoImpl destructor. TestInfoImpl::~TestInfoImpl() { delete factory_; } // Returns the current OS stack trace as a String. // // The maximum number of stack frames to be included is specified by // the gtest_stack_trace_depth flag. The skip_count parameter // specifies the number of top frames to be skipped, which doesn't // count against the number of frames to be included. // // For example, if Foo() calls Bar(), which in turn calls // GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in // the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't. String GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/, int skip_count) { // We pass skip_count + 1 to skip this wrapper function in addition // to what the user really wants to skip. return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1); } // Used by the GTEST_HIDE_UNREACHABLE_CODE_ macro to suppress unreachable // code warnings. namespace { class ClassUniqueToAlwaysTrue {}; } bool IsTrue(bool condition) { return condition; } bool AlwaysTrue() { #if GTEST_HAS_EXCEPTIONS // This condition is always false so AlwaysTrue() never actually throws, // but it makes the compiler think that it may throw. if (IsTrue(false)) throw ClassUniqueToAlwaysTrue(); #endif // GTEST_HAS_EXCEPTIONS return true; } // If *pstr starts with the given prefix, modifies *pstr to be right // past the prefix and returns true; otherwise leaves *pstr unchanged // and returns false. None of pstr, *pstr, and prefix can be NULL. bool SkipPrefix(const char* prefix, const char** pstr) { const size_t prefix_len = strlen(prefix); if (strncmp(*pstr, prefix, prefix_len) == 0) { *pstr += prefix_len; return true; } return false; } // Parses a string as a command line flag. The string should have // the format "--flag=value". When def_optional is true, the "=value" // part can be omitted. // // Returns the value of the flag, or NULL if the parsing failed. const char* ParseFlagValue(const char* str, const char* flag, bool def_optional) { // str and flag must not be NULL. if (str == NULL || flag == NULL) return NULL; // The flag must start with "--" followed by GTEST_FLAG_PREFIX_. const String flag_str = String::Format("--%s%s", GTEST_FLAG_PREFIX_, flag); const size_t flag_len = flag_str.length(); if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL; // Skips the flag name. const char* flag_end = str + flag_len; // When def_optional is true, it's OK to not have a "=value" part. if (def_optional && (flag_end[0] == '\0')) { return flag_end; } // If def_optional is true and there are more characters after the // flag name, or if def_optional is false, there must be a '=' after // the flag name. if (flag_end[0] != '=') return NULL; // Returns the string after "=". return flag_end + 1; } // Parses a string for a bool flag, in the form of either // "--flag=value" or "--flag". // // In the former case, the value is taken as true as long as it does // not start with '0', 'f', or 'F'. // // In the latter case, the value is taken as true. // // On success, stores the value of the flag in *value, and returns // true. On failure, returns false without changing *value. bool ParseBoolFlag(const char* str, const char* flag, bool* value) { // Gets the value of the flag as a string. const char* const value_str = ParseFlagValue(str, flag, true); // Aborts if the parsing failed. if (value_str == NULL) return false; // Converts the string value to a bool. *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F'); return true; } // Parses a string for an Int32 flag, in the form of // "--flag=value". // // On success, stores the value of the flag in *value, and returns // true. On failure, returns false without changing *value. bool ParseInt32Flag(const char* str, const char* flag, Int32* value) { // Gets the value of the flag as a string. const char* const value_str = ParseFlagValue(str, flag, false); // Aborts if the parsing failed. if (value_str == NULL) return false; // Sets *value to the value of the flag. return ParseInt32(Message() << "The value of flag --" << flag, value_str, value); } // Parses a string for a string flag, in the form of // "--flag=value". // // On success, stores the value of the flag in *value, and returns // true. On failure, returns false without changing *value. bool ParseStringFlag(const char* str, const char* flag, String* value) { // Gets the value of the flag as a string. const char* const value_str = ParseFlagValue(str, flag, false); // Aborts if the parsing failed. if (value_str == NULL) return false; // Sets *value to the value of the flag. *value = value_str; return true; } // Determines whether a string has a prefix that Google Test uses for its // flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_. // If Google Test detects that a command line flag has its prefix but is not // recognized, it will print its help message. Flags starting with // GTEST_INTERNAL_PREFIX_ followed by "internal_" are considered Google Test // internal flags and do not trigger the help message. static bool HasGoogleTestFlagPrefix(const char* str) { return (SkipPrefix("--", &str) || SkipPrefix("-", &str) || SkipPrefix("/", &str)) && !SkipPrefix(GTEST_FLAG_PREFIX_ "internal_", &str) && (SkipPrefix(GTEST_FLAG_PREFIX_, &str) || SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str)); } // Prints a string containing code-encoded text. The following escape // sequences can be used in the string to control the text color: // // @@ prints a single '@' character. // @R changes the color to red. // @G changes the color to green. // @Y changes the color to yellow. // @D changes to the default terminal text color. // // TODO(wan@google.com): Write tests for this once we add stdout // capturing to Google Test. static void PrintColorEncoded(const char* str) { GTestColor color = COLOR_DEFAULT; // The current color. // Conceptually, we split the string into segments divided by escape // sequences. Then we print one segment at a time. At the end of // each iteration, the str pointer advances to the beginning of the // next segment. for (;;) { const char* p = strchr(str, '@'); if (p == NULL) { ColoredPrintf(color, "%s", str); return; } ColoredPrintf(color, "%s", String(str, p - str).c_str()); const char ch = p[1]; str = p + 2; if (ch == '@') { ColoredPrintf(color, "@"); } else if (ch == 'D') { color = COLOR_DEFAULT; } else if (ch == 'R') { color = COLOR_RED; } else if (ch == 'G') { color = COLOR_GREEN; } else if (ch == 'Y') { color = COLOR_YELLOW; } else { --str; } } } static const char kColorEncodedHelpMessage[] = "This program contains tests written using " GTEST_NAME_ ". You can use the\n" "following command line flags to control its behavior:\n" "\n" "Test Selection:\n" " @G--" GTEST_FLAG_PREFIX_ "list_tests@D\n" " List the names of all tests instead of running them. The name of\n" " TEST(Foo, Bar) is \"Foo.Bar\".\n" " @G--" GTEST_FLAG_PREFIX_ "filter=@YPOSTIVE_PATTERNS" "[@G-@YNEGATIVE_PATTERNS]@D\n" " Run only the tests whose name matches one of the positive patterns but\n" " none of the negative patterns. '?' matches any single character; '*'\n" " matches any substring; ':' separates two patterns.\n" " @G--" GTEST_FLAG_PREFIX_ "also_run_disabled_tests@D\n" " Run all disabled tests too.\n" "\n" "Test Execution:\n" " @G--" GTEST_FLAG_PREFIX_ "repeat=@Y[COUNT]@D\n" " Run the tests repeatedly; use a negative count to repeat forever.\n" " @G--" GTEST_FLAG_PREFIX_ "shuffle@D\n" " Randomize tests' orders on every iteration.\n" " @G--" GTEST_FLAG_PREFIX_ "random_seed=@Y[NUMBER]@D\n" " Random number seed to use for shuffling test orders (between 1 and\n" " 99999, or 0 to use a seed based on the current time).\n" "\n" "Test Output:\n" " @G--" GTEST_FLAG_PREFIX_ "color=@Y(@Gyes@Y|@Gno@Y|@Gauto@Y)@D\n" " Enable/disable colored output. The default is @Gauto@D.\n" " -@G-" GTEST_FLAG_PREFIX_ "print_time=0@D\n" " Don't print the elapsed time of each test.\n" " @G--" GTEST_FLAG_PREFIX_ "output=xml@Y[@G:@YDIRECTORY_PATH@G" GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n" " Generate an XML report in the given directory or with the given file\n" " name. @YFILE_PATH@D defaults to @Gtest_details.xml@D.\n" "\n" "Assertion Behavior:\n" #if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS " @G--" GTEST_FLAG_PREFIX_ "death_test_style=@Y(@Gfast@Y|@Gthreadsafe@Y)@D\n" " Set the default death test style.\n" #endif // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS " @G--" GTEST_FLAG_PREFIX_ "break_on_failure@D\n" " Turn assertion failures into debugger break-points.\n" " @G--" GTEST_FLAG_PREFIX_ "throw_on_failure@D\n" " Turn assertion failures into C++ exceptions.\n" #if GTEST_OS_WINDOWS " @G--" GTEST_FLAG_PREFIX_ "catch_exceptions@D\n" " Suppress pop-ups caused by exceptions.\n" #endif // GTEST_OS_WINDOWS "\n" "Except for @G--" GTEST_FLAG_PREFIX_ "list_tests@D, you can alternatively set " "the corresponding\n" "environment variable of a flag (all letters in upper-case). For example, to\n" "disable colored text output, you can either specify @G--" GTEST_FLAG_PREFIX_ "color=no@D or set\n" "the @G" GTEST_FLAG_PREFIX_UPPER_ "COLOR@D environment variable to @Gno@D.\n" "\n" "For more information, please read the " GTEST_NAME_ " documentation at\n" "@G" GTEST_PROJECT_URL_ "@D. If you find a bug in " GTEST_NAME_ "\n" "(not one in your own code or tests), please report it to\n" "@G<" GTEST_DEV_EMAIL_ ">@D.\n"; // Parses the command line for Google Test flags, without initializing // other parts of Google Test. The type parameter CharType can be // instantiated to either char or wchar_t. template void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) { for (int i = 1; i < *argc; i++) { const String arg_string = StreamableToString(argv[i]); const char* const arg = arg_string.c_str(); using internal::ParseBoolFlag; using internal::ParseInt32Flag; using internal::ParseStringFlag; // Do we see a Google Test flag? if (ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag, >EST_FLAG(also_run_disabled_tests)) || ParseBoolFlag(arg, kBreakOnFailureFlag, >EST_FLAG(break_on_failure)) || ParseBoolFlag(arg, kCatchExceptionsFlag, >EST_FLAG(catch_exceptions)) || ParseStringFlag(arg, kColorFlag, >EST_FLAG(color)) || ParseStringFlag(arg, kDeathTestStyleFlag, >EST_FLAG(death_test_style)) || ParseBoolFlag(arg, kDeathTestUseFork, >EST_FLAG(death_test_use_fork)) || ParseStringFlag(arg, kFilterFlag, >EST_FLAG(filter)) || ParseStringFlag(arg, kInternalRunDeathTestFlag, >EST_FLAG(internal_run_death_test)) || ParseBoolFlag(arg, kListTestsFlag, >EST_FLAG(list_tests)) || ParseStringFlag(arg, kOutputFlag, >EST_FLAG(output)) || ParseBoolFlag(arg, kPrintTimeFlag, >EST_FLAG(print_time)) || ParseInt32Flag(arg, kRandomSeedFlag, >EST_FLAG(random_seed)) || ParseInt32Flag(arg, kRepeatFlag, >EST_FLAG(repeat)) || ParseBoolFlag(arg, kShuffleFlag, >EST_FLAG(shuffle)) || ParseInt32Flag(arg, kStackTraceDepthFlag, >EST_FLAG(stack_trace_depth)) || ParseBoolFlag(arg, kThrowOnFailureFlag, >EST_FLAG(throw_on_failure)) ) { // Yes. Shift the remainder of the argv list left by one. Note // that argv has (*argc + 1) elements, the last one always being // NULL. The following loop moves the trailing NULL element as // well. for (int j = i; j != *argc; j++) { argv[j] = argv[j + 1]; } // Decrements the argument count. (*argc)--; // We also need to decrement the iterator as we just removed // an element. i--; } else if (arg_string == "--help" || arg_string == "-h" || arg_string == "-?" || arg_string == "/?" || HasGoogleTestFlagPrefix(arg)) { // Both help flag and unrecognized Google Test flags (excluding // internal ones) trigger help display. g_help_flag = true; } } if (g_help_flag) { // We print the help here instead of in RUN_ALL_TESTS(), as the // latter may not be called at all if the user is using Google // Test with another testing framework. PrintColorEncoded(kColorEncodedHelpMessage); } } // Parses the command line for Google Test flags, without initializing // other parts of Google Test. void ParseGoogleTestFlagsOnly(int* argc, char** argv) { ParseGoogleTestFlagsOnlyImpl(argc, argv); } void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) { ParseGoogleTestFlagsOnlyImpl(argc, argv); } // The internal implementation of InitGoogleTest(). // // The type parameter CharType can be instantiated to either char or // wchar_t. template void InitGoogleTestImpl(int* argc, CharType** argv) { g_init_gtest_count++; // We don't want to run the initialization code twice. if (g_init_gtest_count != 1) return; if (*argc <= 0) return; internal::g_executable_path = internal::StreamableToString(argv[0]); #if GTEST_HAS_DEATH_TEST g_argvs.clear(); for (int i = 0; i != *argc; i++) { g_argvs.push_back(StreamableToString(argv[i])); } #endif // GTEST_HAS_DEATH_TEST ParseGoogleTestFlagsOnly(argc, argv); GetUnitTestImpl()->PostFlagParsingInit(); } } // namespace internal // Initializes Google Test. This must be called before calling // RUN_ALL_TESTS(). In particular, it parses a command line for the // flags that Google Test recognizes. Whenever a Google Test flag is // seen, it is removed from argv, and *argc is decremented. // // No value is returned. Instead, the Google Test flag variables are // updated. // // Calling the function for the second time has no user-visible effect. void InitGoogleTest(int* argc, char** argv) { internal::InitGoogleTestImpl(argc, argv); } // This overloaded version can be used in Windows programs compiled in // UNICODE mode. void InitGoogleTest(int* argc, wchar_t** argv) { internal::InitGoogleTestImpl(argc, argv); } } // namespace testing clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/gtest/src/gtest_main.cc000066400000000000000000000033411260417502300266160ustar00rootroot00000000000000// Copyright 2006, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include int main(int argc, char **argv) { std::cout << "Running main() from gtest_main.cc\n"; testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/include/000077500000000000000000000000001260417502300236625ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/include/gmock/000077500000000000000000000000001260417502300247625ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/include/gmock/gmock-actions.h000066400000000000000000001053211260417502300276730ustar00rootroot00000000000000// Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Google Mock - a framework for writing C++ mock classes. // // This file implements some commonly used actions. #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_ #define GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_ #include #include #ifndef _WIN32_WCE #include #endif #include #include #include namespace testing { // To implement an action Foo, define: // 1. a class FooAction that implements the ActionInterface interface, and // 2. a factory function that creates an Action object from a // const FooAction*. // // The two-level delegation design follows that of Matcher, providing // consistency for extension developers. It also eases ownership // management as Action objects can now be copied like plain values. namespace internal { template class MonomorphicDoDefaultActionImpl; template class ActionAdaptor; // BuiltInDefaultValue::Get() returns the "built-in" default // value for type T, which is NULL when T is a pointer type, 0 when T // is a numeric type, false when T is bool, or "" when T is string or // std::string. For any other type T, this value is undefined and the // function will abort the process. template class BuiltInDefaultValue { public: // This function returns true iff type T has a built-in default value. static bool Exists() { return false; } static T Get() { Assert(false, __FILE__, __LINE__, "Default action undefined for the function return type."); return internal::Invalid(); // The above statement will never be reached, but is required in // order for this function to compile. } }; // This partial specialization says that we use the same built-in // default value for T and const T. template class BuiltInDefaultValue { public: static bool Exists() { return BuiltInDefaultValue::Exists(); } static T Get() { return BuiltInDefaultValue::Get(); } }; // This partial specialization defines the default values for pointer // types. template class BuiltInDefaultValue { public: static bool Exists() { return true; } static T* Get() { return NULL; } }; // The following specializations define the default values for // specific types we care about. #define GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(type, value) \ template <> \ class BuiltInDefaultValue { \ public: \ static bool Exists() { return true; } \ static type Get() { return value; } \ } GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(void, ); // NOLINT #if GTEST_HAS_GLOBAL_STRING GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(::string, ""); #endif // GTEST_HAS_GLOBAL_STRING GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(::std::string, ""); GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(bool, false); GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned char, '\0'); GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed char, '\0'); GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(char, '\0'); // There's no need for a default action for signed wchar_t, as that // type is the same as wchar_t for gcc, and invalid for MSVC. // // There's also no need for a default action for unsigned wchar_t, as // that type is the same as unsigned int for gcc, and invalid for // MSVC. #if GMOCK_WCHAR_T_IS_NATIVE_ GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(wchar_t, 0U); // NOLINT #endif GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned short, 0U); // NOLINT GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed short, 0); // NOLINT GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned int, 0U); GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed int, 0); GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned long, 0UL); // NOLINT GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed long, 0L); // NOLINT GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(UInt64, 0); GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(Int64, 0); GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(float, 0); GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(double, 0); #undef GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_ } // namespace internal // When an unexpected function call is encountered, Google Mock will // let it return a default value if the user has specified one for its // return type, or if the return type has a built-in default value; // otherwise Google Mock won't know what value to return and will have // to abort the process. // // The DefaultValue class allows a user to specify the // default value for a type T that is both copyable and publicly // destructible (i.e. anything that can be used as a function return // type). The usage is: // // // Sets the default value for type T to be foo. // DefaultValue::Set(foo); template class DefaultValue { public: // Sets the default value for type T; requires T to be // copy-constructable and have a public destructor. static void Set(T x) { delete value_; value_ = new T(x); } // Unsets the default value for type T. static void Clear() { delete value_; value_ = NULL; } // Returns true iff the user has set the default value for type T. static bool IsSet() { return value_ != NULL; } // Returns true if T has a default return value set by the user or there // exists a built-in default value. static bool Exists() { return IsSet() || internal::BuiltInDefaultValue::Exists(); } // Returns the default value for type T if the user has set one; // otherwise returns the built-in default value if there is one; // otherwise aborts the process. static T Get() { return value_ == NULL ? internal::BuiltInDefaultValue::Get() : *value_; } private: static const T* value_; }; // This partial specialization allows a user to set default values for // reference types. template class DefaultValue { public: // Sets the default value for type T&. static void Set(T& x) { // NOLINT address_ = &x; } // Unsets the default value for type T&. static void Clear() { address_ = NULL; } // Returns true iff the user has set the default value for type T&. static bool IsSet() { return address_ != NULL; } // Returns true if T has a default return value set by the user or there // exists a built-in default value. static bool Exists() { return IsSet() || internal::BuiltInDefaultValue::Exists(); } // Returns the default value for type T& if the user has set one; // otherwise returns the built-in default value if there is one; // otherwise aborts the process. static T& Get() { return address_ == NULL ? internal::BuiltInDefaultValue::Get() : *address_; } private: static T* address_; }; // This specialization allows DefaultValue::Get() to // compile. template <> class DefaultValue { public: static bool Exists() { return true; } static void Get() {} }; // Points to the user-set default value for type T. template const T* DefaultValue::value_ = NULL; // Points to the user-set default value for type T&. template T* DefaultValue::address_ = NULL; // Implement this interface to define an action for function type F. template class ActionInterface { public: typedef typename internal::Function::Result Result; typedef typename internal::Function::ArgumentTuple ArgumentTuple; ActionInterface() : is_do_default_(false) {} virtual ~ActionInterface() {} // Performs the action. This method is not const, as in general an // action can have side effects and be stateful. For example, a // get-the-next-element-from-the-collection action will need to // remember the current element. virtual Result Perform(const ArgumentTuple& args) = 0; // Returns true iff this is the DoDefault() action. bool IsDoDefault() const { return is_do_default_; } private: template friend class internal::MonomorphicDoDefaultActionImpl; // This private constructor is reserved for implementing // DoDefault(), the default action for a given mock function. explicit ActionInterface(bool is_do_default) : is_do_default_(is_do_default) {} // True iff this action is DoDefault(). const bool is_do_default_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ActionInterface); }; // An Action is a copyable and IMMUTABLE (except by assignment) // object that represents an action to be taken when a mock function // of type F is called. The implementation of Action is just a // linked_ptr to const ActionInterface, so copying is fairly cheap. // Don't inherit from Action! // // You can view an object implementing ActionInterface as a // concrete action (including its current state), and an Action // object as a handle to it. template class Action { public: typedef typename internal::Function::Result Result; typedef typename internal::Function::ArgumentTuple ArgumentTuple; // Constructs a null Action. Needed for storing Action objects in // STL containers. Action() : impl_(NULL) {} // Constructs an Action from its implementation. explicit Action(ActionInterface* impl) : impl_(impl) {} // Copy constructor. Action(const Action& action) : impl_(action.impl_) {} // This constructor allows us to turn an Action object into an // Action, as long as F's arguments can be implicitly converted // to Func's and Func's return type can be implicitly converted to // F's. template explicit Action(const Action& action); // Returns true iff this is the DoDefault() action. bool IsDoDefault() const { return impl_->IsDoDefault(); } // Performs the action. Note that this method is const even though // the corresponding method in ActionInterface is not. The reason // is that a const Action means that it cannot be re-bound to // another concrete action, not that the concrete action it binds to // cannot change state. (Think of the difference between a const // pointer and a pointer to const.) Result Perform(const ArgumentTuple& args) const { return impl_->Perform(args); } private: template friend class internal::ActionAdaptor; internal::linked_ptr > impl_; }; // The PolymorphicAction class template makes it easy to implement a // polymorphic action (i.e. an action that can be used in mock // functions of than one type, e.g. Return()). // // To define a polymorphic action, a user first provides a COPYABLE // implementation class that has a Perform() method template: // // class FooAction { // public: // template // Result Perform(const ArgumentTuple& args) const { // // Processes the arguments and returns a result, using // // tr1::get(args) to get the N-th (0-based) argument in the tuple. // } // ... // }; // // Then the user creates the polymorphic action using // MakePolymorphicAction(object) where object has type FooAction. See // the definition of Return(void) and SetArgumentPointee(value) for // complete examples. template class PolymorphicAction { public: explicit PolymorphicAction(const Impl& impl) : impl_(impl) {} template operator Action() const { return Action(new MonomorphicImpl(impl_)); } private: template class MonomorphicImpl : public ActionInterface { public: typedef typename internal::Function::Result Result; typedef typename internal::Function::ArgumentTuple ArgumentTuple; explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {} virtual Result Perform(const ArgumentTuple& args) { return impl_.template Perform(args); } private: Impl impl_; GTEST_DISALLOW_ASSIGN_(MonomorphicImpl); }; Impl impl_; GTEST_DISALLOW_ASSIGN_(PolymorphicAction); }; // Creates an Action from its implementation and returns it. The // created Action object owns the implementation. template Action MakeAction(ActionInterface* impl) { return Action(impl); } // Creates a polymorphic action from its implementation. This is // easier to use than the PolymorphicAction constructor as it // doesn't require you to explicitly write the template argument, e.g. // // MakePolymorphicAction(foo); // vs // PolymorphicAction(foo); template inline PolymorphicAction MakePolymorphicAction(const Impl& impl) { return PolymorphicAction(impl); } namespace internal { // Allows an Action object to pose as an Action, as long as F2 // and F1 are compatible. template class ActionAdaptor : public ActionInterface { public: typedef typename internal::Function::Result Result; typedef typename internal::Function::ArgumentTuple ArgumentTuple; explicit ActionAdaptor(const Action& from) : impl_(from.impl_) {} virtual Result Perform(const ArgumentTuple& args) { return impl_->Perform(args); } private: const internal::linked_ptr > impl_; GTEST_DISALLOW_ASSIGN_(ActionAdaptor); }; // Implements the polymorphic Return(x) action, which can be used in // any function that returns the type of x, regardless of the argument // types. // // Note: The value passed into Return must be converted into // Function::Result when this action is cast to Action rather than // when that action is performed. This is important in scenarios like // // MOCK_METHOD1(Method, T(U)); // ... // { // Foo foo; // X x(&foo); // EXPECT_CALL(mock, Method(_)).WillOnce(Return(x)); // } // // In the example above the variable x holds reference to foo which leaves // scope and gets destroyed. If copying X just copies a reference to foo, // that copy will be left with a hanging reference. If conversion to T // makes a copy of foo, the above code is safe. To support that scenario, we // need to make sure that the type conversion happens inside the EXPECT_CALL // statement, and conversion of the result of Return to Action is a // good place for that. // template class ReturnAction { public: // Constructs a ReturnAction object from the value to be returned. // 'value' is passed by value instead of by const reference in order // to allow Return("string literal") to compile. explicit ReturnAction(R value) : value_(value) {} // This template type conversion operator allows Return(x) to be // used in ANY function that returns x's type. template operator Action() const { // Assert statement belongs here because this is the best place to verify // conditions on F. It produces the clearest error messages // in most compilers. // Impl really belongs in this scope as a local class but can't // because MSVC produces duplicate symbols in different translation units // in this case. Until MS fixes that bug we put Impl into the class scope // and put the typedef both here (for use in assert statement) and // in the Impl class. But both definitions must be the same. typedef typename Function::Result Result; GMOCK_COMPILE_ASSERT_( !internal::is_reference::value, use_ReturnRef_instead_of_Return_to_return_a_reference); return Action(new Impl(value_)); } private: // Implements the Return(x) action for a particular function type F. template class Impl : public ActionInterface { public: typedef typename Function::Result Result; typedef typename Function::ArgumentTuple ArgumentTuple; // The implicit cast is necessary when Result has more than one // single-argument constructor (e.g. Result is std::vector) and R // has a type conversion operator template. In that case, value_(value) // won't compile as the compiler doesn't known which constructor of // Result to call. implicit_cast forces the compiler to convert R to // Result without considering explicit constructors, thus resolving the // ambiguity. value_ is then initialized using its copy constructor. explicit Impl(R value) : value_(::testing::internal::implicit_cast(value)) {} virtual Result Perform(const ArgumentTuple&) { return value_; } private: GMOCK_COMPILE_ASSERT_(!internal::is_reference::value, Result_cannot_be_a_reference_type); Result value_; GTEST_DISALLOW_ASSIGN_(Impl); }; R value_; GTEST_DISALLOW_ASSIGN_(ReturnAction); }; // Implements the ReturnNull() action. class ReturnNullAction { public: // Allows ReturnNull() to be used in any pointer-returning function. template static Result Perform(const ArgumentTuple&) { GMOCK_COMPILE_ASSERT_(internal::is_pointer::value, ReturnNull_can_be_used_to_return_a_pointer_only); return NULL; } }; // Implements the Return() action. class ReturnVoidAction { public: // Allows Return() to be used in any void-returning function. template static void Perform(const ArgumentTuple&) { CompileAssertTypesEqual(); } }; // Implements the polymorphic ReturnRef(x) action, which can be used // in any function that returns a reference to the type of x, // regardless of the argument types. template class ReturnRefAction { public: // Constructs a ReturnRefAction object from the reference to be returned. explicit ReturnRefAction(T& ref) : ref_(ref) {} // NOLINT // This template type conversion operator allows ReturnRef(x) to be // used in ANY function that returns a reference to x's type. template operator Action() const { typedef typename Function::Result Result; // Asserts that the function return type is a reference. This // catches the user error of using ReturnRef(x) when Return(x) // should be used, and generates some helpful error message. GMOCK_COMPILE_ASSERT_(internal::is_reference::value, use_Return_instead_of_ReturnRef_to_return_a_value); return Action(new Impl(ref_)); } private: // Implements the ReturnRef(x) action for a particular function type F. template class Impl : public ActionInterface { public: typedef typename Function::Result Result; typedef typename Function::ArgumentTuple ArgumentTuple; explicit Impl(T& ref) : ref_(ref) {} // NOLINT virtual Result Perform(const ArgumentTuple&) { return ref_; } private: T& ref_; GTEST_DISALLOW_ASSIGN_(Impl); }; T& ref_; GTEST_DISALLOW_ASSIGN_(ReturnRefAction); }; // Implements the DoDefault() action for a particular function type F. template class MonomorphicDoDefaultActionImpl : public ActionInterface { public: typedef typename Function::Result Result; typedef typename Function::ArgumentTuple ArgumentTuple; MonomorphicDoDefaultActionImpl() : ActionInterface(true) {} // For technical reasons, DoDefault() cannot be used inside a // composite action (e.g. DoAll(...)). It can only be used at the // top level in an EXPECT_CALL(). If this function is called, the // user must be using DoDefault() inside a composite action, and we // have to generate a run-time error. virtual Result Perform(const ArgumentTuple&) { Assert(false, __FILE__, __LINE__, "You are using DoDefault() inside a composite action like " "DoAll() or WithArgs(). This is not supported for technical " "reasons. Please instead spell out the default action, or " "assign the default action to an Action variable and use " "the variable in various places."); return internal::Invalid(); // The above statement will never be reached, but is required in // order for this function to compile. } }; // Implements the polymorphic DoDefault() action. class DoDefaultAction { public: // This template type conversion operator allows DoDefault() to be // used in any function. template operator Action() const { return Action(new MonomorphicDoDefaultActionImpl); } }; // Implements the Assign action to set a given pointer referent to a // particular value. template class AssignAction { public: AssignAction(T1* ptr, T2 value) : ptr_(ptr), value_(value) {} template void Perform(const ArgumentTuple& /* args */) const { *ptr_ = value_; } private: T1* const ptr_; const T2 value_; GTEST_DISALLOW_ASSIGN_(AssignAction); }; #if !GTEST_OS_WINDOWS_MOBILE // Implements the SetErrnoAndReturn action to simulate return from // various system calls and libc functions. template class SetErrnoAndReturnAction { public: SetErrnoAndReturnAction(int errno_value, T result) : errno_(errno_value), result_(result) {} template Result Perform(const ArgumentTuple& /* args */) const { errno = errno_; return result_; } private: const int errno_; const T result_; GTEST_DISALLOW_ASSIGN_(SetErrnoAndReturnAction); }; #endif // !GTEST_OS_WINDOWS_MOBILE // Implements the SetArgumentPointee(x) action for any function // whose N-th argument (0-based) is a pointer to x's type. The // template parameter kIsProto is true iff type A is ProtocolMessage, // proto2::Message, or a sub-class of those. template class SetArgumentPointeeAction { public: // Constructs an action that sets the variable pointed to by the // N-th function argument to 'value'. explicit SetArgumentPointeeAction(const A& value) : value_(value) {} template void Perform(const ArgumentTuple& args) const { CompileAssertTypesEqual(); *::std::tr1::get(args) = value_; } private: const A value_; GTEST_DISALLOW_ASSIGN_(SetArgumentPointeeAction); }; template class SetArgumentPointeeAction { public: // Constructs an action that sets the variable pointed to by the // N-th function argument to 'proto'. Both ProtocolMessage and // proto2::Message have the CopyFrom() method, so the same // implementation works for both. explicit SetArgumentPointeeAction(const Proto& proto) : proto_(new Proto) { proto_->CopyFrom(proto); } template void Perform(const ArgumentTuple& args) const { CompileAssertTypesEqual(); ::std::tr1::get(args)->CopyFrom(*proto_); } private: const internal::linked_ptr proto_; GTEST_DISALLOW_ASSIGN_(SetArgumentPointeeAction); }; // Implements the InvokeWithoutArgs(f) action. The template argument // FunctionImpl is the implementation type of f, which can be either a // function pointer or a functor. InvokeWithoutArgs(f) can be used as an // Action as long as f's type is compatible with F (i.e. f can be // assigned to a tr1::function). template class InvokeWithoutArgsAction { public: // The c'tor makes a copy of function_impl (either a function // pointer or a functor). explicit InvokeWithoutArgsAction(FunctionImpl function_impl) : function_impl_(function_impl) {} // Allows InvokeWithoutArgs(f) to be used as any action whose type is // compatible with f. template Result Perform(const ArgumentTuple&) { return function_impl_(); } private: FunctionImpl function_impl_; GTEST_DISALLOW_ASSIGN_(InvokeWithoutArgsAction); }; // Implements the InvokeWithoutArgs(object_ptr, &Class::Method) action. template class InvokeMethodWithoutArgsAction { public: InvokeMethodWithoutArgsAction(Class* obj_ptr, MethodPtr method_ptr) : obj_ptr_(obj_ptr), method_ptr_(method_ptr) {} template Result Perform(const ArgumentTuple&) const { return (obj_ptr_->*method_ptr_)(); } private: Class* const obj_ptr_; const MethodPtr method_ptr_; GTEST_DISALLOW_ASSIGN_(InvokeMethodWithoutArgsAction); }; // Implements the IgnoreResult(action) action. template class IgnoreResultAction { public: explicit IgnoreResultAction(const A& action) : action_(action) {} template operator Action() const { // Assert statement belongs here because this is the best place to verify // conditions on F. It produces the clearest error messages // in most compilers. // Impl really belongs in this scope as a local class but can't // because MSVC produces duplicate symbols in different translation units // in this case. Until MS fixes that bug we put Impl into the class scope // and put the typedef both here (for use in assert statement) and // in the Impl class. But both definitions must be the same. typedef typename internal::Function::Result Result; // Asserts at compile time that F returns void. CompileAssertTypesEqual(); return Action(new Impl(action_)); } private: template class Impl : public ActionInterface { public: typedef typename internal::Function::Result Result; typedef typename internal::Function::ArgumentTuple ArgumentTuple; explicit Impl(const A& action) : action_(action) {} virtual void Perform(const ArgumentTuple& args) { // Performs the action and ignores its result. action_.Perform(args); } private: // Type OriginalFunction is the same as F except that its return // type is IgnoredValue. typedef typename internal::Function::MakeResultIgnoredValue OriginalFunction; const Action action_; GTEST_DISALLOW_ASSIGN_(Impl); }; const A action_; GTEST_DISALLOW_ASSIGN_(IgnoreResultAction); }; // A ReferenceWrapper object represents a reference to type T, // which can be either const or not. It can be explicitly converted // from, and implicitly converted to, a T&. Unlike a reference, // ReferenceWrapper can be copied and can survive template type // inference. This is used to support by-reference arguments in the // InvokeArgument(...) action. The idea was from "reference // wrappers" in tr1, which we don't have in our source tree yet. template class ReferenceWrapper { public: // Constructs a ReferenceWrapper object from a T&. explicit ReferenceWrapper(T& l_value) : pointer_(&l_value) {} // NOLINT // Allows a ReferenceWrapper object to be implicitly converted to // a T&. operator T&() const { return *pointer_; } private: T* pointer_; }; // Allows the expression ByRef(x) to be printed as a reference to x. template void PrintTo(const ReferenceWrapper& ref, ::std::ostream* os) { T& value = ref; UniversalPrinter::Print(value, os); } // Does two actions sequentially. Used for implementing the DoAll(a1, // a2, ...) action. template class DoBothAction { public: DoBothAction(Action1 action1, Action2 action2) : action1_(action1), action2_(action2) {} // This template type conversion operator allows DoAll(a1, ..., a_n) // to be used in ANY function of compatible type. template operator Action() const { return Action(new Impl(action1_, action2_)); } private: // Implements the DoAll(...) action for a particular function type F. template class Impl : public ActionInterface { public: typedef typename Function::Result Result; typedef typename Function::ArgumentTuple ArgumentTuple; typedef typename Function::MakeResultVoid VoidResult; Impl(const Action& action1, const Action& action2) : action1_(action1), action2_(action2) {} virtual Result Perform(const ArgumentTuple& args) { action1_.Perform(args); return action2_.Perform(args); } private: const Action action1_; const Action action2_; GTEST_DISALLOW_ASSIGN_(Impl); }; Action1 action1_; Action2 action2_; GTEST_DISALLOW_ASSIGN_(DoBothAction); }; } // namespace internal // An Unused object can be implicitly constructed from ANY value. // This is handy when defining actions that ignore some or all of the // mock function arguments. For example, given // // MOCK_METHOD3(Foo, double(const string& label, double x, double y)); // MOCK_METHOD3(Bar, double(int index, double x, double y)); // // instead of // // double DistanceToOriginWithLabel(const string& label, double x, double y) { // return sqrt(x*x + y*y); // } // double DistanceToOriginWithIndex(int index, double x, double y) { // return sqrt(x*x + y*y); // } // ... // EXEPCT_CALL(mock, Foo("abc", _, _)) // .WillOnce(Invoke(DistanceToOriginWithLabel)); // EXEPCT_CALL(mock, Bar(5, _, _)) // .WillOnce(Invoke(DistanceToOriginWithIndex)); // // you could write // // // We can declare any uninteresting argument as Unused. // double DistanceToOrigin(Unused, double x, double y) { // return sqrt(x*x + y*y); // } // ... // EXEPCT_CALL(mock, Foo("abc", _, _)).WillOnce(Invoke(DistanceToOrigin)); // EXEPCT_CALL(mock, Bar(5, _, _)).WillOnce(Invoke(DistanceToOrigin)); typedef internal::IgnoredValue Unused; // This constructor allows us to turn an Action object into an // Action, as long as To's arguments can be implicitly converted // to From's and From's return type cann be implicitly converted to // To's. template template Action::Action(const Action& from) : impl_(new internal::ActionAdaptor(from)) {} // Creates an action that returns 'value'. 'value' is passed by value // instead of const reference - otherwise Return("string literal") // will trigger a compiler error about using array as initializer. template internal::ReturnAction Return(R value) { return internal::ReturnAction(value); } // Creates an action that returns NULL. inline PolymorphicAction ReturnNull() { return MakePolymorphicAction(internal::ReturnNullAction()); } // Creates an action that returns from a void function. inline PolymorphicAction Return() { return MakePolymorphicAction(internal::ReturnVoidAction()); } // Creates an action that returns the reference to a variable. template inline internal::ReturnRefAction ReturnRef(R& x) { // NOLINT return internal::ReturnRefAction(x); } // Creates an action that does the default action for the give mock function. inline internal::DoDefaultAction DoDefault() { return internal::DoDefaultAction(); } // Creates an action that sets the variable pointed by the N-th // (0-based) function argument to 'value'. template PolymorphicAction< internal::SetArgumentPointeeAction< N, T, internal::IsAProtocolMessage::value> > SetArgumentPointee(const T& x) { return MakePolymorphicAction(internal::SetArgumentPointeeAction< N, T, internal::IsAProtocolMessage::value>(x)); } // Creates an action that sets a pointer referent to a given value. template PolymorphicAction > Assign(T1* ptr, T2 val) { return MakePolymorphicAction(internal::AssignAction(ptr, val)); } #if !GTEST_OS_WINDOWS_MOBILE // Creates an action that sets errno and returns the appropriate error. template PolymorphicAction > SetErrnoAndReturn(int errval, T result) { return MakePolymorphicAction( internal::SetErrnoAndReturnAction(errval, result)); } #endif // !GTEST_OS_WINDOWS_MOBILE // Various overloads for InvokeWithoutArgs(). // Creates an action that invokes 'function_impl' with no argument. template PolymorphicAction > InvokeWithoutArgs(FunctionImpl function_impl) { return MakePolymorphicAction( internal::InvokeWithoutArgsAction(function_impl)); } // Creates an action that invokes the given method on the given object // with no argument. template PolymorphicAction > InvokeWithoutArgs(Class* obj_ptr, MethodPtr method_ptr) { return MakePolymorphicAction( internal::InvokeMethodWithoutArgsAction( obj_ptr, method_ptr)); } // Creates an action that performs an_action and throws away its // result. In other words, it changes the return type of an_action to // void. an_action MUST NOT return void, or the code won't compile. template inline internal::IgnoreResultAction IgnoreResult(const A& an_action) { return internal::IgnoreResultAction(an_action); } // Creates a reference wrapper for the given L-value. If necessary, // you can explicitly specify the type of the reference. For example, // suppose 'derived' is an object of type Derived, ByRef(derived) // would wrap a Derived&. If you want to wrap a const Base& instead, // where Base is a base class of Derived, just write: // // ByRef(derived) template inline internal::ReferenceWrapper ByRef(T& l_value) { // NOLINT return internal::ReferenceWrapper(l_value); } } // namespace testing #endif // GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/include/gmock/gmock-cardinalities.h000066400000000000000000000131711260417502300310470ustar00rootroot00000000000000// Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Google Mock - a framework for writing C++ mock classes. // // This file implements some commonly used cardinalities. More // cardinalities can be defined by the user implementing the // CardinalityInterface interface if necessary. #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ #define GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ #include #include // NOLINT #include #include namespace testing { // To implement a cardinality Foo, define: // 1. a class FooCardinality that implements the // CardinalityInterface interface, and // 2. a factory function that creates a Cardinality object from a // const FooCardinality*. // // The two-level delegation design follows that of Matcher, providing // consistency for extension developers. It also eases ownership // management as Cardinality objects can now be copied like plain values. // The implementation of a cardinality. class CardinalityInterface { public: virtual ~CardinalityInterface() {} // Conservative estimate on the lower/upper bound of the number of // calls allowed. virtual int ConservativeLowerBound() const { return 0; } virtual int ConservativeUpperBound() const { return INT_MAX; } // Returns true iff call_count calls will satisfy this cardinality. virtual bool IsSatisfiedByCallCount(int call_count) const = 0; // Returns true iff call_count calls will saturate this cardinality. virtual bool IsSaturatedByCallCount(int call_count) const = 0; // Describes self to an ostream. virtual void DescribeTo(::std::ostream* os) const = 0; }; // A Cardinality is a copyable and IMMUTABLE (except by assignment) // object that specifies how many times a mock function is expected to // be called. The implementation of Cardinality is just a linked_ptr // to const CardinalityInterface, so copying is fairly cheap. // Don't inherit from Cardinality! class Cardinality { public: // Constructs a null cardinality. Needed for storing Cardinality // objects in STL containers. Cardinality() {} // Constructs a Cardinality from its implementation. explicit Cardinality(const CardinalityInterface* impl) : impl_(impl) {} // Conservative estimate on the lower/upper bound of the number of // calls allowed. int ConservativeLowerBound() const { return impl_->ConservativeLowerBound(); } int ConservativeUpperBound() const { return impl_->ConservativeUpperBound(); } // Returns true iff call_count calls will satisfy this cardinality. bool IsSatisfiedByCallCount(int call_count) const { return impl_->IsSatisfiedByCallCount(call_count); } // Returns true iff call_count calls will saturate this cardinality. bool IsSaturatedByCallCount(int call_count) const { return impl_->IsSaturatedByCallCount(call_count); } // Returns true iff call_count calls will over-saturate this // cardinality, i.e. exceed the maximum number of allowed calls. bool IsOverSaturatedByCallCount(int call_count) const { return impl_->IsSaturatedByCallCount(call_count) && !impl_->IsSatisfiedByCallCount(call_count); } // Describes self to an ostream void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); } // Describes the given actual call count to an ostream. static void DescribeActualCallCountTo(int actual_call_count, ::std::ostream* os); private: internal::linked_ptr impl_; }; // Creates a cardinality that allows at least n calls. Cardinality AtLeast(int n); // Creates a cardinality that allows at most n calls. Cardinality AtMost(int n); // Creates a cardinality that allows any number of calls. Cardinality AnyNumber(); // Creates a cardinality that allows between min and max calls. Cardinality Between(int min, int max); // Creates a cardinality that allows exactly n calls. Cardinality Exactly(int n); // Creates a cardinality from its implementation. inline Cardinality MakeCardinality(const CardinalityInterface* c) { return Cardinality(c); } } // namespace testing #endif // GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/include/gmock/gmock-generated-actions.h000066400000000000000000003154431260417502300316370ustar00rootroot00000000000000// This file was GENERATED by a script. DO NOT EDIT BY HAND!!! // Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Google Mock - a framework for writing C++ mock classes. // // This file implements some commonly used variadic actions. #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ #include #include namespace testing { namespace internal { // InvokeHelper knows how to unpack an N-tuple and invoke an N-ary // function or method with the unpacked values, where F is a function // type that takes N arguments. template class InvokeHelper; template class InvokeHelper > { public: template static R Invoke(Function function, const ::std::tr1::tuple<>&) { return function(); } template static R InvokeMethod(Class* obj_ptr, MethodPtr method_ptr, const ::std::tr1::tuple<>&) { return (obj_ptr->*method_ptr)(); } }; template class InvokeHelper > { public: template static R Invoke(Function function, const ::std::tr1::tuple& args) { using ::std::tr1::get; return function(get<0>(args)); } template static R InvokeMethod(Class* obj_ptr, MethodPtr method_ptr, const ::std::tr1::tuple& args) { using ::std::tr1::get; return (obj_ptr->*method_ptr)(get<0>(args)); } }; template class InvokeHelper > { public: template static R Invoke(Function function, const ::std::tr1::tuple& args) { using ::std::tr1::get; return function(get<0>(args), get<1>(args)); } template static R InvokeMethod(Class* obj_ptr, MethodPtr method_ptr, const ::std::tr1::tuple& args) { using ::std::tr1::get; return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args)); } }; template class InvokeHelper > { public: template static R Invoke(Function function, const ::std::tr1::tuple& args) { using ::std::tr1::get; return function(get<0>(args), get<1>(args), get<2>(args)); } template static R InvokeMethod(Class* obj_ptr, MethodPtr method_ptr, const ::std::tr1::tuple& args) { using ::std::tr1::get; return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args)); } }; template class InvokeHelper > { public: template static R Invoke(Function function, const ::std::tr1::tuple& args) { using ::std::tr1::get; return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args)); } template static R InvokeMethod(Class* obj_ptr, MethodPtr method_ptr, const ::std::tr1::tuple& args) { using ::std::tr1::get; return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args), get<3>(args)); } }; template class InvokeHelper > { public: template static R Invoke(Function function, const ::std::tr1::tuple& args) { using ::std::tr1::get; return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args)); } template static R InvokeMethod(Class* obj_ptr, MethodPtr method_ptr, const ::std::tr1::tuple& args) { using ::std::tr1::get; return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args)); } }; template class InvokeHelper > { public: template static R Invoke(Function function, const ::std::tr1::tuple& args) { using ::std::tr1::get; return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args), get<5>(args)); } template static R InvokeMethod(Class* obj_ptr, MethodPtr method_ptr, const ::std::tr1::tuple& args) { using ::std::tr1::get; return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args), get<5>(args)); } }; template class InvokeHelper > { public: template static R Invoke(Function function, const ::std::tr1::tuple& args) { using ::std::tr1::get; return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args), get<5>(args), get<6>(args)); } template static R InvokeMethod(Class* obj_ptr, MethodPtr method_ptr, const ::std::tr1::tuple& args) { using ::std::tr1::get; return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args), get<5>(args), get<6>(args)); } }; template class InvokeHelper > { public: template static R Invoke(Function function, const ::std::tr1::tuple& args) { using ::std::tr1::get; return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args), get<5>(args), get<6>(args), get<7>(args)); } template static R InvokeMethod(Class* obj_ptr, MethodPtr method_ptr, const ::std::tr1::tuple& args) { using ::std::tr1::get; return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args), get<5>(args), get<6>(args), get<7>(args)); } }; template class InvokeHelper > { public: template static R Invoke(Function function, const ::std::tr1::tuple& args) { using ::std::tr1::get; return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args)); } template static R InvokeMethod(Class* obj_ptr, MethodPtr method_ptr, const ::std::tr1::tuple& args) { using ::std::tr1::get; return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args)); } }; template class InvokeHelper > { public: template static R Invoke(Function function, const ::std::tr1::tuple& args) { using ::std::tr1::get; return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args), get<9>(args)); } template static R InvokeMethod(Class* obj_ptr, MethodPtr method_ptr, const ::std::tr1::tuple& args) { using ::std::tr1::get; return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args), get<9>(args)); } }; // CallableHelper has static methods for invoking "callables", // i.e. function pointers and functors. It uses overloading to // provide a uniform interface for invoking different kinds of // callables. In particular, you can use: // // CallableHelper::Call(callable, a1, a2, ..., an) // // to invoke an n-ary callable, where R is its return type. If an // argument, say a2, needs to be passed by reference, you should write // ByRef(a2) instead of a2 in the above expression. template class CallableHelper { public: // Calls a nullary callable. template static R Call(Function function) { return function(); } // Calls a unary callable. // We deliberately pass a1 by value instead of const reference here // in case it is a C-string literal. If we had declared the // parameter as 'const A1& a1' and write Call(function, "Hi"), the // compiler would've thought A1 is 'char[3]', which causes trouble // when you need to copy a value of type A1. By declaring the // parameter as 'A1 a1', the compiler will correctly infer that A1 // is 'const char*' when it sees Call(function, "Hi"). // // Since this function is defined inline, the compiler can get rid // of the copying of the arguments. Therefore the performance won't // be hurt. template static R Call(Function function, A1 a1) { return function(a1); } // Calls a binary callable. template static R Call(Function function, A1 a1, A2 a2) { return function(a1, a2); } // Calls a ternary callable. template static R Call(Function function, A1 a1, A2 a2, A3 a3) { return function(a1, a2, a3); } // Calls a 4-ary callable. template static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4) { return function(a1, a2, a3, a4); } // Calls a 5-ary callable. template static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) { return function(a1, a2, a3, a4, a5); } // Calls a 6-ary callable. template static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) { return function(a1, a2, a3, a4, a5, a6); } // Calls a 7-ary callable. template static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) { return function(a1, a2, a3, a4, a5, a6, a7); } // Calls a 8-ary callable. template static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) { return function(a1, a2, a3, a4, a5, a6, a7, a8); } // Calls a 9-ary callable. template static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) { return function(a1, a2, a3, a4, a5, a6, a7, a8, a9); } // Calls a 10-ary callable. template static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10) { return function(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); } }; // class CallableHelper // An INTERNAL macro for extracting the type of a tuple field. It's // subject to change without notice - DO NOT USE IN USER CODE! #define GMOCK_FIELD_(Tuple, N) \ typename ::std::tr1::tuple_element::type // SelectArgs::type is the // type of an n-ary function whose i-th (1-based) argument type is the // k{i}-th (0-based) field of ArgumentTuple, which must be a tuple // type, and whose return type is Result. For example, // SelectArgs, 0, 3>::type // is int(bool, long). // // SelectArgs::Select(args) // returns the selected fields (k1, k2, ..., k_n) of args as a tuple. // For example, // SelectArgs, 2, 0>::Select( // ::std::tr1::make_tuple(true, 'a', 2.5)) // returns ::std::tr1::tuple (2.5, true). // // The numbers in list k1, k2, ..., k_n must be >= 0, where n can be // in the range [0, 10]. Duplicates are allowed and they don't have // to be in an ascending or descending order. template class SelectArgs { public: typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5), GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7), GMOCK_FIELD_(ArgumentTuple, k8), GMOCK_FIELD_(ArgumentTuple, k9), GMOCK_FIELD_(ArgumentTuple, k10)); typedef typename Function::ArgumentTuple SelectedArgs; static SelectedArgs Select(const ArgumentTuple& args) { using ::std::tr1::get; return SelectedArgs(get(args), get(args), get(args), get(args), get(args), get(args), get(args), get(args), get(args), get(args)); } }; template class SelectArgs { public: typedef Result type(); typedef typename Function::ArgumentTuple SelectedArgs; static SelectedArgs Select(const ArgumentTuple& /* args */) { using ::std::tr1::get; return SelectedArgs(); } }; template class SelectArgs { public: typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1)); typedef typename Function::ArgumentTuple SelectedArgs; static SelectedArgs Select(const ArgumentTuple& args) { using ::std::tr1::get; return SelectedArgs(get(args)); } }; template class SelectArgs { public: typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), GMOCK_FIELD_(ArgumentTuple, k2)); typedef typename Function::ArgumentTuple SelectedArgs; static SelectedArgs Select(const ArgumentTuple& args) { using ::std::tr1::get; return SelectedArgs(get(args), get(args)); } }; template class SelectArgs { public: typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3)); typedef typename Function::ArgumentTuple SelectedArgs; static SelectedArgs Select(const ArgumentTuple& args) { using ::std::tr1::get; return SelectedArgs(get(args), get(args), get(args)); } }; template class SelectArgs { public: typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), GMOCK_FIELD_(ArgumentTuple, k4)); typedef typename Function::ArgumentTuple SelectedArgs; static SelectedArgs Select(const ArgumentTuple& args) { using ::std::tr1::get; return SelectedArgs(get(args), get(args), get(args), get(args)); } }; template class SelectArgs { public: typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5)); typedef typename Function::ArgumentTuple SelectedArgs; static SelectedArgs Select(const ArgumentTuple& args) { using ::std::tr1::get; return SelectedArgs(get(args), get(args), get(args), get(args), get(args)); } }; template class SelectArgs { public: typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5), GMOCK_FIELD_(ArgumentTuple, k6)); typedef typename Function::ArgumentTuple SelectedArgs; static SelectedArgs Select(const ArgumentTuple& args) { using ::std::tr1::get; return SelectedArgs(get(args), get(args), get(args), get(args), get(args), get(args)); } }; template class SelectArgs { public: typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5), GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7)); typedef typename Function::ArgumentTuple SelectedArgs; static SelectedArgs Select(const ArgumentTuple& args) { using ::std::tr1::get; return SelectedArgs(get(args), get(args), get(args), get(args), get(args), get(args), get(args)); } }; template class SelectArgs { public: typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5), GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7), GMOCK_FIELD_(ArgumentTuple, k8)); typedef typename Function::ArgumentTuple SelectedArgs; static SelectedArgs Select(const ArgumentTuple& args) { using ::std::tr1::get; return SelectedArgs(get(args), get(args), get(args), get(args), get(args), get(args), get(args), get(args)); } }; template class SelectArgs { public: typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5), GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7), GMOCK_FIELD_(ArgumentTuple, k8), GMOCK_FIELD_(ArgumentTuple, k9)); typedef typename Function::ArgumentTuple SelectedArgs; static SelectedArgs Select(const ArgumentTuple& args) { using ::std::tr1::get; return SelectedArgs(get(args), get(args), get(args), get(args), get(args), get(args), get(args), get(args), get(args)); } }; #undef GMOCK_FIELD_ // Implements the WithArgs action. template class WithArgsAction { public: explicit WithArgsAction(const InnerAction& action) : action_(action) {} template operator Action() const { return MakeAction(new Impl(action_)); } private: template class Impl : public ActionInterface { public: typedef typename Function::Result Result; typedef typename Function::ArgumentTuple ArgumentTuple; explicit Impl(const InnerAction& action) : action_(action) {} virtual Result Perform(const ArgumentTuple& args) { return action_.Perform(SelectArgs::Select(args)); } private: typedef typename SelectArgs::type InnerFunctionType; Action action_; }; const InnerAction action_; GTEST_DISALLOW_ASSIGN_(WithArgsAction); }; // A macro from the ACTION* family (defined later in this file) // defines an action that can be used in a mock function. Typically, // these actions only care about a subset of the arguments of the mock // function. For example, if such an action only uses the second // argument, it can be used in any mock function that takes >= 2 // arguments where the type of the second argument is compatible. // // Therefore, the action implementation must be prepared to take more // arguments than it needs. The ExcessiveArg type is used to // represent those excessive arguments. In order to keep the compiler // error messages tractable, we define it in the testing namespace // instead of testing::internal. However, this is an INTERNAL TYPE // and subject to change without notice, so a user MUST NOT USE THIS // TYPE DIRECTLY. struct ExcessiveArg {}; // A helper class needed for implementing the ACTION* macros. template class ActionHelper { public: static Result Perform(Impl* impl, const ::std::tr1::tuple<>& args) { using ::std::tr1::get; return impl->template gmock_PerformImpl<>(args, ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg()); } template static Result Perform(Impl* impl, const ::std::tr1::tuple& args) { using ::std::tr1::get; return impl->template gmock_PerformImpl(args, get<0>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg()); } template static Result Perform(Impl* impl, const ::std::tr1::tuple& args) { using ::std::tr1::get; return impl->template gmock_PerformImpl(args, get<0>(args), get<1>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg()); } template static Result Perform(Impl* impl, const ::std::tr1::tuple& args) { using ::std::tr1::get; return impl->template gmock_PerformImpl(args, get<0>(args), get<1>(args), get<2>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg()); } template static Result Perform(Impl* impl, const ::std::tr1::tuple& args) { using ::std::tr1::get; return impl->template gmock_PerformImpl(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg()); } template static Result Perform(Impl* impl, const ::std::tr1::tuple& args) { using ::std::tr1::get; return impl->template gmock_PerformImpl(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg()); } template static Result Perform(Impl* impl, const ::std::tr1::tuple& args) { using ::std::tr1::get; return impl->template gmock_PerformImpl(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args), get<5>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg()); } template static Result Perform(Impl* impl, const ::std::tr1::tuple& args) { using ::std::tr1::get; return impl->template gmock_PerformImpl(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args), get<5>(args), get<6>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg()); } template static Result Perform(Impl* impl, const ::std::tr1::tuple& args) { using ::std::tr1::get; return impl->template gmock_PerformImpl(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args), get<5>(args), get<6>(args), get<7>(args), ExcessiveArg(), ExcessiveArg()); } template static Result Perform(Impl* impl, const ::std::tr1::tuple& args) { using ::std::tr1::get; return impl->template gmock_PerformImpl(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args), ExcessiveArg()); } template static Result Perform(Impl* impl, const ::std::tr1::tuple& args) { using ::std::tr1::get; return impl->template gmock_PerformImpl(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args), get<9>(args)); } }; } // namespace internal // Various overloads for Invoke(). // WithArgs(an_action) creates an action that passes // the selected arguments of the mock function to an_action and // performs it. It serves as an adaptor between actions with // different argument lists. C++ doesn't support default arguments for // function templates, so we have to overload it. template inline internal::WithArgsAction WithArgs(const InnerAction& action) { return internal::WithArgsAction(action); } template inline internal::WithArgsAction WithArgs(const InnerAction& action) { return internal::WithArgsAction(action); } template inline internal::WithArgsAction WithArgs(const InnerAction& action) { return internal::WithArgsAction(action); } template inline internal::WithArgsAction WithArgs(const InnerAction& action) { return internal::WithArgsAction(action); } template inline internal::WithArgsAction WithArgs(const InnerAction& action) { return internal::WithArgsAction(action); } template inline internal::WithArgsAction WithArgs(const InnerAction& action) { return internal::WithArgsAction(action); } template inline internal::WithArgsAction WithArgs(const InnerAction& action) { return internal::WithArgsAction(action); } template inline internal::WithArgsAction WithArgs(const InnerAction& action) { return internal::WithArgsAction(action); } template inline internal::WithArgsAction WithArgs(const InnerAction& action) { return internal::WithArgsAction(action); } template inline internal::WithArgsAction WithArgs(const InnerAction& action) { return internal::WithArgsAction(action); } // Creates an action that does actions a1, a2, ..., sequentially in // each invocation. template inline internal::DoBothAction DoAll(Action1 a1, Action2 a2) { return internal::DoBothAction(a1, a2); } template inline internal::DoBothAction > DoAll(Action1 a1, Action2 a2, Action3 a3) { return DoAll(a1, DoAll(a2, a3)); } template inline internal::DoBothAction > > DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4) { return DoAll(a1, DoAll(a2, a3, a4)); } template inline internal::DoBothAction > > > DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5) { return DoAll(a1, DoAll(a2, a3, a4, a5)); } template inline internal::DoBothAction > > > > DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6) { return DoAll(a1, DoAll(a2, a3, a4, a5, a6)); } template inline internal::DoBothAction > > > > > DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6, Action7 a7) { return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7)); } template inline internal::DoBothAction > > > > > > DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6, Action7 a7, Action8 a8) { return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8)); } template inline internal::DoBothAction > > > > > > > DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6, Action7 a7, Action8 a8, Action9 a9) { return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9)); } template inline internal::DoBothAction > > > > > > > > DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6, Action7 a7, Action8 a8, Action9 a9, Action10 a10) { return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9, a10)); } } // namespace testing // The ACTION* family of macros can be used in a namespace scope to // define custom actions easily. The syntax: // // ACTION(name) { statements; } // // will define an action with the given name that executes the // statements. The value returned by the statements will be used as // the return value of the action. Inside the statements, you can // refer to the K-th (0-based) argument of the mock function by // 'argK', and refer to its type by 'argK_type'. For example: // // ACTION(IncrementArg1) { // arg1_type temp = arg1; // return ++(*temp); // } // // allows you to write // // ...WillOnce(IncrementArg1()); // // You can also refer to the entire argument tuple and its type by // 'args' and 'args_type', and refer to the mock function type and its // return type by 'function_type' and 'return_type'. // // Note that you don't need to specify the types of the mock function // arguments. However rest assured that your code is still type-safe: // you'll get a compiler error if *arg1 doesn't support the ++ // operator, or if the type of ++(*arg1) isn't compatible with the // mock function's return type, for example. // // Sometimes you'll want to parameterize the action. For that you can use // another macro: // // ACTION_P(name, param_name) { statements; } // // For example: // // ACTION_P(Add, n) { return arg0 + n; } // // will allow you to write: // // ...WillOnce(Add(5)); // // Note that you don't need to provide the type of the parameter // either. If you need to reference the type of a parameter named // 'foo', you can write 'foo_type'. For example, in the body of // ACTION_P(Add, n) above, you can write 'n_type' to refer to the type // of 'n'. // // We also provide ACTION_P2, ACTION_P3, ..., up to ACTION_P10 to support // multi-parameter actions. // // For the purpose of typing, you can view // // ACTION_Pk(Foo, p1, ..., pk) { ... } // // as shorthand for // // template // FooActionPk Foo(p1_type p1, ..., pk_type pk) { ... } // // In particular, you can provide the template type arguments // explicitly when invoking Foo(), as in Foo(5, false); // although usually you can rely on the compiler to infer the types // for you automatically. You can assign the result of expression // Foo(p1, ..., pk) to a variable of type FooActionPk. This can be useful when composing actions. // // You can also overload actions with different numbers of parameters: // // ACTION_P(Plus, a) { ... } // ACTION_P2(Plus, a, b) { ... } // // While it's tempting to always use the ACTION* macros when defining // a new action, you should also consider implementing ActionInterface // or using MakePolymorphicAction() instead, especially if you need to // use the action a lot. While these approaches require more work, // they give you more control on the types of the mock function // arguments and the action parameters, which in general leads to // better compiler error messages that pay off in the long run. They // also allow overloading actions based on parameter types (as opposed // to just based on the number of parameters). // // CAVEAT: // // ACTION*() can only be used in a namespace scope. The reason is // that C++ doesn't yet allow function-local types to be used to // instantiate templates. The up-coming C++0x standard will fix this. // Once that's done, we'll consider supporting using ACTION*() inside // a function. // // MORE INFORMATION: // // To learn more about using these macros, please search for 'ACTION' // on http://code.google.com/p/googlemock/wiki/CookBook. // An internal macro needed for implementing ACTION*(). #define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_\ const args_type& args GTEST_ATTRIBUTE_UNUSED_,\ arg0_type arg0 GTEST_ATTRIBUTE_UNUSED_,\ arg1_type arg1 GTEST_ATTRIBUTE_UNUSED_,\ arg2_type arg2 GTEST_ATTRIBUTE_UNUSED_,\ arg3_type arg3 GTEST_ATTRIBUTE_UNUSED_,\ arg4_type arg4 GTEST_ATTRIBUTE_UNUSED_,\ arg5_type arg5 GTEST_ATTRIBUTE_UNUSED_,\ arg6_type arg6 GTEST_ATTRIBUTE_UNUSED_,\ arg7_type arg7 GTEST_ATTRIBUTE_UNUSED_,\ arg8_type arg8 GTEST_ATTRIBUTE_UNUSED_,\ arg9_type arg9 GTEST_ATTRIBUTE_UNUSED_ // Sometimes you want to give an action explicit template parameters // that cannot be inferred from its value parameters. ACTION() and // ACTION_P*() don't support that. ACTION_TEMPLATE() remedies that // and can be viewed as an extension to ACTION() and ACTION_P*(). // // The syntax: // // ACTION_TEMPLATE(ActionName, // HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m), // AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; } // // defines an action template that takes m explicit template // parameters and n value parameters. name_i is the name of the i-th // template parameter, and kind_i specifies whether it's a typename, // an integral constant, or a template. p_i is the name of the i-th // value parameter. // // Example: // // // DuplicateArg(output) converts the k-th argument of the mock // // function to type T and copies it to *output. // ACTION_TEMPLATE(DuplicateArg, // HAS_2_TEMPLATE_PARAMS(int, k, typename, T), // AND_1_VALUE_PARAMS(output)) { // *output = T(std::tr1::get(args)); // } // ... // int n; // EXPECT_CALL(mock, Foo(_, _)) // .WillOnce(DuplicateArg<1, unsigned char>(&n)); // // To create an instance of an action template, write: // // ActionName(v1, ..., v_n) // // where the ts are the template arguments and the vs are the value // arguments. The value argument types are inferred by the compiler. // If you want to explicitly specify the value argument types, you can // provide additional template arguments: // // ActionName(v1, ..., v_n) // // where u_i is the desired type of v_i. // // ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded on the // number of value parameters, but not on the number of template // parameters. Without the restriction, the meaning of the following // is unclear: // // OverloadedAction(x); // // Are we using a single-template-parameter action where 'bool' refers // to the type of x, or are we using a two-template-parameter action // where the compiler is asked to infer the type of x? // // Implementation notes: // // GMOCK_INTERNAL_*_HAS_m_TEMPLATE_PARAMS and // GMOCK_INTERNAL_*_AND_n_VALUE_PARAMS are internal macros for // implementing ACTION_TEMPLATE. The main trick we use is to create // new macro invocations when expanding a macro. For example, we have // // #define ACTION_TEMPLATE(name, template_params, value_params) // ... GMOCK_INTERNAL_DECL_##template_params ... // // which causes ACTION_TEMPLATE(..., HAS_1_TEMPLATE_PARAMS(typename, T), ...) // to expand to // // ... GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(typename, T) ... // // Since GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS is a macro, the // preprocessor will continue to expand it to // // ... typename T ... // // This technique conforms to the C++ standard and is portable. It // allows us to implement action templates using O(N) code, where N is // the maximum number of template/value parameters supported. Without // using it, we'd have to devote O(N^2) amount of code to implement all // combinations of m and n. // Declares the template parameters. #define GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(kind0, name0) kind0 name0 #define GMOCK_INTERNAL_DECL_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, \ name1) kind0 name0, kind1 name1 #define GMOCK_INTERNAL_DECL_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ kind2, name2) kind0 name0, kind1 name1, kind2 name2 #define GMOCK_INTERNAL_DECL_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ kind2, name2, kind3, name3) kind0 name0, kind1 name1, kind2 name2, \ kind3 name3 #define GMOCK_INTERNAL_DECL_HAS_5_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ kind2, name2, kind3, name3, kind4, name4) kind0 name0, kind1 name1, \ kind2 name2, kind3 name3, kind4 name4 #define GMOCK_INTERNAL_DECL_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ kind2, name2, kind3, name3, kind4, name4, kind5, name5) kind0 name0, \ kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5 #define GMOCK_INTERNAL_DECL_HAS_7_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \ name6) kind0 name0, kind1 name1, kind2 name2, kind3 name3, kind4 name4, \ kind5 name5, kind6 name6 #define GMOCK_INTERNAL_DECL_HAS_8_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \ kind7, name7) kind0 name0, kind1 name1, kind2 name2, kind3 name3, \ kind4 name4, kind5 name5, kind6 name6, kind7 name7 #define GMOCK_INTERNAL_DECL_HAS_9_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \ kind7, name7, kind8, name8) kind0 name0, kind1 name1, kind2 name2, \ kind3 name3, kind4 name4, kind5 name5, kind6 name6, kind7 name7, \ kind8 name8 #define GMOCK_INTERNAL_DECL_HAS_10_TEMPLATE_PARAMS(kind0, name0, kind1, \ name1, kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \ name6, kind7, name7, kind8, name8, kind9, name9) kind0 name0, \ kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5, \ kind6 name6, kind7 name7, kind8 name8, kind9 name9 // Lists the template parameters. #define GMOCK_INTERNAL_LIST_HAS_1_TEMPLATE_PARAMS(kind0, name0) name0 #define GMOCK_INTERNAL_LIST_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, \ name1) name0, name1 #define GMOCK_INTERNAL_LIST_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ kind2, name2) name0, name1, name2 #define GMOCK_INTERNAL_LIST_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ kind2, name2, kind3, name3) name0, name1, name2, name3 #define GMOCK_INTERNAL_LIST_HAS_5_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ kind2, name2, kind3, name3, kind4, name4) name0, name1, name2, name3, \ name4 #define GMOCK_INTERNAL_LIST_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ kind2, name2, kind3, name3, kind4, name4, kind5, name5) name0, name1, \ name2, name3, name4, name5 #define GMOCK_INTERNAL_LIST_HAS_7_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \ name6) name0, name1, name2, name3, name4, name5, name6 #define GMOCK_INTERNAL_LIST_HAS_8_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \ kind7, name7) name0, name1, name2, name3, name4, name5, name6, name7 #define GMOCK_INTERNAL_LIST_HAS_9_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \ kind7, name7, kind8, name8) name0, name1, name2, name3, name4, name5, \ name6, name7, name8 #define GMOCK_INTERNAL_LIST_HAS_10_TEMPLATE_PARAMS(kind0, name0, kind1, \ name1, kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \ name6, kind7, name7, kind8, name8, kind9, name9) name0, name1, name2, \ name3, name4, name5, name6, name7, name8, name9 // Declares the types of value parameters. #define GMOCK_INTERNAL_DECL_TYPE_AND_0_VALUE_PARAMS() #define GMOCK_INTERNAL_DECL_TYPE_AND_1_VALUE_PARAMS(p0) , typename p0##_type #define GMOCK_INTERNAL_DECL_TYPE_AND_2_VALUE_PARAMS(p0, p1) , \ typename p0##_type, typename p1##_type #define GMOCK_INTERNAL_DECL_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) , \ typename p0##_type, typename p1##_type, typename p2##_type #define GMOCK_INTERNAL_DECL_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) , \ typename p0##_type, typename p1##_type, typename p2##_type, \ typename p3##_type #define GMOCK_INTERNAL_DECL_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) , \ typename p0##_type, typename p1##_type, typename p2##_type, \ typename p3##_type, typename p4##_type #define GMOCK_INTERNAL_DECL_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) , \ typename p0##_type, typename p1##_type, typename p2##_type, \ typename p3##_type, typename p4##_type, typename p5##_type #define GMOCK_INTERNAL_DECL_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ p6) , typename p0##_type, typename p1##_type, typename p2##_type, \ typename p3##_type, typename p4##_type, typename p5##_type, \ typename p6##_type #define GMOCK_INTERNAL_DECL_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ p6, p7) , typename p0##_type, typename p1##_type, typename p2##_type, \ typename p3##_type, typename p4##_type, typename p5##_type, \ typename p6##_type, typename p7##_type #define GMOCK_INTERNAL_DECL_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ p6, p7, p8) , typename p0##_type, typename p1##_type, typename p2##_type, \ typename p3##_type, typename p4##_type, typename p5##_type, \ typename p6##_type, typename p7##_type, typename p8##_type #define GMOCK_INTERNAL_DECL_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ p6, p7, p8, p9) , typename p0##_type, typename p1##_type, \ typename p2##_type, typename p3##_type, typename p4##_type, \ typename p5##_type, typename p6##_type, typename p7##_type, \ typename p8##_type, typename p9##_type // Initializes the value parameters. #define GMOCK_INTERNAL_INIT_AND_0_VALUE_PARAMS()\ () #define GMOCK_INTERNAL_INIT_AND_1_VALUE_PARAMS(p0)\ (p0##_type gmock_p0) : p0(gmock_p0) #define GMOCK_INTERNAL_INIT_AND_2_VALUE_PARAMS(p0, p1)\ (p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), p1(gmock_p1) #define GMOCK_INTERNAL_INIT_AND_3_VALUE_PARAMS(p0, p1, p2)\ (p0##_type gmock_p0, p1##_type gmock_p1, \ p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) #define GMOCK_INTERNAL_INIT_AND_4_VALUE_PARAMS(p0, p1, p2, p3)\ (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ p3(gmock_p3) #define GMOCK_INTERNAL_INIT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)\ (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ p3##_type gmock_p3, p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), \ p2(gmock_p2), p3(gmock_p3), p4(gmock_p4) #define GMOCK_INTERNAL_INIT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)\ (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ p3##_type gmock_p3, p4##_type gmock_p4, \ p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) #define GMOCK_INTERNAL_INIT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)\ (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6) #define GMOCK_INTERNAL_INIT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)\ (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ p6##_type gmock_p6, p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), \ p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ p7(gmock_p7) #define GMOCK_INTERNAL_INIT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ p7, p8)\ (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ p6##_type gmock_p6, p7##_type gmock_p7, \ p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ p8(gmock_p8) #define GMOCK_INTERNAL_INIT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ p7, p8, p9)\ (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \ p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ p8(gmock_p8), p9(gmock_p9) // Declares the fields for storing the value parameters. #define GMOCK_INTERNAL_DEFN_AND_0_VALUE_PARAMS() #define GMOCK_INTERNAL_DEFN_AND_1_VALUE_PARAMS(p0) p0##_type p0; #define GMOCK_INTERNAL_DEFN_AND_2_VALUE_PARAMS(p0, p1) p0##_type p0; \ p1##_type p1; #define GMOCK_INTERNAL_DEFN_AND_3_VALUE_PARAMS(p0, p1, p2) p0##_type p0; \ p1##_type p1; p2##_type p2; #define GMOCK_INTERNAL_DEFN_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0##_type p0; \ p1##_type p1; p2##_type p2; p3##_type p3; #define GMOCK_INTERNAL_DEFN_AND_5_VALUE_PARAMS(p0, p1, p2, p3, \ p4) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; #define GMOCK_INTERNAL_DEFN_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, \ p5) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \ p5##_type p5; #define GMOCK_INTERNAL_DEFN_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ p6) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \ p5##_type p5; p6##_type p6; #define GMOCK_INTERNAL_DEFN_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ p7) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \ p5##_type p5; p6##_type p6; p7##_type p7; #define GMOCK_INTERNAL_DEFN_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ p7, p8) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; \ p4##_type p4; p5##_type p5; p6##_type p6; p7##_type p7; p8##_type p8; #define GMOCK_INTERNAL_DEFN_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ p7, p8, p9) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; \ p4##_type p4; p5##_type p5; p6##_type p6; p7##_type p7; p8##_type p8; \ p9##_type p9; // Lists the value parameters. #define GMOCK_INTERNAL_LIST_AND_0_VALUE_PARAMS() #define GMOCK_INTERNAL_LIST_AND_1_VALUE_PARAMS(p0) p0 #define GMOCK_INTERNAL_LIST_AND_2_VALUE_PARAMS(p0, p1) p0, p1 #define GMOCK_INTERNAL_LIST_AND_3_VALUE_PARAMS(p0, p1, p2) p0, p1, p2 #define GMOCK_INTERNAL_LIST_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0, p1, p2, p3 #define GMOCK_INTERNAL_LIST_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) p0, p1, \ p2, p3, p4 #define GMOCK_INTERNAL_LIST_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) p0, \ p1, p2, p3, p4, p5 #define GMOCK_INTERNAL_LIST_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ p6) p0, p1, p2, p3, p4, p5, p6 #define GMOCK_INTERNAL_LIST_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ p7) p0, p1, p2, p3, p4, p5, p6, p7 #define GMOCK_INTERNAL_LIST_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ p7, p8) p0, p1, p2, p3, p4, p5, p6, p7, p8 #define GMOCK_INTERNAL_LIST_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ p7, p8, p9) p0, p1, p2, p3, p4, p5, p6, p7, p8, p9 // Lists the value parameter types. #define GMOCK_INTERNAL_LIST_TYPE_AND_0_VALUE_PARAMS() #define GMOCK_INTERNAL_LIST_TYPE_AND_1_VALUE_PARAMS(p0) , p0##_type #define GMOCK_INTERNAL_LIST_TYPE_AND_2_VALUE_PARAMS(p0, p1) , p0##_type, \ p1##_type #define GMOCK_INTERNAL_LIST_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) , p0##_type, \ p1##_type, p2##_type #define GMOCK_INTERNAL_LIST_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) , \ p0##_type, p1##_type, p2##_type, p3##_type #define GMOCK_INTERNAL_LIST_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) , \ p0##_type, p1##_type, p2##_type, p3##_type, p4##_type #define GMOCK_INTERNAL_LIST_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) , \ p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type #define GMOCK_INTERNAL_LIST_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ p6) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, \ p6##_type #define GMOCK_INTERNAL_LIST_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ p6, p7) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ p5##_type, p6##_type, p7##_type #define GMOCK_INTERNAL_LIST_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ p6, p7, p8) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ p5##_type, p6##_type, p7##_type, p8##_type #define GMOCK_INTERNAL_LIST_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ p6, p7, p8, p9) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ p5##_type, p6##_type, p7##_type, p8##_type, p9##_type // Declares the value parameters. #define GMOCK_INTERNAL_DECL_AND_0_VALUE_PARAMS() #define GMOCK_INTERNAL_DECL_AND_1_VALUE_PARAMS(p0) p0##_type p0 #define GMOCK_INTERNAL_DECL_AND_2_VALUE_PARAMS(p0, p1) p0##_type p0, \ p1##_type p1 #define GMOCK_INTERNAL_DECL_AND_3_VALUE_PARAMS(p0, p1, p2) p0##_type p0, \ p1##_type p1, p2##_type p2 #define GMOCK_INTERNAL_DECL_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0##_type p0, \ p1##_type p1, p2##_type p2, p3##_type p3 #define GMOCK_INTERNAL_DECL_AND_5_VALUE_PARAMS(p0, p1, p2, p3, \ p4) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4 #define GMOCK_INTERNAL_DECL_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, \ p5) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \ p5##_type p5 #define GMOCK_INTERNAL_DECL_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ p6) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \ p5##_type p5, p6##_type p6 #define GMOCK_INTERNAL_DECL_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ p7) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \ p5##_type p5, p6##_type p6, p7##_type p7 #define GMOCK_INTERNAL_DECL_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ p7, p8) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8 #define GMOCK_INTERNAL_DECL_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ p7, p8, p9) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \ p9##_type p9 // The suffix of the class template implementing the action template. #define GMOCK_INTERNAL_COUNT_AND_0_VALUE_PARAMS() #define GMOCK_INTERNAL_COUNT_AND_1_VALUE_PARAMS(p0) P #define GMOCK_INTERNAL_COUNT_AND_2_VALUE_PARAMS(p0, p1) P2 #define GMOCK_INTERNAL_COUNT_AND_3_VALUE_PARAMS(p0, p1, p2) P3 #define GMOCK_INTERNAL_COUNT_AND_4_VALUE_PARAMS(p0, p1, p2, p3) P4 #define GMOCK_INTERNAL_COUNT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) P5 #define GMOCK_INTERNAL_COUNT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) P6 #define GMOCK_INTERNAL_COUNT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6) P7 #define GMOCK_INTERNAL_COUNT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ p7) P8 #define GMOCK_INTERNAL_COUNT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ p7, p8) P9 #define GMOCK_INTERNAL_COUNT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ p7, p8, p9) P10 // The name of the class template implementing the action template. #define GMOCK_ACTION_CLASS_(name, value_params)\ GMOCK_CONCAT_TOKEN_(name##Action, GMOCK_INTERNAL_COUNT_##value_params) #define ACTION_TEMPLATE(name, template_params, value_params)\ template \ class GMOCK_ACTION_CLASS_(name, value_params) {\ public:\ GMOCK_ACTION_CLASS_(name, value_params)\ GMOCK_INTERNAL_INIT_##value_params {}\ template \ class gmock_Impl : public ::testing::ActionInterface {\ public:\ typedef F function_type;\ typedef typename ::testing::internal::Function::Result return_type;\ typedef typename ::testing::internal::Function::ArgumentTuple\ args_type;\ explicit gmock_Impl GMOCK_INTERNAL_INIT_##value_params {}\ virtual return_type Perform(const args_type& args) {\ return ::testing::internal::ActionHelper::\ Perform(this, args);\ }\ template \ return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ arg9_type arg9) const;\ GMOCK_INTERNAL_DEFN_##value_params\ private:\ GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ };\ template operator ::testing::Action() const {\ return ::testing::Action(\ new gmock_Impl(GMOCK_INTERNAL_LIST_##value_params));\ }\ GMOCK_INTERNAL_DEFN_##value_params\ private:\ GTEST_DISALLOW_ASSIGN_(GMOCK_ACTION_CLASS_(name, value_params));\ };\ template \ inline GMOCK_ACTION_CLASS_(name, value_params)<\ GMOCK_INTERNAL_LIST_##template_params\ GMOCK_INTERNAL_LIST_TYPE_##value_params> name(\ GMOCK_INTERNAL_DECL_##value_params) {\ return GMOCK_ACTION_CLASS_(name, value_params)<\ GMOCK_INTERNAL_LIST_##template_params\ GMOCK_INTERNAL_LIST_TYPE_##value_params>(\ GMOCK_INTERNAL_LIST_##value_params);\ }\ template \ template \ template \ typename ::testing::internal::Function::Result\ GMOCK_ACTION_CLASS_(name, value_params)<\ GMOCK_INTERNAL_LIST_##template_params\ GMOCK_INTERNAL_LIST_TYPE_##value_params>::gmock_Impl::\ gmock_PerformImpl(\ GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const #define ACTION(name)\ class name##Action {\ public:\ name##Action() {}\ template \ class gmock_Impl : public ::testing::ActionInterface {\ public:\ typedef F function_type;\ typedef typename ::testing::internal::Function::Result return_type;\ typedef typename ::testing::internal::Function::ArgumentTuple\ args_type;\ gmock_Impl() {}\ virtual return_type Perform(const args_type& args) {\ return ::testing::internal::ActionHelper::\ Perform(this, args);\ }\ template \ return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ arg9_type arg9) const;\ private:\ GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ };\ template operator ::testing::Action() const {\ return ::testing::Action(new gmock_Impl());\ }\ private:\ GTEST_DISALLOW_ASSIGN_(name##Action);\ };\ inline name##Action name() {\ return name##Action();\ }\ template \ template \ typename ::testing::internal::Function::Result\ name##Action::gmock_Impl::gmock_PerformImpl(\ GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const #define ACTION_P(name, p0)\ template \ class name##ActionP {\ public:\ name##ActionP(p0##_type gmock_p0) : p0(gmock_p0) {}\ template \ class gmock_Impl : public ::testing::ActionInterface {\ public:\ typedef F function_type;\ typedef typename ::testing::internal::Function::Result return_type;\ typedef typename ::testing::internal::Function::ArgumentTuple\ args_type;\ explicit gmock_Impl(p0##_type gmock_p0) : p0(gmock_p0) {}\ virtual return_type Perform(const args_type& args) {\ return ::testing::internal::ActionHelper::\ Perform(this, args);\ }\ template \ return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ arg9_type arg9) const;\ p0##_type p0;\ private:\ GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ };\ template operator ::testing::Action() const {\ return ::testing::Action(new gmock_Impl(p0));\ }\ p0##_type p0;\ private:\ GTEST_DISALLOW_ASSIGN_(name##ActionP);\ };\ template \ inline name##ActionP name(p0##_type p0) {\ return name##ActionP(p0);\ }\ template \ template \ template \ typename ::testing::internal::Function::Result\ name##ActionP::gmock_Impl::gmock_PerformImpl(\ GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const #define ACTION_P2(name, p0, p1)\ template \ class name##ActionP2 {\ public:\ name##ActionP2(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \ p1(gmock_p1) {}\ template \ class gmock_Impl : public ::testing::ActionInterface {\ public:\ typedef F function_type;\ typedef typename ::testing::internal::Function::Result return_type;\ typedef typename ::testing::internal::Function::ArgumentTuple\ args_type;\ gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \ p1(gmock_p1) {}\ virtual return_type Perform(const args_type& args) {\ return ::testing::internal::ActionHelper::\ Perform(this, args);\ }\ template \ return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ arg9_type arg9) const;\ p0##_type p0;\ p1##_type p1;\ private:\ GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ };\ template operator ::testing::Action() const {\ return ::testing::Action(new gmock_Impl(p0, p1));\ }\ p0##_type p0;\ p1##_type p1;\ private:\ GTEST_DISALLOW_ASSIGN_(name##ActionP2);\ };\ template \ inline name##ActionP2 name(p0##_type p0, \ p1##_type p1) {\ return name##ActionP2(p0, p1);\ }\ template \ template \ template \ typename ::testing::internal::Function::Result\ name##ActionP2::gmock_Impl::gmock_PerformImpl(\ GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const #define ACTION_P3(name, p0, p1, p2)\ template \ class name##ActionP3 {\ public:\ name##ActionP3(p0##_type gmock_p0, p1##_type gmock_p1, \ p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\ template \ class gmock_Impl : public ::testing::ActionInterface {\ public:\ typedef F function_type;\ typedef typename ::testing::internal::Function::Result return_type;\ typedef typename ::testing::internal::Function::ArgumentTuple\ args_type;\ gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, \ p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\ virtual return_type Perform(const args_type& args) {\ return ::testing::internal::ActionHelper::\ Perform(this, args);\ }\ template \ return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ arg9_type arg9) const;\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ private:\ GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ };\ template operator ::testing::Action() const {\ return ::testing::Action(new gmock_Impl(p0, p1, p2));\ }\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ private:\ GTEST_DISALLOW_ASSIGN_(name##ActionP3);\ };\ template \ inline name##ActionP3 name(p0##_type p0, \ p1##_type p1, p2##_type p2) {\ return name##ActionP3(p0, p1, p2);\ }\ template \ template \ template \ typename ::testing::internal::Function::Result\ name##ActionP3::gmock_Impl::gmock_PerformImpl(\ GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const #define ACTION_P4(name, p0, p1, p2, p3)\ template \ class name##ActionP4 {\ public:\ name##ActionP4(p0##_type gmock_p0, p1##_type gmock_p1, \ p2##_type gmock_p2, p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), \ p2(gmock_p2), p3(gmock_p3) {}\ template \ class gmock_Impl : public ::testing::ActionInterface {\ public:\ typedef F function_type;\ typedef typename ::testing::internal::Function::Result return_type;\ typedef typename ::testing::internal::Function::ArgumentTuple\ args_type;\ gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ p3(gmock_p3) {}\ virtual return_type Perform(const args_type& args) {\ return ::testing::internal::ActionHelper::\ Perform(this, args);\ }\ template \ return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ arg9_type arg9) const;\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ private:\ GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ };\ template operator ::testing::Action() const {\ return ::testing::Action(new gmock_Impl(p0, p1, p2, p3));\ }\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ private:\ GTEST_DISALLOW_ASSIGN_(name##ActionP4);\ };\ template \ inline name##ActionP4 name(p0##_type p0, p1##_type p1, p2##_type p2, \ p3##_type p3) {\ return name##ActionP4(p0, p1, \ p2, p3);\ }\ template \ template \ template \ typename ::testing::internal::Function::Result\ name##ActionP4::gmock_Impl::gmock_PerformImpl(\ GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const #define ACTION_P5(name, p0, p1, p2, p3, p4)\ template \ class name##ActionP5 {\ public:\ name##ActionP5(p0##_type gmock_p0, p1##_type gmock_p1, \ p2##_type gmock_p2, p3##_type gmock_p3, \ p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ p3(gmock_p3), p4(gmock_p4) {}\ template \ class gmock_Impl : public ::testing::ActionInterface {\ public:\ typedef F function_type;\ typedef typename ::testing::internal::Function::Result return_type;\ typedef typename ::testing::internal::Function::ArgumentTuple\ args_type;\ gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ p3##_type gmock_p3, p4##_type gmock_p4) : p0(gmock_p0), \ p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), p4(gmock_p4) {}\ virtual return_type Perform(const args_type& args) {\ return ::testing::internal::ActionHelper::\ Perform(this, args);\ }\ template \ return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ arg9_type arg9) const;\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ p4##_type p4;\ private:\ GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ };\ template operator ::testing::Action() const {\ return ::testing::Action(new gmock_Impl(p0, p1, p2, p3, p4));\ }\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ p4##_type p4;\ private:\ GTEST_DISALLOW_ASSIGN_(name##ActionP5);\ };\ template \ inline name##ActionP5 name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ p4##_type p4) {\ return name##ActionP5(p0, p1, p2, p3, p4);\ }\ template \ template \ template \ typename ::testing::internal::Function::Result\ name##ActionP5::gmock_Impl::gmock_PerformImpl(\ GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const #define ACTION_P6(name, p0, p1, p2, p3, p4, p5)\ template \ class name##ActionP6 {\ public:\ name##ActionP6(p0##_type gmock_p0, p1##_type gmock_p1, \ p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {}\ template \ class gmock_Impl : public ::testing::ActionInterface {\ public:\ typedef F function_type;\ typedef typename ::testing::internal::Function::Result return_type;\ typedef typename ::testing::internal::Function::ArgumentTuple\ args_type;\ gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ p3##_type gmock_p3, p4##_type gmock_p4, \ p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {}\ virtual return_type Perform(const args_type& args) {\ return ::testing::internal::ActionHelper::\ Perform(this, args);\ }\ template \ return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ arg9_type arg9) const;\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ p4##_type p4;\ p5##_type p5;\ private:\ GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ };\ template operator ::testing::Action() const {\ return ::testing::Action(new gmock_Impl(p0, p1, p2, p3, p4, p5));\ }\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ p4##_type p4;\ p5##_type p5;\ private:\ GTEST_DISALLOW_ASSIGN_(name##ActionP6);\ };\ template \ inline name##ActionP6 name(p0##_type p0, p1##_type p1, p2##_type p2, \ p3##_type p3, p4##_type p4, p5##_type p5) {\ return name##ActionP6(p0, p1, p2, p3, p4, p5);\ }\ template \ template \ template \ typename ::testing::internal::Function::Result\ name##ActionP6::gmock_Impl::gmock_PerformImpl(\ GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const #define ACTION_P7(name, p0, p1, p2, p3, p4, p5, p6)\ template \ class name##ActionP7 {\ public:\ name##ActionP7(p0##_type gmock_p0, p1##_type gmock_p1, \ p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ p5##_type gmock_p5, p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), \ p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), \ p6(gmock_p6) {}\ template \ class gmock_Impl : public ::testing::ActionInterface {\ public:\ typedef F function_type;\ typedef typename ::testing::internal::Function::Result return_type;\ typedef typename ::testing::internal::Function::ArgumentTuple\ args_type;\ gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6) {}\ virtual return_type Perform(const args_type& args) {\ return ::testing::internal::ActionHelper::\ Perform(this, args);\ }\ template \ return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ arg9_type arg9) const;\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ p4##_type p4;\ p5##_type p5;\ p6##_type p6;\ private:\ GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ };\ template operator ::testing::Action() const {\ return ::testing::Action(new gmock_Impl(p0, p1, p2, p3, p4, p5, \ p6));\ }\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ p4##_type p4;\ p5##_type p5;\ p6##_type p6;\ private:\ GTEST_DISALLOW_ASSIGN_(name##ActionP7);\ };\ template \ inline name##ActionP7 name(p0##_type p0, p1##_type p1, \ p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \ p6##_type p6) {\ return name##ActionP7(p0, p1, p2, p3, p4, p5, p6);\ }\ template \ template \ template \ typename ::testing::internal::Function::Result\ name##ActionP7::gmock_Impl::gmock_PerformImpl(\ GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const #define ACTION_P8(name, p0, p1, p2, p3, p4, p5, p6, p7)\ template \ class name##ActionP8 {\ public:\ name##ActionP8(p0##_type gmock_p0, p1##_type gmock_p1, \ p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ p5##_type gmock_p5, p6##_type gmock_p6, \ p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ p7(gmock_p7) {}\ template \ class gmock_Impl : public ::testing::ActionInterface {\ public:\ typedef F function_type;\ typedef typename ::testing::internal::Function::Result return_type;\ typedef typename ::testing::internal::Function::ArgumentTuple\ args_type;\ gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ p6##_type gmock_p6, p7##_type gmock_p7) : p0(gmock_p0), \ p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), \ p5(gmock_p5), p6(gmock_p6), p7(gmock_p7) {}\ virtual return_type Perform(const args_type& args) {\ return ::testing::internal::ActionHelper::\ Perform(this, args);\ }\ template \ return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ arg9_type arg9) const;\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ p4##_type p4;\ p5##_type p5;\ p6##_type p6;\ p7##_type p7;\ private:\ GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ };\ template operator ::testing::Action() const {\ return ::testing::Action(new gmock_Impl(p0, p1, p2, p3, p4, p5, \ p6, p7));\ }\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ p4##_type p4;\ p5##_type p5;\ p6##_type p6;\ p7##_type p7;\ private:\ GTEST_DISALLOW_ASSIGN_(name##ActionP8);\ };\ template \ inline name##ActionP8 name(p0##_type p0, \ p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \ p6##_type p6, p7##_type p7) {\ return name##ActionP8(p0, p1, p2, p3, p4, p5, \ p6, p7);\ }\ template \ template \ template \ typename ::testing::internal::Function::Result\ name##ActionP8::gmock_Impl::gmock_PerformImpl(\ GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const #define ACTION_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8)\ template \ class name##ActionP9 {\ public:\ name##ActionP9(p0##_type gmock_p0, p1##_type gmock_p1, \ p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ p8(gmock_p8) {}\ template \ class gmock_Impl : public ::testing::ActionInterface {\ public:\ typedef F function_type;\ typedef typename ::testing::internal::Function::Result return_type;\ typedef typename ::testing::internal::Function::ArgumentTuple\ args_type;\ gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ p6##_type gmock_p6, p7##_type gmock_p7, \ p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ p7(gmock_p7), p8(gmock_p8) {}\ virtual return_type Perform(const args_type& args) {\ return ::testing::internal::ActionHelper::\ Perform(this, args);\ }\ template \ return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ arg9_type arg9) const;\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ p4##_type p4;\ p5##_type p5;\ p6##_type p6;\ p7##_type p7;\ p8##_type p8;\ private:\ GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ };\ template operator ::testing::Action() const {\ return ::testing::Action(new gmock_Impl(p0, p1, p2, p3, p4, p5, \ p6, p7, p8));\ }\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ p4##_type p4;\ p5##_type p5;\ p6##_type p6;\ p7##_type p7;\ p8##_type p8;\ private:\ GTEST_DISALLOW_ASSIGN_(name##ActionP9);\ };\ template \ inline name##ActionP9 name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, \ p8##_type p8) {\ return name##ActionP9(p0, p1, p2, \ p3, p4, p5, p6, p7, p8);\ }\ template \ template \ template \ typename ::testing::internal::Function::Result\ name##ActionP9::gmock_Impl::gmock_PerformImpl(\ GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const #define ACTION_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)\ template \ class name##ActionP10 {\ public:\ name##ActionP10(p0##_type gmock_p0, p1##_type gmock_p1, \ p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ p8##_type gmock_p8, p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), \ p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {}\ template \ class gmock_Impl : public ::testing::ActionInterface {\ public:\ typedef F function_type;\ typedef typename ::testing::internal::Function::Result return_type;\ typedef typename ::testing::internal::Function::ArgumentTuple\ args_type;\ gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \ p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {}\ virtual return_type Perform(const args_type& args) {\ return ::testing::internal::ActionHelper::\ Perform(this, args);\ }\ template \ return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ arg9_type arg9) const;\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ p4##_type p4;\ p5##_type p5;\ p6##_type p6;\ p7##_type p7;\ p8##_type p8;\ p9##_type p9;\ private:\ GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ };\ template operator ::testing::Action() const {\ return ::testing::Action(new gmock_Impl(p0, p1, p2, p3, p4, p5, \ p6, p7, p8, p9));\ }\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ p4##_type p4;\ p5##_type p5;\ p6##_type p6;\ p7##_type p7;\ p8##_type p8;\ p9##_type p9;\ private:\ GTEST_DISALLOW_ASSIGN_(name##ActionP10);\ };\ template \ inline name##ActionP10 name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \ p9##_type p9) {\ return name##ActionP10(p0, \ p1, p2, p3, p4, p5, p6, p7, p8, p9);\ }\ template \ template \ template \ typename ::testing::internal::Function::Result\ name##ActionP10::gmock_Impl::gmock_PerformImpl(\ GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const // TODO(wan@google.com): move the following to a different .h file // such that we don't have to run 'pump' every time the code is // updated. namespace testing { // The ACTION*() macros trigger warning C4100 (unreferenced formal // parameter) in MSVC with -W4. Unfortunately they cannot be fixed in // the macro definition, as the warnings are generated when the macro // is expanded and macro expansion cannot contain #pragma. Therefore // we suppress them here. #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable:4100) #endif // Various overloads for InvokeArgument(). // // The InvokeArgument(a1, a2, ..., a_k) action invokes the N-th // (0-based) argument, which must be a k-ary callable, of the mock // function, with arguments a1, a2, ..., a_k. // // Notes: // // 1. The arguments are passed by value by default. If you need to // pass an argument by reference, wrap it inside ByRef(). For // example, // // InvokeArgument<1>(5, string("Hello"), ByRef(foo)) // // passes 5 and string("Hello") by value, and passes foo by // reference. // // 2. If the callable takes an argument by reference but ByRef() is // not used, it will receive the reference to a copy of the value, // instead of the original value. For example, when the 0-th // argument of the mock function takes a const string&, the action // // InvokeArgument<0>(string("Hello")) // // makes a copy of the temporary string("Hello") object and passes a // reference of the copy, instead of the original temporary object, // to the callable. This makes it easy for a user to define an // InvokeArgument action from temporary values and have it performed // later. ACTION_TEMPLATE(InvokeArgument, HAS_1_TEMPLATE_PARAMS(int, k), AND_0_VALUE_PARAMS()) { return internal::CallableHelper::Call( ::std::tr1::get(args)); } ACTION_TEMPLATE(InvokeArgument, HAS_1_TEMPLATE_PARAMS(int, k), AND_1_VALUE_PARAMS(p0)) { return internal::CallableHelper::Call( ::std::tr1::get(args), p0); } ACTION_TEMPLATE(InvokeArgument, HAS_1_TEMPLATE_PARAMS(int, k), AND_2_VALUE_PARAMS(p0, p1)) { return internal::CallableHelper::Call( ::std::tr1::get(args), p0, p1); } ACTION_TEMPLATE(InvokeArgument, HAS_1_TEMPLATE_PARAMS(int, k), AND_3_VALUE_PARAMS(p0, p1, p2)) { return internal::CallableHelper::Call( ::std::tr1::get(args), p0, p1, p2); } ACTION_TEMPLATE(InvokeArgument, HAS_1_TEMPLATE_PARAMS(int, k), AND_4_VALUE_PARAMS(p0, p1, p2, p3)) { return internal::CallableHelper::Call( ::std::tr1::get(args), p0, p1, p2, p3); } ACTION_TEMPLATE(InvokeArgument, HAS_1_TEMPLATE_PARAMS(int, k), AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) { return internal::CallableHelper::Call( ::std::tr1::get(args), p0, p1, p2, p3, p4); } ACTION_TEMPLATE(InvokeArgument, HAS_1_TEMPLATE_PARAMS(int, k), AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) { return internal::CallableHelper::Call( ::std::tr1::get(args), p0, p1, p2, p3, p4, p5); } ACTION_TEMPLATE(InvokeArgument, HAS_1_TEMPLATE_PARAMS(int, k), AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) { return internal::CallableHelper::Call( ::std::tr1::get(args), p0, p1, p2, p3, p4, p5, p6); } ACTION_TEMPLATE(InvokeArgument, HAS_1_TEMPLATE_PARAMS(int, k), AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)) { return internal::CallableHelper::Call( ::std::tr1::get(args), p0, p1, p2, p3, p4, p5, p6, p7); } ACTION_TEMPLATE(InvokeArgument, HAS_1_TEMPLATE_PARAMS(int, k), AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8)) { return internal::CallableHelper::Call( ::std::tr1::get(args), p0, p1, p2, p3, p4, p5, p6, p7, p8); } ACTION_TEMPLATE(InvokeArgument, HAS_1_TEMPLATE_PARAMS(int, k), AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) { return internal::CallableHelper::Call( ::std::tr1::get(args), p0, p1, p2, p3, p4, p5, p6, p7, p8, p9); } // Various overloads for ReturnNew(). // // The ReturnNew(a1, a2, ..., a_k) action returns a pointer to a new // instance of type T, constructed on the heap with constructor arguments // a1, a2, ..., and a_k. The caller assumes ownership of the returned value. ACTION_TEMPLATE(ReturnNew, HAS_1_TEMPLATE_PARAMS(typename, T), AND_0_VALUE_PARAMS()) { return new T(); } ACTION_TEMPLATE(ReturnNew, HAS_1_TEMPLATE_PARAMS(typename, T), AND_1_VALUE_PARAMS(p0)) { return new T(p0); } ACTION_TEMPLATE(ReturnNew, HAS_1_TEMPLATE_PARAMS(typename, T), AND_2_VALUE_PARAMS(p0, p1)) { return new T(p0, p1); } ACTION_TEMPLATE(ReturnNew, HAS_1_TEMPLATE_PARAMS(typename, T), AND_3_VALUE_PARAMS(p0, p1, p2)) { return new T(p0, p1, p2); } ACTION_TEMPLATE(ReturnNew, HAS_1_TEMPLATE_PARAMS(typename, T), AND_4_VALUE_PARAMS(p0, p1, p2, p3)) { return new T(p0, p1, p2, p3); } ACTION_TEMPLATE(ReturnNew, HAS_1_TEMPLATE_PARAMS(typename, T), AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) { return new T(p0, p1, p2, p3, p4); } ACTION_TEMPLATE(ReturnNew, HAS_1_TEMPLATE_PARAMS(typename, T), AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) { return new T(p0, p1, p2, p3, p4, p5); } ACTION_TEMPLATE(ReturnNew, HAS_1_TEMPLATE_PARAMS(typename, T), AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) { return new T(p0, p1, p2, p3, p4, p5, p6); } ACTION_TEMPLATE(ReturnNew, HAS_1_TEMPLATE_PARAMS(typename, T), AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)) { return new T(p0, p1, p2, p3, p4, p5, p6, p7); } ACTION_TEMPLATE(ReturnNew, HAS_1_TEMPLATE_PARAMS(typename, T), AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8)) { return new T(p0, p1, p2, p3, p4, p5, p6, p7, p8); } ACTION_TEMPLATE(ReturnNew, HAS_1_TEMPLATE_PARAMS(typename, T), AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) { return new T(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9); } #ifdef _MSC_VER #pragma warning(pop) #endif } // namespace testing #endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/include/gmock/gmock-generated-actions.h.pump000066400000000000000000000657351260417502300326250ustar00rootroot00000000000000$$ -*- mode: c++; -*- $$ This is a Pump source file. Please use Pump to convert it to $$ gmock-generated-actions.h. $$ $var n = 10 $$ The maximum arity we support. $$}} This meta comment fixes auto-indentation in editors. // Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Google Mock - a framework for writing C++ mock classes. // // This file implements some commonly used variadic actions. #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ #include #include namespace testing { namespace internal { // InvokeHelper knows how to unpack an N-tuple and invoke an N-ary // function or method with the unpacked values, where F is a function // type that takes N arguments. template class InvokeHelper; $range i 0..n $for i [[ $range j 1..i $var types = [[$for j [[, typename A$j]]]] $var as = [[$for j, [[A$j]]]] $var args = [[$if i==0 [[]] $else [[ args]]]] $var import = [[$if i==0 [[]] $else [[ using ::std::tr1::get; ]]]] $var gets = [[$for j, [[get<$(j - 1)>(args)]]]] template class InvokeHelper > { public: template static R Invoke(Function function, const ::std::tr1::tuple<$as>&$args) { $import return function($gets); } template static R InvokeMethod(Class* obj_ptr, MethodPtr method_ptr, const ::std::tr1::tuple<$as>&$args) { $import return (obj_ptr->*method_ptr)($gets); } }; ]] // CallableHelper has static methods for invoking "callables", // i.e. function pointers and functors. It uses overloading to // provide a uniform interface for invoking different kinds of // callables. In particular, you can use: // // CallableHelper::Call(callable, a1, a2, ..., an) // // to invoke an n-ary callable, where R is its return type. If an // argument, say a2, needs to be passed by reference, you should write // ByRef(a2) instead of a2 in the above expression. template class CallableHelper { public: // Calls a nullary callable. template static R Call(Function function) { return function(); } // Calls a unary callable. // We deliberately pass a1 by value instead of const reference here // in case it is a C-string literal. If we had declared the // parameter as 'const A1& a1' and write Call(function, "Hi"), the // compiler would've thought A1 is 'char[3]', which causes trouble // when you need to copy a value of type A1. By declaring the // parameter as 'A1 a1', the compiler will correctly infer that A1 // is 'const char*' when it sees Call(function, "Hi"). // // Since this function is defined inline, the compiler can get rid // of the copying of the arguments. Therefore the performance won't // be hurt. template static R Call(Function function, A1 a1) { return function(a1); } $range i 2..n $for i [[ $var arity = [[$if i==2 [[binary]] $elif i==3 [[ternary]] $else [[$i-ary]]]] // Calls a $arity callable. $range j 1..i $var typename_As = [[$for j, [[typename A$j]]]] $var Aas = [[$for j, [[A$j a$j]]]] $var as = [[$for j, [[a$j]]]] $var typename_Ts = [[$for j, [[typename T$j]]]] $var Ts = [[$for j, [[T$j]]]] template static R Call(Function function, $Aas) { return function($as); } ]] }; // class CallableHelper // An INTERNAL macro for extracting the type of a tuple field. It's // subject to change without notice - DO NOT USE IN USER CODE! #define GMOCK_FIELD_(Tuple, N) \ typename ::std::tr1::tuple_element::type $range i 1..n // SelectArgs::type is the // type of an n-ary function whose i-th (1-based) argument type is the // k{i}-th (0-based) field of ArgumentTuple, which must be a tuple // type, and whose return type is Result. For example, // SelectArgs, 0, 3>::type // is int(bool, long). // // SelectArgs::Select(args) // returns the selected fields (k1, k2, ..., k_n) of args as a tuple. // For example, // SelectArgs, 2, 0>::Select( // ::std::tr1::make_tuple(true, 'a', 2.5)) // returns ::std::tr1::tuple (2.5, true). // // The numbers in list k1, k2, ..., k_n must be >= 0, where n can be // in the range [0, $n]. Duplicates are allowed and they don't have // to be in an ascending or descending order. template class SelectArgs { public: typedef Result type($for i, [[GMOCK_FIELD_(ArgumentTuple, k$i)]]); typedef typename Function::ArgumentTuple SelectedArgs; static SelectedArgs Select(const ArgumentTuple& args) { using ::std::tr1::get; return SelectedArgs($for i, [[get(args)]]); } }; $for i [[ $range j 1..n $range j1 1..i-1 template class SelectArgs { public: typedef Result type($for j1, [[GMOCK_FIELD_(ArgumentTuple, k$j1)]]); typedef typename Function::ArgumentTuple SelectedArgs; static SelectedArgs Select(const ArgumentTuple& [[]] $if i == 1 [[/* args */]] $else [[args]]) { using ::std::tr1::get; return SelectedArgs($for j1, [[get(args)]]); } }; ]] #undef GMOCK_FIELD_ $var ks = [[$for i, [[k$i]]]] // Implements the WithArgs action. template class WithArgsAction { public: explicit WithArgsAction(const InnerAction& action) : action_(action) {} template operator Action() const { return MakeAction(new Impl(action_)); } private: template class Impl : public ActionInterface { public: typedef typename Function::Result Result; typedef typename Function::ArgumentTuple ArgumentTuple; explicit Impl(const InnerAction& action) : action_(action) {} virtual Result Perform(const ArgumentTuple& args) { return action_.Perform(SelectArgs::Select(args)); } private: typedef typename SelectArgs::type InnerFunctionType; Action action_; }; const InnerAction action_; GTEST_DISALLOW_ASSIGN_(WithArgsAction); }; // A macro from the ACTION* family (defined later in this file) // defines an action that can be used in a mock function. Typically, // these actions only care about a subset of the arguments of the mock // function. For example, if such an action only uses the second // argument, it can be used in any mock function that takes >= 2 // arguments where the type of the second argument is compatible. // // Therefore, the action implementation must be prepared to take more // arguments than it needs. The ExcessiveArg type is used to // represent those excessive arguments. In order to keep the compiler // error messages tractable, we define it in the testing namespace // instead of testing::internal. However, this is an INTERNAL TYPE // and subject to change without notice, so a user MUST NOT USE THIS // TYPE DIRECTLY. struct ExcessiveArg {}; // A helper class needed for implementing the ACTION* macros. template class ActionHelper { public: $range i 0..n $for i [[ $var template = [[$if i==0 [[]] $else [[ $range j 0..i-1 template <$for j, [[typename A$j]]> ]]]] $range j 0..i-1 $var As = [[$for j, [[A$j]]]] $var as = [[$for j, [[get<$j>(args)]]]] $range k 1..n-i $var eas = [[$for k, [[ExcessiveArg()]]]] $var arg_list = [[$if (i==0) | (i==n) [[$as$eas]] $else [[$as, $eas]]]] $template static Result Perform(Impl* impl, const ::std::tr1::tuple<$As>& args) { using ::std::tr1::get; return impl->template gmock_PerformImpl<$As>(args, $arg_list); } ]] }; } // namespace internal // Various overloads for Invoke(). // WithArgs(an_action) creates an action that passes // the selected arguments of the mock function to an_action and // performs it. It serves as an adaptor between actions with // different argument lists. C++ doesn't support default arguments for // function templates, so we have to overload it. $range i 1..n $for i [[ $range j 1..i template <$for j [[int k$j, ]]typename InnerAction> inline internal::WithArgsAction WithArgs(const InnerAction& action) { return internal::WithArgsAction(action); } ]] // Creates an action that does actions a1, a2, ..., sequentially in // each invocation. $range i 2..n $for i [[ $range j 2..i $var types = [[$for j, [[typename Action$j]]]] $var Aas = [[$for j [[, Action$j a$j]]]] template $range k 1..i-1 inline $for k [[internal::DoBothAction]] DoAll(Action1 a1$Aas) { $if i==2 [[ return internal::DoBothAction(a1, a2); ]] $else [[ $range j2 2..i return DoAll(a1, DoAll($for j2, [[a$j2]])); ]] } ]] } // namespace testing // The ACTION* family of macros can be used in a namespace scope to // define custom actions easily. The syntax: // // ACTION(name) { statements; } // // will define an action with the given name that executes the // statements. The value returned by the statements will be used as // the return value of the action. Inside the statements, you can // refer to the K-th (0-based) argument of the mock function by // 'argK', and refer to its type by 'argK_type'. For example: // // ACTION(IncrementArg1) { // arg1_type temp = arg1; // return ++(*temp); // } // // allows you to write // // ...WillOnce(IncrementArg1()); // // You can also refer to the entire argument tuple and its type by // 'args' and 'args_type', and refer to the mock function type and its // return type by 'function_type' and 'return_type'. // // Note that you don't need to specify the types of the mock function // arguments. However rest assured that your code is still type-safe: // you'll get a compiler error if *arg1 doesn't support the ++ // operator, or if the type of ++(*arg1) isn't compatible with the // mock function's return type, for example. // // Sometimes you'll want to parameterize the action. For that you can use // another macro: // // ACTION_P(name, param_name) { statements; } // // For example: // // ACTION_P(Add, n) { return arg0 + n; } // // will allow you to write: // // ...WillOnce(Add(5)); // // Note that you don't need to provide the type of the parameter // either. If you need to reference the type of a parameter named // 'foo', you can write 'foo_type'. For example, in the body of // ACTION_P(Add, n) above, you can write 'n_type' to refer to the type // of 'n'. // // We also provide ACTION_P2, ACTION_P3, ..., up to ACTION_P$n to support // multi-parameter actions. // // For the purpose of typing, you can view // // ACTION_Pk(Foo, p1, ..., pk) { ... } // // as shorthand for // // template // FooActionPk Foo(p1_type p1, ..., pk_type pk) { ... } // // In particular, you can provide the template type arguments // explicitly when invoking Foo(), as in Foo(5, false); // although usually you can rely on the compiler to infer the types // for you automatically. You can assign the result of expression // Foo(p1, ..., pk) to a variable of type FooActionPk. This can be useful when composing actions. // // You can also overload actions with different numbers of parameters: // // ACTION_P(Plus, a) { ... } // ACTION_P2(Plus, a, b) { ... } // // While it's tempting to always use the ACTION* macros when defining // a new action, you should also consider implementing ActionInterface // or using MakePolymorphicAction() instead, especially if you need to // use the action a lot. While these approaches require more work, // they give you more control on the types of the mock function // arguments and the action parameters, which in general leads to // better compiler error messages that pay off in the long run. They // also allow overloading actions based on parameter types (as opposed // to just based on the number of parameters). // // CAVEAT: // // ACTION*() can only be used in a namespace scope. The reason is // that C++ doesn't yet allow function-local types to be used to // instantiate templates. The up-coming C++0x standard will fix this. // Once that's done, we'll consider supporting using ACTION*() inside // a function. // // MORE INFORMATION: // // To learn more about using these macros, please search for 'ACTION' // on http://code.google.com/p/googlemock/wiki/CookBook. $range i 0..n $range k 0..n-1 // An internal macro needed for implementing ACTION*(). #define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_\ const args_type& args GTEST_ATTRIBUTE_UNUSED_ $for k [[,\ arg$k[[]]_type arg$k GTEST_ATTRIBUTE_UNUSED_]] // Sometimes you want to give an action explicit template parameters // that cannot be inferred from its value parameters. ACTION() and // ACTION_P*() don't support that. ACTION_TEMPLATE() remedies that // and can be viewed as an extension to ACTION() and ACTION_P*(). // // The syntax: // // ACTION_TEMPLATE(ActionName, // HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m), // AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; } // // defines an action template that takes m explicit template // parameters and n value parameters. name_i is the name of the i-th // template parameter, and kind_i specifies whether it's a typename, // an integral constant, or a template. p_i is the name of the i-th // value parameter. // // Example: // // // DuplicateArg(output) converts the k-th argument of the mock // // function to type T and copies it to *output. // ACTION_TEMPLATE(DuplicateArg, // HAS_2_TEMPLATE_PARAMS(int, k, typename, T), // AND_1_VALUE_PARAMS(output)) { // *output = T(std::tr1::get(args)); // } // ... // int n; // EXPECT_CALL(mock, Foo(_, _)) // .WillOnce(DuplicateArg<1, unsigned char>(&n)); // // To create an instance of an action template, write: // // ActionName(v1, ..., v_n) // // where the ts are the template arguments and the vs are the value // arguments. The value argument types are inferred by the compiler. // If you want to explicitly specify the value argument types, you can // provide additional template arguments: // // ActionName(v1, ..., v_n) // // where u_i is the desired type of v_i. // // ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded on the // number of value parameters, but not on the number of template // parameters. Without the restriction, the meaning of the following // is unclear: // // OverloadedAction(x); // // Are we using a single-template-parameter action where 'bool' refers // to the type of x, or are we using a two-template-parameter action // where the compiler is asked to infer the type of x? // // Implementation notes: // // GMOCK_INTERNAL_*_HAS_m_TEMPLATE_PARAMS and // GMOCK_INTERNAL_*_AND_n_VALUE_PARAMS are internal macros for // implementing ACTION_TEMPLATE. The main trick we use is to create // new macro invocations when expanding a macro. For example, we have // // #define ACTION_TEMPLATE(name, template_params, value_params) // ... GMOCK_INTERNAL_DECL_##template_params ... // // which causes ACTION_TEMPLATE(..., HAS_1_TEMPLATE_PARAMS(typename, T), ...) // to expand to // // ... GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(typename, T) ... // // Since GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS is a macro, the // preprocessor will continue to expand it to // // ... typename T ... // // This technique conforms to the C++ standard and is portable. It // allows us to implement action templates using O(N) code, where N is // the maximum number of template/value parameters supported. Without // using it, we'd have to devote O(N^2) amount of code to implement all // combinations of m and n. // Declares the template parameters. $range j 1..n $for j [[ $range m 0..j-1 #define GMOCK_INTERNAL_DECL_HAS_$j[[]] _TEMPLATE_PARAMS($for m, [[kind$m, name$m]]) $for m, [[kind$m name$m]] ]] // Lists the template parameters. $for j [[ $range m 0..j-1 #define GMOCK_INTERNAL_LIST_HAS_$j[[]] _TEMPLATE_PARAMS($for m, [[kind$m, name$m]]) $for m, [[name$m]] ]] // Declares the types of value parameters. $for i [[ $range j 0..i-1 #define GMOCK_INTERNAL_DECL_TYPE_AND_$i[[]] _VALUE_PARAMS($for j, [[p$j]]) $for j [[, typename p$j##_type]] ]] // Initializes the value parameters. $for i [[ $range j 0..i-1 #define GMOCK_INTERNAL_INIT_AND_$i[[]]_VALUE_PARAMS($for j, [[p$j]])\ ($for j, [[p$j##_type gmock_p$j]])$if i>0 [[ : ]]$for j, [[p$j(gmock_p$j)]] ]] // Declares the fields for storing the value parameters. $for i [[ $range j 0..i-1 #define GMOCK_INTERNAL_DEFN_AND_$i[[]] _VALUE_PARAMS($for j, [[p$j]]) $for j [[p$j##_type p$j; ]] ]] // Lists the value parameters. $for i [[ $range j 0..i-1 #define GMOCK_INTERNAL_LIST_AND_$i[[]] _VALUE_PARAMS($for j, [[p$j]]) $for j, [[p$j]] ]] // Lists the value parameter types. $for i [[ $range j 0..i-1 #define GMOCK_INTERNAL_LIST_TYPE_AND_$i[[]] _VALUE_PARAMS($for j, [[p$j]]) $for j [[, p$j##_type]] ]] // Declares the value parameters. $for i [[ $range j 0..i-1 #define GMOCK_INTERNAL_DECL_AND_$i[[]]_VALUE_PARAMS($for j, [[p$j]]) [[]] $for j, [[p$j##_type p$j]] ]] // The suffix of the class template implementing the action template. $for i [[ $range j 0..i-1 #define GMOCK_INTERNAL_COUNT_AND_$i[[]]_VALUE_PARAMS($for j, [[p$j]]) [[]] $if i==1 [[P]] $elif i>=2 [[P$i]] ]] // The name of the class template implementing the action template. #define GMOCK_ACTION_CLASS_(name, value_params)\ GMOCK_CONCAT_TOKEN_(name##Action, GMOCK_INTERNAL_COUNT_##value_params) $range k 0..n-1 #define ACTION_TEMPLATE(name, template_params, value_params)\ template \ class GMOCK_ACTION_CLASS_(name, value_params) {\ public:\ GMOCK_ACTION_CLASS_(name, value_params)\ GMOCK_INTERNAL_INIT_##value_params {}\ template \ class gmock_Impl : public ::testing::ActionInterface {\ public:\ typedef F function_type;\ typedef typename ::testing::internal::Function::Result return_type;\ typedef typename ::testing::internal::Function::ArgumentTuple\ args_type;\ explicit gmock_Impl GMOCK_INTERNAL_INIT_##value_params {}\ virtual return_type Perform(const args_type& args) {\ return ::testing::internal::ActionHelper::\ Perform(this, args);\ }\ template <$for k, [[typename arg$k[[]]_type]]>\ return_type gmock_PerformImpl(const args_type& args[[]] $for k [[, arg$k[[]]_type arg$k]]) const;\ GMOCK_INTERNAL_DEFN_##value_params\ private:\ GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ };\ template operator ::testing::Action() const {\ return ::testing::Action(\ new gmock_Impl(GMOCK_INTERNAL_LIST_##value_params));\ }\ GMOCK_INTERNAL_DEFN_##value_params\ private:\ GTEST_DISALLOW_ASSIGN_(GMOCK_ACTION_CLASS_(name, value_params));\ };\ template \ inline GMOCK_ACTION_CLASS_(name, value_params)<\ GMOCK_INTERNAL_LIST_##template_params\ GMOCK_INTERNAL_LIST_TYPE_##value_params> name(\ GMOCK_INTERNAL_DECL_##value_params) {\ return GMOCK_ACTION_CLASS_(name, value_params)<\ GMOCK_INTERNAL_LIST_##template_params\ GMOCK_INTERNAL_LIST_TYPE_##value_params>(\ GMOCK_INTERNAL_LIST_##value_params);\ }\ template \ template \ template \ typename ::testing::internal::Function::Result\ GMOCK_ACTION_CLASS_(name, value_params)<\ GMOCK_INTERNAL_LIST_##template_params\ GMOCK_INTERNAL_LIST_TYPE_##value_params>::gmock_Impl::\ gmock_PerformImpl(\ GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const $for i [[ $var template = [[$if i==0 [[]] $else [[ $range j 0..i-1 template <$for j, [[typename p$j##_type]]>\ ]]]] $var class_name = [[name##Action[[$if i==0 [[]] $elif i==1 [[P]] $else [[P$i]]]]]] $range j 0..i-1 $var ctor_param_list = [[$for j, [[p$j##_type gmock_p$j]]]] $var param_types_and_names = [[$for j, [[p$j##_type p$j]]]] $var inits = [[$if i==0 [[]] $else [[ : $for j, [[p$j(gmock_p$j)]]]]]] $var param_field_decls = [[$for j [[ p$j##_type p$j;\ ]]]] $var param_field_decls2 = [[$for j [[ p$j##_type p$j;\ ]]]] $var params = [[$for j, [[p$j]]]] $var param_types = [[$if i==0 [[]] $else [[<$for j, [[p$j##_type]]>]]]] $var typename_arg_types = [[$for k, [[typename arg$k[[]]_type]]]] $var arg_types_and_names = [[$for k, [[arg$k[[]]_type arg$k]]]] $var macro_name = [[$if i==0 [[ACTION]] $elif i==1 [[ACTION_P]] $else [[ACTION_P$i]]]] #define $macro_name(name$for j [[, p$j]])\$template class $class_name {\ public:\ $class_name($ctor_param_list)$inits {}\ template \ class gmock_Impl : public ::testing::ActionInterface {\ public:\ typedef F function_type;\ typedef typename ::testing::internal::Function::Result return_type;\ typedef typename ::testing::internal::Function::ArgumentTuple\ args_type;\ [[$if i==1 [[explicit ]]]]gmock_Impl($ctor_param_list)$inits {}\ virtual return_type Perform(const args_type& args) {\ return ::testing::internal::ActionHelper::\ Perform(this, args);\ }\ template <$typename_arg_types>\ return_type gmock_PerformImpl(const args_type& args, [[]] $arg_types_and_names) const;\$param_field_decls private:\ GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ };\ template operator ::testing::Action() const {\ return ::testing::Action(new gmock_Impl($params));\ }\$param_field_decls2 private:\ GTEST_DISALLOW_ASSIGN_($class_name);\ };\$template inline $class_name$param_types name($param_types_and_names) {\ return $class_name$param_types($params);\ }\$template template \ template <$typename_arg_types>\ typename ::testing::internal::Function::Result\ $class_name$param_types::gmock_Impl::gmock_PerformImpl(\ GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const ]] $$ } // This meta comment fixes auto-indentation in Emacs. It won't $$ // show up in the generated code. // TODO(wan@google.com): move the following to a different .h file // such that we don't have to run 'pump' every time the code is // updated. namespace testing { // The ACTION*() macros trigger warning C4100 (unreferenced formal // parameter) in MSVC with -W4. Unfortunately they cannot be fixed in // the macro definition, as the warnings are generated when the macro // is expanded and macro expansion cannot contain #pragma. Therefore // we suppress them here. #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable:4100) #endif // Various overloads for InvokeArgument(). // // The InvokeArgument(a1, a2, ..., a_k) action invokes the N-th // (0-based) argument, which must be a k-ary callable, of the mock // function, with arguments a1, a2, ..., a_k. // // Notes: // // 1. The arguments are passed by value by default. If you need to // pass an argument by reference, wrap it inside ByRef(). For // example, // // InvokeArgument<1>(5, string("Hello"), ByRef(foo)) // // passes 5 and string("Hello") by value, and passes foo by // reference. // // 2. If the callable takes an argument by reference but ByRef() is // not used, it will receive the reference to a copy of the value, // instead of the original value. For example, when the 0-th // argument of the mock function takes a const string&, the action // // InvokeArgument<0>(string("Hello")) // // makes a copy of the temporary string("Hello") object and passes a // reference of the copy, instead of the original temporary object, // to the callable. This makes it easy for a user to define an // InvokeArgument action from temporary values and have it performed // later. $range i 0..n $for i [[ $range j 0..i-1 ACTION_TEMPLATE(InvokeArgument, HAS_1_TEMPLATE_PARAMS(int, k), AND_$i[[]]_VALUE_PARAMS($for j, [[p$j]])) { return internal::CallableHelper::Call( ::std::tr1::get(args)$for j [[, p$j]]); } ]] // Various overloads for ReturnNew(). // // The ReturnNew(a1, a2, ..., a_k) action returns a pointer to a new // instance of type T, constructed on the heap with constructor arguments // a1, a2, ..., and a_k. The caller assumes ownership of the returned value. $range i 0..n $for i [[ $range j 0..i-1 $var ps = [[$for j, [[p$j]]]] ACTION_TEMPLATE(ReturnNew, HAS_1_TEMPLATE_PARAMS(typename, T), AND_$i[[]]_VALUE_PARAMS($ps)) { return new T($ps); } ]] #ifdef _MSC_VER #pragma warning(pop) #endif } // namespace testing #endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ gmock-generated-function-mockers.h000066400000000000000000001170201260417502300333750ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/include/gmock// This file was GENERATED by a script. DO NOT EDIT BY HAND!!! // Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Google Mock - a framework for writing C++ mock classes. // // This file implements function mockers of various arities. #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ #include #include namespace testing { namespace internal { template class FunctionMockerBase; // Note: class FunctionMocker really belongs to the ::testing // namespace. However if we define it in ::testing, MSVC will // complain when classes in ::testing::internal declare it as a // friend class template. To workaround this compiler bug, we define // FunctionMocker in ::testing::internal and import it into ::testing. template class FunctionMocker; template class FunctionMocker : public internal::FunctionMockerBase { public: typedef R F(); typedef typename internal::Function::ArgumentTuple ArgumentTuple; MockSpec& With() { return this->current_spec(); } R Invoke() { // Even though gcc and MSVC don't enforce it, 'this->' is required // by the C++ standard [14.6.4] here, as the base class type is // dependent on the template argument (and thus shouldn't be // looked into when resolving InvokeWith). return this->InvokeWith(ArgumentTuple()); } }; template class FunctionMocker : public internal::FunctionMockerBase { public: typedef R F(A1); typedef typename internal::Function::ArgumentTuple ArgumentTuple; MockSpec& With(const Matcher& m1) { this->current_spec().SetMatchers(::std::tr1::make_tuple(m1)); return this->current_spec(); } R Invoke(A1 a1) { // Even though gcc and MSVC don't enforce it, 'this->' is required // by the C++ standard [14.6.4] here, as the base class type is // dependent on the template argument (and thus shouldn't be // looked into when resolving InvokeWith). return this->InvokeWith(ArgumentTuple(a1)); } }; template class FunctionMocker : public internal::FunctionMockerBase { public: typedef R F(A1, A2); typedef typename internal::Function::ArgumentTuple ArgumentTuple; MockSpec& With(const Matcher& m1, const Matcher& m2) { this->current_spec().SetMatchers(::std::tr1::make_tuple(m1, m2)); return this->current_spec(); } R Invoke(A1 a1, A2 a2) { // Even though gcc and MSVC don't enforce it, 'this->' is required // by the C++ standard [14.6.4] here, as the base class type is // dependent on the template argument (and thus shouldn't be // looked into when resolving InvokeWith). return this->InvokeWith(ArgumentTuple(a1, a2)); } }; template class FunctionMocker : public internal::FunctionMockerBase { public: typedef R F(A1, A2, A3); typedef typename internal::Function::ArgumentTuple ArgumentTuple; MockSpec& With(const Matcher& m1, const Matcher& m2, const Matcher& m3) { this->current_spec().SetMatchers(::std::tr1::make_tuple(m1, m2, m3)); return this->current_spec(); } R Invoke(A1 a1, A2 a2, A3 a3) { // Even though gcc and MSVC don't enforce it, 'this->' is required // by the C++ standard [14.6.4] here, as the base class type is // dependent on the template argument (and thus shouldn't be // looked into when resolving InvokeWith). return this->InvokeWith(ArgumentTuple(a1, a2, a3)); } }; template class FunctionMocker : public internal::FunctionMockerBase { public: typedef R F(A1, A2, A3, A4); typedef typename internal::Function::ArgumentTuple ArgumentTuple; MockSpec& With(const Matcher& m1, const Matcher& m2, const Matcher& m3, const Matcher& m4) { this->current_spec().SetMatchers(::std::tr1::make_tuple(m1, m2, m3, m4)); return this->current_spec(); } R Invoke(A1 a1, A2 a2, A3 a3, A4 a4) { // Even though gcc and MSVC don't enforce it, 'this->' is required // by the C++ standard [14.6.4] here, as the base class type is // dependent on the template argument (and thus shouldn't be // looked into when resolving InvokeWith). return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4)); } }; template class FunctionMocker : public internal::FunctionMockerBase { public: typedef R F(A1, A2, A3, A4, A5); typedef typename internal::Function::ArgumentTuple ArgumentTuple; MockSpec& With(const Matcher& m1, const Matcher& m2, const Matcher& m3, const Matcher& m4, const Matcher& m5) { this->current_spec().SetMatchers(::std::tr1::make_tuple(m1, m2, m3, m4, m5)); return this->current_spec(); } R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) { // Even though gcc and MSVC don't enforce it, 'this->' is required // by the C++ standard [14.6.4] here, as the base class type is // dependent on the template argument (and thus shouldn't be // looked into when resolving InvokeWith). return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5)); } }; template class FunctionMocker : public internal::FunctionMockerBase { public: typedef R F(A1, A2, A3, A4, A5, A6); typedef typename internal::Function::ArgumentTuple ArgumentTuple; MockSpec& With(const Matcher& m1, const Matcher& m2, const Matcher& m3, const Matcher& m4, const Matcher& m5, const Matcher& m6) { this->current_spec().SetMatchers(::std::tr1::make_tuple(m1, m2, m3, m4, m5, m6)); return this->current_spec(); } R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) { // Even though gcc and MSVC don't enforce it, 'this->' is required // by the C++ standard [14.6.4] here, as the base class type is // dependent on the template argument (and thus shouldn't be // looked into when resolving InvokeWith). return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5, a6)); } }; template class FunctionMocker : public internal::FunctionMockerBase { public: typedef R F(A1, A2, A3, A4, A5, A6, A7); typedef typename internal::Function::ArgumentTuple ArgumentTuple; MockSpec& With(const Matcher& m1, const Matcher& m2, const Matcher& m3, const Matcher& m4, const Matcher& m5, const Matcher& m6, const Matcher& m7) { this->current_spec().SetMatchers(::std::tr1::make_tuple(m1, m2, m3, m4, m5, m6, m7)); return this->current_spec(); } R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) { // Even though gcc and MSVC don't enforce it, 'this->' is required // by the C++ standard [14.6.4] here, as the base class type is // dependent on the template argument (and thus shouldn't be // looked into when resolving InvokeWith). return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5, a6, a7)); } }; template class FunctionMocker : public internal::FunctionMockerBase { public: typedef R F(A1, A2, A3, A4, A5, A6, A7, A8); typedef typename internal::Function::ArgumentTuple ArgumentTuple; MockSpec& With(const Matcher& m1, const Matcher& m2, const Matcher& m3, const Matcher& m4, const Matcher& m5, const Matcher& m6, const Matcher& m7, const Matcher& m8) { this->current_spec().SetMatchers(::std::tr1::make_tuple(m1, m2, m3, m4, m5, m6, m7, m8)); return this->current_spec(); } R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) { // Even though gcc and MSVC don't enforce it, 'this->' is required // by the C++ standard [14.6.4] here, as the base class type is // dependent on the template argument (and thus shouldn't be // looked into when resolving InvokeWith). return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5, a6, a7, a8)); } }; template class FunctionMocker : public internal::FunctionMockerBase { public: typedef R F(A1, A2, A3, A4, A5, A6, A7, A8, A9); typedef typename internal::Function::ArgumentTuple ArgumentTuple; MockSpec& With(const Matcher& m1, const Matcher& m2, const Matcher& m3, const Matcher& m4, const Matcher& m5, const Matcher& m6, const Matcher& m7, const Matcher& m8, const Matcher& m9) { this->current_spec().SetMatchers(::std::tr1::make_tuple(m1, m2, m3, m4, m5, m6, m7, m8, m9)); return this->current_spec(); } R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) { // Even though gcc and MSVC don't enforce it, 'this->' is required // by the C++ standard [14.6.4] here, as the base class type is // dependent on the template argument (and thus shouldn't be // looked into when resolving InvokeWith). return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5, a6, a7, a8, a9)); } }; template class FunctionMocker : public internal::FunctionMockerBase { public: typedef R F(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10); typedef typename internal::Function::ArgumentTuple ArgumentTuple; MockSpec& With(const Matcher& m1, const Matcher& m2, const Matcher& m3, const Matcher& m4, const Matcher& m5, const Matcher& m6, const Matcher& m7, const Matcher& m8, const Matcher& m9, const Matcher& m10) { this->current_spec().SetMatchers(::std::tr1::make_tuple(m1, m2, m3, m4, m5, m6, m7, m8, m9, m10)); return this->current_spec(); } R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10) { // Even though gcc and MSVC don't enforce it, 'this->' is required // by the C++ standard [14.6.4] here, as the base class type is // dependent on the template argument (and thus shouldn't be // looked into when resolving InvokeWith). return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)); } }; } // namespace internal // The style guide prohibits "using" statements in a namespace scope // inside a header file. However, the FunctionMocker class template // is meant to be defined in the ::testing namespace. The following // line is just a trick for working around a bug in MSVC 8.0, which // cannot handle it if we define FunctionMocker in ::testing. using internal::FunctionMocker; // The result type of function type F. // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! #define GMOCK_RESULT_(tn, F) tn ::testing::internal::Function::Result // The type of argument N of function type F. // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! #define GMOCK_ARG_(tn, F, N) tn ::testing::internal::Function::Argument##N // The matcher type for argument N of function type F. // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! #define GMOCK_MATCHER_(tn, F, N) const ::testing::Matcher& // The variable for mocking the given method. // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! #define GMOCK_MOCKER_(arity, constness, Method) \ GMOCK_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__) // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! #define GMOCK_METHOD0_(tn, constness, ct, Method, F) \ GMOCK_RESULT_(tn, F) ct Method() constness { \ GMOCK_COMPILE_ASSERT_(::std::tr1::tuple_size< \ tn ::testing::internal::Function::ArgumentTuple>::value == 0, \ this_method_does_not_take_0_arguments); \ GMOCK_MOCKER_(0, constness, Method).SetOwnerAndName(this, #Method); \ return GMOCK_MOCKER_(0, constness, Method).Invoke(); \ } \ ::testing::MockSpec& \ gmock_##Method() constness { \ return GMOCK_MOCKER_(0, constness, Method).RegisterOwner(this).With(); \ } \ mutable ::testing::FunctionMocker GMOCK_MOCKER_(0, constness, Method) // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! #define GMOCK_METHOD1_(tn, constness, ct, Method, F) \ GMOCK_RESULT_(tn, F) ct Method(GMOCK_ARG_(tn, F, 1) gmock_a1) constness { \ GMOCK_COMPILE_ASSERT_(::std::tr1::tuple_size< \ tn ::testing::internal::Function::ArgumentTuple>::value == 1, \ this_method_does_not_take_1_argument); \ GMOCK_MOCKER_(1, constness, Method).SetOwnerAndName(this, #Method); \ return GMOCK_MOCKER_(1, constness, Method).Invoke(gmock_a1); \ } \ ::testing::MockSpec& \ gmock_##Method(GMOCK_MATCHER_(tn, F, 1) gmock_a1) constness { \ return GMOCK_MOCKER_(1, constness, \ Method).RegisterOwner(this).With(gmock_a1); \ } \ mutable ::testing::FunctionMocker GMOCK_MOCKER_(1, constness, Method) // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! #define GMOCK_METHOD2_(tn, constness, ct, Method, F) \ GMOCK_RESULT_(tn, F) ct Method(GMOCK_ARG_(tn, F, 1) gmock_a1, \ GMOCK_ARG_(tn, F, 2) gmock_a2) constness { \ GMOCK_COMPILE_ASSERT_(::std::tr1::tuple_size< \ tn ::testing::internal::Function::ArgumentTuple>::value == 2, \ this_method_does_not_take_2_arguments); \ GMOCK_MOCKER_(2, constness, Method).SetOwnerAndName(this, #Method); \ return GMOCK_MOCKER_(2, constness, Method).Invoke(gmock_a1, gmock_a2); \ } \ ::testing::MockSpec& \ gmock_##Method(GMOCK_MATCHER_(tn, F, 1) gmock_a1, \ GMOCK_MATCHER_(tn, F, 2) gmock_a2) constness { \ return GMOCK_MOCKER_(2, constness, \ Method).RegisterOwner(this).With(gmock_a1, gmock_a2); \ } \ mutable ::testing::FunctionMocker GMOCK_MOCKER_(2, constness, Method) // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! #define GMOCK_METHOD3_(tn, constness, ct, Method, F) \ GMOCK_RESULT_(tn, F) ct Method(GMOCK_ARG_(tn, F, 1) gmock_a1, \ GMOCK_ARG_(tn, F, 2) gmock_a2, \ GMOCK_ARG_(tn, F, 3) gmock_a3) constness { \ GMOCK_COMPILE_ASSERT_(::std::tr1::tuple_size< \ tn ::testing::internal::Function::ArgumentTuple>::value == 3, \ this_method_does_not_take_3_arguments); \ GMOCK_MOCKER_(3, constness, Method).SetOwnerAndName(this, #Method); \ return GMOCK_MOCKER_(3, constness, Method).Invoke(gmock_a1, gmock_a2, \ gmock_a3); \ } \ ::testing::MockSpec& \ gmock_##Method(GMOCK_MATCHER_(tn, F, 1) gmock_a1, \ GMOCK_MATCHER_(tn, F, 2) gmock_a2, \ GMOCK_MATCHER_(tn, F, 3) gmock_a3) constness { \ return GMOCK_MOCKER_(3, constness, \ Method).RegisterOwner(this).With(gmock_a1, gmock_a2, gmock_a3); \ } \ mutable ::testing::FunctionMocker GMOCK_MOCKER_(3, constness, Method) // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! #define GMOCK_METHOD4_(tn, constness, ct, Method, F) \ GMOCK_RESULT_(tn, F) ct Method(GMOCK_ARG_(tn, F, 1) gmock_a1, \ GMOCK_ARG_(tn, F, 2) gmock_a2, \ GMOCK_ARG_(tn, F, 3) gmock_a3, \ GMOCK_ARG_(tn, F, 4) gmock_a4) constness { \ GMOCK_COMPILE_ASSERT_(::std::tr1::tuple_size< \ tn ::testing::internal::Function::ArgumentTuple>::value == 4, \ this_method_does_not_take_4_arguments); \ GMOCK_MOCKER_(4, constness, Method).SetOwnerAndName(this, #Method); \ return GMOCK_MOCKER_(4, constness, Method).Invoke(gmock_a1, gmock_a2, \ gmock_a3, gmock_a4); \ } \ ::testing::MockSpec& \ gmock_##Method(GMOCK_MATCHER_(tn, F, 1) gmock_a1, \ GMOCK_MATCHER_(tn, F, 2) gmock_a2, \ GMOCK_MATCHER_(tn, F, 3) gmock_a3, \ GMOCK_MATCHER_(tn, F, 4) gmock_a4) constness { \ return GMOCK_MOCKER_(4, constness, \ Method).RegisterOwner(this).With(gmock_a1, gmock_a2, gmock_a3, \ gmock_a4); \ } \ mutable ::testing::FunctionMocker GMOCK_MOCKER_(4, constness, Method) // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! #define GMOCK_METHOD5_(tn, constness, ct, Method, F) \ GMOCK_RESULT_(tn, F) ct Method(GMOCK_ARG_(tn, F, 1) gmock_a1, \ GMOCK_ARG_(tn, F, 2) gmock_a2, \ GMOCK_ARG_(tn, F, 3) gmock_a3, \ GMOCK_ARG_(tn, F, 4) gmock_a4, \ GMOCK_ARG_(tn, F, 5) gmock_a5) constness { \ GMOCK_COMPILE_ASSERT_(::std::tr1::tuple_size< \ tn ::testing::internal::Function::ArgumentTuple>::value == 5, \ this_method_does_not_take_5_arguments); \ GMOCK_MOCKER_(5, constness, Method).SetOwnerAndName(this, #Method); \ return GMOCK_MOCKER_(5, constness, Method).Invoke(gmock_a1, gmock_a2, \ gmock_a3, gmock_a4, gmock_a5); \ } \ ::testing::MockSpec& \ gmock_##Method(GMOCK_MATCHER_(tn, F, 1) gmock_a1, \ GMOCK_MATCHER_(tn, F, 2) gmock_a2, \ GMOCK_MATCHER_(tn, F, 3) gmock_a3, \ GMOCK_MATCHER_(tn, F, 4) gmock_a4, \ GMOCK_MATCHER_(tn, F, 5) gmock_a5) constness { \ return GMOCK_MOCKER_(5, constness, \ Method).RegisterOwner(this).With(gmock_a1, gmock_a2, gmock_a3, \ gmock_a4, gmock_a5); \ } \ mutable ::testing::FunctionMocker GMOCK_MOCKER_(5, constness, Method) // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! #define GMOCK_METHOD6_(tn, constness, ct, Method, F) \ GMOCK_RESULT_(tn, F) ct Method(GMOCK_ARG_(tn, F, 1) gmock_a1, \ GMOCK_ARG_(tn, F, 2) gmock_a2, \ GMOCK_ARG_(tn, F, 3) gmock_a3, \ GMOCK_ARG_(tn, F, 4) gmock_a4, \ GMOCK_ARG_(tn, F, 5) gmock_a5, \ GMOCK_ARG_(tn, F, 6) gmock_a6) constness { \ GMOCK_COMPILE_ASSERT_(::std::tr1::tuple_size< \ tn ::testing::internal::Function::ArgumentTuple>::value == 6, \ this_method_does_not_take_6_arguments); \ GMOCK_MOCKER_(6, constness, Method).SetOwnerAndName(this, #Method); \ return GMOCK_MOCKER_(6, constness, Method).Invoke(gmock_a1, gmock_a2, \ gmock_a3, gmock_a4, gmock_a5, gmock_a6); \ } \ ::testing::MockSpec& \ gmock_##Method(GMOCK_MATCHER_(tn, F, 1) gmock_a1, \ GMOCK_MATCHER_(tn, F, 2) gmock_a2, \ GMOCK_MATCHER_(tn, F, 3) gmock_a3, \ GMOCK_MATCHER_(tn, F, 4) gmock_a4, \ GMOCK_MATCHER_(tn, F, 5) gmock_a5, \ GMOCK_MATCHER_(tn, F, 6) gmock_a6) constness { \ return GMOCK_MOCKER_(6, constness, \ Method).RegisterOwner(this).With(gmock_a1, gmock_a2, gmock_a3, \ gmock_a4, gmock_a5, gmock_a6); \ } \ mutable ::testing::FunctionMocker GMOCK_MOCKER_(6, constness, Method) // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! #define GMOCK_METHOD7_(tn, constness, ct, Method, F) \ GMOCK_RESULT_(tn, F) ct Method(GMOCK_ARG_(tn, F, 1) gmock_a1, \ GMOCK_ARG_(tn, F, 2) gmock_a2, \ GMOCK_ARG_(tn, F, 3) gmock_a3, \ GMOCK_ARG_(tn, F, 4) gmock_a4, \ GMOCK_ARG_(tn, F, 5) gmock_a5, \ GMOCK_ARG_(tn, F, 6) gmock_a6, \ GMOCK_ARG_(tn, F, 7) gmock_a7) constness { \ GMOCK_COMPILE_ASSERT_(::std::tr1::tuple_size< \ tn ::testing::internal::Function::ArgumentTuple>::value == 7, \ this_method_does_not_take_7_arguments); \ GMOCK_MOCKER_(7, constness, Method).SetOwnerAndName(this, #Method); \ return GMOCK_MOCKER_(7, constness, Method).Invoke(gmock_a1, gmock_a2, \ gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7); \ } \ ::testing::MockSpec& \ gmock_##Method(GMOCK_MATCHER_(tn, F, 1) gmock_a1, \ GMOCK_MATCHER_(tn, F, 2) gmock_a2, \ GMOCK_MATCHER_(tn, F, 3) gmock_a3, \ GMOCK_MATCHER_(tn, F, 4) gmock_a4, \ GMOCK_MATCHER_(tn, F, 5) gmock_a5, \ GMOCK_MATCHER_(tn, F, 6) gmock_a6, \ GMOCK_MATCHER_(tn, F, 7) gmock_a7) constness { \ return GMOCK_MOCKER_(7, constness, \ Method).RegisterOwner(this).With(gmock_a1, gmock_a2, gmock_a3, \ gmock_a4, gmock_a5, gmock_a6, gmock_a7); \ } \ mutable ::testing::FunctionMocker GMOCK_MOCKER_(7, constness, Method) // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! #define GMOCK_METHOD8_(tn, constness, ct, Method, F) \ GMOCK_RESULT_(tn, F) ct Method(GMOCK_ARG_(tn, F, 1) gmock_a1, \ GMOCK_ARG_(tn, F, 2) gmock_a2, \ GMOCK_ARG_(tn, F, 3) gmock_a3, \ GMOCK_ARG_(tn, F, 4) gmock_a4, \ GMOCK_ARG_(tn, F, 5) gmock_a5, \ GMOCK_ARG_(tn, F, 6) gmock_a6, \ GMOCK_ARG_(tn, F, 7) gmock_a7, \ GMOCK_ARG_(tn, F, 8) gmock_a8) constness { \ GMOCK_COMPILE_ASSERT_(::std::tr1::tuple_size< \ tn ::testing::internal::Function::ArgumentTuple>::value == 8, \ this_method_does_not_take_8_arguments); \ GMOCK_MOCKER_(8, constness, Method).SetOwnerAndName(this, #Method); \ return GMOCK_MOCKER_(8, constness, Method).Invoke(gmock_a1, gmock_a2, \ gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8); \ } \ ::testing::MockSpec& \ gmock_##Method(GMOCK_MATCHER_(tn, F, 1) gmock_a1, \ GMOCK_MATCHER_(tn, F, 2) gmock_a2, \ GMOCK_MATCHER_(tn, F, 3) gmock_a3, \ GMOCK_MATCHER_(tn, F, 4) gmock_a4, \ GMOCK_MATCHER_(tn, F, 5) gmock_a5, \ GMOCK_MATCHER_(tn, F, 6) gmock_a6, \ GMOCK_MATCHER_(tn, F, 7) gmock_a7, \ GMOCK_MATCHER_(tn, F, 8) gmock_a8) constness { \ return GMOCK_MOCKER_(8, constness, \ Method).RegisterOwner(this).With(gmock_a1, gmock_a2, gmock_a3, \ gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8); \ } \ mutable ::testing::FunctionMocker GMOCK_MOCKER_(8, constness, Method) // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! #define GMOCK_METHOD9_(tn, constness, ct, Method, F) \ GMOCK_RESULT_(tn, F) ct Method(GMOCK_ARG_(tn, F, 1) gmock_a1, \ GMOCK_ARG_(tn, F, 2) gmock_a2, \ GMOCK_ARG_(tn, F, 3) gmock_a3, \ GMOCK_ARG_(tn, F, 4) gmock_a4, \ GMOCK_ARG_(tn, F, 5) gmock_a5, \ GMOCK_ARG_(tn, F, 6) gmock_a6, \ GMOCK_ARG_(tn, F, 7) gmock_a7, \ GMOCK_ARG_(tn, F, 8) gmock_a8, \ GMOCK_ARG_(tn, F, 9) gmock_a9) constness { \ GMOCK_COMPILE_ASSERT_(::std::tr1::tuple_size< \ tn ::testing::internal::Function::ArgumentTuple>::value == 9, \ this_method_does_not_take_9_arguments); \ GMOCK_MOCKER_(9, constness, Method).SetOwnerAndName(this, #Method); \ return GMOCK_MOCKER_(9, constness, Method).Invoke(gmock_a1, gmock_a2, \ gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8, \ gmock_a9); \ } \ ::testing::MockSpec& \ gmock_##Method(GMOCK_MATCHER_(tn, F, 1) gmock_a1, \ GMOCK_MATCHER_(tn, F, 2) gmock_a2, \ GMOCK_MATCHER_(tn, F, 3) gmock_a3, \ GMOCK_MATCHER_(tn, F, 4) gmock_a4, \ GMOCK_MATCHER_(tn, F, 5) gmock_a5, \ GMOCK_MATCHER_(tn, F, 6) gmock_a6, \ GMOCK_MATCHER_(tn, F, 7) gmock_a7, \ GMOCK_MATCHER_(tn, F, 8) gmock_a8, \ GMOCK_MATCHER_(tn, F, 9) gmock_a9) constness { \ return GMOCK_MOCKER_(9, constness, \ Method).RegisterOwner(this).With(gmock_a1, gmock_a2, gmock_a3, \ gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8, gmock_a9); \ } \ mutable ::testing::FunctionMocker GMOCK_MOCKER_(9, constness, Method) // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! #define GMOCK_METHOD10_(tn, constness, ct, Method, F) \ GMOCK_RESULT_(tn, F) ct Method(GMOCK_ARG_(tn, F, 1) gmock_a1, \ GMOCK_ARG_(tn, F, 2) gmock_a2, \ GMOCK_ARG_(tn, F, 3) gmock_a3, \ GMOCK_ARG_(tn, F, 4) gmock_a4, \ GMOCK_ARG_(tn, F, 5) gmock_a5, \ GMOCK_ARG_(tn, F, 6) gmock_a6, \ GMOCK_ARG_(tn, F, 7) gmock_a7, \ GMOCK_ARG_(tn, F, 8) gmock_a8, \ GMOCK_ARG_(tn, F, 9) gmock_a9, \ GMOCK_ARG_(tn, F, 10) gmock_a10) constness { \ GMOCK_COMPILE_ASSERT_(::std::tr1::tuple_size< \ tn ::testing::internal::Function::ArgumentTuple>::value == 10, \ this_method_does_not_take_10_arguments); \ GMOCK_MOCKER_(10, constness, Method).SetOwnerAndName(this, #Method); \ return GMOCK_MOCKER_(10, constness, Method).Invoke(gmock_a1, gmock_a2, \ gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8, gmock_a9, \ gmock_a10); \ } \ ::testing::MockSpec& \ gmock_##Method(GMOCK_MATCHER_(tn, F, 1) gmock_a1, \ GMOCK_MATCHER_(tn, F, 2) gmock_a2, \ GMOCK_MATCHER_(tn, F, 3) gmock_a3, \ GMOCK_MATCHER_(tn, F, 4) gmock_a4, \ GMOCK_MATCHER_(tn, F, 5) gmock_a5, \ GMOCK_MATCHER_(tn, F, 6) gmock_a6, \ GMOCK_MATCHER_(tn, F, 7) gmock_a7, \ GMOCK_MATCHER_(tn, F, 8) gmock_a8, \ GMOCK_MATCHER_(tn, F, 9) gmock_a9, \ GMOCK_MATCHER_(tn, F, 10) gmock_a10) constness { \ return GMOCK_MOCKER_(10, constness, \ Method).RegisterOwner(this).With(gmock_a1, gmock_a2, gmock_a3, \ gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8, gmock_a9, \ gmock_a10); \ } \ mutable ::testing::FunctionMocker GMOCK_MOCKER_(10, constness, Method) #define MOCK_METHOD0(m, F) GMOCK_METHOD0_(, , , m, F) #define MOCK_METHOD1(m, F) GMOCK_METHOD1_(, , , m, F) #define MOCK_METHOD2(m, F) GMOCK_METHOD2_(, , , m, F) #define MOCK_METHOD3(m, F) GMOCK_METHOD3_(, , , m, F) #define MOCK_METHOD4(m, F) GMOCK_METHOD4_(, , , m, F) #define MOCK_METHOD5(m, F) GMOCK_METHOD5_(, , , m, F) #define MOCK_METHOD6(m, F) GMOCK_METHOD6_(, , , m, F) #define MOCK_METHOD7(m, F) GMOCK_METHOD7_(, , , m, F) #define MOCK_METHOD8(m, F) GMOCK_METHOD8_(, , , m, F) #define MOCK_METHOD9(m, F) GMOCK_METHOD9_(, , , m, F) #define MOCK_METHOD10(m, F) GMOCK_METHOD10_(, , , m, F) #define MOCK_CONST_METHOD0(m, F) GMOCK_METHOD0_(, const, , m, F) #define MOCK_CONST_METHOD1(m, F) GMOCK_METHOD1_(, const, , m, F) #define MOCK_CONST_METHOD2(m, F) GMOCK_METHOD2_(, const, , m, F) #define MOCK_CONST_METHOD3(m, F) GMOCK_METHOD3_(, const, , m, F) #define MOCK_CONST_METHOD4(m, F) GMOCK_METHOD4_(, const, , m, F) #define MOCK_CONST_METHOD5(m, F) GMOCK_METHOD5_(, const, , m, F) #define MOCK_CONST_METHOD6(m, F) GMOCK_METHOD6_(, const, , m, F) #define MOCK_CONST_METHOD7(m, F) GMOCK_METHOD7_(, const, , m, F) #define MOCK_CONST_METHOD8(m, F) GMOCK_METHOD8_(, const, , m, F) #define MOCK_CONST_METHOD9(m, F) GMOCK_METHOD9_(, const, , m, F) #define MOCK_CONST_METHOD10(m, F) GMOCK_METHOD10_(, const, , m, F) #define MOCK_METHOD0_T(m, F) GMOCK_METHOD0_(typename, , , m, F) #define MOCK_METHOD1_T(m, F) GMOCK_METHOD1_(typename, , , m, F) #define MOCK_METHOD2_T(m, F) GMOCK_METHOD2_(typename, , , m, F) #define MOCK_METHOD3_T(m, F) GMOCK_METHOD3_(typename, , , m, F) #define MOCK_METHOD4_T(m, F) GMOCK_METHOD4_(typename, , , m, F) #define MOCK_METHOD5_T(m, F) GMOCK_METHOD5_(typename, , , m, F) #define MOCK_METHOD6_T(m, F) GMOCK_METHOD6_(typename, , , m, F) #define MOCK_METHOD7_T(m, F) GMOCK_METHOD7_(typename, , , m, F) #define MOCK_METHOD8_T(m, F) GMOCK_METHOD8_(typename, , , m, F) #define MOCK_METHOD9_T(m, F) GMOCK_METHOD9_(typename, , , m, F) #define MOCK_METHOD10_T(m, F) GMOCK_METHOD10_(typename, , , m, F) #define MOCK_CONST_METHOD0_T(m, F) GMOCK_METHOD0_(typename, const, , m, F) #define MOCK_CONST_METHOD1_T(m, F) GMOCK_METHOD1_(typename, const, , m, F) #define MOCK_CONST_METHOD2_T(m, F) GMOCK_METHOD2_(typename, const, , m, F) #define MOCK_CONST_METHOD3_T(m, F) GMOCK_METHOD3_(typename, const, , m, F) #define MOCK_CONST_METHOD4_T(m, F) GMOCK_METHOD4_(typename, const, , m, F) #define MOCK_CONST_METHOD5_T(m, F) GMOCK_METHOD5_(typename, const, , m, F) #define MOCK_CONST_METHOD6_T(m, F) GMOCK_METHOD6_(typename, const, , m, F) #define MOCK_CONST_METHOD7_T(m, F) GMOCK_METHOD7_(typename, const, , m, F) #define MOCK_CONST_METHOD8_T(m, F) GMOCK_METHOD8_(typename, const, , m, F) #define MOCK_CONST_METHOD9_T(m, F) GMOCK_METHOD9_(typename, const, , m, F) #define MOCK_CONST_METHOD10_T(m, F) GMOCK_METHOD10_(typename, const, , m, F) #define MOCK_METHOD0_WITH_CALLTYPE(ct, m, F) GMOCK_METHOD0_(, , ct, m, F) #define MOCK_METHOD1_WITH_CALLTYPE(ct, m, F) GMOCK_METHOD1_(, , ct, m, F) #define MOCK_METHOD2_WITH_CALLTYPE(ct, m, F) GMOCK_METHOD2_(, , ct, m, F) #define MOCK_METHOD3_WITH_CALLTYPE(ct, m, F) GMOCK_METHOD3_(, , ct, m, F) #define MOCK_METHOD4_WITH_CALLTYPE(ct, m, F) GMOCK_METHOD4_(, , ct, m, F) #define MOCK_METHOD5_WITH_CALLTYPE(ct, m, F) GMOCK_METHOD5_(, , ct, m, F) #define MOCK_METHOD6_WITH_CALLTYPE(ct, m, F) GMOCK_METHOD6_(, , ct, m, F) #define MOCK_METHOD7_WITH_CALLTYPE(ct, m, F) GMOCK_METHOD7_(, , ct, m, F) #define MOCK_METHOD8_WITH_CALLTYPE(ct, m, F) GMOCK_METHOD8_(, , ct, m, F) #define MOCK_METHOD9_WITH_CALLTYPE(ct, m, F) GMOCK_METHOD9_(, , ct, m, F) #define MOCK_METHOD10_WITH_CALLTYPE(ct, m, F) GMOCK_METHOD10_(, , ct, m, F) #define MOCK_CONST_METHOD0_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD0_(, const, ct, m, F) #define MOCK_CONST_METHOD1_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD1_(, const, ct, m, F) #define MOCK_CONST_METHOD2_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD2_(, const, ct, m, F) #define MOCK_CONST_METHOD3_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD3_(, const, ct, m, F) #define MOCK_CONST_METHOD4_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD4_(, const, ct, m, F) #define MOCK_CONST_METHOD5_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD5_(, const, ct, m, F) #define MOCK_CONST_METHOD6_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD6_(, const, ct, m, F) #define MOCK_CONST_METHOD7_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD7_(, const, ct, m, F) #define MOCK_CONST_METHOD8_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD8_(, const, ct, m, F) #define MOCK_CONST_METHOD9_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD9_(, const, ct, m, F) #define MOCK_CONST_METHOD10_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD10_(, const, ct, m, F) #define MOCK_METHOD0_T_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD0_(typename, , ct, m, F) #define MOCK_METHOD1_T_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD1_(typename, , ct, m, F) #define MOCK_METHOD2_T_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD2_(typename, , ct, m, F) #define MOCK_METHOD3_T_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD3_(typename, , ct, m, F) #define MOCK_METHOD4_T_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD4_(typename, , ct, m, F) #define MOCK_METHOD5_T_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD5_(typename, , ct, m, F) #define MOCK_METHOD6_T_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD6_(typename, , ct, m, F) #define MOCK_METHOD7_T_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD7_(typename, , ct, m, F) #define MOCK_METHOD8_T_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD8_(typename, , ct, m, F) #define MOCK_METHOD9_T_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD9_(typename, , ct, m, F) #define MOCK_METHOD10_T_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD10_(typename, , ct, m, F) #define MOCK_CONST_METHOD0_T_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD0_(typename, const, ct, m, F) #define MOCK_CONST_METHOD1_T_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD1_(typename, const, ct, m, F) #define MOCK_CONST_METHOD2_T_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD2_(typename, const, ct, m, F) #define MOCK_CONST_METHOD3_T_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD3_(typename, const, ct, m, F) #define MOCK_CONST_METHOD4_T_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD4_(typename, const, ct, m, F) #define MOCK_CONST_METHOD5_T_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD5_(typename, const, ct, m, F) #define MOCK_CONST_METHOD6_T_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD6_(typename, const, ct, m, F) #define MOCK_CONST_METHOD7_T_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD7_(typename, const, ct, m, F) #define MOCK_CONST_METHOD8_T_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD8_(typename, const, ct, m, F) #define MOCK_CONST_METHOD9_T_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD9_(typename, const, ct, m, F) #define MOCK_CONST_METHOD10_T_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD10_(typename, const, ct, m, F) // A MockFunction class has one mock method whose type is F. It is // useful when you just want your test code to emit some messages and // have Google Mock verify the right messages are sent (and perhaps at // the right times). For example, if you are exercising code: // // Foo(1); // Foo(2); // Foo(3); // // and want to verify that Foo(1) and Foo(3) both invoke // mock.Bar("a"), but Foo(2) doesn't invoke anything, you can write: // // TEST(FooTest, InvokesBarCorrectly) { // MyMock mock; // MockFunction check; // { // InSequence s; // // EXPECT_CALL(mock, Bar("a")); // EXPECT_CALL(check, Call("1")); // EXPECT_CALL(check, Call("2")); // EXPECT_CALL(mock, Bar("a")); // } // Foo(1); // check.Call("1"); // Foo(2); // check.Call("2"); // Foo(3); // } // // The expectation spec says that the first Bar("a") must happen // before check point "1", the second Bar("a") must happen after check // point "2", and nothing should happen between the two check // points. The explicit check points make it easy to tell which // Bar("a") is called by which call to Foo(). template class MockFunction; template class MockFunction { public: MockFunction() {} MOCK_METHOD0_T(Call, R()); private: GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); }; template class MockFunction { public: MockFunction() {} MOCK_METHOD1_T(Call, R(A0)); private: GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); }; template class MockFunction { public: MockFunction() {} MOCK_METHOD2_T(Call, R(A0, A1)); private: GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); }; template class MockFunction { public: MockFunction() {} MOCK_METHOD3_T(Call, R(A0, A1, A2)); private: GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); }; template class MockFunction { public: MockFunction() {} MOCK_METHOD4_T(Call, R(A0, A1, A2, A3)); private: GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); }; template class MockFunction { public: MockFunction() {} MOCK_METHOD5_T(Call, R(A0, A1, A2, A3, A4)); private: GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); }; template class MockFunction { public: MockFunction() {} MOCK_METHOD6_T(Call, R(A0, A1, A2, A3, A4, A5)); private: GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); }; template class MockFunction { public: MockFunction() {} MOCK_METHOD7_T(Call, R(A0, A1, A2, A3, A4, A5, A6)); private: GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); }; template class MockFunction { public: MockFunction() {} MOCK_METHOD8_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7)); private: GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); }; template class MockFunction { public: MockFunction() {} MOCK_METHOD9_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7, A8)); private: GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); }; template class MockFunction { public: MockFunction() {} MOCK_METHOD10_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9)); private: GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); }; } // namespace testing #endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ gmock-generated-function-mockers.h.pump000066400000000000000000000176421260417502300343660ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/include/gmock$$ -*- mode: c++; -*- $$ This is a Pump source file. Please use Pump to convert it to $$ gmock-generated-function-mockers.h. $$ $var n = 10 $$ The maximum arity we support. // Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Google Mock - a framework for writing C++ mock classes. // // This file implements function mockers of various arities. #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ #include #include namespace testing { namespace internal { template class FunctionMockerBase; // Note: class FunctionMocker really belongs to the ::testing // namespace. However if we define it in ::testing, MSVC will // complain when classes in ::testing::internal declare it as a // friend class template. To workaround this compiler bug, we define // FunctionMocker in ::testing::internal and import it into ::testing. template class FunctionMocker; $range i 0..n $for i [[ $range j 1..i $var typename_As = [[$for j [[, typename A$j]]]] $var As = [[$for j, [[A$j]]]] $var as = [[$for j, [[a$j]]]] $var Aas = [[$for j, [[A$j a$j]]]] $var ms = [[$for j, [[m$j]]]] $var matchers = [[$for j, [[const Matcher& m$j]]]] template class FunctionMocker : public internal::FunctionMockerBase { public: typedef R F($As); typedef typename internal::Function::ArgumentTuple ArgumentTuple; MockSpec& With($matchers) { $if i >= 1 [[ this->current_spec().SetMatchers(::std::tr1::make_tuple($ms)); ]] return this->current_spec(); } R Invoke($Aas) { // Even though gcc and MSVC don't enforce it, 'this->' is required // by the C++ standard [14.6.4] here, as the base class type is // dependent on the template argument (and thus shouldn't be // looked into when resolving InvokeWith). return this->InvokeWith(ArgumentTuple($as)); } }; ]] } // namespace internal // The style guide prohibits "using" statements in a namespace scope // inside a header file. However, the FunctionMocker class template // is meant to be defined in the ::testing namespace. The following // line is just a trick for working around a bug in MSVC 8.0, which // cannot handle it if we define FunctionMocker in ::testing. using internal::FunctionMocker; // The result type of function type F. // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! #define GMOCK_RESULT_(tn, F) tn ::testing::internal::Function::Result // The type of argument N of function type F. // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! #define GMOCK_ARG_(tn, F, N) tn ::testing::internal::Function::Argument##N // The matcher type for argument N of function type F. // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! #define GMOCK_MATCHER_(tn, F, N) const ::testing::Matcher& // The variable for mocking the given method. // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! #define GMOCK_MOCKER_(arity, constness, Method) \ GMOCK_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__) $for i [[ $range j 1..i $var arg_as = [[$for j, \ [[GMOCK_ARG_(tn, F, $j) gmock_a$j]]]] $var as = [[$for j, [[gmock_a$j]]]] $var matcher_as = [[$for j, \ [[GMOCK_MATCHER_(tn, F, $j) gmock_a$j]]]] // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! #define GMOCK_METHOD$i[[]]_(tn, constness, ct, Method, F) \ GMOCK_RESULT_(tn, F) ct Method($arg_as) constness { \ GMOCK_COMPILE_ASSERT_(::std::tr1::tuple_size< \ tn ::testing::internal::Function::ArgumentTuple>::value == $i, \ this_method_does_not_take_$i[[]]_argument[[$if i != 1 [[s]]]]); \ GMOCK_MOCKER_($i, constness, Method).SetOwnerAndName(this, #Method); \ return GMOCK_MOCKER_($i, constness, Method).Invoke($as); \ } \ ::testing::MockSpec& \ gmock_##Method($matcher_as) constness { \ return GMOCK_MOCKER_($i, constness, Method).RegisterOwner(this).With($as); \ } \ mutable ::testing::FunctionMocker GMOCK_MOCKER_($i, constness, Method) ]] $for i [[ #define MOCK_METHOD$i(m, F) GMOCK_METHOD$i[[]]_(, , , m, F) ]] $for i [[ #define MOCK_CONST_METHOD$i(m, F) GMOCK_METHOD$i[[]]_(, const, , m, F) ]] $for i [[ #define MOCK_METHOD$i[[]]_T(m, F) GMOCK_METHOD$i[[]]_(typename, , , m, F) ]] $for i [[ #define MOCK_CONST_METHOD$i[[]]_T(m, F) [[]] GMOCK_METHOD$i[[]]_(typename, const, , m, F) ]] $for i [[ #define MOCK_METHOD$i[[]]_WITH_CALLTYPE(ct, m, F) [[]] GMOCK_METHOD$i[[]]_(, , ct, m, F) ]] $for i [[ #define MOCK_CONST_METHOD$i[[]]_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD$i[[]]_(, const, ct, m, F) ]] $for i [[ #define MOCK_METHOD$i[[]]_T_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD$i[[]]_(typename, , ct, m, F) ]] $for i [[ #define MOCK_CONST_METHOD$i[[]]_T_WITH_CALLTYPE(ct, m, F) \ GMOCK_METHOD$i[[]]_(typename, const, ct, m, F) ]] // A MockFunction class has one mock method whose type is F. It is // useful when you just want your test code to emit some messages and // have Google Mock verify the right messages are sent (and perhaps at // the right times). For example, if you are exercising code: // // Foo(1); // Foo(2); // Foo(3); // // and want to verify that Foo(1) and Foo(3) both invoke // mock.Bar("a"), but Foo(2) doesn't invoke anything, you can write: // // TEST(FooTest, InvokesBarCorrectly) { // MyMock mock; // MockFunction check; // { // InSequence s; // // EXPECT_CALL(mock, Bar("a")); // EXPECT_CALL(check, Call("1")); // EXPECT_CALL(check, Call("2")); // EXPECT_CALL(mock, Bar("a")); // } // Foo(1); // check.Call("1"); // Foo(2); // check.Call("2"); // Foo(3); // } // // The expectation spec says that the first Bar("a") must happen // before check point "1", the second Bar("a") must happen after check // point "2", and nothing should happen between the two check // points. The explicit check points make it easy to tell which // Bar("a") is called by which call to Foo(). template class MockFunction; $for i [[ $range j 0..i-1 template class MockFunction { public: MockFunction() {} MOCK_METHOD$i[[]]_T(Call, R($for j, [[A$j]])); private: GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); }; ]] } // namespace testing #endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/include/gmock/gmock-generated-matchers.h000066400000000000000000002160341260417502300320010ustar00rootroot00000000000000// This file was GENERATED by command: // pump.py gmock-generated-matchers.h.pump // DO NOT EDIT BY HAND!!! // Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Google Mock - a framework for writing C++ mock classes. // // This file implements some commonly used variadic matchers. #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ #include #include #include #include #include namespace testing { namespace internal { // The type of the i-th (0-based) field of Tuple. #define GMOCK_FIELD_TYPE_(Tuple, i) \ typename ::std::tr1::tuple_element::type // TupleFields is for selecting fields from a // tuple of type Tuple. It has two members: // // type: a tuple type whose i-th field is the ki-th field of Tuple. // GetSelectedFields(t): returns fields k0, ..., and kn of t as a tuple. // // For example, in class TupleFields, 2, 0>, we have: // // type is tuple, and // GetSelectedFields(make_tuple(true, 'a', 42)) is (42, true). template class TupleFields; // This generic version is used when there are 10 selectors. template class TupleFields { public: typedef ::std::tr1::tuple type; static type GetSelectedFields(const Tuple& t) { using ::std::tr1::get; return type(get(t), get(t), get(t), get(t), get(t), get(t), get(t), get(t), get(t), get(t)); } }; // The following specialization is used for 0 ~ 9 selectors. template class TupleFields { public: typedef ::std::tr1::tuple<> type; static type GetSelectedFields(const Tuple& /* t */) { using ::std::tr1::get; return type(); } }; template class TupleFields { public: typedef ::std::tr1::tuple type; static type GetSelectedFields(const Tuple& t) { using ::std::tr1::get; return type(get(t)); } }; template class TupleFields { public: typedef ::std::tr1::tuple type; static type GetSelectedFields(const Tuple& t) { using ::std::tr1::get; return type(get(t), get(t)); } }; template class TupleFields { public: typedef ::std::tr1::tuple type; static type GetSelectedFields(const Tuple& t) { using ::std::tr1::get; return type(get(t), get(t), get(t)); } }; template class TupleFields { public: typedef ::std::tr1::tuple type; static type GetSelectedFields(const Tuple& t) { using ::std::tr1::get; return type(get(t), get(t), get(t), get(t)); } }; template class TupleFields { public: typedef ::std::tr1::tuple type; static type GetSelectedFields(const Tuple& t) { using ::std::tr1::get; return type(get(t), get(t), get(t), get(t), get(t)); } }; template class TupleFields { public: typedef ::std::tr1::tuple type; static type GetSelectedFields(const Tuple& t) { using ::std::tr1::get; return type(get(t), get(t), get(t), get(t), get(t), get(t)); } }; template class TupleFields { public: typedef ::std::tr1::tuple type; static type GetSelectedFields(const Tuple& t) { using ::std::tr1::get; return type(get(t), get(t), get(t), get(t), get(t), get(t), get(t)); } }; template class TupleFields { public: typedef ::std::tr1::tuple type; static type GetSelectedFields(const Tuple& t) { using ::std::tr1::get; return type(get(t), get(t), get(t), get(t), get(t), get(t), get(t), get(t)); } }; template class TupleFields { public: typedef ::std::tr1::tuple type; static type GetSelectedFields(const Tuple& t) { using ::std::tr1::get; return type(get(t), get(t), get(t), get(t), get(t), get(t), get(t), get(t), get(t)); } }; #undef GMOCK_FIELD_TYPE_ // Implements the Args() matcher. template class ArgsMatcherImpl : public MatcherInterface { public: // ArgsTuple may have top-level const or reference modifiers. typedef GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(ArgsTuple)) RawArgsTuple; typedef typename internal::TupleFields::type SelectedArgs; typedef Matcher MonomorphicInnerMatcher; template explicit ArgsMatcherImpl(const InnerMatcher& inner_matcher) : inner_matcher_(SafeMatcherCast(inner_matcher)) {} virtual bool MatchAndExplain(ArgsTuple args, MatchResultListener* listener) const { const SelectedArgs& selected_args = GetSelectedArgs(args); if (!listener->IsInterested()) return inner_matcher_.Matches(selected_args); PrintIndices(listener->stream()); *listener << "are " << PrintToString(selected_args); StringMatchResultListener inner_listener; const bool match = inner_matcher_.MatchAndExplain(selected_args, &inner_listener); PrintIfNotEmpty(inner_listener.str(), listener->stream()); return match; } virtual void DescribeTo(::std::ostream* os) const { *os << "are a tuple "; PrintIndices(os); inner_matcher_.DescribeTo(os); } virtual void DescribeNegationTo(::std::ostream* os) const { *os << "are a tuple "; PrintIndices(os); inner_matcher_.DescribeNegationTo(os); } private: static SelectedArgs GetSelectedArgs(ArgsTuple args) { return TupleFields::GetSelectedFields(args); } // Prints the indices of the selected fields. static void PrintIndices(::std::ostream* os) { *os << "whose fields ("; const int indices[10] = { k0, k1, k2, k3, k4, k5, k6, k7, k8, k9 }; for (int i = 0; i < 10; i++) { if (indices[i] < 0) break; if (i >= 1) *os << ", "; *os << "#" << indices[i]; } *os << ") "; } const MonomorphicInnerMatcher inner_matcher_; GTEST_DISALLOW_ASSIGN_(ArgsMatcherImpl); }; template class ArgsMatcher { public: explicit ArgsMatcher(const InnerMatcher& inner_matcher) : inner_matcher_(inner_matcher) {} template operator Matcher() const { return MakeMatcher(new ArgsMatcherImpl(inner_matcher_)); } private: const InnerMatcher inner_matcher_; GTEST_DISALLOW_ASSIGN_(ArgsMatcher); }; // Implements ElementsAre() of 1-10 arguments. template class ElementsAreMatcher1 { public: explicit ElementsAreMatcher1(const T1& e1) : e1_(e1) {} template operator Matcher() const { typedef GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(Container)) RawContainer; typedef typename internal::StlContainerView::type::value_type Element; // Nokia's Symbian Compiler has a nasty bug where the object put // in a one-element local array is not destructed when the array // goes out of scope. This leads to obvious badness as we've // added the linked_ptr in it to our other linked_ptrs list. // Hence we implement ElementsAreMatcher1 specially to avoid using // a local array. const Matcher matcher = MatcherCast(e1_); return MakeMatcher(new ElementsAreMatcherImpl(&matcher, 1)); } private: const T1& e1_; GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher1); }; template class ElementsAreMatcher2 { public: ElementsAreMatcher2(const T1& e1, const T2& e2) : e1_(e1), e2_(e2) {} template operator Matcher() const { typedef GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(Container)) RawContainer; typedef typename internal::StlContainerView::type::value_type Element; const Matcher matchers[] = { MatcherCast(e1_), MatcherCast(e2_), }; return MakeMatcher(new ElementsAreMatcherImpl(matchers, 2)); } private: const T1& e1_; const T2& e2_; GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher2); }; template class ElementsAreMatcher3 { public: ElementsAreMatcher3(const T1& e1, const T2& e2, const T3& e3) : e1_(e1), e2_(e2), e3_(e3) {} template operator Matcher() const { typedef GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(Container)) RawContainer; typedef typename internal::StlContainerView::type::value_type Element; const Matcher matchers[] = { MatcherCast(e1_), MatcherCast(e2_), MatcherCast(e3_), }; return MakeMatcher(new ElementsAreMatcherImpl(matchers, 3)); } private: const T1& e1_; const T2& e2_; const T3& e3_; GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher3); }; template class ElementsAreMatcher4 { public: ElementsAreMatcher4(const T1& e1, const T2& e2, const T3& e3, const T4& e4) : e1_(e1), e2_(e2), e3_(e3), e4_(e4) {} template operator Matcher() const { typedef GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(Container)) RawContainer; typedef typename internal::StlContainerView::type::value_type Element; const Matcher matchers[] = { MatcherCast(e1_), MatcherCast(e2_), MatcherCast(e3_), MatcherCast(e4_), }; return MakeMatcher(new ElementsAreMatcherImpl(matchers, 4)); } private: const T1& e1_; const T2& e2_; const T3& e3_; const T4& e4_; GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher4); }; template class ElementsAreMatcher5 { public: ElementsAreMatcher5(const T1& e1, const T2& e2, const T3& e3, const T4& e4, const T5& e5) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), e5_(e5) {} template operator Matcher() const { typedef GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(Container)) RawContainer; typedef typename internal::StlContainerView::type::value_type Element; const Matcher matchers[] = { MatcherCast(e1_), MatcherCast(e2_), MatcherCast(e3_), MatcherCast(e4_), MatcherCast(e5_), }; return MakeMatcher(new ElementsAreMatcherImpl(matchers, 5)); } private: const T1& e1_; const T2& e2_; const T3& e3_; const T4& e4_; const T5& e5_; GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher5); }; template class ElementsAreMatcher6 { public: ElementsAreMatcher6(const T1& e1, const T2& e2, const T3& e3, const T4& e4, const T5& e5, const T6& e6) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), e5_(e5), e6_(e6) {} template operator Matcher() const { typedef GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(Container)) RawContainer; typedef typename internal::StlContainerView::type::value_type Element; const Matcher matchers[] = { MatcherCast(e1_), MatcherCast(e2_), MatcherCast(e3_), MatcherCast(e4_), MatcherCast(e5_), MatcherCast(e6_), }; return MakeMatcher(new ElementsAreMatcherImpl(matchers, 6)); } private: const T1& e1_; const T2& e2_; const T3& e3_; const T4& e4_; const T5& e5_; const T6& e6_; GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher6); }; template class ElementsAreMatcher7 { public: ElementsAreMatcher7(const T1& e1, const T2& e2, const T3& e3, const T4& e4, const T5& e5, const T6& e6, const T7& e7) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), e5_(e5), e6_(e6), e7_(e7) {} template operator Matcher() const { typedef GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(Container)) RawContainer; typedef typename internal::StlContainerView::type::value_type Element; const Matcher matchers[] = { MatcherCast(e1_), MatcherCast(e2_), MatcherCast(e3_), MatcherCast(e4_), MatcherCast(e5_), MatcherCast(e6_), MatcherCast(e7_), }; return MakeMatcher(new ElementsAreMatcherImpl(matchers, 7)); } private: const T1& e1_; const T2& e2_; const T3& e3_; const T4& e4_; const T5& e5_; const T6& e6_; const T7& e7_; GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher7); }; template class ElementsAreMatcher8 { public: ElementsAreMatcher8(const T1& e1, const T2& e2, const T3& e3, const T4& e4, const T5& e5, const T6& e6, const T7& e7, const T8& e8) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), e5_(e5), e6_(e6), e7_(e7), e8_(e8) {} template operator Matcher() const { typedef GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(Container)) RawContainer; typedef typename internal::StlContainerView::type::value_type Element; const Matcher matchers[] = { MatcherCast(e1_), MatcherCast(e2_), MatcherCast(e3_), MatcherCast(e4_), MatcherCast(e5_), MatcherCast(e6_), MatcherCast(e7_), MatcherCast(e8_), }; return MakeMatcher(new ElementsAreMatcherImpl(matchers, 8)); } private: const T1& e1_; const T2& e2_; const T3& e3_; const T4& e4_; const T5& e5_; const T6& e6_; const T7& e7_; const T8& e8_; GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher8); }; template class ElementsAreMatcher9 { public: ElementsAreMatcher9(const T1& e1, const T2& e2, const T3& e3, const T4& e4, const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), e5_(e5), e6_(e6), e7_(e7), e8_(e8), e9_(e9) {} template operator Matcher() const { typedef GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(Container)) RawContainer; typedef typename internal::StlContainerView::type::value_type Element; const Matcher matchers[] = { MatcherCast(e1_), MatcherCast(e2_), MatcherCast(e3_), MatcherCast(e4_), MatcherCast(e5_), MatcherCast(e6_), MatcherCast(e7_), MatcherCast(e8_), MatcherCast(e9_), }; return MakeMatcher(new ElementsAreMatcherImpl(matchers, 9)); } private: const T1& e1_; const T2& e2_; const T3& e3_; const T4& e4_; const T5& e5_; const T6& e6_; const T7& e7_; const T8& e8_; const T9& e9_; GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher9); }; template class ElementsAreMatcher10 { public: ElementsAreMatcher10(const T1& e1, const T2& e2, const T3& e3, const T4& e4, const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9, const T10& e10) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), e5_(e5), e6_(e6), e7_(e7), e8_(e8), e9_(e9), e10_(e10) {} template operator Matcher() const { typedef GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(Container)) RawContainer; typedef typename internal::StlContainerView::type::value_type Element; const Matcher matchers[] = { MatcherCast(e1_), MatcherCast(e2_), MatcherCast(e3_), MatcherCast(e4_), MatcherCast(e5_), MatcherCast(e6_), MatcherCast(e7_), MatcherCast(e8_), MatcherCast(e9_), MatcherCast(e10_), }; return MakeMatcher(new ElementsAreMatcherImpl(matchers, 10)); } private: const T1& e1_; const T2& e2_; const T3& e3_; const T4& e4_; const T5& e5_; const T6& e6_; const T7& e7_; const T8& e8_; const T9& e9_; const T10& e10_; GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher10); }; } // namespace internal // Args(a_matcher) matches a tuple if the selected // fields of it matches a_matcher. C++ doesn't support default // arguments for function templates, so we have to overload it. template inline internal::ArgsMatcher Args(const InnerMatcher& matcher) { return internal::ArgsMatcher(matcher); } template inline internal::ArgsMatcher Args(const InnerMatcher& matcher) { return internal::ArgsMatcher(matcher); } template inline internal::ArgsMatcher Args(const InnerMatcher& matcher) { return internal::ArgsMatcher(matcher); } template inline internal::ArgsMatcher Args(const InnerMatcher& matcher) { return internal::ArgsMatcher(matcher); } template inline internal::ArgsMatcher Args(const InnerMatcher& matcher) { return internal::ArgsMatcher(matcher); } template inline internal::ArgsMatcher Args(const InnerMatcher& matcher) { return internal::ArgsMatcher(matcher); } template inline internal::ArgsMatcher Args(const InnerMatcher& matcher) { return internal::ArgsMatcher(matcher); } template inline internal::ArgsMatcher Args(const InnerMatcher& matcher) { return internal::ArgsMatcher(matcher); } template inline internal::ArgsMatcher Args(const InnerMatcher& matcher) { return internal::ArgsMatcher(matcher); } template inline internal::ArgsMatcher Args(const InnerMatcher& matcher) { return internal::ArgsMatcher(matcher); } template inline internal::ArgsMatcher Args(const InnerMatcher& matcher) { return internal::ArgsMatcher(matcher); } // ElementsAre(e0, e1, ..., e_n) matches an STL-style container with // (n + 1) elements, where the i-th element in the container must // match the i-th argument in the list. Each argument of // ElementsAre() can be either a value or a matcher. We support up to // 10 arguments. // // NOTE: Since ElementsAre() cares about the order of the elements, it // must not be used with containers whose elements's order is // undefined (e.g. hash_map). inline internal::ElementsAreMatcher0 ElementsAre() { return internal::ElementsAreMatcher0(); } template inline internal::ElementsAreMatcher1 ElementsAre(const T1& e1) { return internal::ElementsAreMatcher1(e1); } template inline internal::ElementsAreMatcher2 ElementsAre(const T1& e1, const T2& e2) { return internal::ElementsAreMatcher2(e1, e2); } template inline internal::ElementsAreMatcher3 ElementsAre(const T1& e1, const T2& e2, const T3& e3) { return internal::ElementsAreMatcher3(e1, e2, e3); } template inline internal::ElementsAreMatcher4 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4) { return internal::ElementsAreMatcher4(e1, e2, e3, e4); } template inline internal::ElementsAreMatcher5 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, const T5& e5) { return internal::ElementsAreMatcher5(e1, e2, e3, e4, e5); } template inline internal::ElementsAreMatcher6 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, const T5& e5, const T6& e6) { return internal::ElementsAreMatcher6(e1, e2, e3, e4, e5, e6); } template inline internal::ElementsAreMatcher7 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, const T5& e5, const T6& e6, const T7& e7) { return internal::ElementsAreMatcher7(e1, e2, e3, e4, e5, e6, e7); } template inline internal::ElementsAreMatcher8 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, const T5& e5, const T6& e6, const T7& e7, const T8& e8) { return internal::ElementsAreMatcher8(e1, e2, e3, e4, e5, e6, e7, e8); } template inline internal::ElementsAreMatcher9 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9) { return internal::ElementsAreMatcher9(e1, e2, e3, e4, e5, e6, e7, e8, e9); } template inline internal::ElementsAreMatcher10 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9, const T10& e10) { return internal::ElementsAreMatcher10(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10); } // ElementsAreArray(array) and ElementAreArray(array, count) are like // ElementsAre(), except that they take an array of values or // matchers. The former form infers the size of 'array', which must // be a static C-style array. In the latter form, 'array' can either // be a static array or a pointer to a dynamically created array. template inline internal::ElementsAreArrayMatcher ElementsAreArray( const T* first, size_t count) { return internal::ElementsAreArrayMatcher(first, count); } template inline internal::ElementsAreArrayMatcher ElementsAreArray(const T (&array)[N]) { return internal::ElementsAreArrayMatcher(array, N); } } // namespace testing // The MATCHER* family of macros can be used in a namespace scope to // define custom matchers easily. // // Basic Usage // =========== // // The syntax // // MATCHER(name, description_string) { statements; } // // defines a matcher with the given name that executes the statements, // which must return a bool to indicate if the match succeeds. Inside // the statements, you can refer to the value being matched by 'arg', // and refer to its type by 'arg_type'. // // The description string documents what the matcher does, and is used // to generate the failure message when the match fails. Since a // MATCHER() is usually defined in a header file shared by multiple // C++ source files, we require the description to be a C-string // literal to avoid possible side effects. It can be empty, in which // case we'll use the sequence of words in the matcher name as the // description. // // For example: // // MATCHER(IsEven, "") { return (arg % 2) == 0; } // // allows you to write // // // Expects mock_foo.Bar(n) to be called where n is even. // EXPECT_CALL(mock_foo, Bar(IsEven())); // // or, // // // Verifies that the value of some_expression is even. // EXPECT_THAT(some_expression, IsEven()); // // If the above assertion fails, it will print something like: // // Value of: some_expression // Expected: is even // Actual: 7 // // where the description "is even" is automatically calculated from the // matcher name IsEven. // // Argument Type // ============= // // Note that the type of the value being matched (arg_type) is // determined by the context in which you use the matcher and is // supplied to you by the compiler, so you don't need to worry about // declaring it (nor can you). This allows the matcher to be // polymorphic. For example, IsEven() can be used to match any type // where the value of "(arg % 2) == 0" can be implicitly converted to // a bool. In the "Bar(IsEven())" example above, if method Bar() // takes an int, 'arg_type' will be int; if it takes an unsigned long, // 'arg_type' will be unsigned long; and so on. // // Parameterizing Matchers // ======================= // // Sometimes you'll want to parameterize the matcher. For that you // can use another macro: // // MATCHER_P(name, param_name, description_string) { statements; } // // For example: // // MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; } // // will allow you to write: // // EXPECT_THAT(Blah("a"), HasAbsoluteValue(n)); // // which may lead to this message (assuming n is 10): // // Value of: Blah("a") // Expected: has absolute value 10 // Actual: -9 // // Note that both the matcher description and its parameter are // printed, making the message human-friendly. // // In the matcher definition body, you can write 'foo_type' to // reference the type of a parameter named 'foo'. For example, in the // body of MATCHER_P(HasAbsoluteValue, value) above, you can write // 'value_type' to refer to the type of 'value'. // // We also provide MATCHER_P2, MATCHER_P3, ..., up to MATCHER_P10 to // support multi-parameter matchers. // // Describing Parameterized Matchers // ================================= // // When defining a parameterized matcher, you can use Python-style // interpolations in the description string to refer to the parameter // values. We support the following syntax currently: // // %% a single '%' character // %(*)s all parameters of the matcher printed as a tuple // %(foo)s value of the matcher parameter named 'foo' // // For example, // // MATCHER_P2(InClosedRange, low, hi, "is in range [%(low)s, %(hi)s]") { // return low <= arg && arg <= hi; // } // ... // EXPECT_THAT(3, InClosedRange(4, 6)); // // would generate a failure that contains the message: // // Expected: is in range [4, 6] // // If you specify "" as the description, the failure message will // contain the sequence of words in the matcher name followed by the // parameter values printed as a tuple. For example, // // MATCHER_P2(InClosedRange, low, hi, "") { ... } // ... // EXPECT_THAT(3, InClosedRange(4, 6)); // // would generate a failure that contains the text: // // Expected: in closed range (4, 6) // // Types of Matcher Parameters // =========================== // // For the purpose of typing, you can view // // MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... } // // as shorthand for // // template // FooMatcherPk // Foo(p1_type p1, ..., pk_type pk) { ... } // // When you write Foo(v1, ..., vk), the compiler infers the types of // the parameters v1, ..., and vk for you. If you are not happy with // the result of the type inference, you can specify the types by // explicitly instantiating the template, as in Foo(5, // false). As said earlier, you don't get to (or need to) specify // 'arg_type' as that's determined by the context in which the matcher // is used. You can assign the result of expression Foo(p1, ..., pk) // to a variable of type FooMatcherPk. This // can be useful when composing matchers. // // While you can instantiate a matcher template with reference types, // passing the parameters by pointer usually makes your code more // readable. If, however, you still want to pass a parameter by // reference, be aware that in the failure message generated by the // matcher you will see the value of the referenced object but not its // address. // // Explaining Match Results // ======================== // // Sometimes the matcher description alone isn't enough to explain why // the match has failed or succeeded. For example, when expecting a // long string, it can be very helpful to also print the diff between // the expected string and the actual one. To achieve that, you can // optionally stream additional information to a special variable // named result_listener, whose type is a pointer to class // MatchResultListener: // // MATCHER_P(EqualsLongString, str, "") { // if (arg == str) return true; // // *result_listener << "the difference: " /// << DiffStrings(str, arg); // return false; // } // // Overloading Matchers // ==================== // // You can overload matchers with different numbers of parameters: // // MATCHER_P(Blah, a, description_string1) { ... } // MATCHER_P2(Blah, a, b, description_string2) { ... } // // Caveats // ======= // // When defining a new matcher, you should also consider implementing // MatcherInterface or using MakePolymorphicMatcher(). These // approaches require more work than the MATCHER* macros, but also // give you more control on the types of the value being matched and // the matcher parameters, which may leads to better compiler error // messages when the matcher is used wrong. They also allow // overloading matchers based on parameter types (as opposed to just // based on the number of parameters). // // MATCHER*() can only be used in a namespace scope. The reason is // that C++ doesn't yet allow function-local types to be used to // instantiate templates. The up-coming C++0x standard will fix this. // Once that's done, we'll consider supporting using MATCHER*() inside // a function. // // More Information // ================ // // To learn more about using these macros, please search for 'MATCHER' // on http://code.google.com/p/googlemock/wiki/CookBook. #define MATCHER(name, description)\ class name##Matcher {\ public:\ template \ class gmock_Impl : public ::testing::MatcherInterface {\ public:\ gmock_Impl(const ::testing::internal::Interpolations& gmock_interp)\ : gmock_interp_(gmock_interp) {}\ virtual bool MatchAndExplain(\ arg_type arg, ::testing::MatchResultListener* result_listener) const;\ virtual void DescribeTo(::std::ostream* gmock_os) const {\ const ::testing::internal::Strings& gmock_printed_params = \ ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ ::std::tr1::tuple<>());\ *gmock_os << ::testing::internal::FormatMatcherDescription(\ #name, description, gmock_interp_, gmock_printed_params);\ }\ const ::testing::internal::Interpolations gmock_interp_;\ private:\ GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ };\ template \ operator ::testing::Matcher() const {\ return ::testing::Matcher(\ new gmock_Impl(gmock_interp_));\ }\ name##Matcher() {\ const char* gmock_param_names[] = { NULL };\ gmock_interp_ = ::testing::internal::ValidateMatcherDescription(\ gmock_param_names, ("" description ""));\ }\ private:\ ::testing::internal::Interpolations gmock_interp_;\ GTEST_DISALLOW_ASSIGN_(name##Matcher);\ };\ inline name##Matcher name() {\ return name##Matcher();\ }\ template \ bool name##Matcher::gmock_Impl::MatchAndExplain(\ arg_type arg,\ ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ const #define MATCHER_P(name, p0, description)\ template \ class name##MatcherP {\ public:\ template \ class gmock_Impl : public ::testing::MatcherInterface {\ public:\ explicit gmock_Impl(p0##_type gmock_p0, \ const ::testing::internal::Interpolations& gmock_interp)\ : p0(gmock_p0), gmock_interp_(gmock_interp) {}\ virtual bool MatchAndExplain(\ arg_type arg, ::testing::MatchResultListener* result_listener) const;\ virtual void DescribeTo(::std::ostream* gmock_os) const {\ const ::testing::internal::Strings& gmock_printed_params = \ ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ ::std::tr1::tuple(p0));\ *gmock_os << ::testing::internal::FormatMatcherDescription(\ #name, description, gmock_interp_, gmock_printed_params);\ }\ p0##_type p0;\ const ::testing::internal::Interpolations gmock_interp_;\ private:\ GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ };\ template \ operator ::testing::Matcher() const {\ return ::testing::Matcher(\ new gmock_Impl(p0, gmock_interp_));\ }\ name##MatcherP(p0##_type gmock_p0) : p0(gmock_p0) {\ const char* gmock_param_names[] = { #p0, NULL };\ gmock_interp_ = ::testing::internal::ValidateMatcherDescription(\ gmock_param_names, ("" description ""));\ }\ p0##_type p0;\ private:\ ::testing::internal::Interpolations gmock_interp_;\ GTEST_DISALLOW_ASSIGN_(name##MatcherP);\ };\ template \ inline name##MatcherP name(p0##_type p0) {\ return name##MatcherP(p0);\ }\ template \ template \ bool name##MatcherP::gmock_Impl::MatchAndExplain(\ arg_type arg,\ ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ const #define MATCHER_P2(name, p0, p1, description)\ template \ class name##MatcherP2 {\ public:\ template \ class gmock_Impl : public ::testing::MatcherInterface {\ public:\ gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, \ const ::testing::internal::Interpolations& gmock_interp)\ : p0(gmock_p0), p1(gmock_p1), gmock_interp_(gmock_interp) {}\ virtual bool MatchAndExplain(\ arg_type arg, ::testing::MatchResultListener* result_listener) const;\ virtual void DescribeTo(::std::ostream* gmock_os) const {\ const ::testing::internal::Strings& gmock_printed_params = \ ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ ::std::tr1::tuple(p0, p1));\ *gmock_os << ::testing::internal::FormatMatcherDescription(\ #name, description, gmock_interp_, gmock_printed_params);\ }\ p0##_type p0;\ p1##_type p1;\ const ::testing::internal::Interpolations gmock_interp_;\ private:\ GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ };\ template \ operator ::testing::Matcher() const {\ return ::testing::Matcher(\ new gmock_Impl(p0, p1, gmock_interp_));\ }\ name##MatcherP2(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \ p1(gmock_p1) {\ const char* gmock_param_names[] = { #p0, #p1, NULL };\ gmock_interp_ = ::testing::internal::ValidateMatcherDescription(\ gmock_param_names, ("" description ""));\ }\ p0##_type p0;\ p1##_type p1;\ private:\ ::testing::internal::Interpolations gmock_interp_;\ GTEST_DISALLOW_ASSIGN_(name##MatcherP2);\ };\ template \ inline name##MatcherP2 name(p0##_type p0, \ p1##_type p1) {\ return name##MatcherP2(p0, p1);\ }\ template \ template \ bool name##MatcherP2::gmock_Impl::MatchAndExplain(\ arg_type arg,\ ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ const #define MATCHER_P3(name, p0, p1, p2, description)\ template \ class name##MatcherP3 {\ public:\ template \ class gmock_Impl : public ::testing::MatcherInterface {\ public:\ gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ const ::testing::internal::Interpolations& gmock_interp)\ : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ gmock_interp_(gmock_interp) {}\ virtual bool MatchAndExplain(\ arg_type arg, ::testing::MatchResultListener* result_listener) const;\ virtual void DescribeTo(::std::ostream* gmock_os) const {\ const ::testing::internal::Strings& gmock_printed_params = \ ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ ::std::tr1::tuple(p0, p1, \ p2));\ *gmock_os << ::testing::internal::FormatMatcherDescription(\ #name, description, gmock_interp_, gmock_printed_params);\ }\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ const ::testing::internal::Interpolations gmock_interp_;\ private:\ GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ };\ template \ operator ::testing::Matcher() const {\ return ::testing::Matcher(\ new gmock_Impl(p0, p1, p2, gmock_interp_));\ }\ name##MatcherP3(p0##_type gmock_p0, p1##_type gmock_p1, \ p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {\ const char* gmock_param_names[] = { #p0, #p1, #p2, NULL };\ gmock_interp_ = ::testing::internal::ValidateMatcherDescription(\ gmock_param_names, ("" description ""));\ }\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ private:\ ::testing::internal::Interpolations gmock_interp_;\ GTEST_DISALLOW_ASSIGN_(name##MatcherP3);\ };\ template \ inline name##MatcherP3 name(p0##_type p0, \ p1##_type p1, p2##_type p2) {\ return name##MatcherP3(p0, p1, p2);\ }\ template \ template \ bool name##MatcherP3::gmock_Impl::MatchAndExplain(\ arg_type arg,\ ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ const #define MATCHER_P4(name, p0, p1, p2, p3, description)\ template \ class name##MatcherP4 {\ public:\ template \ class gmock_Impl : public ::testing::MatcherInterface {\ public:\ gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ p3##_type gmock_p3, \ const ::testing::internal::Interpolations& gmock_interp)\ : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ gmock_interp_(gmock_interp) {}\ virtual bool MatchAndExplain(\ arg_type arg, ::testing::MatchResultListener* result_listener) const;\ virtual void DescribeTo(::std::ostream* gmock_os) const {\ const ::testing::internal::Strings& gmock_printed_params = \ ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ ::std::tr1::tuple(p0, p1, p2, p3));\ *gmock_os << ::testing::internal::FormatMatcherDescription(\ #name, description, gmock_interp_, gmock_printed_params);\ }\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ const ::testing::internal::Interpolations gmock_interp_;\ private:\ GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ };\ template \ operator ::testing::Matcher() const {\ return ::testing::Matcher(\ new gmock_Impl(p0, p1, p2, p3, gmock_interp_));\ }\ name##MatcherP4(p0##_type gmock_p0, p1##_type gmock_p1, \ p2##_type gmock_p2, p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), \ p2(gmock_p2), p3(gmock_p3) {\ const char* gmock_param_names[] = { #p0, #p1, #p2, #p3, NULL };\ gmock_interp_ = ::testing::internal::ValidateMatcherDescription(\ gmock_param_names, ("" description ""));\ }\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ private:\ ::testing::internal::Interpolations gmock_interp_;\ GTEST_DISALLOW_ASSIGN_(name##MatcherP4);\ };\ template \ inline name##MatcherP4 name(p0##_type p0, p1##_type p1, p2##_type p2, \ p3##_type p3) {\ return name##MatcherP4(p0, \ p1, p2, p3);\ }\ template \ template \ bool name##MatcherP4::gmock_Impl::MatchAndExplain(\ arg_type arg,\ ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ const #define MATCHER_P5(name, p0, p1, p2, p3, p4, description)\ template \ class name##MatcherP5 {\ public:\ template \ class gmock_Impl : public ::testing::MatcherInterface {\ public:\ gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ p3##_type gmock_p3, p4##_type gmock_p4, \ const ::testing::internal::Interpolations& gmock_interp)\ : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ p4(gmock_p4), gmock_interp_(gmock_interp) {}\ virtual bool MatchAndExplain(\ arg_type arg, ::testing::MatchResultListener* result_listener) const;\ virtual void DescribeTo(::std::ostream* gmock_os) const {\ const ::testing::internal::Strings& gmock_printed_params = \ ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ ::std::tr1::tuple(p0, p1, p2, p3, p4));\ *gmock_os << ::testing::internal::FormatMatcherDescription(\ #name, description, gmock_interp_, gmock_printed_params);\ }\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ p4##_type p4;\ const ::testing::internal::Interpolations gmock_interp_;\ private:\ GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ };\ template \ operator ::testing::Matcher() const {\ return ::testing::Matcher(\ new gmock_Impl(p0, p1, p2, p3, p4, gmock_interp_));\ }\ name##MatcherP5(p0##_type gmock_p0, p1##_type gmock_p1, \ p2##_type gmock_p2, p3##_type gmock_p3, \ p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ p3(gmock_p3), p4(gmock_p4) {\ const char* gmock_param_names[] = { #p0, #p1, #p2, #p3, #p4, NULL };\ gmock_interp_ = ::testing::internal::ValidateMatcherDescription(\ gmock_param_names, ("" description ""));\ }\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ p4##_type p4;\ private:\ ::testing::internal::Interpolations gmock_interp_;\ GTEST_DISALLOW_ASSIGN_(name##MatcherP5);\ };\ template \ inline name##MatcherP5 name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ p4##_type p4) {\ return name##MatcherP5(p0, p1, p2, p3, p4);\ }\ template \ template \ bool name##MatcherP5::gmock_Impl::MatchAndExplain(\ arg_type arg,\ ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ const #define MATCHER_P6(name, p0, p1, p2, p3, p4, p5, description)\ template \ class name##MatcherP6 {\ public:\ template \ class gmock_Impl : public ::testing::MatcherInterface {\ public:\ gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ const ::testing::internal::Interpolations& gmock_interp)\ : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ p4(gmock_p4), p5(gmock_p5), gmock_interp_(gmock_interp) {}\ virtual bool MatchAndExplain(\ arg_type arg, ::testing::MatchResultListener* result_listener) const;\ virtual void DescribeTo(::std::ostream* gmock_os) const {\ const ::testing::internal::Strings& gmock_printed_params = \ ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ ::std::tr1::tuple(p0, p1, p2, p3, p4, p5));\ *gmock_os << ::testing::internal::FormatMatcherDescription(\ #name, description, gmock_interp_, gmock_printed_params);\ }\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ p4##_type p4;\ p5##_type p5;\ const ::testing::internal::Interpolations gmock_interp_;\ private:\ GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ };\ template \ operator ::testing::Matcher() const {\ return ::testing::Matcher(\ new gmock_Impl(p0, p1, p2, p3, p4, p5, gmock_interp_));\ }\ name##MatcherP6(p0##_type gmock_p0, p1##_type gmock_p1, \ p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {\ const char* gmock_param_names[] = { #p0, #p1, #p2, #p3, #p4, #p5, NULL };\ gmock_interp_ = ::testing::internal::ValidateMatcherDescription(\ gmock_param_names, ("" description ""));\ }\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ p4##_type p4;\ p5##_type p5;\ private:\ ::testing::internal::Interpolations gmock_interp_;\ GTEST_DISALLOW_ASSIGN_(name##MatcherP6);\ };\ template \ inline name##MatcherP6 name(p0##_type p0, p1##_type p1, p2##_type p2, \ p3##_type p3, p4##_type p4, p5##_type p5) {\ return name##MatcherP6(p0, p1, p2, p3, p4, p5);\ }\ template \ template \ bool name##MatcherP6::gmock_Impl::MatchAndExplain(\ arg_type arg,\ ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ const #define MATCHER_P7(name, p0, p1, p2, p3, p4, p5, p6, description)\ template \ class name##MatcherP7 {\ public:\ template \ class gmock_Impl : public ::testing::MatcherInterface {\ public:\ gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ p6##_type gmock_p6, \ const ::testing::internal::Interpolations& gmock_interp)\ : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ gmock_interp_(gmock_interp) {}\ virtual bool MatchAndExplain(\ arg_type arg, ::testing::MatchResultListener* result_listener) const;\ virtual void DescribeTo(::std::ostream* gmock_os) const {\ const ::testing::internal::Strings& gmock_printed_params = \ ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ ::std::tr1::tuple(p0, p1, p2, p3, p4, p5, \ p6));\ *gmock_os << ::testing::internal::FormatMatcherDescription(\ #name, description, gmock_interp_, gmock_printed_params);\ }\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ p4##_type p4;\ p5##_type p5;\ p6##_type p6;\ const ::testing::internal::Interpolations gmock_interp_;\ private:\ GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ };\ template \ operator ::testing::Matcher() const {\ return ::testing::Matcher(\ new gmock_Impl(p0, p1, p2, p3, p4, p5, p6, gmock_interp_));\ }\ name##MatcherP7(p0##_type gmock_p0, p1##_type gmock_p1, \ p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ p5##_type gmock_p5, p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), \ p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), \ p6(gmock_p6) {\ const char* gmock_param_names[] = { #p0, #p1, #p2, #p3, #p4, #p5, #p6, \ NULL };\ gmock_interp_ = ::testing::internal::ValidateMatcherDescription(\ gmock_param_names, ("" description ""));\ }\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ p4##_type p4;\ p5##_type p5;\ p6##_type p6;\ private:\ ::testing::internal::Interpolations gmock_interp_;\ GTEST_DISALLOW_ASSIGN_(name##MatcherP7);\ };\ template \ inline name##MatcherP7 name(p0##_type p0, p1##_type p1, \ p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \ p6##_type p6) {\ return name##MatcherP7(p0, p1, p2, p3, p4, p5, p6);\ }\ template \ template \ bool name##MatcherP7::gmock_Impl::MatchAndExplain(\ arg_type arg,\ ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ const #define MATCHER_P8(name, p0, p1, p2, p3, p4, p5, p6, p7, description)\ template \ class name##MatcherP8 {\ public:\ template \ class gmock_Impl : public ::testing::MatcherInterface {\ public:\ gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ p6##_type gmock_p6, p7##_type gmock_p7, \ const ::testing::internal::Interpolations& gmock_interp)\ : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ gmock_interp_(gmock_interp) {}\ virtual bool MatchAndExplain(\ arg_type arg, ::testing::MatchResultListener* result_listener) const;\ virtual void DescribeTo(::std::ostream* gmock_os) const {\ const ::testing::internal::Strings& gmock_printed_params = \ ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ ::std::tr1::tuple(p0, p1, p2, \ p3, p4, p5, p6, p7));\ *gmock_os << ::testing::internal::FormatMatcherDescription(\ #name, description, gmock_interp_, gmock_printed_params);\ }\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ p4##_type p4;\ p5##_type p5;\ p6##_type p6;\ p7##_type p7;\ const ::testing::internal::Interpolations gmock_interp_;\ private:\ GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ };\ template \ operator ::testing::Matcher() const {\ return ::testing::Matcher(\ new gmock_Impl(p0, p1, p2, p3, p4, p5, p6, p7, \ gmock_interp_));\ }\ name##MatcherP8(p0##_type gmock_p0, p1##_type gmock_p1, \ p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ p5##_type gmock_p5, p6##_type gmock_p6, \ p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ p7(gmock_p7) {\ const char* gmock_param_names[] = { #p0, #p1, #p2, #p3, #p4, #p5, #p6, \ #p7, NULL };\ gmock_interp_ = ::testing::internal::ValidateMatcherDescription(\ gmock_param_names, ("" description ""));\ }\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ p4##_type p4;\ p5##_type p5;\ p6##_type p6;\ p7##_type p7;\ private:\ ::testing::internal::Interpolations gmock_interp_;\ GTEST_DISALLOW_ASSIGN_(name##MatcherP8);\ };\ template \ inline name##MatcherP8 name(p0##_type p0, \ p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \ p6##_type p6, p7##_type p7) {\ return name##MatcherP8(p0, p1, p2, p3, p4, p5, \ p6, p7);\ }\ template \ template \ bool name##MatcherP8::gmock_Impl::MatchAndExplain(\ arg_type arg,\ ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ const #define MATCHER_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, description)\ template \ class name##MatcherP9 {\ public:\ template \ class gmock_Impl : public ::testing::MatcherInterface {\ public:\ gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \ const ::testing::internal::Interpolations& gmock_interp)\ : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ p8(gmock_p8), gmock_interp_(gmock_interp) {}\ virtual bool MatchAndExplain(\ arg_type arg, ::testing::MatchResultListener* result_listener) const;\ virtual void DescribeTo(::std::ostream* gmock_os) const {\ const ::testing::internal::Strings& gmock_printed_params = \ ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ ::std::tr1::tuple(p0, p1, p2, p3, p4, p5, p6, p7, p8));\ *gmock_os << ::testing::internal::FormatMatcherDescription(\ #name, description, gmock_interp_, gmock_printed_params);\ }\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ p4##_type p4;\ p5##_type p5;\ p6##_type p6;\ p7##_type p7;\ p8##_type p8;\ const ::testing::internal::Interpolations gmock_interp_;\ private:\ GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ };\ template \ operator ::testing::Matcher() const {\ return ::testing::Matcher(\ new gmock_Impl(p0, p1, p2, p3, p4, p5, p6, p7, p8, \ gmock_interp_));\ }\ name##MatcherP9(p0##_type gmock_p0, p1##_type gmock_p1, \ p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ p8(gmock_p8) {\ const char* gmock_param_names[] = { #p0, #p1, #p2, #p3, #p4, #p5, #p6, \ #p7, #p8, NULL };\ gmock_interp_ = ::testing::internal::ValidateMatcherDescription(\ gmock_param_names, ("" description ""));\ }\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ p4##_type p4;\ p5##_type p5;\ p6##_type p6;\ p7##_type p7;\ p8##_type p8;\ private:\ ::testing::internal::Interpolations gmock_interp_;\ GTEST_DISALLOW_ASSIGN_(name##MatcherP9);\ };\ template \ inline name##MatcherP9 name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, \ p8##_type p8) {\ return name##MatcherP9(p0, p1, p2, \ p3, p4, p5, p6, p7, p8);\ }\ template \ template \ bool name##MatcherP9::gmock_Impl::MatchAndExplain(\ arg_type arg,\ ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ const #define MATCHER_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, description)\ template \ class name##MatcherP10 {\ public:\ template \ class gmock_Impl : public ::testing::MatcherInterface {\ public:\ gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \ p9##_type gmock_p9, \ const ::testing::internal::Interpolations& gmock_interp)\ : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ p8(gmock_p8), p9(gmock_p9), gmock_interp_(gmock_interp) {}\ virtual bool MatchAndExplain(\ arg_type arg, ::testing::MatchResultListener* result_listener) const;\ virtual void DescribeTo(::std::ostream* gmock_os) const {\ const ::testing::internal::Strings& gmock_printed_params = \ ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ ::std::tr1::tuple(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9));\ *gmock_os << ::testing::internal::FormatMatcherDescription(\ #name, description, gmock_interp_, gmock_printed_params);\ }\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ p4##_type p4;\ p5##_type p5;\ p6##_type p6;\ p7##_type p7;\ p8##_type p8;\ p9##_type p9;\ const ::testing::internal::Interpolations gmock_interp_;\ private:\ GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ };\ template \ operator ::testing::Matcher() const {\ return ::testing::Matcher(\ new gmock_Impl(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, \ gmock_interp_));\ }\ name##MatcherP10(p0##_type gmock_p0, p1##_type gmock_p1, \ p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ p8##_type gmock_p8, p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), \ p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {\ const char* gmock_param_names[] = { #p0, #p1, #p2, #p3, #p4, #p5, #p6, \ #p7, #p8, #p9, NULL };\ gmock_interp_ = ::testing::internal::ValidateMatcherDescription(\ gmock_param_names, ("" description ""));\ }\ p0##_type p0;\ p1##_type p1;\ p2##_type p2;\ p3##_type p3;\ p4##_type p4;\ p5##_type p5;\ p6##_type p6;\ p7##_type p7;\ p8##_type p8;\ p9##_type p9;\ private:\ ::testing::internal::Interpolations gmock_interp_;\ GTEST_DISALLOW_ASSIGN_(name##MatcherP10);\ };\ template \ inline name##MatcherP10 name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \ p9##_type p9) {\ return name##MatcherP10(p0, \ p1, p2, p3, p4, p5, p6, p7, p8, p9);\ }\ template \ template \ bool name##MatcherP10::gmock_Impl::MatchAndExplain(\ arg_type arg,\ ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ const #endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/include/gmock/gmock-generated-matchers.h.pump000066400000000000000000000476441260417502300327720ustar00rootroot00000000000000$$ -*- mode: c++; -*- $$ This is a Pump source file. Please use Pump to convert it to $$ gmock-generated-actions.h. $$ $var n = 10 $$ The maximum arity we support. $$ }} This line fixes auto-indentation of the following code in Emacs. // Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Google Mock - a framework for writing C++ mock classes. // // This file implements some commonly used variadic matchers. #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ #include #include #include #include #include namespace testing { namespace internal { $range i 0..n-1 // The type of the i-th (0-based) field of Tuple. #define GMOCK_FIELD_TYPE_(Tuple, i) \ typename ::std::tr1::tuple_element::type // TupleFields is for selecting fields from a // tuple of type Tuple. It has two members: // // type: a tuple type whose i-th field is the ki-th field of Tuple. // GetSelectedFields(t): returns fields k0, ..., and kn of t as a tuple. // // For example, in class TupleFields, 2, 0>, we have: // // type is tuple, and // GetSelectedFields(make_tuple(true, 'a', 42)) is (42, true). template class TupleFields; // This generic version is used when there are $n selectors. template class TupleFields { public: typedef ::std::tr1::tuple<$for i, [[GMOCK_FIELD_TYPE_(Tuple, k$i)]]> type; static type GetSelectedFields(const Tuple& t) { using ::std::tr1::get; return type($for i, [[get(t)]]); } }; // The following specialization is used for 0 ~ $(n-1) selectors. $for i [[ $$ }}} $range j 0..i-1 $range k 0..n-1 template class TupleFields { public: typedef ::std::tr1::tuple<$for j, [[GMOCK_FIELD_TYPE_(Tuple, k$j)]]> type; static type GetSelectedFields(const Tuple& $if i==0 [[/* t */]] $else [[t]]) { using ::std::tr1::get; return type($for j, [[get(t)]]); } }; ]] #undef GMOCK_FIELD_TYPE_ // Implements the Args() matcher. $var ks = [[$for i, [[k$i]]]] template class ArgsMatcherImpl : public MatcherInterface { public: // ArgsTuple may have top-level const or reference modifiers. typedef GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(ArgsTuple)) RawArgsTuple; typedef typename internal::TupleFields::type SelectedArgs; typedef Matcher MonomorphicInnerMatcher; template explicit ArgsMatcherImpl(const InnerMatcher& inner_matcher) : inner_matcher_(SafeMatcherCast(inner_matcher)) {} virtual bool MatchAndExplain(ArgsTuple args, MatchResultListener* listener) const { const SelectedArgs& selected_args = GetSelectedArgs(args); if (!listener->IsInterested()) return inner_matcher_.Matches(selected_args); PrintIndices(listener->stream()); *listener << "are " << PrintToString(selected_args); StringMatchResultListener inner_listener; const bool match = inner_matcher_.MatchAndExplain(selected_args, &inner_listener); PrintIfNotEmpty(inner_listener.str(), listener->stream()); return match; } virtual void DescribeTo(::std::ostream* os) const { *os << "are a tuple "; PrintIndices(os); inner_matcher_.DescribeTo(os); } virtual void DescribeNegationTo(::std::ostream* os) const { *os << "are a tuple "; PrintIndices(os); inner_matcher_.DescribeNegationTo(os); } private: static SelectedArgs GetSelectedArgs(ArgsTuple args) { return TupleFields::GetSelectedFields(args); } // Prints the indices of the selected fields. static void PrintIndices(::std::ostream* os) { *os << "whose fields ("; const int indices[$n] = { $ks }; for (int i = 0; i < $n; i++) { if (indices[i] < 0) break; if (i >= 1) *os << ", "; *os << "#" << indices[i]; } *os << ") "; } const MonomorphicInnerMatcher inner_matcher_; GTEST_DISALLOW_ASSIGN_(ArgsMatcherImpl); }; template class ArgsMatcher { public: explicit ArgsMatcher(const InnerMatcher& inner_matcher) : inner_matcher_(inner_matcher) {} template operator Matcher() const { return MakeMatcher(new ArgsMatcherImpl(inner_matcher_)); } private: const InnerMatcher inner_matcher_; GTEST_DISALLOW_ASSIGN_(ArgsMatcher); }; // Implements ElementsAre() of 1-$n arguments. $range i 1..n $for i [[ $range j 1..i template <$for j, [[typename T$j]]> class ElementsAreMatcher$i { public: $if i==1 [[explicit ]]ElementsAreMatcher$i($for j, [[const T$j& e$j]])$if i > 0 [[ : ]] $for j, [[e$j[[]]_(e$j)]] {} template operator Matcher() const { typedef GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(Container)) RawContainer; typedef typename internal::StlContainerView::type::value_type Element; $if i==1 [[ // Nokia's Symbian Compiler has a nasty bug where the object put // in a one-element local array is not destructed when the array // goes out of scope. This leads to obvious badness as we've // added the linked_ptr in it to our other linked_ptrs list. // Hence we implement ElementsAreMatcher1 specially to avoid using // a local array. const Matcher matcher = MatcherCast(e1_); return MakeMatcher(new ElementsAreMatcherImpl(&matcher, 1)); ]] $else [[ const Matcher matchers[] = { $for j [[ MatcherCast(e$j[[]]_), ]] }; return MakeMatcher(new ElementsAreMatcherImpl(matchers, $i)); ]] } private: $for j [[ const T$j& e$j[[]]_; ]] GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher$i); }; ]] } // namespace internal // Args(a_matcher) matches a tuple if the selected // fields of it matches a_matcher. C++ doesn't support default // arguments for function templates, so we have to overload it. $range i 0..n $for i [[ $range j 1..i template <$for j [[int k$j, ]]typename InnerMatcher> inline internal::ArgsMatcher Args(const InnerMatcher& matcher) { return internal::ArgsMatcher(matcher); } ]] // ElementsAre(e0, e1, ..., e_n) matches an STL-style container with // (n + 1) elements, where the i-th element in the container must // match the i-th argument in the list. Each argument of // ElementsAre() can be either a value or a matcher. We support up to // $n arguments. // // NOTE: Since ElementsAre() cares about the order of the elements, it // must not be used with containers whose elements's order is // undefined (e.g. hash_map). inline internal::ElementsAreMatcher0 ElementsAre() { return internal::ElementsAreMatcher0(); } $range i 1..n $for i [[ $range j 1..i template <$for j, [[typename T$j]]> inline internal::ElementsAreMatcher$i<$for j, [[T$j]]> ElementsAre($for j, [[const T$j& e$j]]) { return internal::ElementsAreMatcher$i<$for j, [[T$j]]>($for j, [[e$j]]); } ]] // ElementsAreArray(array) and ElementAreArray(array, count) are like // ElementsAre(), except that they take an array of values or // matchers. The former form infers the size of 'array', which must // be a static C-style array. In the latter form, 'array' can either // be a static array or a pointer to a dynamically created array. template inline internal::ElementsAreArrayMatcher ElementsAreArray( const T* first, size_t count) { return internal::ElementsAreArrayMatcher(first, count); } template inline internal::ElementsAreArrayMatcher ElementsAreArray(const T (&array)[N]) { return internal::ElementsAreArrayMatcher(array, N); } } // namespace testing $$ } // This Pump meta comment fixes auto-indentation in Emacs. It will not $$ // show up in the generated code. // The MATCHER* family of macros can be used in a namespace scope to // define custom matchers easily. // // Basic Usage // =========== // // The syntax // // MATCHER(name, description_string) { statements; } // // defines a matcher with the given name that executes the statements, // which must return a bool to indicate if the match succeeds. Inside // the statements, you can refer to the value being matched by 'arg', // and refer to its type by 'arg_type'. // // The description string documents what the matcher does, and is used // to generate the failure message when the match fails. Since a // MATCHER() is usually defined in a header file shared by multiple // C++ source files, we require the description to be a C-string // literal to avoid possible side effects. It can be empty, in which // case we'll use the sequence of words in the matcher name as the // description. // // For example: // // MATCHER(IsEven, "") { return (arg % 2) == 0; } // // allows you to write // // // Expects mock_foo.Bar(n) to be called where n is even. // EXPECT_CALL(mock_foo, Bar(IsEven())); // // or, // // // Verifies that the value of some_expression is even. // EXPECT_THAT(some_expression, IsEven()); // // If the above assertion fails, it will print something like: // // Value of: some_expression // Expected: is even // Actual: 7 // // where the description "is even" is automatically calculated from the // matcher name IsEven. // // Argument Type // ============= // // Note that the type of the value being matched (arg_type) is // determined by the context in which you use the matcher and is // supplied to you by the compiler, so you don't need to worry about // declaring it (nor can you). This allows the matcher to be // polymorphic. For example, IsEven() can be used to match any type // where the value of "(arg % 2) == 0" can be implicitly converted to // a bool. In the "Bar(IsEven())" example above, if method Bar() // takes an int, 'arg_type' will be int; if it takes an unsigned long, // 'arg_type' will be unsigned long; and so on. // // Parameterizing Matchers // ======================= // // Sometimes you'll want to parameterize the matcher. For that you // can use another macro: // // MATCHER_P(name, param_name, description_string) { statements; } // // For example: // // MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; } // // will allow you to write: // // EXPECT_THAT(Blah("a"), HasAbsoluteValue(n)); // // which may lead to this message (assuming n is 10): // // Value of: Blah("a") // Expected: has absolute value 10 // Actual: -9 // // Note that both the matcher description and its parameter are // printed, making the message human-friendly. // // In the matcher definition body, you can write 'foo_type' to // reference the type of a parameter named 'foo'. For example, in the // body of MATCHER_P(HasAbsoluteValue, value) above, you can write // 'value_type' to refer to the type of 'value'. // // We also provide MATCHER_P2, MATCHER_P3, ..., up to MATCHER_P$n to // support multi-parameter matchers. // // Describing Parameterized Matchers // ================================= // // When defining a parameterized matcher, you can use Python-style // interpolations in the description string to refer to the parameter // values. We support the following syntax currently: // // %% a single '%' character // %(*)s all parameters of the matcher printed as a tuple // %(foo)s value of the matcher parameter named 'foo' // // For example, // // MATCHER_P2(InClosedRange, low, hi, "is in range [%(low)s, %(hi)s]") { // return low <= arg && arg <= hi; // } // ... // EXPECT_THAT(3, InClosedRange(4, 6)); // // would generate a failure that contains the message: // // Expected: is in range [4, 6] // // If you specify "" as the description, the failure message will // contain the sequence of words in the matcher name followed by the // parameter values printed as a tuple. For example, // // MATCHER_P2(InClosedRange, low, hi, "") { ... } // ... // EXPECT_THAT(3, InClosedRange(4, 6)); // // would generate a failure that contains the text: // // Expected: in closed range (4, 6) // // Types of Matcher Parameters // =========================== // // For the purpose of typing, you can view // // MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... } // // as shorthand for // // template // FooMatcherPk // Foo(p1_type p1, ..., pk_type pk) { ... } // // When you write Foo(v1, ..., vk), the compiler infers the types of // the parameters v1, ..., and vk for you. If you are not happy with // the result of the type inference, you can specify the types by // explicitly instantiating the template, as in Foo(5, // false). As said earlier, you don't get to (or need to) specify // 'arg_type' as that's determined by the context in which the matcher // is used. You can assign the result of expression Foo(p1, ..., pk) // to a variable of type FooMatcherPk. This // can be useful when composing matchers. // // While you can instantiate a matcher template with reference types, // passing the parameters by pointer usually makes your code more // readable. If, however, you still want to pass a parameter by // reference, be aware that in the failure message generated by the // matcher you will see the value of the referenced object but not its // address. // // Explaining Match Results // ======================== // // Sometimes the matcher description alone isn't enough to explain why // the match has failed or succeeded. For example, when expecting a // long string, it can be very helpful to also print the diff between // the expected string and the actual one. To achieve that, you can // optionally stream additional information to a special variable // named result_listener, whose type is a pointer to class // MatchResultListener: // // MATCHER_P(EqualsLongString, str, "") { // if (arg == str) return true; // // *result_listener << "the difference: " /// << DiffStrings(str, arg); // return false; // } // // Overloading Matchers // ==================== // // You can overload matchers with different numbers of parameters: // // MATCHER_P(Blah, a, description_string1) { ... } // MATCHER_P2(Blah, a, b, description_string2) { ... } // // Caveats // ======= // // When defining a new matcher, you should also consider implementing // MatcherInterface or using MakePolymorphicMatcher(). These // approaches require more work than the MATCHER* macros, but also // give you more control on the types of the value being matched and // the matcher parameters, which may leads to better compiler error // messages when the matcher is used wrong. They also allow // overloading matchers based on parameter types (as opposed to just // based on the number of parameters). // // MATCHER*() can only be used in a namespace scope. The reason is // that C++ doesn't yet allow function-local types to be used to // instantiate templates. The up-coming C++0x standard will fix this. // Once that's done, we'll consider supporting using MATCHER*() inside // a function. // // More Information // ================ // // To learn more about using these macros, please search for 'MATCHER' // on http://code.google.com/p/googlemock/wiki/CookBook. $range i 0..n $for i [[ $var macro_name = [[$if i==0 [[MATCHER]] $elif i==1 [[MATCHER_P]] $else [[MATCHER_P$i]]]] $var class_name = [[name##Matcher[[$if i==0 [[]] $elif i==1 [[P]] $else [[P$i]]]]]] $range j 0..i-1 $var template = [[$if i==0 [[]] $else [[ template <$for j, [[typename p$j##_type]]>\ ]]]] $var ctor_param_list = [[$for j, [[p$j##_type gmock_p$j]]]] $var impl_ctor_param_list = [[$for j [[p$j##_type gmock_p$j, ]] const ::testing::internal::Interpolations& gmock_interp]] $var impl_inits = [[ : $for j [[p$j(gmock_p$j), ]]gmock_interp_(gmock_interp)]] $var inits = [[$if i==0 [[]] $else [[ : $for j, [[p$j(gmock_p$j)]]]]]] $var params_and_interp = [[$for j [[p$j, ]]gmock_interp_]] $var params = [[$for j, [[p$j]]]] $var param_types = [[$if i==0 [[]] $else [[<$for j, [[p$j##_type]]>]]]] $var param_types_and_names = [[$for j, [[p$j##_type p$j]]]] $var param_field_decls = [[$for j [[ p$j##_type p$j;\ ]]]] $var param_field_decls2 = [[$for j [[ p$j##_type p$j;\ ]]]] #define $macro_name(name$for j [[, p$j]], description)\$template class $class_name {\ public:\ template \ class gmock_Impl : public ::testing::MatcherInterface {\ public:\ [[$if i==1 [[explicit ]]]]gmock_Impl($impl_ctor_param_list)\ $impl_inits {}\ virtual bool MatchAndExplain(\ arg_type arg, ::testing::MatchResultListener* result_listener) const;\ virtual void DescribeTo(::std::ostream* gmock_os) const {\ const ::testing::internal::Strings& gmock_printed_params = \ ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ ::std::tr1::tuple<$for j, [[p$j##_type]]>($for j, [[p$j]]));\ *gmock_os << ::testing::internal::FormatMatcherDescription(\ #name, description, gmock_interp_, gmock_printed_params);\ }\$param_field_decls const ::testing::internal::Interpolations gmock_interp_;\ private:\ GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ };\ template \ operator ::testing::Matcher() const {\ return ::testing::Matcher(\ new gmock_Impl($params_and_interp));\ }\ $class_name($ctor_param_list)$inits {\ const char* gmock_param_names[] = { $for j [[#p$j, ]]NULL };\ gmock_interp_ = ::testing::internal::ValidateMatcherDescription(\ gmock_param_names, ("" description ""));\ }\$param_field_decls2 private:\ ::testing::internal::Interpolations gmock_interp_;\ GTEST_DISALLOW_ASSIGN_($class_name);\ };\$template inline $class_name$param_types name($param_types_and_names) {\ return $class_name$param_types($params);\ }\$template template \ bool $class_name$param_types::gmock_Impl::MatchAndExplain(\ arg_type arg,\ ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ const ]] #endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/include/gmock/gmock-generated-nice-strict.h000066400000000000000000000260661260417502300324230ustar00rootroot00000000000000// This file was GENERATED by a script. DO NOT EDIT BY HAND!!! // Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Implements class templates NiceMock and StrictMock. // // Given a mock class MockFoo that is created using Google Mock, // NiceMock is a subclass of MockFoo that allows // uninteresting calls (i.e. calls to mock methods that have no // EXPECT_CALL specs), and StrictMock is a subclass of // MockFoo that treats all uninteresting calls as errors. // // NiceMock and StrictMock "inherits" the constructors of their // respective base class, with up-to 10 arguments. Therefore you can // write NiceMock(5, "a") to construct a nice mock where // MockFoo has a constructor that accepts (int, const char*), for // example. // // A known limitation is that NiceMock and // StrictMock only works for mock methods defined using the // MOCK_METHOD* family of macros DIRECTLY in the MockFoo class. If a // mock method is defined in a base class of MockFoo, the "nice" or // "strict" modifier may not affect it, depending on the compiler. In // particular, nesting NiceMock and StrictMock is NOT supported. // // Another known limitation is that the constructors of the base mock // cannot have arguments passed by non-const reference, which are // banned by the Google C++ style guide anyway. #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_ #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_ #include #include namespace testing { template class NiceMock : public MockClass { public: // We don't factor out the constructor body to a common method, as // we have to avoid a possible clash with members of MockClass. NiceMock() { ::testing::Mock::AllowUninterestingCalls( internal::implicit_cast(this)); } // C++ doesn't (yet) allow inheritance of constructors, so we have // to define it for each arity. template explicit NiceMock(const A1& a1) : MockClass(a1) { ::testing::Mock::AllowUninterestingCalls( internal::implicit_cast(this)); } template NiceMock(const A1& a1, const A2& a2) : MockClass(a1, a2) { ::testing::Mock::AllowUninterestingCalls( internal::implicit_cast(this)); } template NiceMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) { ::testing::Mock::AllowUninterestingCalls( internal::implicit_cast(this)); } template NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4) : MockClass(a1, a2, a3, a4) { ::testing::Mock::AllowUninterestingCalls( internal::implicit_cast(this)); } template NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5) : MockClass(a1, a2, a3, a4, a5) { ::testing::Mock::AllowUninterestingCalls( internal::implicit_cast(this)); } template NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) { ::testing::Mock::AllowUninterestingCalls( internal::implicit_cast(this)); } template NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7) : MockClass(a1, a2, a3, a4, a5, a6, a7) { ::testing::Mock::AllowUninterestingCalls( internal::implicit_cast(this)); } template NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8) { ::testing::Mock::AllowUninterestingCalls( internal::implicit_cast(this)); } template NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) { ::testing::Mock::AllowUninterestingCalls( internal::implicit_cast(this)); } template NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9, const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) { ::testing::Mock::AllowUninterestingCalls( internal::implicit_cast(this)); } virtual ~NiceMock() { ::testing::Mock::UnregisterCallReaction( internal::implicit_cast(this)); } private: GTEST_DISALLOW_COPY_AND_ASSIGN_(NiceMock); }; template class StrictMock : public MockClass { public: // We don't factor out the constructor body to a common method, as // we have to avoid a possible clash with members of MockClass. StrictMock() { ::testing::Mock::FailUninterestingCalls( internal::implicit_cast(this)); } template explicit StrictMock(const A1& a1) : MockClass(a1) { ::testing::Mock::FailUninterestingCalls( internal::implicit_cast(this)); } template StrictMock(const A1& a1, const A2& a2) : MockClass(a1, a2) { ::testing::Mock::FailUninterestingCalls( internal::implicit_cast(this)); } template StrictMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) { ::testing::Mock::FailUninterestingCalls( internal::implicit_cast(this)); } template StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4) : MockClass(a1, a2, a3, a4) { ::testing::Mock::FailUninterestingCalls( internal::implicit_cast(this)); } template StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5) : MockClass(a1, a2, a3, a4, a5) { ::testing::Mock::FailUninterestingCalls( internal::implicit_cast(this)); } template StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) { ::testing::Mock::FailUninterestingCalls( internal::implicit_cast(this)); } template StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7) : MockClass(a1, a2, a3, a4, a5, a6, a7) { ::testing::Mock::FailUninterestingCalls( internal::implicit_cast(this)); } template StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8) { ::testing::Mock::FailUninterestingCalls( internal::implicit_cast(this)); } template StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) { ::testing::Mock::FailUninterestingCalls( internal::implicit_cast(this)); } template StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9, const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) { ::testing::Mock::FailUninterestingCalls( internal::implicit_cast(this)); } virtual ~StrictMock() { ::testing::Mock::UnregisterCallReaction( internal::implicit_cast(this)); } private: GTEST_DISALLOW_COPY_AND_ASSIGN_(StrictMock); }; // The following specializations catch some (relatively more common) // user errors of nesting nice and strict mocks. They do NOT catch // all possible errors. // These specializations are declared but not defined, as NiceMock and // StrictMock cannot be nested. template class NiceMock >; template class NiceMock >; template class StrictMock >; template class StrictMock >; } // namespace testing #endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_ gmock-generated-nice-strict.h.pump000066400000000000000000000133211260417502300333120ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/include/gmock$$ -*- mode: c++; -*- $$ This is a Pump source file. Please use Pump to convert it to $$ gmock-generated-nice-strict.h. $$ $var n = 10 $$ The maximum arity we support. // Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Implements class templates NiceMock and StrictMock. // // Given a mock class MockFoo that is created using Google Mock, // NiceMock is a subclass of MockFoo that allows // uninteresting calls (i.e. calls to mock methods that have no // EXPECT_CALL specs), and StrictMock is a subclass of // MockFoo that treats all uninteresting calls as errors. // // NiceMock and StrictMock "inherits" the constructors of their // respective base class, with up-to $n arguments. Therefore you can // write NiceMock(5, "a") to construct a nice mock where // MockFoo has a constructor that accepts (int, const char*), for // example. // // A known limitation is that NiceMock and // StrictMock only works for mock methods defined using the // MOCK_METHOD* family of macros DIRECTLY in the MockFoo class. If a // mock method is defined in a base class of MockFoo, the "nice" or // "strict" modifier may not affect it, depending on the compiler. In // particular, nesting NiceMock and StrictMock is NOT supported. // // Another known limitation is that the constructors of the base mock // cannot have arguments passed by non-const reference, which are // banned by the Google C++ style guide anyway. #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_ #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_ #include #include namespace testing { template class NiceMock : public MockClass { public: // We don't factor out the constructor body to a common method, as // we have to avoid a possible clash with members of MockClass. NiceMock() { ::testing::Mock::AllowUninterestingCalls( internal::implicit_cast(this)); } // C++ doesn't (yet) allow inheritance of constructors, so we have // to define it for each arity. template explicit NiceMock(const A1& a1) : MockClass(a1) { ::testing::Mock::AllowUninterestingCalls( internal::implicit_cast(this)); } $range i 2..n $for i [[ $range j 1..i template <$for j, [[typename A$j]]> NiceMock($for j, [[const A$j& a$j]]) : MockClass($for j, [[a$j]]) { ::testing::Mock::AllowUninterestingCalls( internal::implicit_cast(this)); } ]] virtual ~NiceMock() { ::testing::Mock::UnregisterCallReaction( internal::implicit_cast(this)); } private: GTEST_DISALLOW_COPY_AND_ASSIGN_(NiceMock); }; template class StrictMock : public MockClass { public: // We don't factor out the constructor body to a common method, as // we have to avoid a possible clash with members of MockClass. StrictMock() { ::testing::Mock::FailUninterestingCalls( internal::implicit_cast(this)); } template explicit StrictMock(const A1& a1) : MockClass(a1) { ::testing::Mock::FailUninterestingCalls( internal::implicit_cast(this)); } $for i [[ $range j 1..i template <$for j, [[typename A$j]]> StrictMock($for j, [[const A$j& a$j]]) : MockClass($for j, [[a$j]]) { ::testing::Mock::FailUninterestingCalls( internal::implicit_cast(this)); } ]] virtual ~StrictMock() { ::testing::Mock::UnregisterCallReaction( internal::implicit_cast(this)); } private: GTEST_DISALLOW_COPY_AND_ASSIGN_(StrictMock); }; // The following specializations catch some (relatively more common) // user errors of nesting nice and strict mocks. They do NOT catch // all possible errors. // These specializations are declared but not defined, as NiceMock and // StrictMock cannot be nested. template class NiceMock >; template class NiceMock >; template class StrictMock >; template class StrictMock >; } // namespace testing #endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/include/gmock/gmock-matchers.h000066400000000000000000003141221260417502300300420ustar00rootroot00000000000000// Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Google Mock - a framework for writing C++ mock classes. // // This file implements some commonly used argument matchers. More // matchers can be defined by the user implementing the // MatcherInterface interface if necessary. #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ #define GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ #include #include #include // NOLINT #include #include #include #include #include #include #include namespace testing { // To implement a matcher Foo for type T, define: // 1. a class FooMatcherImpl that implements the // MatcherInterface interface, and // 2. a factory function that creates a Matcher object from a // FooMatcherImpl*. // // The two-level delegation design makes it possible to allow a user // to write "v" instead of "Eq(v)" where a Matcher is expected, which // is impossible if we pass matchers by pointers. It also eases // ownership management as Matcher objects can now be copied like // plain values. // MatchResultListener is an abstract class. Its << operator can be // used by a matcher to explain why a value matches or doesn't match. // // TODO(wan@google.com): add method // bool InterestedInWhy(bool result) const; // to indicate whether the listener is interested in why the match // result is 'result'. class MatchResultListener { public: // Creates a listener object with the given underlying ostream. The // listener does not own the ostream. explicit MatchResultListener(::std::ostream* os) : stream_(os) {} virtual ~MatchResultListener() = 0; // Makes this class abstract. // Streams x to the underlying ostream; does nothing if the ostream // is NULL. template MatchResultListener& operator<<(const T& x) { if (stream_ != NULL) *stream_ << x; return *this; } // Returns the underlying ostream. ::std::ostream* stream() { return stream_; } // Returns true iff the listener is interested in an explanation of // the match result. A matcher's MatchAndExplain() method can use // this information to avoid generating the explanation when no one // intends to hear it. bool IsInterested() const { return stream_ != NULL; } private: ::std::ostream* const stream_; GTEST_DISALLOW_COPY_AND_ASSIGN_(MatchResultListener); }; inline MatchResultListener::~MatchResultListener() { } // The implementation of a matcher. template class MatcherInterface { public: virtual ~MatcherInterface() {} // Returns true iff the matcher matches x; also explains the match // result to 'listener', in the form of a non-restrictive relative // clause ("which ...", "whose ...", etc) that describes x. For // example, the MatchAndExplain() method of the Pointee(...) matcher // should generate an explanation like "which points to ...". // // You should override this method when defining a new matcher. // // It's the responsibility of the caller (Google Mock) to guarantee // that 'listener' is not NULL. This helps to simplify a matcher's // implementation when it doesn't care about the performance, as it // can talk to 'listener' without checking its validity first. // However, in order to implement dummy listeners efficiently, // listener->stream() may be NULL. virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0; // Describes this matcher to an ostream. The function should print // a verb phrase that describes the property a value matching this // matcher should have. The subject of the verb phrase is the value // being matched. For example, the DescribeTo() method of the Gt(7) // matcher prints "is greater than 7". virtual void DescribeTo(::std::ostream* os) const = 0; // Describes the negation of this matcher to an ostream. For // example, if the description of this matcher is "is greater than // 7", the negated description could be "is not greater than 7". // You are not required to override this when implementing // MatcherInterface, but it is highly advised so that your matcher // can produce good error messages. virtual void DescribeNegationTo(::std::ostream* os) const { *os << "not ("; DescribeTo(os); *os << ")"; } }; namespace internal { // A match result listener that ignores the explanation. class DummyMatchResultListener : public MatchResultListener { public: DummyMatchResultListener() : MatchResultListener(NULL) {} private: GTEST_DISALLOW_COPY_AND_ASSIGN_(DummyMatchResultListener); }; // A match result listener that forwards the explanation to a given // ostream. The difference between this and MatchResultListener is // that the former is concrete. class StreamMatchResultListener : public MatchResultListener { public: explicit StreamMatchResultListener(::std::ostream* os) : MatchResultListener(os) {} private: GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamMatchResultListener); }; // A match result listener that stores the explanation in a string. class StringMatchResultListener : public MatchResultListener { public: StringMatchResultListener() : MatchResultListener(&ss_) {} // Returns the explanation heard so far. internal::string str() const { return ss_.str(); } private: ::std::stringstream ss_; GTEST_DISALLOW_COPY_AND_ASSIGN_(StringMatchResultListener); }; // An internal class for implementing Matcher, which will derive // from it. We put functionalities common to all Matcher // specializations here to avoid code duplication. template class MatcherBase { public: // Returns true iff the matcher matches x; also explains the match // result to 'listener'. bool MatchAndExplain(T x, MatchResultListener* listener) const { return impl_->MatchAndExplain(x, listener); } // Returns true iff this matcher matches x. bool Matches(T x) const { DummyMatchResultListener dummy; return MatchAndExplain(x, &dummy); } // Describes this matcher to an ostream. void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); } // Describes the negation of this matcher to an ostream. void DescribeNegationTo(::std::ostream* os) const { impl_->DescribeNegationTo(os); } // Explains why x matches, or doesn't match, the matcher. void ExplainMatchResultTo(T x, ::std::ostream* os) const { StreamMatchResultListener listener(os); MatchAndExplain(x, &listener); } protected: MatcherBase() {} // Constructs a matcher from its implementation. explicit MatcherBase(const MatcherInterface* impl) : impl_(impl) {} virtual ~MatcherBase() {} private: // shared_ptr (util/gtl/shared_ptr.h) and linked_ptr have similar // interfaces. The former dynamically allocates a chunk of memory // to hold the reference count, while the latter tracks all // references using a circular linked list without allocating // memory. It has been observed that linked_ptr performs better in // typical scenarios. However, shared_ptr can out-perform // linked_ptr when there are many more uses of the copy constructor // than the default constructor. // // If performance becomes a problem, we should see if using // shared_ptr helps. ::testing::internal::linked_ptr > impl_; }; } // namespace internal // A Matcher is a copyable and IMMUTABLE (except by assignment) // object that can check whether a value of type T matches. The // implementation of Matcher is just a linked_ptr to const // MatcherInterface, so copying is fairly cheap. Don't inherit // from Matcher! template class Matcher : public internal::MatcherBase { public: // Constructs a null matcher. Needed for storing Matcher objects in // STL containers. Matcher() {} // Constructs a matcher from its implementation. explicit Matcher(const MatcherInterface* impl) : internal::MatcherBase(impl) {} // Implicit constructor here allows people to write // EXPECT_CALL(foo, Bar(5)) instead of EXPECT_CALL(foo, Bar(Eq(5))) sometimes Matcher(T value); // NOLINT }; // The following two specializations allow the user to write str // instead of Eq(str) and "foo" instead of Eq("foo") when a string // matcher is expected. template <> class Matcher : public internal::MatcherBase { public: Matcher() {} explicit Matcher(const MatcherInterface* impl) : internal::MatcherBase(impl) {} // Allows the user to write str instead of Eq(str) sometimes, where // str is a string object. Matcher(const internal::string& s); // NOLINT // Allows the user to write "foo" instead of Eq("foo") sometimes. Matcher(const char* s); // NOLINT }; template <> class Matcher : public internal::MatcherBase { public: Matcher() {} explicit Matcher(const MatcherInterface* impl) : internal::MatcherBase(impl) {} // Allows the user to write str instead of Eq(str) sometimes, where // str is a string object. Matcher(const internal::string& s); // NOLINT // Allows the user to write "foo" instead of Eq("foo") sometimes. Matcher(const char* s); // NOLINT }; // The PolymorphicMatcher class template makes it easy to implement a // polymorphic matcher (i.e. a matcher that can match values of more // than one type, e.g. Eq(n) and NotNull()). // // To define a polymorphic matcher, a user should provide an Impl // class that has a DescribeTo() method and a DescribeNegationTo() // method, and define a member function (or member function template) // // bool MatchAndExplain(const Value& value, // MatchResultListener* listener) const; // // See the definition of NotNull() for a complete example. template class PolymorphicMatcher { public: explicit PolymorphicMatcher(const Impl& an_impl) : impl_(an_impl) {} // Returns a mutable reference to the underlying matcher // implementation object. Impl& mutable_impl() { return impl_; } // Returns an immutable reference to the underlying matcher // implementation object. const Impl& impl() const { return impl_; } template operator Matcher() const { return Matcher(new MonomorphicImpl(impl_)); } private: template class MonomorphicImpl : public MatcherInterface { public: explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {} virtual void DescribeTo(::std::ostream* os) const { impl_.DescribeTo(os); } virtual void DescribeNegationTo(::std::ostream* os) const { impl_.DescribeNegationTo(os); } virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { return impl_.MatchAndExplain(x, listener); } private: const Impl impl_; GTEST_DISALLOW_ASSIGN_(MonomorphicImpl); }; Impl impl_; GTEST_DISALLOW_ASSIGN_(PolymorphicMatcher); }; // Creates a matcher from its implementation. This is easier to use // than the Matcher constructor as it doesn't require you to // explicitly write the template argument, e.g. // // MakeMatcher(foo); // vs // Matcher(foo); template inline Matcher MakeMatcher(const MatcherInterface* impl) { return Matcher(impl); }; // Creates a polymorphic matcher from its implementation. This is // easier to use than the PolymorphicMatcher constructor as it // doesn't require you to explicitly write the template argument, e.g. // // MakePolymorphicMatcher(foo); // vs // PolymorphicMatcher(foo); template inline PolymorphicMatcher MakePolymorphicMatcher(const Impl& impl) { return PolymorphicMatcher(impl); } // In order to be safe and clear, casting between different matcher // types is done explicitly via MatcherCast(m), which takes a // matcher m and returns a Matcher. It compiles only when T can be // statically converted to the argument type of m. template Matcher MatcherCast(M m); // Implements SafeMatcherCast(). // // We use an intermediate class to do the actual safe casting as Nokia's // Symbian compiler cannot decide between // template ... (M) and // template ... (const Matcher&) // for function templates but can for member function templates. template class SafeMatcherCastImpl { public: // This overload handles polymorphic matchers only since monomorphic // matchers are handled by the next one. template static inline Matcher Cast(M polymorphic_matcher) { return Matcher(polymorphic_matcher); } // This overload handles monomorphic matchers. // // In general, if type T can be implicitly converted to type U, we can // safely convert a Matcher to a Matcher (i.e. Matcher is // contravariant): just keep a copy of the original Matcher, convert the // argument from type T to U, and then pass it to the underlying Matcher. // The only exception is when U is a reference and T is not, as the // underlying Matcher may be interested in the argument's address, which // is not preserved in the conversion from T to U. template static inline Matcher Cast(const Matcher& matcher) { // Enforce that T can be implicitly converted to U. GMOCK_COMPILE_ASSERT_((internal::ImplicitlyConvertible::value), T_must_be_implicitly_convertible_to_U); // Enforce that we are not converting a non-reference type T to a reference // type U. GMOCK_COMPILE_ASSERT_( internal::is_reference::value || !internal::is_reference::value, cannot_convert_non_referentce_arg_to_reference); // In case both T and U are arithmetic types, enforce that the // conversion is not lossy. typedef GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(T)) RawT; typedef GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(U)) RawU; const bool kTIsOther = GMOCK_KIND_OF_(RawT) == internal::kOther; const bool kUIsOther = GMOCK_KIND_OF_(RawU) == internal::kOther; GMOCK_COMPILE_ASSERT_( kTIsOther || kUIsOther || (internal::LosslessArithmeticConvertible::value), conversion_of_arithmetic_types_must_be_lossless); return MatcherCast(matcher); } }; template inline Matcher SafeMatcherCast(const M& polymorphic_matcher) { return SafeMatcherCastImpl::Cast(polymorphic_matcher); } // A() returns a matcher that matches any value of type T. template Matcher A(); // Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION // and MUST NOT BE USED IN USER CODE!!! namespace internal { // If the explanation is not empty, prints it to the ostream. inline void PrintIfNotEmpty(const internal::string& explanation, std::ostream* os) { if (explanation != "" && os != NULL) { *os << ", " << explanation; } } // Matches the value against the given matcher, prints the value and explains // the match result to the listener. Returns the match result. // 'listener' must not be NULL. // Value cannot be passed by const reference, because some matchers take a // non-const argument. template bool MatchPrintAndExplain(Value& value, const Matcher& matcher, MatchResultListener* listener) { if (!listener->IsInterested()) { // If the listener is not interested, we do not need to construct the // inner explanation. return matcher.Matches(value); } StringMatchResultListener inner_listener; const bool match = matcher.MatchAndExplain(value, &inner_listener); UniversalPrint(value, listener->stream()); PrintIfNotEmpty(inner_listener.str(), listener->stream()); return match; } // An internal helper class for doing compile-time loop on a tuple's // fields. template class TuplePrefix { public: // TuplePrefix::Matches(matcher_tuple, value_tuple) returns true // iff the first N fields of matcher_tuple matches the first N // fields of value_tuple, respectively. template static bool Matches(const MatcherTuple& matcher_tuple, const ValueTuple& value_tuple) { using ::std::tr1::get; return TuplePrefix::Matches(matcher_tuple, value_tuple) && get(matcher_tuple).Matches(get(value_tuple)); } // TuplePrefix::ExplainMatchFailuresTo(matchers, values, os) // describes failures in matching the first N fields of matchers // against the first N fields of values. If there is no failure, // nothing will be streamed to os. template static void ExplainMatchFailuresTo(const MatcherTuple& matchers, const ValueTuple& values, ::std::ostream* os) { using ::std::tr1::tuple_element; using ::std::tr1::get; // First, describes failures in the first N - 1 fields. TuplePrefix::ExplainMatchFailuresTo(matchers, values, os); // Then describes the failure (if any) in the (N - 1)-th (0-based) // field. typename tuple_element::type matcher = get(matchers); typedef typename tuple_element::type Value; Value value = get(values); StringMatchResultListener listener; if (!matcher.MatchAndExplain(value, &listener)) { // TODO(wan): include in the message the name of the parameter // as used in MOCK_METHOD*() when possible. *os << " Expected arg #" << N - 1 << ": "; get(matchers).DescribeTo(os); *os << "\n Actual: "; // We remove the reference in type Value to prevent the // universal printer from printing the address of value, which // isn't interesting to the user most of the time. The // matcher's MatchAndExplain() method handles the case when // the address is interesting. internal::UniversalPrint(value, os); PrintIfNotEmpty(listener.str(), os); *os << "\n"; } } }; // The base case. template <> class TuplePrefix<0> { public: template static bool Matches(const MatcherTuple& /* matcher_tuple */, const ValueTuple& /* value_tuple */) { return true; } template static void ExplainMatchFailuresTo(const MatcherTuple& /* matchers */, const ValueTuple& /* values */, ::std::ostream* /* os */) {} }; // TupleMatches(matcher_tuple, value_tuple) returns true iff all // matchers in matcher_tuple match the corresponding fields in // value_tuple. It is a compiler error if matcher_tuple and // value_tuple have different number of fields or incompatible field // types. template bool TupleMatches(const MatcherTuple& matcher_tuple, const ValueTuple& value_tuple) { using ::std::tr1::tuple_size; // Makes sure that matcher_tuple and value_tuple have the same // number of fields. GMOCK_COMPILE_ASSERT_(tuple_size::value == tuple_size::value, matcher_and_value_have_different_numbers_of_fields); return TuplePrefix::value>:: Matches(matcher_tuple, value_tuple); } // Describes failures in matching matchers against values. If there // is no failure, nothing will be streamed to os. template void ExplainMatchFailureTupleTo(const MatcherTuple& matchers, const ValueTuple& values, ::std::ostream* os) { using ::std::tr1::tuple_size; TuplePrefix::value>::ExplainMatchFailuresTo( matchers, values, os); } // The MatcherCastImpl class template is a helper for implementing // MatcherCast(). We need this helper in order to partially // specialize the implementation of MatcherCast() (C++ allows // class/struct templates to be partially specialized, but not // function templates.). // This general version is used when MatcherCast()'s argument is a // polymorphic matcher (i.e. something that can be converted to a // Matcher but is not one yet; for example, Eq(value)). template class MatcherCastImpl { public: static Matcher Cast(M polymorphic_matcher) { return Matcher(polymorphic_matcher); } }; // This more specialized version is used when MatcherCast()'s argument // is already a Matcher. This only compiles when type T can be // statically converted to type U. template class MatcherCastImpl > { public: static Matcher Cast(const Matcher& source_matcher) { return Matcher(new Impl(source_matcher)); } private: class Impl : public MatcherInterface { public: explicit Impl(const Matcher& source_matcher) : source_matcher_(source_matcher) {} // We delegate the matching logic to the source matcher. virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { return source_matcher_.MatchAndExplain(static_cast(x), listener); } virtual void DescribeTo(::std::ostream* os) const { source_matcher_.DescribeTo(os); } virtual void DescribeNegationTo(::std::ostream* os) const { source_matcher_.DescribeNegationTo(os); } private: const Matcher source_matcher_; GTEST_DISALLOW_ASSIGN_(Impl); }; }; // This even more specialized version is used for efficiently casting // a matcher to its own type. template class MatcherCastImpl > { public: static Matcher Cast(const Matcher& matcher) { return matcher; } }; // Implements A(). template class AnyMatcherImpl : public MatcherInterface { public: virtual bool MatchAndExplain( T /* x */, MatchResultListener* /* listener */) const { return true; } virtual void DescribeTo(::std::ostream* os) const { *os << "is anything"; } virtual void DescribeNegationTo(::std::ostream* os) const { // This is mostly for completeness' safe, as it's not very useful // to write Not(A()). However we cannot completely rule out // such a possibility, and it doesn't hurt to be prepared. *os << "never matches"; } }; // Implements _, a matcher that matches any value of any // type. This is a polymorphic matcher, so we need a template type // conversion operator to make it appearing as a Matcher for any // type T. class AnythingMatcher { public: template operator Matcher() const { return A(); } }; // Implements a matcher that compares a given value with a // pre-supplied value using one of the ==, <=, <, etc, operators. The // two values being compared don't have to have the same type. // // The matcher defined here is polymorphic (for example, Eq(5) can be // used to match an int, a short, a double, etc). Therefore we use // a template type conversion operator in the implementation. // // We define this as a macro in order to eliminate duplicated source // code. // // The following template definition assumes that the Rhs parameter is // a "bare" type (i.e. neither 'const T' nor 'T&'). #define GMOCK_IMPLEMENT_COMPARISON_MATCHER_( \ name, op, relation, negated_relation) \ template class name##Matcher { \ public: \ explicit name##Matcher(const Rhs& rhs) : rhs_(rhs) {} \ template \ operator Matcher() const { \ return MakeMatcher(new Impl(rhs_)); \ } \ private: \ template \ class Impl : public MatcherInterface { \ public: \ explicit Impl(const Rhs& rhs) : rhs_(rhs) {} \ virtual bool MatchAndExplain(\ Lhs lhs, MatchResultListener* /* listener */) const { \ return lhs op rhs_; \ } \ virtual void DescribeTo(::std::ostream* os) const { \ *os << relation " "; \ UniversalPrinter::Print(rhs_, os); \ } \ virtual void DescribeNegationTo(::std::ostream* os) const { \ *os << negated_relation " "; \ UniversalPrinter::Print(rhs_, os); \ } \ private: \ Rhs rhs_; \ GTEST_DISALLOW_ASSIGN_(Impl); \ }; \ Rhs rhs_; \ GTEST_DISALLOW_ASSIGN_(name##Matcher); \ } // Implements Eq(v), Ge(v), Gt(v), Le(v), Lt(v), and Ne(v) // respectively. GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Eq, ==, "is equal to", "isn't equal to"); GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Ge, >=, "is >=", "isn't >="); GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Gt, >, "is >", "isn't >"); GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Le, <=, "is <=", "isn't <="); GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Lt, <, "is <", "isn't <"); GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Ne, !=, "isn't equal to", "is equal to"); #undef GMOCK_IMPLEMENT_COMPARISON_MATCHER_ // Implements the polymorphic IsNull() matcher, which matches any raw or smart // pointer that is NULL. class IsNullMatcher { public: template bool MatchAndExplain(const Pointer& p, MatchResultListener* /* listener */) const { return GetRawPointer(p) == NULL; } void DescribeTo(::std::ostream* os) const { *os << "is NULL"; } void DescribeNegationTo(::std::ostream* os) const { *os << "isn't NULL"; } }; // Implements the polymorphic NotNull() matcher, which matches any raw or smart // pointer that is not NULL. class NotNullMatcher { public: template bool MatchAndExplain(const Pointer& p, MatchResultListener* /* listener */) const { return GetRawPointer(p) != NULL; } void DescribeTo(::std::ostream* os) const { *os << "isn't NULL"; } void DescribeNegationTo(::std::ostream* os) const { *os << "is NULL"; } }; // Ref(variable) matches any argument that is a reference to // 'variable'. This matcher is polymorphic as it can match any // super type of the type of 'variable'. // // The RefMatcher template class implements Ref(variable). It can // only be instantiated with a reference type. This prevents a user // from mistakenly using Ref(x) to match a non-reference function // argument. For example, the following will righteously cause a // compiler error: // // int n; // Matcher m1 = Ref(n); // This won't compile. // Matcher m2 = Ref(n); // This will compile. template class RefMatcher; template class RefMatcher { // Google Mock is a generic framework and thus needs to support // mocking any function types, including those that take non-const // reference arguments. Therefore the template parameter T (and // Super below) can be instantiated to either a const type or a // non-const type. public: // RefMatcher() takes a T& instead of const T&, as we want the // compiler to catch using Ref(const_value) as a matcher for a // non-const reference. explicit RefMatcher(T& x) : object_(x) {} // NOLINT template operator Matcher() const { // By passing object_ (type T&) to Impl(), which expects a Super&, // we make sure that Super is a super type of T. In particular, // this catches using Ref(const_value) as a matcher for a // non-const reference, as you cannot implicitly convert a const // reference to a non-const reference. return MakeMatcher(new Impl(object_)); } private: template class Impl : public MatcherInterface { public: explicit Impl(Super& x) : object_(x) {} // NOLINT // MatchAndExplain() takes a Super& (as opposed to const Super&) // in order to match the interface MatcherInterface. virtual bool MatchAndExplain( Super& x, MatchResultListener* listener) const { *listener << "which is located @" << static_cast(&x); return &x == &object_; } virtual void DescribeTo(::std::ostream* os) const { *os << "references the variable "; UniversalPrinter::Print(object_, os); } virtual void DescribeNegationTo(::std::ostream* os) const { *os << "does not reference the variable "; UniversalPrinter::Print(object_, os); } private: const Super& object_; GTEST_DISALLOW_ASSIGN_(Impl); }; T& object_; GTEST_DISALLOW_ASSIGN_(RefMatcher); }; // Polymorphic helper functions for narrow and wide string matchers. inline bool CaseInsensitiveCStringEquals(const char* lhs, const char* rhs) { return String::CaseInsensitiveCStringEquals(lhs, rhs); } inline bool CaseInsensitiveCStringEquals(const wchar_t* lhs, const wchar_t* rhs) { return String::CaseInsensitiveWideCStringEquals(lhs, rhs); } // String comparison for narrow or wide strings that can have embedded NUL // characters. template bool CaseInsensitiveStringEquals(const StringType& s1, const StringType& s2) { // Are the heads equal? if (!CaseInsensitiveCStringEquals(s1.c_str(), s2.c_str())) { return false; } // Skip the equal heads. const typename StringType::value_type nul = 0; const size_t i1 = s1.find(nul), i2 = s2.find(nul); // Are we at the end of either s1 or s2? if (i1 == StringType::npos || i2 == StringType::npos) { return i1 == i2; } // Are the tails equal? return CaseInsensitiveStringEquals(s1.substr(i1 + 1), s2.substr(i2 + 1)); } // String matchers. // Implements equality-based string matchers like StrEq, StrCaseNe, and etc. template class StrEqualityMatcher { public: typedef typename StringType::const_pointer ConstCharPointer; StrEqualityMatcher(const StringType& str, bool expect_eq, bool case_sensitive) : string_(str), expect_eq_(expect_eq), case_sensitive_(case_sensitive) {} // When expect_eq_ is true, returns true iff s is equal to string_; // otherwise returns true iff s is not equal to string_. bool MatchAndExplain(ConstCharPointer s, MatchResultListener* listener) const { if (s == NULL) { return !expect_eq_; } return MatchAndExplain(StringType(s), listener); } bool MatchAndExplain(const StringType& s, MatchResultListener* /* listener */) const { const bool eq = case_sensitive_ ? s == string_ : CaseInsensitiveStringEquals(s, string_); return expect_eq_ == eq; } void DescribeTo(::std::ostream* os) const { DescribeToHelper(expect_eq_, os); } void DescribeNegationTo(::std::ostream* os) const { DescribeToHelper(!expect_eq_, os); } private: void DescribeToHelper(bool expect_eq, ::std::ostream* os) const { *os << (expect_eq ? "is " : "isn't "); *os << "equal to "; if (!case_sensitive_) { *os << "(ignoring case) "; } UniversalPrinter::Print(string_, os); } const StringType string_; const bool expect_eq_; const bool case_sensitive_; GTEST_DISALLOW_ASSIGN_(StrEqualityMatcher); }; // Implements the polymorphic HasSubstr(substring) matcher, which // can be used as a Matcher as long as T can be converted to a // string. template class HasSubstrMatcher { public: typedef typename StringType::const_pointer ConstCharPointer; explicit HasSubstrMatcher(const StringType& substring) : substring_(substring) {} // These overloaded methods allow HasSubstr(substring) to be used as a // Matcher as long as T can be converted to string. Returns true // iff s contains substring_ as a substring. bool MatchAndExplain(ConstCharPointer s, MatchResultListener* listener) const { return s != NULL && MatchAndExplain(StringType(s), listener); } bool MatchAndExplain(const StringType& s, MatchResultListener* /* listener */) const { return s.find(substring_) != StringType::npos; } // Describes what this matcher matches. void DescribeTo(::std::ostream* os) const { *os << "has substring "; UniversalPrinter::Print(substring_, os); } void DescribeNegationTo(::std::ostream* os) const { *os << "has no substring "; UniversalPrinter::Print(substring_, os); } private: const StringType substring_; GTEST_DISALLOW_ASSIGN_(HasSubstrMatcher); }; // Implements the polymorphic StartsWith(substring) matcher, which // can be used as a Matcher as long as T can be converted to a // string. template class StartsWithMatcher { public: typedef typename StringType::const_pointer ConstCharPointer; explicit StartsWithMatcher(const StringType& prefix) : prefix_(prefix) { } // These overloaded methods allow StartsWith(prefix) to be used as a // Matcher as long as T can be converted to string. Returns true // iff s starts with prefix_. bool MatchAndExplain(ConstCharPointer s, MatchResultListener* listener) const { return s != NULL && MatchAndExplain(StringType(s), listener); } bool MatchAndExplain(const StringType& s, MatchResultListener* /* listener */) const { return s.length() >= prefix_.length() && s.substr(0, prefix_.length()) == prefix_; } void DescribeTo(::std::ostream* os) const { *os << "starts with "; UniversalPrinter::Print(prefix_, os); } void DescribeNegationTo(::std::ostream* os) const { *os << "doesn't start with "; UniversalPrinter::Print(prefix_, os); } private: const StringType prefix_; GTEST_DISALLOW_ASSIGN_(StartsWithMatcher); }; // Implements the polymorphic EndsWith(substring) matcher, which // can be used as a Matcher as long as T can be converted to a // string. template class EndsWithMatcher { public: typedef typename StringType::const_pointer ConstCharPointer; explicit EndsWithMatcher(const StringType& suffix) : suffix_(suffix) {} // These overloaded methods allow EndsWith(suffix) to be used as a // Matcher as long as T can be converted to string. Returns true // iff s ends with suffix_. bool MatchAndExplain(ConstCharPointer s, MatchResultListener* listener) const { return s != NULL && MatchAndExplain(StringType(s), listener); } bool MatchAndExplain(const StringType& s, MatchResultListener* /* listener */) const { return s.length() >= suffix_.length() && s.substr(s.length() - suffix_.length()) == suffix_; } void DescribeTo(::std::ostream* os) const { *os << "ends with "; UniversalPrinter::Print(suffix_, os); } void DescribeNegationTo(::std::ostream* os) const { *os << "doesn't end with "; UniversalPrinter::Print(suffix_, os); } private: const StringType suffix_; GTEST_DISALLOW_ASSIGN_(EndsWithMatcher); }; // Implements polymorphic matchers MatchesRegex(regex) and // ContainsRegex(regex), which can be used as a Matcher as long as // T can be converted to a string. class MatchesRegexMatcher { public: MatchesRegexMatcher(const RE* regex, bool full_match) : regex_(regex), full_match_(full_match) {} // These overloaded methods allow MatchesRegex(regex) to be used as // a Matcher as long as T can be converted to string. Returns // true iff s matches regular expression regex. When full_match_ is // true, a full match is done; otherwise a partial match is done. bool MatchAndExplain(const char* s, MatchResultListener* listener) const { return s != NULL && MatchAndExplain(internal::string(s), listener); } bool MatchAndExplain(const internal::string& s, MatchResultListener* /* listener */) const { return full_match_ ? RE::FullMatch(s, *regex_) : RE::PartialMatch(s, *regex_); } void DescribeTo(::std::ostream* os) const { *os << (full_match_ ? "matches" : "contains") << " regular expression "; UniversalPrinter::Print(regex_->pattern(), os); } void DescribeNegationTo(::std::ostream* os) const { *os << "doesn't " << (full_match_ ? "match" : "contain") << " regular expression "; UniversalPrinter::Print(regex_->pattern(), os); } private: const internal::linked_ptr regex_; const bool full_match_; GTEST_DISALLOW_ASSIGN_(MatchesRegexMatcher); }; // Implements a matcher that compares the two fields of a 2-tuple // using one of the ==, <=, <, etc, operators. The two fields being // compared don't have to have the same type. // // The matcher defined here is polymorphic (for example, Eq() can be // used to match a tuple, a tuple, // etc). Therefore we use a template type conversion operator in the // implementation. // // We define this as a macro in order to eliminate duplicated source // code. #define GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(name, op) \ class name##2Matcher { \ public: \ template \ operator Matcher&>() const { \ return MakeMatcher(new Impl); \ } \ private: \ template \ class Impl : public MatcherInterface&> { \ public: \ virtual bool MatchAndExplain( \ const ::std::tr1::tuple& args, \ MatchResultListener* /* listener */) const { \ return ::std::tr1::get<0>(args) op ::std::tr1::get<1>(args); \ } \ virtual void DescribeTo(::std::ostream* os) const { \ *os << "are a pair (x, y) where x " #op " y"; \ } \ virtual void DescribeNegationTo(::std::ostream* os) const { \ *os << "are a pair (x, y) where x " #op " y is false"; \ } \ }; \ } // Implements Eq(), Ge(), Gt(), Le(), Lt(), and Ne() respectively. GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Eq, ==); GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Ge, >=); GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Gt, >); GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Le, <=); GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Lt, <); GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Ne, !=); #undef GMOCK_IMPLEMENT_COMPARISON2_MATCHER_ // Implements the Not(...) matcher for a particular argument type T. // We do not nest it inside the NotMatcher class template, as that // will prevent different instantiations of NotMatcher from sharing // the same NotMatcherImpl class. template class NotMatcherImpl : public MatcherInterface { public: explicit NotMatcherImpl(const Matcher& matcher) : matcher_(matcher) {} virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { return !matcher_.MatchAndExplain(x, listener); } virtual void DescribeTo(::std::ostream* os) const { matcher_.DescribeNegationTo(os); } virtual void DescribeNegationTo(::std::ostream* os) const { matcher_.DescribeTo(os); } private: const Matcher matcher_; GTEST_DISALLOW_ASSIGN_(NotMatcherImpl); }; // Implements the Not(m) matcher, which matches a value that doesn't // match matcher m. template class NotMatcher { public: explicit NotMatcher(InnerMatcher matcher) : matcher_(matcher) {} // This template type conversion operator allows Not(m) to be used // to match any type m can match. template operator Matcher() const { return Matcher(new NotMatcherImpl(SafeMatcherCast(matcher_))); } private: InnerMatcher matcher_; GTEST_DISALLOW_ASSIGN_(NotMatcher); }; // Implements the AllOf(m1, m2) matcher for a particular argument type // T. We do not nest it inside the BothOfMatcher class template, as // that will prevent different instantiations of BothOfMatcher from // sharing the same BothOfMatcherImpl class. template class BothOfMatcherImpl : public MatcherInterface { public: BothOfMatcherImpl(const Matcher& matcher1, const Matcher& matcher2) : matcher1_(matcher1), matcher2_(matcher2) {} virtual void DescribeTo(::std::ostream* os) const { *os << "("; matcher1_.DescribeTo(os); *os << ") and ("; matcher2_.DescribeTo(os); *os << ")"; } virtual void DescribeNegationTo(::std::ostream* os) const { *os << "("; matcher1_.DescribeNegationTo(os); *os << ") or ("; matcher2_.DescribeNegationTo(os); *os << ")"; } virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { // If either matcher1_ or matcher2_ doesn't match x, we only need // to explain why one of them fails. StringMatchResultListener listener1; if (!matcher1_.MatchAndExplain(x, &listener1)) { *listener << listener1.str(); return false; } StringMatchResultListener listener2; if (!matcher2_.MatchAndExplain(x, &listener2)) { *listener << listener2.str(); return false; } // Otherwise we need to explain why *both* of them match. const internal::string s1 = listener1.str(); const internal::string s2 = listener2.str(); if (s1 == "") { *listener << s2; } else { *listener << s1; if (s2 != "") { *listener << ", and " << s2; } } return true; } private: const Matcher matcher1_; const Matcher matcher2_; GTEST_DISALLOW_ASSIGN_(BothOfMatcherImpl); }; // Used for implementing the AllOf(m_1, ..., m_n) matcher, which // matches a value that matches all of the matchers m_1, ..., and m_n. template class BothOfMatcher { public: BothOfMatcher(Matcher1 matcher1, Matcher2 matcher2) : matcher1_(matcher1), matcher2_(matcher2) {} // This template type conversion operator allows a // BothOfMatcher object to match any type that // both Matcher1 and Matcher2 can match. template operator Matcher() const { return Matcher(new BothOfMatcherImpl(SafeMatcherCast(matcher1_), SafeMatcherCast(matcher2_))); } private: Matcher1 matcher1_; Matcher2 matcher2_; GTEST_DISALLOW_ASSIGN_(BothOfMatcher); }; // Implements the AnyOf(m1, m2) matcher for a particular argument type // T. We do not nest it inside the AnyOfMatcher class template, as // that will prevent different instantiations of AnyOfMatcher from // sharing the same EitherOfMatcherImpl class. template class EitherOfMatcherImpl : public MatcherInterface { public: EitherOfMatcherImpl(const Matcher& matcher1, const Matcher& matcher2) : matcher1_(matcher1), matcher2_(matcher2) {} virtual void DescribeTo(::std::ostream* os) const { *os << "("; matcher1_.DescribeTo(os); *os << ") or ("; matcher2_.DescribeTo(os); *os << ")"; } virtual void DescribeNegationTo(::std::ostream* os) const { *os << "("; matcher1_.DescribeNegationTo(os); *os << ") and ("; matcher2_.DescribeNegationTo(os); *os << ")"; } virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { // If either matcher1_ or matcher2_ matches x, we just need to // explain why *one* of them matches. StringMatchResultListener listener1; if (matcher1_.MatchAndExplain(x, &listener1)) { *listener << listener1.str(); return true; } StringMatchResultListener listener2; if (matcher2_.MatchAndExplain(x, &listener2)) { *listener << listener2.str(); return true; } // Otherwise we need to explain why *both* of them fail. const internal::string s1 = listener1.str(); const internal::string s2 = listener2.str(); if (s1 == "") { *listener << s2; } else { *listener << s1; if (s2 != "") { *listener << ", and " << s2; } } return false; } private: const Matcher matcher1_; const Matcher matcher2_; GTEST_DISALLOW_ASSIGN_(EitherOfMatcherImpl); }; // Used for implementing the AnyOf(m_1, ..., m_n) matcher, which // matches a value that matches at least one of the matchers m_1, ..., // and m_n. template class EitherOfMatcher { public: EitherOfMatcher(Matcher1 matcher1, Matcher2 matcher2) : matcher1_(matcher1), matcher2_(matcher2) {} // This template type conversion operator allows a // EitherOfMatcher object to match any type that // both Matcher1 and Matcher2 can match. template operator Matcher() const { return Matcher(new EitherOfMatcherImpl( SafeMatcherCast(matcher1_), SafeMatcherCast(matcher2_))); } private: Matcher1 matcher1_; Matcher2 matcher2_; GTEST_DISALLOW_ASSIGN_(EitherOfMatcher); }; // Used for implementing Truly(pred), which turns a predicate into a // matcher. template class TrulyMatcher { public: explicit TrulyMatcher(Predicate pred) : predicate_(pred) {} // This method template allows Truly(pred) to be used as a matcher // for type T where T is the argument type of predicate 'pred'. The // argument is passed by reference as the predicate may be // interested in the address of the argument. template bool MatchAndExplain(T& x, // NOLINT MatchResultListener* /* listener */) const { #if GTEST_OS_WINDOWS // MSVC warns about converting a value into bool (warning 4800). #pragma warning(push) // Saves the current warning state. #pragma warning(disable:4800) // Temporarily disables warning 4800. #endif // GTEST_OS_WINDOWS return predicate_(x); #if GTEST_OS_WINDOWS #pragma warning(pop) // Restores the warning state. #endif // GTEST_OS_WINDOWS } void DescribeTo(::std::ostream* os) const { *os << "satisfies the given predicate"; } void DescribeNegationTo(::std::ostream* os) const { *os << "doesn't satisfy the given predicate"; } private: Predicate predicate_; GTEST_DISALLOW_ASSIGN_(TrulyMatcher); }; // Used for implementing Matches(matcher), which turns a matcher into // a predicate. template class MatcherAsPredicate { public: explicit MatcherAsPredicate(M matcher) : matcher_(matcher) {} // This template operator() allows Matches(m) to be used as a // predicate on type T where m is a matcher on type T. // // The argument x is passed by reference instead of by value, as // some matcher may be interested in its address (e.g. as in // Matches(Ref(n))(x)). template bool operator()(const T& x) const { // We let matcher_ commit to a particular type here instead of // when the MatcherAsPredicate object was constructed. This // allows us to write Matches(m) where m is a polymorphic matcher // (e.g. Eq(5)). // // If we write Matcher(matcher_).Matches(x) here, it won't // compile when matcher_ has type Matcher; if we write // Matcher(matcher_).Matches(x) here, it won't compile // when matcher_ has type Matcher; if we just write // matcher_.Matches(x), it won't compile when matcher_ is // polymorphic, e.g. Eq(5). // // MatcherCast() is necessary for making the code work // in all of the above situations. return MatcherCast(matcher_).Matches(x); } private: M matcher_; GTEST_DISALLOW_ASSIGN_(MatcherAsPredicate); }; // For implementing ASSERT_THAT() and EXPECT_THAT(). The template // argument M must be a type that can be converted to a matcher. template class PredicateFormatterFromMatcher { public: explicit PredicateFormatterFromMatcher(const M& m) : matcher_(m) {} // This template () operator allows a PredicateFormatterFromMatcher // object to act as a predicate-formatter suitable for using with // Google Test's EXPECT_PRED_FORMAT1() macro. template AssertionResult operator()(const char* value_text, const T& x) const { // We convert matcher_ to a Matcher *now* instead of // when the PredicateFormatterFromMatcher object was constructed, // as matcher_ may be polymorphic (e.g. NotNull()) and we won't // know which type to instantiate it to until we actually see the // type of x here. // // We write MatcherCast(matcher_) instead of // Matcher(matcher_), as the latter won't compile when // matcher_ has type Matcher (e.g. An()). const Matcher matcher = MatcherCast(matcher_); StringMatchResultListener listener; if (MatchPrintAndExplain(x, matcher, &listener)) return AssertionSuccess(); ::std::stringstream ss; ss << "Value of: " << value_text << "\n" << "Expected: "; matcher.DescribeTo(&ss); ss << "\n Actual: " << listener.str(); return AssertionFailure() << ss.str(); } private: const M matcher_; GTEST_DISALLOW_ASSIGN_(PredicateFormatterFromMatcher); }; // A helper function for converting a matcher to a predicate-formatter // without the user needing to explicitly write the type. This is // used for implementing ASSERT_THAT() and EXPECT_THAT(). template inline PredicateFormatterFromMatcher MakePredicateFormatterFromMatcher(const M& matcher) { return PredicateFormatterFromMatcher(matcher); } // Implements the polymorphic floating point equality matcher, which // matches two float values using ULP-based approximation. The // template is meant to be instantiated with FloatType being either // float or double. template class FloatingEqMatcher { public: // Constructor for FloatingEqMatcher. // The matcher's input will be compared with rhs. The matcher treats two // NANs as equal if nan_eq_nan is true. Otherwise, under IEEE standards, // equality comparisons between NANs will always return false. FloatingEqMatcher(FloatType rhs, bool nan_eq_nan) : rhs_(rhs), nan_eq_nan_(nan_eq_nan) {} // Implements floating point equality matcher as a Matcher. template class Impl : public MatcherInterface { public: Impl(FloatType rhs, bool nan_eq_nan) : rhs_(rhs), nan_eq_nan_(nan_eq_nan) {} virtual bool MatchAndExplain(T value, MatchResultListener* /* listener */) const { const FloatingPoint lhs(value), rhs(rhs_); // Compares NaNs first, if nan_eq_nan_ is true. if (nan_eq_nan_ && lhs.is_nan()) { return rhs.is_nan(); } return lhs.AlmostEquals(rhs); } virtual void DescribeTo(::std::ostream* os) const { // os->precision() returns the previously set precision, which we // store to restore the ostream to its original configuration // after outputting. const ::std::streamsize old_precision = os->precision( ::std::numeric_limits::digits10 + 2); if (FloatingPoint(rhs_).is_nan()) { if (nan_eq_nan_) { *os << "is NaN"; } else { *os << "never matches"; } } else { *os << "is approximately " << rhs_; } os->precision(old_precision); } virtual void DescribeNegationTo(::std::ostream* os) const { // As before, get original precision. const ::std::streamsize old_precision = os->precision( ::std::numeric_limits::digits10 + 2); if (FloatingPoint(rhs_).is_nan()) { if (nan_eq_nan_) { *os << "isn't NaN"; } else { *os << "is anything"; } } else { *os << "isn't approximately " << rhs_; } // Restore original precision. os->precision(old_precision); } private: const FloatType rhs_; const bool nan_eq_nan_; GTEST_DISALLOW_ASSIGN_(Impl); }; // The following 3 type conversion operators allow FloatEq(rhs) and // NanSensitiveFloatEq(rhs) to be used as a Matcher, a // Matcher, or a Matcher, but nothing else. // (While Google's C++ coding style doesn't allow arguments passed // by non-const reference, we may see them in code not conforming to // the style. Therefore Google Mock needs to support them.) operator Matcher() const { return MakeMatcher(new Impl(rhs_, nan_eq_nan_)); } operator Matcher() const { return MakeMatcher(new Impl(rhs_, nan_eq_nan_)); } operator Matcher() const { return MakeMatcher(new Impl(rhs_, nan_eq_nan_)); } private: const FloatType rhs_; const bool nan_eq_nan_; GTEST_DISALLOW_ASSIGN_(FloatingEqMatcher); }; // Implements the Pointee(m) matcher for matching a pointer whose // pointee matches matcher m. The pointer can be either raw or smart. template class PointeeMatcher { public: explicit PointeeMatcher(const InnerMatcher& matcher) : matcher_(matcher) {} // This type conversion operator template allows Pointee(m) to be // used as a matcher for any pointer type whose pointee type is // compatible with the inner matcher, where type Pointer can be // either a raw pointer or a smart pointer. // // The reason we do this instead of relying on // MakePolymorphicMatcher() is that the latter is not flexible // enough for implementing the DescribeTo() method of Pointee(). template operator Matcher() const { return MakeMatcher(new Impl(matcher_)); } private: // The monomorphic implementation that works for a particular pointer type. template class Impl : public MatcherInterface { public: typedef typename PointeeOf::type Pointee; explicit Impl(const InnerMatcher& matcher) : matcher_(MatcherCast(matcher)) {} virtual void DescribeTo(::std::ostream* os) const { *os << "points to a value that "; matcher_.DescribeTo(os); } virtual void DescribeNegationTo(::std::ostream* os) const { *os << "does not point to a value that "; matcher_.DescribeTo(os); } virtual bool MatchAndExplain(Pointer pointer, MatchResultListener* listener) const { if (GetRawPointer(pointer) == NULL) return false; *listener << "which points to "; return MatchPrintAndExplain(*pointer, matcher_, listener); } private: const Matcher matcher_; GTEST_DISALLOW_ASSIGN_(Impl); }; const InnerMatcher matcher_; GTEST_DISALLOW_ASSIGN_(PointeeMatcher); }; // Implements the Field() matcher for matching a field (i.e. member // variable) of an object. template class FieldMatcher { public: FieldMatcher(FieldType Class::*field, const Matcher& matcher) : field_(field), matcher_(matcher) {} void DescribeTo(::std::ostream* os) const { *os << "is an object whose given field "; matcher_.DescribeTo(os); } void DescribeNegationTo(::std::ostream* os) const { *os << "is an object whose given field "; matcher_.DescribeNegationTo(os); } template bool MatchAndExplain(const T& value, MatchResultListener* listener) const { return MatchAndExplainImpl( typename ::testing::internal:: is_pointer::type(), value, listener); } private: // The first argument of MatchAndExplainImpl() is needed to help // Symbian's C++ compiler choose which overload to use. Its type is // true_type iff the Field() matcher is used to match a pointer. bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj, MatchResultListener* listener) const { *listener << "whose given field is "; return MatchPrintAndExplain(obj.*field_, matcher_, listener); } bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p, MatchResultListener* listener) const { if (p == NULL) return false; *listener << "which points to an object "; // Since *p has a field, it must be a class/struct/union type and // thus cannot be a pointer. Therefore we pass false_type() as // the first argument. return MatchAndExplainImpl(false_type(), *p, listener); } const FieldType Class::*field_; const Matcher matcher_; GTEST_DISALLOW_ASSIGN_(FieldMatcher); }; // Implements the Property() matcher for matching a property // (i.e. return value of a getter method) of an object. template class PropertyMatcher { public: // The property may have a reference type, so 'const PropertyType&' // may cause double references and fail to compile. That's why we // need GMOCK_REFERENCE_TO_CONST, which works regardless of // PropertyType being a reference or not. typedef GMOCK_REFERENCE_TO_CONST_(PropertyType) RefToConstProperty; PropertyMatcher(PropertyType (Class::*property)() const, const Matcher& matcher) : property_(property), matcher_(matcher) {} void DescribeTo(::std::ostream* os) const { *os << "is an object whose given property "; matcher_.DescribeTo(os); } void DescribeNegationTo(::std::ostream* os) const { *os << "is an object whose given property "; matcher_.DescribeNegationTo(os); } template bool MatchAndExplain(const T&value, MatchResultListener* listener) const { return MatchAndExplainImpl( typename ::testing::internal:: is_pointer::type(), value, listener); } private: // The first argument of MatchAndExplainImpl() is needed to help // Symbian's C++ compiler choose which overload to use. Its type is // true_type iff the Property() matcher is used to match a pointer. bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj, MatchResultListener* listener) const { *listener << "whose given property is "; // Cannot pass the return value (for example, int) to MatchPrintAndExplain, // which takes a non-const reference as argument. RefToConstProperty result = (obj.*property_)(); return MatchPrintAndExplain(result, matcher_, listener); } bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p, MatchResultListener* listener) const { if (p == NULL) return false; *listener << "which points to an object "; // Since *p has a property method, it must be a class/struct/union // type and thus cannot be a pointer. Therefore we pass // false_type() as the first argument. return MatchAndExplainImpl(false_type(), *p, listener); } PropertyType (Class::*property_)() const; const Matcher matcher_; GTEST_DISALLOW_ASSIGN_(PropertyMatcher); }; // Type traits specifying various features of different functors for ResultOf. // The default template specifies features for functor objects. // Functor classes have to typedef argument_type and result_type // to be compatible with ResultOf. template struct CallableTraits { typedef typename Functor::result_type ResultType; typedef Functor StorageType; static void CheckIsValid(Functor /* functor */) {} template static ResultType Invoke(Functor f, T arg) { return f(arg); } }; // Specialization for function pointers. template struct CallableTraits { typedef ResType ResultType; typedef ResType(*StorageType)(ArgType); static void CheckIsValid(ResType(*f)(ArgType)) { GTEST_CHECK_(f != NULL) << "NULL function pointer is passed into ResultOf()."; } template static ResType Invoke(ResType(*f)(ArgType), T arg) { return (*f)(arg); } }; // Implements the ResultOf() matcher for matching a return value of a // unary function of an object. template class ResultOfMatcher { public: typedef typename CallableTraits::ResultType ResultType; ResultOfMatcher(Callable callable, const Matcher& matcher) : callable_(callable), matcher_(matcher) { CallableTraits::CheckIsValid(callable_); } template operator Matcher() const { return Matcher(new Impl(callable_, matcher_)); } private: typedef typename CallableTraits::StorageType CallableStorageType; template class Impl : public MatcherInterface { public: Impl(CallableStorageType callable, const Matcher& matcher) : callable_(callable), matcher_(matcher) {} virtual void DescribeTo(::std::ostream* os) const { *os << "is mapped by the given callable to a value that "; matcher_.DescribeTo(os); } virtual void DescribeNegationTo(::std::ostream* os) const { *os << "is mapped by the given callable to a value that "; matcher_.DescribeNegationTo(os); } virtual bool MatchAndExplain(T obj, MatchResultListener* listener) const { *listener << "which is mapped by the given callable to "; // Cannot pass the return value (for example, int) to // MatchPrintAndExplain, which takes a non-const reference as argument. ResultType result = CallableTraits::template Invoke(callable_, obj); return MatchPrintAndExplain(result, matcher_, listener); } private: // Functors often define operator() as non-const method even though // they are actualy stateless. But we need to use them even when // 'this' is a const pointer. It's the user's responsibility not to // use stateful callables with ResultOf(), which does't guarantee // how many times the callable will be invoked. mutable CallableStorageType callable_; const Matcher matcher_; GTEST_DISALLOW_ASSIGN_(Impl); }; // class Impl const CallableStorageType callable_; const Matcher matcher_; GTEST_DISALLOW_ASSIGN_(ResultOfMatcher); }; // Implements an equality matcher for any STL-style container whose elements // support ==. This matcher is like Eq(), but its failure explanations provide // more detailed information that is useful when the container is used as a set. // The failure message reports elements that are in one of the operands but not // the other. The failure messages do not report duplicate or out-of-order // elements in the containers (which don't properly matter to sets, but can // occur if the containers are vectors or lists, for example). // // Uses the container's const_iterator, value_type, operator ==, // begin(), and end(). template class ContainerEqMatcher { public: typedef internal::StlContainerView View; typedef typename View::type StlContainer; typedef typename View::const_reference StlContainerReference; // We make a copy of rhs in case the elements in it are modified // after this matcher is created. explicit ContainerEqMatcher(const Container& rhs) : rhs_(View::Copy(rhs)) { // Makes sure the user doesn't instantiate this class template // with a const or reference type. testing::StaticAssertTypeEq(); } void DescribeTo(::std::ostream* os) const { *os << "equals "; UniversalPrinter::Print(rhs_, os); } void DescribeNegationTo(::std::ostream* os) const { *os << "does not equal "; UniversalPrinter::Print(rhs_, os); } template bool MatchAndExplain(const LhsContainer& lhs, MatchResultListener* listener) const { // GMOCK_REMOVE_CONST_() is needed to work around an MSVC 8.0 bug // that causes LhsContainer to be a const type sometimes. typedef internal::StlContainerView LhsView; typedef typename LhsView::type LhsStlContainer; StlContainerReference lhs_stl_container = LhsView::ConstReference(lhs); if (lhs_stl_container == rhs_) return true; ::std::ostream* const os = listener->stream(); if (os != NULL) { // Something is different. Check for extra values first. bool printed_header = false; for (typename LhsStlContainer::const_iterator it = lhs_stl_container.begin(); it != lhs_stl_container.end(); ++it) { if (internal::ArrayAwareFind(rhs_.begin(), rhs_.end(), *it) == rhs_.end()) { if (printed_header) { *os << ", "; } else { *os << "which has these unexpected elements: "; printed_header = true; } UniversalPrinter:: Print(*it, os); } } // Now check for missing values. bool printed_header2 = false; for (typename StlContainer::const_iterator it = rhs_.begin(); it != rhs_.end(); ++it) { if (internal::ArrayAwareFind( lhs_stl_container.begin(), lhs_stl_container.end(), *it) == lhs_stl_container.end()) { if (printed_header2) { *os << ", "; } else { *os << (printed_header ? ",\nand" : "which") << " doesn't have these expected elements: "; printed_header2 = true; } UniversalPrinter::Print(*it, os); } } } return false; } private: const StlContainer rhs_; GTEST_DISALLOW_ASSIGN_(ContainerEqMatcher); }; // Implements Contains(element_matcher) for the given argument type Container. template class ContainsMatcherImpl : public MatcherInterface { public: typedef GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(Container)) RawContainer; typedef StlContainerView View; typedef typename View::type StlContainer; typedef typename View::const_reference StlContainerReference; typedef typename StlContainer::value_type Element; template explicit ContainsMatcherImpl(InnerMatcher inner_matcher) : inner_matcher_( testing::SafeMatcherCast(inner_matcher)) {} // Describes what this matcher does. virtual void DescribeTo(::std::ostream* os) const { *os << "contains at least one element that "; inner_matcher_.DescribeTo(os); } // Describes what the negation of this matcher does. virtual void DescribeNegationTo(::std::ostream* os) const { *os << "doesn't contain any element that "; inner_matcher_.DescribeTo(os); } virtual bool MatchAndExplain(Container container, MatchResultListener* listener) const { StlContainerReference stl_container = View::ConstReference(container); size_t i = 0; for (typename StlContainer::const_iterator it = stl_container.begin(); it != stl_container.end(); ++it, ++i) { StringMatchResultListener inner_listener; if (inner_matcher_.MatchAndExplain(*it, &inner_listener)) { *listener << "whose element #" << i << " matches"; PrintIfNotEmpty(inner_listener.str(), listener->stream()); return true; } } return false; } private: const Matcher inner_matcher_; GTEST_DISALLOW_ASSIGN_(ContainsMatcherImpl); }; // Implements polymorphic Contains(element_matcher). template class ContainsMatcher { public: explicit ContainsMatcher(M m) : inner_matcher_(m) {} template operator Matcher() const { return MakeMatcher(new ContainsMatcherImpl(inner_matcher_)); } private: const M inner_matcher_; GTEST_DISALLOW_ASSIGN_(ContainsMatcher); }; // Implements Key(inner_matcher) for the given argument pair type. // Key(inner_matcher) matches an std::pair whose 'first' field matches // inner_matcher. For example, Contains(Key(Ge(5))) can be used to match an // std::map that contains at least one element whose key is >= 5. template class KeyMatcherImpl : public MatcherInterface { public: typedef GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(PairType)) RawPairType; typedef typename RawPairType::first_type KeyType; template explicit KeyMatcherImpl(InnerMatcher inner_matcher) : inner_matcher_( testing::SafeMatcherCast(inner_matcher)) { } // Returns true iff 'key_value.first' (the key) matches the inner matcher. virtual bool MatchAndExplain(PairType key_value, MatchResultListener* listener) const { StringMatchResultListener inner_listener; const bool match = inner_matcher_.MatchAndExplain(key_value.first, &inner_listener); const internal::string explanation = inner_listener.str(); if (explanation != "") { *listener << "whose first field is a value " << explanation; } return match; } // Describes what this matcher does. virtual void DescribeTo(::std::ostream* os) const { *os << "has a key that "; inner_matcher_.DescribeTo(os); } // Describes what the negation of this matcher does. virtual void DescribeNegationTo(::std::ostream* os) const { *os << "doesn't have a key that "; inner_matcher_.DescribeTo(os); } private: const Matcher inner_matcher_; GTEST_DISALLOW_ASSIGN_(KeyMatcherImpl); }; // Implements polymorphic Key(matcher_for_key). template class KeyMatcher { public: explicit KeyMatcher(M m) : matcher_for_key_(m) {} template operator Matcher() const { return MakeMatcher(new KeyMatcherImpl(matcher_for_key_)); } private: const M matcher_for_key_; GTEST_DISALLOW_ASSIGN_(KeyMatcher); }; // Implements Pair(first_matcher, second_matcher) for the given argument pair // type with its two matchers. See Pair() function below. template class PairMatcherImpl : public MatcherInterface { public: typedef GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(PairType)) RawPairType; typedef typename RawPairType::first_type FirstType; typedef typename RawPairType::second_type SecondType; template PairMatcherImpl(FirstMatcher first_matcher, SecondMatcher second_matcher) : first_matcher_( testing::SafeMatcherCast(first_matcher)), second_matcher_( testing::SafeMatcherCast(second_matcher)) { } // Describes what this matcher does. virtual void DescribeTo(::std::ostream* os) const { *os << "has a first field that "; first_matcher_.DescribeTo(os); *os << ", and has a second field that "; second_matcher_.DescribeTo(os); } // Describes what the negation of this matcher does. virtual void DescribeNegationTo(::std::ostream* os) const { *os << "has a first field that "; first_matcher_.DescribeNegationTo(os); *os << ", or has a second field that "; second_matcher_.DescribeNegationTo(os); } // Returns true iff 'a_pair.first' matches first_matcher and 'a_pair.second' // matches second_matcher. virtual bool MatchAndExplain(PairType a_pair, MatchResultListener* listener) const { if (!listener->IsInterested()) { // If the listener is not interested, we don't need to construct the // explanation. return first_matcher_.Matches(a_pair.first) && second_matcher_.Matches(a_pair.second); } StringMatchResultListener first_inner_listener; if (!first_matcher_.MatchAndExplain(a_pair.first, &first_inner_listener)) { *listener << "whose first field does not match"; PrintIfNotEmpty(first_inner_listener.str(), listener->stream()); return false; } StringMatchResultListener second_inner_listener; if (!second_matcher_.MatchAndExplain(a_pair.second, &second_inner_listener)) { *listener << "whose second field does not match"; PrintIfNotEmpty(second_inner_listener.str(), listener->stream()); return false; } ExplainSuccess(first_inner_listener.str(), second_inner_listener.str(), listener); return true; } private: void ExplainSuccess(const internal::string& first_explanation, const internal::string& second_explanation, MatchResultListener* listener) const { *listener << "whose both fields match"; if (first_explanation != "") { *listener << ", where the first field is a value " << first_explanation; } if (second_explanation != "") { *listener << ", "; if (first_explanation != "") { *listener << "and "; } else { *listener << "where "; } *listener << "the second field is a value " << second_explanation; } } const Matcher first_matcher_; const Matcher second_matcher_; GTEST_DISALLOW_ASSIGN_(PairMatcherImpl); }; // Implements polymorphic Pair(first_matcher, second_matcher). template class PairMatcher { public: PairMatcher(FirstMatcher first_matcher, SecondMatcher second_matcher) : first_matcher_(first_matcher), second_matcher_(second_matcher) {} template operator Matcher () const { return MakeMatcher( new PairMatcherImpl( first_matcher_, second_matcher_)); } private: const FirstMatcher first_matcher_; const SecondMatcher second_matcher_; GTEST_DISALLOW_ASSIGN_(PairMatcher); }; // Implements ElementsAre() and ElementsAreArray(). template class ElementsAreMatcherImpl : public MatcherInterface { public: typedef GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(Container)) RawContainer; typedef internal::StlContainerView View; typedef typename View::type StlContainer; typedef typename View::const_reference StlContainerReference; typedef typename StlContainer::value_type Element; // Constructs the matcher from a sequence of element values or // element matchers. template ElementsAreMatcherImpl(InputIter first, size_t a_count) { matchers_.reserve(a_count); InputIter it = first; for (size_t i = 0; i != a_count; ++i, ++it) { matchers_.push_back(MatcherCast(*it)); } } // Describes what this matcher does. virtual void DescribeTo(::std::ostream* os) const { if (count() == 0) { *os << "is empty"; } else if (count() == 1) { *os << "has 1 element that "; matchers_[0].DescribeTo(os); } else { *os << "has " << Elements(count()) << " where\n"; for (size_t i = 0; i != count(); ++i) { *os << "element #" << i << " "; matchers_[i].DescribeTo(os); if (i + 1 < count()) { *os << ",\n"; } } } } // Describes what the negation of this matcher does. virtual void DescribeNegationTo(::std::ostream* os) const { if (count() == 0) { *os << "isn't empty"; return; } *os << "doesn't have " << Elements(count()) << ", or\n"; for (size_t i = 0; i != count(); ++i) { *os << "element #" << i << " "; matchers_[i].DescribeNegationTo(os); if (i + 1 < count()) { *os << ", or\n"; } } } virtual bool MatchAndExplain(Container container, MatchResultListener* listener) const { StlContainerReference stl_container = View::ConstReference(container); const size_t actual_count = stl_container.size(); if (actual_count != count()) { // The element count doesn't match. If the container is empty, // there's no need to explain anything as Google Mock already // prints the empty container. Otherwise we just need to show // how many elements there actually are. if (actual_count != 0) { *listener << "which has " << Elements(actual_count); } return false; } typename StlContainer::const_iterator it = stl_container.begin(); // explanations[i] is the explanation of the element at index i. std::vector explanations(count()); for (size_t i = 0; i != count(); ++it, ++i) { StringMatchResultListener s; if (matchers_[i].MatchAndExplain(*it, &s)) { explanations[i] = s.str(); } else { // The container has the right size but the i-th element // doesn't match its expectation. *listener << "whose element #" << i << " doesn't match"; PrintIfNotEmpty(s.str(), listener->stream()); return false; } } // Every element matches its expectation. We need to explain why // (the obvious ones can be skipped). bool reason_printed = false; for (size_t i = 0; i != count(); ++i) { const internal::string& s = explanations[i]; if (!s.empty()) { if (reason_printed) { *listener << ",\nand "; } *listener << "whose element #" << i << " matches, " << s; reason_printed = true; } } return true; } private: static Message Elements(size_t count) { return Message() << count << (count == 1 ? " element" : " elements"); } size_t count() const { return matchers_.size(); } std::vector > matchers_; GTEST_DISALLOW_ASSIGN_(ElementsAreMatcherImpl); }; // Implements ElementsAre() of 0 arguments. class ElementsAreMatcher0 { public: ElementsAreMatcher0() {} template operator Matcher() const { typedef GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(Container)) RawContainer; typedef typename internal::StlContainerView::type::value_type Element; const Matcher* const matchers = NULL; return MakeMatcher(new ElementsAreMatcherImpl(matchers, 0)); } }; // Implements ElementsAreArray(). template class ElementsAreArrayMatcher { public: ElementsAreArrayMatcher(const T* first, size_t count) : first_(first), count_(count) {} template operator Matcher() const { typedef GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(Container)) RawContainer; typedef typename internal::StlContainerView::type::value_type Element; return MakeMatcher(new ElementsAreMatcherImpl(first_, count_)); } private: const T* const first_; const size_t count_; GTEST_DISALLOW_ASSIGN_(ElementsAreArrayMatcher); }; // Constants denoting interpolations in a matcher description string. const int kTupleInterpolation = -1; // "%(*)s" const int kPercentInterpolation = -2; // "%%" const int kInvalidInterpolation = -3; // "%" followed by invalid text // Records the location and content of an interpolation. struct Interpolation { Interpolation(const char* start, const char* end, int param) : start_pos(start), end_pos(end), param_index(param) {} // Points to the start of the interpolation (the '%' character). const char* start_pos; // Points to the first character after the interpolation. const char* end_pos; // 0-based index of the interpolated matcher parameter; // kTupleInterpolation for "%(*)s"; kPercentInterpolation for "%%". int param_index; }; typedef ::std::vector Interpolations; // Parses a matcher description string and returns a vector of // interpolations that appear in the string; generates non-fatal // failures iff 'description' is an invalid matcher description. // 'param_names' is a NULL-terminated array of parameter names in the // order they appear in the MATCHER_P*() parameter list. Interpolations ValidateMatcherDescription( const char* param_names[], const char* description); // Returns the actual matcher description, given the matcher name, // user-supplied description template string, interpolations in the // string, and the printed values of the matcher parameters. string FormatMatcherDescription( const char* matcher_name, const char* description, const Interpolations& interp, const Strings& param_values); } // namespace internal // Implements MatcherCast(). template inline Matcher MatcherCast(M matcher) { return internal::MatcherCastImpl::Cast(matcher); } // _ is a matcher that matches anything of any type. // // This definition is fine as: // // 1. The C++ standard permits using the name _ in a namespace that // is not the global namespace or ::std. // 2. The AnythingMatcher class has no data member or constructor, // so it's OK to create global variables of this type. // 3. c-style has approved of using _ in this case. const internal::AnythingMatcher _ = {}; // Creates a matcher that matches any value of the given type T. template inline Matcher A() { return MakeMatcher(new internal::AnyMatcherImpl()); } // Creates a matcher that matches any value of the given type T. template inline Matcher An() { return A(); } // Creates a polymorphic matcher that matches anything equal to x. // Note: if the parameter of Eq() were declared as const T&, Eq("foo") // wouldn't compile. template inline internal::EqMatcher Eq(T x) { return internal::EqMatcher(x); } // Constructs a Matcher from a 'value' of type T. The constructed // matcher matches any value that's equal to 'value'. template Matcher::Matcher(T value) { *this = Eq(value); } // Creates a monomorphic matcher that matches anything with type Lhs // and equal to rhs. A user may need to use this instead of Eq(...) // in order to resolve an overloading ambiguity. // // TypedEq(x) is just a convenient short-hand for Matcher(Eq(x)) // or Matcher(x), but more readable than the latter. // // We could define similar monomorphic matchers for other comparison // operations (e.g. TypedLt, TypedGe, and etc), but decided not to do // it yet as those are used much less than Eq() in practice. A user // can always write Matcher(Lt(5)) to be explicit about the type, // for example. template inline Matcher TypedEq(const Rhs& rhs) { return Eq(rhs); } // Creates a polymorphic matcher that matches anything >= x. template inline internal::GeMatcher Ge(Rhs x) { return internal::GeMatcher(x); } // Creates a polymorphic matcher that matches anything > x. template inline internal::GtMatcher Gt(Rhs x) { return internal::GtMatcher(x); } // Creates a polymorphic matcher that matches anything <= x. template inline internal::LeMatcher Le(Rhs x) { return internal::LeMatcher(x); } // Creates a polymorphic matcher that matches anything < x. template inline internal::LtMatcher Lt(Rhs x) { return internal::LtMatcher(x); } // Creates a polymorphic matcher that matches anything != x. template inline internal::NeMatcher Ne(Rhs x) { return internal::NeMatcher(x); } // Creates a polymorphic matcher that matches any NULL pointer. inline PolymorphicMatcher IsNull() { return MakePolymorphicMatcher(internal::IsNullMatcher()); } // Creates a polymorphic matcher that matches any non-NULL pointer. // This is convenient as Not(NULL) doesn't compile (the compiler // thinks that that expression is comparing a pointer with an integer). inline PolymorphicMatcher NotNull() { return MakePolymorphicMatcher(internal::NotNullMatcher()); } // Creates a polymorphic matcher that matches any argument that // references variable x. template inline internal::RefMatcher Ref(T& x) { // NOLINT return internal::RefMatcher(x); } // Creates a matcher that matches any double argument approximately // equal to rhs, where two NANs are considered unequal. inline internal::FloatingEqMatcher DoubleEq(double rhs) { return internal::FloatingEqMatcher(rhs, false); } // Creates a matcher that matches any double argument approximately // equal to rhs, including NaN values when rhs is NaN. inline internal::FloatingEqMatcher NanSensitiveDoubleEq(double rhs) { return internal::FloatingEqMatcher(rhs, true); } // Creates a matcher that matches any float argument approximately // equal to rhs, where two NANs are considered unequal. inline internal::FloatingEqMatcher FloatEq(float rhs) { return internal::FloatingEqMatcher(rhs, false); } // Creates a matcher that matches any double argument approximately // equal to rhs, including NaN values when rhs is NaN. inline internal::FloatingEqMatcher NanSensitiveFloatEq(float rhs) { return internal::FloatingEqMatcher(rhs, true); } // Creates a matcher that matches a pointer (raw or smart) that points // to a value that matches inner_matcher. template inline internal::PointeeMatcher Pointee( const InnerMatcher& inner_matcher) { return internal::PointeeMatcher(inner_matcher); } // Creates a matcher that matches an object whose given field matches // 'matcher'. For example, // Field(&Foo::number, Ge(5)) // matches a Foo object x iff x.number >= 5. template inline PolymorphicMatcher< internal::FieldMatcher > Field( FieldType Class::*field, const FieldMatcher& matcher) { return MakePolymorphicMatcher( internal::FieldMatcher( field, MatcherCast(matcher))); // The call to MatcherCast() is required for supporting inner // matchers of compatible types. For example, it allows // Field(&Foo::bar, m) // to compile where bar is an int32 and m is a matcher for int64. } // Creates a matcher that matches an object whose given property // matches 'matcher'. For example, // Property(&Foo::str, StartsWith("hi")) // matches a Foo object x iff x.str() starts with "hi". template inline PolymorphicMatcher< internal::PropertyMatcher > Property( PropertyType (Class::*property)() const, const PropertyMatcher& matcher) { return MakePolymorphicMatcher( internal::PropertyMatcher( property, MatcherCast(matcher))); // The call to MatcherCast() is required for supporting inner // matchers of compatible types. For example, it allows // Property(&Foo::bar, m) // to compile where bar() returns an int32 and m is a matcher for int64. } // Creates a matcher that matches an object iff the result of applying // a callable to x matches 'matcher'. // For example, // ResultOf(f, StartsWith("hi")) // matches a Foo object x iff f(x) starts with "hi". // callable parameter can be a function, function pointer, or a functor. // Callable has to satisfy the following conditions: // * It is required to keep no state affecting the results of // the calls on it and make no assumptions about how many calls // will be made. Any state it keeps must be protected from the // concurrent access. // * If it is a function object, it has to define type result_type. // We recommend deriving your functor classes from std::unary_function. template internal::ResultOfMatcher ResultOf( Callable callable, const ResultOfMatcher& matcher) { return internal::ResultOfMatcher( callable, MatcherCast::ResultType>( matcher)); // The call to MatcherCast() is required for supporting inner // matchers of compatible types. For example, it allows // ResultOf(Function, m) // to compile where Function() returns an int32 and m is a matcher for int64. } // String matchers. // Matches a string equal to str. inline PolymorphicMatcher > StrEq(const internal::string& str) { return MakePolymorphicMatcher(internal::StrEqualityMatcher( str, true, true)); } // Matches a string not equal to str. inline PolymorphicMatcher > StrNe(const internal::string& str) { return MakePolymorphicMatcher(internal::StrEqualityMatcher( str, false, true)); } // Matches a string equal to str, ignoring case. inline PolymorphicMatcher > StrCaseEq(const internal::string& str) { return MakePolymorphicMatcher(internal::StrEqualityMatcher( str, true, false)); } // Matches a string not equal to str, ignoring case. inline PolymorphicMatcher > StrCaseNe(const internal::string& str) { return MakePolymorphicMatcher(internal::StrEqualityMatcher( str, false, false)); } // Creates a matcher that matches any string, std::string, or C string // that contains the given substring. inline PolymorphicMatcher > HasSubstr(const internal::string& substring) { return MakePolymorphicMatcher(internal::HasSubstrMatcher( substring)); } // Matches a string that starts with 'prefix' (case-sensitive). inline PolymorphicMatcher > StartsWith(const internal::string& prefix) { return MakePolymorphicMatcher(internal::StartsWithMatcher( prefix)); } // Matches a string that ends with 'suffix' (case-sensitive). inline PolymorphicMatcher > EndsWith(const internal::string& suffix) { return MakePolymorphicMatcher(internal::EndsWithMatcher( suffix)); } // Matches a string that fully matches regular expression 'regex'. // The matcher takes ownership of 'regex'. inline PolymorphicMatcher MatchesRegex( const internal::RE* regex) { return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, true)); } inline PolymorphicMatcher MatchesRegex( const internal::string& regex) { return MatchesRegex(new internal::RE(regex)); } // Matches a string that contains regular expression 'regex'. // The matcher takes ownership of 'regex'. inline PolymorphicMatcher ContainsRegex( const internal::RE* regex) { return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, false)); } inline PolymorphicMatcher ContainsRegex( const internal::string& regex) { return ContainsRegex(new internal::RE(regex)); } #if GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING // Wide string matchers. // Matches a string equal to str. inline PolymorphicMatcher > StrEq(const internal::wstring& str) { return MakePolymorphicMatcher(internal::StrEqualityMatcher( str, true, true)); } // Matches a string not equal to str. inline PolymorphicMatcher > StrNe(const internal::wstring& str) { return MakePolymorphicMatcher(internal::StrEqualityMatcher( str, false, true)); } // Matches a string equal to str, ignoring case. inline PolymorphicMatcher > StrCaseEq(const internal::wstring& str) { return MakePolymorphicMatcher(internal::StrEqualityMatcher( str, true, false)); } // Matches a string not equal to str, ignoring case. inline PolymorphicMatcher > StrCaseNe(const internal::wstring& str) { return MakePolymorphicMatcher(internal::StrEqualityMatcher( str, false, false)); } // Creates a matcher that matches any wstring, std::wstring, or C wide string // that contains the given substring. inline PolymorphicMatcher > HasSubstr(const internal::wstring& substring) { return MakePolymorphicMatcher(internal::HasSubstrMatcher( substring)); } // Matches a string that starts with 'prefix' (case-sensitive). inline PolymorphicMatcher > StartsWith(const internal::wstring& prefix) { return MakePolymorphicMatcher(internal::StartsWithMatcher( prefix)); } // Matches a string that ends with 'suffix' (case-sensitive). inline PolymorphicMatcher > EndsWith(const internal::wstring& suffix) { return MakePolymorphicMatcher(internal::EndsWithMatcher( suffix)); } #endif // GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING // Creates a polymorphic matcher that matches a 2-tuple where the // first field == the second field. inline internal::Eq2Matcher Eq() { return internal::Eq2Matcher(); } // Creates a polymorphic matcher that matches a 2-tuple where the // first field >= the second field. inline internal::Ge2Matcher Ge() { return internal::Ge2Matcher(); } // Creates a polymorphic matcher that matches a 2-tuple where the // first field > the second field. inline internal::Gt2Matcher Gt() { return internal::Gt2Matcher(); } // Creates a polymorphic matcher that matches a 2-tuple where the // first field <= the second field. inline internal::Le2Matcher Le() { return internal::Le2Matcher(); } // Creates a polymorphic matcher that matches a 2-tuple where the // first field < the second field. inline internal::Lt2Matcher Lt() { return internal::Lt2Matcher(); } // Creates a polymorphic matcher that matches a 2-tuple where the // first field != the second field. inline internal::Ne2Matcher Ne() { return internal::Ne2Matcher(); } // Creates a matcher that matches any value of type T that m doesn't // match. template inline internal::NotMatcher Not(InnerMatcher m) { return internal::NotMatcher(m); } // Creates a matcher that matches any value that matches all of the // given matchers. // // For now we only support up to 5 matchers. Support for more // matchers can be added as needed, or the user can use nested // AllOf()s. template inline internal::BothOfMatcher AllOf(Matcher1 m1, Matcher2 m2) { return internal::BothOfMatcher(m1, m2); } template inline internal::BothOfMatcher > AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3) { return AllOf(m1, AllOf(m2, m3)); } template inline internal::BothOfMatcher > > AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4) { return AllOf(m1, AllOf(m2, m3, m4)); } template inline internal::BothOfMatcher > > > AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5) { return AllOf(m1, AllOf(m2, m3, m4, m5)); } // Creates a matcher that matches any value that matches at least one // of the given matchers. // // For now we only support up to 5 matchers. Support for more // matchers can be added as needed, or the user can use nested // AnyOf()s. template inline internal::EitherOfMatcher AnyOf(Matcher1 m1, Matcher2 m2) { return internal::EitherOfMatcher(m1, m2); } template inline internal::EitherOfMatcher > AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3) { return AnyOf(m1, AnyOf(m2, m3)); } template inline internal::EitherOfMatcher > > AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4) { return AnyOf(m1, AnyOf(m2, m3, m4)); } template inline internal::EitherOfMatcher > > > AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5) { return AnyOf(m1, AnyOf(m2, m3, m4, m5)); } // Returns a matcher that matches anything that satisfies the given // predicate. The predicate can be any unary function or functor // whose return type can be implicitly converted to bool. template inline PolymorphicMatcher > Truly(Predicate pred) { return MakePolymorphicMatcher(internal::TrulyMatcher(pred)); } // Returns a matcher that matches an equal container. // This matcher behaves like Eq(), but in the event of mismatch lists the // values that are included in one container but not the other. (Duplicate // values and order differences are not explained.) template inline PolymorphicMatcher > ContainerEq(const Container& rhs) { // This following line is for working around a bug in MSVC 8.0, // which causes Container to be a const type sometimes. typedef GMOCK_REMOVE_CONST_(Container) RawContainer; return MakePolymorphicMatcher( internal::ContainerEqMatcher(rhs)); } // Matches an STL-style container or a native array that contains at // least one element matching the given value or matcher. // // Examples: // ::std::set page_ids; // page_ids.insert(3); // page_ids.insert(1); // EXPECT_THAT(page_ids, Contains(1)); // EXPECT_THAT(page_ids, Contains(Gt(2))); // EXPECT_THAT(page_ids, Not(Contains(4))); // // ::std::map page_lengths; // page_lengths[1] = 100; // EXPECT_THAT(page_lengths, // Contains(::std::pair(1, 100))); // // const char* user_ids[] = { "joe", "mike", "tom" }; // EXPECT_THAT(user_ids, Contains(Eq(::std::string("tom")))); template inline internal::ContainsMatcher Contains(M matcher) { return internal::ContainsMatcher(matcher); } // Key(inner_matcher) matches an std::pair whose 'first' field matches // inner_matcher. For example, Contains(Key(Ge(5))) can be used to match an // std::map that contains at least one element whose key is >= 5. template inline internal::KeyMatcher Key(M inner_matcher) { return internal::KeyMatcher(inner_matcher); } // Pair(first_matcher, second_matcher) matches a std::pair whose 'first' field // matches first_matcher and whose 'second' field matches second_matcher. For // example, EXPECT_THAT(map_type, ElementsAre(Pair(Ge(5), "foo"))) can be used // to match a std::map that contains exactly one element whose key // is >= 5 and whose value equals "foo". template inline internal::PairMatcher Pair(FirstMatcher first_matcher, SecondMatcher second_matcher) { return internal::PairMatcher( first_matcher, second_matcher); } // Returns a predicate that is satisfied by anything that matches the // given matcher. template inline internal::MatcherAsPredicate Matches(M matcher) { return internal::MatcherAsPredicate(matcher); } // Returns true iff the value matches the matcher. template inline bool Value(const T& value, M matcher) { return testing::Matches(matcher)(value); } // Matches the value against the given matcher and explains the match // result to listener. template inline bool ExplainMatchResult( M matcher, const T& value, MatchResultListener* listener) { return SafeMatcherCast(matcher).MatchAndExplain(value, listener); } // AllArgs(m) is a synonym of m. This is useful in // // EXPECT_CALL(foo, Bar(_, _)).With(AllArgs(Eq())); // // which is easier to read than // // EXPECT_CALL(foo, Bar(_, _)).With(Eq()); template inline InnerMatcher AllArgs(const InnerMatcher& matcher) { return matcher; } // These macros allow using matchers to check values in Google Test // tests. ASSERT_THAT(value, matcher) and EXPECT_THAT(value, matcher) // succeed iff the value matches the matcher. If the assertion fails, // the value and the description of the matcher will be printed. #define ASSERT_THAT(value, matcher) ASSERT_PRED_FORMAT1(\ ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value) #define EXPECT_THAT(value, matcher) EXPECT_PRED_FORMAT1(\ ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value) } // namespace testing #endif // GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/include/gmock/gmock-more-actions.h000066400000000000000000000176141260417502300306420ustar00rootroot00000000000000// Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Google Mock - a framework for writing C++ mock classes. // // This file implements some actions that depend on gmock-generated-actions.h. #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_MORE_ACTIONS_H_ #define GMOCK_INCLUDE_GMOCK_GMOCK_MORE_ACTIONS_H_ #include namespace testing { namespace internal { // Implements the Invoke(f) action. The template argument // FunctionImpl is the implementation type of f, which can be either a // function pointer or a functor. Invoke(f) can be used as an // Action as long as f's type is compatible with F (i.e. f can be // assigned to a tr1::function). template class InvokeAction { public: // The c'tor makes a copy of function_impl (either a function // pointer or a functor). explicit InvokeAction(FunctionImpl function_impl) : function_impl_(function_impl) {} template Result Perform(const ArgumentTuple& args) { return InvokeHelper::Invoke(function_impl_, args); } private: FunctionImpl function_impl_; GTEST_DISALLOW_ASSIGN_(InvokeAction); }; // Implements the Invoke(object_ptr, &Class::Method) action. template class InvokeMethodAction { public: InvokeMethodAction(Class* obj_ptr, MethodPtr method_ptr) : obj_ptr_(obj_ptr), method_ptr_(method_ptr) {} template Result Perform(const ArgumentTuple& args) const { return InvokeHelper::InvokeMethod( obj_ptr_, method_ptr_, args); } private: Class* const obj_ptr_; const MethodPtr method_ptr_; GTEST_DISALLOW_ASSIGN_(InvokeMethodAction); }; } // namespace internal // Various overloads for Invoke(). // Creates an action that invokes 'function_impl' with the mock // function's arguments. template PolymorphicAction > Invoke( FunctionImpl function_impl) { return MakePolymorphicAction( internal::InvokeAction(function_impl)); } // Creates an action that invokes the given method on the given object // with the mock function's arguments. template PolymorphicAction > Invoke( Class* obj_ptr, MethodPtr method_ptr) { return MakePolymorphicAction( internal::InvokeMethodAction(obj_ptr, method_ptr)); } // WithoutArgs(inner_action) can be used in a mock function with a // non-empty argument list to perform inner_action, which takes no // argument. In other words, it adapts an action accepting no // argument to one that accepts (and ignores) arguments. template inline internal::WithArgsAction WithoutArgs(const InnerAction& action) { return internal::WithArgsAction(action); } // WithArg(an_action) creates an action that passes the k-th // (0-based) argument of the mock function to an_action and performs // it. It adapts an action accepting one argument to one that accepts // multiple arguments. For convenience, we also provide // WithArgs(an_action) (defined below) as a synonym. template inline internal::WithArgsAction WithArg(const InnerAction& action) { return internal::WithArgsAction(action); } // The ACTION*() macros trigger warning C4100 (unreferenced formal // parameter) in MSVC with -W4. Unfortunately they cannot be fixed in // the macro definition, as the warnings are generated when the macro // is expanded and macro expansion cannot contain #pragma. Therefore // we suppress them here. #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable:4100) #endif // Action ReturnArg() returns the k-th argument of the mock function. ACTION_TEMPLATE(ReturnArg, HAS_1_TEMPLATE_PARAMS(int, k), AND_0_VALUE_PARAMS()) { return std::tr1::get(args); } // Action SaveArg(pointer) saves the k-th (0-based) argument of the // mock function to *pointer. ACTION_TEMPLATE(SaveArg, HAS_1_TEMPLATE_PARAMS(int, k), AND_1_VALUE_PARAMS(pointer)) { *pointer = ::std::tr1::get(args); } // Action SetArgReferee(value) assigns 'value' to the variable // referenced by the k-th (0-based) argument of the mock function. ACTION_TEMPLATE(SetArgReferee, HAS_1_TEMPLATE_PARAMS(int, k), AND_1_VALUE_PARAMS(value)) { typedef typename ::std::tr1::tuple_element::type argk_type; // Ensures that argument #k is a reference. If you get a compiler // error on the next line, you are using SetArgReferee(value) in // a mock function whose k-th (0-based) argument is not a reference. GMOCK_COMPILE_ASSERT_(internal::is_reference::value, SetArgReferee_must_be_used_with_a_reference_argument); ::std::tr1::get(args) = value; } // Action SetArrayArgument(first, last) copies the elements in // source range [first, last) to the array pointed to by the k-th // (0-based) argument, which can be either a pointer or an // iterator. The action does not take ownership of the elements in the // source range. ACTION_TEMPLATE(SetArrayArgument, HAS_1_TEMPLATE_PARAMS(int, k), AND_2_VALUE_PARAMS(first, last)) { // Microsoft compiler deprecates ::std::copy, so we want to suppress warning // 4996 (Function call with parameters that may be unsafe) there. #ifdef _MSC_VER #pragma warning(push) // Saves the current warning state. #pragma warning(disable:4996) // Temporarily disables warning 4996. #endif ::std::copy(first, last, ::std::tr1::get(args)); #ifdef _MSC_VER #pragma warning(pop) // Restores the warning state. #endif } // Action DeleteArg() deletes the k-th (0-based) argument of the mock // function. ACTION_TEMPLATE(DeleteArg, HAS_1_TEMPLATE_PARAMS(int, k), AND_0_VALUE_PARAMS()) { delete ::std::tr1::get(args); } // Action Throw(exception) can be used in a mock function of any type // to throw the given exception. Any copyable value can be thrown. #if GTEST_HAS_EXCEPTIONS ACTION_P(Throw, exception) { throw exception; } #endif // GTEST_HAS_EXCEPTIONS #ifdef _MSC_VER #pragma warning(pop) #endif } // namespace testing #endif // GMOCK_INCLUDE_GMOCK_GMOCK_MORE_ACTIONS_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/include/gmock/gmock-printers.h000066400000000000000000000651551260417502300301130ustar00rootroot00000000000000// Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Google Mock - a framework for writing C++ mock classes. // // This file implements a universal value printer that can print a // value of any type T: // // void ::testing::internal::UniversalPrinter::Print(value, ostream_ptr); // // A user can teach this function how to print a class type T by // defining either operator<<() or PrintTo() in the namespace that // defines T. More specifically, the FIRST defined function in the // following list will be used (assuming T is defined in namespace // foo): // // 1. foo::PrintTo(const T&, ostream*) // 2. operator<<(ostream&, const T&) defined in either foo or the // global namespace. // // If none of the above is defined, it will print the debug string of // the value if it is a protocol buffer, or print the raw bytes in the // value otherwise. // // To aid debugging: when T is a reference type, the address of the // value is also printed; when T is a (const) char pointer, both the // pointer value and the NUL-terminated string it points to are // printed. // // We also provide some convenient wrappers: // // // Prints a value to a string. For a (const or not) char // // pointer, the NUL-terminated string (but not the pointer) is // // printed. // std::string ::testing::PrintToString(const T& value); // // // Prints a value tersely: for a reference type, the referenced // // value (but not the address) is printed; for a (const or not) char // // pointer, the NUL-terminated string (but not the pointer) is // // printed. // void ::testing::internal::UniversalTersePrint(const T& value, ostream*); // // // Prints value using the type inferred by the compiler. The difference // // from UniversalTersePrint() is that this function prints both the // // pointer and the NUL-terminated string for a (const or not) char pointer. // void ::testing::internal::UniversalPrint(const T& value, ostream*); // // // Prints the fields of a tuple tersely to a string vector, one // // element for each field. // std::vector UniversalTersePrintTupleFieldsToStrings( // const Tuple& value); // // Known limitation: // // The print primitives print the elements of an STL-style container // using the compiler-inferred type of *iter where iter is a // const_iterator of the container. When const_iterator is an input // iterator but not a forward iterator, this inferred type may not // match value_type, and the print output may be incorrect. In // practice, this is rarely a problem as for most containers // const_iterator is a forward iterator. We'll fix this if there's an // actual need for it. Note that this fix cannot rely on value_type // being defined as many user-defined container types don't have // value_type. #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_PRINTERS_H_ #define GMOCK_INCLUDE_GMOCK_GMOCK_PRINTERS_H_ #include // NOLINT #include #include #include #include #include #include #include namespace testing { // Definitions in the 'internal' and 'internal2' name spaces are // subject to change without notice. DO NOT USE THEM IN USER CODE! namespace internal2 { // Prints the given number of bytes in the given object to the given // ostream. void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count, ::std::ostream* os); // TypeWithoutFormatter::PrintValue(value, os) is called // by the universal printer to print a value of type T when neither // operator<< nor PrintTo() is defined for type T. When T is // ProtocolMessage, proto2::Message, or a subclass of those, kIsProto // will be true and the short debug string of the protocol message // value will be printed; otherwise kIsProto will be false and the // bytes in the value will be printed. template class TypeWithoutFormatter { public: static void PrintValue(const T& value, ::std::ostream* os) { PrintBytesInObjectTo(reinterpret_cast(&value), sizeof(value), os); } }; // We print a protobuf using its ShortDebugString() when the string // doesn't exceed this many characters; otherwise we print it using // DebugString() for better readability. const size_t kProtobufOneLinerMaxLength = 50; template class TypeWithoutFormatter { public: static void PrintValue(const T& value, ::std::ostream* os) { const ::testing::internal::string short_str = value.ShortDebugString(); const ::testing::internal::string pretty_str = short_str.length() <= kProtobufOneLinerMaxLength ? short_str : ("\n" + value.DebugString()); ::std::operator<<(*os, "<" + pretty_str + ">"); } }; // Prints the given value to the given ostream. If the value is a // protocol message, its short debug string is printed; otherwise the // bytes in the value are printed. This is what // UniversalPrinter::Print() does when it knows nothing about type // T and T has no << operator. // // A user can override this behavior for a class type Foo by defining // a << operator in the namespace where Foo is defined. // // We put this operator in namespace 'internal2' instead of 'internal' // to simplify the implementation, as much code in 'internal' needs to // use << in STL, which would conflict with our own << were it defined // in 'internal'. // // Note that this operator<< takes a generic std::basic_ostream type instead of the more restricted std::ostream. If // we define it to take an std::ostream instead, we'll get an // "ambiguous overloads" compiler error when trying to print a type // Foo that supports streaming to std::basic_ostream, as the compiler cannot tell whether // operator<<(std::ostream&, const T&) or // operator<<(std::basic_stream, const Foo&) is more // specific. template ::std::basic_ostream& operator<<( ::std::basic_ostream& os, const T& x) { TypeWithoutFormatter::value>:: PrintValue(x, &os); return os; } } // namespace internal2 } // namespace testing // This namespace MUST NOT BE NESTED IN ::testing, or the name look-up // magic needed for implementing UniversalPrinter won't work. namespace testing_internal { // Used to print a value that is not an STL-style container when the // user doesn't define PrintTo() for it. template void DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) { // With the following statement, during unqualified name lookup, // testing::internal2::operator<< appears as if it was declared in // the nearest enclosing namespace that contains both // ::testing_internal and ::testing::internal2, i.e. the global // namespace. For more details, refer to the C++ Standard section // 7.3.4-1 [namespace.udir]. This allows us to fall back onto // testing::internal2::operator<< in case T doesn't come with a << // operator. // // We cannot write 'using ::testing::internal2::operator<<;', which // gcc 3.3 fails to compile due to a compiler bug. using namespace ::testing::internal2; // NOLINT // Assuming T is defined in namespace foo, in the next statement, // the compiler will consider all of: // // 1. foo::operator<< (thanks to Koenig look-up), // 2. ::operator<< (as the current namespace is enclosed in ::), // 3. testing::internal2::operator<< (thanks to the using statement above). // // The operator<< whose type matches T best will be picked. // // We deliberately allow #2 to be a candidate, as sometimes it's // impossible to define #1 (e.g. when foo is ::std, defining // anything in it is undefined behavior unless you are a compiler // vendor.). *os << value; } } // namespace testing_internal namespace testing { namespace internal { // UniversalPrinter::Print(value, ostream_ptr) prints the given // value to the given ostream. The caller must ensure that // 'ostream_ptr' is not NULL, or the behavior is undefined. // // We define UniversalPrinter as a class template (as opposed to a // function template), as we need to partially specialize it for // reference types, which cannot be done with function templates. template class UniversalPrinter; template void UniversalPrint(const T& value, ::std::ostream* os); // Used to print an STL-style container when the user doesn't define // a PrintTo() for it. template void DefaultPrintTo(IsContainer /* dummy */, false_type /* is not a pointer */, const C& container, ::std::ostream* os) { const size_t kMaxCount = 32; // The maximum number of elements to print. *os << '{'; size_t count = 0; for (typename C::const_iterator it = container.begin(); it != container.end(); ++it, ++count) { if (count > 0) { *os << ','; if (count == kMaxCount) { // Enough has been printed. *os << " ..."; break; } } *os << ' '; // We cannot call PrintTo(*it, os) here as PrintTo() doesn't // handle *it being a native array. internal::UniversalPrint(*it, os); } if (count > 0) { *os << ' '; } *os << '}'; } // Used to print a pointer that is neither a char pointer nor a member // pointer, when the user doesn't define PrintTo() for it. (A member // variable pointer or member function pointer doesn't really point to // a location in the address space. Their representation is // implementation-defined. Therefore they will be printed as raw // bytes.) template void DefaultPrintTo(IsNotContainer /* dummy */, true_type /* is a pointer */, T* p, ::std::ostream* os) { if (p == NULL) { *os << "NULL"; } else { // We want to print p as a const void*. However, we cannot cast // it to const void* directly, even using reinterpret_cast, as // earlier versions of gcc (e.g. 3.4.5) cannot compile the cast // when p is a function pointer. Casting to UInt64 first solves // the problem. *os << reinterpret_cast(reinterpret_cast(p)); } } // Used to print a non-container, non-pointer value when the user // doesn't define PrintTo() for it. template void DefaultPrintTo(IsNotContainer /* dummy */, false_type /* is not a pointer */, const T& value, ::std::ostream* os) { ::testing_internal::DefaultPrintNonContainerTo(value, os); } // Prints the given value using the << operator if it has one; // otherwise prints the bytes in it. This is what // UniversalPrinter::Print() does when PrintTo() is not specialized // or overloaded for type T. // // A user can override this behavior for a class type Foo by defining // an overload of PrintTo() in the namespace where Foo is defined. We // give the user this option as sometimes defining a << operator for // Foo is not desirable (e.g. the coding style may prevent doing it, // or there is already a << operator but it doesn't do what the user // wants). template void PrintTo(const T& value, ::std::ostream* os) { // DefaultPrintTo() is overloaded. The type of its first two // arguments determine which version will be picked. If T is an // STL-style container, the version for container will be called; if // T is a pointer, the pointer version will be called; otherwise the // generic version will be called. // // Note that we check for container types here, prior to we check // for protocol message types in our operator<<. The rationale is: // // For protocol messages, we want to give people a chance to // override Google Mock's format by defining a PrintTo() or // operator<<. For STL containers, other formats can be // incompatible with Google Mock's format for the container // elements; therefore we check for container types here to ensure // that our format is used. // // The second argument of DefaultPrintTo() is needed to bypass a bug // in Symbian's C++ compiler that prevents it from picking the right // overload between: // // PrintTo(const T& x, ...); // PrintTo(T* x, ...); DefaultPrintTo(IsContainerTest(0), is_pointer(), value, os); } // The following list of PrintTo() overloads tells // UniversalPrinter::Print() how to print standard types (built-in // types, strings, plain arrays, and pointers). // Overloads for various char types. void PrintCharTo(char c, int char_code, ::std::ostream* os); inline void PrintTo(unsigned char c, ::std::ostream* os) { PrintCharTo(c, c, os); } inline void PrintTo(signed char c, ::std::ostream* os) { PrintCharTo(c, c, os); } inline void PrintTo(char c, ::std::ostream* os) { // When printing a plain char, we always treat it as unsigned. This // way, the output won't be affected by whether the compiler thinks // char is signed or not. PrintTo(static_cast(c), os); } // Overloads for other simple built-in types. inline void PrintTo(bool x, ::std::ostream* os) { *os << (x ? "true" : "false"); } // Overload for wchar_t type. // Prints a wchar_t as a symbol if it is printable or as its internal // code otherwise and also as its decimal code (except for L'\0'). // The L'\0' char is printed as "L'\\0'". The decimal code is printed // as signed integer when wchar_t is implemented by the compiler // as a signed type and is printed as an unsigned integer when wchar_t // is implemented as an unsigned type. void PrintTo(wchar_t wc, ::std::ostream* os); // Overloads for C strings. void PrintTo(const char* s, ::std::ostream* os); inline void PrintTo(char* s, ::std::ostream* os) { PrintTo(implicit_cast(s), os); } // MSVC can be configured to define wchar_t as a typedef of unsigned // short. It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native // type. When wchar_t is a typedef, defining an overload for const // wchar_t* would cause unsigned short* be printed as a wide string, // possibly causing invalid memory accesses. #if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) // Overloads for wide C strings void PrintTo(const wchar_t* s, ::std::ostream* os); inline void PrintTo(wchar_t* s, ::std::ostream* os) { PrintTo(implicit_cast(s), os); } #endif // Overload for C arrays. Multi-dimensional arrays are printed // properly. // Prints the given number of elements in an array, without printing // the curly braces. template void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) { UniversalPrinter::Print(a[0], os); for (size_t i = 1; i != count; i++) { *os << ", "; UniversalPrinter::Print(a[i], os); } } // Overloads for ::string and ::std::string. #if GTEST_HAS_GLOBAL_STRING void PrintStringTo(const ::string&s, ::std::ostream* os); inline void PrintTo(const ::string& s, ::std::ostream* os) { PrintStringTo(s, os); } #endif // GTEST_HAS_GLOBAL_STRING void PrintStringTo(const ::std::string&s, ::std::ostream* os); inline void PrintTo(const ::std::string& s, ::std::ostream* os) { PrintStringTo(s, os); } // Overloads for ::wstring and ::std::wstring. #if GTEST_HAS_GLOBAL_WSTRING void PrintWideStringTo(const ::wstring&s, ::std::ostream* os); inline void PrintTo(const ::wstring& s, ::std::ostream* os) { PrintWideStringTo(s, os); } #endif // GTEST_HAS_GLOBAL_WSTRING #if GTEST_HAS_STD_WSTRING void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os); inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) { PrintWideStringTo(s, os); } #endif // GTEST_HAS_STD_WSTRING // Overload for ::std::tr1::tuple. Needed for printing function // arguments, which are packed as tuples. // Helper function for printing a tuple. T must be instantiated with // a tuple type. template void PrintTupleTo(const T& t, ::std::ostream* os); // Overloaded PrintTo() for tuples of various arities. We support // tuples of up-to 10 fields. The following implementation works // regardless of whether tr1::tuple is implemented using the // non-standard variadic template feature or not. inline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) { PrintTupleTo(t, os); } template void PrintTo(const ::std::tr1::tuple& t, ::std::ostream* os) { PrintTupleTo(t, os); } template void PrintTo(const ::std::tr1::tuple& t, ::std::ostream* os) { PrintTupleTo(t, os); } template void PrintTo(const ::std::tr1::tuple& t, ::std::ostream* os) { PrintTupleTo(t, os); } template void PrintTo(const ::std::tr1::tuple& t, ::std::ostream* os) { PrintTupleTo(t, os); } template void PrintTo(const ::std::tr1::tuple& t, ::std::ostream* os) { PrintTupleTo(t, os); } template void PrintTo(const ::std::tr1::tuple& t, ::std::ostream* os) { PrintTupleTo(t, os); } template void PrintTo(const ::std::tr1::tuple& t, ::std::ostream* os) { PrintTupleTo(t, os); } template void PrintTo(const ::std::tr1::tuple& t, ::std::ostream* os) { PrintTupleTo(t, os); } template void PrintTo(const ::std::tr1::tuple& t, ::std::ostream* os) { PrintTupleTo(t, os); } template void PrintTo( const ::std::tr1::tuple& t, ::std::ostream* os) { PrintTupleTo(t, os); } // Overload for std::pair. template void PrintTo(const ::std::pair& value, ::std::ostream* os) { *os << '('; UniversalPrinter::Print(value.first, os); *os << ", "; UniversalPrinter::Print(value.second, os); *os << ')'; } // Implements printing a non-reference type T by letting the compiler // pick the right overload of PrintTo() for T. template class UniversalPrinter { public: // MSVC warns about adding const to a function type, so we want to // disable the warning. #ifdef _MSC_VER #pragma warning(push) // Saves the current warning state. #pragma warning(disable:4180) // Temporarily disables warning 4180. #endif // _MSC_VER // Note: we deliberately don't call this PrintTo(), as that name // conflicts with ::testing::internal::PrintTo in the body of the // function. static void Print(const T& value, ::std::ostream* os) { // By default, ::testing::internal::PrintTo() is used for printing // the value. // // Thanks to Koenig look-up, if T is a class and has its own // PrintTo() function defined in its namespace, that function will // be visible here. Since it is more specific than the generic ones // in ::testing::internal, it will be picked by the compiler in the // following statement - exactly what we want. PrintTo(value, os); } #ifdef _MSC_VER #pragma warning(pop) // Restores the warning state. #endif // _MSC_VER }; // UniversalPrintArray(begin, len, os) prints an array of 'len' // elements, starting at address 'begin'. template void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) { if (len == 0) { *os << "{}"; } else { *os << "{ "; const size_t kThreshold = 18; const size_t kChunkSize = 8; // If the array has more than kThreshold elements, we'll have to // omit some details by printing only the first and the last // kChunkSize elements. // TODO(wan@google.com): let the user control the threshold using a flag. if (len <= kThreshold) { PrintRawArrayTo(begin, len, os); } else { PrintRawArrayTo(begin, kChunkSize, os); *os << ", ..., "; PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os); } *os << " }"; } } // This overload prints a (const) char array compactly. void UniversalPrintArray(const char* begin, size_t len, ::std::ostream* os); // Implements printing an array type T[N]. template class UniversalPrinter { public: // Prints the given array, omitting some elements when there are too // many. static void Print(const T (&a)[N], ::std::ostream* os) { UniversalPrintArray(a, N, os); } }; // Implements printing a reference type T&. template class UniversalPrinter { public: // MSVC warns about adding const to a function type, so we want to // disable the warning. #ifdef _MSC_VER #pragma warning(push) // Saves the current warning state. #pragma warning(disable:4180) // Temporarily disables warning 4180. #endif // _MSC_VER static void Print(const T& value, ::std::ostream* os) { // Prints the address of the value. We use reinterpret_cast here // as static_cast doesn't compile when T is a function type. *os << "@" << reinterpret_cast(&value) << " "; // Then prints the value itself. UniversalPrinter::Print(value, os); } #ifdef _MSC_VER #pragma warning(pop) // Restores the warning state. #endif // _MSC_VER }; // Prints a value tersely: for a reference type, the referenced value // (but not the address) is printed; for a (const) char pointer, the // NUL-terminated string (but not the pointer) is printed. template void UniversalTersePrint(const T& value, ::std::ostream* os) { UniversalPrinter::Print(value, os); } inline void UniversalTersePrint(const char* str, ::std::ostream* os) { if (str == NULL) { *os << "NULL"; } else { UniversalPrinter::Print(string(str), os); } } inline void UniversalTersePrint(char* str, ::std::ostream* os) { UniversalTersePrint(static_cast(str), os); } // Prints a value using the type inferred by the compiler. The // difference between this and UniversalTersePrint() is that for a // (const) char pointer, this prints both the pointer and the // NUL-terminated string. template void UniversalPrint(const T& value, ::std::ostream* os) { UniversalPrinter::Print(value, os); } typedef ::std::vector Strings; // This helper template allows PrintTo() for tuples and // UniversalTersePrintTupleFieldsToStrings() to be defined by // induction on the number of tuple fields. The idea is that // TuplePrefixPrinter::PrintPrefixTo(t, os) prints the first N // fields in tuple t, and can be defined in terms of // TuplePrefixPrinter. // The inductive case. template struct TuplePrefixPrinter { // Prints the first N fields of a tuple. template static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) { TuplePrefixPrinter::PrintPrefixTo(t, os); *os << ", "; UniversalPrinter::type> ::Print(::std::tr1::get(t), os); } // Tersely prints the first N fields of a tuple to a string vector, // one element for each field. template static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) { TuplePrefixPrinter::TersePrintPrefixToStrings(t, strings); ::std::stringstream ss; UniversalTersePrint(::std::tr1::get(t), &ss); strings->push_back(ss.str()); } }; // Base cases. template <> struct TuplePrefixPrinter<0> { template static void PrintPrefixTo(const Tuple&, ::std::ostream*) {} template static void TersePrintPrefixToStrings(const Tuple&, Strings*) {} }; template <> template void TuplePrefixPrinter<1>::PrintPrefixTo(const Tuple& t, ::std::ostream* os) { UniversalPrinter::type>:: Print(::std::tr1::get<0>(t), os); } // Helper function for printing a tuple. T must be instantiated with // a tuple type. template void PrintTupleTo(const T& t, ::std::ostream* os) { *os << "("; TuplePrefixPrinter< ::std::tr1::tuple_size::value>:: PrintPrefixTo(t, os); *os << ")"; } // Prints the fields of a tuple tersely to a string vector, one // element for each field. See the comment before // UniversalTersePrint() for how we define "tersely". template Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) { Strings result; TuplePrefixPrinter< ::std::tr1::tuple_size::value>:: TersePrintPrefixToStrings(value, &result); return result; } } // namespace internal template ::std::string PrintToString(const T& value) { ::std::stringstream ss; internal::UniversalTersePrint(value, &ss); return ss.str(); } } // namespace testing #endif // GMOCK_INCLUDE_GMOCK_GMOCK_PRINTERS_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/include/gmock/gmock-spec-builders.h000066400000000000000000002045431260417502300310020ustar00rootroot00000000000000// Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Google Mock - a framework for writing C++ mock classes. // // This file implements the ON_CALL() and EXPECT_CALL() macros. // // A user can use the ON_CALL() macro to specify the default action of // a mock method. The syntax is: // // ON_CALL(mock_object, Method(argument-matchers)) // .With(multi-argument-matcher) // .WillByDefault(action); // // where the .With() clause is optional. // // A user can use the EXPECT_CALL() macro to specify an expectation on // a mock method. The syntax is: // // EXPECT_CALL(mock_object, Method(argument-matchers)) // .With(multi-argument-matchers) // .Times(cardinality) // .InSequence(sequences) // .After(expectations) // .WillOnce(action) // .WillRepeatedly(action) // .RetiresOnSaturation(); // // where all clauses are optional, and .InSequence()/.After()/ // .WillOnce() can appear any number of times. #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_ #define GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_ #include #include #include #include #include #include #include #include #include #include #include #include namespace testing { // An abstract handle of an expectation. class Expectation; // A set of expectation handles. class ExpectationSet; // Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION // and MUST NOT BE USED IN USER CODE!!! namespace internal { // Implements a mock function. template class FunctionMocker; // Base class for expectations. class ExpectationBase; // Implements an expectation. template class TypedExpectation; // Helper class for testing the Expectation class template. class ExpectationTester; // Base class for function mockers. template class FunctionMockerBase; // Protects the mock object registry (in class Mock), all function // mockers, and all expectations. // // The reason we don't use more fine-grained protection is: when a // mock function Foo() is called, it needs to consult its expectations // to see which one should be picked. If another thread is allowed to // call a mock function (either Foo() or a different one) at the same // time, it could affect the "retired" attributes of Foo()'s // expectations when InSequence() is used, and thus affect which // expectation gets picked. Therefore, we sequence all mock function // calls to ensure the integrity of the mock objects' states. GTEST_DECLARE_STATIC_MUTEX_(g_gmock_mutex); // Abstract base class of FunctionMockerBase. This is the // type-agnostic part of the function mocker interface. Its pure // virtual methods are implemented by FunctionMockerBase. class UntypedFunctionMockerBase { public: virtual ~UntypedFunctionMockerBase() {} // Verifies that all expectations on this mock function have been // satisfied. Reports one or more Google Test non-fatal failures // and returns false if not. // L >= g_gmock_mutex virtual bool VerifyAndClearExpectationsLocked() = 0; // Clears the ON_CALL()s set on this mock function. // L >= g_gmock_mutex virtual void ClearDefaultActionsLocked() = 0; }; // class UntypedFunctionMockerBase // This template class implements a default action spec (i.e. an // ON_CALL() statement). template class DefaultActionSpec { public: typedef typename Function::ArgumentTuple ArgumentTuple; typedef typename Function::ArgumentMatcherTuple ArgumentMatcherTuple; // Constructs a DefaultActionSpec object from the information inside // the parenthesis of an ON_CALL() statement. DefaultActionSpec(const char* a_file, int a_line, const ArgumentMatcherTuple& matchers) : file_(a_file), line_(a_line), matchers_(matchers), // By default, extra_matcher_ should match anything. However, // we cannot initialize it with _ as that triggers a compiler // bug in Symbian's C++ compiler (cannot decide between two // overloaded constructors of Matcher). extra_matcher_(A()), last_clause_(kNone) { } // Where in the source file was the default action spec defined? const char* file() const { return file_; } int line() const { return line_; } // Implements the .With() clause. DefaultActionSpec& With(const Matcher& m) { // Makes sure this is called at most once. ExpectSpecProperty(last_clause_ < kWith, ".With() cannot appear " "more than once in an ON_CALL()."); last_clause_ = kWith; extra_matcher_ = m; return *this; } // Implements the .WillByDefault() clause. DefaultActionSpec& WillByDefault(const Action& action) { ExpectSpecProperty(last_clause_ < kWillByDefault, ".WillByDefault() must appear " "exactly once in an ON_CALL()."); last_clause_ = kWillByDefault; ExpectSpecProperty(!action.IsDoDefault(), "DoDefault() cannot be used in ON_CALL()."); action_ = action; return *this; } // Returns true iff the given arguments match the matchers. bool Matches(const ArgumentTuple& args) const { return TupleMatches(matchers_, args) && extra_matcher_.Matches(args); } // Returns the action specified by the user. const Action& GetAction() const { AssertSpecProperty(last_clause_ == kWillByDefault, ".WillByDefault() must appear exactly " "once in an ON_CALL()."); return action_; } private: // Gives each clause in the ON_CALL() statement a name. enum Clause { // Do not change the order of the enum members! The run-time // syntax checking relies on it. kNone, kWith, kWillByDefault, }; // Asserts that the ON_CALL() statement has a certain property. void AssertSpecProperty(bool property, const string& failure_message) const { Assert(property, file_, line_, failure_message); } // Expects that the ON_CALL() statement has a certain property. void ExpectSpecProperty(bool property, const string& failure_message) const { Expect(property, file_, line_, failure_message); } // The information in statement // // ON_CALL(mock_object, Method(matchers)) // .With(multi-argument-matcher) // .WillByDefault(action); // // is recorded in the data members like this: // // source file that contains the statement => file_ // line number of the statement => line_ // matchers => matchers_ // multi-argument-matcher => extra_matcher_ // action => action_ const char* file_; int line_; ArgumentMatcherTuple matchers_; Matcher extra_matcher_; Action action_; // The last clause in the ON_CALL() statement as seen so far. // Initially kNone and changes as the statement is parsed. Clause last_clause_; }; // class DefaultActionSpec // Possible reactions on uninteresting calls. TODO(wan@google.com): // rename the enum values to the kFoo style. enum CallReaction { ALLOW, WARN, FAIL, }; } // namespace internal // Utilities for manipulating mock objects. class Mock { public: // The following public methods can be called concurrently. // Tells Google Mock to ignore mock_obj when checking for leaked // mock objects. static void AllowLeak(const void* mock_obj); // Verifies and clears all expectations on the given mock object. // If the expectations aren't satisfied, generates one or more // Google Test non-fatal failures and returns false. static bool VerifyAndClearExpectations(void* mock_obj); // Verifies all expectations on the given mock object and clears its // default actions and expectations. Returns true iff the // verification was successful. static bool VerifyAndClear(void* mock_obj); private: // Needed for a function mocker to register itself (so that we know // how to clear a mock object). template friend class internal::FunctionMockerBase; template friend class NiceMock; template friend class StrictMock; // Tells Google Mock to allow uninteresting calls on the given mock // object. // L < g_gmock_mutex static void AllowUninterestingCalls(const void* mock_obj); // Tells Google Mock to warn the user about uninteresting calls on // the given mock object. // L < g_gmock_mutex static void WarnUninterestingCalls(const void* mock_obj); // Tells Google Mock to fail uninteresting calls on the given mock // object. // L < g_gmock_mutex static void FailUninterestingCalls(const void* mock_obj); // Tells Google Mock the given mock object is being destroyed and // its entry in the call-reaction table should be removed. // L < g_gmock_mutex static void UnregisterCallReaction(const void* mock_obj); // Returns the reaction Google Mock will have on uninteresting calls // made on the given mock object. // L < g_gmock_mutex static internal::CallReaction GetReactionOnUninterestingCalls( const void* mock_obj); // Verifies that all expectations on the given mock object have been // satisfied. Reports one or more Google Test non-fatal failures // and returns false if not. // L >= g_gmock_mutex static bool VerifyAndClearExpectationsLocked(void* mock_obj); // Clears all ON_CALL()s set on the given mock object. // L >= g_gmock_mutex static void ClearDefaultActionsLocked(void* mock_obj); // Registers a mock object and a mock method it owns. // L < g_gmock_mutex static void Register(const void* mock_obj, internal::UntypedFunctionMockerBase* mocker); // Tells Google Mock where in the source code mock_obj is used in an // ON_CALL or EXPECT_CALL. In case mock_obj is leaked, this // information helps the user identify which object it is. // L < g_gmock_mutex static void RegisterUseByOnCallOrExpectCall( const void* mock_obj, const char* file, int line); // Unregisters a mock method; removes the owning mock object from // the registry when the last mock method associated with it has // been unregistered. This is called only in the destructor of // FunctionMockerBase. // L >= g_gmock_mutex static void UnregisterLocked(internal::UntypedFunctionMockerBase* mocker); }; // class Mock // An abstract handle of an expectation. Useful in the .After() // clause of EXPECT_CALL() for setting the (partial) order of // expectations. The syntax: // // Expectation e1 = EXPECT_CALL(...)...; // EXPECT_CALL(...).After(e1)...; // // sets two expectations where the latter can only be matched after // the former has been satisfied. // // Notes: // - This class is copyable and has value semantics. // - Constness is shallow: a const Expectation object itself cannot // be modified, but the mutable methods of the ExpectationBase // object it references can be called via expectation_base(). // - The constructors and destructor are defined out-of-line because // the Symbian WINSCW compiler wants to otherwise instantiate them // when it sees this class definition, at which point it doesn't have // ExpectationBase available yet, leading to incorrect destruction // in the linked_ptr (or compilation errors if using a checking // linked_ptr). class Expectation { public: // Constructs a null object that doesn't reference any expectation. Expectation(); ~Expectation(); // This single-argument ctor must not be explicit, in order to support the // Expectation e = EXPECT_CALL(...); // syntax. // // A TypedExpectation object stores its pre-requisites as // Expectation objects, and needs to call the non-const Retire() // method on the ExpectationBase objects they reference. Therefore // Expectation must receive a *non-const* reference to the // ExpectationBase object. Expectation(internal::ExpectationBase& exp); // NOLINT // The compiler-generated copy ctor and operator= work exactly as // intended, so we don't need to define our own. // Returns true iff rhs references the same expectation as this object does. bool operator==(const Expectation& rhs) const { return expectation_base_ == rhs.expectation_base_; } bool operator!=(const Expectation& rhs) const { return !(*this == rhs); } private: friend class ExpectationSet; friend class Sequence; friend class ::testing::internal::ExpectationBase; template friend class ::testing::internal::FunctionMockerBase; template friend class ::testing::internal::TypedExpectation; // This comparator is needed for putting Expectation objects into a set. class Less { public: bool operator()(const Expectation& lhs, const Expectation& rhs) const { return lhs.expectation_base_.get() < rhs.expectation_base_.get(); } }; typedef ::std::set Set; Expectation( const internal::linked_ptr& expectation_base); // Returns the expectation this object references. const internal::linked_ptr& expectation_base() const { return expectation_base_; } // A linked_ptr that co-owns the expectation this handle references. internal::linked_ptr expectation_base_; }; // A set of expectation handles. Useful in the .After() clause of // EXPECT_CALL() for setting the (partial) order of expectations. The // syntax: // // ExpectationSet es; // es += EXPECT_CALL(...)...; // es += EXPECT_CALL(...)...; // EXPECT_CALL(...).After(es)...; // // sets three expectations where the last one can only be matched // after the first two have both been satisfied. // // This class is copyable and has value semantics. class ExpectationSet { public: // A bidirectional iterator that can read a const element in the set. typedef Expectation::Set::const_iterator const_iterator; // An object stored in the set. This is an alias of Expectation. typedef Expectation::Set::value_type value_type; // Constructs an empty set. ExpectationSet() {} // This single-argument ctor must not be explicit, in order to support the // ExpectationSet es = EXPECT_CALL(...); // syntax. ExpectationSet(internal::ExpectationBase& exp) { // NOLINT *this += Expectation(exp); } // This single-argument ctor implements implicit conversion from // Expectation and thus must not be explicit. This allows either an // Expectation or an ExpectationSet to be used in .After(). ExpectationSet(const Expectation& e) { // NOLINT *this += e; } // The compiler-generator ctor and operator= works exactly as // intended, so we don't need to define our own. // Returns true iff rhs contains the same set of Expectation objects // as this does. bool operator==(const ExpectationSet& rhs) const { return expectations_ == rhs.expectations_; } bool operator!=(const ExpectationSet& rhs) const { return !(*this == rhs); } // Implements the syntax // expectation_set += EXPECT_CALL(...); ExpectationSet& operator+=(const Expectation& e) { expectations_.insert(e); return *this; } int size() const { return static_cast(expectations_.size()); } const_iterator begin() const { return expectations_.begin(); } const_iterator end() const { return expectations_.end(); } private: Expectation::Set expectations_; }; // Sequence objects are used by a user to specify the relative order // in which the expectations should match. They are copyable (we rely // on the compiler-defined copy constructor and assignment operator). class Sequence { public: // Constructs an empty sequence. Sequence() : last_expectation_(new Expectation) {} // Adds an expectation to this sequence. The caller must ensure // that no other thread is accessing this Sequence object. void AddExpectation(const Expectation& expectation) const; private: // The last expectation in this sequence. We use a linked_ptr here // because Sequence objects are copyable and we want the copies to // be aliases. The linked_ptr allows the copies to co-own and share // the same Expectation object. internal::linked_ptr last_expectation_; }; // class Sequence // An object of this type causes all EXPECT_CALL() statements // encountered in its scope to be put in an anonymous sequence. The // work is done in the constructor and destructor. You should only // create an InSequence object on the stack. // // The sole purpose for this class is to support easy definition of // sequential expectations, e.g. // // { // InSequence dummy; // The name of the object doesn't matter. // // // The following expectations must match in the order they appear. // EXPECT_CALL(a, Bar())...; // EXPECT_CALL(a, Baz())...; // ... // EXPECT_CALL(b, Xyz())...; // } // // You can create InSequence objects in multiple threads, as long as // they are used to affect different mock objects. The idea is that // each thread can create and set up its own mocks as if it's the only // thread. However, for clarity of your tests we recommend you to set // up mocks in the main thread unless you have a good reason not to do // so. class InSequence { public: InSequence(); ~InSequence(); private: bool sequence_created_; GTEST_DISALLOW_COPY_AND_ASSIGN_(InSequence); // NOLINT } GMOCK_ATTRIBUTE_UNUSED_; namespace internal { // Points to the implicit sequence introduced by a living InSequence // object (if any) in the current thread or NULL. extern ThreadLocal g_gmock_implicit_sequence; // Base class for implementing expectations. // // There are two reasons for having a type-agnostic base class for // Expectation: // // 1. We need to store collections of expectations of different // types (e.g. all pre-requisites of a particular expectation, all // expectations in a sequence). Therefore these expectation objects // must share a common base class. // // 2. We can avoid binary code bloat by moving methods not depending // on the template argument of Expectation to the base class. // // This class is internal and mustn't be used by user code directly. class ExpectationBase { public: // source_text is the EXPECT_CALL(...) source that created this Expectation. ExpectationBase(const char* file, int line, const string& source_text); virtual ~ExpectationBase(); // Where in the source file was the expectation spec defined? const char* file() const { return file_; } int line() const { return line_; } const char* source_text() const { return source_text_.c_str(); } // Returns the cardinality specified in the expectation spec. const Cardinality& cardinality() const { return cardinality_; } // Describes the source file location of this expectation. void DescribeLocationTo(::std::ostream* os) const { *os << file() << ":" << line() << ": "; } // Describes how many times a function call matching this // expectation has occurred. // L >= g_gmock_mutex virtual void DescribeCallCountTo(::std::ostream* os) const = 0; protected: friend class ::testing::Expectation; enum Clause { // Don't change the order of the enum members! kNone, kWith, kTimes, kInSequence, kAfter, kWillOnce, kWillRepeatedly, kRetiresOnSaturation, }; // Returns an Expectation object that references and co-owns this // expectation. virtual Expectation GetHandle() = 0; // Asserts that the EXPECT_CALL() statement has the given property. void AssertSpecProperty(bool property, const string& failure_message) const { Assert(property, file_, line_, failure_message); } // Expects that the EXPECT_CALL() statement has the given property. void ExpectSpecProperty(bool property, const string& failure_message) const { Expect(property, file_, line_, failure_message); } // Explicitly specifies the cardinality of this expectation. Used // by the subclasses to implement the .Times() clause. void SpecifyCardinality(const Cardinality& cardinality); // Returns true iff the user specified the cardinality explicitly // using a .Times(). bool cardinality_specified() const { return cardinality_specified_; } // Sets the cardinality of this expectation spec. void set_cardinality(const Cardinality& a_cardinality) { cardinality_ = a_cardinality; } // The following group of methods should only be called after the // EXPECT_CALL() statement, and only when g_gmock_mutex is held by // the current thread. // Retires all pre-requisites of this expectation. // L >= g_gmock_mutex void RetireAllPreRequisites(); // Returns true iff this expectation is retired. // L >= g_gmock_mutex bool is_retired() const { g_gmock_mutex.AssertHeld(); return retired_; } // Retires this expectation. // L >= g_gmock_mutex void Retire() { g_gmock_mutex.AssertHeld(); retired_ = true; } // Returns true iff this expectation is satisfied. // L >= g_gmock_mutex bool IsSatisfied() const { g_gmock_mutex.AssertHeld(); return cardinality().IsSatisfiedByCallCount(call_count_); } // Returns true iff this expectation is saturated. // L >= g_gmock_mutex bool IsSaturated() const { g_gmock_mutex.AssertHeld(); return cardinality().IsSaturatedByCallCount(call_count_); } // Returns true iff this expectation is over-saturated. // L >= g_gmock_mutex bool IsOverSaturated() const { g_gmock_mutex.AssertHeld(); return cardinality().IsOverSaturatedByCallCount(call_count_); } // Returns true iff all pre-requisites of this expectation are satisfied. // L >= g_gmock_mutex bool AllPrerequisitesAreSatisfied() const; // Adds unsatisfied pre-requisites of this expectation to 'result'. // L >= g_gmock_mutex void FindUnsatisfiedPrerequisites(ExpectationSet* result) const; // Returns the number this expectation has been invoked. // L >= g_gmock_mutex int call_count() const { g_gmock_mutex.AssertHeld(); return call_count_; } // Increments the number this expectation has been invoked. // L >= g_gmock_mutex void IncrementCallCount() { g_gmock_mutex.AssertHeld(); call_count_++; } private: friend class ::testing::Sequence; friend class ::testing::internal::ExpectationTester; template friend class TypedExpectation; // This group of fields are part of the spec and won't change after // an EXPECT_CALL() statement finishes. const char* file_; // The file that contains the expectation. int line_; // The line number of the expectation. const string source_text_; // The EXPECT_CALL(...) source text. // True iff the cardinality is specified explicitly. bool cardinality_specified_; Cardinality cardinality_; // The cardinality of the expectation. // The immediate pre-requisites (i.e. expectations that must be // satisfied before this expectation can be matched) of this // expectation. We use linked_ptr in the set because we want an // Expectation object to be co-owned by its FunctionMocker and its // successors. This allows multiple mock objects to be deleted at // different times. ExpectationSet immediate_prerequisites_; // This group of fields are the current state of the expectation, // and can change as the mock function is called. int call_count_; // How many times this expectation has been invoked. bool retired_; // True iff this expectation has retired. GTEST_DISALLOW_ASSIGN_(ExpectationBase); }; // class ExpectationBase // Impements an expectation for the given function type. template class TypedExpectation : public ExpectationBase { public: typedef typename Function::ArgumentTuple ArgumentTuple; typedef typename Function::ArgumentMatcherTuple ArgumentMatcherTuple; typedef typename Function::Result Result; TypedExpectation(FunctionMockerBase* owner, const char* a_file, int a_line, const string& a_source_text, const ArgumentMatcherTuple& m) : ExpectationBase(a_file, a_line, a_source_text), owner_(owner), matchers_(m), extra_matcher_specified_(false), // By default, extra_matcher_ should match anything. However, // we cannot initialize it with _ as that triggers a compiler // bug in Symbian's C++ compiler (cannot decide between two // overloaded constructors of Matcher). extra_matcher_(A()), repeated_action_specified_(false), repeated_action_(DoDefault()), retires_on_saturation_(false), last_clause_(kNone), action_count_checked_(false) {} virtual ~TypedExpectation() { // Check the validity of the action count if it hasn't been done // yet (for example, if the expectation was never used). CheckActionCountIfNotDone(); } // Implements the .With() clause. TypedExpectation& With(const Matcher& m) { if (last_clause_ == kWith) { ExpectSpecProperty(false, ".With() cannot appear " "more than once in an EXPECT_CALL()."); } else { ExpectSpecProperty(last_clause_ < kWith, ".With() must be the first " "clause in an EXPECT_CALL()."); } last_clause_ = kWith; extra_matcher_ = m; extra_matcher_specified_ = true; return *this; } // Implements the .Times() clause. TypedExpectation& Times(const Cardinality& a_cardinality) { if (last_clause_ ==kTimes) { ExpectSpecProperty(false, ".Times() cannot appear " "more than once in an EXPECT_CALL()."); } else { ExpectSpecProperty(last_clause_ < kTimes, ".Times() cannot appear after " ".InSequence(), .WillOnce(), .WillRepeatedly(), " "or .RetiresOnSaturation()."); } last_clause_ = kTimes; ExpectationBase::SpecifyCardinality(a_cardinality); return *this; } // Implements the .Times() clause. TypedExpectation& Times(int n) { return Times(Exactly(n)); } // Implements the .InSequence() clause. TypedExpectation& InSequence(const Sequence& s) { ExpectSpecProperty(last_clause_ <= kInSequence, ".InSequence() cannot appear after .After()," " .WillOnce(), .WillRepeatedly(), or " ".RetiresOnSaturation()."); last_clause_ = kInSequence; s.AddExpectation(GetHandle()); return *this; } TypedExpectation& InSequence(const Sequence& s1, const Sequence& s2) { return InSequence(s1).InSequence(s2); } TypedExpectation& InSequence(const Sequence& s1, const Sequence& s2, const Sequence& s3) { return InSequence(s1, s2).InSequence(s3); } TypedExpectation& InSequence(const Sequence& s1, const Sequence& s2, const Sequence& s3, const Sequence& s4) { return InSequence(s1, s2, s3).InSequence(s4); } TypedExpectation& InSequence(const Sequence& s1, const Sequence& s2, const Sequence& s3, const Sequence& s4, const Sequence& s5) { return InSequence(s1, s2, s3, s4).InSequence(s5); } // Implements that .After() clause. TypedExpectation& After(const ExpectationSet& s) { ExpectSpecProperty(last_clause_ <= kAfter, ".After() cannot appear after .WillOnce()," " .WillRepeatedly(), or " ".RetiresOnSaturation()."); last_clause_ = kAfter; for (ExpectationSet::const_iterator it = s.begin(); it != s.end(); ++it) { immediate_prerequisites_ += *it; } return *this; } TypedExpectation& After(const ExpectationSet& s1, const ExpectationSet& s2) { return After(s1).After(s2); } TypedExpectation& After(const ExpectationSet& s1, const ExpectationSet& s2, const ExpectationSet& s3) { return After(s1, s2).After(s3); } TypedExpectation& After(const ExpectationSet& s1, const ExpectationSet& s2, const ExpectationSet& s3, const ExpectationSet& s4) { return After(s1, s2, s3).After(s4); } TypedExpectation& After(const ExpectationSet& s1, const ExpectationSet& s2, const ExpectationSet& s3, const ExpectationSet& s4, const ExpectationSet& s5) { return After(s1, s2, s3, s4).After(s5); } // Implements the .WillOnce() clause. TypedExpectation& WillOnce(const Action& action) { ExpectSpecProperty(last_clause_ <= kWillOnce, ".WillOnce() cannot appear after " ".WillRepeatedly() or .RetiresOnSaturation()."); last_clause_ = kWillOnce; actions_.push_back(action); if (!cardinality_specified()) { set_cardinality(Exactly(static_cast(actions_.size()))); } return *this; } // Implements the .WillRepeatedly() clause. TypedExpectation& WillRepeatedly(const Action& action) { if (last_clause_ == kWillRepeatedly) { ExpectSpecProperty(false, ".WillRepeatedly() cannot appear " "more than once in an EXPECT_CALL()."); } else { ExpectSpecProperty(last_clause_ < kWillRepeatedly, ".WillRepeatedly() cannot appear " "after .RetiresOnSaturation()."); } last_clause_ = kWillRepeatedly; repeated_action_specified_ = true; repeated_action_ = action; if (!cardinality_specified()) { set_cardinality(AtLeast(static_cast(actions_.size()))); } // Now that no more action clauses can be specified, we check // whether their count makes sense. CheckActionCountIfNotDone(); return *this; } // Implements the .RetiresOnSaturation() clause. TypedExpectation& RetiresOnSaturation() { ExpectSpecProperty(last_clause_ < kRetiresOnSaturation, ".RetiresOnSaturation() cannot appear " "more than once."); last_clause_ = kRetiresOnSaturation; retires_on_saturation_ = true; // Now that no more action clauses can be specified, we check // whether their count makes sense. CheckActionCountIfNotDone(); return *this; } // Returns the matchers for the arguments as specified inside the // EXPECT_CALL() macro. const ArgumentMatcherTuple& matchers() const { return matchers_; } // Returns the matcher specified by the .With() clause. const Matcher& extra_matcher() const { return extra_matcher_; } // Returns the sequence of actions specified by the .WillOnce() clause. const std::vector >& actions() const { return actions_; } // Returns the action specified by the .WillRepeatedly() clause. const Action& repeated_action() const { return repeated_action_; } // Returns true iff the .RetiresOnSaturation() clause was specified. bool retires_on_saturation() const { return retires_on_saturation_; } // Describes how many times a function call matching this // expectation has occurred (implements // ExpectationBase::DescribeCallCountTo()). // L >= g_gmock_mutex virtual void DescribeCallCountTo(::std::ostream* os) const { g_gmock_mutex.AssertHeld(); // Describes how many times the function is expected to be called. *os << " Expected: to be "; cardinality().DescribeTo(os); *os << "\n Actual: "; Cardinality::DescribeActualCallCountTo(call_count(), os); // Describes the state of the expectation (e.g. is it satisfied? // is it active?). *os << " - " << (IsOverSaturated() ? "over-saturated" : IsSaturated() ? "saturated" : IsSatisfied() ? "satisfied" : "unsatisfied") << " and " << (is_retired() ? "retired" : "active"); } void MaybeDescribeExtraMatcherTo(::std::ostream* os) { if (extra_matcher_specified_) { *os << " Expected args: "; extra_matcher_.DescribeTo(os); *os << "\n"; } } private: template friend class FunctionMockerBase; // Returns an Expectation object that references and co-owns this // expectation. virtual Expectation GetHandle() { return owner_->GetHandleOf(this); } // The following methods will be called only after the EXPECT_CALL() // statement finishes and when the current thread holds // g_gmock_mutex. // Returns true iff this expectation matches the given arguments. // L >= g_gmock_mutex bool Matches(const ArgumentTuple& args) const { g_gmock_mutex.AssertHeld(); return TupleMatches(matchers_, args) && extra_matcher_.Matches(args); } // Returns true iff this expectation should handle the given arguments. // L >= g_gmock_mutex bool ShouldHandleArguments(const ArgumentTuple& args) const { g_gmock_mutex.AssertHeld(); // In case the action count wasn't checked when the expectation // was defined (e.g. if this expectation has no WillRepeatedly() // or RetiresOnSaturation() clause), we check it when the // expectation is used for the first time. CheckActionCountIfNotDone(); return !is_retired() && AllPrerequisitesAreSatisfied() && Matches(args); } // Describes the result of matching the arguments against this // expectation to the given ostream. // L >= g_gmock_mutex void ExplainMatchResultTo(const ArgumentTuple& args, ::std::ostream* os) const { g_gmock_mutex.AssertHeld(); if (is_retired()) { *os << " Expected: the expectation is active\n" << " Actual: it is retired\n"; } else if (!Matches(args)) { if (!TupleMatches(matchers_, args)) { ExplainMatchFailureTupleTo(matchers_, args, os); } StringMatchResultListener listener; if (!extra_matcher_.MatchAndExplain(args, &listener)) { *os << " Expected args: "; extra_matcher_.DescribeTo(os); *os << "\n Actual: don't match"; internal::PrintIfNotEmpty(listener.str(), os); *os << "\n"; } } else if (!AllPrerequisitesAreSatisfied()) { *os << " Expected: all pre-requisites are satisfied\n" << " Actual: the following immediate pre-requisites " << "are not satisfied:\n"; ExpectationSet unsatisfied_prereqs; FindUnsatisfiedPrerequisites(&unsatisfied_prereqs); int i = 0; for (ExpectationSet::const_iterator it = unsatisfied_prereqs.begin(); it != unsatisfied_prereqs.end(); ++it) { it->expectation_base()->DescribeLocationTo(os); *os << "pre-requisite #" << i++ << "\n"; } *os << " (end of pre-requisites)\n"; } else { // This line is here just for completeness' sake. It will never // be executed as currently the ExplainMatchResultTo() function // is called only when the mock function call does NOT match the // expectation. *os << "The call matches the expectation.\n"; } } // Returns the action that should be taken for the current invocation. // L >= g_gmock_mutex const Action& GetCurrentAction(const FunctionMockerBase* mocker, const ArgumentTuple& args) const { g_gmock_mutex.AssertHeld(); const int count = call_count(); Assert(count >= 1, __FILE__, __LINE__, "call_count() is <= 0 when GetCurrentAction() is " "called - this should never happen."); const int action_count = static_cast(actions().size()); if (action_count > 0 && !repeated_action_specified_ && count > action_count) { // If there is at least one WillOnce() and no WillRepeatedly(), // we warn the user when the WillOnce() clauses ran out. ::std::stringstream ss; DescribeLocationTo(&ss); ss << "Actions ran out in " << source_text() << "...\n" << "Called " << count << " times, but only " << action_count << " WillOnce()" << (action_count == 1 ? " is" : "s are") << " specified - "; mocker->DescribeDefaultActionTo(args, &ss); Log(WARNING, ss.str(), 1); } return count <= action_count ? actions()[count - 1] : repeated_action(); } // Given the arguments of a mock function call, if the call will // over-saturate this expectation, returns the default action; // otherwise, returns the next action in this expectation. Also // describes *what* happened to 'what', and explains *why* Google // Mock does it to 'why'. This method is not const as it calls // IncrementCallCount(). // L >= g_gmock_mutex Action GetActionForArguments(const FunctionMockerBase* mocker, const ArgumentTuple& args, ::std::ostream* what, ::std::ostream* why) { g_gmock_mutex.AssertHeld(); if (IsSaturated()) { // We have an excessive call. IncrementCallCount(); *what << "Mock function called more times than expected - "; mocker->DescribeDefaultActionTo(args, what); DescribeCallCountTo(why); // TODO(wan): allow the user to control whether unexpected calls // should fail immediately or continue using a flag // --gmock_unexpected_calls_are_fatal. return DoDefault(); } IncrementCallCount(); RetireAllPreRequisites(); if (retires_on_saturation() && IsSaturated()) { Retire(); } // Must be done after IncrementCount()! *what << "Mock function call matches " << source_text() <<"...\n"; return GetCurrentAction(mocker, args); } // Checks the action count (i.e. the number of WillOnce() and // WillRepeatedly() clauses) against the cardinality if this hasn't // been done before. Prints a warning if there are too many or too // few actions. // L < mutex_ void CheckActionCountIfNotDone() const { bool should_check = false; { MutexLock l(&mutex_); if (!action_count_checked_) { action_count_checked_ = true; should_check = true; } } if (should_check) { if (!cardinality_specified_) { // The cardinality was inferred - no need to check the action // count against it. return; } // The cardinality was explicitly specified. const int action_count = static_cast(actions_.size()); const int upper_bound = cardinality().ConservativeUpperBound(); const int lower_bound = cardinality().ConservativeLowerBound(); bool too_many; // True if there are too many actions, or false // if there are too few. if (action_count > upper_bound || (action_count == upper_bound && repeated_action_specified_)) { too_many = true; } else if (0 < action_count && action_count < lower_bound && !repeated_action_specified_) { too_many = false; } else { return; } ::std::stringstream ss; DescribeLocationTo(&ss); ss << "Too " << (too_many ? "many" : "few") << " actions specified in " << source_text() << "...\n" << "Expected to be "; cardinality().DescribeTo(&ss); ss << ", but has " << (too_many ? "" : "only ") << action_count << " WillOnce()" << (action_count == 1 ? "" : "s"); if (repeated_action_specified_) { ss << " and a WillRepeatedly()"; } ss << "."; Log(WARNING, ss.str(), -1); // -1 means "don't print stack trace". } } // All the fields below won't change once the EXPECT_CALL() // statement finishes. FunctionMockerBase* const owner_; ArgumentMatcherTuple matchers_; bool extra_matcher_specified_; Matcher extra_matcher_; std::vector > actions_; bool repeated_action_specified_; // True if a WillRepeatedly() was specified. Action repeated_action_; bool retires_on_saturation_; Clause last_clause_; mutable bool action_count_checked_; // Under mutex_. mutable Mutex mutex_; // Protects action_count_checked_. GTEST_DISALLOW_COPY_AND_ASSIGN_(TypedExpectation); }; // class TypedExpectation // A MockSpec object is used by ON_CALL() or EXPECT_CALL() for // specifying the default behavior of, or expectation on, a mock // function. // Note: class MockSpec really belongs to the ::testing namespace. // However if we define it in ::testing, MSVC will complain when // classes in ::testing::internal declare it as a friend class // template. To workaround this compiler bug, we define MockSpec in // ::testing::internal and import it into ::testing. template class MockSpec { public: typedef typename internal::Function::ArgumentTuple ArgumentTuple; typedef typename internal::Function::ArgumentMatcherTuple ArgumentMatcherTuple; // Constructs a MockSpec object, given the function mocker object // that the spec is associated with. explicit MockSpec(internal::FunctionMockerBase* function_mocker) : function_mocker_(function_mocker) {} // Adds a new default action spec to the function mocker and returns // the newly created spec. internal::DefaultActionSpec& InternalDefaultActionSetAt( const char* file, int line, const char* obj, const char* call) { LogWithLocation(internal::INFO, file, line, string("ON_CALL(") + obj + ", " + call + ") invoked"); return function_mocker_->AddNewDefaultActionSpec(file, line, matchers_); } // Adds a new expectation spec to the function mocker and returns // the newly created spec. internal::TypedExpectation& InternalExpectedAt( const char* file, int line, const char* obj, const char* call) { const string source_text(string("EXPECT_CALL(") + obj + ", " + call + ")"); LogWithLocation(internal::INFO, file, line, source_text + " invoked"); return function_mocker_->AddNewExpectation( file, line, source_text, matchers_); } private: template friend class internal::FunctionMocker; void SetMatchers(const ArgumentMatcherTuple& matchers) { matchers_ = matchers; } // Logs a message including file and line number information. void LogWithLocation(testing::internal::LogSeverity severity, const char* file, int line, const string& message) { ::std::ostringstream s; s << file << ":" << line << ": " << message << ::std::endl; Log(severity, s.str(), 0); } // The function mocker that owns this spec. internal::FunctionMockerBase* const function_mocker_; // The argument matchers specified in the spec. ArgumentMatcherTuple matchers_; GTEST_DISALLOW_ASSIGN_(MockSpec); }; // class MockSpec // MSVC warns about using 'this' in base member initializer list, so // we need to temporarily disable the warning. We have to do it for // the entire class to suppress the warning, even though it's about // the constructor only. #ifdef _MSC_VER #pragma warning(push) // Saves the current warning state. #pragma warning(disable:4355) // Temporarily disables warning 4355. #endif // _MSV_VER // C++ treats the void type specially. For example, you cannot define // a void-typed variable or pass a void value to a function. // ActionResultHolder holds a value of type T, where T must be a // copyable type or void (T doesn't need to be default-constructable). // It hides the syntactic difference between void and other types, and // is used to unify the code for invoking both void-returning and // non-void-returning mock functions. This generic definition is used // when T is not void. template class ActionResultHolder { public: explicit ActionResultHolder(T a_value) : value_(a_value) {} // The compiler-generated copy constructor and assignment operator // are exactly what we need, so we don't need to define them. T value() const { return value_; } // Prints the held value as an action's result to os. void PrintAsActionResult(::std::ostream* os) const { *os << "\n Returns: "; UniversalPrinter::Print(value_, os); } // Performs the given mock function's default action and returns the // result in a ActionResultHolder. template static ActionResultHolder PerformDefaultAction( const FunctionMockerBase* func_mocker, const Arguments& args, const string& call_description) { return ActionResultHolder( func_mocker->PerformDefaultAction(args, call_description)); } // Performs the given action and returns the result in a // ActionResultHolder. template static ActionResultHolder PerformAction(const Action& action, const Arguments& args) { return ActionResultHolder(action.Perform(args)); } private: T value_; // T could be a reference type, so = isn't supported. GTEST_DISALLOW_ASSIGN_(ActionResultHolder); }; // Specialization for T = void. template <> class ActionResultHolder { public: ActionResultHolder() {} void value() const {} void PrintAsActionResult(::std::ostream* /* os */) const {} template static ActionResultHolder PerformDefaultAction( const FunctionMockerBase* func_mocker, const Arguments& args, const string& call_description) { func_mocker->PerformDefaultAction(args, call_description); return ActionResultHolder(); } template static ActionResultHolder PerformAction(const Action& action, const Arguments& args) { action.Perform(args); return ActionResultHolder(); } }; // The base of the function mocker class for the given function type. // We put the methods in this class instead of its child to avoid code // bloat. template class FunctionMockerBase : public UntypedFunctionMockerBase { public: typedef typename Function::Result Result; typedef typename Function::ArgumentTuple ArgumentTuple; typedef typename Function::ArgumentMatcherTuple ArgumentMatcherTuple; FunctionMockerBase() : mock_obj_(NULL), name_(""), current_spec_(this) {} // The destructor verifies that all expectations on this mock // function have been satisfied. If not, it will report Google Test // non-fatal failures for the violations. // L < g_gmock_mutex virtual ~FunctionMockerBase() { MutexLock l(&g_gmock_mutex); VerifyAndClearExpectationsLocked(); Mock::UnregisterLocked(this); } // Returns the ON_CALL spec that matches this mock function with the // given arguments; returns NULL if no matching ON_CALL is found. // L = * const DefaultActionSpec* FindDefaultActionSpec( const ArgumentTuple& args) const { for (typename std::vector >::const_reverse_iterator it = default_actions_.rbegin(); it != default_actions_.rend(); ++it) { const DefaultActionSpec& spec = *it; if (spec.Matches(args)) return &spec; } return NULL; } // Performs the default action of this mock function on the given arguments // and returns the result. Asserts with a helpful call descrption if there is // no valid return value. This method doesn't depend on the mutable state of // this object, and thus can be called concurrently without locking. // L = * Result PerformDefaultAction(const ArgumentTuple& args, const string& call_description) const { const DefaultActionSpec* const spec = FindDefaultActionSpec(args); if (spec != NULL) { return spec->GetAction().Perform(args); } Assert(DefaultValue::Exists(), "", -1, call_description + "\n The mock function has no default action " "set, and its return type has no default value set."); return DefaultValue::Get(); } // Registers this function mocker and the mock object owning it; // returns a reference to the function mocker object. This is only // called by the ON_CALL() and EXPECT_CALL() macros. // L < g_gmock_mutex FunctionMocker& RegisterOwner(const void* mock_obj) { { MutexLock l(&g_gmock_mutex); mock_obj_ = mock_obj; } Mock::Register(mock_obj, this); return *::testing::internal::down_cast*>(this); } // The following two functions are from UntypedFunctionMockerBase. // Verifies that all expectations on this mock function have been // satisfied. Reports one or more Google Test non-fatal failures // and returns false if not. // L >= g_gmock_mutex virtual bool VerifyAndClearExpectationsLocked(); // Clears the ON_CALL()s set on this mock function. // L >= g_gmock_mutex virtual void ClearDefaultActionsLocked() { g_gmock_mutex.AssertHeld(); default_actions_.clear(); } // Sets the name of the function being mocked. Will be called upon // each invocation of this mock function. // L < g_gmock_mutex void SetOwnerAndName(const void* mock_obj, const char* name) { // We protect name_ under g_gmock_mutex in case this mock function // is called from two threads concurrently. MutexLock l(&g_gmock_mutex); mock_obj_ = mock_obj; name_ = name; } // Returns the address of the mock object this method belongs to. // Must be called after SetOwnerAndName() has been called. // L < g_gmock_mutex const void* MockObject() const { const void* mock_obj; { // We protect mock_obj_ under g_gmock_mutex in case this mock // function is called from two threads concurrently. MutexLock l(&g_gmock_mutex); mock_obj = mock_obj_; } return mock_obj; } // Returns the name of the function being mocked. Must be called // after SetOwnerAndName() has been called. // L < g_gmock_mutex const char* Name() const { const char* name; { // We protect name_ under g_gmock_mutex in case this mock // function is called from two threads concurrently. MutexLock l(&g_gmock_mutex); name = name_; } return name; } protected: template friend class MockSpec; // Returns the result of invoking this mock function with the given // arguments. This function can be safely called from multiple // threads concurrently. // L < g_gmock_mutex Result InvokeWith(const ArgumentTuple& args); // Adds and returns a default action spec for this mock function. // L < g_gmock_mutex DefaultActionSpec& AddNewDefaultActionSpec( const char* file, int line, const ArgumentMatcherTuple& m) { Mock::RegisterUseByOnCallOrExpectCall(MockObject(), file, line); default_actions_.push_back(DefaultActionSpec(file, line, m)); return default_actions_.back(); } // Adds and returns an expectation spec for this mock function. // L < g_gmock_mutex TypedExpectation& AddNewExpectation( const char* file, int line, const string& source_text, const ArgumentMatcherTuple& m) { Mock::RegisterUseByOnCallOrExpectCall(MockObject(), file, line); const linked_ptr > expectation( new TypedExpectation(this, file, line, source_text, m)); expectations_.push_back(expectation); // Adds this expectation into the implicit sequence if there is one. Sequence* const implicit_sequence = g_gmock_implicit_sequence.get(); if (implicit_sequence != NULL) { implicit_sequence->AddExpectation(Expectation(expectation)); } return *expectation; } // The current spec (either default action spec or expectation spec) // being described on this function mocker. MockSpec& current_spec() { return current_spec_; } private: template friend class TypedExpectation; typedef std::vector > > TypedExpectations; // Returns an Expectation object that references and co-owns exp, // which must be an expectation on this mock function. Expectation GetHandleOf(TypedExpectation* exp) { for (typename TypedExpectations::const_iterator it = expectations_.begin(); it != expectations_.end(); ++it) { if (it->get() == exp) { return Expectation(*it); } } Assert(false, __FILE__, __LINE__, "Cannot find expectation."); return Expectation(); // The above statement is just to make the code compile, and will // never be executed. } // Some utilities needed for implementing InvokeWith(). // Describes what default action will be performed for the given // arguments. // L = * void DescribeDefaultActionTo(const ArgumentTuple& args, ::std::ostream* os) const { const DefaultActionSpec* const spec = FindDefaultActionSpec(args); if (spec == NULL) { *os << (internal::type_equals::value ? "returning directly.\n" : "returning default value.\n"); } else { *os << "taking default action specified at:\n" << spec->file() << ":" << spec->line() << ":\n"; } } // Writes a message that the call is uninteresting (i.e. neither // explicitly expected nor explicitly unexpected) to the given // ostream. // L < g_gmock_mutex void DescribeUninterestingCall(const ArgumentTuple& args, ::std::ostream* os) const { *os << "Uninteresting mock function call - "; DescribeDefaultActionTo(args, os); *os << " Function call: " << Name(); UniversalPrinter::Print(args, os); } // Critical section: We must find the matching expectation and the // corresponding action that needs to be taken in an ATOMIC // transaction. Otherwise another thread may call this mock // method in the middle and mess up the state. // // However, performing the action has to be left out of the critical // section. The reason is that we have no control on what the // action does (it can invoke an arbitrary user function or even a // mock function) and excessive locking could cause a dead lock. // L < g_gmock_mutex bool FindMatchingExpectationAndAction( const ArgumentTuple& args, TypedExpectation** exp, Action* action, bool* is_excessive, ::std::ostream* what, ::std::ostream* why) { MutexLock l(&g_gmock_mutex); *exp = this->FindMatchingExpectationLocked(args); if (*exp == NULL) { // A match wasn't found. *action = DoDefault(); this->FormatUnexpectedCallMessageLocked(args, what, why); return false; } // This line must be done before calling GetActionForArguments(), // which will increment the call count for *exp and thus affect // its saturation status. *is_excessive = (*exp)->IsSaturated(); *action = (*exp)->GetActionForArguments(this, args, what, why); return true; } // Returns the expectation that matches the arguments, or NULL if no // expectation matches them. // L >= g_gmock_mutex TypedExpectation* FindMatchingExpectationLocked( const ArgumentTuple& args) const { g_gmock_mutex.AssertHeld(); for (typename TypedExpectations::const_reverse_iterator it = expectations_.rbegin(); it != expectations_.rend(); ++it) { TypedExpectation* const exp = it->get(); if (exp->ShouldHandleArguments(args)) { return exp; } } return NULL; } // Returns a message that the arguments don't match any expectation. // L >= g_gmock_mutex void FormatUnexpectedCallMessageLocked(const ArgumentTuple& args, ::std::ostream* os, ::std::ostream* why) const { g_gmock_mutex.AssertHeld(); *os << "\nUnexpected mock function call - "; DescribeDefaultActionTo(args, os); PrintTriedExpectationsLocked(args, why); } // Prints a list of expectations that have been tried against the // current mock function call. // L >= g_gmock_mutex void PrintTriedExpectationsLocked(const ArgumentTuple& args, ::std::ostream* why) const { g_gmock_mutex.AssertHeld(); const int count = static_cast(expectations_.size()); *why << "Google Mock tried the following " << count << " " << (count == 1 ? "expectation, but it didn't match" : "expectations, but none matched") << ":\n"; for (int i = 0; i < count; i++) { *why << "\n"; expectations_[i]->DescribeLocationTo(why); if (count > 1) { *why << "tried expectation #" << i << ": "; } *why << expectations_[i]->source_text() << "...\n"; expectations_[i]->ExplainMatchResultTo(args, why); expectations_[i]->DescribeCallCountTo(why); } } // Address of the mock object this mock method belongs to. Only // valid after this mock method has been called or // ON_CALL/EXPECT_CALL has been invoked on it. const void* mock_obj_; // Protected by g_gmock_mutex. // Name of the function being mocked. Only valid after this mock // method has been called. const char* name_; // Protected by g_gmock_mutex. // The current spec (either default action spec or expectation spec) // being described on this function mocker. MockSpec current_spec_; // All default action specs for this function mocker. std::vector > default_actions_; // All expectations for this function mocker. TypedExpectations expectations_; // There is no generally useful and implementable semantics of // copying a mock object, so copying a mock is usually a user error. // Thus we disallow copying function mockers. If the user really // wants to copy a mock object, he should implement his own copy // operation, for example: // // class MockFoo : public Foo { // public: // // Defines a copy constructor explicitly. // MockFoo(const MockFoo& src) {} // ... // }; GTEST_DISALLOW_COPY_AND_ASSIGN_(FunctionMockerBase); }; // class FunctionMockerBase #ifdef _MSC_VER #pragma warning(pop) // Restores the warning state. #endif // _MSV_VER // Implements methods of FunctionMockerBase. // Verifies that all expectations on this mock function have been // satisfied. Reports one or more Google Test non-fatal failures and // returns false if not. // L >= g_gmock_mutex template bool FunctionMockerBase::VerifyAndClearExpectationsLocked() { g_gmock_mutex.AssertHeld(); bool expectations_met = true; for (typename TypedExpectations::const_iterator it = expectations_.begin(); it != expectations_.end(); ++it) { TypedExpectation* const exp = it->get(); if (exp->IsOverSaturated()) { // There was an upper-bound violation. Since the error was // already reported when it occurred, there is no need to do // anything here. expectations_met = false; } else if (!exp->IsSatisfied()) { expectations_met = false; ::std::stringstream ss; ss << "Actual function call count doesn't match " << exp->source_text() << "...\n"; // No need to show the source file location of the expectation // in the description, as the Expect() call that follows already // takes care of it. exp->MaybeDescribeExtraMatcherTo(&ss); exp->DescribeCallCountTo(&ss); Expect(false, exp->file(), exp->line(), ss.str()); } } expectations_.clear(); return expectations_met; } // Reports an uninteresting call (whose description is in msg) in the // manner specified by 'reaction'. void ReportUninterestingCall(CallReaction reaction, const string& msg); // Calculates the result of invoking this mock function with the given // arguments, prints it, and returns it. // L < g_gmock_mutex template typename Function::Result FunctionMockerBase::InvokeWith( const typename Function::ArgumentTuple& args) { typedef ActionResultHolder ResultHolder; if (expectations_.size() == 0) { // No expectation is set on this mock method - we have an // uninteresting call. // We must get Google Mock's reaction on uninteresting calls // made on this mock object BEFORE performing the action, // because the action may DELETE the mock object and make the // following expression meaningless. const CallReaction reaction = Mock::GetReactionOnUninterestingCalls(MockObject()); // True iff we need to print this call's arguments and return // value. This definition must be kept in sync with // the behavior of ReportUninterestingCall(). const bool need_to_report_uninteresting_call = // If the user allows this uninteresting call, we print it // only when he wants informational messages. reaction == ALLOW ? LogIsVisible(INFO) : // If the user wants this to be a warning, we print it only // when he wants to see warnings. reaction == WARN ? LogIsVisible(WARNING) : // Otherwise, the user wants this to be an error, and we // should always print detailed information in the error. true; if (!need_to_report_uninteresting_call) { // Perform the action without printing the call information. return PerformDefaultAction(args, ""); } // Warns about the uninteresting call. ::std::stringstream ss; DescribeUninterestingCall(args, &ss); // Calculates the function result. const ResultHolder result = ResultHolder::PerformDefaultAction(this, args, ss.str()); // Prints the function result. result.PrintAsActionResult(&ss); ReportUninterestingCall(reaction, ss.str()); return result.value(); } bool is_excessive = false; ::std::stringstream ss; ::std::stringstream why; ::std::stringstream loc; Action action; TypedExpectation* exp; // The FindMatchingExpectationAndAction() function acquires and // releases g_gmock_mutex. const bool found = FindMatchingExpectationAndAction( args, &exp, &action, &is_excessive, &ss, &why); // True iff we need to print the call's arguments and return value. // This definition must be kept in sync with the uses of Expect() // and Log() in this function. const bool need_to_report_call = !found || is_excessive || LogIsVisible(INFO); if (!need_to_report_call) { // Perform the action without printing the call information. return action.IsDoDefault() ? PerformDefaultAction(args, "") : action.Perform(args); } ss << " Function call: " << Name(); UniversalPrinter::Print(args, &ss); // In case the action deletes a piece of the expectation, we // generate the message beforehand. if (found && !is_excessive) { exp->DescribeLocationTo(&loc); } const ResultHolder result = action.IsDoDefault() ? ResultHolder::PerformDefaultAction(this, args, ss.str()) : ResultHolder::PerformAction(action, args); result.PrintAsActionResult(&ss); ss << "\n" << why.str(); if (!found) { // No expectation matches this call - reports a failure. Expect(false, NULL, -1, ss.str()); } else if (is_excessive) { // We had an upper-bound violation and the failure message is in ss. Expect(false, exp->file(), exp->line(), ss.str()); } else { // We had an expected call and the matching expectation is // described in ss. Log(INFO, loc.str() + ss.str(), 2); } return result.value(); } } // namespace internal // The style guide prohibits "using" statements in a namespace scope // inside a header file. However, the MockSpec class template is // meant to be defined in the ::testing namespace. The following line // is just a trick for working around a bug in MSVC 8.0, which cannot // handle it if we define MockSpec in ::testing. using internal::MockSpec; // Const(x) is a convenient function for obtaining a const reference // to x. This is useful for setting expectations on an overloaded // const mock method, e.g. // // class MockFoo : public FooInterface { // public: // MOCK_METHOD0(Bar, int()); // MOCK_CONST_METHOD0(Bar, int&()); // }; // // MockFoo foo; // // Expects a call to non-const MockFoo::Bar(). // EXPECT_CALL(foo, Bar()); // // Expects a call to const MockFoo::Bar(). // EXPECT_CALL(Const(foo), Bar()); template inline const T& Const(const T& x) { return x; } // Constructs an Expectation object that references and co-owns exp. inline Expectation::Expectation(internal::ExpectationBase& exp) // NOLINT : expectation_base_(exp.GetHandle().expectation_base()) {} } // namespace testing // A separate macro is required to avoid compile errors when the name // of the method used in call is a result of macro expansion. // See CompilesWithMethodNameExpandedFromMacro tests in // internal/gmock-spec-builders_test.cc for more details. #define GMOCK_ON_CALL_IMPL_(obj, call) \ ((obj).gmock_##call).InternalDefaultActionSetAt(__FILE__, __LINE__, \ #obj, #call) #define ON_CALL(obj, call) GMOCK_ON_CALL_IMPL_(obj, call) #define GMOCK_EXPECT_CALL_IMPL_(obj, call) \ ((obj).gmock_##call).InternalExpectedAt(__FILE__, __LINE__, #obj, #call) #define EXPECT_CALL(obj, call) GMOCK_EXPECT_CALL_IMPL_(obj, call) #endif // GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/include/gmock/gmock.h000066400000000000000000000070331260417502300262360ustar00rootroot00000000000000// Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Google Mock - a framework for writing C++ mock classes. // // This is the main header file a user should include. #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_H_ #define GMOCK_INCLUDE_GMOCK_GMOCK_H_ // This file implements the following syntax: // // ON_CALL(mock_object.Method(...)) // .With(...) ? // .WillByDefault(...); // // where With() is optional and WillByDefault() must appear exactly // once. // // EXPECT_CALL(mock_object.Method(...)) // .With(...) ? // .Times(...) ? // .InSequence(...) * // .WillOnce(...) * // .WillRepeatedly(...) ? // .RetiresOnSaturation() ? ; // // where all clauses are optional and WillOnce() can be repeated. #include #include #include #include #include #include #include #include #include #include namespace testing { // Declares Google Mock flags that we want a user to use programmatically. GMOCK_DECLARE_bool_(catch_leaked_mocks); GMOCK_DECLARE_string_(verbose); // Initializes Google Mock. This must be called before running the // tests. In particular, it parses the command line for the flags // that Google Mock recognizes. Whenever a Google Mock flag is seen, // it is removed from argv, and *argc is decremented. // // No value is returned. Instead, the Google Mock flag variables are // updated. // // Since Google Test is needed for Google Mock to work, this function // also initializes Google Test and parses its flags, if that hasn't // been done. void InitGoogleMock(int* argc, char** argv); // This overloaded version can be used in Windows programs compiled in // UNICODE mode. void InitGoogleMock(int* argc, wchar_t** argv); } // namespace testing #endif // GMOCK_INCLUDE_GMOCK_GMOCK_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/include/gmock/internal/000077500000000000000000000000001260417502300265765ustar00rootroot00000000000000gmock-generated-internal-utils.h000066400000000000000000000261371260417502300347050ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/include/gmock/internal// This file was GENERATED by a script. DO NOT EDIT BY HAND!!! // Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Google Mock - a framework for writing C++ mock classes. // // This file contains template meta-programming utility classes needed // for implementing Google Mock. #ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_ #define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_ #include namespace testing { template class Matcher; namespace internal { // An IgnoredValue object can be implicitly constructed from ANY value. // This is used in implementing the IgnoreResult(a) action. class IgnoredValue { public: // This constructor template allows any value to be implicitly // converted to IgnoredValue. The object has no data member and // doesn't try to remember anything about the argument. We // deliberately omit the 'explicit' keyword in order to allow the // conversion to be implicit. template IgnoredValue(const T&) {} }; // MatcherTuple::type is a tuple type where each field is a Matcher // for the corresponding field in tuple type T. template struct MatcherTuple; template <> struct MatcherTuple< ::std::tr1::tuple<> > { typedef ::std::tr1::tuple< > type; }; template struct MatcherTuple< ::std::tr1::tuple > { typedef ::std::tr1::tuple > type; }; template struct MatcherTuple< ::std::tr1::tuple > { typedef ::std::tr1::tuple, Matcher > type; }; template struct MatcherTuple< ::std::tr1::tuple > { typedef ::std::tr1::tuple, Matcher, Matcher > type; }; template struct MatcherTuple< ::std::tr1::tuple > { typedef ::std::tr1::tuple, Matcher, Matcher, Matcher > type; }; template struct MatcherTuple< ::std::tr1::tuple > { typedef ::std::tr1::tuple, Matcher, Matcher, Matcher, Matcher > type; }; template struct MatcherTuple< ::std::tr1::tuple > { typedef ::std::tr1::tuple, Matcher, Matcher, Matcher, Matcher, Matcher > type; }; template struct MatcherTuple< ::std::tr1::tuple > { typedef ::std::tr1::tuple, Matcher, Matcher, Matcher, Matcher, Matcher, Matcher > type; }; template struct MatcherTuple< ::std::tr1::tuple > { typedef ::std::tr1::tuple, Matcher, Matcher, Matcher, Matcher, Matcher, Matcher, Matcher > type; }; template struct MatcherTuple< ::std::tr1::tuple > { typedef ::std::tr1::tuple, Matcher, Matcher, Matcher, Matcher, Matcher, Matcher, Matcher, Matcher > type; }; template struct MatcherTuple< ::std::tr1::tuple > { typedef ::std::tr1::tuple, Matcher, Matcher, Matcher, Matcher, Matcher, Matcher, Matcher, Matcher, Matcher > type; }; // Template struct Function, where F must be a function type, contains // the following typedefs: // // Result: the function's return type. // ArgumentN: the type of the N-th argument, where N starts with 1. // ArgumentTuple: the tuple type consisting of all parameters of F. // ArgumentMatcherTuple: the tuple type consisting of Matchers for all // parameters of F. // MakeResultVoid: the function type obtained by substituting void // for the return type of F. // MakeResultIgnoredValue: // the function type obtained by substituting Something // for the return type of F. template struct Function; template struct Function { typedef R Result; typedef ::std::tr1::tuple<> ArgumentTuple; typedef typename MatcherTuple::type ArgumentMatcherTuple; typedef void MakeResultVoid(); typedef IgnoredValue MakeResultIgnoredValue(); }; template struct Function : Function { typedef A1 Argument1; typedef ::std::tr1::tuple ArgumentTuple; typedef typename MatcherTuple::type ArgumentMatcherTuple; typedef void MakeResultVoid(A1); typedef IgnoredValue MakeResultIgnoredValue(A1); }; template struct Function : Function { typedef A2 Argument2; typedef ::std::tr1::tuple ArgumentTuple; typedef typename MatcherTuple::type ArgumentMatcherTuple; typedef void MakeResultVoid(A1, A2); typedef IgnoredValue MakeResultIgnoredValue(A1, A2); }; template struct Function : Function { typedef A3 Argument3; typedef ::std::tr1::tuple ArgumentTuple; typedef typename MatcherTuple::type ArgumentMatcherTuple; typedef void MakeResultVoid(A1, A2, A3); typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3); }; template struct Function : Function { typedef A4 Argument4; typedef ::std::tr1::tuple ArgumentTuple; typedef typename MatcherTuple::type ArgumentMatcherTuple; typedef void MakeResultVoid(A1, A2, A3, A4); typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4); }; template struct Function : Function { typedef A5 Argument5; typedef ::std::tr1::tuple ArgumentTuple; typedef typename MatcherTuple::type ArgumentMatcherTuple; typedef void MakeResultVoid(A1, A2, A3, A4, A5); typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5); }; template struct Function : Function { typedef A6 Argument6; typedef ::std::tr1::tuple ArgumentTuple; typedef typename MatcherTuple::type ArgumentMatcherTuple; typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6); typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6); }; template struct Function : Function { typedef A7 Argument7; typedef ::std::tr1::tuple ArgumentTuple; typedef typename MatcherTuple::type ArgumentMatcherTuple; typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7); typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7); }; template struct Function : Function { typedef A8 Argument8; typedef ::std::tr1::tuple ArgumentTuple; typedef typename MatcherTuple::type ArgumentMatcherTuple; typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8); typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8); }; template struct Function : Function { typedef A9 Argument9; typedef ::std::tr1::tuple ArgumentTuple; typedef typename MatcherTuple::type ArgumentMatcherTuple; typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8, A9); typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8, A9); }; template struct Function : Function { typedef A10 Argument10; typedef ::std::tr1::tuple ArgumentTuple; typedef typename MatcherTuple::type ArgumentMatcherTuple; typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10); typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10); }; } // namespace internal } // namespace testing #endif // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_ gmock-generated-internal-utils.h.pump000066400000000000000000000114271260417502300356610ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/include/gmock/internal$$ -*- mode: c++; -*- $$ This is a Pump source file. Please use Pump to convert it to $$ gmock-generated-function-mockers.h. $$ $var n = 10 $$ The maximum arity we support. // Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Google Mock - a framework for writing C++ mock classes. // // This file contains template meta-programming utility classes needed // for implementing Google Mock. #ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_ #define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_ #include namespace testing { template class Matcher; namespace internal { // An IgnoredValue object can be implicitly constructed from ANY value. // This is used in implementing the IgnoreResult(a) action. class IgnoredValue { public: // This constructor template allows any value to be implicitly // converted to IgnoredValue. The object has no data member and // doesn't try to remember anything about the argument. We // deliberately omit the 'explicit' keyword in order to allow the // conversion to be implicit. template IgnoredValue(const T&) {} }; // MatcherTuple::type is a tuple type where each field is a Matcher // for the corresponding field in tuple type T. template struct MatcherTuple; $range i 0..n $for i [[ $range j 1..i $var typename_As = [[$for j, [[typename A$j]]]] $var As = [[$for j, [[A$j]]]] $var matcher_As = [[$for j, [[Matcher]]]] template <$typename_As> struct MatcherTuple< ::std::tr1::tuple<$As> > { typedef ::std::tr1::tuple<$matcher_As > type; }; ]] // Template struct Function, where F must be a function type, contains // the following typedefs: // // Result: the function's return type. // ArgumentN: the type of the N-th argument, where N starts with 1. // ArgumentTuple: the tuple type consisting of all parameters of F. // ArgumentMatcherTuple: the tuple type consisting of Matchers for all // parameters of F. // MakeResultVoid: the function type obtained by substituting void // for the return type of F. // MakeResultIgnoredValue: // the function type obtained by substituting Something // for the return type of F. template struct Function; template struct Function { typedef R Result; typedef ::std::tr1::tuple<> ArgumentTuple; typedef typename MatcherTuple::type ArgumentMatcherTuple; typedef void MakeResultVoid(); typedef IgnoredValue MakeResultIgnoredValue(); }; $range i 1..n $for i [[ $range j 1..i $var typename_As = [[$for j [[, typename A$j]]]] $var As = [[$for j, [[A$j]]]] $var matcher_As = [[$for j, [[Matcher]]]] $range k 1..i-1 $var prev_As = [[$for k, [[A$k]]]] template struct Function : Function { typedef A$i Argument$i; typedef ::std::tr1::tuple<$As> ArgumentTuple; typedef typename MatcherTuple::type ArgumentMatcherTuple; typedef void MakeResultVoid($As); typedef IgnoredValue MakeResultIgnoredValue($As); }; ]] } // namespace internal } // namespace testing #endif // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/include/gmock/internal/gmock-internal-utils.h000066400000000000000000000714501260417502300330260ustar00rootroot00000000000000// Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Google Mock - a framework for writing C++ mock classes. // // This file defines some utilities useful for implementing Google // Mock. They are subject to change without notice, so please DO NOT // USE THEM IN USER CODE. #ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_ #define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_ #include #include // NOLINT #include #include #include #include // Concatenates two pre-processor symbols; works for concatenating // built-in macros like __FILE__ and __LINE__. #define GMOCK_CONCAT_TOKEN_IMPL_(foo, bar) foo##bar #define GMOCK_CONCAT_TOKEN_(foo, bar) GMOCK_CONCAT_TOKEN_IMPL_(foo, bar) #ifdef __GNUC__ #define GMOCK_ATTRIBUTE_UNUSED_ __attribute__ ((unused)) #else #define GMOCK_ATTRIBUTE_UNUSED_ #endif // __GNUC__ class ProtocolMessage; namespace proto2 { class Message; } namespace testing { namespace internal { // Converts an identifier name to a space-separated list of lower-case // words. Each maximum substring of the form [A-Za-z][a-z]*|\d+ is // treated as one word. For example, both "FooBar123" and // "foo_bar_123" are converted to "foo bar 123". string ConvertIdentifierNameToWords(const char* id_name); // Defining a variable of type CompileAssertTypesEqual will cause a // compiler error iff T1 and T2 are different types. template struct CompileAssertTypesEqual; template struct CompileAssertTypesEqual { }; // Removes the reference from a type if it is a reference type, // otherwise leaves it unchanged. This is the same as // tr1::remove_reference, which is not widely available yet. template struct RemoveReference { typedef T type; }; // NOLINT template struct RemoveReference { typedef T type; }; // NOLINT // A handy wrapper around RemoveReference that works when the argument // T depends on template parameters. #define GMOCK_REMOVE_REFERENCE_(T) \ typename ::testing::internal::RemoveReference::type // Removes const from a type if it is a const type, otherwise leaves // it unchanged. This is the same as tr1::remove_const, which is not // widely available yet. template struct RemoveConst { typedef T type; }; // NOLINT template struct RemoveConst { typedef T type; }; // NOLINT // MSVC 8.0 has a bug which causes the above definition to fail to // remove the const in 'const int[3]'. The following specialization // works around the bug. However, it causes trouble with gcc and thus // needs to be conditionally compiled. #ifdef _MSC_VER template struct RemoveConst { typedef typename RemoveConst::type type[N]; }; #endif // _MSC_VER // A handy wrapper around RemoveConst that works when the argument // T depends on template parameters. #define GMOCK_REMOVE_CONST_(T) \ typename ::testing::internal::RemoveConst::type // Adds reference to a type if it is not a reference type, // otherwise leaves it unchanged. This is the same as // tr1::add_reference, which is not widely available yet. template struct AddReference { typedef T& type; }; // NOLINT template struct AddReference { typedef T& type; }; // NOLINT // A handy wrapper around AddReference that works when the argument T // depends on template parameters. #define GMOCK_ADD_REFERENCE_(T) \ typename ::testing::internal::AddReference::type // Adds a reference to const on top of T as necessary. For example, // it transforms // // char ==> const char& // const char ==> const char& // char& ==> const char& // const char& ==> const char& // // The argument T must depend on some template parameters. #define GMOCK_REFERENCE_TO_CONST_(T) \ GMOCK_ADD_REFERENCE_(const GMOCK_REMOVE_REFERENCE_(T)) // PointeeOf::type is the type of a value pointed to by a // Pointer, which can be either a smart pointer or a raw pointer. The // following default implementation is for the case where Pointer is a // smart pointer. template struct PointeeOf { // Smart pointer classes define type element_type as the type of // their pointees. typedef typename Pointer::element_type type; }; // This specialization is for the raw pointer case. template struct PointeeOf { typedef T type; }; // NOLINT // GetRawPointer(p) returns the raw pointer underlying p when p is a // smart pointer, or returns p itself when p is already a raw pointer. // The following default implementation is for the smart pointer case. template inline typename Pointer::element_type* GetRawPointer(const Pointer& p) { return p.get(); } // This overloaded version is for the raw pointer case. template inline Element* GetRawPointer(Element* p) { return p; } // This comparator allows linked_ptr to be stored in sets. template struct LinkedPtrLessThan { bool operator()(const ::testing::internal::linked_ptr& lhs, const ::testing::internal::linked_ptr& rhs) const { return lhs.get() < rhs.get(); } }; // ImplicitlyConvertible::value is a compile-time bool // constant that's true iff type From can be implicitly converted to // type To. template class ImplicitlyConvertible { private: // We need the following helper functions only for their types. // They have no implementations. // MakeFrom() is an expression whose type is From. We cannot simply // use From(), as the type From may not have a public default // constructor. static From MakeFrom(); // These two functions are overloaded. Given an expression // Helper(x), the compiler will pick the first version if x can be // implicitly converted to type To; otherwise it will pick the // second version. // // The first version returns a value of size 1, and the second // version returns a value of size 2. Therefore, by checking the // size of Helper(x), which can be done at compile time, we can tell // which version of Helper() is used, and hence whether x can be // implicitly converted to type To. static char Helper(To); static char (&Helper(...))[2]; // NOLINT // We have to put the 'public' section after the 'private' section, // or MSVC refuses to compile the code. public: // MSVC warns about implicitly converting from double to int for // possible loss of data, so we need to temporarily disable the // warning. #ifdef _MSC_VER #pragma warning(push) // Saves the current warning state. #pragma warning(disable:4244) // Temporarily disables warning 4244. static const bool value = sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1; #pragma warning(pop) // Restores the warning state. #else static const bool value = sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1; #endif // _MSV_VER }; template const bool ImplicitlyConvertible::value; // Symbian compilation can be done with wchar_t being either a native // type or a typedef. Using Google Mock with OpenC without wchar_t // should require the definition of _STLP_NO_WCHAR_T. // // MSVC treats wchar_t as a native type usually, but treats it as the // same as unsigned short when the compiler option /Zc:wchar_t- is // specified. It defines _NATIVE_WCHAR_T_DEFINED symbol when wchar_t // is a native type. #if (GTEST_OS_SYMBIAN && defined(_STLP_NO_WCHAR_T)) || \ (defined(_MSC_VER) && !defined(_NATIVE_WCHAR_T_DEFINED)) // wchar_t is a typedef. #else #define GMOCK_WCHAR_T_IS_NATIVE_ 1 #endif // signed wchar_t and unsigned wchar_t are NOT in the C++ standard. // Using them is a bad practice and not portable. So DON'T use them. // // Still, Google Mock is designed to work even if the user uses signed // wchar_t or unsigned wchar_t (obviously, assuming the compiler // supports them). // // To gcc, // wchar_t == signed wchar_t != unsigned wchar_t == unsigned int #ifdef __GNUC__ #define GMOCK_HAS_SIGNED_WCHAR_T_ 1 // signed/unsigned wchar_t are valid types. #endif // In what follows, we use the term "kind" to indicate whether a type // is bool, an integer type (excluding bool), a floating-point type, // or none of them. This categorization is useful for determining // when a matcher argument type can be safely converted to another // type in the implementation of SafeMatcherCast. enum TypeKind { kBool, kInteger, kFloatingPoint, kOther }; // KindOf::value is the kind of type T. template struct KindOf { enum { value = kOther }; // The default kind. }; // This macro declares that the kind of 'type' is 'kind'. #define GMOCK_DECLARE_KIND_(type, kind) \ template <> struct KindOf { enum { value = kind }; } GMOCK_DECLARE_KIND_(bool, kBool); // All standard integer types. GMOCK_DECLARE_KIND_(char, kInteger); GMOCK_DECLARE_KIND_(signed char, kInteger); GMOCK_DECLARE_KIND_(unsigned char, kInteger); GMOCK_DECLARE_KIND_(short, kInteger); // NOLINT GMOCK_DECLARE_KIND_(unsigned short, kInteger); // NOLINT GMOCK_DECLARE_KIND_(int, kInteger); GMOCK_DECLARE_KIND_(unsigned int, kInteger); GMOCK_DECLARE_KIND_(long, kInteger); // NOLINT GMOCK_DECLARE_KIND_(unsigned long, kInteger); // NOLINT #if GMOCK_WCHAR_T_IS_NATIVE_ GMOCK_DECLARE_KIND_(wchar_t, kInteger); #endif // Non-standard integer types. GMOCK_DECLARE_KIND_(Int64, kInteger); GMOCK_DECLARE_KIND_(UInt64, kInteger); // All standard floating-point types. GMOCK_DECLARE_KIND_(float, kFloatingPoint); GMOCK_DECLARE_KIND_(double, kFloatingPoint); GMOCK_DECLARE_KIND_(long double, kFloatingPoint); #undef GMOCK_DECLARE_KIND_ // Evaluates to the kind of 'type'. #define GMOCK_KIND_OF_(type) \ static_cast< ::testing::internal::TypeKind>( \ ::testing::internal::KindOf::value) // Evaluates to true iff integer type T is signed. #define GMOCK_IS_SIGNED_(T) (static_cast(-1) < 0) // LosslessArithmeticConvertibleImpl::value // is true iff arithmetic type From can be losslessly converted to // arithmetic type To. // // It's the user's responsibility to ensure that both From and To are // raw (i.e. has no CV modifier, is not a pointer, and is not a // reference) built-in arithmetic types, kFromKind is the kind of // From, and kToKind is the kind of To; the value is // implementation-defined when the above pre-condition is violated. template struct LosslessArithmeticConvertibleImpl : public false_type {}; // Converting bool to bool is lossless. template <> struct LosslessArithmeticConvertibleImpl : public true_type {}; // NOLINT // Converting bool to any integer type is lossless. template struct LosslessArithmeticConvertibleImpl : public true_type {}; // NOLINT // Converting bool to any floating-point type is lossless. template struct LosslessArithmeticConvertibleImpl : public true_type {}; // NOLINT // Converting an integer to bool is lossy. template struct LosslessArithmeticConvertibleImpl : public false_type {}; // NOLINT // Converting an integer to another non-bool integer is lossless iff // the target type's range encloses the source type's range. template struct LosslessArithmeticConvertibleImpl : public bool_constant< // When converting from a smaller size to a larger size, we are // fine as long as we are not converting from signed to unsigned. ((sizeof(From) < sizeof(To)) && (!GMOCK_IS_SIGNED_(From) || GMOCK_IS_SIGNED_(To))) || // When converting between the same size, the signedness must match. ((sizeof(From) == sizeof(To)) && (GMOCK_IS_SIGNED_(From) == GMOCK_IS_SIGNED_(To)))> {}; // NOLINT #undef GMOCK_IS_SIGNED_ // Converting an integer to a floating-point type may be lossy, since // the format of a floating-point number is implementation-defined. template struct LosslessArithmeticConvertibleImpl : public false_type {}; // NOLINT // Converting a floating-point to bool is lossy. template struct LosslessArithmeticConvertibleImpl : public false_type {}; // NOLINT // Converting a floating-point to an integer is lossy. template struct LosslessArithmeticConvertibleImpl : public false_type {}; // NOLINT // Converting a floating-point to another floating-point is lossless // iff the target type is at least as big as the source type. template struct LosslessArithmeticConvertibleImpl< kFloatingPoint, From, kFloatingPoint, To> : public bool_constant {}; // NOLINT // LosslessArithmeticConvertible::value is true iff arithmetic // type From can be losslessly converted to arithmetic type To. // // It's the user's responsibility to ensure that both From and To are // raw (i.e. has no CV modifier, is not a pointer, and is not a // reference) built-in arithmetic types; the value is // implementation-defined when the above pre-condition is violated. template struct LosslessArithmeticConvertible : public LosslessArithmeticConvertibleImpl< GMOCK_KIND_OF_(From), From, GMOCK_KIND_OF_(To), To> {}; // NOLINT // IsAProtocolMessage::value is a compile-time bool constant that's // true iff T is type ProtocolMessage, proto2::Message, or a subclass // of those. template struct IsAProtocolMessage : public bool_constant< ImplicitlyConvertible::value || ImplicitlyConvertible::value> { }; // When the compiler sees expression IsContainerTest(0), the first // overload of IsContainerTest will be picked if C is an STL-style // container class (since C::const_iterator* is a valid type and 0 can // be converted to it), while the second overload will be picked // otherwise (since C::const_iterator will be an invalid type in this // case). Therefore, we can determine whether C is a container class // by checking the type of IsContainerTest(0). The value of the // expression is insignificant. typedef int IsContainer; template IsContainer IsContainerTest(typename C::const_iterator*) { return 0; } typedef char IsNotContainer; template IsNotContainer IsContainerTest(...) { return '\0'; } // This interface knows how to report a Google Mock failure (either // non-fatal or fatal). class FailureReporterInterface { public: // The type of a failure (either non-fatal or fatal). enum FailureType { NONFATAL, FATAL }; virtual ~FailureReporterInterface() {} // Reports a failure that occurred at the given source file location. virtual void ReportFailure(FailureType type, const char* file, int line, const string& message) = 0; }; // Returns the failure reporter used by Google Mock. FailureReporterInterface* GetFailureReporter(); // Asserts that condition is true; aborts the process with the given // message if condition is false. We cannot use LOG(FATAL) or CHECK() // as Google Mock might be used to mock the log sink itself. We // inline this function to prevent it from showing up in the stack // trace. inline void Assert(bool condition, const char* file, int line, const string& msg) { if (!condition) { GetFailureReporter()->ReportFailure(FailureReporterInterface::FATAL, file, line, msg); } } inline void Assert(bool condition, const char* file, int line) { Assert(condition, file, line, "Assertion failed."); } // Verifies that condition is true; generates a non-fatal failure if // condition is false. inline void Expect(bool condition, const char* file, int line, const string& msg) { if (!condition) { GetFailureReporter()->ReportFailure(FailureReporterInterface::NONFATAL, file, line, msg); } } inline void Expect(bool condition, const char* file, int line) { Expect(condition, file, line, "Expectation failed."); } // Severity level of a log. enum LogSeverity { INFO = 0, WARNING = 1, }; // Valid values for the --gmock_verbose flag. // All logs (informational and warnings) are printed. const char kInfoVerbosity[] = "info"; // Only warnings are printed. const char kWarningVerbosity[] = "warning"; // No logs are printed. const char kErrorVerbosity[] = "error"; // Returns true iff a log with the given severity is visible according // to the --gmock_verbose flag. bool LogIsVisible(LogSeverity severity); // Prints the given message to stdout iff 'severity' >= the level // specified by the --gmock_verbose flag. If stack_frames_to_skip >= // 0, also prints the stack trace excluding the top // stack_frames_to_skip frames. In opt mode, any positive // stack_frames_to_skip is treated as 0, since we don't know which // function calls will be inlined by the compiler and need to be // conservative. void Log(LogSeverity severity, const string& message, int stack_frames_to_skip); // TODO(wan@google.com): group all type utilities together. // Type traits. // is_reference::value is non-zero iff T is a reference type. template struct is_reference : public false_type {}; template struct is_reference : public true_type {}; // type_equals::value is non-zero iff T1 and T2 are the same type. template struct type_equals : public false_type {}; template struct type_equals : public true_type {}; // remove_reference::type removes the reference from type T, if any. template struct remove_reference { typedef T type; }; // NOLINT template struct remove_reference { typedef T type; }; // NOLINT // Invalid() returns an invalid value of type T. This is useful // when a value of type T is needed for compilation, but the statement // will not really be executed (or we don't care if the statement // crashes). template inline T Invalid() { return *static_cast::type*>(NULL); } template <> inline void Invalid() {} // Utilities for native arrays. // ArrayEq() compares two k-dimensional native arrays using the // elements' operator==, where k can be any integer >= 0. When k is // 0, ArrayEq() degenerates into comparing a single pair of values. template bool ArrayEq(const T* lhs, size_t size, const U* rhs); // This generic version is used when k is 0. template inline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; } // This overload is used when k >= 1. template inline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) { return internal::ArrayEq(lhs, N, rhs); } // This helper reduces code bloat. If we instead put its logic inside // the previous ArrayEq() function, arrays with different sizes would // lead to different copies of the template code. template bool ArrayEq(const T* lhs, size_t size, const U* rhs) { for (size_t i = 0; i != size; i++) { if (!internal::ArrayEq(lhs[i], rhs[i])) return false; } return true; } // Finds the first element in the iterator range [begin, end) that // equals elem. Element may be a native array type itself. template Iter ArrayAwareFind(Iter begin, Iter end, const Element& elem) { for (Iter it = begin; it != end; ++it) { if (internal::ArrayEq(*it, elem)) return it; } return end; } // CopyArray() copies a k-dimensional native array using the elements' // operator=, where k can be any integer >= 0. When k is 0, // CopyArray() degenerates into copying a single value. template void CopyArray(const T* from, size_t size, U* to); // This generic version is used when k is 0. template inline void CopyArray(const T& from, U* to) { *to = from; } // This overload is used when k >= 1. template inline void CopyArray(const T(&from)[N], U(*to)[N]) { internal::CopyArray(from, N, *to); } // This helper reduces code bloat. If we instead put its logic inside // the previous CopyArray() function, arrays with different sizes // would lead to different copies of the template code. template void CopyArray(const T* from, size_t size, U* to) { for (size_t i = 0; i != size; i++) { internal::CopyArray(from[i], to + i); } } // The relation between an NativeArray object (see below) and the // native array it represents. enum RelationToSource { kReference, // The NativeArray references the native array. kCopy // The NativeArray makes a copy of the native array and // owns the copy. }; // Adapts a native array to a read-only STL-style container. Instead // of the complete STL container concept, this adaptor only implements // members useful for Google Mock's container matchers. New members // should be added as needed. To simplify the implementation, we only // support Element being a raw type (i.e. having no top-level const or // reference modifier). It's the client's responsibility to satisfy // this requirement. Element can be an array type itself (hence // multi-dimensional arrays are supported). template class NativeArray { public: // STL-style container typedefs. typedef Element value_type; typedef const Element* const_iterator; // Constructs from a native array. NativeArray(const Element* array, size_t count, RelationToSource relation) { Init(array, count, relation); } // Copy constructor. NativeArray(const NativeArray& rhs) { Init(rhs.array_, rhs.size_, rhs.relation_to_source_); } ~NativeArray() { // Ensures that the user doesn't instantiate NativeArray with a // const or reference type. testing::StaticAssertTypeEq(); if (relation_to_source_ == kCopy) delete[] array_; } // STL-style container methods. size_t size() const { return size_; } const_iterator begin() const { return array_; } const_iterator end() const { return array_ + size_; } bool operator==(const NativeArray& rhs) const { return size() == rhs.size() && ArrayEq(begin(), size(), rhs.begin()); } private: // Not implemented as we don't want to support assignment. void operator=(const NativeArray& rhs); // Initializes this object; makes a copy of the input array if // 'relation' is kCopy. void Init(const Element* array, size_t a_size, RelationToSource relation) { if (relation == kReference) { array_ = array; } else { Element* const copy = new Element[a_size]; CopyArray(array, a_size, copy); array_ = copy; } size_ = a_size; relation_to_source_ = relation; } const Element* array_; size_t size_; RelationToSource relation_to_source_; }; // Given a raw type (i.e. having no top-level reference or const // modifier) RawContainer that's either an STL-style container or a // native array, class StlContainerView has the // following members: // // - type is a type that provides an STL-style container view to // (i.e. implements the STL container concept for) RawContainer; // - const_reference is a type that provides a reference to a const // RawContainer; // - ConstReference(raw_container) returns a const reference to an STL-style // container view to raw_container, which is a RawContainer. // - Copy(raw_container) returns an STL-style container view of a // copy of raw_container, which is a RawContainer. // // This generic version is used when RawContainer itself is already an // STL-style container. template class StlContainerView { public: typedef RawContainer type; typedef const type& const_reference; static const_reference ConstReference(const RawContainer& container) { // Ensures that RawContainer is not a const type. testing::StaticAssertTypeEq(); return container; } static type Copy(const RawContainer& container) { return container; } }; // This specialization is used when RawContainer is a native array type. template class StlContainerView { public: typedef GMOCK_REMOVE_CONST_(Element) RawElement; typedef internal::NativeArray type; // NativeArray can represent a native array either by value or by // reference (selected by a constructor argument), so 'const type' // can be used to reference a const native array. We cannot // 'typedef const type& const_reference' here, as that would mean // ConstReference() has to return a reference to a local variable. typedef const type const_reference; static const_reference ConstReference(const Element (&array)[N]) { // Ensures that Element is not a const type. testing::StaticAssertTypeEq(); #if GTEST_OS_SYMBIAN // The Nokia Symbian compiler confuses itself in template instantiation // for this call without the cast to Element*: // function call '[testing::internal::NativeArray].NativeArray( // {lval} const char *[4], long, testing::internal::RelationToSource)' // does not match // 'testing::internal::NativeArray::NativeArray( // char *const *, unsigned int, testing::internal::RelationToSource)' // (instantiating: 'testing::internal::ContainsMatcherImpl // ::Matches(const char * (&)[4]) const') // (instantiating: 'testing::internal::StlContainerView:: // ConstReference(const char * (&)[4])') // (and though the N parameter type is mismatched in the above explicit // conversion of it doesn't help - only the conversion of the array). return type(const_cast(&array[0]), N, kReference); #else return type(array, N, kReference); #endif // GTEST_OS_SYMBIAN } static type Copy(const Element (&array)[N]) { #if GTEST_OS_SYMBIAN return type(const_cast(&array[0]), N, kCopy); #else return type(array, N, kCopy); #endif // GTEST_OS_SYMBIAN } }; // This specialization is used when RawContainer is a native array // represented as a (pointer, size) tuple. template class StlContainerView< ::std::tr1::tuple > { public: typedef GMOCK_REMOVE_CONST_( typename internal::PointeeOf::type) RawElement; typedef internal::NativeArray type; typedef const type const_reference; static const_reference ConstReference( const ::std::tr1::tuple& array) { using ::std::tr1::get; return type(get<0>(array), get<1>(array), kReference); } static type Copy(const ::std::tr1::tuple& array) { using ::std::tr1::get; return type(get<0>(array), get<1>(array), kCopy); } }; // The following specialization prevents the user from instantiating // StlContainer with a reference type. template class StlContainerView; } // namespace internal } // namespace testing #endif // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/include/gmock/internal/gmock-port.h000066400000000000000000000206661260417502300310430ustar00rootroot00000000000000// Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: vadimb@google.com (Vadim Berman) // // Low-level types and utilities for porting Google Mock to various // platforms. They are subject to change without notice. DO NOT USE // THEM IN USER CODE. #ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PORT_H_ #define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PORT_H_ #include #include #include // Most of the types needed for porting Google Mock are also required // for Google Test and are defined in gtest-port.h. #include #include // To avoid conditional compilation everywhere, we make it // gmock-port.h's responsibility to #include the header implementing // tr1/tuple. gmock-port.h does this via gtest-port.h, which is // guaranteed to pull in the tuple header. #if GTEST_OS_LINUX #endif // GTEST_OS_LINUX namespace testing { namespace internal { // For MS Visual C++, check the compiler version. At least VS 2003 is // required to compile Google Mock. #if defined(_MSC_VER) && _MSC_VER < 1310 #error "At least Visual C++ 2003 (7.1) is required to compile Google Mock." #endif // Use implicit_cast as a safe version of static_cast for upcasting in // the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a // const Foo*). When you use implicit_cast, the compiler checks that // the cast is safe. Such explicit implicit_casts are necessary in // surprisingly many situations where C++ demands an exact type match // instead of an argument type convertable to a target type. // // The syntax for using implicit_cast is the same as for static_cast: // // implicit_cast(expr) // // implicit_cast would have been part of the C++ standard library, // but the proposal was submitted too late. It will probably make // its way into the language in the future. template inline To implicit_cast(To x) { return x; } // When you upcast (that is, cast a pointer from type Foo to type // SuperclassOfFoo), it's fine to use implicit_cast<>, since upcasts // always succeed. When you downcast (that is, cast a pointer from // type Foo to type SubclassOfFoo), static_cast<> isn't safe, because // how do you know the pointer is really of type SubclassOfFoo? It // could be a bare Foo, or of type DifferentSubclassOfFoo. Thus, // when you downcast, you should use this macro. In debug mode, we // use dynamic_cast<> to double-check the downcast is legal (we die // if it's not). In normal mode, we do the efficient static_cast<> // instead. Thus, it's important to test in debug mode to make sure // the cast is legal! // This is the only place in the code we should use dynamic_cast<>. // In particular, you SHOULDN'T be using dynamic_cast<> in order to // do RTTI (eg code like this: // if (dynamic_cast(foo)) HandleASubclass1Object(foo); // if (dynamic_cast(foo)) HandleASubclass2Object(foo); // You should design the code some other way not to need this. template // use like this: down_cast(foo); inline To down_cast(From* f) { // so we only accept pointers // Ensures that To is a sub-type of From *. This test is here only // for compile-time type checking, and has no overhead in an // optimized build at run-time, as it will be optimized away // completely. if (false) { const To to = NULL; ::testing::internal::implicit_cast(to); } #if GTEST_HAS_RTTI assert(f == NULL || dynamic_cast(f) != NULL); // RTTI: debug mode only! #endif return static_cast(f); } // The GMOCK_COMPILE_ASSERT_ macro can be used to verify that a compile time // expression is true. For example, you could use it to verify the // size of a static array: // // GMOCK_COMPILE_ASSERT_(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES, // content_type_names_incorrect_size); // // or to make sure a struct is smaller than a certain size: // // GMOCK_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large); // // The second argument to the macro is the name of the variable. If // the expression is false, most compilers will issue a warning/error // containing the name of the variable. template struct CompileAssert { }; #define GMOCK_COMPILE_ASSERT_(expr, msg) \ typedef ::testing::internal::CompileAssert<(bool(expr))> \ msg[bool(expr) ? 1 : -1] // Implementation details of GMOCK_COMPILE_ASSERT_: // // - GMOCK_COMPILE_ASSERT_ works by defining an array type that has -1 // elements (and thus is invalid) when the expression is false. // // - The simpler definition // // #define GMOCK_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1] // // does not work, as gcc supports variable-length arrays whose sizes // are determined at run-time (this is gcc's extension and not part // of the C++ standard). As a result, gcc fails to reject the // following code with the simple definition: // // int foo; // GMOCK_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is // // not a compile-time constant. // // - By using the type CompileAssert<(bool(expr))>, we ensures that // expr is a compile-time constant. (Template arguments must be // determined at compile-time.) // // - The outter parentheses in CompileAssert<(bool(expr))> are necessary // to work around a bug in gcc 3.4.4 and 4.0.1. If we had written // // CompileAssert // // instead, these compilers will refuse to compile // // GMOCK_COMPILE_ASSERT_(5 > 0, some_message); // // (They seem to think the ">" in "5 > 0" marks the end of the // template argument list.) // // - The array size is (bool(expr) ? 1 : -1), instead of simply // // ((expr) ? 1 : -1). // // This is to avoid running into a bug in MS VC 7.1, which // causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1. #if GTEST_HAS_GLOBAL_STRING typedef ::string string; #else typedef ::std::string string; #endif // GTEST_HAS_GLOBAL_STRING #if GTEST_HAS_GLOBAL_WSTRING typedef ::wstring wstring; #elif GTEST_HAS_STD_WSTRING typedef ::std::wstring wstring; #endif // GTEST_HAS_GLOBAL_WSTRING } // namespace internal } // namespace testing // Macro for referencing flags. This is public as we want the user to // use this syntax to reference Google Mock flags. #define GMOCK_FLAG(name) FLAGS_gmock_##name // Macros for declaring flags. #define GMOCK_DECLARE_bool_(name) extern bool GMOCK_FLAG(name) #define GMOCK_DECLARE_int32_(name) \ extern ::testing::internal::Int32 GMOCK_FLAG(name) #define GMOCK_DECLARE_string_(name) \ extern ::testing::internal::String GMOCK_FLAG(name) // Macros for defining flags. #define GMOCK_DEFINE_bool_(name, default_val, doc) \ bool GMOCK_FLAG(name) = (default_val) #define GMOCK_DEFINE_int32_(name, default_val, doc) \ ::testing::internal::Int32 GMOCK_FLAG(name) = (default_val) #define GMOCK_DEFINE_string_(name, default_val, doc) \ ::testing::internal::String GMOCK_FLAG(name) = (default_val) #endif // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PORT_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/src/000077500000000000000000000000001260417502300230265ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/src/gmock-all.cc000066400000000000000000000042071260417502300252060ustar00rootroot00000000000000// Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // // Google C++ Mocking Framework (Google Mock) // // This file #includes all Google Mock implementation .cc files. The // purpose is to allow a user to build Google Mock by compiling this // file alone. // This line ensures that gmock.h can be compiled on its own, even // when it's fused. #include // The following lines pull in the real gmock *.cc files. #include "src/gmock-cardinalities.cc" #include "src/gmock-internal-utils.cc" #include "src/gmock-matchers.cc" #include "src/gmock-printers.cc" #include "src/gmock-spec-builders.cc" #include "src/gmock.cc" clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/src/gmock-cardinalities.cc000066400000000000000000000122021260417502300272430ustar00rootroot00000000000000// Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Google Mock - a framework for writing C++ mock classes. // // This file implements cardinalities. #include #include #include // NOLINT #include #include #include #include namespace testing { namespace { // Implements the Between(m, n) cardinality. class BetweenCardinalityImpl : public CardinalityInterface { public: BetweenCardinalityImpl(int min, int max) : min_(min >= 0 ? min : 0), max_(max >= min_ ? max : min_) { std::stringstream ss; if (min < 0) { ss << "The invocation lower bound must be >= 0, " << "but is actually " << min << "."; internal::Expect(false, __FILE__, __LINE__, ss.str()); } else if (max < 0) { ss << "The invocation upper bound must be >= 0, " << "but is actually " << max << "."; internal::Expect(false, __FILE__, __LINE__, ss.str()); } else if (min > max) { ss << "The invocation upper bound (" << max << ") must be >= the invocation lower bound (" << min << ")."; internal::Expect(false, __FILE__, __LINE__, ss.str()); } } // Conservative estimate on the lower/upper bound of the number of // calls allowed. virtual int ConservativeLowerBound() const { return min_; } virtual int ConservativeUpperBound() const { return max_; } virtual bool IsSatisfiedByCallCount(int call_count) const { return min_ <= call_count && call_count <= max_ ; } virtual bool IsSaturatedByCallCount(int call_count) const { return call_count >= max_; } virtual void DescribeTo(::std::ostream* os) const; private: const int min_; const int max_; GTEST_DISALLOW_COPY_AND_ASSIGN_(BetweenCardinalityImpl); }; // Formats "n times" in a human-friendly way. inline internal::string FormatTimes(int n) { if (n == 1) { return "once"; } else if (n == 2) { return "twice"; } else { std::stringstream ss; ss << n << " times"; return ss.str(); } } // Describes the Between(m, n) cardinality in human-friendly text. void BetweenCardinalityImpl::DescribeTo(::std::ostream* os) const { if (min_ == 0) { if (max_ == 0) { *os << "never called"; } else if (max_ == INT_MAX) { *os << "called any number of times"; } else { *os << "called at most " << FormatTimes(max_); } } else if (min_ == max_) { *os << "called " << FormatTimes(min_); } else if (max_ == INT_MAX) { *os << "called at least " << FormatTimes(min_); } else { // 0 < min_ < max_ < INT_MAX *os << "called between " << min_ << " and " << max_ << " times"; } } } // Unnamed namespace // Describes the given call count to an ostream. void Cardinality::DescribeActualCallCountTo(int actual_call_count, ::std::ostream* os) { if (actual_call_count > 0) { *os << "called " << FormatTimes(actual_call_count); } else { *os << "never called"; } } // Creates a cardinality that allows at least n calls. Cardinality AtLeast(int n) { return Between(n, INT_MAX); } // Creates a cardinality that allows at most n calls. Cardinality AtMost(int n) { return Between(0, n); } // Creates a cardinality that allows any number of calls. Cardinality AnyNumber() { return AtLeast(0); } // Creates a cardinality that allows between min and max calls. Cardinality Between(int min, int max) { return Cardinality(new BetweenCardinalityImpl(min, max)); } // Creates a cardinality that allows exactly n calls. Cardinality Exactly(int n) { return Between(n, n); } } // namespace testing clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/src/gmock-internal-utils.cc000066400000000000000000000147621260417502300274170ustar00rootroot00000000000000// Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Google Mock - a framework for writing C++ mock classes. // // This file defines some utilities useful for implementing Google // Mock. They are subject to change without notice, so please DO NOT // USE THEM IN USER CODE. #include #include #include // NOLINT #include #include #include #include namespace testing { namespace internal { // Converts an identifier name to a space-separated list of lower-case // words. Each maximum substring of the form [A-Za-z][a-z]*|\d+ is // treated as one word. For example, both "FooBar123" and // "foo_bar_123" are converted to "foo bar 123". string ConvertIdentifierNameToWords(const char* id_name) { string result; char prev_char = '\0'; for (const char* p = id_name; *p != '\0'; prev_char = *(p++)) { // We don't care about the current locale as the input is // guaranteed to be a valid C++ identifier name. const bool starts_new_word = isupper(*p) || (!isalpha(prev_char) && islower(*p)) || (!isdigit(prev_char) && isdigit(*p)); if (isalnum(*p)) { if (starts_new_word && result != "") result += ' '; result += static_cast(tolower(*p)); } } return result; } // This class reports Google Mock failures as Google Test failures. A // user can define another class in a similar fashion if he intends to // use Google Mock with a testing framework other than Google Test. class GoogleTestFailureReporter : public FailureReporterInterface { public: virtual void ReportFailure(FailureType type, const char* file, int line, const string& message) { AssertHelper(type == FATAL ? TestPartResult::kFatalFailure : TestPartResult::kNonFatalFailure, file, line, message.c_str()) = Message(); if (type == FATAL) { posix::Abort(); } } }; // Returns the global failure reporter. Will create a // GoogleTestFailureReporter and return it the first time called. FailureReporterInterface* GetFailureReporter() { // Points to the global failure reporter used by Google Mock. gcc // guarantees that the following use of failure_reporter is // thread-safe. We may need to add additional synchronization to // protect failure_reporter if we port Google Mock to other // compilers. static FailureReporterInterface* const failure_reporter = new GoogleTestFailureReporter(); return failure_reporter; } // Protects global resources (stdout in particular) used by Log(). static GTEST_DEFINE_STATIC_MUTEX_(g_log_mutex); // Returns true iff a log with the given severity is visible according // to the --gmock_verbose flag. bool LogIsVisible(LogSeverity severity) { if (GMOCK_FLAG(verbose) == kInfoVerbosity) { // Always show the log if --gmock_verbose=info. return true; } else if (GMOCK_FLAG(verbose) == kErrorVerbosity) { // Always hide it if --gmock_verbose=error. return false; } else { // If --gmock_verbose is neither "info" nor "error", we treat it // as "warning" (its default value). return severity == WARNING; } } // Prints the given message to stdout iff 'severity' >= the level // specified by the --gmock_verbose flag. If stack_frames_to_skip >= // 0, also prints the stack trace excluding the top // stack_frames_to_skip frames. In opt mode, any positive // stack_frames_to_skip is treated as 0, since we don't know which // function calls will be inlined by the compiler and need to be // conservative. void Log(LogSeverity severity, const string& message, int stack_frames_to_skip) { if (!LogIsVisible(severity)) return; // Ensures that logs from different threads don't interleave. MutexLock l(&g_log_mutex); // "using ::std::cout;" doesn't work with Symbian's STLport, where cout is a // macro. if (severity == WARNING) { // Prints a GMOCK WARNING marker to make the warnings easily searchable. std::cout << "\nGMOCK WARNING:"; } // Pre-pends a new-line to message if it doesn't start with one. if (message.empty() || message[0] != '\n') { std::cout << "\n"; } std::cout << message; if (stack_frames_to_skip >= 0) { #ifdef NDEBUG // In opt mode, we have to be conservative and skip no stack frame. const int actual_to_skip = 0; #else // In dbg mode, we can do what the caller tell us to do (plus one // for skipping this function's stack frame). const int actual_to_skip = stack_frames_to_skip + 1; #endif // NDEBUG // Appends a new-line to message if it doesn't end with one. if (!message.empty() && *message.rbegin() != '\n') { std::cout << "\n"; } std::cout << "Stack trace:\n" << ::testing::internal::GetCurrentOsStackTraceExceptTop( ::testing::UnitTest::GetInstance(), actual_to_skip); } std::cout << ::std::flush; } } // namespace internal } // namespace testing clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/src/gmock-matchers.cc000066400000000000000000000157521260417502300262530ustar00rootroot00000000000000// Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Google Mock - a framework for writing C++ mock classes. // // This file implements Matcher, Matcher, and // utilities for defining matchers. #include #include #include #include #include namespace testing { // Constructs a matcher that matches a const string& whose value is // equal to s. Matcher::Matcher(const internal::string& s) { *this = Eq(s); } // Constructs a matcher that matches a const string& whose value is // equal to s. Matcher::Matcher(const char* s) { *this = Eq(internal::string(s)); } // Constructs a matcher that matches a string whose value is equal to s. Matcher::Matcher(const internal::string& s) { *this = Eq(s); } // Constructs a matcher that matches a string whose value is equal to s. Matcher::Matcher(const char* s) { *this = Eq(internal::string(s)); } namespace internal { // Utilities for validating and formatting description strings in the // MATCHER*() macros. // Returns the 0-based index of the given parameter in the // NULL-terminated parameter array; if the parameter is "*", returns // kTupleInterpolation; if it's not found in the list, returns // kInvalidInterpolation. int GetParamIndex(const char* param_names[], const string& param_name) { if (param_name == "*") return kTupleInterpolation; for (int i = 0; param_names[i] != NULL; i++) { if (param_name == param_names[i]) return i; } return kInvalidInterpolation; } // Helper function used by ValidateMatcherDescription() to format // error messages. string FormatMatcherDescriptionSyntaxError(const char* description, const char* error_pos) { ::std::stringstream ss; ss << "Syntax error at index " << (error_pos - description) << " in matcher description \"" << description << "\": "; return ss.str(); } // Parses a matcher description string and returns a vector of // interpolations that appear in the string; generates non-fatal // failures iff 'description' is an invalid matcher description. // 'param_names' is a NULL-terminated array of parameter names in the // order they appear in the MATCHER_P*() parameter list. Interpolations ValidateMatcherDescription( const char* param_names[], const char* description) { Interpolations interps; for (const char* p = description; *p != '\0';) { if (SkipPrefix("%%", &p)) { interps.push_back(Interpolation(p - 2, p, kPercentInterpolation)); } else if (SkipPrefix("%(", &p)) { const char* const q = strstr(p, ")s"); if (q == NULL) { // TODO(wan@google.com): change the source file location in // the failure to point to where the MATCHER*() macro is used. ADD_FAILURE() << FormatMatcherDescriptionSyntaxError(description, p - 2) << "an interpolation must end with \")s\", " << "but \"" << (p - 2) << "\" does not."; } else { const string param_name(p, q); const int param_index = GetParamIndex(param_names, param_name); if (param_index == kInvalidInterpolation) { ADD_FAILURE() << FormatMatcherDescriptionSyntaxError(description, p) << "\"" << param_name << "\" is an invalid parameter name."; } else { interps.push_back(Interpolation(p - 2, q + 2, param_index)); p = q + 2; } } } else { EXPECT_NE(*p, '%') << FormatMatcherDescriptionSyntaxError(description, p) << "use \"%%\" instead of \"%\" to print \"%\"."; ++p; } } return interps; } // Joins a vector of strings as if they are fields of a tuple; returns // the joined string. string JoinAsTuple(const Strings& fields) { switch (fields.size()) { case 0: return ""; case 1: return fields[0]; default: string result = "(" + fields[0]; for (size_t i = 1; i < fields.size(); i++) { result += ", "; result += fields[i]; } result += ")"; return result; } } // Returns the actual matcher description, given the matcher name, // user-supplied description template string, interpolations in the // string, and the printed values of the matcher parameters. string FormatMatcherDescription( const char* matcher_name, const char* description, const Interpolations& interp, const Strings& param_values) { string result; if (*description == '\0') { // When the user supplies an empty description, we calculate one // from the matcher name. result = ConvertIdentifierNameToWords(matcher_name); if (param_values.size() >= 1) result += " " + JoinAsTuple(param_values); } else { // The end position of the last interpolation. const char* last_interp_end = description; for (size_t i = 0; i < interp.size(); i++) { result.append(last_interp_end, interp[i].start_pos); const int param_index = interp[i].param_index; if (param_index == kTupleInterpolation) { result += JoinAsTuple(param_values); } else if (param_index == kPercentInterpolation) { result += '%'; } else if (param_index != kInvalidInterpolation) { result += param_values[param_index]; } last_interp_end = interp[i].end_pos; } result += last_interp_end; } return result; } } // namespace internal } // namespace testing clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/src/gmock-printers.cc000066400000000000000000000245721260417502300263130ustar00rootroot00000000000000// Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Google Mock - a framework for writing C++ mock classes. // // This file implements a universal value printer that can print a // value of any type T: // // void ::testing::internal::UniversalPrinter::Print(value, ostream_ptr); // // It uses the << operator when possible, and prints the bytes in the // object otherwise. A user can override its behavior for a class // type Foo by defining either operator<<(::std::ostream&, const Foo&) // or void PrintTo(const Foo&, ::std::ostream*) in the namespace that // defines Foo. #include #include #include #include // NOLINT #include #include namespace testing { namespace { using ::std::ostream; #if GTEST_OS_WINDOWS_MOBILE // Windows CE does not define _snprintf_s. #define snprintf _snprintf #elif _MSC_VER >= 1400 // VC 8.0 and later deprecate snprintf and _snprintf. #define snprintf _snprintf_s #elif _MSC_VER #define snprintf _snprintf #endif // GTEST_OS_WINDOWS_MOBILE // Prints a segment of bytes in the given object. void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start, size_t count, ostream* os) { char text[5] = ""; for (size_t i = 0; i != count; i++) { const size_t j = start + i; if (i != 0) { // Organizes the bytes into groups of 2 for easy parsing by // human. if ((j % 2) == 0) { *os << " "; } } snprintf(text, sizeof(text), "%02X", obj_bytes[j]); *os << text; } } // Prints the bytes in the given value to the given ostream. void PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count, ostream* os) { // Tells the user how big the object is. *os << count << "-byte object <"; const size_t kThreshold = 132; const size_t kChunkSize = 64; // If the object size is bigger than kThreshold, we'll have to omit // some details by printing only the first and the last kChunkSize // bytes. // TODO(wan): let the user control the threshold using a flag. if (count < kThreshold) { PrintByteSegmentInObjectTo(obj_bytes, 0, count, os); } else { PrintByteSegmentInObjectTo(obj_bytes, 0, kChunkSize, os); *os << " ... "; // Rounds up to 2-byte boundary. const size_t resume_pos = (count - kChunkSize + 1)/2*2; PrintByteSegmentInObjectTo(obj_bytes, resume_pos, count - resume_pos, os); } *os << ">"; } } // namespace namespace internal2 { // Delegates to PrintBytesInObjectToImpl() to print the bytes in the // given object. The delegation simplifies the implementation, which // uses the << operator and thus is easier done outside of the // ::testing::internal namespace, which contains a << operator that // sometimes conflicts with the one in STL. void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count, ostream* os) { PrintBytesInObjectToImpl(obj_bytes, count, os); } } // namespace internal2 namespace internal { // Prints a wide char as a char literal without the quotes, escaping it // when necessary. static void PrintAsWideCharLiteralTo(wchar_t c, ostream* os) { switch (c) { case L'\0': *os << "\\0"; break; case L'\'': *os << "\\'"; break; case L'\?': *os << "\\?"; break; case L'\\': *os << "\\\\"; break; case L'\a': *os << "\\a"; break; case L'\b': *os << "\\b"; break; case L'\f': *os << "\\f"; break; case L'\n': *os << "\\n"; break; case L'\r': *os << "\\r"; break; case L'\t': *os << "\\t"; break; case L'\v': *os << "\\v"; break; default: // Checks whether c is printable or not. Printable characters are in // the range [0x20,0x7E]. // We test the value of c directly instead of calling isprint(), as // isprint() is buggy on Windows mobile. if (0x20 <= c && c <= 0x7E) { *os << static_cast(c); } else { // Buffer size enough for the maximum number of digits and \0. char text[2 * sizeof(unsigned long) + 1] = ""; snprintf(text, sizeof(text), "%lX", static_cast(c)); *os << "\\x" << text; } } } // Prints a char as if it's part of a string literal, escaping it when // necessary. static void PrintAsWideStringLiteralTo(wchar_t c, ostream* os) { switch (c) { case L'\'': *os << "'"; break; case L'"': *os << "\\\""; break; default: PrintAsWideCharLiteralTo(c, os); } } // Prints a char as a char literal without the quotes, escaping it // when necessary. static void PrintAsCharLiteralTo(char c, ostream* os) { PrintAsWideCharLiteralTo(static_cast(c), os); } // Prints a char as if it's part of a string literal, escaping it when // necessary. static void PrintAsStringLiteralTo(char c, ostream* os) { PrintAsWideStringLiteralTo(static_cast(c), os); } // Prints a char and its code. The '\0' char is printed as "'\\0'", // other unprintable characters are also properly escaped using the // standard C++ escape sequence. void PrintCharTo(char c, int char_code, ostream* os) { *os << "'"; PrintAsCharLiteralTo(c, os); *os << "'"; if (c != '\0') *os << " (" << char_code << ")"; } // Prints a wchar_t as a symbol if it is printable or as its internal // code otherwise and also as its decimal code (except for L'\0'). // The L'\0' char is printed as "L'\\0'". The decimal code is printed // as signed integer when wchar_t is implemented by the compiler // as a signed type and is printed as an unsigned integer when wchar_t // is implemented as an unsigned type. void PrintTo(wchar_t wc, ostream* os) { *os << "L'"; PrintAsWideCharLiteralTo(wc, os); *os << "'"; if (wc != L'\0') { // Type Int64 is used because it provides more storage than wchar_t thus // when the compiler converts signed or unsigned implementation of wchar_t // to Int64 it fills higher bits with either zeros or the sign bit // passing it to operator <<() as either signed or unsigned integer. *os << " (" << static_cast(wc) << ")"; } } // Prints the given array of characters to the ostream. // The array starts at *begin, the length is len, it may include '\0' characters // and may not be null-terminated. static void PrintCharsAsStringTo(const char* begin, size_t len, ostream* os) { *os << "\""; for (size_t index = 0; index < len; ++index) { PrintAsStringLiteralTo(begin[index], os); } *os << "\""; } // Prints a (const) char array of 'len' elements, starting at address 'begin'. void UniversalPrintArray(const char* begin, size_t len, ostream* os) { PrintCharsAsStringTo(begin, len, os); } // Prints the given array of wide characters to the ostream. // The array starts at *begin, the length is len, it may include L'\0' // characters and may not be null-terminated. static void PrintWideCharsAsStringTo(const wchar_t* begin, size_t len, ostream* os) { *os << "L\""; for (size_t index = 0; index < len; ++index) { PrintAsWideStringLiteralTo(begin[index], os); } *os << "\""; } // Prints the given C string to the ostream. void PrintTo(const char* s, ostream* os) { if (s == NULL) { *os << "NULL"; } else { *os << implicit_cast(s) << " pointing to "; PrintCharsAsStringTo(s, strlen(s), os); } } // MSVC compiler can be configured to define whar_t as a typedef // of unsigned short. Defining an overload for const wchar_t* in that case // would cause pointers to unsigned shorts be printed as wide strings, // possibly accessing more memory than intended and causing invalid // memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when // wchar_t is implemented as a native type. #if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) // Prints the given wide C string to the ostream. void PrintTo(const wchar_t* s, ostream* os) { if (s == NULL) { *os << "NULL"; } else { *os << implicit_cast(s) << " pointing to "; PrintWideCharsAsStringTo(s, wcslen(s), os); } } #endif // wchar_t is native // Prints a ::string object. #if GTEST_HAS_GLOBAL_STRING void PrintStringTo(const ::string& s, ostream* os) { PrintCharsAsStringTo(s.data(), s.size(), os); } #endif // GTEST_HAS_GLOBAL_STRING void PrintStringTo(const ::std::string& s, ostream* os) { PrintCharsAsStringTo(s.data(), s.size(), os); } // Prints a ::wstring object. #if GTEST_HAS_GLOBAL_WSTRING void PrintWideStringTo(const ::wstring& s, ostream* os) { PrintWideCharsAsStringTo(s.data(), s.size(), os); } #endif // GTEST_HAS_GLOBAL_WSTRING #if GTEST_HAS_STD_WSTRING void PrintWideStringTo(const ::std::wstring& s, ostream* os) { PrintWideCharsAsStringTo(s.data(), s.size(), os); } #endif // GTEST_HAS_STD_WSTRING } // namespace internal } // namespace testing clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/src/gmock-spec-builders.cc000066400000000000000000000403741260417502300272040ustar00rootroot00000000000000// Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Google Mock - a framework for writing C++ mock classes. // // This file implements the spec builder syntax (ON_CALL and // EXPECT_CALL). #include #include #include // NOLINT #include #include #include #include #include #if GTEST_OS_CYGWIN || GTEST_OS_LINUX || GTEST_OS_MAC #include // NOLINT #endif namespace testing { namespace internal { // Protects the mock object registry (in class Mock), all function // mockers, and all expectations. GTEST_DEFINE_STATIC_MUTEX_(g_gmock_mutex); // Constructs an ExpectationBase object. ExpectationBase::ExpectationBase(const char* a_file, int a_line, const string& a_source_text) : file_(a_file), line_(a_line), source_text_(a_source_text), cardinality_specified_(false), cardinality_(Exactly(1)), call_count_(0), retired_(false) { } // Destructs an ExpectationBase object. ExpectationBase::~ExpectationBase() {} // Explicitly specifies the cardinality of this expectation. Used by // the subclasses to implement the .Times() clause. void ExpectationBase::SpecifyCardinality(const Cardinality& a_cardinality) { cardinality_specified_ = true; cardinality_ = a_cardinality; } // Retires all pre-requisites of this expectation. void ExpectationBase::RetireAllPreRequisites() { if (is_retired()) { // We can take this short-cut as we never retire an expectation // until we have retired all its pre-requisites. return; } for (ExpectationSet::const_iterator it = immediate_prerequisites_.begin(); it != immediate_prerequisites_.end(); ++it) { ExpectationBase* const prerequisite = it->expectation_base().get(); if (!prerequisite->is_retired()) { prerequisite->RetireAllPreRequisites(); prerequisite->Retire(); } } } // Returns true iff all pre-requisites of this expectation have been // satisfied. // L >= g_gmock_mutex bool ExpectationBase::AllPrerequisitesAreSatisfied() const { g_gmock_mutex.AssertHeld(); for (ExpectationSet::const_iterator it = immediate_prerequisites_.begin(); it != immediate_prerequisites_.end(); ++it) { if (!(it->expectation_base()->IsSatisfied()) || !(it->expectation_base()->AllPrerequisitesAreSatisfied())) return false; } return true; } // Adds unsatisfied pre-requisites of this expectation to 'result'. // L >= g_gmock_mutex void ExpectationBase::FindUnsatisfiedPrerequisites( ExpectationSet* result) const { g_gmock_mutex.AssertHeld(); for (ExpectationSet::const_iterator it = immediate_prerequisites_.begin(); it != immediate_prerequisites_.end(); ++it) { if (it->expectation_base()->IsSatisfied()) { // If *it is satisfied and has a call count of 0, some of its // pre-requisites may not be satisfied yet. if (it->expectation_base()->call_count_ == 0) { it->expectation_base()->FindUnsatisfiedPrerequisites(result); } } else { // Now that we know *it is unsatisfied, we are not so interested // in whether its pre-requisites are satisfied. Therefore we // don't recursively call FindUnsatisfiedPrerequisites() here. *result += *it; } } } // Points to the implicit sequence introduced by a living InSequence // object (if any) in the current thread or NULL. ThreadLocal g_gmock_implicit_sequence; // Reports an uninteresting call (whose description is in msg) in the // manner specified by 'reaction'. void ReportUninterestingCall(CallReaction reaction, const string& msg) { switch (reaction) { case ALLOW: Log(INFO, msg, 3); break; case WARN: Log(WARNING, msg, 3); break; default: // FAIL Expect(false, NULL, -1, msg); } } } // namespace internal // Class Mock. namespace { typedef std::set FunctionMockers; // The current state of a mock object. Such information is needed for // detecting leaked mock objects and explicitly verifying a mock's // expectations. struct MockObjectState { MockObjectState() : first_used_file(NULL), first_used_line(-1), leakable(false) {} // Where in the source file an ON_CALL or EXPECT_CALL is first // invoked on this mock object. const char* first_used_file; int first_used_line; ::std::string first_used_test_case; ::std::string first_used_test; bool leakable; // true iff it's OK to leak the object. FunctionMockers function_mockers; // All registered methods of the object. }; // A global registry holding the state of all mock objects that are // alive. A mock object is added to this registry the first time // Mock::AllowLeak(), ON_CALL(), or EXPECT_CALL() is called on it. It // is removed from the registry in the mock object's destructor. class MockObjectRegistry { public: // Maps a mock object (identified by its address) to its state. typedef std::map StateMap; // This destructor will be called when a program exits, after all // tests in it have been run. By then, there should be no mock // object alive. Therefore we report any living object as test // failure, unless the user explicitly asked us to ignore it. ~MockObjectRegistry() { // "using ::std::cout;" doesn't work with Symbian's STLport, where cout is // a macro. if (!GMOCK_FLAG(catch_leaked_mocks)) return; int leaked_count = 0; for (StateMap::const_iterator it = states_.begin(); it != states_.end(); ++it) { if (it->second.leakable) // The user said it's fine to leak this object. continue; // TODO(wan@google.com): Print the type of the leaked object. // This can help the user identify the leaked object. std::cout << "\n"; const MockObjectState& state = it->second; std::cout << internal::FormatFileLocation(state.first_used_file, state.first_used_line); std::cout << " ERROR: this mock object"; if (state.first_used_test != "") { std::cout << " (used in test " << state.first_used_test_case << "." << state.first_used_test << ")"; } std::cout << " should be deleted but never is. Its address is @" << it->first << "."; leaked_count++; } if (leaked_count > 0) { std::cout << "\nERROR: " << leaked_count << " leaked mock " << (leaked_count == 1 ? "object" : "objects") << " found at program exit.\n"; std::cout.flush(); ::std::cerr.flush(); // RUN_ALL_TESTS() has already returned when this destructor is // called. Therefore we cannot use the normal Google Test // failure reporting mechanism. _exit(1); // We cannot call exit() as it is not reentrant and // may already have been called. } } StateMap& states() { return states_; } private: StateMap states_; }; // Protected by g_gmock_mutex. MockObjectRegistry g_mock_object_registry; // Maps a mock object to the reaction Google Mock should have when an // uninteresting method is called. Protected by g_gmock_mutex. std::map g_uninteresting_call_reaction; // Sets the reaction Google Mock should have when an uninteresting // method of the given mock object is called. // L < g_gmock_mutex void SetReactionOnUninterestingCalls(const void* mock_obj, internal::CallReaction reaction) { internal::MutexLock l(&internal::g_gmock_mutex); g_uninteresting_call_reaction[mock_obj] = reaction; } } // namespace // Tells Google Mock to allow uninteresting calls on the given mock // object. // L < g_gmock_mutex void Mock::AllowUninterestingCalls(const void* mock_obj) { SetReactionOnUninterestingCalls(mock_obj, internal::ALLOW); } // Tells Google Mock to warn the user about uninteresting calls on the // given mock object. // L < g_gmock_mutex void Mock::WarnUninterestingCalls(const void* mock_obj) { SetReactionOnUninterestingCalls(mock_obj, internal::WARN); } // Tells Google Mock to fail uninteresting calls on the given mock // object. // L < g_gmock_mutex void Mock::FailUninterestingCalls(const void* mock_obj) { SetReactionOnUninterestingCalls(mock_obj, internal::FAIL); } // Tells Google Mock the given mock object is being destroyed and its // entry in the call-reaction table should be removed. // L < g_gmock_mutex void Mock::UnregisterCallReaction(const void* mock_obj) { internal::MutexLock l(&internal::g_gmock_mutex); g_uninteresting_call_reaction.erase(mock_obj); } // Returns the reaction Google Mock will have on uninteresting calls // made on the given mock object. // L < g_gmock_mutex internal::CallReaction Mock::GetReactionOnUninterestingCalls( const void* mock_obj) { internal::MutexLock l(&internal::g_gmock_mutex); return (g_uninteresting_call_reaction.count(mock_obj) == 0) ? internal::WARN : g_uninteresting_call_reaction[mock_obj]; } // Tells Google Mock to ignore mock_obj when checking for leaked mock // objects. // L < g_gmock_mutex void Mock::AllowLeak(const void* mock_obj) { internal::MutexLock l(&internal::g_gmock_mutex); g_mock_object_registry.states()[mock_obj].leakable = true; } // Verifies and clears all expectations on the given mock object. If // the expectations aren't satisfied, generates one or more Google // Test non-fatal failures and returns false. // L < g_gmock_mutex bool Mock::VerifyAndClearExpectations(void* mock_obj) { internal::MutexLock l(&internal::g_gmock_mutex); return VerifyAndClearExpectationsLocked(mock_obj); } // Verifies all expectations on the given mock object and clears its // default actions and expectations. Returns true iff the // verification was successful. // L < g_gmock_mutex bool Mock::VerifyAndClear(void* mock_obj) { internal::MutexLock l(&internal::g_gmock_mutex); ClearDefaultActionsLocked(mock_obj); return VerifyAndClearExpectationsLocked(mock_obj); } // Verifies and clears all expectations on the given mock object. If // the expectations aren't satisfied, generates one or more Google // Test non-fatal failures and returns false. // L >= g_gmock_mutex bool Mock::VerifyAndClearExpectationsLocked(void* mock_obj) { internal::g_gmock_mutex.AssertHeld(); if (g_mock_object_registry.states().count(mock_obj) == 0) { // No EXPECT_CALL() was set on the given mock object. return true; } // Verifies and clears the expectations on each mock method in the // given mock object. bool expectations_met = true; FunctionMockers& mockers = g_mock_object_registry.states()[mock_obj].function_mockers; for (FunctionMockers::const_iterator it = mockers.begin(); it != mockers.end(); ++it) { if (!(*it)->VerifyAndClearExpectationsLocked()) { expectations_met = false; } } // We don't clear the content of mockers, as they may still be // needed by ClearDefaultActionsLocked(). return expectations_met; } // Registers a mock object and a mock method it owns. // L < g_gmock_mutex void Mock::Register(const void* mock_obj, internal::UntypedFunctionMockerBase* mocker) { internal::MutexLock l(&internal::g_gmock_mutex); g_mock_object_registry.states()[mock_obj].function_mockers.insert(mocker); } // Tells Google Mock where in the source code mock_obj is used in an // ON_CALL or EXPECT_CALL. In case mock_obj is leaked, this // information helps the user identify which object it is. // L < g_gmock_mutex void Mock::RegisterUseByOnCallOrExpectCall( const void* mock_obj, const char* file, int line) { internal::MutexLock l(&internal::g_gmock_mutex); MockObjectState& state = g_mock_object_registry.states()[mock_obj]; if (state.first_used_file == NULL) { state.first_used_file = file; state.first_used_line = line; const TestInfo* const test_info = UnitTest::GetInstance()->current_test_info(); if (test_info != NULL) { // TODO(wan@google.com): record the test case name when the // ON_CALL or EXPECT_CALL is invoked from SetUpTestCase() or // TearDownTestCase(). state.first_used_test_case = test_info->test_case_name(); state.first_used_test = test_info->name(); } } } // Unregisters a mock method; removes the owning mock object from the // registry when the last mock method associated with it has been // unregistered. This is called only in the destructor of // FunctionMockerBase. // L >= g_gmock_mutex void Mock::UnregisterLocked(internal::UntypedFunctionMockerBase* mocker) { internal::g_gmock_mutex.AssertHeld(); for (MockObjectRegistry::StateMap::iterator it = g_mock_object_registry.states().begin(); it != g_mock_object_registry.states().end(); ++it) { FunctionMockers& mockers = it->second.function_mockers; if (mockers.erase(mocker) > 0) { // mocker was in mockers and has been just removed. if (mockers.empty()) { g_mock_object_registry.states().erase(it); } return; } } } // Clears all ON_CALL()s set on the given mock object. // L >= g_gmock_mutex void Mock::ClearDefaultActionsLocked(void* mock_obj) { internal::g_gmock_mutex.AssertHeld(); if (g_mock_object_registry.states().count(mock_obj) == 0) { // No ON_CALL() was set on the given mock object. return; } // Clears the default actions for each mock method in the given mock // object. FunctionMockers& mockers = g_mock_object_registry.states()[mock_obj].function_mockers; for (FunctionMockers::const_iterator it = mockers.begin(); it != mockers.end(); ++it) { (*it)->ClearDefaultActionsLocked(); } // We don't clear the content of mockers, as they may still be // needed by VerifyAndClearExpectationsLocked(). } Expectation::Expectation() {} Expectation::Expectation( const internal::linked_ptr& an_expectation_base) : expectation_base_(an_expectation_base) {} Expectation::~Expectation() {} // Adds an expectation to a sequence. void Sequence::AddExpectation(const Expectation& expectation) const { if (*last_expectation_ != expectation) { if (last_expectation_->expectation_base() != NULL) { expectation.expectation_base()->immediate_prerequisites_ += *last_expectation_; } *last_expectation_ = expectation; } } // Creates the implicit sequence if there isn't one. InSequence::InSequence() { if (internal::g_gmock_implicit_sequence.get() == NULL) { internal::g_gmock_implicit_sequence.set(new Sequence); sequence_created_ = true; } else { sequence_created_ = false; } } // Deletes the implicit sequence if it was created by the constructor // of this object. InSequence::~InSequence() { if (sequence_created_) { delete internal::g_gmock_implicit_sequence.get(); internal::g_gmock_implicit_sequence.set(NULL); } } } // namespace testing clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/src/gmock.cc000066400000000000000000000154211260417502300244400ustar00rootroot00000000000000// Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) #include #include namespace testing { // TODO(wan@google.com): support using environment variables to // control the flag values, like what Google Test does. GMOCK_DEFINE_bool_(catch_leaked_mocks, true, "true iff Google Mock should report leaked mock objects " "as failures."); GMOCK_DEFINE_string_(verbose, internal::kWarningVerbosity, "Controls how verbose Google Mock's output is." " Valid values:\n" " info - prints all messages.\n" " warning - prints warnings and errors.\n" " error - prints errors only."); namespace internal { // Parses a string as a command line flag. The string should have the // format "--gmock_flag=value". When def_optional is true, the // "=value" part can be omitted. // // Returns the value of the flag, or NULL if the parsing failed. static const char* ParseGoogleMockFlagValue(const char* str, const char* flag, bool def_optional) { // str and flag must not be NULL. if (str == NULL || flag == NULL) return NULL; // The flag must start with "--gmock_". const String flag_str = String::Format("--gmock_%s", flag); const size_t flag_len = flag_str.length(); if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL; // Skips the flag name. const char* flag_end = str + flag_len; // When def_optional is true, it's OK to not have a "=value" part. if (def_optional && (flag_end[0] == '\0')) { return flag_end; } // If def_optional is true and there are more characters after the // flag name, or if def_optional is false, there must be a '=' after // the flag name. if (flag_end[0] != '=') return NULL; // Returns the string after "=". return flag_end + 1; } // Parses a string for a Google Mock bool flag, in the form of // "--gmock_flag=value". // // On success, stores the value of the flag in *value, and returns // true. On failure, returns false without changing *value. static bool ParseGoogleMockBoolFlag(const char* str, const char* flag, bool* value) { // Gets the value of the flag as a string. const char* const value_str = ParseGoogleMockFlagValue(str, flag, true); // Aborts if the parsing failed. if (value_str == NULL) return false; // Converts the string value to a bool. *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F'); return true; } // Parses a string for a Google Mock string flag, in the form of // "--gmock_flag=value". // // On success, stores the value of the flag in *value, and returns // true. On failure, returns false without changing *value. static bool ParseGoogleMockStringFlag(const char* str, const char* flag, String* value) { // Gets the value of the flag as a string. const char* const value_str = ParseGoogleMockFlagValue(str, flag, false); // Aborts if the parsing failed. if (value_str == NULL) return false; // Sets *value to the value of the flag. *value = value_str; return true; } // The internal implementation of InitGoogleMock(). // // The type parameter CharType can be instantiated to either char or // wchar_t. template void InitGoogleMockImpl(int* argc, CharType** argv) { // Makes sure Google Test is initialized. InitGoogleTest() is // idempotent, so it's fine if the user has already called it. InitGoogleTest(argc, argv); if (*argc <= 0) return; for (int i = 1; i != *argc; i++) { const String arg_string = StreamableToString(argv[i]); const char* const arg = arg_string.c_str(); // Do we see a Google Mock flag? if (ParseGoogleMockBoolFlag(arg, "catch_leaked_mocks", &GMOCK_FLAG(catch_leaked_mocks)) || ParseGoogleMockStringFlag(arg, "verbose", &GMOCK_FLAG(verbose))) { // Yes. Shift the remainder of the argv list left by one. Note // that argv has (*argc + 1) elements, the last one always being // NULL. The following loop moves the trailing NULL element as // well. for (int j = i; j != *argc; j++) { argv[j] = argv[j + 1]; } // Decrements the argument count. (*argc)--; // We also need to decrement the iterator as we just removed // an element. i--; } } } } // namespace internal // Initializes Google Mock. This must be called before running the // tests. In particular, it parses a command line for the flags that // Google Mock recognizes. Whenever a Google Mock flag is seen, it is // removed from argv, and *argc is decremented. // // No value is returned. Instead, the Google Mock flag variables are // updated. // // Since Google Test is needed for Google Mock to work, this function // also initializes Google Test and parses its flags, if that hasn't // been done. void InitGoogleMock(int* argc, char** argv) { internal::InitGoogleMockImpl(argc, argv); } // This overloaded version can be used in Windows programs compiled in // UNICODE mode. void InitGoogleMock(int* argc, wchar_t** argv) { internal::InitGoogleMockImpl(argc, argv); } } // namespace testing clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/gmock/src/gmock_main.cc000066400000000000000000000050121260417502300254370ustar00rootroot00000000000000// Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) #include #include #include // MS C++ compiler/linker has a bug on Windows (not on Windows CE), which // causes a link error when _tmain is defined in a static library and UNICODE // is enabled. For this reason instead of _tmain, main function is used on // Windows. See the following link to track the current status of this bug: // http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=394464 // NOLINT #if GTEST_OS_WINDOWS_MOBILE #include // NOLINT int _tmain(int argc, TCHAR** argv) { #else int main(int argc, char** argv) { #endif // GTEST_OS_WINDOWS_MOBILE std::cout << "Running main() from gmock_main.cc\n"; // Since Google Mock depends on Google Test, InitGoogleMock() is // also responsible for initializing Google Test. Therefore there's // no need for calling testing::InitGoogleTest() separately. testing::InitGoogleMock(&argc, argv); return RUN_ALL_TESTS(); } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/000077500000000000000000000000001260417502300234035ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/AddRemoveResult.cpp000066400000000000000000000104471260417502300271620ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #include #include "AddRemoveResult.h" #include "AddRemoveResult_p.h" using namespace mygpo; AddRemoveResultPrivate::AddRemoveResultPrivate( AddRemoveResult* qq, QNetworkReply* reply ) : q( qq ), m_reply( reply ), m_error( QNetworkReply::NoError ) { QObject::connect( m_reply, SIGNAL( finished() ), this, SLOT( parseData() ) ); QObject::connect( m_reply, SIGNAL( error( QNetworkReply::NetworkError ) ), this, SLOT( error( QNetworkReply::NetworkError ) ) ); } AddRemoveResultPrivate::~AddRemoveResultPrivate() { } qulonglong AddRemoveResultPrivate::timestamp() const { return m_timestamp; } QVariant AddRemoveResultPrivate::updateUrls() const { return m_updateUrls; } QList< QPair< QUrl, QUrl > > AddRemoveResultPrivate::updateUrlsList() const { QVariantList updateVarList = updateUrls().toList(); QList > updateUrls; foreach( const QVariant & url, updateVarList ) { QVariantList urlList = url.toList(); QUrl first = QUrl( urlList.at( 0 ).toString() ); QUrl second = QUrl( urlList.at( 1 ).toString() ); updateUrls.append( qMakePair( first, second ) ); } return updateUrls; } bool AddRemoveResultPrivate::parse( const QVariant& data ) { QJson::Parser parser; if( !data.canConvert( QVariant::Map ) ) return false; QVariantMap resultMap = data.toMap(); QVariant v = resultMap.value( QLatin1String( "timestamp" ) ); if( !v.canConvert( QVariant::ULongLong ) ) return false; m_timestamp = v.toULongLong(); m_updateUrls = resultMap.value( QLatin1String( "update_urls" ) ); return true; } bool AddRemoveResultPrivate::parse( const QByteArray& data ) { QJson::Parser parser; bool ok; QVariant variant = parser.parse( data, &ok ); if( ok ) { ok = ( parse( variant ) ); } return ok; } void AddRemoveResultPrivate::parseData() { if( m_reply->error() == QNetworkReply::NoError ) { if( parse( m_reply->readAll( ) ) ) { emit q->finished(); } else { emit q->parseError(); } } m_reply->deleteLater(); } void AddRemoveResultPrivate::error( QNetworkReply::NetworkError error ) { this->m_error = error; emit q->requestError( error ); } AddRemoveResult::AddRemoveResult( QNetworkReply* reply , QObject* parent ) : QObject( parent ), d( new AddRemoveResultPrivate( this, reply ) ) { } AddRemoveResult::~AddRemoveResult() { delete d; } QVariant AddRemoveResult::updateUrls() const { return d->updateUrls(); } qulonglong AddRemoveResult::timestamp() const { return d->timestamp(); } QList > AddRemoveResult::updateUrlsList() const { return d->updateUrlsList(); } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/AddRemoveResult.h000066400000000000000000000054361260417502300266310ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef LIBMYGPO_QT_ADDREMOVERESULT_H #define LIBMYGPO_QT_ADDREMOVERESULT_H #include #include #include #include class QUrl; #include "mygpo_export.h" namespace mygpo { class AddRemoveResultPrivate; class MYGPO_EXPORT AddRemoveResult : public QObject { Q_OBJECT Q_PROPERTY( qulonglong timestamp READ timestamp CONSTANT ) Q_PROPERTY( QVariant updateUrls READ updateUrls CONSTANT ) public: AddRemoveResult( QNetworkReply* reply , QObject* parent = 0 ); virtual ~AddRemoveResult(); QVariant updateUrls() const; qulonglong timestamp() const; QList > updateUrlsList() const; private: Q_DISABLE_COPY( AddRemoveResult ) AddRemoveResultPrivate* const d; friend class AddRemoveResultPrivate; signals: /**Gets emitted when the data is ready to read*/ void finished(); /**Gets emitted when an parse error ocurred*/ void parseError(); /**Gets emitted when an request error ocurred*/ void requestError( QNetworkReply::NetworkError error ); }; typedef QSharedPointer AddRemoveResultPtr; } Q_DECLARE_METATYPE( mygpo::AddRemoveResultPtr ); #endif // LIBMYGPO_QT_ADDREMOVERESULT_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/AddRemoveResult_p.h000066400000000000000000000046021260417502300271420ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef ADDREMOVERESULT_PRIVATE_H #define ADDREMOVERESULT_PRIVATE_H #include "AddRemoveResult.h" #include namespace mygpo { class AddRemoveResultPrivate : public QObject { Q_OBJECT public: AddRemoveResultPrivate( AddRemoveResult* qq, QNetworkReply* reply ); virtual ~AddRemoveResultPrivate( ); QVariant updateUrls() const; qulonglong timestamp() const; QList > updateUrlsList() const; private: AddRemoveResult* const q; qulonglong m_timestamp; QVariant m_updateUrls; QNetworkReply* m_reply; QNetworkReply::NetworkError m_error; bool parse( const QVariant& data ); bool parse( const QByteArray& data ); private slots: void parseData(); void error( QNetworkReply::NetworkError error ); }; } #endif //ADDREMOVERESULT_PRIVATE_Hclementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/ApiRequest.cpp000066400000000000000000000547451260417502300262100ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #include "ApiRequest.h" #include "ApiRequest_p.h" #include "UrlBuilder.h" #include "JsonCreator.h" #include #include #include using namespace mygpo; ApiRequestPrivate::ApiRequestPrivate( const QString& username, const QString& password, QNetworkAccessManager* nam ) : m_requestHandler( username, password, nam ) { } ApiRequestPrivate::ApiRequestPrivate( QNetworkAccessManager* nam ) : m_requestHandler( nam ) { } QNetworkReply* ApiRequestPrivate::toplistOpml( uint count ) { QString requestUrl = UrlBuilder::getToplistUrl( count, UrlBuilder::OPML ); return m_requestHandler.getRequest( requestUrl ); } QNetworkReply* ApiRequestPrivate::searchOpml( const QString& query ) { QString requestUrl = UrlBuilder::getPodcastSearchUrl( query, UrlBuilder::OPML ); return m_requestHandler.getRequest( requestUrl ); } QNetworkReply* ApiRequestPrivate::suggestionsOpml( uint count ) { QString requestUrl = UrlBuilder::getSuggestionsUrl( count , UrlBuilder::OPML ); return m_requestHandler.authGetRequest( requestUrl ); } QNetworkReply* ApiRequestPrivate::downloadSubscriptionsOpml( const QString& username, const QString& device ) { QString requestUrl = UrlBuilder::getSubscriptionsUrl( username, device, UrlBuilder::OPML ); return m_requestHandler.authGetRequest( requestUrl ); } QNetworkReply* ApiRequestPrivate::toplistTxt( uint count ) { QString requestUrl = UrlBuilder::getToplistUrl( count, UrlBuilder::TEXT ); return m_requestHandler.getRequest( requestUrl ); } QNetworkReply* ApiRequestPrivate::searchTxt( const QString& query ) { QString requestUrl = UrlBuilder::getPodcastSearchUrl( query, UrlBuilder::TEXT ); return m_requestHandler.getRequest( requestUrl ); } QNetworkReply* ApiRequestPrivate::suggestionsTxt( uint count ) { QString requestUrl = UrlBuilder::getSuggestionsUrl( count , UrlBuilder::TEXT ); return m_requestHandler.authGetRequest( requestUrl ); } QNetworkReply* ApiRequestPrivate::downloadSubscriptionsTxt(const QString& username, const QString& device) { QString requestUrl = UrlBuilder::getSubscriptionsUrl( username, device, UrlBuilder::TEXT ); return m_requestHandler.authGetRequest( requestUrl ); } QNetworkReply* ApiRequestPrivate::toplistXml ( uint count ) { QString requestUrl = UrlBuilder::getToplistUrl( count, UrlBuilder::XML ); return m_requestHandler.getRequest( requestUrl ); } QNetworkReply* ApiRequestPrivate::searchXml( const QString& query ) { QString requestUrl = UrlBuilder::getPodcastSearchUrl( query, UrlBuilder::XML ); return m_requestHandler.getRequest( requestUrl ); } PodcastListPtr ApiRequestPrivate::toplist( uint count ) { QString requestUrl = UrlBuilder::getToplistUrl( count ); QNetworkReply *reply; reply = m_requestHandler.getRequest( requestUrl ); PodcastListPtr podcastList( new PodcastList( reply ) ); return podcastList; } PodcastListPtr ApiRequestPrivate::search( const QString& query ) { QString requestUrl = UrlBuilder::getPodcastSearchUrl( query ); QNetworkReply *reply; reply = m_requestHandler.getRequest( requestUrl ); PodcastListPtr podcastList( new PodcastList( reply ) ); return podcastList; } PodcastListPtr ApiRequestPrivate::suggestions( uint count ) { QString requestUrl = UrlBuilder::getSuggestionsUrl( count ); QNetworkReply *reply; reply = m_requestHandler.authGetRequest( requestUrl ); PodcastListPtr podcastList( new PodcastList( reply ) ); return podcastList; } QNetworkReply* ApiRequestPrivate::downloadSubscriptionsJson(const QString& username, const QString& device) { QString requestUrl = UrlBuilder::getSubscriptionsUrl( username, device ); return m_requestHandler.authGetRequest( requestUrl ); } EpisodePtr ApiRequestPrivate::episodeData( const QUrl& podcasturl, const QUrl& episodeurl ) { QString requestUrl = UrlBuilder::getEpisodeDataUrl( podcasturl.toString(), episodeurl.toString() ); QNetworkReply *reply; reply = m_requestHandler.getRequest( requestUrl ); EpisodePtr episode( new Episode( reply ) ); return episode; } EpisodeListPtr ApiRequestPrivate::favoriteEpisodes( const QString& username ) { QString requestUrl = UrlBuilder::getFavEpisodesUrl( username ); QNetworkReply *reply; reply = m_requestHandler.authGetRequest( requestUrl ); EpisodeListPtr episodeList( new EpisodeList( reply ) ); return episodeList; } PodcastPtr ApiRequestPrivate::podcastData( const QUrl& podcasturl ) { QString requestUrl = UrlBuilder::getPodcastDataUrl( podcasturl.toString() ); QNetworkReply *reply; reply = m_requestHandler.getRequest( requestUrl ); PodcastPtr podcast( new Podcast( reply ) ); return podcast; } PodcastListPtr ApiRequestPrivate::podcastsOfTag( uint count, const QString& tag ) { QString requestUrl = UrlBuilder::getPodcastsOfTagUrl( tag, count ); QNetworkReply *reply; reply = m_requestHandler.getRequest( requestUrl ); PodcastListPtr podcastList( new PodcastList( reply ) ); return podcastList; } TagListPtr ApiRequestPrivate::topTags( uint count ) { QString requestUrl = UrlBuilder::getTopTagsUrl( count ); QNetworkReply *reply; reply = m_requestHandler.getRequest( requestUrl ); TagListPtr tagList( new TagList( reply ) ); return tagList; } AddRemoveResultPtr ApiRequestPrivate::addRemoveSubscriptions( const QString& username, const QString& device, const QList< QUrl >& add, const QList< QUrl >& remove ) { QString requestUrl = UrlBuilder::getAddRemoveSubUrl( username, device ); QByteArray data = JsonCreator::addRemoveSubsToJSON( add, remove ); QNetworkReply *reply; reply = m_requestHandler.postRequest( data, requestUrl ); AddRemoveResultPtr addRemoveResult( new AddRemoveResult( reply ) ); return addRemoveResult; } SettingsPtr ApiRequestPrivate::accountSettings( const QString& username ) { QString requestUrl = UrlBuilder::getAccountSettingsUrl( username ); QNetworkReply *reply; reply = m_requestHandler.authGetRequest( requestUrl ); SettingsPtr settings( new Settings( reply ) ); return settings; } SettingsPtr ApiRequestPrivate::deviceSettings( const QString& username, const QString& device ) { QString requestUrl = UrlBuilder::getDeviceSettingsUrl( username, device ); QNetworkReply *reply; reply = m_requestHandler.authGetRequest( requestUrl ); SettingsPtr settings( new Settings( reply ) ); return settings; } SettingsPtr ApiRequestPrivate::podcastSettings( const QString& username, const QString& podcastUrl ) { QString requestUrl = UrlBuilder::getPodcastSettingsUrl( username, podcastUrl ); QNetworkReply *reply; reply = m_requestHandler.authGetRequest( requestUrl ); SettingsPtr settings( new Settings( reply ) ); return settings; } SettingsPtr ApiRequestPrivate::episodeSettings( const QString& username, const QString& podcastUrl, const QString& episodeUrl ) { QString requestUrl = UrlBuilder::getEpisodeSettingsUrl( username, podcastUrl, episodeUrl ); QNetworkReply *reply; reply = m_requestHandler.authGetRequest( requestUrl ); SettingsPtr settings( new Settings( reply ) ); return settings; } SettingsPtr ApiRequestPrivate::setAccountSettings( const QString& username, QMap& set, const QList< QString >& remove ) { QString requestUrl = UrlBuilder::getAccountSettingsUrl( username ); QNetworkReply *reply; QByteArray postData = JsonCreator::saveSettingsToJSON( set, remove ); reply = m_requestHandler.postRequest( postData, requestUrl ); SettingsPtr settings( new Settings( reply ) ); return settings; } SettingsPtr ApiRequestPrivate::setDeviceSettings( const QString& username, const QString& device, QMap& set, const QList< QString >& remove ) { QString requestUrl = UrlBuilder::getDeviceSettingsUrl( username, device ); QNetworkReply *reply; QByteArray postData = JsonCreator::saveSettingsToJSON( set, remove ); reply = m_requestHandler.postRequest( postData, requestUrl ); SettingsPtr settings( new Settings( reply ) ); return settings; } SettingsPtr ApiRequestPrivate::setPodcastSettings( const QString& username, const QString& podcastUrl, QMap& set, const QList< QString >& remove ) { QString requestUrl = UrlBuilder::getPodcastSettingsUrl( username, podcastUrl ); QNetworkReply *reply; QByteArray postData = JsonCreator::saveSettingsToJSON( set, remove ); reply = m_requestHandler.postRequest( postData, requestUrl ); SettingsPtr settings( new Settings( reply ) ); return settings; } SettingsPtr ApiRequestPrivate::setEpisodeSettings( const QString& username, const QString& podcastUrl, const QString& episodeUrl, QMap& set, const QList< QString >& remove ) { QString requestUrl = UrlBuilder::getEpisodeSettingsUrl( username, podcastUrl, episodeUrl ); QNetworkReply *reply; QByteArray postData = JsonCreator::saveSettingsToJSON( set, remove ); reply = m_requestHandler.postRequest( postData, requestUrl ); SettingsPtr settings( new Settings( reply ) ); return settings; } DeviceUpdatesPtr ApiRequestPrivate::deviceUpdates( const QString& username, const QString& deviceId, qlonglong timestamp ) { QString requestUrl = UrlBuilder::getDeviceUpdatesUrl( username, deviceId, timestamp ); QNetworkReply* reply; reply = m_requestHandler.authGetRequest( requestUrl ); DeviceUpdatesPtr updates( new DeviceUpdates( reply ) ); return updates; } EpisodeActionListPtr ApiRequestPrivate::episodeActions( const QString& username, const bool aggregated ) { QString requestUrl = UrlBuilder::getEpisodeActionsUrl( username, aggregated ); QNetworkReply* reply; reply = m_requestHandler.authGetRequest( requestUrl ); EpisodeActionListPtr episodeActions( new EpisodeActionList( reply ) ); return episodeActions; } EpisodeActionListPtr ApiRequestPrivate::episodeActionsByPodcast( const QString& username, const QString& podcastUrl, const bool aggregated ) { QString requestUrl = UrlBuilder::getEpisodeActionsUrlByPodcast( username, podcastUrl, aggregated ); QNetworkReply* reply; reply = m_requestHandler.authGetRequest( requestUrl ); EpisodeActionListPtr episodeActions( new EpisodeActionList( reply ) ); return episodeActions; } EpisodeActionListPtr ApiRequestPrivate::episodeActionsByDevice( const QString& username, const QString& deviceId, const bool aggregated ) { QString requestUrl = UrlBuilder::getEpisodeActionsUrlByDevice( username, deviceId, aggregated ); QNetworkReply* reply; reply = m_requestHandler.authGetRequest( requestUrl ); EpisodeActionListPtr episodeActions( new EpisodeActionList( reply ) ); return episodeActions; } EpisodeActionListPtr ApiRequestPrivate::episodeActionsByTimestamp( const QString& username, const qulonglong since ) { QString requestUrl = UrlBuilder::getEpisodeActionsUrlByTimestamp( username, since ); QNetworkReply* reply; reply = m_requestHandler.authGetRequest( requestUrl ); EpisodeActionListPtr episodeActions( new EpisodeActionList( reply ) ); return episodeActions; } EpisodeActionListPtr ApiRequestPrivate::episodeActionsByPodcastAndTimestamp( const QString& username, const QString& podcastUrl, const qulonglong since ) { QString requestUrl = UrlBuilder::getEpisodeActionsUrlByPodcastAndTimestamp( username, podcastUrl, since ); QNetworkReply* reply; reply = m_requestHandler.authGetRequest( requestUrl ); EpisodeActionListPtr episodeActions( new EpisodeActionList( reply ) ); return episodeActions; } EpisodeActionListPtr ApiRequestPrivate::episodeActionsByDeviceAndTimestamp( const QString& username, const QString& deviceId, const qulonglong since ) { QString requestUrl = UrlBuilder::getEpisodeActionsUrlByDeviceAndTimestamp( username, deviceId, since ); QNetworkReply* reply; reply = m_requestHandler.authGetRequest( requestUrl ); EpisodeActionListPtr episodeActions( new EpisodeActionList( reply ) ); return episodeActions; } AddRemoveResultPtr ApiRequestPrivate::uploadEpisodeActions( const QString& username, const QList& episodeActions ) { QString requestUrl = UrlBuilder::getEpisodeActionsUrl( username, false ); QNetworkReply *reply; QByteArray postData = JsonCreator::episodeActionListToJSON( episodeActions ); reply = m_requestHandler.postRequest( postData, requestUrl ); AddRemoveResultPtr addRemoveResult( new AddRemoveResult( reply ) ); return addRemoveResult; } QNetworkReply* ApiRequestPrivate::renameDevice( const QString& username , const QString& deviceId , const QString& caption, Device::Type type ) { QString requestUrl = UrlBuilder::getRenameDeviceUrl( username, deviceId ); QNetworkReply* reply; QByteArray data; switch( type ) { case Device::DESKTOP: data = JsonCreator::renameDeviceStringToJSON( caption, QLatin1String( "desktop" ) ); break; case Device::LAPTOP: data = JsonCreator::renameDeviceStringToJSON( caption, QLatin1String( "laptop" ) ); break; case Device::MOBILE: data = JsonCreator::renameDeviceStringToJSON( caption, QLatin1String( "mobile" ) ); break; case Device::SERVER: data = JsonCreator::renameDeviceStringToJSON( caption, QLatin1String( "server" ) ); break; case Device::OTHER: data = JsonCreator::renameDeviceStringToJSON( caption, QLatin1String( "other" ) ); break; } reply = m_requestHandler.postRequest( data, requestUrl ); return reply; } DeviceListPtr ApiRequestPrivate::listDevices( const QString& username ) { QString requestUrl = UrlBuilder::getDeviceListUrl( username ); QNetworkReply* reply; reply = m_requestHandler.authGetRequest( requestUrl ); DeviceListPtr list( new DeviceList( reply ) ); return list; } DeviceSyncResultPtr ApiRequestPrivate::deviceSynchronizationStatus ( const QString& username ) { QString requestUrl = UrlBuilder::getDeviceSynchronizationStatusUrl( username ); QNetworkReply* reply; reply = m_requestHandler.authGetRequest( requestUrl ); DeviceSyncResultPtr result( new DeviceSyncResult( reply ) ); return result; } DeviceSyncResultPtr ApiRequestPrivate::setDeviceSynchronizationStatus(const QString& username, const QList< QStringList >& synchronize, const QList< QString >& stopSynchronize ) { QString requestUrl = UrlBuilder::getDeviceSynchronizationStatusUrl( username ); QNetworkReply* reply; QByteArray data = JsonCreator::deviceSynchronizationListsToJSON( synchronize, stopSynchronize ); reply = m_requestHandler.postRequest( data, requestUrl ); DeviceSyncResultPtr result( new DeviceSyncResult( reply ) ); return result; } ApiRequest::ApiRequest( const QString& username, const QString& password, QNetworkAccessManager* nam ) : d( new ApiRequestPrivate( username, password, nam ) ) { } ApiRequest::ApiRequest( QNetworkAccessManager* nam ) : d( new ApiRequestPrivate( nam ) ) { } ApiRequest::~ApiRequest() { delete d; } QNetworkReply* ApiRequest::toplistOpml( uint count ) { return d->toplistOpml( count ); } QNetworkReply* ApiRequest::searchOpml( const QString& query ) { return d->searchOpml( query ); } QNetworkReply* ApiRequest::suggestionsOpml( uint count ) { return d->suggestionsOpml( count ); } QNetworkReply* ApiRequest::downloadSubscriptionsOpml( const QString& username, const QString& device ) { return d->downloadSubscriptionsOpml( username, device ); } QNetworkReply* ApiRequest::toplistTxt( uint count ) { return d->toplistTxt( count ); } QNetworkReply* ApiRequest::searchTxt( const QString& query ) { return d->searchTxt( query ); } QNetworkReply* ApiRequest::suggestionsTxt( uint count ) { return d->suggestionsTxt( count ); } QNetworkReply* ApiRequest::downloadSubscriptionsTxt(const QString& username, const QString& device) { return d->downloadSubscriptionsTxt( username, device ); } QNetworkReply* ApiRequest::toplistXml ( uint count ) { return d->toplistXml( count ); } QNetworkReply* ApiRequest::searchXml ( const QString& query ) { return d->searchXml( query ); } PodcastListPtr ApiRequest::toplist( uint count ) { return d->toplist( count ); } PodcastListPtr ApiRequest::search( const QString& query ) { return d->search( query ); } PodcastListPtr ApiRequest::suggestions( uint count ) { return d->suggestions( count ); } QNetworkReply* ApiRequest::downloadSubscriptionsJson(const QString& username, const QString& device) { return d->downloadSubscriptionsJson( username, device ); } PodcastListPtr ApiRequest::podcastsOfTag( uint count, const QString& tag ) { return d->podcastsOfTag( count, tag ); } PodcastPtr ApiRequest::podcastData( const QUrl& podcasturl ) { return d->podcastData( podcasturl ); } EpisodePtr ApiRequest::episodeData( const QUrl& podcasturl, const QUrl& episodeurl ) { return d->episodeData( podcasturl, episodeurl ); } EpisodeListPtr ApiRequest::favoriteEpisodes( const QString& username ) { return d->favoriteEpisodes( username ); } TagListPtr ApiRequest::topTags( uint count ) { return d->topTags( count ); } AddRemoveResultPtr ApiRequest::addRemoveSubscriptions( const QString& username, const QString& device, const QList< QUrl >& add, const QList< QUrl >& remove ) { return d->addRemoveSubscriptions( username, device, add, remove ); } SettingsPtr ApiRequest::accountSettings( const QString& username ) { return d->accountSettings( username ); } SettingsPtr ApiRequest::deviceSettings( const QString& username, const QString& device ) { return d->deviceSettings( username, device ); } SettingsPtr ApiRequest::podcastSettings( const QString& username, const QString& podcastUrl ) { return d->podcastSettings( username, podcastUrl ); } SettingsPtr ApiRequest::episodeSettings( const QString& username, const QString& podcastUrl, const QString& episodeUrl ) { return d->episodeSettings( username, podcastUrl, episodeUrl ); } SettingsPtr ApiRequest::setAccountSettings( const QString& username, QMap& set, const QList< QString >& remove ) { return d->setAccountSettings( username, set, remove ); } SettingsPtr ApiRequest::setDeviceSettings( const QString& username, const QString& device, QMap& set, const QList< QString >& remove ) { return d->setDeviceSettings( username, device, set, remove ); } SettingsPtr ApiRequest::setPodcastSettings( const QString& username, const QString& podcastUrl, QMap& set, const QList< QString >& remove ) { return d->setPodcastSettings( username, podcastUrl, set, remove ); } SettingsPtr ApiRequest::setEpisodeSettings( const QString& username, const QString& podcastUrl, const QString& episodeUrl, QMap& set, const QList< QString >& remove ) { return d->setEpisodeSettings( username, podcastUrl, episodeUrl, set, remove ); } DeviceUpdatesPtr ApiRequest::deviceUpdates( const QString& username, const QString& deviceId, qlonglong timestamp ) { return d->deviceUpdates( username, deviceId, timestamp ); } EpisodeActionListPtr ApiRequest::episodeActions( const QString& username, const bool aggregated ) { return d->episodeActions( username, aggregated ); } EpisodeActionListPtr ApiRequest::episodeActionsByPodcast( const QString& username, const QString& podcastUrl, const bool aggregated ) { return d->episodeActionsByPodcast( username, podcastUrl, aggregated ); } EpisodeActionListPtr ApiRequest::episodeActionsByDevice( const QString& username, const QString& deviceId, const bool aggregated ) { return d->episodeActionsByDevice( username, deviceId, aggregated ); } EpisodeActionListPtr ApiRequest::episodeActionsByTimestamp( const QString& username, const qulonglong since ) { return d->episodeActionsByTimestamp( username, since ); } EpisodeActionListPtr ApiRequest::episodeActionsByPodcastAndTimestamp( const QString& username, const QString& podcastUrl, const qulonglong since ) { return d->episodeActionsByPodcastAndTimestamp( username, podcastUrl, since ); } EpisodeActionListPtr ApiRequest::episodeActionsByDeviceAndTimestamp( const QString& username, const QString& deviceId, const qulonglong since ) { return d->episodeActionsByDeviceAndTimestamp( username, deviceId, since ); } AddRemoveResultPtr ApiRequest::uploadEpisodeActions( const QString& username, const QList& episodeActions ) { return d->uploadEpisodeActions( username, episodeActions ); } QNetworkReply* ApiRequest::renameDevice( const QString& username , const QString& deviceId, const QString& caption, Device::Type type ) { return d->renameDevice( username, deviceId, caption, type ); } DeviceListPtr ApiRequest::listDevices( const QString& username ) { return d->listDevices( username ); } DeviceSyncResultPtr ApiRequest::deviceSynchronizationStatus ( const QString& username ) { return d->deviceSynchronizationStatus( username ); } DeviceSyncResultPtr ApiRequest::setDeviceSynchronizationStatus(const QString& username, const QList& synchronize, const QList& stopSynchronize ) { return d->setDeviceSynchronizationStatus( username, synchronize, stopSynchronize ); } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/ApiRequest.h000066400000000000000000000426571260417502300256540ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef LIBMYGPO_QT_APIREQUEST_H #define LIBMYGPO_QT_APIREQUEST_H #include "mygpo_export.h" #include "AddRemoveResult.h" #include "EpisodeList.h" #include "EpisodeActionList.h" #include "PodcastList.h" #include "TagList.h" #include "Settings.h" #include "DeviceUpdates.h" #include "DeviceList.h" #include "DeviceSyncResult.h" class QByteArray; class QString; namespace mygpo { class ApiRequestPrivate; /** * This Class is the Frontend of libmygpo-qt. * Methods from this Class map the Web API of gpodder.net * and return the Results of the Requests. * Web API Documentation can be found here: http://wiki.gpodder.org/wiki/Web_Services/API_2 */ class MYGPO_EXPORT ApiRequest { public: ApiRequest( const QString& username, const QString& password, QNetworkAccessManager* nam ); ApiRequest( QNetworkAccessManager* nam ); ~ApiRequest( ); //SIMPLE API /** * Returns the OPML Result for the Simple API Call "Downloading Podcast Toplists" * @param count The number of Podcasts that should be returned - will be set to to 100 if > 100 or < 1 * @return A Pointer to a QNetworkReply which receives network signals and will contain the data * */ QNetworkReply* toplistOpml( uint count ); /** * Returns the OPML Result for the Simple API Call "Searching for Podcasts" * @param query The String you want to search for * @return A Pointer to a QNetworkReply which receives network signals and will contain the data * */ QNetworkReply* searchOpml( const QString& query ); /** * Returns the OPML Result for the Simple API Call "Downloading podcast suggestions" * Requires Authentication * @param count The maximum number of Podcasts that should be returned - will be set to to 100 if > 100 or < 1 * @return A Pointer to a QNetworkReply which receives network signals and will contain the data * */ QNetworkReply* suggestionsOpml( uint count ); QNetworkReply* downloadSubscriptionsOpml( const QString& username, const QString& device ); /** * Returns the TXT Result for the Simple API Call "Downloading Podcast Toplists" * @param count The number of Podcasts that should be returned - will be set to to 100 if > 100 or < 1 * @return A Pointer to a QNetworkReply which receives network signals and will contain the data * */ QNetworkReply* toplistTxt( uint count ); /** * Returns the TXT Result for the Simple API Call "Searching for Podcasts" * @param query The String you want to search for * @return A Pointer to a QNetworkReply which receives network signals and will contain the data * */ QNetworkReply* searchTxt( const QString& query ); /** * Returns the TXT Result for the Simple API Call "Downloading podcast suggestions" * Requires Authentication * @param count The maximum number of Podcasts that should be returned - will be set to to 100 if > 100 or < 1 * @return A Pointer to a QNetworkReply which receives network signals and will contain the data * */ QNetworkReply* suggestionsTxt( uint count ); QNetworkReply* downloadSubscriptionsTxt( const QString& username, const QString& device ); /** * Returns the TXT Result for the Simple API Call "Downloading Podcast Toplists" * @param count The number of Podcasts that should be returned - will be set to to 100 if > 100 or < 1 * @return A Pointer to a QNetworkReply which receives network signals and will contain the data * */ QNetworkReply* toplistXml( uint count ); /** * Returns the XML Result for the Simple API Call "Searching for Podcasts" * @param query The String you want to search for * @return A Pointer to a QNetworkReply which receives network signals and will contain the data * */ QNetworkReply* searchXml( const QString& query ); /** * Returns the Result for the Simple API Call "Downloading Podcast Toplists" * @param count The number of Podcasts that should be returned - will be set to to 100 if > 100 or < 1 * @return List of Podcast Objects containing the Data from gPodder * */ PodcastListPtr toplist( uint count ); /** * Returns the Result for the Simple API Call "Searching for Podcasts" * @param query The String you want to search for * @return List of Podcast Objects containing the Data from gPodder * */ PodcastListPtr search( const QString& query ); /** * Returns the Result for the Simple API Call "Downloading podcast suggestions" * Requires Authentication * @param count The maximum number of Podcasts that should be returned - will be set to to 100 if > 100 or < 1 * @return List of Podcast Objects containing the Data from gPodder * */ PodcastListPtr suggestions( uint count ); QNetworkReply* downloadSubscriptionsJson( const QString& username, const QString& device ); //ADVANCED API /** * Returns the Result for the Advanced API Call "Retrieving Podcasts of a Tag" * @param query The number of Podcasts that should be returned - will be set to to 100 if > 100 or < 1 * @param tag The Tag for which Podcasts should be retrieved * @return List of Podcast Objects containing the Data from gPodder * */ PodcastListPtr podcastsOfTag( uint count, const QString& tag ); /** * Returns the Result for the Advanced API Call "Retrieving Podcast Data" * @param podcasturl Url of the Podcast for which Data should be retrieved * @return Podcast Object containing the Data from gPodder * */ PodcastPtr podcastData( const QUrl& podcasturl ); /** * Returns the Result for the Advanced API Call "Retrieving Episode Data" * @param podcasturl Url of the Podcast that contains the Episode * @param episodeurl Url of the Episode Data for which Data should be retrieved * @return Episode Object containing the Data from gPodder * */ EpisodePtr episodeData( const QUrl& podcasturl, const QUrl& episodeurl ); /** * Returns the Result for the Advanced API Call "Listing Favorite Episodes" * @param username The User whose Favorite Episodes should be retrieved * @return List of Episode Objects containing the Data from gPodder * */ EpisodeListPtr favoriteEpisodes( const QString& username ); /** * Returns the Result for the Advanced API Call "Retrieving Top Tags" * @param count The number of Tags that should be returned - will be set to to 100 if > 100 or < 1 * @return List of Tag Objects containing the Data from gPodder * */ TagListPtr topTags( uint count ); /** * Uploads Data & returns the Result for the Advanced API Call "Add/remove subscriptions" * Requires Authentication. * @param username User for which this API Call should be executed * @param device gPodder Device for which this API Call should be executed * @param add URLs of Podcasts that should be added to the Subscriptions of the User * @param remove URLs of Podcasts that should be removed from the Subscriptions of the User * */ AddRemoveResultPtr addRemoveSubscriptions( const QString& username, const QString& device, const QList< QUrl >& add, const QList< QUrl >& remove ); /** * Retrieve settings which are attached to an account. * @param username Username of the targeted account * @return Received settings as key-value-pairs * */ SettingsPtr accountSettings( const QString& username ); /** * Retrieve settings which are attached to a device. * @param username Username of the account which owns the device * @param device Name of the targeted device * @return Received settings as key-value-pairs * */ SettingsPtr deviceSettings( const QString& username, const QString& device ); /** * Retrieve settings which are attached to a podcast. * @param username Username of the account which owns the podcast * @param podcastUrl Url which identifies the targeted podcast * @return Received settings as key-value-pairs * */ SettingsPtr podcastSettings( const QString& username, const QString& podcastUrl ); /** * Retrieve settings which are attached to an episode. * @param username Username of the account which owns the episode * @param podcastUrl Url as String which identifies the podcast to which the episode belongs to * @param episodeUrl Url as String which identifies the targeted episode * @return Received settings as key-value-pairs * */ SettingsPtr episodeSettings( const QString& username, const QString& podcastUrl, const QString& episodeUrl ); /** * Set and or remove settings which are attached to an account. * @param username Username of the targeted account * @param set A set of settings as key-value-pairs which shall be set * @param set A set of exisiting settings as key-value-pairs which shall be removed * @return All settings as key-value-pairs which are stored after the update * */ SettingsPtr setAccountSettings( const QString& username, QMap& set, const QList& remove ); /** * Set and or remove settings which are attached to a device. * @param username Username of the account which owns the device * @param device Name of the targeted device * @param set A set of settings as key-value-pairs which shall be set * @param set A set of exisiting settings as key-value-pairs which shall be removed * @return All settings as key-value-pairs which are stored after the update * */ SettingsPtr setDeviceSettings( const QString& username, const QString& device, QMap& set, const QList& remove ); /** * Set and or remove settings which are attached to a podcast. * @param username Username of the account which owns the podcast * @param podcastUrl Url which identifies the targeted podcast * @param set A set of settings as key-value-pairs which shall be set * @param set A set of exisiting settings as key-value-pairs which shall be removed * @return All settings as key-value-pairs which are stored after the update * */ SettingsPtr setPodcastSettings( const QString& username, const QString& podcastUrl, QMap& set, const QList& remove ); /** * Set and or remove settings which are attached to an episode. * @param username Username of the account which owns the episode * @param podcastUrl Url as String which identifies the podcast to which the episode belongs to * @param episodeUrl Url as String which identifies the targeted episode * @param set A set of settings as key-value-pairs which shall be set * @param set A set of exisiting settings as key-value-pairs which shall be removed * @return All settings as key-value-pairs which are stored after the update * */ SettingsPtr setEpisodeSettings( const QString& username, const QString& podcastUrl, const QString& episodeUrl, QMap& set, const QList& remove ); /** * Retrieve episode and subscription updates for a given device. * @param username Username of the account which owns the device * @param deviceId Id of the targeted device * @param timestamp A date in milliseconds, All changes since this timestamp will be retrieved * @return A DeviceUpdatesPtr which accesses: * - a list of subscriptions to be added, with URL, title and descriptions * - a list of URLs to be unsubscribed * - a list of updated episodes * */ DeviceUpdatesPtr deviceUpdates( const QString& username, const QString& deviceId, qlonglong timestamp ); /** * Sets a new name and type for a device identified by a given ID * @param username Username of the account which owns the device * @param deviceId The id of the targeted device * @param caption The new name of the device * @param type The new type of the device * @return A Pointer to a QNetworkReply which receives network signals * */ QNetworkReply* renameDevice( const QString& username, const QString& deviceId, const QString& caption, Device::Type type ); /** * Returns the list of devices that belong to a user. * @param username Username of the targeted user * @return List of devices * */ DeviceListPtr listDevices( const QString& username ); /** * Download episode actions for a given username. * @param Username of the targeted user * @param aggregated If aggregated is set to true, only the latest episode action will be returned * @return List of all episode actions of the user * */ EpisodeActionListPtr episodeActions( const QString& username, const bool aggregated = false ); /** * Download episode actions for a given podcast. * @param username Username of the account which owns the podcast * @param podcastUrl Url which identifies the targeted podcast * @param aggregated If aggregated is set to true, only the latest episode action will be returned * @return List of all episode actions for the given podcast * */ EpisodeActionListPtr episodeActionsByPodcast( const QString& username, const QString& podcastUrl, const bool aggregated = false ); /** * Download episode actions for a given device. * @param username Username of the account which owns the device * @param deviceId The Id of the targeted device * @param aggregated If aggregated is set to true, only the latest episode action will be returned * @return List of all episode actions for the given device * */ EpisodeActionListPtr episodeActionsByDevice( const QString& username, const QString& deviceId, const bool aggregated = false ); /** * Download episode actions for a given username since a given timestamp. * @param Username of the targeted user * @param since Timestamp in milliseconds, Episode Actions since this time will be retrieved * @return List of all new episode actions since the given timestamp * */ EpisodeActionListPtr episodeActionsByTimestamp( const QString& username, const qulonglong since ); /** * Download episode actions for a given podcast since a given timestamp. * @param username Username of the account which owns the podcast * @param podcastUrl Url which identifies the targeted podcast * @param since Timestamp in milliseconds, Episode Actions since this time will be retrieved * @return List of all new episode actions since the given timestamp * */ EpisodeActionListPtr episodeActionsByPodcastAndTimestamp( const QString& username, const QString& podcastUrl, const qulonglong since ); /** * Download episode actions for a given device since a given timestamp. * @param username Username of the account which owns the device * @param deviceId The Id of the targeted device * @param since Timestamp in milliseconds, Episode Actions since this time will be retrieved * @return List of all new episode actions since the given timestamp * */ EpisodeActionListPtr episodeActionsByDeviceAndTimestamp( const QString& username, const QString& deviceId, const qulonglong since ); /** * Upload episode actions * @param episodeActions The list of episode actions which shall be uploaded * @return An AddRemoveResultPtr which contains information about the updated Urls * */ AddRemoveResultPtr uploadEpisodeActions( const QString& username, const QList& episodeActions ); DeviceSyncResultPtr deviceSynchronizationStatus( const QString& username ); DeviceSyncResultPtr setDeviceSynchronizationStatus( const QString& username, const QList& synchronize, const QList& stopSynchronize ); private: ApiRequestPrivate* const d; }; } #endif clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/ApiRequest_p.h000066400000000000000000000130361260417502300261600ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef APIREQUEST_PRIVATE_H #define APIREQUEST_PRIVATE_H #include "ApiRequest.h" #include "RequestHandler.h" namespace mygpo { class ApiRequestPrivate { public: //Constructors ApiRequestPrivate( const QString& username, const QString& password, QNetworkAccessManager* nam ); ApiRequestPrivate( QNetworkAccessManager* nam ); //Member Functions QNetworkReply* toplistOpml( uint count ); QNetworkReply* searchOpml( const QString& query ); QNetworkReply* suggestionsOpml( uint count ); QNetworkReply* downloadSubscriptionsOpml( const QString& username, const QString& device ); QNetworkReply* toplistTxt( uint count ); QNetworkReply* searchTxt( const QString& query ); QNetworkReply* suggestionsTxt( uint count ); QNetworkReply* downloadSubscriptionsTxt ( const QString& username, const QString& device ); QNetworkReply* toplistXml( uint count ); QNetworkReply* searchXml( const QString& query ); PodcastListPtr toplist( uint count ); PodcastListPtr search( const QString& query ); PodcastListPtr suggestions( uint count ); QNetworkReply* downloadSubscriptionsJson( const QString& username, const QString& device ); PodcastListPtr podcastsOfTag( uint count, const QString& tag ); PodcastPtr podcastData( const QUrl& podcasturl ); EpisodePtr episodeData( const QUrl& podcasturl, const QUrl& episodeurl ); EpisodeListPtr favoriteEpisodes( const QString& username ); TagListPtr topTags( uint count ); AddRemoveResultPtr addRemoveSubscriptions( const QString& username, const QString& device, const QList< QUrl >& add, const QList< QUrl >& remove ); SettingsPtr accountSettings( const QString& username ); SettingsPtr deviceSettings( const QString& username, const QString& device ); SettingsPtr podcastSettings( const QString& username, const QString& podcastUrl ); SettingsPtr episodeSettings( const QString& username, const QString& podcastUrl, const QString& episodeUrl ); SettingsPtr setAccountSettings( const QString& username, QMap& set, const QList& remove ); SettingsPtr setDeviceSettings( const QString& username, const QString& device, QMap& set, const QList& remove ); SettingsPtr setPodcastSettings( const QString& username, const QString& podcastUrl, QMap& set, const QList& remove ); SettingsPtr setEpisodeSettings( const QString& username, const QString& podcastUrl, const QString& episodeUrl, QMap& set, const QList& remove ); DeviceUpdatesPtr deviceUpdates( const QString& username, const QString& deviceId, qlonglong timestamp ); QNetworkReply* renameDevice( const QString& username, const QString& deviceId, const QString& caption, Device::Type type ); DeviceListPtr listDevices( const QString& username ); EpisodeActionListPtr episodeActions( const QString& username, const bool aggregated ); EpisodeActionListPtr episodeActionsByPodcast( const QString& username, const QString& podcastUrl, const bool aggregated ); EpisodeActionListPtr episodeActionsByDevice( const QString& username, const QString& deviceId, const bool aggregated ); EpisodeActionListPtr episodeActionsByTimestamp( const QString& username, const qulonglong since ); EpisodeActionListPtr episodeActionsByPodcastAndTimestamp( const QString& username, const QString& podcastUrl, const qulonglong since ); EpisodeActionListPtr episodeActionsByDeviceAndTimestamp( const QString& username, const QString& deviceId, const qulonglong since ); AddRemoveResultPtr uploadEpisodeActions( const QString& username, const QList& episodeActions ); DeviceSyncResultPtr deviceSynchronizationStatus( const QString& username ); DeviceSyncResultPtr setDeviceSynchronizationStatus( const QString& username, const QList& synchronize, const QList& stopSynchronize ); private: RequestHandler m_requestHandler; }; } #endif //APIREQUEST_PRIVATE_Hclementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/CMakeLists.txt000066400000000000000000000042741260417502300261520ustar00rootroot00000000000000# Extra bits for Clementine. set( MYGPO_QT_VERSION_MAJOR "1" ) set( MYGPO_QT_VERSION_MINOR "0" ) set( MYGPO_QT_VERSION_PATCH "7" ) configure_file( Version.h.in ${CMAKE_CURRENT_BINARY_DIR}/Version.h ) include_directories("${QJSON_INCLUDEDIR}/qjson") include_directories( ${QT_INCLUDES} ${QJSON_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ) set ( LIBMYGPO_QT_SRC Config.cpp DeviceSyncResult.cpp Settings.cpp AddRemoveResult.cpp Tag.cpp JsonCreator.cpp Podcast.cpp Episode.cpp EpisodeAction.cpp EpisodeActionList.cpp ApiRequest.cpp RequestHandler.cpp UrlBuilder.cpp TagList.cpp EpisodeList.cpp PodcastList.cpp DeviceUpdates.cpp DeviceList.cpp Device.cpp ) set ( LIBMYGPO_QT_MOC_H Podcast.h Podcast_p.h PodcastList.h PodcastList_p.h Episode.h Episode_p.h EpisodeList.h EpisodeList_p.h Tag.h Tag_p.h TagList.h TagList_p.h Device.h Device_p.h DeviceList.h DeviceList_p.h DeviceSyncResult.h DeviceSyncResult_p.h DeviceUpdates.h DeviceUpdates_p.h EpisodeAction.h EpisodeAction_p.h EpisodeActionList.h EpisodeActionList_p.h Settings.h Settings_p.h AddRemoveResult.h AddRemoveResult_p.h ) set ( LIBMYGPO_QT_INSTALL_H ApiRequest.h mygpo_export.h Config.h Podcast.h PodcastList.h Episode.h EpisodeList.h Tag.h TagList.h Device.h DeviceList.h DeviceSyncResult.h DeviceUpdates.h EpisodeAction.h EpisodeActionList.h Settings.h AddRemoveResult.h ) QT4_WRAP_CPP(LIBMYGPO_QT_MOC_SRC ${LIBMYGPO_QT_MOC_H} ) add_library( mygpo-qt STATIC ${LIBMYGPO_QT_SRC} ${LIBMYGPO_QT_MOC_SRC} ) target_link_libraries( mygpo-qt ${QJSON_LIBRARIES} ${QT_QTCORE_LIBRARY} ${QT_QTNETWORK_LIBRARY} ) set_target_properties( mygpo-qt PROPERTIES VERSION ${MYGPO_QT_VERSION} SOVERSION ${MYGPO_QT_SONAME} DEFINE_SYMBOL MYGPO_MAKEDLL) clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/Config.cpp000066400000000000000000000072471260417502300253260ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2012 - 2013 Stefan Derkits * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #include "Config_p.h" #include "Version.h" #include #include #include using namespace mygpo; Config* Config::s_instance = 0; ConfigPrivate::ConfigPrivate( Config* qq ) : q( qq ), m_mygpoBaseUrl( QUrl( QLatin1String( "http://gpodder.net" ) ) ), m_userAgentPrefix( QString() ) { } ConfigPrivate::~ConfigPrivate() { } int ConfigPrivate::majorVersion() const { return MYGPO_QT_VERSION_MAJOR; } int ConfigPrivate::minorVersion() const { return MYGPO_QT_VERSION_MINOR; } int ConfigPrivate::patchVersion() const { return MYGPO_QT_VERSION_PATCH; } QString ConfigPrivate::version() const { return QString( QLatin1String( "%1.%2.%3" ) ).arg( majorVersion() ).arg( minorVersion() ).arg( patchVersion() ); } QUrl ConfigPrivate::mygpoBaseUrl() const { return m_mygpoBaseUrl; } void ConfigPrivate::setMygpoBaseUrl( const QUrl& mygpoBaseUrl ) { this->m_mygpoBaseUrl = mygpoBaseUrl; } QString ConfigPrivate::userAgent() const { QString userAgent; if ( !m_userAgentPrefix.isEmpty() ) userAgent = m_userAgentPrefix % QLatin1String( " " ); userAgent = userAgent % QLatin1String( "libmygpo-qt " ) % version(); return userAgent; } QString ConfigPrivate::userAgentPrefix() const { return m_userAgentPrefix; } void ConfigPrivate::setUserAgentPrefix( const QString& prefix ) { m_userAgentPrefix = prefix; } Config::Config() : d( new ConfigPrivate( this ) ) { } Config::~Config() { delete d; } int Config::majorVersion() const { return d->majorVersion(); } int Config::minorVersion() const { return d->minorVersion(); } int Config::patchVersion() const { return d->patchVersion(); } QString Config::version() const { return d->version(); } QUrl Config::mygpoBaseUrl() const { return d->mygpoBaseUrl(); } void Config::setMygpoBaseUrl(const QUrl& mygpoBaseUrl) { d->setMygpoBaseUrl( mygpoBaseUrl ); } QString Config::userAgent() const { return d->userAgent(); } QString Config::userAgentPrefix() const { return d->userAgentPrefix(); } void Config::setUserAgentPrefix(const QString& prefix) { d->setUserAgentPrefix( prefix ); } Config* Config::instance() { if ( !s_instance ) { s_instance = new Config; } return s_instance; } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/Config.h000066400000000000000000000043521260417502300247650ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2012 - 2013 Stefan Derkits * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef LIBMYGPO_QT_CONFIG_H #define LIBMYGPO_QT_CONFIG_H #include "mygpo_export.h" #include #include namespace mygpo { class ConfigPrivate; //TODO: More config entries (mygpo-feedservice baseurl), let class inherit from QObject, set everything as a Property class MYGPO_EXPORT Config { public: static Config* instance(); int majorVersion() const; int minorVersion() const; int patchVersion() const; QString version() const; QUrl mygpoBaseUrl() const; void setMygpoBaseUrl( const QUrl& mygpoBaseUrl ); QString userAgent() const; QString userAgentPrefix() const; void setUserAgentPrefix( const QString& prefix ); private: Config(); ~Config(); static Config* s_instance; ConfigPrivate* const d; }; } #endif // LIBMYGPO_QT_CONFIG_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/Config_p.h000066400000000000000000000041131260417502300252770ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2012 - 2013 Stefan Derkits * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef LIBMYGPO_QT_CONFIG_PRIVATE_H #define LIBMYGPO_QT_CONFIG_PRIVATE_H #include "Config.h" namespace mygpo { class ConfigPrivate { public: ConfigPrivate( Config* qq ); ~ConfigPrivate(); int majorVersion() const; int minorVersion() const; int patchVersion() const; QString version() const; QUrl mygpoBaseUrl() const; void setMygpoBaseUrl( const QUrl& mygpoBaseUrl ); QString userAgent() const; QString userAgentPrefix() const; void setUserAgentPrefix( const QString& prefix ); private: Config* q; QUrl m_mygpoBaseUrl; QString m_userAgentPrefix; }; } #endif // LIBMYGPO_QT_CONFIG_PRIVATE_Hclementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/Device.cpp000066400000000000000000000065731260417502300253210ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #include "Device.h" #include "Device_p.h" using namespace mygpo; Device::Device( const QVariant& var, QObject* parent ): QObject( parent ), d( new DevicePrivate( var ) ) { } Device::~Device() { delete d; } QString Device::caption() const { return d->caption(); } QString Device::id() const { return d->id(); } qulonglong Device::subscriptions() const { return d->subscriptions(); } QString Device::type() const { return d->type(); } DevicePrivate::DevicePrivate( const QVariant& var ) : m_id(), m_caption(), m_type(), m_subscriptions( 0 ) { parse( var ); } bool DevicePrivate::parse( const QVariant& var ) { if( var.canConvert( QVariant::Map ) ) { QVariant vid, vcaption, vtype, vsubscriptions; QMap varMap; varMap = var.toMap(); vid = varMap.value( QLatin1String( "id" ) ); vcaption = varMap.value( QLatin1String( "caption" ) ); vtype = varMap.value( QLatin1String( "type" ) ); vsubscriptions = varMap.value( QLatin1String( "subscriptions" ) ); if( vid.canConvert( QVariant::String ) && vcaption.canConvert( QVariant::String ) && vtype.canConvert( QVariant::String ) && vsubscriptions.canConvert( QVariant::LongLong ) ) { m_id = vid.toString(); m_caption = vcaption.toString(); m_type = vtype.toString(); m_subscriptions = vsubscriptions.toLongLong(); return true; } } return false; } QString DevicePrivate::caption() const { return this->m_caption; } QString DevicePrivate::id() const { return this->m_id; } qulonglong DevicePrivate::subscriptions() const { return this->m_subscriptions; } QString DevicePrivate::type() const { return this->m_type; } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/Device.h000066400000000000000000000050141260417502300247530ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef LIBMYGPO_QT_DEVICE_H #define LIBMYGPO_QT_DEVICE_H #include "mygpo_export.h" #include #include namespace mygpo { class DevicePrivate; class MYGPO_EXPORT Device : public QObject { Q_OBJECT Q_PROPERTY( QString id READ id CONSTANT ) Q_PROPERTY( QString caption READ caption CONSTANT ) Q_PROPERTY( QString type READ type CONSTANT ) Q_PROPERTY( qulonglong subscriptions READ subscriptions CONSTANT ) public: enum Type { DESKTOP, LAPTOP, MOBILE, SERVER, OTHER }; Device( const QVariant& var, QObject* parent = 0 ); virtual ~Device(); QString id() const; QString caption() const; QString type() const; qulonglong subscriptions() const; private: Q_DISABLE_COPY( Device ) DevicePrivate* const d; }; typedef QSharedPointer DevicePtr; } Q_DECLARE_METATYPE( mygpo::DevicePtr ); #endif //LIBMYGPO_QT_DEVICE_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/DeviceList.cpp000066400000000000000000000071741260417502300261530ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2011 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #include "DeviceList_p.h" #include using namespace mygpo; DeviceListPrivate::DeviceListPrivate( DeviceList* qq, QNetworkReply* reply ) : q( qq ), m_reply( reply ), m_error( QNetworkReply::NoError ) { QObject::connect( m_reply, SIGNAL( finished() ), this, SLOT( parseData() ) ); QObject::connect( m_reply, SIGNAL( error( QNetworkReply::NetworkError ) ), this, SLOT( error( QNetworkReply::NetworkError ) ) ); } DeviceListPrivate::~DeviceListPrivate() { } QVariant DeviceListPrivate::devices() const { return m_devices; } QList< DevicePtr > DeviceListPrivate::devicesList() const { return m_devicesList; } void DeviceListPrivate::error( QNetworkReply::NetworkError error ) { m_error = error; emit q->requestError( error ); } bool DeviceListPrivate::parse( const QVariant& data ) { if( !data.canConvert( QVariant::List ) ) return false; QVariantList varList = data.toList(); QVariantList devList; foreach( const QVariant & var, varList ) { DevicePtr ptr( new Device( var, this ) ); m_devicesList.append( ptr ); QVariant v; v.setValue( ptr ); devList.append( v ); } m_devices = devList; return true; } bool DeviceListPrivate::parse( const QByteArray& data ) { QJson::Parser parser; bool ok; QVariant variant = parser.parse( data, &ok ); if( ok ) { ok = ( parse( variant ) ); } return ok; } void DeviceListPrivate::parseData() { if( m_reply->error() == QNetworkReply::NoError ) { if( parse( m_reply->readAll() ) ) { emit q->finished(); } else { emit q->parseError(); } } m_reply->deleteLater(); } DeviceList::DeviceList( QNetworkReply* reply, QObject* parent ) : QObject( parent ), d( new DeviceListPrivate( this, reply ) ) { } DeviceList::~DeviceList() { delete d; } QVariant mygpo::DeviceList::devices() const { return d->devices(); } QList< DevicePtr > DeviceList::devicesList() const { return d->devicesList(); } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/DeviceList.h000066400000000000000000000051141260417502300256100ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef LIBMYGPO_QT_DEVICELIST_H #define LIBMYGPO_QT_DEVICELIST_H #include #include #include "Device.h" #include "mygpo_export.h" namespace mygpo { class DeviceListPrivate; class MYGPO_EXPORT DeviceList : public QObject { Q_OBJECT Q_PROPERTY( QVariant devices READ devices CONSTANT ) public: DeviceList( QNetworkReply* reply, QObject* parent = 0 ); virtual ~DeviceList(); QVariant devices() const; QList< DevicePtr > devicesList() const; private: Q_DISABLE_COPY( DeviceList ) DeviceListPrivate* const d; friend class DeviceListPrivate; signals: /**Gets emitted when the data is ready to read*/ void finished(); /**Gets emitted when an parse error ocurred*/ void parseError(); /**Gets emitted when an request error ocurred*/ void requestError( QNetworkReply::NetworkError error ); }; typedef QSharedPointer DeviceListPtr; } Q_DECLARE_METATYPE( mygpo::DeviceListPtr ); #endif //LIBMYGPO_QT_DEVICELIST_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/DeviceList_p.h000066400000000000000000000044251260417502300261330ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef DEVICELIST_PRIVATE_H #define DEVICELIST_PRIVATE_H #include "DeviceList.h" namespace mygpo { class DeviceListPrivate : public QObject { Q_OBJECT public: DeviceListPrivate( DeviceList* qq, QNetworkReply* reply ); virtual ~DeviceListPrivate(); QVariant devices() const; QList< DevicePtr > devicesList() const; private: DeviceList* q; QNetworkReply* m_reply; QVariant m_devices; QList m_devicesList; QNetworkReply::NetworkError m_error; bool parse( const QVariant& data ); bool parse( const QByteArray& data ); private slots: void parseData(); void error( QNetworkReply::NetworkError error ); }; } #endif //DEVICELIST_PRIVATE_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/DeviceSyncResult.cpp000066400000000000000000000110221260417502300273360ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2011 - 2013 Stefan Derkits * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #include "DeviceSyncResult_p.h" #include using namespace mygpo; DeviceSyncResultPrivate::DeviceSyncResultPrivate( DeviceSyncResult* qq, QNetworkReply* reply ) : q( qq ), m_reply( reply ), m_error( QNetworkReply::NoError ) { QObject::connect( m_reply, SIGNAL( finished() ), this, SLOT( parseData() ) ); QObject::connect( m_reply, SIGNAL( error( QNetworkReply::NetworkError ) ), this, SLOT( error( QNetworkReply::NetworkError ) ) ); } DeviceSyncResultPrivate::~DeviceSyncResultPrivate() { } QVariant DeviceSyncResultPrivate::synchronized() const { return m_synchronized; } QVariant DeviceSyncResultPrivate::notSynchronized() const { return m_notSynchronized; } QList DeviceSyncResultPrivate::synchronizedList() const { QVariantList synchronizedVarList = synchronized().toList(); QList synchronizedList; foreach( const QVariant & list, synchronizedVarList ) { QVariantList innerVarList = list.toList(); QStringList innerList; foreach( const QVariant& device, innerVarList ) { innerList.append(device.toString()); } synchronizedList.append(innerList); } return synchronizedList; } QList DeviceSyncResultPrivate::notSynchronizedList() const { QVariantList notSynchronizedVarList = notSynchronized().toList(); QList notSynchronizedList; foreach ( const QVariant& device, notSynchronizedVarList ) { notSynchronizedList.append(device.toString()); } return notSynchronizedList; } bool DeviceSyncResultPrivate::parse( const QVariant& data ) { if( !data.canConvert( QVariant::Map ) ) return false; QVariantMap varMap = data.toMap(); m_synchronized = varMap.value( QLatin1String( "synchronized" ) ); m_notSynchronized = varMap.value( QLatin1String( "not-synchronized" ) ); return true; } bool DeviceSyncResultPrivate::parse( const QByteArray& data ) { QJson::Parser parser; bool ok; QVariant variant = parser.parse( data, &ok ); if( ok ) { ok = ( parse( variant ) ); } return ok; } void DeviceSyncResultPrivate::parseData() { if( m_reply->error() == QNetworkReply::NoError ) { if( parse( m_reply->readAll() ) ) { emit q->finished(); } else { emit q->parseError(); } } m_reply->deleteLater(); } void DeviceSyncResultPrivate::error( QNetworkReply::NetworkError error ) { m_error = error; emit q->requestError( error ); } DeviceSyncResult::DeviceSyncResult ( QNetworkReply* reply, QObject* parent ) : QObject ( parent ), d( new DeviceSyncResultPrivate( this, reply ) ) { } DeviceSyncResult::~DeviceSyncResult() { delete d; } QVariant DeviceSyncResult::synchronized() const { return d->synchronized(); } QVariant DeviceSyncResult::notSynchronized() const { return d->notSynchronized(); } QList DeviceSyncResult::synchronizedList() const { return d->synchronizedList(); } QList< QString > DeviceSyncResult::notSynchronizedList() const { return d->notSynchronizedList(); } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/DeviceSyncResult.h000066400000000000000000000052431260417502300270130ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2011 - 2013 Stefan Derkits * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef LIBMYGPO_QT_DEVICESYNCRESULT_H #define LIBMYGPO_QT_DEVICESYNCRESULT_H #include #include #include #include #include "mygpo_export.h" namespace mygpo { class DeviceSyncResultPrivate; class MYGPO_EXPORT DeviceSyncResult : public QObject { Q_OBJECT Q_PROPERTY( QVariant synchronized READ synchronized CONSTANT ) Q_PROPERTY( QVariant notSynchronized READ notSynchronized CONSTANT ) public: DeviceSyncResult ( QNetworkReply* reply, QObject* parent = 0 ); virtual ~DeviceSyncResult(); QVariant synchronized() const; QVariant notSynchronized() const; QList synchronizedList() const; QList notSynchronizedList() const; private: Q_DISABLE_COPY( DeviceSyncResult ) DeviceSyncResultPrivate* const d; friend class DeviceSyncResultPrivate; signals: /**Gets emitted when the data is ready to read*/ void finished(); /**Gets emitted when an parse error ocurred*/ void parseError(); /**Gets emitted when an request error ocurred*/ void requestError( QNetworkReply::NetworkError error ); }; typedef QSharedPointer DeviceSyncResultPtr; } #endif // LIBMYGPO_QT_DEVICESYNCRESULT_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/DeviceSyncResult_p.h000066400000000000000000000044301260417502300273270ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2011 - 2013 Stefan Derkits * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef DEVICESYNCRESULT_PRIVATE_H #define DEVICESYNCRESULT_PRIVATE_H #include "DeviceSyncResult.h" namespace mygpo { class DeviceSyncResultPrivate : public QObject { Q_OBJECT public: DeviceSyncResultPrivate( DeviceSyncResult* qq, QNetworkReply* reply ); virtual ~DeviceSyncResultPrivate(); QVariant synchronized() const; QVariant notSynchronized() const; QList synchronizedList() const; QList notSynchronizedList() const; private: DeviceSyncResult* q; QVariant m_synchronized; QVariant m_notSynchronized; QNetworkReply* m_reply; QNetworkReply::NetworkError m_error; bool parse( const QVariant& data ); bool parse( const QByteArray& data ); private slots: void parseData(); void error( QNetworkReply::NetworkError error ); }; } #endif // DEVICESYNCRESULT_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/DeviceUpdates.cpp000066400000000000000000000121231260417502300266330ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #include "DeviceUpdates_p.h" #include using namespace mygpo; DeviceUpdatesPrivate::DeviceUpdatesPrivate( DeviceUpdates* qq, QNetworkReply* reply ): q( qq ), m_timestamp( 0 ), m_reply( reply ), m_error( QNetworkReply::NoError ) { QObject::connect( m_reply, SIGNAL( finished() ), this, SLOT( parseData() ) ); QObject::connect( m_reply, SIGNAL( error( QNetworkReply::NetworkError ) ), this, SLOT( error( QNetworkReply::NetworkError ) ) ); } DeviceUpdatesPrivate::~DeviceUpdatesPrivate() { } QVariant DeviceUpdatesPrivate::add() const { return m_add; } QList< PodcastPtr > DeviceUpdatesPrivate::addList() const { QVariantList updateVarList = m_add.toList(); QList ret; foreach( const QVariant & var, updateVarList ) { ret.append( PodcastPtr( new Podcast( var ) ) ); } return ret; } QVariant DeviceUpdatesPrivate::remove() const { return m_remove; } QList< QUrl > DeviceUpdatesPrivate::removeList() const { QVariantList updateVarList = m_remove.toList(); QList ret; foreach( const QVariant & var, updateVarList ) { if( var.canConvert( QVariant::Url ) ) ret.append( var.toUrl() ); } return ret; } QVariant DeviceUpdatesPrivate::update() const { return m_update; } QList< EpisodePtr > DeviceUpdatesPrivate::updateList() const { QVariantList updateVarList = m_update.toList(); QList ret; foreach( const QVariant & var, updateVarList ) { ret.append( EpisodePtr( new Episode( var ) ) ); } return ret; } bool DeviceUpdatesPrivate::parse( const QVariant& data ) { if( !data.canConvert( QVariant::Map ) ) return false; QVariantMap varMap = data.toMap(); m_add = varMap.value( QLatin1String( "add" ) ); m_remove = varMap.value( QLatin1String( "remove" ) ); m_update = varMap.value( QLatin1String( "updates" ) ); if( varMap.value( QLatin1String( "timestamp" ) ).canConvert( QVariant::LongLong ) ) m_timestamp = varMap.value( QLatin1String( "timestamp" ) ).toLongLong(); return true; } bool DeviceUpdatesPrivate::parse( const QByteArray& data ) { QJson::Parser parser; bool ok; QVariant variant = parser.parse( data, &ok ); if( ok ) { ok = ( parse( variant ) ); } return ok; } void DeviceUpdatesPrivate::parseData() { if( m_reply->error() == QNetworkReply::NoError ) { if( parse( m_reply->readAll() ) ) { emit q->finished(); } else { emit q->parseError(); } } m_reply->deleteLater(); } void DeviceUpdatesPrivate::error( QNetworkReply::NetworkError error ) { m_error = error; emit q->requestError( error ); } qulonglong DeviceUpdatesPrivate::timestamp() const { return m_timestamp; } DeviceUpdates::DeviceUpdates( QNetworkReply* reply, QObject* parent ): QObject( parent ), d( new DeviceUpdatesPrivate( this, reply ) ) { } DeviceUpdates::~DeviceUpdates() { delete d; } QVariant DeviceUpdates::add() const { return d->add(); } QList< PodcastPtr > DeviceUpdates::addList() const { return d->addList(); } QVariant mygpo::DeviceUpdates::remove() const { return d->remove(); } QList< QUrl > mygpo::DeviceUpdates::removeList() const { return d->removeList(); } QVariant mygpo::DeviceUpdates::update() const { return d->update(); } QList< mygpo::EpisodePtr > mygpo::DeviceUpdates::updateList() const { return d->updateList(); } qulonglong DeviceUpdates::timestamp() const { return d->timestamp(); } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/DeviceUpdates.h000066400000000000000000000056231260417502300263070ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef LIBMYGPO_QT_DEVICEUPDATES_H #define LIBMYGPO_QT_DEVICEUPDATES_H #include #include #include "mygpo_export.h" #include "Podcast.h" #include "Episode.h" namespace mygpo { class DeviceUpdatesPrivate; class MYGPO_EXPORT DeviceUpdates : public QObject { Q_OBJECT Q_PROPERTY( QVariant add READ add CONSTANT ) Q_PROPERTY( QVariant update READ update CONSTANT ) Q_PROPERTY( QVariant remove READ remove CONSTANT ) Q_PROPERTY( qulonglong timestamp READ timestamp CONSTANT ) public: DeviceUpdates( QNetworkReply* reply, QObject* parent = 0 ); virtual ~DeviceUpdates(); QList addList() const; QList updateList() const; QList removeList() const; QVariant add() const; QVariant update() const; QVariant remove() const; qulonglong timestamp() const; private: Q_DISABLE_COPY( DeviceUpdates ) DeviceUpdatesPrivate* const d; friend class DeviceUpdatesPrivate; signals: /**Gets emitted when the data is ready to read*/ void finished(); /**Gets emitted when an parse error ocurred*/ void parseError(); /**Gets emitted when an request error ocurred*/ void requestError( QNetworkReply::NetworkError error ); }; typedef QSharedPointer DeviceUpdatesPtr; } #endif // LIBMYGPO_QT_DEVICEUPDATES_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/DeviceUpdates_p.h000066400000000000000000000047651260417502300266340ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef DEVICEUPDATES_PRIVATE_H #define DEVICEUPDATES_PRIVATE_H #include "DeviceUpdates.h" namespace mygpo { class DeviceUpdatesPrivate : public QObject { Q_OBJECT public: DeviceUpdatesPrivate( DeviceUpdates* qq, QNetworkReply* reply ); virtual ~DeviceUpdatesPrivate(); QList addList() const; QList updateList() const; QList removeList() const; QVariant add() const; QVariant update() const; QVariant remove() const; qulonglong timestamp() const; private: DeviceUpdates* q; QVariant m_add; QVariant m_update; QVariant m_remove; qlonglong m_timestamp; QNetworkReply* m_reply; QNetworkReply::NetworkError m_error; bool parse( const QVariant& data ); bool parse( const QByteArray& data ); private slots: void parseData(); void error( QNetworkReply::NetworkError error ); }; } #endif //DEVICEUPDATES_PRIVATE_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/Device_p.h000066400000000000000000000040671260417502300253010ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef DEVICE_PRIVATE_H #define DEVICE_PRIVATE_H #include "Device.h" namespace mygpo { class DevicePrivate : public QObject { Q_OBJECT public: DevicePrivate( const QVariant& var ); QString id() const; QString caption() const; QString type() const; qulonglong subscriptions() const; private: QString m_id; QString m_caption; QString m_type; qulonglong m_subscriptions; bool parse( const QVariant& var ); }; } #endif //DEVICE_PRIVATE_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/Episode.cpp000066400000000000000000000155021260417502300255020ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #include "Episode_p.h" #include using namespace mygpo; EpisodePrivate::~EpisodePrivate() { } EpisodePrivate::EpisodePrivate ( Episode* qq, QNetworkReply* reply, QObject* parent ) : QObject ( parent ), m_reply ( reply ), q ( qq ), m_error ( QNetworkReply::NoError ) { QObject::connect ( m_reply, SIGNAL ( finished() ), this, SLOT ( parseData() ) ); QObject::connect ( m_reply, SIGNAL ( error ( QNetworkReply::NetworkError ) ), this, SLOT ( error ( QNetworkReply::NetworkError ) ) ); } EpisodePrivate::EpisodePrivate ( Episode* qq, const QVariant& variant, QObject* parent ) : QObject ( parent ), m_reply ( 0 ), q ( qq ) { parse ( variant ); } bool EpisodePrivate::parse ( const QVariant& data ) { if ( !data.canConvert ( QVariant::Map ) ) return false; QVariantMap episodeMap = data.toMap(); QVariant s = episodeMap.value ( QLatin1String ( "url" ) ); if ( !s.canConvert ( QVariant::Url ) ) return false; m_url = s.toUrl(); s = episodeMap.value ( QLatin1String ( "title" ) ); if ( !s.canConvert ( QVariant::String ) ) return false; m_title = s.toString(); s = episodeMap.value ( QLatin1String ( "podcast_url" ) ); if ( !s.canConvert ( QVariant::Url ) ) return false; m_podcastUrl = s.toUrl(); s = episodeMap.value ( QLatin1String ( "podcast_title" ) ); if ( !s.canConvert ( QVariant::String ) ) return false; m_podcastTitle = s.toString(); s = episodeMap.value ( QLatin1String ( "description" ) ); if ( !s.canConvert ( QVariant::String ) ) return false; m_description = s.toString(); s = episodeMap.value ( QLatin1String ( "website" ) ); if ( !s.canConvert ( QVariant::Url ) ) return false; m_website = s.toUrl(); s = episodeMap.value ( QLatin1String ( "mygpo_link" ) ); if ( !s.canConvert ( QVariant::Url ) ) return false; m_mygpoUrl = s.toUrl(); s = episodeMap.value ( QLatin1String ( "status" ) ); if ( s.canConvert ( QVariant::String ) ) { QString status = s.toString(); m_status = Episode::UNKNOWN; if ( QString::compare ( status, QLatin1String ( "new" ) ,Qt::CaseInsensitive ) == 0 ) { m_status = Episode::NEW; } else if ( QString::compare ( status, QLatin1String ( "play" ) ,Qt::CaseInsensitive ) == 0 ) { m_status = Episode::PLAY; } else if ( QString::compare ( status, QLatin1String ( "download" ) ,Qt::CaseInsensitive ) == 0 ) { m_status = Episode::DOWNLOAD; } else if ( QString::compare ( status, QLatin1String ( "delete" ) ,Qt::CaseInsensitive ) == 0 ) { m_status = Episode::DELETE; } } else { m_status = Episode::UNKNOWN; } s = episodeMap.value( QLatin1String ( "released" ) ); if ( s.canConvert( QVariant::String ) ) { QString date = s.toString(); m_released = QDateTime::fromString( date, Qt::ISODate ); } else { m_released = QDateTime::currentDateTime(); } return true; } bool EpisodePrivate::parse ( const QByteArray& data ) { QJson::Parser parser; bool ok; QVariant variant = parser.parse ( data, &ok ); if ( ok ) { if ( !parse ( variant ) ) return false; return true; } else { return false; } } void EpisodePrivate::parseData() { //parse and send signal if ( m_reply->error() == QNetworkReply::NoError ) { if ( parse ( m_reply->readAll() ) ) { emit q->finished(); } else { emit q->parseError(); } } m_reply->deleteLater(); } void EpisodePrivate::error ( QNetworkReply::NetworkError error ) { this->m_error = error; emit q->requestError ( error ); } QString EpisodePrivate::description() const { return m_description; } QUrl EpisodePrivate::mygpoUrl() const { return m_mygpoUrl; } QString EpisodePrivate::podcastTitle() const { return m_podcastTitle; } QUrl EpisodePrivate::podcastUrl() const { return m_podcastUrl; } QString EpisodePrivate::title() const { return m_title; } QUrl EpisodePrivate::url() const { return m_url; } QUrl EpisodePrivate::website() const { return m_website; } Episode::Status EpisodePrivate::status() const { return m_status; } QDateTime EpisodePrivate::releaded() const { return m_released; } Episode::Episode ( QNetworkReply* reply, QObject* parent ) : QObject ( parent ), d ( new EpisodePrivate ( this, reply ) ) { } Episode::Episode ( const QVariant& variant, QObject* parent ) : QObject ( parent ), d ( new EpisodePrivate ( this, variant ) ) { } Episode::~Episode() { delete d; } QUrl Episode::url() const { return d->url(); } QString Episode::title() const { return d->title(); } QUrl Episode::podcastUrl() const { return d->podcastUrl(); } QString Episode::podcastTitle() const { return d->podcastTitle(); } QString Episode::description() const { return d->description(); } QUrl Episode::website() const { return d->website(); } QUrl Episode::mygpoUrl() const { return d->mygpoUrl(); } Episode::Status Episode::status() const { return d->status(); } QDateTime Episode::released() const { return d->releaded(); } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/Episode.h000066400000000000000000000065661260417502300251610ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef LIBMYGPO_QT_EPISODE_H #define LIBMYGPO_QT_EPISODE_H #include #include #include #include #include #include #include "mygpo_export.h" namespace mygpo { class EpisodePrivate; class MYGPO_EXPORT Episode : public QObject { Q_OBJECT Q_PROPERTY( QUrl url READ url CONSTANT ) Q_PROPERTY( QString title READ title CONSTANT ) Q_PROPERTY( QUrl podcastUrl READ url CONSTANT ) Q_PROPERTY( QString podcastTitle READ title CONSTANT ) Q_PROPERTY( QString description READ description CONSTANT ) Q_PROPERTY( QUrl website READ website CONSTANT ) Q_PROPERTY( QDateTime released READ released CONSTANT ) Q_PROPERTY( int status READ status CONSTANT ) Q_PROPERTY( QUrl mygpoUrl READ mygpoUrl CONSTANT ) public: enum Status { UNKNOWN, NEW, PLAY, DOWNLOAD, DELETE }; Episode( QNetworkReply* reply, QObject* parent = 0 ); Episode( const QVariant& variant, QObject* parent = 0 ); virtual ~Episode(); QUrl url() const; QString title() const; QUrl podcastUrl() const; QString podcastTitle() const; QString description() const; QUrl website() const; QUrl mygpoUrl() const; QDateTime released() const; Episode::Status status() const; private: Q_DISABLE_COPY( Episode ) EpisodePrivate* const d; friend class EpisodePrivate; signals: /**Gets emitted when the data is ready to read*/ void finished(); /**Gets emitted when an parse error ocurred*/ void parseError(); /**Gets emitted when an request error ocurred*/ void requestError( QNetworkReply::NetworkError error ); }; typedef QSharedPointer EpisodePtr; } Q_DECLARE_METATYPE( mygpo::EpisodePtr ); #endif // LIBMYGPO_QT_EPISODE_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/EpisodeAction.cpp000066400000000000000000000201671260417502300266430ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #include "EpisodeAction_p.h" #include using namespace mygpo; static qulonglong c_maxlonglong = (2^64)-1; EpisodeActionPrivate::EpisodeActionPrivate( EpisodeAction* qq, const QVariant& variant, QObject* parent ) : QObject( parent ), q( qq ) { bool valid = parse( variant ); qq->setProperty("valid", QVariant( valid ) ); } EpisodeActionPrivate::EpisodeActionPrivate( EpisodeAction* qq, const QUrl& podcastUrl, const QUrl& episodeUrl, const QString& deviceName, EpisodeAction::ActionType action, qulonglong timestamp, qulonglong started, qulonglong position, qulonglong total, QObject* parent ) : QObject( parent ), q( qq ), m_podcastUrl( podcastUrl ), m_episodeUrl( episodeUrl ), m_deviceName( deviceName ), m_action( action ), m_timestamp( timestamp ), m_started( started ), m_position( position ), m_total( total ) { } EpisodeActionPrivate::~EpisodeActionPrivate() { } bool EpisodeActionPrivate::parse( const QVariant& data ) { if( !data.canConvert( QVariant::Map ) ) return false; QVariantMap episodeActionMap = data.toMap(); QVariant s = episodeActionMap.value( QLatin1String( "podcast" ) ); if( !s.canConvert( QVariant::Url ) ) return false; m_podcastUrl = s.toUrl(); s = episodeActionMap.value( QLatin1String( "episode" ) ); if( !s.canConvert( QVariant::Url ) ) return false; m_episodeUrl = s.toUrl(); if( episodeActionMap.contains( QLatin1String( "device" ) ) ) { s = episodeActionMap.value( QLatin1String( "device" ) ); if( !s.canConvert( QVariant::String ) ) return false; m_deviceName = s.toString(); } else { m_deviceName = QLatin1String( "" ); } s = episodeActionMap.value( QLatin1String( "action" ) ); if( !s.canConvert( QVariant::String ) ) return false; if( !parseActionType( s.toString() ) ) return false; if( episodeActionMap.contains( QLatin1String( "started" ) ) ) { s = episodeActionMap.value( QLatin1String( "started" ) ); if( !s.canConvert( QVariant::ULongLong ) ) return false; m_started = s.toULongLong(); } else { m_started = 0; } if( episodeActionMap.contains( QLatin1String( "position" ) ) ) { s = episodeActionMap.value( QLatin1String( "position" ) ); if( !s.canConvert( QVariant::ULongLong ) ) return false; m_position = s.toULongLong(); } else { m_position = 0; } if( episodeActionMap.contains( QLatin1String( "total" ) ) ) { s = episodeActionMap.value( QLatin1String( "total" ) ); if( !s.canConvert( QVariant::ULongLong ) ) return false; m_total = s.toULongLong(); } else { m_total = 0; } if( episodeActionMap.contains( QLatin1String( "timestamp" ) ) ) { s = episodeActionMap.value( QLatin1String( "timestamp" ) ); m_timestamp = s.toULongLong(); } else { m_timestamp = 0; } return true; } bool EpisodeActionPrivate::parseActionType( const QString& data ) { if( data.compare( QLatin1String( "delete" ) ) == 0 ) { m_action = EpisodeAction::Delete; return true; } else if( data.compare( QLatin1String( "download" ) ) == 0 ) { m_action = EpisodeAction::Download; return true; } else if( data.compare( QLatin1String( "play" ) ) == 0 ) { m_action = EpisodeAction::Play; return true; } else if( data.compare( QLatin1String( "new" ) ) == 0 ) { m_action = EpisodeAction::New; return true; } else if ( data.compare( QLatin1String( "flattr" ) ) == 0 ) { m_action = EpisodeAction::Flattr; return true; } else { return false; } } bool EpisodeActionPrivate::parse( const QByteArray& data ) { QJson::Parser parser; bool ok; QVariant variant = parser.parse( data, &ok ); if( ok ) { if( !parse( variant ) ) return false; return true; } else { return false; } } QUrl EpisodeActionPrivate::podcastUrl() const { return m_podcastUrl; } QUrl EpisodeActionPrivate::episodeUrl() const { return m_episodeUrl; } QString EpisodeActionPrivate::deviceName() const { return m_deviceName; } EpisodeAction::ActionType EpisodeActionPrivate::action() const { return m_action; } qulonglong EpisodeActionPrivate::timestamp() const { return m_timestamp; } qulonglong EpisodeActionPrivate::started() const { return m_started; } qulonglong EpisodeActionPrivate::position() const { return m_position; } qulonglong EpisodeActionPrivate::total() const { return m_total; } // ### End of EpisodeActionPrivate EpisodeAction::EpisodeAction( const QVariant& variant, QObject* parent ): QObject( parent ), d( new EpisodeActionPrivate( this, variant ) ) { } EpisodeAction::EpisodeAction( const QUrl& podcastUrl, const QUrl& episodeUrl, const QString& deviceName, EpisodeAction::ActionType action, qulonglong timestamp, qulonglong started, qulonglong position, qulonglong total, QObject* parent ) : QObject( parent ), d( new EpisodeActionPrivate( this, podcastUrl, episodeUrl, deviceName, action, timestamp, started, position, total ) ) { } EpisodeAction::EpisodeAction(const QUrl& podcastUrl, const QUrl& episodeUrl, const QString& deviceName, EpisodeAction::ActionType action, qulonglong timestamp, qulonglong position, QObject* parent) : QObject( parent ), d( new EpisodeActionPrivate( this, podcastUrl, episodeUrl, deviceName, action, timestamp, c_maxlonglong, position, c_maxlonglong ) ) { } EpisodeAction::EpisodeAction(const QUrl& podcastUrl, const QUrl& episodeUrl, const QString& deviceName, EpisodeAction::ActionType action, qulonglong timestamp, QObject* parent) : QObject( parent ), d( new EpisodeActionPrivate( this, podcastUrl, episodeUrl, deviceName, action, timestamp, c_maxlonglong, c_maxlonglong, c_maxlonglong ) ) { } EpisodeAction::~EpisodeAction() { delete d; } QUrl EpisodeAction::podcastUrl() const { return d->podcastUrl(); } QUrl EpisodeAction::episodeUrl() const { return d->episodeUrl(); } QString EpisodeAction::deviceName() const { return d->deviceName(); } EpisodeAction::ActionType EpisodeAction::action() const { return d->action(); } qulonglong EpisodeAction::timestamp() const { return d->timestamp(); } qulonglong EpisodeAction::started() const { return d->started(); } qulonglong EpisodeAction::position() const { return d->position(); } qulonglong EpisodeAction::total() const { return d->total(); } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/EpisodeAction.h000066400000000000000000000072111260417502300263030ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef LIBMYGPO_QT_EPISODEACTION_H #define LIBMYGPO_QT_EPISODEACTION_H #include #include #include #include #include "mygpo_export.h" namespace mygpo { class EpisodeActionPrivate; class MYGPO_EXPORT EpisodeAction : public QObject { Q_OBJECT Q_ENUMS( ActionType ) Q_PROPERTY( QUrl podcastUrl READ podcastUrl CONSTANT ) Q_PROPERTY( QUrl episodeUrl READ episodeUrl CONSTANT ) Q_PROPERTY( QString deviceName READ deviceName CONSTANT ) Q_PROPERTY( ActionType action READ action CONSTANT ) Q_PROPERTY( qulonglong timestamp READ timestamp CONSTANT ) Q_PROPERTY( qulonglong started READ started CONSTANT ) Q_PROPERTY( qulonglong position READ position CONSTANT ) Q_PROPERTY( qulonglong total READ total CONSTANT ) public: enum ActionType { Download, Play, Delete, New, Flattr }; EpisodeAction( const QVariant& variant, QObject* parent = 0 ); EpisodeAction( const QUrl& podcastUrl, const QUrl& episodeUrl, const QString& deviceName, EpisodeAction::ActionType action, qulonglong timestamp, qulonglong started, qulonglong position, qulonglong total, QObject* parent = 0 ); EpisodeAction( const QUrl& podcastUrl, const QUrl& episodeUrl, const QString& deviceName, EpisodeAction::ActionType action, qulonglong timestamp, qulonglong position, QObject* parent = 0 ); EpisodeAction( const QUrl& podcastUrl, const QUrl& episodeUrl, const QString& deviceName, EpisodeAction::ActionType action, qulonglong timestamp, QObject* parent = 0 ); virtual ~EpisodeAction(); QUrl podcastUrl() const; QUrl episodeUrl() const; QString deviceName() const; EpisodeAction::ActionType action() const; qulonglong timestamp() const; qulonglong started() const; qulonglong position() const; qulonglong total() const; private: Q_DISABLE_COPY( EpisodeAction ) EpisodeActionPrivate* const d; friend class EpisodeActionPrivate; }; typedef QSharedPointer EpisodeActionPtr; } Q_DECLARE_METATYPE( mygpo::EpisodeActionPtr ); #endif // LIBMYGPO_QT_EPISODEACTION_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/EpisodeActionList.cpp000066400000000000000000000113511260417502300274720ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #include "EpisodeActionList_p.h" #include using namespace mygpo; EpisodeActionListPrivate::EpisodeActionListPrivate( EpisodeActionList* qq, QNetworkReply* reply ): m_reply( reply ), q( qq ), m_error( QNetworkReply::NoError ) { QObject::connect( m_reply, SIGNAL( finished() ), this, SLOT( parseData() ) ); QObject::connect( m_reply, SIGNAL( error( QNetworkReply::NetworkError ) ), this, SLOT( error( QNetworkReply::NetworkError ) ) ); } EpisodeActionListPrivate::~EpisodeActionListPrivate() { } QList EpisodeActionListPrivate::list() const { QList list; QVariantList varList = m_episodeActions.toList(); foreach( QVariant var, varList ) { list.append( var.value() ); } return list; } QVariant EpisodeActionListPrivate::episodeActions() const { return m_episodeActions; } bool EpisodeActionListPrivate::parse( const QVariant& data ) { if( !data.canConvert( QVariant::Map ) ) return false; QVariantMap episodeActionListMap = data.toMap(); QVariant s = episodeActionListMap.value( QLatin1String( "timestamp" ) ); if( !s.canConvert( QVariant::ULongLong ) ) return false; m_timestamp = s.toULongLong(); s = episodeActionListMap.value( QLatin1String( "actions" ) ); if( !s.canConvert( QVariant::List ) ) return false; QVariantList varList = s.toList(); QVariantList episodeActionList; foreach( QVariant var, varList ) { QVariant v; EpisodeAction* episodeActionTmpPtr = new EpisodeAction( var ); if ( episodeActionTmpPtr->property("valid").toBool() ) { v.setValue ( mygpo::EpisodeActionPtr( episodeActionTmpPtr ) ); episodeActionList.append( v ); } else delete episodeActionTmpPtr; } m_episodeActions = QVariant( episodeActionList ); return true; } bool EpisodeActionListPrivate::parse( const QByteArray& data ) { QJson::Parser parser; bool ok; QVariant variant = parser.parse( data, &ok ); if( ok ) { ok = ( parse( variant ) ); } return ok; } void EpisodeActionListPrivate::parseData() { if( m_reply->error() == QNetworkReply::NoError ) { if( parse( m_reply->readAll() ) ) { emit q->finished(); } else { emit q->parseError(); } } m_reply->deleteLater(); } qulonglong EpisodeActionListPrivate::timestamp() const { return m_timestamp; } void EpisodeActionListPrivate::error( QNetworkReply::NetworkError error ) { this->m_error = error; emit q->requestError( error ); } // ### End of EpisodeActionListPrivate EpisodeActionList::EpisodeActionList( QNetworkReply* reply, QObject* parent ) : QObject( parent ), d( new EpisodeActionListPrivate( this, reply ) ) { } QVariant EpisodeActionList::episodeActions() const { return d->episodeActions(); } QList< EpisodeActionPtr > EpisodeActionList::list() const { return d->list(); } qulonglong EpisodeActionList::timestamp() const { return d->timestamp(); } EpisodeActionList::~EpisodeActionList() { delete d; } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/EpisodeActionList.h000066400000000000000000000054071260417502300271440ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef LIBMYGPO_QT_EPISODEACTIONLIST_H #define LIBMYGPO_QT_EPISODEACTIONLIST_H #include "EpisodeAction.h" #include "mygpo_export.h" #include #include #include namespace mygpo { class EpisodeActionListPrivate; class MYGPO_EXPORT EpisodeActionList : public QObject { Q_OBJECT Q_PROPERTY( QVariant episodeActions READ episodeActions CONSTANT ) Q_PROPERTY( qulonglong timestamp READ timestamp CONSTANT ) public: EpisodeActionList( QNetworkReply* reply, QObject* parent = 0 ); virtual ~EpisodeActionList(); QList list() const; QVariant episodeActions() const; qulonglong timestamp() const; private: EpisodeActionListPrivate* const d; friend class EpisodeActionListPrivate; signals: /**Gets emitted when the data is ready to read*/ void finished(); /**Gets emitted when an parse error ocurred*/ void parseError(); /**Gets emitted when an request error ocurred*/ void requestError( QNetworkReply::NetworkError error ); }; typedef QSharedPointer EpisodeActionListPtr; } Q_DECLARE_METATYPE( mygpo::EpisodeActionListPtr ); #endif // LIBMYGPO_QT_EPISODEACTIONLIST_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/EpisodeActionList_p.h000066400000000000000000000046031260417502300274600ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef EPISODEACTIONLIST_PRIVATE_H #define EPISODEACTIONLIST_PRIVATE_H #include "EpisodeActionList.h" namespace mygpo { class EpisodeActionListPrivate : public QObject { Q_OBJECT public: EpisodeActionListPrivate( EpisodeActionList* qq, QNetworkReply* reply ); virtual ~EpisodeActionListPrivate(); QList list() const; QVariant episodeActions() const; qulonglong timestamp() const; private: QNetworkReply* m_reply; EpisodeActionList* const q; QVariant m_episodeActions; QNetworkReply::NetworkError m_error; qulonglong m_timestamp; bool parse( const QVariant& data ); bool parse( const QByteArray& data ); private slots: void parseData(); void error( QNetworkReply::NetworkError error ); }; } #endif //EPISODEACTIONLIST_PRIVATE_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/EpisodeAction_p.h000066400000000000000000000054701260417502300266270ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef EPISODEACTION_PRIVATE_H #define EPISODEACTION_PRIVATE_H #include "EpisodeAction.h" namespace mygpo { class EpisodeActionPrivate : QObject { Q_OBJECT public: EpisodeActionPrivate( EpisodeAction* qq, const QVariant& variant, QObject* parent = 0 ); EpisodeActionPrivate( EpisodeAction* qq, const QUrl& podcastUrl, const QUrl& episodeUrl, const QString& deviceName, EpisodeAction::ActionType action, qulonglong timestamp, qulonglong started, qulonglong position, qulonglong total, QObject* parent = 0 ); virtual ~EpisodeActionPrivate(); QUrl podcastUrl() const; QUrl episodeUrl() const; QString deviceName() const; EpisodeAction::ActionType action() const; qulonglong timestamp() const; qulonglong started() const; qulonglong position() const; qulonglong total() const; private: EpisodeAction* const q; QUrl m_podcastUrl; QUrl m_episodeUrl; QString m_deviceName; EpisodeAction::ActionType m_action; qulonglong m_timestamp; qulonglong m_started; qulonglong m_position; qulonglong m_total; bool parse( const QVariant& data ); bool parse( const QByteArray& data ); bool parseActionType( const QString& data ); }; } #endif //EPISODEACTION_PRIVATE_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/EpisodeList.cpp000066400000000000000000000074121260417502300263370ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #include "EpisodeList_p.h" #include using namespace mygpo; EpisodeListPrivate::EpisodeListPrivate( EpisodeList* qq, QNetworkReply* reply ): m_reply( reply ), q( qq ), m_error( QNetworkReply::NoError ) { QObject::connect( m_reply, SIGNAL( finished() ), this, SLOT( parseData() ) ); QObject::connect( m_reply, SIGNAL( error( QNetworkReply::NetworkError ) ), this, SLOT( error( QNetworkReply::NetworkError ) ) ); } EpisodeListPrivate::~EpisodeListPrivate() { } QList EpisodeListPrivate::list() const { QList list; QVariantList varList = m_episodes.toList(); foreach( QVariant var, varList ) { list.append( var.value() ); } return list; } QVariant EpisodeListPrivate::episodes() const { return m_episodes; } bool EpisodeListPrivate::parse( const QVariant& data ) { if( !data.canConvert( QVariant::List ) ) return false; QVariantList varList = data.toList(); QVariantList episodeList; foreach( QVariant var, varList ) { QVariant v; v.setValue ( EpisodePtr( new Episode( var ) ) ); episodeList.append( v ); } m_episodes = QVariant( episodeList ); return true; } bool EpisodeListPrivate::parse( const QByteArray& data ) { QJson::Parser parser; bool ok; QVariant variant = parser.parse( data, &ok ); if( ok ) { ok = ( parse( variant ) ); } return ok; } void EpisodeListPrivate::parseData() { if( m_reply->error() == QNetworkReply::NoError ) { if( parse( m_reply->readAll() ) ) { emit q->finished(); } else { emit q->parseError(); } } m_reply->deleteLater(); } void EpisodeListPrivate::error( QNetworkReply::NetworkError error ) { this->m_error = error; emit q->requestError( error ); } EpisodeList::EpisodeList( QNetworkReply* reply, QObject* parent ) : QObject( parent ), d( new EpisodeListPrivate( this, reply ) ) { } QVariant EpisodeList::episodes() const { return d->episodes(); } QList< EpisodePtr > EpisodeList::list() const { return d->list(); } EpisodeList::~EpisodeList() { delete d; } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/EpisodeList.h000066400000000000000000000050751260417502300260070ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef LIBMYGPO_QT_EPISODELIST_H #define LIBMYGPO_QT_EPISODELIST_H #include "mygpo_export.h" #include "Episode.h" #include #include #include namespace mygpo { class EpisodeListPrivate; class MYGPO_EXPORT EpisodeList : public QObject { Q_OBJECT Q_PROPERTY( QVariant episodes READ episodes CONSTANT ) public: EpisodeList( QNetworkReply* reply, QObject* parent = 0 ); //EpisodeList(const EpisodeList& other); virtual ~EpisodeList(); QList list() const; QVariant episodes() const; private: EpisodeListPrivate* const d; friend class EpisodeListPrivate; signals: /**Gets emitted when the data is ready to read*/ void finished(); /**Gets emitted when an parse error ocurred*/ void parseError(); /**Gets emitted when an request error ocurred*/ void requestError( QNetworkReply::NetworkError error ); }; typedef QSharedPointer EpisodeListPtr; } #endif // LIBMYGPO_QT_EPISODELIST_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/EpisodeList_p.h000066400000000000000000000043661260417502300263300ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef EPISODELIST_PRIVATE_H #define EPISODELIST_PRIVATE_H #include "EpisodeList.h" namespace mygpo { class EpisodeListPrivate : QObject { Q_OBJECT public: EpisodeListPrivate( EpisodeList* qq, QNetworkReply* reply ); virtual ~EpisodeListPrivate(); QList list() const; QVariant episodes() const; private: QNetworkReply* m_reply; EpisodeList* const q; QVariant m_episodes; QNetworkReply::NetworkError m_error; bool parse( const QVariant& data ); bool parse( const QByteArray& data ); private slots: void parseData(); void error( QNetworkReply::NetworkError error ); }; }; #endif // EPISODELIST_PRIVATE_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/Episode_p.h000066400000000000000000000052751260417502300254740ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef EPISODE_PRIVATE_H #define EPISODE_PRIVATE_H #include "Episode.h" namespace mygpo { class EpisodePrivate : QObject { Q_OBJECT public: EpisodePrivate ( Episode* qq, QNetworkReply* reply, QObject* parent = 0 ); EpisodePrivate ( Episode* qq, const QVariant& variant, QObject* parent = 0 ); virtual ~EpisodePrivate(); QUrl url() const; QString title() const; QUrl podcastUrl() const; QString podcastTitle() const; QString description() const; QUrl website() const; QUrl mygpoUrl() const; QDateTime releaded() const; Episode::Status status() const; private: QNetworkReply* m_reply; Episode* const q; QUrl m_url; QString m_title; QUrl m_podcastUrl; QString m_podcastTitle; QString m_description; QUrl m_website; QUrl m_mygpoUrl; QDateTime m_released; Episode::Status m_status; QNetworkReply::NetworkError m_error; bool parse ( const QVariant& data ); bool parse ( const QByteArray& data ); private slots: void parseData(); void error ( QNetworkReply::NetworkError error ); }; }; #endif // EPISODE_PRIVATE_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/JsonCreator.cpp000066400000000000000000000203201260417502300263350ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #include #include #include #include #include #include #include "JsonCreator.h" using namespace mygpo; static qulonglong c_maxlonglong = (2^64)-1; QByteArray JsonCreator::addRemoveSubsToJSON( const QList< QUrl >& add, const QList< QUrl >& remove ) { QJson::Serializer serializer; QVariantMap jsonData; QVariant addVar( urlListToQVariantList( add ) ); QVariant removeVar( urlListToQVariantList( remove ) ); jsonData.insert( QString( QLatin1String( "add" ) ), addVar ); jsonData.insert( QString( QLatin1String( "remove" ) ), removeVar ); QByteArray jsonByteArray = serializer.serialize( QVariant( jsonData ) ); return jsonByteArray; } QByteArray JsonCreator::saveSettingsToJSON( const QMap< QString, QVariant >& set, const QList< QString >& remove ) { QJson::Serializer serializer; QVariantMap jsonData; //QVariant setVar(stringMapToQVariantMap(set)); QVariant removeVar( stringListToQVariantList( remove ) ); jsonData.insert( QString( QLatin1String( "set" ) ), set ); jsonData.insert( QString( QLatin1String( "remove" ) ), removeVar ); QByteArray jsonByteArray = serializer.serialize( QVariant( jsonData ) ); return jsonByteArray; } QByteArray JsonCreator::episodeActionListToJSON( const QList& episodeActions ) { QJson::Serializer serializer; QVariantList jsonData; foreach( const EpisodeActionPtr episodeAction, episodeActions ) { jsonData.append( episodeActionToQVariantMap( episodeAction ) ); } QByteArray jsonByteArray = serializer.serialize( QVariant( jsonData ) ); return jsonByteArray; } QByteArray JsonCreator::renameDeviceStringToJSON( const QString& caption, const QString& type ) { QJson::Serializer serializer; QVariantMap jsonData; QVariant captionVar( caption ); QVariant typeVar( type ); jsonData.insert( QString( QLatin1String( "caption" ) ), captionVar ); jsonData.insert( QString( QLatin1String( "type" ) ), typeVar ); QByteArray jsonByteArray = serializer.serialize( QVariant( jsonData ) ); return jsonByteArray; } QByteArray JsonCreator::deviceSynchronizationListsToJSON(const QList< QStringList >& synchronize, const QList< QString >& stopSynchronize) { QString syncVar; if (synchronize.size() != 0) { syncVar.append(QLatin1String("[")); foreach( const QStringList& syncEntry, synchronize ) { QString syncEntryStr; if (syncEntry.size() != 0) { syncEntryStr.append(QLatin1String("[")); foreach( const QString& str, syncEntry) { syncEntryStr.append(QString(QLatin1String("\"") + str + QLatin1String("\","))); } syncEntryStr.replace(syncEntryStr.size()-1,1,QLatin1String("]")); } else { syncEntryStr.append(QLatin1String("[ ]")); } syncVar.append(syncEntryStr); syncVar.append(QLatin1String(",")); } syncVar.replace(syncVar.size()-1,1,QLatin1String("]")); } else { syncVar.append(QLatin1String("[ ]")); } QString stopVar; if (stopSynchronize.size() != 0) { stopVar.append(QLatin1String("[")); foreach( const QString& str, stopSynchronize) { stopVar.append(QString(QLatin1String("\"") + str + QLatin1String("\","))); } stopVar.replace(stopVar.size()-1,1,QLatin1String("]")); } else { stopVar.append(QLatin1String("[ ]")); } QString jsonStr(QLatin1String("{\"synchronize\" : ")); jsonStr.append(syncVar); jsonStr.append(QLatin1String(" ,\"stop-synchronize\" : ")); jsonStr.append(stopVar); jsonStr.append(QLatin1String(" }\n")); return jsonStr.toLocal8Bit(); } QVariantList JsonCreator::urlListToQVariantList( const QList< QUrl >& urls ) { QVariantList list; foreach( const QUrl & url, urls ) { QVariant var( url.toString() ); if( !list.contains( var ) ) list.append( var ); } return list; } QVariantList JsonCreator::stringListToQVariantList( const QList< QString >& strings ) { QVariantList list; foreach( const QString & str, strings ) { QVariant var( str ); list.append( var ); } return list; } QVariantMap mygpo::JsonCreator::stringMapToQVariantMap( const QMap< QString, QString >& stringmap ) { QVariantMap map; foreach( const QString & str, stringmap.keys() ) { map.insert( str, QVariant( stringmap.value( str ) ) ); } return map; } QVariantMap JsonCreator::episodeActionToQVariantMap( const EpisodeActionPtr episodeAction ) { QVariantMap map; map.insert( QLatin1String( "podcast" ), episodeAction->podcastUrl() ); map.insert( QLatin1String( "episode" ), episodeAction->episodeUrl() ); if( episodeAction->deviceName().compare( QLatin1String( "" ) ) != 0 ) map.insert( QLatin1String( "device" ), episodeAction->deviceName() ); EpisodeAction::ActionType actionType = episodeAction->action(); if( actionType == EpisodeAction::New ) map.insert( QLatin1String( "action" ), QLatin1String( "new" ) ); else if( actionType == EpisodeAction::Delete ) map.insert( QLatin1String( "action" ), QLatin1String( "delete" ) ); else if( actionType == EpisodeAction::Play ) map.insert( QLatin1String( "action" ), QLatin1String( "play" ) ); else if( actionType == EpisodeAction::Download ) map.insert( QLatin1String( "action" ), QLatin1String( "download" ) ); else if( actionType == EpisodeAction::Flattr ) map.insert( QLatin1String( "action" ), QLatin1String( "flattr" ) ); if( episodeAction->timestamp() != 0 ) { #if QT_VERSION >= 0x040700 QDateTime dateTime = QDateTime::fromMSecsSinceEpoch(episodeAction->timestamp() ); #else QDateTime dateTime = QDateTime::fromTime_t(episodeAction->timestamp() / 1000 ); QTime time = dateTime.time(); time.addMSecs(episodeAction->timestamp() % 1000 ); dateTime.setTime(time); #endif map.insert( QLatin1String( "timestamp" ), dateTime.toString(Qt::ISODate) ); } if( actionType == EpisodeAction::Play ) { if ( episodeAction->position() != c_maxlonglong ) { map.insert( QLatin1String( "position" ), episodeAction->position() ); if ( episodeAction->started() != c_maxlonglong && episodeAction->total() != c_maxlonglong ) { map.insert( QLatin1String( "started" ), episodeAction->started() ); map.insert( QLatin1String( "total" ), episodeAction->total() ); } } } return map; } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/JsonCreator.h000066400000000000000000000053741260417502300260160ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef LIBMYGPO_QT_JSONPARSER_H #define LIBMYGPO_QT_JSONPARSER_H #include #include #include #include #include #include "EpisodeAction.h" class QUrl; class QString; namespace mygpo { class JsonCreator { public: static QByteArray addRemoveSubsToJSON( const QList& add, const QList& remove ); static QByteArray saveSettingsToJSON( const QMap& set, const QList& remove ); static QByteArray episodeActionListToJSON( const QList& episodeActions ); static QByteArray renameDeviceStringToJSON( const QString& caption, const QString& type ); static QByteArray deviceSynchronizationListsToJSON( const QList& synchronize, const QList& stopSynchronize ); private: static QVariantList urlListToQVariantList( const QList& urls ); static QVariantList stringListToQVariantList( const QList& strings ); static QVariantMap stringMapToQVariantMap( const QMap& stringmap ); static QVariantMap episodeActionToQVariantMap( const EpisodeActionPtr episodeAction ); }; } #endif // LIBMYGPO_QT_JSONPARSER_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/Podcast.cpp000066400000000000000000000130531260417502300255060ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #include "Podcast_p.h" #include using namespace mygpo; PodcastPrivate::PodcastPrivate( Podcast* qq, QNetworkReply* reply ): m_reply( reply ), q( qq ), m_error( QNetworkReply::NoError ) { QObject::connect( m_reply, SIGNAL( finished() ), this, SLOT( parseData() ) ); QObject::connect( m_reply, SIGNAL( error( QNetworkReply::NetworkError ) ), this, SLOT( error( QNetworkReply::NetworkError ) ) ); } PodcastPrivate::PodcastPrivate( Podcast* qq, const QVariant& variant ): m_reply( 0 ), q( qq ), m_error( QNetworkReply::NoError ) { parse( variant ); } PodcastPrivate::~PodcastPrivate() { } QUrl PodcastPrivate::url() const { return m_url; } QString PodcastPrivate::title() const { return m_title; } QString PodcastPrivate::description() const { return m_description; } uint PodcastPrivate::subscribers() const { return m_subscribers; } uint PodcastPrivate::subscribersLastWeek() const { return m_SubscribersLastWeek; } QUrl PodcastPrivate::logoUrl() const { return m_logoUrl; } QUrl PodcastPrivate::website() const { return m_website; } QUrl PodcastPrivate::mygpoUrl() const { return m_mygpoUrl; } Podcast::Podcast( QNetworkReply* reply, QObject* parent ) : QObject( parent ), d( new PodcastPrivate( this, reply ) ) { } Podcast::Podcast( const QVariant& variant, QObject* parent ): QObject( parent ), d( new PodcastPrivate( this, variant ) ) { } Podcast::~Podcast() { delete d; } QUrl Podcast::url() const { return d->url(); } QString Podcast::title() const { return d->title(); } QString Podcast::description() const { return d->description(); } uint Podcast::subscribers() const { return d->subscribers(); } uint Podcast::subscribersLastWeek() const { return d->subscribersLastWeek(); } QUrl Podcast::logoUrl() const { return d->logoUrl(); } QUrl Podcast::website() const { return d->website(); } QUrl Podcast::mygpoUrl() const { return d->mygpoUrl(); } bool PodcastPrivate::parse( const QVariant& data ) { if ( !data.canConvert( QVariant::Map ) ) return false; QVariantMap podcastMap = data.toMap(); QVariant v = podcastMap.value( QLatin1String( "url" ) ); if ( !v.canConvert( QVariant::Url ) ) return false; m_url = v.toUrl(); v = podcastMap.value( QLatin1String( "title" ) ); if ( !v.canConvert( QVariant::String ) ) return false; m_title = v.toString(); v = podcastMap.value( QLatin1String( "description" ) ); if ( !v.canConvert( QVariant::String ) ) return false; m_description = v.toString(); v = podcastMap.value( QLatin1String( "subscribers" ) ); if ( !v.canConvert( QVariant::Int ) ) return false; m_subscribers = v.toUInt(); v = podcastMap.value( QLatin1String( "subscribers_last_week" ) ); if ( !v.canConvert( QVariant::Int ) ) return false; m_SubscribersLastWeek = v.toUInt(); v = podcastMap.value( QLatin1String( "logo_url" ) ); if ( !v.canConvert( QVariant::Url ) ) return false; m_logoUrl = v.toUrl(); v = podcastMap.value( QLatin1String( "website" ) ); if ( !v.canConvert( QVariant::Url ) ) return false; m_website = v.toUrl(); v = podcastMap.value( QLatin1String( "mygpo_link" ) ); if ( !v.canConvert( QVariant::Url ) ) return false; m_mygpoUrl = v.toUrl(); return true; } bool PodcastPrivate::parse( const QByteArray& data ) { QJson::Parser parser; bool ok; QVariant variant = parser.parse( data, &ok ); if ( ok ) { if ( !parse( variant ) ) return false; return true; } else { return false; } } void PodcastPrivate::parseData() { //parsen und signal senden QJson::Parser parser; if ( parse( m_reply->readAll( ) ) ) { emit q->finished(); } else { emit q->parseError(); } m_reply->deleteLater(); } void PodcastPrivate::error( QNetworkReply::NetworkError error ) { this->m_error = error; emit q->requestError( error ); } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/Podcast.h000066400000000000000000000063621260417502300251600ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef LIBMYGPO_QT_PODCAST_H #define LIBMYGPO_QT_PODCAST_H #include #include #include #include #include "mygpo_export.h" namespace mygpo { class PodcastPrivate; class MYGPO_EXPORT Podcast : public QObject { Q_OBJECT Q_PROPERTY( QUrl url READ url CONSTANT ) Q_PROPERTY( QString title READ title CONSTANT ) Q_PROPERTY( QString description READ description CONSTANT ) Q_PROPERTY( uint subscribers READ subscribers CONSTANT ) Q_PROPERTY( uint subscribersLastWeek READ subscribersLastWeek CONSTANT ) Q_PROPERTY( QUrl logoUrl READ logoUrl CONSTANT ) Q_PROPERTY( QUrl website READ website CONSTANT ) Q_PROPERTY( QUrl mygpoUrl READ mygpoUrl CONSTANT ) public: Podcast( QNetworkReply* reply, QObject* parent = 0 ); Podcast( const QVariant& variant, QObject* parent = 0 ); virtual ~Podcast(); //Getters QUrl url() const; QString title() const; QString description() const; uint subscribers() const; uint subscribersLastWeek() const; QUrl logoUrl() const; QUrl website() const; QUrl mygpoUrl() const; private: Q_DISABLE_COPY( Podcast ) PodcastPrivate* const d; friend class PodcastPrivate; bool m_copy; //true if this object was created by the copy-ctor signals: /**Gets emitted when the data is ready to read*/ void finished(); /**Gets emitted when an parse error ocurred*/ void parseError(); /**Gets emitted when an request error ocurred*/ void requestError( QNetworkReply::NetworkError error ); }; typedef QSharedPointer PodcastPtr; } Q_DECLARE_METATYPE( mygpo::PodcastPtr ); #endif // LIBMYGPO_QT_PODCAST_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/PodcastList.cpp000066400000000000000000000074531260417502300263510ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #include "PodcastList_p.h" #include using namespace mygpo; PodcastListPrivate::PodcastListPrivate( PodcastList* qq, QNetworkReply* reply, QObject* parent ) : QObject( parent ), m_reply( reply ), q( qq ), m_error( QNetworkReply::NoError ) { QObject::connect( m_reply, SIGNAL( finished() ), this, SLOT( parseData() ) ); QObject::connect( m_reply, SIGNAL( error( QNetworkReply::NetworkError ) ), this, SLOT( error( QNetworkReply::NetworkError ) ) ); } PodcastListPrivate::~PodcastListPrivate() { } QList< PodcastPtr > PodcastListPrivate::list() const { QList list; QVariantList varList = m_podcasts.toList(); foreach( QVariant var, varList ) { list.append( var.value() ); } return list; } QVariant PodcastListPrivate::podcasts() const { return m_podcasts; } bool PodcastListPrivate::parse( const QVariant& data ) { if( !data.canConvert( QVariant::List ) ) return false; QVariantList varList = data.toList(); QVariantList podcastList; foreach( QVariant var, varList ) { QVariant v; v.setValue ( PodcastPtr( new Podcast( var ) ) ); podcastList.append( v ); } m_podcasts = QVariant( podcastList ); return true; } bool PodcastListPrivate::parse( const QByteArray& data ) { QJson::Parser parser; bool ok; QVariant variant = parser.parse( data, &ok ); if( ok ) { ok = ( parse( variant ) ); } return ok; } void PodcastListPrivate::parseData() { if( m_reply->error() == QNetworkReply::NoError ) { if( parse( m_reply->readAll() ) ) { emit q->finished(); } else { emit q->parseError(); } } m_reply->deleteLater(); } void PodcastListPrivate::error( QNetworkReply::NetworkError error ) { this->m_error = error; emit q->requestError( error ); } PodcastList::PodcastList( QNetworkReply* reply, QObject* parent ) : QObject( parent ), d( new PodcastListPrivate( this, reply ) ) { } PodcastList::~PodcastList() { delete d; } QList PodcastList::list() const { return d->list(); } QVariant PodcastList::podcasts() const { return d->podcasts(); } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/PodcastList.h000066400000000000000000000050711260417502300260100ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef LIBMYGPO_QT_PODCASTLIST_H #define LIBMYGPO_QT_PODCASTLIST_H #include "Podcast.h" #include "mygpo_export.h" #include #include #include namespace mygpo { class PodcastListPrivate; class MYGPO_EXPORT PodcastList : public QObject { Q_OBJECT Q_PROPERTY( QVariant podcasts READ podcasts CONSTANT ) public: PodcastList( QNetworkReply* reply, QObject* parent = 0 ); virtual ~PodcastList(); QList list() const; QVariant podcasts() const; private: Q_DISABLE_COPY( PodcastList ) PodcastListPrivate* const d; friend class PodcastListPrivate; signals: /**Gets emitted when the data is ready to read*/ void finished(); /**Gets emitted when an parse error ocurred*/ void parseError(); /**Gets emitted when an request error ocurred*/ void requestError( QNetworkReply::NetworkError error ); }; typedef QSharedPointer PodcastListPtr; } #endif // LIBMYGPO_QT_PODCASTLIST_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/PodcastList_p.h000066400000000000000000000044071260417502300263310ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef PODCASTLIST_PRIVATE_H #define PODCASTLIST_PRIVATE_H #include "PodcastList.h" namespace mygpo { class PodcastListPrivate : QObject { Q_OBJECT public: PodcastListPrivate( PodcastList* qq, QNetworkReply* reply, QObject* parent = 0 ); virtual ~PodcastListPrivate(); QList list() const; QVariant podcasts() const; private: QNetworkReply* m_reply; PodcastList* const q; QVariant m_podcasts; QNetworkReply::NetworkError m_error; bool parse( const QVariant& data ); bool parse( const QByteArray& data ); private slots: void parseData(); void error( QNetworkReply::NetworkError error ); }; } #endif // PODCASLIST_PRIVATE_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/Podcast_p.h000066400000000000000000000051311260417502300254700ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef PODCAST_PRIVATE_H #define PODCAST_PRIVATE_H #include "Podcast.h" namespace mygpo { class PodcastPrivate : QObject { Q_OBJECT public: PodcastPrivate( Podcast* qq, QNetworkReply* reply ); PodcastPrivate( Podcast* qq, const QVariant& variant ); virtual ~PodcastPrivate(); //Getters QUrl url() const; QString title() const; QString description() const; uint subscribers() const; uint subscribersLastWeek() const; QUrl logoUrl() const; QUrl website() const; QUrl mygpoUrl() const; private: QNetworkReply* m_reply; Podcast* const q; QUrl m_url; QString m_title; QString m_description; uint m_subscribers; uint m_SubscribersLastWeek; QUrl m_logoUrl; QUrl m_website; QUrl m_mygpoUrl; QNetworkReply::NetworkError m_error; bool parse( const QVariant& data ); bool parse( const QByteArray& data ); private slots: void parseData(); void error( QNetworkReply::NetworkError error ); }; }; #endif // PODCAST_PRIVATE_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/RequestHandler.cpp000066400000000000000000000063231260417502300270410ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #include #include #include "RequestHandler.h" #include "Config.h" using namespace mygpo; RequestHandler::RequestHandler( const QString& username, const QString& password, QNetworkAccessManager* nam ) : m_username( username ), m_password( password ), m_nam( nam ) { } RequestHandler::RequestHandler( QNetworkAccessManager* nam ) : m_username(), m_password(), m_nam( nam ) { } RequestHandler::~RequestHandler() { } QNetworkReply* RequestHandler::getRequest( const QString& url ) { QUrl reqUrl( url ); QNetworkRequest request( reqUrl ); addUserAgent( request ); QNetworkReply* reply = m_nam->get( request ); return reply; } QNetworkReply* RequestHandler::authGetRequest( const QString& url ) { QNetworkRequest request( url ); addUserAgent( request ); addAuthData( request ); QNetworkReply* reply = m_nam->get( request ); return reply; } QNetworkReply* RequestHandler::postRequest( const QByteArray data, const QString& url ) { QNetworkRequest request( url ); addUserAgent( request ); addAuthData( request ); request.setHeader(QNetworkRequest::ContentTypeHeader, QLatin1String("application/json")); QNetworkReply* reply = m_nam->post( request, data ); return reply; } void RequestHandler::addAuthData( QNetworkRequest& request ) { QByteArray headerData = "Basic " + QString(m_username + QLatin1String(":") + m_password).toLocal8Bit().toBase64(); request.setRawHeader("Authorization", headerData ); } void RequestHandler::addUserAgent( QNetworkRequest &request ) { request.setRawHeader("User-Agent", Config::instance()->userAgent().toAscii() ); } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/RequestHandler.h000066400000000000000000000072111260417502300265030ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef LIBMYGPO_QT_REQUESTHANDLER_H_ #define LIBMYGPO_QT_REQUESTHANDLER_H_ #include "mygpo_export.h" #include #include namespace mygpo { /** * Class for sending HTTP requests and handle the servers response. */ class RequestHandler { public: /** * @param username The username that should be used for authentication if required. * @param password The password that should be used for authentication if required */ RequestHandler( const QString& username, const QString& password, QNetworkAccessManager* nam ); RequestHandler( QNetworkAccessManager* nam ); virtual ~RequestHandler(); /** * Sends a GET request with the given url and receives the servers response. * @param response The servers response will be written into this QByteArray * @param url The request url (without http://) as QString * @return 0 if the request was successful, corresponding ErrorCode if unsuccessful */ QNetworkReply* getRequest( const QString& url ); /** * Sends a GET request with the given url, adds auth Data to the URL and receives the servers response. * @param response The servers response will be written into this QByteArray * @param url The request url (without http://) as QString * @return 0 if the request was successful, corresponding ErrorCode if unsuccessful */ QNetworkReply* authGetRequest( const QString& url ); /** * Sends a POST request with the given url and data, adds auth Data and receives the servers response * @param data The data to send to the url * @param url The request url (without http://) as QString * @return 0 if the request was successful, corresponding ErrorCode if unsuccessful */ QNetworkReply* postRequest( const QByteArray data, const QString& url ); private: QString m_username; QString m_password; QNetworkAccessManager* m_nam; void addAuthData( QNetworkRequest& request ); void addUserAgent( QNetworkRequest& request ); }; } #endif /* LIBMYGPO_QT_REQUESTHANDLER_H_ */ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/Settings.cpp000066400000000000000000000061321260417502300257110ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #include "Settings_p.h" #include using namespace mygpo; SettingsPrivate::SettingsPrivate( Settings* qq, QNetworkReply* reply ): q( qq ), m_reply( reply ), m_error( QNetworkReply::NoError ) { QObject::connect( m_reply, SIGNAL( finished() ), this, SLOT( parseData() ) ); QObject::connect( m_reply, SIGNAL( error( QNetworkReply::NetworkError ) ), this, SLOT( error( QNetworkReply::NetworkError ) ) ); } SettingsPrivate::~SettingsPrivate() { } QVariant SettingsPrivate::settings() const { return m_settings; } bool SettingsPrivate::parse( const QVariant& data ) { m_settings = data; return true; } bool SettingsPrivate::parse( const QByteArray& data ) { QJson::Parser parser; bool ok; QVariant variant = parser.parse( data, &ok ); if( ok ) { ok = ( parse( variant ) ); } return ok; } void SettingsPrivate::parseData() { if( m_reply->error() == QNetworkReply::NoError ) { QJson::Parser parser; if( parse( m_reply->readAll() ) ) { emit q->finished(); } else { emit q->parseError(); } } m_reply->deleteLater(); } void SettingsPrivate::error( QNetworkReply::NetworkError error ) { this->m_error = error; emit q->requestError( error ); } Settings::Settings( QNetworkReply* reply, QObject* parent ): QObject( parent ), d( new SettingsPrivate( this, reply ) ) { } Settings::~Settings() { delete d; } QVariant Settings::settings() const { return d->settings(); } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/Settings.h000066400000000000000000000047451260417502300253660ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef LIBMYGPO_QT_SETTINGS_H #define LIBMYGPO_QT_SETTINGS_H #include #include #include class QVariant; #include "mygpo_export.h" namespace mygpo { class SettingsPrivate; class MYGPO_EXPORT Settings : public QObject { Q_OBJECT Q_PROPERTY( QVariant settings READ settings CONSTANT ) public: Settings( QNetworkReply* reply, QObject* parent = 0 ); virtual ~Settings(); QVariant settings() const; private: Q_DISABLE_COPY( Settings ) SettingsPrivate* d; friend class SettingsPrivate; signals: /**Gets emitted when the data is ready to read*/ void finished(); /**Gets emitted when an parse error ocurred*/ void parseError(); /**Gets emitted when an request error ocurred*/ void requestError( QNetworkReply::NetworkError error ); }; typedef QSharedPointer SettingsPtr; } #endif // LIBMYGPO_QT_SETTINGS_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/Settings_p.h000066400000000000000000000042761260417502300257040ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef SETTINGS_PRIVATE_H #define SETTINGS_PRIVATE_H #include "Settings.h" namespace mygpo { class SettingsPrivate : public QObject { Q_OBJECT public: SettingsPrivate( Settings* qq, QNetworkReply* reply ); virtual ~SettingsPrivate(); QVariant settings() const; private: Settings* const q; QVariant m_settings; QNetworkReply* m_reply; QNetworkReply::NetworkError m_error; bool parse( const QVariant& data ); bool parse( const QByteArray& data ); private slots: void parseData(); void error( QNetworkReply::NetworkError error ); }; } #endif //SETTINGS_PRIVATE_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/Tag.cpp000066400000000000000000000051021260417502300246200ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #include "Tag_p.h" using namespace mygpo; TagPrivate::TagPrivate( Tag* qq, const QVariant& variant ) : q( qq ), m_tag( QLatin1String( "" ) ), m_usage( 0 ) { parse( variant ); } QString TagPrivate::tag() const { return m_tag; } uint TagPrivate::usage() const { return m_usage; } bool TagPrivate::parse( const QVariant& data ) { if( !data.canConvert( QVariant::Map ) ) return false; QVariantMap tagMap = data.toMap(); QVariant v = tagMap.value( QLatin1String( "tag" ) ); if( !v.canConvert( QVariant::String ) ) return false; m_tag = v.toString(); v = tagMap.value( QLatin1String( "usage" ) ); if( !v.canConvert( QVariant::UInt ) ) return false; m_usage = v.toUInt(); return true; } Tag::Tag( const QVariant& variant, QObject* parent ) : QObject( parent ), d( new TagPrivate( this, variant ) ) { } Tag::~Tag() { delete d; } QString Tag::tag() const { return d->tag(); } uint Tag::usage() const { return d->usage(); } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/Tag.h000066400000000000000000000043351260417502300242740ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef LIBMYGPO_QT_TAG_H #define LIBMYGPO_QT_TAG_H #include "mygpo_export.h" #include #include namespace mygpo { class TagPrivate; class MYGPO_EXPORT Tag : public QObject { Q_OBJECT Q_PROPERTY( QString tag READ tag CONSTANT ) Q_PROPERTY( uint usage READ usage CONSTANT ) public: Tag( const QVariant& variant, QObject* parent = 0 ); virtual ~Tag(); QString tag() const; uint usage() const; private: Q_DISABLE_COPY( Tag ) TagPrivate* const d; friend class TagPrivate; }; typedef QSharedPointer TagPtr; } Q_DECLARE_METATYPE( mygpo::TagPtr ); #endif // LIBMYGPO_QT_TAG_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/TagList.cpp000066400000000000000000000072161260417502300254640ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #include "TagList_p.h" #include using namespace mygpo; TagListPrivate::TagListPrivate( TagList* qq, QNetworkReply* reply ) : q( qq ), m_reply( reply ), m_tags( QVariant() ), m_error( QNetworkReply::NoError ) { QObject::connect( m_reply, SIGNAL( finished() ), this, SLOT( parseData() ) ); QObject::connect( m_reply, SIGNAL( error( QNetworkReply::NetworkError ) ), this, SLOT( error( QNetworkReply::NetworkError ) ) ); } TagListPrivate::~TagListPrivate() { } QList TagListPrivate::list() const { QList list; QVariantList varList = m_tags.toList(); foreach( QVariant var, varList ) { list.append( var.value() ); } return list; } QVariant TagListPrivate::tags() const { return m_tags; } bool TagListPrivate::parse( const QVariant& data ) { if( !data.canConvert( QVariant::List ) ) return false; QVariantList varList = data.toList(); QVariantList tagList; foreach( QVariant var, varList ) { QVariant v; v.setValue( TagPtr( new Tag( var ) ) ); tagList.append( v ); } m_tags = QVariant( tagList ); return true; } bool TagListPrivate::parse( const QByteArray& data ) { QJson::Parser parser; bool ok; QVariant variant = parser.parse( data, &ok ); if( ok ) { ok = ( parse( variant ) ); } return ok; } void TagListPrivate::parseData() { if( m_reply->error() == QNetworkReply::NoError ) { if( parse( m_reply->readAll() ) ) { emit q->finished(); } else { emit q->parseError(); } } m_reply->deleteLater(); } void TagListPrivate::error( QNetworkReply::NetworkError error ) { this->m_error = error; emit q->requestError( error ); } TagList::TagList( QNetworkReply* reply, QObject* parent ) : QObject( parent ), d( new TagListPrivate( this, reply ) ) { } TagList::~TagList() { delete d; } QList TagList::list() const { return d->list(); } QVariant TagList::tags() const { return d->tags(); } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/TagList.h000066400000000000000000000050341260417502300251250ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef LIBMYGPO_QT_TAGLIST_H #define LIBMYGPO_QT_TAGLIST_H #include "Tag.h" #include "mygpo_export.h" #include #include #include namespace mygpo { class TagListPrivate; class MYGPO_EXPORT TagList : public QObject { Q_OBJECT Q_PROPERTY( QVariant tags READ tags CONSTANT ) public: TagList( QNetworkReply* reply, QObject* parent = 0 ); virtual ~TagList(); QList list() const; QVariant tags() const; private: Q_DISABLE_COPY( TagList ) TagListPrivate* const d; friend class TagListPrivate; signals: /**Gets emitted when the data is ready to read*/ void finished(); /**Gets emitted when an parse error ocurred*/ void parseError(); /**Gets emitted when an request error ocurred*/ void requestError( QNetworkReply::NetworkError error ); }; typedef QSharedPointer TagListPtr; } Q_DECLARE_METATYPE( mygpo::TagListPtr ); #endif // LIBMYGPO_QT_TAGLIST_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/TagList_p.h000066400000000000000000000043131260417502300254430ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef TAGLIST_PRIVATE_H #define TAGLIST_PRIVATE_H #include "TagList.h" namespace mygpo { class TagListPrivate : public QObject { Q_OBJECT public: TagListPrivate( TagList* qq, QNetworkReply* reply ); virtual ~TagListPrivate(); QList list() const; QVariant tags() const; private: TagList* const q; QNetworkReply* m_reply; QVariant m_tags; QNetworkReply::NetworkError m_error; bool parse( const QVariant& data ); bool parse( const QByteArray& data ); private slots: void parseData(); void error( QNetworkReply::NetworkError error ); }; } #endif // TAGLIST_PRIVATE_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/Tag_p.h000066400000000000000000000037131260417502300246120ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef TAG_PRIVATE_H #define TAG_PRIVATE_H #include "Tag.h" namespace mygpo { class TagPrivate : public QObject { Q_OBJECT public: TagPrivate( Tag* qq, const QVariant& variant ); QString tag() const; uint usage() const; private: Tag* const q; QString m_tag; uint m_usage; bool parse( const QVariant& data ); }; } #endif // TAG_PRIVATE_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/UrlBuilder.cpp000066400000000000000000000213451260417502300261650ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #include "UrlBuilder.h" #include "Config.h" #include #include #include using namespace mygpo; const QString UrlBuilder::s_server = Config::instance()->mygpoBaseUrl().toString(); const QString UrlBuilder::s_api2 = QLatin1String( "/api/2" ); const QString UrlBuilder::s_api1 = QLatin1String( "/api/1" ); static QString getFormatExtension( UrlBuilder::Format f ) { QString ret; switch( f ) { case UrlBuilder::JSON: ret = QString( QLatin1String( ".json" ) ); break; case UrlBuilder::OPML: ret = QString( QLatin1String( ".opml" ) ); break; case UrlBuilder::TEXT: ret = QString( QLatin1String( ".txt" ) ); break; case UrlBuilder::XML: ret = QString( QLatin1String( ".xml" ) ); break; } return ret; } QString UrlBuilder::getToplistUrl( uint i, Format f ) { QString numString = QString::number(( i == 0 ) ? 1 : i ); return s_server % QLatin1String( "/toplist/" ) % numString % getFormatExtension( f ); } QString UrlBuilder::getSuggestionsUrl( uint i, Format f ) { QString numString = QString::number(( i == 0 ) ? 1 : i ); return s_server % QLatin1String( "/suggestions/" ) % numString % getFormatExtension( f ); } QString UrlBuilder::getPodcastSearchUrl( const QString& query, Format f ) { return s_server % QLatin1String( "/search" ) % getFormatExtension( f ) % QLatin1String( "?q=" ) % query; } QString UrlBuilder::getSubscriptionsUrl( const QString& username, const QString& device, UrlBuilder::Format f) { return s_server % QLatin1String( "/subscriptions/" ) % username % QLatin1String( "/" ) % device % getFormatExtension( f ); } QString UrlBuilder::getTopTagsUrl( uint i ) { QString numString = QString::number(( i == 0 ) ? 1 : i ); return s_server % s_api2 % QLatin1String( "/tags/" ) % numString % QLatin1String( ".json" ); } QString UrlBuilder::getPodcastsOfTagUrl( const QString& tag, uint i ) { QString numString = QString::number(( i == 0 ) ? 1 : i ); return s_server % s_api2 % QLatin1String( "/tag/" ) % tag % QLatin1String( "/" ) % numString % QLatin1String( ".json" ); } QString UrlBuilder::getPodcastDataUrl( const QString& url ) { return s_server % s_api2 % QLatin1String( "/data/podcast" ) % QLatin1String( ".json" ) % QLatin1String( "?url=" ) % url; } QString UrlBuilder::getEpisodeDataUrl( const QString& podcastUrl, const QString& episodeUrl ) { return s_server % s_api2 % QLatin1String( "/data/episode" ) % QLatin1String( ".json" ) % QLatin1String( "?podcast=" ) % podcastUrl % QLatin1String( "&url=" ) % episodeUrl; } QString UrlBuilder::getFavEpisodesUrl( const QString& username ) { return s_server % s_api2 % QLatin1String( "/favorites/" ) % username % QLatin1String( ".json" ); } QString UrlBuilder::getAddRemoveSubUrl( const QString& username, const QString& deviceId ) { return s_server % s_api2 % QLatin1String( "/subscriptions/" ) % username % QLatin1String( "/" ) % deviceId % QLatin1String( ".json" ); } QString UrlBuilder::getAccountSettingsUrl( const QString& username ) { return s_server % s_api2 % QLatin1String( "/settings/" ) % username % QLatin1String( "/account" ) % QLatin1String( ".json" ); } QString UrlBuilder::getDeviceSettingsUrl( const QString& username, const QString& deviceId ) { return s_server % s_api2 % QLatin1String( "/settings/" ) % username % QLatin1String( "/device" ) % QLatin1String( ".json" ) % QLatin1String( "?device=" ) % deviceId; } QString UrlBuilder::getPodcastSettingsUrl( const QString& username, const QString& podcastUrl ) { return s_server % s_api2 % QLatin1String( "/settings/" ) % username % QLatin1String( "/podcast" ) % QLatin1String( ".json" ) % QLatin1String( "?podcast=" ) % podcastUrl; } QString UrlBuilder::getEpisodeSettingsUrl( const QString& username, const QString& podcastUrl, const QString& episodeUrl ) { return s_server % s_api2 % QLatin1String( "/settings/" ) % username % QLatin1String( "/episode" ) % QLatin1String( ".json" ) % QLatin1String( "?podcast=" ) % podcastUrl % QLatin1String( "&episode=" ) % episodeUrl; } QString UrlBuilder::getDeviceListUrl( const QString& username ) { return s_server % s_api2 % QLatin1String( "/devices/" ) % username % QLatin1String( ".json" ) ; } QString UrlBuilder::getDeviceUpdatesUrl( const QString& username, const QString& deviceId, qulonglong timestamp ) { QString numString = QString::number( timestamp ); return s_server % s_api2 % QLatin1String( "/updates/" ) % username % QLatin1String( "/" ) % deviceId % QLatin1String( ".json?since=" ) % numString; } QString UrlBuilder::getRenameDeviceUrl( const QString& username, const QString& deviceId ) { return s_server % s_api2 % QLatin1String( "/devices/" ) % username % QLatin1String( "/" ) % deviceId % QLatin1String( ".json" ); } QString UrlBuilder::getEpisodeActionsUrl( const QString& username, const bool aggregated ) { QString agg; if( aggregated ) agg = QLatin1String( "?aggregated=true" ); else agg = QLatin1String( "" ); return s_server % s_api2 % QLatin1String( "/episodes/" ) % username % QLatin1String( ".json" ) % agg; } QString UrlBuilder::getEpisodeActionsUrlByPodcast( const QString& username, const QString& podcastUrl, const bool aggregated ) { QString agg; if( aggregated ) agg = QLatin1String( "&aggregated=true" ); else agg = QLatin1String( "" ); return s_server % s_api2 % QLatin1String( "/episodes/" ) % username % QLatin1String( ".json?podcast=" ) % podcastUrl % agg; } QString UrlBuilder::getEpisodeActionsUrlByDevice( const QString& username, const QString& deviceId, bool aggregated ) { QString agg; if( aggregated ) agg = QLatin1String( "&aggregated=true" ); else agg = QLatin1String( "" ); return s_server % s_api2 % QLatin1String( "/episodes/" ) % username % QLatin1String( ".json?device=" ) % deviceId % agg; } QString UrlBuilder::getEpisodeActionsUrlByTimestamp( const QString& username, qulonglong since ) { QString numString = QString::number( since ); return s_server % s_api2 % QLatin1String( "/episodes/" ) % username % QLatin1String( ".json?since=" ) % numString; } QString UrlBuilder::getEpisodeActionsUrlByPodcastAndTimestamp( const QString& username, const QString& podcastUrl, qulonglong since ) { QString numString = QString::number( since ); return s_server % s_api2 % QLatin1String( "/episodes/" ) % username % QLatin1String( ".json?podcast=" ) % podcastUrl % QLatin1String( "&since=" ) % numString; } QString UrlBuilder::getEpisodeActionsUrlByDeviceAndTimestamp( const QString& username, const QString& deviceId, qulonglong since ) { QString numString = QString::number( since ); return s_server % s_api2 % QLatin1String( "/episodes/" ) % username % QLatin1String( ".json?device=" ) % deviceId % QLatin1String( "&since=" ) % numString; } QString UrlBuilder::getUploadEpisodeActionsUrl( const QString& username ) { return s_server % s_api2 % QLatin1String( "/episodes/" ) % username % QLatin1String( ".json" ); } QString UrlBuilder::getDeviceSynchronizationStatusUrl ( const QString& username ) { return s_server % s_api2 % QLatin1String( "/sync-devices/" ) % username % QLatin1String( ".json" ); } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/UrlBuilder.h000066400000000000000000000137231260417502300256330ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef LIBMYGPO_QT_URLBUILDER_H #define LIBMYGPO_QT_URLBUILDER_H #include namespace mygpo { /** * Helper class to generate request URL's. * Helps to generate URL's for the gpodder requests. * This class uses the singleton pattern, to retrieve a * reference to the singleton object use the function instance(). */ class UrlBuilder { public: enum Format { JSON, OPML, TEXT, XML }; /** * @param i Any value between 1..100. If i <= 0 it will be set to 1. * @return Request URL to retrieve a list of the top 'i' podcasts. */ static QString getToplistUrl( uint i, Format f = JSON ); /** * @param i Any value between 1..100. If i <= 0 it will be set to 1. * @return Rquest URL to retrieve 'i' podcast suggestions. */ static QString getSuggestionsUrl( uint i, Format f = JSON ); /** * @param query The query to search in the podcasts name/descrption. * @return Request URL to retrieve podcasts related to the query. */ static QString getPodcastSearchUrl( const QString& query, Format f = JSON ); static QString getSubscriptionsUrl( const QString& username, const QString& device, Format f = JSON ); /** * @param i Amount of tags. If i == 0 it will be set to 1. * @return Request URL to retrieve the 'i' most used tags. */ static QString getTopTagsUrl( uint i ); /** * @param i Amount of podcasts. If i == 0 it will be set to 1. * @return Request URL to retrieve the 'i' most-subscribed podcats that are tagged with tag. */ static QString getPodcastsOfTagUrl( const QString& tag, uint i ); /** * @param url The URL of the podcast * @return Request URL to retrieve information about the podcast with the given url. */ static QString getPodcastDataUrl( const QString& url ); /** * @param podcastUrl URL of the podcast * @param episodeUrl URL of the episode that belongs to the podcast-url * @return Request URL to retrieve information about the episode with the given episode-url. */ static QString getEpisodeDataUrl( const QString& podcastUrl, const QString& episodeUrl ); /** * @param username User name (gpodder.net). You need to be logged in with username. * @return Request URL to retrieve a list of all favorite episodes. */ static QString getFavEpisodesUrl( const QString& username ); /** * @param username User name (gpodder.net). You need to be logged in with username. * @param deviceId The id of the device. * @return Request URL to to update the subscription list for a given device. */ static QString getAddRemoveSubUrl( const QString& username, const QString& deviceId ); static QString getAccountSettingsUrl( const QString& username ); static QString getDeviceSettingsUrl( const QString& username, const QString& deviceId ); static QString getPodcastSettingsUrl( const QString& username, const QString& podcastUrl ); static QString getEpisodeSettingsUrl( const QString& username, const QString& podcastUrl, const QString& episodeUrl ); static QString getDeviceListUrl( const QString& username ); static QString getRenameDeviceUrl( const QString& username, const QString& deviceId ); static QString getDeviceUpdatesUrl( const QString& username, const QString& deviceId, qulonglong timestamp ); static QString getEpisodeActionsUrl( const QString& username, bool aggregated ); static QString getEpisodeActionsUrlByPodcast( const QString& username, const QString& podcastUrl, bool aggregated ); static QString getEpisodeActionsUrlByDevice( const QString& username, const QString& deviceId, bool aggregated ); static QString getEpisodeActionsUrlByTimestamp( const QString& username, qulonglong since ); static QString getEpisodeActionsUrlByPodcastAndTimestamp( const QString& username, const QString& podcastUrl, qulonglong since ); static QString getEpisodeActionsUrlByDeviceAndTimestamp( const QString& username, const QString& deviceId, qulonglong since ); static QString getUploadEpisodeActionsUrl( const QString& username ); static QString getDeviceSynchronizationStatusUrl( const QString& username ); private: UrlBuilder() {}; UrlBuilder( const UrlBuilder& ) {}; static const QString s_server; static const QString s_api2; static const QString s_api1; }; } #endif // LIBMYGPO_QT_URLBUILDER_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/Version.h.in000066400000000000000000000033001260417502300256020ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2012 - 2013 Stefan Derkits * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef LIBMYGPO_QT_VERSION_H #define LIBMYGPO_QT_VERSION_H #define MYGPO_QT_VERSION_MAJOR ${MYGPO_QT_VERSION_MAJOR} #define MYGPO_QT_VERSION_MINOR ${MYGPO_QT_VERSION_MINOR} #define MYGPO_QT_VERSION_PATCH ${MYGPO_QT_VERSION_PATCH} #endif // LIBMYGPO_QT_VERSION_Hclementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/libmygpo-qt/mygpo_export.h000066400000000000000000000036141260417502300263140ustar00rootroot00000000000000/*************************************************************************** * This file is part of libmygpo-qt * * Copyright (c) 2010 - 2013 Stefan Derkits * * Copyright (c) 2010 - 2011 Christian Wagner * * Copyright (c) 2010 - 2011 Felix Winter * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * * USA * ***************************************************************************/ #ifndef MYGPO_EXPORT_H #define MYGPO_EXPORT_H #include #ifndef MYGPO_EXPORT # if defined(MYGPO_MAKEDLL) /* We are building this library */ # define MYGPO_EXPORT Q_DECL_EXPORT # else /* We are using this library */ # define MYGPO_EXPORT Q_DECL_IMPORT # endif #endif #endif // MYGPO_EXPORT_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qocoa/000077500000000000000000000000001260417502300222415ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qocoa/CMakeLists.txt000066400000000000000000000012301260417502300247750ustar00rootroot00000000000000set(SOURCES) set(HEADERS qsearchfield.h qbutton.h qprogressindicatorspinning.h ) qt4_wrap_cpp(MOC_SOURCES ${HEADERS}) if(APPLE) list(APPEND SOURCES qsearchfield_mac.mm qbutton_mac.mm qprogressindicatorspinning_mac.mm ) else() list(APPEND SOURCES qsearchfield_nonmac.cpp qbutton_nonmac.cpp qprogressindicatorspinning_nonmac.cpp ) set(RESOURCES qprogressindicatorspinning_nonmac.qrc ) qt4_add_resources(RESOURCES_SOURCES ${RESOURCES}) endif() add_library(Qocoa STATIC ${SOURCES} ${MOC_SOURCES} ${RESOURCES_SOURCES} ) target_link_libraries(Qocoa ${QT_LIBRARIES}) clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qocoa/LICENSE.txt000066400000000000000000000020431260417502300240630ustar00rootroot00000000000000Copyright (C) 2011 by Mike McQuaid Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qocoa/Qocoa.pro000066400000000000000000000010751260417502300240300ustar00rootroot00000000000000SOURCES += main.cpp\ gallery.cpp \ HEADERS += gallery.h \ qocoa_mac.h \ qsearchfield.h \ qbutton.h \ qprogressindicatorspinning.h \ mac { OBJECTIVE_SOURCES += qsearchfield_mac.mm qbutton_mac.mm qprogressindicatorspinning_mac.mm LIBS += -framework Foundation -framework Appkit QMAKE_CFLAGS += -mmacosx-version-min=10.6 } else { SOURCES += qsearchfield_nonmac.cpp qbutton_nonmac.cpp qprogressindicatorspinning_nonmac.cpp RESOURCES += qsearchfield_nonmac.qrc qprogressindicatorspinning_nonmac.qrc } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qocoa/README.md000066400000000000000000000032461260417502300235250ustar00rootroot00000000000000# Qocoa Qocoa is a collection of Qt wrappers for OSX's Cocoa widgets. ## Features - basic fallback to sensible Qt types on non-OSX platforms - shared class headers which expose no implementation details - typical Qt signal/slot-based API - trivial to import into projects (class header/implementation, [single shared global header](https://github.com/mikemcquaid/Qocoa/blob/master/qocoa_mac.h)) ## Building ``` git clone git://github.com/mikemcquaid/Qocoa.git cd Qocoa qmake # or cmake . make ``` ## Status Qocoa classes are currently provided for NSButton, a spinning NSProgressIndicator and NSSearchField. There is a [TODO list](https://github.com/mikemcquaid/Qocoa/blob/master/TODO.md) for classes I hope to implement. ## Usage For each class you want to use copy the [`qocoa_mac.h`](https://github.com/mikemcquaid/Qocoa/blob/master/qocoa_mac.h), `$CLASS.h`, `$CLASS_mac.*` and `$CLASS_nonmac.*` files into your source tree and add them to your buildsystem. Examples are provided for [CMake](https://github.com/mikemcquaid/Qocoa/blob/master/CMakeLists.txt) and [QMake](https://github.com/mikemcquaid/Qocoa/blob/master/Qocoa.pro). ## Contact [Mike McQuaid](mailto:mike@mikemcquaid.com) ## License Qocoa is licensed under the [MIT License](http://en.wikipedia.org/wiki/MIT_License). The full license text is available in [LICENSE.txt](https://github.com/mikemcquaid/Qocoa/blob/master/LICENSE.txt). The icons are taken from the [Oxygen Project](http://www.oxygen-icons.org/) and are licensed under the [Creative Commons Attribution-ShareAlike 3.0 License](http://creativecommons.org/licenses/by-sa/3.0/). ## Gallery ![Qocoa Gallery](https://github.com/mikemcquaid/Qocoa/raw/master/gallery.png) clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qocoa/TODO.md000066400000000000000000000004021260417502300233240ustar00rootroot00000000000000Widgets I hope to implement (or at least investigate): - NSTokenField - NSSegmentedControl - NSLevelIndicator - NSPathControl - NSSlider (Circular) - NSSplitView - NSTextFinder - NSOutlineView in an NSScrollView (Source List) - NSDrawer - PDFView - WebView clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qocoa/gallery.cpp000066400000000000000000000047771260417502300244230ustar00rootroot00000000000000#include "gallery.h" #include #include "qsearchfield.h" #include "qbutton.h" #include "qprogressindicatorspinning.h" Gallery::Gallery(QWidget *parent) : QWidget(parent) { setWindowTitle("Qocoa Gallery"); QVBoxLayout *layout = new QVBoxLayout(this); QSearchField *searchField = new QSearchField(this); layout->addWidget(searchField); QButton *roundedButton = new QButton(this, QButton::Rounded); roundedButton->setText("Button"); layout->addWidget(roundedButton); QButton *regularSquareButton = new QButton(this, QButton::RegularSquare); regularSquareButton->setText("Button"); layout->addWidget(regularSquareButton); QButton *disclosureButton = new QButton(this, QButton::Disclosure); layout->addWidget(disclosureButton); QButton *shadowlessSquareButton = new QButton(this, QButton::ShadowlessSquare); shadowlessSquareButton->setText("Button"); layout->addWidget(shadowlessSquareButton); QButton *circularButton = new QButton(this, QButton::Circular); layout->addWidget(circularButton); QButton *textureSquareButton = new QButton(this, QButton::TexturedSquare); textureSquareButton->setText("Textured Button"); layout->addWidget(textureSquareButton); QButton *helpButton = new QButton(this, QButton::HelpButton); layout->addWidget(helpButton); QButton *smallSquareButton = new QButton(this, QButton::SmallSquare); smallSquareButton->setText("Gradient Button"); layout->addWidget(smallSquareButton); QButton *texturedRoundedButton = new QButton(this, QButton::TexturedRounded); texturedRoundedButton->setText("Round Textured"); layout->addWidget(texturedRoundedButton); QButton *roundedRectangleButton = new QButton(this, QButton::RoundRect); roundedRectangleButton->setText("Rounded Rect Button"); layout->addWidget(roundedRectangleButton); QButton *recessedButton = new QButton(this, QButton::Recessed); recessedButton->setText("Recessed Button"); layout->addWidget(recessedButton); QButton *roundedDisclosureButton = new QButton(this, QButton::RoundedDisclosure); layout->addWidget(roundedDisclosureButton); #ifdef MAC_OS_X_VERSION_10_7 QButton *inlineButton = new QButton(this, QButton::Inline); inlineButton->setText("Inline Button"); layout->addWidget(inlineButton); #endif QProgressIndicatorSpinning *progressIndicatorSpinning = new QProgressIndicatorSpinning(this); progressIndicatorSpinning->animate(); layout->addWidget(progressIndicatorSpinning); } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qocoa/gallery.h000066400000000000000000000002621260417502300240510ustar00rootroot00000000000000#ifndef GALLERY_H #define GALLERY_H #include class Gallery : public QWidget { Q_OBJECT public: explicit Gallery(QWidget *parent = 0); }; #endif // WIDGET_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qocoa/gallery.png000066400000000000000000001223231260417502300244110ustar00rootroot00000000000000PNG  IHDR:kpx_ iCCPICC ProfileHPTY{(QrlrN&&6 # "" a J1 Tq0 **ک=λ_:s@ndxI4~=<"0 }&+ >zK^9, ٩dO"^@ qiyCG D8kchn!'8.d& Y x.dv8&`s6ZoBM&3Vȋ,%>n$7'&y! g,kqKKs \4F0GĂ%N\%F S#83.8l% 槦w]3 ,0'=G:I^bnN~=a~C/~P/"d3]{ \+F:008i 8mƥ[ѣ3,=1SD`Ut\@GLjd 1 @Ѐ,r"TG*46`ɀփ,PrPjA#8 Np50G`LW` | Dd!%H҅!Kr@(b!.$mPT CP+t :]4 ( `X^[Ž c8΅ep |;( F %RF,Q(?T$*GmFJQ5VT7u 5zƢh:Zm@Yf.t9݁CB1KYA`M# :B7a0K'jmVbx8B|O"THVR<)TF:FL#}&KuUdyC~@~OP4(HJerI*b al)F .(F4ST b1 1g1f SbĦũF~ěůIhHJ%r%j%.HSQTU3EF^Nа4M@+ Ҧ$%$M%C%3$+$HJ4RIRRǥJ}VvHn)=#LA#/&sG,]U6Qvlc9\zr^/-YZ򰼎|FZiEwA K*N*QJ)KI2z}JY^CY\<<ҦXjZګ:棖֢Pn~@_}FCS#LcF MMffE^+EF6VR;QcSsC5׍=;ѳ';HxtY20416zgc20mB1q3beTהczlY7s syEE=K.V+'-V>[[YF&Ѧ u+mUlնvt(F5OT8q2t;;8[;orqA J>qSqukqr7sq`1S<^A^^Ou>>_u_oc{[6?"YQ`V`5hmPs`G!Z!PUM3a.aa7_EFGNt]*Uy\5Ikά]\{" ǬaNG3+XάWlv {c)<)yk/v2>4us|yDĆĹd|rT)7۷Nq]ƺa./7b?eůORWvѐe@%.KKH>t n ;7~v_@E/]Wjyf;nX^1|\n]͸}!w[uo>I>L8({3Xq'5k6j>zfeliGWu"YsM/_tz+ޫyYFɿ x;n{ L?NO?qv&ϖ}y>+k7o߽%|(B]CEgNjsP@Z ¢ϏoxcbECFws6877[67)|gy;07}o6n,X pHYs   IDATxyxՙ꽵v[e+7b;lB;fH~@$3 r&7Ýkf2Y% $\U;-]UR'ٌZf#j9ve _˳eb% o7HK$Erk% KSF 9$ӆىW2K'yҝ>Ċ]VlYU:5!DM_k5q*Dye4e3`g2qeӵ*)$鸮L2g7ٝY`f%g5lD.̢K$z.No:LnE$2Kn޶sOC D7,%'Q]Igל"RKe.mlld(:b/6ˌ8NSMPU5g]:v"o]%'ⱦ8NkOZϵGn3Z< /+>>H,n鈝~ptsL\G;Dz??{7~l0>*ƺq iX,fmDĶ1,RVDOLLdm>Dڥz(Y;vlիr %=NDzK$~vvۧ%db+Ux}M3f̸F>9Od$RUns4-.~s|*:kYӔ(LiXfFg6E(0 8jۚfQIf9s'.䒟$d,v_qvr#ҴÒSm13o/(YxZm]׍0g~5M+h֓*bq&zcU$ Ymg}tFQۼ 5/ :5lQN[544\ .vngnVkC!D"ƺ)3"M7/~Ĺk[*FB\s<ˤkwsXoboˁhb: syܸiWiUU}叿{;4WT@k{z2rXmf^Z{6ȸj&ԡs(?ɲ YSfp;H޽MӘzm|~Ljf|$سj81N5gK/-8/=EH[ױk3~!6e~=4[?Ѹ>swj*nvXsC3haY{F(ܑ.Yu~qQ~_rp?~dqmkOGgqY0"C@ 1 /Y["ٚߩ$6#H]+vqEJ.) ~-YYj婢Gd!K|Enق<DcaGG #0}pP> cxTžh2FTV!(;~L*J}l?Ro@g$DPr?ΪbwǶV^Eܺ x7+˓?'x7 [lAQfϞu]CUUxgزe CCCEQؽ{7O=K.K.X,F8f͚5۷>f͚ō7ވ!vmaq?ݻyhmmrEq饗YeQS!^۷SVV 7'> t]g[ŋr%?oSp8D"|_ш_ud8$$"~!\fk8Y CϟoÇ*aP`-[sa~_pYGfw֜7+WGy?<}ݨJ$aϞ=|>.ٵkk׮eҤIh_4Mcĉ (AdoWNe1b!U a\.CCCJoo/&MpUؼy3hh4s=ƍ tuuhȗ`0Huu5ى5_o|3fq!C)iFuu5~aܜS]]M,㭷bƍw}8N~ӟB#$TTTqFGhj,cժUL2`hhn-B䱹Ѩ!\s g6ǰ'?pEÇxb²ˉk-Q&kPzOVf # ޕ5v_;4a9.!HuMZKd&o39;[@TDQESbpb3aj&VZNpe }uul ljb'0nhq24ya"1z 4"169B?L\7&1A46͡LGNs%D)m,6͟4\j kke۶mڵx߿_n`0HEE'OfƍAذaSN%PZZ̙3ywhmm%qA(s% id,\EQB_9P\_"ׯw5T ~^ ikk^CUո8BHs[nvHX . 6h"!#|/H/6+4B> 3|L6cmKvg5@^X6n#AXd4abѥZD֘sY j^ 3Ԅ x>LFh:@סIȡRsxƏ7:Dt: gS9H}S5uoUtPB T\t ̍0*P'[Fw:9̾8cfL8z›ՈxE=@ii)vb͚5n\|$ Dp<#><<-bcǎ~n7v>j*TUepp%KpWׇi<?~:9?|rfΜ |9ny0F4n7eee;lڴKs.hZD"N3l.:sDE:szI ̖xB6OcآD#%=)~0RaX "t6 -Ug)`.+\an/eTp8 Oot FyOPTvFj~ Hb*1Fqqǚe0֖Nnp8㉛+5i'ܯx}<1)`|0\,3(~X/锿9b lȑ#x^Gٍ̑ Y#1&[ԉl+xK$vV SYs鸯ŮoF%vd}tF[GtCP\Á,q8< Tՙ֩!ZTBQ.h98N[& \E1[fNX.yX‚顷7Nxeâ`\_4[@'&^X'P7xȘ-t_54iNcǎٖuG\fS6cQ5Ě=1~r#n7(l*d# -Q]v{uG3p ufgOx5<#Duop]qgNwNXl(I+xZ;8w܈DE#y}qV?&S~+cc T&wITD β0etD1_lMf32ma$[En|O17P50%tQ"oOsYٹ4Yw Q:I&~Vr!>L7pY-4%̑dpZ7)TWW؆}.d]^PSŨ IDATt1밬K${ lۦ]T:`ݗ@:.i:>]$.Hcm+!v\'%",1T;'bZ:I${L:,]K(My#&`'@26UAHN"INv]aY'I8 !qu{3iv(x5Ux:)"HegY%N,<#FkzuejIHCm*SAK&ҕƺ>6̒B'dN:f=|5ƌL.&ʀt/+/Y$ٴt\T _W2ٟL̒*)tIrriS醙JK-5SBC ׃I?MӈD" djKP^P#ʴk:3R>9Ѕ#4Uh.c{;zNU0K[>ɋPۢ+D?٨vWۏL+kD z\Tx(:y!ڏGU]8T?.bn\,DvGu) F`QZpI2ڀ޽{Yv-(BSS]tNQE]( Et۶֮K]zNʧj_"ˉB>FKICV:݃{ C|!OX,G}ĦM+.|%GR]j>& q T|Zu%% vac-t SViW"k.yjkk7n'??illdҤIcy M*h꧳/̱!/}!'eޱN]Y18>d"nɎ+E4 ({)|V(׾5CZZZWoYdJ@26Τe"zΩ tHIF OD4hTć09Vq)S())-I]Ne%>:XW Ti̅,J Au\.׈tނдQyK EQp\z\9 :B9x Gq]q()"+b9DF_xc=ơC{_YfZ:%E$b%+`.KUp:BDbYfbɒ%G?X,Foo/^zfV$F$10.G{yE>2Rv7?1|rn&ZZZI&|r\.7K}Μ9̙3g'O?? ۿ[g'IJ$7\#:*|<ҢXSگXrr{Mmjjoo|A:::F!ՒӕHt\9u Icj).E.?Ft>ֽxX%#&Loo8|0 ,KN7ȵٺHLgbN@ ]x J|@=eA'MMk+ke„ L0a-9mD5"]ٺC4T2ǸR@ ]*eh4;R m4h PuTeedNThnJ^\.#e|I,#?o0L(dbu)jRrD ]Ωz)99/LwO葐I*o:ß;WYJ}rqbr8*|*s=RrTq9):}!$kE.$I#N"=R$I#N"=R$I#N"=R$I#N"=rp줽Ç3888ɑF~ƍGSS%#.tvv3a>ORSS3IFtuuw^>cfΜ).H#s9g"9 X,ƾ}GG<ԩS:ӜSrNFQ!.KwU3555u2 MK%ӑM6n:Eŋ:YEM֥B ]4U_?˖-cÆ OsWAMM K,aݺuFk֬+#wSL?M!Ң3¢+&Uu =:{hF0d׮]aՅiZSy桪mأ>ŋl2>w?/Ž;;ɑi!tŴN?=O<sΥ<0߷y;NrJ.R.]J ஻B4~n֬YâE lٲe-/Ң3Hp8\T5R]]?N8榛n.㭷" BnD"ƺ]Xkk+]w 0sLcUUU 5Q (RTuTAZtp|f۶mرbooo9ll߾4;vP__KPIF4yghhh`466ذa~߿8G}4_":;wD4|IٕHR!Nq9~3N'%%%vmz,\3{l."̙??C1mڴ1_IqP⇀iۼ6۪enq~NӶn]1VnO<׿KǏp\*iX(TDQn7+WokVWW1@;kDMDMͺd-)L,ǴmEO`D4+//OR LEN/) u#~@#QgzzzyFZtydݻyge'!r{2~1NQq!.L8m۶BEEHr:˾}8x 3fRH}}=ƶm7#$cr`BGN'F*EQp:\.N4}Y\.n)vY . t]ghh0sL^/htч]W]ϛ) '6oQf;8uWL*@L|uY8p*\.,B300@WW3g$_:Q]2yy_/ߧիWtҔĉ)++K&9+0l9ضm2DnfDQ C jjjxG8OyPŋ}a( b1;$9 .K4M3Yqgʘ8q"{eƇn}Q*nfϟO4 u|ye]Ɔ 8z)֮]_̬Y/9Z<&7OӴ1N?]YYi$ {GKYlu]hO?mvYz5/ꫯ&  H!N5557a޽ٳ'Lhmmeƶb֬YaTUUâ'9V3n~lݺ5n0AWb1z{{Gg׉n4Mcǎ?>?-9X!B'IM橧)S؈ctwwsmnxhll?Lv5ksN4M׿5_ը㩀6)pC ]Iطơ7xN'%%%~ g̙38OQaѢE nv.R-ZČ3'V\ɴi~ ș${TrVmlua;MNSu^Z&h[oqWT rIx'"8;~8^e{TWW' BpJoⳋرc .3W[[cpf]Ku[Ncڶ( fD(墤͛7sE |_T/$_RRBIII0Gcccwg^߼y3%%%Beݺu,X*b. p81B%R@݄ ?1^x!w^$dn:֮]˴ihllBR@̜9æMxU'a͕1{lLBmmt]s@ ](륱2 H䄹r<BzqTTTXI"Át%y@ ]7pג$yE[BGdŔHNMB'H)tB'H)tB'H)tB'H)tB'H)t#E2Hh4ʚ5kطoX'Er#NRpxy9~X'Gr"D2j۷V.\ٳ5+$Ң*OsСN A dL8~8>,c$cByy9_|1c:ɨ(죓:IF-ZDyyX'Er!NRpJJJ hiiHPI n)rURpI)tB'H)tB'H)tB'H)tB'H)tB'Hk,X@OO[nGફofDѸ a|AϟOSS_~9< ^{-oK,a̙,}KR-E)v#],ȈŅ)µ^sNt]g͚5 pUWuPȁt*a! r!4-}QVVF /rrw׿u^/ٳgq EQ;rJ֯_w=?wC{{; .h4c=Yg&$LE(UYe{nuP(\s ( ~UӶyQmU˺0Zםm)ܺcfuww/H'|oQǏp\:iX(Ƃt#OW[[cpf]Ku[Ncڶ2R@y.֍}>>/ea„ yK,\,SNHddnɩ3}f,G5mP1߰ʜ} R~5X6l]K?W6m"B%#ȶvCS@%WkgW=R$H$4BƑH$E:DRHH$E:DRHH$E:DRHH$E:DRHH$E|3BRp=ʡCرcjkk7& )tg۩a޼yp裏hjjbcRI1#NR09GYKK ---ٳ>@`HGʼy طqF*+++)r0BR8@MM &MBӴˤIclI"NR:::hjj"F.X&::::ْ"Ek|5?Juu5:ə:IA4H$bPUX,eO IDATV2H*)tvvٙ۰IH:<ַHUU;$H:;;ioopv8ICCX'[R>:IA-[ԄiqneJ)tp8>}:i&:::{LZ__q8cjI"NR0n7gu:t>ʨe̙v8bF n멩!ŀapr%')8R$GD2VQWDRHH$E:DRHH$E:DRHH$E:DRHH$E:DRHH$E:DRw]sѣfn,Ɏ[k/Nj?!Mbĉ,ZH~6GΝ;y$;GcL6ms".Kկ~wߍ# z$2[n;鷺:9H˒W^ys=p8L,CAA?M-T.⩌D#;<^}UNi,ٹs'_F[’ h4D3e( :ͼyL4a`@ӴUVr3ǏgÆ ,XPkoロٳg y߲ihNi,qhWUUL2P0Ⱦ}g8q"3=ǯ:5*.6}}WbCx"w0ay%nDc1E53 )tYt:QC9QbrG||ӟfҥhZzks'S\.::>RUtr 70uT^{5|ApҲ>ޟ4,x,((h(">e1ft]# ɝ+qرkG"07|'fԩ|͔<%KXx17o^xWؾ};wfӦM\s5̝;xO}Swy;|z<裴 {z⋼DQ,Y•W^i7DUU.:88Hww7*ux7ؽ{7r 0?;```3f /|~߲uVf͚ŵ^KIII}A֮]KEE_җhiiI,G=)b0EUl9%N1ZrpI+_ +W[o}x\s O>$```5kput:+5kK,c޼ypvY\yill?!^z{{w{w7|ÇovZ|A|>_҉Šٷo//2wqP|Mhnn믧o2`XȆXb+V{̈s``W_}`0=C]]J6EwXD_)t#s.Kb(ʨ/bٰaTUUw^f̘Ν;9stRV\ɚ5k D4\.N3Ur:'- MbE>FQy>lzzzcرEQXn ,`ҤI?~/<.>EUUlºux<~#:TUEuc0 a,[JJJ>֭[5sgկ~2ϟO{{@ ]H5KDVѺ}}}AVZerDŽa>k144wA0s(lqY( h(yfcpDP.U!TUMhՉK_bڴiꫬX6=ְ^TUѰ^EܽTUU( ƍ3A}+rC ]Q07t@"+tr=K;zfΝݻyg>&k  HGKK mahjj+x;Ś`0Hww7/geӦM4448wpppjwOsQUX߿UUsYuCLid̹,u=̓]\.s=X,~;>ѣGikk3޽o~|楗^bzgcc#mmmDQ{=|͸?&KY~=6lѣ}tc:t~~iula{=;w. >|!<Ț5k⫫/OXf"iӦ{ cƌVn{EbZSdE%HP(4E(ⲳE_z~;3+Woqu]D"Yf w)// .%+Vc\z饬\}{̞=u`NyG?+WF9Xls6ltM_>iީʿ*---|_H$ٳijj{nGF|---̟?￟E|r7o^\حC=~t]o~hfXoVKzu- B)G%ėW5mf[-ӯuiv­8fVwwʍ ̜9shnn,LrfhhhLyEyy9ǏvAUU5^Yš p1c墴P("x wp8<"~ѣG$ no ```R׶ QD⮧( @P(璘@ @OOn\p8(//7 n7}}}Fzm[>F吝M6qw%n3+-@/KtL٬kIݲt'g ~S,@gg'3gΤכք}kټS.,G\KD#Q0*.b:e[RWW3A%]t?яh*++v U &\8 3;NJJJԉ2:"t񐘘_?nH3&Z2zDFwdL0,B#B'B#B'B#B'B#B'B#B'B#B'B#B'B#B'B#B'B# cʱcǨ6z{{#%%L:uj)D9"t˜P[[KEE|r222/ 755q1vɡC1c. aTVVRPP_LRRҰRRR(..={g:;;={vJ-D3"tBX9pUUU,\铒8sHMMe׮]"vBFmm-bo۷$X! a|CQYY ??//}KK-)) aEaرcn{>9(//??x衇F7o# ;ƴiHHH_tEb_7Ui8vL;†XtBXhhh 77wvINNfpp࠺QeD\"\#!N mmmx|.oALL ֭3LN[[XW8Bww7 n\.?Oh)BBBQl AN 6NEav7 /^lj1E N p\r%b=1*p&"B'L?>lUOgg'0VǏ2 g."tBXɡ~S;cbjrrrƪq:ݻՊjb V^ͪUF[,{t:Ϗt(BN vٳgSYYIee*t:ﱳgnq2!|$<رcpjBw6[Ytر|"V!:†ngܹ('|Bss3s%..EQp\l6`Hz{{ٻw/UUU1w\愰#wVbcc)++#))Cq%--M Bmm-G%..R t(DN;2uT=J}}=~!t:4iGllXr˜!w0&vv;vx<LV+6MM'ca˜"B&A:A:A:A:A:A:A:A:A]]].p"L8DB࣏>t3/8EpЅUW]"g /r0! @?.BA:EQt1!,H5D"tU7c)((UVs~466o>5\Q^^ζm۰X,b B!K/o}[ PRRB}}=Xcx≰ɞ={|_w͛7Izz:z@+Byy9>Ä3&??&++kX(cvޛnn),yG?gLy.~_pͿEl20A, Dkk+O>$?FjNRRR¦MXj_[oeL:[n>ئ&jXd ۶m /W\dܹ#Ҿ{,_B~_sN()); pJJJhnnVoF~pe/\.a֭[9IOO_z BwY^^(̟?஻?1 .e˖q}aZYl k֬oFQlقn;pTVVn<ˆ Xv-[nU~ tvvRQQAWWoW]]MCCC7tz$%%?~#66ժ?fʕjMii)[nK.~L:>#5AE*}]~i*++)++TWW <䓤2c Nvŋq:X,krga˖-\8Nz{{UKW=vt:딐`?ovV^ͪUx'kC8ЅH$F]8vjxgg'EEElذ .@-[vvv?^cTTTPVVbѣ̛7oD7jXx1L<4E-˰]Ì {9Wʚ5kxyFasijjj;w.1119ϟ?C8@ʟ;ׯ_φ زe \j\QQGU^YjUPIll,Yf }*2񶶶Ρ 2e ,B#&{{~:c:u*;vPYYI{{;'Of޼y<3k.?4ӧsySSS@www_u>}:8qoZCss3?CNN?Yv-ǎSq8P^^3+^z EQ8pW^ye@&"t!o*_<#sEtRMFJJis[n3gr}q7a^z%, so&gfڵTǒ%KXt)K.ZҥKYb>i]2e ˖-{7wYp!sUaZYv-=+W4 5kɽ˼yXz57P=" aׄ UnVU6lmpMS|_@W#@q3ːӧhjj"##|\.ZZZ EOOOPxinn&!!A(NN>6- oY(ՑÝlڴ)iJOOp{ͥI҄{ s+0Eq2_G#dG"ÿkNN999AUTtTRRRS-Ǐxm(b i E"ov BЅHA8t&"t! 7 L,NGNGNGNGNGNGNGNGNGތ:;rss)(( ;;;řЅ@]]۷og޼yXa4tttP]]Yx]Ѕ@ee%ϧ8v bX eŊA-"eڴi#C#BHC8HLL'ŘE"b rϬU]kC890 ۲e z ,\p<#Vomme˖-ǥryuƄ￟DG(BЍ? ϳ>KWWNYYٸCw)AajM(,,d"{؈VaǚaA](27ngɒ%vmX,n6^}UuMH]jP-rrr{T]Kk0=s?c//'Xl6[DNyW^^nvf͚cV\I?wy͛7suOƵ^˚5ky6n܈fc͚5jBQanr+//g444PZZ=RRRhoo?!W\q\r ?xW6lݻٷo1z+˗/[ǟ̜9{={9yظq#\q|jijjb…`AzSC+tYV, lڴ;vpeo7ɋ/ŋYn(Bcc#jnTsw|zE/ o֭=v]@ʮnMMMG?_:/"111(Brr27pׯȑ#cqM7aZk7o^x!?8/6cccoii#٬_8x 6ọ>c=믿NMM E]Ć ꪫbDBC.D"qYV^}UnF}Q~a/_/aҥ,Y/cZy&פ;Nx̙矏墺,]ypW o_wy rrrhhhݻwg}6W\q?xYz:I;&&XbccIHHf?җDVVz-ZD__k.{=v;]w"2*B:th~_ww /pXWQQj53Nĉ^ZxӟطoKUUհ<k6̯( ή]璘O\p!yf> p 7o[.r:,֭[Ƿ-^x>sA_ܹkvX_۔'))uq]wqYgBHZG?b˖-|dڵ?O?4aΜ9?ikk`մvZkZGm墋.k?9wy'7x7 _o[9rgu1 +,&{Ưݬ~m4{ۮ5͛F^/D {>өKrjS[GBB*꨿G^SEQ ?KsXXP3;t$...ŘHGCL6HC8ègڴi.ƄD,>}:1٧e'D]]]ձo>.]LHDB ;;+Vpv1/II\\XӢ= EQ$33e˖E8\hH Q Q Q Q Q Q Q Q Q&ihha#@~/99ɓ'3eʔH)*%ݻә7oN ,>U#.\Hff&BhH]tvvc,[iSqݸn<ψM(xQ<(rko{'::ڹ{>- <z/M:K~"B";v`Μ9xN6= Z*Vqھ};&M=#vqHDBA {ޞ|OF)/gr\."7Jk[]]Mff&>oׯoRU=JVVw*%XXXH__uuu~Oa$"t!pqOn*h~T(;&5n``̞3ٳgs~0}v.R5}8s| baӟļ2gQ( G.#/?oN6lsSOzX,,ZM{{gƌ7V|sɛ6/_=p7200˹뮻 bO>Დ :\E?f/^[oM窮ꫯ&/?KWQQ+صkWfkACI򨭭 |F B dffպss+'bpp}ēO>ɗ%5%7o^ॗ^b۶m<򳟡(CdUVVi8r꯮_䩧b(Bk[+k׮__ٺuػ/| ܹVQhm59Τ<>̿ۿQRRBiiPZZ뮻s:::PG(>,> '?z=^y~<rXMWQQAJJ 111'ʯ-s+ yqqii\.sۼ<$&&z*os (**R㦛nDAaʔ)ٳo=[Foo/>^C2줱Q ;t3J0\͔.RRR)!B?kؼfjEQHJJ?)<@Qsol|:::x<8~ =j^4P< +Wd޽vx5}YLv%''?G<?.3 >P<9v'9v%77w,oE.r $1aXw{S_Xjַ?… Yp!(Bnn.W_}5K,_7?0~.\ҥKYz5K.sUZV|I>CJKKYd vh"-[w9 ;<=|AU͛ǣ>׿u:,ӟEQwŋ)--oFQ[ꪫy o|׿INNznjʮpEt:Yx1|_窫&&&w-bz\tEέ}9orqQ:,,;,&{Ưݬ~m4{ۮ5͛Fl6׿̙3lC}u  ]5uvv`X yloogҤIAM¤I>A}f㉋=.W8qXaoNl8g^/t8Niiiܡ\ P4brK.d ==!S xN6&K1p{|lέhp4~ŏ`Dx<=\^u+V unnrgxs5t `AsJ*?o:v率t)R {ΫOq92.}e IE!=-f鴖rHee%_~>F!pDB@Q&^xl޼3g;56L,~ν7tjrǎYE^x!qqq"t!"B"t.rmF]]ӦM#55Xæ 6jjjp:\~Ņz&!B7 n7N.'NPSSþ}|{(NiyaX,1ebcce q8477駟r#;;ؾ};vfΜIzz:6ffQZZJzz:]]]J0s^^8qEQHKKcΜ9>|z&Mܹsٳgcۙ|Jqq1SLfƁT^t)?~3frؿD,鮮.8#vnBVV]!Yhngy.Ν7sL [ntΝˁxȠ8f͚šCo~æMԇ?''S+SOcǎʑǔ)Sعs'}~뜐 Xz5v_Q=v˖-`ƌ'?D-Z6cbbHNN&??{2i$rrrBFO$i]:ԩS9)..?d(Bjj*qqq޽d:::HJJ= 6!Mdz^}Un fLVRӺN.]  Kz7C.sqyV\ɥ^ʱc8x n?f̘A~~>}>a٘u8~h@.@ ###GJqq1'Nn>limm%)).:;;ٻw/eee̚5*N'߿nF*++dҤI֒yѣGٳgf͢EQ(((`TTTpaΝKOO---СC̟?3f088Haa![8N'999GEE*RӧOuD^Ckk+}}}466C}l6dggA^^:wM;IW_H+B @[cM^^o6yioog\p`Xll޼\Ygj^{/_9C^^0d qUWqW{n***߲eWBaa!:>k.)**"))[kff& .dʔ)ڵw}zgeƍÎs8l޼$VZn2{lϟ?̛7;EQxgHLL /N{o"bda1[5~f5[unͦv߮ o4t5PQQAkkk8˦MgŊPݻUjmme޽j?f޽{ioop9C||uuu|8IMMeXVvMCC RPPֶ;wb׫9 ܴi:Czz:j;vىbO?YfÇjr9`OUGW(//<dddep:s9P`ʕc3ʌ3>a8==!S xN6&K1p{|lέhp4~ŏЅH[[oۍ2#66vă7gCQ\.aBappg^=, 6mXn:@qO~~>)))aL: \.zm6:B4 7+b ::Bum"I||}:#Y,:! a͚5f>"+tƕn-E@Dqepp0E@*pʨ0E' :tEN 񴴴OB|||&"tBX2e vV+6 Mo۩dʔ)EH8pG[[UUU?~ٳgx<=zfDVV3g$;;{ J) anKVV.+, vv5!w6vpZ" D="t D="t D="t D="t D="t D="t D="t D="t D=2= ttt@GGHIl6bccINNf$''GHQ000@UUMMMXm6, 6%MsK dddPPP5IDAT@lll5a'2Dzzzػw/EQKVVژ;w|4D.<зNވDzZ3ffy"j2!"]1rM (..-[~'.55Bp,YGoK/@Q:::8ZSCmmm@ZaE]].ʄ#̑quˆh;쳰[s۶mb0{֬, Vl\?mT.b^BKkk1!.#]Q1<11466R8}:޳i/[9t0qAfΘO? bNbرc|VQaZE[{;xHO=崵1s &O̖>Aff&+/g'0c , K/>x]̜1xzzz8t'NpyQW_#6,t߾1c"Xt!$4&%'SU]Mzzb4h_N||<>|IA~>0-.*O?ec݈ /[fO>Uc;i@uu5.v G'HHH`͂ILLTROwOL6M(L{/RЅ@4|E{ rQ(&Mby_x> n[]'qdfd`ZV+j>TVVRtOދrB ..HcTfp:X,( {Fȓ (++6[TTn9*+#B7JN'g}OKKSqqq̞=;A]5kV !!!!!!!!!!9NިD32GP4Q>Ns|=;9;EԇJw_lA`Jg3Bgv=A"K0QK;7Ӝ~NƽU6B7^gԧ`s BT{6~ĸ ^n, > ޶m۶8 D-'  a.Kk- 6쫬<" ĦO&|xZ}As|J=acv믿X/.YdffffA:A8#hlllٶmg6ltƍAdFVhı[bX^{Ũ47nkz74]y~}6o]DYRlskܞ7\hZ@&mvin.OIvI_nEnfQh-:foȿE0WhX`¦=#6:Nyq=fV :hEɗ寵O7*0T E9ΟkևૃW~ў#<=}LYP鸱 T}袙@{8eDdBo"l/73`), 6xb'B'`EWߟyIQ +c%t,9x .Pq3:!dPAB`D. $ Ì`Οr| Jb㽛$\kYi8H!| O΁έOgT~}:_u <:"]p{U/ +gҬnN8kEkF~tpn8ovz CA7~ X/%p M%tDWjPb7eaiada׻ ̟yLe34 ct'r[6tqVFQwojՊ@!BxfCk4yL#] ‡.t{_%&`nԄC( &G/J.| 4zaӻ7-EEL{z]@ߢO=QO_@Q?'~WȪӻ{#5Hn/02+`B ֭6/k_.2 ?w ~S%z+No93,FZtځ }V/pf*#10 hN֟OahNoÌ}76m ,:QWOnA?7d5fTv:SdEM>oXj~$UeiNk ^aP.Hσ>\[2f6 p_ӋYٱf `ˢ´~m9fBEN`N!ͼE7 NYwZ17YߌB3>:!T| /5"j$nZ?G9tn| JR/Q8 3?̿%[;oNkig#`?D,yhB%nfo& .,M}=>y " ﺚYu 28΢sYqzӆb'30Jcf5Y]YwFF>u &>`Ûz#EMgԤZo7  > QU׻!\<}KǗ2H8SWx}I+VZ3Vv5-ߛ_;Z A^@F!L I(-8z3jޚYhf0J6#q7 a7"&^|MWf&c_BL5 8 :-t!!9#a4=mߜ/37]хkj4#P&bb%kFHm5Y|@MM`Nimj'j"pXujbkf c5jӇV쌬9 #W//3ŏ;TGxXD8t/.pc{MK^|Lo&f:_ī-f|+ܨ~4[al6kj="o ֚b6@Bm95vs[NUKFǨ,9:1`Zu9 7뫿͗hU8!*Fi6Ҝ5 ?/,C(5cŦIJcM=OȚӺ"tB8Pkofƒ3טsq9/~0=}ׇ 6,T3 \FqcʨP՟WSR7``T5:/ D=@ЗO5eJs9Q5[! Bc*v8_bgott!6 wfef8$^ߦo QYE'P,:}>18#1B@Cb.Lµ'|FiDԬN*FP0}__M_"@%,MW0mBpMX?Ц>_4O}ʼn'@9&+yI&tp_] a>|WagO@-=*iXDG‚);Q`͟"t"B  KOڿh[}ru:m.vZ?1w\,LƊ`BGMU0 S؅3 DiMU_a ) TB3  E‚@ o *۸+`pLP ZhS@D,DPPpXT4CmB S̢u0:N@LN@PEğ#p}*r hLF%vfq sŇ"P"jXu/>\ c)r0B(]L 4 B *;8-&tA(n@ӄ8A5-%4;R":@ӄA8 W37|#)p^N 27c B`P:/A hoώqaJ@,KeEl :"Ct^jܢ:3jdg[.t[wxԤs) -l[C21~PN 1JVP:׿/p7:<:<:7T mIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qocoa/main.cpp000066400000000000000000000003151260417502300236700ustar00rootroot00000000000000#include #include "gallery.h" int main(int argc, char *argv[]) { QApplication application(argc, argv); Gallery gallery; gallery.show(); return application.exec(); } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qocoa/qbutton.h000066400000000000000000000020521260417502300241050ustar00rootroot00000000000000#ifndef QBUTTON_H #define QBUTTON_H #include #include class QButtonPrivate; class QButton : public QWidget { Q_OBJECT public: // Matches NSBezelStyle enum BezelStyle { Rounded = 1, RegularSquare = 2, Disclosure = 5, ShadowlessSquare = 6, Circular = 7, TexturedSquare = 8, HelpButton = 9, SmallSquare = 10, TexturedRounded = 11, RoundRect = 12, Recessed = 13, RoundedDisclosure = 14, #ifdef MAC_OS_X_VERSION_10_7 Inline = 15 #endif }; explicit QButton(QWidget *parent, BezelStyle bezelStyle = Rounded); public slots: void setText(const QString &text); void setImage(const QPixmap &image); void setChecked(bool checked); public: void setCheckable(bool checkable); bool isChecked(); signals: void clicked(bool checked = false); private: friend class QButtonPrivate; QPointer pimpl; }; #endif // QBUTTON_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qocoa/qbutton_mac.mm000066400000000000000000000155541260417502300251220ustar00rootroot00000000000000/* Copyright (C) 2011 by Mike McQuaid Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "qbutton.h" #include "qocoa_mac.h" #import "Foundation/NSAutoreleasePool.h" #import "AppKit/NSButton.h" #import "AppKit/NSFont.h" class QButtonPrivate : public QObject { public: QButtonPrivate(QButton *qButton, NSButton *nsButton, QButton::BezelStyle bezelStyle) : QObject(qButton), qButton(qButton), nsButton(nsButton) { switch(bezelStyle) { case QButton::Disclosure: case QButton::Circular: case QButton::Inline: case QButton::RoundedDisclosure: case QButton::HelpButton: [nsButton setTitle:@""]; default: break; } NSFont* font = 0; switch(bezelStyle) { case QButton::RoundRect: font = [NSFont fontWithName:@"Lucida Grande" size:12]; break; case QButton::Recessed: font = [NSFont fontWithName:@"Lucida Grande Bold" size:12]; break; #ifdef MAC_OS_X_VERSION_10_7 case QButton::Inline: font = [NSFont boldSystemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]; break; #endif default: font = [NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSRegularControlSize]]; break; } [nsButton setFont:font]; switch(bezelStyle) { case QButton::Rounded: qButton->setMinimumWidth(40); qButton->setFixedHeight(24); qButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed); break; case QButton::RegularSquare: case QButton::TexturedSquare: qButton->setMinimumSize(14, 23); qButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); break; case QButton::ShadowlessSquare: qButton->setMinimumSize(5, 25); qButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); break; case QButton::SmallSquare: qButton->setMinimumSize(4, 21); qButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); break; case QButton::TexturedRounded: qButton->setMinimumSize(10, 22); qButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); break; case QButton::RoundRect: case QButton::Recessed: qButton->setMinimumWidth(16); qButton->setFixedHeight(18); qButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed); break; case QButton::Disclosure: qButton->setMinimumWidth(13); qButton->setFixedHeight(13); qButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed); break; case QButton::Circular: qButton->setMinimumSize(16, 16); qButton->setMaximumHeight(40); qButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); break; case QButton::HelpButton: case QButton::RoundedDisclosure: qButton->setMinimumWidth(22); qButton->setFixedHeight(22); qButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed); break; #ifdef MAC_OS_X_VERSION_10_7 case QButton::Inline: qButton->setMinimumWidth(10); qButton->setFixedHeight(16); qButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed); break; #endif } switch(bezelStyle) { case QButton::Recessed: [nsButton setButtonType:NSPushOnPushOffButton]; case QButton::Disclosure: [nsButton setButtonType:NSOnOffButton]; default: [nsButton setButtonType:NSMomentaryPushInButton]; } [nsButton setBezelStyle:bezelStyle]; } void clicked() { emit qButton->clicked(qButton->isChecked()); } ~QButtonPrivate() { [[nsButton target] release]; [nsButton setTarget:nil]; } QButton *qButton; NSButton *nsButton; }; @interface QButtonTarget : NSObject { @public QPointer pimpl; } -(void)clicked; @end @implementation QButtonTarget -(void)clicked { Q_ASSERT(pimpl); if (pimpl) pimpl->clicked(); } @end QButton::QButton(QWidget *parent, BezelStyle bezelStyle) : QWidget(parent) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSButton *button = [[NSButton alloc] init]; pimpl = new QButtonPrivate(this, button, bezelStyle); QButtonTarget *target = [[QButtonTarget alloc] init]; target->pimpl = pimpl; [button setTarget:target]; [button setAction:@selector(clicked)]; setupLayout(button, this); [button release]; [pool drain]; } void QButton::setText(const QString &text) { Q_ASSERT(pimpl); if (!pimpl) return; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; [pimpl->nsButton setTitle:fromQString(text)]; [pool drain]; } void QButton::setImage(const QPixmap &image) { Q_ASSERT(pimpl); if (pimpl) [pimpl->nsButton setImage:fromQPixmap(image)]; } void QButton::setChecked(bool checked) { Q_ASSERT(pimpl); if (pimpl) [pimpl->nsButton setState:checked]; } void QButton::setCheckable(bool checkable) { const NSInteger cellMask = checkable ? NSChangeBackgroundCellMask : NSNoCellMask; Q_ASSERT(pimpl); if (pimpl) [[pimpl->nsButton cell] setShowsStateBy:cellMask]; } bool QButton::isChecked() { Q_ASSERT(pimpl); if (!pimpl) return false; return [pimpl->nsButton state]; } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qocoa/qbutton_nonmac.cpp000066400000000000000000000047541260417502300260060ustar00rootroot00000000000000/* Copyright (C) 2011 by Mike McQuaid Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "qbutton.h" #include #include #include #include class QButtonPrivate : public QObject { public: QButtonPrivate(QButton *button, QAbstractButton *abstractButton) : QObject(button), abstractButton(abstractButton) {} QPointer abstractButton; }; QButton::QButton(QWidget *parent, BezelStyle) : QWidget(parent) { QAbstractButton *button = 0; if (qobject_cast(parent)) button = new QToolButton(this); else button = new QPushButton(this); connect(button, SIGNAL(clicked()), this, SIGNAL(clicked())); pimpl = new QButtonPrivate(this, button); QVBoxLayout *layout = new QVBoxLayout(this); layout->setMargin(0); layout->addWidget(button); } void QButton::setText(const QString &text) { Q_ASSERT(pimpl); if (pimpl) pimpl->abstractButton->setText(text); } void QButton::setImage(const QPixmap &image) { Q_ASSERT(pimpl); if (pimpl) pimpl->abstractButton->setIcon(image); } void QButton::setChecked(bool checked) { Q_ASSERT(pimpl); if (pimpl) pimpl->abstractButton->setChecked(checked); } void QButton::setCheckable(bool checkable) { Q_ASSERT(pimpl); if (pimpl) pimpl->abstractButton->setCheckable(checkable); } bool QButton::isChecked() { Q_ASSERT(pimpl); if (!pimpl) return false; return pimpl->abstractButton->isChecked(); } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qocoa/qocoa_mac.h000066400000000000000000000036771260417502300243510ustar00rootroot00000000000000/* Copyright (C) 2011 by Mike McQuaid Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include static inline NSString* fromQString(const QString &string) { const QByteArray utf8 = string.toUtf8(); const char* cString = utf8.constData(); return [[NSString alloc] initWithUTF8String:cString]; } static inline QString toQString(NSString *string) { if (!string) return QString(); return QString::fromUtf8([string UTF8String]); } static inline NSImage* fromQPixmap(const QPixmap &pixmap) { CGImageRef cgImage = pixmap.toMacCGImageRef(); return [[NSImage alloc] initWithCGImage:cgImage size:NSZeroSize]; } static inline void setupLayout(void *cocoaView, QWidget *parent) { parent->setAttribute(Qt::WA_NativeWindow); QVBoxLayout *layout = new QVBoxLayout(parent); layout->setMargin(0); layout->addWidget(new QMacCocoaViewContainer(cocoaView, parent)); } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qocoa/qprogressindicatorspinning.h000066400000000000000000000013261260417502300301040ustar00rootroot00000000000000#ifndef QPROGRESSINDICATORSPINNING_H #define QPROGRESSINDICATORSPINNING_H #include #include class QProgressIndicatorSpinningPrivate; class QProgressIndicatorSpinning : public QWidget { Q_OBJECT public: // Matches NSProgressIndicatorThickness enum Thickness { Default = 14, Small = 10, Large = 18, Aqua = 12 }; explicit QProgressIndicatorSpinning(QWidget *parent, Thickness thickness = Default); public slots: void animate(bool animate = true); private: friend class QProgressIndicatorSpinningPrivate; QPointer pimpl; }; #endif // QPROGRESSINDICATORSPINNING_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qocoa/qprogressindicatorspinning_mac.mm000066400000000000000000000045441260417502300311130ustar00rootroot00000000000000/* Copyright (C) 2011 by Mike McQuaid Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "qprogressindicatorspinning.h" #include "qocoa_mac.h" #import "Foundation/NSAutoreleasePool.h" #import "AppKit/NSProgressIndicator.h" class QProgressIndicatorSpinningPrivate : public QObject { public: QProgressIndicatorSpinningPrivate(QProgressIndicatorSpinning *qProgressIndicatorSpinning, NSProgressIndicator *nsProgressIndicator) : QObject(qProgressIndicatorSpinning), nsProgressIndicator(nsProgressIndicator) {} NSProgressIndicator *nsProgressIndicator; }; QProgressIndicatorSpinning::QProgressIndicatorSpinning(QWidget *parent, Thickness thickness) : QWidget(parent) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSProgressIndicator *progress = [[NSProgressIndicator alloc] init]; [progress setStyle:NSProgressIndicatorSpinningStyle]; pimpl = new QProgressIndicatorSpinningPrivate(this, progress); setupLayout(progress, this); setFixedSize(thickness, thickness); [progress release]; [pool drain]; } void QProgressIndicatorSpinning::animate(bool animate) { Q_ASSERT(pimpl); if (!pimpl) return; if (animate) [pimpl->nsProgressIndicator startAnimation:nil]; else [pimpl->nsProgressIndicator stopAnimation:nil]; } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qocoa/qprogressindicatorspinning_nonmac.cpp000066400000000000000000000045241260417502300317750ustar00rootroot00000000000000/* Copyright (C) 2011 by Mike McQuaid Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "qprogressindicatorspinning.h" #include #include #include class QProgressIndicatorSpinningPrivate : public QObject { public: QProgressIndicatorSpinningPrivate(QProgressIndicatorSpinning *qProgressIndicatorSpinning, QMovie *movie) : QObject(qProgressIndicatorSpinning), movie(movie) {} QPointer movie; }; QProgressIndicatorSpinning::QProgressIndicatorSpinning(QWidget *parent, Thickness thickness) : QWidget(parent) { QVBoxLayout *layout = new QVBoxLayout(this); layout->setMargin(0); QSize size(thickness, thickness); QMovie *movie = new QMovie(this); movie->setFileName(":/Qocoa/qprogressindicatorspinning_nonmac.gif"); movie->setScaledSize(size); // Roughly match OSX speed. movie->setSpeed(200); pimpl = new QProgressIndicatorSpinningPrivate(this, movie); QLabel *label = new QLabel(this); label->setMovie(movie); layout->addWidget(label); setFixedSize(size); } void QProgressIndicatorSpinning::animate(bool animate) { Q_ASSERT(pimpl && pimpl->movie); if (!(pimpl && pimpl->movie)) return; if (animate) pimpl->movie->start(); else pimpl->movie->stop(); } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qocoa/qprogressindicatorspinning_nonmac.gif000066400000000000000000000062101260417502300317520ustar00rootroot00000000000000GIF89a Ƅ666VVV似! NETSCAPE2.0!Created with ajaxload.info! , IiabK$F RAT,2S*05//mp!z0;$0C.I*!HC(A@o!39T5\8) `dwxG=Y gwHbvA=0 V\\; ;H0t%HsrY'e$"\#E1CnĎ~J,,AaUw^4I%Pu Q33{0i1TGgwy}%%'R  = 3G%p0 JRo5Ȇ0IĦmykxT_}(^yKs>i_%n=q4e-M¤D! , I)*')Ed]PR A:!zrbw %6"G(d$["JFhaQP`p%†/BFP\cU ?TtW/pG&OtDa_sylD'M q tc b2DM : d% 4%s) uE3 YUtږD$JiM^%o/rvl9'L;99% i9 C "B BDs ^Xf}$P {L?P O4 E咛V$dJ#)pV$! , IiRͧ"Jd] RZN*P*;$P{*N\EА!1UO2D _r6Ib H8 B; "'ZtbK#C'Kw}?Kiz6:xKAC&}9tz\ \D5;x Qd( KW  MBIڈM=ˤs⸽8DaJ`@LG! , IiRͧ"Jd] RZN*P*;$P{*N\EА!1UO2D _r6Ib H8 B; "'ZtbK#C'KGziz68}z~%XK9:0}% tz\Blc LbQ   lj ųKň x(țPX ,ւ|/"! , IiRͧ"Jd] RZN*P*;$P{*N\EА!1UO2D _r6Ib H8 B; "'ZtbK#C'KGziz68}z~%:A/ C} u\ h}b D]=  V)  ڊ9CDK Ku *00StD! , IiRͧ"Jd] RZN*P*;$P{*N\EА!1UO2D _r6Ib H8 B; "'ZtbK#C'KGz z5 C: A/ C}u\ Eh}b6[=Wx&)I9Ԭ@oCT?Kd]B76ЫD! , IiRͧ"Jd] RZN*P*;$P{*N\EА!1UO2D _r6I ƀH03hոaj U {CIkmbK#cK8 {a8nV:/q:M Cu~Ehk6 [_6P.]6!)V! , IiRͧ"Jd]U RZN JjN2sK6 dI)  LHWG 6 KX젱.6d~zhuur/6 X5I;_t O#E {O9V94;VC/ 6Ø~*'MonbX:~]+V*mK_OrKN@.d~qЦDB֋ 5D;clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qocoa/qprogressindicatorspinning_nonmac.qrc000066400000000000000000000001711260417502300317720ustar00rootroot00000000000000 qprogressindicatorspinning_nonmac.gif clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qocoa/qsearchfield.h000066400000000000000000000015751260417502300250540ustar00rootroot00000000000000#ifndef QSEARCHFIELD_H #define QSEARCHFIELD_H #include #include class QSearchFieldPrivate; class QSearchField : public QWidget { Q_OBJECT public: explicit QSearchField(QWidget *parent); QString text() const; QString placeholderText() const; void setFocus(Qt::FocusReason reason); public slots: void setText(const QString &text); void setPlaceholderText(const QString &text); void clear(); void selectAll(); void setFocus(); signals: void textChanged(const QString &text); void editingFinished(); void returnPressed(); protected: void resizeEvent(QResizeEvent*); bool eventFilter(QObject*, QEvent*); private: friend class QSearchFieldPrivate; QPointer pimpl; Q_PROPERTY(QString placeholderText READ placeholderText WRITE setPlaceholderText); }; #endif // QSEARCHFIELD_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qocoa/qsearchfield_mac.mm000066400000000000000000000205001260417502300260430ustar00rootroot00000000000000/* Copyright (C) 2011 by Mike McQuaid Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "qsearchfield.h" #include "qocoa_mac.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSNotification.h" #import "AppKit/NSSearchField.h" #include #include #include class QSearchFieldPrivate : public QObject { public: QSearchFieldPrivate(QSearchField *qSearchField, NSSearchField *nsSearchField) : QObject(qSearchField), qSearchField(qSearchField), nsSearchField(nsSearchField) {} void textDidChange(const QString &text) { if (qSearchField) emit qSearchField->textChanged(text); } void textDidEndEditing() { if (qSearchField) emit qSearchField->editingFinished(); } void returnPressed() { if (qSearchField) { emit qSearchField->returnPressed(); QKeyEvent* event = new QKeyEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier); QApplication::postEvent(qSearchField, event); } } void keyDownPressed() { if (qSearchField) { QKeyEvent* event = new QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier); QApplication::postEvent(qSearchField, event); } } void keyUpPressed() { if (qSearchField) { QKeyEvent* event = new QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier); QApplication::postEvent(qSearchField, event); } } QPointer qSearchField; NSSearchField *nsSearchField; }; @interface QSearchFieldDelegate : NSObject { @public QPointer pimpl; } -(void)controlTextDidChange:(NSNotification*)notification; -(void)controlTextDidEndEditing:(NSNotification*)notification; @end @implementation QSearchFieldDelegate -(void)controlTextDidChange:(NSNotification*)notification { Q_ASSERT(pimpl); if (pimpl) pimpl->textDidChange(toQString([[notification object] stringValue])); } -(BOOL)control: (NSControl *)control textView: (NSTextView *)textView doCommandBySelector: (SEL)commandSelector { Q_ASSERT(pimpl); if (!pimpl) return NO; if (commandSelector == @selector(moveDown:)) { pimpl->keyDownPressed(); return YES; } else if (commandSelector == @selector(moveUp:)) { pimpl->keyUpPressed(); return YES; } return NO; } -(void)controlTextDidEndEditing:(NSNotification*)notification { // No Q_ASSERT here as it is called on destruction. if (!pimpl) return; pimpl->textDidEndEditing(); if ([[[notification userInfo] objectForKey:@"NSTextMovement"] intValue] == NSReturnTextMovement) pimpl->returnPressed(); } @end @interface QocoaSearchField : NSSearchField -(BOOL)performKeyEquivalent:(NSEvent*)event; @end @implementation QocoaSearchField -(BOOL)performKeyEquivalent:(NSEvent*)event { // First, check if we have the focus. // If no, it probably means this event isn't for us. NSResponder* firstResponder = [[NSApp keyWindow] firstResponder]; if ([firstResponder isKindOfClass:[NSText class]] && [(NSText*)firstResponder delegate] == self) { if ([event type] == NSKeyDown && [event modifierFlags] & NSCommandKeyMask) { QString keyString = toQString([event characters]); if (keyString == "a") // Cmd+a { [self performSelector:@selector(selectText:)]; return YES; } else if (keyString == "c") // Cmd+c { QClipboard* clipboard = QApplication::clipboard(); clipboard->setText(toQString([self stringValue])); return YES; } else if (keyString == "v") // Cmd+v { QClipboard* clipboard = QApplication::clipboard(); [self setStringValue:fromQString(clipboard->text())]; return YES; } else if (keyString == "x") // Cmd+x { QClipboard* clipboard = QApplication::clipboard(); clipboard->setText(toQString([self stringValue])); [self setStringValue:@""]; return YES; } } } return NO; } @end QSearchField::QSearchField(QWidget *parent) : QWidget(parent) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSSearchField *search = [[QocoaSearchField alloc] init]; QSearchFieldDelegate *delegate = [[QSearchFieldDelegate alloc] init]; pimpl = delegate->pimpl = new QSearchFieldPrivate(this, search); [search setDelegate:delegate]; setupLayout(search, this); setFixedHeight(24); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); [search release]; [pool drain]; } void QSearchField::setText(const QString &text) { Q_ASSERT(pimpl); if (!pimpl) return; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; [pimpl->nsSearchField setStringValue:fromQString(text)]; if (!text.isEmpty()) { [pimpl->nsSearchField selectText:pimpl->nsSearchField]; [[pimpl->nsSearchField currentEditor] setSelectedRange:NSMakeRange([[pimpl->nsSearchField stringValue] length], 0)]; } [pool drain]; } void QSearchField::setPlaceholderText(const QString &text) { Q_ASSERT(pimpl); if (!pimpl) return; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; [[pimpl->nsSearchField cell] setPlaceholderString:fromQString(text)]; [pool drain]; } QString QSearchField::placeholderText() const { Q_ASSERT(pimpl); NSString* placeholder = [[pimpl->nsSearchField cell] placeholderString]; return toQString(placeholder); } void QSearchField::setFocus(Qt::FocusReason reason) { /* Do nothing: we were previously using makeFirstResponder on search field, but * that resulted in having the text being selected (and I didn't find any way to * deselect it) which would result in the user erasing the first letter he just * typed, after using setText (e.g. if the user typed a letter while having * focus on the playlist, which means we call setText and give focus to the * search bar). * Instead now the focus will take place when calling selectText in setText. * This obviously breaks the purpose of this function, but we never call only * setFocus on a search box in Clementine (i.e. without a call to setText * shortly after). */ // Q_ASSERT(pimpl); // if (!pimpl) // return; // if ([pimpl->nsSearchField acceptsFirstResponder]) { // [[pimpl->nsSearchField window] makeFirstResponder: pimpl->nsSearchField]; // } } void QSearchField::setFocus() { setFocus(Qt::OtherFocusReason); } void QSearchField::clear() { Q_ASSERT(pimpl); if (!pimpl) return; [pimpl->nsSearchField setStringValue:@""]; emit textChanged(QString()); } void QSearchField::selectAll() { Q_ASSERT(pimpl); if (!pimpl) return; [pimpl->nsSearchField performSelector:@selector(selectText:)]; } QString QSearchField::text() const { Q_ASSERT(pimpl); if (!pimpl) return QString(); return toQString([pimpl->nsSearchField stringValue]); } void QSearchField::resizeEvent(QResizeEvent *resizeEvent) { QWidget::resizeEvent(resizeEvent); } bool QSearchField::eventFilter(QObject *o, QEvent *e) { return QWidget::eventFilter(o, e); } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qocoa/qsearchfield_nonmac.cpp000066400000000000000000000132161260417502300267350ustar00rootroot00000000000000/* Copyright (C) 2011 by Mike McQuaid Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "qsearchfield.h" #include "../../src/ui/iconloader.h" #include #include #include #include #include #include #include #include class QSearchFieldPrivate : public QObject { public: QSearchFieldPrivate(QSearchField *searchField, QLineEdit *lineEdit, QToolButton *clearButton) : QObject(searchField), lineEdit(lineEdit), clearButton(clearButton) {} int lineEditFrameWidth() const { return lineEdit->style()->pixelMetric(QStyle::PM_DefaultFrameWidth); } int clearButtonPaddedWidth() const { return clearButton->width() + lineEditFrameWidth() * 2; } int clearButtonPaddedHeight() const { return clearButton->height() + lineEditFrameWidth() * 2; } QPointer lineEdit; QPointer clearButton; }; QSearchField::QSearchField(QWidget *parent) : QWidget(parent) { QLineEdit *lineEdit = new QLineEdit(this); connect(lineEdit, SIGNAL(textChanged(QString)), this, SIGNAL(textChanged(QString))); connect(lineEdit, SIGNAL(editingFinished()), this, SIGNAL(editingFinished())); connect(lineEdit, SIGNAL(returnPressed()), this, SIGNAL(returnPressed())); connect(lineEdit, SIGNAL(textChanged(QString)), this, SLOT(setText(QString))); QIcon clearIcon(IconLoader::Load("edit-clear-locationbar-ltr")); QToolButton *clearButton = new QToolButton(this); clearButton->setIcon(clearIcon); clearButton->setIconSize(QSize(16, 16)); clearButton->setStyleSheet("border: none; padding: 0px;"); clearButton->resize(clearButton->sizeHint()); connect(clearButton, SIGNAL(clicked()), this, SLOT(clear())); pimpl = new QSearchFieldPrivate(this, lineEdit, clearButton); const int frame_width = lineEdit->style()->pixelMetric(QStyle::PM_DefaultFrameWidth); lineEdit->setStyleSheet(QString("QLineEdit { padding-left: %1px; } ").arg(clearButton->width())); const int width = frame_width + qMax(lineEdit->minimumSizeHint().width(), pimpl->clearButtonPaddedWidth()); const int height = frame_width + qMax(lineEdit->minimumSizeHint().height(), pimpl->clearButtonPaddedHeight()); lineEdit->setMinimumSize(width, height); QVBoxLayout *layout = new QVBoxLayout(this); layout->setMargin(0); layout->addWidget(lineEdit); lineEdit->installEventFilter(this); } void QSearchField::setText(const QString &text) { Q_ASSERT(pimpl && pimpl->clearButton && pimpl->lineEdit); if (!(pimpl && pimpl->clearButton && pimpl->lineEdit)) return; if (text != this->text()) pimpl->lineEdit->setText(text); } void QSearchField::setPlaceholderText(const QString &text) { Q_ASSERT(pimpl && pimpl->lineEdit); if (!(pimpl && pimpl->lineEdit)) return; #if QT_VERSION >= 0x040700 pimpl->lineEdit->setPlaceholderText(text); #endif } QString QSearchField::placeholderText() const { #if QT_VERSION >= 0x040700 return pimpl->lineEdit->placeholderText(); #else return QString(); #endif } void QSearchField::setFocus(Qt::FocusReason reason) { Q_ASSERT(pimpl && pimpl->lineEdit); if (pimpl && pimpl->lineEdit) pimpl->lineEdit->setFocus(reason); } void QSearchField::setFocus() { setFocus(Qt::OtherFocusReason); } void QSearchField::clear() { Q_ASSERT(pimpl && pimpl->lineEdit); if (!(pimpl && pimpl->lineEdit)) return; pimpl->lineEdit->clear(); } void QSearchField::selectAll() { Q_ASSERT(pimpl && pimpl->lineEdit); if (!(pimpl && pimpl->lineEdit)) return; pimpl->lineEdit->selectAll(); } QString QSearchField::text() const { Q_ASSERT(pimpl && pimpl->lineEdit); if (!(pimpl && pimpl->lineEdit)) return QString(); return pimpl->lineEdit->text(); } void QSearchField::resizeEvent(QResizeEvent *resizeEvent) { Q_ASSERT(pimpl && pimpl->clearButton && pimpl->lineEdit); if (!(pimpl && pimpl->clearButton && pimpl->lineEdit)) return; QWidget::resizeEvent(resizeEvent); const int x = pimpl->lineEditFrameWidth(); const int y = (height() - pimpl->clearButton->height())/2; pimpl->clearButton->move(x, y); } bool QSearchField::eventFilter(QObject *o, QEvent *e) { if (pimpl && pimpl->lineEdit && o == pimpl->lineEdit) { // Forward some lineEdit events to QSearchField (only those we need for // now, but some might be added later if needed) switch (e->type()) { case QEvent::FocusIn: case QEvent::FocusOut: QApplication::sendEvent(this, e); break; } } return QWidget::eventFilter(o, e); } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qsqlite/000077500000000000000000000000001260417502300226215ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qsqlite/CMakeLists.txt000066400000000000000000000016661260417502300253720ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.6) add_definitions(-DQT_STATICPLUGIN) # Source files set(SQLITE-SOURCES qsql_sqlite.cpp smain.cpp clementinesqlcachedresult.cpp ) # Header files that have Q_OBJECT in set(SQLITE-MOC-HEADERS qsql_sqlite.h ) set(SQLITE-WIN32-RESOURCES qsqlite_resource.rc) qt4_wrap_cpp(SQLITE-SOURCES-MOC ${SQLITE-MOC-HEADERS}) include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) add_definitions(-DQT_PLUGIN -DQT_NO_DEBUG) find_path(SQLITE_INCLUDE_DIRS sqlite3.h) find_library(SQLITE_LIBRARIES sqlite3) if (SQLITE_INCLUDE_DIRS AND SQLITE_LIBRARIES) set(SQLITE_FOUND true) endif() if (NOT SQLITE_FOUND) message(SEND_ERROR "Could not find sqlite3") endif() include_directories(${SQLITE_INCLUDE_DIRS}) add_library(qsqlite STATIC ${SQLITE-SOURCES} ${SQLITE-SOURCES-MOC} ${SQLITE-WIN32-RESOURCES} ) target_link_libraries(qsqlite ${SQLITE_LIBRARIES} ${QT_LIBRARIES} ) clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qsqlite/LICENSE.LGPL000066400000000000000000000643231260417502300243730ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE The Qt GUI Toolkit is Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). Contact: Nokia Corporation (qt-info@nokia.com) You may use, distribute and copy the Qt GUI Toolkit under the terms of GNU Lesser General Public License version 2.1, which is displayed below. ------------------------------------------------------------------------- GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qsqlite/README000066400000000000000000000005141260417502300235010ustar00rootroot00000000000000This is the qsqlite plugin from the Qt SDK. It's built statically on Windows and linked with libclementine. This is so librarybackend.cpp can use QLibrary to load the symbols from sqlite (like sqlite3_create_function) which by default aren't exported from the .dll on windows. See the individual files for licensing information. clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qsqlite/clementinesqlcachedresult.cpp000066400000000000000000000165371260417502300305730ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the QtSql module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage ** This file contains pre-release code and may not be distributed. ** You may use this file in accordance with the terms and conditions ** contained in the Technology Preview License Agreement accompanying ** this package. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** ** ** ** ** ** ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "clementinesqlcachedresult.h" #include #include #include /* ClementineSqlCachedResult is a convenience class for databases that only allow forward only fetching. It will cache all the results so we can iterate backwards over the results again. All you need to do is to inherit from ClementineSqlCachedResult and reimplement gotoNext(). gotoNext() will have a reference to the internal cache and will give you an index where you can start filling in your data. Special case: If the user actually wants a forward-only query, idx will be -1 to indicate that we are not interested in the actual values. */ static const uint initial_cache_size = 128; class ClementineSqlCachedResultPrivate { public: ClementineSqlCachedResultPrivate(); bool canSeek(int i) const; inline int cacheCount() const; void init(int count, bool fo); void cleanup(); int nextIndex(); void revertLast(); ClementineSqlCachedResult::ValueCache cache; int rowCacheEnd; int colCount; bool forwardOnly; bool atEnd; }; ClementineSqlCachedResultPrivate::ClementineSqlCachedResultPrivate(): rowCacheEnd(0), colCount(0), forwardOnly(false), atEnd(false) { } void ClementineSqlCachedResultPrivate::cleanup() { cache.clear(); forwardOnly = false; atEnd = false; colCount = 0; rowCacheEnd = 0; } void ClementineSqlCachedResultPrivate::init(int count, bool fo) { Q_ASSERT(count); cleanup(); forwardOnly = fo; colCount = count; if (fo) { cache.resize(count); rowCacheEnd = count; } else { cache.resize(initial_cache_size * count); } } int ClementineSqlCachedResultPrivate::nextIndex() { if (forwardOnly) return 0; int newIdx = rowCacheEnd; if (newIdx + colCount > cache.size()) cache.resize(qMin(cache.size() * 2, cache.size() + 10000)); rowCacheEnd += colCount; return newIdx; } bool ClementineSqlCachedResultPrivate::canSeek(int i) const { if (forwardOnly || i < 0) return false; return rowCacheEnd >= (i + 1) * colCount; } void ClementineSqlCachedResultPrivate::revertLast() { if (forwardOnly) return; rowCacheEnd -= colCount; } inline int ClementineSqlCachedResultPrivate::cacheCount() const { Q_ASSERT(!forwardOnly); Q_ASSERT(colCount); return rowCacheEnd / colCount; } ////////////// ClementineSqlCachedResult::ClementineSqlCachedResult(const QSqlDriver * db): QSqlResult (db) { d = new ClementineSqlCachedResultPrivate(); } ClementineSqlCachedResult::~ClementineSqlCachedResult() { delete d; } void ClementineSqlCachedResult::init(int colCount) { d->init(colCount, isForwardOnly()); } bool ClementineSqlCachedResult::fetch(int i) { if ((!isActive()) || (i < 0)) return false; if (at() == i) return true; if (d->forwardOnly) { // speed hack - do not copy values if not needed if (at() > i || at() == QSql::AfterLastRow) return false; while(at() < i - 1) { if (!gotoNext(d->cache, -1)) return false; setAt(at() + 1); } if (!gotoNext(d->cache, 0)) return false; setAt(at() + 1); return true; } if (d->canSeek(i)) { setAt(i); return true; } if (d->rowCacheEnd > 0) setAt(d->cacheCount()); while (at() < i + 1) { if (!cacheNext()) { if (d->canSeek(i)) break; return false; } } setAt(i); return true; } bool ClementineSqlCachedResult::fetchNext() { if (d->canSeek(at() + 1)) { setAt(at() + 1); return true; } return cacheNext(); } bool ClementineSqlCachedResult::fetchPrevious() { return fetch(at() - 1); } bool ClementineSqlCachedResult::fetchFirst() { if (d->forwardOnly && at() != QSql::BeforeFirstRow) { return false; } if (d->canSeek(0)) { setAt(0); return true; } return cacheNext(); } bool ClementineSqlCachedResult::fetchLast() { if (d->atEnd) { if (d->forwardOnly) return false; else return fetch(d->cacheCount() - 1); } int i = at(); while (fetchNext()) ++i; /* brute force */ if (d->forwardOnly && at() == QSql::AfterLastRow) { setAt(i); return true; } else { return fetch(i); } } QVariant ClementineSqlCachedResult::data(int i) { int idx = d->forwardOnly ? i : at() * d->colCount + i; if (i >= d->colCount || i < 0 || at() < 0 || idx >= d->rowCacheEnd) return QVariant(); return d->cache.at(idx); } bool ClementineSqlCachedResult::isNull(int i) { int idx = d->forwardOnly ? i : at() * d->colCount + i; if (i > d->colCount || i < 0 || at() < 0 || idx >= d->rowCacheEnd) return true; return d->cache.at(idx).isNull(); } void ClementineSqlCachedResult::cleanup() { setAt(QSql::BeforeFirstRow); setActive(false); d->cleanup(); } void ClementineSqlCachedResult::clearValues() { setAt(QSql::BeforeFirstRow); d->rowCacheEnd = 0; d->atEnd = false; } bool ClementineSqlCachedResult::cacheNext() { if (d->atEnd) return false; if(isForwardOnly()) { d->cache.clear(); d->cache.resize(d->colCount); } if (!gotoNext(d->cache, d->nextIndex())) { d->revertLast(); d->atEnd = true; return false; } setAt(at() + 1); return true; } int ClementineSqlCachedResult::colCount() const { return d->colCount; } ClementineSqlCachedResult::ValueCache &ClementineSqlCachedResult::cache() { return d->cache; } void ClementineSqlCachedResult::virtual_hook(int id, void *data) { switch (id) { case QSqlResult::DetachFromResultSet: case QSqlResult::SetNumericalPrecision: cleanup(); break; default: QSqlResult::virtual_hook(id, data); } } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qsqlite/clementinesqlcachedresult.h000066400000000000000000000045521260417502300302320ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the QtSql module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage ** This file contains pre-release code and may not be distributed. ** You may use this file in accordance with the terms and conditions ** contained in the Technology Preview License Agreement accompanying ** this package. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** ** ** ** ** ** ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef CLEMENTINECACHEDRESULT_P_H #define CLEMENTINECACHEDRESULT_P_H #include class QVariant; template class QVector; class ClementineSqlCachedResultPrivate; class ClementineSqlCachedResult: public QSqlResult { public: virtual ~ClementineSqlCachedResult(); typedef QVector ValueCache; protected: ClementineSqlCachedResult(const QSqlDriver * db); void init(int colCount); void cleanup(); void clearValues(); virtual bool gotoNext(ValueCache &values, int index) = 0; QVariant data(int i); bool isNull(int i); bool fetch(int i); bool fetchNext(); bool fetchPrevious(); bool fetchFirst(); bool fetchLast(); int colCount() const; ValueCache &cache(); void virtual_hook(int id, void *data); private: bool cacheNext(); ClementineSqlCachedResultPrivate *d; }; #endif // CLEMENTINESQLCACHEDRESULT_P_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qsqlite/qsql_sqlite.cpp000066400000000000000000000525201260417502300256720ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the QtSql module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qsql_sqlite.h" #include #include #include #include #include #include #include #include #include #if defined Q_OS_WIN # include #else # include #endif #include Q_DECLARE_METATYPE(sqlite3*) Q_DECLARE_METATYPE(sqlite3_stmt*) QT_BEGIN_NAMESPACE static QString _q_escapeIdentifier(const QString &identifier) { QString res = identifier; if(!identifier.isEmpty() && identifier.left(1) != QString(QLatin1Char('"')) && identifier.right(1) != QString(QLatin1Char('"')) ) { res.replace(QLatin1Char('"'), QLatin1String("\"\"")); res.prepend(QLatin1Char('"')).append(QLatin1Char('"')); res.replace(QLatin1Char('.'), QLatin1String("\".\"")); } return res; } static QVariant::Type qGetColumnType(const QString &tpName) { const QString typeName = tpName.toLower(); if (typeName == QLatin1String("integer") || typeName == QLatin1String("int")) return QVariant::Int; if (typeName == QLatin1String("double") || typeName == QLatin1String("float") || typeName.startsWith(QLatin1String("numeric"))) return QVariant::Double; if (typeName == QLatin1String("blob")) return QVariant::ByteArray; return QVariant::String; } static QSqlError qMakeError(sqlite3 *access, const QString &descr, QSqlError::ErrorType type, int errorCode = -1) { return QSqlError(descr, QString::fromUtf16(static_cast(sqlite3_errmsg16(access))), type, errorCode); } class QSQLiteDriverPrivate { public: inline QSQLiteDriverPrivate() : access(0) {} sqlite3 *access; }; class QSQLiteResultPrivate { public: QSQLiteResultPrivate(QSQLiteResult *res); void cleanup(); bool fetchNext(ClementineSqlCachedResult::ValueCache &values, int idx, bool initialFetch); // initializes the recordInfo and the cache void initColumns(bool emptyResultset); void finalize(); QSQLiteResult* q; sqlite3 *access; sqlite3_stmt *stmt; bool skippedStatus; // the status of the fetchNext() that's skipped bool skipRow; // skip the next fetchNext()? QSqlRecord rInf; QVector firstRow; }; QSQLiteResultPrivate::QSQLiteResultPrivate(QSQLiteResult* res) : q(res), access(0), stmt(0), skippedStatus(false), skipRow(false) { } void QSQLiteResultPrivate::cleanup() { finalize(); rInf.clear(); skippedStatus = false; skipRow = false; q->setAt(QSql::BeforeFirstRow); q->setActive(false); q->cleanup(); } void QSQLiteResultPrivate::finalize() { if (!stmt) return; sqlite3_finalize(stmt); stmt = 0; } void QSQLiteResultPrivate::initColumns(bool emptyResultset) { int nCols = sqlite3_column_count(stmt); if (nCols <= 0) return; q->init(nCols); for (int i = 0; i < nCols; ++i) { QString colName = QString::fromUtf16( static_cast(sqlite3_column_name16(stmt, i)) ).remove(QLatin1Char('"')); // must use typeName for resolving the type to match QSqliteDriver::record QString typeName = QString::fromUtf16( static_cast(sqlite3_column_decltype16(stmt, i))); int dotIdx = colName.lastIndexOf(QLatin1Char('.')); QSqlField fld(colName.mid(dotIdx == -1 ? 0 : dotIdx + 1), qGetColumnType(typeName)); // sqlite3_column_type is documented to have undefined behavior if the result set is empty int stp = emptyResultset ? -1 : sqlite3_column_type(stmt, i); fld.setSqlType(stp); rInf.append(fld); } } bool QSQLiteResultPrivate::fetchNext(ClementineSqlCachedResult::ValueCache &values, int idx, bool initialFetch) { int res; int i; if (skipRow) { // already fetched Q_ASSERT(!initialFetch); skipRow = false; for(int i=0;isetLastError(QSqlError(QCoreApplication::translate("QSQLiteResult", "Unable to fetch row"), QCoreApplication::translate("QSQLiteResult", "No query"), QSqlError::ConnectionError)); q->setAt(QSql::AfterLastRow); return false; } res = sqlite3_step(stmt); switch(res) { case SQLITE_ROW: // check to see if should fill out columns if (rInf.isEmpty()) // must be first call. initColumns(false); if (idx < 0 && !initialFetch) return true; for (i = 0; i < rInf.count(); ++i) { switch (sqlite3_column_type(stmt, i)) { case SQLITE_BLOB: values[i + idx] = QByteArray(static_cast( sqlite3_column_blob(stmt, i)), sqlite3_column_bytes(stmt, i)); break; case SQLITE_INTEGER: values[i + idx] = sqlite3_column_int64(stmt, i); break; case SQLITE_FLOAT: switch(q->numericalPrecisionPolicy()) { case QSql::LowPrecisionInt32: values[i + idx] = sqlite3_column_int(stmt, i); break; case QSql::LowPrecisionInt64: values[i + idx] = sqlite3_column_int64(stmt, i); break; case QSql::LowPrecisionDouble: case QSql::HighPrecision: default: values[i + idx] = sqlite3_column_double(stmt, i); break; }; break; case SQLITE_NULL: values[i + idx] = QVariant(QVariant::String); break; default: values[i + idx] = QString::fromUtf16(static_cast( sqlite3_column_text16(stmt, i)), sqlite3_column_bytes16(stmt, i) / sizeof(ushort)); break; } } return true; case SQLITE_DONE: if (rInf.isEmpty()) // must be first call. initColumns(true); q->setAt(QSql::AfterLastRow); sqlite3_reset(stmt); return false; case SQLITE_ERROR: // SQLITE_ERROR is a generic error code and we must call sqlite3_reset() // to get the specific error message. res = sqlite3_reset(stmt); q->setLastError(qMakeError(access, QCoreApplication::translate("QSQLiteResult", "Unable to fetch row"), QSqlError::ConnectionError, res)); q->setAt(QSql::AfterLastRow); return false; case SQLITE_MISUSE: case SQLITE_BUSY: default: // something wrong, don't get col info, but still return false q->setLastError(qMakeError(access, QCoreApplication::translate("QSQLiteResult", "Unable to fetch row"), QSqlError::ConnectionError, res)); sqlite3_reset(stmt); q->setAt(QSql::AfterLastRow); return false; } return false; } QSQLiteResult::QSQLiteResult(const QSQLiteDriver* db) : ClementineSqlCachedResult(db) { d = new QSQLiteResultPrivate(this); d->access = db->d->access; } QSQLiteResult::~QSQLiteResult() { d->cleanup(); delete d; } void QSQLiteResult::virtual_hook(int id, void *data) { switch (id) { case QSqlResult::DetachFromResultSet: if (d->stmt) sqlite3_reset(d->stmt); break; default: ClementineSqlCachedResult::virtual_hook(id, data); } } bool QSQLiteResult::reset(const QString &query) { if (!prepare(query)) return false; return exec(); } bool QSQLiteResult::prepare(const QString &query) { if (!driver() || !driver()->isOpen() || driver()->isOpenError()) return false; d->cleanup(); setSelect(false); #if (SQLITE_VERSION_NUMBER >= 3003011) int res = sqlite3_prepare16_v2(d->access, query.constData(), (query.size() + 1) * sizeof(QChar), &d->stmt, 0); #else int res = sqlite3_prepare16(d->access, query.constData(), (query.size() + 1) * sizeof(QChar), &d->stmt, 0); #endif if (res != SQLITE_OK) { setLastError(qMakeError(d->access, QCoreApplication::translate("QSQLiteResult", "Unable to execute statement"), QSqlError::StatementError, res)); d->finalize(); return false; } return true; } bool QSQLiteResult::exec() { const QVector values = boundValues(); d->skippedStatus = false; d->skipRow = false; d->rInf.clear(); clearValues(); setLastError(QSqlError()); int res = sqlite3_reset(d->stmt); if (res != SQLITE_OK) { setLastError(qMakeError(d->access, QCoreApplication::translate("QSQLiteResult", "Unable to reset statement"), QSqlError::StatementError, res)); d->finalize(); return false; } int paramCount = sqlite3_bind_parameter_count(d->stmt); if (paramCount == values.count()) { for (int i = 0; i < paramCount; ++i) { res = SQLITE_OK; const QVariant value = values.at(i); if (value.isNull()) { res = sqlite3_bind_null(d->stmt, i + 1); } else { switch (value.type()) { case QVariant::ByteArray: { const QByteArray *ba = static_cast(value.constData()); res = sqlite3_bind_blob(d->stmt, i + 1, ba->constData(), ba->size(), SQLITE_STATIC); break; } case QVariant::Int: res = sqlite3_bind_int(d->stmt, i + 1, value.toInt()); break; case QVariant::Double: res = sqlite3_bind_double(d->stmt, i + 1, value.toDouble()); break; case QVariant::UInt: case QVariant::LongLong: res = sqlite3_bind_int64(d->stmt, i + 1, value.toLongLong()); break; case QVariant::String: { // lifetime of string == lifetime of its qvariant const QString *str = static_cast(value.constData()); res = sqlite3_bind_text16(d->stmt, i + 1, str->utf16(), (str->size()) * sizeof(QChar), SQLITE_STATIC); break; } default: { QString str = value.toString(); // SQLITE_TRANSIENT makes sure that sqlite buffers the data res = sqlite3_bind_text16(d->stmt, i + 1, str.utf16(), (str.size()) * sizeof(QChar), SQLITE_TRANSIENT); break; } } } if (res != SQLITE_OK) { setLastError(qMakeError(d->access, QCoreApplication::translate("QSQLiteResult", "Unable to bind parameters"), QSqlError::StatementError, res)); d->finalize(); return false; } } } else { setLastError(QSqlError(QCoreApplication::translate("QSQLiteResult", "Parameter count mismatch"), QString(), QSqlError::StatementError)); return false; } d->skippedStatus = d->fetchNext(d->firstRow, 0, true); if (lastError().isValid()) { setSelect(false); setActive(false); return false; } setSelect(!d->rInf.isEmpty()); setActive(true); return true; } bool QSQLiteResult::gotoNext(ClementineSqlCachedResult::ValueCache& row, int idx) { return d->fetchNext(row, idx, false); } int QSQLiteResult::size() { return -1; } int QSQLiteResult::numRowsAffected() { return sqlite3_changes(d->access); } QVariant QSQLiteResult::lastInsertId() const { if (isActive()) { qint64 id = sqlite3_last_insert_rowid(d->access); if (id) return id; } return QVariant(); } QSqlRecord QSQLiteResult::record() const { if (!isActive() || !isSelect()) return QSqlRecord(); return d->rInf; } QVariant QSQLiteResult::handle() const { return qVariantFromValue(d->stmt); } ///////////////////////////////////////////////////////// QSQLiteDriver::QSQLiteDriver(QObject * parent) : QSqlDriver(parent) { d = new QSQLiteDriverPrivate(); } QSQLiteDriver::QSQLiteDriver(sqlite3 *connection, QObject *parent) : QSqlDriver(parent) { d = new QSQLiteDriverPrivate(); d->access = connection; setOpen(true); setOpenError(false); } QSQLiteDriver::~QSQLiteDriver() { delete d; } bool QSQLiteDriver::hasFeature(DriverFeature f) const { switch (f) { case BLOB: case Transactions: case Unicode: case LastInsertId: case PreparedQueries: case PositionalPlaceholders: case SimpleLocking: case FinishQuery: case LowPrecisionNumbers: return true; case QuerySize: case NamedPlaceholders: case BatchOperations: case EventNotifications: case MultipleResultSets: return false; } return false; } static int qGetSqliteTimeout(QString opts) { enum { DefaultTimeout = 5000 }; opts.remove(QLatin1Char(' ')); foreach(QString option, opts.split(QLatin1Char(';'))) { if (option.startsWith(QLatin1String("QSQLITE_BUSY_TIMEOUT="))) { bool ok; int nt = option.mid(21).toInt(&ok); if (ok) return nt; } } return DefaultTimeout; } static int qGetSqliteOpenMode(QString opts) { opts.remove(QLatin1Char(' ')); foreach(QString option, opts.split(QLatin1Char(';'))) { if (option == QLatin1String("QSQLITE_OPEN_READONLY")) return SQLITE_OPEN_READONLY; } return SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE; } /* SQLite dbs have no user name, passwords, hosts or ports. just file names. */ bool QSQLiteDriver::open(const QString & db, const QString &, const QString &, const QString &, int, const QString &conOpts) { if (isOpen()) close(); if (db.isEmpty()) return false; if (sqlite3_open_v2(db.toUtf8().constData(), &d->access, qGetSqliteOpenMode(conOpts), NULL) == SQLITE_OK) { sqlite3_busy_timeout(d->access, qGetSqliteTimeout(conOpts)); setOpen(true); setOpenError(false); return true; } else { setLastError(qMakeError(d->access, tr("Error opening database"), QSqlError::ConnectionError)); setOpenError(true); return false; } } void QSQLiteDriver::close() { if (isOpen()) { if (sqlite3_close(d->access) != SQLITE_OK) setLastError(qMakeError(d->access, tr("Error closing database"), QSqlError::ConnectionError)); d->access = 0; setOpen(false); setOpenError(false); } } QSqlResult *QSQLiteDriver::createResult() const { return new QSQLiteResult(this); } bool QSQLiteDriver::beginTransaction() { if (!isOpen() || isOpenError()) return false; QSqlQuery q(createResult()); if (!q.exec(QLatin1String("BEGIN"))) { setLastError(QSqlError(tr("Unable to begin transaction"), q.lastError().databaseText(), QSqlError::TransactionError)); return false; } return true; } bool QSQLiteDriver::commitTransaction() { if (!isOpen() || isOpenError()) return false; QSqlQuery q(createResult()); if (!q.exec(QLatin1String("COMMIT"))) { setLastError(QSqlError(tr("Unable to commit transaction"), q.lastError().databaseText(), QSqlError::TransactionError)); return false; } return true; } bool QSQLiteDriver::rollbackTransaction() { if (!isOpen() || isOpenError()) return false; QSqlQuery q(createResult()); if (!q.exec(QLatin1String("ROLLBACK"))) { setLastError(QSqlError(tr("Unable to rollback transaction"), q.lastError().databaseText(), QSqlError::TransactionError)); return false; } return true; } QStringList QSQLiteDriver::tables(QSql::TableType type) const { QStringList res; if (!isOpen()) return res; QSqlQuery q(createResult()); q.setForwardOnly(true); QString sql = QLatin1String("SELECT name FROM sqlite_master WHERE %1 " "UNION ALL SELECT name FROM sqlite_temp_master WHERE %1"); if ((type & QSql::Tables) && (type & QSql::Views)) sql = sql.arg(QLatin1String("type='table' OR type='view'")); else if (type & QSql::Tables) sql = sql.arg(QLatin1String("type='table'")); else if (type & QSql::Views) sql = sql.arg(QLatin1String("type='view'")); else sql.clear(); if (!sql.isEmpty() && q.exec(sql)) { while(q.next()) res.append(q.value(0).toString()); } if (type & QSql::SystemTables) { // there are no internal tables beside this one: res.append(QLatin1String("sqlite_master")); } return res; } static QSqlIndex qGetTableInfo(QSqlQuery &q, const QString &tableName, bool onlyPIndex = false) { QString schema; QString table(tableName); int indexOfSeparator = tableName.indexOf(QLatin1Char('.')); if (indexOfSeparator > -1) { schema = tableName.left(indexOfSeparator).append(QLatin1Char('.')); table = tableName.mid(indexOfSeparator + 1); } q.exec(QLatin1String("PRAGMA ") + schema + QLatin1String("table_info (") + _q_escapeIdentifier(table) + QLatin1String(")")); QSqlIndex ind; while (q.next()) { bool isPk = q.value(5).toInt(); if (onlyPIndex && !isPk) continue; QString typeName = q.value(2).toString().toLower(); QSqlField fld(q.value(1).toString(), qGetColumnType(typeName)); if (isPk && (typeName == QLatin1String("integer"))) // INTEGER PRIMARY KEY fields are auto-generated in sqlite // INT PRIMARY KEY is not the same as INTEGER PRIMARY KEY! fld.setAutoValue(true); fld.setRequired(q.value(3).toInt() != 0); fld.setDefaultValue(q.value(4)); ind.append(fld); } return ind; } QSqlIndex QSQLiteDriver::primaryIndex(const QString &tblname) const { if (!isOpen()) return QSqlIndex(); QString table = tblname; if (isIdentifierEscaped(table, QSqlDriver::TableName)) table = stripDelimiters(table, QSqlDriver::TableName); QSqlQuery q(createResult()); q.setForwardOnly(true); return qGetTableInfo(q, table, true); } QSqlRecord QSQLiteDriver::record(const QString &tbl) const { if (!isOpen()) return QSqlRecord(); QString table = tbl; if (isIdentifierEscaped(table, QSqlDriver::TableName)) table = stripDelimiters(table, QSqlDriver::TableName); QSqlQuery q(createResult()); q.setForwardOnly(true); return qGetTableInfo(q, table); } QVariant QSQLiteDriver::handle() const { return qVariantFromValue(d->access); } QString QSQLiteDriver::escapeIdentifier(const QString &identifier, IdentifierType type) const { Q_UNUSED(type); return _q_escapeIdentifier(identifier); } QT_END_NAMESPACE clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qsqlite/qsql_sqlite.h000066400000000000000000000076211260417502300253410ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the QtSql module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QSQL_SQLITE_H #define QSQL_SQLITE_H #include #include #include "clementinesqlcachedresult.h" struct sqlite3; #ifdef QT_PLUGIN #define Q_EXPORT_SQLDRIVER_SQLITE #else #define Q_EXPORT_SQLDRIVER_SQLITE Q_SQL_EXPORT #endif QT_BEGIN_HEADER QT_BEGIN_NAMESPACE class QSQLiteDriverPrivate; class QSQLiteResultPrivate; class QSQLiteDriver; class QSQLiteResult : public ClementineSqlCachedResult { friend class QSQLiteDriver; friend class QSQLiteResultPrivate; public: explicit QSQLiteResult(const QSQLiteDriver* db); ~QSQLiteResult(); QVariant handle() const; protected: bool gotoNext(ClementineSqlCachedResult::ValueCache& row, int idx); bool reset(const QString &query); bool prepare(const QString &query); bool exec(); int size(); int numRowsAffected(); QVariant lastInsertId() const; QSqlRecord record() const; void virtual_hook(int id, void *data); private: QSQLiteResultPrivate* d; }; class Q_EXPORT_SQLDRIVER_SQLITE QSQLiteDriver : public QSqlDriver { Q_OBJECT friend class QSQLiteResult; public: explicit QSQLiteDriver(QObject *parent = 0); explicit QSQLiteDriver(sqlite3 *connection, QObject *parent = 0); ~QSQLiteDriver(); bool hasFeature(DriverFeature f) const; bool open(const QString & db, const QString & user, const QString & password, const QString & host, int port, const QString & connOpts); void close(); QSqlResult *createResult() const; bool beginTransaction(); bool commitTransaction(); bool rollbackTransaction(); QStringList tables(QSql::TableType) const; QSqlRecord record(const QString& tablename) const; QSqlIndex primaryIndex(const QString &table) const; QVariant handle() const; QString escapeIdentifier(const QString &identifier, IdentifierType) const; private: QSQLiteDriverPrivate* d; }; QT_END_NAMESPACE QT_END_HEADER #endif // QSQL_SQLITE_H clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qsqlite/qsqlite_resource.rc000066400000000000000000000014121260417502300265360ustar00rootroot00000000000000# if defined(UNDER_CE) # include # else # include # endif VS_VERSION_INFO VERSIONINFO FILEVERSION 4,6,1,0 PRODUCTVERSION 4,6,1,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS VS_FF_DEBUG #else FILEFLAGS 0x0L #endif FILEOS VOS__WINDOWS32 FILETYPE VFT_DLL FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904B0" BEGIN VALUE "CompanyName", "Nokia Corporation and/or its subsidiary(-ies)\0" VALUE "FileDescription", "C++ application development framework.\0" VALUE "FileVersion", "4.6.1.0\0" VALUE "LegalCopyright", "Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)\0" VALUE "OriginalFilename", "qsqlite4.dll\0" VALUE "ProductName", "Qt4\0" END END END /* End of Version info */ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qsqlite/smain.cpp000066400000000000000000000052301260417502300244340ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include "qsql_sqlite.h" QT_BEGIN_NAMESPACE class QSQLiteDriverPlugin : public QSqlDriverPlugin { public: QSQLiteDriverPlugin(); QSqlDriver* create(const QString &); QStringList keys() const; }; QSQLiteDriverPlugin::QSQLiteDriverPlugin() : QSqlDriverPlugin() { } QSqlDriver* QSQLiteDriverPlugin::create(const QString &name) { if (name == QLatin1String("QSQLITE")) { QSQLiteDriver* driver = new QSQLiteDriver(); return driver; } return 0; } QStringList QSQLiteDriverPlugin::keys() const { QStringList l; l << QLatin1String("QSQLITE"); return l; } Q_EXPORT_STATIC_PLUGIN(QSQLiteDriverPlugin) Q_EXPORT_PLUGIN2(qsqlite, QSQLiteDriverPlugin) QT_END_NAMESPACE clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qsqlite/smain.patch000066400000000000000000000004441260417502300247530ustar00rootroot00000000000000--- smain.cpp.old 2010-03-22 17:34:03.000000000 +0000 +++ smain.cpp 2010-03-22 17:34:08.000000000 +0000 @@ -41,7 +41,7 @@ #include #include -#include "../../../../src/sql/drivers/sqlite/qsql_sqlite.h" +#include "qsql_sqlite.h" QT_BEGIN_NAMESPACE clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qtiocompressor/000077500000000000000000000000001260417502300242305ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qtiocompressor/CMakeLists.txt000066400000000000000000000004611260417502300267710ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.6) set(IOCOMPRESSOR-SOURCES qtiocompressor.cpp ) set(IOCOMPRESSOR-MOC-HEADERS qtiocompressor.h ) QT4_WRAP_CPP(IOCOMPRESSOR-SOURCES-MOC ${IOCOMPRESSOR-MOC-HEADERS}) ADD_LIBRARY(qtiocompressor STATIC ${IOCOMPRESSOR-SOURCES} ${IOCOMPRESSOR-SOURCES-MOC} ) clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qtiocompressor/LGPL_EXCEPTION.txt000066400000000000000000000021661260417502300271520ustar00rootroot00000000000000Nokia Qt LGPL Exception version 1.1 As an additional permission to the GNU Lesser General Public License version 2.1, the object code form of a "work that uses the Library" may incorporate material from a header file that is part of the Library. You may distribute such object code under terms of your choice, provided that: (i) the header files of the Library have not been modified; and (ii) the incorporated material is limited to numerical parameters, data structure layouts, accessors, macros, inline functions and templates; and (iii) you comply with the terms of Section 6 of the GNU Lesser General Public License version 2.1. Moreover, you may apply this exception to a modified version of the Library, provided that such modification does not involve copying material from the Library into the modified Library?s header files unless such material is limited to (i) numerical parameters; (ii) data structure layouts; (iii) accessors; and (iv) small macros, templates and inline functions of five lines or less in length. Furthermore, you are not required to apply this additional permission to a modified version of the Library. clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qtiocompressor/LICENSE.GPL3000066400000000000000000001045131260417502300257450ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qtiocompressor/QtIOCompressor000066400000000000000000000000341260417502300270410ustar00rootroot00000000000000#include "qtiocompressor.h" clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qtiocompressor/qtiocompressor.cpp000066400000000000000000000507041260417502300300330ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of a Qt Solutions component. ** ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Solutions Commercial License Agreement provided ** with the Software or, alternatively, in accordance with the terms ** contained in a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** Please note Third Party Software included with Qt Solutions may impose ** additional restrictions and it is the user's responsibility to ensure ** that they have met the licensing requirements of the GPL, LGPL, or Qt ** Solutions Commercial license and the relevant license of the Third ** Party Software they are using. ** ** If you are unsure which license is appropriate for your use, please ** contact Nokia at qt-info@nokia.com. ** ****************************************************************************/ #include "qtiocompressor.h" #include "zlib.h" #include typedef Bytef ZlibByte; typedef uInt ZlibSize; class QtIOCompressorPrivate { QtIOCompressor *q_ptr; Q_DECLARE_PUBLIC(QtIOCompressor) public: enum State { // Read state NotReadFirstByte, InStream, EndOfStream, // Write state NoBytesWritten, BytesWritten, // Common Closed, Error }; QtIOCompressorPrivate(QtIOCompressor *q_ptr, QIODevice *device, int compressionLevel, int bufferSize); ~QtIOCompressorPrivate(); void flushZlib(int flushMode); bool writeBytes(ZlibByte *buffer, ZlibSize outputSize); void setZlibError(const QString &erroMessage, int zlibErrorCode); QIODevice *device; bool manageDevice; z_stream zlibStream; const int compressionLevel; const ZlibSize bufferSize; ZlibByte *buffer; State state; QtIOCompressor::StreamFormat streamFormat; }; /*! \internal */ QtIOCompressorPrivate::QtIOCompressorPrivate(QtIOCompressor *q_ptr, QIODevice *device, int compressionLevel, int bufferSize) :q_ptr(q_ptr) ,device(device) ,compressionLevel(compressionLevel) ,bufferSize(bufferSize) ,buffer(new ZlibByte[bufferSize]) ,state(Closed) ,streamFormat(QtIOCompressor::ZlibFormat) { // Use default zlib memory management. zlibStream.zalloc = Z_NULL; zlibStream.zfree = Z_NULL; zlibStream.opaque = Z_NULL; } /*! \internal */ QtIOCompressorPrivate::~QtIOCompressorPrivate() { delete[] buffer; } /*! \internal Flushes the zlib stream. */ void QtIOCompressorPrivate::flushZlib(int flushMode) { // No input. zlibStream.next_in = 0; zlibStream.avail_in = 0; int status; do { zlibStream.next_out = buffer; zlibStream.avail_out = bufferSize; status = deflate(&zlibStream, flushMode); if (status != Z_OK && status != Z_STREAM_END) { state = QtIOCompressorPrivate::Error; setZlibError(QT_TRANSLATE_NOOP("QtIOCompressor", "Internal zlib error when compressing: "), status); return; } ZlibSize outputSize = bufferSize - zlibStream.avail_out; // Try to write data from the buffer to to the underlying device, return on failure. if (!writeBytes(buffer, outputSize)) return; // If the mode is Z_FNISH we must loop until we get Z_STREAM_END, // else we loop as long as zlib is able to fill the output buffer. } while ((flushMode == Z_FINISH && status != Z_STREAM_END) || (flushMode != Z_FINISH && zlibStream.avail_out == 0)); if (flushMode == Z_FINISH) Q_ASSERT(status == Z_STREAM_END); else Q_ASSERT(status == Z_OK); } /*! \internal Writes outputSize bytes from buffer to the inderlying device. */ bool QtIOCompressorPrivate::writeBytes(ZlibByte *buffer, ZlibSize outputSize) { Q_Q(QtIOCompressor); ZlibSize totalBytesWritten = 0; // Loop until all bytes are written to the underlying device. do { const qint64 bytesWritten = device->write(reinterpret_cast(buffer), outputSize); if (bytesWritten == -1) { q->setErrorString(QT_TRANSLATE_NOOP("QtIOCompressor", "Error writing to underlying device: ") + device->errorString()); return false; } totalBytesWritten += bytesWritten; } while (totalBytesWritten != outputSize); // put up a flag so that the device will be flushed on close. state = BytesWritten; return true; } /*! \internal Sets the error string to errorMessage + zlib error string for zlibErrorCode */ void QtIOCompressorPrivate::setZlibError(const QString &errorMessage, int zlibErrorCode) { Q_Q(QtIOCompressor); // Watch out, zlibErrorString may be null. const char * const zlibErrorString = zError(zlibErrorCode); QString errorString; if (zlibErrorString) errorString = errorMessage + zlibErrorString; else errorString = errorMessage + " Unknown error, code " + QString::number(zlibErrorCode); q->setErrorString(errorString); } /*! \class QtIOCompressor \brief The QtIOCompressor class is a QIODevice that compresses data streams. A QtIOCompressor object is constructed with a pointer to an underlying QIODevice. Data written to the QtIOCompressor object will be compressed before it is written to the underlying QIODevice. Similary, if you read from the QtIOCompressor object, the data will be read from the underlying device and then decompressed. QtIOCompressor is a sequential device, which means that it does not support seeks or random access. Internally, QtIOCompressor uses the zlib library to compress and uncompress data. Usage examples: Writing compressed data to a file: \code QFile file("foo"); QtIOCompressor compressor(&file); compressor.open(QIODevice::WriteOnly); compressor.write(QByteArray() << "The quick brown fox"); compressor.close(); \endcode Reading compressed data from a file: \code QFile file("foo"); QtIOCompressor compressor(&file); compressor.open(QIODevice::ReadOnly); const QByteArray text = compressor.readAll(); compressor.close(); \endcode QtIOCompressor can also read and write compressed data in different compressed formats, ref. StreamFormat. Use setStreamFormat() before open() to select format. */ /*! \enum QtIOCompressor::StreamFormat This enum specifies which stream format to use. \value ZlibFormat: This is the default and has the smallest overhead. \value GzipFormat: This format is compatible with the gzip file format, but has more overhead than ZlibFormat. Note: requires zlib version 1.2.x or higher at runtime. \value RawZipFormat: This is compatible with the most common compression method of the data blocks contained in ZIP archives. Note: ZIP file headers are not read or generated, so setting this format, by itself, does not let QtIOCompressor read or write ZIP files. Ref. the ziplist example program. \sa setStreamFormat() */ /*! Constructs a QtIOCompressor using the given \a device as the underlying device. The allowed value range for \a compressionLevel is 0 to 9, where 0 means no compression and 9 means maximum compression. The default value is 6. \a bufferSize specifies the size of the internal buffer used when reading from and writing to the underlying device. The default value is 65KB. Using a larger value allows for faster compression and deompression at the expense of memory usage. */ QtIOCompressor::QtIOCompressor(QIODevice *device, int compressionLevel, int bufferSize) :d_ptr(new QtIOCompressorPrivate(this, device, compressionLevel, bufferSize)) {} /*! Destroys the QtIOCompressor, closing it if neccesary. */ QtIOCompressor::~QtIOCompressor() { Q_D(QtIOCompressor); close(); delete d; } /*! Sets the format on the compressed stream to \a format. \sa QtIOCompressor::StreamFormat */ void QtIOCompressor::setStreamFormat(StreamFormat format) { Q_D(QtIOCompressor); // Print a waning if the compile-time version of zlib does not support gzip. if (format == GzipFormat && checkGzipSupport(ZLIB_VERSION) == false) qWarning("QtIOCompressor::setStreamFormat: zlib 1.2.x or higher is " "required to use the gzip format. Current version is: %s", ZLIB_VERSION); d->streamFormat = format; } /*! Returns the format set on the compressed stream. \sa QtIOCompressor::StreamFormat */ QtIOCompressor::StreamFormat QtIOCompressor::streamFormat() const { Q_D(const QtIOCompressor); return d->streamFormat; } /*! Returns true if the zlib library in use supports the gzip format, false otherwise. */ bool QtIOCompressor::isGzipSupported() { return checkGzipSupport(zlibVersion()); } /*! \reimp */ bool QtIOCompressor::isSequential() const { return true; } /*! Opens the QtIOCompressor in \a mode. Only ReadOnly and WriteOnly is supported. This functon will return false if you try to open in other modes. If the underlying device is not opened, this function will open it in a suitable mode. If this happens the device will also be closed when close() is called. If the underlying device is already opened, its openmode must be compatable with \a mode. Returns true on success, false on error. \sa close() */ bool QtIOCompressor::open(OpenMode mode) { Q_D(QtIOCompressor); if (isOpen()) { qWarning("QtIOCompressor::open: device already open"); return false; } // Check for correct mode: ReadOnly xor WriteOnly const bool read = (bool)(mode & ReadOnly); const bool write = (bool)(mode & WriteOnly); const bool both = (read && write); const bool neither = !(read || write); if (both || neither) { qWarning("QtIOCompressor::open: QtIOCompressor can only be opened in the ReadOnly or WriteOnly modes"); return false; } // If the underlying device is open, check that is it opened in a compatible mode. if (d->device->isOpen()) { d->manageDevice = false; const OpenMode deviceMode = d->device->openMode(); if (read && !(deviceMode & ReadOnly)) { qWarning("QtIOCompressor::open: underlying device must be open in one of the ReadOnly or WriteOnly modes"); return false; } else if (write && !(deviceMode & WriteOnly)) { qWarning("QtIOCompressor::open: underlying device must be open in one of the ReadOnly or WriteOnly modes"); return false; } // If the underlying device is closed, open it. } else { d->manageDevice = true; if (d->device->open(mode) == false) { setErrorString(QT_TRANSLATE_NOOP("QtIOCompressor", "Error opening underlying device: ") + d->device->errorString()); return false; } } // Initialize zlib for deflating or inflating. // The second argument to inflate/deflateInit2 is the windowBits parameter, // which also controls what kind of compression stream headers to use. // The default value for this is 15. Passing a value greater than 15 // enables gzip headers and then subtracts 16 form the windowBits value. // (So passing 31 gives gzip headers and 15 windowBits). Passing a negative // value selects no headers hand then negates the windowBits argument. int windowBits; switch (d->streamFormat) { case QtIOCompressor::GzipFormat: windowBits = 31; break; case QtIOCompressor::RawZipFormat: windowBits = -15; break; default: windowBits = 15; } int status; if (read) { d->state = QtIOCompressorPrivate::NotReadFirstByte; d->zlibStream.avail_in = 0; d->zlibStream.next_in = 0; if (d->streamFormat == QtIOCompressor::ZlibFormat) { status = inflateInit(&d->zlibStream); } else { if (checkGzipSupport(zlibVersion()) == false) { setErrorString(QT_TRANSLATE_NOOP("QtIOCompressor::open", "The gzip format not supported in this version of zlib.")); return false; } status = inflateInit2(&d->zlibStream, windowBits); } } else { d->state = QtIOCompressorPrivate::NoBytesWritten; if (d->streamFormat == QtIOCompressor::ZlibFormat) status = deflateInit(&d->zlibStream, d->compressionLevel); else status = deflateInit2(&d->zlibStream, d->compressionLevel, Z_DEFLATED, windowBits, 8, Z_DEFAULT_STRATEGY); } // Handle error. if (status != Z_OK) { d->setZlibError(QT_TRANSLATE_NOOP("QtIOCompressor::open", "Internal zlib error: "), status); return false; } return QIODevice::open(mode); } /*! Closes the QtIOCompressor, and also the underlying device if it was opened by QtIOCompressor. \sa open() */ void QtIOCompressor::close() { Q_D(QtIOCompressor); if (isOpen() == false) return; // Flush and close the zlib stream. if (openMode() & ReadOnly) { d->state = QtIOCompressorPrivate::NotReadFirstByte; inflateEnd(&d->zlibStream); } else { if (d->state == QtIOCompressorPrivate::BytesWritten) { // Only flush if we have written anything. d->state = QtIOCompressorPrivate::NoBytesWritten; d->flushZlib(Z_FINISH); } deflateEnd(&d->zlibStream); } // Close the underlying device if we are managing it. if (d->manageDevice) d->device->close(); QIODevice::close(); } /*! Flushes the internal buffer. Each time you call flush, all data written to the QtIOCompressor is compressed and written to the underlying device. Calling this function can reduce the compression ratio. The underlying device is not flushed. Calling this function when QtIOCompressor is in ReadOnly mode has no effect. */ void QtIOCompressor::flush() { Q_D(QtIOCompressor); if (isOpen() == false || openMode() & ReadOnly) return; d->flushZlib(Z_SYNC_FLUSH); } /*! Returns 1 if there might be data available for reading, or 0 if there is no data available. There is unfortunately no way of knowing how much data there is available when dealing with compressed streams. Also, since the remaining compressed data might be a part of the meta-data that ends the compressed stream (and therefore will yield no uncompressed data), you cannot assume that a read after getting a 1 from this function will return data. */ qint64 QtIOCompressor::bytesAvailable() const { Q_D(const QtIOCompressor); if ((openMode() & ReadOnly) == false) return 0; int numBytes = 0; switch (d->state) { case QtIOCompressorPrivate::NotReadFirstByte: numBytes = d->device->bytesAvailable(); break; case QtIOCompressorPrivate::InStream: numBytes = 1; break; case QtIOCompressorPrivate::EndOfStream: case QtIOCompressorPrivate::Error: default: numBytes = 0; break; }; numBytes += QIODevice::bytesAvailable(); if (numBytes > 0) return 1; else return 0; } /*! \internal Reads and decompresses data from the underlying device. */ qint64 QtIOCompressor::readData(char *data, qint64 maxSize) { Q_D(QtIOCompressor); if (d->state == QtIOCompressorPrivate::EndOfStream) return 0; if (d->state == QtIOCompressorPrivate::Error) return -1; // We are ging to try to fill the data buffer d->zlibStream.next_out = reinterpret_cast(data); d->zlibStream.avail_out = maxSize; int status; do { // Read data if if the input buffer is empty. There could be data in the buffer // from a previous readData call. if (d->zlibStream.avail_in == 0) { qint64 bytesAvalible = d->device->read(reinterpret_cast(d->buffer), d->bufferSize); d->zlibStream.next_in = d->buffer; d->zlibStream.avail_in = bytesAvalible; if (bytesAvalible == -1) { d->state = QtIOCompressorPrivate::Error; setErrorString(QT_TRANSLATE_NOOP("QtIOCompressor", "Error reading data from underlying device: ") + d->device->errorString()); return -1; } if (d->state != QtIOCompressorPrivate::InStream) { // If we are not in a stream and get 0 bytes, we are probably trying to read from an empty device. if(bytesAvalible == 0) return 0; else if (bytesAvalible > 0) d->state = QtIOCompressorPrivate::InStream; } } // Decompress. status = inflate(&d->zlibStream, Z_SYNC_FLUSH); switch (status) { case Z_NEED_DICT: case Z_DATA_ERROR: case Z_MEM_ERROR: d->state = QtIOCompressorPrivate::Error; d->setZlibError(QT_TRANSLATE_NOOP("QtIOCompressor", "Internal zlib error when decompressing: "), status); return -1; case Z_BUF_ERROR: // No more input and zlib can not privide more output - Not an error, we can try to read again when we have more input. return 0; break; } // Loop util data buffer is full or we reach the end of the input stream. } while (d->zlibStream.avail_out != 0 && status != Z_STREAM_END); if (status == Z_STREAM_END) { d->state = QtIOCompressorPrivate::EndOfStream; // Unget any data left in the read buffer. for (int i = d->zlibStream.avail_in; i >= 0; --i) d->device->ungetChar(*reinterpret_cast(d->zlibStream.next_in + i)); } const ZlibSize outputSize = maxSize - d->zlibStream.avail_out; return outputSize; } /*! \internal Compresses and writes data to the underlying device. */ qint64 QtIOCompressor::writeData(const char *data, qint64 maxSize) { if (maxSize < 1) return 0; Q_D(QtIOCompressor); d->zlibStream.next_in = reinterpret_cast(const_cast(data)); d->zlibStream.avail_in = maxSize; if (d->state == QtIOCompressorPrivate::Error) return -1; do { d->zlibStream.next_out = d->buffer; d->zlibStream.avail_out = d->bufferSize; const int status = deflate(&d->zlibStream, Z_NO_FLUSH); if (status != Z_OK) { d->state = QtIOCompressorPrivate::Error; d->setZlibError(QT_TRANSLATE_NOOP("QtIOCompressor", "Internal zlib error when compressing: "), status); return -1; } ZlibSize outputSize = d->bufferSize - d->zlibStream.avail_out; // Try to write data from the buffer to to the underlying device, return -1 on failure. if (d->writeBytes(d->buffer, outputSize) == false) return -1; } while (d->zlibStream.avail_out == 0); // run until output is not full. Q_ASSERT(d->zlibStream.avail_in == 0); return maxSize; } /* \internal Checks if the run-time zlib version is 1.2.x or higher. */ bool QtIOCompressor::checkGzipSupport(const char * const versionString) { if (strlen(versionString) < 3) return false; if (versionString[0] == '0' || (versionString[0] == '1' && (versionString[2] == '0' || versionString[2] == '1' ))) return false; return true; } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qtiocompressor/qtiocompressor.h000066400000000000000000000071631260417502300275010ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of a Qt Solutions component. ** ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Solutions Commercial License Agreement provided ** with the Software or, alternatively, in accordance with the terms ** contained in a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** Please note Third Party Software included with Qt Solutions may impose ** additional restrictions and it is the user's responsibility to ensure ** that they have met the licensing requirements of the GPL, LGPL, or Qt ** Solutions Commercial license and the relevant license of the Third ** Party Software they are using. ** ** If you are unsure which license is appropriate for your use, please ** contact Nokia at qt-info@nokia.com. ** ****************************************************************************/ #ifndef QTIOCOMPRESSOR_H #define QTIOCOMPRESSOR_H #include #if defined(Q_WS_WIN) # if !defined(QT_QTIOCOMPRESSOR_EXPORT) && !defined(QT_QTIOCOMPRESSOR_IMPORT) # define QT_QTIOCOMPRESSOR_EXPORT # elif defined(QT_QTIOCOMPRESSOR_IMPORT) # if defined(QT_QTIOCOMPRESSOR_EXPORT) # undef QT_QTIOCOMPRESSOR_EXPORT # endif # define QT_QTIOCOMPRESSOR_EXPORT __declspec(dllimport) # elif defined(QT_QTIOCOMPRESSOR_EXPORT) # undef QT_QTIOCOMPRESSOR_EXPORT # define QT_QTIOCOMPRESSOR_EXPORT __declspec(dllexport) # endif #else # define QT_QTIOCOMPRESSOR_EXPORT #endif class QtIOCompressorPrivate; class QT_QTIOCOMPRESSOR_EXPORT QtIOCompressor : public QIODevice { Q_OBJECT public: enum StreamFormat { ZlibFormat, GzipFormat, RawZipFormat }; QtIOCompressor(QIODevice *device, int compressionLevel = 6, int bufferSize = 65500); ~QtIOCompressor(); void setStreamFormat(StreamFormat format); StreamFormat streamFormat() const; static bool isGzipSupported(); bool isSequential() const; bool open(OpenMode mode); void close(); void flush(); qint64 bytesAvailable() const; protected: qint64 readData(char * data, qint64 maxSize); qint64 writeData(const char * data, qint64 maxSize); private: static bool checkGzipSupport(const char * const versionString); QtIOCompressorPrivate *d_ptr; Q_DECLARE_PRIVATE(QtIOCompressor) Q_DISABLE_COPY(QtIOCompressor) }; #endif clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qtsingleapplication/000077500000000000000000000000001260417502300252115ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qtsingleapplication/CMakeLists.txt000066400000000000000000000011241260417502300277470ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.6) set(SINGLEAPP-SOURCES qtlocalpeer.cpp qtlockedfile.cpp qtsingleapplication.cpp qtsinglecoreapplication.cpp ) set(SINGLEAPP-MOC-HEADERS qtlocalpeer.h qtsingleapplication.h qtsinglecoreapplication.h ) if(WIN32) set(SINGLEAPP-SOURCES ${SINGLEAPP-SOURCES} qtlockedfile_win.cpp) elseif(WIN32) set(SINGLEAPP-SOURCES ${SINGLEAPP-SOURCES} qtlockedfile_unix.cpp) endif(WIN32) QT4_WRAP_CPP(SINGLEAPP-SOURCES-MOC ${SINGLEAPP-MOC-HEADERS}) ADD_LIBRARY(qtsingleapplication STATIC ${SINGLEAPP-SOURCES} ${SINGLEAPP-SOURCES-MOC} ) clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qtsingleapplication/LICENSE.LGPL000066400000000000000000000635041260417502300267630ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qtsingleapplication/QtLockedFile000066400000000000000000000000321260417502300274350ustar00rootroot00000000000000#include "qtlockedfile.h" clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qtsingleapplication/QtSingleApplication000066400000000000000000000000411260417502300310410ustar00rootroot00000000000000#include "qtsingleapplication.h" clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qtsingleapplication/qtlocalpeer.cpp000066400000000000000000000157031260417502300302360ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of a Qt Solutions component. ** ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Solutions Commercial License Agreement provided ** with the Software or, alternatively, in accordance with the terms ** contained in a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** Please note Third Party Software included with Qt Solutions may impose ** additional restrictions and it is the user's responsibility to ensure ** that they have met the licensing requirements of the GPL, LGPL, or Qt ** Solutions Commercial license and the relevant license of the Third ** Party Software they are using. ** ** If you are unsure which license is appropriate for your use, please ** contact Nokia at qt-info@nokia.com. ** ****************************************************************************/ #include "qtlocalpeer.h" #include #include #include #if defined(Q_OS_WIN) #include #include typedef BOOL(WINAPI*PProcessIdToSessionId)(DWORD,DWORD*); static PProcessIdToSessionId pProcessIdToSessionId = 0; #endif #if defined(Q_OS_UNIX) #include #endif #include "qtlockedfile.cpp" #if defined(Q_OS_WIN) #include "qtlockedfile_win.cpp" #else #include "qtlockedfile_unix.cpp" #endif const char* QtLocalPeer::ack = "ack"; QtLocalPeer::QtLocalPeer(QObject* parent, const QString &appId) : QObject(parent), id(appId) { QString prefix = id; if (id.isEmpty()) { id = QCoreApplication::applicationFilePath(); #if defined(Q_OS_WIN) id = id.toLower(); #endif prefix = id.section(QLatin1Char('/'), -1); } prefix.remove(QRegExp("[^a-zA-Z]")); prefix.truncate(6); QByteArray idc = id.toUtf8(); quint16 idNum = qChecksum(idc.constData(), idc.size()); socketName = QLatin1String("qtsingleapp-") + prefix + QLatin1Char('-') + QString::number(idNum, 16); #if defined(Q_OS_WIN) if (!pProcessIdToSessionId) { QLibrary lib("kernel32"); pProcessIdToSessionId = (PProcessIdToSessionId)lib.resolve("ProcessIdToSessionId"); } if (pProcessIdToSessionId) { DWORD sessionId = 0; pProcessIdToSessionId(GetCurrentProcessId(), &sessionId); socketName += QLatin1Char('-') + QString::number(sessionId, 16); } #else socketName += QLatin1Char('-') + QString::number(::getuid(), 16); #endif server = new QLocalServer(this); QString lockName = QDir(QDir::tempPath()).absolutePath() + QLatin1Char('/') + socketName + QLatin1String("-lockfile"); lockFile.setFileName(lockName); lockFileCreated = !lockFile.exists(); lockFile.open(QIODevice::ReadWrite); } bool QtLocalPeer::isClient() { if (lockFile.isLocked()) return false; if (!lockFile.lock(QtLockedFile::WriteLock, false)) return true; bool res = server->listen(socketName); #if defined(Q_OS_UNIX) && (QT_VERSION >= QT_VERSION_CHECK(4,5,0)) // ### Workaround if (!res && server->serverError() == QAbstractSocket::AddressInUseError) { QFile::remove(QDir::cleanPath(QDir::tempPath())+QLatin1Char('/')+socketName); res = server->listen(socketName); } #endif if (!res) qWarning("QtSingleCoreApplication: listen on local socket failed, %s", qPrintable(server->errorString())); QObject::connect(server, SIGNAL(newConnection()), SLOT(receiveConnection())); return false; } bool QtLocalPeer::sendMessage(const QString &message, int timeout) { return sendMessage(message.toUtf8(), timeout); } bool QtLocalPeer::sendMessage(const char* message, int timeout) { return sendMessage(QByteArray(message), timeout); } bool QtLocalPeer::sendMessage(const QByteArray &message, int timeout) { if (!isClient()) return false; QLocalSocket socket; bool connOk = false; for(int i = 0; i < 2; i++) { // Try twice, in case the other instance is just starting up socket.connectToServer(socketName); connOk = socket.waitForConnected(timeout/2); if (connOk || i) break; int ms = 250; #if defined(Q_OS_WIN) Sleep(DWORD(ms)); #else struct timespec ts = { ms / 1000, (ms % 1000) * 1000 * 1000 }; nanosleep(&ts, NULL); #endif } if (!connOk) return false; QDataStream ds(&socket); ds.writeBytes(message.constData(), message.size()); bool res = socket.waitForBytesWritten(timeout); res &= socket.waitForReadyRead(timeout); // wait for ack res &= (socket.read(qstrlen(ack)) == ack); return res; } void QtLocalPeer::receiveConnection() { QLocalSocket* socket = server->nextPendingConnection(); if (!socket) return; while (socket->bytesAvailable() < (int)sizeof(quint32)) socket->waitForReadyRead(); QDataStream ds(socket); QByteArray uMsg; quint32 remaining; ds >> remaining; uMsg.resize(remaining); int got = 0; char* uMsgBuf = uMsg.data(); do { got = ds.readRawData(uMsgBuf, remaining); remaining -= got; uMsgBuf += got; } while (remaining && got >= 0 && socket->waitForReadyRead(2000)); if (got < 0) { qWarning() << "QtLocalPeer: Message reception failed" << socket->errorString(); delete socket; return; } socket->write(ack, qstrlen(ack)); socket->waitForBytesWritten(1000); delete socket; emit messageReceived(uMsg); //### (might take a long time to return) emit messageReceived(QString::fromUtf8(uMsg)); } QtLocalPeer::~QtLocalPeer () { if (lockFileCreated) lockFile.remove(); } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qtsingleapplication/qtlocalpeer.h000066400000000000000000000061221260417502300276760ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of a Qt Solutions component. ** ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Solutions Commercial License Agreement provided ** with the Software or, alternatively, in accordance with the terms ** contained in a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** Please note Third Party Software included with Qt Solutions may impose ** additional restrictions and it is the user's responsibility to ensure ** that they have met the licensing requirements of the GPL, LGPL, or Qt ** Solutions Commercial license and the relevant license of the Third ** Party Software they are using. ** ** If you are unsure which license is appropriate for your use, please ** contact Nokia at qt-info@nokia.com. ** ****************************************************************************/ #include #include #include #include "qtlockedfile.h" class QtLocalPeer : public QObject { Q_OBJECT public: QtLocalPeer(QObject *parent = 0, const QString &appId = QString()); ~QtLocalPeer (); bool isClient(); bool sendMessage(const QString &message, int timeout); bool sendMessage(const QByteArray &message, int timeout); bool sendMessage(const char* message, int timeout); QString applicationId() const { return id; } Q_SIGNALS: void messageReceived(const QString &message); void messageReceived(const QByteArray &message); void messageReceived(const char* message); protected Q_SLOTS: void receiveConnection(); protected: QString id; QString socketName; QLocalServer* server; QtLockedFile lockFile; private: static const char* ack; bool lockFileCreated; }; clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qtsingleapplication/qtlockedfile.cpp000066400000000000000000000143361260417502300303720ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of a Qt Solutions component. ** ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Solutions Commercial License Agreement provided ** with the Software or, alternatively, in accordance with the terms ** contained in a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** Please note Third Party Software included with Qt Solutions may impose ** additional restrictions and it is the user's responsibility to ensure ** that they have met the licensing requirements of the GPL, LGPL, or Qt ** Solutions Commercial license and the relevant license of the Third ** Party Software they are using. ** ** If you are unsure which license is appropriate for your use, please ** contact Nokia at qt-info@nokia.com. ** ****************************************************************************/ #include "qtlockedfile.h" /*! \class QtLockedFile \brief The QtLockedFile class extends QFile with advisory locking functions. A file may be locked in read or write mode. Multiple instances of \e QtLockedFile, created in multiple processes running on the same machine, may have a file locked in read mode. Exactly one instance may have it locked in write mode. A read and a write lock cannot exist simultaneously on the same file. The file locks are advisory. This means that nothing prevents another process from manipulating a locked file using QFile or file system functions offered by the OS. Serialization is only guaranteed if all processes that access the file use QLockedFile. Also, while holding a lock on a file, a process must not open the same file again (through any API), or locks can be unexpectedly lost. The lock provided by an instance of \e QtLockedFile is released whenever the program terminates. This is true even when the program crashes and no destructors are called. */ /*! \enum QtLockedFile::LockMode This enum describes the available lock modes. \value ReadLock A read lock. \value WriteLock A write lock. \value NoLock Neither a read lock nor a write lock. */ /*! Constructs an unlocked \e QtLockedFile object. This constructor behaves in the same way as \e QFile::QFile(). \sa QFile::QFile() */ QtLockedFile::QtLockedFile() : QFile() { #ifdef Q_OS_WIN wmutex = 0; rmutex = 0; #endif m_lock_mode = NoLock; } /*! Constructs an unlocked QtLockedFile object with file \a name. This constructor behaves in the same way as \e QFile::QFile(const QString&). \sa QFile::QFile() */ QtLockedFile::QtLockedFile(const QString &name) : QFile(name) { #ifdef Q_OS_WIN wmutex = 0; rmutex = 0; #endif m_lock_mode = NoLock; } /*! Opens the file in OpenMode \a mode. This is identical to QFile::open(), with the one exception that the Truncate mode flag is disallowed. Truncation would conflict with the advisory file locking, since the file would be modified before the write lock is obtained. If truncation is required, use resize(0) after obtaining the write lock. Returns true if successful; otherwise false. \sa QFile::open(), QFile::resize() */ bool QtLockedFile::open(OpenMode mode) { if (mode & QIODevice::Truncate) { qWarning("QtLockedFile::open(): Truncate mode not allowed."); return false; } return QFile::open(mode); } /*! Returns \e true if this object has a in read or write lock; otherwise returns \e false. \sa lockMode() */ bool QtLockedFile::isLocked() const { return m_lock_mode != NoLock; } /*! Returns the type of lock currently held by this object, or \e QtLockedFile::NoLock. \sa isLocked() */ QtLockedFile::LockMode QtLockedFile::lockMode() const { return m_lock_mode; } /*! \fn bool QtLockedFile::lock(LockMode mode, bool block = true) Obtains a lock of type \a mode. The file must be opened before it can be locked. If \a block is true, this function will block until the lock is aquired. If \a block is false, this function returns \e false immediately if the lock cannot be aquired. If this object already has a lock of type \a mode, this function returns \e true immediately. If this object has a lock of a different type than \a mode, the lock is first released and then a new lock is obtained. This function returns \e true if, after it executes, the file is locked by this object, and \e false otherwise. \sa unlock(), isLocked(), lockMode() */ /*! \fn bool QtLockedFile::unlock() Releases a lock. If the object has no lock, this function returns immediately. This function returns \e true if, after it executes, the file is not locked by this object, and \e false otherwise. \sa lock(), isLocked(), lockMode() */ /*! \fn QtLockedFile::~QtLockedFile() Destroys the \e QtLockedFile object. If any locks were held, they are released. */ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qtsingleapplication/qtlockedfile.h000066400000000000000000000066661260417502300300460ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of a Qt Solutions component. ** ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Solutions Commercial License Agreement provided ** with the Software or, alternatively, in accordance with the terms ** contained in a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** Please note Third Party Software included with Qt Solutions may impose ** additional restrictions and it is the user's responsibility to ensure ** that they have met the licensing requirements of the GPL, LGPL, or Qt ** Solutions Commercial license and the relevant license of the Third ** Party Software they are using. ** ** If you are unsure which license is appropriate for your use, please ** contact Nokia at qt-info@nokia.com. ** ****************************************************************************/ #ifndef QTLOCKEDFILE_H #define QTLOCKEDFILE_H #include #ifdef Q_OS_WIN #include #endif #if defined(Q_WS_WIN) # if !defined(QT_QTLOCKEDFILE_EXPORT) && !defined(QT_QTLOCKEDFILE_IMPORT) # define QT_QTLOCKEDFILE_EXPORT # elif defined(QT_QTLOCKEDFILE_IMPORT) # if defined(QT_QTLOCKEDFILE_EXPORT) # undef QT_QTLOCKEDFILE_EXPORT # endif # define QT_QTLOCKEDFILE_EXPORT __declspec(dllimport) # elif defined(QT_QTLOCKEDFILE_EXPORT) # undef QT_QTLOCKEDFILE_EXPORT # define QT_QTLOCKEDFILE_EXPORT __declspec(dllexport) # endif #else # define QT_QTLOCKEDFILE_EXPORT #endif class QT_QTLOCKEDFILE_EXPORT QtLockedFile : public QFile { public: enum LockMode { NoLock = 0, ReadLock, WriteLock }; QtLockedFile(); QtLockedFile(const QString &name); ~QtLockedFile(); bool open(OpenMode mode); bool lock(LockMode mode, bool block = true); bool unlock(); bool isLocked() const; LockMode lockMode() const; private: #ifdef Q_OS_WIN Qt::HANDLE wmutex; Qt::HANDLE rmutex; QVector rmutexes; QString mutexname; Qt::HANDLE getMutexHandle(int idx, bool doCreate); bool waitMutex(Qt::HANDLE mutex, bool doBlock); #endif LockMode m_lock_mode; }; #endif clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qtsingleapplication/qtlockedfile_unix.cpp000066400000000000000000000072101260417502300314260ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of a Qt Solutions component. ** ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Solutions Commercial License Agreement provided ** with the Software or, alternatively, in accordance with the terms ** contained in a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** Please note Third Party Software included with Qt Solutions may impose ** additional restrictions and it is the user's responsibility to ensure ** that they have met the licensing requirements of the GPL, LGPL, or Qt ** Solutions Commercial license and the relevant license of the Third ** Party Software they are using. ** ** If you are unsure which license is appropriate for your use, please ** contact Nokia at qt-info@nokia.com. ** ****************************************************************************/ #include #include #include #include #include "qtlockedfile.h" bool QtLockedFile::lock(LockMode mode, bool block) { if (!isOpen()) { qWarning("QtLockedFile::lock(): file is not opened"); return false; } if (mode == NoLock) return unlock(); if (mode == m_lock_mode) return true; if (m_lock_mode != NoLock) unlock(); struct flock fl; fl.l_whence = SEEK_SET; fl.l_start = 0; fl.l_len = 0; fl.l_type = (mode == ReadLock) ? F_RDLCK : F_WRLCK; int cmd = block ? F_SETLKW : F_SETLK; int ret = fcntl(handle(), cmd, &fl); if (ret == -1) { if (errno != EINTR && errno != EAGAIN) qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno)); return false; } m_lock_mode = mode; return true; } bool QtLockedFile::unlock() { if (!isOpen()) { qWarning("QtLockedFile::unlock(): file is not opened"); return false; } if (!isLocked()) return true; struct flock fl; fl.l_whence = SEEK_SET; fl.l_start = 0; fl.l_len = 0; fl.l_type = F_UNLCK; int ret = fcntl(handle(), F_SETLKW, &fl); if (ret == -1) { qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno)); return false; } m_lock_mode = NoLock; return true; } QtLockedFile::~QtLockedFile() { if (isOpen()) unlock(); } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qtsingleapplication/qtlockedfile_win.cpp000066400000000000000000000151541260417502300312460ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of a Qt Solutions component. ** ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Solutions Commercial License Agreement provided ** with the Software or, alternatively, in accordance with the terms ** contained in a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** Please note Third Party Software included with Qt Solutions may impose ** additional restrictions and it is the user's responsibility to ensure ** that they have met the licensing requirements of the GPL, LGPL, or Qt ** Solutions Commercial license and the relevant license of the Third ** Party Software they are using. ** ** If you are unsure which license is appropriate for your use, please ** contact Nokia at qt-info@nokia.com. ** ****************************************************************************/ #include "qtlockedfile.h" #include #include #define MUTEX_PREFIX "QtLockedFile mutex " // Maximum number of concurrent read locks. Must not be greater than MAXIMUM_WAIT_OBJECTS #define MAX_READERS MAXIMUM_WAIT_OBJECTS Qt::HANDLE QtLockedFile::getMutexHandle(int idx, bool doCreate) { if (mutexname.isEmpty()) { QFileInfo fi(*this); mutexname = QString::fromLatin1(MUTEX_PREFIX) + fi.absoluteFilePath().toLower(); } QString mname(mutexname); if (idx >= 0) mname += QString::number(idx); Qt::HANDLE mutex; if (doCreate) { QT_WA( { mutex = CreateMutexW(NULL, FALSE, (WCHAR*)mname.utf16()); }, { mutex = CreateMutexA(NULL, FALSE, mname.toLocal8Bit().constData()); } ); if (!mutex) { qErrnoWarning("QtLockedFile::lock(): CreateMutex failed"); return 0; } } else { QT_WA( { mutex = OpenMutexW(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, (WCHAR*)mname.utf16()); }, { mutex = OpenMutexA(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, mname.toLocal8Bit().constData()); } ); if (!mutex) { if (GetLastError() != ERROR_FILE_NOT_FOUND) qErrnoWarning("QtLockedFile::lock(): OpenMutex failed"); return 0; } } return mutex; } bool QtLockedFile::waitMutex(Qt::HANDLE mutex, bool doBlock) { Q_ASSERT(mutex); DWORD res = WaitForSingleObject(mutex, doBlock ? INFINITE : 0); switch (res) { case WAIT_OBJECT_0: case WAIT_ABANDONED: return true; break; case WAIT_TIMEOUT: break; default: qErrnoWarning("QtLockedFile::lock(): WaitForSingleObject failed"); } return false; } bool QtLockedFile::lock(LockMode mode, bool block) { if (!isOpen()) { qWarning("QtLockedFile::lock(): file is not opened"); return false; } if (mode == NoLock) return unlock(); if (mode == m_lock_mode) return true; if (m_lock_mode != NoLock) unlock(); if (!wmutex && !(wmutex = getMutexHandle(-1, true))) return false; if (!waitMutex(wmutex, block)) return false; if (mode == ReadLock) { int idx = 0; for (; idx < MAX_READERS; idx++) { rmutex = getMutexHandle(idx, false); if (!rmutex || waitMutex(rmutex, false)) break; CloseHandle(rmutex); } bool ok = true; if (idx >= MAX_READERS) { qWarning("QtLockedFile::lock(): too many readers"); rmutex = 0; ok = false; } else if (!rmutex) { rmutex = getMutexHandle(idx, true); if (!rmutex || !waitMutex(rmutex, false)) ok = false; } if (!ok && rmutex) { CloseHandle(rmutex); rmutex = 0; } ReleaseMutex(wmutex); if (!ok) return false; } else { Q_ASSERT(rmutexes.isEmpty()); for (int i = 0; i < MAX_READERS; i++) { Qt::HANDLE mutex = getMutexHandle(i, false); if (mutex) rmutexes.append(mutex); } if (rmutexes.size()) { DWORD res = WaitForMultipleObjects(rmutexes.size(), rmutexes.constData(), TRUE, block ? INFINITE : 0); if (res != WAIT_OBJECT_0 && res != WAIT_ABANDONED) { if (res != WAIT_TIMEOUT) qErrnoWarning("QtLockedFile::lock(): WaitForMultipleObjects failed"); m_lock_mode = WriteLock; // trick unlock() to clean up - semiyucky unlock(); return false; } } } m_lock_mode = mode; return true; } bool QtLockedFile::unlock() { if (!isOpen()) { qWarning("QtLockedFile::unlock(): file is not opened"); return false; } if (!isLocked()) return true; if (m_lock_mode == ReadLock) { ReleaseMutex(rmutex); CloseHandle(rmutex); rmutex = 0; } else { foreach(Qt::HANDLE mutex, rmutexes) { ReleaseMutex(mutex); CloseHandle(mutex); } rmutexes.clear(); ReleaseMutex(wmutex); } m_lock_mode = QtLockedFile::NoLock; return true; } QtLockedFile::~QtLockedFile() { if (isOpen()) unlock(); if (wmutex) CloseHandle(wmutex); } clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qtsingleapplication/qtsingleapplication.cpp000066400000000000000000000304371260417502300317760ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of a Qt Solutions component. ** ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Solutions Commercial License Agreement provided ** with the Software or, alternatively, in accordance with the terms ** contained in a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** Please note Third Party Software included with Qt Solutions may impose ** additional restrictions and it is the user's responsibility to ensure ** that they have met the licensing requirements of the GPL, LGPL, or Qt ** Solutions Commercial license and the relevant license of the Third ** Party Software they are using. ** ** If you are unsure which license is appropriate for your use, please ** contact Nokia at qt-info@nokia.com. ** ****************************************************************************/ #include "qtsingleapplication.h" #include "qtlocalpeer.h" #include /*! \class QtSingleApplication qtsingleapplication.h \brief The QtSingleApplication class provides an API to detect and communicate with running instances of an application. This class allows you to create applications where only one instance should be running at a time. I.e., if the user tries to launch another instance, the already running instance will be activated instead. Another usecase is a client-server system, where the first started instance will assume the role of server, and the later instances will act as clients of that server. By default, the full path of the executable file is used to determine whether two processes are instances of the same application. You can also provide an explicit identifier string that will be compared instead. The application should create the QtSingleApplication object early in the startup phase, and call isRunning() or sendMessage() to find out if another instance of this application is already running. Startup parameters (e.g. the name of the file the user wanted this new instance to open) can be passed to the running instance in the sendMessage() function. If isRunning() or sendMessage() returns false, it means that no other instance is running, and this instance has assumed the role as the running instance. The application should continue with the initialization of the application user interface before entering the event loop with exec(), as normal. The messageReceived() signal will be emitted when the application receives messages from another instance of the same application. If isRunning() or sendMessage() returns true, another instance is already running, and the application should terminate or enter client mode. If a message is received it might be helpful to the user to raise the application so that it becomes visible. To facilitate this, QtSingleApplication provides the setActivationWindow() function and the activateWindow() slot. Here's an example that shows how to convert an existing application to use QtSingleApplication. It is very simple and does not make use of all QtSingleApplication's functionality (see the examples for that). \code // Original int main(int argc, char **argv) { QApplication app(argc, argv); MyMainWidget mmw; mmw.show(); return app.exec(); } // Single instance int main(int argc, char **argv) { QtSingleApplication app(argc, argv); if (app.isRunning()) return 0; MyMainWidget mmw; app.setActivationWindow(&mmw); mmw.show(); return app.exec(); } \endcode Once this QtSingleApplication instance is destroyed(for example, when the user quits), when the user next attempts to run the application this instance will not, of course, be encountered. The next instance to call isRunning() or sendMessage() will assume the role as the new running instance. For console (non-GUI) applications, QtSingleCoreApplication may be used instead of this class, to avoid the dependency on the QtGui library. \sa QtSingleCoreApplication */ void QtSingleApplication::sysInit(const QString &appId) { actWin = 0; peer = new QtLocalPeer(this, appId); connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); connect(peer, SIGNAL(messageReceived(const QByteArray&)), SIGNAL(messageReceived(const QByteArray&))); connect(peer, SIGNAL(messageReceived(const char*)), SIGNAL(messageReceived(const char*))); } /*! Creates a QtSingleApplication object. The application identifier will be QCoreApplication::applicationFilePath(). \a argc, \a argv, and \a GUIenabled are passed on to the QAppliation constructor. If you are creating a console application (i.e. setting \a GUIenabled to false), you may consider using QtSingleCoreApplication instead. */ QtSingleApplication::QtSingleApplication(int &argc, char **argv, bool GUIenabled) : QApplication(argc, argv, GUIenabled) { sysInit(); } /*! Creates a QtSingleApplication object with the application identifier \a appId. \a argc and \a argv are passed on to the QAppliation constructor. */ QtSingleApplication::QtSingleApplication(const QString &appId, int &argc, char **argv) : QApplication(argc, argv) { sysInit(appId); } /*! Creates a QtSingleApplication object. The application identifier will be QCoreApplication::applicationFilePath(). \a argc, \a argv, and \a type are passed on to the QAppliation constructor. */ QtSingleApplication::QtSingleApplication(int &argc, char **argv, Type type) : QApplication(argc, argv, type) { sysInit(); } #if defined(Q_WS_X11) /*! Special constructor for X11, ref. the documentation of QApplication's corresponding constructor. The application identifier will be QCoreApplication::applicationFilePath(). \a dpy, \a visual, and \a cmap are passed on to the QApplication constructor. */ QtSingleApplication::QtSingleApplication(Display* dpy, Qt::HANDLE visual, Qt::HANDLE cmap) : QApplication(dpy, visual, cmap) { sysInit(); } /*! Special constructor for X11, ref. the documentation of QApplication's corresponding constructor. The application identifier will be QCoreApplication::applicationFilePath(). \a dpy, \a argc, \a argv, \a visual, and \a cmap are passed on to the QApplication constructor. */ QtSingleApplication::QtSingleApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual, Qt::HANDLE cmap) : QApplication(dpy, argc, argv, visual, cmap) { sysInit(); } /*! Special constructor for X11, ref. the documentation of QApplication's corresponding constructor. The application identifier will be \a appId. \a dpy, \a argc, \a argv, \a visual, and \a cmap are passed on to the QApplication constructor. */ QtSingleApplication::QtSingleApplication(Display* dpy, const QString &appId, int argc, char **argv, Qt::HANDLE visual, Qt::HANDLE cmap) : QApplication(dpy, argc, argv, visual, cmap) { sysInit(appId); } #endif /*! Returns true if another instance of this application is running; otherwise false. This function does not find instances of this application that are being run by a different user (on Windows: that are running in another session). \sa sendMessage() */ bool QtSingleApplication::isRunning() { return peer->isClient(); } /*! Tries to send the text \a message to the currently running instance. The QtSingleApplication object in the running instance will emit the messageReceived() signal when it receives the message. This function returns true if the message has been sent to, and processed by, the current instance. If there is no instance currently running, or if the running instance fails to process the message within \a timeout milliseconds, this function return false. \sa isRunning(), messageReceived() */ bool QtSingleApplication::sendMessage(const QString &message, int timeout) { return peer->sendMessage(message, timeout); } bool QtSingleApplication::sendMessage(const QByteArray &message, int timeout) { return peer->sendMessage(message, timeout); } bool QtSingleApplication::sendMessage(const char* message, int timeout) { return peer->sendMessage(message, timeout); } /*! Returns the application identifier. Two processes with the same identifier will be regarded as instances of the same application. */ QString QtSingleApplication::id() const { return peer->applicationId(); } /*! Sets the activation window of this application to \a aw. The activation window is the widget that will be activated by activateWindow(). This is typically the application's main window. If \a activateOnMessage is true (the default), the window will be activated automatically every time a message is received, just prior to the messageReceived() signal being emitted. \sa activateWindow(), messageReceived() */ void QtSingleApplication::setActivationWindow(QWidget* aw, bool activateOnMessage) { actWin = aw; if (activateOnMessage) { connect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow())); connect(peer, SIGNAL(messageReceived(const QByteArray&)), this, SLOT(activateWindow())); connect(peer, SIGNAL(messageReceived(const char*)), this, SLOT(activateWindow())); } else { disconnect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow())); disconnect(peer, SIGNAL(messageReceived(const QByteArray&)), this, SLOT(activateWindow())); disconnect(peer, SIGNAL(messageReceived(const char*)), this, SLOT(activateWindow())); } } /*! Returns the applications activation window if one has been set by calling setActivationWindow(), otherwise returns 0. \sa setActivationWindow() */ QWidget* QtSingleApplication::activationWindow() const { return actWin; } /*! De-minimizes, raises, and activates this application's activation window. This function does nothing if no activation window has been set. This is a convenience function to show the user that this application instance has been activated when he has tried to start another instance. This function should typically be called in response to the messageReceived() signal. By default, that will happen automatically, if an activation window has been set. \sa setActivationWindow(), messageReceived(), initialize() */ void QtSingleApplication::activateWindow() { if (actWin) { actWin->setWindowState(actWin->windowState() & ~Qt::WindowMinimized); actWin->raise(); actWin->activateWindow(); } } /*! \fn void QtSingleApplication::messageReceived(const QString& message) This signal is emitted when the current instance receives a \a message from another instance of this application. \sa sendMessage(), setActivationWindow(), activateWindow() */ /*! \fn void QtSingleApplication::initialize(bool dummy = true) \obsolete */ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qtsingleapplication/qtsingleapplication.h000066400000000000000000000103221260417502300314320ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of a Qt Solutions component. ** ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Solutions Commercial License Agreement provided ** with the Software or, alternatively, in accordance with the terms ** contained in a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** Please note Third Party Software included with Qt Solutions may impose ** additional restrictions and it is the user's responsibility to ensure ** that they have met the licensing requirements of the GPL, LGPL, or Qt ** Solutions Commercial license and the relevant license of the Third ** Party Software they are using. ** ** If you are unsure which license is appropriate for your use, please ** contact Nokia at qt-info@nokia.com. ** ****************************************************************************/ #include class QtLocalPeer; #if defined(Q_WS_WIN) # if !defined(QT_QTSINGLEAPPLICATION_EXPORT) && !defined(QT_QTSINGLEAPPLICATION_IMPORT) # define QT_QTSINGLEAPPLICATION_EXPORT # elif defined(QT_QTSINGLEAPPLICATION_IMPORT) # if defined(QT_QTSINGLEAPPLICATION_EXPORT) # undef QT_QTSINGLEAPPLICATION_EXPORT # endif # define QT_QTSINGLEAPPLICATION_EXPORT __declspec(dllimport) # elif defined(QT_QTSINGLEAPPLICATION_EXPORT) # undef QT_QTSINGLEAPPLICATION_EXPORT # define QT_QTSINGLEAPPLICATION_EXPORT __declspec(dllexport) # endif #else # define QT_QTSINGLEAPPLICATION_EXPORT #endif class QT_QTSINGLEAPPLICATION_EXPORT QtSingleApplication : public QApplication { Q_OBJECT public: QtSingleApplication(int &argc, char **argv, bool GUIenabled = true); QtSingleApplication(const QString &id, int &argc, char **argv); QtSingleApplication(int &argc, char **argv, Type type); #if defined(Q_WS_X11) QtSingleApplication(Display* dpy, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0); QtSingleApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE cmap= 0); QtSingleApplication(Display* dpy, const QString &appId, int argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0); #endif bool isRunning(); QString id() const; void setActivationWindow(QWidget* aw, bool activateOnMessage = true); QWidget* activationWindow() const; // Obsolete: void initialize(bool dummy = true) { isRunning(); Q_UNUSED(dummy) } public Q_SLOTS: bool sendMessage(const QString &message, int timeout = 5000); bool sendMessage(const QByteArray &message, int timeout = 5000); bool sendMessage(const char* message, int timeout = 5000); void activateWindow(); Q_SIGNALS: void messageReceived(const QString &message); void messageReceived(const QByteArray &message); void messageReceived(const char* message); private: void sysInit(const QString &appId = QString()); QtLocalPeer *peer; QWidget *actWin; }; clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qtsingleapplication/qtsingleapplication.patch000066400000000000000000000204061260417502300323060ustar00rootroot00000000000000diff -ur /home/david/qtsingleapplication-2.6_1-opensource/src/qtlocalpeer.cpp qtsingleapplication/qtlocalpeer.cpp --- /home/david/qtsingleapplication-2.6_1-opensource/src/qtlocalpeer.cpp 2009-12-16 10:43:33.000000000 +0000 +++ qtsingleapplication/qtlocalpeer.cpp 2010-07-10 16:26:50.000000000 +0100 @@ -48,6 +48,7 @@ #include "qtlocalpeer.h" #include #include +#include #if defined(Q_OS_WIN) #include @@ -59,14 +60,12 @@ #include #endif -namespace QtLP_Private { #include "qtlockedfile.cpp" #if defined(Q_OS_WIN) #include "qtlockedfile_win.cpp" #else #include "qtlockedfile_unix.cpp" #endif -} const char* QtLocalPeer::ack = "ack"; @@ -118,7 +117,7 @@ if (lockFile.isLocked()) return false; - if (!lockFile.lock(QtLP_Private::QtLockedFile::WriteLock, false)) + if (!lockFile.lock(QtLockedFile::WriteLock, false)) return true; bool res = server->listen(socketName); @@ -138,6 +137,11 @@ bool QtLocalPeer::sendMessage(const QString &message, int timeout) { + return sendMessage(message.toUtf8(), timeout); +} + +bool QtLocalPeer::sendMessage(const QByteArray &message, int timeout) +{ if (!isClient()) return false; @@ -160,9 +164,8 @@ if (!connOk) return false; - QByteArray uMsg(message.toUtf8()); QDataStream ds(&socket); - ds.writeBytes(uMsg.constData(), uMsg.size()); + ds.writeBytes(message.constData(), message.size()); bool res = socket.waitForBytesWritten(timeout); res &= socket.waitForReadyRead(timeout); // wait for ack res &= (socket.read(qstrlen(ack)) == ack); @@ -195,9 +198,9 @@ delete socket; return; } - QString message(QString::fromUtf8(uMsg)); socket->write(ack, qstrlen(ack)); socket->waitForBytesWritten(1000); delete socket; - emit messageReceived(message); //### (might take a long time to return) + emit messageReceived(uMsg); //### (might take a long time to return) + emit messageReceived(QString::fromUtf8(uMsg)); } diff -ur /home/david/qtsingleapplication-2.6_1-opensource/src/qtlocalpeer.h qtsingleapplication/qtlocalpeer.h --- /home/david/qtsingleapplication-2.6_1-opensource/src/qtlocalpeer.h 2009-12-16 10:43:33.000000000 +0000 +++ qtsingleapplication/qtlocalpeer.h 2010-07-10 16:26:16.000000000 +0100 @@ -49,9 +49,7 @@ #include #include -namespace QtLP_Private { #include "qtlockedfile.h" -} class QtLocalPeer : public QObject { @@ -61,11 +59,13 @@ QtLocalPeer(QObject *parent = 0, const QString &appId = QString()); bool isClient(); bool sendMessage(const QString &message, int timeout); + bool sendMessage(const QByteArray &message, int timeout); QString applicationId() const { return id; } Q_SIGNALS: void messageReceived(const QString &message); + void messageReceived(const QByteArray &message); protected Q_SLOTS: void receiveConnection(); @@ -74,7 +74,7 @@ QString id; QString socketName; QLocalServer* server; - QtLP_Private::QtLockedFile lockFile; + QtLockedFile lockFile; private: static const char* ack; diff -ur /home/david/qtsingleapplication-2.6_1-opensource/src/qtlockedfile_win.cpp qtsingleapplication/qtlockedfile_win.cpp --- /home/david/qtsingleapplication-2.6_1-opensource/src/qtlockedfile_win.cpp 2009-12-16 10:43:33.000000000 +0000 +++ qtsingleapplication/qtlockedfile_win.cpp 2010-07-10 16:26:33.000000000 +0100 @@ -65,7 +65,7 @@ Qt::HANDLE mutex; if (doCreate) { - QT_WA( { mutex = CreateMutexW(NULL, FALSE, (TCHAR*)mname.utf16()); }, + QT_WA( { mutex = CreateMutexW(NULL, FALSE, (WCHAR*)mname.utf16()); }, { mutex = CreateMutexA(NULL, FALSE, mname.toLocal8Bit().constData()); } ); if (!mutex) { qErrnoWarning("QtLockedFile::lock(): CreateMutex failed"); @@ -73,7 +73,7 @@ } } else { - QT_WA( { mutex = OpenMutexW(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, (TCHAR*)mname.utf16()); }, + QT_WA( { mutex = OpenMutexW(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, (WCHAR*)mname.utf16()); }, { mutex = OpenMutexA(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, mname.toLocal8Bit().constData()); } ); if (!mutex) { if (GetLastError() != ERROR_FILE_NOT_FOUND) diff -ur /home/david/qtsingleapplication-2.6_1-opensource/src/qtsingleapplication.cpp qtsingleapplication/qtsingleapplication.cpp --- /home/david/qtsingleapplication-2.6_1-opensource/src/qtsingleapplication.cpp 2009-12-16 10:43:33.000000000 +0000 +++ qtsingleapplication/qtsingleapplication.cpp 2010-07-10 16:23:53.000000000 +0100 @@ -144,6 +144,7 @@ actWin = 0; peer = new QtLocalPeer(this, appId); connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); + connect(peer, SIGNAL(messageReceived(const QByteArray&)), SIGNAL(messageReceived(const QByteArray&))); } @@ -265,6 +266,11 @@ return peer->sendMessage(message, timeout); } +bool QtSingleApplication::sendMessage(const QByteArray &message, int timeout) +{ + return peer->sendMessage(message, timeout); +} + /*! Returns the application identifier. Two processes with the same @@ -291,10 +297,14 @@ void QtSingleApplication::setActivationWindow(QWidget* aw, bool activateOnMessage) { actWin = aw; - if (activateOnMessage) + if (activateOnMessage) { connect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow())); - else + connect(peer, SIGNAL(messageReceived(const QByteArray&)), this, SLOT(activateWindow())); + } + else { disconnect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow())); + disconnect(peer, SIGNAL(messageReceived(const QByteArray&)), this, SLOT(activateWindow())); + } } diff -ur /home/david/qtsingleapplication-2.6_1-opensource/src/qtsingleapplication.h qtsingleapplication/qtsingleapplication.h --- /home/david/qtsingleapplication-2.6_1-opensource/src/qtsingleapplication.h 2009-12-16 10:43:33.000000000 +0000 +++ qtsingleapplication/qtsingleapplication.h 2010-07-10 16:23:53.000000000 +0100 @@ -91,11 +91,13 @@ public Q_SLOTS: bool sendMessage(const QString &message, int timeout = 5000); + bool sendMessage(const QByteArray &message, int timeout = 5000); void activateWindow(); Q_SIGNALS: void messageReceived(const QString &message); + void messageReceived(const QByteArray &message); private: diff -ur /home/david/qtsingleapplication-2.6_1-opensource/src/qtsinglecoreapplication.cpp qtsingleapplication/qtsinglecoreapplication.cpp --- /home/david/qtsingleapplication-2.6_1-opensource/src/qtsinglecoreapplication.cpp 2009-12-16 10:43:33.000000000 +0000 +++ qtsingleapplication/qtsinglecoreapplication.cpp 2010-07-10 16:32:33.000000000 +0100 @@ -81,6 +81,7 @@ { peer = new QtLocalPeer(this); connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); + connect(peer, SIGNAL(messageReceived(const QByteArray&)), SIGNAL(messageReceived(const QByteArray&))); } @@ -94,6 +95,7 @@ { peer = new QtLocalPeer(this, appId); connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); + connect(peer, SIGNAL(messageReceived(const QByteArray&)), SIGNAL(messageReceived(const QByteArray&))); } @@ -133,6 +135,11 @@ return peer->sendMessage(message, timeout); } +bool QtSingleCoreApplication::sendMessage(const QByteArray &message, int timeout) +{ + return peer->sendMessage(message, timeout); +} + /*! Returns the application identifier. Two processes with the same diff -ur /home/david/qtsingleapplication-2.6_1-opensource/src/qtsinglecoreapplication.h qtsingleapplication/qtsinglecoreapplication.h --- /home/david/qtsingleapplication-2.6_1-opensource/src/qtsinglecoreapplication.h 2009-12-16 10:43:33.000000000 +0000 +++ qtsingleapplication/qtsinglecoreapplication.h 2010-07-10 16:32:33.000000000 +0100 @@ -62,10 +62,12 @@ public Q_SLOTS: bool sendMessage(const QString &message, int timeout = 5000); + bool sendMessage(const QByteArray &message, int timeout = 5000); Q_SIGNALS: void messageReceived(const QString &message); + void messageReceived(const QByteArray &message); private: clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qtsingleapplication/qtsinglecoreapplication.cpp000066400000000000000000000142051260417502300326420ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of a Qt Solutions component. ** ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Solutions Commercial License Agreement provided ** with the Software or, alternatively, in accordance with the terms ** contained in a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** Please note Third Party Software included with Qt Solutions may impose ** additional restrictions and it is the user's responsibility to ensure ** that they have met the licensing requirements of the GPL, LGPL, or Qt ** Solutions Commercial license and the relevant license of the Third ** Party Software they are using. ** ** If you are unsure which license is appropriate for your use, please ** contact Nokia at qt-info@nokia.com. ** ****************************************************************************/ #include "qtsinglecoreapplication.h" #include "qtlocalpeer.h" /*! \class QtSingleCoreApplication qtsinglecoreapplication.h \brief A variant of the QtSingleApplication class for non-GUI applications. This class is a variant of QtSingleApplication suited for use in console (non-GUI) applications. It is an extension of QCoreApplication (instead of QApplication). It does not require the QtGui library. The API and usage is identical to QtSingleApplication, except that functions relating to the "activation window" are not present, for obvious reasons. Please refer to the QtSingleApplication documentation for explanation of the usage. A QtSingleCoreApplication instance can communicate to a QtSingleApplication instance if they share the same application id. Hence, this class can be used to create a light-weight command-line tool that sends commands to a GUI application. \sa QtSingleApplication */ /*! Creates a QtSingleCoreApplication object. The application identifier will be QCoreApplication::applicationFilePath(). \a argc and \a argv are passed on to the QCoreAppliation constructor. */ QtSingleCoreApplication::QtSingleCoreApplication(int &argc, char **argv) : QCoreApplication(argc, argv) { peer = new QtLocalPeer(this); connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); connect(peer, SIGNAL(messageReceived(const QByteArray&)), SIGNAL(messageReceived(const QByteArray&))); connect(peer, SIGNAL(messageReceived(const char*)), SIGNAL(messageReceived(const char*))); } /*! Creates a QtSingleCoreApplication object with the application identifier \a appId. \a argc and \a argv are passed on to the QCoreAppliation constructor. */ QtSingleCoreApplication::QtSingleCoreApplication(const QString &appId, int &argc, char **argv) : QCoreApplication(argc, argv) { peer = new QtLocalPeer(this, appId); connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); connect(peer, SIGNAL(messageReceived(const QByteArray&)), SIGNAL(messageReceived(const QByteArray&))); connect(peer, SIGNAL(messageReceived(const char*)), SIGNAL(messageReceived(const char*))); } /*! Returns true if another instance of this application is running; otherwise false. This function does not find instances of this application that are being run by a different user (on Windows: that are running in another session). \sa sendMessage() */ bool QtSingleCoreApplication::isRunning() { return peer->isClient(); } /*! Tries to send the text \a message to the currently running instance. The QtSingleCoreApplication object in the running instance will emit the messageReceived() signal when it receives the message. This function returns true if the message has been sent to, and processed by, the current instance. If there is no instance currently running, or if the running instance fails to process the message within \a timeout milliseconds, this function return false. \sa isRunning(), messageReceived() */ bool QtSingleCoreApplication::sendMessage(const QString &message, int timeout) { return peer->sendMessage(message, timeout); } bool QtSingleCoreApplication::sendMessage(const QByteArray &message, int timeout) { return peer->sendMessage(message, timeout); } bool QtSingleCoreApplication::sendMessage(const char* message, int timeout) { return peer->sendMessage(message, timeout); } /*! Returns the application identifier. Two processes with the same identifier will be regarded as instances of the same application. */ QString QtSingleCoreApplication::id() const { return peer->applicationId(); } /*! \fn void QtSingleCoreApplication::messageReceived(const QString& message) This signal is emitted when the current instance receives a \a message from another instance of this application. \sa sendMessage() */ clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/qtsingleapplication/qtsinglecoreapplication.h000066400000000000000000000056271260417502300323170ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of a Qt Solutions component. ** ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Solutions Commercial License Agreement provided ** with the Software or, alternatively, in accordance with the terms ** contained in a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** Please note Third Party Software included with Qt Solutions may impose ** additional restrictions and it is the user's responsibility to ensure ** that they have met the licensing requirements of the GPL, LGPL, or Qt ** Solutions Commercial license and the relevant license of the Third ** Party Software they are using. ** ** If you are unsure which license is appropriate for your use, please ** contact Nokia at qt-info@nokia.com. ** ****************************************************************************/ #include class QtLocalPeer; class QtSingleCoreApplication : public QCoreApplication { Q_OBJECT public: QtSingleCoreApplication(int &argc, char **argv); QtSingleCoreApplication(const QString &id, int &argc, char **argv); bool isRunning(); QString id() const; public Q_SLOTS: bool sendMessage(const QString &message, int timeout = 5000); bool sendMessage(const QByteArray &message, int timeout = 5000); bool sendMessage(const char* message, int timeout = 5000); Q_SIGNALS: void messageReceived(const QString &message); void messageReceived(const QByteArray &message); void messageReceived(const char* message); private: QtLocalPeer* peer; }; clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/sha2/000077500000000000000000000000001260417502300217745ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/sha2/CMakeLists.txt000066400000000000000000000001071260417502300245320ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.6) add_library(sha2 STATIC sha2.cpp) clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/sha2/sha2.cpp000066400000000000000000000433351260417502300233450ustar00rootroot00000000000000/* * FILE: sha2.c * AUTHOR: Aaron D. Gifford - http://www.aarongifford.com/ * * Copyright (c) 2000-2001, Aaron D. Gifford * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holder nor the names of contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * */ #include /* memcpy()/memset() or bcopy()/bzero() */ #include /* assert() */ #include "sha2.h" /* * ASSERT NOTE: * Some sanity checking code is included using assert(). On my FreeBSD * system, this additional code can be removed by compiling with NDEBUG * defined. Check your own systems manpage on assert() to see how to * compile WITHOUT the sanity checking code on your system. * * UNROLLED TRANSFORM LOOP NOTE: * You can define SHA2_UNROLL_TRANSFORM to use the unrolled transform * loop version for the hash transform rounds (defined using macros * later in this file). Either define on the command line, for example: * * cc -DSHA2_UNROLL_TRANSFORM -o sha2 sha2.c sha2prog.c * * or define below: * * #define SHA2_UNROLL_TRANSFORM * */ /*** SHA-256/384/512 Machine Architecture Definitions *****************/ /* * BYTE_ORDER NOTE: * * Please make sure that your system defines BYTE_ORDER. If your * architecture is little-endian, make sure it also defines * LITTLE_ENDIAN and that the two (BYTE_ORDER and LITTLE_ENDIAN) are * equivilent. * * If your system does not define the above, then you can do so by * hand like this: * * #define LITTLE_ENDIAN 1234 * #define BIG_ENDIAN 4321 * * And for little-endian machines, add: * * #define BYTE_ORDER LITTLE_ENDIAN * * Or for big-endian machines: * * #define BYTE_ORDER BIG_ENDIAN * * The FreeBSD machine this was written on defines BYTE_ORDER * appropriately by including (which in turn includes * where the appropriate definitions are actually * made). */ #ifdef __MINGW32__ #include #endif #if !defined(BYTE_ORDER) || (BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN) #error Define BYTE_ORDER to be equal to either LITTLE_ENDIAN or BIG_ENDIAN #endif namespace clementine_sha2 { /* * Define the followingsha2_* types to types of the correct length on * the native archtecture. Most BSD systems and Linux define u_intXX_t * types. Machines with very recent ANSI C headers, can use the * uintXX_t definintions from inttypes.h by defining SHA2_USE_INTTYPES_H * during compile or in the sha.h header file. * * Machines that support neither u_intXX_t nor inttypes.h's uintXX_t * will need to define these three typedefs below (and the appropriate * ones in sha.h too) by hand according to their system architecture. * * Thank you, Jun-ichiro itojun Hagino, for suggesting using u_intXX_t * types and pointing out recent ANSI C support for uintXX_t in inttypes.h. */ #ifdef SHA2_USE_INTTYPES_H typedef uint8_t sha2_byte; /* Exactly 1 byte */ typedef uint32_t sha2_word32; /* Exactly 4 bytes */ typedef uint64_t sha2_word64; /* Exactly 8 bytes */ #else /* SHA2_USE_INTTYPES_H */ typedef u_int8_t sha2_byte; /* Exactly 1 byte */ typedef u_int32_t sha2_word32; /* Exactly 4 bytes */ typedef u_int64_t sha2_word64; /* Exactly 8 bytes */ #endif /* SHA2_USE_INTTYPES_H */ /*** SHA-256/384/512 Various Length Definitions ***********************/ /* NOTE: Most of these are in sha2.h */ #define SHA256_SHORT_BLOCK_LENGTH (SHA256_BLOCK_LENGTH - 8) /*** ENDIAN REVERSAL MACROS *******************************************/ #if BYTE_ORDER == LITTLE_ENDIAN #define REVERSE32(w,x) { \ sha2_word32 tmp = (w); \ tmp = (tmp >> 16) | (tmp << 16); \ (x) = ((tmp & 0xff00ff00UL) >> 8) | ((tmp & 0x00ff00ffUL) << 8); \ } #define REVERSE64(w,x) { \ sha2_word64 tmp = (w); \ tmp = (tmp >> 32) | (tmp << 32); \ tmp = ((tmp & 0xff00ff00ff00ff00ULL) >> 8) | \ ((tmp & 0x00ff00ff00ff00ffULL) << 8); \ (x) = ((tmp & 0xffff0000ffff0000ULL) >> 16) | \ ((tmp & 0x0000ffff0000ffffULL) << 16); \ } #endif /* BYTE_ORDER == LITTLE_ENDIAN */ /* * Macro for incrementally adding the unsigned 64-bit integer n to the * unsigned 128-bit integer (represented using a two-element array of * 64-bit words): */ #define ADDINC128(w,n) { \ (w)[0] += (sha2_word64)(n); \ if ((w)[0] < (n)) { \ (w)[1]++; \ } \ } /* * Macros for copying blocks of memory and for zeroing out ranges * of memory. Using these macros makes it easy to switch from * using memset()/memcpy() and using bzero()/bcopy(). * * Please define either SHA2_USE_MEMSET_MEMCPY or define * SHA2_USE_BZERO_BCOPY depending on which function set you * choose to use: */ #if !defined(SHA2_USE_MEMSET_MEMCPY) && !defined(SHA2_USE_BZERO_BCOPY) /* Default to memset()/memcpy() if no option is specified */ #define SHA2_USE_MEMSET_MEMCPY 1 #endif #if defined(SHA2_USE_MEMSET_MEMCPY) && defined(SHA2_USE_BZERO_BCOPY) /* Abort with an error if BOTH options are defined */ #error Define either SHA2_USE_MEMSET_MEMCPY or SHA2_USE_BZERO_BCOPY, not both! #endif #ifdef SHA2_USE_MEMSET_MEMCPY #define MEMSET_BZERO(p,l) memset((p), 0, (l)) #define MEMCPY_BCOPY(d,s,l) memcpy((d), (s), (l)) #endif #ifdef SHA2_USE_BZERO_BCOPY #define MEMSET_BZERO(p,l) bzero((p), (l)) #define MEMCPY_BCOPY(d,s,l) bcopy((s), (d), (l)) #endif /*** THE SIX LOGICAL FUNCTIONS ****************************************/ /* * Bit shifting and rotation (used by the six SHA-XYZ logical functions: * * NOTE: The naming of R and S appears backwards here (R is a SHIFT and * S is a ROTATION) because the SHA-256/384/512 description document * (see http://csrc.nist.gov/cryptval/shs/sha256-384-512.pdf) uses this * same "backwards" definition. */ /* Shift-right (used in SHA-256, SHA-384, and SHA-512): */ #define R(b,x) ((x) >> (b)) /* 32-bit Rotate-right (used in SHA-256): */ #define S32(b,x) (((x) >> (b)) | ((x) << (32 - (b)))) /* Two of six logical functions used in SHA-256, SHA-384, and SHA-512: */ #define Ch(x,y,z) (((x) & (y)) ^ ((~(x)) & (z))) #define Maj(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z))) /* Four of six logical functions used in SHA-256: */ #define Sigma0_256(x) (S32(2, (x)) ^ S32(13, (x)) ^ S32(22, (x))) #define Sigma1_256(x) (S32(6, (x)) ^ S32(11, (x)) ^ S32(25, (x))) #define sigma0_256(x) (S32(7, (x)) ^ S32(18, (x)) ^ R(3 , (x))) #define sigma1_256(x) (S32(17, (x)) ^ S32(19, (x)) ^ R(10, (x))) /*** INTERNAL FUNCTION PROTOTYPES *************************************/ /* NOTE: These should not be accessed directly from outside this * library -- they are intended for private internal visibility/use * only. */ void SHA256_Transform(SHA256_CTX*, const sha2_word32*); /*** SHA-XYZ INITIAL HASH VALUES AND CONSTANTS ************************/ /* Hash constant words K for SHA-256: */ const static sha2_word32 K256[64] = { 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL, 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL, 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL, 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL }; /* Initial hash value H for SHA-256: */ const static sha2_word32 sha256_initial_hash_value[8] = { 0x6a09e667UL, 0xbb67ae85UL, 0x3c6ef372UL, 0xa54ff53aUL, 0x510e527fUL, 0x9b05688cUL, 0x1f83d9abUL, 0x5be0cd19UL }; /* * Constant used by SHA256/384/512_End() functions for converting the * digest to a readable hexadecimal character string: */ static const char *sha2_hex_digits = "0123456789abcdef"; /*** SHA-256: *********************************************************/ void SHA256_Init(SHA256_CTX* context) { if (context == (SHA256_CTX*)0) { return; } MEMCPY_BCOPY(context->state, sha256_initial_hash_value, SHA256_DIGEST_LENGTH); MEMSET_BZERO(context->buffer, SHA256_BLOCK_LENGTH); context->bitcount = 0; } #ifdef SHA2_UNROLL_TRANSFORM /* Unrolled SHA-256 round macros: */ #if BYTE_ORDER == LITTLE_ENDIAN #define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) \ REVERSE32(*data++, W256[j]); \ T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + \ K256[j] + W256[j]; \ (d) += T1; \ (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \ j++ #else /* BYTE_ORDER == LITTLE_ENDIAN */ #define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) \ T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + \ K256[j] + (W256[j] = *data++); \ (d) += T1; \ (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \ j++ #endif /* BYTE_ORDER == LITTLE_ENDIAN */ #define ROUND256(a,b,c,d,e,f,g,h) \ s0 = W256[(j+1)&0x0f]; \ s0 = sigma0_256(s0); \ s1 = W256[(j+14)&0x0f]; \ s1 = sigma1_256(s1); \ T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + K256[j] + \ (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0); \ (d) += T1; \ (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \ j++ void SHA256_Transform(SHA256_CTX* context, const sha2_word32* data) { sha2_word32 a, b, c, d, e, f, g, h, s0, s1; sha2_word32 T1, *W256; int j; W256 = (sha2_word32*)context->buffer; /* Initialize registers with the prev. intermediate value */ a = context->state[0]; b = context->state[1]; c = context->state[2]; d = context->state[3]; e = context->state[4]; f = context->state[5]; g = context->state[6]; h = context->state[7]; j = 0; do { /* Rounds 0 to 15 (unrolled): */ ROUND256_0_TO_15(a,b,c,d,e,f,g,h); ROUND256_0_TO_15(h,a,b,c,d,e,f,g); ROUND256_0_TO_15(g,h,a,b,c,d,e,f); ROUND256_0_TO_15(f,g,h,a,b,c,d,e); ROUND256_0_TO_15(e,f,g,h,a,b,c,d); ROUND256_0_TO_15(d,e,f,g,h,a,b,c); ROUND256_0_TO_15(c,d,e,f,g,h,a,b); ROUND256_0_TO_15(b,c,d,e,f,g,h,a); } while (j < 16); /* Now for the remaining rounds to 64: */ do { ROUND256(a,b,c,d,e,f,g,h); ROUND256(h,a,b,c,d,e,f,g); ROUND256(g,h,a,b,c,d,e,f); ROUND256(f,g,h,a,b,c,d,e); ROUND256(e,f,g,h,a,b,c,d); ROUND256(d,e,f,g,h,a,b,c); ROUND256(c,d,e,f,g,h,a,b); ROUND256(b,c,d,e,f,g,h,a); } while (j < 64); /* Compute the current intermediate hash value */ context->state[0] += a; context->state[1] += b; context->state[2] += c; context->state[3] += d; context->state[4] += e; context->state[5] += f; context->state[6] += g; context->state[7] += h; /* Clean up */ a = b = c = d = e = f = g = h = T1 = 0; } #else /* SHA2_UNROLL_TRANSFORM */ void SHA256_Transform(SHA256_CTX* context, const sha2_word32* data) { sha2_word32 a, b, c, d, e, f, g, h, s0, s1; sha2_word32 T1, T2, *W256; int j; W256 = (sha2_word32*)context->buffer; /* Initialize registers with the prev. intermediate value */ a = context->state[0]; b = context->state[1]; c = context->state[2]; d = context->state[3]; e = context->state[4]; f = context->state[5]; g = context->state[6]; h = context->state[7]; j = 0; do { #if BYTE_ORDER == LITTLE_ENDIAN /* Copy data while converting to host byte order */ REVERSE32(*data++,W256[j]); /* Apply the SHA-256 compression function to update a..h */ T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + W256[j]; #else /* BYTE_ORDER == LITTLE_ENDIAN */ /* Apply the SHA-256 compression function to update a..h with copy */ T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + (W256[j] = *data++); #endif /* BYTE_ORDER == LITTLE_ENDIAN */ T2 = Sigma0_256(a) + Maj(a, b, c); h = g; g = f; f = e; e = d + T1; d = c; c = b; b = a; a = T1 + T2; j++; } while (j < 16); do { /* Part of the message block expansion: */ s0 = W256[(j+1)&0x0f]; s0 = sigma0_256(s0); s1 = W256[(j+14)&0x0f]; s1 = sigma1_256(s1); /* Apply the SHA-256 compression function to update a..h */ T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0); T2 = Sigma0_256(a) + Maj(a, b, c); h = g; g = f; f = e; e = d + T1; d = c; c = b; b = a; a = T1 + T2; j++; } while (j < 64); /* Compute the current intermediate hash value */ context->state[0] += a; context->state[1] += b; context->state[2] += c; context->state[3] += d; context->state[4] += e; context->state[5] += f; context->state[6] += g; context->state[7] += h; /* Clean up */ a = b = c = d = e = f = g = h = T1 = T2 = 0; } #endif /* SHA2_UNROLL_TRANSFORM */ void SHA256_Update(SHA256_CTX* context, const sha2_byte *data, size_t len) { unsigned int freespace, usedspace; if (len == 0) { /* Calling with no data is valid - we do nothing */ return; } /* Sanity check: */ assert(context != (SHA256_CTX*)0 && data != (sha2_byte*)0); usedspace = (context->bitcount >> 3) % SHA256_BLOCK_LENGTH; if (usedspace > 0) { /* Calculate how much free space is available in the buffer */ freespace = SHA256_BLOCK_LENGTH - usedspace; if (len >= freespace) { /* Fill the buffer completely and process it */ MEMCPY_BCOPY(&context->buffer[usedspace], data, freespace); context->bitcount += freespace << 3; len -= freespace; data += freespace; SHA256_Transform(context, (sha2_word32*)context->buffer); } else { /* The buffer is not yet full */ MEMCPY_BCOPY(&context->buffer[usedspace], data, len); context->bitcount += len << 3; /* Clean up: */ usedspace = freespace = 0; return; } } while (len >= SHA256_BLOCK_LENGTH) { /* Process as many complete blocks as we can */ SHA256_Transform(context, (sha2_word32*)data); context->bitcount += SHA256_BLOCK_LENGTH << 3; len -= SHA256_BLOCK_LENGTH; data += SHA256_BLOCK_LENGTH; } if (len > 0) { /* There's left-overs, so save 'em */ MEMCPY_BCOPY(context->buffer, data, len); context->bitcount += len << 3; } /* Clean up: */ usedspace = freespace = 0; } void SHA256_Final(sha2_byte digest[], SHA256_CTX* context) { sha2_word32 *d = (sha2_word32*)digest; unsigned int usedspace; /* Sanity check: */ assert(context != (SHA256_CTX*)0); /* If no digest buffer is passed, we don't bother doing this: */ if (digest != (sha2_byte*)0) { usedspace = (context->bitcount >> 3) % SHA256_BLOCK_LENGTH; #if BYTE_ORDER == LITTLE_ENDIAN /* Convert FROM host byte order */ REVERSE64(context->bitcount,context->bitcount); #endif if (usedspace > 0) { /* Begin padding with a 1 bit: */ context->buffer[usedspace++] = 0x80; if (usedspace <= SHA256_SHORT_BLOCK_LENGTH) { /* Set-up for the last transform: */ MEMSET_BZERO(&context->buffer[usedspace], SHA256_SHORT_BLOCK_LENGTH - usedspace); } else { if (usedspace < SHA256_BLOCK_LENGTH) { MEMSET_BZERO(&context->buffer[usedspace], SHA256_BLOCK_LENGTH - usedspace); } /* Do second-to-last transform: */ SHA256_Transform(context, (sha2_word32*)context->buffer); /* And set-up for the last transform: */ MEMSET_BZERO(context->buffer, SHA256_SHORT_BLOCK_LENGTH); } } else { /* Set-up for the last transform: */ MEMSET_BZERO(context->buffer, SHA256_SHORT_BLOCK_LENGTH); /* Begin padding with a 1 bit: */ *context->buffer = 0x80; } /* Set the bit count: */ *(sha2_word64*)&context->buffer[SHA256_SHORT_BLOCK_LENGTH] = context->bitcount; /* Final transform: */ SHA256_Transform(context, (sha2_word32*)context->buffer); #if BYTE_ORDER == LITTLE_ENDIAN { /* Convert TO host byte order */ int j; for (j = 0; j < 8; j++) { REVERSE32(context->state[j],context->state[j]); *d++ = context->state[j]; } } #else MEMCPY_BCOPY(d, context->state, SHA256_DIGEST_LENGTH); #endif } /* Clean up state data: */ MEMSET_BZERO(context, sizeof(SHA256_CTX)); usedspace = 0; } char *SHA256_End(SHA256_CTX* context, char buffer[]) { sha2_byte digest[SHA256_DIGEST_LENGTH], *d = digest; int i; /* Sanity check: */ assert(context != (SHA256_CTX*)0); if (buffer != (char*)0) { SHA256_Final(digest, context); for (i = 0; i < SHA256_DIGEST_LENGTH; i++) { *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4]; *buffer++ = sha2_hex_digits[*d & 0x0f]; d++; } *buffer = (char)0; } else { MEMSET_BZERO(context, sizeof(SHA256_CTX)); } MEMSET_BZERO(digest, SHA256_DIGEST_LENGTH); return buffer; } char* SHA256_Data(const sha2_byte* data, size_t len, char digest[SHA256_DIGEST_STRING_LENGTH]) { SHA256_CTX context; SHA256_Init(&context); SHA256_Update(&context, data, len); return SHA256_End(&context, digest); } } // namespace clementine_sha2 clementine-1.2.3+git1354-gdaddbde+dfsg/3rdparty/sha2/sha2.h000066400000000000000000000061201260417502300230010ustar00rootroot00000000000000/* * FILE: sha2.h * AUTHOR: Aaron D. Gifford - http://www.aarongifford.com/ * * Copyright (c) 2000-2001, Aaron D. Gifford * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holder nor the names of contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Id: sha2.h,v 1.1 2001/11/08 00:02:01 adg Exp adg $ */ #ifndef __CLEMENTINE_SHA2_H__ #define __CLEMENTINE_SHA2_H__ /* * Import u_intXX_t size_t type definitions from system headers. You * may need to change this, or define these things yourself in this * file. */ #include namespace clementine_sha2 { /*** SHA-256/384/512 Various Length Definitions ***********************/ static const int SHA256_BLOCK_LENGTH = 64; static const int SHA256_DIGEST_LENGTH = 32; static const int SHA256_DIGEST_STRING_LENGTH = (SHA256_DIGEST_LENGTH * 2 + 1); /*** SHA-256/384/512 Context Structures *******************************/ /* NOTE: If your architecture does not define either u_intXX_t types or * uintXX_t (from inttypes.h), you may need to define things by hand * for your system: */ #ifdef __MINGW32__ typedef unsigned char u_int8_t; /* 1-byte (8-bits) */ typedef unsigned int u_int32_t; /* 4-bytes (32-bits) */ typedef unsigned long long u_int64_t; /* 8-bytes (64-bits) */ #endif typedef struct _SHA256_CTX { u_int32_t state[8]; u_int64_t bitcount; u_int8_t buffer[SHA256_BLOCK_LENGTH]; } SHA256_CTX; void SHA256_Init(SHA256_CTX *); void SHA256_Update(SHA256_CTX*, const u_int8_t*, size_t); void SHA256_Final(u_int8_t[SHA256_DIGEST_LENGTH], SHA256_CTX*); char* SHA256_End(SHA256_CTX*, char[SHA256_DIGEST_STRING_LENGTH]); char* SHA256_Data(const u_int8_t*, size_t, char[SHA256_DIGEST_STRING_LENGTH]); } // namespace clementine_sha2 #endif /* __CLEMENTINE_SHA2_H__ */ clementine-1.2.3+git1354-gdaddbde+dfsg/CMakeLists.txt000066400000000000000000000367111260417502300221370ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.6) cmake_policy(SET CMP0011 OLD) include(CheckCXXCompilerFlag) include(FindPkgConfig) include(cmake/C++11Compat.cmake) include(cmake/Summary.cmake) include(cmake/Version.cmake) include(cmake/Deb.cmake) include(cmake/Rpm.cmake) include(cmake/SpotifyVersion.cmake) include(cmake/OptionalSource.cmake) include(cmake/Format.cmake) set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) if (CMAKE_CXX_COMPILER MATCHES ".*clang") set(CMAKE_COMPILER_IS_CLANGXX 1) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-uninitialized") endif () if (APPLE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --stdlib=libc++") endif () find_program(CCACHE_EXECUTABLE NAMES ccache) if (CCACHE_EXECUTABLE) message(STATUS "ccache found: will be used for compilation and linkage") SET_PROPERTY(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_EXECUTABLE}) SET_PROPERTY(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE_EXECUTABLE}) endif () if (UNIX AND NOT APPLE) set(LINUX 1) endif (UNIX AND NOT APPLE) find_package(Qt4 4.5.0 REQUIRED QtCore QtGui QtOpenGL QtSql QtNetwork QtXml) if(NOT APPLE) find_package(Qt4 COMPONENTS QtWebKit) endif(NOT APPLE) # Find Qt's lconvert binary. Try qt's binary dir first, fall back to looking in PATH find_program(QT_LCONVERT_EXECUTABLE NAMES lconvert lconvert-qt4 PATHS ${QT_BINARY_DIR} NO_DEFAULT_PATH) find_program(QT_LCONVERT_EXECUTABLE NAMES lconvert lconvert-qt4) if(APPLE) if(NOT QT_MAC_USE_COCOA) message(FATAL_ERROR "Cocoa support is required") endif(NOT QT_MAC_USE_COCOA) endif(APPLE) find_package(OpenGL REQUIRED) find_package(Boost REQUIRED) find_package(Gettext REQUIRED) find_package(PkgConfig REQUIRED) find_package(Protobuf REQUIRED) find_package(FFTW3) pkg_check_modules(CDIO libcdio) pkg_check_modules(CHROMAPRINT REQUIRED libchromaprint) pkg_search_module(CRYPTOPP cryptopp libcrypto++) pkg_check_modules(GIO gio-2.0) pkg_check_modules(GLIB REQUIRED glib-2.0) pkg_check_modules(GOBJECT REQUIRED gobject-2.0) pkg_check_modules(GSTREAMER REQUIRED gstreamer-1.0) pkg_check_modules(GSTREAMER_APP REQUIRED gstreamer-app-1.0) pkg_check_modules(GSTREAMER_AUDIO REQUIRED gstreamer-audio-1.0) pkg_check_modules(GSTREAMER_BASE REQUIRED gstreamer-base-1.0) pkg_check_modules(GSTREAMER_TAG REQUIRED gstreamer-tag-1.0) pkg_check_modules(LIBGPOD libgpod-1.0>=0.7.92) pkg_check_modules(LIBMTP libmtp>=1.0) pkg_check_modules(LIBMYGPO_QT libmygpo-qt>=1.0.7) pkg_check_modules(LIBPULSE libpulse) pkg_check_modules(LIBXML libxml-2.0) pkg_check_modules(QJSON REQUIRED QJson) pkg_check_modules(SPOTIFY libspotify>=12.1.45) pkg_check_modules(TAGLIB REQUIRED taglib>=1.6) if (WIN32) find_package(ZLIB REQUIRED) find_library(QTSPARKLE_LIBRARIES qtsparkle) endif (WIN32) find_library(LASTFM_LIBRARIES lastfm) find_path(LASTFM_INCLUDE_DIRS lastfm/ws.h) find_path(LASTFM1_INCLUDE_DIRS lastfm/Track.h) find_path(SPARSEHASH_INCLUDE_DIRS google/sparsetable) # Google Drive support needs Taglib 1.8, but this version isn't in old Ubuntu # distros. If the user seems to want Drive support (ie. they have sparsehash # installed and haven't disabled drive), and has an old taglib, compile our # internal one and use that instead. option(USE_BUILTIN_TAGLIB "If the system's version of Taglib is too old, compile our builtin version instead" ON) if (USE_BUILTIN_TAGLIB AND TAGLIB_VERSION VERSION_LESS 1.8) message(STATUS "Using builtin taglib because your system's version is too old") set(TAGLIB_VERSION 1.9.1) set(TAGLIB_INCLUDE_DIRS "${CMAKE_BINARY_DIR}/3rdparty/taglib/headers/taglib/;${CMAKE_BINARY_DIR}/3rdparty/taglib/headers/") set(TAGLIB_LIBRARY_DIRS "") set(TAGLIB_LIBRARIES tag) set(TAGLIB_HAS_OPUS ON) add_subdirectory(3rdparty/taglib) else() set(CMAKE_REQUIRED_INCLUDES "${TAGLIB_INCLUDE_DIRS}") set(CMAKE_REQUIRED_LIBRARIES "${TAGLIB_LIBRARIES}") check_cxx_source_compiles("#include int main() { char *s; TagLib::Ogg::Opus::File opusfile(s); return 0;}" TAGLIB_HAS_OPUS) set(CMAKE_REQUIRED_INCLUDES) set(CMAKE_REQUIRED_LIBRARIES) endif() if(LASTFM_INCLUDE_DIRS AND LASTFM1_INCLUDE_DIRS) set(HAVE_LIBLASTFM1 ON) endif() if (APPLE) find_library(SPARKLE Sparkle) find_library(SPOTIFY libspotify) if (SPOTIFY) set (SPOTIFY_FOUND ON) set (SPOTIFY_INCLUDE_DIRS ${SPOTIFY}) set (SPOTIFY_LIBRARIES ${SPOTIFY}) endif (SPOTIFY) add_subdirectory(3rdparty/SPMediaKeyTap) set(SPMEDIAKEYTAP_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/SPMediaKeyTap) set(SPMEDIAKEYTAP_LIBRARIES SPMediaKeyTap) endif (APPLE) find_package(Threads) if(${CMAKE_BUILD_TYPE} MATCHES "Release") add_definitions(-DNDEBUG) add_definitions(-DQT_NO_DEBUG_OUTPUT) endif(${CMAKE_BUILD_TYPE} MATCHES "Release") # Set up definitions and paths add_definitions(${QT_DEFINITIONS}) link_directories(${TAGLIB_LIBRARY_DIRS}) link_directories(${QJSON_LIBRARY_DIRS}) link_directories(${GSTREAMER_LIBRARY_DIRS}) # Don't try to use webkit if their include directories couldn't be found. if (NOT QT_QTWEBKIT_INCLUDE_DIR) set (QT_USE_QTWEBKIT 0) endif (NOT QT_QTWEBKIT_INCLUDE_DIR) include_directories(${Boost_INCLUDE_DIRS}) include_directories(${TAGLIB_INCLUDE_DIRS}) include_directories(${QJSON_INCLUDE_DIRS}) include_directories(${GSTREAMER_INCLUDE_DIRS}) include_directories(${GSTREAMER_APP_INCLUDE_DIRS}) include_directories(${GSTREAMER_AUDIO_INCLUDE_DIRS}) include_directories(${GSTREAMER_BASE_INCLUDE_DIRS}) include_directories(${GSTREAMER_TAG_INCLUDE_DIRS}) include_directories(${GLIB_INCLUDE_DIRS}) include_directories(${GLIBCONFIG_INCLUDE_DIRS}) include_directories(${LIBXML_INCLUDE_DIRS}) if (WIN32) # RC compiler string(REPLACE "gcc" "windres" CMAKE_RC_COMPILER_INIT ${CMAKE_C_COMPILER}) enable_language(RC) SET(CMAKE_RC_COMPILE_OBJECT " -O coff -o -I ${CMAKE_SOURCE_DIR}/dist/windows") endif(WIN32) add_definitions(-DQT_NO_CAST_TO_ASCII -DQT_STRICT_ITERATORS) # Translations stuff find_program(GETTEXT_XGETTEXT_EXECUTABLE xgettext PATHS /target/bin) if(NOT GETTEXT_XGETTEXT_EXECUTABLE) message(FATAL_ERROR "Could not find xgettext executable") endif(NOT GETTEXT_XGETTEXT_EXECUTABLE) find_program(GETTEXT_MSGMERGE_EXECUTABLE msgmerge PATHS /target/bin) if(NOT GETTEXT_MSGMERGE_EXECUTABLE) message(FATAL_ERROR "Could not find msgmerge executable") endif(NOT GETTEXT_MSGMERGE_EXECUTABLE) find_program(GETTEXT_MSGFMT_EXECUTABLE msgfmt PATHS /target/bin) if(NOT GETTEXT_MSGFMT_EXECUTABLE) message(FATAL_ERROR "Could not find msgfmt executable") endif(NOT GETTEXT_MSGFMT_EXECUTABLE) # Optional bits if(WIN32) option(ENABLE_WIN32_CONSOLE "Show the windows console even outside Debug mode" OFF) endif(WIN32) optional_component(BREAKPAD OFF "Crash reporting") optional_component(GOOGLE_DRIVE ON "Google Drive support" DEPENDS "Google sparsehash" SPARSEHASH_INCLUDE_DIRS DEPENDS "Taglib 1.8" "TAGLIB_VERSION VERSION_GREATER 1.7.999" ) optional_component(DROPBOX ON "Dropbox support" DEPENDS "Google sparsehash" SPARSEHASH_INCLUDE_DIRS DEPENDS "Taglib 1.8" "TAGLIB_VERSION VERSION_GREATER 1.7.999" ) optional_component(SKYDRIVE ON "Skydrive support" DEPENDS "Google sparsehash" SPARSEHASH_INCLUDE_DIRS DEPENDS "Taglib 1.8" "TAGLIB_VERSION VERSION_GREATER 1.7.999" ) optional_component(BOX ON "Box support" DEPENDS "Google sparsehash" SPARSEHASH_INCLUDE_DIRS DEPENDS "Taglib 1.8" "TAGLIB_VERSION VERSION_GREATER 1.7.999" ) optional_component(VK ON "Vk.com support") optional_component(SEAFILE ON "Seafile support" DEPENDS "Google sparsehash" SPARSEHASH_INCLUDE_DIRS DEPENDS "Taglib 1.8" "TAGLIB_VERSION VERSION_GREATER 1.7.999" ) optional_component(AMAZON_CLOUD_DRIVE ON "Amazon Cloud Drive support" DEPENDS "Google sparsehash" SPARSEHASH_INCLUDE_DIRS DEPENDS "Taglib 1.8" "TAGLIB_VERSION VERSION_GREATER 1.7.999" ) optional_component(AUDIOCD ON "Devices: Audio CD support" DEPENDS "libcdio" CDIO_FOUND ) optional_component(LIBGPOD ON "Devices: iPod classic support" DEPENDS "libgpod" LIBGPOD_FOUND ) optional_component(GIO ON "Devices: GIO device backend" DEPENDS "libgio" GIO_FOUND DEPENDS "Linux or Windows" "NOT APPLE" ) optional_component(LIBMTP ON "Devices: MTP support" DEPENDS "libmtp" LIBMTP_FOUND ) optional_component(LIBLASTFM ON "Last.fm support" DEPENDS "liblastfm" LASTFM_LIBRARIES LASTFM_INCLUDE_DIRS ) optional_component(DBUS ON "D-Bus support" DEPENDS "Linux" LINUX ) optional_component(WIIMOTEDEV ON "Wiimote support" DEPENDS "D-Bus support" HAVE_DBUS ) optional_component(DEVICEKIT ON "Devices: DeviceKit backend" DEPENDS "D-Bus support" HAVE_DBUS ) optional_component(SPOTIFY_BLOB ON "Spotify support: non-GPL binary helper" DEPENDS "protobuf" PROTOBUF_FOUND PROTOBUF_PROTOC_EXECUTABLE DEPENDS "libspotify" SPOTIFY_FOUND ) optional_component(MOODBAR ON "Moodbar support" DEPENDS "fftw3" FFTW3_FOUND ) optional_component(SPARKLE ON "Sparkle integration" DEPENDS "Mac OS X" APPLE DEPENDS "Sparkle" SPARKLE ) optional_component(LIBPULSE ON "Pulse audio integration" DEPENDS "libpulse" LIBPULSE_FOUND ) optional_component(VISUALISATIONS ON "Visualisations") if(NOT HAVE_SPOTIFY_BLOB AND NOT CRYPTOPP_FOUND) message(FATAL_ERROR "Either crypto++ must be available or the non-GPL Spotify " "code must be compiled in") elseif(CRYPTOPP_FOUND) set(HAVE_CRYPTOPP ON) set(HAVE_SPOTIFY_DOWNLOADER ON) endif() # Find DBus if it's enabled if (HAVE_DBUS) find_package(Qt4 REQUIRED QtDbus) endif () if (HAVE_VK) add_subdirectory(3rdparty/vreen) include_directories(${VREEN_INCLUDE_DIRS}) include_directories(${VREENOAUTH_INCLUDE_DIRS}) endif(HAVE_VK) # We can include the Qt definitions now include(${QT_USE_FILE}) # Remove GLU and GL from the link line - they're not really required # and don't exist on my mingw toolchain list(REMOVE_ITEM QT_LIBRARIES "-lGLU -lGL") option(BUNDLE_PROJECTM_PRESETS "Install Clementine's own copies of libprojectm presets - disable this if you want to use a system package instead" ON) if(ENABLE_VISUALISATIONS) # When/if upstream accepts our patches then these options can be used to link # to system installed projectM instead. option(USE_SYSTEM_PROJECTM "Don't set this option unless your system projectM library has been compiled with the Clementine patches in 3rdparty" OFF) if(USE_SYSTEM_PROJECTM) pkg_check_modules(LIBPROJECTM libprojectM) else(USE_SYSTEM_PROJECTM) add_subdirectory(3rdparty/libprojectm) set(LIBPROJECTM_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/libprojectm) set(LIBPROJECTM_LIBRARIES projectM) endif(USE_SYSTEM_PROJECTM) endif(ENABLE_VISUALISATIONS) # Build our copy of QSqlLiteDriver. # We do this because we can't guarantee that the driver shipped with Qt exposes the # raw sqlite3_ functions required for FTS support. This way we know that those symbols # exist at compile-time and that our code links to the same sqlite library as the # Qt driver. add_subdirectory(3rdparty/qsqlite) include_directories("3rdparty/qsqlite") # When/if upstream accepts our patches then these options can be used to link # to system installed qtsingleapplication instead. option(USE_SYSTEM_QTSINGLEAPPLICATION "Don't set this option unless your system QtSingleApplication library has been compiled with the Clementine patches in 3rdparty" OFF) if(USE_SYSTEM_QTSINGLEAPPLICATION) find_path(QTSINGLEAPPLICATION_INCLUDE_DIRS qtsingleapplication.h PATH_SUFFIXES QtSolutions) find_library(QTSINGLEAPPLICATION_LIBRARIES QtSolutions_SingleApplication-2.6) find_library(QTSINGLECOREAPPLICATION_LIBRARIES QtSolutions_SingleCoreApplication-2.6) else(USE_SYSTEM_QTSINGLEAPPLICATION) add_subdirectory(3rdparty/qtsingleapplication) set(QTSINGLEAPPLICATION_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/qtsingleapplication) set(QTSINGLEAPPLICATION_LIBRARIES qtsingleapplication) endif(USE_SYSTEM_QTSINGLEAPPLICATION) # QtIoCompressor isn't patched, so we can use a system version if it's # available find_path(QTIOCOMPRESSOR_INCLUDE_DIRS qtiocompressor.h PATH_SUFFIXES QtSolutions) find_library(QTIOCOMPRESSOR_LIBRARIES QtSolutions_IOCompressor-2.3) if(NOT QTIOCOMPRESSOR_INCLUDE_DIRS OR NOT QTIOCOMPRESSOR_LIBRARIES) add_subdirectory(3rdparty/qtiocompressor) set(QTIOCOMPRESSOR_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/qtiocompressor) set(QTIOCOMPRESSOR_LIBRARIES qtiocompressor) endif(NOT QTIOCOMPRESSOR_INCLUDE_DIRS OR NOT QTIOCOMPRESSOR_LIBRARIES) # When/if upstream accepts our or reimplement our patches then these options can be # used to link to system installed qxt instead. option(USE_SYSTEM_QXT "Don't set this option unless your system Qxt library has been compiled with the Clementine patches in 3rdparty" OFF) if (USE_SYSTEM_QXT) find_path(QXTCORE_INCLUDE_DIRS qxtglobal.h PATH_SUFFIXES QxtCore) find_path(QXTGUI_INCLUDE_DIRS qxtglobalshortcut.h PATH_SUFFIXES QxtGui) set(QXT_INCLUDE_DIRS ${QXTCORE_INCLUDE_DIRS} ${QXTGUI_INCLUDE_DIRS}) # We only need its header. We don't need to link to QxtCore. find_library(QXT_LIBRARIES QxtGui) else (USE_SYSTEM_QXT) add_definitions(-DQXT_STATIC -DBUILD_QXT_GUI -DBUILD_QXT_CORE) set(QXT_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/qxt) set(QXT_LIBRARIES qxt) if (NOT APPLE) add_subdirectory(3rdparty/qxt) endif (NOT APPLE) endif (USE_SYSTEM_QXT) find_path(ECHONEST_INCLUDE_DIRS echonest/echonest_export.h) find_library(ECHONEST_LIBRARIES echonest) # Use system gmock if it's available # We need to look for both gmock and gtest find_path(GMOCK_INCLUDE_DIRS gmock/gmock.h) find_library(GMOCK_LIBRARIES gmock) if(GMOCK_INCLUDE_DIRS) find_path(GTEST_INCLUDE_DIRS gtest/gtest.h) find_library(GTEST_LIBRARIES gtest) if(GTEST_INCLUDE_DIRS) set(USE_SYSTEM_GMOCK 1) set(GMOCK_LIBRARIES ${GMOCK_LIBRARIES} ${GTEST_LIBRARIES}) endif(GTEST_INCLUDE_DIRS) endif(GMOCK_INCLUDE_DIRS) # Use the system's sha2 if it's available. find_path(SHA2_INCLUDE_DIRS sha2.h) find_library(SHA2_LIBRARIES sha2) if(SHA2_LIBRARIES AND SHA2_INCLUDE_DIRS) message(STATUS "Using system sha2 library") set(USE_SYSTEM_SHA2 ON) else() message(STATUS "Using builtin sha2 library") set(USE_SYSTEM_SHA2 OFF) add_subdirectory(3rdparty/sha2) set(SHA2_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/sha2) set(SHA2_LIBRARIES sha2) endif() # Use the system libmygpo-qt if a recent enough version was found if(LIBMYGPO_QT_FOUND) set(MYGPOQT_LIBRARIES ${LIBMYGPO_QT_LIBRARIES}) set(MYGPOQT_INCLUDE_DIRS ${LIBMYGPO_QT_INCLUDE_DIRS}) else() add_definitions(-DMYGPO_EXPORT=) add_subdirectory(3rdparty/libmygpo-qt) set(MYGPOQT_LIBRARIES mygpo-qt) set(MYGPOQT_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/3rdparty/libmygpo-qt/) endif() # Qocoa add_subdirectory(3rdparty/qocoa) # Subdirectories add_subdirectory(src) if (WIN32) add_subdirectory(3rdparty/qtwin) add_subdirectory(3rdparty/tinysvcmdns) endif (WIN32) add_subdirectory(tests) add_subdirectory(dist) add_subdirectory(tools/ultimate_lyrics_parser) add_subdirectory(ext/libclementine-common) add_subdirectory(ext/libclementine-tagreader) add_subdirectory(ext/clementine-tagreader) add_subdirectory(ext/libclementine-remote) add_subdirectory(ext/libclementine-spotifyblob) option(WITH_DEBIAN OFF) if(WITH_DEBIAN) add_subdirectory(debian) endif(WITH_DEBIAN) if(HAVE_BREAKPAD) add_subdirectory(3rdparty/google-breakpad) endif(HAVE_BREAKPAD) if(HAVE_SPOTIFY_BLOB) add_subdirectory(ext/clementine-spotifyblob) endif(HAVE_SPOTIFY_BLOB) if(HAVE_MOODBAR) add_subdirectory(gst/moodbar) endif() # Uninstall support configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY) add_custom_target(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") # Show a summary of what we have enabled summary_show() clementine-1.2.3+git1354-gdaddbde+dfsg/COPYING000066400000000000000000001045131260417502300204260ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . clementine-1.2.3+git1354-gdaddbde+dfsg/Changelog000066400000000000000000001447041260417502300212130ustar00rootroot00000000000000Next release: Major features: * Vk.com support * Seafile support * Amazon Cloud Drive support * Add Ampache compatibility (through Subsonic service) * Add new analyzer "Rainbow Dash" * Answer to the ultimate question of life, the universe and everything * Add "Psychedelic Colour" mode to all analyzers Other features: * Add left click to fullsize cover on playing widget * Add m4b support for non-drm files * Ignore english articles for library sorting * Previous track in dynamic random mix * Improve the organize dialog * Add playlist save preference * Add a preference to disable the pause notification * Add a preference tab to hide some internet services * Add an option to disable inline song metadata editing * Use a save dialog option instead of quick change menu * Add ability to fetch lyrics from lololyrics.com * Add support for monitors in portrait mode * Add now playing widget mode * Add icons to extra * Add a source icon for CD tracks * Allow user to remove directories * Add ability to remove unavailable items from playlist * Add an import button to the transcode UI, allowing the user to pull in all files in a folder hierarchy to be transcoded * Make it impossible to collapse either side of the MainWindow splitter * Add menu items for updating and doing a full rescan of Google Drive * Increase Soundcloud cover image size * Ability to pause Spotify tracks * Add the ability to add or remove a Spotify track to a Spotify playlist through context menu * Add Spotify tracks to Spotify playlists by drag and drop * Add ability to get a link to share Spotify playlists and songs * Add ability to automatically set podcast as listened after sucesfully sending it to a device * Add ability to order podcasts by age * Allow user to download multiple podcasts at the same time * Add ability to cancel podcast downloads in progress * Allow user to hide listened podcast episodes * Huge improvement of the speed at startup * Improve performance of mass rating changes * Improve ripping performance * Persistent cache for pixmaps. Huge improvement of the performance when scrolling the library for example * Add AppData file for Clementine (for GNOME and KDE Software Centers) * Add iPod-like behaviour to previous button * Add "no song details" now playing widget option * Ability to add tracks to Spotify starred playlist by drag and drop * Add HipHop and Kuduro equalizers * Add AZLyrics lyric provider * Remember current playlist between restarts * (OSX) Use Alt+Tab to switch between playlist tabs * IDv3 tag lyrics support * Improve handling of Spotify Top Tracks and compilations * Scroll to last played track when switching playlists * Add stop after each song repeat mode * Sort discs numerically when using Group by disc * Add ability for sort by group and performer in the library view * Parse the year of a disc from musicbrainz * Add track intro mode * Add ability to add a search term with tab and space in the smart playlist window * Add love/ban (lastfm) global shortcuts * Add support for "original year" tags * Send album artist to Last.fm with liblastfm >= 1.0.0 * Add sample rate selection Bugfixes: * Fix crash when click on a SoundCloud entry in internet tab * Fix crash when marking podcast as listened * Fix crash after pressing OK in the device properties window * Fix stop after track which doesn't remove now playing * Fix play bleeding into next track after auto stop * Fix analyzer framerate when mouseover play scrubber * Fix issues with buffers sent to analyzer * Fix block analyzer framerate * Fix dbz possibility with small buffers at end of track * Fix dbz possibility in moodbar * Fix oversized album cover art * Fix Grooveshark SSL errors * Clean cover art from /tmp * Fix the rendering of the little numbers in the boxes on queued items in the playlist * Fix parsing of MusicBrainz data for discid * Fix random artifacting on nyanalyzer on startup * Fix podcasts length issues (which caused issues with seeking for example) * Fix too small equalizer window size * Fix labels which don't inherit system text colors in the edit tag dialog * Fix the mess of the queue manager after playlist re-sort * Fix for queue ordering issue in the playlist view when using c-d to dequeue a track * Fix detection of parent-relative paths in playlist saving * Fix path seperators issue when reading playlists * Fix m3u parser issue when an artist's name has a hyphen * Fix bug with percents when fetch the Jamendo catalogue * Fix a little dropout when transition to next track * Fix broken RockRadio.com for premium users * Fix Subsonic login with + characters in the password * Fix accents issue in when save playlist in xspf format * Fix issues with some songs length thanks to Taglib. People with Taglib installed on their system will have to wait a new release of Taglib * Fix moodbars not generating correctly * Fix socket leak in moodbar * Fix memory leak in tagreader * Fix crash when trying to fingerprint but missing a plugin * Fix infinite scan with Subsonic when the library is empty * Fix shortcut/media keys issues on Mac * Fix compilation issues on Yosemite * Fix performer tag for mpeg * Fix parsing issues with "innovative" datetime formats * Fix laggy interface on Mac * Fix crash in GrooveShark * Fix playback breaks in Spotify * Fix memory leaks * Fix crash when stopping song that is fading after pausing * Fix crash when trying to download a track but there is no current one playing * (OSX) Fix Soundcloud API Search which simply doesn't work * Fix default spinner gif image which shows white pixels around the image * Fix setting album artist tag for FLAC files if it already exists * Fix crash when Clementine lists the albums on Ampache * Fix Last.fm scrobbling after seek * Fix metadata not processed properly for some streams (Akamai) * Fix save state when the song was paused * (Windows) Fix context menu for the "now playing widget" * Fix some issues in Boom and Turbine analyzers * Fix song continuously rewinding when seeking using keyboard arrow keys * Fix OSD re-posistioning which doesn't work on multiple monitors * Fix Sonogram state while paused Removed features: * Remove Ubuntu One support * Remove Discogs support * Remove GrooveShark support Build system changes: * Update to gstreamer 1.0 * Don't compile vreen with link-time optimizations * Use the system's sha2 library if it's available * (Windows) Add libgmp-10.dll which is required by libgiognutls.dll * (Fedora) Don't depend on libplist or usbmuxd * Remove libindicate-qt * (Debian/Ubuntu) Remove internal copy of chromaprint and add it as dependency * (Debian/Ubuntu) Add libmygpo-qt-dev (=> 1.0.7) * Remove internal copy of libechonest and add it as dependency * (Windows) Uninstall a previous install of Clementine when installing a new version * (Windows) Remember the last installation path * (GNU/Linux) Follow freedesktop.org specifications for icons * (GNU/Linux) Add a 128x128 version of the Clementine icon * (OSX) Use a GTlsDatabase for gstreamer SSL * Use libcrypto++ instead of QCA Version 1.2.3: Bugfixes: * Fix compilation with GCC 4.9. * (Linux) Fix poor search performance with sqlite 3.8. * (Ubuntu) Fix dependency issues on Ubuntu 14.04. * (Windows) Upgrade to OpenSSL 1.0.1g to fix CVE-2014-0160. Version 1.2.2: Major features: * (Android Remote) Add kittens support. Bugfixes: * Rename SkyDrive to OneDrive. * Don't include the user's IP address in the log (from the network remote settings dialog). * (Debian) Fix a bug with HTTPS logins to all cloud storage providers. * (Mac OS X) Fix a bug in the workaround for a weird font issue on 10.9. * (Mac OS X) Fix rendering of source icons on retina displays. * (Android Remote) Don't advertise songs that aren't available. * (Android Remote) Fix playing songs with special characters in filenames. Version 1.2.1: Bugfixes: * Fix library download in the network remote. * Fix removing songs from playlist in the network remote. * Fix login failures with box.com. * (Mac OS X) Add a workaround for a weird font issue on 10.9. * (Linux) Fix a typo that would prevent the Spotify downloader button from ever being shown. Version 1.2: Major features: * Add support for indexing and playing music from Box, Dropbox, Skydrive, and Ubuntu One. * Add support for Subsonic. * Remote control support for Android. * Add a Playlist tab to the sidebar. Starred playlists are saved in here when their tabs are closed. Other features: * Add configurable blur & opacity to album art when used as a playlist background. * Support Opus where available. * Support .mka and .oga file extensions. * Parsing support for WPL playlists. * Sort providers by user preference. * Add year and bitrate to MPRIS2 messages. * Add "not equals" operator to fields in the smart playlist wizard. * Add an option to write ratings, play count and scores to files. * Add options to show the rating and score on the OSD. * Add support for POPM tags. * Add support for FMPS tags in Ogg, FLAC, MP4 and ASF files. * Compile the bundled Taglib with ASF, MP4 and Opus support. * Make it possible to cancel cover searches. * Add an option to resume playback on startup. * Add support for Performer and Grouping tags. * Add Radio GFM. * Add an Apply button to the settings dialog. * Make it possible to mark all episodes of a podcast as new/listened. * Add an option for fading in/out on pause/unpause. * Add stereo balance slider to the equalizer. * Add a --restart-or-previous commandline flag. * Allow files to be transcoded directly from the playlist. * Export downloaded album covers Removed features: * Removed iDevice support - it doesn't work well with modern devices and libgpod isn't being updated to support them. * (Windows) Removed support for WMDM devices. This was very fragile to cross-compile and was buggy and untested. * (Mac OS X) Removed support for 10.6. OS X 10.7 or later is now required. Bugfixes: * Fix gapless playback! * Detect corrupt FLAC files when parsing tags. * Load tags from local files asynchronously. * Show more than 5 album results at a time from Spotify. * Detect last.fm login failures correctly. * Support x-audio/* mime types for podcasts. * Locale-aware library sorting. * Remove duplicate tracks from Spotify search results. * Do not fetch Magnatune library until the service is expanded. * Sort Magnatune library after refresh. * Make the playlist parser recognise 2 character URL schemes. * Read and write more metadata for MP4 tags. * Translate Unity quicklist actions. * Fix a memory leak when fingerprinting songs. * Preserve user stats when opening the edit tag dialog. * Fix neverending task when a Grooveshark session is invalid. * Elide the fancy sidebar text on the right instead of the middle. * Increase the maximum size of the moodbar cache. * Use a new Amazon access key. * Select the next tab when a playlist tab is closed. * Fix radio playlists in non-English locales. * Fix cursor following playback. * Hide moodbar playlist column by default. * Use native language names in the language selector where available. * Only show a tooltip on sidebar tabs when needed. * Never start playing a background stream (like Hypnotoad) on startup. * Run the moodbar generation at a lower CPU and IO priority. * Pressing space with the seekbar focused now toggles play/pause. * Update tray icon progress immediately on track change. * Don't replace song metadata with blank m3u EXTINF metadata. * Fix a bug when fingerprinting files with non-ascii characters. * Fix occasional freezing analyzers. * Make wheel events on the analyzer change the volume. * (Mac OS X and Windows) Highlight the actual file in Finder or Explorer when using "Show file in browser". * (Windows) Run Clementine with normal user privileges after installation. * (Windows) Fix a "Error loading http://audio/mpegurl" error on first start. * (Mac OS X) Don't probe stupid printers when scanning for music devices. * (Mac OS X) Show a better error message when using an old version of OS X. Build system changes: * Add continous builds for Fedora Core 18, Ubuntu 12.10 and Ubuntu 13.04. * (Linux) Use the system's version of libmygpo-qt if available. * (Mac OS X and Windows) Upgrade to Qt 4.8.3. * (Mac OS X) Sign release .dmgs. Version 1.1.1: Bugfixes: * (Windows) Fix a crash that would always occur for some users. * (Linux) Bundle Taglib 1.8 on older distros to enable Google Drive support in Clementine. Version 1.1: Major features: * Podcast support with integration with gpodder.net. * Add support for indexing and playing music from Google Drive. * Add Soundcloud support. * Add jazzradio.com support. * Moodbar support. Other features: * Show nearby concerts for an artist using the Songkick API. * Support "My Music" in Grooveshark. * Support logical operators in the playlist filter. * Remove Spotify and Grooveshark search playlists in favour of the internet tab. * Support liblastfm1. * Make the grouping of global search results configurable. * Support top lists in Spotify (eg. top 100). * Support drag and drop from the global search to the playlist. * Support undo for playlist sorting and shuffling. * Updated global search UI. * Verify and backup database on startup. * Support mono playback. * Add an option to prefer the AlbumArtist tag over the Artist tag when scrobbling to Last.fm. * Add the ability to get a Grooveshark URL to share a songs and playlists. * Support loading spotify URLs from the command line. * Add "Very high" quality setting for visualisations. * Support setting the current album cover or a custom image as the playlist background. * Add support for darklyrics as a lyrics source. * Add %filename% as a custom OSD variable. * Show .mka, .ape and .wv in file view. * Load cover art from mp4 files. * Copy text from all visible columns when copying a playlist row. * Add "Edit file information" and "Show in file browser" actions to the file view. * Add Discogs as an album cover provider. * Nyanalyzer cat now goes to sleep between songs. * (Mac OS X) Support drag and dropping files and folders on the dock icon. * (Mac OS X) Support notification center instead of Growl on Mountain Lion. * (Mac OS X) Support fullscreen mode in Mountain Lion. * (Mac OS X) Draw high resolution text when using a retina display. Bugfixes: * Use new authentication API for di.fm/sky.fm to fix logging in to those services. * Move tag reading to a separate process to isolate taglib crashes. * Fix hang on exit while library is being changed. * Fix parsing of cue sheets longer than 99 minutes. * Preserve the current song in the library view when filtering. * Previous button actually goes to the previous track when repeat track mode is enabled. * Fix crashes when requesting MPRIS data during startup. * Enable horizontal scrolling in the Transcode dialog so the user can see the whole path. * Stop showing the search box for Grooveshark and Spotify if the user is not logged in. * Fix neverending task in Grooveshark if the user is logged out. * Fix 1px size change in the tool buttons in the main window. * Dragging songs to the bottom of the playlist now adds them to the bottom. * Improve startup time by moving DeviceManager initialisation off the main thread. * Fix crash when trying to seek with no song playing. * Scale the missing cover image in the edit tag dialog correctly. * Use the first visible column when dragging and dropping within the playlist. * Fix a crash at startup when initialising the library before the grouping settings have been loaded. * Handle various artists correctly in global search. * Add suggestions in global search. * Follow HTTP redirects correctly. * Find hidden album art. * Support genre and date in cue sheets. * Cache album art in the library model to prevent flicking when filtering. * Locale-aware sorting of Grooveshark songs. * Sort Grooveshark playlists by name. * Work around a bug in Qt so the number of mouse wheel scroll lines is respected. * Fix transparency of visualisation overlay. * Fix transparency of pretty OSD. * Show thumbnails of album art in the tray icon tooltip instead of full size images. * Allow upper case headers in PLS files. * Support libimobiledevice 1.1.2. * Fix crash when drag and dropping from a separate Clementine instance. * Sort SomaFM streams alphabetically. * Fix crash when OpenGL is unavailable. * Fix some resource leaks in the Grooveshark support. * Update the year when completing tags automatically. * Fix a crash when changing a song's rating. * Fix a crash when searching for album covers. * Load spotify URLs correctly from playlists. * (Linux) Fix a crash on exit when Gnome accessibility is enabled. * (Linux) Work around a hang on exit caused by certain NVidia drivers. * (Linux) Support devices with no partition table. * (Linux) Support "open with" in Ubuntu. * (Linux) Fix a crash in PlayTrack MPRIS method. * (Linux) Fix the types of some MPRIS fields. * (Mac OS X) Fix HTTPS streams. * (Mac OS X) Support keyboard shortcuts in native Mac search fields. * (Mac OS X) Use Qocoa instead of custom hacks for native search widgets. * (Mac OS X) Fix crash on exit. * (Mac OS X) Avoid churn from frequent FSEvent stream updates. * (Mac OS X) Hide empty help menu on Mac. * (Mac OS X) Fix leaks in device handling code. * (Windows) Remove the drop shadow in the OSD. * (Windows) Do not show the OSD in the taskbar. * (Windows) Fix a crash when clicking on the empty button in the thumbbar. Build system changes: * Add continous builds for Fedora Core 17 and Ubuntu 12.04. * Show which dependencies are missing when trying to enable optional features. * (Mac OS X and Windows) Upgrade to Qt 4.8.2. Version 1.0.1: Bugfixes: * Use Chromaprinter and Acoustid instead of Echoprint and MusicDNS. * Make it possible to play songs from connected iPod Touches again. * (Windows) Fix an SSL issue that would sometimes result in an "Invalid username or password" error when logging in to Grooveshark. * (Mac OS X) Use FSEvent-based filesystem watcher to fix a number of crashes due to running out of file handles when monitoring a large library. Version 1.0: Major features: * Add Spotify support. * Add Grooveshark support. * Add Digitally Imported (di.fm) and Sky.fm radio stations. * Add a global search feature: - A single place to search for music and radio. - Includes your library, radio streams, Spotify and Grooveshark. * Add audio CD support. * Add Amazon as an alternate provider for album cover art. * Add Nyanalyzer Cat. Other features: * Add transcoder options. * Display album art from FLAC tags if using a version of taglib that supports it. * Rename the existing "Shuffle by album" mode to "Shuffle tracks in this album", and add a new "Shuffle albums" mode that plays all the tracks in each album sequentially, but then jumps to a different random album afterwards. * Improve the organisation of the settings dialog. * Add scroll bars to the settings dialog if it's too big to fit on the screen. * Improve the settings dialog pages for online services like Last.fm to make it easier to log in and log out. * Add a warning about not being able to play Last.fm radio if not a subscriber. * Group album cover search results by category. * Allow the artist and album to be specified separately when searching for album covers. * Made album cover art searches more clever - they will select the "best" image automatically rather than just choosing the first one. * Show some statistics after searching for album cover art. * Show the album cover dimensions on each image when searching for art. * Support dragging and dropping images onto the cover in the edit tag dialog. * Double clicking a playlist tab now lets you rename it. * Add keyboard shortcuts to navigate between playlist tabs. * When songs are added to the end of the playlist, scroll the playlist to ensure the top one is visible. * Make dynamic playlists use the limit specified in the smart playlists dialog. * Add an "Expand" button to add more tracks to a dynamic playlist. * Make it possible to use relative dates in smart playlist criteria. * Add an option to remove the playlist background image. * Add options to customise OSD messages that are shown on song changes. * Add a button in the status bar to toggle Last.fm scrobbling. * Show a song's URL in the title playlist column if it doesn't have a title. * Add a new logging system. * Add file type filtering to the Files view. * Add a --version command line option. * Add a --toggle-pretty-osd command line option. * Add support for custom lastfm:// URLs. * Make the version number in the About dialog selectable. * Elide the hint text in search boxes when it's too long. * Show the artist and album name in the title of the "Show fullsize" window. * Remember which tab was selected last time in the edit tag dialog. * Cache lists of streams/friends fetched from Last.fm, di.fm, soma.fm, etc. * Improve handling of album artist tags. * (Mac OS X) Make the album cover search dialog modal so it acts like a sheet. Bugfixes: * Put a limit on the size of the playlist's undo stack and don't record operations that affect more than 500 rows. Reduces memory usage when adding or removing lots of items to the playlist. * Buffer audio from all sources, not just http. Fixes audio stuttering when playing from mounted network locations. * When adding files to the playlist that aren't in the library, quickly add playlist entries first and then load more metadata in the background. * Scrobble radio streams even when the length is unknown. * Re-enable the Last.fm Love button after going to another song in a stream. * Scrobble tracks properly if they're loved before the half-way point. * Fix a bug that would sometimes cause the wrong songs to be scrobbled. * Fix a bug where a song's play count would be updated continuously if scrobbling was disabled. * After deleting an item from a playlist move the selection to the next item instead of the previous one. * Translate dynamic playlist names properly at runtime. * Fix a crash on startup if the album cover loader took too long to start. * Show tooltips in the sidebar only in Tabs and Icons Only modes. * Fix the byte order of album cover art images sent over dbus on big endian machines. * When songs disappear from the filesystem, mark them as unavailable instead of completely removing them from the database. * Read album artist tags from ogg/flac/mp4 files properly. * Make the --pause command line option always pause, instead of behaving the same as --play-pause. * Fix a crash when clicking on the "Smart playlists" folder when the library grouping is set to None/None/None. * Keep the state of the rain and hypnotoad menu items in sync. * Fix a bug where playlist columns would slowly change size the more times you opened and closed Clementine. * Save the state of the playlist columns' sort order. * Assume Icecast-style stream metadata is in the "Artist - Title" format, as this seems more common than "Title - Artist". * Preserve high quality (>16-bit) audio streams. * Stop the M3U parser from going into an infinite loop when parsing a file with an invalid #EXTINF line. * When renumbering tracks, number the first track 1 instead of -1. * Fix a bug where notifications would be shown for the wrong song after editing file tags. * When organising files, make %albumartist behave like %artist if the song has no albumartist tag set. * Use locale-aware sorting for artists and albums in the album cover manager. * When stopping due to "Stop after this track", set the current song to the one after, so when the user presses Play it plays the next song instead of the last one again. * Fix a bug that stopped Magnatune album downloads from working. * Improve detection of playlist types when loading a playlist smaller than 512 bytes. * Fix Last.fm authentication on Qt 4.8. * Save the playlist column alignment setting properly. * Indicate which playlist column alignment is currently in use in the menu. * Speed up adding entire folders to the playlist from disk. * Load cover art for the library in a background thread. This makes opening nodes with a large number of albums much faster. * Make manual track changes ignore the "Repeat track" setting * Use MP3 URLs for Jamendo instead of Ogg since they keep breaking the Ogg ones. * Fix a crash when asked over DBus or the commandline to play a track in the playlist that doesn't exist. * Fix a bug where moving songs down in the playlist could not be undone properly. * (Linux) Fix device detection using DeviceKit. * (Linux) Recognise iPods correctly when using GIO. * (Linux) Work around an NVIDIA driver bug that would cause Clementine to use 100% CPU on exit. * (Gnome 3) Register for media key notifications properly. * (Gnome 3) Run the new gnome-control-center command to open the keyboard shortcuts dialog. * (Ubuntu) Add Clementine to the Unity system tray whitelist on startup. * (Ubuntu) Don't use Unity's global menubar. * (OpenBSD) Fix compilation errors in projectm. * (Mac OS X) Fix free space and capacity information for MTP devices. * (Mac OS X) Disable the popup delay settings when using Growl. * (Mac OS X) Blacklist certain USB devices from MTP probing. * (Mac OS X) Fix global shortcuts in Lion. * (Mac OS X) Fix native search widgets in Qt 4.8. * (Windows) Fix an occasional crash when connecting devices. * (Windows) Fix a bug where filenames containing unicode characters could not be transcoded. * (Windows) Close transcoded files after writing them. * (Windows and Mac OS X) Use a git build of taglib to fix a crash when loading malformed ID3v2 tags. Build system changes: * Clementine has now moved from svn to git. Details are on Google Code: http://code.google.com/p/clementine-player/source/checkout * Clementine's translations have moved from Launchpad to Transifex: https://www.transifex.net/projects/p/clementine/ * (Linux) Added packages for Fedora 15, Fedora 16 and Ubuntu Oneiric. * (Mac OS X) Compile dependencies in a more controlled way. * (Mac OS X) Create a prettier DMG package. * (Windows) Add a cmake option to enable the debug console in release mode. Version 0.7.1: Bugfixes: * Fix several compilation errors under GCC 4.6.0. * Fix a regression that broke gapless playback between certain songs. * Fix the behaviour of --seek-by and --seek-to commandline options. * Fix a crash when the visualisation window was resized to 0x0 pixels. * (Linux) Fix the behaviour of the InsertUrls DBUS method. * (Mac OS X) Fix a crash on startup on machines without X11 installed. * (Mac OS X) Fix a bug that would make Clementine try to update to an earlier version. Version 0.7: Major features: * Brand new "Edit track information" dialog. You can now edit more fields, change multiple songs at once, change album cover art and view song statistics. Added an option to identify songs and fill in their tags automatically using information from MusicBrainz. * Add support for .cue files. Songs in a cuesheet appear in the playlist and your library as separate tracks. * Add "Duplicates only" and "Untagged songs only" views to the library that help you find and correct badly tagged music in your library. * Add an option to show album covers in the library view. This is on by default, but you can turn it off again in the Preferences dialog. * Add an option to load cover art directly from a URL. * Clementine now gracefully handles deleted files by skipping them on playback attempt and greying them out in the playlist view. * Add a "Full library rescan" option which should rescan your library much more thoroughly than before (but will take longer). * Add a "Show in file browser" option to the library and playlist menus. * Add a fancy tooltip to the track seek slider, showing the position that you're about to jump to and its distance from the current position. * Add support for network proxies. Clementine will use your system's proxy by default, but you can configure a different one in the Preferences dialog. * The "Kittens" extra now fetches even fluffier kittens. * Hypnotoad: now available in fullscreen HD. Other features: * Load embedded cover art from ogg files. * Add a backspace shortcut to the files view. * Pressing ESC will clear and focus the search box. Typing in the playlist view will focus the search box and start searching. * Pressing space in the playlist will play/pause the current track. * Add global shortcuts for rating songs. * Add global shortcuts for all of the repeat and shuffle modes. * Middle-clicking a song now enqueues it into the playlist. * Download higher resolution images from last.fm. * Add options to the now-playing widget's menu to change the album art. * Dragging an image file onto the now-playing widget will now set that image as the cover art for the album. * You can now tell the library scanner which filenames it should prefer when looking for album cover art. * Add a configurable timeout when searching for song and artist info. * Add tooltips to the album cover manager that show the artist and album name. * Improve the options in the context menu for adding tracks to the playlist from the library. Default behaviours are now configurable in the Preferences dialog. * You can now use "file path" when creating dynamic playlists. * The search box in the album cover manager now searches in artist names as well. * Move the clear button inside search boxes. * Make the pretty OSD snap to the center of the screen when dragging. * Add a text alignment setting to playlist columns. * The scroll wheel now scrolls through images in the artist info view. * You can now drag songs onto empty space in the playlist tab bar to add the songs to a new playlist. * Fade out the currently playing song when exiting Clementine. * Centre on the last played song when restoring a playlist. * Add a menu item to change analyzers' framerate. * Add an option to hide dividers in the library view. * Ability to use either a "time left" timer or a "total time" timer for songs. * (Windows) Add support for automatic updates. The second time you start Clementine you are asked whether you want to check for updates automatically. You can check manually at any time in the Tools menu. * (Windows 7) Add playback buttons to the Windows 7 taskbar icon. Bugfixes: * Fix several issues loading files with non-ascii characters in their filenames. * Fix several crashes when loading malformed tags from MP3 files. * Fix a crash when clicking the "cancel" button on a dynamic playlist while the preview is still being loaded. * Fix a crash when skipping quickly through tracks while the Artist Info tab was open. * Fix a crash on exit if you have the Magnatune list open. * Fix a crash when closing a playlist that has songs still loading. * Fix a crash when removing the first, active playlist. * Fix a race condition on startup that might lead to two instances of Clementine being started. * Fix a display bug in the "Last played" column for songs that haven't been played in the last week. * Improve the sorting of untagged songs loaded from directories. * Fix a build failure on ARM. * Do library initialisation in the background - fixing a GUI freeze when loading large collections. * Fix a bug where columns would sometimes not appear in the playlist. * Fix some graphical bugs when resizing the sidebar when it is blurred. * Hide the score and comment columns by default, increase the size of the sidebar. * Fix a database error when searching for " characters in the library. * Fix an issue when trying to sign in to last.fm with a username containing special characters. * Fix the "date" and "rating" smart playlist comparisons. * Update statistics properly when playing songs shorter than 30 seconds. * Don't re-read tags from files when loading a playlist if those songs are already in the library. * Make it possible to disable all lyric providers. * Make it possible to delete the active playlist. * Add a workaround for broken XML entities in ASX playlists. * Sort playlist tabs properly when closing and re-opening Clementine. * (Windows) Fix MP3 transcoding. * (Windows) Better error handling when parts of the Windows Media Device Manager SDK aren't installed (like on Windows Server). * (Windows) Fix a crash on startup when a device was connected that gave Clementine an invalid icon. * (Linux) Various MPRIS2 fixes. * (Mac OS X) Increase the maximum file descriptor limit so larger collections can still be monitored for changes. Build system changes: * Remove the old xine, VLC and Phonon backends. These weren't maintained any more and didn't have as many features as the GStreamer backend. * Make Last.fm optional. * Clementine now builds correctly with Clang. * Don't run tests for features if those features are disabled. * (Linux) Make DBUS optional. * (Windows) Upgrade to Qt 4.7.1. * (Mac OS X) Switch the HTTP gstreamer plugin to soup instead of neon. Version 0.6: Features: * Added a Song Info tab that contains: - Lyrics fetched from 17 different websites - Statistics, play counts and tags from Last.fm - Wiki from Last.fm * Added an Artist Info tab that contains: - Photos - Biographies from Wikipedia, Last.fm, Amazon and more - Similar artists * Added smart playlists and dynamic playlists. * Add ratings, play counts and skip counts to the library, and remember when a song was last played. * Add a directory of Icecast radio stations to the Internet tab. * Add Jamendo support to the Internet tab. * Redesigned the sidebar so it looks better with the new "Song info" and "Artist info" tabs. The old style can be used again by right clicking on the sidebar. * Add support for "custom" Last.fm radio stations - see: http://burnysblog.blogspot.com/2010/04/combo-station-urls.html * Inhibit the Gnome, KDE and OS X screensavers when watching visualisations. * Add an option to configure the gstreamer buffer size. * Add a Mute option to the menus and the panel icon. * Add a tooltip to the panel icon showing the currently playing track. * Change the window title to the name of the currently playing track. * Add a comment column to the playlist. * Add volume controls for Rain and Hypnotoad. * Allow editing tags from the library pane. * Add a "Delete from disk" item in the playlist menu. * Single clicking an item in the library view now expands it. * Kittens! * (Linux) Add MPRIS2 support, see http://www.mpris.org/2.0/spec/ * (Ubuntu) Add monochrome panel icons. * (Ubuntu) Show Clementine in the Gnome sound menu. Bugfixes: * Replace Last.fm loved tracks with mix radio, see: http://www.last.fm/stationchanges2010 * Don't block the GUI when starting a background stream. * Don't block the GUI when searching or sorting a large library. * Fix a large number of bugs in the MPRIS API. * Use CBR instead of VBR when encoding MP3 files to copy to devices. * Fixed parsing of DOS line endings in M3U files. * Fix inline editing of multiple tracks in the playlist. * Fix a bug where pressing F2 would sometimes edit the wrong field. * Ignore duplicate items from playlists when opening directories. * Ignore bad metadata in a file if good metadata has already been loaded. * Don't show CD drives in the devices tab. * Don't stop the track prematurely if it's the last one in the playlist and fadeout is disabled. * Write URLs in XSPF playlists properly when saving to a folder inside the library. * Fix some usability issues with the "Show in various artists" feature. * Prevent the last playlist column from being hidden. * Don't download the entire Magnatune catalogue each time Clementine is run. * (Windows Vista) Fix a memory leak when using visualisations. * (KDE) Fix a bug with session management on KDE. * (Ubuntu) Fix compilation with the Gold linker which is used on Natty. * (Mac OS X) Store user files in Library/Application Support/ Version 0.5.3: Bugfixes: * Fix a crash that would occur when the library scanner encountered a song with invalid metadata. * Show the patch version in the version string. * Work around a broken version of liblastfm. * (Linux) Add some missing metadata to the MPRIS interface. * (Mac) Fix mass-storage devices. Version 0.5.2: Bugfixes: * (Windows) Fix a serious handle leak. * (Fedora) Fix gstreamer dependency problem in the 32-bit package. Version 0.5.1: Bugfixes: * (Fedora) Fix sqlite dependency problem on startup. Version 0.5: Features: * Add support for iPods, MTP music players and USB mass storage disks. You can now copy songs on to and manage files on your portable devices. Music will get transcoded automatically if the device you're copying to doesn't support the file type. * Add a queue manager. You can now add songs to a queue to have them played before anything else in the playlist. * Add an Organise Files dialog that lets you copy files into your library or rename them to follow your naming convention. * Add support for Wii Remotes - you can now use your Wii Remote as a remote control for Clementine! * The columns in the playlist will now stretch to fit the whole window size. * Load embedded album art from id3v2 tags. * Load local files from the library instead if they exist, meaning existing album art will be used. * Support drag and drop between playlists. * Add options to disable library scanning. * Add an option to group the library by file type. * Add an option to change the GUI language. * Add an option to disable the current track glow effect. * Add a global shortcut to show/hide the OSD. * Show progress information for individual tracks when transcoding. * ALL GLORY TO THE HYPNOTOAD. * (Linux) Add an svg icon. * (Mac) Show now playing information in the dock menu. * (Windows Vista and Windows 7) Add Clementine to the Default Programs menu. * (Windows Vista and Windows 7) Blur the background of the OSD. Bugfixes: * Fix a memory leak when playing ogg streams. * Reduce the constant CPU usage when playing music. * Greatly reduce CPU usage when using the equalizer. * Greatly reduce startup time. * Move lots of disk IO to the background, making the GUI more responsive. * Display an error dialog instead of crashing if no projectM visualisations were found. * Fix a crash when the "Last.fm" tree item was expanded. * Fix a bug that would create empty "Unknown" categories in the Library. * Fix a black visualisations window when using a non-English locale. * Fix a crash when closing the visualisation window with the ESC key. * Detect symbolic links in the music library properly. * Pick gstreamer codecs automatically when transcoding, insteading of using a hardcoded list. * Sort items in the library that don't have a track number set properly. * Sort library items with UTF-8 characters properly. * Use the file extension as well as the mime-type when figuring out how to load a remote playlist. * Handle "Artist - Title" icycast metadata properly. * Filtering the playlist now focuses the currently playing song. * Filtering the playlist is now case-insensitive. * Load the "albumartist" tag from flac and ogg metadata. * Ignore garbage iTunNORM comment fields in ID3v2 tags. * Be sure to always enable the OK button in the settings dialog properly. * Fix a bug that would prevent covers from loading in the cover manager. * (Linux) Make the commandline interface work even when not running an X server. * (Mac) Reduce the default font size to fit in with other OS X applications. * (Mac) Use smooth scrolling in the playlist view. * (Mac) Correctly load M3U files created by iTunes. * (Windows) Seed the random number generator properly so the same tracks don't get played over and over when using shuffle. * (Windows) Use \ instead of / in several places in the GUI. * (Windows) Fix a crash when authenticating with Last.fm. Version 0.4.2: Bugfixes: * (Linux) Fixed a bug where Clementine wouldn't start at all on Slackware, openSUSE, or any other distro without FTS3 support in sqlite. Version 0.4.1: Bugfixes: * (Mac) Fix global shortcuts issue. Version 0.4: Features: * Support for multiple, tabbed playlists. * Support for loading and saving XSPF, M3U, PLS and ASX playlists. * Fullscreen visualisation support using projectM. * Added a search bar to filter playlists. * Magnatune integration - search, stream and download from Magnatune's collection of DRM-free music. * Music transcoder that can convert your music to mp3, ogg, flac, spx, 3gp or m4a from any format that's supported by Clementine. * ReplayGain support for volume normalisation. * Improved the manual search feature of the album cover manager - you can now enter text to search for and pick the best cover from a list of results. * Added a "now playing" widget to the main window, and rework the UI slightly. * Added a progress bar to the album cover manager. * Added a "Configure global shortcuts" dialog. * Added a menu item to add whole folders to the playlist. * Added menu items in the Library view to "load" tracks and replace the whole playlist. * Added a "Jump to the currently playing track" menu item. * Added statusbar text saying how many songs are in the playlist. * Added a background rain option from http://www.rainymood.com/ * Added some keyboard shortcuts for common actions. * Library scanning on startup is now optional. * Library scanning now shows progress information in the status bar. * New application icon. * The pretty OSD is now even prettier. * (Linux) Use icons from the desktop icon theme where possible. Bugfixes: * Searching through large libraries is now much faster. * Gapless playback should now work all the time with all formats. * Song fading and crossfading shouldn't get cut off early on some sound drivers. * Automatically detect and fix non-UTF8 character encodings in song tags. * Fix the 5 second delay between starting the first Last.fm track and showing the cover-art in the notification. * Lower the CPU usage of the currently playing track animation. * Fixed a bug that would cause very high CPU usage after playing a number of tracks. * MMS streams that redirect to a RTSP stream should now play properly. * Group error messages together so the user isn't overwhelmed by dialogs. * Pressing "previous" in a shuffled playlist should follow the same order. * Adding whole directories to the playlist now happens in the background so it doesn't block the GUI. * Fix a bug where Clementine would forget which playlist columns had been hidden which lead to "ghost" columns that were shown but invisible. * (Linux) Fix MPRIS pause behaviour. * (Windows) \\host\share\file style URLs are now playable. * (Windows) Use the improved directsound8 audio driver from Songbird, fixing several playback issues on Windows. * (Windows) Fix playback of AAC and WMA files, as well as MMS streams. * (Windows) Fix a bug that prevented loading of any JPEG album covers. * (Windows) Fix the animated busy spinner. * (Mac) Add a list of supported filetypes so OS X knows which file types Clementine can open. * (Mac) Fix playback of various filetypes. * (Mac) Fix dock menu when Clementine is minimised. * (Mac) Support custom key combinations for global shortcuts (only on Snow Leopard and higher). * (Mac) Hide behaviour tab as it does nothing. Version 0.3: Features: * It is now possible to group the library by any field. * Clementine now uses GStreamer to play music. * There is now an equalizer in the Tools menu. * Crossfading between tracks, and gapless playback. * Add an OSD for operating systems that don't have native notifications. * MPRIS support - you can now control Clementine using compatible remote control applications. * You can now control Clementine using the command line. * Better tag editing. You can now automatically renumber tracks, bulk-edit fields, and edit tags directly from the playlist. * Autocompletion of album and artist names when editing tags. * Undo and redo in the playlist. * Add a menu option to delete items from the playlist. * Add options to hide/show the main window on startup. * Add options to sign out of Last.fm, and hide the Last.fm buttons. * Automatically scroll to the currently playing song. * Automatically start playing again from the previously playing track. * Show a tiny "play" or "pause" icon in the system tray. * Show a nicer indicator in the playlist when drag+dropping songs. * (Windows and Mac) Global shortcut support. * (Windows) The analyzer now works. * (Mac) Remove the system tray icon, and minimize to the dock properly. * (Mac) Use Sparkle for updates. Bugfixes: * The library scanner should now be much more efficient, and won't scan your entire collection on startup. * Saving and loading huge playlists should now be much faster. * Fix several issues with runtime linking of sqlite. * It is now possible to play songs that have '#' in the name. * The currently playing track animation is now a more readable colour. * Fix a crash when right-clicking an empty area of the playlist. * Fix a crash when starting Clementine from a directory that contained another directory called "clementine". * Fix a crash when deleting songs from the library while the library scanner is running. * Fix an occasional crash when playing music. * Left clicking on the track slider will now jump to that position. * Stop the user from rearranging album covers in the cover manager. * (Linux) Stop Clementine from creating loads of notifications at once. * (Linux) Clementine will no longer prevent KDE from logging out. Internationalization: * Added translations for Portuguese, Czech, Danish, British English, Finnish, French, Galician, German, Italian, Kazakh, Bokmal, Polish, Romanian, Swedish and Turkish. Buildsystem changes: * (Linux) Use the notification daemon directly, instead of through libnotify. * It is now possible to select other audio backends (xine, vlc, phonon) through a cmake option, although doing so is not recommended, and may cause a terrible plague to wreak havok and despair upon your friends and loved ones. You have been warned. Version 0.2: Features: * Album cover art is now automatically loaded from disk for your library * Cover manager downloads missing covers from Last.fm * Covers for Last.fm radio tracks are shown in notifications * Much better "Various Artists" detection * Menu items to force albums to be shown under "Various Artists" * Support for M3U and XSPF playlists * Menu items to add files and streams by URL * Shuffle and Repeat modes for the playlist * Option to hide the system tray icon * Option to show notifications when changing volume (disabled by default) * Playlist columns for albumartist, composer, file type, date * Menu item to automatically number tracks in the playlist * More 2D analyzers from Amarok 1.4 * (Linux) Media keys (play, stop, etc.) should work under Gnome Bugfixes: * Fixed Last.fm scrobbling for local music * Fixed problems writing UTF-8 tags * Searching the library now supports unicode * Fixed a serious memory leak when the window is minimized to the tray * Fixed tracks without an album field not showing up in the library * Clicking the track slider to move it now works properly * The track slider should no longer move around underneath you while being dragged * Colours should now obey the system colour scheme * Searching the library should now be much faster * (Windows) Fixed logarithmic volume issues * (Linux and Mac) Volume is now saved and restored properly when you exit * (Linux and Mac) Library scanner now runs at a low IO priority to make it much less intrusive * (Mac) Fix crash when universal access options are enabled Internationalization: * Added translations for Spanish, Russian, Greek and Slovak Buildsystem changes: * Moved from qmake to cmake * It's now possible to build without libnotify * Unit tests using gtest clementine-1.2.3+git1354-gdaddbde+dfsg/README.md000066400000000000000000000040041260417502300206440ustar00rootroot00000000000000Clementine ========== Clementine is a modern music player and library organizer for Windows, Linux and Mac OS X. - Website: http://www.clementine-player.org/ - Github: https://github.com/clementine-player/Clementine - Buildbot: http://buildbot.clementine-player.org/grid - Latest developer builds: http://builds.clementine-player.org/ Opening an issue ---------------- ### Ask for a new feature Please: * Check if the new feature is not already implemented (Changelog) * Check if another person didn't already open an issue * If there is already an opened issue there is no need to comment "+1", it won't help. Instead, you can subscribe to the issue to be notified of anything new about it ### Report a bug Please: * Try the latest developer build (http://builds.clementine-player.org/) to see if the bug is still present (**Attention**, those builds aren't stable so they might not work well and could sometimes break things like user settings). If it works like a charm even though you see an open issue, please comment on it and explain that the issue has been fixed * Check if another person has already opened the same issue to avoid duplicates * If there already is an open issue you could comment on it to add precisions about the problem or confirm it * In case there isn't, you can open a new issue with an explicit title and as much information as possible (OS, Clementine version, how to reproduce the problem...) * Please use http://pastebin.com/ for logs/debug If there are no answers, it doesn't mean we don't care about your feature request/bug. It just means we can't reproduce the bug or haven't had time to implement it :o) Compiling from source --------------------- Get the code (if you haven't already): git clone https://github.com/clementine-player/Clementine.git && cd Clementine Compile and install: cd bin cmake .. make -j8 sudo make install See the Wiki for more instructions and a list of dependencies: https://github.com/clementine-player/Clementine/wiki/Compiling-from-Source clementine-1.2.3+git1354-gdaddbde+dfsg/cmake/000077500000000000000000000000001260417502300204475ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/cmake/C++11Compat.cmake000066400000000000000000000004371260417502300232730ustar00rootroot00000000000000# Hacky stuff to make C++11 features work with old compilers. if (CMAKE_COMPILER_IS_GNUCC) execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) if (GCC_VERSION VERSION_LESS 4.7) add_definitions(-Doverride=) endif() endif() clementine-1.2.3+git1354-gdaddbde+dfsg/cmake/Deb.cmake000066400000000000000000000007601260417502300221460ustar00rootroot00000000000000set(DEB_ARCH amd64 CACHE STRING "Architecture of the deb file") set(DEB_DIST "unstable" CACHE STRING "Distribution to set in the .deb changelog") add_custom_target(deb COMMAND dpkg-buildpackage -b -d -uc -us COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../clementine_${CLEMENTINE_VERSION_DEB}~${DEB_DIST}_${DEB_ARCH}.deb ${CMAKE_BINARY_DIR}/clementine_${CLEMENTINE_VERSION_DEB}~${DEB_DIST}_${DEB_ARCH}.deb WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) clementine-1.2.3+git1354-gdaddbde+dfsg/cmake/FindFFTW3.cmake000066400000000000000000000061651260417502300231130ustar00rootroot00000000000000# # Try to find FFTW3 library # (see www.fftw.org) # Once run this will define: # # FFTW3_FOUND # FFTW3_INCLUDE_DIR # FFTW3_LIBRARIES # FFTW3_LINK_DIRECTORIES # # You may set one of these options before including this file: # FFTW3_USE_SSE2 # # TODO: _F_ versions. # # Jan Woetzel 05/2004 # www.mip.informatik.uni-kiel.de # -------------------------------- FIND_PATH(FFTW3_INCLUDE_DIR fftw3.h ${FFTW3_DIR}/include ${FFTW3_HOME}/include ${FFTW3_DIR} ${FFTW3_HOME} $ENV{FFTW3_DIR}/include $ENV{FFTW3_HOME}/include $ENV{FFTW3_DIR} $ENV{FFTW3_HOME} /usr/include /usr/local/include $ENV{SOURCE_DIR}/fftw3 $ENV{SOURCE_DIR}/fftw3/include $ENV{SOURCE_DIR}/fftw $ENV{SOURCE_DIR}/fftw/include ) #MESSAGE("DBG FFTW3_INCLUDE_DIR=${FFTW3_INCLUDE_DIR}") SET(FFTW3_POSSIBLE_LIBRARY_PATH ${FFTW3_DIR}/lib ${FFTW3_HOME}/lib ${FFTW3_DIR} ${FFTW3_HOME} $ENV{FFTW3_DIR}/lib $ENV{FFTW3_HOME}/lib $ENV{FFTW3_DIR} $ENV{FFTW3_HOME} /usr/lib /usr/local/lib $ENV{SOURCE_DIR}/fftw3 $ENV{SOURCE_DIR}/fftw3/lib $ENV{SOURCE_DIR}/fftw $ENV{SOURCE_DIR}/fftw/lib ) # the lib prefix is containe din filename onf W32, unfortuantely. JW # teh "general" lib: FIND_LIBRARY(FFTW3_FFTW_LIBRARY NAMES fftw3 libfftw libfftw3 libfftw3-3 PATHS ${FFTW3_POSSIBLE_LIBRARY_PATH} ) #MESSAGE("DBG FFTW3_FFTW_LIBRARY=${FFTW3_FFTW_LIBRARY}") FIND_LIBRARY(FFTW3_FFTWF_LIBRARY NAMES fftwf3 fftw3f fftwf libfftwf libfftwf3 libfftw3f-3 PATHS ${FFTW3_POSSIBLE_LIBRARY_PATH} ) #MESSAGE("DBG FFTW3_FFTWF_LIBRARY=${FFTW3_FFTWF_LIBRARY}") FIND_LIBRARY(FFTW3_FFTWL_LIBRARY NAMES fftwl3 fftw3l fftwl libfftwl libfftwl3 libfftw3l-3 PATHS ${FFTW3_POSSIBLE_LIBRARY_PATH} ) #MESSAGE("DBG FFTW3_FFTWF_LIBRARY=${FFTW3_FFTWL_LIBRARY}") FIND_LIBRARY(FFTW3_FFTW_SSE2_LIBRARY NAMES fftw_sse2 fftw3_sse2 libfftw_sse2 libfftw3_sse2 PATHS ${FFTW3_POSSIBLE_LIBRARY_PATH} ) #MESSAGE("DBG FFTW3_FFTW_SSE2_LIBRARY=${FFTW3_FFTW_SSE2_LIBRARY}") FIND_LIBRARY(FFTW3_FFTWF_SSE_LIBRARY NAMES fftwf_sse fftwf3_sse libfftwf_sse libfftwf3_sse PATHS ${FFTW3_POSSIBLE_LIBRARY_PATH} ) #MESSAGE("DBG FFTW3_FFTWF_SSE_LIBRARY=${FFTW3_FFTWF_SSE_LIBRARY}") # -------------------------------- # select one of the above # default: IF (FFTW3_FFTW_LIBRARY) SET(FFTW3_LIBRARIES ${FFTW3_FFTW_LIBRARY}) ENDIF (FFTW3_FFTW_LIBRARY) # specialized: IF (FFTW3_USE_SSE2 AND FFTW3_FFTW_SSE2_LIBRARY) SET(FFTW3_LIBRARIES ${FFTW3_FFTW_SSE2_LIBRARY}) ENDIF (FFTW3_USE_SSE2 AND FFTW3_FFTW_SSE2_LIBRARY) # -------------------------------- IF(FFTW3_LIBRARIES) IF (FFTW3_INCLUDE_DIR) # OK, found all we need SET(FFTW3_FOUND TRUE) GET_FILENAME_COMPONENT(FFTW3_LINK_DIRECTORIES ${FFTW3_LIBRARIES} PATH) ELSE (FFTW3_INCLUDE_DIR) MESSAGE("FFTW3 include dir not found. Set FFTW3_DIR to find it.") ENDIF(FFTW3_INCLUDE_DIR) ELSE(FFTW3_LIBRARIES) MESSAGE("FFTW3 lib not found. Set FFTW3_DIR to find it.") ENDIF(FFTW3_LIBRARIES) MARK_AS_ADVANCED( FFTW3_INCLUDE_DIR FFTW3_LIBRARIES FFTW3_FFTW_LIBRARY FFTW3_FFTW_SSE2_LIBRARY FFTW3_FFTWF_LIBRARY FFTW3_FFTWF_SSE_LIBRARY FFTW3_FFTWL_LIBRARY FFTW3_LINK_DIRECTORIES ) clementine-1.2.3+git1354-gdaddbde+dfsg/cmake/Format.cmake000066400000000000000000000002441260417502300227010ustar00rootroot00000000000000add_custom_target(format-diff COMMAND python ${CMAKE_SOURCE_DIR}/dist/format.py) add_custom_target(format COMMAND python ${CMAKE_SOURCE_DIR}/dist/format.py -i) clementine-1.2.3+git1354-gdaddbde+dfsg/cmake/OptionalSource.cmake000066400000000000000000000013071260417502300244200ustar00rootroot00000000000000macro(optional_source TOGGLE) parse_arguments(OPTIONAL_SOURCE "SOURCES;HEADERS;UI;INCLUDE_DIRECTORIES" "" ${ARGN} ) if(${TOGGLE}) list(APPEND SOURCES ${OPTIONAL_SOURCE_SOURCES}) list(APPEND HEADERS ${OPTIONAL_SOURCE_HEADERS}) list(APPEND UI ${OPTIONAL_SOURCE_UI}) include_directories(${OPTIONAL_SOURCE_INCLUDE_DIRECTORIES}) else(${TOGGLE}) list(APPEND OTHER_SOURCES ${OPTIONAL_SOURCE_SOURCES}) list(APPEND OTHER_SOURCES ${OPTIONAL_SOURCE_HEADERS}) set(_uic_sources) qt4_wrap_ui(_uic_sources ${OPTIONAL_SOURCE_UI}) list(APPEND OTHER_SOURCES ${_uic_sources}) list(APPEND OTHER_UIC_SOURCES ${_uic_sources}) endif(${TOGGLE}) endmacro(optional_source) clementine-1.2.3+git1354-gdaddbde+dfsg/cmake/ParseArguments.cmake000066400000000000000000000021371260417502300244140ustar00rootroot00000000000000# From http://www.cmake.org/Wiki/CMakeMacroParseArguments cmake_minimum_required(VERSION 2.6) MACRO(PARSE_ARGUMENTS prefix arg_names option_names) SET(DEFAULT_ARGS) FOREACH(arg_name ${arg_names}) SET(${prefix}_${arg_name}) ENDFOREACH(arg_name) FOREACH(option ${option_names}) SET(${prefix}_${option} FALSE) ENDFOREACH(option) SET(current_arg_name DEFAULT_ARGS) SET(current_arg_list) FOREACH(arg ${ARGN}) SET(larg_names ${arg_names}) LIST(FIND larg_names "${arg}" is_arg_name) IF (is_arg_name GREATER -1) SET(${prefix}_${current_arg_name} ${current_arg_list}) SET(current_arg_name ${arg}) SET(current_arg_list) ELSE (is_arg_name GREATER -1) SET(loption_names ${option_names}) LIST(FIND loption_names "${arg}" is_option) IF (is_option GREATER -1) SET(${prefix}_${arg} TRUE) ELSE (is_option GREATER -1) SET(current_arg_list ${current_arg_list} ${arg}) ENDIF (is_option GREATER -1) ENDIF (is_arg_name GREATER -1) ENDFOREACH(arg) SET(${prefix}_${current_arg_name} ${current_arg_list}) ENDMACRO(PARSE_ARGUMENTS) clementine-1.2.3+git1354-gdaddbde+dfsg/cmake/Rpm.cmake000066400000000000000000000021751260417502300222140ustar00rootroot00000000000000set(RPMBUILD_DIR ~/rpmbuild CACHE STRING "Rpmbuild directory, for the rpm target") set(MOCK_COMMAND mock CACHE STRING "Command to use for running mock") set(MOCK_CHROOT fedora-13-x86_64 CACHE STRING "Chroot to use when building an rpm with mock") set(RPM_DISTRO fc13 CACHE STRING "Suffix of the rpm file") set(RPM_ARCH x86_64 CACHE STRING "Architecture of the rpm file") add_custom_target(rpm COMMAND ${CMAKE_SOURCE_DIR}/dist/maketarball.sh COMMAND ${CMAKE_COMMAND} -E copy clementine-${CLEMENTINE_VERSION_SPARKLE}.tar.gz ${RPMBUILD_DIR}/SOURCES/ COMMAND rpmbuild -bs ${CMAKE_SOURCE_DIR}/dist/clementine.spec COMMAND ${MOCK_COMMAND} --verbose --root=${MOCK_CHROOT} --resultdir=${CMAKE_BINARY_DIR}/mock_result/ ${RPMBUILD_DIR}/SRPMS/clementine-${CLEMENTINE_VERSION_RPM_V}-${CLEMENTINE_VERSION_RPM_R}.${RPM_DISTRO}.src.rpm COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/mock_result/clementine-${CLEMENTINE_VERSION_RPM_V}-${CLEMENTINE_VERSION_RPM_R}.${RPM_DISTRO}.${RPM_ARCH}.rpm ${CMAKE_BINARY_DIR}/clementine-${CLEMENTINE_VERSION_RPM_V}-${CLEMENTINE_VERSION_RPM_R}.${RPM_DISTRO}.${RPM_ARCH}.rpm ) clementine-1.2.3+git1354-gdaddbde+dfsg/cmake/SpotifyVersion.cmake000066400000000000000000000002301260417502300244470ustar00rootroot00000000000000# Increment this whenever the user needs to download a new blob # Remember to upload and sign the new version of the blob. set(SPOTIFY_BLOB_VERSION 15) clementine-1.2.3+git1354-gdaddbde+dfsg/cmake/Summary.cmake000066400000000000000000000047671260417502300231240ustar00rootroot00000000000000cmake_policy(SET CMP0012 NEW) set(summary_willbuild "") set(summary_willnotbuild "") macro(summary_add name test) if (${test}) list(APPEND summary_willbuild ${name}) else (${test}) list(APPEND summary_willnotbuild "${name}") endif (${test}) endmacro(summary_add) macro(summary_show_part variable title) list(LENGTH ${variable} _len) if (_len) message("") message(${title}) foreach (_item ${${variable}}) message(" ${_item}") endforeach (_item) endif (_len) endmacro(summary_show_part) macro(summary_show) list(SORT summary_willbuild) list(SORT summary_willnotbuild) message("") message("Building Clementine version: ${CLEMENTINE_VERSION_DISPLAY}") summary_show_part(summary_willbuild "The following components will be built:") summary_show_part(summary_willnotbuild "The following components WILL NOT be built:") message("") endmacro(summary_show) function(optional_component name default description) set(option_variable "ENABLE_${name}") set(have_variable "HAVE_${name}") set(${have_variable} OFF) # Create the option option(${option_variable} "${description}" ${default}) # Was the option set? if(NOT ${option_variable}) set(summary_willnotbuild "${summary_willnotbuild};${description} (disabled in CMake config)" PARENT_SCOPE) return() endif() # Check each of the dependencies set(next_arg_is_dep_name FALSE) set(testing_deps TRUE) set(current_dep_name) set(missing_deps) foreach(arg ${ARGN}) if(${next_arg_is_dep_name}) set(current_dep_name "${arg}") set(next_arg_is_dep_name FALSE) elseif(arg STREQUAL "DEPENDS") set(next_arg_is_dep_name TRUE) set(testing_deps TRUE) elseif(${testing_deps}) string(REPLACE " " ";" arglist "${arg}") if(${arglist}) # We have to do this instead of if(NOT ${arg}) so that tests may contain # "NOT" themselves. else() list(APPEND missing_deps "${current_dep_name}") set(testing_deps FALSE) endif() endif() endforeach() if(missing_deps) foreach(dep ${missing_deps}) if(deplist_text) set(deplist_text "${deplist_text}, ${dep}") else() set(deplist_text "${dep}") endif() endforeach() set(text "${description} (missing ${deplist_text})") set(summary_willnotbuild "${summary_willnotbuild};${text}" PARENT_SCOPE) else() set(${have_variable} ON PARENT_SCOPE) set(summary_willbuild "${summary_willbuild};${description}" PARENT_SCOPE) endif() endfunction() clementine-1.2.3+git1354-gdaddbde+dfsg/cmake/Translations.cmake000066400000000000000000000053371260417502300241420ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.6) set (XGETTEXT_OPTIONS --qt --keyword=tr:1,2c --keyword=tr --flag=tr:1:pass-c-format --flag=tr:1:pass-qt-format --keyword=trUtf8 --flag=tr:1:pass-c-format --flag=tr:1:pass-qt-format --keyword=translate:2,3c --keyword=translate:2 --flag=translate:2:pass-c-format --flag=translate:2:pass-qt-format --keyword=QT_TR_NOOP --flag=QT_TR_NOOP:1:pass-c-format --flag=QT_TR_NOOP:1:pass-qt-format --keyword=QT_TRANSLATE_NOOP:2 --flag=QT_TRANSLATE_NOOP:2:pass-c-format --flag=QT_TRANSLATE_NOOP:2:pass-qt-format --keyword=_ --flag=_:1:pass-c-format --flag=_:1:pass-qt-format --keyword=N_ --flag=N_:1:pass-c-format --flag=N_:1:pass-qt-format --from-code=utf-8) macro(add_pot outfiles header pot) # Make relative filenames for all source files set(add_pot_sources) foreach(_filename ${ARGN}) get_filename_component(_absolute_filename ${_filename} ABSOLUTE) file(RELATIVE_PATH _relative_filename ${CMAKE_CURRENT_SOURCE_DIR} ${_absolute_filename}) list(APPEND add_pot_sources ${_relative_filename}) endforeach(_filename) # Generate the .pot add_custom_command( OUTPUT ${pot} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMAND ${GETTEXT_XGETTEXT_EXECUTABLE} ${XGETTEXT_OPTIONS} -s -C --omit-header --output=${CMAKE_CURRENT_BINARY_DIR}/pot.temp ${add_pot_sources} COMMAND cat ${header} ${CMAKE_CURRENT_BINARY_DIR}/pot.temp > ${pot} DEPENDS ${add_pot_sources} ${header} ) list(APPEND ${outfiles} ${pot}) endmacro(add_pot) # Syntax is: # add_po(sources_var po_prefix # LANGUAGES language1 language2 ... # DIRECTORY dir # macro(add_po outfiles po_prefix) parse_arguments(ADD_PO "LANGUAGES;DIRECTORY" "" ${ARGN} ) foreach (_lang ${ADD_PO_LANGUAGES}) set(_po_filename "${_lang}.po") set(_po_filepath "${CMAKE_CURRENT_SOURCE_DIR}/${ADD_PO_DIRECTORY}/${_po_filename}") set(_qm_filename "clementine_${_lang}.qm") set(_qm_filepath "${CMAKE_CURRENT_BINARY_DIR}/${ADD_PO_DIRECTORY}/${_qm_filename}") # Convert the .po files to .qm files add_custom_command( OUTPUT ${_qm_filepath} COMMAND ${QT_LCONVERT_EXECUTABLE} ARGS ${_po_filepath} -o ${_qm_filepath} -of qm DEPENDS ${_po_filepath} ${_po_filepath} ) list(APPEND ${outfiles} ${_qm_filepath}) endforeach (_lang) # Generate a qrc file for the translations set(_qrc ${CMAKE_CURRENT_BINARY_DIR}/${ADD_PO_DIRECTORY}/translations.qrc) file(WRITE ${_qrc} "") foreach(_lang ${ADD_PO_LANGUAGES}) file(APPEND ${_qrc} "${po_prefix}${_lang}.qm") endforeach(_lang) file(APPEND ${_qrc} "") qt4_add_resources(${outfiles} ${_qrc}) endmacro(add_po) clementine-1.2.3+git1354-gdaddbde+dfsg/cmake/Version.cmake000066400000000000000000000144461260417502300231070ustar00rootroot00000000000000# Change this file when releasing a new version. # Version numbers. set(CLEMENTINE_VERSION_MAJOR 1) set(CLEMENTINE_VERSION_MINOR 2) set(CLEMENTINE_VERSION_PATCH 3) # set(CLEMENTINE_VERSION_PRERELEASE rc4) # This should be set to OFF in a release branch set(INCLUDE_GIT_REVISION ON) # Rules about version number comparison on different platforms: # Debian: # Two stages are repeated until there are no more characters to compare: # one block of consecutive digits (\d+) is compared numerically, then one # block of consecutive NON-digits (\D+) is compared lexigraphically, # with the exception that ~ sorts before everything else. # # The "upstream version" and "debian revision" are separated by the last # dash in the version number. # # Algorithm is in "man deb-version", test comparisons with # dpkg --compare-versions. # # These are in sorted order: # 1.0~rc1 # 1.0~rc2 # 1.0 # 1.0-1-g044287b # 1.0-506-g044287b # 1.0.1 # 1.0.2 # 1.0.a # # Rpm: # The string is split on non-alphanumeric characters. Numeric sections are # compared numerically and non-numeric sections are compared lexigraphically. # If one sections is numeric and the other sections is non-numeric, the # numeric sections is always NEWER. # # The "version" and "release" fields are compared with the same algorithm - # if the versions are equal the releases are compared to determine which # package is newer. # # Algorithm is described in: # http://fedoraproject.org/wiki/Packaging:NamingGuidelines#Package_Versioning # Test comparisons with: # import rpm # rpm.labelCompare((epoch, version, release), (epoch, version, release)) # # These are in sorted order: # 1.0-0.rc1 # 1.0-0.rc2 # 1.0-1 # 1.0-2.506-g044287b # 1.0.1-1 # 1.0.2-1 # # Sparkle (mac) and QtSparkle (windows): # The strings are split into sections of characters that are all of the same # "type" - where a "type" is period, digit, or other. Sections are then # compared against each other - digits are compared numerically and other # are compared lexigraphically. When two sections are of different types, # the numeric section is always NEWER. # # If the common parts of both strings are equal, but one string has more # sections, the type of the first extra section is used to determine which # version is newer. # If the extra section is a string, the shorter result is NEWER, otherwise # the shorter section is OLDER. That means that 1.0 is NEWER than 1.0rc1, # but 1.0 is OLDER than 1.0.1. # # See compareversions.cpp in QtSparkle. # Version numbers in Clementine: # Deb: # With git: $tagname-$commitcount-g$sha1 # Without git: $major.$minor.$patch[~$prerelease] # # Rpm: Version Release # Prerelease: $major.$minor.$patch 0.$prerelease # Without git: $major.$minor.$patch 1 # With git: $tagname 2.$commitcount.g$sha1 # # QtSparkle (Windows): # With git: $tagname-$commitcount-g$sha1 # Without git: $major.$minor.$patch[$prerelease] # # Mac info.plist: CFBundleVersion # Prerelease: 4096.$major.$minor.$patch.0 # Without git: 4096.$major.$minor.$patch.1 # With git: 4096.$tagname.2.$commitcount # The 4096. prefix is because the previous versioning scheme used svn revision # numbers, which got up to 3000+. set(majorminorpatch "${CLEMENTINE_VERSION_MAJOR}.${CLEMENTINE_VERSION_MINOR}.${CLEMENTINE_VERSION_PATCH}") set(CLEMENTINE_VERSION_DISPLAY "${majorminorpatch}") set(CLEMENTINE_VERSION_DEB "${majorminorpatch}") set(CLEMENTINE_VERSION_RPM_V "${majorminorpatch}") set(CLEMENTINE_VERSION_RPM_R "1") set(CLEMENTINE_VERSION_SPARKLE "${majorminorpatch}") set(CLEMENTINE_VERSION_PLIST "4096.${majorminorpatch}") if(${CLEMENTINE_VERSION_PATCH} EQUAL "0") set(CLEMENTINE_VERSION_DISPLAY "${CLEMENTINE_VERSION_MAJOR}.${CLEMENTINE_VERSION_MINOR}") endif(${CLEMENTINE_VERSION_PATCH} EQUAL "0") # Add prerelease if(CLEMENTINE_VERSION_PRERELEASE) set(CLEMENTINE_VERSION_DISPLAY "${CLEMENTINE_VERSION_DISPLAY} ${CLEMENTINE_VERSION_PRERELEASE}") set(CLEMENTINE_VERSION_DEB "${CLEMENTINE_VERSION_DEB}~${CLEMENTINE_VERSION_PRERELEASE}") set(CLEMENTINE_VERSION_RPM_R "0.${CLEMENTINE_VERSION_PRERELEASE}") set(CLEMENTINE_VERSION_SPARKLE "${CLEMENTINE_VERSION_SPARKLE}${CLEMENTINE_VERSION_PRERELEASE}") set(CLEMENTINE_VERSION_PLIST "${CLEMENTINE_VERSION_PLIST}.0") else(CLEMENTINE_VERSION_PRERELEASE) set(CLEMENTINE_VERSION_PLIST "${CLEMENTINE_VERSION_PLIST}.1") endif(CLEMENTINE_VERSION_PRERELEASE) # Add git revision if(FORCE_GIT_REVISION) set(GIT_REV ${FORCE_GIT_REVISION}) set(GIT_INFO_RESULT 0) else(FORCE_GIT_REVISION) find_program(GIT_EXECUTABLE git) if(NOT GIT_EXECUTABLE-NOTFOUND) execute_process(COMMAND ${GIT_EXECUTABLE} describe RESULT_VARIABLE GIT_INFO_RESULT OUTPUT_VARIABLE GIT_REV ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) endif() endif() if(${GIT_INFO_RESULT} EQUAL 0) string(REGEX REPLACE "^(.+)-([0-9]+)-(g[a-f0-9]+)$" "\\1;\\2;\\3" GIT_PARTS ${GIT_REV}) if(NOT GIT_PARTS) message(FATAL_ERROR "Failed to parse git revision string '${GIT_REV}'") endif(NOT GIT_PARTS) list(LENGTH GIT_PARTS GIT_PARTS_LENGTH) if(GIT_PARTS_LENGTH EQUAL 3) list(GET GIT_PARTS 0 GIT_TAGNAME) list(GET GIT_PARTS 1 GIT_COMMITCOUNT) list(GET GIT_PARTS 2 GIT_SHA1) set(HAS_GET_REVISION ON) endif(GIT_PARTS_LENGTH EQUAL 3) endif(${GIT_INFO_RESULT} EQUAL 0) if(INCLUDE_GIT_REVISION AND HAS_GET_REVISION) set(CLEMENTINE_VERSION_DISPLAY "${GIT_REV}") set(CLEMENTINE_VERSION_DEB "${GIT_REV}") set(CLEMENTINE_VERSION_RPM_V "${GIT_TAGNAME}") set(CLEMENTINE_VERSION_RPM_R "2.${GIT_COMMITCOUNT}.${GIT_SHA1}") set(CLEMENTINE_VERSION_SPARKLE "${GIT_REV}") set(CLEMENTINE_VERSION_PLIST "4096.${GIT_TAGNAME}.2.${GIT_COMMITCOUNT}") endif(INCLUDE_GIT_REVISION AND HAS_GET_REVISION) if(0) message(STATUS "Display: ${CLEMENTINE_VERSION_DISPLAY}") message(STATUS "Deb: ${CLEMENTINE_VERSION_DEB}") message(STATUS "Rpm: ${CLEMENTINE_VERSION_RPM_V}-${CLEMENTINE_VERSION_RPM_R}") message(STATUS "Sparkle: ${CLEMENTINE_VERSION_SPARKLE}") message(STATUS "Plist: ${CLEMENTINE_VERSION_PLIST}") endif(0) clementine-1.2.3+git1354-gdaddbde+dfsg/cmake_uninstall.cmake.in000066400000000000000000000015561260417502300241560ustar00rootroot00000000000000IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"") ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) STRING(REGEX REPLACE "\n" ";" files "${files}") FOREACH(file ${files}) MESSAGE(STATUS "Uninstalling \"${file}\"") IF(EXISTS "${file}") EXEC_PROGRAM( "@CMAKE_COMMAND@" ARGS "-E remove \"${file}\"" OUTPUT_VARIABLE rm_out RETURN_VALUE rm_retval ) IF("${rm_retval}" STREQUAL 0) ELSE("${rm_retval}" STREQUAL 0) MESSAGE(FATAL_ERROR "Problem when removing \"${file}\"") ENDIF("${rm_retval}" STREQUAL 0) ELSE(EXISTS "${file}") MESSAGE(STATUS "File \"${file}\" does not exist.") ENDIF(EXISTS "${file}") ENDFOREACH(file) clementine-1.2.3+git1354-gdaddbde+dfsg/data/000077500000000000000000000000001260417502300203005ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/data/Equifax_Secure_Certificate_Authority.pem000066400000000000000000000021671260417502300302730ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y 7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh 1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 -----END CERTIFICATE----- clementine-1.2.3+git1354-gdaddbde+dfsg/data/blank.ttf000066400000000000000000000240741260417502300221150ustar00rootroot00000000000000 0OS/2@8Vcmap^ҭgasp(4glyf42:pheadJd6hheaT$hmtx"loca<H Tmaxp5 nameCpostTQH[U_< Eg~ >NC/B 33fHL @ Q3>@  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~P~/~ O\_   " & 0 3 : < > D  !!!!"!&!.!^!!"""""""")"+"H"a"e###!%%% %%%%%$%,%4%<%l%%%%%%%%%%%%%%%&<&@&B&`&c&f&k  0~Q^   & 0 2 9 < > D  !!!!"!&!.![!!"""""""")"+"H"`"d### %%% %%%%%$%,%4%<%P%%%%%%%%%%%%%%%&:&@&B&`&c&e&jihfda+*)(][w}ujyߨߖޖޢދަq_0@3$FE<9630)"ۿ۾۷ۥۯEBA$"!``hpx|||~zRTPbcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,  -./0!"12#3$%&'()*+4?Avw| 153$   +7G e W e e w           $-       RegularTN Blank:1.01TNBlankoby ejnnormalStandardRegularTN Blank:1.01TNBlankNormaaliNormaleStandaardNormalny1KG=K9NormlneNavadnoArrunta'  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~.nullnonmarkingreturnmu1pi1OhmEurodmacron overscoremiddotAbreveabreveAogonekaogonekDcarondcaronDslashEogonekeogonekEcaronecaronLacutelacuteLcaronlcaronLdotldotNacutenacuteNcaronncaron Odblacute odblacuteRacuteracuteRcaronrcaronSacutesacuteTcedillatcedillaTcarontcaronUringuring Udblacute udblacuteZacutezacuteZdotzdotGammaThetaPhialphadeltaepsilonsigmatauphi underscoredbl exclamdbl nsuperiorpeseta arrowleftarrowup arrowright arrowdown arrowboth arrowupdn arrowupdnbse orthogonal intersection equivalencehouse revlogicalnot integraltp integralbtSF100000SF110000SF010000SF030000SF020000SF040000SF080000SF090000SF060000SF070000SF050000SF430000SF240000SF510000SF520000SF390000SF220000SF210000SF250000SF500000SF490000SF380000SF280000SF270000SF260000SF360000SF370000SF420000SF190000SF200000SF230000SF470000SF480000SF410000SF450000SF460000SF400000SF540000SF530000SF440000upblockdnblockblocklfblockrtblockltshadeshadedkshade filledbox filledrecttriaguptriagrttriagdntriaglfcircle invbullet invcircle smileface invsmilefacesunfemalemalespadeclubheartdiamond musicalnotemusicalnotedblIJij napostropheminutesecond afii61248 afii61289H22073H18543H18551H18533 openbulletAmacronamacron Ccircumflex ccircumflexCdotcdotEmacronemacronEbreveebreveEdotedot Gcircumflex gcircumflexGdotgdotGcedillagcedilla Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonek Jcircumflex jcircumflexKcedillakcedilla kgreenlandicLcedillalcedillaNcedillancedillaEngengOmacronomacronObreveobreveRcedillarcedilla Scircumflex scircumflexTbartbarUtildeutildeUmacronumacronUbreveubreveUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexlongs Aringacute aringacuteAEacuteaeacute Oslashacute oslashacute anoteleiaWgravewgraveWacutewacute Wdieresis wdieresisYgraveygrave quotereversed radicalex afii08941 estimated oneeighth threeeighths fiveeighths seveneighths commaaccentundercommaaccenttonos dieresistonos Alphatonos EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaDeltaEpsilonZetaEtaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosbetagammazetaetathetaiotakappalambdanuxiomicronrhosigma1upsilonchipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonos afii10023 afii10051 afii10052 afii10053 afii10054 afii10055 afii10056 afii10057 afii10058 afii10059 afii10060 afii10061 afii10062 afii10145 afii10017 afii10018 afii10019 afii10020 afii10021 afii10022 afii10024 afii10025 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10034 afii10035 afii10036 afii10037 afii10038 afii10039 afii10040 afii10041 afii10042 afii10043 afii10044 afii10045 afii10046 afii10047 afii10048 afii10049 afii10065 afii10066 afii10067 afii10068 afii10069 afii10070 afii10072 afii10073 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10082 afii10083 afii10084 afii10085 afii10086 afii10087 afii10088 afii10089 afii10090 afii10091 afii10092 afii10093 afii10094 afii10095 afii10096 afii10097 afii10071 afii10099 afii10100 afii10101 afii10102 afii10103 afii10104 afii10105 afii10106 afii10107 afii10108 afii10109 afii10110 afii10193 afii10050 afii10098 afii00208 afii61352clementine-1.2.3+git1354-gdaddbde+dfsg/data/clementine-spotify-public.pem000066400000000000000000000007031260417502300260750ustar00rootroot00000000000000-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqAvoUlyct8cM/dM5OBwP sqXNJEbxdMsbtX8fXErcj+r1qSlOG1KtFZmVXw8FZtq3WQddgb95w/T8zvP1v0dt 6ZbsYlsE+TqTiTcN1rpbVi33SpcWGZ7d2o+bbTEaVagVuwccPDvfMu005/zzFl0f iRVg2zLkFYuLRDZpOwbgw7KBKTVqaB/aeRK/sjXSjaZdizuxW4WnmKYWML3h4RpZ kg5+faMQiG9sA0iH27PzXPZWVG9Py2ypyVA4pSQIZFveYbr9XpcxPhcEalXbxNU8 S7OzDbWmjNIh7KCMy2F7NxnW92b+7WRUcjp953U2LKtcppZK3AOlnETzkHcmB7cD sQIDAQAB -----END PUBLIC KEY----- clementine-1.2.3+git1354-gdaddbde+dfsg/data/clementine_remote_qr.png000066400000000000000000000007651260417502300252160ustar00rootroot00000000000000PNG  IHDR3IDATX헽0 iPIXb&T󂤥DSA%8䇾-"`L~?ϼ9LrxIJf IR[Bpn,aC܃J`xW0#u5+B jahI`7U>~V8<\,n¦6x)21{hͲAᎴA-*11!&ɸĠlr~lbU n*XS7&1h!_Uc~a٠IՀg&]U2F]m ViM'|d'>AԴ3u`Eq{mtY Sӱ̶V!i`vͼiawhw.ajP:W"+@Ǝ #EG(דa{bW=tSSc+(Y~_>DU`ܮ`e:%\.VEڄ4q#ڭc_ Pk|$p#f#> H ]-b\X:6iHsipIԀ-yBEj~rIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/currenttrack_bar_mid.png000066400000000000000000000003451260417502300251740ustar00rootroot00000000000000PNG  IHDR)C pHYs  d_tIME9[3bKGDrIDATmA m<陷msޗv@mp*1~ kF)"Q%*lY7qX170˘"I|GjӐ@&}۾?)I5xIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/currenttrack_bar_right.png000066400000000000000000000015071260417502300255410ustar00rootroot00000000000000PNG  IHDR)+9bKGD pHYs  d_tIME 5IDATXõOpq+Ox#h4x11Є@B"x xd$0hv)nlM^GxnkpH -hFkmm~LMMx&''i,!zyNv \ӢUR{K!N#fDU`+JXO&$P<n5p R%1b-dHQ"ɒd\ ij--=1rZlZX'S)0phhv6Af%  Gtj}^ҞZaٮw9/ZGN>/Y q+72 .AHphb6~/ff"6M{%.=CS-&!<,6 9-vWa>XH1?-&dCLCx[Ř ,d7䫅CvbL_*̕͹?Y$f8Gt}a{8nj = xgBP_x,w/=fT}^q Ql!=r-RF'U/#n"tD 0: KaGhd$)TEU7q.{lR", r=,0]Lp(-JY~@.v>׏g0 nA\0n1IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/currenttrack_pause.png000066400000000000000000000002771260417502300247200ustar00rootroot00000000000000PNG  IHDR |lsBITUFtEXtSoftwarewww.inkscape.org<SIDAT} 1}dK},wtx4BIʰʴWe!wm!8< _)"IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/currenttrack_play.png000066400000000000000000000002771260417502300245500ustar00rootroot00000000000000PNG  IHDR |lsRGBbKGD̿ pHYs  tIME 1-[ӼCIDATc``__9If%@vw.$I0 XÃXBl1yIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/data.qrc000066400000000000000000000520531260417502300217250ustar00rootroot00000000000000 Equifax_Secure_Certificate_Authority.pem blank.ttf clementine_remote_qr.png clementine-spotify-public.pem currenttrack_bar_left.png currenttrack_bar_mid.png currenttrack_bar_right.png currenttrack_pause.png currenttrack_play.png globalsearch.css hypnotoad.gif icon_large_grey.png icon_large.png icon.png icons/22x22/application-exit.png icons/22x22/applications-internet.png icons/22x22/audio-card.png icons/22x22/audio-headphones.png icons/22x22/audio-headset.png icons/22x22/configure.png icons/22x22/dialog-ok-apply.png icons/22x22/dialog-warning.png icons/22x22/document-new.png icons/22x22/document-open-folder.png icons/22x22/document-open.png icons/22x22/document-open-remote.png icons/22x22/document-save.png icons/22x22/download.png icons/22x22/drive-removable-media-usb-pendrive.png icons/22x22/edit-clear-list.png icons/22x22/edit-clear-locationbar-ltr.png icons/22x22/edit-copy.png icons/22x22/edit-delete.png icons/22x22/edit-find.png icons/22x22/edit-redo.png icons/22x22/edit-rename.png icons/22x22/edit-undo.png icons/22x22/enterprise.png icons/22x22/folder-new.png icons/22x22/folder.png icons/22x22/folder-sound.png icons/22x22/go-down.png icons/22x22/go-home.png icons/22x22/go-jump.png icons/22x22/go-next.png icons/22x22/go-previous.png icons/22x22/go-up.png icons/22x22/help-about.png icons/22x22/help-hint.png icons/22x22/hypnotoad.png icons/22x22/input-keyboard.png icons/22x22/ipodtouchicon.png icons/22x22/kittens.png icons/22x22/list-add.png icons/22x22/list-remove.png icons/22x22/mail-message.png icons/22x22/media-eject.png icons/22x22/media-playback-pause.png icons/22x22/media-playback-start.png icons/22x22/media-playback-stop.png icons/22x22/media-playlist-repeat.png icons/22x22/media-playlist-shuffle.png icons/22x22/media-skip-backward.png icons/22x22/media-skip-forward.png icons/22x22/multimedia-player-ipod-mini-blue.png icons/22x22/multimedia-player-ipod-mini-gold.png icons/22x22/multimedia-player-ipod-mini-green.png icons/22x22/multimedia-player-ipod-mini-pink.png icons/22x22/multimedia-player-ipod-mini-silver.png icons/22x22/multimedia-player-ipod-nano-black.png icons/22x22/multimedia-player-ipod-nano-green.png icons/22x22/multimedia-player-ipod-nano-white.png icons/22x22/multimedia-player-ipod-shuffle.png icons/22x22/multimedia-player-ipod-standard-color.png icons/22x22/multimedia-player-ipod-standard-monochrome.png icons/22x22/multimedia-player-ipod-U2-color.png icons/22x22/multimedia-player-ipod-U2-monochrome.png icons/22x22/network-server.png icons/22x22/phone-google-nexus-one.png icons/22x22/phone-htc-g1-white.png icons/22x22/phone-nokia-n900.png icons/22x22/phone-palm-pre.png icons/22x22/phone.png icons/22x22/spotify.png icons/22x22/user-away.png icons/22x22/view-choose.png icons/22x22/view-fullscreen.png icons/22x22/view-media-equalizer.png icons/22x22/view-media-lyrics.png icons/22x22/view-media-playlist.png icons/22x22/view-media-visualization.png icons/22x22/view-refresh.png icons/22x22/weather-showers-scattered.png icons/22x22/x-clementine-album.png icons/22x22/x-clementine-albums.png icons/22x22/x-clementine-artist.png icons/22x22/x-clementine-shuffle.png icons/22x22/zoom-in.png icons/32x32/application-exit.png icons/32x32/applications-internet.png icons/32x32/configure.png icons/32x32/document-new.png icons/32x32/document-open-folder.png icons/32x32/document-open.png icons/32x32/document-open-remote.png icons/32x32/document-save.png icons/32x32/download.png icons/32x32/drive-removable-media-usb-pendrive.png icons/32x32/edit-clear-list.png icons/32x32/edit-clear-locationbar-ltr.png icons/32x32/edit-copy.png icons/32x32/edit-delete.png icons/32x32/edit-find.png icons/32x32/edit-redo.png icons/32x32/edit-rename.png icons/32x32/edit-undo.png icons/32x32/enterprise.png icons/32x32/folder-new.png icons/32x32/folder.png icons/32x32/folder-sound.png icons/32x32/go-down.png icons/32x32/go-home.png icons/32x32/go-jump.png icons/32x32/go-next.png icons/32x32/go-previous.png icons/32x32/go-up.png icons/32x32/help-about.png icons/32x32/help-hint.png icons/32x32/hypnotoad.png icons/32x32/input-keyboard.png icons/32x32/ipodtouchicon.png icons/32x32/kittens.png icons/32x32/list-add.png icons/32x32/list-remove.png icons/32x32/mail-message.png icons/32x32/media-eject.png icons/32x32/media-playback-pause.png icons/32x32/media-playback-start.png icons/32x32/media-playback-stop.png icons/32x32/media-playlist-repeat.png icons/32x32/media-playlist-shuffle.png icons/32x32/media-skip-backward.png icons/32x32/media-skip-forward.png icons/32x32/multimedia-player-ipod-mini-blue.png icons/32x32/multimedia-player-ipod-mini-gold.png icons/32x32/multimedia-player-ipod-mini-green.png icons/32x32/multimedia-player-ipod-mini-pink.png icons/32x32/multimedia-player-ipod-mini-silver.png icons/32x32/multimedia-player-ipod-nano-black.png icons/32x32/multimedia-player-ipod-nano-green.png icons/32x32/multimedia-player-ipod-nano-white.png icons/32x32/multimedia-player-ipod-shuffle.png icons/32x32/multimedia-player-ipod-standard-color.png icons/32x32/multimedia-player-ipod-standard-monochrome.png icons/32x32/multimedia-player-ipod-U2-color.png icons/32x32/multimedia-player-ipod-U2-monochrome.png icons/32x32/network-server.png icons/32x32/phone-google-nexus-one.png icons/32x32/phone-htc-g1-white.png icons/32x32/phone-nokia-n900.png icons/32x32/phone-palm-pre.png icons/32x32/phone.png icons/32x32/search.png icons/32x32/spotify.png icons/32x32/tools-wizard.png icons/32x32/view-choose.png icons/32x32/view-fullscreen.png icons/32x32/view-media-equalizer.png icons/32x32/view-media-lyrics.png icons/32x32/view-media-playlist.png icons/32x32/view-media-visualization.png icons/32x32/view-refresh.png icons/32x32/weather-showers-scattered.png icons/32x32/wiimotedev.png icons/32x32/x-clementine-artist.png icons/32x32/x-clementine-shuffle.png icons/32x32/zoom-in.png icons/48x48/application-exit.png icons/48x48/applications-internet.png icons/48x48/configure.png icons/48x48/document-new.png icons/48x48/document-open-folder.png icons/48x48/document-open.png icons/48x48/document-open-remote.png icons/48x48/document-save.png icons/48x48/download.png icons/48x48/drive-removable-media-usb-pendrive.png icons/48x48/edit-clear-list.png icons/48x48/edit-clear-locationbar-ltr.png icons/48x48/edit-copy.png icons/48x48/edit-delete.png icons/48x48/edit-find.png icons/48x48/edit-redo.png icons/48x48/edit-rename.png icons/48x48/edit-undo.png icons/48x48/enterprise.png icons/48x48/folder-new.png icons/48x48/folder.png icons/48x48/folder-sound.png icons/48x48/go-down.png icons/48x48/go-home.png icons/48x48/go-jump.png icons/48x48/go-next.png icons/48x48/go-previous.png icons/48x48/go-up.png icons/48x48/help-about.png icons/48x48/help-hint.png icons/48x48/hypnotoad.png icons/48x48/input-keyboard.png icons/48x48/ipodtouchicon.png icons/48x48/kittens.png icons/48x48/list-add.png icons/48x48/list-remove.png icons/48x48/mail-message.png icons/48x48/media-eject.png icons/48x48/media-optical.png icons/48x48/media-playback-pause.png icons/48x48/media-playback-start.png icons/48x48/media-playback-stop.png icons/48x48/media-playlist-repeat.png icons/48x48/media-playlist-shuffle.png icons/48x48/media-skip-backward.png icons/48x48/media-skip-forward.png icons/48x48/multimedia-player-ipod-mini-blue.png icons/48x48/multimedia-player-ipod-mini-gold.png icons/48x48/multimedia-player-ipod-mini-green.png icons/48x48/multimedia-player-ipod-mini-pink.png icons/48x48/multimedia-player-ipod-mini-silver.png icons/48x48/multimedia-player-ipod-nano-black.png icons/48x48/multimedia-player-ipod-nano-green.png icons/48x48/multimedia-player-ipod-nano-white.png icons/48x48/multimedia-player-ipod-shuffle.png icons/48x48/multimedia-player-ipod-standard-color.png icons/48x48/multimedia-player-ipod-standard-monochrome.png icons/48x48/multimedia-player-ipod-U2-color.png icons/48x48/multimedia-player-ipod-U2-monochrome.png icons/48x48/network-server.png icons/48x48/phone-google-nexus-one.png icons/48x48/phone-htc-g1-white.png icons/48x48/phone-nokia-n900.png icons/48x48/phone-palm-pre.png icons/48x48/phone.png icons/48x48/spotify.png icons/48x48/view-choose.png icons/48x48/view-fullscreen.png icons/48x48/view-media-equalizer.png icons/48x48/view-media-lyrics.png icons/48x48/view-media-playlist.png icons/48x48/view-media-visualization.png icons/48x48/view-refresh.png icons/48x48/weather-showers-scattered.png icons/48x48/x-clementine-artist.png icons/48x48/x-clementine-shuffle.png icons/48x48/zoom-in.png last.fm/as_disabled.png last.fm/as_light.png last.fm/as.png last.fm/icon_radio.png last.fm/icon_tag.png last.fm/icon_user.png last.fm/lastfm.png last.fm/love.png last.fm/user_purple.png logo.png lumberjacksong.txt lyrics/ultimate_providers.xml mainwindow.css nocover.png nomusic.png now_playing_tooltip.txt nyancat.png oauthsuccess.html osd_background.png osd_shadow_corner.png osd_shadow_edge.png playstore/af_generic_rgb_wo_45.png playstore/ar_generic_rgb_wo_45.png playstore/be_generic_rgb_wo_45.png playstore/bg_generic_rgb_wo_45.png playstore/ca_generic_rgb_wo_45.png playstore/cs_generic_rgb_wo_45.png playstore/da_generic_rgb_wo_45.png playstore/de_generic_rgb_wo_45.png playstore/el_generic_rgb_wo_45.png playstore/en_generic_rgb_wo_45.png playstore/es_generic_rgb_wo_45.png playstore/et_generic_rgb_wo_45.png playstore/fa_generic_rgb_wo_45.png playstore/fi_generic_rgb_wo_45.png playstore/fr_generic_rgb_wo_45.png playstore/hr_generic_rgb_wo_45.png playstore/hu_generic_rgb_wo_45.png playstore/it_generic_rgb_wo_45.png playstore/ja_generic_rgb_wo_45.png playstore/ko_generic_rgb_wo_45.png playstore/lt_generic_rgb_wo_45.png playstore/lv_generic_rgb_wo_45.png playstore/ms_generic_rgb_wo_45.png playstore/nl_generic_rgb_wo_45.png playstore/pl_generic_rgb_wo_45.png playstore/ro_generic_rgb_wo_45.png playstore/ru_generic_rgb_wo_45.png playstore/sk_generic_rgb_wo_45.png playstore/sl_generic_rgb_wo_45.png playstore/sr_generic_rgb_wo_45.png playstore/sv_generic_rgb_wo_45.png playstore/tr_generic_rgb_wo_45.png playstore/uk_generic_rgb_wo_45.png playstore/vi_generic_rgb_wo_45.png providers/amazon.png providers/amazonclouddrive.png providers/aol.png providers/bbc.png providers/box.png providers/cdbaby.png providers/digitallyimported-32.png providers/digitallyimported.png providers/dropbox.png providers/echonest.png providers/googledrive.png providers/itunes.png providers/jamendo.png providers/jazzradio.png providers/magnatune.png providers/mog.png providers/mtvmusic.png providers/musicbrainz.png providers/mygpo32.png providers/myspace.png providers/podcast16.png providers/podcast32.png providers/rockradio.png providers/skydrive.png providers/somafm.png providers/songkick.png providers/soundcloud.png providers/subsonic-32.png providers/subsonic.png providers/wikipedia.png rainbowdash.png sample.mood schema/device-schema.sql schema/jamendo.sql schema/schema-10.sql schema/schema-11.sql schema/schema-12.sql schema/schema-13.sql schema/schema-14.sql schema/schema-15.sql schema/schema-16.sql schema/schema-17.sql schema/schema-18.sql schema/schema-19.sql schema/schema-1.sql schema/schema-20.sql schema/schema-21.sql schema/schema-22.sql schema/schema-23.sql schema/schema-24.sql schema/schema-25.sql schema/schema-26.sql schema/schema-27.sql schema/schema-28.sql schema/schema-29.sql schema/schema-2.sql schema/schema-30.sql schema/schema-31.sql schema/schema-32.sql schema/schema-33.sql schema/schema-34.sql schema/schema-35.sql schema/schema-36.sql schema/schema-37.sql schema/schema-38.sql schema/schema-39.sql schema/schema-3.sql schema/schema-40.sql schema/schema-41.sql schema/schema-42.sql schema/schema-43.sql schema/schema-44.sql schema/schema-45.sql schema/schema-46.sql schema/schema-47.sql schema/schema-48.sql schema/schema-49.sql schema/schema-4.sql schema/schema-5.sql schema/schema-50.sql schema/schema-6.sql schema/schema-7.sql schema/schema-8.sql schema/schema-9.sql schema/schema.sql sidebar_background.png smartplaylistsearchterm.css songinfo.css soundcloud-ca.pem spinner.gif spotify-attribution.png star-off.png star-on.png tiny-pause.png tiny-start.png volumeslider-gradient.png volumeslider-handle_glow.png volumeslider-handle.png vk/add.png vk/bookmarks.png vk/delete.png vk/discography.png vk/download.png vk/edit.png vk/find.png vk/group.png vk/my_music.png vk/play_alt.png vk/playlist.png vk/recommends.png vk/remove.png vk/upload.png vk/user.png vk/deactivated.gif providers/vk.png vk/link.png providers/seafile.png icons/32x32/internet-services.png providers/radiotunes.png clementine-1.2.3+git1354-gdaddbde+dfsg/data/globalsearch.css000066400000000000000000000011171260417502300234400ustar00rootroot00000000000000#search, QToolButton { color: white; font-weight: bold; font-size: 7.5pt; } #search:disabled { color: rgba(255, 255, 255, 75%); } #search { border: 1px groove rgb(100, 100, 100); border-radius: 4px 4px; background-color: rgba(0, 0, 0, 20%); } QToolButton { font-weight: normal; font-weight: bold; color: rgba(255, 255, 255, 50%); border-radius: 3px; } QToolButton:hover { background-color: rgb(64, 64, 64); border: 1px solid rgba(255, 255, 255, 20%); } QToolButton:pressed { background-color: rgb(64, 64, 64); border: 1px solid rgba(255, 255, 255, 50%); } clementine-1.2.3+git1354-gdaddbde+dfsg/data/icon.png000066400000000000000000000074331260417502300217450ustar00rootroot00000000000000PNG  IHDR@@iqsRGBbKGD pHYs[[]~tIME0%JIDATxZilT*IHU?TH*hm$-%63$YH4Zl/21f+ 0T@iDi{{s 6HWϼ|go[_7}7UWSp*'~97?W'?q4sȝigzx:CB26>v; "1NoQg۵ڪM/i'I ;UζiuUZM))O@$#Fˀ 9-K5{DVyj9Yx\8^ܑ"[uwLJ-0?g5aFN|@~=-5hg]e?B `3c0 PĘ1C{`<Q-ʟpx X=YBBD9eWF8Usco@GF"YMlig$bȄ9C @ l5J&XC8( &aMJ}ΦkzeA±.!R ^ &$)ZR8A"l|@(vhAe_I"ZVe#6*yL uhX&TLX7KkG T?boUSH旵4}vϷx -|P@X0eXroyU;uohM4N;ohUQ? QBIqoW.OIڳ"-q @_&~ƷӴDmjwqr! } i6/m66XP t t *jp(V-sbVxpv.4+vGؕ$ϑ`Wo%o_Վ$4gFP h{"<']>C߸Xo^2kسV_4v( N)0ZX' +ϢxlyQ"&p<ڋ fhn|QpK\*6>l[#4P)u4lؙ.`J˟&?*Cl "L7a1˭!0ҠGHpjj_y{B_ qc١B f,Z,k |EGK h/>?xkz]GF; #O}ľGՒP_.@Xa \*"2];rﭨ E! H9}}Yk @PrH1` VS`ej{f>W9+ Jߦ=GKTf؇Q 1]BrkCx0Qlks\KesR?>fXUX$\5E!h!?[sXH&XffB <Kո'~k_Ost`̯`w7lC<)RCCaA]{kEa0rhŶe Us,6_4da#;;; 3c@aA#td&͐-`K؇WlZ1 "Sk 3v4!.BNfr0Mwt hA;)Bטxǟ" XfqGaw`h"΍Veb&R2Olӡnq{89z0NBU,_ vg1#f@V*F72hGi <1] <8< COvc߽bx^뻯 dAuɦ.@GD l@@ 0s ^Osn</<P~4 y}!dA[y|822@I/!%@@P `KuKs9yKyhݪCbVkisұ>ߴA?nȘ,j;'7Pr!πXv/x-I`I(UV+ifmѝD,gOIuk0i. ]8ԝ39.,~d&p1sk<^NM05 S=F#೫9C#975I(|dg$~%\ ? A  ""3[6@YL)2Yx.I0RD/԰ƚSl{jqE0<=p93 ⸈+ƹGlӬq 1-ֻ0߶\>'_T cwEP`pbáV+3{w1٦M0 C&'S4|K7 69!_NaV{0鲝B ?K# xu\$/oxwQh@ᔗ$mg\dMqm 87,*pT}F޵vi}P5d ]Mľ5"gV >%؉mX+*-10L0pڧ ߻wk2 DbWx! q:Poz=džF!c3Bu ՒԇGe6QpU&۳ D@; s ٠޶cxݦ^qD, Eݥd| $\>p5[=R>ɳnh`"\XkP cqDhX  [;jBg D/^CR#Z2=i $hp`28w Gw'Pi+h [/t.'oلA25 N0 .xYr= ` Clementine Music Player Logo image/svg+xml Clementine Music Player Logo may 28 2010 Carlos Jenkins Perez CC-BY-SA clementine music player logo clementine-1.2.3+git1354-gdaddbde+dfsg/data/icon_large.png000066400000000000000000001742631260417502300231250ustar00rootroot00000000000000PNG  IHDRxsRGBbKGD pHYs^+tIME.6a0 IDATxydgU.Nwz!" sDEEШ8+?GHWq^P6L !CH@@B&"IgӧOuڻַv]9է<էjU׻5p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8pL`ix8>s#oqUp8'n?3q?}?^&/8wEwUv8i0sz;X/8/zЯp8,37 {| ˹p.ξh?p8~Sq`K0?s=+uHx=7ξhBpD;nٌ%bØ^i8k{g_tjp~{3(9nb1M|wE7'p8'] [{/ e0i=buv'p8' ؈wC`M  )7;?ap8Y72z8tp|yNx?}Wp8N]wAn+sv|/zTp8%‘v|hv-u?`-׶6{w^}8/غL;S]Eݵ7 6ig7Qgξ~;+_#-x7a>k1wUUֽu/pz{N❷b'mYKq1zyzg_  1ۯ|Y;^oK׋?ppCWg7/ؑ k~ O1$*n>y85z|U,̏Ƿ}ٟ#Ϳ?X8ؽ|?n@cL~/_ՎWxE. wۯFnkCnDP!#B 3o+np8q\ OnROӘ婌0?"Hl+n^?p2_̻Mh2W_1#"[7p8XV를Zx[F @y:C? bcp8N{Y{;Zg;pƿ' qjsp| Dw};x7!ELT 9K^>tco_~JD 5`'Rugp8NŶ-G|졝 V޾F XD x n[piod'?x" 4<i??'pXrޅO*Z ;42JP5UCNpIu'p8NƳ۶6o:f9fłhۀo)C!\P$H":UM>YlBY9n63_ Ǟ80 M` 57 CV*?i9YOǫn;Ƙ]w s@)[K 4,BFvQfSly9F,w5yG.M̷Zyό?X7_ |Rw[7?b6|_ 4C!mv=+/'$y5 KzJ 0U8l,n~ @j/8s&R Ó7njb7oqR1e@D@RȒ&O | bx[3ކw.bQLH IS[It&A h2PSK NbGp85̒17[ } hm С @OXIb X`zIiOBq$x@]`c /Ž;J3" P #eXFh 1aHBȐL@B2 B0R%XQRDgp8G (Lfj3.hSw14Q(5E $I὇PhU1W$9B@ +)(kp8Gm[ IlǎdItD(%|⠥  < L 8[79afv55oGa}/40ze8e-# M0~yKلA-C,#FWTtm.Añ[rmĖλPj@TD X@L`*=1R@c. ~غ'p8,l;1 “wW?gB*A :I /r=eIbHACغgp8[f NT78۩Md#s'+$ @RU%ñ @Qܮ LoMPg*F}pp!K"Pt0 pD\c!I AWR`N1\, p8E<z^SΫ#4P+%lCYH e$T0R0`,2YñZ_`|Jogmާ2UQ4"Pk&MFM,BUq2®d*NjqShIxwf"Pk"TI ; tЎXJҠVHA@GN#{@8 @qY?~×n8j  M210|LSln@Whu6 T<ڸ p>p8#I >Q/Q Iϙ*І dA$ aGY<0"1o89mFnD*d 1rd1p @dhDxOD0 3gwgzGM3 VG@˸d>Bîd@1D ׁ]ſwp8^x)2ƉۇmB-@,ꉂfx@*@tP d!L@) D݄ױiSpL)sMco`8k4#@-a#y5!'l)IρLb RGPx4@,}p,!l ۣ /JȑkꟜ0.XM,ɂ,& J#ȔB˖W=ԓfة&d@zNo0H$-4XN2λ<(Η4B=9 Yu8)Rr3vQ wQv/# t0c.A,F,ȅZ)mezEeaЖ /A1M^LR8Tu+fߖ 2h4'ct&4ο+EAR EX!x]Q:>̣ 8sGrsf I~ 4, : !'$]i20tBD/3p0LX? h9Xd@odm"uu j_V v%X`l2Dzä? @Id@N/vñR?=hk֑ X~јG`db2 @t~Sx㋼]pEUĹ5gp⢏bݘ3n'xWF2P>1UeUD/ 4UA,*t BJ/9(aD1RLsiGñ n)&L6Gn$oאS 2#G8B!*A&/WikHinڛ{o  R 쀿,_p,#<-QL\؛1B> !#t͎xPF B#Ic6$225"/e ?DL ,kM/);2%I8 @@DM{oSCk08H,t&l`8Ĩ4Q4RdŸ0U`/M4Ph=op8&KWb͆qn[?T[9 G! []APWjx0IV+vCiIPtfeG⭿Ic%.Y_tlE;yZ +`i Z咲@"Ö&?4z1b=V6 ZD`蓁P& I L>d t^t 9 }9?p8&,U_aܾp{>p,XP)V_dM [l$عdF Ie)%@~ ^ Z')@]c@[sDz̈́ " | !z>@5J @$[d3ЭqׯV")sJA8xǯ=ñ`I*`0p&@dx=nML=d4->ETɄQ&]@(!d# GZ6sD?p8AR&@SLص:i z}[5 0*Ap/ h#ЊCi&j{>1.ϘL0 paNt[6jaeerPjFTb2D@y=R oMi8'@[͠)SH+[ D%?pBpÃ3s׈B j@&7 U9㯷˵AGv!.*֏sֳ(ӤO߷p?wH~{* 穏a[iyHHĉ8K_H BN9a##I TorHKP~IKOp8BL<5QH:?0Q?aHLfx `ҙ7oFsu/lZx76UA+P')n:h)@}M0JםLdu^6pm`k=E2gZUu. jL`}d'譂4U'0v!Ut8tzxTL#mv, %aB]%IA9zQṔ~FO <c"qK}w8Nl趗Q8%8'@Fw\ a&$9 1sƟԈ2BDX&Ԉ@TIh 8'Nn(vZ~Ɉ4`([9bWD ȑ2C~`P˰B H Ɂ %M ҠT(ϝ#8gT?+?/$"ۀp`&+% .8W2EbS!0 C$VPx@jx[%Qܭ~Ce#fE.Dx2<ߘ4eu^n 8']51bvN4KEBJO2V[Ω?!0H@"(!WDF&\s#5hpA$5T@eUDWA j_,χ>6fy"[p I1ѽOzCT2 )SD2Ɩ`ibEHjҲG:H@FGCBŝX<<2PЍ5*@$*^A7I3^15+-%okc;H+{  HT8X%I\)#s2/ey Y%P y*_sy,K(BW\ &8# >%T)]lA=aM399£.~H"T/kj>Q $$EuMLz#K17?n=o bfT&?t t}˟.*@WO+T a,b6$!+2Ɵġp cPǝ#aYlR HAX(* ~%3[8R ''ޚm,ؒ\NhfNnF/%I]4@mפ uI?F:!X^\Y,"XM;0l9?&Hl[@}Ey/ t8G4;m{~% "PeD3}!BM$@v eoU[2"!ܫ2}PȘI !~ =73~3ñaZ`@q,AP${,Y/Pu:t Lq*I EN 4 SaA,$SI>ܞI5_f]6C/!]E8#0%`@KJ0Ԁ0   "j04$XƜٸ&\y0j-!*tdM/q9࣋>.?Nn&jD/pܛު:@% Q'c2_<(43L= {@[䥺8h* ztT+/ t8GPG.K8aMU(1Pʦ@bn\=P$AEHdC90䶌W;R5XH\D Rzho 3_⥁c"|߲y.!iWZ(BG IDATAQ2̽WdVx}%z/}֟gC*BO&r HHh8*  r=y;p8V +/X=O6qf7i'2#ţ0AgxdtKJP./٥UX aI0jTq:Vsm_*ţo3oۅX8S@+H8٘!c28Ő :v.cά IU }d@ %27@ir`u็~6~{~p8̟eBr`P0EcQ2Ձ9^TW dp'@ zz?֟ONJcV̀K%U}Qf,2q⚏?ocU.۞'ji @*R(ZHe rJBA\.ϸ^Z H*{`* gUadP* *JqT/3(nd1&6"B:a#_pX^{L@C&Mc(Mt,)dnWȅ" 2' œn(UTOhnk1Il`>^#Z{z_KaKW zv"`bUh"c&T׿*^ P%Bt":rQOz>R>\87?qzKN[=c`X{kuHetSCF8k202o3c13o"C  ̬i&IozmQy/n̩kC#r(0۞<=!!7y1l_ꯖ޹wHBN~4Tֲܿ1l+rBPgwpL c(DU @IL~ʠdi( 1P 9 %@| $$RZ_q5ñ hVM2.$ fPʷ0"{U&^[j C֡ޞ!R /᫜#?6!%K _,όBVR׼F1_;]"zoAcxJ b~{9 8iT'giǞ5¬ 2 0u:ɋEc.A='O~nPh"b֞yB(?A)D+Üy,CZ(\ț?̯@ñǮ:ڿt:сU3&G}Ԅ=M Ҽ%2hjyE]-hR6 <J=y͔ĿjVN@rh"YG4Y.Q"W@bH|~r8+Dh妖O9Y~}UUh_X2d$ 77d4v2aS2bdf/[NURV+2#d>q$HX-ǢOFD& 0Mƻ?ʃ~+r8NtTda1T=\jF;GS[SEtOI JC.ቷ]zSUzX@ D!!?: @HGM RX8t:2":#ñ b{?4;(̠[u] c [N+tF4 !>WWTl0 EU$,@ѰF?sD6:!B}(RQakߠ+$m~;r8J"+eE?`1<@8?f)jSвr(D@h2AX7ExF`eVzdH_rhi*S2@vh$ydA41];իg$ñl@_2@hM: 0?g =J9`6K-:>/O4L!g(RITR.}n+QjCÂd^ qܠ1?,$DXuZf8_\Y㥁cy׭~"Zڤy&}K T{1%F ^lW4tLDʦΈehx"KLˮ6MɂJ!!4l[11:L f[/ t8D=I5ȊtL6z~`C2{!O"]_'F+<8l1< (O5 )##kߐk^H@CVEyɸzD.[X+z.Qٽ!괍?(`׈H199 g!C ɴ#@fPa`CP,/C$Q ]}'"1όr@q {$jF{|˗睷=N8~=9UMx~ck7{RCaMm=eV EVתD}bʘgь6ƨ\\&9Q$ bH: W!rrToPJ%LcܵժΨB*$ !U*% "m#pŶ0xi4XGp+ulx`$,ST(t0\*^*!2,R>Ta^tԫS0< [UHIu0z(K 䣉 P2R-PËd.Đ=?W7oQc*c5 JӔ`zV lX cM:ѕpi{zR]P_FPmz9Ĉ˄7eeQ<.!iR I=ݏDFy뤽w۷XieYuF,4+@}|_<~r8tU6DW2YIAbb ٌS?xI{.W!;H多IUs 2 ,[Fr86PF2II50{$)3^gѺMVp8&AV60?@l8^Y:pۭ%1־Y)xbD`OU^xΣ(% ZTIh+zd{R+yƾRtJQWPg.l\,TʃH \4ƴ0T=쥁c)\r_q @*_Pnd <ƤCA*o_xe=ju*$z.#Hv9?_xϲ ރ WU Ab42SgI9 Ϙ᳁ʛЙ3 ^gԧ|oWc)Gqhؑ0 |Y;loԾsBq80"ey82uڢ<։Ebx ,j+Xt 6@K_?Lο|x_܎ !?#PZ@\P:U׎ίr߮Ru+~t81',Tb0՟[Y}IA!x2 ϺHh|CX ʢXcT s+RTuEEғ` )JI@9f~r8KI֬Qv G l8a?Nmlr` 9NŨɂ25%@&@FDuR@di@bJ4ġRQ ;J^?[J `w?ԀJр? #i1F>`cQhR &i.eI@=eD1$HR@y";(Q4.4V@@&D@yk+-ñT`KgZ8+:hќ P[eZ-dH A; H@yACL;c}U8Ss yHQ~! hǗH)u$ͧ n]p,سG1o(Nz_{HS h9D.d**W Q ,"<0H @ =$qκSzd$D&8<("eX:D`:G郔D?/z,k9p,(}v?/)X1J1i{ `=`K ; XIpH(S3ε/; UYEdUaM3+P~hYS?/ñ8;G%+ t4@# (@-ްzɃÆCò(ve=Rß<{Ah\]@dX41z"QJF 2C |749q1`TIDl l88{'6ĻYɛoIFK2!c_E^zXXT# Iy#-9hDfufKl4[Q]HA1w@8JksJrP{H:D& A IkUxex(s~H)C&ɰST-)cNuB2BM ~ E6y}X6$! Bu_|+{Kp8F+ fC6i6$ 0P+`f=So#IxDrayjYa4~c__XVRt^Mz_VrfJruO=9f@cjs">otRwOQ T0#9b 6:*JcXA-;<>(JD#)=tF6b(0#>7վx1vI,M(xaG0vLUСp pfz IDAT6MVmCtRϜїY1ZY(i|v$Qe ՀH%"k ͏=dHhFԏ'^u~<t퇷2ˉۜ(S0 ,P5.僭+@j;f?WMˬ{")R;R Poh!YG*׎l)LYϸ D8?\m~s8<Rk7a"07W;NO>HI.+핯A܇X'&ҧED 3I9d=kc֙1f$ ~: P #ZƄȰ7]_>9S`S4Y`IQMŸ])FےT4&Ʌ#M~E->2%GJ!l$aQ5 _#OǼD3p8Js^⑔A̐XvA25OdVatUXC_dNXģX6B>C DM>K0g }_cm,-6 $xV9,cd'p$ĵ8FE6(h5m@-6$jgwgWpGog SsDs'Q XKdv¢ڃN$4FX42!hg侮:paSr0Hk3B|[=Wc∘*Z&`1C]QI On] <$O١} QI68W<+}C˘oc:/3, } Z'RC5@ną ]o}j7m @IxxI'q@w+ ^͛@BiÝv4OVUJ5 ÏZ}ުk22&h7%s<I׉蓀]pKTmpQ,bPKFJӴP$*R"*֨.yhnX=33ωsN|*%v-.[pwU-z:3}r7 -6K bQx\*! m+FUi86 Fh42D}s^es3F^'& ɲEVd) ګoL8LQ!fw^yz3@q,aC6&u.k h0kFH"S2|)%6= UuD|nH5!s}e|mP@cY䣣eMvAOB% 6UGű߬gZЀt 0`b"{QYІ'(cU$baTf,Ii"_BhؠxXDG P%2i}1πB |pOѵC$*0HBu"8nn܂1F?^ax rtniYFN*djAw$bD\g@xq0?uӐNIHX*>\Z@2 EȪ!hrG>x=o+oFz{#MّuNp)IWbJ0}'*/ E9d!Po_З f{2j&H+r2QHlp&9Ly gȔ ܁ko(?p˓aE"9t>zGW`z`C]Q;b8#SV,jU4"bHK#Ze(!՗u@V_+ P^0&e=6db=52r5NaYSĂjۏW/{7TM I^P{ʨNU|c< yvc|hq ;#}Swt]-j3΋q7z5p4Ł1bE'Er[EYmH& PXXm>c{_J_M^GPkaN=L>&-d\4A9 ;y~7oSrh5:FlMZhG7)RQ[R߾~t8­Swt[Fu @L@Ƣs qx31M9ڐ>Qr9b;7Um_9'LH@֟UhTC0z}7=oj'<]*w**Hc*Q eedT"ғm cdaxޗ+îSTH\ڇ&:`U~m@f"/ws*ULT}M>y˨`JxȐKڶ2mtQ,U0ĵ HX*BaY9߼|p]:@S08V0U1ګK싚3VW1z6`"7 {~O\ p8V#gWoM6Zn6|ϣ:.?io &Gx2 D#WW_.Q+NX]~} R yӫt[xv& Nqs3s%ζ(?^rdQA)!ׂئxچ<cOԌhbSx__|{o~F%\!`akjz< &0P1u7WTƴz C~W{1h/ʸ'3V7V s`_wW;orbÄ pTi<1T:(g8\7YMp7c-/X30P!jA= >)IY!T_睷?o_૶=wA~u80S{{`1rO;t.ÊBeg {={#^+3}" 4zkCc.Z<.M zu= }[~ )@Im|#t\`QXq ?E7 |ǵ>dXA]7_u1٩='nR/.u-޿I^#At V}dnOw 'uu+2z #G pǨȭ)S}NM{LmuM1 " "ПVjYލ5='v-XAŶ-fTƱ:%:b680=!+oD0}+˼k׮ƞ#4SjcĂ"csUcLHH v\P= `c6A2HN<4F%FsGs{5;+G>ySy=֙dt1Qy协 nrCJ #Djr~Mȑak^63kB+1aoQ+ŠD4R({넀 /iWcICyg蔧m 9}ajxv7p@u(4#뿗>m7O]CLz!=koeIp$I׃Q$1vГ A%ҾZJ *0âvv@R .F˧u +l|pѽ oc[ñL6Gc5 fa5| 2#"Ir$eg*۽lS#.stV޿aD ֶVv6]ZnHZSˇPP&NV߅Zs%:xQ\'-4s1aF`Ik#全 ]O.Zς2$/V=w|=DNEa7{7x@w֛Y.a3bٹqUeP'nYܦ3ɦ* EoRr k@/rwz1  S}{(c8t̀BHK̂U o bP/_T4z8d{4{h]ѻmcHP%iNJ,ƥ';op3Є Q7 nq⣉Wutc(w)_y7+x1}Ì%$X>*lC gi.'gͪu8:i)_QU6bسe93]'-[Cp _J)ۖezd44gB&4v  UEFxm~lxe8 o<q|4x< S S~ܩ}uqZF|ώ#nͣnIe=t]GA8IT-#׃kdL hòk`]7rSB_3:Nn@dڴTiVGow^@o(vi~{w8$DtT=n]q£lN0ZȀF̖z0gҗKη ~KC\hc_$F:O>cEjԊv# aH<j%Y 1nڍs{O=~w8f{魷%=گu8Ёk?Q@Mo&Vx&d*rFO92T'4T7A?쯪5Tb)~|ب7UmGg62E2♸|cI}', }TTO(DCIcK%3qbۙS}? 8W:_~tcnu\ؚhۚ!A\feR[r@+PnI7z ԌX>`Ir Ja5 JOT34k1 Կ߹ujC{6<'nxƽ%LU8}> FSF9' xt^}V=tO6޼qsLx΃( ;!/9u5$%FB {skg+&52% QC^ e|>i|g Go[tD~ݼJdT.dHwO{͗5{+|_3%:]nq`fÄd-(W=wt=|eFɞP>By 8'Z ȹ~2?ΟaIu$Q?\J۞޿RRmzHE 0(s R N?g]B=}̈́$m˦) m8a<^ @MMRTS\Yϡ#nl$8CTAt,X4+,5|s$F+Y1Ԣ׳)C4ya_YD8 }2U 8} Ir7 5$a^YJ~cͅ"Pl۲Ʃ>N=y9P֦^3SGMu< s'OUU7THjRj"Ã%.1%Qf1Tx#d&z/14TUB$*Ra&wZtT$$0KܶiHܤX $f)gQ> ORBǪ@hԟŞ@Nצ@'?e# QuІM[M}k/7yNLXO5i^˰$ ɲ)ΉSSUo.lc/{E^}`P߃55'lTģNj25lhEU/yǸp mڕ IDAT S"aۯ0Nk|T3 ;!`Om[_NVo|2CJ!M#K/Z>jC֫֍x/cPɍ* C7l52T(\]g-keI^{C>5Zm|nHlgB J@ITh{G8⌟6襄G?qtԟ=u[kWjҢH@ zc]i3@f-`I믖5r!1b]8=PO3ns򡱞"I_% icdJ#FV2oH9Dww4&a0gTkf&2i!3n =晟=k͊c޶emKf]vXm9Um@=kۤ}LmxlZS]5uQjlhW b] g<#s|Fg_Fj_bHl [S?7%GB @[O6r\-E(sY|w/͋'Pl;N~=i~k? ї$PPdݨsGTf7GT.-wIB*y`@m4QʉiTH%A6yCo1K |Aַ5_^wZ7K#\xX3nfе)=]0ȀuD3a$4Ʒ4jqnJ+ t׵įؗ2 q03*'oK}YdFm'`5;'B/3QtHp͘# 3Se.FKV^J5AIiϏ#O*.{)nS88S_m='r\et>O2@\M-ZXr~Mmzu>>]R';l_uF^vs]O+ z#wMu!Qcl2o]Ꜽ yA Ow7"IP[[k{V9얜ݿ?nQZ ($!<Ԛkso̹֪}NjW_R9ubv* ]Q5o)&d,ZDOE<덟cb-G+@*`4ٝ~d;+sgVt+YmAKA1w MIr-aS!ICn|qH:إ篆x'_b'TBZ$IC DVt!vO*\AiyN9zv: ^9E/bk~nxp{Qhjq'op' $ίj_?3c¯!yNXD[ZhN~\ q-@LA$Ƹ4Dm@Dd>|;zFD!  ?4APӂPt{vg+eľ$&q`ֿ߽{w__U,v89лou<`eVNxM7]I<ֳ؟LB'KW y/7j+$Hyq0 pEhdbb`XAŸCSC&,8:f '? ~DV5}_0W/'i&?oR~1v"kz֛m7y6Hz U\Y޴$aPIҪw;VAgO0iePH;:;<T9L /QEͯmtqqD_wOT$eĵt"hf,ִTF߼_V?k_=zl{93<~/zw8 ,'-(WSdԴ Vl~ a05ZEݩ>k㕖8v'vQ/:![wi&7L1q"3"Ta}&۩O%P93o{#bvF8jLzh 4#&YC&}טcho3MIV,*źVf}V!bAȫi@X6 W^P :!d,3_fL1a犍ՁЀ%5 vxvWϫE1\{/hBm֋Jg|W??p6P@#'CŹ9 }o?vxd6ym*߭& ?%a@M9 vNl,jf_K+~10BFwmĕΉx^j5>&@A+`!"'!h ccwN?_ Ak`Y# z%ٍ 2`iJP@M6jH\A F]Gb6 #Qu6XP1&sbvRH°}ZZq"3q7W=WV:"PNƌ&vZFT g#dP̈?BW߽&JjXr&ן3x(ۖ6wՑ>p'eiG3M }63[xhMʉ.aT\Fku}(xʼnrĭHicsg mJNeZ?;35 ].Z %\Ҥ@ث%Rw=qT26!Nk6녯g-R>4 ]3?r&7Edxnb6zCcT;*2WF!զ&im-@+GN iߚ?vULtq?4یncMė<ضwchG; O>֯6_Ao.үb|!9LD}ObEʎ(©^7 `! w/In#Lh9AFgI(OŒ2:Iz_WXcl PWFR=itY@aΘC)E@|į1gCc\mDd\m{ghwﺝ~ޔM:ǼxG )@^K^ -y$Բ!U+}mO;bn@]5HF5?#9aXU|݌%Hw"axu-Zq 䟐E-J:D2<3 ?% k.-範| h_y>|bp["6GyrO:`M0p-#ީ2tկ1m%2{N,kOr,x_̪=glƴn?2^򰄻%ucqMsylf؅ɴDC"Xp&R=e^P8'g->FIV% D5@rlv_Z͋iضGQ5s:%8>Gc?J?9w:zO-'p?XZ-9 R: O q.L/'MЩ' `Jr`oe fS]o0Q9"R}։G\Žz7d92dQ"~}6AgvyO੗9 7­@7w>*$^l5$dy  U\2WC3bdIvy>(oo6`mf `㢒yoT1%S6: ΏubFk: Ryg#!"4 XH?fԘQ }󟶯H- CBP8!ZVrz.,</|xj4_G=MV%>H JXJH͒G ҟJHSގ18lXra&D!j8xߌM*O3oIUT5O= xA^ˌ2^E%ZT/7}\D[)w%.#_9 r?w ~^ey=^piů<vqc '?oX6. $*8e:*bq#x/j!- `D k$@g~|%&(6y`yi"1dE8 +K"+NNS0r38D~T%L'v\)ǝVy/}k~mFֹ;}kFK+x9rfIݚq+&\%?_ ߬#wW[{z: IcQ'Jjė$Yh4g>2K"dQ@!0j佴 #q?K ,U:Ҋ?yci2T\iaU/$RLTl&na=Yϵ,ybbfHh{_nS#!x GOh{!OxIσI?[X +!(]SY6R>HJ{~z6f Ĥ?O@` ,9=줺oDQ RKT-q p4#%%V2?,pG.dA1q,_VOöظƐ!sT.96WCYX4j_ H~Ƿ#䄵H0 00`(+K$QTjdQg!4<1b !%ZEB31~NҮ0!bekCw |g9Q볝x5SCǿkc(u-`*Go:S{]֪@و*L %7QAg8~J,LPVPI͔j~k ~d>=U ڴј$KN)m=dӵP%j@ wQN(g)NmRiɞ'8FK\pЉWq%FycWضIp3eŒ`[DZ48S / {?\ ,; fw'@o_km pZK0kܮ<}_Z֭Ňu%3Jbc~qKp }` O IDATO_ s?&$:Sr돇g4%T4ZZ'j_dק ꈖZTG_hM5L!Y+UE DR"19P܈?oGEo Xl;rgI8 =w{Cl< ƕ:]8U'#2dRR཮Kwgby ?I_9^w.k@iKĤINjdZ kcZ2b8m2r8\7lRBtjס}5k{;Ux5 tܤZMb!e=8֡\)bc%17,Z?vUg^_*b\aQ#//u$ {5Udj[8.}\&CM@~Sf~_PK"Y0l~*c&8ؙ{apt2&sĴ[YČBij(7TP쳘$8cSս=}7q2g;}#_sK\5!YA?ʗq*ӮKWrW2}o7]XFkb^8z_āJ\<Ճ䁹Iz~/< Kagc|]#i9NΈOUu&)Yv{ -q؀\aPѺ'J|Ԯ۩T y;2~ZgۄFQ O}k>?a7a `xN3E$I_ * p}Ufe9g.\oN(a8"nN?!~ꚇIIl4 DXb1I$ ^EB SgGM~<%7>f@Δ}ߤ0:ȓi"Wb @ɸ Ae#7H"ܿ9wtL/)DM`I"B&B5jnkuʏܶ㛥08HN/`Gϑ3--2QϏJzP>1neRT|VjV܎}hlJ0"|8"=^eD7ߌ)v+[KTcbPD$>kluM8دMzS<e[! 񔧭Cȏ2(A V)*9nOxY%:#}v ރDQ 7[۞GOS )[0mezHbջ5D*eP.# "Pmi57rtUp\CȀ;}=)΢CPaemp=gv ]<IЗ&1q> D@ʱ2^쳪 ~e43mlyɿ#bid݀BŮz/;C6qsOGa$6(Qs,1+PŨ,o2F.GTE6`\NoUoXb{Zo˳==*G|}WhPFQ :(MN)%5% #4ܙULiМϬ$1C]u@{WQp'3AEسEHMJ0T9B:.$s%185:}BKjjF84j[kSLƌ3Lvl-!s4a{^&KXl?P ;<x+U/-fCPAL iEݤ~ŏE& ڒ5 ͳ=IGh!CsNg g. M}DV\¯ #6)4/AWp'a{, m-`#Ln7B2;I?CDk8|%m$mJl5wRV])Q֢ ڸ wW~K3XoA<#xkFK֠] Ro(JQqcU n~Q&#a:GeqW9 X}Yg& 둫<9a-'jqy/y(U*K<R O& :qyt!lR͔$ /%o3}ޢBC@lݤjɃfQEik&|;?[+wD]vZ{P70 8y] u*R 2)Lgq!}}6A+*戌);_B"y] qFv#bԃ% MJ4P=lO{vTE? \z~O <`2OGLO?fgyk,&ϋC~ӤVZX,{cV=h#\) z,A1mEPk-h%?2C:uJEb(]Gi1 t}4Oh'uǃ n, w{vMC>мgnNX^0 I53Aؼv~>xFr^ۋ\ YȰJ3l0!`l|@&<K3\O[Ȃ*`%ҺnE7 7#,`֦_Xy)"Yǝm&/%| # qVX6 JtY6u' pCZ׫eq}[ر|kg/lK_u+'/ O"v?kGl~[xrfD|c}#MZU8+MRD^o _T0գ[;_dKdrgHA% E;[ -%Q,r6-,ĀO2{+FHA@솳i:3ØqI甫\2{1Fʌ|+k?7XZ"ɄTmDi-KyRcG'+8$![$G!/q7:)iJKak?x kZ{m2BAΚL$FN8ڹ2 $1`&I</ w{vK}%[RMT3<$VK'Lٷƒ~7!1&Rj"W=1% DLråA(x'zRk/}f\B%v`iْkd*1}x̏[ ɋ[cj7@)WX{Ƕ12B{vȓ U|އ&μˏaq[CҮ~-J&5ȋ 6M6,"F#pHdRA۳z+P#<"'2=6g{gmo%OYT&kJ1u-mbMVHh ظF|\(@f.uJ*HxNxD~K¤I|l ŶR &51bnm@ kb(܋W~J<䮔Ӊx<&( MЯ.ϮzKY$\h! "\`?+cMg0"?"+'!@6ZV4 Qάv;ܩǩ\#&4T"'鰋ů`BMRAdgELi{T E$ 1B'%鉄1hWˑEgT6' 0vA %Ks}=_c`+ധٶ D3Kzj.3 qHP Q nq_QCبm&>XfrX5 5a-* ~dΪxV(0A?B/'XQ-?M ֹ0GG%VȪ!(1mRŘ̓6 |z w m<hH_y৕Qk~R f6Pgs][ڬ/ N"l\EO0dD*Mꨒ{ $C$c^~E)(T[vki]{1adk!xk%=6U=Zr[CSs JUZ,mO G(f)Z?Fz{vmy+$hBofkWLzvj\'Uf|l$^0* +(5P%D2'p!0=("#YK {+]&rKZMDmvD4>~XI,kXOI^N$v̇{&d{Q/̴)1VpUp> ? gvt>u%K ǶDpm=7 afǘ BM?m@'nzZ`{pqAA$LUr[e+$JG-iXb;/Gg-9.t++/4sZBZO75@-ԭeal>D4(=@"l;Cl&]QYg#5Q!@Q&`MM߹,E6a'BNX``~(fa"+&fVW1>uGDXIh 8%Z G &t? i`uMds2'0Rm# P:uK4YS'!P|$KؘE΄jEgn,AԼ- kOf$G+f(ߖ\^7EЌV? -'apq;?(J) :@/'ֈ@)bke6VQT ƿx&coU@1ng*|şy+$53*pLM6*ͯwsBϳdi"l-9:yR&X[)KbiQɮ {v]|'7E GVApύoҰV9yP& -8 ]Eh >x'5ѹƩmuقStQ{K{[dAͪ0Z%o\5aג#A?i ֈJTKm$k  Q.+WnM7FM(7A y09,Fd.Z#ve7_uHctYmlMohL8X&4Z#xIÅIo]Hߪ?:[T(e}`m'  M:2^ة +E1Yy;0 ِ *gw\*~gm3۶bs*(9%&iqS\Piw= ^<*{i~o9k 'W;o VlMo^oHi5vyũ>@ :0 ` N*x 7W3ZZmL4cRuj}@Z?#jc3Gj/A6<\&FBk-:1-3B۶d҃KσwqGOg@(SdIep"AQn&’}ePLg[sAۿշ^n@ѻnnᭀ!*;V |OA´Y@ir!F$>Pjix?9OuFX8ps8(~Vs⟵uT+0Qdd-$'UzV5{NLuQYꀲB%Q}dZPfP*mlԭF0Zo{X"־76J?IJ`'0_ۅ!ufZh揰6c!VA}A t jH82]oIFD@=d\$xvlռI*"O{^xͪ%T Z*33=Pد~'fN|!}[x8BdNdd@I&]"p~|aVHKwP=[,aS 8}p+ϕ_j }MՏ"%g$}vf7y,H;rC8!U8b'\)[ ky2/'PfCtAaȪWԤ>!ƿWs!D)Bm(rviY]J,x݈¡/01}%h65oj(<^c8 /N8*O:-*T{vt8A#IOؿ溜w4sUbFB S-I& X!;fe~TdOWrժ{,Z0/viSUJr@}7OHނacw6SV& @zdE nB49dm]}M,;F'۽7ʰ.t WGA|ޤ@ȟ-\Ú_̠O`8K$ܬCRKd$%KbJ';1Diʫug>D"I[jM@<۳0.I@55&±K@shq" hkL%ôPA6IHJaY*Ց@rn&4ybI 7a "47-=C.^8Y2\&};2ZU꒾ď8QE\r'8m'.ǎt"3v3&HfB?-ma7b!Lce{uhhlŢi (s4Kk1% kwIrs+D \!(o7e"%+a8-2{uG*K@+y4 K~p$kwmU=Flhx03H >ӎ&žˉOKfׂm0CvBψO-|Aa߀e m.w\^/>gu :P'fd^G\:UԄGϴ uK;]Sk0)e ɳtb3΄L0+?M@TV=x%o`t_wت]8,CGC.z@R'kIo72:! myD[_+lvZ6mr3ul iǤ}'`u'wNl[G*AkMtqCM# B"ό^#l#Dx04gE1lQ~( bΣRb\H-Yeiެ7)䷧V 篠 ;M[@|ê+_QU l&H(7]x`؋wl`2S &gCbH)JhXp ,_]2}c擱(پ?L%IlˣGB#̢\wIM!-ʎ-j6$$i)ok bX"'1^Vs_>{չ@ L̩,JkRSGK +D ̱FYڷo`ƫ? l'N8sK#R]̙Ơ.̒TTm$Ӛ?XLw3E !gӄ?At{I6YvWrbZf=l7>3i@h,4"[={Vdi0%Ch)_ [X&Z>@1 p86d0? \5{7/>p ^&ƀ'mF|G͂1]Ž?C&J#3K Bfh:!fDYUU@]SoZ%S'5bGlnTL.TiY 'Pg5 Oa,wwZCs~7Je.HJHS*nr-ӷ}l`t-upǗ^q0t;IkBA7~=ZG 6~reB LU[ې u^l܏UWqb_5Z2Pl]-=p*nVPYcXmdt%i@xZv`_ym(Pi<}F\obl燥_5-Y[x Ty/>&~~Bq\WQ mDQApaW1lA9iѶ!,;P|g!81MԛW{Ɍ,H% wzgJ!jʃ&l@*VΡup PK["q/n, 39O3C>x4i'F+ȦE9bbr=" :f# 8*.|ngx;Iu8>@1-{~'%mXϡ2"t,"Dpb@dֲR%$av|GplhWHƧ[~-U87g O輛*'hnVӪ>6W[Sq{^ ^TsBcR|:!x[9RNT|EPr~]''/()LJ@~WD> C!abNڵEYg/TH[P\{v5>mVyz_lp2`4{!ppߔ郟UƖA5=0tAQ#0C@hHul=Wލ t$+ t`ɘEy~]ZQ >vZ "pqq]{~4ڪZV2f#7G Ċ7wC-\}7a dks)DM} [> x.  '8|RGF I]. \2 z35xSTDFJH~Ck8('.Ukc#hF,IڀKptV |FO&3aߟ x }6K`:l"P xe"U8o:?W|HߥP}=vύ7>?a]Óx̽pź%ZLq YjB( &*(2_ 1ĘHReqF8: IPhUc' 3yUJ ZRE(:bV r؟1 `lN, pL^?W3J˒5J ^%v?\.x2(Cflt™}m C?xp4IWT1؇Vڇ=SCe@~+{Wd@.qF{w,&(kwY 88ﱀU]?!ɬE< ^2'IjV.J`fF.j"1`ZHq`D<75L*&Iࡻ'+nF 8<7#7 ʈ~F?UgD(0AuvԮVaCt%ĹjU2*}q`M+u :g|X'uu@=%FU$L% gZ')믎ymX_%A$J2NiрVx[&Xx۶B c# 䱲8 8.W6N*c "?^$9@ ~j)_{ N4Dda Vw*^٥Am*e Eח((vl^5tTx.2#cA=2ەΗ?#JyڵȔ̸*MFHk-, 2oOmF ~#" 8o<V$`irѫWPp`b֩yPkfQQs@ t1("1%zUd"dZ}i!k_B?s2%g1.ҤH~-0ȒδZ=&h$a]Hnq&oH;hU\I?o߽et>n?-xI7c 8B'?C+Śyb/fȽ FNBN^ ĽaZe 8J$Ty%^ ']1dM0]8uW;u t֚p#{4oa0lJZeԢ] ' ][&eW l$۷pf | 5_ <\ fV<|keTK=~ д!Dt IDAT R@ jL;$| tMbxL /+/\ NEX ~] 'WH!1:j9vTJA#` hh[y{U`ܜ&7^3\(hll'$MFկa{[MgExPL2D ":"8F8F`\Y+ۥ`wXHLDx8JYpuh]o 8#cqÒc# 3رXLdtړ7A/V;CH)h$ 7Y+@r ,]v]gVBo19ppر$s >/qL-T($h@ w ",P .i~tc֐7َR,g/hڂ-R}آ{FfZ .j9d, Ȁ1K2m#`Z.L-3G f" _pKڃЯ~% ]B.|P|v"AM$`iF^+G 0jWzvHw]@Πi uG5zdV΃VDOz!rA-+mRm="$ 6 $Ýմo*jH%kZnf' %VL;43=pm *l$$`߽{cYl' yyŒ !KPh1UdKBg%`s`sWIjE~#4gj[\c~DKS~8 ]F4(2@=M}I 3aV[&tUAe}/x[{+liNS_ y%3zhD!ٷX8UL]./Z# vA ?Rhv^&Om!ž!LV@KU)$@gAq̲KFkI9Qыg^%DAc]2`lF] NGq;x;Ic43Ao%]%"Z";U;ľeРM" LT͈͑P4+p(BXjU$;6?8T*Sheݍm$2_Nxv̳>C+(_QGC'5, ,/nV_ ޛ6x2w;tc O^C| ! @So:@I:'T}+j3l_:WRrp !:2j |ĈTk^O"XP! P偸flS3?L̢::RL#R!{Q":$Y(FQmɥ{*>_8pu' `x ]3{x1+BDx(r ) >H&0P"Xۖ޸nZ 3Dv,F9p~ O yP{b )Xj瘛0 tY+^%.Ѿg_ ˿j]"$s1;I)$RRFd HLm$ $`[+ @7e@?Rib>Glbd@3>:\<~eĈ{? o.~sf,-n??9مB տղuٌe x;kժ)kI=+AVf]cN+P7A4MO0.,5 1 A>;|4kіÐq;ǶƫI8~ Л>2/݌syǞZ7c%fq=&YU{ ~rk/˗t`\%9H%.p:n8kÁd$ zzܣX+% 3OJuҁApcѼ_R69?4X *O}Ҙ0 v䉐g^:v\ZqH$QjfԝZIV2`icztc,G|m叻&J(' y-%x ܓR~ 35$K&AIrEe8"bC8_gy3܎8HN>KK.}>pύ>`lIX>~!d]@Abªŋ&!i ب@WEt"(&QsYKKؠL+!q`Ԥc BFq͒5:$l40O'P8'!6LpX{֑f?83^9#S.ߖ.{;/vmcvF‰K3#BfLп4B@m !ws+X 0HB$<_fX۵d驇0)aljS]w6Ȃshs@Z\!'0ےyE9PֵWotqjԅT 2b)KyϬ PG8_: ?H ֗?8kۃwBS`}3Z t69?9yc%5PbXj Ё ADc;{ivC㉥KSV!zSZMvcs&t`|vMtuLrÎAkS="JDʑ8w!:+G"lDu))K3n R7`{ʘ(xw+GJEjcw#@ ]aqoЏ(Bȗk~LYϩٿI?%+%IP6]6KlK}yA]PQ҉!Q,<Ri]jodɀך+G{4(|\u:]ulwvu/1]{ωnhi{ِ rc#R!}n[k!gxu+7/N5nm]2)sdU?d@vN @a$1P 8IFD.,#1B&HIN@aiR|:(ʑc߮c'qKei9,YĤ7-<H"c$`;1"pҹDçZcB04)fRXب*|.Y@RvVP̝kw\OȚT55;g}7&kWX'{퇮~'rW@^>r_IN{p=epz&_ř~O ; 0V|3!Oy9pzCW#vE t{(GSܔn7>Rf'3%}HH6 24 =fY-V|k TCLKp, x"BΛh׋! on8Q>J{+ D0vqΫW굕Nܽ*.J[j/>9!htI{G%s%D"o0cZm\9^%[_OOY6(Cz;_ Y!//} RBWTq׺: (˼*IvHg ٢w󳫴GWՒ.͖wE? >eDEc8?ߋ5wcxlWB ǽyd5Żآ'C2Pp!0~8]F;n y"[('Gs.`@:ٶPYk]V9\?ݫG q5)z %U [Fٞ[(%q_f?[DV܂/)+1/!*#jJr(e+FծC+to '֨d@#`h@.ݱgLD{z jni O9 g%V"٧rvNhz/:lS3=-*{$5ⱋg%9/L|u&uN4uNEe ~ v%Ǒs,eEB_5ыX2s*ocjKo1Hj?3)[EkT'!ۮvY.6e=63> J. *!N>8uyc<.[+WK"k:,7--o,W~phEGNK+~%̩hƔ+AeP.!,cxg(@0vuhW"`EQ*r$$VB$W|LQ zE*&Rbq RwXY|h< HGNIDATQ#nf??~~3@PK8+3mþBRߺu]Y+Qi+F\l^ @e T jLv^%0uQ׉1Iᙩ!)Z /l"(SDv6

Q%}WKsSBDe$Ǫ![MzQ* NQ|H^g$F֎=fU+ J) yy+zm? +XtzT 2~kF 8'Q@3 RE@w"` ,VJv%up J`5Q!hh1E03Otz1+W'ģ'ъɗ-Q# pmdz8GMT#!^{+m-uBm?'-y콎v@ɖJ\Djn໤.uYW c2IMF/=zRkNK-W辣ɂN?3b̓GT'yb%/X1MLwC /v4HdWl1繲z#cfa ΀V=j:E@W.!b1FF3B[U-vv)0#P[2+͒Hh $iuOAF/owz6cJ7ڟf3bF(TQM/pMJьjf&% 2r0rVwD~$/}zEO% ӓV Tn˚@Mppgg^{ *8s ,%d_O.hlTv_ò+٨! $;31$Z0BkDVm0Ì;ʉ3OC= ̝0״-TTc \k((d'iB57gj1DN˥w(=^cFzh!6KL4yy 8״< F<*5ՑBsx&w1%Lqڜ~Po9 ZGÓ4̍JOk9-#\]EAx6SBAI`Y`9`eBe:5yF# P(PyQ EPXq oz6^,7 cTzu*f@OOmhGwA<HvlDJDAXxX^|8h_@vxGvxjzK][@X1|Xpߢǟw2GۣޡDe_FZ#.\vP)Ӧl~CxշT Z.~N5F$JK d3GM=j?Y҃;HWh'Ķp Z#a?z$ :g\s.䀅Y`$I`qDBeϫZ{Bmvu(.{3 =#ͫȁ,w6IH_ha@@gڹA* > =4pz*SńE3q* $z!gڏwDArDd 8 &'{l="r -Q [.-ߜ#21`JU# N僅Y`sPU@YC&k@Բ$ᷧQҶR=@c:L~Okv%dEavnMl$APsfyaeш9+҂KXY ^3꠹ +^DÙ?Vm޵܊/ k^F.xlQMkH+?S[CvշPՂnQ]6B \\gs/=s ll]D\\ |w+zWo1g;GQ@k k%}oӚ&ӓ`5x 20 տ E0Qi-òuHGO{[ Ki&"6KcoQLF( t~>:%7))}FcFrLd u9o|WM$l:b'[iDڕݴF~æyzg*v܁@ٗ~G71qL =HGDn֐Oz79=v nEa@nGc7j9g_BF^|bWl3-@, AзIPt9eF/lnYnKQLZ .ZUR =T8B9\g'9\ftыF8 /"-٭`oJڰ;ht@z6Aٿne(p]OUiEBCңݷHˆ(6r4`zr/oIk0Vtoz7k6BCuD6C>䉟!5vܤ;g‹ޮXivqk9t A]. ~?{[}s q<}]׿[?t`SYJkkh )ëJ|! ॴFTf s W) 3gm񃇟lX2q|-4 Ek9t d9,fO8EP2~dDHjQ?@kl4Q`@ s,! <0 ,B/ǟY?W.oo۝#-0Nkl`t A, ~۲T\l;w0Hnzj7\Ik# bF >)' KgW_z 4,qCCG>f @l5㤣HCR}&€S_3N~9WB;7KH7);g6 Zz$MKd03 h dkeX9dWMr"}'l+7yfܙ"&'d] HvCn XI3n^uyYj݄ƍǯ*mI}:@Bj';=9  bōHtC )ڵARL.{.'"r:xP~r&/Qh"u"4@O˿S(w d{vi,[nf7 '\Ck@`M Hu(/ [91 dzvi }#axg[7li  ٙD:Zc)A,w ԕڻΙvv|m?;gw;zp~Ə>MHBv\GkBayۭM@'&[}A3wko<(MA@%'6 #NkB"\Oq=4 k }r2A@&}[4t"uzƛcG+[@o!x>-By@b&MA@Z^7ÖWh 77> !}}'i ҖBwĶW"lx@fodܢ!dMSKG#Zlć?$v-kZءO10=B㵴!mòC|*v,A@//Lv*.EiI{ d,A@HUd[4hB |:x4!ሁcSi.W"4 O[cCGh BfL$m.~ @V!-Gk0KR1pmu-"x7aZHXpT[ٝ!;=1 "CMH*Ԍ ˀ2~k& EdZFoe,|q -Ax=78V! 4R3O@H{ol٧ 0uHu?z& TζP/BqZ0js"wS?=ʢFր@ZTDJF HbKZ[)\w(!/LeV4f@:a><*sO@(Q-xE^JfUh''m6MC@i:Q dhy@=Lo ><i]apl R4 ?ZODO3r !P\/B-MC/~h l plBAKa#AB6:T'4:t tݶF}04<~rZʿX` ,zQC/qKZD/j `+PXҶCpR[!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!BVY2xM &IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icon_large_grey.png000066400000000000000000001147321260417502300241460ustar00rootroot00000000000000PNG  IHDRxsRGBbKGD pHYs^+tIME0)(ZIDATx ]Y)3O e CJ26ІK/BK!rCp %).hJK'! Vd;-,Y9GbY%۱%[e+eI>Nr~{|s^g.`p5G?O^}G/{E/'{aΞ={'޻zKTd;cɓ'_~wwyo߾#sv.ٍ~2 q]wu#GqZ?Q N$d/o:/9q%}nËg[o'XKz%N`,8y'B?!nݺ$̈X GQzd+VXh@Dؘ̈%ĉ!k׮ŏdȣH dH"$)ZAG+!P)ObŊ! =-} D7RХK, ?V8p 5b@Ef璽Or%2 @-]wf DA. ".K! d_'`ےM `p۶m D FHc`\0pԿ 5kZH-k浉p ȣZ9P~le2 .D}ҌI[֧ $ ிS0pmB}]wuѾV$pU$md",0xFz+$#1r.5j;(AF(@)EI{%ShmzF~me$$+V)Pe?>ex*zFWmz={^׬V;ɴ5"Y]R"$!M vc:+}رC=&kE9֌|c@QW h@ @ 3!< k}شiKڵ-šm IIYP R p]w ]tMXv-XdَwYNm4` myKp~e4  (?%xRߥ[z@C4/=b[ - E@MteJ@4ğ (pur 7+t]Gnݺ^7܊X+ qGڊ\).G{{&uO,@w[$͛7:ӟHH^~MDF%B@X" .m4߈pm)4+ jVFFF \h5y$\G (tnHxrڑ&]v6>%F CpB* lߓ oLH܅msšCPB|[`ݽ  }km;$T<u Z$ Y P/w` {\X68P (ZELJyo|=b |I:CQ5h~~mv xRAVWE@ H@) N=qf 2۷w6H3iGtKDW O@* ,}oi C)[lt wG@ R}Tȥ+\=Wٍ7ވQ>@:{~֋,@m4K t)ڌ:F^}&n%;jG߻(7EH_jqq>5"LOQ\"@%IXQ\HNvM7-~O077 6obԥ@ޔG_")Y\H=0Ǚ:uxq 7\/)ӛ$ik5)R!MhB Z=Cj-ȅ@#zs²5Ν;<_'8p7@K$.=rs8*,!Pk=~hEi@(=o/..>O>}عsgoqޙR@(@kt2 Hz<"ۭ`l8iӦ5O}@*[nyGFE$r1 R5VȽ!R䩀\h"8uG?exYCɟ`c"g,8[1;.ɽHKPF!Aȿ?GI0F!qh3.,<*E'<ۗ8  bz BPH/@$$!+Fp9qϪcK$X!EP(T`{'(MtX xڵ]+%P  8W,W#((Ij ?iShH -}Ν{)Nf/Ou M pe Y޲G hX+.cgH"UVZ%Q: x& P6 6ė) i"AkH E4-?۶m^0H;*NXz@4 mZ@iy]81y&T@MDd9q<03 p7*n$ kR[+|f'jQgɯ_@.A^!PX\\|!N] Sh3w"lZ<遈rV$]HXv-0HH|ͽ ".s> Є{!H+zvGY c!ZXuTr} ":ID@T45NH Z@CE4%PKYX{z'^i?6m r 7nkjD@sύRZ@Z#( 9xȿo4~vDj .(\{j,Ā6Ok\CfHE'AHP%}e@9k[ s?e$"e43q.ڵ 'IvmZQ[FUh킥xpQ&@[ ) АnV$ "aH5B:.%׮k׊cg#"`JHMh}y^HmH#nAo0Qu (u%4@.& лKw·- 4O5_q&p N&@}$HFn Ɂ{Dշ Ϡn' @1NsB{#GކS@:L1j@m ybl1Y"` עRa&z) o"R7 NpnqI=>_x"(STCoضm[O"%"5M5g~g-O狂ʎN4dyߥD@.B@is<~q0v%hZ_FZ]>- #AiPK HTE4]voЅ6n@vС^;4Q?nYW* Є$$e$ M{;pzVXXXl=Bm&Q*51`1Mh]Q(Gm͏=o @b f)PZ_[`Fs)|,m0'o#-^}ɸϡ?o߾… )@z>;nH/!VHX+T4.ћDA.LQyzE$޽{N1j [4k|c@Nќ P (yE&\Hb,_'IxR"ѣG'a$w 44m֗8ïҗY;(TP&$ah8.Ehr#J}Ln۶{e8 ;@FyZ8`zQi$=fyD@9.0{# ۘu^kkMDl׮]]p98_ػwoDRۅyAWD5k_+5e{H#4X Zol‰P;zm$-bI6f skB`r ?޶@~֭K\|N58@`t(Uk5#\+PڼFsDEF9qGH\"6&NRHsm۶GO<&lx"?8@jt6jŁFҖ]nquxI^=@dR뱗K=b%G_+dvZx'/%=@g'@:; Ju"ST@.j|)P7d=FGVko@#~Zz|gϞx)N84CdTW'}E]XBzƳ?.q_\D"Pf&/ K;ޏMqH`v)! ^LKkȕ3IKz8E<kҷD&,A +|#]=}߾vqӧ_g!/îN"] TmsƑM(G$}m__m.\x>N;J! :@+Q-m>.҈, 歀)FEzO5ɚ8ۋiC! "Wȵ]5!!6vhsį ȼFdԱc~'@"sCDPTW!C:g۟U` 5'b.+ $T@O_Tt[kr]xر?u8!E@͸.ȿΝ{)N=p$wD 4,fDQm^>uODk.YNJ^m`޿' Q>ȿ{^!A4! :@Hl+z}m" Xu@[[8h@W} ۷/ّ#G>*! "> w޽''! +zP0ވ@ bzK .;?)T!۱cǓq"?;$w! 5\60hY hW0X+"#$~O?: 0:귶-?Q%v3gμ' ̶! H:"m# RAZT@(\ _.F{GzGf%olϞ=7^p98`vS_?4cǎ^1\}֧x"Z!' u hTvogjU0HDڡ :H,óZhB@JXu ]oz jڤ?ѐIx@)ЇB8x"Zj@@izI(x @$I!vC=:0{5 MW@ "ǫ*dѨ5Rh Za[q`F; raSVzo!!o'4fP<:4gϞ^ H/QE}J  m(jjqw2IXND@m޽|, &p.@Z5W@@Xt! ?ˏRaa$"P sΧ oG.i C:8T@nEC[$yp?~.z~IQҗ?'kVȉ3ߏ%C0CCd4v@:8r4aP FB{*sۦ/Jw-0)\<>WsHP}rYc){A_& K}ۯ#_~[?׈ `D߯ٿ7 ۆ*n$jA`y=~oߛbZ+_?G r!,~ĉH34l0NHb@"9ת>/[w=ߥRX~?N~9Ne]}C}RUWHט& YPq_txso'򈀷N+$/%{s1>;/ZH#KhB@4ṹ>qe8[pM?7޶I X5E,#Q{Ā ͈H%ڶ!}~=ر YHFֵ@g F Kym-P#~G.B ^Vp[ȄZ(`& ٗSȀȅVm˯KkJ_MxA=jl+$Qhk]E !p>8p 8>SCOIسgOU#81 Er!wR7/ *eI"YQ- %`F"`YПܽ{4 :LN r{vCM`"6 ؼk׮x.$x}`mk+!jiIߪ@T50`p=B '3k@_"!!RXem@#Bz_ß: ~iݻwoig{^.@$GaD'J OIX wM*&,._5??M= iQT4gՊ#ņVku5W(z@t.@ kb{" "$A%I_#+ P h3ѣGFCt`?P/E$˗Hį kOIhh MHߛ7*$h@f(@>wwfE֡ Q؉|<(-5JQ˯4G@{ 51PdV8d5рw%]{~Lfp|lnn4uOϛRHw4L"}\ے|}5Rϯ>:#  Q?& k@ #o MpB OWx ( :Nk\s5q SZ:#{zQ{ZE-<"tEm6DYw,6, 8Jm*@\sw>h%fJ\9t@@+', x$ZK5oT+Ʉ{*l/_k7Fck !>?*,DMy OB`~~4W_'hTiJ xȞ#rOb_Ev?ND:ּFh]&TK]DBBrӉt8$:(GDVPhY$v& ,r9.M؅5_ZCYKl9 %n{wA( Z1h@#y` ` ; `i,WBJ HBSBڒO >zMeȟi땯/]S?'=NokQDD@&H[{y#&p$j; @$tUW" [KaxK^?#aE%G 2R\?Y#\;B8BC'.D@&֧O8VB`L4BЄ&%DмDmwDFR_kK~$s:& )!!s{*kML*"`PvWII-|Ϥȫ3 pС%®RJ/1'-, }/y҆s["p0Ip%26FwX{#2?(aS4P'SN(I5ih$K xI>*41 Ex^D kk{kwPg.0G!P8:h?yȑ]IM tCDWH " am4n:D_\ϑ+Fi+&m&A$!/n!Qj^ɬhwߊH !Ʌu!߹sWa ?@B=u!7jX7`KiHZO!GH"zipy]Z, Z6 r6 MA"Z`E8Ϲ{}.IIPb@z6 K DGh#_)!z-k D\_)Pg|pt$"׏ᅥVȢͽx&}/,, h1};*D%DaMhKpER_/5}Nm#4 %z] )D\Pȟ{((ks=~SyyK@FC{ @V#M %ZaOd/y5. z5Fp޿Ioe^kih]@.2z_t]wa:уw6@} : ɅK9uw!j/VϿEDk+{wI)ڈ(G>"Je{*}'oc:" =pŰ =2ܚ 9XQ@sz")Ъ?.KB)EmK[f :%aux,JuLD,"z.W'>BγX\\`a{&iAh~u9{Yrɫ~:rpT F5OV"Pt%<CeՐ DV n۶Ο?Au$ ȿ_?·,ˉ_%/D s_c] Kgq),HֻBX#RH O"*@/%4$ j_"i'Nx) B:m}!"(C9[zG/}I'ia~[hɤ'%&ļZ#RklZڣOHBpuQ!lgktn ItXGg >Ws?RgDy%J$Wz—D$FkmȢ\##+yPک~R:)jڒD@DX-o?wsnG\6Ilaab*sϽ}o^HT"HS'皭h@;+ҥrNR$6k9] h溹t6{/Kb Z uhowr%$@(|^ kKw!|8=%~˴py]0mVhq9pL8*=ixCk.p'V#LnZWϑٰ: #/keQ\ȟ#Pi{.^GDD5_ro$K&Za`?&t=sׁIڵb@f++ 1{o~ŌVm5 GG[Iqaȸ\|Fnq5LJ9en$zP7Oݥ׸18s 8FLTԶzIz |Jw]1y" BQKu4x I,@y=TO} 7Z\Hzu3&.4@ދwءm;w 2J W)P8/殊#imF "~kB\+}{i]m*X<@)k2jlπ+XuwN%ΐX9i[)m@!|ֺIGGuݖмo_Kp5%Hm~(e)/ r! J=f%$LSށ?8ib@:\kGF6N%([Dok8/=rGAxsѰV s"#vfS_9LZ.=)N׫MєlYm`p ~!/.,,L9e}~"ZZ:H͞/]Ɯ!ZP#~inm8)jg'`y"ݪ?W E25zI(Lכ7o)&M2b@zkIkƿ@f5X(;J/[4_##=r&Yokik5_TMwD["Fk{fdg߇&^`jIٳ(|ᗄ,uY\HVJ}&<PKEќkޑxR[frpIֆDcTD~ZuڑHMZq߯H?S}$ z8GQ HEbo]"k^ah[}igE߻3` O|YH"=- `mHĊW/$/͚/mӖjIJFJP橽`eN~ ).ܺuk9bH7XDX^[`yKDږ=#~=R\jmH++ w$QˈrskAJ"@۱3eE3pؐ>m?0MI9M%-'c9h&rPkU[%a;|+$Ziɐ&] F*8P% NH龐_/O  JBD@vMmǎt D@y}!}K D׌Bx"m!X^J4_C~n Ҋ<"@څHh^D@ϊdiO^y6&2(_Kh~"KDpx#Rt6wnnB`?7" .ܷoIG@FhBo*Ѿ\Gx%4oZT DpiԲT( D%isB0-"R +S͹ҿ}Wr('Qw1`%P9"oky#t0xQ<~??=qf xDV'04@=gûaOh#r!H_-2 E!AZ^ss;$3?il\>;Xv൓(<{1 m H$D@D D"5)H ERR¹^Hߓ=C"f7/E:ʰu)ב^ 2`"C):81mrQ{#,J ?6GE=(?b@2z0W+"׊.4_U.EjW'{%e:ڬ)£1V+H5KF$g)k^xݤv9(=xE4(7)Š%k~%2/sHԽ^4G*}ԪޥM{f["VHq)E[nZl- ?ǖ(Ww EH霹 < p$ z(& @]Qꪫ#  G޶> {9y) P @ H&_~p]px}&ٷGt<R@͖(=xXo_66[f7 kd?i\@-!O{[#oyuIOmEj|IxD (ߗ2 oHRֳd zZ?ҙZ0[׼,c*jDhG̣x_yx[PP o{j $ZʁKjCv& iDrsk(k98Pg \nVy4Pޖ@_%C`*覧QD`* P[!"~O5s4iuc6Fؚ."#걷@Z52RH0$(':kQ&j[h=%AK$`.g-4@<쯁{@e^~OزeHn."5E^◊|}b%owA5ޞvsxg45Jh jj#Hм\`y?H\͊DUc礼ޢ@. P-?U{a`Q=Q7(͛; "k}HJ]xHەHyrF<p"KsJץ7ڊ{q_D@ i|TtuڔϡPE3CJQ<Б {*?+.sw'0l֭#> \^#[E}ѐl['[^O"~O @5@m I]濃j. jR @"m]4hKۥ?b@- M|`9@nW݉NYT;pǎH?K<p[)#asIHw+^ZܤE4IZ @$$. -yҒ-mV\{lFqRk`I`DuRQ&Yl߾=,jt(y# {<~)T F՗DB?J!JOdKrPODhMiha|i&"RxzH5Q5-uօ{/yy#ETgkHc}2Kqm ,5!}㷪_ S.ATHqF%ҷDN"} yEB[ MF+5R?W7^{=kq3k:#w\˛g' Ԛ6i.k$_j%_vzwZ6dFp]u PJpL)@1]e 2Ml޽#Cf$8E@~k Zצ3 m HScP-*V!_{sR XH1eJELh h;&SDS'm^+=tն|Y{<mX "(C}&yE@y*H̭'ֻ"91HZ'@Qk) lkK5 idk׮N:th, 2G!kУ5ųlkIňf ˷RJ3xf.p{8V2m Y:k{Nw(70(ǯ⊋U|lE@6MQ`D"@(=n&T৅:kûqRxt6gIԛi# fVąD߳RZ%EVde' @ h@<ߞVi!&M?Pk_U^z6s˃#KVa^мykSH9'E< {ב$"KT\$@>%up޿($H:y h@z&( @iMvTpPss=H{<2olMw wM(#ex  uDx@ҊjDGD=.GH"@j&/[=V*`X idׯy=٦M:H"@hK4/% 5E+. {yBRWHh޿k[#""e+DPJhYhP8 t+* ȦYM${*Ncisss# }>%Q"IpUpn>M*N+rd-r$UK{"QVTGUYDObt ppOi S~m=@@=*9s\ Mk%ZC F-k GHD)m*pFA=\P#$#į|aU.V@ҩ v# (xZXh`DilV@<@t%=¢h?' J]ց){E8R [\#e=ZD]%~KhI.Bވ'$9Ԭ(36 9r7Nh5 ZTD7"?ӊҺ4+ zIX9k|@ΩR!c~/\]Fڪ!D&Jb2R.uizOf0??_-tڵkfRD^?{++k9w`[[nH+fGE=PQ4@)E*zR qG"`{THDk eAAS0ϥif@78:o^%BB zyKf6ᯋ3AD -]isc\ C=MHu,V!%非TyۖU`5߇- oEW C7"%soiDk 4AjrQᅥ葢R@HD[zS̈́@*C(U}:M-,v[oBZ\/!Qr!2,kmkK/ctrBK%e1`Yټ65Z+w]&Y.K̀8|i1"BMgƍ;ʼs{p[mk =i?oo[!y2_՛_3QДrODp7[ E,PK(WxM6j(U05?5 \v@5GgٺuZ!p]ߋ) .V^ݪ3_[f#=Җ!-cs {gs-] 贼Ȭ|)V䤧 RyV [%~+=rQ'@nω,JZ*C]jp9рtmmj@z(/N7ggAPN~\dt ֨H_.ڽ܊ӈ<3VjlKXkjEy<^UL~[$Yx=i6ڢ@0p҄@OS ȨO\"aX垗KgdfMD²vm~wL@ kS *yo W+BDn$:D h .EIrXjCX&V iSVPMz-/sR2{"K?7௖ Mp <޸Wh\1OZ[9Z#"u(eZ۝՗x"KyQN!&iCzVϒ=mE@fXPi[%5FhO1eEnjJHD4pq5 ZG^xd)skF+BڜY(mm ǜxiz.̒ضmEڵkݳ5!.D@ )oUK]D$OVXTQs6 j]e$bL<iKYx,%Rx@Mۅ` /ZQ[!ݵ"Tτ@nvr7  0(%@=m~G.Vjc]: ye5k&%<`dCPT],lD5v7:#4bD@IPZZm;`Nm7S[Y`Dpi 3k"{]-=mb} xkՄlFZ1WX(!խ4&ڌ"^ mζz(4LԈ)"NM|iFzX_?k9H7vpx~dhW" KؼWZ{X@9W="O w_)SVFP֪Q!<ܴH4Zlu}E~yE4w"`Ϟ=KGs Ix&y%߻KA tRX.{])x'Hӻr%9y##ϋ] X#jSthwς$=GfQFc{='Rhv[{=B>V ñpIH~h UWY "^E"9Iީ5h sBK zY@zhr@(7`i'.7"[ZVt5+ЃC)ysC_NzK x\KxhFDWּG`P-.uhF/P#lHu%KQW&;rq׮]E@)JSPbpr65DQK@M]mG$q:.d]Պmݘ(tSDkCH`g91B رc =@;qo{xk6yuԤ"4Յx'B^"T]9 GMz!jg:uKN/֭[;] 6sn2H"m^](CuX5')?3-j#]M$`" 2F"G›W7|A|6nؙT@X僛!>ŀ$<Gh\}d^m= :k>D)40Zq6 PvfP:z!%\wu/H_4OFH4EbGNbkBK!7mmm$D@$ `uH(UD.S}y$z̓#_I/m֩]l߾}KLQܸq D"ۅЪk"mVzSV85֬hu~Qqh΃> z-:#?v0OUl͚5,@l۶mKW6ֈqk K#x&y1)|ҵFEuX!!h"X󘽩qIhg(uhÇWcE? Zj+G`S$H<n V{Ҏ=n+uiw.jukMW"3Ѯv. {Gvb!t.>ez< gN ܹsg"hȅ6.Ƹ% o>HsD$;iv7{g\"#kMhmtM929/Noрf0E/uM} +]}k *AԍԶ eM4 Mp顏QEj?3gμl^ xn"ςiTt{Σ}t єCU[o]z8 F5ZGU(X衆bZYa6 ]G LKk=xSO}Ő@f wPDٻrgϞ})w,=^$8??[4`BlΝ_fLbyCYEFeHBq O7ѢRYBߤKO~=vؑZt7~ZURH(j!`"ԟ&_4JTOC)ܟ &'.oޛ =U+0d$Qդ-lX~cuC|]8~{%ޮHI)G):8 ݨ6(@ G*25STݟRwOQ'S-y;:Mh QY]nT'qFOƾגh$ }k~~BKv~L:")y\rqÆ h i7(5F?ofP@43M>Rj_>|…/ޅ2" ML!qLiڣ&scǎ -=Ғ"DG~:!jqьhT0 pjIKԩS3+Hq-/vBC R$n%Q0dvjsCDWd(Ф P! z}zFG5/<Ȼ3DVI_DQ zwa˖-K*C}mjf =4@OgEC.!G}?HDui W4Q !G$ e$ hL)EQP+Jաؗ(! )EF ZoԩS '_!nݺ Nh)شiRt@%{ PR-D &h(yT(^Ea@ dݿѡ@cxG-X8X[Sp7.P r./Lg ID*ݗE ѭzoMfaEDm26ug<_҈]h(uⵝBD LH 6q\ LZgL-$ ;+A_iq zQ2:=DۺuRDۯ s)?ߞ ztFra0p- `D3c382wM]'ThJ"xzF{H?е<- QE([510 jdm۶DDTg@߆}v!륨UjK'G%{{?r@Bax:(Hʸ@*h.J®g ) AsNK,ݢ(CN{g6i#裏 ,Ovߜyt)*Q0HJWКjʁA"c7Dy$F@x]UGرc' xHP' f/ٳgF d@0 R(y\ ` w}ܹs_ VF-^l7xxjb` =ܳo\@l'kN(zϸrQ{7_p5`!`HdW P6EI6}af/[SO *0~ZǏ2$F" j-94Sz˧U H,=g>L$By^"\'7:@HLZa_уF @$o}^'OJ"(%] ILp$HBnzC7< LEʕ+ D:]RTPH5CXe<(#y$B\ZZ%q_7~;~M rH bh=E @0IKˡhvGrhʗ-iߟ Hs6ЎwzG `liLDAy/=/CSt?/ٿIfݴiR``c֭[gVy.H``bŊ@y`Zfjbȳ7ȾtD+ӃdDHiTH ݋_nR$G_/ o\&8cQ@UX={f`P 'ӽnP )j- `]A߿)7OO!{h+V'=aw 8X[a@EXTtH'q@= S޽{jHm۶&AHazGDx}sp%C]@mDTk@^!iQg4/H9l{ٹsRgÆ Kv7tp]P/`މ@$ S)_ 3Np(C'6x"`%m^~PAԱ@Z @F,P= *,##oD^ :%! ?b2A9 4* "DT@D~%/ ׈`)M) ؈ ʁSdȘ>&ALOq"gAt~Muz-1$jZHQNB3H^̊+^SoLv- 61ɄF<=|!`s z3Nbxmz bp RJaP0']W ڲ_H, EktɉЈ\0 Va%pd )= 9I =?!p0Ma_AW-8`0XG}NGZ׭\ӟp`gt`kpzoI?`n9"8xI\i0T-}H aw MJ}.é@4mpʕ4dTlT+}%N//K݆ݓWX"T dgq`#7bd/c$tQ 0X};uPN+V"P߻a0X+ɾ58a,|WGse$1/NF3~;a0ؒ^r/%{3ҁwi:|9m!.$/%8 .ZS|I:_)$6?i&dD7R$ ) xD\;]F xu:d7/ 8Bh Oҽ `đJ|rMOyD*H s t(Xbޑ<<^#?_~| r ؃>X|ʱ=7$do$O=:PqcbIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icon_outline.xcf000066400000000000000000007553171260417502300235130ustar00rootroot00000000000000gimp xcf file&&DYDY  Selection#1FCCCCCCCCCCCCCCCCCCCǀCCNC^C!|CCHCQC C CEC0CCCCCzC>C;CC"CNC|CCCCC9LCʮCCCCdCԨCCCCC5C{C),C(BCCaGCCbCCCCCCCCCCCsCCCCCCCCG.C%CG.C%CG.C%CCCCCCCCCCCCCCCCCzC"CCCCCCC]CC]CC˚CCr5CiCCCCCCCCC*+C֞CCFCPCC CC~C$CAC[CCCCnCCwCCZC7CC!CwCCx}C'C}CTCCCCUC\NCTCCC|C)CxMiCћC$C=CBCC>C'B:QCBԍaCBvC{B&CB?CxP)BkcCNB_C$B_C$B\CB\CBTBBpBBBBRB3K Selection? C*BCAlByCf$CjCz?C<CCDLCC`e[CCfcCCprCR8Ct CCylCCylCC'CC'Cm@CCCCC؛Cg'CCC D5.CDO8CDP~C DCDRC[DGC qCC݀C.CCuCMCCCӧC_FC*CVCC6CCCCCCkC2CC\CNCrCaC_XC+CVCy^CDC'xC+TC˰C CBCBxCվrBxCBčCŀBTH:C'BC|wAlCA'CUAi+C)OeA>BA̵BgB r;BsB!wBB7sB+BNB-BlBB&BuxBXjBGBB9C5B,WCzzBS@gimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 1.000000) (yspacing 1.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) gamma0.45454999804496765@M$s&& New Layer     && MMMM&&Zjz *:JZjz #3CScs!,!<!L!\!l!|!!$^+/47!717A7Q7a7q<=EhKKKKLLL$L4LDLTLdLtLLLLLLLLMMM$M4MDMTMdMtMM         6677888999::;;<=> 6677888999::;;<=> 6677888999::;;<=> 6;6774888-99{9::*;;;@<v=<;:98765 4$"!!""#$$$$%% 2 2 -,,-----.// 1 2 1/-+)''&#<;:98765 4$"!!""#$$$$%% 2 2 -,,-----.// 1 2 1/-+)''&#<;:98765 4$"!!""#$$$$%% 2 2 -,,-----.// 1 2 1/-+)''&#<$:$9$,8$@7#U6#j5#43Ůwi]PB3)#@!4 ( !l! "##d#/#$ >Qcy$ 1M 1 , ++,,,?,,B-. . h0 1 70 7.6,4*#( &<&dx%*"    &:8 40())***++,,--. 2 2 1 /.,*)'&'(*+,./1 4 7;{64 2 0/.-,,+++***&:8 40())***++,,--. 2 2 1 /.,*)'&'(*+,./1 4 7;{64 2 0/.-,,+++***&:8 40())***++,,--. 2 2 1 /.,*)'&'(*+,./1 4 7;{64 2 0/.-,,+++***&Wz79l)7z^3֏Y-/ ״}`H3&'%))=**X*+r+,|, -Z- -1 1 1L 0= . -F +I)n(6?&3y%A'(*X+*, .F /] 1M4y7\;'az'd5+l4%2,0 // .= -.,,+++*-**')*!      !!"#$&, 4=7 1,'&&&&&&&% &*'#!"!  !$&),/ 26 5 20/.')*!      !!"#$&, 4=7 1,'&&&&&&&% &*'#!"!  !$&),/ 26 5 20/.')*!      !!"#$&, 4=7 1,'&&&&&&&% &*'#!"!  !$&),/ 26 5 20/.|& w(+*); : CfX3   '!#"g#B% ҷnH+""3@ <ѥxX,6ּiB0 `&+A&̟uS:%%%z%Q%)" 0VzBk%I|).8&%r"5j M'p*_=:?N 3#i%ӂ,(}.+ q .W1m.5_4j 1 n/ .-    )))+08><;:98765 4 3 2 1 0/..-,++*)(+ 05)))+08><;:98765 4 3 2 1 0/..-,++*)(+ 05)))+08><;:98765 4 3 2 1 0/..-,++*)(+ 05)2))+ Lx 0%Il89\=)<V:9908H7f6u5}43{ 2d 1E 0( / . .r-<,++*N)#٫{' Щ}W-*ثT(/d޳[04[6 --,,++**)), +,-.///0000   /..--,-,,,++++*))(( '((( ) *) * + ***!--,,++**)), +,-.///0000   /..--,-,,,++++*))(( '((( ) *) * + ***!--,,++**)), +,-.///0000   /..--,-,,,++++*))(( '((( ) *) * + ***!,g, +~+**-))E(S(++ o$TvïtZ< ^"Ix M q%Py/^+d,=-.g./ /Q /| ᷇^8Oi ~ ߱`0  r էzR& , L ժW0 $ ׬W,L  U. . ,- - E, , "+ v, + + 5+ R* e* b* i*Q g)f(bn(%p'|r'(n9Vr`[o5iy $k$o% (,=%u* &$%&/&B'- n'/ 'a (7T(ݚc 6%Jp ݥe!W  <:85 4 2 #        <:85 4 2 #        <:85 4 2 #        9<W9af7v4[3=1  *"   dt4 Q  Y KV: 7 : TV ~ gvm'46Y><!               # # # "         ><!               # # # "         ><!               # # # "         > ;4U> Uk ON  D   ?cmfM hz F P 18 (  oT &2 +  / y P 4 ?r B  ޖ O !  [ L2 f V q  )O | 8 { o d17 YT Mn C2 6 2 0000////../ 46 5 5 4 3 3 2 1 100/0 4 6 2 0000////../ 46 5 5 4 3 3 2 1 100/0 4 6 2 0000////../ 46 5 5 4 3 3 2 1 100/0 4 ?q5Y1s8/+ p/ / /.U...-0- ɚh6 .?3854483 2 2 /1 0 o0 / / 3. :/֒M 3mywfI    !"""#             000/////.0 26 !"""#             000/////.0 26 !"""#             000/////.0 26 >Sdw{xqfQ-  NU E_-\8VlNY./g$_pv/  p  O k  N ) Ԃ#  `n"u T  ˇ: 0Y 0 0 / /8 /l / . 3- -/=ӕK 1q٦r> 5buA <. / /  !                   :;<=<. / /  !                   :;<=<. / /  !                   :;<=RtZe7\*o!  S 3O   G S? jgk h g   p / FP ڷ oW " HA # , Tv   @uoxFh] T Jn ?- 3 '{w YfG Q; gH&  j  ^X ?   "  Y 3    ܙlk=Gy"3^`9:;<                  &&&&&&&&&' ' ' ' ' ' ' '''<=                 &&&&&&&&&' ' ' ' ' ' ' '''<=                 &&&&&&&&&' ' ' ' ' ' ' '''<= + 7$ , t 5 /c    :  !  T a> ;  %,R'hXBw$l]`%U%J%>%4%MN)% % %'^ %" &! &!& $& && & &m&@Q&9w;%j<4                                            DD""&& New Layer#2     N|&&N&&OPRUSSSST TT)[{_/dffggg&g6r3rrxy(y8yHyXyhN-=MUeJZjzRb.ɥʁʑʫήu҅ [/?O_o~<;~<;~<; d&#%(*,.0 1 3 5679:<='4+&" d&#%(*,.0 1 3 5679:<='4+&" d&#%(*,.0 1 3 5679:<='4+&" /bֱ~K*Du#Gjs\ +H#8%' (W*-, . $޷ dK'\ ݇8%{F=4 v  z <:7 5 3 20.-+*('&$#"!  <:7 5 3 20.-+*('&$#"!  <:7 5 3 20.-+*('&$#"!  |<:(86k4@3 1 c0 .N- +9*h)'    :98765 4 3 2 1 0/.-,+**)(''&%$$#""!!    !!                          :98765 4 3 2 1 0/.-,+**)(''&%$$#""!!    !!                          :98765 4 3 2 1 0/.-,+**)(''&%$$#""!!    !!                          2<O;a:e:g9Y8X7_6f5`4K3, 2 1 0 / / .g-7, ++g*))(;' ' &8 % ŭ%M !$ a$e S# )# " " V, ! _ !d G   . H   LI d w  f .  \  1 &! d H  Vo .    f 8 D;  $   /5 " S q n  1 "$&')*,-/0 1 2 3 567778888999::::;;;;<<<<<========~"$&')*,-/0 1 2 3 567778888999::::;;;;<<<<<========~"$&')*,-/0 1 2 3 567778888999::::;;;;<<<<<========~9%^%6& s&!(t)4+ , n. =/ !0 1 2x4d56A667r7/778b8"899Y99::_:!:;;i;.;;<<M<<==y=E=~!  !!!"""######$$$$$$$%%%%%%%%&&&''()*+,--./01 1 2 3 4 5 5 67899:;<<=>!  !!!"""######$$$$$$$%%%%%%%%&&&''()*+,--./01 1 2 3 4 5 5 67899:;<<=>!  !!!"""######$$$$$$$%%%%%%%%&&&''()*+,--./01 1 2 3 4 5 5 67899:;<<=>(*4(\\))N))t *9**+\#+1,+6+A+M+Z,Y,m G,Z 7,R *,N ,G ,@ ,: ,9 ,; -= -= l-< Y-= G-J 7-U !-h - - - U- 0- -, -B .e l. B- #- .( 0F 1x 1 2 3'4J5}567,8[99:;F;;<=@@===<;:98876 5 5 4 3 2 2 10//.-,,+**)((@===<;:98876 5 5 4 3 2 2 10//.-,,+**)((@===<;:98876 5 5 4 3 2 2 10//.-,,+**)(( =<<X;1:98y87765r5,4 3 2 Y2 1 0 0 7/ .                                                                                                                                                                                                      lN  S E ;  (2   b   $ d 3  P>  G 8 P y V  Q V   W  X R Y  k Z  5 [   X . P W H  g @  : 0     & L ) ] @ 5 X  o   n  W 2 @ N b) o C  %     )  :  P  g  ~ tv , `_ 9 NI H >1 Y - k    8  S  o   j  N  2            p  N @=======@=======@=======@=#=F=h===='''(''((''(('((('(('((('(('((('(('((('(('((('((''(''((''(()*++,'''(''((''(('((('(('((('(('((('(('((('(('((('((''(''((''(()*++,'''(''((''(('((('(('((('(('((('(('((('(('((('((''(''((''(()*++,z - R- .? .~ f- (. .I . B- ." .W d. +. ., .f D. . .; f. ,. . .T G. . .1 i.s .. . .X H. . .3 k.x /. . .X J/ . .< m. 2. .% .c P/ . .L x. 7. .1 .u X. $. .Y . >. .= . d. ).) .f . G. .I @===<;::@===<;::@===<;::                                   ,---,,,--,                                ,---,,,--,                                ,---,,,--, (      b :    v nk A_ L 9 *  -T ;$ I W j Y )   c TC * ' A \u w7   n EM  1 ' H iM   Z H0 &  M s} 5 k > Y 6 c1 1 1 1M 0' H0 y0 1 1 0] >=======<<<<<<;;;;;:::::99998888877776666 5 5 5 5 4 4 4 3 3 3 3 2 2 2 1 1 2 1 1 2 2 1 2 /=======<<<<<<;;;;;:::::99998888877776666 5 5 5 5 4 4 4 3 3 3 3 2 2 2 1 1 2 1 1 2 2 1 2 /=======<<<<<<;;;;;:::::99998888877776666 5 5 5 5 4 4 4 3 3 3 3 2 2 2 1 1 2 1 1 2 2 1 2 /<&<M<t<<<<;:;g;;;;:M::::9I9{9998I8887*7f7776Z6665S5554X444 %3 l3 3 2 H2 2 2 $1 j1 1~ 05 J0 1 0U 60 1 1j 40 1 .--.//01 2 2 3 4 5 5 67889:;;<=>= --.//01 2 2 3 4 5 5 67889:;;<=>= --.//01 2 2 3 4 5 5 67889:;;<=>= - o. /./ .p . 0 1H 2 2 3#4Z55 6-7g88 91:m;;;3<m== 98876 5 5 4 3 2 1 10/.--,+**)(''''&&''&&&&&%$$$$#!! !"#$&'('&%#" !#%')98876 5 5 4 3 2 1 10/.--,+**)(''''&&''&&&&&%$$$$#!! !"#$&'('&%#" !#%')98876 5 5 4 3 2 1 10/.--,+**)(''''&&''&&&&&%$$$$#!! !"#$&'('&%#" !#%')=N=<;w;3:98y8C76 54d443 2 1 0 Q0 (/ . -0 e.e 1. - -% x.N >. - - -7 v.e O. /- - -3 -X -} - +"++b**2*+)+p ("''&<%fS$5x# +#XL!r!G( x= #"%#'&) =;97 5 20.,)'$ =;97 5 20.,)'$ =;97 5 20.,)'$=O;d 9{75*3    ,,,,,,,,,,,,+,,,++,,++,,++,,++,++,,++,++,,++,++,++,++,++,++++++,,,,,,,,,,,,+,,,++,,++,,++,,++,++,,++,++,,++,++,++,++,++,++++++,,,,,,,,,,,,+,,,++,,++,,++,,++,++,,++,++,,++,++,++,++,++,++++++3 o0 0 1 0h @0. x0 1 1 0V V0# 0 1 0 ?0B ~0 1 0 80C u0 1 0 70C z0 1 0 F0C 0 1 0{ Z0* 0 0 50M 0 1 0y ^0* 0 0 ?0L 0 1 -0\ }0 1 0` u0 1 #0d y0 1 (0i ~0 1 ,0m 0 1 50M 0 0 M01 0 0} i 1 2 2 1 2 2 1 2 1 1 2 1 1 2 1 11 1 11 1 2 1 11 1 2 1 11 11 1 11 11 11 1 11 11 11 101 11 11 11 11 101010 1 2 2 1 2 2 1 2 1 1 2 1 1 2 1 11 1 11 1 2 1 11 1 2 1 11 11 1 11 11 11 1 11 11 11 101 11 11 11 11 101010 1 2 2 1 2 2 1 2 1 1 2 1 1 2 1 11 1 11 1 2 1 11 1 2 1 11 11 1 11 11 11 1 11 11 11 101 11 11 11 11 101010r .0 1 1s -0" ~1 1y 00! 1 0{ =0" 1 0k \0 1 0S y0 0 907 0 0x ^0 1 +0X 0 0 `0+ 1 50\ 0 0 u0& 0 J0M 0 %0x 0 0 h00 0 I0W 0 '0 0 0 t03 0 [0S / B0t 0 ,0 0 0 02 0 0B 0 0T / 0d / 0a / +.02 5 79;> +.02 5 79;> +.02 5 79;> +b.< 0 2^5?79 d;@=  " !#&(+-/1111110.+)'$" !#&(+-02 5 79<>" !#&(+-/1111110.+)'$" !#&(+-02 5 79<>" !#&(+-/1111110.+)'$" !#&(+-02 5 79<> =0 i.-+W ) 'G$w"7d l)HQ(r@Qp/2x\ V$1K|Y77a}%I!z#F&~(N+-O 0$ 2 `547p9D;==;97 4 2/-+(&$!!$&(*,..//...--+)&$" "%')+-/1 3 5 79;=;97 4 2/-+(&$!!$&(*,..//...--+)&$" "%')+-/1 3 5 79;=;97 4 2/-+(&$!!$&(*,..//...--+)&$" "%')+-/1 3 5 79;@=G;u916X 41 ?/ e- *<(` &#7!Z P(2 kBDO$]vl X} ; ! n% P/ 5; #G ? j1!`%!P%>'2))+!- / 1 3 5#7'9+;1 =;97 5 4 20.,*)'%$" !# =;97 5 4 20.,*)'%$" !# =;97 5 4 20.,*)'%$" !# <: 8v6b4Q2 B0 4/-w+:*(q&    #++++++++*++++*+*++*++,,---..///001 1 1 2 2 3 3 4 4 5 5 6677889::;;<<==>#++++++++*++++*+*++*++,,---..///001 1 1 2 2 3 3 4 4 5 5 6677889::;;<<==>#++++++++*++++*+*++*++,,---..///001 1 1 2 2 3 3 4 4 5 5 6677889::;;<<==>) 1 20X 0 0 a0; 0 *0u 0 0 [0/ 0 40] 0 0 v0 0 R0G 0 30| 0 1 26 2 3g 3 44)45T5667788 99&::,;;2<;)<<=~=0100001010000000000%&&''''('()))))*)**+*++,,-,,--..--,,+**)(((&0100001010000000000%&&''''('()))))*)**+*++,,-,,--..--,,+**)(((&0100001010000000000%&&''''('()))))*)**+*++,,-,,--..--,,+**)(((&g !/ 0g 6/ /X O/ /M k0 /3 0 B/ / n/ !/d / M/- / / N/S / %" Y&s % r&, y&t 4b& &! S'e h& 2N' (I H( }( I($(VN)(^)!)Hg*y )|**(+F,+u,L++ m,'T ,F -]1 8/ . u/ . /J X/ . /W P. . /e R. %==<;;:98766 5 4 3 2 10/.--.........."==<;;:98766 5 4 3 2 10/.--.........."==<;;:98766 5 4 3 2 10/.--.........."F="< ;:}:W9187655s4Y3 @2 ,1 0 / . -} , , - v- f-# _-, X-; O-K P-[ N-d K-v I- M!====7$&&&%%$$$###"""!!   !#$&'(*+,-/01 2 3 4 5 67889:;<<=>=?$&&&%%$$$###"""!!   !#$&'(*+,-/01 2 3 4 5 67889:;<<=>=?$&&&%%$$$###"""!!   !#$&'(*+,-/01 2 3 4 5 67889:;<<=>=?5%M$fk$ |1%%'f%A%]e%  &&<'K&u'd'D ' ;(,'g(c)X( )`)7)kc*.) *X*"*+`+6 +,/z 0c 1O 2C 39485C6W7q889:.;d<;<I==?##"!       ##"!       ##"!       t#"!!e D'\ .  J  l   j T Y ! [  ? /   ] Q$  '(('((''''''&&''&&&&%%&&&&%%%%%%%$$$$$$$$$$$%&'()*+,-./01 2 4 5 679'(('((''''''&&''&&&&%%&&&&%%%%%%%$$$$$$$$$$$%&'()*+,-./01 2 4 5 679'(('((''''''&&''&&&&%%&&&&%%%%%%%$$$$$$$$$$$%&'()*+,-./01 2 4 5 679 .u j. ..# .y . a. 0.7 . - . N.> +. - - .F y. W- 6- !- -5 -` - - ~- i- P-) <-O 3-~ +, &, , , , , , , , ,! ,) ',3 2,=>,IT,I t,8.) / 0 1 2 34578t9`:<; <a= ----,,,,,,+,,+++****)))))()+,./1 2 4 679;<>=<;:876 4 3 10.-+*('%#" ----,,,,,,+,,+++****)))))()+,./1 2 4 679;<>=<;:876 4 3 10.-+*('%#" ----,,,,,,+,,+++****)))))()+,./1 2 4 679;<>=<;:876 4 3 10.-+*('%#" R, Y, o,z,+ ++"+8+d+*+vT+e*P"*<^*!)J) )X;)0 (G(p(2[( "(X|'"(y+2, .7 / 1- 2k46L7 9';L;u=<;.:Z9 7+6Z5 3 82 0 +/ {-.,~*9)'[(3''  'TP!=<:87 5 3 1/-+)'%$$##"""! !"#$$" #%(*-0=<:87 5 3 1/-+)'%$$##"""! !"#$$" #%(*-0=<:87 5 3 1/-+)'%$$##"""! !"#$$" #%(*-0A=;~ 9[7@6(42 { 0 m.`,]*[(_&e$d#%t#>!"`;" mX! {w!7!i =!P|< s:]><B i E#%P({*B-U 0k  <8 4/*&!"' <8 4/*&!"' <8 4/*&!"' ];|=7ËQ3 }G.ڢk5)ƐZ$%ヌM s> !Ϣp> .i=<<<;::98765 4 4 3 2 1 0/.-,+*)('&%$#"""" "%(*. 1 2 =<<<;::98765 4 4 3 2 1 0/.-,+*)('&%$#"""" "%(*. 1 2 =<<<;::98765 4 4 3 2 1 0/.-,+*)('&%$#"""" "%(*. 1 2 =q<#;;p:,9 :9i8>7 65443t 2` 1O 0@ /9 .7 ,6 B+3 \+2 y+3 *4 *2 *3 *7 *7 -*7 9*7 9*7 9*6 9*9 9*C :(: :&Y:# D9 1r8+k6#c5.k4G~ /#%        !"##8        !"##8        !"##8        S } Q C% {  H * 6  *G  1  "   t @[ -k  !"-:;=>:;=>:;=> "#$%%&&''(((****(&$#!!#%')+.02 5 7:< "#$%%&&''(((****(&$#!!#%')+.02 5 7:< "#$%%&&''(((****(&$#!!#%')+.02 5 7:<+&{&%p%iO&7&E-%%)$n$$J#&#0##D#<W![s!8!"%%%' )+-/ 1 i 3>68 b:8<u?3 69<@=;8 5 2/,)%!"&+05 :@<96 3/,($%*/3 93 69<@=;8 5 2/,)%!"&+05 :@<96 3/,($%*/3 93 69<@=;8 5 2/,)%!"&+05 :@<96 3/,($%*/3 93m6g9[;E?h <9:q7\ 4J1 I.W+j"(ّO$ƅH ј`&!N&tC)sB )*֤q= ;-բr@ R0ݭyFi2 P/9+&{(D$?  ;!D&;u+;x 0?~5D:2_?,2 9?=:6 1,'# %+1 89 3-&"0@9 1) 5 ,2 9?=:6 1,'# %+1 89 3-&"0@9 1) 5 ,2 9?=:6 1,'# %+1 89 3-&"0@9 1) 5 &ץvG,齓h@ 2ˣyS,7ήlL a9K4!\/ 5k*E|&Q!+c $!ʫqXB0 ƹyof]UMF?81+%83 -' & 84 /($ -5 3 1 .,)&# "&*. 38;85 3 0-)&" $(- 383 -' & 84 /($ -5 3 1 .,)&# "&*. 38;85 3 0-)&" $(- 383 -' & 84 /($ -5 3 1 .,)&# "&*. 38;85 3 0-)&" $(- 38M2L-2b ' 1Z #Ip*?Zv *7DWk%Uer48綃Q3ޮ|K.̞n@ (ͧ{L !㲌gAȲiH'y Ͻ|bI-^zlZE.,S5Q3 e1 .D ,z) _& Q#[ !nM7~~ 1 2 4 5679:;<= > 1 2 4 5679:;<= > 1 2 4 5679:;<= >0/.,+*)'&%$#"!  !"#$%&'()*+,,-./01 2 3 4 4 5 67889:;<==>?0/.,+*)'&%$#"!  !"#$%&'()*+,,-./01 2 3 4 4 5 67889:;<==>?0/.,+*)'&%$#"!  !"#$%&'()*+,,-./01 2 3 4 4 5 67889:;<==>?0/.,+*)'&%$#"!  !"#$%&'()*+,,-./01 2 3 4 4 5 67889:;<==>? ===<;::98776 ===<;::98776 ===<;::98776 ===<;::98776       !!!""""####$$$$$%%%%%&&&&&&&'''''''''((((((((((((((((((((((   !!!""""####$$$$$%%%%%&&&&&&&'''''''''((((((((((((((((((((((   !!!""""####$$$$$%%%%%&&&&&&&'''''''''((((((((((((((((((((((   !!!""""####$$$$$%%%%%&&&&&&&'''''''''(((((((((((((((((((((( 5 5 4 3 2 1 10//.-,,+**)(''&%%$#""!   !!"##$%%&'(()**+,--.//01 2 2 3 4 4 5 6 5 5 4 3 2 1 10//.-,,+**)(''&%%$#""!   !!"##$%%&'(()**+,--.//01 2 2 3 4 4 5 6 5 5 4 3 2 1 10//.-,,+**)(''&%%$#""!   !!"##$%%&'(()**+,--.//01 2 2 3 4 4 5 6 5 5 4 3 2 1 10//.-,,+**)(''&%%$#""!   !!"##$%%&'(()**+,--.//01 2 2 3 4 4 5 6    (((((((((((((((((((('''''''''''&&&&&&&&&%%%%%%$$$$$$#######"""""(((((((((((((((((((('''''''''''&&&&&&&&&%%%%%%$$$$$$#######"""""(((((((((((((((((((('''''''''''&&&&&&&&&%%%%%%$$$$$$#######"""""(((((((((((((((((((('''''''''''&&&&&&&&&%%%%%%$$$$$$#######"""""77899:;<<=>= 77899:;<<=>= 77899:;<<=>= 77899:;<<=>= @===<;:99876 5 5 4 3 2 2 10//.-,++*)('&%$"! !#%')+.02 4 79;>@===<;:99876 5 5 4 3 2 2 10//.-,++*)('&%$"! !#%')+.02 4 79;>@===<;:99876 5 5 4 3 2 2 10//.-,++*)('&%$"! !#%')+.02 4 79;>@===<;:99876 5 5 4 3 2 2 10//.-,++*)('&%$"! !#%')+.02 4 79;>    "!!!!         !!!!""""####$$$%%%%&&&'''((()))***+++,,,---../"!!!!         !!!!""""####$$$%%%%&&&'''((()))***+++,,,---../"!!!!         !!!!""""####$$$%%%%&&&'''((()))***+++,,,---../"!!!!         !!!!""""####$$$%%%%&&&'''((()))***+++,,,---../=<:86 3 1.,*'%" !#%(*-/1 4 69;> ?=<:86 3 1.,*'%" !#%(*-/1 4 69;> ?=<:86 3 1.,*'%" !#%(*-/1 4 69;> ?=<:86 3 1.,*'%" !#%(*-/1 4 69;> ?=<97 4 20-+)&$" !#%')+-/1 4 689;==<97 4 20-+)&$" !#%')+-/1 4 689;==<97 4 20-+)&$" !#%')+-/1 4 689;==<97 4 20-+)&$" !#%')+-/1 4 689;=@=;97 5 4 2@=;97 5 4 2@=;97 5 4 2@=;97 5 4 2    //0001 1 2 2 2 3 3 4 4 5 5 5 6677788999::;;<<==>=//0001 1 2 2 2 3 3 4 4 5 5 5 6677788999::;;<<==>=//0001 1 2 2 2 3 3 4 4 5 5 5 6677788999::;;<<==>=//0001 1 2 2 2 3 3 4 4 5 5 5 6677788999::;;<<==>= ====<<;;:9988766 5 5 4 3 3 2 1 10 ====<<;;:9988766 5 5 4 3 3 2 1 10 ====<<;;:9988766 5 5 4 3 3 2 1 10 ====<<;;:9988766 5 5 4 3 3 2 1 100/-+*(&%#! !"$%'()+,-/01 2 3 5 6789:;<=>=0/-+*(&%#! !"$%'()+,-/01 2 3 5 6789:;<=>=0/-+*(&%#! !"$%'()+,-/01 2 3 5 6789:;<=>=0/-+*(&%#! !"$%'()+,-/01 2 3 5 6789:;<=>=##""!             ##""!             ##""!             ##""!             //.-,,+*))('&&%$#"!!  !""#$%&'()*+,-./01 2 3 4 5 6789;<=>//.-,,+*))('&&%$#"!!  !""#$%&'()*+,-./01 2 3 4 5 6789;<=>//.-,,+*))('&&%$#"!!  !""#$%&'()*+,-./01 2 3 4 5 6789;<=>//.-,,+*))('&&%$#"!!  !""#$%&'()*+,-./01 2 3 4 5 6789;<=> =<;986 5 4 2 1 =<;986 5 4 2 1 =<;986 5 4 2 1 =<;986 5 4 2 1<<;:998765 4 3 2 1 0/.-,+*)('&%$#"!<<;:998765 4 3 2 1 0/.-,+*)('&%$#"!<<;:998765 4 3 2 1 0/.-,+*)('&%$#"!<<;:998765 4 3 2 1 0/.-,+*)('&%$#"!                    !"##                    !"##                    !"##                    !"## /-,*)'%$" !#%')+-/1 3 5 8:< /-,*)'%$" !#%')+-/1 3 5 8:< /-,*)'%$" !#%')+-/1 3 5 8:< /-,*)'%$" !#%')+-/1 3 5 8:< =:7 4 1.+'##(-2 7<=:7 4 1.+'##(-2 7<=:7 4 1.+'##(-2 7<=:7 4 1.+'##(-2 7< <6/' - <6/' - <6/' - <6/' - =4 +  =4 +  =4 +  =4 + ~<:85 3 0.+(%! $(, 16=~<:85 3 0.+(%! $(, 16=~<:85 3 0.+(%! $(, 16=~<:85 3 0.+(%! $(, 16=  "#$%&')*+,./0 2 3 568:< >  "#$%&')*+,./0 2 3 568:< >  "#$%&')*+,./0 2 3 568:< >  "#$%&')*+,./0 2 3 568:< >                                    DD"" Background      %Z%~CO[g&( ,.y......: Nadfdvddddp~sfv"Q<*JD0a}?m )QFUBXX ]cXn1Ƶ Жңҳ#3 ~;::876543 2  ~;:9876543 2  ~;:9876543 2  ~; :99^87 6524O3a 2e  ] +$!#&) * + + , - - ..//00 1 1 2 2 2 3 3 ] +$鰔њӲ"ʓ$' )И)*ʒ*+ʒ+,ʒ,-ʒ-.˓,,˕+)̙(󵘗&%ě$ ]GEEF F+wXMGFF$xJFFȺFF½UFF}F"FIF$FeF'F F)FRF)FyF*FHF*FpF+FHF+FqF,FHF,FqF-FIGF,FsGG,FJGG+FtIHGG)FMJIHHGG(FwMKJJIHGG&FSOMLKJIHGG%FRPOMMKJJIHGG$FaTRQONMLJJIHGG"FWVUSRPOMLKJIHHGG!F ]/bֱ~K*Du#Gjs\ +|H$8(( , /kW3-57$8d9;F @==;:87 5 4 3 10/.,+*)(' @==;:87 5 4 3 10/.,+*)(' @F=F=F;F:F8F7 F5 F4 F3 F1F0F/F.F,F+F*F)F(F' @=@<:c97N6 493 h2 0 / 4.\-+*) ('&1 0 / . - ,+*)('&&%$#"" !         1 0 / . - , * ) ( ' & % % $ $ # " " !                                                 1 0 /d .dg -d~ ,d *cdd )eddo (edd 'fdd &cdde %addz %cdd $cdd $d #dk "[dd~ " d !edd  dedd  di  dw fd d  d ed d cd d d cd dk ed dx d d d d cdd dl ^ddz cdd d cdd d ^dd cdde dl cddt d| ^dd cdd d bdd d d fdd d eddg do bddw d d add d d idd  d  d 1g 0Y /X ._-f,`+K*,)( '&&%g$7# ""g!  ; 8M  e!!"## $d$$.%% &d&&.'' (d((.))*;***"+q++,N,,-2---.d. 4 4 4 5 5 5667778889999:::::;;;;;;;<<<<<<<==================>𰝜"Р!Ԫʠ򝜛򝜛Ң򜛚򝜛͜󜛚򜛚 Ϙ񜛛򼕖󫔕񜛛ƒ촒󕖗 󖗗 ͑񕖖 󕖖    Ғ ʑ Ғ ɑ Ӯ  ӝ Җ  ʗӺ ӳ 򛚚 Ӱ𝜜 ӭ ө 򜛚ԤԠ򜛚О񝜛˞󜛚Ɲ򝜛򝜛󝜛𝜛񝜛󝜚򖗘񕖗󖗘󕖗󕖗 񓔔{ZXWUTRQONMKJJIHGGF_\ZYWVUSROOMLJJIHHGGF]\\[ZXWUTRPOMLKJJIHGGFp_^]\[ZYWUTRQONMLJJIHHGGF__^]\\ZYWVUSRPOMMKJJIIHGGF__^]\\[ZXWUTRQONMMKJJIIHGGFc^__^]\[ZYWVUSRPONMLKJJIIHHGGF\\]^__^]\\ZZXWUTSRPONMMKJJIHHGGFsZ\\]^^__^]\[ZYWWUTRRPONMMLKJJIIHHGG FXXZ[\\]^__^]\\ZZYWVUTRRPOOMMLKJJIHHGG FUVWYZ\\]^__^]\\ZZXWVUTSRQOONMMLKJJIIHHGGFgSTUWXZ[\]^^__^]]\[ZZXWWUUSRQPOONMLKJJIHH GPPRSUWXZZ\\]^^__^]\\[ZZYWWVUTRRQPONMMLKJJIHGMOOQRUVWYZ[\]]^__^]\\ZYXWVUUSRQPOOMMLKKJJIHGqLMMOPRTUWXZ[\\]^^_^]\[ZZXWWVUTSRQOONMMLLKJJIHRJKLMOPRSUVWYZ[\\]^^_^]\[ZZYXWVUUSRQPOONMMLKJHIJJLMNOQRTUWXYZ[\\]]^^_^]\[ZZXWWVUTSRRPOONMLKGHIIJKMMOPRSUVWXYZ[\\]]^^_^^]\\[ZZYXWVUUTSRRQQPOONMjGGHIJKLMNOQRTUVWXYZ[\\]^^]\[ZZYXWWUUTSRRQPOOSGGHIJJKMMOPQRTUVWXYZZ\\]^]\[ZZYXWWVVUUTSRRFFGGHIJKLMNOPQRSUUWWYZZ[\\]^]\[ZYXWVUUFFGHIJJKLMNOOQRSUUWWXZZ[\\]^]\[ZYXXWW|FFGHIJJKLMMOOQRSTUVWXYZZ[\\]^]\[ZYfFFGHIJJKLMMOOPRRTUUVWWXYZZ[\\]^]\[VFFGHIJJKLMMNOPQRSTUUVWWYZZ[\\] ^]\HFFGHIJJKKMMNOOPQRSTUUVWXYZZ[\\] ^F FGHIJJKLMMNOOPQRSTUVWWXYZZ[\\]^F FGHIIJJKKLMMNOOPRRTUUVWXYYZZ[[\\]^FFGHIJJKLMMNOPQRRTUUVWWXYZZ[\]uFFGHIJKLMNOOPQRSTUUVWWXYZZ[\eFFGHIJKLMMNOOPQRRSTUUVWWXYYZZUFF GHIJKLMMNOOPQRRSTUUVVWWXHFFGHIJJKLMMNNOOPQRRSTUUG#GHIJKLLMMNNOOPQQRRSGGHGHIJKLMNOOPGGHIJIHGHIJKLMNvH HIJKJIH GHIJKLhJJKLMLKJJIHHG GHIJZK KLMNONMMLKJJIHHG GHINM MNOPQRQPPOOMMLKJJIHGGO OPQRSTTSRRQOONMLJJIHHGGFGGRRSTUUVWVUUTSRQPOMMKJJIHGGFGUUVWXYYXWWVUSRQONMLJJIHHGG FW WXYZ[ZYXWVUSRPOMMKJJIHGGFzZZ[ \[ZYXWUTRQONMLKJIHGGFu\\]^]\[ZYWVUSRPOMMKJIIHGGFn\ \]^_^]\\ZZXWUTRQONMLJJIHGGFf]]^_^]]\[ZYWVUSRPOMLKJIHHGGF_]]^]^^_^]\\ZZXWUTRQONMLJJIHGGF\\]^_^]\[ZYWVUSQOOMLKJIHGGF\\[\]^_^]\\ZZXWUSRPOMMKJIHGGZZYZ[\\]]^^_^^]\\[ZYWUTRQONMKJJHHGGWWVWWXYZ[\\]^^]\[ZYWVUSRPOMLJJHGGUUTUVWXYZ[\\]^^]\\[ZXWUTRPOMLJJHGGRRQRSUWYZ[\]]^^]\[ZYWVTRQOMLJIHGzOOPQRSUUWXZZ\\]^^]\\ZYWVURQOMLJIHqMMNOOQRSUVWYZ[\]^^]\\[ZXVURPOMKJIgKKJKLMMOOQRTUWXZZ\\]^__^^]\[ZXVTRPOMLJ]JJIJKLMMOPRSUVWYZ\\]^__^]\[ZXVTRPNMLRHHIJKLMNOQRTUWYZ[\]^__^]\[ZWVTRPOMIGGHIJJKMMOPRSUWXZ\\^^__^]\[YWUTRPOGGHIJKLMNORSUWXZ\\^__^]\[YWVTRQGGFGHIJJKMNOQSUWYZ\]^__^]\[YWVUSFFGHIJKMMOQSUWY[\]__^]\[ZXWV&%$#"!  !"#$%&''()*+,-.//01 2 3 3 4 5 67889:;<<=>=&%$#"!  !"#$#      󜛛    󜛚      𞟞쟠򖘘 򕖖򠟞𔕖ⓔߕ񖗗䖗 򕖗 𕖖󣢡 򖗗󣢡󘙙񤣡򦥥 򥤤 󘚚󣢡򘙚 𗘘񧦦򙚛F&F%F$F#F"F!F F F!F"F#FGF GFH GFIHGFJIHGFMLLKKJJIHGFONNMMLKJIHGFQPOONMLKJJIHGFTSRRQPOONMMLLKJJIHG FVUTSRRQPOONMMLKJJIHG FYXXWWVUUTSRRQOONMMLKJJIHG F[ZZYXWWVUUTSRRQPONMMLKJJIHHGGFG\[ZYXWWVUTSRRQOONMMLKJJIHHGGFG]\[ZYXWWVUTSRRQOONMMLKJJIIHGGFGH^]\[ZYXWWVUTSRQPOONMLKJJIIHGGH^]\[ZYXWWVUTSRQPONMLKJJIHHGHHGHHI ]^ ^]\[ZZYXWVUUSRQPONMLKJJIIHHIHHII \] ^]\[ZYWWVUTRRPONMLKKJIIJ Z[\\] ^]\\[ZZYXWVUTRRPONNMKKJIIJJIJJ XYZZ[\]^]\[ZZXWVUTRQPPNMMLKKJJK VWWXXYZZ[\\]^]\[ZZXWVUTSQPPOMMKJKKLTUVWWXXYZZ[\\]^]\[ZZXXWUSSQPPOMMLKKLLKLLQRRSTUUVWWXYZZ[\\]^]\[ZXWWUTRRPONNMLLMOPQRRSSUUVWWXZZ[\\]^]^]][[ZYWVUSRQPOONMLLMLLMMNMNOPQRRSUUVWXYZZ[\\]^_^]\[YYXUUSRQPONMMNMMNJKKLMMNOOPQRRTUUVWWXYZZ[\\]^__`_^^\][YXWUSSRPPONMNNMNNIJJKLMMNOOPQRSTUUVWWXYZZ[]]^_``_^_^][[YWWTSSQPPONNONNOHIJKLMMNOOPQRRTUUVWWY[[\]__``a``_^^\[ZXWUTRQQONOONOOQGHIJKLMMNOOPQRRSUUXXZ[]^^_aa`_^]\ZXWUSSQPOOPXGHIJKLMMNOOPQRTUVXZ[\]_``abba``_^\[YWVTSRQPOPPOPPFGGHIJJKLMMNOORSTWXYZ]^_`bba_^][YWVUSRRPPQPPRFFGHIJKLMNPPSTUWZ[]^`abbcba``^\[YWVTSRQPQQPPQQYFFGHIJKLNNQQSUXYZ^^`accba`^]ZZWUTSRQQRlF FGHJKNOPRTUWZ[]_abccdcba`^\[XWVTTRQQRQQRRTF FGHIIJLLMOPRTVXZ[_`abddca_^]ZXVVTSSRRFGHIJKMMOPSTVY[\_`bcddecbb_^\ZXWUUSRRSRRSFFGHHIKLMMOQRUWY[^`abdefedcca_^[ZXVUTSSRSSFFGHIIJJKMNOQTUW[]^`bdefeedba_][YXVUUSSTSSFFGHIJJKLMOPRTWX[]`bcdegfedcc`_\ZYXVVTTSTFFGHIJKKMNOQSUWY\^abcffgfeeca`^]ZXXVVUTUUTGF FGHIJKKLLMNPRTUY[^_bdefgfgedda_^\[YWWVUUG FGHIJLNPQSUWZ\_bcdeggfedcb`]\ZZWVVUUVGG FGHIJKLMNOQRTVY\^`bdfggfdca`^[ZYXWVVGFGHIJKLMMOPQSUXZ]_bcefghhgffdba_^\ZYXXVVHGGFGHIJKLMNNPQSUWY[^`cdeghhgedca_]\ZXXWWIHHGGFGHIJKLNOQRTVX[]_acffghhigffdba_][ZYXWJJIHHGGHIJKLMNOOPRSVWY[^`cdfgiihgedb`^\\YYXLKJJIHHGHIJKLMOPRSUVX[]_adefhiihihfecb`^\[ZYNMLKJJIIHHIHHIIJKLKLLMNOPQRSVWY\^`befghijihhgdca_]]ZZOOMMLKKJJKJJKJJKLMNOPPQTUWXZ]`bceghjjigfeba^][[RQOONMMLLKLMLLMNOPQRSTUXZ[]`bdghijjihhedb`^][USRQPOONNMNMMNNMNNMNNMNNOPQRTUWXZ\_acfghikkjjhgecb_^\%#$,#6"A!M ZYG7 *!"# $%&'(l(Y)G*7+!, -..U /0 0 1 2 3l 3B4#5 678X819:;y;7;<=r=? =<;<:99876554 3 3 2 1 0 =<;;:9987655433210 [=So<SU;T\;TUq:TUUW9U]9UVp8VUVVX7WVW_6WVWWs5WXY5WXXWWXX`4XYXXYs3YXYYXYY[3ZYYZ_2ZYZYYZl1\[YZZYZZ[0 ,= <;Y;:9978 76R55 4f3(3 2 1 B0                                      !!!!!!"                                                                                 !! ! ! d  fdd  cdd  cdd  de  bddh ~ eddk z eddm w dp s ds p dv m cddx k cddx l cddw o dv p fddu s bddt v edds x dr z dq | dp ~ do eddn bddm cddm di de edd d d d add bdd cdd d d edd cdd cdd dy eddp eddg d edd cdd d d d d dx dn de d d d d  d  dr  de!d!d!d !d !dw . / 8/ y/ / 0 0 R0 0 0 1 .1 W1 1 1 1 2 &2 L2 2 2 2 3 3 3 23 N3 o3 3 3 34444 4,494H4Y4k444444444444444444444444 =================<<<<<<;;"#󔕖$&񓔔'󓔔'(𓔔(񓔔)񔕕*𕖗(𕖖&&%&'񕖘'򔕕*򛚚+󛚙,𞝜+󝜚*󝛚)󟞞(񟞝'$񟞞 󟞞    ( ȓϓӔӛӡӧ ӯ ӹ Ñ ͑*)))ɑ)Ҕ  FGHIJKLNORSUXZ[\^__^]\[ZYXF FGHIJKMNPRTWXZ\]^__^]\\[ZF!FGHIJKMOPSUWY[\]__^]\\F#FGHIJLMORTUXZ[\]^__^]]F$FGHJJLNPRTVXZ[\]]^__^%FGIJKMOQRUWXZ[\\]^^_&FGHIJLMOQSUVWYZZ\\]]^^_F&FGHJJLNOQRTUWXYZZ[\\]]^GG$FGHIJKMMOPRSUVWWXZZ[\\G"FGHIJKLMOOQRSTUVWXYZZ[GG FGHIJJLMNOOQRSTUVWWXYIHHGG FGHIJJKLMMOOPQRSTUVWJJIIHGGFGHIJJKLMMNOPQRRSUKKJJIIHGGFGHIJJKKLMMOOPQSMMLKJJIHHGGFGHIJJKLMMNOPOONMLKJJIHGGFGHIJKLNNRQPONMLJJIHGG!FGHIJKKLUTRQPOMLJJHGG#FGHJKWVUSRPOMLJIHGG$FGHIJYXWUTRQOMLJIHGG'FGHI[ZYWVURPOMKJIGG)FHI\[ZXVTRPNLJJHGG)FGHI^]\[ZWVTROMKJIHGGF'FGH_]\[YWURPNMKJHGG&FGHI__]\ZXVTROMLJIHGGFGHI`__^]\ZWUSQOMKJIHG GFGHI`_^\[YWURPOMKJJIHHG"GHIHHII``__^]\ZXVTRPNMLJJIHGHIJ_^\[ZWUSRPOMMLKJJIHGHIJ_^]\ZYWUTRPONMMLKJIH IHIIJK^__^]\ZYWUTRRPOONMLKJKLMLLM\]^__^]\ZYWVUTSRRQQPPOONMLMLMMNN[\]^__^\\ZZXWVUUTTSSRRQPOONMNOPQPZ[\]^__^]\[ZYXWWVUTSRRQPQRQQRRSR[Z[\]^__^]\\[ZZYXWVUUTSR STSSTTUVUT^WZ[\]^__^]\\[ZYXWWVUVWXWXWaVWYZ\]^^__^]\[ZYXYZ[Z[hTVWYZ\\]^^__^^]\[Z[\]\]]\pRTUWYZ\\]]^ ^]\]^_^__^_yPRTUWXZ[\\]]^]^_^^__`aNPRSUWXYZ[\\]^]^_`abMNOQSUVWXYZZ[\]^_`abKMNOQRTUVWWXXYYZ[\]^_`aabJKLMOPRRTUUVVWXYYZZ[\]^__``aIJJLMNOPQRRSSTTUVWWXYZ[\]^_``LIJJKLMNOOPPQQRSTTUUVWXYZ[\\^^_VHHIJJKLMMNNOOPQRRSTUVWXY[\]`GGHIIJJKKLLMMNOPQRSTUVXYZ[kGGHIIJJKLMNOPQRSTUVVXXxGGHIJKLMNOPQRSSUUFGGHIJKLMNOQSTFFGHIJKLMNOPQRFFGHIJKLMNNOOPQMFFGHIJKLMNOO_FFGHIJKLMNqF)FGHIJLMNOF(FGHIJKLMOGF'FGHIJKLMNGGFGHIJKLMNJGG FGHIJKLMNZHHGHIJKLMNlJJIIH GHIJKLMN}KKJJI HIJKLMNOMMLKJIJKLMNONOO殮蜝򚛛 Ꝝ뜝󦥥񦧧妥枟򜝞𛜝󚛛륤󚛜馥󚜜񙚚󜝟󛜝򚛜񚛜󜞟򜝞򝞞 񝞟흜򠡣񟠡 򥤤🠠򣢣򡢣𠡢󢣤罹򢤥렟磤ݞ𤥦򤥦󨩨𣤤󨧧𢣣垟񜝞󩨩坞󞟠𛜝󫪪휞霝 읞WVUTSRQQPPQPOPPOPOOPQRSUUXZ[^`bdfijkkjjihfdb`_]YXWVUUTSSRQRRQRQQPQPQPPQPPQQRSTVWY[\_bdghijklkjigfdc`_[ZZXWWVUTSRSRRSRQQRQRRSTUVWZ\_acegijllkkjigeca`\\[ZZ[ZYYXWXXWXWVWVUVUUTUTSTSSRSRSSTUVWZ[]_bdgijkllkjhfdba]]\\]\[[\[Z[ZZ[ZYZZYXXWVWVVUTSTSTUVWXZ]`bdfhjklmlkkihfda^^]^]]^]]\[\[[ZYZYXXWVUUTUVWXZ\^`cehjkmmljhfeb^_^__^_^_^]\]\[[ZZYXXWVVUUWXY[]`behjklmmlkjhfd^^__`a``a`a``_^][\ZZYXWVVWXY\^`bdgiklmnmllkige]]^__``ababbaba``_^]\ZZYXWWVWWXY[\^adfhjlmnnmkjhg\]]_`aabcdccdccdccbaa`_^]\[ZYWXWXYYZ\^adfhjlmnnmllihZ[[\^^_``bcdedeeddeddb`^\\ZYXXY[]^`begjklnoonnlkiXYZ[\\^__``abbccddefefeddba`^]\[ZXYYZ\]_bdgikmnoonmmjVVWYYZ\\]^^_`aacdefgfedb`_]][ZYYZZ[]`bdfhklmnoponmlSTVWWXYZZ\]]__abbcefgghgffcba`^\\ZZ[]_`cfhjkmoppoomPQSTTVWXYYZ\\]^_``aabddfgghiihihhgedba`^]\[ZZ\]^`begilmnoppoNPQQRSTVVWYZZ[\]]^_`abbcdeefhhijjiihffdca`^]\[[\\^`bdgiklnopqqppNNOPPQSSUVWWYZZ\\]^__`bcceffhijjigfeca__]]\\]^_acegilnopqqpLLMNNOQQSTUUVWYY[\\^^_`bddffhijkkjiigfdca_^^\]]_`aegikmopqqrqKKLMMNNPQQRSSTVVXYZ[\]_`acefghjkkjjiihedba_^]^]]_`bcehjlnoqrrIJKKLMMOOPQQSTTUUVXXZ\\^_bcefhijklkjjhhfdb``_^]^_`abehjlnpprrIJJKLMMNNOPQQSTVXYZ]^`adfghiklkkjigfdc`__^_abdfikmnpqrsJJKLMNOOPPRRSSUVVWYZ\]`bcfgijkklkjjigedba``_^`aacegjlnpqssIIKLMNOPPRTUVXX[\^abeghikkllkkjigfcba`_`_`acegilmoqrsIIJJKLMMNNOPQRRSTUUXY[\^bcegijllmlkjhgedba``abdfhjlopqsIIJJKKLMNOOPQRSTVVXY[^_bdfhjkllmllkjhgedbaa`aabcegikmprsIJJKLMNOPQQRSTVVYZ\^`cehijkmmlkjhgfdcaabcegikmpqrIJJKKLMNOPRSTVWY[]`bdfhkkmmnmmkjhgedcbbaccdehjlnprKKLMNOPQSTUWY[\^`cehiklmnnmmlliigfccbbccdfhjlnprKKLLMNOPOOPPQRSTVXY[]_bdfijkmnnmkjhgfddccdfgikmoqKKLLMNOPQRQRRSTTUVWXZ\^acegjllnnoonnlljigfeeddeffijlnpMMNMNNOOPQRSTUVXY[]_adgijlmoonmkkihgfeffhjmnpNOOPOPPQRSTUVXYZ\_acegikmnooponnmlkjhhgffhijlmoPPQPPQQRSTSSTSSTUVWXZ\]_bdfhklmnopponnlljihhijkmoRRSRSSTSSTUTUUTUTUTUUVXZZ]^`cegikmnoppqpoonmlkkjiijjlnoUTTUUTUUVWVWVVUVWXYZ\^`acfhjlnnopqqpoonmllkjjlmnoXWWXWXWWXXWXXYXYXWWVWVVWWXZ[]^`begiklnopqqrqpqoonnmlmlmnnoZZ[ZZYZZ[\[\[ZZYZYWXWXWXWXXZ[[]_acegikmoopqrrqponnmnno]\]]\]]\]]^_^^]]\[\ZZYXYXXYZ\]_`adghjlmopqrrsrrqpooppq__`__`__``a`a`__^^\\[ZZYZYZYYZ[\]_aceghkmnppqrssrsrqrqqpqaabcba``_]]\\[[ZZ[\]^`acfhikmnoqrrsststssrssrsbabbcdedccba``^^\][[Z[[\]]^abdfgilmopqqsttststbccdefefedcbb``^^]]\\[\\]^_abdghjlmooqrsttuuvbccdefgghghghgffeddcba`_^]]\\]^^`bcdfhjkmopqrstuuvbcddefgghihgfedcba`^_]]\]]^_`bceghjkmoqqsstuvvwwxbbcdeffhijihgfeecb``_^]^]]^__`bcefijlmnpqrtuuvvxxy``abbccdeefggiikjjkjjhiggedba__^^]^^_``bdefhiklnprstuvwwxyy]]__`abbcceffghhijjkkjkjjihgfdca`_^^_`abdefhjkmnpqstuvvxxy[\]]__`abcdefghiijkllkjhfdcb``^_^^`aabdefgikmnpqssuvwwxYYZ[\\^^_`abcdefhhikklmmllkljihgdcba`__^__`abbcffhiklnoqsttvwwVWWYYZ[[]^_`abcefgiijlmmnmmlkkihfecba``_^__``abcdefhiklnoqrtuuvTUVVWXXZ[]]^`accfghjklmnnmmllkihgedcb``_`abcdeggijmnoprrtuRTTVWXZZ[]^_bbdegijklnnmlkihgfccba``abcdeghijkmopqrsQRRSSTUUVWXXZ[[^_`bdfhijlmnoonnmlkjhgfdccbaba`a`bbdeefhijkmnnprOQQRRTUWXYZ\\^`cdehjklmoonlkjiggeddcbbaabcdefghiiklmnoOOQRTVYZ[]_`begijkmnooponnmlkiigfeddcbbcdeffhijjlmmOOPPQRSTUVWXY[]_acegiklmnppopnnmmkjihgfdedccbccddeeggijjklOOPPQQRSUVXXZ\^_adehjklnopponmlkkhhffeeddfhijjNNOOPPQRRSSTUWXX[\^_aefhjkmnoopponnlkkjihgffedeefghhiijNNOOPPQRSTTUUVXY[\_abefiklmoppqpoommkkjihggfghijNOOPPQRSTUUWXY\]_acfgiklnoppqqpomlkjiihhghijNOOPPQRSTUUVVWZZ\]`bcfgilmnopqrqrqqponmlkkj ijNOOPPQRSTUVVWXYZ]^`adfhiklopqqssrsrrqqponnmmllkkjkkPOOPPQRSTUVVWWXZ[]^abdfgilmooqrssrqponommlmmPQRSTUVWWYZ[^_abdghjlmopqrttsrpqpponoononn 0 / /.-,++*))('&&%$$#""!!  "!"$#%%'''()**,,,-/. . - , + * ) ( ' &&%$##0/..-,++*))('&&%򪩨$$#"﫬!!󭬬 𬭭󯮮򭬬 󯰯   󬭭    򪫫שּׂ𪫬穪򮯯쯰\[[ZZ[ZZ[[_0]\[Z[[Z[[\f/^]\\[[\{._^\\[[\[[\\]^.`^^][\\[\\]d-a`^]]\\]\\]]^r,ba_^]\]]\]]^_+cb`_^^]]^]]^^_b+eca`__^^]^^_k*fdcb``^^_`)hfdbb``_^__^__`b)igfdcaa__`ag(kigedba``_``_``av'ljigedcba``ab&mljhffdcba``a``aabf&nmljhgedbbaabco%olkihfedcbbabbabbc$pnmkihffddbbcde$rqonmkjggedccbbcbbccdl#sqqpnlkihfeddbccde{"srrqpnmjihgfedccddcddef!srqonlkihgeeddefi!tsrqonmkihgfeeddeedeeft tuttsrqpnlkjhgffeefeeffgtuutrqpolkjihgffeffgituvvuutsqpnmkjihhgffgfgghpstvvtsqpomkkjihhgfgghsuvvwvuutsqponmkkiihhgghhistuvwwvvutsrppnmlkjiihhihiimrtuvwwxwvvttrqponmlkjjihiijwrtuvwwxxwvutsrqpnnlljkjjiijjqstuvxxyxwwuussrponmllkkjjkjkklqsuuwxxyxwwvtssqponnllklkkrprsuvwxyyzyxxwwutsqqoonnlmllkllmlprstvwxyyzyxxwvutsrqpoonmmlmlpqsuvwxxyzzyxvtsrqppoonnmmnpqrstuvwyzz{zyzxxvvutsrrppoonmnn{qrstuvwxyzz{{|{{zzyxwvutsrrqqpoononoorsstuwwxyz{{|{zyxwwuussrrqppopsttuvwwxyz{{|}}|}}{zyxwwuussrrqqppopvtuvvwwxyz{{|}}~}~}}|{{zyxxwvutssrqqppvuuwwxyyz{|}}~|}||zzxxwvuttsrrqqvwxyyz{{|}}~~~}|zyxwuutssrrqtwxz{|}~~}}|{zyxvuutssr|xyz{{|}~~}}|zzywvuuttsyz{|}}~~ ~}|{zyxwvvuuyzz{|}}~~}{{zyxwwvvu{yz{|}~~}}|{zyyxxwwxz{|}~􂃁~}|{zzywxxyz{{|}}~~~~}|{{zz{ vwxyyz||}}~탄~~}}|{ suvvwxyzz{{}~~~~} rsuuvwyyz{{}~ pqrstuvvwyz{||}~ mopqqrtuvwxyz{|}}~  lmnopqrstvvxxyz{}~~ kmmnppqrstvwxyy{|}~jkkmmnopqrsttvxxzz{|}~jklmnooprrtuuwxyz{{}~~򊉉jkklmoppqsstuvwxzz||}~jkkllmnnopqqrstuvwxyz{|}~klkllmnnopqqrsttuvwxxz{|}~񋌌mnopqqrssuuvxyyz||}onoopqrrsstuuvwxyz{|}~ 0 / d. +.-,D++ *f),)('G&& %i$.$#"H!! k/J !m!2"##P$ % &x&7'()X)$* ++>,-.d.) / 0 0G 1 2 3o 3/456N678w83   "####!!!"" # # # $ " $ $ $ # # # $ $ # % % % $ $ $ % $ & & $ % & & & ' % % & ' % ' & & &'&((''())')' "   "  #!# # # !  " #  #  #  !  ! $  "  "  "  # $  $  $  "  % # % % $ # % % $ $ $ % & & $ & % & & % ' ' % &'%(&(&((&)((!dh "d"d"d ed d "d| "dm #d#dbd!d ed!d fd!d cd!dr  "de #d  #d  #d  #dv  #df $d  ed"d  cd"d  cd"dq  ad#d $d  $d  $d  $dl  %d %d %d ed#dm [d$d %d ed#d %dm &d &d ad$d %dm &d &d &d cd$di fd%d &d &dt ed%d 'd cd%d fd%dh fd&d'dcd%ds(d(dbd&d|id&decd&d(d~(df)d(d(dg44v4k4_4L494*444 444 3 3 3 3 3 c3 C3 *3 3 3 3 2 2 2 n2 M2 12 2 2 2 1 1 Z1 01 1 1 0 0 k0 >0 0 0 / / / M/ '/ / /..].3..--h-.- -,,;;;;:::::::999988888777776666 5 5 5 5 4 4 4 3 3 3 3 2 2 2 1 1 1 1000///...---,,,++ǗИ  Ğ ͟ #  ǜҜ      ɔ     Α͑͑    ͑    є   ˓    Ö Қ   ͜   ˟   ʞ    ɛ   Ȗ  󕖖 ɓ񕖗OONMLKJKLMNOPOPORRQPON MNOPQPQQRQQ_UTTSRQP OPQRSRSSRSnWWVUTSSRRQRSTUTUUT~YYXWVUUTUVWXWXXWXWXWVVU[[ZYXWVWXYZ[Z[[ZZYZYW\\[ZYZ[\]\]]\[Z]]\ [\]^_^__`__^^]]b] ]^] \]^_`abaa`_n]]^ ]^_`abcbbcbbz\\]^]^_`abbcdcdccdcZ Z[\ ]^_`abbccdededX XYZ[ \]^_`abbcddefXV VWXYZ Z[\^_``aabccdeefffS STUVWW XYZ[[\\^_`abbcddeffzPPQRSTTUU VWXYZZ[[\]^``bccddeN NOPQRR STUVVWWYZ[\]^``abccdL LMNOOPQRSTVXZ[[]^^`abcPJ JKLM NOPRSTUVXXY[\\^__`eI IJK LMNPQRSTUUWXYZ[\^^|G GHI JKLMNOPPQSSUVVXYZ[[GGH IJKLMOPQRSTUVVXXYGGHIJKKLLMMNOPQQRSTUVVXF FGHIJKLNPRSTTVtFF GHIJKLMNOOPQRSSTFFGHIJLMNOQRFFGHIJKLMNNOOPQXFFGHIJKLMOPQtFFGHIJKLMNOPQQFFGHIJKLMNOPFFGHIJKLMNOP XFFGHIJKLMNOP tFFGHIJKLMNOP FFGHIJKLMNOP FFGHIJKLMNOP XFFGHIJKLMNOP xFFGHIJKLMNOP FFGHIJKLMNOP LGGFGHIJKLMNOP hGGHGHHIIJJKLMNOP GGHIHIIJJKLMNOP IIHGHHIJIIJJKKLLMNOP [JJIHIIJJKLMNOP {LLKJKJIJIJJKJKKLLMNOP NNMLKJKJJKKLMNOP VQQPONMNMLLKJKKLKLLMNOP qSS TSRQPOPONNMMLKKLMNOP VVUTSRRQPOONMMLLMLMMNNOP XX YXWVUUTSRQPPOMNMMLLMMNNOOPQ lZZYWVTTRQPONNMLMMNNOOPQ \\[ZZYYXVVTRRPPOONMNMNNOOPQR ]]\[ZXXWTTRQQPOOPQRRS m] ]^]\][ZYXWUTSRQQPPQRST ] ]^_^]\\ZYXVVTSRRSRRSUV \ \]^_^]]\ZZXWVUTTSTTUUWX j[ZZ[\]^__^]\\ZXYWWVVWXYYZ Y YZ[\\]^^__`__^^]\Z[YZYXXYZ[\] WVVWXYZ[\\]^__``_`^_^]][[\]^_ cTTUVWXYZ[\]^_``a`__^^]^]^]]^^_``b QQRSTUUWXZ[\]^``a`_`__`abc OONNOPQRSUVWYZ\\__`aa`a``aabbcd \MLLMNOOQRTUWYZ\]^_`aabaabaabbabbccdee ~JJKLLMNOPRTUWXZ\]^_``aabcbbccdeff IIJKLMOORSUWX[[]^__`aabbcdef鞟흞񞟟잟 򡣤񡢣좣󥦧 󦥥󟠠  񩪪     PQRSTUTTUUWWXY\\^_aceghkmnpprsttuttstssrqrqrqrqrqpqqQQRSTUVWXYZ\\^`abfgikmnpqrssuutuuttstssSRSRRSSTUVWXYZZ\]^`bcfgikmopqrsttuvvuvuvuvvuvuvvuvuuvTSTTUTTUUVWXYZ\]]_abdfhjlmoorrstuvvwwvwwxwxwxxwVUVUUVWXWXXYXXYYZ[\^^`aceghjkmopqrstuvwwxyxyyxyyzyXWWXWXXYXXYYZYZZ[\^^_`bdegiklmoprsstuvwwxxyz{zz{ZYZYYZYZZ[Z[Z[ZZ[[\^`bbdfhikkmoqqrtuvvxxyz{|]\[\\]\]\]\\]^_`bbdefhillnoprstuvxxyz{|}_^^_^_^^_^^__^_^^_^_^^__`abbdefgijllnprrsuvwxxyyz{{|}~ba`aababaa`a``_``aabceefhijklnoqrsuuvwyyz{{|~cdccdccddcdccbcdefgiijklnoprstuvxxyyzz{{||}~~deedeeffgffeffeefeeddedeefghhijklmooprstuvxxyyzz{{||~~ffeffg hghgghijjkllmnopqrsuuvxxyyzz{||~ggfgghihiijijijjiijklmnnoprrstuuvxyyzz{||~gghihiijkjkklkklklkkllmmnoppqrrstuuvwxyyzz{||}~~ffghijjkklkllmllmmnmmnnopqrrtvwxyyz{|}~~efgijkllmnmnnopqrstuuvwxxyyz{||}~cdeeffghhiijkklmmnnonoopqrstuvvxyz{|}~acdeffghhjjklmmnoppqpqqrstuuvwxyyz{|}~^``abbcdeffghhijjkllmnoopqrstuvwwxyz{{|}~\]^^_`aacdeefhhijjklmmnnopqrstuwxyz{|Z[[\]]^^_`abcceefghhijkllnopqrstuvwwxyz{XYZZ[[]^``abcdeefhhjkllmnnopqrstuvwxyzVXYZ[[]]_`abbcdefgghijjkkllmnopqrstuvwxTUUVWWXYY[[\]]__`abbddefgghiijjkklmnopqrstuvSTTUVVWWXXYZ[\]]^__aacddeffgghijklmnopqrstQRSSTTUUVWWXYYZZ[\]^__`aaccdefghijklmnopqQRRSSTUVWWXYY[[\^_`aabbcdefghijklmnopQRRSSTUVWXXYYZ[[]]^^_``aabbcdefghijklmnPQQRRTUVWXYZZ[[]]^`abcdefghijklmPQQRRSTUVVWWXYZ[]^_`abcdefghijklPQQRRSTUVWXXYYZZ[\]^_`abcdefghijkPQQRRSTUVWXYZZ[[\\]^_`abcdefghijkPQQRRSTUVWXYZ[\]^_`abcddefghijkPQQRRSSTUVWXYZ[\]^_`abcdefghikQRSTUVWXYZ[\]^_`abcdefghiijkQRSTUVWXYZ[\]^_`acdefghijkQRSTUVWXYZ[\]^_`aabbccdefghijkQRSTUVWXYZ[\]^_``abcdfghijklmQQRSTUVWXYZ[\]]^^__`abcddfghijkllmmPQQRRSSTUVWXYZ[[\\]]^_`aabcddeffghijkllmmoPQQRRSSTUVWXYZZ[[\]^_``bcddeffhhijjkkllmnopqPQQRRSTUVXYZ[\]^^_``abbcddffghhjlmnopqrrPQQRRSTUVVWWXXYZ[[\\^^_``abbddeffhiijkkmmnooppqrstuPQQRRSUVWXYZZ\\^_``bbcddfgghiikllmnnoppqqrstuuvvPQQRRSTTUUVWXXYZ[\\]]^``bdeefggijjklmmooqrsstuvwyPQQSSTUWYZ[[\]^_``abbcdeeghiijklmmnoppqrrsttuuvwxyyzzQRRSSTUVWXYYZ[\]^__`abccefgghijkklmnnopqrssttuvvwwxyz{|QRRSSTUVVXXYZ[]]_``bccdefghijjklmmnopqrrstuuvvwxyz{|}QRSSUUVWWYZ[\]^__`bccefghhikklmnopprsttuvwxyz{|}RTTUVVWYZZ\]^_`abcdffghiikklmnnpqrrsstuuvwxyz{|}TUUVXYY[\\^_`abcdefghijkllmnnoppqqstuvuvvwxyz{|}UUWXXZ[\^_`bcceffgiikkllnnoqrstuvuvvwxyz{|WWYZZ\^^`bbdeefhiijklmmnooppqrststtuvwxyzYZ\]^`abddeghhijkllnopqpqqrqrrsststtuvwx[\]^``ccdegghjjkllmmnoopqrqrqrrsstuvw]__`bcdffgiijkklmmnnonoopopoopoopoopoppqrssttu``bcdefghhijjkllmnmnmmnnmnmmnmmlmmnoprsbcddeggijkklmllkllkklkjkjkkjkjkklmnnopqqrddeffghijj kjkjjijijiihihihhijklmnnppqeefghhiijijjijiihhghhgfghiklmmnoppqfgghhihgfgffefeedeeddedeefghjkmmnopqrgghgfedcdccbccbcbccbccddefghhikllnooqrsffgfggfecdccbcbbaa`aababbcdeeffghhijklmnpqrst"!!   !!""###$$$%%%%&&&&&''''''''''''''''''''&&&&&%%%%$$$###"򲳳򲳳 ˲ 񶷷 𳴴󹺺𶷷鴵𷸹򷸸𺻻 򺻼 빺츹그 qpqppqqrrstuvwxyzz{|~~srsstuvwxyyzz{}}~uvwxwxxyz|}}~wxyzyyzz{z{zz||}~~yyz{|{|{||}~z{{|}~}}~~}~~|}}|}}~~򆇇}}~~~~~}~|}~ z{{|}~~~xxyyzz{|}|}|}|}|}|}}~vwwxyz{zz{zz{z{z{z{{}~ttuuvvwxyxyxyxyyxyyz{|}}~rrstuvwxyzz{||}ppqqrrstuvuvuvvwwxyz{||}~oopqrstuvuvvwxxyzz{||}~nnoopqrstssttuvwxxyzz{||}~lmmnopqrqrrsstuvwxyyz{{}}~kllmmnopqrstuvwxyzz{||}~~kllmmnopqrstuvwxyz{{|}~~kllmmnopqrstuvwxz{||}~~llmnopqrstuvvwwxyz{{|}}~llmnopqrssttvwxyyz{|}~򆈉llmnooppqrsttuuvvwwxyzz{}~焅lmmnooppqrrsstuvvxxyzz{{|}~~mnoopqrssttuvvwwxxyz{{||}}~팍noopqrssttuvwwyy{|}~~􁂂쌍pqqrsstuuvwxyzz{||}~񏐑qrsstvvwxxyyz{{|}~~푒suuvwwxxyz{{|}~򔕕uvwxxyz{{||}wyy{|}~yz{||}~~{||}~~|}}~}~~~}~򇈉|}~|{|{||}~񄅅z{z{{|}~xxyz{|}}~wwxyz{||~􎏐uvuvvwxxyz{||}ttuvwwxyz{|}~~㌍ssttuuwwxyz{|~ሉrsttuvwxyz{|}~sttvwxxz{|}~䇈stuvwwyz{|}}刉tuvwxyz{|}~儅vwxxyz||}~9:;y;C;< =?===;:998766544 3 2 1 0 0 /.-,+*)(&%$"" "%(*,/ 1 3 678;===<;:9987665433210//.-,+*)(&%$"!            ==<;:9987665433210//.-,+*)(&%$"!󜛛 񛜚󚘘윝𙘗 횙 욙 񖕔 򕔓 󔓒 ꖕ𔓒햕   򐑐=d=4<;:9Q9(876e61543 x3 >2 1 0 / v/O./-, +* )(&"%$b"2!p !'$<&S(x*+-L /r 1( 4=6O8d :{; <974 3 0-+(& <97420-+(& <974󎍌2񏎍0-+(& *<=9i7-4W 2 0 G-w+7(d&)(()(*(*(*)*(+)*(*()')'((&'%'%&&$%%#$$"##!"" !!    !!!"""##)'))''())*(**()**(()'''((('%%%&&$###$"$#!#"" !!   !!!"""##cd'dcd'd)dhed'd)dcd'dhed(d)d)de*ded(dt*d*d*dl+d*d*d*d*d)ded'd)dbd'd(dcd&dbd&d'ded%d'dbd%d&d&ded$d%ded#dcd#d$d$ded"ded!d#d#d"dcd ded d!d!dedd d dedddd`dd cdd edd!d!cdd!fdd"d"d"fdd#d#bddV,#,,++B++**C**))C))((C(('{'*''&M&&%y%*%%$L$$#\##"`""!d!! i  mM1 } !!X! "";"#u#+***))((('''&&&&&&&%&&&&%&%&&&&%&&&&%&%&&%&%&%&%&%%%$%$%$%$$$$%   ϓ󕖗   җ   Ǒ    ͒   Ҙ  ̒     ϓ  Ƒ   ї  ˗  š    ϟ   ǟ Ԩ  Ѡ  ͛  ˘  ʕ  ǒ   Ƒ  ǒ   ̔   И    ‘  ɒ  ϗ  戮 ͗ aGGHIJKMNOQSUVWZ[\^^__`abcd GGHIIJKMNOQRTUXYZ\\^`abcd JGGHIJKLMOPRSVVXYZ[\]]^^__`ab kFFGHIJJLMOOQSTUWXXZZ[\]^_ FFGHIJJKMMOPRSTUVWXXYYZZ[\] PFFGHIJKLMNPPRSSUUVVWXYZ wFFGHIJJKLNNOPQRRSTUVW FFGHIJJKLMNOPPQRSTU ZFFGHIJKKLLNNOPQRS F FGHIIJKKLMMNNOOPQR HF FGHJKLMNOP gF FGHIJKLMNO FFGHHIJKLMNO QFFGHJKLMNO }FFGHIJJKKLLMNOOP HFFGHIJJKLMNNPPQf iFFGHHIIJJKLMNNPPQQRd F FGHIJKKMMOOQRSSUdw WF FGHIJKLMNNOQRSSTUUVdd FF GHIJKKLMNNPQQTTUVVXXdd JFFGGHIKLMOPPRSTVWWXYY[ddm pGGHIJLMMOOPRRTVVXYZ[\\]dd GGHIJKLMNNOQQRTUWXY[\\]^^`dd{ ^HHIJKLLMMNOOPQRTTVXX[[\^__``add IJJKLMMNOOPQRSTUWWXZZ\^^_`aabbdd QKKLMMNOOPQQRSTUVVWYYZ\]]_``abbccddi zMMNOOPQRRSTUUVWWYY[\\^__`aaccd OOPQRRSSUUVVWWXYZ[[\^^`abbcdu oRSSTUUVWWXYYZZ[[]]^__aabcbcdd UUVWWXYZZ[\\^`ababaabdd cXXYZZ[\]_`a``_dg ZZ[[\\]^_^_^^dd ^\\]^]^]\\[Zddp ~] ]\[\\[ZZYZYXdd ]^]]\[Z[ZYZYYXWVUdd n]]\[ZZYXXWWXWVWWVVUVTSTSdde \\[ZYXWWVUUTSRSRQRQdd _ZZYXWWVUUTSSRRQRQQPQPPOddl YXWWVUUTSRRQPOONOONONdd XUUTSRQPPOONMMNMMLMdd{ {SRRQPOONMMLKJKKLKLKKLd d QOONMMLLKJJIJIJJK d tMMLKKJJIHIJK di MKJJIHGHIJIJJd d nJIIHHGHIJd du HHGGFGHIJd d jGGFGHIJd d GG FGHI de fF FGHI d GF FGHI df pF FGHId KF FGHId dg ~F FGIJdd RF FGHHIdh F FGHId \FFGHIIJKddi FFGHJKKLdd hFFGHIJKLLNddk HFFGGHIJJKLNNd vFGGHIJJLMMNPPdk QGGHIJJKMMNOPQSSdd GGHIJKLMNOPRRTVVddf kHIJKMMOPRSTUVWXdd PJKMNOQRTUVWXY[򢣢 򧨩 𦧨롢󱚚󣥦 젡񠡢 ퟠ쟠󠡢힟򢣣𠡡 򣢡󠡡  󚛛򜝝  deeffefeecdccbbaa`_`_`_^_^__``abcefgghikklmopqrtuvcddcb`_^]^^]^_^__`abcddffgijjkmnopqstuvwcbba`_^^]]\]\]\\]\]]^^_`abbdeefhiiklmnoqssuuvyy``_`_^^]\]\\[Z[[Z[[\]^_`bcdeghhjklnnqrstuvxxyz^^]^]]\[Z[ZZYYZYZYZYYZZ[[\]^_`abddeghijlmnpqrsuvwwxzz[Z[YY XYZ[\^_`bccfghijmnopqrtuvwxyyzz{XXYYXX WXYZ[\]^^`abdffhjlmnoqrsuuwxxyzz{VVWVVUVVWXWXXYYZ[]^_`bbceghjkmnqqsttvwwxyyz{TTUTUUVWVWWXYZ[\\]]^_`abdeghjlnopqstuvvwxxyzyzSSTUVUVVWWXYZ[[\\]^^`abddfhjlmopsstuvwwyxyxyyxQQRSTUVWXZ[\]_``bdefhiknoqrstuvvxxwxxwxwPPQQRSTUVWXXYYZ[\^__abcegijlmnprttuuwwvutPPQQRSTUVWXYZ[\]]^_abceghjkmoqrstuuvvwvuutsPQRSTUVWXYZZ[\]^^_abddgiklmopqsttuvvuvtuttssrrpqPQQRSTUVWXYZ[\\]^_aabcegijlmoprrsuutsrrponQRRSTUVWXZ[]^``acdfghjlmopqrsttuttsrpqoonnmmRSSTUVWXYZ[[]^^_`abdefhijlmopqrsttstssqqpponmlmlkkUVWXYZ[\]^``bcdeghiklnopprsstssrqpoomkljkjjijWWXYZ[\]^_`accdeggijkmmopqrrtssrqqpomlljkijiihihhXYYZ[\]^`acdffghjklmnooqrrtssrqqponmljjiihhg[\\]^_`abccddfggiikklnnpqqssrsrqqponmlkjjhhggfg^^__`abcdefggijjklmmnoppqrrqponmkjhhgffef`abcdefghhijkllmnnoppqponmlkihhgfeeddefebbcdefghijjkkmoponmlliihffeeddcddedeebccdefghijklmnnonljihgfeddcdecddefghijkllmmnmnnmkljjigfedcdccbbccdedeefghijlmlmmlmlkkjjhhgfedccbbcbbccddedcddefghijklkjihggeddcbbabcdcbccdefghijighggffdecdbbaa`aabaabbcdbabbabbcdefghihhggfecdbcbaa`a``aabbcd`abcdefeeffefeddcbabaa`a``_``abcd]]^^]^^_`abcdcba`aa``_`__^__`__``abcd[[Z[[\]^_`a`_^_^^_^__``abcXYXXYYZ[\]^_^^]^]]^]]^_`abcUVUVVWWXYZ[\] \[\\]^]^^_`abccddSSTUVWXYZ[ZZ[ZZ[Z[Z[[\]\\]]^^_`abbcdQQRSTUVWXYXYYZYYZ[\]^_abcdOPPQRSTUVWXWXYZYZZ[[\]^_``abccdeNNOPQRSTUVWXYXYYZ[\]^^_`abbddefLLMMNNOOPQRSTUVWXYZ[]^_`aabcddfgLLMMNOPQRSTUVUVVWWXYZ[\\]^_`aabccdfgghLLMLMMNNOPQRSTUVWXYZZ[\^`abbccdffghijKKLLMNOPQRSTUVWXXYZ[]^``abcddefghijklKKLMNOPQRSTUVVWXYZ[\\]^__``bccdeffhijklmnJKKLLMNOPQRSUVWXYYZZ[\\]^^_`bbceefgiijkllnooJKKLMNOPQRSTUVWXYYZ[[\\^_aabcdefghijkkmnnoprJJKKLLMNOPQRRSSTVXYZZ\]^__`abcdefghjjklmnoopqrsJJKKLMNOQRSTUVVXXYZ[\]]^__aabdefghijklmnoopqrrstJJKLMNPQRSSTUVWWYYZ[\]]^__`aabcddfghijkmnnopqqstIJJKKLMOPQRRSTUVVWWYZZ\]]_``abbceefghiikmmnopprstIJJKLMNNOPQQSTTUVVXYYZ\\]_``accddeffhhijllmnoopqqrrsIJLMNOPPQRSSUUVXXY[[\]_`abcddeffghiijkklmnnoopqqrJKLMNOOPRRSTUVWXYZ[\]_`abcddfgghiijkklmmnnopp qJKLMNOPQQSTUVWXXZ[\^_``bccdfggijkklmmnoopqppoJKKLLMNNPPQRSTUVWYZ[\^__abbddffgiijklmnnopoonmKLLNOPRSSUVVYZZ]^^_`acdeefhhijjkmnonnmlkLMMNOOPRRSTUWXYZ\]^_`bbddefgghiijklmlmmlkjihhNNPPQRTTVXXZ\\^_`accdeeffghhijklkkjiihihhgffePPQRRSTUWWXZ[\^_`abcddeefgghihhiijiijijjihghgffeeddcRSSUVWWYZZ\]^_`abcddeeffghgghhghgghghggfedccbaTUVVXXZ[[]^_`abbcddeefefeedeefeedccbba`VWXYYZZ[\]^_``abbcddededccbcbcbba`_^_^^Y[]_`aabccdcdcdcbba`_``_`__`__^_^]^]]\][[\]]_`abcdccbcba`a``_^^]^]]^]]^]]\]\\[\\"!!    !!"##$%&''()*+,-.01 2 4 5 78:<>보򳴵  񱲲󱲳򰱱򺻻 򯰰 ﭮ񮯰𯰱񭮮 񬭮񭮮 򭮮𫬭𭮯󵴴񫬬쩪󬭮쨩𫬬󬭭񪫬馧𨩪񩪫򨩪ꦧ񧨩벳𨩪 򧨨򳴴 󬭭䨩󫬭򨩪﫬򦧧򯮮󦧨񤥥󩪫𡢣󧨨󢣣󧨩wxyz{||}~~䁂yzz{|}}~~~~z{||}~~~~~}~}}~}}쀁{{|}}~~~~}|{||{||}~{||}}~}~~}}|}||{|{{z{z{|}~{|}||}|}|}||{{z{zzyzz yxyyz{|}~{{|{zyzyyxyxxwxxwxwwxwxxyzz{{|~zz{zzyxw vuvvwvwxxyz{|}yyxwvutututuuvwxyzz|}xxwwvvutsrsrsstssttuuvwxyz|}~vvutsrsrrqrqrqrrqrrsstuvwxy{|~tsrqrqq pqrstuwxyz|}rrqppopoonoopqrsttuuvwxy{}~򆅅popnonnmmnnmnmnnoopqrsttuwxy{|}nmnmmlmlmllmnonoopqrstvwwz{|񈆆lkkllkklmnopqrssuwwyz{~jkjjklmllmmnopqrsstuvxy{}~ijiijklmnopqrrtuvxyz|}hhijijjkklmnopqrstuvxz{}񆅄ghhijklmnopqqrtuvwxz|~~gghghhijklmnoppqrstuwxz|~~~gfgghijklmnoopqrsuvwx{|~~~}~ffgghijklmnopqrstvwxz|~~~}}~ffghijklmmnnopqrrsuvwy{}~}~}~~effgghijkmnoppqrtuvwy{|~~~}}~effghijklmnpqqrttvwyz|~~~}}~eeffgghijkkllmoppqrstuwyz{}~~}~~eeffghiklmnooqrsuvwy{|}~~~deeffghijjkklmnoprrtuvwyz|}~~~deefghiijjkmnnpqrsuvxyz{}~ddeeffghijklmnoprsuvxz{|}~~ddeefgghhijklmnpqrtuwxz{|}~ddfghijllnopqtuwxy{|}~~deefghjkklnopqstvxz{|}~~}~~߉ddeeffgghijjkmnoprsuvxz{|}}~~}}~deffghiiklmnoprsuvwyz||~~}}||}~deffhhijklmnopqstvxzz||}~~~~}}||{||}}~凈ffgghiikklmnpqstuvxyz{|}~~~}~}}|{{z{|}~gghiijklmnpprstuvxyz{|}}~}~}}|{z{|}~hikklmnopqrstuwxyzz{|}}|{zyz{||~~ꅆjjklmnopqqssuvwxyyz||}|{|{{zyyxy{|~鄅kllnppqrrtuvvwxyzz{{||{zxwxxyz{|}~mnopqqrtuuvvxxyyz{{zyxwvwxxyz{}}~~oppqsttuuvwwxxzz{zyxwwvvwxyz{}}}|}~pqsstuuvvwwyyzyxwwvvuvuuvvwxyz|}~~~~||{{|}~rsttuuvvxxyxywxwvututtuvwxy{||}~~~}|{{yyz{|}stuuvwxwxxvwvvuttssrsttuvwxyz{|}}~~}|{zyxxwxyz{|~ttuuvvwvwwvvutsrqrrstuvwxz{{|~~~}}{{yxwwvvwyz|}tuuvuvvuvvusrqrtuvwxz{||}~~~}}|{zywwvuuvxz{}ttuttuuttsrsqrppopoppqrtuvwyz{{}~~}||zzxwvttstuvxz{}~sstssrqrqppoonmnnopqstvwyz{|}}~}||{zyxvutsrsstuwy{}~rsrqrrqqppqpoonnmlmmnopqsuvxyz{|}}|{{yywvtsrrqqrssuwz{}pqpponmlkjkklmmoprtuxyz{|}}|{{zywwutsqqpqrsuwy{}~nnmlklkkjjijkmnpqsuvxyz{|}||{{zzwwvtsrqpooprsuwy{}llkjihijklnortuwyy{{||{zzywvutsrpoonnooqrsuwy{}jjihhghggfgffghijkloqstvxyy{{|{zzyxwvtsqqponnpqsvxz{}~ggffeffeedeefhiikmnqsuvxyz{{zyywvutsqpoommnoqrsvxy|}~eeddcdccddcdccdeefgijlnprtvxxzzyxwvusrqponlmllmoprtvy{|}~ccb bcdffhikmopruvwxyzzyxxwutsqpnnmllmnpqstwx{|}~`aa`a``aabcdefhikmprtuwxyyxwwutrqpnmllkjjllmooqtvwy{|}~~_`__`__``abcdeghjmoqrtvwxyyxwwvusrponmkkjklmoqrtvxz{|~~^_`abcdegikmoqtuvwxxywwvttrpnnlkjjijkllmopsuwyz|}~~]^_^^``abddghjloqstuvxxwusroomljjihihiijklnpqsuwy{{}}]^]]^^_``abcefhkmoqsuuwwxwvuusqpnmkkiihijklmnpruvxz{|}~}|><:84 /*#)             󾽾󵶶   򰱲𶵴񲰰粱󰱳󏐐 푐 􍎏􋌎󕔔 󈉊펍瓒󃄅􂃅􍂄 鎍􍌂ꎌ萏ꊈ􌋃񀁂튆򌍍~~􊉇~}}~~~}}~~}||}~~}||}~􋊊}||}~톇~}|{{|~~||{{|}~|{zz{|}~~}|{zz{|~~}{zz{|~~|{zyyz|}񆅅}|zzyyz{}}|zyxxyz{}}{zyxxy{|~~~|{yyxxyz|~~~~|{yxwwxz{}}}~{zxxwwxz{}~}{||}}{zxwvvwxy{}~||{{}~}{yxwvvwyz|􂁀~}{{zz{|~}zywwvvwxz|~}|zz|}|zywvuuvxz|~~~}|zyxxy{}~~|zxvvuuvxy{~}}~}{yywwxyz|~~|yxvuttuvwy{}~}}}{zxwwxz|}~{ywvuttuwxz}~~}}|}~~}|zxxvvwwxz{}}{xwuuttvxz|~}||}~}{zwwvuuvxyz|~~}zxwutsstvxy{}~||}~}|zxwuuvwxz|~~|zxvutsrrssuvyz|~~}}||}~|{ywvuttuvxy|}}|zwvtsrrstvxy{}~~|{{||}~~|{xwuusstvxy{}߁}|ywutsrqqrssuvy{|~}|{{|}}}|zxvttrrstuwy{}}{yvussqqrstvxz|}~}|{{|}}|{xwutsrrssuwx{|~|{yvusrppqrtvwy|}~}|{zz{||}|zxvttrqqrsuvxz|~~|zxvtsrpoppqqttwxz|}~}||zz{|~}}{ywutrrqqstvwz|~~|zxutrqpooppqrtvxz|}~}|{zzyy{{~}|zxvtsqpqqrtvwz{}~{zwusrqoonpqrsuwyz}~~}|zyyz{~}|{ywutrqpprsuwy{}~}{ywusqqonnoprrtvxz|}~~~}|{zyyxxyz}}|yxvtsqopopprruvyz}~}{ywtrqpnnpqrsvxz|}}~~}|{zxxwxxz}}|{ywusqponnooqrtvxz|~~}|zxvtrqpnmmnoprsvxy||}~~}|{yxwvwxx}|{ywvsrqoonnoqrtvxz|~~}|zxvsrponmmnopqsuwy{|}}|{zxxwvwwx|{{xwtrppnnmnooqtuxz|}~~}|yxusqpommlmooqruwx{||}}|{yxwvvw{zxwvsrponmllnnoqsuwz{}~~}|{ywusqoomllmnoprtwx{{|}}|{ywvuuv#!   %&(,/0 1 2 3 4 56789;<~#!󳲲󳲲ﴳ   󸷶񸷶󱰯󸷶񭬭Ჱ򷶶歬ꬫ 󫪫뭬󴳲򴳲񴳲󮭫󧨨驪򲱰󲱰󮭬䦥򭬪󱰯򭬫򭬬󯮬񥤥󬫩󬫪󫩨󬫩򬫫󯮬夥񫪩#񊉉!􈇆󇆅~~튉}|{򅄃}|{y}툇~|{zyx퇆~}{{ywv~~}|{zxwvw爇~}|{zyxvut~膅~}{zyxwutrw 킁~}|{zxwutsqs 郂~}||zywvtsrppz邁~}|{zxxvvtsqpos ꁀ~}}|zywwvutrqqpp~}||{zywvuttrqppoy~}{{zyywuusrrpou삁~~}|{zyxxwvutssrpp~~}|{{yyxxvvutsrr~~}}|{{zyxxwvvutt~~}||{zzyxwwvu~}}|{{yxwwu~~}}~~~}}|{{zyxwꉈ~}||}|~~~~}|{{zyxw片~}{{zz{|}~~~}}|{{zyxxwwv片}|{zyyzz{}}~~}|{{zzxxwwvvu􈇆}{zyxxy{|}~}{zyywwvuutu}zyxwwxyz|}~~}|{{zyxwvuutts􈇅~}zxwvvwxyz|}~|{{zyxwuuttrrq|zxwvuuvwy{|}~~~~}|{{zyxvuusrqqp~|zxwuuttuvvxy{|}~}|{zxwvutsrqpponn~|ywvutststuvxyz|~~~}}|{zxwwuurqqponmm~{ywvtsstuvxy{|}~~}|}||{zyxwutsrqponml~{xwvtsrrsrtuvwz{}}~~}}{{z{{zyxvvutsqponml}{yvutsrqqrrstuvxz{|~~~}|{zzyz{zzyxwvvtsrqponl~{ywusrqqpqqstuwyz|}}~}{zyxxyxxyyxwvutssqonm}|ywusrqppqrstvwyz|}~~~}{zyxxwvwwvxxyxwvvutsrqon~{ywusrqpooppqrruvxy{||~~}|zzxwvvuuvwwxwvuttsrqo}|ywusrpoopqrsuvxz{|}~~}{zyxvuuttstuuvvwwvtssrq}{yvutrqoonoopqrsuwxz{|}~}}{zyxvutsrrssutvvwuuttsr󂁀~|ywusqponnopqstuwyz{|}}|{zyxutsrqqrsttuuvuvuutsr}|yvutqponnmnnopqrtvxyz{||}|zyxwusrppoopqrssutuuts~|zwutqponmmoprstvxy{{||{{yxwusrpoonnopqrsstts}|ywusqpnmmlnnopqsvwxzz{{zywutrponmllmmnopqqrrsstss~{zwusqpnmmlnpqrtuvyzz{{yxwusrpnmkkjllmnoopqqrrs~{ywtrqonmmllkmmoopsuvwyyz{zzxxvtqpnlkjjiijjkkmmnnoqpqqr~}{yvtrponmllklmmopqstvxyzzyxvurpnlkiihhijjlmnopoq}{yvtrqomllkjkklnprtuwxyyzzxwvurpnmkihgfgghjklmmno}{xvtrqonllkjjkjjklmnoqrtvwxyzyyxwuspnljhgfeefghiijkll~|{yvtrpnmlkkjjijjklmnpqsuwwxxyyxwutqomjhgfeddefghiij~|{xvtrpnmlkkjiijiijklmnprsuvxxyyxvutqomkigedccbccdefggh~}|{yvurpnmlkjiijklmoprtvwwyxxwvtromkhgedcbbabbdef~~}|{ywtrpnmkjjihihhijklnprsuvwwxxwvtspnkigedcba``abccd~~}{xwtrpomljjihhijlmoprtuwwxxwutrpnligedba``_`abb}}~~}|{yvtrpnlkjiihhghhgiiklnoqsuvwxwwvuspnkigecba``__^_`}~}|zxwtrpolkiihgghijkmoqrtuvwwvusqomjhfcca``__^^]^^_||}~~}|{yvurpnlkjhhgghklnpqstvvwvutsqomjhfdba`__^]\]||}~}}{zywtspnlkihhggfgfghhikmoprtuvvutromjhfdba`__^]]\]]\\z||}}|{zxwtrpnlkihhggffhjknpqstuvvutrpnligecb`_^^]]\\[\\[z{{}}|{{yvtromkjihgffeffhikmoprsuuvutsrqnljgecb`^^]\\[[z{|{{zzyvtqomkjhggfefghjknoqstuutsqnljgeca`_^^]\\[[Zyz{{zxvtqnmkjhggfeedeefggijloprsttuutsqomkhfdba_^]]\[[Zxyz{{zxvsqomkjhffededdeffhjkmoqrttutsrqpmkifdb`_]][ZYxyz{{zzyxvsqomkihffeddefgijlnprrsttsrpnkifdb`_^]\\[[ZZY)#Q!@ p#2%\ '$*K,|/7 1a 3%6G8u:1543 2 F2 1 0 / .5.`-,+*))(O(~'&%$# " ! !) 3!="I#I$8%)&'( )*+,./t 0` 1< 2 4a56839 ;T;<{$$%%&&'('(()*)'&$#" !"$%'(*,-/02 4 679;=;::773Χ ˢ  Ω šѱȠͧѶ     !#$Ө%Ԩ&)+,. / 1 3568:<ܨ=<:8974dpRFFGddmkFFdjLF F dhcF F dfNF F deoF F dVFFGd d{HFFGd_FFGdMFGGdkGGHddzWIddrddgddkd dq de dx dh d!dm#d$dkd%d{d&dg)ds+d,dl.d /dh 1dt 3d}4de6dh8dm:dt;QRSTWY[]`aeefggeeda_\YXVUSRRQQRSUUWY\_aceeffeec`^[XVUSQQPOQQSTVXZ]`bdeffedb`_\YWUTRQQPPQRTUWY[^`ceeffeec`^[XVTSQPPOPPQRSVXZ]`bdeffedb`][YWUTRQQPPQRTUVX[^`cddeeddb_^[XVTSQPPNPPQRSVXZ]_acdeedcb`][XVSRQQPQSTVX[^_bddeeddb`][XVTRPOONOOPQSUWY\_acdeedb`^\ZWUSRPPOPQSTVXZ]_bddeedb`][XVTRQOONOOPQSUWZ]_bcdeedb`^[YWUSRPPOPQSSUWZ]_bccddca_][XUTRPOONMOORSUVY\^accddcb`^[YVTRQOONOPRSUWZ\^accdedca`][XVTQPONNMNNPQRTVY\^acddca_][YVTRQOONOPRSUVY\^acceedca`^[YVTRPONNLNNPQSUWY\_`bceddca_\ZWUSQPOONOQRTVY\^`bbddba`][XUSQPNMMLMNOQRTVY\^`bcdccb`^\YWTSQPNNMNOQRTVY[]`bbddcb`][XVSRPOMMNOPSUWZ\_`bcdccb`][XVTRQONNMNOQQSUX[]`abddba_^[XUTRONLLMPQSUWY]^`abcbba`][XUSQPNMMLMNOPSUWZ]^`accba`^[YVTRONMLLMOPRTWZ\_`abcba`^\ZXUSQPNMMLMOPSTVY[^_abcca`^\YWTRPOMLKLMOQRUWZ\_abccba_][YVTRONML LNOQSUX[]_abcbba`^[YVSQONLKKMNPRTWY\^`abba`^][XVSQONLLKLNOQRUWZ[^`abba`^[YVSQPNMKKLMNPRUXZ\^`abba`^[YVTRPONLLKLMOPQSVY[^_`bba`^\YWTROMLJJKLNPRUWY\^`abb``^[YVSQONLKKJJKLMNQSUX[]_``aa`_][YWTRPMLKJKLNPRTWY\^_``a_^\ZXVSQONLKKJJKLMNPRUWY[]_`aa_^\ZWURPMMKJKLNPRUXZ\^_``_^\YWTRPMMKJJIIJLMOPSUXZ]_`aa_^\YWTQOMLJIJKMPQTWY[^_``_^\YWTRPMLJJIJKMNPRUXZ]]^_``_^\YWTROMLJIJKMOQTWY[]^__^\[XVSQPMLJJIJKMMPQSVX[\^_``_^\ZXUROMKJHIJMOQTWY[]^__^\ZWURPNLKIIHIJKLNPSUWZ\^_``_][ZWURPMKJIIJLNPSVXZ\^__^\ZWURPNLKIIHIKLNPRTVX[]]__^]\ZXUSPNLJIIJLNPSVXZ\]^^][YVTQOMKJHH GHIKLNPSVXZ\]__]\[XVSOMKJHHIKNPSVXZ\]^^][YVTQOMKJHH GHIJLNPSUXZ\]^_^]\ZWURPMLJHHIKMORUWY[\]^^][YVTQOMKJHH GHIJKNOQSVXZ\]^^]\ZXUSPNLJIHIKMORUWY[\]]\ZXUSPNLJIGG FGIJLMPRUWZ\]^^]\[YVSQNMJIHIKMORUWY[\]]\ZXUSPNLJIGG FGHJKMPRUWZ[]^^]\[YWTROMKIHIKMORUWY[\]]\ZXUSPNLJIGG FGHJKMORUWZ[\]^^\\ZWUROMKJHIKMORUWY[\]]\ZXUSPNLJIGG FGHJKMOQTVY[\]^^]\ZWURPNLJHIKMORUWY[\]]\ZXUSPNLJIGG FGHIJLOQTVXZ\]^^]\ZXVSPNLJHIKMORUWY[\]]\ZXUSPNLJIGG FGIJLNPSUXZ\]^^]\[YVTQOMJHIKMORUWY[\]]\ZXUSPNLJIGG FGIJKMORUWZ\]^^\[ZWUROMKHIKMORUWY[\]]\ZXUSPNLJIGG FGHJKMORUWY[\^^]\ZWURPNLHIKMORUWY[\]]\ZXUSPNLJIGG FGHIJMOQTWY[\]^^]\ZXVSQNLHIKMORUWY[\]]\ZXUSPNLJIGG FGHIJLNQSVXZ\]^^\[YWTROMHIKMORUWY[\]]\ZXUSPNLJIGG FGIJLMPRUWZ\]^^\[ZWUROMHIKMORUWY[\]]\ZXUSPNLJIGG FGHJKMORUWZ[\^^]\ZXUSPNHIKMORUWY[\]]\ZXUSPNLJIGG FGHJKMOQTWY[\]^^]\ZYVTQO~fOORUWY[\]]\ZXUSPNLJIGG FGHIJLNQSVXZ\]^^]\[ZWUROueZ[\]]\ZXUSPNLJIGG FGIJLMPRUWZ\]^^]\ZXVSPﱠ~n`\ZXUSPNLJIGG FGHJKMORUWY[\^^]\[YWTR {gUPNLJIGG FGHJJMOQTVXZ\]^^\[ZWURt]KGG FGHIJLNPSUWZ\]^^]\ZXUSoYGF FGIJKMORUWZ[\^^]\ZYVTr`MFFGHIKMOQTVYZ\]^^\[ZWU 骘s`NFFGGHIJLNPSUXZ\]^^]\ZWU&齃sbQIKMORUWZ[\^^]\ZWU,zoe[[\]^^]\ZWU4|qg^WU<;61 ,'""(.6>; ;(񡠟򕖗󡠞󡠞󞝜 󠟞  򠟞󕖖񠟝 㖗 󞜛񟞝 󝛚 򞝜󝜚󝛚  򞝜 󝛚 񞝜 򞝜󝜚  򞝜 򞝜 㔕 ⓔ ⓔ 䔕 ⓔ 㓔  㓔󞝜哔䓔哔󞝜񝞟Q3 OPOPRSUVY[^`abcddcb_^[XVTRONMLKJJIHIJJLMOQRUOONOPQRSVXZ\^`bcddba`^\ZWTRPOLKKJIIHGHGIJJLMOQSNNOPQSUWY[]`babccba_\ZWTRPNMLKJJIIHGHIJJLMOQNNOQRSUXZ]^`abccba^\ZXUSQONKJJIHGFGHJLMONNMMNOPPSUWX[]_abcba`_][YVTROMLKJJIHHGFGIJJLM MOPRTUWZ\__`abba`^[YWTRPNMKIIHGGFGHJLMMLMNOPRTWY[]^`abba_^\ZXUSPOLKJIIHGG FGIJJLLMLLMNORSUWY\^``aa`_][YVTQONLKIHHG FGHJLLKLLNOPQSVY[\^_`aa`_][YWTRQOLKIHHGFFGHLLKLNOQSUWY[]__aa`_^\ZXVSPOMKJIGGFGLKKJKKLMNPQSUXZ\^^_``_^]\XVTRPNLJIHGGFGLKKJKMNPRTVWY\^^_``^]\ZXVSQNMKJHGGFGKJJIJJKLMOPQTWY[\^__^]][YWTRONLJIHGGFGKJJIJKMMOQSUWY[\]^__^][ZWUSQOMKJIGGFJIIJIJKLNOQSUWY[]^^_^]\ZYWURPNMKJHGGFJIIHIJLKNOQSVXZ\\]^^\ZXVTROMLJIHGGFJIIHIHJKLNPRTUWZ[\]^^]\[ZWUSQOMKJIHGGFIHHGHIJKMNORUWXZ\]^^]\ZYWURPNMKJHGGFIHHGHJKMOPSUWZ[\]^^]\ZXVTRONLJIHGGFIHGGFGGHIJLMORTVXZ\]^^]\[ZWUSQOMLJIHGGFHGFGHJJLNPRUWY[\]^^]\ZYWURPOMKJIGG FHG FGIJKMOQSVXZ[\^^]\ZXWURPNMKJHGG FG FGHIJLMORUWYZ\]^^]\[ZXVTROMLJIHGG FG FGHJKMOPSUWY[\]^^]\[ZWUSQOMKJIGG FG FGHIJKMORTVXZ\\^^]\ZYWURPNMJIHGG FG FGHIJLNPRUWYZ\]^^]\ZXVTROMLJIGG FHGGF FGIJKMOQSUWZ[\]^_^^\[ZWUSQOMJJHGG FHGGF FGHIJLMORTVXZ\\^__^]\ZYWUROMKJIGG FHGGFFGHJJMNPRUWYZ\]^__^][ZWUSPNLJIHGGF FIGGFFGIJKMOQSUWZ[\^^_^]\ZYWTROMKJHGG FIHGGFFGHIJLMORTVXZ\]^__^\\ZWURPNLJIHGGFFIHGGFGHJJMNPRUWY[\]^_^]\ZXVTQOMKJHGGFJHGGFGHIJKMOQSUXZ\]^^\[ZWUROMLJIGGFJIGGFGHIJLNORUWY[\]^_^]\ZXUSQNMJIHGGFFJIGGFGHJKMOQSUWZ\]^^]\[YWTROMKJHGGFKJHGGFFGHIJLMORUWY[\]^^]\ZWURPNLJIGGFLJHGGFGHJKMOQSVXZ\]^^]\ZXVSQOMJIHGGFFLJIHGGFFGIJLMORUWZ[\^^\[YWUROMKJHGGFMKIHGGFFGHJKMORTVYZ\]^_^]\ZWUROMLJIGGFMLJIGGFGHIJLNPSUXZ\]^_^]\ZXUSPNLJIGGFNMJIHGGFFGHJLMORUWZ[\^_^]\ZXVSQOMJIHGGFFOMKJHGGFFGHIKMORTWY[\]^^\[YWTQOMJIHGGFFOMKJIGGFGIJLNQSVXZ\]^^\[YWTROMKJHGGFFPNLJIHGGFFGHJLMPRUWZ\]^^][ZWUROMKJHGGFFQOMJIHGGFGHJKMORUWZ[\^^]\ZWUROMKJHGGFFROMKJHGGFGHJKMOQTWY[\]^^]\ZWURPMLJIGGFFROMKJHGGFGIJMOQSVXZ\]^^]\ZXUSPNLJIHGGFFRPMKJHGGFGIJLNPSUXZ\]^^]\ZXVTQNMJIHGGFFRPMKJIGGFGIJLMPRUWZ\]^^]\[YWTQOMJJHGGFFRPMLJIGGFGHJKMORUWZ\]^^\[ZWUROMKJHGGFtj_TJFFGHJKMORUWZ[\^^]\ZWUROMKJIGGFٮ|wrnjea\WSOKHIKLORTWY[[\[[YXYYZ[]^`behknqty񰬧Q3  ?71 () v󞝛⠟򞝛蝛򞝜㔕䖗򓔔敗񒓔䔕𑒒╖󓔔ӝ󓔔垝𞝜杛񟞞垝򟞞󟞞󓔔󒓓򓔔󒓔򓔕󔕖򓔔󒓓򓔔מ󞝜ꔕ󞝜󒓓擔擔擔哔哔哔哔哔擔 擔 ꞝ  "󔚟-840 +&&/=WXZ[\]^^]\\ZYWUSQOMLJIHHIJLMORUWY[\]^^]\[YWUROMLJIGGFUWXZ[\]^^]\\ZXWURQOMKJIHHIJKMOQTVXZ\]^^]\ZWUSQOMKJHGGFRUWXZ[\]^^]\\ZXWURPNMKJIHHJLNPRUWZ\]^^]\[YWUROMLJIHGGFQRUVXZ[\]^^_^]\[ZXVTROMLJJIHHIJKMORUWY[\]^^]\ZWUSQOMKJIGGFOQRUVXZ[\]^^]\[ZWUSQOMKJIHHIJKMOQSVXZ\]^^]\[YWURPNLJJHGGFMOQRUVXZ[\]^^]\ZYWURPNMKJIIJLNPRUWZ[\^^]\ZXVTROMLJIHGGFLMOPRUVWZ[\]^^\ZXVTROMLJJIIJKMORTVXZ\]^_^^\[ZWUSQOMKJIHGGFJLMOPRUVXZ[\]^^]\[ZWUSQOMKJIIJLNPRUWZ[\]^_^]\ZYWURPNMKJIHGGFIJLMOPRUVXZ[\]^^]\ZYWURONLJJIIJKMORTVXZ\]^__^]\ZXVTRONMKJHGGHJJLMOPRUWXZ\\]^^]\\ZWUSQOMKJIIJMNPRUWY[\^^_^^\[ZWUTROMLJIHGGHIJLMOQRUWYZ\]^^]\[YWUROMLJIIJKMOQTVXZ\]^__^]\[YWUSQOMLJIHGGHIJLMOQSUWY[\]^^\ZXUSQOMJJIHIJJLNPRUWYZ\]^__^]\ZYWUSQOMKJIHGGHJJLMORTVXZ\\^^]\ZYWTROMKJIHHIJKMOQSUWZ\\^__^]\ZYWURPOMKJIGGHJJLNPRUWYZ\]^^\[ZWURPNLJIHHIIJLMORTVXZ\]^__^\[ZXVTRPNMKJHFGGHIJKMOQSUWZ[\]^^]\ZXVSQOMJJIHHIJKMNPRUWZ[\^__^\[ZXVTRONLJIFFGGHIJLMORTWYZ\]^^]\[YWTROMKJIHHIJKMOQTVXZ\]^__]\[ZWUSQOMKJFFGHJJMNQSUWZ\\^^]\ZWURPNLJIHHIJLNPRUWY[\]__^]\ZYWURPNMJFFGIJLMORUWY[\]^^]\ZXVTQOMKJHHGHIJKMOQSUWZ[\^__^]\ZXVTROMLFFGHJKMOQTVXZ\]^^]\[YWUROMKJIHGGHIJLMORTVXZ\]^__^\[ZWUSQOMFFGIJLNPRUWZ[\]^^]\ZWURPMLJIHGGHHJKMNPRUWYZ\]^__]\ZYWUROMFFGHJKMORTWY[\]^^]\ZXVSQNMJIHGGHIJKMOQSUWY[\]^__^\\ZWUSPNFFGHIJMNQSVXZ\]^^]\[YWTROMKJHGGHIJLMORTVWZ[\]__]\ZXVTQOFFGIJLMPRUWZ\\^^\[ZWUROMKJHGGHJJLNPRTVXZ[\^__^\[YWUROFFGHJKMORTWY[\]^^]\ZWURPNLJIGGHIJKMNPRTWXZ\]^__^]\ZWUROFFGHIJMOQSVXZ\]^^]\ZXVSPNLJIHGGHIJKMOQRUWY[\]^_^]\ZXUSPFFGIJLNPRUXZ\]]^]\ZYVTQOMJIHGGHIJLMOQTVXZ\]^^]\ZXVSPFFGHJKMORUWZ[\]^]\[YWTQOMJIHGGFGGHIKLNORUWY[\]^^]\ZYVSQFFGHJKMORUWY[\]^]\[YWTROMKJHGGFFGGHJKMOQTVXZ\]^^]\ZYVTQFFGHIJMOQTWYZ\]^]\[ZWUROMKJHGGFFGHJJMNPSUWZ\\^^]\ZYVTQFFGHIJLNPSVXZ\]^]\[ZWUROMKJHGGFFGIJLMORUWZ[\]]\ZYVTQFFGIJLNPSVXZ\]]\[ZWUROMKJHGGFFGIJKMORUWZ[\]]\ZYVTQFFGHJLNPSUXZ\]]\ZXURPNLJHGGFFGHJKMORUWYZ\]]\ZYVTQFFGHJKMORUWZ\]^^]\ZXURPNLJIGGFFGHIJLOQTVYZ\]]\ZYVTQFFGHJKMORUWZ\]^^]\ZYVSQNLJIHGGFFGHIJLNQTVYZ\]]\ZYVTQFFGHJKMORUWZ\]^^]\[YVTQOMJIHGGFFGHIJLNQTVYZ\]]\ZYVTQFFGHJKMORUWZ\]^^]\[ZWTROMKJHGGFFGHIJLNQTVYZ\]]\ZYVTQFFGHJKMORUWZ\]^^\ZWUROMKJHGGFGIJLNQTVYZ\]]\ZYVTQFFGHJKMORUWZ\]^_^]\ZWUSPMLJIGGFGIJLNQTVYZ\]]\ZYVTQFFGHJKMORUWZ\]^_^]\ZXUSPNLJIGGFGIJLNQTVYZ\]]\ZYVTQFFGHJKMORUWZ\]^__^\[YVTQNMJIGGFGIJLNQTVYZ\]]\ZYVTQFFGHJKMORUWZ\]^__^\[YVTQOMJIHGGFGIJLNQTVYZ\]]\ZYVTQFFGHJKMORUWZ\]^__^\[YWTROMJIHGGFGIJLNQTVYZ\]]\ZYVTQFFGHJKMORUWZ\]^__^\[YWUROMJIHGGFGIJLNQTVYZ\]]\ZYVTQFFGHJKMORUWZ\]^__^\[YWTROMJIHGGFGIJLNQTVYZ\]]\ZYVTQFFGHJKMORUWZ\]^__^\[YVTQOMJIHGGFGIJLNQTVYZ\]]\Z\ftFFGHJKMORUWZ\]^_^^\ZXVTQNMJIGGFGIJLNQTVYZerFGHJKMORUWZ\]^_^]\ZXUSPNLJIGGFGIKVcqFGHJKMORUWZ\\^^]\ZWURPMLJIGKXbnzFGHJKMORUWZ[\^^\[Z`goxFGHJKMORYcnu}"FKT^hp{-840+ %&/=<<;:9855421/ . , * ) ' $ "      !%()'&%%#"   !!"$%''㓔!㓔!⒓!䓔"⒓!䓔"㒓"哔"䓔"""󞝜    ʓ󞝜 ӔӔ󞝛۔󞝜󞝛𞝜󜛚󞝜󓔕         󖕔     !"#$&' FGHIJLMORTVXZ\]^_^]\[YWUROMKJIGGFGHJJLNPRUWZ[\^__^]\ZWUSPNLJIHGGFFGIJKMORTVXZ\]^_^]\ZYWTQOMKJHGGFFGHIJLNPRUWZ\]^__^\[ZWUROMKJIGGFGIJKMORUWY[\^^_^]\ZXUSPNLJIHGGFFGHIJMNQSUXZ\]^_^^\ZYVTQOMJIHGGFGIJLMORUWZ[\^__^\[ZWUROMKJHGGFGHJKMORTVY[\]^_^]\ZWURPNLJIGG FGHIJLNPSUXZ\]^_^]\ZXVSPNLJIHGGF FGFFGHJKMORUWZ[\^^]\[YWTQOMJIHGGF FGFGHIKMOQTVYZ\]^^\[ZWUROMKJHGG FGFGIJLNPSUWZ\]^^]\ZWURPNLJIGG FGFGHJKMORUWY[\^^]\ZXVSQNLJIHGGF FGFGHJKMOQTVYZ\]^^]\[YWTROMKJHGGF FHGGFGIJLNPSUXZ\]^^\[ZWUROMKJHGG FSIHGGFFGHJKMORUWZ[\^^]\ZWUSPNLJIGG FSJHGGFGHJKMORTWY[\]^^]\ZXVSQNLJIHGGFFRJIHGGFGHIJLNQSVXZ\]^^]\[YWTROMKIHGGFFQKJHGGFGIJLMPRUWZ\]^^\[ZWUROMKJHGGFFQKJIGGFGHJKMORUWY[\]^^]\ZWUSPNLJIHGGFFSLJIHGGFGHIJMOQTVY[\]^^]\ZXVTQOMJIHGGFF_MKJHGGFGHIJLNPSUXZ\]^^\[YWUROMKJHGGFnMKJHGGFGHJLMORUWZ\]^^]\ZWURPNLJIHGGFFNLJHGGFGHJKMORTWY[\]^^]\ZXVTQOMKJHGGMNLJIHGGFFGHIJMOQSVXZ\]^^]\[YWUROMLJIGbNLJIHGGFFGIJLNPRUWZ\]^^]\ZXUSQNMJLOLJIHGGFFGHJKMORUWY[\]^^]\ZYWTROM^OMJIHGGFFGHIJMOQTVXZ\]^^][ZWUSQ}OMJIHGGFFGIJLNPRUWZ[\^^]\ZYVgOMJIHGGFFGHJKMORTWYZ\]^^\[cOMJIHGGFFGHIJMNQSUXZ\]^^aOMJIHGGFFGIJLMORUWY[\]^|OMJIHGGFFGHJKMOQSVXZ^zOMJIHGGFFGHIJLNPRU^ OMJIHGGFFGHJKMOa OMJIHGGFFGHIKi OMJIHGGFFGHd OMJIHGGFFGc  OMJIHGGF FGc  OMJIHGGF FLg OMJIHGGFFKe OMJIHGGFFJdOMJIHGGRh OMXl     !"#$&'<;;[:: 9-9k8765-4B4\3y 2 1 0 / . --,9+9*9)9(9':&:%:$9#8"6!5 4/%  !"#v$d&<'             h         hF FQFMF FI FI FG Fu F] FW FV FV FU T hQC  *   *  1  "   t@h 2 2 .--+(%$$" "$&(*-/ 1 469< 2 0 /--)'%&!  "$&(*-/ 1 469< ed2d 2d ced.dcd-ded+ded)dfd(d(d&d$d"dedd ecdd"cedd$cdd&d(ecdd*add-cdd/fd d1hd d4 d6fdedd9cedd<dcd 1 J/ .,#*<([&%#%!%  "$&( i*>-/ b 18 4u6)9;< R @<:72 0,(!"', 17=:72 /+*$"',1 7=@ded=decd9dced6dced3d cd0d.d*dc$dfddedd"bedcdd'ecedd,bdd1bcdecdd7ecdecdd=ec@i;P894&{1 D-?) ;%D;u";x'?~,D 12_72_<: 4/+& $+2 ;A<4 ,!" 50 ,'!"(/7Ѩ?=6 ,)" diz5dfv0 dgx+dgy&dhz!deq!deq'deq/diu7dkxd@ded$ʫqXB0 ƹyof]UMF?81+%&?60&!,<:98541 0 .*'&# #&* . 27};º3Ž* !þ ½&þ1|=;97541 1 -+)%$  $&* .37};2|ndd*{qfd d!wmedd}sidd {skd&d|tled1dedded:de9dc8d5dcd4dc1dcd 0db .d+dc(de&df"dcfdcddde dc#d'dce*de. db2def7d~>:H986C5~30{ .H +#)d &|#) 68n K#t-&l)* d$.֊I2фE7}() * +./ / 0 3 34679: =µ( ¶** + -/ / 0 2 34779: >{fe( }hdd*lddf*}kd dh+whd d.de.d0 deh0 de2 db3df4dc6df7dc9dci:dc =() *+r- 9. / 0 U23h46|7 9M: =iiii  BB!! New Layer#1      ?ڟګڷՏ՟կտ/?O_o֏ֿ֟֯/?O_o׏ןׯ׿/?O_o؏؟دؿ/?O_oُٟٯٿ/?O_oڏiiii  BB!!clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/000077500000000000000000000000001260417502300214135ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/000077500000000000000000000000001260417502300221725ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/application-exit.png000066400000000000000000000021561260417502300261560ustar00rootroot00000000000000PNG  IHDRĴl; pHYsϐtIME  ҡabKGDIDATxڵ_hUƿgfw6ِ MIMI`#DHE҆C4(J+bOyRԧXi(H$&6knSEnٝٹ3lZ"ss࿨ B W sv{קzT6˃w{ ܿ{|<%A-/M]]pDV?=! N=oU.ߔceiT_F&sg1t]@ϝ=9^X;hLm{$wc!N$0}IN\K /"n*WHP`EJK>]4nm*;KtקtW{*cUBe™3i kc[o/ e$zzyR(RC^ ։VASbQº:1 ٮnܔ\>BuVV079u9ľz0w}7wbaJ-%?ʭ<ϡlw$k#f!j$O=Ͽ 2@'2qzҳ֑=O\XQx}dbZ_ĥp.J)!bUć)<UwX)t 딤-'{V D IK^ 1H e} Bzu7P|8@#F߄Ik3l`368Sŷ $Mt#0'FАY$uᣨ} |?'fEgBR?B<Qk8}5h4 4~iIFxeNu{d:`lS4(=H$557߂Jb ~L#eWKpK6 (:@8e:>53owk/…$Y~0#8+cPbA gs(@/ bF "V [SXr}{ۣ/&"0 J I#,=@Iә2 j<Xf<) fy56؅'>Z?(!3*?lIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/applications-internet.png000066400000000000000000000025131260417502300272150ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڍ]lSeƟQvk;֎C )"7*@41&rÍ{/vc"7xgBC B eu@vv]{N뿋[‡'yO/'S0V㟵Yq?$NeD$>X'2q|,7\~-'t0֦ <)\RDt>ꎃ42? g ݝLvD!)2,^@(רh"unv >-Ѕ>|=+,@V(HtWvvQ7޺>w7?^kxā $y%BPdf Œy9ʚQ7iao6*K ?CoO*1Î$Llpakw`>܅֡=Keΰa{|FZ\~SQ/U8>ffpz4c6)uYQ*̹Aו%/wѿ 6P:栂be^O؆JrYz8[\WTW K*8PQ<\7Pl IYnff{c[B8w=l[骃.BxܫRB8"fW1wctsc}5]±kvts_ġ퉥y*R#y ]o* A}WfOI٩J VX A.1xĝ;&p?a \28kҒF`8OkZ8[pmDJIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/audio-card.png000066400000000000000000000020331260417502300247060ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<IDATxڭKhE?3f&i٤XT cE0EEDTГ'oJ= ڋVŢ=A[jѶjCIuj>!fˏo1QTaG^{w=Y͖l2b`3}}}] UJc Q$x}KzK. N0hֈd8EUKf'R3eey5Kkoٻi R$:`C|_pxG{֍j9ՙG_8DS"A<! rcPH͝i/}\^+9\{ Y83>ݐu3a7H \MX’RnL5[X#%$:l%~_)ߚM-=>XیC]4Nj­bcg3V:2ŭ#$9ʴ׶04MԷaZ%=XX\|M,TG9a?/驓x äz6הϦYيn_";3_z{_e϶{`7`V!l &}¶#q|Y2NP\.S{QXCK]hR11Of@Pvvt8Ͼ62z )8Kv jdV͕8;Y0U%r/ mV#rxSΎ3JTn`QwnnO<_r/<^0JYw-;!tr~.pHĥz"NP K)V_>s2L 5wM2?;Ntw<<"hS'0#Sc? 9{P(1`0N^ @|e= (V.{%\QٜV̺+αIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/audio-headphones.png000066400000000000000000000013261260417502300261170ustar00rootroot00000000000000PNG  IHDRĴl;IDATxڵU_HQSft[+7Vh EKV-̵ԩ)g509/уz&>h21#*zv:a .~{w9A$U*S@タ0 ?kBdRv Z,g 8q,.HZ0WLQ_(|$),Uy_ LGFCG11&mNo#jN8PP@`m'uGEEOr"/]&3ܝ!h4r1@ }_y{PG 0 vo;8@x3!/>=Lkkw+ªsjf5!JEN&.|q!d pBoC:}_gLßN'LMMR&FbXv庡;C`Z-l`~]ʕB8 D*jlj.W_QUI~?AY `4~ndd( @?MrFEEEeNFeD tNc5&~+Zߊ E`@V?G_Fx`9U<~CjoЊsf387%IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/audio-headset.png000066400000000000000000000013461260417502300254200ustar00rootroot00000000000000PNG  IHDRĴl;IDATxڥ_HSQW綾jѽMGꦬz4Mdot!{Zn]VÚ\Cr$LRCp }(菉 HO?=;/|عssR`0 ނx nRVIhY@H`cK_Q=`D+F'%`6*KAoWZ,_bV{*.E\ =wspkЌ#|uFvġCcI+~ڎX>Ƥ?FW~vttmGֶ}yߔ-tYYq\qFFƗLn?1;3&c |ڔ$` Q)&Xh|=1>1|t84 e&NxfiiѾoxyjRGhJqM' D[[ϯ#VQC)6U7FGGIMM #?s:Nٙ*d.+0bE B@Jqoq+'fK3(bAp 8qQ)oiJz=k)WVVFNصc7_^^h2(C>f3e"'  LLo ڬTQ@΁便c"K/\-=:IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/configure.png000066400000000000000000000020241260417502300246570ustar00rootroot00000000000000PNG  IHDRĴl;sRGBbKGD pHYs^tIME2-IDAT8˥TkLg. P tfȊEvJ%C U*E-*HQcD`+ f)X5^" }<5R8ɓ99y^d׭5 xql$C.|vG6ӊ+W6O׎ [ZrDD,\" ^n'&54E?FF":OGtܼmO5/J`mGr/WXSG10CCCQ[8y=H9s¬+b/_19r441Hu~A%~؍ꛙs+* fX~τ찬]hJ/- LϞ=PdՉ%^e~X6X"n`gxooom%}t+9/ G||<6QaLJn_̈E  ą&l&Ȩ!0(!?P Zu{-1T\?$zJ>n.7-_Ж##k?bW@pH2DD^7+t[,)1+%۶l<98*: .9jin+ޠ댍i,W'Nݍ3E|>͜dUT7oJAE.MUrK4NpeLZ )KUDwHg5Gh>k,o<]qy ^:#3YIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/dialog-ok-apply.png000066400000000000000000000014321260417502300256710ustar00rootroot00000000000000PNG  IHDRj sBITOPLTE@3UM]I\\VURPMRMFE$w$D i ghk]X U h K l H D G ry wz{~~m y PN61;1&{0X2x%7y*>n)Bz2Cl*K{:@ DFm+IJq*JKN!Q!R#SWY9]-_D`<`DabDcEeIeNeSf9f=gSgShMiSj-jKkImbnbo;obpYpcqVq/tWw_wSxqx0z>zrze~NtZUV‚h_erǃuh:kW͑sqsvpБ~|φφࢮږ^8tRNS $';EKS]cnx}Y pHYsaa0UtEXtSoftwarewww.inkscape.org<IDATc`PeljDehhiiֆD 4zM}ee'( Yʋrj %E ̪iUF<>L鱑ƼP\<BLKyeT$y#K&"DŽrvfhPtJRj0f`0*)6C0#IŹ@IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/dialog-warning.png000066400000000000000000000015071260417502300256050ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<IDATxŔMhU33'Mon(ɭ%A%VvEѤ;n,B]t[ .\.;]R.E*7n.VOrs`ImiR|f3Œ*#u-&6%žצg&i+\ /%mj瞪С=nB|eaַe>;}F>f9+sw-c{lyΩ:dձ|3.cw'>#{GC>Ljt0y)y|`&ЇX.f̵kX66|xg⓲㶾ˌvtb ^{>iq2G\QAz 3AB#м$R^|М&Eu@!X߃591+yOn-cnU0`j3B\L=;BWUigm>hAa⡄bu {>ZH?;>!. q)"\xŷh$żD@,:^w@W״>=L <,\J9wi7Nδ ?!1#M,UZnS\_ Hs Yϕ|7ջ5%)roE;b'GosOpm_NFj9xn<I٥Gr1(B̒^%*IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/document-new.png000066400000000000000000000015511260417502300253070ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڕk` uXv*  "d/QAt? VwUP:h=̥6ٮi/n{ǛᗗjBփvO {_$$ZDKn!7ma=d7Iah@Z8@;}  ] ]?S<,Ick@w&{S=uy"LN<=A#=g!$_5&'2.W\~>3 G?G"C.|{ٲQ(N _s8|$/@W]R-'UHa~74Xףk8omoUѽ&r(ʶk{ چ4"Sw5 "Tj+Pmq=yo' Nw"~w>!vI)lvBЀfwV&wSeuiv;,˒."t%#7 #̂n¾I,// aT*NժNԱs}||G}kڧlW(PxzҼvL6MM4KDtr98xB<~"7ZlŋRtmA K"hr$)~J+$bp^Og8{di.^;ȡ9`8{['j$Tھݹ'N`Ǐ %r(GkSf8k22Reyq=t6a=~훟͓,Mɿ{ N{^y?rB];S+47i%2 <܉JeWH')PBx&i$Yް+kl0r~ur2#Ոٹ%Z1`+ی`pIm'9Pk`!aοڼ4jo0{c1QM^^eOYeP'w !htVgPط"E`e39VO)ŞxtU F1 d\ISuQ㬄<* !FXۜ[h;+0ܥAq({Ka^0(:AL dGƭ|Օ"kT(A@QD XkAPGU|9}{nTAU5 XPUm"ODjco7]]Q1;4 3u-{Q-[ MD޵Tފ ܡkEUAkꆱ po05LM w|ro y0"}ZcEFFFv*ϢaB>ĴPU~iEkr"zTXtSoftwarex+//.NN,H/J6XS\IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/document-open.png000066400000000000000000000014341260417502300254570ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڵjAS6DР(AV\$H|"t% DшD$LgRt:3ATMM}]d!y)LVEB. ...-͆"9JL{F9.TN ~0N:1}4|ϓo@UU̬p@8pn\9 A]ںrgo>|rZ ̻(2TZ~X?TQ| cJs g:-%F)}>:qg2] ߑ}:`[:'Tkl2tC)hXk Pڕ|gr|sY&O Z"P_, uJinsO˩=5<FZ7ȶzcu#FL7 5\lАR4(n 6W560v$t# 0 oŠ^pJ=(dDF`E2g" wWT| 5ï?;S0 V$`!'nMBtf͆QG(\eY^lw1Z ou"fتghꭼ<}D0#WM;JW/pj]{8tg{8xK/qTyIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/document-save.png000066400000000000000000000014361260417502300254560ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڵ]kAMo&闔ŏkZ?oMAH?@HHJAkۚݝYa Bp朰s}lvyP׮oGQ4>lLZRJ[hig2YJ3NR`st>6>uqݼ09R(DBsA8p<\C097Y+$ƱEKM,qsѕ)d2'qXc:`fI`ݚոڗCqjQ8ma8{ʂ5'wt BPi>9ɍ S;~v\4ĹaV:r#dd̰\fw0:[dp}@VQl4?O!0T8) C<}iZًr^z{{%~!"8ȢvaCpN@XX z S pnh_o4us1c~"IIQQs[,fjoLv}/3 [ kʃHyoRO58@~;Bb4T[woN 7Ssx*0o_b 'વeh5J|y$ΞG`&c9Sy NVlj~\QilЄpGB*pUZ1*GT)O &Q̋g<@kOޯE MJ&y](Hr?䌜/E(*V}g;56HbqG`d(hGg{Ɍ"`Y5 5r8,Ӛ8Ѻ؂3V.-^hҸ ,D$ WChX¯=#+ C3YM .2cw>/A@Nۦ)UWLdLTt.~?jk,0 'I>V_tD"'Zr3B{6AnӤV-T$R5|"I_ZBHqvz0Jua}ɼBd̏?M[[@H8q|4oi@)d:Ұ q`ʴ,811:T3He)d%v`hv3W_R]ö£$Zǒf+RXV_:Lfp h0F<2)]{6wĹ0_ZhtN\yWT$Eo>յXRi,D Y{~"hQ*̼\oK/v~sm#gH!ܱ҆^]5hBZ6>Q,v Ým?lgxGtiiДIP-qzi(#ŮcDVR=:э'P:P%嫬OIΧHDmނ`?$Tq+`ԅ3'I?3AZIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/drive-removable-media-usb-pendrive.png000066400000000000000000000014461260417502300314460ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<IDATxڭjQƿ{g&4&-hhJ._@(؍yP\RA .vQL7I6f&Lff ~ppp1HsssRbadCX,_(>E8.:];/8 '|2J4-4] _Bf2w/1y~<;;{Qi+++>zhZ^ʛ#޳t>J.-ݿ)rLg^{>>eQx"5?|6 q1&_P" *GE.z3CGEmOV԰EQ^p,ڷrÂ}ky>R ad$zMCCJЪ = k [msvDWccB(c81pt`y^pT"6 9ӶA) rJ(8岟{<Ci[;NNY~}p(^cx0VNdUnܽ9zzSSL#0Mn]QǢY̷oκЍ3 ѷŬÛ˕[o4a h6/ٛ 7I^X(dCZƲm۟ %$$IBTjp|<(IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/edit-clear-list.png000066400000000000000000000023471260417502300256700ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<dIDATxڭUKoUU]qQKbEܒTbb00IH``&80ijH 0hZCh)9gK۱q߬}ξ{(fEoSwq}F&HqՇQ0$ZhWAy#82Z'/`Y{xCR rAIY6ܠ +t T"h$ TgFޭ"`tB9íf^0$%F&UgT\sajHHZGҬ EX 8`{5_V{O x;@%2\RV;e=+B`'r?I0؈:N! ,JaO!w$U1_5^s }6,ǖȳll6±1"my=>V*% -xFBIbD @YQ VWa -[_N-F;W5҈twWX[C~nq&l㘝~&1<0Wliq% Gb39ޝ;h^ pT F1zꉽOV[eC1InC]<צGt69'GRn_B,~_l^9mHCTb֬`JDp#&Ξ& 6 $_U @%T 71ABԽt {NFy/CݟFlv{Ul.;5L4Ob n@r򤟯1qT}_HJE5$o|"H Ji*_>b ERwy'Now+"{377WקIh4.,,,^W֏,7O%T@]H!D(*!&6_&=:RIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/edit-clear-locationbar-ltr.png000066400000000000000000000023531260417502300300060ustar00rootroot00000000000000PNG  IHDRĴl; pHYs7\7\ǤbKGD]IDATxUKL[Go @i,RVH-AjUV%HXB4jla%]A!$26v 5R<3ss}ح^ɡҒR HUU1 t]'M$\K%} ɜCgey%;铎k07fZXXPvwv UPp"qwul}ݓh4qS*NLӼ@9Z,J<7tM }sNm_ޮ<==5  )8'ƸSwYt "A$%5C@DwTڨayruuWx2W}W?kDp8Ll``@NMqSSP(DoܸYڼ5::j ~L&3وsrr.shh)v566%V]]-6j"ozR&$sb׏-ƬV+99H9P,q˥9XCHx߲vA*̓5n2#!0B~rrxމFRԏ,1vQuMA8Hnccc4==M@cid\Mi6B4I. Ȉ{{{  &X=>> ٥=|z]9H82 y}}w:tN3339:}3.LEOpԫv9dIb( }>}keH$Gcާ PsS3cUy!&xEJJJ/T ꘨p$LbTL&Y G***"($Q5&8乔|\udxSz_vJJ Ro@(6x.A` gTF20}"zTXtSoftwarex+//.NN,H/J6XS\IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/edit-copy.png000066400000000000000000000010031260417502300245670ustar00rootroot00000000000000PNG  IHDRj sBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<PLTE%%$&&&(((ĮWvtRNS$'017LMeevW9%IDATx]A! D; W|ݺEI>JX< zٿ 6C0s$ftJb`{fi v//F٫/Ds!UՍ4`Ҽ8j\(l+P7>v yhũL0o{͑WxR/)E}JIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/edit-delete.png000066400000000000000000000020361260417502300250660ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDAT8OYHTa;-CDCDPA/hETEB $AJ)mkF-hX̝3c 38wps~|w׊2YQj3rߥ`D1hR'Tsm>cnLaüZQ; CQׁVt%h1,$~߻Pe^m\G-]y-[ /iIIz)\_:8'(GժT--AwAb/X8VXQbA_ujG{0e)/`Bݾ]Vs2gfcu.wlVŊ 0<2ϞF=J!u&$}h0h Le%BG+twhܵBugfx6d aGLx-OGlބ5в-] |垻xfRctǧikׯCPh/Ǐc89ٛ#|ukBΛ07`+GWr aI(jܹp bf66>>AAAD GGGIIIK( N( RD9RRRTTTUUUX(YVT]]]_<"`-`?%dH0fbagREic`l4ooopVFtG!w8xDxxx{]C|A |eP`4b9c:rKyUgFtRNS #'.3CYfaڴ*IDATxڵMR0F$m!H-Pʀٸrƅ'p9qԊEhJ6:зo=DeZZ>duؠY鯆ӶaFշ6zBT?SmN( vxTzp*˥Ȼo$uS=ұq]/9)>Q}=x|YO]O&do+3FL+[+r:esT-;L?UvE3`,XLsC!]# fh| isƷtj2B-6_29, IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/edit-redo.png000066400000000000000000000023351260417502300245570ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<ZIDATxڵk\Uǿw&L&GټZhE+VBPх΍_Tp!pP(RRE6&ih$޹Ð6pq؉>񘒹R]~sfyx'Љx8܄0I\ҋwroI)9 z![Oaݡ"z"0.SuX.azX& '{w N ONT; v !lm XMhDkwǞD\;~D#8`@B TiKqվz]UV dPHA`|2 7aHP@jt4ّHD) lVAF97P/bhM ef ~T?;FU*WtTX$EETP_eM\b֕Rp;Q JFIxG.\.P2U8~] o+>S&"}`H~XȤحmSqip؃dp<Iԕ ZyAUg# yH6O~[;4"WZ_^5"oA)BC4uaΝ l*A[vT "(% k:/#PQ\zV`|Imh"ճeak({bÖ}7X ԬόR:CBK9Cq) kJ$ WVh#Qb!r وlahWCW;6IW Tp[Y0p"c<7n) d}:|8 #9G+qռR'x[e͎=EX'LFib2_/EJZI fM#sqp476fNc&BJA*'CG- Ȃ$qY [Z[JvWámK';"aUGp&DU*l| aUO r[ :EM7n'AA!ʵۋ~>p#2FZARyUxRX=9An~"@IئtuͼV*s[٤tdl0?.ԁOmGG yIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/enterprise.png000066400000000000000000000015611260417502300250630ustar00rootroot00000000000000PNG  IHDRĴl;bKGD pHYs  tIME"vIDAT8˭TKlLQcnj1vYH\ou}rw~z{{_@$]e4^Xuuu]g۷n:WYɰLCdBA[N 5{^!YBUU095@g{ |nce ͔PU~AdkRA ޣ!MJl}g[c.9h:ٶd>_L t[ON񌬰62~z2{ЗkP Q~3x/嘩UQ`9ҾOf|3MX rQ&Ԫޠmn-( wղ@$+ qL kLSΛfޛwow&fGp8sť5b M#Ŋ?MݾPTn/i#c?WGWjq@*N:{6D-!l _83- -/f3M@H\Oy`\$jM,>y4AY٥+8zz#!ApxȲd%490ATK%֙C BcAgb)a!e,`գoBce\'>*`rk 4;Q1P[&s|))1j0 BSRHn,#+<ϥ` Sf<J b;SvFX'5i@fMŃum:KsBrC9rY|I!| Y7WbCN0:)|FB{saܙ@|NlZW*K@WRK 0|d_͇yD|H>l?HWxهQ5CL=J <D'7|mX#4*3]+TT |cPIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/folder.png000066400000000000000000000010341260417502300241510ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATx?jUA9̝G$h 6. e`o+]vFzhyy7/8$(Rq̽ >1Fpz/X> ;>&x7Oߘ.ڿ{;!58<~+|+^yw[tøcH&WO5[̀24FнxK0_h `}$S{*RYΦV6d$xi\c) lJr̻ e0)r+Be`*Mٔj1' ٔ`Vbe8 PKn`a.ޱKXq)<yM4 U`\nnGN4Otf7m6i.<՝@Tꦬ 'ONo IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/go-down.png000066400000000000000000000015741260417502300242610ustar00rootroot00000000000000PNG  IHDRĴl;bKGD pHYs cytIME N  IDATxՒ aǿmeעFDjrK yEJI?wⅴ/v%B["bWa-\֞93gyƳXy37ԧ|gA0 ^{Ӣ R*hܴ ״{J `$/w#ۇlT@(ҰL ĉd cAӊ.dbb6Q(T;.EEBS^تh(?xM$~a(c$|.7}ћ|.HF? j0XNi 8<3.1~q!{8v*A\t^=WCӑv?^дk +7/!q`Dfd͞U=v@oQ9h 1@DO7L3 )K Y?c'jy2tIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/go-home.png000066400000000000000000000016471260417502300242430ustar00rootroot00000000000000PNG  IHDRj sBITOPLTE5<>FJJ.4628848:6<<6<>8>>;=?;;=;>@>UWVVYX9<;:=<).0-23.34/5604416747749:5996986<==;7AEDI`LKGN&NQNX+XVPYa[[V[\\[]\]^^]d]j^``ccccdceffeggfffghhgkih3hhbijflolqsqxysxzuy{q}u>y|DFIw?MMN}DRHJSb PRY[^ahgK x0tRNS ||#vv pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATc` LE%l jJrڮ6R5u>ZUH’ezM-a n h + [x7AY LX4"L3 vA0HXJu$0YX (,ه"fGMIMMbfDA˚ߗ35/*;%77wJRII攢ܢ)PḾ¶¾⾢8p”)iy`FT8쀔l0#* rns' vrr 7;k|L̬l\<|<ܜl,L r$n IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/go-jump.png000066400000000000000000000010461260417502300242570ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<IDAT8c?-07x-]]U Lrsݒ32 )6ƍGRKWn螐_Xښ<5-T|b򱨨PN |U;2 ڲrWeOH~?44|pf z5 ;;5s 33ss +6E @ u忥%'ũ"22& h__8Õ-22'8$)68!!A52*f9H_Z  |s^CC6Mtp* &//? oU vuu&$$_^^vU wqqJ1 & fbV f >A9XX À8m5X%j1#zXIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/go-next.png000066400000000000000000000016541260417502300242670ustar00rootroot00000000000000PNG  IHDRĴl;bKGD pHYs cytIME /9IDATxݔohVUǿ}={ 4*(i$6E %T,|")Bd( ^:TЬ)D)ksϞ{ۓ=̦"}/ps3t\o_'܇`,Z_/'=O]7uS׷ ^W4It1>.Q K^7mhX{-J=_@b,KF1t!O.\x㶯ZUel") iUE %;fLfsa7~GԼ]q]@*l k [kћ1rlnͷ%|GE&H<Ц^?l{[^GNˢq9p] !Pk!]B> cwy6켲D ߲D ? U$]"V #?([au|ԱH [0B@?gᆫrG/;aD:p4#-{Mr{hfD,ݺȾ\lo(:q4} ]ge֟޼AIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/go-previous.png000066400000000000000000000016131260417502300251600ustar00rootroot00000000000000PNG  IHDRĴl;bKGD pHYs cytIME 4$z,IDATxݓIhA_UwLY-&* x4ADA<EozS8B\.ndzz;&*z5 _S7_XZ1nJSɋ-UN4ͮntu/ 5"(7ͪ]c]Υo*ҚaWϮi;s͌xق'Əl^5V A0,fQ1oA bТ?nT%,^~h۪z(܂E^c!K D)h$P>}'h7gTvضB.IDATxڽKhWƿg#6ƤZk#j!bP؊sUw*`Ůtn( Zq. .Y`T|{wfΜ(<(f9s~3uKELSPc0R?w8ZE_]һx^9iH` 9rjX[KwWqƬ7[p,v~ˆeZCEd\~z΋YMXQTSGAkv!{>-ҤcqUQ1j,,>Վͨw?d++c8PFUnOL8p`a#PAF~g&=_86%uq6H %%f4BCH ^j_-4"|Y*)H$,$L6 €=`70Cs%kS҂@6Aڐ c #q(huḿ$9՜0PtDF#ҀpH ı$N_b<vVJΕފ'&q`Q KʄKS5gIAzM(G_/%݉}nG~&,0DCZyh}63jBpV abow~/~pO%N &MIG/x$$a)F9@Bf6&9A8{&<فAE׃ \?߄DY{xW N˯u׈a ABA(kg_wJHIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/help-about.png000066400000000000000000000020211260417502300247330ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<IDATxڵkTWǿ;g"8M!VZL!n,%-H@.7jB˺&iTږt#13I̼̼NaHCw{>ν13v2_( rh9]1eg27] v'",,:X-wR?ɫ{ p3q=9e(n,8| qK|qtc[0ΑG A6W$'l3S9߸~_oTE/ w @X_ć#LE+0VVܛ ᴁNv.cQyZ9>Qa,}4_Ve;,%[.ק|#(MlgWmc:sk_&O@Fhhy"QՔeu??<`T'|!Wك2C= ?=Jxz _(@ /ׁ.R1F: ,ӳ0z^g E,1:Ac_SC\)'[cRC{!Q+XC!g>5mC!`Ȯ;Z` ċ;/bB MeF>.h 8jіJZ@O _ePK qL ;"$R8aa<0p"x`;c(4' JBTRfU qܵ {'Qq X?MD$ĴZ@&%մjlcmL~IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/help-hint.png000066400000000000000000000017461260417502300246000ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<cIDATxڝkUsfvwvvlJ!MlEQ7T_PT ^ E*Tx'^(( V I4ٍlvv^yȅ~./?!AG+Ö8 V]St KQ4>bQuUKJWasLǾ H%~?my-]w4@D&KG"UO[z?2GkgV[;'R?}me3>K4<츘fod╏^I9 ިH$jǣr#4/pc~# Ж{>эs "=Ӥ=ma$ s'S(V95JMm)pm-r9'*)ޒQ[͞8_asiGkKt;L PϲȩfTh@̍qrwR0@|O7!1Rj "1BJ +2XS\DT4޹]/-={-f]YO1E(5;;pk:B!ZZ-buO!q c@Ji<{!/~VV2`C`ުR&ԆDbr7)t@ij5 / w5A0򹷨RQ|;@hQɾK\bJ_{j>IˮL)$" ou3^% J[b &&&>fgWt]ⁱe<0 OLNNNr]w62yH78U%IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/hypnotoad.png000066400000000000000000000024101260417502300247020ustar00rootroot00000000000000PNG  IHDRĴl;bKGD pHYs  tIME ;IDAT8ŔklSesڞvm{7֭cl 0Cn $ 45T>c0~0TD 1AncZڭz99e|͓<u5+g.xɯ3¼D7^^f^h+>ES܏}E_oxy]莝VY{ X^@붘LLEkMͱ$̀RYRj@%tB=tXqzьxh뉌O}b-?YIHBVm yQC"N~I囹L@"7Jq "锊RS q.m*e!S9Tw.!liV Pdˠ`gT"$ɼRY(˂aw A웸yzx˛3]ze BXR#Py8VCD߾sLO3c.$K)@@Np AÀA- Sq{c4lf3#ɸ]9gaBJya=>,`7uN4qW"j672H;Lݮ)> .P c> `vILPh03mSl|U1&{U%@tH2x { U,l/B*,X02"0XrF Y/Yr0(e.b2.4)ëcr3l<7.D1brL*D۱ܪ9~VSz]|fb-FFG̓^C&>D4hVB:.e!,y?= Ƨ#2Gj#r8+$^xm+ON˿kN#f <\2;1x (PX5r1ρ81ażpo+Y,;#Ѡ-UJe5O">hT.dnCBh=V8;f7c[VZ޶H&BvMcfÇ@[{~QtkYU6ykuؼٹgGHKcqӋۺx$,H_oԕɱ#IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/input-keyboard.png000066400000000000000000000011621260417502300256350ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<IDATxTn0GKCA&{] nav$_,):)GBkX2^ώCqTUL˪7}}\1lAL31nOAgRӰnDlnG1~Ҩ9Xp߃k'iYQ Dz>_ ϐN4{xLzA=g|z~B0!~ד/?gl%^IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/ipodtouchicon.png000066400000000000000000000050321260417502300255470ustar00rootroot00000000000000PNG  IHDR$x vpAgXbKGDC pHYsHHFk> IDATHǵ{|ǟ6\2fhLnsi5QJ$" 2:TeemlMfo~~99ԣ:>?y_-$Rs9.ey%mmI3KJ ^PٻRN o&8W8/_evP׎bQ$.&SIџՇ{l1chmfkՆJR{*lmඁ`_=vXXq< V0G@Igs nv j:9{C&EW2A cİ,o(gvwq,+;Wf@6ÜX؅/AJJ)M)<ajh;r  D FG!fn*:Yyrp8vC!$ϋoi!޽bw(O{\ cJSm^l?vySL!@б|VQ>$ק@WQꭅ 󺏧AD/l8p;}NCt>sZi@vV,w4E].ԵKd񎒯-OW5^N\MhywTqGWզ'q|uoV:_Z|@{a/3~rsuJgWDmh*'7&66gn[a?TLuȍ9`tN{kJ].~J-7n7Έ,gژO|I]AuFu()W+mj}K:{tVe?/>/ʙ? |{|v?tPEw~s֨#ߋ>&[Kio>U~xuՑNx?wy;v6=5i1{6gmm'IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/kittens.png000066400000000000000000000017521260417502300243660ustar00rootroot00000000000000PNG  IHDRĴl;bKGD pHYs%y%y"tIMEm=wIDAT8˭MHkgsJ1ATDAJ .?Jb^ZRѝEB\ՕXPUrF Ӡըi3]T-|||3sF# xt}\7HQQM< 99Q,{(4@;$99X,x<M*++=@jJGGLOO+SSS.E33#&| -R]]-sssfffBdxxXDDhp\;' Foiο d2  0(vrrwtt.x\SU@~^^ޝf F (W:c(((rDt|]]999԰㺻_*1 :Ս dqqQx@z{{А`3ǣ#nKJJJ(UUU8qݷb333}X,])OLLH ŝԔL/YYYAL&ӳeyY!>q:w rzzJ8fxxޑzhթB!Y[[>755}``V%%%@#ko򤥥vUU(/b|" b׉$ l6ׇjN'`U~~J2??/rK677eiiIxn ͚_ej=Mh4*###vtq7UU]u8%w֖tvvJnn$%% _;`86='nW%MD^^4?׋+1IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/list-add.png000066400000000000000000000016131260417502300244020ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATxڭkU}g1 ЖIT)KAnDĵ+M?JЂhJbjJ2Lf&3;f<<OpݭJE7k/~4hHjĩ9ܓd&*$h>=*DJ3ܯߝ:vk @Տ^qwɒ^--1;8i @ZvEyЭIOG2ޑi Wϟ>}򵱕RD+YRg1RbcTȹ'|Z+Y^ym_kO׾|9h )$%kCzd/oTm\?97]n| A+-$NXK7bye3Aǫ6[|~C[:Ry1,R Q@kؔG]ݨM'ɘ1GNEnϿ$sɥ"4JgpߐW<*Cؾllkm2͞ v\p^CI& IQ g'0,9:vw4o}Ջ׆\h^ʤMZJ2󺆊TgܖHTy7gdRصc]J*Kgt{vmU%e:Q&H׀ GiW[˖m'JI UYȎOBV,DўWꊂTYC ѺXΊ͖\KCR] b)+-4tCdNJSבbx׎@CcA! ѐ;_U[\zs{=t>ԜRsOߨ [71OEI r]D6ws1Ռ+#/RS ܑywUea6!f-;sp" n!DLr9RTr@xǍ5eKý} 9A>pIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/media-playback-pause.png000066400000000000000000000013211260417502300266530ustar00rootroot00000000000000PNG  IHDRnsBITUF pHYsaa0UtEXtSoftwarewww.inkscape.org<PIDAT=he}^T)6n >ʹvge{/~!J' zy JTz~t(_;hn Ք Վ4WߴN>Y;%muRSx⸝~x2uE*QP B?jo|˃Y6a/}c'Z`v'KC{IM4Ǣ MbZyP%bgOԽb$-ƴ0vVA'r_YT(n,-$!OwI~,JgCAڏi/TZ:R92F]'1eFB.Jv?{G5=Aӳ8r?ivx7~vPیh1w]uyF/d~;Y+PS}_)n2.ud L+YﶻGa!NLkCMzy:[G2W\f+ Bڸ 2>heK-`ߞpvݏzL:IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/media-playback-start.png000066400000000000000000000013401260417502300266740ustar00rootroot00000000000000PNG  IHDRnsBITUF pHYsaa0UtEXtSoftwarewww.inkscape.org<_IDATk\uw9+g6m!Պ8 $ !KT4?CqS)EqQCD0tbH,:"i-g~{*j a(6uk>psboC&Su\*q;.#5є,%?B0߮6}朆 R #d[8MzELDi*Mue\K=$T8q'ҷ?_IZ3M.dRt^URL ~u}Rl&wp2XL$s.ɤ‚j.Ɠ8vj@~DPSq,!uO*LӛMTWR!/ʖ*̴W8O*PCFt nW q6,նG꒥pnB)`T"JזWB[ՄqcFaZXhLHIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/media-playback-stop.png000066400000000000000000000013401260417502300265240ustar00rootroot00000000000000PNG  IHDRnsBITUF pHYsaa0UtEXtSoftwarewww.inkscape.org<_IDAT1h\e]wwkTT$!898DAMTS΢*"tJբP4CŃz^.pU.[ &o"+nO 2Gr\eeߎ!J҇qgOe(9C-0Oٱ\V ReC)g6ч+ŷ}[R$;3{:7> ⣧+QK H7^IW䶍 LRk)Sgl9,xNE414p?9RKfN 傪(Pe1)r=ĉ<7%RʅT"tر=kZ" (r?KH*U~R%z j.jk J¡D ĔBjJCF(w;hԽ}m $/ s7ڑKf.hjh21/Յ"V6kHA!7ϝ˶7k`2;5MU *('DډX^4'݁CC5V݇v- Rڽv+.[hwORB3pIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/media-playlist-repeat.png000066400000000000000000000012231260417502300270720ustar00rootroot00000000000000PNG  IHDRĴl;sRGBbKGD pHYs  tIME^IDAT8]k` "68~mmں^[;*CƼ4.@*lFCw!݅6 xN'DKq=:q~BQz"L@Ley]| 6-2Y%Byaj=^$uuO@Up$NP\ڋ369(b]D| A߈gmdLbQ8x9>p81p(#9w _%5 ۃ>jnOg@V g&XmVKgtot'fI\4- V@kTeWΐaQz9)٨A zST;P245օ(W@t;\I*MǰKọPXLW2N6]ۂMU?jTd( !tR02 E$/oU –aO")ދ| ;]Lyt4Gw`}vIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/media-playlist-shuffle.png000066400000000000000000000016111260417502300272470ustar00rootroot00000000000000PNG  IHDRĴl;sRGBbKGD pHYs  tIME0Z IDAT8KhSAEMn)(ܹDּ}&7&m4ImjGi^B% m^ͻP R"=νb9矙sa::bο"̨țZ=Ȇ.T>x%_œw>H1ڔs&&aE4lD2xF)$޸ÚGA`>F&åDagv~V>ͭ:46 8nӈ!SCQf zzY̩itTd\aMCA%1i= &4u(W |Z0_+[*afS4ֻ߀rLҧmhe2J-0KD6j0 uG*)^<@kht*II.VsS7R^8-~$,q]o$X]G 2ezz2i!D(/N8L YGF81jDZdޯ$@R %*S vF(,üfI ==%Đ4c^pYg (,sVMoxD3j F(`1D~o3*n[8Zr2 _x" JÛ xݭRh^ \> cВ!>/{ 1F =#>9xW8KA.E)t-4CШ )@%3m;P? pGX׉Q&o'>WIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/media-skip-backward.png000066400000000000000000000013611260417502300265000ustar00rootroot00000000000000PNG  IHDRnsBITUF pHYsaa0UtEXtSoftwarewww.inkscape.org<pIDATOHu={My0b@DA]lQ3Vu]mvB(K]b;`H _ek>xԞ~_O(pMIX+V$n4[3tF::dJBs!*NUz%ɵw ([c 1GܑTUu2\tI% rmXǺN(5U)]2=ȢK.{A߸*tK`RvԔ[(iO~M .h=uZ +Ig_|hÁ^g__(pgL)X-V[YWzW.G&Sm:wq ϴP3ۚ,&?؁Ppy3t FPu5Սp '7"Q活n= wgv򬺪L&}-w0,}t}4pIH%ўRfĿ6U^Iҝٯ!-G^~;OSiGAӶ~uI:pHGm#MZuTxʁ8ɮ#'QoЗxC[r3'("gԓh(JjR)HU<-I$( jMczURAQBa]"6АTMռ2U]m%JxVѮwVC;&v}g}XzZ2 ^=rL_bk+u^aqiPbn=o΀Th}pbiPBlKI<%\S ^ q};ɄSaw89zi,Mm) _=׼+%GڲNw@!i_+l%M3xIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/multimedia-player-ipod-U2-monochrome.png000066400000000000000000000011701260417502300317040ustar00rootroot00000000000000PNG  IHDRĴl;bKGD pHYs B(xtIME  25>IDAT8˭O`Ƈ?&x6"ll]J Y amEbOƛ7.9#a x7׭:7iO>7Uq.sSK?]gx*$_G--VU&$Y:%pa+\ߗ(mHr HlÎI#diLN1ashPУ(sqHa&Ï1d)U}>,uC!:sI # T۲+^) (s˂Dbilg'tw3qmN W;=T*L&\yODXw<+xzRr< `VW9UTKz\v{3琊5Y'AX>f-f_#*;o>VJbq>zJӧJK㓔<2n,%=hcy{ESRHqk1Q'88ϸ277-RQ_NhO32H~@.. IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/multimedia-player-ipod-mini-gold.png000066400000000000000000000012051260417502300311300ustar00rootroot00000000000000PNG  IHDRĴl;bKGD pHYs B(xtIME  0IDAT8˽MOQ`{aH6D, 1qZp  !hTT@Jʔ:@hmi)/` UmM9Ϝ{Ό?h}z_udJcu8T Cbp g.g7/.̟Y?ނ7o1m";.옝ĤmTE\.KEJ~$Zoa6O!-梅H^k啘gp?H}UPt`mF8HЋ/;)q^Z̛?lKJI@4]Bt2E؞_H~p^kȉ|DP ԯ]rbXIWy񸑈& s3p:(- ]aEpɊ6⑐>)+ET*v4'l9e{sOzoxi<!GQ@\#neDqx@'w-xؠ+W@KB\%BzbIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/multimedia-player-ipod-mini-green.png000066400000000000000000000012051260417502300313030ustar00rootroot00000000000000PNG  IHDRĴl;bKGD pHYs B(xtIME  1XIDAT8˽MKQGֽ)]MQAWB lVąVlb]"CZӨPmTdb&:L4"~$TMbּsM5@0s3瞹sbǓG;H]i)x Jq=c(SRZ!Ċ*_)q1kGo_09ö!,.e'$@^W4DT!KƔxXzʉm_рvG_oM~J/oѿ˜r6ñ> ~D@a3$ubZKIxpa,x[$\JG8bi@EUkb#%Jg,TW?`z91ULbmlT0 +9Wes>Lx:ͯ1'"'ba'^!+K[ۧ~SOiTiuK3xa*i঱{$K_ f@yW 5ZA^p_P-(7[~U%R-X&CHvIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/multimedia-player-ipod-mini-pink.png000066400000000000000000000011611260417502300311450ustar00rootroot00000000000000PNG  IHDRĴl;bKGD pHYs B(xtIME  6IDAT8˽JQcE}_ *཈>W|䪊 D!!щZPI 983hZk΄ tY뛵7zKK]b OO_b8(M8ΐ88 d{ua`y~qx=O/yښ$1:]OIbGW&yaRo/vX+P].1s%X')](b߰xcpaIRq // N)^LױndYHQUHvĜ+ QiNzʼnH'~.ob˜xsh;;BK{8B>;öf+ŭO*%*eo(s*T=}'Թ9(33'K.WU!iQ ayOZE-^l^<*j @4fF|%ZfQ!>%6iUUQ%ugm]=HQȒ/IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/multimedia-player-ipod-mini-silver.png000066400000000000000000000011211260417502300315040ustar00rootroot00000000000000PNG  IHDRĴl;bKGD pHYs B(xtIME  7$tH IDAT8˽JQǭ(DDA>.ڸՅNO@Q!t!N =a&,u.99̝?nWV+mbyHX,FxUDQ1X$ñD^l6xgq*"C^"~* %Ibp̕J2 "TɖIt:rn@ tĜH$(3`rJ%t:vIe5cWUB`0ZFdr{1X&U!KߕwǔfHJ9 MSn.1*RbYRFL_hrX$PJł6wE>8h2pET|,Bl3*],bNVIX~gڒH7*l- KaKVp/x<7+5,8\'6:P0szlV/0ipIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/multimedia-player-ipod-nano-black.png000066400000000000000000000010051260417502300312540ustar00rootroot00000000000000PNG  IHDRĴl;bKGD pHYs B(xtIME  1YP|IDAT8˵;O`b NƸȥ/^(($ 3?IDQC BD!-__ڞ'oOOi4W44C.H)_|xh`0t*7?;u/7wO^ĭ%'ZVW<*b?C2 rNXLVzm8 o0-vp0TJ%NS"(< JW*֪8,H'&D|~eZ\ p^/|,މuOx`sd+Ow'&Hd eR{%b!& LIbg*܁@OTO̷(zvcx/Mܺ9CIDATHǽWW_/TZHtQБQkUDAB5B@Fj:V3 m H (2r$\-\$ c g5y>y}~'񎋾3O leSύ#nQ5Q &w{`g{TX &$E2`a]Z}& BFI3VO&Kbvnvȶq1u6{Y9t{YWTMEF;FFl]0ßN.tżk lJKW6JqҤ\ieI~'2Q*c@Pz! #=0~]Yf %b+&$C;pKdo2W2>y4 6-[½[CH Jm5LC-559 GŞ bד]W2K(3)<&(Ύ8Ƞxs(4`֥gOTEwQ!ĝdh({Tٳ!\AqR#^o@],E_ xdF0WXS@^!=M:As/<;|2<](?VuP@ow2QxKl )u6kQx(v$[ t${ fX۱]ÊSǰ([ -bϐn$YHpxч0sGZt.}evx3acnV{ZM)ˎcH?gEN0%"O`ey%@%vy?r>{|w $Vh,ÌW@_埇1vK[%>+z[#w &o1 ()sPsr{62Yz1Ҷ.Y.9J*<\/t$R^M}=ƊBEty$*so&SweHņјyvӋNqW) pFaf?l Aatϥszg>ͯLCÊ2PZ0:J F +t̷Y,-&kg/S {KA5/'zy8 &V(1}ebݖ(\|J yU:X!} @QߵKoIn+sӱui7'MFAf .njk_F]Mgl&WrQ$0:s={r\EwnE.b7_=I2>^>t3*9Df=)_b3m9f3m-VtV5gGDD>Rm@ϛ7wkii[pGID%x4rI" J/^%N~l˿1f{O [E"d$g$%I}Eb'HkXU% >>R3\̓Jjq[$&ieGu5,ڢvFzVIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/multimedia-player-ipod-nano-white.png000066400000000000000000000007241260417502300313270ustar00rootroot00000000000000PNG  IHDRĴl;bKGD pHYs B(xtIME  3 # aIDAT8c`:ZÀ?8ŋϟl0Ʉkkd 2/p 6b7nٚ3`z`6U Fv1ȵTs1M F< \X\@$?}T3m߼u _v')7d(ȰK/? [o ~>i 1 vW. yD  .p<]S$f0 C@.ē*@z"H1'32$ Ċ [\zfT!eeSUTNc$,P@,@l ĖPlqqq~@Z(x?FIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/multimedia-player-ipod-shuffle.png000066400000000000000000000006501260417502300307100ustar00rootroot00000000000000PNG  IHDRĴl;bKGDC pHYs B(xtIME  68O35IDAT8J@*E Z<ͻҗ1WAћ {b7m*@BB 3 Ԓ6كЁv0!_o؂[NQSE:>ZT6oהɓ䣧ԡF8sSzɩ?J3/`|3{ uWbl>x Ӂ6xOƫ5h,FR.;{m`IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/phone-google-nexus-one.png000066400000000000000000000070511260417502300272050ustar00rootroot00000000000000PNG  IHDRĴl; EiCCPICC profileHǝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧ pHYs  tIME5 wIDAT8˕K\U:޾==ɤ3m v-]01/ĥԸ3 E\э(A0D3`2=vo=S.:Y8@l૟~96散G]3ۓmFTC Ag/Z؛û'Ov'l.ucǧFF<\جZNT^/..rZ._lÁkj\JKLT$ >J$db0(e1(d_FTJuh0H  `{}=1qL04XxQ Jˤ*` xz=vy!b3 Am7jBg0w>£Oo"5"Qީ"3:J}Gq1`[H1BG~h+`K=Oqfzg& =˫(H!\gXį|+~yb$/Payީf`!4{Db\Q 7UEe*(,,ALrZ&EZsk`UJWXKd "%D= bD@ Fk%s\V4"1$NԸφ10`-t-!7zo/IjAJy#G,BV20;7O';-:348lr9\T*ucG9|xkz4-3N ,RO(\Gkm<[@64mV)?f8lNkJk^=.Im}dnTm&[$'H*ӓ#&0-B54 ҩ#i )9@eN>*X|Wm4]x^xD4|o̯< p@ w'˔mO,u$艱O:b= ;ccZ Bm+#a!Ko-:&FB]c4K_ӊǘhz3Y@)%w㵵;7ϜFJmض& :XZһ+M6X,>yk#Tk~A(ZpGpq(|h$En^HK|8IT"ۉ[;jlҏ_}q˅p}@Um xfu%JgIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/phone-nokia-n900.png000066400000000000000000000015301260417502300255730ustar00rootroot00000000000000PNG  IHDRĴl;sRGBbKGDC pHYs B(xtIME 8-:IDAT8˵UMHQM(!Ds4HC')SKOo'M HS(RЃ=z^ !B Ĉ!mҙ UDx7 v#Gh4qNRjDL;fsY c}}]g0ʆJr!gii^VaccN_ jʲ^BCCC`:bd2+@r@)Z-\\\}>߶wuu) %D" nqlEs @oo/ЩkqssS;Fc#rN舳 `Iix<333prrҵXѐ<<< z6xmm md?fFf-_ ̸hVjadd---vpppf񕉁?|K0 9{ec(p\h4ʶ DRҟ0L\iݭ xQv:ZbZ* JQxVA'7Q><<+^ݣ <8-owd5 WA:y!>H%EB`Z!ĝ28~;p莏YbݸKv&xr~~V$[2zN6^EVH:-f/ ߧoG`o I784E Dk 7Uf$rsaɩJUjY u,ĪXX zAaloQ~?xb7lwt{܂ 7>]&g?" W cf/Yբ _a#^dVRB|/fta9TKoH1s8@qq2.Jq&^ ' +{s`ȧ-#y@q/$Mx+^xfTĺgSL[&?qY:W_'S3jQ!d t]19ZrVG"^` fshjjLE"3D ~ чE)^ARJY*:Zǯl(qL<=OO_ʳ&%n7\{!:%\lt(q*gJV KPZ J~a2$儤o;DĆy$싏MHNC_`0kTj(#g~m(q4! ,D;6Lp x-IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/phone.png000066400000000000000000000011301260417502300240040ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATxڵ1Pύ:F,+/[8Jf`/)6*jL;1Ʒ]f>x{}§0rImqĕJeoT?2j%-@Ht bd&wmb8ק@#@L%5p+-8"&I5>GJ _|Ix@OkD2xBd8iO&x&Y" HԖK*@o$YC9AC4IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/spotify.png000066400000000000000000000024261260417502300244010ustar00rootroot00000000000000PNG  IHDRĴl;sRGBbKGD pHYs B(xtIME 1, IDAT8˅MlTU;o:-S ԪEP*jƏ F]qcB 4qa&b Fc.Р Ţm)mg̼DԛܼsWMm")R6犯X]ӛi=*b{.C F4i1=as-m+u,y3cfv2!$y-ؿ?s@fr{t-ϡ*STUEm$4" en۶)>]ﺇזtD SDq*"4 GNR+yIn|nx]xC9;Y((qem\|Σj]w\.z$ʵ *s)X2"jd U+p}JĵFFAڝwz|t:(|:׬B+ᘡSU~ag:n+e8#8f`vV|ޓ;(Kc ߺ3wl7xQVA#$)ʼnEJ%׭d`E\FY v8Qf3L&%!5!*O15YM=t,Dި91@OH8˗ WA6NlPG} BRkD`x܈ `d=GUR6l6l:ӳ۲qȁɂ\LTIZ *Uc| ʣ)+%[Ar@>ȩT8j02#A.Q .Y%\q^la- =2W܌`&ՙһܸjTW+c r=7ur qO3LpHPfp0[3@dṵ^恳"_<͛[ԛǛ8֩gRVw:m@#8mygZwYT֭kvAߥxWy)6+8{nVrD\kFˮu/ExsUԝV3ˈ; Do^a/PlH]IC<3 olL>l+QqBK鸢, +'w\j7\dͽ(F?xyd /IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/user-away.png000066400000000000000000000064501260417502300246220ustar00rootroot00000000000000PNG  IHDR$x pHYs7\7\Ǥ vpAgXbKGD X IDATxEwTW3{yK[ *V@c[]wĀ5&;%+(Dk4%#D"wߜg9s̹wɴ/@5`HwH?tQ+|":zn%#cqH` &Nt#1P_ۏ*x7Tp=fi,(+FC^v],G?hAa_8D嵲 &v B,*`_3nwZܷ ~f)+1J%Ys3= uQ.#D%h9Cjd# [ ;pw1qTgǮ /(TK"IXDqcb;)nUD{X@)2pWLqQGxJ_Y|;؁,.zKCj:bvvs1~pzb-CtR(4~' ";0Ӊq6'| 0f<.'<¸D n مI2Ҟ}d(ܷi~oI6$ZY"VʯPR¶.܊=bC}\]9| x5wA&TqY7#y'[CnjQt?VݶJIi6 SRCph6e/+@;^;'՛.e/ޯrb4YpOA:tE%`^#?54ceɺ)!AlE!|/#{-` WM|'ahؑ?׽;in =ɶo»ŸJUٯS]e(FX|zm%#"/}e#;pt,8b= alKhmM/a _9ZZh> Hhj_d8 ~)?DUr ݫ(@fd$ɇ䐸.cﰜI9+>tBO @J@Fe`L4M2'֋t!)&N| i+iEiEn*ҠrU6YHRοy;FPS#`Dij%s~kml"["wc#gGJ#Yb@eޡ9[Rr":(xN]wlW"T@joS+U |0H HVVhcy;VgKOY>r?hBpC8d#*@\nU *vdRozI]Y/kbUCf+a!fI5)@+fO@l1RET% E -U* ` ptp$&4@@. fM Wi NUX4<\tç>⏢Q m@)nV1*0WD:tZ[PȥF]]K S(Q!yMw{;~Nya5߾o)IGPڿT x^Gx! .s1gpbU1(a#ec+q;&J?7n%QPaXyw7c?W*@ C:^L{}~Mp"~TJ ZL;4E[2P/9/+|9n`:z{ݤep}WhfV{[X_wkO|,=eW89o9Zc׭;mWEI.nCSb۔m|]n^L-–߫֨LY?5M>~po4z%jnZZ| (X={⸫ ~ȽSG*劑Oʅ !}9J:]L1% j O-<\1~PM'3C 3e!cT_UXŸ6 /7N[/5Έ Ǘξm* J2!t6/y, ,RIDza0x2ɵXmf~o~Y 9$rPd\";k]%QX21K-$Xt%t  Z c ޼^?@˙{~9;YZkU?~:޻т{XBGGw=Kq(`$1bGQ]y|5>"m1nj϶4d^gÙCoZ-X@8uzz*} agQ)Jz LRB?-N"|5|>ߞ}5`@{'* tCYJ,gyg4y_u}2wua˯$:qCww)TpTb- Jexn΀Q NE|aH8= MfggïeT*\.#kGLr{a 273ܮ;D߻cccx;GK]F a##e)".$ǁ+C8ݝE{2B02WF9'G l:]GAh7$ոÂɝ*2JTFr40f:ןb.cbbBJWt'nM#6Qᇥ%lnnP(ZQWGTMXY^A?TJ al6)7^\Xj(e:Fo޼>8{^i_, 9b6668U6cL^ٸ$/ƍ*FFFRT3x[ 9ؼQiEi-@8Ss%HPq@6<&iG2r:~#H9*V} ߇;"R[ _}zS7\x/R]}9IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/view-media-playlist.png000066400000000000000000000012001260417502300265570ustar00rootroot00000000000000PNG  IHDRj sRGB#PLTE!P!P$S*X+Z-\0^2a6d6d7e7f9c=iLyNzXpv~ܖޗߚ⛼朼㜼䠺ܠ確ڢܣ֤ެర踸ỻ㼼atRNS,-2bKGD`ŷ| pHYsu85tIME0l,JKIDATc` 0b L,-13@F Pd/PxpB|BB,jJk)h*h(kʨՌDU,,UmM􍭕$RB"<\|""CCZdfog84 a # 3b>IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/view-media-visualization.png000066400000000000000000000026451260417502300276350ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<"IDATxڍ{LW/_#n)Ee40#ё=9$3@]|$i NPl((-"BP,/,Z"Rݹnwn)Jw("Xg/I7Btƍic^J~-1KK[D"&{?6MZ[CC=H$!v;]nWRL“$-H*`1FSS!HxTUUőPdt#3W<L(VP(9!EkkE\<ƗFP$zFq"ږT*r###mmmna\$1wձ߽{EDFP2l9Pt"ҎPzվ1IEo >RW"h.pp "∣~"fO)Je0ktY ;IC.}$\.&N 122ł!C=0m@gP~5M|U 2V;Ppj eE>P X}ΊzKlbT9͕+4 Za<:0  1ލRՃ$]`ჷنs=3kz @[Cr["`&` ,3xR{:r#4<#.^ɟmj1; kod.<:Ļxݔ8iH`^uuXnVBb)0xä u^Ȏ[͌b"8vJ|Ş˗wj4PIO˱`VGUЗnF߃C05 WCYR26WPnxxLPoPt:)y50#TuwCW-/vvیsuLͅBoee 0qGg"T0|2w~u<ԜTz ^'I].U]:wmzF 䍉DIo}RjFZ3NgXettImlVЧII!6d޺GGF&QӫyHX?Y I*C(] J77ܥPێgt}X@HHᘘH 'Ndhڵ ??Uڶm17f|yc1CM3B'ؿ oVIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/view-refresh.png000066400000000000000000000024031260417502300253050ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڵ[lTU>s3ә5\,۪D NgRʴޔP-I4 JJ TZ 4rDCo<4&Ac:{ƄI[A_xZzҨzv>kSdAOTaOa$3ﶻ=a(@g֕|ZhPO _/D*t}҅_ov~lو+a3մ|yЅe&g)D\+~>#a v|q>#bXnطV;f傾t@Ůi^EY=zpC {5]H:Wumcm1֟Y.Gv{6) SA~_>v-HjL j^ɞcBHoN1UBD)"ј K.E#?9j0bA}#9˸/MZV/'1#$o}maXr| 縟⤰EF/)+eP]1(ڧ-G_) `1^wsu8R\ؽEۊ橬To͐jR0! p~D޵<}^³{h.[qTvx1o<侖 PT];C,s*j$a JA iMfOS`5@\0\<'J*Wdg.:_ۧJ5s: }|{ᖚK ,҃)*I0}#nJ+qJWv^zu( r5Buh'B'!c[Vb*K+n܇m۬AI'𚢔Ns.#-"h\ 2dbqRHnM9H>}M:]5YM R"nB?ө(8S98wYGc[m(D31Āp!s码#r?paH=+.\sDq2F,8!y4̗P첫6߅,Oj22',x~JcYrtVR RVenP.8' &xxf[coU0ͨc3 TKuM!..{ʽlIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/weather-showers-scattered.png000066400000000000000000000021141260417502300300010ustar00rootroot00000000000000PNG  IHDRĴl;sRGBbKGD pHYs^tIME  2{IDATx[hUǿs涻4!I -I`Y!FEQ!bCJ TD"4"iЀ1h6f/93K|h||pwAp FGGq[[k{:/\vll#ap:@0ܧ(Ê=9NVSԱp8|j,̍!z[+ؽQTv;lR@(In!Mөiڥd2r"68;j dɰʑ)0tTkF &Ոn%qK<?y$q u7 @BU[,A43lEkx!, //" Pau}=u`u&IciZP%>,A^FeHD8_Fp ?P(@sn\{Tm _jWųH=~l$US$WexO]֎mMw? L^_Xm{GNV~Cs^ ʖg+/469=d>s(3е#Jْ}%v\y ,x!h|qwavv } =a8zD{?8:5[3oAidߋ3}mm&.: IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/x-clementine-album.png000066400000000000000000000020521260417502300263650ustar00rootroot00000000000000PNG  IHDR(-SsRGB4PLTEƲջ឵}ᒏ񔐘ﴷㆈ諮ʿѓќù»Ž»ìɱ˺չĿ׾%tWtRNSFFGIJLMNjklmopqr bKGDV pHYsu85tIME++ IDATc````g`SSg`cfȌ\kQ^M#c¬kvxKE8S*'Zr0_i Wn۵kZ{)Ӄ\WnYA&sVf&-WbP8c1b-.y 5%i MK6n_agP]мqӮyNA9@[ڹaٜIyIv ak,Lga`Z g%H<)l_a+."#RvwޕIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/x-clementine-albums.png000066400000000000000000000021511260417502300265500ustar00rootroot00000000000000PNG  IHDRrP6sRGBbKGD pHYsu85tIME ^֐IDAT8˕TO[ueA>lj q_43.[[DQA6@ m-KKMyo)Pk !>r{s痗oPv0wf:PB8F(󳧿*=קQB!`?W UW;10M8tp:9Lfpvoqqt^*J;^VQܝ4Lڼ0l`=FFxJd򮞆7mh]PP*hmţ-S}!QlmG-zB^3uHI:z UtF0G,$܂N/-G!54kk1N#haag T"L}Xq%SgX<8bn;D0.!H4Kю4VkЌ$u5ВY"yDtf8#x4WMDH&RX]]#jQ|0)A |\hXҲDm;81+O~u!Łj|A(J-/2. woݣ@D$ԕ/K 3cRj(.f'%1}`i87 ¢;Id&A,.&JmPψ0 Ã<.[H8x.+1ci _7$"H&kfh}=-%>?W Z Zk?+/T3IfM(Z*ɣ&xgx-LN`ŵM/U;|Vd2DF-̎Hfn] Vij[mY#)}[Za=Ъ&pEd-xZwՙ9rRjmzQS{B$]W'iQ.WםYi2nIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/x-clementine-artist.png000066400000000000000000000011501260417502300265710ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs:tEXtSoftwarewww.inkscape.org<IDAT8˕k`OBa/aAEXA"s9Un:6-f5M6[.۾i&i}Z<7qeV_=_gFKwx=vCۈ/B< b'r+Q*0]{o1D?cF rQ|lG(3)\qПb#hOw(D.%Foo]Bfy8nf6\} tb9y u pe?x& -U5_(͖"˺J5Yoذq]{s$ 聪ٱ]?sӴzj{5\aE~lmlѲZŊX Б  qHCNd{YʽA۴ȨSxQe~z̬\ ߚ+abTW袨Х"3W^&/,]w20IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/x-clementine-shuffle.png000066400000000000000000000012601260417502300267210ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<-IDATxڝK[AϘhDIU ] m*.̢ nWH`PVp!m.J X$ஔҺb43;޹/|9w'&.XB'u^%C2ƧO /j e:h a@3)ھDCpFƣbR)nx26ؓEߏKÙ.ĹNķCql=JAs Gk+ .VKh-#.*ND=nseN,\BB D 2pb-+qR;gάx1AH&Nӣ[H ag!vߏ; ZI $&k؋ƸZlDfŧdjEX$16O d2)1N'T,{'mbIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/22x22/zoom-in.png000066400000000000000000000021751260417502300242750ustar00rootroot00000000000000PNG  IHDRĴl;bKGD pHYs cytIME ({O IDAT8c`d\n#GN:+=޹uv'~~~& ڳge+7M-=SD˟дݓ۵k9sdhm]Ok;rڕg-;5}ޯ6񳿻DYt &:k.ٳOMm9sڬOg:v1X|y~as$ZUU3Gχ.yvr/m˖*oϼ>P1RJjoo%hpCCæ̉W|ouƱW~۠N~+aa̮'_k1uooV6_wI٢rӚMǔWS=O%s9ZI͜tqͩjO<P~yyg;\ DV+_%}[ XWM:^V3,Q?̸0țƤߊ*Ѫ<_+g?3| u^U'O2ٵsJ[ǡ˓Iwg\TƔލojk625XNNNa7?rXzcjO%~XRfa_ 7zx:CCWY|Α.+oM ?,ޏt)7|٘ҁ ;>yOe%p氰ի׾ݸ穇;tC塧k==W;veĉ=xcccyrZEeՄ3g]Yfݫ6;o/ZZ[߸u3g ŁXAlZ+*+pu PJjnnsÇ߻wMb$0ߺm{\tU ܃jժwzDOOO ikkJUbĆ"HH0 ["9=g̙ kSY+͋AMSLhU:;3}}f9-I4Zuu eԨ}'O&ޡ rzM0^]h65 Pшn6\߉D]=R |֏P!|uh‘A'͜938S"? ep;MJ29g{[1b*;Vś_@ h`#obrV$WO j (_{O}E,)ą!b6=IΙqX)d>[kBaB&ۖSU,bz {w ;UD2Il/&e"RD[Oq XKY(Uasze 'WQ-lm%e1pgU1P, w׆h zZ̲yPH" Ȥ !@@{RA|ϞGDLop:>  ?͓"*8c1!oj07:,Gb /pC>Z2YDÜ.ЭWh4W{Q#(Ep%MsШ x .1=6tl,Ϧ {t ENXqitDu8>Ў0n/ye{f7vDhIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/applications-internet.png000066400000000000000000000051731260417502300272240ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org< IDATxڝWkl[g~s%8ݤIdiu6c.ꆘ~0i!`h1QTЦib`L `R@[Iĉ}l(/~u{yl!G]B<Ij#*&%h:*ҬV[kk7X;>|=-ov~l* B Bf*l;h:n4]]\x^ٞGZɆ y?M~*ow-~>5ǵ8W^9VEr UW09Cv 0R@74aӫ;o{bu1񈔏 +Z! ߑIV"fY0 VF #UFfAKsG?<3/_Ѝ0/ٽpL. b>H܎{F&cٷ9覎Ӄvs3ٱqZeǟ=7TWF `(e%C&Z?&Ѕw֠pKt[!LaeLAg"]7s})Z(xLCqn_,3ང)"GGx/TT k6. :D:s_{!̈́ekXYoclOUT=VO0= gp|+. F)Ȝ0ԨE{B,lbx2F{–͎h^90M vNa8BB z/D_f61K:^_msM( I:@%O X&OS-PbFnv/ȖHR8kLҧ)٦Zi}X)+A&WEi d͓k(j(ѮѬ;jN1ηlg٢u"L& dqLX,r[ZwڋW1a3LNPx鱽]Vk|OJVrE"{z{Cq(D*`܁1qjs0XpLs}nΙnt ֥"HD}î+}E:Z=XIޥ#t r^,#^^\x+}Éfe r1Pdw.>tx ۆ} s%;ΤR_i߁/3w >J܂BSzܗ@;68;^^= SbU>iWSCw%wNOʱi-Qu]enz '7Z4MtN?q'/IU2_(ڱT1186Q/3YLҨfCс^Ri}}az" ۶u Gi ;g_̂rKyhJi)KT= OQlN&%^ zaym3%(«b Uzn.wR n8o*U'ˊ.}{5 ׆[WwUl@uP]]; 4u-5Ni@#pbӾA©wS|@9PIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/configure.png000066400000000000000000000026521260417502300246700ustar00rootroot00000000000000PNG  IHDR szzsRGB pHYs^tIME)%FUbKGD*IDATxڽV[PSW5h"be4"2EBCx"Ũ!!ommVU:-XEZ|ؖ)Y?3k}]{a#\]gX+Tx+ߴ;_[{~6c wX]ߏALxxNdɉZVr{zLx^PkT֕exl%0j^S]x%hA%pX+˷ogx\ֻg|dm~DUH^~?NY,cPyF7}ϋ=\il*R+֌&aUm<R{kw?K&^C孺sƝϻIG; U؜ۛ-?XL}4g 5]Pռpb9 ^fZi91NHJ8%zދ|QW_gNn(; V3D{6ZDeuo?3g0w\D?6T|Yj6B:u-tK LH0W=vMFgY.򱯩9`2 hE a}ޭ5DD"kx[P^(b gJ3p8D[EIpVwOn"x׏44DigƲbQCG܎Gq#k~/q* #0m4T@&˿FX%%ӕ?]j%asj}fɢ%* ˅Bxzy".>e.zp<ٰٔqR S ((sppHa<+ ާǏ6bBD vvv* =+~ya 77BJj D$i^{Ξ'$V:h2 3T b"߅ȊD\7> r]ZT`Qkr7 t|V$$&@* "CA5-2\TkG0`^$ 'Px1[TʷhEѱSJھ}!Q{mmmAwG_:4ǩץBG?4Gv/<4\_22:cbmY^8$%`-Mjq i hむ07{AIØ& 8I,*xj`gcƘH ~?,gXdI7zQn.4r-u 3k_,3L(i%Nڭ@QcV^Y PaQ2S0h wG~.RkJee%՝lnn]R)? ~ugtTx ;ИnկJ7{&pc N 8Msv`rHm ›崶r!|`tl [PY&,Sȉ0( +*  |h6}n=2(a,(t:aO*i3$Vhu]M@$ɭ {UƗ;{%PYI*"fddҚ8Nٹo_LJ-ex 2WY ~:2S{7'm]Bw?>>?sޣgGzUX,4`pFpwE^ K d%;bCTr3?߷طyqgTM>:pv}qS˅|C9Y8 "n׀&g$jH+IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/document-open-folder.png000066400000000000000000000020651260417502300267330ustar00rootroot00000000000000PNG  IHDR szz pHYs7\7\ǤbKGDIDATxOhUƿ{{IMHjZJMEEЍ[W"" s΅ .bJ+QR< {fmc&?8Áw g{s !HB}[%x%V6K nMqybҹqP7 Hv0J4R3 GwQ'"HP8MeBHOZ3O|1௏~c h+^Ԧx \{BQU=@{?\Gñ0*!f=+`aPiqNc.Y|W /U %jЧȭ! U"@DC,Wӏ8[,6>O(v3퇀m[IƉki*$ÄNgL ' Bq)8  +B}+"E6f{R5P0U4FI~ Ċl兓+NPM+26fe):Yvh(vS3+{]`$V)~wݧ*.A"⳼|sY+f's+}PFEkYy^bmΈVQU8boc+vvbi]p![!(:blua 4&ZTL MȚٕZ#`l (531["DǑ'APDH8clT4#j * XcU FlZVΚ-9{E h[Pv<-׎q`N$ڕpN׮ yp:Μa E7~2Һ.GQȧieλpN7_3ܾuE>㏝׭֮"zTXtSoftwarex+//.NN,H/J6XS\IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/document-open-remote.png000066400000000000000000000041541260417502300267540ustar00rootroot00000000000000PNG  IHDR szz pHYs7\7\ǤbKGDIDATYe3sft)]BEE ȍ$c /L jDMHL = A,DQB%Z错g-8DhJq j>/e9vJw=߹)S?rVZÿ~<$Ŕ1|ᬮ>xɗe|lm/>x]?>>pH ݐmCUӂ콜co5<G|<†so¯];{Ͷ..ZhSt^ux߷{\+== e}I>Ya~?xB]&7 ZhQ=wH[m9o<;UHh(:\V(tCoPTGJrmӇn%r飵pT)Qd6o mQ#j&+eWV+;syV{g4izW\#(p݀ytf5f;Tudc-9:v^ՕJN[+)Y!Yff23rk-Ϲ1ܹ[{W_>Sʫ/(UH*ޫDHw? Daѫ4/gRo{HJLWcYN ZYZ휴an 8Vk߼~lr0߂p KeNxONԘZΤ+[0>1?^[Tֲ-C` OG? #"A!)<4 (3F0 |@l`fSb3M9I3D+te5-tÒ7+Sy55yr4߶՞h# "J2̿E?>}st҂NF[158–K$&Xd\ U (kDYF@CAi,̜\&%Gpޘb} (R5@SxĈ,-ueP, FĀ(@R)Zbzi'F?_Jy[Z]i(r+ojD; iQHGRe\>5ʞU#+B=q9"={ }lL[|AQU& *-~؀3t~e^5ɦ;8H}*hZ>fO0_0<1BC^؛Ll# ]@9M#d}@/)N4X96V&:gZlaeab1.!62|!"W_|-}e猩=*"DGc@yJ[`D0Z.kM@Ya$QZZFxUE bTYk*XC/{bbZ. eB O@P-FJiѠY 1fyluإna|,ġޣ^kP1d""U" ^9VfAsvVqYp! &Jc Rpj(v"뚱VvRAD?PTYcP-" "&('*q$vκs6b'l ^ N8SPH"CӉu6ފD$sbu 攳FzFB)P. qΝrucR$R ưB)cD8(RQ qYP5>ZeAhl]3ӌ""rFX 6mct:LclEK+␁KEz#m;t)@|[J</ /i_:>Cšr,NpIt]._Ͽq)ft8T]?sYUW_ M"zTXtSoftwarex+//.NN,H/J6XS\IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/document-open.png000066400000000000000000000021001260417502300254500ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxŖM\E9Uu?{1a•0;E'vKW#J! H .id:=龷NyN);h4ũy[g]( a L _{M0f(xC9>R}_LJdSO߯F4#& 0ns2NXK6mUsy3q!j<*H#[.N{7@[V2 c.]^3W0P 6/7>no}k `pFF{80oOn?U5X['o:pbNW=?.|FڢCĚ70>WԻ̼րjfO˩L׾{4%ʬX$} CR<\1Ɓ>j 4˚xgc<=fɬjKܰؤ}gu"2- JbW-|ŋy`]N]B"Pfd=d*3B˜i4Pd7 4EH͋,>yW.$* :ΚɌ)TYO&yq*"%$䀔[̘?OMtH@v)^Wv''E뻖3vgd]v{,*G#:јu   \d 9_ɪIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/document-save.png000066400000000000000000000023571260417502300254630ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<lIDATxVoEmvbv " 7gԗ T*oE4""Lq[fFzwBM3w775 @_D]λΛ, KxgHlQ {?iֹo~4ý:8߹ۯ:ȍYN,~/S6Hf$IVc웠yOgy~`n3@s -n,zž&D9a4Kh74 a pm V`5ɨC1S o%\(.qRCQә1<:WJP>4$Ȃ PъOtSq1u+ ^]1.Bi5' "ڎZ]Y95}Qw<2-HZMU.BpL5WDd<`u!9 hQt%a 'C׃K/0S]['=jO~z ŠV+8[I}k@X^?):50Mjқο0\`ⱊ/+0.saST, ,_ CZŗtܸyV(>2o3 ON( KS((N)x QKD-(dg0!#jj:   l@G$ +L"({4tࢢ8>|q$ +¢K $9_BdEdM FX_/z`V ǁ1Z2a]4M/I |9ߞv>46˗.}P־RU-E&ωP( Y+2Mv,^lULƣ?766~gx0 9=BjDП>(h*]2ѐC4wh4<"+츮빎(]a'/8"06}۱gxX`:Лap 壻f;4GTOD#K@4յ^xψȝL&5pgߚғCIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/download.png000066400000000000000000000046151260417502300245170ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs B(xtIME )! IDATXý{l?;{N8$1`PC%7}VnEhE[@+$@RZʛjZ ( gI;q&g{;HJZ_i7~aRq2;x|M\tݣuͷ,]~q1ِF*@cttuzo]p, o<gsXGu1sפp=J5 A!5Qk׼xk>YsH\GW{:Moeg)<]rВ6Je SP)Z;gqqt'Rɫȼ?}hX>|W=HEU._=LJ#\!Ƣt-`g(khL&Yr"ձ`w6L7o*`l'r'bqK51Y8e'f cE:"Ѩ$RtenJ۷ 돌V|ݽeŊ61$3.' (b/n@Y^{s'ٗ74NڡJS'&27;gɓn912:O?l&d'Wp(sL烦ѐ/V-2;N(Ϭy[3[&H 9+YiW#Vش9&@[4$f!M2]ģ$ g` @h[cR*{b,U1] jk468~Țu[63u(2j #a5GӜ4O[FffofQgǹ9k_VmmiB*BLX˫(i/@``h0%3e+j֪Eۂf5U4}I-60/Sh2tA! oޒ#i2@3%H"0hjn{hnr~^ @XJUdT~tmroMY,hbXQ %H&)uº(?:;_P<3TGM}z=OvɃHVsSlܚ'ޔ` \dtbX ljgN–mWBF DZ]r#{xeT]k{>yrRS!E H68E7<B1reL¤D! FĠZXI23y{} -SWJsv+MlB3Mr^)K ˱p[:i:x39  ܧ$t%?4tBĞ+Gfbf0.w=}BKOD2$ӝhEU>6QeϞD$RX4 +}cOWKξTy~(NޘnHB/[vc}+պu!JfWIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/drive-removable-media-usb-pendrive.png000066400000000000000000000023051260417502300314430ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<BIDATxVKh\e>}#N$m:MIEEUZREIqF(w UH#%M:$;=DP&3s;9BJ hpH(PEzEQ[ZZ75uRA0u}ln>Z͗>6i\N0 A᪊@$sy#CkyT((2X*= dpڻ.xͷoڰ1j" !BAw n|p]u]3,q~GBa^[ti-Q3 PQig`u=3z=};B.<*ՁVAcZ=_3LNNN|5HȳX`m[hlZNypvv]V @$%j7rq'8kT~3i_4 j#ov!By-Nb} 6\3SUpeǁdQ0?S nӌ]q‹P,1 )F]=@p ldA2G~楘 r.;wD" eFEc7IJ ATR8\|p 5ᵉ;?@߲{ςʙҟx<dK뚙0 ȓ j8 CLĔ 8"|,H{xY C>z(Aƃ `'쳧aWcccQi"mףK gX<ϧ eW؎+|!Vn8m㸬f3٦!U۟:'MsP{iM L˖}{aSzИR v:W.ۆQ&DqƲt~g;;;،l"Y8!Q33ŗ+++1&eG  *dGbAQIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/edit-clear-list.png000066400000000000000000000040551260417502300256700ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxW]o\W]{|umǭ&MI(R$7!@[s`_ ko'"$ (d!ӱ8Hf;~| ۵llnW.!QV J"Jos3&v0imar&ipMlnm!Mȝhs~ xb(eH] kbcc=}Ęzc GG%T(5Zqf](>nFIc'N2dZIS2DZ 11܋j\Q#&0LPo%|r{\V` $N9$4/mGNMDm El)4Hy 0BHC(Y`j)S:s.=e$D,*06>_a8Tc$(= |Rg{YGQML{rɱBV Ԋlp%׊=ezHq(gsD(ސHN} *snP hi-h.1i5-cXS)##ah`ZTHnmm61!"@{\=.^GeOk?Uƍu=OdpL+8rdқpgu4+?|d~CMg}}}wcvvvj|Esn7닭ix(Eߕ2DڀjR#:_}`|\ZS:eTL% tpKD;B"NaohnT*i7]WZ\ƭ[%v2111w~Į,œ^&B,)VmP*+>zC0$R:Z[C;۹r$١uǎO3پ/๊RC)m^z= ^/]B̠)l`(J]z(tc~ki?(v_ᆱ'7SP}M^m-@{{u购\id 秧_:y3e{+++7\'6qcM A\2:9l=b'.cgIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/edit-clear-locationbar-ltr.png000066400000000000000000000035561260417502300300160ustar00rootroot00000000000000PNG  IHDR szz pHYs7\7\ǤbKGDIDATxV[OTW^9gn2Ì *^h)&5i(b/5mS|Rc 5}郩MQQ *ml!602 ̜o̜PTzyk>geL&4MήN11>NARJzIR@iSt\433Clnޢ._2jFi (×!5夏>oNeQx2LW]sd:M l[^ʪ 剮i$Rh U\L( D훵#v0MC.,$vSWg XV}umfN1 p1q((on8M9{EJJdJ*\y>h4*| )s\Rxҭ;tkJV=c>==F["K&M$:t֕g~ؿ 'h4vu! ؠ;9p c/a+V4dgg9!uV5SQQm޼JJJl)y$:uJIP1$L,|A 9< dtKZ"U,swweTWLBJBpgp$S:~8 Ix@D,O$q&SgOw26EGGh˖- d͛7{\HsFFFEE Nǰ @ !0WŸ`~`'NХK˔ +3%ZO@_k* Y~d<m۶àMZjmmA^2 K{Lv$Y=$=lE!(ED!VyyqD\cccrjjJ>~XKdD5<DyԡVzS 3?Z6^( b*(* x:yut<UxIJB5Сޏػ-`P*h*&[J+u/>S5D>H $7$_ -7߇s"K* HEh.qjj~\<6ϫ…ocDŽLr(,HGz D*z"r757Kn+5Xū/ÒHʇcOS>TmyK c״/g1OhUPOF癹Vn*%UY/~m*E;8t;jO peY35=Mkok + Q!` # +!^@L)0VdMνbtv;A7[I!~U,UdVU8i M9D.\;{G4aD K<[ocD,=oIODy)P{e࿚"":x(_w32px1S(#\eaMIJI&5c%qQ {NüwKf8- ql![oR"j;S!=$'cW(;xNߋ)9!7Pč|'lg}4.Gkld:Z _fV/|ېEN_WWbpP\ކKY["{J=, 7J3x=׃s!1knږ/W4i}w%!g`PF:zAeV} DgTSRqmftm܈_W@SZA4wax7-|-|T*ΛZ"8ly#|ذ+DڙA֏zWDYB\91C6;"D Wesx~ RS\BW!̳݆D{Xae'Ңi Bk =EơШ,!^9绱`PlpHQ3&+^6\jS"EPY&yKqs]i1\} a*&S w=6RzFPw0n}Ha > *[D:Sah-x}55Q_9C>fb8a-RE4'CZH2|GP/\o=CPҏ$c DcۈܦR,IJ!oAbWOtk nh%5\ 3n{v^LyGz˽||c\]I#\IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/edit-find.png000066400000000000000000000032511260417502300245460ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<&IDATxVYLTgFVPYgf}o0ðZW(-j["uTmjmҤOKCj]7ԴE[ܹs; bu %xW* ~¨&N޹+ؽi3I^&瑩`xx"@[`aB.B@a_k5ϧ%%AQlEl,aaP(g lV+$P*P?w"!ua*H%׷EBB-z`"2,G2;`6t8iw@&!|۴4 $Ȉ/s:7lD{[st8~G`ۂ ۉR4ÝlFa^n"1 l6<**""zFNj\tzd9hjlĖ>y ْ)2~UeՃK1o7p1 l0vը5-f4X 7I0-Гطg/.;+_F~~ϔKQ?8>U,S2DORB ȭQkaQW'pYTσs U܂::1xBCC/=C,vn pwWgVlb?4*5 ij"29pr{I˖VnCT?\" #yp9!Daa)|J`ܸqo ?5b|\<"##Ke8%*b& QD-H2 rW6lEn݊ヌWzں_~&d0̏҂\s!#p0S`C´;fTUIMIhf?w|^zE.5im>5rTۅwb/* ]wojkB)]2y[~vxm6][KKX*"4iMФjQ=Xo7'0g{z +" qwIoњv3V+ T'R-OW%Ld[R]V$N.bFiԸD X#-vK 'z#0 S[J4on É+pPo<#P:e՚ς/=\r.T0i7sX]ZQc_k{DT+J (FX_4`e9pJDP#Jk-/#l ܙz 3b%ֈ;'B hҲNtŭCYEir6a)yjU~+LRdT8+wfm-[$HԆ2qH$Lplec^rhr8NNO]nNO:SJT BU20%,f3\~Yz n5XEz" A{1H%!UR#wqoFR־ f5%Wf%mfD`^wjzfm- +s$&*wnHG \ t-'5$a; |IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/edit-rename.png000066400000000000000000000007601260417502300250770ustar00rootroot00000000000000PNG  IHDR DsBITOPLTEbd`tvsz{x+S-(tRNS !$%&')+,-1369<>BDFI_dFQ pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDAT8풱 @Cm_(0PdQ(AT4(Ʌm!7pfcּ8,;@ .cGm:߈i.Ⱥ\i)QTX͹*TBHmAP*R)$!m;jD8l_l!p,IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/edit-undo.png000066400000000000000000000037441260417502300246020ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<aIDATxŗklb0&HEM|HVQ6<6`5k5;3wea>'ts 13n "?dl-wztvb]H{~yp_mycÆY]~LyqφpG;Um0H=X2 ;o! ЁBP|Uʫ^ŌwFX+ؽrwA۫$hj^;a `3Bŋ|kX~w٦Wf pť=G"3OXw~u-F5 ! ;}гwb8~h]1=o}xؙۛY5S8uoR ;W`17 a4F` 3LtSc/:5@ THMmы3,d9 ,D{`΁۵6I3[~zі_]zf yU CD)`|sA׫@AF6KAg9kA fQx.ύ۾Pf %%TD%*#?Xo81b|)Z+Pƻ I> ?;6Z.!ݗn>r^ 2 C$1|+Zџ8o-l;vBW0u g:F=f-5ŽK,kxݗt#ZAN^13D F]hkC0ؘF-0!zEwUh׭Ot7?r07눈=s_ȀC@`*ÁUuV/ OQz8m-(ŰU(](ESDg2f%Pۣ1B+RI@*ejBJz;s%y/'`"pIu'-ݚ7 q. ꚬ8&-  E C6eVW3~i*_-2?N `i-tA(I!E̵y?j30L;3%M`4ZBIBlFH,ay&>M62I+ 191$G'cy85Zsa~`jwViN0^Ӝ"NlU"x¯<ͯ-rp̨D̎%H+zkiIg[yD濒r*A9rIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/enterprise.png000066400000000000000000000031511260417502300250620ustar00rootroot00000000000000PNG  IHDR szzbKGD pHYs  tIME!:IDATXý]Ww<=nm6(|ly(iyhPx@/@ԲR$ "Ji!e7fS4~]oc?v13{ "]ӽWӹ{.Ё}l̙3H"hC|~'Gu]CׯZt6=btt|$ lTJ_8\r099ٖN Hz~'łd<hv 61/NԪ> '!V__LCP(G\0P#ɨѮ.PcG^7 cD@ h. xUV" pd}m޽{5S<i4<\fE#Ut\z08M Q6r9cY-H :Šv+Deri=岎mC 4u"_~ [p>É2ư[AT*|TQV8ww6OJvDmq13se'(ܺ&|@9AU?X<)խx9F-by?rGpF9o現ƖTӧN-ee|T =RF!Isx=F$]д3 XhX~CcJw_@eui(0huQs,-Q@KP1E>gu P?G*r_4$C-в,0F!?'PZ"zSaoJp(EfUKxPF\#2QhojAUc莧ؽ3$IA͏DRO=a4?/RRdFFptsB5?(iCJSruXq\6i@8h ALٷN泯z}]k蹩?G)Jx G>2BEm;dY­9/-,0K+3 {J Hh.CwLZ]X:%ª2 Z_\cb`#HRJ{6:苅PoNܞ_%%۶aqY-ˍfўhD@oBjG7k,\K{ @AZRoSt/v Z5@f[tc_w~nZ޴߲݊s/s yyvt>0z H&ƝZ<@?)VH*yض^CށZ\\xfٌz۴;6#f۽`O(m;=9`jbyt{<\{P>Qu-ZzRvrct8Jпq][7O)'<4#z;IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/folder-new.png000066400000000000000000000025311260417502300247450ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATx[hU3פIjT[ڴimmQ4jѶJ)D->hA/xyо(R(X_Ă"h ^P&m&$qGjSÞ݇}fv`Z˹${e)Iv㳙 0FiY{YyEרpU.F{'G|Exi߲9 :>Nd[v]55QHTD[͡Ci^(#a3oHNt<};ٹj'Gg>Ri.$#_j reg0|;^^"lokld '*}d Ü6^&\` H m'ho<əƦT޽畁^w{x$ݔWtqJcD-F,O<;^[7xe]o@5UޱWRZq '\ڼ͎P:ÓĶc|`9j09ba~,~1Ww8)#::G,gL2[yi,'KG@x!?^Y2B<4 I@u~am aFK`DRJ6Rk@T Xؿu7DQ) D'`ȇ zȸ:"yњy`='W~G@R!3qˀ=tgm1Zx2\$2r!-xT@Cu|"R/b#Q5V RXD1JFe͸mQ#ȢwDI6H.JDQD}Qq|w7h|گƾu (_PzT0xB rmΧ?.@W̢IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/folder-sound.png000066400000000000000000000022371260417502300253070ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATx]Te9su4W]ֲ, , / ꮮo o>@0)\6Yrיsv4gpv#os?fQUn$ 8/wGfE.Jhǧ幷FV\0b<O1W'o]?ݽVBtS q۪\ #lyW}~I@峀KZaţ3Dmʜ'??XVHׁ" z\G܉tYM`xO+I\1vb^1iB&Κ~AsL.ʡxd{ S" LqZc¦^> '. \l]Ҽ6@,a}'D 05*a*d({5n׷YԘ$΀VswọKG,<=(FDIB'V\lȊ:+mgt6“6a1fߓEuvc@R<"[amYXSrqVE#$k vb͹l(G>96 p^;+J"d7Ĥ ` +X1<:e .`D'/! <I%CIfg\m΁-@B'%.A iyOҮc*F; "[HRhXhV"bo1VpN(Y1 :ĥlSd:3~̙Ӝ;M8oDCs>ZXX8~mewY?Z qtI:59|9CmxWjs'~d4j!U!@X̋,D-(ca]~QO h%mZZB{rk+l?W?/K\7-vjsGh7@N=@:ʀf 0UU#ZֶuIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/folder.png000066400000000000000000000020221260417502300241510ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATx=]U81ɤB "QK ;llbeRX heK"hg,fx~9p"uX-.aw"'YV| p 4$vٟE@G)riSggq2ٝoK?j -yr9{m|~YU moyMfpoc:籨I|g`ɳh~ -K73LL*T9{ƽқW~ytaX)Y D+i*f=\i9[Y`JE#A;S{TAx Y@L"6<Ƨ|vrJI0^(KU=ϊ׀@!.{QHG%bEً}ZHݤ,t@?@D0@tYaUz[f4kPD¤QRp?p뾋LQgf$O %"}4]w9CK dU^id!%XqV`l;꽕0[P " z޷d ;eR A2]dC2Nnƒ4=\Da AT7udL퉭lg {I]cgPy1A9L5If `XB(1[+ASF#əZqGBt 4ИM#K‚U $7d9bv0YXrTۀe4,A~5?wMV %y>Uɕo޺p+h'A8#>ƹN~5"{e{۷[$Z|x8'En$"r0Fݏ9>1/wSIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/go-down.png000066400000000000000000000026351260417502300242620ustar00rootroot00000000000000PNG  IHDR szz pHYs^tIME  ;+Ck?@/ * F yٖ7mt<~|d|&L`ќsMK}SCHJT-hc;{fQY{}3- hnfD"V_Ns:2}hΐcȭLYض):ɸEh5+Ʀhp Q NdMs H߇3ЀMo@]j䉣*GN7ei%LH3Պ(~2'ϵQBSd/fR9ӂ˽h@Npu±BUTSs#APqr>fn&䍡|_pmF8x(‘"B]uM7YZm@VDdS&k,nN"$:z!NGv| ` ̅isT$'[7ڿ%fR e+*ʡpaJ d0ȺC ڪ,(=} *%vy;H]d @J>,EQ՞;hO92AF I;i>"{ț4Yԍ+Vc!CQ N *RG۩CnuT @bh&ܦOQQ ZWKu.w~fO< z%bCU Q`\38wH޻ =~3<(.t 4d͗dQ|39drjՍs]\ׅ8Ǹws'J ;խR}@Ԍn?;]?&CT5#hz_>bΦoi-O6z{钵zLmA(B5MGN}"$P38֏tLD߇5RLR}ӵIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/go-home.png000066400000000000000000000024101260417502300242320ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATXՔmLSWǯP}[mAKŦ+P6hx-sbt h)lCc"Ld/7!f%" !cqIs{1rD眞y~s`%ZrL'HNte&1>ݍ%100Ē d纗&q|t|F#.݌OL,{{l2!:>*N?@_~166sjbr@cb\yƪ042e )1*_k!B1(Bf~f|Z[Vnr /ߍ*x}(:|999Q;(.>}`w.om:V& |% O! ( Hc  OlyrNaE袵sD0GdӼ4"Zw}OJIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/go-jump.png000066400000000000000000000013361260417502300242630ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<[IDATxkQgmMK<jMӓJ]JڒS\x/xA$)ZI/zSE XȥAֆ7lXB !fv?̼Dz}o ,/`Bď_~i\k5 ?V*{٬GfPO #z CgC'G>/..躀rl[!bFc@bbg|/ng@WL}lѹe\c^ć,1P Ѳ"Y%];p=BfW"ȘR0{Б`0ǘXQ drjnIXƷD4zu Q*_hmo~{ss y6=9qwS: /LnzX{7@+J}`| 4t:icc=jg= |6?ҵûa?" t8<577%]3avn׋pMSSxQs. 8 q€=q3E{P-(fHОaۓ+pOz+=iD8IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/go-next.png000066400000000000000000000027011260417502300242630ustar00rootroot00000000000000PNG  IHDR szz pHYs^tIME (SpbKGDNIDATxW[lTU]>fL[F&Tc!%H D( j@HI%BˣB}@[yi-ahX5LrkLwq;8~q]Coe$ "Rm5=g'yOAXaK$ǎog7 ^ $QlfO;> F 4\E1sCXd)DOxn9.JuÆa3#W)+cV%<u}!0Q6{򴂸qb[ܮ7gIOM_GM-lb,;eQݓ[Qr|Hձs%j.&8!Ck՟}+DP|/J]Uvi 귗TVwW#t QEGXB\J-"2gs?vx+me1䑗e vX ˲` ӄa4X>SSEj/dp!=[\}aM.*)' @Ȉ S&{({3~37\cGx|JjN"89q $2Y\P (&Qd`Lл% r]=E@gh΋*'C]رG fhDa , Zڐdaw͆V38} L% 1ȌTpL KxGcP<DiZ&,SAr,𸉜ǐ_b1ALڐ,n߶'YмaM L5pAAPI& ]z#UomؖO5{A"K$AfMtyO :=o{{uCͳj$k L'+nhO_=]sxݬ-,w2J:`tkadtI>g۷clz; RIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/go-up.png000066400000000000000000000027551260417502300237420ustar00rootroot00000000000000PNG  IHDR szzbKGD pHYs^tIME  n9zIDATxV[lUE]sI[@bAD @  >HԈhc5R#3P0[8L 7-Rn?ܙ={^9bB{11ַ֦)@;:/8>`ژwW-^MjsgNڹd =˾s@#[ m+d2_:YϏԭh\ L kG:"&%Į'vO5iXSZC*RWC-r J7WVySk!j>gwp"gfLaUEk|sK޷!ڂ7!;+{:E0 q=M}WJ\H/L`J[8Zvlnݯ+<`3ox';8C-d~>kW3n4r3]Հxd( ܌9,|Zs]_V=]FMm8R g6>`ʗ LyAH@"#%aFk[usG“-`OԆ]C dMLXSs4[N'骮& =oϿ#L;RgCФς8K GQ^F]UFގۦI4-)(ɗi9 Cy=ۇ y4m\ס3UN ]'sEӣM Vלy)pBa8vvBme! z d\RS=x M#+?VITrтL -:BI A`0t \Y)NF %҃0nϞG#F@@N>4`ThJ@ULqwi@#v#rM 3+.--B^q c"HY c:Ԝ2L'Xqxx~+=4`cha 0+Ka*3{ϳ/\ӍQsHn~X_BduIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/help-about.png000066400000000000000000000027231260417502300247460ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<PIDATxŗ_U?sf{]][5ET,jTfH_֊z!zAY% %!!LEBP衤V(T1 kg=9x9s眙k- {t~^dÈBXu|IbR[ ߬Ǫ ,sưc~kK\^$0NK@$n#mWomlCԪϚeX0YY0,*\e^ŁS,TATOru=}+PjUSV^x!>TTJ!=}ݠ* ?iƁf7gҜ@$n|;+i#O l"6?\a\blbIA*bnv\I䳞\nՀM>LĂP(HÜM'5N.bT \UPqՂzJBU0P!krVcKY0.[-ך6 ŪzJpI,@{0\q4#Ǭli 1l%ٳ$fV$ f$8!w !w,F|x=L-J:!z^H1B5"P/4P~/u\[)u:$vBQkQa隇 <uXV#3`.:*v\/SW`rNڮ=@ {ڂt*2Z9edd?~l[`)`-CmC`mb1ۺ{iC٣ MuOsa 4RЏUo^^Rõ[yaZwƲGiXًHk%4Ua3Ԑ.|wԎ%(bAĬg vWzY:ap" M`xjF!:Am~;*X3cRnnuFfv * ,m@.d6#gF̞pOׯ(%JG( +DqM$DpL E5F L@*r_UIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/help-hint.png000066400000000000000000000031511260417502300245720ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڵYhߙ3۝{-ɒRdY8vIN].]CmpB!}[i^66Bi0RB(KVe),EWWWm}eWZ9,c8 bv\cq!M _ \9ZiMwx5º8?ʬoa ǿMzBh2@JP LېFj=O0y1} {NPQ  vH!МHlsY?|+@C<+lLrS벩u8uߏzm+|'+O!h|1 ɪkZ1u&&ۼ/5s:a|yW)4u1.(@L,,KxTʫ} MN4'ykDm+{&+*@t FFl{Rz#Gp?eC6-G$LHa'%HZ9!1H,x`9Px(&nө3 iYuCҁ`톷g`jÔ% -8A7fHy5Jm>ޟ mEayDK?4~9K*1DN,?NP=p?8FQ[䙢T~;)S)s%>ԮnP1hr: J? 25T 16bҮEqQ5O.7D呋j[X޼ד[# BΜ$<''?~qv*F<_~O>P3+6fՉ59u@ ʖv3AE @$A=05Z&:RI`yyJAK"e8y 3cii Qs?}N|رcA)bZ#l6m… @w{yyܹK.wο47ߨV홙ߍD1OplIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/hypnotoad.png000066400000000000000000000045601260417502300247140ustar00rootroot00000000000000PNG  IHDR szzbKGD pHYs  tIME /mnIDATX՗iVn>̼00 230 ADm4]m6vM6ml&j*%FPaqVfewj[~r֦UNk?U4Ȯ6ލu/[7 rv }R7XvW^$K-M_|U]/>oh+n+ےW *eѻYl"6Jggᯏyݟ^M/U$~vWl$a*'ǚ cq>];~Tgg7u0Ȗongn=.nͫO>IM.TִW83c{XB;rpLD/)c3C޺(c{,%іc'|uQC"L&Uzr{,c|%xɞxog::a`A4iž=gN6zٖ],l.3H-cDMFg3#ٮOG/l$7I*q*B. % . $Cv|hu*Mտ4iNߺfL"&e7^WH@գ8-#" OV4,={କjq`CH&B2V26>vUZD`0)\CU_Gb!j"(eh`ҠI>d\ӵ e3i5 r0sKx3͚uM~y/z|8.RHǃH V{}h@5CDs{g0{7vJ}shg>q85P;oh[[V D&H)Bfrw& " 123+GixJXٌu P5V{Ls{֮YՏNJ0p#NCeeYAU:8΄e#rO綒*^`x zix"" tMdž4-` !(P0mro*g^{ĂSy'L>)G"2yc}P]󸋇_̑!4(<  ZSD*h!ʼDdM|L*XcIh۠i0=eO ߽vrsQ#"3V59La(D=i(ָrMyEG;9"I!p:3qLG%v lKbZ7{*L0?R:)yK,vW)._TE]l@4C9 R[+,Hxq]h$=1rAHc` ,K"]>|K]\7T"Ͼ7}/.m2ϲlKʓQD~b ?־Z/e^֕ +M2%y`,m.TLtLqd7MN^%> cN8ɋHu%i[0:򔮐03F<ëN(9S{o-+rUHv{^MDogqԌիu0 io{O~#^rɢQ7 GzPve35{tP)Czz(Cx? y o$5ʁ;>/R|.du2T!bK[-߲n~ O`ڊO4l}ܘdc⺪{md~M]IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/input-keyboard.png000066400000000000000000000020741260417502300256420ustar00rootroot00000000000000PNG  IHDR DsBITOPLTEzz|xxzĒwx3tRNS  *+vn3 pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDAT8c`000sq<\ 쑕IJJ*jZںRnAa q53BGdꍘ^0#xRn3Z+88;meܥ,e=$L4䜤| [98{z- uaB˜9ӳw-WpNQg:PAKHx`(KxTZg3k֌޾ 9B} |u nL"7w+7tI؂dPĩق }F1(1E";cX| v[="ޚ%qQ-["LqEVaf"+IĦ"&BD)+Rn|nbң2ޜT@`d0l[zZ ?KF\[fFf_nM{H? }_z=YQmv|c34 )[W%I Ȱ316rX7(ݝ ⺱SӅ|zfšyq_0sxpєqyv\7GSa؟8"Q>j1>s@7|8ՉŹ,߳e%9-$H*P*@#`l=p0VHiA>@ vjP @h'@8 .:n``a!2D UH 2!y@PAB&*: :]B=h~L2 p"΃ p\ u6<?g! DCJiA^&2L#PEGQި(j5jU:jGnFQ3Oh2Z mC#щlt݈nC_BF`0FcDa1k0Vy f 3bXl `{ǰCq[3yq<\ww7Zx;| ŗ]8~ M!8Ʉ*B !HT'\b8 q$C'bHBvay=+2Mv&G&Ec[ [bDDĐ I* Zc0&8(&iYH~Ho(%46h0װu wKDŽ7EGGDDōFG7FϮX{xULQ̝:+sV^]*uՙXXf8t\DѸ@f=s6'~_ ˍ̮`Oq8圉D]SINII\7n5ewrm\J`ᔅԈ4\Z\) /ד>aQ1n3|?~c&2S@L uYY5YoóOHrrsNy};_-cZuuk/\?kÑ)*0-(/x)bSWr±^$E[nEmnfmOk%%%JY׾1ꛅ ˬir]+wZiYYGgʿs{?T'U߮qiݧo۾C*זԾ?=xΫ^P֡ 2mjTl,ixwxHȑ&JG˚faԱc7sŨZr}wN>8(mP{nLGRHgT)S]]m?x3g]8wn| ƺc\x'ߥ+=/_u=wvWO]c\n}Ϫ'l:o\:xviMoܺ~{;˾;y/Ylx~XHQc?:b=rf}Icda)iDӤ)ϩV<|~W_}oοDΌ\«ï-_w>~f~#zGPQc'O%wu cHRMz&u0`:pQ<bKGD pHYs.#.#x?vtIME  +/ WIDATX՗ypuǿ=sdd29&d&!! X+AݕXK]/V-k֭uk"K DC \TTI$3!ɜ=Go@4WۿO{kgcGoȟ![bpRk/0 S2!N&PD*'$:J( Xb>!ښs>͡AcfG,<QBZPEbhuȟPYɓ'o K.…$@ BaRSƽDєH$r'O8B( 33WV^zSC}udKC#f$K!xyͯO-ouf19^NrsҒ22;@o X3 td%ⱸ}ukE%IJ:%L+,"Ͻk , V3demo<]h-T48_mr9xfq%I~UV^~{?\_d 4/xk Ckcop9];Ӝk_Ro;<|NWM~o;{4wt|ܾgךoh_v}clxK}uWCpst|pE$nu,)?~ ``xtzمtz9S&Ӎ (J:bZ47^'ڔԠ<^|-Xs"@G̤h Ϫٞ3I?hT$:SƢxPfŖ]O>%6S]|6uvu?D1BaI6xD5 J*qGywҶoe(6TũTŮ[ۑZ;Oqi(A$8È Q'eb)>`E?9w(+܌>? pyP&c`ad1 :ĢGUX|EF3@8+=ez/p _ PA8 B(@&@*2vᓥew z S 7͸5V=u \tb"2E>%wniv^qlEŦ/@f'b ʋ3k6[H:;+P:jb5~{BV;OE4e@p30l7<|^?fϾ ݝu`ë8 HARBz-awoφ7>?F:H B,PB`5_^s"/=O< G9D6PC<\41SsSPB ł)lN/.>΃F{(`y+KHKOk5N@!(r HT"6[ M xG$!A&GgaY!rb 1\CbV"LyyGɮ6VɪoJLYSdE4JtqyYj$bThwk-SC˃RqMGuf!\}m^xz){mn f2 AYwVf(S²c "%ɚe[JWW'N#;؜9sˮ\ƧάRߋ:ɶ]D.[{uoYRz+skeV,|(?_WLT9.3Y3}Ҽ&0承>x?pɸIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/ipodtouchicon.png000066400000000000000000000106231260417502300255530ustar00rootroot00000000000000PNG  IHDR #ꦷ vpAg bKGDC pHYsHHFk>IDATh͙gxU=59' F $!ФM(ҤH)RD(GQ )b@@DbLB - Ԝs~{ys޵^ނ'(97AWg#jwm/XayerSyE B*bJKe(=r*L&m[q1abr^ݚ `n8KP)FhQwشlj[\TŒ5!ǣ~RW:]M*MLUߞ8qʗ9JKsK "@)*<@iEwޠ e9xx3>Sv)OQL)nĂʨ:nm%ؚ.+r=hy3 }/Iybכ_w^9Kr?參rcCebm-ض 1A[~g$<5+) t"hO{Ci{!cbfrQ1Ym^Cesut.wPqJ t#uݛ66{/Ck9ɵX$A,oh0p!\Xq:j,#2WA*+PpX1l i?rg^?5yMuŔ{K;4UQGѢo\ƾlu5KMlp.#*|BW4՚hsDweXN?WG-?6` 4~ͶuA W)v@!"k}<ғ os&1Y%郢 J<'o:/0ui<2AT9Ƙzy9?C}aȌ^rg3]}! VW6U՚ve'۱bljJOPJ PA%qԒ>O4A!a/jL0Lz=ԵzѾ@y3!uVah(*g˃1]'!|M4L b,YBT%f v1M89k5ir#T#<Ҽq7e(w=:1 Tn>-A[-)ҽ$,$p2+D5b[ (S~ v:7Zfm4 RzAf|]%5w;7-C⚅HR&<%?h (])Xhq#NP .LoIqIJW\-:X6~hӥ_}|k |=N- ^} k_h/o 6A!]$N"M3U;DVZ/t]th6kW|Z u vTN4Mr?j0eVŊcP;^i!E| (r281 ֊b rw _0m4@ޱ8 _;쥮HhkHr`ms ?F)N)]DMi|0;:D Gb\[lc_snkAX(/KKJ%(\S> X(ybEPWuQM3ҷR)4Y=H^ǿPE5PF 54"GS&>ub rátlOZxzRP/5uj\ @G02 cܿ:hAtD"ГtL4``7F_/[jO <'(TxS8fgnť)J__ @ wi3>hvZ_p 4&H7_ުցq )˛iZ4 T|>ɜ?E8- "hByY, UB|xYWwA'[%d==٠kkܽ BRmcǀIY1Vy0Dcf}6\^a [弲JH;J060w!@ʥ35g癛solϹ8ܿ K(=X y,@On<4P$y ;屮 so@NP\l ݛCvƻ=7ɷErJǭ|T?WFtWB=F =m;=zOtl.ϝm]׮~42AB [!}}AQ]@7(Ÿ՝zB03pwxj-9];t=4j5xJsCM4I|0M낆{G\9/~3׹WzfշOM8?k]!OnP9\ͽ^́|{j*U -wz\ڛ8m$r:#ՆԴ_11+9i劲Ay;1.@JKA] 惦"趵GG8g<44s:mvJ`# q{*,|'u +J 5 .f^^q&/8& =fԡWJљEj]o` Ouѝ}CЫ1~Ip|s֮.*ӵCOkRK,>:-&+M^>Q#Jd?gG?JDOVTE=)$ҋ)RESRo Ì}b7AdR[IRM5w@叅&f}*(y@[u߀y 8N|aC0YU`4 8:{ZC#Y'Ofv{S]UKK>/4>T/w׽`ОZmwE e>6?/H C4xhƜqqnvkUkm6kVvumu8;B6F׶&mA̖N^֜0dWiR|ˌ 9$T%X &ZiloQ/յ;WչL?j,bRCw6/4KuN ֧b&Φ;gi>1/ggxx^10- yMXM6t9UnuGR:Kj%@8Tg${u]hW)jvNPʪTW)j=]MA[?BO=VʪB*'kkߨrM Ӱ6[:< XA1 R<܈{̀d6G65Bcܚz̋^=*kR3uӥSlk4o|MSOH1%ۭ9E sTcTTZS)ttu~W&ΌVi=j}uN;)M/TY %A^mmIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/kittens.png000066400000000000000000000023321260417502300243630ustar00rootroot00000000000000PNG  IHDR szzbKGD pHYs%y%y"tIME3IZsgIDATXՖohSgfmhZ#-ZE(3b +HJa 6F6e@(-dSZKU+hY,I} ɝ:v˹9y=s_%} g`2ϸrxʀ3ؽǗc-djo9TiyAUUU'zp>˥]$_ *(('|]&I{*++SIl6ŔMMMfi׮]H$b[J߿?#~^jkkۛ&mݺUeN}"9si݅ցށa,Gǯ3RRR,3;0lw Ν;֦Y-,,XbԤǏ?o&݀ tR,{^%IUTTVYYN8;==mΒmuuuttHۧSNe>}"jjGmmƆ ,`0H(" t:p+VH=qiV\i𻹻\2$Ԕc ÖC ;K.d2ѣGcǎ .p-FFFX\\ P𸭭Mm{0H߿իWg|>K7n0I>4<<Fjmm?^555*--U<x744{, \<5khdd$766'>kVd0 vr 櫀szҢu)hppPڶm~vsndӦM_:@[lə`bbBׯ_Çޅaݼy3ojccY9Nݹso ؘ֮]k _xxG333K.Fe~x_)4ͺ|ѨeH$+W,Woҕvv?1Nz(0~?¹)IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/list-add.png000066400000000000000000000027171260417502300244120ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<LIDATxŗoTEǿ3sΞni @C1B "D0i|21ÓȋP#ojOK !BjD@)KK={ficbҘf93ngW03wok~lhֿ #h˭{z `Cbmz[k u=wK{S@N>)M{>ա~V)'I^a\kA퇘ęط-LaTiwIF3+/W153 E(<]2#5!$!uVG16@ !BGXcYd`,ji֞j bD:^MyN\69wAdCJHw81!2Ơv9b ul{<_uF56ڞNE_Ti=mA[$lʹ8wMXؘ%@D^ck(pW564֞hGoFwmׁ`.Au\ܓ5 r,?!$p{GQP҃'{g !܉nύw#zڻ0T-4 QJJ7(Y 'LJXLx"2XQ:4yLvrƦ02uEQNVpH̲Dm0xúz̕1} gGF0md|T[k8 $K+A8dTV0 10o J(2Vv@RYf ^ ?Ll>I2,]G D"hÓ!h"DS@W.N.-Aw .@9 A$H('܇5H-rkea;Q73L9)[cUe1edu~qBkx1P +)^ {zVT3 !%B.j!%=@YyK B&cY, 0@M`;SU\kC}%@{DxNڹDвNg|M2 G*Jr$ ;#RMH&bb|Lh@)p3 TJXF+E( 8P2JR1 (DF+F! , k<)D q*VPĮ,fdz^FAEQKڴU)@=1B.Rgނk3nRDVނF8K6@)-Ȗ"C"ivB.sѱH3xݙy3e,h0D~~st8H/CNֹg޺+ĵ` ăB͛'Ol. X_ǻׯCNMRB7braA47qPښ|v4ɽwt<ܹcW^|Ul4>?\yp =GN"!MT2S{Ur?GBժU[|)pAvv֓ahB2`p~ cX;;?Ϥ1eeBZWZZ>^YQ숧#'L S~cxR"`ǾV6/ ZK(‡׮ybYT9A*5r5~Z#%Oӧ<2Ge174 ;\fM?G V~ vozpnŽo/j͌<74X% $%Ѥb0Jk5 =زKȐZYI%mI"4`E~=BFEB&) `,cX'ߝ"zTXtSoftwarex+//.NN,H/J6XS\IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/mail-message.png000066400000000000000000000011351260417502300252460ustar00rootroot00000000000000PNG  IHDR DsBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<PLTEُݡ⣿jtRNS!RSuIDATxYPDBdxI 'n)-9ktBA@ *pT*9jG+$I,l^MA$tiAe2mz;SC | hT$R?0$\e?@n BhT ny!-c]Mٞ؜kve{YZ00Xc:!؇aoo 6kޢ,qr>ki^:IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/media-eject.png000066400000000000000000000022551260417502300250550ustar00rootroot00000000000000PNG  IHDR ssBITUF pHYsvv}ՂtEXtSoftwarewww.inkscape.org<,IDATx}Oh\ULf&$ J B bi"-mq!Jօƅn*4T[mKu!TJU&PI$Nf2yKޝ{w=@Vtc0$@]X s:m;jȍ`Mw 6-IEc@`MM4U4Hڇmp:^nw䍕?MCmt[Lc[g.꿊DWݡ˷6.& .THd3'Q{s?W_tQAʊ NRRQ,o7!7^cZ. EzQGIe _Ks/夲I؝yLd/E ؒ5z)4ܽ#şH*M2,bF`+|<LWYOJ:j."˽@W 2\a4_dοiu[Hΐ2GOGQ]Dl DytF16X7rP=M 3\v5r5~|F!7?RCev}MѶqry=dNٻ!x=|ے)5#F j~( 84>UV+,kWMx1s`B=hW)5}z.SW>n-|=4MB(/ӕz w[KޖZR! /,ۦ$916fB~Ojf(Ny6ꦒt ]3*}0 |љgyJSIWFj$03ӊ LF Zl gpNlia guc16>5xCjhʖ^BN˓B ke19Rh*/}A^7*jaBvj_S-ZTTgoUPY -Y j,ބ(].uE^6r#s(}2;!/#VgmCs}ښks65ד;4כ$p17ʘVW6VLIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/media-playback-pause.png000066400000000000000000000021711260417502300266610ustar00rootroot00000000000000PNG  IHDR ssBITUF pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATx}Oh\Ud&3ɤd`R n:ͪ ,.#S•VE7P]! )08ҙLf&pGr>o|{@}' rN>#+^'HN  Ӝ.⁄ 9 %i2fZKX.TSZlPB!PTg^Ѡܲ;FcኯthpA )a_Ya"9uwj}Š(9]qBWJ6MFD#cl W}Uy\(%#8!^إC[ ~f%Yv?jANj-WgXB\ w O(Q[-6(GgH?f5;Rq^>L@:-h1IEH 2UPsn1F>lxgSyV_OK׳`v<Х{,!ğHK%O0;9 nqy O!-Iz:qY"ߥŎM6 #!+(RӉ0MyxtM ;F'`D)LQG$0*ŕEIFcun2N4: DDEl@70;-V cS I 0d@ncKyDn? /l%aqɮ=Sj 9 zǼUSVp))HȈ>`pїTel"ogBJCv~[en_: la%3 &q;l,v76x':.2‰xBgJݾ~ l<9mw-6O*2í .E^e{K<+Ѵ,j,pZL=|A:,ԩ3HYlAd˫Kf!N[Yc~d_ @]qnק"?-6bujTcG#+O5ZC) $@)>bmY c1sT2(e|ɓcw·?I[xbkk,r #h%[v`1ʼn`dB%xK]<܇_.'e93k-O' :i;S_q}P\.g[zvǵc rJ傻|6a9ßъIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/media-playback-stop.png000066400000000000000000000022151260417502300265300ustar00rootroot00000000000000PNG  IHDR ssBITUF pHYsvv}ՂtEXtSoftwarewww.inkscape.org< IDATx}UMh\U}o^2Q30VAu#DmV]_wB\2D Qq+2VE7PB6J)d潙KB8̽sw5;eFb'[JS  >r7>`*] #'  JaX5+KӐo#>,P ^7ñW%2gݝ">&]k! !܆u~60WBvC]+ߘ l '2*e9ҐoVP:gjPE?`[b̉u7p(V qL:y+x);Y4@/ᘟyOQŧYCGe,J`-=)(JY/浊M7E!?cT1f+T{7wƼd:BV"O*Glݞ 3ƅ-`)Ƙx2"<#gkJ اYO"UκJk0sv9?[܆D5ݥc$pl̪"?#C'^Őf8ZE ׫暡P%ǀu  x ! +3(hs\u,B?WA[/(Ӕtx}Vz)_09[O?fخzJ(=+ݔTt" SjA3V606#>; ^%WM} ?O_^*"ҙZ|L3ϧno*-dm-,ːlX%M0A3M d(ZPW\#TE{##jLHcS÷0X(n)j*5j`,5>DxpxBXv.â,ʐyO#U %^z^6Bgx]=!2ub'[8{~aQ }$*,+v—R&Ox\Uꇗ˨^8q=$),%q!C ?K` IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/media-playlist-repeat.png000066400000000000000000000021071260417502300270760ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs B(xtIME ,IDATXoSG]Et .vEŢ;ҹ}w|\pQ7F1QiZ$:)DoBȗ%*7[H5jSXzk3 PU~}pE1q}{\W_feʛ =ѻQ{=gB_ P*JSQ.B0f*ZYa%-xc߫6Swg?Fek{Y.{ZT̀"l33;:yFk"idB L )o^aH8YD6saeu Ü,d\cNmy-,$&- 9Y8]hE ,@0 d!S0th'B@^@2a6?@he|1@2C{Y{wG0ڌ*=vPo3L=}h@{04x} Im?Uzw/j ph`6IAz&D+QejSkdӓ@T/+ngS00طlcQu:3kfZ/ pӪc(bզYd*S 虾 dutZHo|$x2 $S1n'lmc m)%/lʷ^S&#wO`=VjVm(:LBl) u4b?cC{"_TLM69P רYp1F(ҐX|A8Wv 1A Mԫ''$ZDK,,ʙF&EeY9V^>0P; {@ϲ[[$"@-#ASO||-T$fw^&Prt'fy _1ޯ:3::V\v<D?qc?=CM܎w[Z,+=2ιy34  b8t/e8 Q7Zڛt?nߊ*Bp̉h%H[.X44סZtJ+@5KcZ |hA]k:~}e0Wy!X4VjMݑw,nÅj6.V3+Hi;ф#f+ 4Ω@EYƚuX5*ȋD_dUH2Vf[t2sxX+_Ȅﵥ/< eU%PQ] [USF}-ދ8VUfoOnG @eovn'CiIȣ]Hܣ"5;ҭ輌{uy>E}?zn@7E[֊RO2%UU6~&1!U< k] .$Z+"R[D|M?ryIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/media-skip-backward.png000066400000000000000000000022731260417502300265050ustar00rootroot00000000000000PNG  IHDR ssBITUF pHYsvv}ՂtEXtSoftwarewww.inkscape.org<:IDATx}Mh\UsgI&V%cAA(1k A.KTCPDKVOm]dE7 he*Ad{>_p&|sr3:㝜v1HY@UkM:`lKHШ`"ocŘ6MZ$x8C79ՙr588`_pBUT(ZոBU^fnyj6+-2>ɇkg-J<ǖt" b%O̴F/ٺP5d<.6h0JE@dx)H4 qp/l]Zg@j1j|{YtܭYݗZ:ȦP?qExDhd`M4dv\D7EbA+۝I00VED;4T~Qߩ*ގL8Y_Nؑ`\8~:MAqT ,I/z|_Y^dmQOIȇ 27i!'0Z\a?T}I3)3Yp6J&C:P4: 7yzE^&&X ҼRv"21G zCc<Ģ92fOW[ t7 MkTy.幏MX]ne-}R'nU2̙74鼭{w\"'$ $MzWTuɿLnh{T-;x B'!EY}٩]o u4^iWrXLgXG/t\,Ňa+sq\Sb%4_N6MJLHiKKɴr]r{/g~ f^vr+(HDN9Ub;%;eN$'eڴtoQA)"tXP0[DQ@+HyX#m.)7ps";,( .Ⱒ|Y-t4)a5~B(T:U Qporux+Iԋ'𴕸IQć[P'\mAy]FrUzUAw}\'K">;Avg߭0K"Ed0+tP*զ|/3@.7^R99\NMjS uHhYWrX?YCqpk:yFj),F##ބ# <<0ڎ gpaPHa`B}nвj6)wXu_fWIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/multimedia-player-ipod-U2-color.png000066400000000000000000000030131260417502300306540ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs ntIME /"\IDATXõ]lUsg;,iSىSQVm [E DR@վ uU_*.B+DW imUբ*HP&uMS㏙;wjO䃄+yss|F\(\TJ)fggSSS*5gff\-+twR'`S !F+Wh&0Uڶ ?`Y<&BRi+L$+J%ܹs0HR,W?edd#Gll @qY8&:'фᮗ{ Q?i4] 7ѽ46n^~R!مiV6 @JҮJZeܽ[FC{c îXC$E(n,'y2݋}~\@:.X]_̀.46%f;u.Bx l`ߠSix>BȽ8&wPXS4Jխ6?-q_6;;w׾okV.^H6/)`0-1#\(gbg@O?8<=)EI)E0KDJ 1>NUw^ˇ/5_@XoP4@tf™M$4 JCM7Ѝ vm`ato40x`X!]|8:BQi7][Vf9쪾۷o355Uwޭ[+WH$tQFRpx<uo)e]Mss<2:ʳ;od4[#i{7MJ7II ˅0d2<| \+'r՞./%Յh{om(f L"V8]]lteƆbHoo/.]0 +y_!x?B$p'V*Je?E*B@ww7!,|x/0DP;:ȧRݻ. kRy EQ!li}@I!]xRd|2R{n;"JF64`ۑRJBp8fu]ӷsm}^7}AY;kj(cc|>/,J^) rrrBo|ڵoCp8(0 i&iR9r) nP.4z\\.`D45}M;@5MJjVU Hm;uԞ^x>5c:7o+DÇDY Ȭ~u@b*F躕_K-IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/multimedia-player-ipod-mini-blue.png000066400000000000000000000027461260417502300311470ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs ntIME 8DffIDATXõiLg1˒-ٖ,K\jo-nqJd/{13.",Yf6O.A17/TD[h9e^\z,mRPdu '>y,]wO~Hk_3UEїwbeobs\rD\#ߊτ'`2;apQvO $hX6IH 4@W.'}c3!./a]uv.=iwf^F? Eot{rħ ht} /5&U@$#tϮ x<~KhaNAY9lkjj cccS\g&@yyD-额$Vkzz{,$o0tAU`Ƨ744{)J‘" ]5J2fYA|<͆!ؖtU?^S!2)(7X2l;2`z-Hw8xؠ4 $|ZOn7 qe3uF0My,Zzht󊌎W ZjH$ؒxsQ*aqqݎ>m >,!.I3u6$^~N4 X,Wfd&XO|l\)9/IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/multimedia-player-ipod-mini-gold.png000066400000000000000000000027561260417502300311460ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs ntIME :nIDATXõOSg1'۲ńemɒme.a7'Rtf^("ZP KZ ^Bw"G ݛ|rӓ|yωѕ%q=UBy]|)OyuvJ̾B鞷{;^⨅̍m)NEyBm\D\5LjAsIcpCHEA+ JFsi2r#7مDҢ"/CQ ].&DT˒։h^6w0#!ni׌4(A<0ZY6pe]# Ly˳Kjf^iJ7;n hE-nRY;! xmS7۝;"D ?*hb ^^?q@ 6#$-aBT dI!pG^!pEcv$FB *yBum}Qq,( $ȶT%q9ѡH$H |U sx4$A-@ 1"_7fcȪD݁@w-ຼ.U o캲AW`49V~_Ͻ#GB6qb2Nr]6o N Z6::ivP#%9H$ axxgrb.~KNi8dov oB) 0=P`J6׻?a {W( 6 xv86I nنew7VQ%O0+$Ĭ@0oEAԗVo[2?r B %@2-`YYSS O_2WP*ҬPe=?{Z4hSfv%OʹsPRR?HoF4`(&iX;Z[[< Eq<5gv]OOڐ5P(jb£ g%194SEZ6\Ò$U`L&Mcc#d2d5|iջˀC(NoKuuucT`dDggg!׷ԓDM">U`ZoٲZX,hyEؽ5^ Nw^s6+MoWt| LWSз\g}Ll6 U9EߐnY|Y!Ocɍ_b͕ؤ[9q1v+GU}}}<{mF6 z]kh4(tW^DG3쭥;PM>b/wCͰ&g'CRWխ"dglgd1D__Fn.ܔ%!-5ۑw3 P_3A\0{G lJ`G7&gTB+ D wxI?ȩ 4#i^?[sTv֎@ޞA8=AyS':/P&* ?7ݾP4(zf'* )(p/; [&نV}@"f(Р@t6\*l P%3GƝMBUK\*$RQı$#g^UI"(R%$JR~Fl-L:r\Oxi Dl `r @wo98OZ*A ģZ1Jk"4 χm1(*v[F1 X 8P(4YsX'‘hp8>~/?,#I3\.E bION*jϦ999ToHq4skV{MҖ:aV AN!J'(-$hjj^HE fs=[fo0Lq_[;O7͉ As0kc}m9jIPYwto#IĖa:Zy=d`rF!LySzcs:9t|sʉXK؎X@zv_ۻcɲlX,`-U*j![&-[y4?=zo?~~ÅIc\OᕇYY3}v,M?bǎw BOkf=ȣGh0H"0V^{(~T*^P y*U*XRL$ϋbpxK(~6w "0c.}ȓJ(pvBjd7Dvh@sfAR oXZBd`\hiAl~oZa&tW䯮P( ` w8X,@@+G%q={$46"! >_n C02 tvv~I|_(@d< &~Ef`m`1= S~(mjj CCCxv:8pֲY/../! 糳k[Ӊ2ȖjuD]]hϜ%qcV[/,,ٯ^Rjz`k',.}\B Loūn;B[<F[OYף"] #F tfCq2Iz̦Tii["ENAwš8ׇrϝ<'Ë}L$@{j'cJ3%Kر01lhK-++WtgU*۠-Q:ݚf F1J( pNMgY/tAwkE[cblY`Xģn+®~iNj5ۖ_A 1`GGz( nH=F`raj({{{?\o߾n׮ݻ zZ+jdjNL2Z33mɲw8l`-8V)I{]y)9Fd))) d2؝N QSI`,>">$d&f "`FIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/multimedia-player-ipod-mini-silver.png000066400000000000000000000026371260417502300315230ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs ntIME zIDATXŗOg1˒-ٖ,KHv]l]..?lyhv4n.ND(AX"j(mi9o#wj+lI>)-}~>o(*ۭ+\񣯲XxdMeTU4A˜>:yҁՅΙYv^И]`a2%;_.]wFaYfz4gVLn3ҸV_\lGv|{.n),)& OI/Rljj333{FnlKFYLM&-Bl...ޢP(:l6?K%Ewmb],6&u6ėbIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/multimedia-player-ipod-nano-black.png000066400000000000000000000023131260417502300312610ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs ǠtIME 3#KIDATXŖkH[gǵޝDN+D( _E67AM&!~ ☗/Э0!hFX5&&rDMumsmV7Kc_9<<5ǛS\\WdRRՅsم3v[o<1VV`qq%dv?j@PPV7[mPHUʠ7ZPn`{WؕKqV}8chF;{щ tX5)X\ZfZXɟ [S 1?)6 M\3ΞIo9 -]Fu&RS&w_xB:n}ރ/\#9_JNŕ+oގJKK}?!__ߋoT E~~>(++CVVс ->@UU oRTBW0< T\hjjBee%???&>illdϢ"77@L@NNkL:0;;ߑ %%%.SSS HIIqQ=8tii^4 444`l@HIٌ) 3k9555<@;7BBBs )󘙙8 \%.HҥḰ6!**rv;~bb'xP}dd&C;0666Zc㰺!Y/fqttfAXf ]*H7[[[8>>f3saaa' 02C8vhӍgJ* `m2mx"VrgBMZ-j544tZIs6x\YYY>&yGGG""",BB%g)')jJ+i/iѐvI:Il7TF`;jyyy CH[ˤXR<)'arr[ IDATh՘y<ǿ[R[kSm-6RBǪ-jtILDk(#"Ea1#r43°no~{,~}>A|˘~uc8!:ß8I~o&* tʜt\6)ni;=`}N:|ן~aϛU0(%F3~Z˞Gs>9hMCpcjB)'Q)Pc6hh}Ic983j چ(vZZ+_ߔ̸kD2}ţVmkM;r$ey aEs*V0Y-Kf2mjV|;=x}(1~?yu\.)"'X% &FZ;˕Ǧ900(I/~9 *ѫzH0^`O5VF3Vr1ڨCj#f 4 ,@EӷOM~ 3E/7" P,yQ- y|k&KtrM$NN4)9;NzHMPQY9)UAU*1u5GSJ|Nt-sQH G-6:*-jvO*VG.X#6Ռ3F2OycA=e;f{lsn)!AlIۅ8p 7n7j3#V% p_j/[H쾇ju HB%$!*(  ?lwoQ_^Ltdݲ[ĽG$@"ھx&(]g1]#W߫L3 .JF X-$kll'N[eHvd=~\Vhkg@Mꎑ3rbˋGo1"蝎vgonm`[6* PKS3 p,$SIRmWSJ6D?B<zA0X*Ǚaw[\#z8 y >xn^r"C|{jJHLdUl WIOqSIpny0>8V:Pk?@qA}>dog"ڌwa^x+x{,`b..6J-1W6(G2KQBk ?{im oC"\ORj5A!u ixMYvtяx1u¢k;$m;jmG{iOMg&ڝ^m/CDL"_ˣb+JĺL I(AxQBƅ {.ajJ'AP1O5*ÚLb)OV 0R{L,V0f",瑝8.EVD$`yufq6FYTW,<n[ܴ>9|4?Y:ɤX$z A/ӎ?fJ8IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/multimedia-player-ipod-nano-white.png000066400000000000000000000021061260417502300313250ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs ǠtIME 93V IDATXŗka n= AUDDՓ E?ԃE *lAniI,Mf&ɤ&Kt|vֵxfM~q9{P(jw:]8^HQUR+H{1ˋkeܬ sޔ,+&nU*^wu@K)A\!Mѫ}!?<)+TI% kuF!yFS2'4ᓵ%r;c"jI32.UMI4 Ք E)-JP\')-Zdn6==sfͦ`ZEmZ__,@V)%F;-?VyIdqJbèz]Xu BhN~D"T*`\.S w`,Y sȈfiUQlX X,XGip/vN1@TL5cbe-R#Ԅ(Q=p7h..^L," Ѡ Y6.ؐPL\* 400@Bp@ %nʂJ,' _Gsm6 8k ^~;@\/.bSWYY~ 1Mfz#8Miqu&̄+0`3~ \ #@*zF hN{TU>ѹ\i;}<$Iݎc4,G68QIZ97}q^74+/i1K"3`Yrjj9؉]0$4LOOׅhTB!/9. 0ݬ#C'P.e־?yW~ IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/multimedia-player-ipod-shuffle.png000066400000000000000000000017011260417502300307100ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs  >tIME 7N{ AIDATXKkQBpB\Rn\G_PAZ7uᦁ,z`6S{I6&K3ffrm4{tJ[ ֚  y;9# IfPp U>?C_G"0X,--;@.;I׻Pё,//(k~xx(N;ӆm j@LӔZ@T*%۲*hT&;AP*.PXRP04T*ʼb;lTVɤbQJ@:^6 @]J岄5Me3˲TժuX#K,6j;;;ʌƎS Ls_eYo,4%I)I.+(F`ѭ֖fs0i 92\k`@RR'a raaz50~Dr{80D"ʸLNNJ&9_dӰ/~T*LMM׌`s3#qMƔf Dk p8K)Ф zvGEAͤ @¯PjGFFdttT]>ލ^PL?>Pdcc#؏C/ kL9'W \ހiz8?tɄ`NڥWhkgue#J vClR|~̜a'34ز`>U @'uY-cOx;j`Q<4:Zw/OA0>?o^c76=OP( _@rlFXT쌱),iqΠ]B90xD"p$7kJW;%*gRy8~'wY>S.qFm65&i`0qѳon%rYznzi>o*{WWIENDB`multimedia-player-ipod-standard-monochrome.png000066400000000000000000000022151260417502300331420ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32PNG  IHDR szzsRGBbKGD pHYs ntIME ;7! IDATXõnW&R+E ^}^wUޡZU*%rDmĀ`l`f|w 'caKxa}k๹!mggp8\fe07IzA&?QmIB:}bl.Y\>b ~=jr:9}17MɴF[j #V?)o~fDVzF"f~{>nlSz!4pD[¦Zkx0R&3)e(.//@:_Q4x^gϓ|l&E2y4EUhlArR <:ܞ4CrB2;k:;; q{=Z:鏗oj.0!02J3@ <]zNNL>QZ@ݺ8::h4*{¸P(lJihl6)yZMDbjJ"1(&p_3@v#0gaN&1gDl$Ib%*b1/%nJx<.*s'`5M%6 # , 8`￀'sEoɆk]$`0Hs^aٻB iVףFa\QM^s*0gicc70VD!|qRNo!yPv@\. 6Da8kPӦM58.EIHD|'#F"jS!PxqD@uf8:j NN em6r~opoYy/ _1m~! +xC>9Q!W{0Ĕ":%ñj,ܬ,gZyaIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/network-server.png000066400000000000000000000020401260417502300256730ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsuultEXtSoftwarewww.inkscape.org<IDATxڵUOGfo(8`'@r9sPQ'CzFBB=J=[D: IKpwٝ'6ڬvӌgggy{oR !iV&/K(Jr/pm8C6pNL8oy =F&,E2CbjttK}~xq"Dd. @àG0m;]1! jj, KL$ Ams;}4M6^Q{pzzT* {O>Eu^R զir/,6]qgacOqg8 'N = 0o>/,=z@{+efffs=q)1 ی wQ"م{Tlmmwwqcddd011J|>o+!jJo4=T_Wnެ|¹8WaW?~dSSS?X\\_(FL"RڂGiH ۶[@Xkcc+50777}`s^ÏK Fv ?s7+s H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧY\ pHYs  tIME30ڴK|IDATX͗]l\Ggf(QՂF >HT$BB-H4(@j$U*RՂM:k]{w^;5i=9g`oW{]vǿ=}NƷ~<~YgYXcEfC=꫓7C'Np{pljHmtc&<*a˖Md6 yff.?Ƞ'?Ǿ;6RrR?zkT*i\ڨmz7[3o8+bTT{=Hqm.Rs' Mw *fyNu>ȳ#*(PUr `Y\ c րq =+ 14 CX:0x#FX))FuaY@И:1 ƀ*1b@5N>U > wM6qtО2dMa_! .yX >?>1)!(:YSG#Aޞ$qؙ&,枎15 `5a;1qvұs~|Յ&'q+|֡i(8q9bKuwطo|63׆{LJ-3i,cW.qmRա?=}#_G LIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/phone-htc-g1-white.png000066400000000000000000000026011260417502300262110ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXý[lTE93RbcxD JL$x@|%ĨA%4( KDT-t眙aLsGXk6l\?GJ2ֺrP tu^OWTذqI;.XKL"RUѤRIb:ZzGӭjuڞ|6^,tvCٳ+gΜɲe`bŶ#-M^@)bmmmh+zDR$--Q8z(/A*R.-?BV~ZK+%Kغ쯟@,G:G:y13@=ͽ^&Ns=<8vp#4.{Ed@U-J 97 pIsvǜ<[?_ \gc"Gxb"6m )^+dSp&Q+4o[G.'jꥃېΧ9>9gLm@yc (G DiE1N ւh\&JX pThԦO̘"N5EHQ3mJ8E ;vb 4Al`Ihhdp8O`|Rl3rC|(jj\h=\~T'<=1l1 w4?%/V>ٳL:&;i1ܽ5Y.{d;#B*^ŮCyR<ۯ/ؿ7La|+92򅼵ڑdw9P_'uͻBd 9Z ωkX(8pmVW@L(7pt40 ,PM*$jWV9E >'IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/phone-nokia-n900.png000066400000000000000000000024271260417502300256030ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXWKHcWorդ1Z@'H,࢖ҝ[ Qi.č2. WPlWZDhb3g9s=νR$Io$2--m: lEt:`05\z~=C2Lċja^ib{GKKK477---O9>>&MVv{CQg0~F T,OwwwwIޤ9V@zzB@T!Ű2*k˩M8߁ ~X|ww'`b.T!$~N1{1_[[K>ckؘ|vv&6bЬwMG`/Ux9mhhFFFejll$*dF$ujhڤy_\ l61B5t)-++K=B>G + @ w[@7 =S>QCSL333@E%j9AK6QpvvYULDN:88׋+++o44qFFX"y<,!I'Ԥ3 .@Sj- H*kjjh_=xM}^^(ND0J i)H&^}.=-eD]޾Oa@2-4kkk >p:)#M| 0WVVz\͠Uh*(Bc.\YsrrD&]AAʆPffԍ=>~}ɋdf``d[Ap *k˲QP_5OO[8p_ysQ"O?$oy1ǂB+*crzDpꈄ7fPIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/phone-palm-pre.png000066400000000000000000000030651260417502300255320ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXåo?w~k^mBHj@Ÿ TAEJ#U+!!UD*VD*ӖH4@dc{g̽a ~99Z;J%x]N{mb2\*oRi' ;A?dUI0W9>{nRY 0 ?9u{THc4;0Ó +Ł"޳̅wgQ*MfF)̓3mk9߃m"70T|ugxEy\N~zM;"0a~u(,ւ6sp@ p\=<>BM5h4$XNh6$!!aJ%lK7a*qnfŰ&-=9(\E)2\,ҕEf.ݡV a$5A51mD&+w|LOpi$NV\& !ip >{q~K wqo;E˟88r8Z !E v 4åN5nDWxx"\\4ka5X r]9FFFtn2PY.R_FDz*JA!ߏ՚0bELceA ]ct)V5R A1TbQ1I dՀoAvP}S-:I1F0s'G?KipݣU{[VOk>x>} G|ߋ4"3OydSJꅞv({J}b(wFPpueP&\ A Vf j50{uxU *}$Xcк]O~ڝ;cY p~2e@VíJ!f#ny^@5)"ݠ(t32>0|m ֶ'j7f'+UшvbWXߏ:X+IBynnz&@zq]n% yNiJq]w[4v1 zb$MxӤiO՗PYXٌƬ^vJ7|?xQb?nQ5(Ӎ.Zc-ʕ%XT_27*iǠbaXW;8Eֶk|lQf/ â/P7!V \ڈ|/>q>ۋ1#RwJT;Qc:dSYF~~yaᤈ,A.w2vppϻo9KXX\4ZehԊ"PVkvi~7q86jm=M[ZM)<~<LC@#!0 X  @u>|nvP 9EI[yIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/phone.png000066400000000000000000000017141260417502300240160ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IIDATxWMkQ=M#iB hRaB! ]RB. qEЊB?PquE\?PJE.lib'3 k3A;g^x<20 Jy3E?|Ɇ(S-:ՕZYYnnn =LOOcmm HTݍ~P UƘ1;;F<. LjO9@T)l ϰf1DI'lrSV1d L)3",u=E⠀ΐ[a]jcKt(#s;r N $'f' V/NXy"\dp:Xt`/F 6{YytH"z쁤* C]>  uZ~0rM"7+9G* { C)6;@[VvpaY%t&X3@N6f֘:10Mˮ69w~P?Ees>a_vK$jcc#\."~'#u( Bb1zYpq><{g055Mx982v|0_ JbU"njplww7i?jL&~?^/ZZZ܌VJ"N&A6NT___&h9u9p"iDE~h.}A@'䴄'IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/search.png000066400000000000000000000044471260417502300241600ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitleOptical Drive>g IDATXŖi^er}w_fv6 #v ZH)V jOF *QĢ`HHqIB. @ TC- ݦfS3JMOnr{99!|4Kԏ \!WƧ: X@qr"؜I2042 "9Xlmm.f2R,(J`"ϟoR VǶ#ϯLIM]E,;1OdG:$ Z8,/,TI۩Tܘj(jl[hLL]JKi?u$:*3Dr!.|\Od3q JzBZgh n,%2J;\qt]vR<mp#`1)'*74t!CV7t@Ae,eh PHbƘn,;wEb2wPHk|*,oDCv,[.UbbJTG JvuE 76αcBjyFe+ l,ipaӇKx)Y\ 8:?>w7nlfJ} wZQ†! Uym._=As\!f651Fb1FESSǹ$(*RFjy]r [ܖxKr]8/plrl؆iN?)]}m3#g1EљVeIiJL!Ѳ]UgO[6FYae[pGC2\NY˳++-+b?=r.^?&.crz.d"x_|̔ \(Js?:.j*mne8we{Cs7t!̛2;1k kvg1KQ}]\dYǐWq` ɳ__1@o/aTX]1H!>XS+[rEg 1nE|ķ.NXZaY abцv4O>r&wjhW+DnېRjW$PFa{"\ȰB`2WEP4kx9dH|˚(nan =c!QO+O |tXFsDѐJDQ- ;U-U+J>3$X@DDRNֶD5pдR(.\& @l[$Z XG׵FgJhD&PX(ȅm,z!@   QjB^x|^fd X˲#mz'N./I\Z=sEe BW%CAAY]@v\z3,]_As) /k^urۇqۺ"nd$8&+\^'Ut,MH d! DLx]ۮ-@ ({kDQshe^Sf Wiz [({|emͲAӧL}v_EB<)Q 7'vkkbDO5(CE-بv:c` t. 3e)qA/J羴x%\O K1n.!ZKEDTAD#h'"!;Q.UAsV$ޓHY XW &noi{!k=!C蛆\w9J*R"7 }M7oss2LZ#{sA P.Bb&\j5bzzGyP g=B5/31Oz}q"eUxw (r)elT3wlXV-\Ħ6oY{ ZJnxҵLW;GV(9)dY>qzs$seev\ZPvڙ/W*(Kмi^oEH,"I NQan>oCyFb|kuKqK2~ X:uy{ T*†q]>J!A当l(5 J[N-S/nãsJBP!yfY`*T+B۶ ۶ %h6\ d?QpPC'z@L&U|޶ZietG 2Ԇr[VW2"q?ڹCkrSr6XYԐ w  zBh_* L$dd4gmg)`-=Td~7pw^6`"a)4} "uFFj0ReTwc&@Py'c_9ppc 2RQl]o`zh-Cmx1|;blຫ7_Ƽ?ND˜ co-,F-VMϜZ^7fW^Bh&0hx~/a`qع~gv;;U`:[Cp8\~IDp7Ja&MyFv9mX]Xǔ f/8"J YP6M+'xMȝvgU#8{LsOߣOcF{Qļy']yԵkY)?|ug5xx fOz^dX肱@q@:J=>foGUȄH_7o(ȑ 5Ufӽo_fKUnu9*];V [;~xQVoW6a m. ՀY; MVspb?0ta@=-V@6IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/tools-wizard.png000066400000000000000000000035701260417502300253450ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxŗ PU²v d]G"52PBE_ddXJ!4 AU†NδfQ;|sKCOtrrZ>{{?mO//o.ruh3bUX~[Q, g4-=4q}P;WMmL_kl!+ۡS0H9JNg |%:1)IIIc[jk'`'`"cillL,Ǡ='<<| tvqXTɜc70_11<Cd[k,;IdddƍNTeB\B%'AF6NGA`rUEݩHmOBܓ;%xapz_δ$gϦx-ZǂBKyfd= [,7-CqS 9er=o84&(S}ݾ)YҭO~K BZ{hV@ՎjO[(? x~xx|d+S1 euЙ" weNw ;}G%%An E?qWcWgquytnֵͷ/G[ᰧ<7/=Rb.uqqDzݎ@Pŋ@xIq QOO ~~~OQ@ g}\:fl+`WdBxRh`)L&訲377E!""|k5&` FGcD$à>puǸ*E4cSw6G(&K])t<Tm&g|@7\7M] vb1CQk1 "88a.y.Y~0~,hB#R I>puu[[6/ZPpF))k ' 0uT);c3:511!W0!1`eeE;cb BUgk*#CP .NcZʂIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/view-choose.png000066400000000000000000000013251260417502300251330ustar00rootroot00000000000000PNG  IHDR DsRGB pHYs B(xtIME  5;N`/PLTE bfgjjrsss226{7|8|9}:}BBBCDERSTTUVVWXʝᦦۧ۫糳紴TtRNS123K_PbKGDdڸ  IDATxڥWOAeYl llt(' 3sᓜIޛsєNCtׯK׌n]khFTyfӦU,̣7RPћMFQAAMFAEB=aq( {߽0ܸcK&NDq\+5Uk^+a˻3[Fk'f'LI05Cwx@j;kz5T}y ]7N1 b}IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/view-fullscreen.png000066400000000000000000000007301260417502300260140ustar00rootroot00000000000000PNG  IHDR DsRGB pHYs B(xtIME  -YuPLTE""@@BBaapp朜砠駧:tRNS123K_PbKGD&ZIDATxڥ EqZlq .bKL H,5X><2/PA~D4 ?- ?P= TʇB~7CXB$ZZm}?z[(MhJf]MPXI&ڄ%Hj}.i+xd2+9\=Ч @N 6^y/]a YIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/view-media-equalizer.png000066400000000000000000000035121260417502300267310ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxW[oUU=7N (%(b_A&(>M ȣP.-Ƅ;/&"\l8sۙɬvI|}:g{=3|kfՋ彺coo=N/R <+fyV…/,f{~_̼C"'L&,I buq}Zژkl>bqq^zLg'QU]:~̷$oFP{Q[c,-bD+NS'D"ln~`GIi(+Dvne52GBޢijy陉2A MMH="($l$Dn|@Tn!iTT,m-0v42|JpQd(Htn'ȑs8#Cr8~(PSS-knSls˖UU uauG!ry&%㹳pdO022"/߰aOĞrưDD R5OFywBAO %#OpL7nܸAjIW```L<&$(D=$ű~b }|ݚ(JCʕ+p!4 {HOƓZHZ و1P{"E4oD{{;K[5hl\-DW^rA%$wNf@jϬfqx@"[e.^Fq:'y l̬AEMn=oucظԷNy⨵f\ЭHYvj0`ۨ]INK5`.ݻwGTW`CIM{ 0iq)ټ/_'1::Boܸ-4"8}mN I9`,?r$%޽{XjAp066Rb{P-[bؘ#C@aPu8] ? IGq6EGdNq/LtvvbϞ=8p`_K i.CCuVP kiiDƕ?ZъhA^DʰvҙcuS"g$ӧ055r6#TRVZB>O䞔^1d2VJm[)۶mm23,NID܇^ȄdQpP 94"")o8dq)[D>cLH{V@eeh=R 5wuwl g*ꉘ, cR$)W=BvХ/ UJTJ3#YT=#ejqQdeWtpIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/view-media-lyrics.png000066400000000000000000000016531260417502300262410ustar00rootroot00000000000000PNG  IHDR DsBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<PLTE w&02r299;C;CD"I@ICOKYS]\a7bFd[g[hGm`ocom~ynp̋낭ĭۮܱܰڶ⾿XatRNS >?I.HtIDATxڽO@q(=PQ*eT****N8>MS|a{s撻4@KR*34J \4w:b}mr}G&zﳭ84;s2#`5Uq@+ ".T{/=c>g^I Xl{|'E[H` kw,uVEPQxA f@݌iA{(Z!߸[Tbۭf-Jo*'`6Y%ssc}.DqK.f@d{^eАU '@x{릍N{/Ͱaq1sApbBp?l& jO~Yr?0**IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/view-media-playlist.png000066400000000000000000000016141260417502300265720ustar00rootroot00000000000000PNG  IHDR DsBITOPLTEJLN!P#R#R%T&U*Y,Z.Z/]1_2a5c:g=iIuKyZ[oŇɇњٟᠽ⢿㣺֣㤼ڤ㥼٥ܥ榾۩꪿٪ܮ񱱱ⷷ⽽㾾7tRNS >?I.H pHYsvv}ՂtEXtSoftwarewww.inkscape.org<LIDAT8c`=`dbX:&ҤJdP\í M)m)H ## @lX, fg"44*NOLJ * .HtututvuE:QDzyVg!Tщlv'`dd%ofhamak#ef V .aa瓠%$+.V )$. +'-,!(#E|8RUPRfB;v :5,+/:ײ̈́2`¯p΢RRH GIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/view-media-visualization.png000066400000000000000000000047141260417502300276360ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org< IIDATxڭ PTW/1b7FpAQD8(#Q˚8jlhL4-'TDEAaEDT6W@7Ȣ{ w;Ӆ#1Ss>^}9{`^f/[I S 3K}gm"JUbrnnh؏7̺`$g3N+KZ|^;r?վr\p,??F,0p;sf/sv9;w{ތo TrHMMEhh(Çw<{);=`Ɵw2q/d3<yyy++ksj5mmmhjjBUU>|4ܸq8z(p%+WB("|;ޯ ?sa_'%=Uvtt```hnnsN>dOwA܀31#%ʚmgg'.(J$''֭[8w<==|~D.l+ 9A#%EDQ( uu5DF}}=')rebc@BE?#+K%Iee% %%%@/?c!}řE=.ÃmKFܹs<#!u;DC(d)t?>U}(ڶ dw< `&KD[[[H-^)hk E&+ʎA P ۆLFSM$=Dn߰m)** Y} ԅ^h G#;do V.4)ooH_?+!i?b 26"gobLMLEECۙ tAgT4ŌC]5ZLwCM@g/Y[Pi„2V0`DD cW 9bGN_CC/C]vf1ȿ0ձhDUb^BGI{P Y|RFSa ciV B#ĠEWcS& Ev,=EypPOe3h3c+V1~xlݺ5:x!Ç^SїiImP-@C {RQt\ ]sHB,stycT )XHE9*o KP=y@&} ...k`5cK/ƬsӦMG h9BC·_ámKrmѕf edTP HƏpO }M5M΋D"פ$a MdGctDNhx$#T m^2ն|cC;Qtj~{*` P{g 'i?1j޼yw}aaaē'Ox$yqrМlP]{CTpb܈-Q-UA5k|6lz$wL( d)))ͨ ɩ)C͓({111?~Έclu'{2Oϖoou͙3N$Bٳ *:~oJau*} .VXX[HpslllƏQ=cihxUd-\YٴH,AH<qcҲeN?qℜ :twĉ'5Ch'~̘pȘ3ߧS?ɌE'LMM]gp"U7o .k]Kl=>vlU:8ӧrLV,$^'K9\[u5#Lo J@IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/view-refresh.png000066400000000000000000000042061260417502300253120ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxŗ{Wǿy}߽w(`Dj"?4!&H4 b J4!XRbe7sg̜s;eY|ɽ}{~wNH)񿈀;m5|*o\[X\R\nKBػ7"?_5n dIg;/^^ѻNX0%Jc8<^>r=d^d;ݷ9k箽{5uM}eU>UJpqGJ'ؼn qĖnq} U j 9+6c_[`0$7:Ѕs-g&nun^яTq((1048(d s,vb^aJ2u-8Hծs%\K(Gw(\fѕB,11 l23WT!0I(vd7/OE-&mKN xK'XNʬ8PoQcC: 6:[0M] 9q <|@J22 ?Ly[ S =3b@d?n;/&t A^cwFj^N+qeFz'369005EpT9(`sdΫo9f$ h$FPlP zbӑr9}ЬjƍGP QU@҃FXr/G}8jء"hG6j$-H,nCa):D*qƢC;C"₰'@4fm( i,d>)ja2:NA M ^$5 6}Dm]?-x賔V G(6` F.0O6q,EvLyUNiW9Lnpld;n9*3+~%s{"wEng*iR~[NbD@Hj Hb< V(` hӸV)G8ԻVP #efXFB!\!!ՀZj+Ca`x$Tl_M<6)0JSCP)wilrs_7^l6PIl_mVZPՅf\$()BD,YAUbp 'RZ^ VvTiQr 1MҤ!n })@6a\\T\aBD\2I }0!ߩY>)'9 RF)Pc 둥!Q].ndnIEh.ڟ 9m .-| yL\Y ^/tl~#ƋSS#0B]3DKk`R M󯗤#ɧ790r23-)oq-: B2tAyVO,R|NQ`3 @v)I0JbE#M; &4a٘- KCŋ͈oc?lSɀjs7ڝy}Go۶mT*%"Bj3o?~"g0 عs'$Ȣ6-XAJHCbI6=(׷nz&#B 455Aw:t:MC0mnn4m%d2Rf} bx̙3ݝca?hr۷o;:~T*T^NF*$ \$BdY^hYV`/Rùϯ.N8%_T[;DzlilbD> )ˀiLVme>!4/lUUWMMMxO|{| =zo#5U,8. yy8dY+e^8n[GG ;FGG#ZѨ>i&aT`1q(C0IX,% z$B$$%I`;PȲDJK'JU $D**5q#ܲ:BDV`%wqӾ}-7 ٻ* CՠXFAA #f{ "x(4h`p JV $N1NP,cKx|m] ø&P @9Pm$Vk0T$A_WUC}DB ' ƅ|&r 钆ܝŠ= AposvPUUSN ]{&||HL,qh$xx|qBA<$Tq_ v3{/D_{BzIϙ-x W#(Gpղ\&UI~hA`V]9!5|4*D]Q";;fP.lzy^=sDOv<ve (vmRk8QX,8 W~hq-zA͕"d 7V?@a!{JacbI}'7Ee6{zuG: ?$p=iB5mrq 7o2B|Am;eb-?{_/U[ ݀y0 s/~l݃KU+,]=}} ~~ܲbKbm@ lXHl_o'Oy׶/o^d~{%}ss3;4Ntr%By`ٵ-Sÿ錙Y‡Gv7e͜m?KClZ9 IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/wiimotedev.png000066400000000000000000000033071260417502300250610ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs B(xtIME 44&4GIDATXݗilTU/ v!ƨ11Mĸ|6%jh5V&֥+-k ("nt73a)v:N7/佹?wι/#.&4Sh&Zcm^]Lv!7Ŀ|]xw-h晜7քۗ.h=&f= @<wݰqz` /*Eļ==<_ucx+AJ p7<Aݰ$xpqvp3ZD^g umɱCaNEFVj7dA56V<_ժ0ADo"OA8,,`:x:yM76h-/5jw؎uب^lM hΧ1bU8# >_ށrU /yWgp@; 8َՂ@8pՎ Aa]ȝwI?.c֨CHn"CS8۴BY̋1)^Oc-6=|za ~/pb좿v| ݦ(qU"j(L dLr E 2OS`xwq,:$(rD<4M폳C *΂#uÜIgz_bbǎgΜrw.{j]7[)hv4C'Y;~W0r8RѣGٳgĄ%3DQqI7jTk!RU&82|Z 3΋S֊V166&n7 @ T0H  ].HN}l߾}zԤ"ap Q 甁&T]]oVXXK!Ul x "pPr!y>Enn*/EA`%D߂h&1 Rny y)5G4 !#-**uuuJECQ- (ܬ^pA=E9cϒQe-@Y85FI߯DN>(fkGFH(//G٫/7@>E]AA>~%l%|B<8:::Xh,( s:Rg x=^C U;7EEUUU*B].C4% j 6n444چ---3r=AclZqSFTgR %̔0Zւ3 cq3$$$X:`Q  0xhiafvJJ7 9Pz12 84T‘뙙ޫzWVV/zkEž -NI`fOչ UՋ ֟Of]l`Amt{>] v|f_R.jZZv76EQ߯#?1IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/x-clementine-artist.png000066400000000000000000000025141260417502300266000ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxŗ[UƿsL&lV⥭ >"X*}CEЅ*b*.(Pz7&L9xL˶5|L2|?h td nh85: XCoz^~՗ G/d ѝ{?2D Lp#; a2Hr(zϲ}=#?ޮ hU!ZZCiB 5`́>}"PྍQ51?_" p!@,[A?a [.y>A@#:>rgOG:Þn;!$]a  c$+Qh \RI1@m5s\[KW 0cVu_briB] Rʦ&%N9C*h+O=7/hLև&TK!A19h!}DV8#@E&КC+{.̓r/v/T鈛&il+uO˜Of]+(L^ rn=1% @ F :FH JGG&m"i񓧐)t~ e `RrF p=`rUH}L^:Zukf <(uQ$4 uMu9* jSl;L~tڤLu9=ʮ+HVkdziK&tff^ߛͤ2ވ0F!BBG*"*/=. 0Q=ty}RVZ[륓 lgћg{~RDŽzTҒRA[ SQq]rpF.~]Ȕ  r CoI(nvPR[HC7i\٨M4āD 1- C!+ot| $Ɏ&XIce[g%N6HQdI|J%[3a.KH^׍f =_Զˆء޴$3czFILm%=lYǖkkIHͦ&.>o}{]u^9J(̅p;H`ڕ2sYk]=++sа'P}#kZjLvyS{lX׽ XIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/x-clementine-shuffle.png000066400000000000000000000032761260417502300267340ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<;IDATxW]lUfvmB[Zд`DL4&@_$Dc>`&&%! UX@*B ACmvnnoza;;;dyK;ޜswνwF`i p52H4(2N6w6QTZZm55׊LAN*?-3qCC;v{I5I*Uިlf }ch.T< ǐe[uu oc lr;L!LR `\ܻ/_K&z0p{@(FUTxO\{<+"Q|u2ٝO1d4C=2X oS)GƬK+JIH` PJc߾}(`_l`VF0L jM )X*_ I0;#xe$lwA lNMEzǏ sA?֯K'a۲UDw8?R{>7j6B~!/{w(J$>s\:!&1u \1lQCZ=1ʓ_EEL ++e^n㺜 n,Fb^-9;䞷hsĖW7 OH( j,R6B3PF2Fkr:  'Ν1u50GѴj 5 P[T3fp*CC@.B0˝$P+&+W?gd YDU(ni(?2? .<:}^Ǣ+$9EK}ʔ[>ɭa700.q3,rXgHF\teš5`\q#7hH􁌌Q S'+*k$Bxs,~dq|{3[N@LʢHn30H$ǎ8f(EA;x <[[j]s`㝌@<auZ bh]] 2`+ʿ6Y̐a DA \A @ῐ"ebd#u32NRSF0(epzIi/Nm8%!8p WVV3Ε`1}9r.tjU3IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/32x32/zoom-in.png000066400000000000000000000035171260417502300243000ustar00rootroot00000000000000PNG  IHDR szz pHYs^tIME WbKGDIDATxŖ{PSwݮ3δSG-:.S ȣ"H1 %@(OD<^! $@x(@"@bjxDPE (慹wL;sfslǎ;w@P[-Gǯ,hN><ݐG6Ǐ{|'޾}tnD(<.B_~K0~I0K zDa>+bF;;ަCge-0H; uG2r>_C"!!d}=OXh<ⓧO㊥+4jNj; _/W=YDt jwOl*ݻ~,6zfk%>P̑_XV,g_)/r.5@X,a2@tttct.侳 W|eoH]yCkr#AR6*Cb 0x`~zid) @̌>8K.IBD!r'G6\G 2EVVV8WZݶuLfd)NEVڸ9 t==89 WW3=S$_] !R#qZgoc_>EsĿ57@͇3 ΋.e 2=rwy-MGSKIu됮TTVY  ??7^^^CSmYTncZ*c>TVQ{{D5pkkrqn^ZZZ]f ,m< !B|)4vvu 5 򬳳_hZRR D([&eǟp>}#b $''w^Ԗť8$$|̩`||| P^[ܿ A4.̼RR`0ǎ3rKWWtx񠴴< CV߶{챀!n޼7"h@>2 <k0?G {K$ANNP[[r}׬, {D@V#m*pl9Į]P8EPTt:'/ ^)@*cccmQBp(**p8D"F099 BCĉ6\=ኀ JE>>cR8 wa3ԇ3gΜI׿K8 qGIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/000077500000000000000000000000001260417502300222125ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/application-exit.png000066400000000000000000000057111260417502300261760ustar00rootroot00000000000000PNG  IHDR00W pHYs^tIME 0bKGD VIDATxZ{pU<#< g0D -"R5ZGtl}2>mKVN֎:bhuJN@6 r\Z;#>ܽgwo^n =Ђ>$4&pP@6 4#$B!CWk6bK%'&ҺeYS $XpDxYTWWKi~]/Wl͛1FF>#IOgc5\Ufe|Tc"Xpҙ3h<=7ѱfϞ8%=ۚ./78|V&3 fSR!b+q}-N8 0GDI&mgل?FnpEs+q> ~z}lJ->ge),4Rlu}8;řfL[)uB6\,Ewvw#8*+߰Q;22"ntDt@-; c皸q z CHwߍX,7vBWGfD2v‚-\^Ǐc /`a iA rux4BAd9G޴ UUUkiO1ZZp%@u᪍/z/4I&x h/d%UTtX㍂4*5s|fY1p:<TRO%q4]Xu y >K~v|8i8ȩ<8c}oC6f| ɔJ)TG]-ī4g;#6 tΙp@^h1m㭘H& z:Ч gs<ķ/B=Y@s: \и6~'ʊ =Hˆ͚hM tNzedU@`aB#h.q.!Epun؉ 5TUOٷW8`DoQG6x1AzODιVPPJ`#:Ra:: 㤘]a[!J)"*(lR{v"ߋӐKK]9cݽȤp9[v~Nh@ 7G@ztT@`) !R^"C0̈ 3d 0C} *OFh(t*?x VrIY^vH0t8mMB"Mn$-9,05ݖpa627`IcS=0|%yp_ U(+o|^ $¾^\0ztlކi M095t|P#U 0@ 򊩕sZs'SBSkA-ի*V SS9(AjΟ_]0ܴ Z>tqZ/q}1M%@kO{Q xF'<( 9P4 `|"ܽ +W|E 6Uq"Au6ڟ>DӒ yz@f c DQ_a7V)D :@B݆s?A]MMc}Ժ4Ay$Ƌ*@%a\v^ǂi@PESRD@|:ywZ'@΢eh]p!¡<Wv x"L E$$/^YЄ?5o}fϗ|[tXLVwȧ#ˣm$"T/9g͝%>r-3X  Ϯy"L]7#M܃CAGK$hek$ϥ$8@z(S]lWXca%9M, G,[I!^;z+یikr(.@}RA۴#'Eޅ᝭$ȃ! ![ q!EΥ?vZ+=47RY<%ys:d;>DqN ʝ'- 'wU<28zb\G:Z r(Rz"t6=8kh4 x[pE{ /!ǝu9s?4{ 5wqO^3;/FާJ9bĎs& `,W1{mk2N uj`SֵId!=_r>,A$b! ʇznr>lZ165~ s*gIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/applications-internet.png000066400000000000000000000120461260417502300272370ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs11(RtEXtSoftwarewww.inkscape.org<IDATxڽZy]wu~߾̛dƻMBb'Q)" *RZH $NZ*BU*袀V BAe(uK=ow~"rX˜{};;9;Q(zML|45 {=wq(e7 nom}w#(|eS(MM߭[6wl"UQ}ð =.WըT[vZ]fkDMݝd?T(d}'),7j9MF? U[] ض ES -U<ػ#cV"tcy=:FN Q0, jA!\^(kK;_t'j;]{Us_-ROyhTƆ4q&p=;>z])2kbv: M73+f鯌o+БN=2Tӻғf!]z.x3+G2Huk Axf3FP={|(><ԗs~zɽO'oeWxXZCt|r):`% wX)'kt@U* x~Nkc *C_D>}ޒ>p{.R$K'YL0#^H*(YqBUi0,Ss%6TMgvgmbZkBxdn]!_T_B o}h 30FcP $] Ds;})!ѕ2/V#jm, #h#Աٷ3J`~D|n<8iŅPUB(T M!M $V0sSn#5Z`xꩋڊ*Rg3HomsP2aa%}lObIa3)*-lZy~ztʔ.WQq`q[H4qp=D@@| [FGUͤ0530ͭ'ŇӬ.cu{ФKP?Gdq1c9 BWVwQsLYX\ǯ߷ :F&tnb!1 <?Z˅Rљzz~&U]i.J%sa)J=K \"3z-$&&sB7_nك MtBEߏ@D)͵=Eh..mVqcx&?#y훞dE}Unf54:C@abppd2r0xR^A:rDD0U"@g@w|&쬥O$VǟZ'E=R(C,ػa0 I*J.3{F'W+ $l3&{N RJ6D&ldFrl_/xm5G"=>|3? .DL228 /c]S4"wUFPfj Y[Z#:lb#RxNS @  HAD .3[Llv2Ăo%H=ڽgGR.(!k않DGD"]7]ORƋ)f-NκX (e뤡bhL5(P4QP7ςK6 ;N(ߟ/U rG.Hة!7<@2> E)St:}Te8h.ӑiu4W%+tӀsL'tIk ty%xbJ^ܖ_YN#Mɢ5x|D>e&湥ml$0]@u85Pi kF@hdA9M yqd܏HR%_`vv|E/SWy5vVw(#@J8~x05yo\PD# #sud\Mh:!T>L } f'O0[t!ϺW\Wf]W^sxϞ݄70S쪹L (׾e=\PEhTRHMTé6ٱDtx/ȥpxQ4Sԇ"I#^g&@:{eV\*Iq&L7g,?9Kn%>i@* 7ݖaFh9T( t.وYNKpur-xΐQEh].j{ }6H]u,v'o;T[ '^m`x.N{9b(h>4jH#-J9VtC'&ELTveqvY qFL 8UR7{^;GE]'  r/وCJ / ;fs˽voXNǕΛV}n%ɂw:)7=49[QnP4%i +{ Bci5̧A?ܩTR=1% x Tp@DR\4770E BJ@:4"R[ D%EPf32PMY޹9qrVj% x@ǓX:1q//tyfqtʐj4i@#zӿĽFp@,]LidƔq|b.+.k4SD\7ByYW^b}W9m6WFx.JBwFWs6'" I&DiU鐆#oPj 锣dٵVxzY^UC3WJ-j}.m4! Rv(W)YJS4$t'uR:f2fvvg pB~jTh!|PY !Sey7lwo|cu۝Q2utԤiQX"oq{CIx.m*$n U^=hA@<i#weg&U8[os_sWfDTvˆIP6kpw!ob22IEJ@]$x/fE܅- mԆkoA| z/ VVoھ%QC"mBH<j |)N*Œ*Tm'D@9lZ/RPerrͨuqLR/1㎭/Lx'CE0eLaGiؤOYMezfv@ UiRS),Z@+nciѴ bb =msdJ=ȵ@:?UIGnQ~luD=FsS{_m"@GUQ~6WuKXc# ,K6:ך}:R YxX]=o|m?>=d<P住[ShHE?烍hz8pD&Y[MYwdq`SPvu 'FG4fN{TmQ;忺ލ(ѵ,)V5( ,ʂa.h7xB3jS,VE),jhM jDj@DZDA'#\vvu"qPʓY;z('cbU0ң)Y3a6 +MMMx Ν?+EHOK}֬Y_ " jpp_RXxy1X/ƢŋFZbQuK' aުR}|V4-,< 1{lfeKĈ\.{vAKEUu L!sb)e``Q+䉰Z`KKKXXXRIՆdv,TGN(!WȒv yȈXHvon,= ;BN(=2@nnpqu ;U+^hdB^ɊGrcG' e؜FXG!sAy5Iؔ?_?_(MhX(b!gg8k! L^FrP||̳oc6a-bb!X,qhG _9s\pt,''5enʼ,JBuIEH$BdTdk[XeWE`.4'IJD bÌCXX"c"!OI7YzuGaGS(2,XG#$4I$ܝ}[ zsAyW))/ j>BO!KS$Y88)y;wWBUkcJMOFTQ 89;X 5$ joMϘXi/+ 5gv,5*>IlN8ޤO#P.䉏kWͨVRaccl`lz---|,1xYZzrdT;,-C:GQXx =ąrb_wO{pHP :aHul޲~ij3b#7mY$., J%@nlls5c$)5dOKC$$nɒ:h0/{6\;̣v|{g4wU^Gt/]Bz-8zxE%Șiӧ>uNDէ37lD? AV*ZUNIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/document-new.png000066400000000000000000000046351260417502300253350ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs11(RtEXtSoftwarewww.inkscape.org< IDATx՚kl;3kݍqp)(R!(!?- (|U)"_8%"y RVqgn5ah|pqyuU{1PDķž(q?ZO"C)E'f\ʕg]X^_bx3?,$I.~O`FGjuB5Z[ G.d[)EH9缞e]w ofud+ek_KdX/KH3hi"h) =NլrlY ̕r]x?8̂-[<393#s@N)&}}^ Cy9 ,[z<> Oɚt_qrlϱyx34{r~h@H@=j+`@`/u.stuM`sRG`*>OqPר9>YkZ  3DOEũ$9w ǤД>q% a$ *nqg?z()k>'CJlNC8d`yP qu.@B8q@0{.[9(_}ʂx O_(NU+7mL@ZXxd3zGXɴP6<&mdmL &n- dJ4:0F0_ʛ,(y>\ TBa)L!`|[_nXBL(DobiS8Nsκsy|q)+yh` QfP) pʐ68 ^~{,#] G UWsٳ~9 ~|h]@=Hrx߲8T@Yd2lڴIK{n=@\Je@G ^ tE ?@^ᵓx%&q8ؓáu PLF%$NحcaA s@ho٪ipbx=:z ZZ@tlzc.akJ|oq8}}}$IeF.jbd֮]0'@ND3V` ݬ^˲(Je|Wu]_ʔCWW@p&!a\oo/6e@JH#-r7M8eh-*AmX֫#۳3@`%ʃyv!&꼌 ay vHA6`=S.,#A&|Ί q\U:Zyw .3 VzY]qНPniۯnh!&xxR|>mYTץl6Z[oO93!Da'Y/05umգk֨щ ;>x ! m~Z20jlbI($h :(\x;Ȍ[C0-veEpXx1cYsX/cl}!}%;YC'u/<%!2#Fp/1妱 oqRۓ$j}j>Yl7;yv.O'w:`ٕxG=948M8v^(޳ q[ ݛm)!^ v #00HQ״QU1B+@ "(w"* ϵ(BF8DbE"p-urdAOL TіdبvZf lF, B挢 4%&@(;W' icE#3G 9@KNJ>/f!4`ՁD8uvW@@ 8,4d })-ܑu:Gqj[)^6@--4CШ+ "#S O:9eڶɵ|bfԌ+!-CiNĎ%ʯQEūHF8fE~{wb"`PE2H GZdzpl|ܺ4j2b׶ ƆCct'@ M5Ԉt[F6!ݹ)S?+;Vb=piGw;9C["YCG}{X{ʯ:vyQ=I?ï/l XGDw"zTXtSoftwarex+//.NN,H/J6XS\IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/document-open-remote.png000066400000000000000000000072001260417502300267650ustar00rootroot00000000000000PNG  IHDR00W pHYs7\7\ǤbKGD IDATxXk]Wus_~x2/8qb;6.$$xU ӊVGJiՊ胶(DJk;~$~elyܹs9g﮳S T͏.9gx[־E+?O`ݦ?Kr$c n} j@lt|p5|qF>\ϧ|i־2v w(8=NXz|>w35x  ۈ4w Ɯ?~T{ܵ~pݮB3 J~!eal:_<8~˔ȏ8}BAJ8pO@:O" |*{~I6S.7!M|adHՋ^:sut_7eP0`Gk{zubCKKl4[7ׄژ'uڠbɧ rG C0!ư̋_|Gk鎏S:5RL6Dqe1>?O)lbԣ[߹g_ v:E:w~6oN\gcaKs&Rޙ5=m af$84ꙣ'ʗ;\#!7 kQDl$A6>\nO?kgS6Ȭwj||d.ёSrB"MMߚp;79vFe"AR ~nnL`E7 7>aƻÓGã vO wJ- 7`hDJr+bLBtJ}֪䩿zoP7zk"cp&: F fhm{ @ cb(OϘuݒ61g-Ż6ٜGn3! 8ggn]NbdMZ@OG +oj-zTPwfS3[n( "@$@R.ufpa'b22Joo0Z#f4]ؾ 0(t Ro_ :(pFgOk۱Xnppӱ7p\ӕ];}=O/xJ?vB#"&k9/.BuskfY{t+`,!8{wbx}_\@=Zh/mŢ ?0fK]ύ>tOh8#.}+KWK7ƴn['` 8}"2iŲ}=&r5*wI( vb?L@3XPc;"a`bmض8DhbTK{S٬aUwhW=`Lfk!Q7֏'l:֌`kz2ְ?:| "#7"5jq!#12Eo2mYJQw0mmقFHHτ yT& $ vDdU#dʂuf٤ߗk*tA9m7N' 7A N*ثr5@I~f=y"4+39I\3iˤiehA)c}9<:rE?/|V;: &29wއ[@\+#W H^3K["&Z&A{@2} PY&)+R]mE|Fni@_m#A%VZ_[3ce% hP/W`Y,$9gK\ [ěBk JudC)a5xi=]،XH{zNЈ1@GHhVv*%p>;]JԌ\U lq\;@hݒݾxaAfg7!<{69 {1Fu=]d,i$4:εݘԥ"ZG !j ;&8H$԰]8Q40{ -G ^U;r=\~4ƾx|=>ޜE($T]{yϐkuEJBd,Ɣfg4FoK 2„QݶKF@At mƀRnAPůnuQ LֱD{R,{o}Κ{DŽG:U8]<?5o⢲4(|i?RGOoz=y]m XMZ@mވt\6eY(M4)@H4_Nl4"تqA#%PX6LF]jDvP^Q MqH'3U,~isCH"4Zf„fZyTR!"Cu$@{"N)':PCsWOz`gqrXFs&37Â2@zX \Q^;uV9B.V/rؔ|1|/X[X$b%l7hƎA >HD+M7 "Gz~]EUr\E16Hڍ’Nڟ$Xﮀ+tP2 ͺ8oh,!SRJʂ "G9"n&DbV$E+ %A RKJ" cGtW  OY85-4c ^ 4op(H#b#@'&J>) ^|OHJ-!9!$ARESB\11!3ѺephK ȮWA(xsS D5|UJHu@Li}A+H^eCsRH8nA1fGb^g?%ZiB?oz=%I1%6 'Q#0 B<$?g<d iPK}dE*Y;m*K1ƖS*LJKU]# 2-ʫ1culJVTwS-EHS[}Wi 0 mNU؛q;7O6Lr2jR1okjs%sېZt[Aɇ0Z^6 NC$tfU/Ğ ָ8S 6b; 걝L6 ^̢ۮ[Z$Wah'4vh>́o޹F+"o~[/~ [Fnw3Ź95Ӵ},uz V$T:ص_>?VA>l5"zTXtSoftwarex+//.NN,H/J6XS\IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/document-open.png000066400000000000000000000031201260417502300254710ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs11(RtEXtSoftwarewww.inkscape.org<IDATxZ=lE~^l.JJAAhHT((t))?IDrKˠHN|s;x;w{s,w)>|w}Y gCG SPe "]z ) @Y?q:tŷ/_|m$(H\beeׯ ;R%zjR1~I<>r/Mu,Ɋ'N3 Y:?^Q a#<(̌@k` ÀkE W/c؝K#ڕZy/ނ^R@ p9J;n}ea<ٽɯF;PLU3sn`@C,s@pj\0&a7pX`& V43psFX`BXK4YUBBZPsU9)…B H{ VbX$T2b p>N?e7g9J8Zcl2 qSeHY Dts6qƛaDeL I(91f!hP%Žw Vu\r5:i\|^WMdDx)le5sgN,1o3Av.gs}퍗_M@H"ϔ'dx.нv%o@zsomFgC& V|Ĥ/d `=Psus&/ @ i1|B@ģD<GG6Ձ\ ՟-S!bl"lIt7tMmT@Ffeȱ}}tjПêZ:T^: y?K1TEHb%rPKhB–ne+p~,'ט+Sfq  HyEA""%д0㔑1(h.DuO"NWT$܅ָ4qNΛK'zk=hMNHB1@+@\Yd\91JsIi G>MZ"[;]U!!@_є>< y,N)E:3 m!aHb9 :E>L#&{G\)`T]4AQ!)jH=n =%7j<~7l>d]=9^-"yzU5rYJ+0"\Rn#kiZDr@ݱgE")&4_۶ހ`AcVSI(g_xwۏ:̋Z~?~"?%<%I ]uN0 %x]afCws?Uc;]/)MS+V9okO .ez| ;4A+M3_pmZsNI@"e@)ڶ=NEGO.;6λzO[ܡyϿxVvA@ //R!#"V/m!nZ[ PͷO2pԍ0i!0 7ZdTcK(OD(&D x"@لr2k苯׶(嗕a-ϓw:);ߺO2~!<2od@<=Pl|jxe̡(nCK`5JрL@@' J邸0{:WXy@ z̅0,)2)@~_5{ X_<{r 5"-e"c MH[@7I HgmaE`{@D+J 's!')"Z'yK5J񠞒@̠ a:J@kf#ւ 6sbE$GIb16@3XӰܒb@YȠgoqFry{k 18lX,ČIinШpaƔ( rj]Y<++n*O(%G@9ç#$ 逃U@v H*iG`}+P35dt a!\8~ {Y|X+ Xƒ( I0`egn  O..,|@D-0bj! ˬ<8iٱu >Oȉqؽ'SMN@# xbϑ᭣@0Vd,`%&qPٝ$nDEaί}ѣgfY4•W@gf.݅ L3[ryZר8OIn+0ց#cnq}}q: MhH̿ `vN"3 cn a Z]j*:Q4Ժ DLKY}J!ѠP xeC` RR(ubJIDH:Nw{{vwhc~IM9UG&uǏ'N270.S[z.bmm .\N$ S`Cf8IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/download.png000066400000000000000000000106021260417502300245260ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYspMBtIME DIDATxY \u={gьFH#Hu@,#ADB`cHX+)2 ئ!C dY$$vffu"@|~{yೳ0nwﭜt{auLiCY(GGӣKi]/}iZ7;f]չdjpΜI26P B:R\A {xwl|WmޝM.? NcA,6!St  HxA;Cߙ}? p?^vi̒H,[aXț%L  &l8C}d9ѱ QwfKSx'߂Ә):ӽ|w^:,ih@t.pe}@:J%}jakn,:Sim th[ګV0={ t=oM7yD(cǓhU|ʚ0IF'rH6̜y/C*3.CID8]4Ev ǯffrwMסMkjY.HʘIaTDP$$1dƻ=;vDn,?Q7j <=ɭuصi%Dk{:,W7;typ;wލiW9}EUUF3t Do]>3Qq\g"ΫgOل-;1}W?9F⨩ ub@\ؖ-|ʢ=k]a ~ f/kvN D"U@w60lH5D x{1Jlav]<H4 _F3+D5~[TM{v_je, O~4=VvE4Q$&FyEZDV=Mmś)=6v ZBSmI($`*^)vŻF50b凋|ssKbWWZ& S3) TF.\؄87Uc82TY$yN7X(wKie# ު/駤Bܘ9l5(o' fقFxP `ܪ:44D(d)ӡ!lOe²0#E&>b@fL|&$Cm^;F]ՈGxr;>>a5( PX`TlR.D2l3PO@LssD|,Wҩ8gN 6u'V(ԅȱ?G'<'zK3%Jilas㓨G*L X `]Vs]exn:80Khm`oOьW)o>n!=DPD"4H(WW .ʔ:s#(pd8JO:e>F}pGf1̶N=#f|R<ܪYH *XSyl<< !$C H^/mciX )~I)+ۺgB>gR.a@Sb'q6oFT!T 5^#^,jLwVPz&Eg$JPA98hO̿$AJtda);cK(+?6)gsQCOnm`N! /n΂GHyFNٕxOf|іzUp I9)7ٍ/ۑ%lXX@u,Z6ULqKt|`U=ӣ>7+p1+֭[-\ }}}MtxKKK74[Y[^q{x'/^|IQ0\ׅe9X6u/>777`544 J!H `!aATa<QLm/׮!QVږpm=ٻKRg6๡S`>d)μ+vKQ#癁,O"GlJ5dhh-GD8 IF$[28+YIjTDh#d2 JB< K?T7zzҸy]kѻ{ L&ϟ?ֈ(a䧃( p۷obeeYE2{h ͥ*1ԪK^#p.¹sĉTxObgf {Ke+ y`-,zK{{{;&''mhÃi1x=@"3" R vBpczl!&3>Y,‰'H'&&`t"t D,D/\+G^ʡ2N8b$xjr X$E](CPT*^^(jktee&mV7Ҁ μqnf`VZep 5~6aFϥm4\5(Wݐ"f !#["K[qX17~v샭[~8j Sx>ruw@]4j"f@ ;M>xk\2ۍ :oQb͞=SڋYv8wرOeIcE2k÷`+RF'e !E:Ŗy(`Ϟ=Fe=v}yL%>n…&j' TVu_V:b&`=77 b j*Ϯ]<\|!M4_y,'pj#a%rL| 63Bě7ofaq,Q*A<; @jt}r :tMpI<l7XZӌpd0K MpwȍƐ#CcBenhooOOs9.xq#(Cm (!{'N~m6!CÅ@Y  %{w4mw [϶Ջa = kg@R0b22+ 9l|&~ hn,3c\\ -Fv6e&Y]kGkjccbAykݘ o b9'w\݊w[S4ynvy';:moR4DVe,{S9Z21%^IGؚ5Ae'u%*ƨmr =]v$qDXŻfF`{?gdz2̋h߇"ܝwBMiqC3q@iʅ,!a4=2rO\D .jiu愫+@w᳞裏PSѶm\]'Zo)-7TM<'T*+XڬrK9(|̦{`񩧠vݬU S> c>]97?r1Ġ>lDI$al&x15m։xwY 9qSO?57,0E`MMNmL8>! 1]S \$l$h^gf r#ELLL,d6< [MXz0#5BqdCi  x-e;?a} GӐ S| B}?O> i&q> fW"Vz(ó-Ͽ:e6>/ha;`1Pxagmw}/ =Fr92E&%N6[T?4MO@\ebn-O!J\Y:_|ROW/V$x N#x?~ˤ~B%Qp`MixV>*6䯛A)1Lȝ Z6g N9ӳ0zqi7hd#eIDiUf@K[Vce1J>d˺y53O ,}gH /Z%(n2.bbCC{=w 7z{ͷ3lްV a60PL-!UEj~iM U @!b0 xΛ\O1.3sS:S:S #=#Gߧok.\ ˲0C Ӡ3MWwvnٳ'lTqS|֭ $ZThA0Y8sg ;F'ooP0D^xΝ;nx / ymY&)\nyk47Ε58_۷ 8uömI9J( Q{E\!C>p~e, =]EÇ w0i18~;lP#6&V1K~ ӥKdmuVF\\,wKGULV7Wp2ba l&rqa/}>_}]]8u ȴInr%$d o84t q>M0.(ȟyO,WiY>ڵvGiݓaCz118`QrA dh@4a2e r PMx֬YFVVUVU*dҤvllW Fbm QBP 4[N[:l2~w@<ϝ;ON.իW&21|?ӫkjEEE-vO_0'&QSSlx<1 Nς'Ohĉzj /]NCx.W{T]vUVG)ƍz-\V/\HNNz^Av(=mAK'Ok2x L.YM&V͛7O;}F4XamsLw>Ξ8A"9$&&M &6Fh -F֭#{ŋӌ3a@km3Ho'VX Կ~WcƎqb h1NO OȈL̲2:rWHڪ? .D0S[x V Gg`3233~qEtՓ[O97zBaVCe֭L@Ǵ$6СCi-vTbZ;v`bQHr###K}xzM⠫ߓjl(@-[9sJ 2D/.~ΝM~&u"H}żO{d(K^@+ h ԥKJ\EK+k.:|TeWHB:Ue<9,ބ~Xr@&͗X+ ˔•D$!rg:x .Fwx< _]B@D^|'F2;z2G=zՃ&@ O%:Dm$ֈȽ,\]])"BE/--%9$''3 ls-BGZ (g˷رqVe`>gΜIƺ4Ol 7e?=~X on˗I$)R2AZ۷ol[G;9FX R k $.JH JLЫӏzV\[J-NxBa'C^ak`㸒&X22>x _V/x 1}~ڻw/$4iճ7rGw<*Ng硋4sΗ$MNwhuݷ#ntR߸q$bD~[aÆᗐOCђx૪,; K\'&'))Q+`-]Ə!ǎ+WVy$@^GF6m|!ҹw1 W>X,;%5EL`rH68_tR*I9:odL+ks:WX߫,$TEEc @:*p]&wfHKSeFC1'۷'#G5`@H@=t`ܸ~]>սޯ'+;l g/gxsoa͐hO4[ q/q rl25x 6¿C? }*\J>}\zͼ~^ nJ&8 .(sb<1li<Ģ<;!ݷ71!>), yjOb^i0yÃe :ʪg =B1ḼȌُ <bx~,D`Bt߬Id7B WgACCAޞJs 39^B)/;VMԽ\4Rw#Kj y`eE%otm{F>>>n 09If9!/t_?z:BمiHI(F@iumm8qC޻ t[.W>"{*a)jxq"z{{`xڵ;K43^e羷+/OQ.;88^}{,pw*G/D޸|cccIc3ϭݘ^طdVB{z{/ܟ;T,y,-}Viz_]Dӎ Ò_\yEC^,k8N!#Cr_|n)NJlttK)>G6x@j"*^t mV>ӉյhRF;<JԤRvvv7[[%&.qML14<{3~ÕN9Ȁ,g\>wc|]Hz!7wj泏>ӂ =-٠*!D"#68 ˄eϖ!.wD 5ЯKZ(?lq h?R}%B{0LtA.H O*5y'R+=wnwig%]P*E Tw"p'8؈{[h6a7 ]aJf19!M./MQo/h.4#o 16Έ៚OU|:vvN:$:răx`RY9Y<\[W=={VJ2nnwٗTb* Dؕc{չ3 w?ޣEsy f +=r=![l*h4}J] Q֖̇ θ5EڤwY9%ȅ"}h {o%YQh FM/m!7MEMs d?895Թ/%WW#Hi BpU\_cjhe8ĩJٸ<._}Ո2RB|А|QbEn詛-W6Mťfᢳ\rٳ<.!^2%-)ECc. ~:%%;к) td~|Y}V2r(4Ɉ"=œ'_೔TΘ#e' %3k9& g(w.Nҗpڅ)(ss%//_<33݇QVY;]+3dyH0f cqL^9i; 53%F\RAS z5/&=қK H- FR( z  P28T2*⹁9+ϋÞߠ[,bHVG.@5@RRZHo],$×K"زsPOJQ7X1 rT-gؠ>ȕ3@fh=208KjvA 2Ԑ:{[ c tǵ5S=-\o[$s3h5D*u2 4mlUʈDGx`X[1EToۘhDK4By34F, R)|!Ɉ˗x#t79IM7F1_S^G[ =c0/Fm[J@1|R5P$wa"%JU+eIaJUMVZ{q^'[#wlyx }ؽDZ}-v/sCךVGP_e{м7҇|kSYSΞ1YoBRF9@O{GNp@pK,[΅sL HUbfXO?04bmu|;!:`;mljg'ς> 9إ &EbҼqHm  4Hۨ 0 " B"\Oo/U,oQyҳW!47 9DUhL7 ,#J=r.ח38uh m= J{*Uͼ^6KKM 4{NpkSꬑy!+ufĉ\)99>!r7?>ܹ];o @.G{IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/edit-find.png000066400000000000000000000061001260417502300245600ustar00rootroot00000000000000PNG  IHDR00WsRGB pHYs^tIME<|bKGD IDATxXyPg;۽`r !  WBA(rH@E XQQkk}Zotn?vNcv{{wcNo{<1ycǞ`=u7_<{i=eRrGӷzÇ^z[W7$>yJ~!+Ԫ d>\{e)ʏTVT`YW7 |x?*~n`e.XaaظaIyveo|QhaUJl~ytd@G[RSR%"Q@P` btH4 Eۃ9uϭAAo6j/)->>QTUT"A.gu-4L( S MB6SCN$0Gcb8[_[_KƶڗwQY{Lbld 2, JTUc"0k7*ж"K/_|ہ?vSǏ}Ń/`5(;ІA} zZm JdH"`4bl #bige5,iil#\q19uщ6\tyַq` EgOƦXܼ$!$ R;r9.6FF`TAuu-jtVlIg0j>ioYRع};{q5Α'E'>qwڱmLTKl^ 3C hh]YYzV`6nJPI%XY<5sq0BOù3gqePy훷I Fo;=}TljjcɉIɘL;g/~cc*5&"c2BQ#"X4\qa` ISÃсW;_T @ɋ%--,,{b mGK\f1 ݣԑt0N"W]%"JK<%t1Mx~͝ g5$ČHbFkdhݗS9N(Ɇ)߅sAs^{8}{ul}c 0_ջ\VyyyZ,lh!~~t"X `(r"1B}xvrrYRPQ^*T}7())e8Has=w?ԧxւ|4U;Յg;B P #:* aaf $bH_H9bŠM}x0bqz8zs"(ʼn5Nj+l%#r"1?gF$w9 Fu*RЪ C00lOHC1+`$3ü!G : "o8c|P燵")ÔCDQaEr\\_EG(\x6,b;ڗ/3rBHkRIbFZoO&``Z5ұ۞I{<& @=z VG#$s΁dQZCK2+UAؐ%+[͑iW`) +t732_(ERk= ) `maJMh*K¸E 1S "QLkb|||>ё67XBЕ>& &")]%b 1a f )RH%4U@`Y=DPoX Àb쳈 a#5"r,Jc!㍞ʊ{]F\l6ڠ]ɇ%%>@>*t.(єI|T6`DŽWaڭǕF%&E\~y"V@(yTO7R)21+9Q ٘3N)X1F"!tZ :yBC+cѐ$)S8NIqÕ;D\B!!w LRSQ* :4׉BpBqx&&!qQ4mV?ZcRNxIr,L Ř! /ڄL/BIG˺yTT?3iid&Soh24*(V'itx?y{fVKɠFL!+1XTQB}'4_utu;Nљ&]]o̬ͣR,t8'Z/~uɒk 4\%<1yc7_-ĀPIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/edit-redo.png000066400000000000000000000064671260417502300246110ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs11(RtEXtSoftwarewww.inkscape.org< IDATx{T}ǿs;eXf!qJZI+7RUmU'i\e)U4v*ŕCT%&kQmbǏG 16 ,^e_=3y(R|4Ǩ_Xxٛ;W7C-v&)ftϨy>;/}5^}bfӳ.DmujFE`ޟ79w|0o%oGl=#?'X|Fmu-7#i%Q\S A8K~ Sx{q~bwxOy`jÖS >7C =>yc]vxG^a)6.w!@I?ަW2wy0/yF_hA[ vvF*&\ʰrK8S9rgёl9 g^*< E{>|_z3V7 []]#ݙO z ⭅sy$f oBLptg[B>kHk(N'ANpCKo6)~ԛlΠ/=0mk41H_fV=в 붍uLB7\/dO oJqHq*xRؙAsECATS>ʪ˥JCO~B"b nNJ(\`@;n7f$&3 97>5 SQ~̙IZ))ǁ%z8 "~lhVƠluqB:0۾UqxxOڀ/BAQeZRjyOpu Ŝ'NR|{t6)vWWvxoWi[hIf4kDEҍ8/dFbd_e_V؟?()+# Y^<7Rg}+o;9~3m[Ӄt㒙 lw*Ϸ6g!Eg8"r$x-etN6|Xnf\%/;Fx)YNK5ywh|a4v>8-ݫrPZԧn@ 5SU28xf`_OQjbJ@v&XZYCPU ,+-Nat:zǝ㶕yr?%?i@ϙG+G 2R6^'inb!y'4՞׋*VquU+Lq4=VޕyH1cUvQ <` j54ep~/fM[PeOqKg^>wˈC be&6!p堄.A$ "DAC + yQYq5DŔ4õU6ٞ'8Û3S 8Zkи" = ~!md4gq\ Xcm": [sl RwzSD3R ,bjI\>˒ O.6h-.xUU T 3,I,#Ҽ>XӥJҖ*~d`U @fؕ`WdBטeЀ :ߝ\ bh'\K4\s4MͱS5 lne&䐁t ׳?9Wt)|XчcWA̒&`j9r.ȂQXݏmbO}_V`ѭ5΢I&A>#Fa?x6>>ݻU>~j! CT`%F,W@5=fH@ @f6Z*@eD軕WBm$Cdcv_`h%y^  |0I<M%ghC_/j.BcG` k[$m'&#o[3{#;Pq-\FVM";/LOdGp"7:P7 ~~ST)(`FO2C/sD_d. ։TIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/edit-rename.png000066400000000000000000000013541260417502300251150ustar00rootroot00000000000000PNG  IHDR00` sBITO pHYs11(RtEXtSoftwarewww.inkscape.org<PLTEUWSVXT]_[_a] pCtRNS  !"#$%%&'()*+,-/0148<@DHLPTX\^bcIDATx;N0@$ !j8: [@Bx#bXOy[D( US򜖽o^5LfaaX&TpEE;j63c nNOw]8'ǽ| gT `ҾZ?ݺj-+Q8W!!Vh#פS;Y`#"-F@:|z:?g|/SΡ Aq /b*IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/edit-undo.png000066400000000000000000000065601260417502300246170ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs11(RtEXtSoftwarewww.inkscape.org< IDATx W}ƿ{})%0`pʐT\JLʉS9\6$X!8 N21@ b B K+[k;{3{=-ұ+RW_O{{YBZlR;N6-$r$ NpSK޵soxz*m{}7[pv8~ZAADT H/" Au8gVi=_[ h|aEBF4ϟw `.cd(_ b{.g6f~І9Y}+NcX,`Xh\Vm\z~t\K .@qc5l.$y-l-}i.A"bSwA   7:jJjn}ol}uOihPZ"3} DSc(G0p\iI~J.Xe l ;go?5^&?gm1lgg0K==y š}0\q$uZC=<ƶ'tem7nsw:Z) 1 TEÚ᷷uy6wǷ6=85&ALhʾ؛Uߨ"`a]JABdƣ衩T%6.0/(4pZ~ydEww߾j? 9ati`h$4Nz\FqWwX8+ n̊seb|-zbYY MO|q7[*]Vx[#OuX{B:r>^ox;1vD5#Lm`ԉ;u.ݳn\D ||L8U2v(qg>~r“lǺe?9Y'(-9q 4 L űA |2B&eO_B~ngǑ W` ;"a,9ѓ<%%n0#IhŽag[Mk*#e W- e39B9WppD@$|qهq٨Fz2V1,b }N1"d uJE'#Gbq?e 1;K8=+Kh1'̄Ok:JdF }\H5pI!%$Y/Yg7Z0_b,RR$K!|[V8\(;C5nfr_6q1!Y(X&MAլ [ XHEZڦmש),.;n-Dsl A5xZEj"K&*s5,n3%xe۔v3s"£;dWl`OHg:8ېqWA9&HДe (b?l<4|Nx-X񝌣Rq(=_\H~Fz"CNm蚨Ty(`d5|ٺv#jsO+ie=8tC|*rk hƦ "A!HIXQXjS`La%m$fXlv*4}ܑ^ ͡7P%4d#Q7&ڀYu: bwZ39V#M|pR _#XfM׾}v/97kѪ ĉlܲavzfRhڑPHqy ]"gX2>\̓l{a>ρQJF7v>^g$޵w˭BnG!0*`29=4Aj6ᮮ=SK?ʦV*A ㉑ЄLT.s/X۞1L|JTyeRJz|> X}3l%4±l[yj ؾeǵU[Fq\)b|q纎~ߩi a 4E:"k<Pt"qS40JaYe8eӱ}CU1jy?a $$Ha+@iܧ"\%nm۸a(Qk,жpO} ׶Xo&Hе/Ctv)/0(|TxH#1֮]G|Uj#45Q2-4gT]i/=Y*|Ӵ.r#|"N$ZePm4*YGXĨdU|$L*CX憑ΟINZ(aDd疉a {j)NقYdrFa YGf <񛏶LMM4ΤF+`zRĢ:8{= 88)  i+w?(%wx < mMuX El!Z[x+éo:p ?>=߿`E,V7Q(dJtl5X~P2PSeL%PjCksupGN 8 i2tmG{kgsc4BpudlLǕ3 |2E!PaMD5;o鱳{S F{A`z|r捛SkhBP[ucTDtR~$8/a2T5*B{?xS?Ksy` YR1Ng'gg0&6Xt]Т顖|JzC&詳\6y!ӿD<Ȝx}vhjk.:޶;+(6!tw?hb)yoR}yčT:BՉP]B˱ф` ut04:ε--grFX,Ұ;6Oa0;EomuJFLߥM{H7)`Y*ڞQmj PR ʎM[gq&fF淇S;!oƢTo@}mBIY 2]ۺ0p /eƓom'~ kBBex845p07Fˁ<0 svÚ-(Dt-vn@H?BJ#oo Éf`{l<)\u-w.ֽAnތiHNM22>ݛ/9 gU|!ߗ|1BHC!KS[ s/d)160Ɩ-ЂC8!&Uu^$ R0v{!!'1(t$ "O~> M__{FJ[d(JmvˊSp=DIīP*Iÿㅃ/@BJ۸i ?FsN*qg '8;P $AL⅖ѝLD8hn)bXbRŽ;$u?Ie6z|cV}; BJl;"b g(Z, T3kF4),~oeR[X+^@r-Ew^nC)2 9L@x٘9缷$*(D)4r.(o&N<[q =H=oF?nJ,2Ǚ{e@X10?FUYPYaQ顑\S lH i;-tӟپF~~N}w~r[ڄ^~[bo;uw RXQXWxxPGNj{HUISΈdmINp׍'FR |pmkJ@@xĩ~G=ƒVN髙K&A8@T?{sʩ*>X,(j2љ#glV0BЋ9I /6*'B C#{)Z(,)xX[2?HPOa>K-K@{IWM x  r08`ep"J;K |_ݵ~mrx`UgSVɀYg#O-H =@M  ΂@1Јa6ƻt_y]:Vڷ?̳cI"3gpmExYHm@wJj ̶` Y0,]w~|TǫDPgX5T=F ǿȑuIs- +! @<(' {hԡ/jl~VYӛ8g]=KiY+*@%\sx聨i P'K9,#@=˜B\[0`/*nOžz&`,K1*-_棟Fk 8T .؋59h̓:`Kḫz.c჎XLoېwvOf{w x13F 8<")ݍ,}4[kX#blPwQr t3d,cc#eyFtY k1߀Tu%Po@YE 2&qAULm''i]L|L % -H؀@PL=MЂ4XI*V>F,t3FZm$f#\I MpEvl[U,]"bS5666`{ЁKZtV;c~ PF-{KwuQBI 4)` ]@  0uIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/folder-sound.png000066400000000000000000000034711260417502300253260ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs11(RtEXtSoftwarewww.inkscape.org<IDATxݚ]l/Y۱MP169RE#  P$$P5J{Q+*Z.VZUQO$.-j -m! %J4؉߮׻;;;xVHKGz4ofw93Zg0‡ {jnx󍅧./o1TWq5j-ux7 y{mHiucٮ|@Vkݟw=Ͽ9??_] 5AP_})Pa6ZBbmkvs=Vv]4>'lmSl3(iqT亊;0 2(>Tp_oxz\zuյqW܉7>AQrR+|vLuw ^2 uԕZ`^u-q\w2h &$Q&@)eT6qƝ*UIJMJ3 q' ^]σ>*NI \ iD+MX=;*v#JZ9N{ig>e;BP U)VK`S^4V5QJ\Y܉D K&&Ϝs 'z&r(_E˱A옢4*7S+1'iҕ(6<&pkw-qWqp<; (ke~}3s~ta{)|:~KcbW8g$m-%]ZK8 5o<KpF_bT R\_3&*ΙJ)t}+V!˃ުR(4uD`^ۆMM xb򂜷fMUŝ'nyyLg5ja1^a7031a-{huXj:}IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/folder.png000066400000000000000000000020221260417502300241670ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATx=]U81ɤB "QK ;llbeRX heK"hg,fx~9p"uX-.aw"'YV| p 4$vٟE@G)riSggq2ٝoK?j -yr9{m|~YU moyMfpoc:籨I|g`ɳh~ -K73LL*T9{ƽқW~ytaX)Y D+i*f=\i9[Y`JE#A;S{TAx Y@L"6<Ƨ|vrJI0^(KU=ϊ׀@!.{QHG%bEً}ZHݤ,t@?@D0@tYaUz[f4kPD¤QRp?p뾋LQgf$O %"}4]w9CK dU^id!%XqV`l;꽕0[P " z޷d ;eR A2]dC2Nnƒ4=\Da AT7udL퉭lg {I]cgPy1A9L5If `XB(1[+ASF#əZqGBt 4ИM#K‚U $7d9bv0YXrTۀe4,A~5?wMV %y>Uɕo޺p+h'A8#>ƹN~5"{e{۷[$Z|x8'En$"r0Fݏ9>1/wSIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/go-down.png000066400000000000000000000045441260417502300243010ustar00rootroot00000000000000PNG  IHDR00WbKGD pHYs^tIME  ;IDATxY}lUg~~l ClŒYf41qDhC E! 21p[n|{I"pRL>wNoO<'Ň2 'z=#b!` Ntnsx#{լ?&55zSc7zoh"爟Ox C&\TB\_ P&Om@=x^yO#7Ԁ)g`U@k678aP7JX,)zmsL;0Pϵc0M$X2kl!I <4ȇ@(2h`Ke^ _rX \r4DUq%a^_b;L@KSrae(* I̚Gvw9Wſ{i1,7J0C0f`.r6'E"#+L,@}U֖cEUd ml<URHK&m HͶ 2Td6!H0ѶFgWD\xN1&ʔTbtL&Vշ%ˌbbrB[?lGJP Jnd,K̰HO(>b?0\׃%ۉsG̥IKm 3Yt>7ֲ w'ʀqt2 ɀt{U t{QKT d='}р/<ַl8O1q*(tqC+Y%+6藾! OVa/w2-*]wxע$ e-oyR q9_C̃޺0!IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/go-home.png000066400000000000000000000046321260417502300242600ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs11(RtEXtSoftwarewww.inkscape.org< IDATxYmPT~~݅]EA&DWD*Nɏ괱?LG:քX8NS4CIĴ"ݻe]- &y{999ﹻHB|aYwR|#甄pp,{)Ip! I 4= [T~Gng@8ee IMg9yP[]|:Vg]]]?eCӹևExn6jGM&LC(%/g?1U5UN5:znn ZH.k\Q̥,! 7 b1K?i&*wW3^"իwA|/_G_o,]] /vcSBGg׿qƓBՕNEQ=Xyyk},_d̥o :}PTա'~ɦѝLmǎaL"%8؈-[$BhEnNM&/7O._UqgdAdIӕ+{`/vtRJKK`?t}~mgvArcA"!!7㐒#d 4 ii!; ,2q{h v"pq3!I" صc;|~?FE۶۷FXXhƄχIzlQZV v"HhUf֯= "?z.ۆf/::x'iU?%;ɞ?[y8LOM TV9"+Hvj~- Q&L,b^^% gSRQRZyֆӧOJ&G:,`"}gdf :Sp%zg4q#+Lc},JKUjkSY8JW^}Uwi%Z@^A!OP>Vz*+qqqqx`믣>r9# Jy9&[Ǝ9gՊ'Ao8y屑1Obbr dYn ^Q!6}WYsg? qߊY=y.W lB,V =?hpo:JdƉ.s x -m=so~xnzY p-{nDk:ٵO$UWˏ=tj週,'?\-~р80L>ʓ_ج6S2 cB# 4!8 EeOh@UnCˬHz,h!@0\pZSU &b1aW"hp_!~~BmX- ބSum4Qd`DL\=3[Hc7 )41_\-de{@ܝSL D`xH#|Ii܇̄]܆8DP,d)i͍*L/*=OBniHLX@Ltz5l!P_^I?W]k3sB}7u?U+翔A/G4uv]0Я8g3 1,%n -gxTKɶ6IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/go-jump.png000066400000000000000000000021461260417502300243010ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs11(RtEXtSoftwarewww.inkscape.org<IDATxk[eǟ眴̕@HQbB&BݺHVK Jw'P؅ 8]Z% <{NNK3B6 '|<{yIPDR B hEI$[r>"U ;"Mu46SρE;J[_._,EKrt(ZV.X8F.+OK rV.n8H;H |bpEu `J_@DDk^N!K({eLS@A$K#H83MP{[yM ^"jzpDE7ΞPxV_xCKPcowϜ:mԲ hY\nd ;9֠ >|sН7'NGHsF BOh[ǏIxbKLD63+Z~u0RoKwo8Pɸ,'.Ufjɳ,f8yX`6?ZGDʪ £|n ]l)=_(aTX؞?ڳwn ]ò׈#CfJ1;T*OV&^ZZ}Zb60D' gq;}ѣlx9 zd?u@2L!"Lu @qɾYD!ec ԧ ȬZ B A@BOF$)n Z6 cIZT\#v`]}ֽ^c$ Hv W_%0 #i6Yc^C1/{$?* ~ﯷIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/go-next.png000066400000000000000000000045711260417502300243100ustar00rootroot00000000000000PNG  IHDR00WbKGD pHYs^tIME  eP IDATxY{.XkFkRikMc6REJGZ"*Ea ]]w;3L?Ι;sﮡ IY~~;s~NI;6[]Q&\!ĉ#`LGWឳNy^eJ:cQ+׽qg8VM^K~}So^<?d-;*(ong?:\|V]z=MAqĆq\Z7l($_D n٣,~p&u-T_7G;\\/4e865f20xGa%@2Z@B>@g~H,^4 ~̺PzAMs;2B!/y. ]? Y1"6Ma! P΀ (Ɵֈ;okzG*!ܮ>?0Lz-c#0rٴLa+{rQPz{zK.Oȓ %$>̱zF!^r=.>egQĦNW@D&"JE^#B!3g1)6n=q/9(s1D.&("H*AM) , Y (SlUpKͦ;UfB&!Mf^X BQ;>MFPSHa8e[%{0:?O.Qh#ϸ05bK-Dۊ <_`6i#> b[$S.y#nJ!>o&\4@nVBCzsã#FBJǜ"*YP"@H(@RUO&S Jf;HV{U;Q͏̔0PO/GY@7fslLtNʁcgD:AweComr_U Xt@:ع(~*U\7 aŽ”Qm,Ky\GT@qMX*􄰒_qPPB`U?ۑ4q .c[f[ $"FRUP"+1@}} ){KR{; Ǽ@h^[5eğ0eSM*>NC:B@{8zWo\5jCKBeX$"m8QTg@BNɛ*U#=+_m|oКSƌ2D,:S"p!H>ui62o;;m`W`z)}1=-b&N9]L(ۙ%L30'!F+U+}Ń(@# /̀,@MĹbDt.!lٴ}6DvD<鸮[^'t@?H>c>wλHOR晬,S7ڶw[ T3rA;*'8!ǁoGj-W,3AT&7J/T!@f9ݝ֍=eDv=jcڷ(N4:JFjQ9Ԃw׼,_}So˲.|sp&@!׈x[^.(R)Y`[samY@;> )ݠ@lӱ f![_܊*;^ZPMPe4V^Kx|K%Ў-[XDȏ9=xuR1O%fBkЖ%?`7xV]o| cG|uú6K[`iz ڰd1nXtbe ʚv"l:y2/l^ z:)#ܠuX `|h57>uWO>uu]tQ8i'ıcĠ=:IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/go-previous.png000066400000000000000000000047321260417502300252050ustar00rootroot00000000000000PNG  IHDR00WbKGD pHYs^tIME 'Em gIDATxYil\}͌wvB!+ 5 *"hm4t-EG7ҪUPY @H4QE mH Y2߼w3Ubɑ?r&7̽wιݙT k- #pbW ֿ8}" ϶,77=bļOM3:yh!K{Z֚,wtLؼ}-.ń40k)XpN뎫Qhnኁ ؾs ܼlª k/@lxm:"bBdZ}[߿ZLmAPX L?L:@N 6tɒk.oo*!'FκuUVUV1[K/Ŭ9SP Tt?wp H`!7 Ā,`2bp +bby+YRXljkkfP`. qOk_Sk~ېhJp6 "èU} nODF[k…7݇n{ihlJ )3 g&2fЃdsﺭNw~swIun0 ]FB2gFXFΛs9YukIa467ew?ƴ|;;>|oZ/=> i=w)t6*[7S[Vn`Ɵt-4T@N!΄?7'ןֶ+w{'Tvz]28wTZi 36>ýd0dH8C2\|^E)t1}|N\(Θ7k.Cd!w\L" <㯣};ObG㎞yhumowB' 4UH <.oz/~8z̗J{uoOZvQ4EěJVĸb#m]gL'l~artn@x užLY?={߾z{kgg x GygDpw:q_]Q5NTxĀ7(oƘ :lyn#`k׻ 2~ X=z7۟E_P1?oI1 x{_Z_cKbn$S" 2KJ ӟJo~s"7Q{vuLhOÆ3߈^XӷgiG18qn>p\bTp4Y`IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/go-up.png000066400000000000000000000045721260417502300237570ustar00rootroot00000000000000PNG  IHDR00WbKGD pHYs^tIME  (5 IDATxY lVW~}mBK -Zh)g 3#a4fS8uffj’%AG3431$(@d 2O~?4PHO Sk1A?nݼS9Ѷ~}\drX GR٨ٟ,,{ߖW5#^C4Bto9{CY[J;fOo)oﳧBshk,OJ%ʲYl׋5J/r:E3QZbuBn0rڧfս(&Z s~˺A1@mk`DC5BXϛQ?k T׹=#'!Y~S\@唍6cF׬ݰa+ȫT=;{ћQ :ќm]x.)NsRu~EԸ8|2Pj.>gtLZ"jhp\N= ulI:֏p ;I哺Iz1Qxp¹'D"Aɩ~19QAvI4h~{Q7*xbM$_ذ ,!d;g(.?wt4%M2o)@i˪Z"ӆcʪ*]&JCyXgƍɦ -ID~-Too~P:~ %_-M&j'LjջhF74"TUdHBNshPE2 ~Ѽ n2+/ /H yX6Bet`&x/ ټd|af8TaK'b@XόFaf[ (t꾮2Zx_RjTugK{&8.llj-X `Yۂ%,g"!D\+W+ ikӜTT!R,.\S>(Gڷۛq|xmTL=1c$ iuڐ2@"$udԥӬTL6Gdp"ZDP^^Ҫd;uxѐG ƅkuM͸x)G4CQ,Dk0 $\IÐ.z;aq%TTgJUJ&xQ#NK3?U]_7:x鹌\>G oB`9s-J@YLsũ%Q]0"8asGeUy]EW+_xnvݤK:KpzAx u!, %I]*Y]js#k6۴4V_)0 F^ڀ|V A4y-?#>,)җҊ~r2! 4A[J@#$D.ͩk['`lrB:P#X1; .N}~ Lk {(V H: L"+DX}\v MD8M)F՛]Y&U{<E@Z""!罉 pI=\e, Unq#{DB1q`E ! mǜ{,xH)naGϋw`ǥùaArs}ژ{3.0XE@)Y(ᅩa~g]zx*dvQ,Oi>d!Rލʤ yF^'yy/$K* ʪ 8mcO{ Kj*ΞA d@#8bcѾVK~*:{=vsYXZ!o!s$L$I*dw:w0A{QHN8$~FիGTYowk/YJ [IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/help-about.png000066400000000000000000000043251260417502300247640ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs11(RtEXtSoftwarewww.inkscape.org<RIDATx]g;3gw~U Et5HK@cmڋ^11zcچxMib$j*Ջ/,Z/AД4iV"iXHXe=gw<xΜa8a131̈ .sGm"XED Ĝ@y 8̯TEEmw@\!"/ї>{5`9ʊl1糰-GG>bXXҵvnT 5/#_2RXC}?HaU']y\[Ð|/=gF =0f>E\'̯at<^ ee.P&C_9G^=6Xذ V.̓HD<מx ǸKs4rj,6?7F-s=&Vn5,io@N2*CA] k<%vcWt6 }썌 I%ۯWBbOJUtv8 G74V BPp]lmd 3f !݂ӱ h]PSDFbDX[&"A#}I B.1Y(f 5hJ#ٖ+ ! ŀY 0Z )YҖsc4kE?,,Qں:mI*pCyV26<ӑw{=crSCl&P()cŀPD*[C BȘv9kIf0`3ޫB_{%[&fK7`LK2B(Ps FSko%DeBCRY{x#>zqJ@T>CZrB8y4(ѵ(&Į 0'6eQ ^`4* qaAe5< *QH7u1XC@L xۄ.~v."`[ h#ed@D0 dґ.2N,ٓD_}@itiRyYf'1R d"i f7@ :3p2G |`:?~<Л9نê".sF ;s1vJ z f8kIF &˄xR| m> fiy(t4 n N[~ }8gTkҎ@k)B49es]feK`Zۘq鄆aL>}]ወlКFzfAT %WW!~yGI;<0]QgLą{8v~*5fnDYY}?o]B^!t$5/\JިI}+B¯,1 x{c?H3[P 6b4"->p5Me?tWtp2h,ue&5 k Qq"E{;:5Js@!I0y'xji6Xo׵N?2תIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/help-hint.png000066400000000000000000000055551260417502300246220ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs11(RtEXtSoftwarewww.inkscape.org< IDATx՚{]Wuƿ>3sg&8M\qʤNb7@PJT  RPUUAE$NpMv3~}{u;V\Og}:וּϛD1Jvi{$K̐1$NUKZphGFއ}S>ҭ H|^Лi搮KVc~`on,M+/RwAW).,;:Y?..yӕޅW?K7pRf~#+"6 c8òxQ~KWI>hm(mo#v2 ; sL.WXلPL>rsڟ.舵ݼu^-Wv99M}z}qLN~s,d֟!Tj8D>\,혦dMݵyK3Vݸ50/|t-Wlera5UnH2t<촲SA?K"m )7;9nyGF_B_%ew-![tgT@  M`,qihf%J&*':Q7}g.4 3o1S\_\5%.:FHzLN'm;3!6_ɫk Qi7m~ rU9Xe)9҅(U-ݡ:Gr'c`; So!!QQWizaJ;T]|O9*=dgmrH,$#L" &fP v)%]")oYk̀5È B̪tidp]C\dl.'Xq\k@ BAr*P䫙 7O2ʷ8j|FUr'Hp7"v5*B} "K[!D /HzFcĶ2{ ؎ A35 9Y9/28dHleS* K ITZi |Ĥ$2~`1Y "Ζ b L챵(u!9!IY.;Zv9<(z0"Ij" ŠGĉmXW{@dEUdV R=3P*k;A uN &ǰ] S#=  /Yĵ `0fQJ /āojWn+1r+;$/;W0mpsԫq }3V˒m aH9].m04^.?w@g)KK8=04IIZ(pn4:]h7[_܄5sιK*'将EE*J/ E蟦(*S$q4ȮWFcP}ia";+HdOC y®̿?tuOA>MM͟>0˻K豙03666G}Pjbv̙ޕJӛmv k7TgM';=gm_iykԼ4w{lQK 1˯Myck.m౭GNvM"|Gq~T~2\+|amO][r)N˒,$Usu?<27r +B2,zc~1\Kf5XC6RD"YZXk}{Oߡ\t~5~sup%_wIm{447&ɣL =|}@S<:K~,?USro4? xn  i:[<3Js7ۍ+ê^j4DU6= zE meeUz5Ƶ6b<3@Kq϶zŀN#c !h%Ge Dy:Or+JYTo6(n{ZYAʡvIZ., `U ϝ\[wH}GRyvMeئ-AQ( ḏGS>6s 57?=ሊ~%2N6 ?K4 O#OlSwsk;|@jIPcIRRR68D +XvN}`̭0Tv"01 ԔEtx͚ Gt 6Né I2ȳYAl/TN40d~{h'ͣj*D)`~ h&Hq,ⓗ9Fjyn?k]we,d#EHšd::)Ah=@ dw6L_&0p`0%U!y(nJ0UeR!L;x\A!oga2nh !5ig6hD0hDJ0-V(xn.PRSz]H[t(t8ÖaM{yEc @g6AYfMTyn [Dw* Xؓ{zMjM$O%Tۆ Ft)G^68" ,l҅ e/9Oa#dcl>,K"4aIQѦKe &<^2y qToEXܝ7bU>Ǹ%Zjݫ mrݺ%xEJldT _.1B8T!FZln_W:]Yvƣ (JP"!9IPGLul oxŃ7iix5 :.pAgZ )-*i.hd:#%vf&6ȺHxr˦`d48  T&ןȞoO%]Ps;SڵBh\Ѣ nmOSJiJ&.JZ+Q?-OSBxR0qП xH ~4|<"šH̓TTM&x*}G M{{KՈ՝׶4龦ڂtjȪ2KEaB*⼥pά¦&h..QY`d iBBT),TKMOdSrT,X=7z|BmvyƓym!lrhby=S KB!VpyhvƛPeJ e:OH+ O*~?u}tM C7ΏkfyrFBVBCñm~-wגvOUM~!!KnyxcYG}0mR醀8 bt W_?x3ML01)|;]d E|H0xOtڽ8{R,L??#U6\hjEE}gCYtz飑57{i֑a2R:,EܽllCq$F(eaTL4~cJ׬mY.e_ggkJ,lԪ+VfL)G+uqO?5ȩAMk]M9;:TKoG:^ ٸWu )K&F̢msS/:%_~-5VPc,O>2j^ݩoUMM#9s[3ϵ~ddzۭNX`wc\Z"21Tvh?+|dE[gec[kOR{ndYR;uXOrgĢ[rʆ]\CqyWI?{t,sM76auYS6W}SQ@Ư^i%佹ge$Ͼr]vWw~m=1W-D=iv|隡:V[w>y%__o叾_\][SZ\uwo.W_^?y[}75V|nV_]qWذzY pUǢ_Ckyu郻__qmQvGIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/input-keyboard.png000066400000000000000000000031231260417502300256540ustar00rootroot00000000000000PNG  IHDR00` sBITO pHYs11(RtEXtSoftwarewww.inkscape.org<pPLTEXXZYYZ\\\\\\ddd{{|{{|½ùCDұ|RB7tRNS:J|IDATxoGgfg5~ɛ!8/T%@@!D*/rԪTz(꡷+ ěT8$mBED &Iub'/R uOgHaӦׅzI)s+T_I O\4Xx+ IEв[[lW6.,RFlM/錄EhemW><}XN;.? ܾH8A FUs M䢻Gq9ytN]Gj{y;c@QSe>{H:u$y]?KKH0@Tv㹯#D`v I%[Oq5y6-|| +'_tba+ j {G!D~:&ݮLׯYj@񸅧b;Gco|6}{pfܯA@ĥsGy콫gևS+Dߗ/ V.0<&k+,h҈N{rfJ\ZIDATxgtTǖ:R+g   s6D#d0`ml`L28 ؀Q"$$Y$PVnu:5?7[of߽]ծkW<'RJ)ql#}ޙs?hֱ>?Gdq =5 X(FhF>>4ďm}'kk'"BD()er (Pe!I]옴2Y O &`ɨtcdh\a6p‰`5h] !d"YI1k  `%tO=/{ +toڻi4{AQಘnղ6g̛gɲѲWᵂui 6 )˨ggӃ5" &"Jkkek|z,LD5M.hCpBz'yz"9;y Ya/ ,eN1E @!@M?åQ޺4JS(**+|M٢MׄGѰ@\{;%(x)h}A>eWAt&kTf*cDq4KE:mBe|QcH_|&>yP^!zVJv \3_s&υ?汘]8L[R8UF('=߫w}(/j*Sa>9nG|Yhm( 'F"xI,/iv[%~f19CۣZC[={C;r+oNJ 2 sPD tRU_q8MkflO$ҕ摎!PQa$`eBۼ/4k@6ᜣ12SO܊ i hl)ʍ/42!3-s._>\w\\@1 xRą B{ۼ| tE8s;^j/)[<]l۞c:K5` dvB%W_z"x٣Ay!AwTȫ w[w PAuQY3yVSAir`w՘thbecQ9 <b% Tm9(5CU"oF>/|xcO{Es*A{QPf9 YZyie0);Y患۠=m=gAO?S05P|pkX4#T ^WHLpxUͯIq-rAydX˳A5jՇߟt_AoPPڹ$1q,Wr#uZ=-?{+y/k xOms< - R{Y 5炒*q8Fd 6'@ i rR{nrk qu`qp?F< _ȣ;e ӆH 8t/Fp6Ps@X~XrѸB uސ5epoOKZ ʙrdz8F(5S .Ű8dcyE}y4n.2ɔYQ(>ZgaK?&uO I aZ[[ !oÙW kƩ1 )@ptCj-guPB5Y0Y}yVTھH12YY9Xc#3AV檌ۖ"" yjSa0n# 棨EP59":⢫u:B{5cvU^rWD\ ?5JkFݢ¿#C1j n`Ÿ;C}2KжkOE@ubr\ ST>(©@9 u߁GCD+Bz@UP)Et1\]1FYF8(|t~ Rb# /2};}K冶Azf\g6t\T YK@(D*LCen| ;J%Y+{'tguă/U.Hrv]ܨ5TzA;/RTlܼ(ԅJm5d#[7PŃ`BA]%\*u5v12@hQ+S=*f-#(m~Q5(fxpVq1}`.sܛs ceהU>Uj%puf%UK6*H}Yd#ppJ") ?,X~0c1p}d9@ <BD?x2ܛ6O `vN{֢t؀c$Z\dڍ"RdYSdy%{{ L'A,IGXGkkAF>-ϦX,b'6hKӿs;ˉ}V*/2( xyrjΩ >`*#?#@=<'仒J)Sn5ŚbMᅑ?ƅG6XD,?C,z'5M \]n`>dcI/`"h@e2B/v2@9#@~-3( J@!Ӑx>pCx]@$W{ ИoE{E0`Dde:IS&@,~pr3b:x"x3? @wVwT/gAPLV_宅nwJ6F؅ςUekK\p4e[i%Mz=q[=[.׭w?yΕ93dkvDX 4_=ȁpm/4C]aorseTϧؼ _q:vo<S[@4iwq;f V4nnAZ5R*m'֧wA7@cKp5kO]7N>B/D hFMQ ťUiP(sR"Iߕ8\Ʋ)%y {qJ+G2p-Q}O]u ""?E25@9@h&8YD.6)5CT`iYSN[[ɫʸ[O4?T85@;}x;Ρ.P>Ҿ6-cd?.׾\|y0,{: @u[' pNr>4V;M; ZKV;m@S;E ZghYZ \'bpҜJk d31"gj$PX\WEaۿ~p t}yO¢uMWkWU/\ksOwn)D:\zKp~KSlDYek䟔sD0w~8h=]_ݨ "R wp}c.p6 9dz9J5l:v/å̍SڰH6#S)ij:P?x5e#Wd-(?Si_?[k_!_ 7]סGpI}<CSĂH_1Gj.>0+(v7! ,ReWn).x&A~3Jeh*?(x(a)@cw Ps4*߼ 36 %Өui2pKf ,:o7,Ntu|>UQ!~e_6kpB#Ja)6dxs D}DvoVP\!wPR GxW~*Pf5*-rlaOVuNmo;o1oz9o?y@P >OscAk"Xj|H#T6J^+@זjq;402,Ƀu{<+zuiy[$y&1jh'm&ɝZ}BoJNCgŲgo:(%˷m߅G_tguZ6|aK]( 3 I&΃k}&OOI*oUvV^ZjTܩ ?7w)pOvr}\C0xN'ƃ3QpUu_p e_ N !&Zݘ>`:tJ|K֕lceυ"8{T㝔ޝ9kWw1.xjqڪW JKE"ǃM/k~I>$[Od50I ۻ _{<2jn ؓqӽ{6iPHI&[POBK,X` {2Ȯbch˾ 8p`à:kC5  Э@5+8SяPpcC^f샏G6{C g+u!'V P.Z}-GoojO~Mn"A9YIgpzهǷ@SNEk9~g-g%gyؖzGP=Pj,055NkcAK66j}o{n i׹%v.O EúzD3w0;Rn{ 3RXx, ^-˂~+iU=VT~F>|~SfzG;ϩ^{p+0ڲQJDũMv#L4T%[hM}<:W{h7\ۯ{ɻnGkt=*ꂜ,[Pglf[u['E(<"{@;rfn2߀ AwAPl.)}WvXc3PhYeC9`2W@ qnXk WW9Emapn@/U\e_L[i=0L,pϷ |~߮iXg!˘Zt9;BQ{bs]@1Ԅrs9S_Ci@񪱶X{[mFSe,ܱyg fsG_([?EgBaᩡt_PKIrJ:R ЯŎG8FP""Ly\.~z;Ru;':A֭ǟgG=-WjPԲjNștZם%4D<_F *"˼a2ybyu4-cC*wUJ(Ӣr:?wE槽^x놗ѣbRjAZJ)_x46> RK7 o<2)>ߚ>;Z̞k?mQ7k=7,fLj }~}(}hp[;eKJCB KAXQStt[dy`~;vyw - JO[V,bkVߺ,; |u?_τuD4mjoCܠN zOxtgC 3s=oCЬР/O?ίKcvjNZjUg >1kr臊oգC"Y cl/׾ Ւ#ޜ1!:9;Z>>=̺|(gwWOW `[m;%$FĂ%_W,O.kV6lG3kcG0􎳑ukEƴ[e[ m̌i_N7ٻq8]#cW.:LnFtYMޯuu\wsƪ_w"1m+YK{dÏ^'ۅtCWǞb/'noS avZWuR5T!iڇT.8q<҆,elఀ]WWWP:P:R.|~hOM]&i[ەփc:tQ-o~'O `*9܋c޷鼟wȀ#a֏}rg||}zg^MrtBo Wj|RφZ4@U5GM>Gz~-6M3G iJ`<ӽRo^jY:忛Z.&|;[1?yrmӆr0Aտ}}+ۢsOׄI?>MEaA?L]Z5$k|0Wתd%N8W$(նܵڵ̵urRuǻJNr?p*#7N}IlIB♉I.lm~86ʾϏ?~s?pQc]5ISA;k)E//$ÓRao=E5ݴa*e}mNҸ&W[o+`ߜBB ͣg5׷ч244ǚ +J*R觬k!7+ᝒ%+Wb ѯ @(- $f (UJ>{weݭy㳮'e!=}5IN録K%0Ut?QdNjT0w(ǶdIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/kittens.png000066400000000000000000000046241260417502300244070ustar00rootroot00000000000000PNG  IHDR00WbKGD pHYs%y%y"tIME#T !IDAThL_wynG)s!`hqv?uMْ.uRӐͩHf` uR ː Xwݳ)xwhMpٓ\>9lۏs4M+}*R$ `}n(_LDM**v=?ϧ ﲵRdX`.]B*`\yX@ -Yh$&&h^/qnݺdaj2*%vK /n4imm466J@P +F&rrrX`f$∉ADx<\.v;ɓ'W'P ^6y*Ö-[Xt);wpxRUU%""cccb٤ xn.behhHd466&׮]O?T,K8N2qȋ/(/^#'NxQ<")577KnnFjbX@N:t<%FFlذA._|_EEt:h_uN8!211!|>ڵKo.ϟT];" DGGl Y~ `?@`ꚵ_.A__z{nmmm ` Яl Z[[g-( ] 0}8wz٢^DrJA=<`5@zz:@llz+Ituu(n߼yknG.jݬ?+ k׮Hb^/gElHWW,ZH  Yl x<ϫJ^!---a|W]zL&jRSSV~``@̙^/)))r666 _VVx^VV&MbNN@RF  Cຯ^^/9nVR~޼yj~?nӧO.?W9vXDT@%;;[)))R? %!!Afrlػw*PHyyUŋʕ+aenlݺuoGUz5_hΜ9C^^^DKe߾}b 6n܈NHb٨Fӱi&~@ ),,TS &lБ#G8GDkpp0p\~dttthness3"Q( 300drr^Obb")))呚l6[LI ;? CQUU%%%dddF .`6| ܪ588(R^^~Z>޷ozuzTG@*p:r{h4pYmm$$$HOO۷oKccܺu+S"55zȩSB*ihh O=[NDD\.$$$Ȏ;8 -8 X N3τLnܸ!&I>㰅{'bZpjXX{њ5kT=:)RR͛%---$Oeet:1 Vmj曗'[nI#QTHbbbȼfddDt:z@+L`|=pϜ\d…!U&sΕŋG}$G={ȪU$::Z֮]+C*++l6˓O>)v풪*OPbcc>iիW%##C5".~_ ! ywg*oHCCА޽[V^-VUe۶mx.K, -{E̐d||\\. U\oJZZZ/GjhMHH3g΄:b .ǕЌHMTga۶mЌ_]4j4wF'@fF#ayW%555eɆ Du)F#ZV ?{lڴ)8D҇{DJqJs9 - MJbʕ,Y b2xp:tttDmm-CU!Jo/^V+`mk6+r4]ǀ+ڬKFx&Xvq)mixx c?MK+TtIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/list-add.png000066400000000000000000000051421260417502300244230ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs11(RtEXtSoftwarewww.inkscape.org< IDATxZk]Uޙ3wa:5PBm)P`Ę#4>~&`&D!CPhëEi˴tv1s}='ɭ﮽\?W6gc nuE`p8,w\Ub߸z6}|~o!Fl^q;nZR-;q_)忾GnYv+ִjZx ֶ_|~y>|m֔_Xrcux(V:uzcU:cime/Bv :6޻[VކVnF31DB6$pb#؋}`rߦ$n;2-[Eso gjxZKZ_su{Ǽ m&3&%xga 0\.mzid|KquN$M'D`srYV BtցL8M43| u$U-eeZM$,l-&VI .9H.N@ƀPB<8\)Ru!D X7Иi`A.eR7I "+M}ϔ^9FvmX &0 YJ"ET)umʋsp0܎m^cclX"b0`#FT2Vl?/;xꍧ]9amܤ^@=WărA}`.s 9- N9Sݡ=80kk0:/>ч_~xt߫ʶtCp8©ThOUY? q1t=/49>1x>yU~iy)lbB&n=KlZe$Ź"|9ZhPtx Sձ rg-7Vzw؊U]`^:rpwȢ#aG@ܧ@O*m"0/9^KtyU^S3c4N.D2 ;č"]ǶqTU.?#EP8d$(60%x;)c8Bxx{x_b:bңұ @F`"6` l}`-9& š 63w)s+[rss815-sDxJ" 9PUɅ)$ZQ? CBVEi Bu;V]Xއ8&TLʼnu[Iv 5t( vLJXF S0zbIyyv%Oңqɤ(HS2؏տ|V* |Bi/j*ZǢj`3ؠ]} $7Hv8t5 K@aCB5֏az" Y'{w!/fq|M KdV TxO~OR( 4_.ă# ;xOʐ8aYKTZFӔSݠj(N!.kuaN^6pyr!ԋg\ Dv e48AZ-ēU7JJ b-`^H421*i ЛeCKERj󛜚$/W \q6[_((AP'%frM'C‚jk:Ai"[G=1N`^ t\^Z%XYj moO sFa\ߥe}io,]%t3kZ[KQE;-߆)V7zksM@ZZG֯(a hi+AJ'(GOs647ϴ)I)IO5ia[x'vSǯ?{GpAmӴAbH׏ڑ>Niqu()buIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/list-remove.png000066400000000000000000000030701260417502300251660ustar00rootroot00000000000000PNG  IHDR00W pHYs7\7\ǤbKGDIDATxWoWޝ}>B 6R((19 !A:(C)RХH&4"EnP(0U E!!@daỽ&^{)'}ݙ>#E)RH"E \¦AlAa.<>{V͏1ɛ"Tol6I*gfxӨ΢1FF@̌ N;w8cPYYgoc#1w/2mm"v~hJ_zzCk?w <|X|8<|ի{J33yD}Ho m-G]VA/xS/}1iS!uv^$j0뿉:i@c f Lg'Cƶq~cpV_YFF}B;ֺ`utԲV۷CW"DA y&%ZQ@g'׭anfgtT*11a\dY8]]ޭ ;vd<TWUB !Y# MZ<;T.Tb=}ij*CkVR/_BgES@C"d Ժg 3BH $#_鿉s0}>>MoTty->?e\Ԓʃx-%kmaV.?*ҀdBu1hd$i_̽{0¹w'G8Ekȋ"~ |EP7u8I2"WR"qHVGjז(+F2`q@nhu(H0Ta T6 *@R"FwDJϟcM,?y!] ubzEȌZꫥl;ִMH, B%〄ETd̾Bۀvh>gVWEXYs/6~_ UWIhZQ͎I$6#O3@\G˂QL(:@ɯh$875 ,`*Zޢ KҐ*@A,s( J1?N4!J"n@/CUON<~]a&ˈ~DO!X }&X ۔ڏhx)RH"E)Rl$;vG+o"zTXtSoftwarex+//.NN,H/J6XS\IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/mail-message.png000066400000000000000000000016731260417502300252730ustar00rootroot00000000000000PNG  IHDR00` sBITO pHYs11(RtEXtSoftwarewww.inkscape.org<hPLTElz؁؂ؐڐݒݓޘߚܛ۞ߠ⡽tRNSDgh'rIDATx[aG+[RD5L"Z"ʔobrny~~S*4ԆOaHàI:+Oϳ mZ_es Y}fΪ}~Z5XˑgdYamJ5nHA~F+CS3 ՇmY_} =?S9WmY1W~3BpK$L۫VO x=y8ùcK= }Fl4w[ck,g0G@dDiHdHH $^AAVKv꥟ W:vx!@RؓF% PJ!tQt*T ]>U#>] H1R0 H|cc ߊ^\IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/media-eject.png000066400000000000000000000036331260417502300250740ustar00rootroot00000000000000PNG  IHDR00 1 sBITUF pHYs11(RtEXtSoftwarewww.inkscape.org<IDATxڝX\~93sKx"jf|/mKI5%1BJpit7"$ZqIhm ^ugv2s~>}Mnon=wsJ6Ft$&1X0S+y_Wzہ؂V70^?( 1ie {*Y#AbIBD1 /GxX$CG*iid4qc`rEQ+Trn*رu†,[׼hw#KtyK9+;q\Eō(`-S$aY<">`,E8<}WUg$5: wi-";F 89>1dQPŦO/][W:ntGOV 9+䨂RLN 2ѣ٣DZ]XFt4dZ %7aD. vC/֡u}SOrO'ql ƠM(xU{X j5S㎥!"8":|sJ+qWv&^m[(|*Ql8Gf`.AM'ѪY!;!=j"iNH/eGZH;zٱp<;a/r?V48^5&Rxɧm <Ĩ% XyU$0x b9QDeS,Hf~2dvUlyӟpB"Zy U@0|$A{y,C]}¬\Rϳ _q 6?'KwI Sdr-:9V>_`/6 o~%{6<%-%Z UIA }^}s݀*cx ]]n3?N7 #Wo#@0wΌȊRA{ ލTȉvT8DL]J?T5O|o,Y'fhŒbtRm6 ˪_h7v-LRJNɩhe&!"0hqC`7o?|}ywJJ aF9VV!䌔:>0  3٩_S\/RZAQŚ(08QDԯi6.ajdPS+D!jOL&MGGkذ~]<0Q(]lō^-':bB++J bI6( DiH>9AihN@Dyai|:E uϘq>+ gfr>tmt*m8g CDk c+: :$CWc#4%ȑQDDIfG(t~SiC6B-I8]ޑ]08?IuF+50s{= dHƈd@rky'9Ѱ)DdlFew8&=!#GQ*X,J^R$?mXX"G򎷿]Ej9DH’@<CIbT\Rk]?޵i9Br] π<Vd< ?|2.pwV&+7%^>mqhZKwwZ3?/ˈ$ X("πZJ2(1;\pKO8…WZҚh#|>iQ3f_%/{uջA?ˬ=FcqV[ " ","9'***59s<}}kO5f'lE-d43y$9kW:LD200y DŭM+l6V ED]ZgVVmH9q1s, | H-< @^^rYJ2dRz)߇G@sפ8qd2zQכHupRSh35K.R: @0a&̝'c+kMhRƐ1 I6{ѵ s1/~AN""5hZtIr m3X8l4Ol(^9NHbRıݎFхyCqG'$"uSppІs:Cd 3$iP126a8^7ϝ;4Q8h?ۼ=Y̚"`fI"%"Sq҆EVKi=ynbbx:mhbBcxk_\[{+Wp7^Z;0%"jI%Q1cG2xrdeS)mjE)nڜV|E- CDR+9\.V_{݊Žg ,$>ry$=ADD'^&A ,\ לp%Nc2 X;k( {[4<ݻw>s&xFJ)6N@5ߓ|>T-Xn(3Ttq6}*K* ü9p1e$`P(T˥ s[}d3OMaP.bN 6 CsEw^Ը-[mX)P*طwRCDM/LjU̖8q 3qCsBx|[Ĝ0ݻvn .  :qBiq $ XD<@G;n[b̞uktiy?u02P^(43&K٪Y"qBu E51cR-l08 @X0=v획 ]E1DyPӥk QȄ$I=F(:]ߖ$3PgG<ߣ\S؁!!(59M7lh6yb׬]Y(cqp1D 9iTgG_i8:Z(LڛxkP(a9j6uJDIONfRoKۤqz X4P ZYj˕ƘNE:1zg/b2B/6Gn3(9*wϏ&gFup'%;4&,LI@X~_mxWo*媜-L1s%WS Jfr9E r ,.Tw!$1dpK"OƂc&˔', cï7˔-IzIzH+`C}#ZjyQ7a|v 8jΆՠQ?àP32aHζ$ԮN#'gvq?w3I|7&J=J8j`Oi;O \[D@FwhH-![U@[Y) 3dL4isxjy JT*cD[{6>7|: _7^%FKF:T7rEIMIJeNE/RXSO{hҩ6=icaakn͚_lr8zd n#CXn} I< ՎC1l,A=3I@~&zRm|IцkRjKIoȧڱutc݄ :{ru95q:ƶrR=X[oRssW-{ի/s3WSIJ*ccG ۷mvغ^=ADT%;re, /6oAm .!W݅FRuȯ1: >6R}};4zT ǞkP"^@& QHuy$FՕ9Id7 Ge.;si5UL޽2 9qF>EK?IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/media-playback-pause.png000066400000000000000000000035111260417502300266760ustar00rootroot00000000000000PNG  IHDR00 1 sBITUF pHYs11(RtEXtSoftwarewww.inkscape.org<IDATxڝX[h\U]dya#P(*~M@-*V ~ URjhS#T+HBXNbqNiޜܳ:w"Rr8- =([4jXBnHphv`,4Zc8: 8X d0$>f`(ze&dlѕɖB Pc)1 o'C x:GGlUPg@A%iq*58$>w'h N[wfK/pp"ʂϦ]Nސ6l-ͻʶN2?O75b4' ў#41PE |0QH]7<:4z/Wɥ, Ž4ZŖG Ũ"p$U>qN_=FlEYsa bgi+>稢26DHbƾEftcǂx MEZvS8k-sIz[S fO5e:<]ͱ b`xX fywg'ݛ~ ܺvPm䘜$Wɖ^rXki iTC$HEh(XB%N6I:6 << , wA lc/D&M2i;9r(|@.W`oOleP .v"%NJjF(,P/qGQ+֣DQ"b* qu=[jOVP V>ӸHfR,EB9kkH`L.#qRR>mY *}&%Sk&cP77ҁXo@X+p%N-FB, &%$:yu@x^&Z=ƽ?+E HWgHޯiN;qB9pN9~;?-dKDU;]1(@ǘ8);˓z6vD)DcB~( (IC --ߟ94>ԕW::Լt.dbg~| iZWL kcT7ˀ3JM­XYClhdEC1N҄R8~@Hi?k\7]j/D,|@%v`٠S$e{@uwI[*X@x } 󺧞F*6m,-Tb㑠*w#(iWT*– jHC_cEhкt E|tT/@4`%ja+ƟO )  [jhcћ1ceLb9GkXBn' kJIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/media-playback-start.png000066400000000000000000000036141260417502300267220ustar00rootroot00000000000000PNG  IHDR00 1 sBITUF pHYs11(RtEXtSoftwarewww.inkscape.org< IDATxڝX[h\U]w^LXM&BV)h"jPh|"TTAƟjVG(>PTTԊbIf&ɽulν,t9{9s'X=یYՀqbcżO*U6fGNHܭfoyC At x% xOΜmB-0 I$ L|OEمNQybG3ºQ!(CަE"}{%th4iQA &MTɻdP=K[+uh8AA@+^C*xMԹrFB< *!*RE;>a.0pϖO(x|$ٰ43ti-IfL؄Pe/00Z*fNJrX}:q=_:$FOa {+&5ώ'HR>Eg-zXi L¦0 JT7HZQW=C3J֞@""M8HD4c }nRyJg<m q X)I_sZT8N₭3A:\`0I$Y!eQh&ydR4h D}a Ub-Zp'@Oxnn(a"Y٣J+a#59p$\)Hh!(F)ڍx3O/X oT.ݾ8k*iMo鍚P/FSOf +|`M&!"e _Wr|kJ2Kl/t29[BD42zF 7G'1_dd{9zG}j$+m؂X4}c`wmG-%9&Qv p-ob0b Ȥ*;*0tLEfD]hMVaa)p/ǘ:l ]wQ=rROm`OwpWd)>IV3Ϻ.~k[0#A.'c {0V0E6c@Evu=lJЇs衇_?ÚVi9&r^2-R7z|Qw|v^@jק2s DT0z9O/ Í'+t$$,C8ɧ>/MvP'B9.vqRp.e8h=?C&!&id@(R0&D4b-/v5 ^Ľ~iS3O /)J-/}^q $|T^%8 nȡeYoD2d) i9^R8^,/gz*aIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/media-playback-stop.png000066400000000000000000000035431260417502300265530ustar00rootroot00000000000000PNG  IHDR00 1 sBITUF pHYs11(RtEXtSoftwarewww.inkscape.org<IDATxڝX[hEw7{Kd( >M@_T ZJ RT$>_ZTXтTJ mf9~936:Ovg朙9'KelD] tf>_^ q?FPlx?9s(FQ3hƓ] |*;0~ Ms=")0dbw? 0D%behdqibV@()$f=L/ \PeQ_NҗT(՝I?_v=&Rhq*(=6NO˔9I_Q_XسoU-M48aG}#Q"-,~2 OEϤfM촎+F%[JjŖ] l]ZwD; FO.  >f29lziKTĐՅi0_ (~gp+Η;Pϵ2bOK:.CAc|*t^O/SVDo,69 bc^t'[Wnwt͸ӧ&A9]VTO؄Ңwރ6oMUb/(aj{Zd8QC%\#չ< HD݊Dȕ 8bI g1i832fO>װ oRc0E ZETTާԂN[, yOe)M?$>pɣ%.2"as ys[]%[-\O'Z;Jd[R^"UFtۚs4Fq-hz#װ͙GAy7(JREmvOWӘUr!XA/u]!v0/u5v%Eu-\m2hȪV$O4U v=>2¯bc9s:qB?ge<]K3O5j|t,Ɍ5iBc+lQ\_ɴ}mb%kC҃ НtI΅Oy1u*M!)`3iig / jE\|0r _=%$$[l:LY|8t[6zTX #fi*/Ge,ʧpc欒upmD"9~|4)и9_vBYErbV6CGɽL=A)ZAЭ+RWKfFTl쁞?l G5Բw~W*`jE<+% P遻oN5IڞqWL5GM7q)8I}xL6hːLtg /^M?c^BEܪpޝĻd( 7-DMwG}XP vjb 6:4e&fTQBzÈ}~cM~L;o]h$M|p+4}?Н^@ԤaŘF\?vz9x$J %+- ^CC|Ś,W^Lbe@V~kq n喐1"8ɭ \%"MLZC }phR#!XE<~݉| ^v.UCUMF h!|p^%D IT\,XH&/C]ːn:'cP2is5Fr]6IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/media-playlist-repeat.png000066400000000000000000000033171260417502300271200ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYs B(xtIME "VXOIDAThYoU@<^ATQQgƎ&7 mQQرǎ؉gsξ6B"8 Q+qZlW:f|s[[[Zii鳲&W|E$K> (X* EhRk&ja I ND@5:[mͩ%?أj,-If PT|<:>B{ί봾Jk+y1MߣY/=(beXlvwi^]]*(`1;40؇(T7hF_Y]\M~> 77 0-6tP3*Vt4ijZ\Jpyޤ1j5[y1-N!03!\u8BœHyFqa)ϏI`XX55G. mYHO&VFf莄E kKBKtȳ8MqV;{SC0z7HH 4=;! @+F @%irzW3(@& 1?G3s4>9>ON_ l`k M͌xLTV(6}h,} ?m:|f2[*U凙gЖ ^_[5qm<Lˆl÷i>f s`=0LQFo!dUre-TM:\a:=c2Ɔ7a&3T& FҽΎF 7N~׹I׮f$7BpmB<݂QR2SY*T6?9ud4gh:Lڲu9ryZZ,UMnEW;mgfU5t_pieQ@mn\>`N,uUo$[SSsY7&}˝P$T%+*MGL ELSՙxW ;ܤeGƇoC>yɻ`{XTU2#?|#Ӕո_'+Q\]qfE:b2^LoԿŢZۚJ΍^ۿ::G+/Qে((p ϳS/b+q yb9~IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/media-playlist-shuffle.png000066400000000000000000000042421260417502300272720ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYs B(xtIME0O"IDAThYiLk[~&1q1&?8!)1q/?41KNtַZk}K/ݍq7u [M@vQQ,QL&ӻnY&ͥ3H)$nW1XR}PROOV0uS|,G/pt=8{s:\lm`cs^ZtBNg= ȇյn%xT1ߎd2O[67puc7ͭuNx&ܞQM{&.oVPhN~naD#EHy}`{5D2HyP蜝K 0 Įa~ /K8yE9I(V{"\<&'Zՠ|Z\:("xHWW"߫=qGavn ^8<:ϽHćAu<(rm u I,O*d0>DUTSL0)uS 4rb5|f`aqOޮBИ^Go'%4׿sJP W6:6̓{v~bVGkO0~>sNXi-G GX ~]es&WCicx>=;cXÍH{!pPDE21Q/~򎆩6z0-4Qor\C!S|(io~[`;ݣU4?|ӻ"J&'`zfGafn"XG%' ljV!C)l&a'/D-fd$%C/4,u:,DƆ`dtf@ BkWޒ0鮮$8@uQRe$V%#k?y?}J0vtx"c]и_VXrvjQᴹtD?8P#c -F'#A;qCc[R,)#7ya>*d 䅡A"#vGI#ژޤ~+457գ5*NǢ,~jO*oheWdO, Cv۹@!/4MecJ,+0p$a?TZ;tIϴM-!q?A-ui>O54g[VE4/#/m-DI&xC+ Q}8ߙE^?W`̎psK:q%(oΣk \?+}NNs^(h>EoH3V5 uN:[`=zGEȾ+p8~.h^zC}c-z1Z[InUuE=?';Va0ޓCnR<8; 'Zϗ<^dWRÖ*sQF *kb%J,|iIfϰ '6+9.%GII}R:$o(2v$U]g6j[keKz͗a-hZ7>Ͽ**BYl.GGs[=29HR4a[WXkyDb+>w[>pM:ځOJzK!* (I z+H/|ލ-B^ IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/media-skip-backward.png000066400000000000000000000036761260417502300265330ustar00rootroot00000000000000PNG  IHDR00 1 sBITUF pHYs11(RtEXtSoftwarewww.inkscape.org<=IDATxڝXkh\]gf2鈴L(>QBAk񇊏D(>[QVB5j$3|.{ɐis{b'3sηszmg[m(3{0-g}Bg7v܈Q 6zx;!t(h0D=}Eccx*i;PA!b$!z"DB*$P)> DY<:`A!(DY WfxbZ"nTsPpe/8Y kP;lܲ]g?W ,}Kw4)sߒ>/_xxzqP帇 >@L&e4ćztz{ԠFëqؓ|İ!'RݟcY4Uxd@H G9KmC]Me0l9!`>F7c3A! x œPAYFy\-aC!8ğH_F`d[O9l oRֆ)!n^qbdeV4 2nbU[ۧxICҲpxV2m0_D5ȸ[[H29X n9e~oBʧ֕В!@ S0{shCT/w+_g5L*I8$%ûW䃭h@ Q-kSn_G-dC7J :?H*4Pzf B؇Q0G&36Kj~T cO|-SgAW0:(lP;] Kl@Ŕ c $Ҳ4ooEP1y |f\B$L)b `mKΗ Y,.=BEas&l\ŕAV~] o/kso3 nQy ymg|ī[ VV 8v}_%=W _7(X2DL_=!2uNP h2iss.g;یPqZIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/media-skip-forward.png000066400000000000000000000037041260417502300264110ustar00rootroot00000000000000PNG  IHDR00 1 sBITUF pHYs11(RtEXtSoftwarewww.inkscape.org<CIDATxڝX[lE=3MB,x  B #0OEȊVޏgOx7" Rc!g3pƓxuTws=S7k1:09{3h}% 5q;FP4fq_4^>~Q2cCِ8t>DĶlϘQ/hG=A X7D? W^ D ًPG=%(DY|m_QaGhAsp>.Bz˦X g%{?{̤ɇ{} y)hQf?%}Qzݱߋa= H >c)};_(ذy94&\JU.c$AH@"O1C7J*F?A#\,=IIX"ÿyWICO <1`(>&JDKII ndl̨BEf(Ǟ d_r" moQ E'E` 6/:\)q Um(B!Ωs#0ipj6h, 5]2[̩b)▆e`<9ER H&Ehh>I܈аRr"y^<-^LS4QW`5~\;\A#E7i xYЭ26YFn(.dmסcCt\*`~!9]`FnWW5ҋ'Nh&E'r]r,~Z7#[ ~>* ^N%8xϡtk5J~PXCڦNRuSX%sуkh *L6!`f'šܓ@K V$ |aUX8͸JZJCP"@%0qEt0,zQ 3n5"9R kYgx.rH~PY#&,^en$X費ͭ! ~G%ՈhT)7*Ҹ?Jwq/||=e̜8]$9M@: |;jE'0[k 9PdZD,r j'{ gb-Kc4)֤ $q:$MaΒ8J͸PgюCPбxI){5+jB kдfYB9e%2:Pe?w\lOk,@}u3 M!,jkLu͓8 T~N!*_F3=ч؎U|aeMfWw} n mmХ$ƨ;F+0(Uɻ ~Lkm]̙ݢ\ֈ\Vu&& L:" ,@E5K%W!\MB2ijA'|V]2m+r͌{:Z:E Ml4UN ]OYKG`˵D&=VlC MxKgcEyYOl;U-n\nt&V6_ch/wc-{nDQ@'-;^=NVKewzupR'l9tݧ #4$$­A@Dz7!||:#$. .gg_{xOv8u@IT(1DWBA=HT3X!ʏ7n$mA^ ɩ ^%W ޘ)&W _%9W _xeڒ7m2d I9^By:gO}%_$9IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/multimedia-player-ipod-U2-color.png000066400000000000000000000046361260417502300307060ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYs(JtIME0ٽP IDAThŚ]l3_^1^cS 4vDI qZHJmPK*/HH҇j&*k4@ Y0c?gvfv^ǑF=Ϝ{ |H3Z]]; !J>m߷ͶmH={hNc:?%g>!<۶ms^3۶sq2/޲@˲&x<9]!(·(syQUC16:Z8|(aUUI녃{OWFb]M 4M+ {0 3c7zj,,ھO4 Ni/Lv];t`ρ ɘNլA.opNA\MK.ҢOlZhi 4H$bV~dd4f{e-f:*q=y1q4*%<$.68W>7)AFܝipФ MBH,$-&PQoI`Ek;¡dYYZg,WGw;֨ʊJ '\Svi8WLtӞD%@idcϛ~{)ȝr/8x{1-+"35 V`Q Ŀ~@0|1tb1"~==)ilC,Ɠ0f*eY)YzN> V&x7Jܮt#@ L zzpYqy=Z9p\nD0I3aMWPH\@}vUԾkx<!u׿wߕ7,kXAee%DD"#b~.ml.|46AKJܹ3B8r97of[o3'VI6%I4Mt]/ \li}P*W^!ކEҸ\n|>a wױǺmq+Ʉ;@+Z9T hkkcǎ>|1_.\7~ ߾## !2˞zjŁwO˗׶u:iRIL3#Ν;w!L:T@Qw]]eq5V^ͮ]刺ϸz*',`:#vr%e˗%Jh4J4EUUdYCCCm۲鴖/tU)bma ت^Fk+^o.8`Z(1KfI!( $I9OjիWQw zeY\B.](+[n21S2N?V9qD]0|;aܹS(2[xEQđ#GD"B!u]L'mKbllDܾ_}5ϦMߡp88^72 -_ds4h#?M~z޽{+x``& E(x߶m"J68#ۦd,M,ڲe믿\^^$IYA$s=gv{:"=y?&GRIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/multimedia-player-ipod-U2-monochrome.png000066400000000000000000000045631260417502300317350ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYs(JtIMEIDAThŚL[?]cJ &4,Yڭ%6cKiiTm?S"u[#EViRImɺVʦR:)JiMZH,H2">c?wN9szgXBZ~"I[N7xzQJeuβ,s@Ƨ,mOI @:ZLZ 3l`)ōy<n>'Z W;61Y4Hk^Zekw\(pklY^^B=x0So ~]ТKΏGH]yuCJuoX{ߒ5L~?u9_(W3 0M{ztW:^^3-o A O{eo#z7oPt(l ۷^]4a6 1Ms]HtZV L*GPZ'|B۰av!D84b>C:ljI>|bXf[}/80_ VJiBwnݺӃaYi4r,P<Y=Z`@YzP@ @EEcs \YWXs(~X )%9} d'jjj8w6T*L`u5ׯ0h&J@ p{6B\pSNݽ GHx<><57/)Dg.&ϼ}^z o{O%NDk[ڛotR+(++#Dҁl b Ծ:[~=ܺ5l =_{%YQӴmhV0MD"7׮R}=\)_xok .x|"nd2豾uvv^,˗L&oR)?p t:Ϭ[޽{裏4fŋuڀM2"99ICu{ <Bpg Šy@rʦMv4bQL3.Fуdz!H)A>aN 2J$PrN_O5@R:  1 ]ؘiYn5erLBV: La``0`q% n)u\i tww3S Tx n)BpTYhq=gxx!6Rjjjp\37EJ)l3u drrꕼ~駟>>}6k߾}JBH$RJ_PDB݉,R/ ~WWV0vttƶq=`ydBflIz먫v}^khp8,xJJȵ,K$?wEnoq7j4p8j|?+sy͑#GضTUr3]*"OK)BЏ@m-d*&Ç|Iyq:7s|N磻v]Lw >;lsb6[;_~%%%OiV7 ܿ\l{猹uj</$8#N^jSU":nۮ!p@Hsy8`<}4{L7|$@>_d`|1 c.'\ya%ML4< y^Zt}5.)tj]ȸ w*J@8>\P0#2i FF=KIj: BTF,WuS\W?pPjx;Jv'4mbfuϫ]3"F; ݀RpUj'MRWy~&W\"H)}YJѩy !NFbDZs-i~ U"|_L-cuI_'ry6J #m!8MG58LQ.Q5$zbkpT98@u{1 >{Ы^}NOE*ONgiTj44$61`0Bww |v;f氚yD j$<|#T4[C\9PhXiq<~xkx= !@`7͆a >D| eH%Wudd16~qnU@sR& @T~,NqĄ'c L-8êV!|w+//Wܻwo/FoP'#(4 l0onC7,B= mlNR\.vx`}-Ug+Oi_Ly= @Tddd ==^jaWQ ˫ Rs\86 @__:::Bb{L죝+nVF+5#< 7fDw((Ѣ]<:::UשUX8r$߈ÆBo/ }OA)M=pnVkH6J m9?ahȄG8FGDD <<ܥ?n rB ZsαcT}&X s͹7pjRΥBrq=E! z{Y;WzHQjE-j\Z=fת`6E咬N477=3^a,Ѻ:x&QeHѪ+܎n:#*466ZIGts&z<3JpIv3B wpUi𢐁hkkX\v9fKϳvq"oP~x<]<&^~OԀ 'TSw`.* 7 T,8wiFV(%8p]qו-'p5 ΪiJԚ{a  Nג:o \npI~O>ƓNn555sS B9݃^0ۭ_ă$oP酡jh2bV5U`;'}Qmmc)- w#lyd^=Rșޡi&f ""6 #[`9ڽRQx+(τ=Wb1΁ڻp{aw004_9yzܽ1 ۥ@5u``5sIjEk |ZYL>2Ju7+uܯ 5 =qg|Xĭ6% ;B38t&lʜ%3/@rzX0yNC{p!'oB}TU#M"S#zYÎ#Ocq( ]mEvTÝV_nZ~H;q?R|"QKh9i[P|;Q~N"w^^M"<0E!ulÐk (/*rc %yBш> =,8].G~fR`{qlqZ}gL~x mb{Mj"P  8))!@  //Ez 6t S`ZQSWOj8,N##z=f9Swޑ2Fr^9¬uNQ{@is r9~t- ͕(`H{f_%g (;ndbv8??_LVAAywֈ/%x$)E:\hSΊ!/J28m8}d2(>O9""(bc[qN@r9E1PKK o @ܹs㩘?(A𘵳nik*Nr%~E͑y璜1̹64õi0fh; O.fVCوx)ʝkU`V=Z6R#?R:%E%}oQjԇF 'N-c`ׂ[Ja!vg ЗSt|37w3+(z~R d0 `0_ꢝ(!7q+@w5%2jB ]5#'Ft%ޞI6FfyP{xj/AI.J*>0sq/@_hZy,bw3FS8>9 J5y_H`/M>UҏH?%闤ק^Wi4znĭ[6!fE4H~8CN933sR$gm$@J{ ? AW, _iIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/multimedia-player-ipod-mini-green.png000066400000000000000000000046611260417502300313340ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYs(JtIME >5b 1IDATh͚yLQujNZMMڴ?V,@$$˱ mTBlXՆX4! @1Vܷ `9=/cs&#}_~>Ä=%}ONQɩkVék9.JN]< op_.z/A+5Pzgb5dlb Wp7 @5xz>ڏ!8r*ǁHhEA%@.xhAV.<7'DŠXj;7H3+ nY|.Rԣݐd ;MW #/ ( U?P ;䞜Ź\)vm Ccd;p&Fb0>J8mO!WT'Xآ"e !1x%Aq]C#/) U]p" y14;hdtyah< sb,^0<qP1_IPkF`N=!Ux uP!gQX&PgᚚR[A;6?@KpdYqG ž@8n˶c =¸Ӌ=}Z _I9 (P<-p);.>8׋-'Q}1*1PT >j_cgY: E5@~6 Sm So{fk@m{ nU4w@vӊ ~߻@G ݳDqUKc@mq4z)}-@VfHЬRzZ F#  0l2kbZ sBz?)#MMzj 8>l2ahgOۡ||^ q)Ә^x:4q$ @^F[Qgʌlv1={Qarrrs, \l Lzcvv;nFGG5l3PׅדEt W)>$ WG\kBP 'S` Dp P)AC o#q4K'ٓ}gթ=m4 '@yykmX,hnmCޟ8 x<,&p. vjUW@A >|xaZ&9}ِW;SR49O9oB"巶LL / weL>hnni\.'@*=eɊ0233ؘr.mDz\SYѠX.E?oX(g;V<O` xxx222~~ XN۫ c '3{M)Jjta.G?b:G޲Jl4]Ƌ/Bzz:SJېS[L%No}h(NIl^0B*f>hƁ Gz cP?Gꗾd@݈Z)lLqLw¾Y懨WQ? k߿uNX,Egm(7Jc/7}y1H/@׬ ZӺdQIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/multimedia-player-ipod-mini-pink.png000066400000000000000000000044641260417502300311760ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYs(JtIME dIDATh͙kL[ǭdZMڦNMUӪm4U66iM6mMۤ75IEK%e!!\C00bc1`06S @}9},ʗɞ(k;6`CY?vI w*MG4WVTwzY\Y*wu|g'/#PIjj>~][KBPoS,/Lx&brVU!?Ξ@;d(( Gy9]M}+B&YKȘC}gHʣޠIimS"Qu~AC)͒Rm[эQFi \ ɾӧ%ˣ_m3A0ޤCsNms;t7d)i= 4 yQ^U.f] ޕ ùCW7$oظk]-TY?@:4"!;[:c65e]$3 JAx ܞE2gDFH0C4 $WM5 --`Յ+kO_hn% F\HBoE\ o9mWNj>T )v#C8놇(21AaB81{o pE, Cd!MLN8 [XͶ $ޓ'% ÇWJ|+<4;K0 PXN+<ji!D^职 =qB pn7ϊ= @ l0$50 <-..&}&bn/@](\.cy1^s` Y^N&| Q:th ]e{b(wPs 9#)fnDT|y<Ya4_Љ}& hATWW!$k gXoG9Abc {N^Az[Yx`OhjuXTz?̄Wpx /--ׯS9Esϑ%BU ̌5PF9 asxi@(* _tO]B= ~kUt`;w22~1\VϡêE-{R "yeq`imj"=qp I's2LMSy1Fb*ٳm5v& Ǝ5駗< gW!,(~$lHꥩs=Rz6ef7sؠ]/V[ #6 Fq;V]!dQݵ,AW>/\OWO|ƍ]Ћ`6j+ nO FSR]c#G4Wdƿz1 Y@6le814hy@VgOldCv,LM r1?5u8_.7#r(+G.ſW}(O,8> hkkoeУ/}oǡA]߻w****\r@G6,ΙT1C@XGcVTTvƽɾk3.莭~]FvLYIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/multimedia-player-ipod-mini-silver.png000066400000000000000000000044011260417502300315300ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYs(JtIME(IDAThYOGQUM*MMڴUۤI}@(%@n4)SӎnkSmj@nLHpф҂/0 `  =ϋ @>ys=8Y~gި!̧*_O5'3V:μQ%*y4>$23`j[:9]V3WE V#hgA$郛uo;[m-0P &#7βsqUIBN~5 ' Uo׷HEYK^y âA=Ő,>pV`Bm hG] bCBU Ji6w ZGE@.wH$6(x#$$D=DR!T nMybZ8wgkWϳz`^M3C;Ʈv ݎv u !\wHBB<<QByyo V0cOpd>,l۹x:=n'@{`(l76;zv?x"Xxx]!Ȯcn4 -[L&< mG ; dXB~'79s-$ xfX<&p= DqX[[+L(܊Yj9666 siv PI6ab$ꅙi% ~ulȏ" tRlKyF=4`Z! vVJh`2䌤k(J7,N:cou###Z>11һ"@ Њ d|(*T~z$wxя >\.D">rPcf ix ݆jaz+h&&û!: IFT\e$+09ltC#1F;:"ϥnf0#hQ]% LNN$ihښ}=;@QG2H:4K y .FV/cU/}<>2 o3O'1-LT1-&0>'ZR5.#X2y .'"FrTD7fffZՅ*WN'O8DVLT0!̕O-"U6=Gu9P.>L$7io"xď?AǏEoo FJ)eS LWQ.;A1 ķsdxP(<544@cCocb^=vIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/multimedia-player-ipod-nano-black.png000066400000000000000000000035151260417502300313040ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYsodtIME@IIDATh՚{LSwyH,FeF&5*S.fYB#Y1d061< m`yG,g-b&K>{w[pr!??EV89x{{{o޼ ܹsgo߶ɭ[7n???=/:4u]44vB[lR> P&###ÿF'?rraݰfd_hbhu UD;619@GK. 9  BCshb^hǡg.⎀j(9QLCb:% hBaqw(%@ր,Aw[*B~A (Ơ^E֭B -HYnB #V1;A斀a=*wFuPk&@(&!UpL@b+*5 q΁ DgQYr*)Itt4xzzªUHqyi /[.] =zty ؾ}u)s)m˒Ņ._ tȑ#:N(rSs`߾}w^VٳpㄏDFF2r>W斀Ǐ[J8l޼m 䎀(+7mļƶ?WWWnr cǎMvZfBs'N`In1~DDD'O !!a:tӜ)vΧ`pUJ3S Yv:++9uf߿q;w7wh(++3?8S@xxJ??? x<\Duu5[f !((hAS3RQQQ頦^|  sWk׮Zݻߟ#S:Vb H$+(..fP`~: Z()7h-#dCQQׯgΜ)l1„m bǎKIId}ZM@mmrrrXdgg3N>m%OVO%‰otiaxX Ѣm$4鐑8y򤕀^`>|׏b1 )"_^^PUUT*6III 835#t044SSS0:: J&&&2Hh1'4 (P* hmmehooTHLLdEҖ؞JGK#i4渎hii1544ԡS 5jL&twwL&crJ{333(5󺭡jA*666BssLjWAo9,XzǦ&c.񳑦H?Sk4#FD" me9v3W aǖQٜП q?C*|dzРA">Sn|?@}u… 62O|0 Vzjijnnc<2x1iť!=܌.ZF?BbVw y@&8-x!>?% D- i&hIIMՆ MMiiiYY/yKyyyq` zy-G 84_qVgݼ]i>(?>kIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/multimedia-player-ipod-nano-green.png000066400000000000000000000053551260417502300313340ustar00rootroot00000000000000PNG  IHDR00% vpAg00WbKGDC pHYsHHFk> xIDATx\kPWnkֶ+n:Ngcκcޜuzڥ{q]Gj4WD;"r HH~MPuF{><=9 L3Q룾ᙍ>>ko3>~ohhIoo(6Dž55{}|?xd.V05 XƇӵk/Ӧf]P̞}5O Ə?&j77oڸipaаcիj11KEFFEXAtȉ_ =j{~ر"IJZ(**!aJ; lO {r8/8߳X,ǥKD6[ssz:QQV{QllR7߸3g"#n0ׇ?wDb $@XXDĒ%D55D 2)@:|=GGLVkb"^oUVl'Ol@ p[4 $bpE(7m*^Kr[o%'GFN K)( %̔Hv":u9X;>qB,G,L&EE͡CDc򜓓f QnnaDiiYYHp_te())9i" $pVDT_owv,ppgAbqr?=xs,XP׀xXX'N|BT",3g`=NX\Luu7[`AقtLlĻv9Am[bBqzJETRRVVRjj!^/eg=ccRRrRRJj56p:6bfTUU__Xxg,:Դ[yS*a9|i ./71ңcbxH0C<@P;/hq\PV; PWg77 `ad$A{dAz\z Pݻ##-#JL<{v#/>}Νh/9Zz5 RS33I9s`G vط3S>pŋ13q&Gl2!w˂A$vjT=AAD:o++?L #`Zr jo'mlN&lr].>.WOOK nvt_XZ[} Кp' JJk٤;tװXq&,GkkNέ-#hv R*PՔBNs EUբEA`!}Q]pE.7~m)x{>juu/f+ ,8p#F4VD TUUO NssG`hCnH;3 a P\l6曻@TKf3;u}?XuuUTl!R)?Jװ j sC@F̙#GK!BE+@uwNt޸Ғjji#Í Q;_{!z{!8V%%M1`Ȟ?7 v8f8Ƣ˺zQ'N'o 6h8$D$ U kEպ};, 8aY1Wd RiYٗ_ pA_@\& #=m痖J˓Jq)W $}^Qd39Vsϕ3-#>0@6a4aVVDK/pTVU3.<\x8SYԏ~,2YERL'V(uu}IDnhk@Ht|X({ w2>@*?⸙pN^:nܯ0#@^F[ Vn7j vDVl+-akerٜ3fh#ϥ BC#"&M\!&|F;pX 4Y:ե 7W>UuWDOfbȐ[[fH(*#K@Xؾ}O1Tӧ_Ywp#[ \EvFl<nj>qCFdW7fEd nd̨&LϠL7N7NԤG r_o))$AE{]n=&>򷈿݉#w9>Gnwm?(*a=Ftu[.ҏ 7 xA8 *jj]Ba ؁3aO>ȵ,JvSot?6xnDA3gΌCCV̝>2xfXg-Yc,]@[ޢK_Agଈ[lNgv17}gy(nja@1meJrqFte!С,?4\5ܓWA!-@p RCyIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/multimedia-player-ipod-nano-white.png000066400000000000000000000032551260417502300313510ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYsodtIME7yI-IDAThKLceqD.L&qat9&&4tƭ:;6n48q0jƘH*0(h˥^r)-dh$~?w|.MMglssst9MaT/nJ[d0 u`fifffHўY܇ c:vvvhkk,VBD [E|PK$J H$B+JB[U%)azzh4xCH5ar[(Ho0Ք7[Fk~%R<6Ues8L #}Vi'gS)u|NcMEN 쉝yG}a"M,ikJcQ;Y\tS8x^:P(LY2\BHF]^? BzV,UnV@ OLNS$@ t@>>~UuuuQKK 577Pkk+ `5WSbQ@sR/@.;Uk@|?鴨@@Sv o[RUd2r\N~^/|>Z]] >2#dyBBkkkFCWFɆ&܇R9aS $ePH$>NFH!\S_l6+8e P%_aXll!w8v.E@qoV=R?2%=(*t:37HX BpO5Q^M&#{<+&7܏dyLprChD{yDg}ykO޹shppV"q_=DHz%8JA d2eBC9DQ[T@~a5y5$kZen09VZfSArȸ1xnɉWPmRFrC%,_Vd9vɷ)(gdo,Tq+H<Ws0#zг>!yO Q("m6ʆprsط8\?IKxt<SSS!Y|.hh4-%6a;BSKXWYoaz?=ɇ$̓1|7bHO5 je7YoWy&cac"{:n^ޤvu<2// RIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/multimedia-player-ipod-shuffle.png000066400000000000000000000023711260417502300307320ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYs B(xtIMEyIDAThYN#Wl(,ED"E"glXl+4 m 6~`pRµC6<+A+<)0 lQ[} +Oe vvv<<JpӅZYYU>3![gٹz87zT@477G_"s^6o[b("MOǑ vJB^a\.Ԁe2y~oow^׵y`555E%tjI.,9}eԿ4H:Ɩr3^~ppO|˓C>W>|ух@D0Dx...3Yy  4LDߚ=ia֓TvQ J?jG/@bÏ>j#SXL3Kb^x4[%q &1d2 8>D"!d96I}L4QBPE;+#D/@Xz=,;qI"4t%I!+'JQHC[܅~i8wYR_hcBr9J&B*hY3"1_-w?rǚcU.ڲ)h'w'?v#>C+IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/multimedia-player-ipod-standard-color.png000066400000000000000000000034621260417502300322140ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYs(JtIMEGލIDAThZKoU"$ja$$  @T&j&FM 4qn؎clj4~;~?cLJzqh8v\dw==9Liu:]\n'xZF1W*\.`d2yZMp8\-~$)aVimmmETWT;H6766( m`]%>fU9>L|+lF T(G]?hs> kH$>rQ^r\K_OƎɖקtK).4L3>Vy4c7`@$G'>;9Xh Z^᪋I43V}aw/jskKL&T4= S2\N{@ ՠ g,*(#:>$HH`[]fq 9vV?V,LH x<.$d0+++BKKKy///⢸AncxOvn+@:NގPB;F{n+踙sкf A6HFN@^8o :((p\_Y]!0:: }j C Dz,Kr$hyEa`9.K/#ù`N)fÉFdQ*fgofgA1ojeA>Ȱ٬ȓcS~=mCfӬgX,&7k p ǃA?W/WdfQvt]r,T6( rK(J愾n4N:G#lpe4 G!O J,cGOrrKd^6UBuY{JvMJz˗NDrVՆ 9 021+prtȑo߾}u)Fag|kξ'O3T=[9\_/3'OTIENDB`multimedia-player-ipod-standard-monochrome.png000066400000000000000000000033641260417502300331660ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48PNG  IHDR00WsRGBbKGD pHYs(JtIME|tIDAThXKoU "$DJUa+$6`T*TAШFmJ"1R^vvN8'~+v񝛌ǓI8v\h<3w{^7ij:ưX, f3~qփoZsbvww or޵Z F墺Y%I*bZ (( =5`GCPh띩)P {M=bc-PzHN8|>_?LO1S"U(z.ܞK=xj"r\LY5"<ݼ{<c9pU32tbxfZNRP5V8m| @r iCpzefU!ck]!_(7;? ) ܛPvR6H&g}P WOJhL_7zXb ˓Vǟ,K0S@CU2 ELFi2$$$|DSDઇ;~kq7R "x®Jl|IZ,HI*t:m nnn2mllx` 쨄O&rQOO p,aetvvV~ܩ ?N?N!ɪŪidvx >-D82S) fffhqqqTFFF8Nbjoo(yI rrEBSunpUwY@FZZZD" Nrdn(GXXX@Y]\PGe|l6kf 46r 8VhӀzFWqɌOMM q+x:EiA87Y[[.QĦ6QU*Ќ@Z P9wҢ 5w\IMn|!3>Q\z /3}gwAJa8 6BKS"i!RhvxMT6qqXaeMB3F9va؈@7VB$?sđ.3ťI{ DA@N3&Cv1"ɲf9;'&&社VMs{CjA"BAA!6??/ %v?Qjs"_0٫n8Hs-awiG1r@9У})wUHJHPr v2I*灗/+>sallh:[h=݂+Ɓ+P(fQ*9nޮ\rM V*n)mFPy/4Nof1;dLiYH|B:I:r`uuQlިcssZM~,?8= xteÇtBQ'|.ӷZ>T@YZOy!4>t 6P$)t-͍X{8 M{,fLjAmU+-ZZQKW/{8y^ll WZ_ A,&EP[4s3zOJ+ l%c"e2pS{ljdm>r[&FGZjde%M*CMUӻwiF#h aol ?)#"DRjˇH k5"[덆&& bHѯP "qرfgg\.ciiiJ"lBX'A<"%6IKpSLOO_}SSS|?ba|TF%ZI}ʞ:u S[q6_>݈x4L]ȈNbTLvh*/_ھp\PJ'SoߖPĠ~QƕKJxph@ &7xR:3??/_W\Hq=ٳ}H:hHR9(e-a#6!+,..~A%6V-/,,|׷>mhAL#d&iigM*ʓw>]y}cc~8Wz),9<~b볂+++xU3KlO)AsL C%?+ Ѝ7ue2?Μ9zիW9&LӿNn޼)1ah7IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/phone-google-nexus-one.png000066400000000000000000000125271260417502300272310ustar00rootroot00000000000000PNG  IHDR00W EiCCPICC profilehޝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧ0 pHYs  tIME3c IDATh޽}\u}3].޵1Ɛ@\@K+@ EmBHh5j2 iP6BU$$U&m*RJ'5 V(-̧K\cLcY}sǽ3nR4{fwt99.lyם<}  sϽ`2q\p1Nr*NN`"ƀZ̰,ؚe붸n`חx|ƞ{'=QÍ^$&މ""U6'cI$&\7o|;q۽ |W{p&6nag!$e:}co)ByϽ^i,Jo0ɋ.|۶1];c?y9`b fg$[yNTH4MIᡵq lܰ.d@^9ʻǏ~/G]Wwc'^?F!"gZD_qߺJٺ'~wC]̀za~VhIVgb$"d߳Qɲ#]Pz7?7TjO/fƈti/o2{TF#,:j"q,C(j`b[ C?Y0A-YY%y$!(X;xd&{Ii| >HDcRHEYy _ I8缈;|"%E`J:IIQpޙsD9'"I"vAgVֹGDpα:Duj<Ҕm: D[J9 p u1SApN4)~731,j-K! '(0؛b `D2Yn˺ud2Zv1DEDAD"$'E&T|A6[V3fH`ab" NXH&Rɲ/(í5C |ڎOacsKٽy ` Y2yE)Rq 4F !aIUbt$ob_Cj~ p{N8LAcE:k~py TyضVbjM做*y r*@JnkP7⪿xӋ M{8:q~f m.c Bqъı|e,`t#|}qj US aēCXoFoLe u91cG85Ye` e'}lh~.F ,c66v#o~Bp4vul\ڡQ3`5 Ѩ/Xhk\'O};^ϣ֖+Kk:1W.MY>LK2C0.}K/k5xxCM7jT ȇ`ptrve`UDlfxmO M\D05{-*xh( sˊ9lV FC,# D3xjrٔ>GP9rq#%>-M\^445BH!:LϦ)BIix\($s~ь 3 1Zn+`EV\BlZQ>EDv-7RbiӹXl1R)~gss(溟ӳ$hhpSUb{#'hQ;+-\ij̈eQ#ijh*QHSpDNeYOl-g*Zz>N#6eSrKMɖmͨ*"BnVd<S>DĩJ-esėP+zGljudK*V83ӳ=%IbW, j"x5Wdq2@*'伊!8Wv٨wNchG-,NXZbň [Jb}}sXYVazB1+f⾾^iV>^;2z'֯{)se 3ӎZ'H*)VNZ岭qy[ïiu@6kc4Q9w_>-ɛ6|V]@wNUr{=5,dT=&V*{?Ξdb_`:WCw\YI\ړeYXXh TY_P︓]tÏC??X*㾕NIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/phone-htc-g1-white.png000066400000000000000000000042621260417502300262340ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org</IDATh͚]l;/6$P%(E|_jT UE[Q>HE*Bj'J}*"i--G $$! ulzwg>xvfvs=c1۞3"1 'c3s8䨵l}G-Y =W|d˗nfs -," "HSt\V5Jc~v׬_đ#G8{l0q9ݼy6ml}6D)Mî_i o ,_rGbhh1Vh[ Ć 7#ZTQtwww\9G2_%DԜ}ӎm\.?gI1$jς~Lv=l/9^bnFkVu|9N>`ݺucn{ LL:R('gZ,@ 2@8 a.֌{൷"9]{ \7m0w1&\غԿyE)O)BX>7X'ȫHBF`D0FY>>UV$F@*cuQQ1DǗ5I$ ּ18H*f5F Z&ի>pǏfyaN~c'shrPڛ}ϜaU+YjwZdRy%҂P9r(7p? RO+Ӎ#(5eϛoZKh0gC`gDS3jtYy S,pϏϲWXȤ†hcz=E~ÝVL⩩c5*0|zls]S,4 eZV ihM͛oQJ)QoL$s(8trG$Rh|4͝;Ag-վh-[a\FV*ҕS )[nA {R50ZO. T\.Jqj,nTȘi1mdY* +Kt ,كLJaa2NV!]K,<|yO&ĩcc8ph?Ş^;1`(%BN:A>CtNh\R YkI&tggn2 Zk>w|.RZN^B/ b#>abm8$ 5k|a}͚x@bttF?ywZ|ߏ%T4fC Hp߿r}qӳ X5zx}[M0 ]hZguajʹ0 ]^wo?7@?%m^G_)=zm]ʤ3 ;:Y<}/gyM М r1D(=cV t X"oތVT) S}I,rxo:@l[ h`|ܼ'#dDDIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/phone-nokia-n900.png000066400000000000000000000035621260417502300256220ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAThYk4Z^hClBL&-5zi%CF^[}SJB~9k^z^f=dGv:yA=cn~)SN&cCk~Q~d&e1v;auy L[tߛׯ_o;wAC18.h"y/cljХVsRJ|wM6'MimmF@{ eY۶% '  {22DT3h49gm/N`۶ 5t]0Ʋ: 4|ǣGpyz= JZ/^@B$~ٳgX]]*'?0 t3sQHgϞūWj3qƕ+Wʙ$[D:_D۶x5GD?uHD}},C }ppv Жea0`~~sss: Cض(P;68\^ LFDvR"MShO sss;+5;;XkXY8>0wbrۿǡAۿ3wRZOo xރy6k5E_J{^E~Hl (!n6VkרT*ͭ NL}ox1> lo!i!FPȳYO)R6O!OMQ߮ΏI՞>(1D3$iDl[ =@;PG=FfO=cr|eঢ়U!c.:MJ~im@ϘmJ Nqj}*T!b8s;E(Q: Sqɩ)]x'OtsfY?yŕu(Av܈EdhF!i ?|Jc4b|!"twuS(<;!]ys#<^\lR^ Ctt N121MeG77bZ*}ݮ܂:9/ǯev6i)aȌqg@B&Zx8Z~Sg;sç/d+gkOY.dS==OY`ZŘfDBt#Rh6CR2׈gly wsE?GqH4ֳi3kyl *PJsh &Vk qg13qc3387u=ĉe[[[ki4^`E2)$o寶4F=:vbINP.a!"TBR9(lba>}f>k-?I>(s}|k Ƥ|&$Ķ +z}kv2@@ QfbI*՜$:aj%&IM̞{ڮhF9y4hfB!V3(ЉF)ڒuƊCh1FI @um+$~vqNmKK&֣5za*뢵H)8lڄGoetʅS r|_E͝Ϯ33qgZ c,㐤P"`{ٻ)NHtR$1qmN":]qIm(P;u=!dnh焍: F6v.VB:Tg[o&/qn2q1;yӘٓr83123g84˩lq ݵ}xp{(YqPjO^rb Q PFR v]^}s_z'?n~A{aњ|>w@U&y7Tʾ].MjMY&tq\m(s]uUl!7bT KJbiPYxvTD0)x*紟{5 * eAlD 謊W- T*lo׈ޠĦ@ p 4~5FFy# 3E.Rax  =,ô6Bu]f jRS6$t^D_x |K_rtuiFXKKcyK;1QbS.khM$EA@!kUaX7QtV ?v^> \p\߽{7(XW^o7dW@B ~NX Dr8e[mWP" !^)OHPhKgwW2rъV<%qA>X¸/ vV @\> B}Y(5DDC% Pj$$ ^{BML%F~zPAz zY [PH iE%E)Q NY%0 -XƔoѮ\r7Ķ ?E<=hr ]?9ZݑBIPAAn8(08vs.X`i)M%X7]= `j*F+q&ԧ1EGr`!t;>C1aR& "C V/6Dz ZXXR|, 1'*of}g X vߏF.C"yS8U}N YW CF!DV>t]'H)*،%Y\\eɟ~fԽҍ 8o~./ީΎOU!o| Â%57Vٳ =K]<)Y)OHP/Lϝ)DNz!p垨م7kRFO~[%U{.r$5\*NωDqSxHhngذrDȁ|,.BWa+ݒ铲/I\POAvWW /H'vOm9͇}G1=Ѩ`k *7!q3/ɳ&l/Cg۬WF4xEBlyeI ?7-[ɉ+O}qϟC&l\5N$9ϲ̀c)Ƽ#c N'P>lJe{rd$Zxiv^^z-XJ +ާOnvޑ?s$1U.?' Y(nc|u\z_͛?ޗPP<}b'I`bҩU$SdslV]ߔ~zZZM@_FՂ~R !!l?,}ZL`Bx+/>Ek޼w_/V䦰hT`͛9&2 gƊM„y>,h҃‹kO l-1{!z#x@ (&$}׌-'X@Gӱm` [x1ZJo1CIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/spotify.png000066400000000000000000000066001260417502300244170ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYs B(xtIME 1FRC IDATh޽iu=FFH$!$$b2 ȀH2 #H$q'|HSMH!RE((Z4h^zzfތ$ W]_{9DZE!]`aHG<[}} |9 xjuYj>O5"$A (p!W%.?5ւ%s׆y0_ FE `P@"wݢO~KXc}(s9.I&i$Iyw9EDo gKlnv6"B&*2jVŔ:N*5r"JJo8$MI4H݈9֫mGEYf{%ct1q)Me,-?NOQ J˗d T{~'5FD&&͔={2r;sGrB$?BG#ϋ}~̉ X5:An٪#RA3#Ky'|+[g$1VwyͪXo 2<>rbNNd˩fǦtD 9diJhfMg~-;# }#nljd#<C_l jl>u\zzl+.'͚4c4Q,%+ݗ̲"FbhD cRc;ӣtJGX[9@`p0c` cᦫ "WeyXuz/,ci8V삮.Kzesl6`h(pxlb ~YtuGeUӻ,/,KGLxiA`A0Ҋ D9WҌe0SRꇇa?&m@Vvy\Cyf ,{;Ϻ]ܶEY0!Luˑ6Do{fIXE`UA=Y7\F@NlRe@L0,"# Ls{",3L{l_qBBJ!|()o!["p[" #~ρfw 6DUWj9DpV ‹o_x+ 0?&pD TI=ʌjcyBM%"Uo jE7o[2鈌&P B&eGPvx+U#{a'$P 2w-p:hgH;mCB3F`dl*ya)2mO_ѷ]rvah4  %'ɔ^w?mp?}[L)1A)x{wf쌖trt FYic)u&"G&[eSm-ƛ I]P9DXN^&T\\>-[~J/}}seo4?-P0>JqXsN3j8O7s7 s / /PȔT/j x>wq`ɉ3K@νrW~Hp/ JO=+],!j |En+A& F)kygz~m]pMK䍨}Z-/=ֶ ӊh8<+ꕞ\?qva3F\#.ݱGz4$߲z]>KgݚOOl3Oe]NV3`jDZ8+Ͼhk6T]#-wEV.lՈ | [$f|'JhTr7 5[$"XKOYrJ r:{T\lyڋtvNn=׿a0S,E4-\uO=%]rI|њdpgRY<ے,Y7M"PX_gI/t~ .EWzgq4}D~d4?n=_Ύ%f7|şZs6椣}a覻ץzݛ!۟v/I%4c׈L^/|ǙQKDQzDB 3YGxc#l/~ riSͨ\6?) 6tZihB65=Ͱ8e hvpDk/IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/view-choose.png000066400000000000000000000015071260417502300251530ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYs a aJ%tIME (OKIDATxjQ@\jҤIB))Q_DK/;|*/A"$C&s;vAdfͰ9s3 }NpY C<0%766DL LOP(TkX$ FGK -t:&|t:8lnnaV|u 0}6V|7A,ˢ4FדDDX##\ Zwdfu""~Oy \ L28V|mxJ.EL3 ?}Piqވ *@QN -rJk ]) q !2yv9 )eihS]@Zemm)^(`|hh(߬Fc 45'pIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/view-fullscreen.png000066400000000000000000000015631260417502300260370ustar00rootroot00000000000000PNG  IHDR00` sRGB pHYs a aJ%tIME 37 j2 PLTE콽  !!$$<bKGD_sQ-IDATxR1Ep|䈊Ҍ 4*@`c%6'0MdYچ /ĀRP X,3lju w|}A B.p/ Ŝj+ϯo 0H je+WW!hB(W Dh!#6 @ vnWNhP49! ;'J>WNv ~,K/&x>Dp9 cvqm]|'1^a<IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/view-media-equalizer.png000066400000000000000000000060621260417502300267520ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs11(RtEXtSoftwarewww.inkscape.org< IDATxZ[VWe03\f ”) ri4Ro>aQcy6$RJjP$R6K(2̍}9\=s}bks>kie.o'lkڴqÏ6o0Jr%?ҏAQ!BDAHI?5A2eLɝ4MIN3iiD633렁dtWJU^?!PaXG1xUUbqL␄<5ҡ d2B zaI$ 4~u ex .B뚖/ބ=p Zh3 ceV1{VǕ{l}fffpkニ/< o6Fc뿅!PT2)hZ,)(.izz&u~df&1 DGGSC}=N> yƍ| WZ)ƝbF5 QoFfs "C!C\S$Cc XQljQ{`T,B#ͼ$IKW<~S#!K~Eo_@-ػL- x8-446b𘜯,U7k{Mbux f/Ξ=GݍE{Bl,ՙuINlî?fLO```ciybH4z=),^D`ɒEXh!~En HLX: J6J3ݥ-ˀZQSWg'oʕk#KHU{xpe"180fD-] pCJfl,J z_JB$!sPI(aɎ76C[uXF$Z~F%@} ʅ4ZDSyhyKO4 0=;z0i\_s%4/iR HFmU(1#&sK2qƥۥ.Ԅ'5/\=H" #I=JhX&KK !fDJyfK*$e|] yc^DLMMq`ݺu% -.嫥p I2RhP&n`*U"KS51=1 ӰvX 'NOL3 z{{yn4F^//T1bVp +4Hĸseӌ͙a %Ӛ)ը*!@@̺2j XH|i{+y˗ҥ*}CUZWFn=歯L_ lpڲe Ro4£~Ԫc9Ҭp;*(,bF/O7JNr2ȡ3k 8" Q!PDGXG(5%k"DI},G !Ů{|KFXt3'23X}ӓӨ5F>աBrs +<#wc9KNfIڰ5s9+`8pOMO =ݸtǏ-} T2y"j9k}B}uQѫK./e:Kq|ׯss^yY0`6D|糐P$FܹsRvuu1xߐ---RGyj=P \@u4(~ysziu QL@ƲۓsǻCCt[*ޕN7IdhG~g˗㏧Ngř3Q}}}TC:pE:Ir]&Xv-1<1; ` |,i@:@mM-~Ea*x[KqX__NTݺu G?e1D8իW!E؝[V&Y&C?;+m] ;Hv*¾Cfˮd YJռB9!wlAilvl0EPSB[x@kk+f ckzCC0`C,dᑥ-:ID-('Qk9;7RF/;F.|^8,m1Hz GϟqI@d?-{ $k|'g:|%kll$$#?%kCȚo`(Pv̅zE 4[I,oعs֬iGE DZ~bE:rz+kL}rZ; hn+Wdn]Yǒo!k*I}uŽ`gw`,v;LRz8ԙ=P*UcÆO*h.EoæMwuB R򧤍4׭ai=N u3?ˊPt$%lpUne'} ԪCΝhPcÏ0 }ߙUUiUz-XGj7!)Ԛi_ĚNLI8MK ue=?a?!!y>Ri+|lVq~\ɯ{.jot1PnH*E-V) .io#/m]ńLN(3 ,@! DEqEO!oe=#K3_,GwOEOIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/view-media-lyrics.png000066400000000000000000000032311260417502300262510ustar00rootroot00000000000000PNG  IHDR00` sBITO pHYs11(RtEXtSoftwarewww.inkscape.org<PLTEoS o h v ry_} !##(),-%-..0,3#456 7,9::;*= A3A0FFGGH6IIJ+K:LQQTHV:XX_ ldnfoWslt`urzmq{u֢ꗪꖭ񛯯հܱݲἽḽ⽾ۼFbQtRNSDGHPTqxIDATxkXKqq]M~~G-P.B,ȨI62PXvX™Y;syzQb۰e m3Q9AVMWbqlșwru>_\`ЇF؝'u:>TX9 >+DP(ɳp=>>>w7yp%y?k!_U.+v${aS\"pf,ZzMJb1Ŋ=zEAc"pHxdPA@'ij(+g0%h(u8sH(,!3"GD1Ƀ۾%J} 3e%wn4Vv|ԆN(djٴ ^Kv[k"a~~K&#b6 8ZXhuUy 7|ph @OpDh֎bxgpe#1 %cR'$/&0Y>O"-I'V3₎IbT `2TjuhEc[mGP alE3C I[ fM݊ ]~r-*kFG27ͪlF unȥGdim`CjÊ@/e0u10zq7#P>muQʚ@jTh8(#@nPiM`UgC FU@ZqW`DY;w,3#[%3nq>l4ۢN4*KԩM fDqb mCK˥r)ʥVr+*;ω5`gp$}9}~/|#|^=_`hN̼#J>/NzvBjF_Krbvv{Cs߿8?::p~j*95JSv8ۏvz$U%sF@ˁ.{>Ov3 aQnO߁7`X144JPRf`yٲ{8o4( {zpVrPRnEKM<bJBMM j P_^b-::#_B+lA˫ KPRRHv0'k5J[a26Z}&_*QGF5JӴAbk2#| 'gavN!"y֓?:H$rބ|HR t:~l6!l6^ާFXXLg# @ϦKF!K;S='Q͍j8Tֻh@i BՅchLA;z$;(mu[h`}i{ffx/joO{]'C殣g|ȮcNxq6]ԣL39:|*#IЅYZL?lY 8ĸ"]ڍ4YU8pBlCٔqe$癑"i-8k=. ݟqČ$HL؞с *$ V919}!tڼx:$>tvrEn9UX1 ̎ t!EEōlZ~Cp UԎNhL8>mh :#AlLm2[/ r[3}|;lk_]@?L5GJxGwfo/~;@>Hb+xu]x%[/G<_}=p MM?Jǯ4صXVN`_zbkʝhN~]VVF%D[DS%s/R׸ iҷK,i3RA/ BHE棽B4&`||쨏_UN92*"U]Tm(P".}*++ء(W8׾(Jh +,,/sʏ8BPr|<ڋI_dz… {?縊q{XdJY0oo{ӂRC$ۀ ŧQlBY6M<]݆nXAL{9hJ^?_ǎӡ#]\8K8dVd < F;Hq}D Hyxr؝t2 \Dk#2g`ĉ+^4t} ͭAX:x(4UQ-qiX7Gf&SLIw&Ν+& EG$jk2 נ>q_NNۂa `L4U8ZF2 qdLqaȑ,>P@ 2~5 ɓ'>?IUUUI|9'^XU ړ2 ːAb ̧P_4 .EuZ:EyeoA+a$0R֪2S=xWTsU@>3ԅd#uT?]ZVVe1`P^B_ :ξ/jVGe6E"L lt@h^(bpB=nڰ9FH>ohB1k]QLHV~u}0‡~lޅ߮| |2Lh 7O? @d}W,m=$LyG$ǵ 8u2 SB&BW% p;jڴ"+x *],#3|a񖉾VY=ɢGbgvFHll"@lA&z0! l؄?VPIn r?Il7XA 0VLEgHYh BRYHRL3Ff:` –W6ϑ﯐HaU*edX*C/^| |e)qK,%}|ڰe"ҌD ` B%Sg!2 -6ƞz'eJD: <5{ޛ(ZF TLpX@c"$r!$J8)~]sqjZnG5qyJX{@wj8 ֭e_P=Ιħ)Ȕ&mkESK Pd$5BlBa” hF4%3<Ӣľ(0R\/ bzNIv֭j-hv?h~۩Pl~w) >8IPLE!Lr-DMd˸mA2BZ=a„I boK t1dp9y.Lq1x.+rIǛmǎRJgIIXl[PV9 $$FU2QmL4(3$5v;dPj $MۺIʎ>h%O"8ӈޠ= W;KHP$ vEp)( xzBG?߿}^3h^f͚`p3-3dl@Y+ n9S+6WM6-}7߻WLۤ< ǀ*0zf!aÆt,9HS jZ

.pv߾ÁR^ڵkw{t-wӈtZO~Ӎ7V8p`WBwذ%S/'4Ыq6M!dh) mm-;_|`Ck >XQQnm,0لu;qǵ5om߾/T:W=f)ඁ.WIlJB|^W`M L3v3`AT z/d4ґ#GvPcv!VoZd$*TrT)|ScdMeY ׯ_X2/O^w:e&iilt'}ql3 Zn#]1} ?U(㒚f jǛ:V phw~[,G+lEfc[QE?<IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/view-refresh.png000066400000000000000000000072371260417502300253370ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs11(RtEXtSoftwarewww.inkscape.org<IDATx՚{p\}ǿskw=,YOlapx@@ PB` !20) SfhICm~rs˹ǟxg?<5CGXqF\|%Xځ UX2N)~ϰ =d_GwϾ^z~k.UQYםw=RM)ecQxGRM/A!^X|7Ϲe_spt׈zܵc_9lhyS- OEp*~- + ng ­+@{-y)QLP?(\|>wlZu N]vŻ?QVw(uM_`F0/n2T=D6V\m0GKC2A ~@z*҃tpqs?Տl'IRڀL&*~R-9LyDc)q9`0J(~B4!\E<GWGBsp~`a(&A` إE]qfL 9u޷b(G:Ke'n44/#‡ELz~SWλSE,aA4gĞw,bzBP]}p7ڻ~z4fsA*A$^`df[2(,@a?,gd(A!cޱ^z9,o[`ȺZ HnJޤ8iͧOdy )Wf3!X+2X,*Q"HaZ=HGaյ-PY}GsRɖ6oNx)1xxj!-.̊/1Nqq^yt ^`R @2%B]r )7Î;f7p(`mܚۍЃS#v ߪ ^weI(jwĆx›VI֘@!} O/8i;vΆwDXM䵼-oXzum:L'Wsh'8#6 %\._`kC1c#aO.jHx1%$IU" `p*%=`>.Y>Q0 V3:څ fgAC@~DU)P1&sPZn\)Epsic!HE#D\Ds}XDn"TmH!:d&jh)PbgHvKb|+z,5 \T N!A":sGP2 '*e<43X_`U~rOW*>" c 4]+dXi,)tXk)_(I> @"?}Xwײ}忏a7"HL`I, X! d K/j]=wML.!@1\¶)B$A:lv4`G2W0> 3#{8֨1vቨ™q8ƺuC[ؓ 6Åh&𑵭~F@8 iALnLkSayc~pHpv:f,.O8N1+/f/!X!GPT` %yל2bē?)/FbB+KUɆ̠A.J4[B47H!2RPZJE"udN[Jbm`:+A! B@^HMڵPxvInȜv:n3[K,A$Q .pK\ϯ. }IM[ EKWAeOlz2|:n8W(+mNul),) D!$ 0 ( I:'Z"z/wKDjEo{c Vyrj}]BFd{MdV'K0ZywJDpHߞsx~5WZ\}A"΄e1% ӎD DRRi8=}Zu f,D j:ph*r)3bUGS!D.A)A<%$ջs" ?<[_򙙸#Nni̬Ыr03(Xj㙀3KI[G̀"PXªe T,3Nts/8=001 1Rh4~ՖY{E&9S5pΌZ0@v5qvRò3oA7]5-ڳVuRWw h UGP[*k0(|8cwr=07c䞘DCۖZ7{ga\֏KI(zc%u ֟o yrSoSu1yv\9JƆ0-3=F xpaȗ*c'#)}?5`2"1֘C)l){?J,O$*hF;(a:^~:9OԍIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/weather-showers-scattered.png000066400000000000000000000064171260417502300300330ustar00rootroot00000000000000PNG  IHDR00WsRGB pHYs^tIME fbKGD IDATxXyp~^IvB B8"f V v*Zکc;XTkNu;*Vkű#Pb"gB6ɒd^~fK_~~;y߄٘٘٘٘}u_eҲeX0[90w&niiI 6e/_UUUPhVXWWwY(=rfbqqqO?m *`N7m߯໤0E)8ʔg_>Y'{>s~vXbWM>Jyyy|߾}9.uXLK<[$/l; {ĉ,Xp)S~! fϞP52M3J)p2r+f\++r)9\LSge>!c'–eOj4].O hhhp|{;0.q!ӴF$3|/abo*y: Ӂh-iRiD"/4QIQ3&q -+/T\dt;`^G%Pwņ2L<[UTf{^DYFήD"?qҤs2MU|C>Ǐ_@ $RđU%0\Md*R4s\vs C7-'PbD.qHoy;:޹sg;[ ƺ?fhq+Ia҆a:Ȯrs|xxĒ%9P1Tܨa>bO 62`ܱ%$!GEV8, (Wë|ELJɄVA~w|x83E ţJb޼ygM31h-)$qBpLFPnF8r^Fp̙,؅|QMdJb,E9~ Zzm$ ՗WLz(nTkӞ=wG !#P IUUlۚ)3\93 ;F;^0,ONۺM΋**!Q`S~)Kؓ4:<رիoJk555e5GF]GfNQG:U?]I; /(s"<5HOئ@(ZA~œrĪYFp2xP7˴,&Yayyqj\o۶F6@އpM>\@SUY@%ÄAфÂ3?hqUINe'Os-ѧ(\"O\008VeeEh-[k#`, DOtV9ASrNhUœ8@'8C5>i28\ HGkg2lPF8@T$9LFba<ۻ}v+{ásf!L"RE`^j䔐NpRm1F䴍Fޭj"Fl! 3jXd 6*=,)@LV^V1|(JϜD60t&H.ŵh@#N3=b22Är: =қ:|:Ȥ s9Y]I '#BB4tp# eR35Ixd*g J~;qx)]}}++&65v!^}UkyphDU"PqS"2"Ke 0KaCF vP #I}}4 PuPh;d[Hh|VXXp J%, Z!$2/;KJE\eӴ"*p\p#pvn~(go%5_9sM6*2vIm#KRPB@f:?ervL 9努؀AaTѹ %RNyEZN2}K/޾~ '̌@`9B]P4 .'dJkLA:؜{zG$gCG+-v#z:d 1N fHdkgak֬*6Ȫ ]| .tJ&@뜰LAx59-P dAr7g(ъL&٘gLjf=SPv0Upgb}c‡11ξM<- /LRE=='VOZ_*lώǏD@#;X*HIq+Kϝjˬ1{^YO)=#=sO?eCπvXP¾2$o>rYfDqaAIqUݿjDFjCO+vȱuhG [yqu-oCѸ"_x`^~9hj~鎺k KeJust"ŠgB}\Dz衯o5݆J~oݺSn`{[bHE |3y^5TDk`Z>xŏke>X#ND|/LΕ.n^>ݕZagdǬZ8i9L39V56l(m$'k3*n $L, ~EР){mA&XEUW'|)bG^o`WNH3lkL[}moV3w[Ƈ\GK7*owz}xS{wXof{s{dm~-ѓ'L)y`ws2df$#mȶggf. 2V_~+9}KFl8qjV~*sgkLH F}MK*OO{d_yÿj˫F-S}%숹no˩_M5u w^q%1nڷ*%IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/x-clementine-artist.png000066400000000000000000000045501260417502300266200ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs11(RtEXtSoftwarewww.inkscape.org<IDATxZ]]UokEZKjLI/h4E“`;J|0D,F DE0$QkV uҙ)3sw=:H@ˌw\wڧZ{=Ì16~4{neq3<|9t6?M#'mu_ƋRs?i(}a=&}6{ێ{ڝI`#(K%A  IլQ4rŮC ?8$<$q8G Ԏ%@6K>E, R)L:p 8*^Iig^fS}xo]G|FZ6ZQ!K\_8|"HD܉TŊ`6wM@;ϡ6Џ}7bN;_FREĕa\Ą@ȡ.\}[w Dp]0i8DןVJE81L:\/@Ż;ٕ (G!$x ԑb5lJt-̠"fø0KQghS#67Ե]QZ愭euN or NTW~`?:S}UK2'.V;?`/ٰ+$޳aFV V6IX輍>6:N )9qQ2yg-~h|J&o2'&#_;B.@f2K<Oumk5ME hK8 ũW`Hж/'/il|tOŝ%.g\ & dfvsv8TbAvǀNrm 4 Qikva/E!B!'Id2ytռ+,ai-T#V !8d'Re;0n9Dڎ@:VDBDbb~puՑIaYZotTmaYNd9x΁S1_Yd9 ~' E qn`_B Oɒ'pjsV,4aEL8M,p=S+Ueκ,iN.|('CkCWѿ&N쯆` ]c Ί`}>G^Nd~mR  :dv,}cv\;<(>8uz*IV)c.N 4;~H"2a`r}3p7no AHGbJ \d7 =L~RQk%J¬Vd@<;} g`jB)F} !(RIv4S#Gf~yamXJVzEb e8;׸W۷o'&f_hHץKXT6xEK`ן+ySL=.4>޿ }ˆiR̓-&zzJclOqNEf$DX{Q 'qڵk=oV+*(|8TPX@MhT!E&?lFM!F+miIlZLiSb mY}>fvvs9-w3;.G˝o;ι!p3L!õȅ4n `'u۶m]vկ[FӴz߻s+&3Phctq\WM6}Vܶuk}.SnkN2E!ME"Y.!nh Mjiiq[NB@^Tl $d0Y^&G+/ y f@p=_~饗^kTUEI@(JE82p \  U344BZl瞇~3d#/W)ȝ*Tp-: S3ӸUB&PQQ-// }_|zzzEѿ="ċX*NdhҐ b\Y,B,0U]CÈx~SٙfÈ9wssSt?E۷S 8ptI@Q˗eNN'3jy15Rہtвl6նjU]tlٲ۷o:uA*Lッ~)&hte*Ԫʬx.hh`N\d9r>/PYYٱe$ćtZpua}b6nnA&v4R#m{gCC[/~)pMLL$ qH eNQFN62.ȑ!h5pP &2`l̈[2y'O`H4q(`"C38|^6Y`4DYHg'Az}5œ +"Ū#KÜQYm?*`6m&BwmLvq]ׯP|*i' L0Dxwli<jתkYg(9Y5eTbT.1#ܐ 8 q+TE,1 Z}Y9Ξ=;@,dku3.1$l0YC#ˑws5ߛa+W+\!a]@0]GG&".`###MVY# am7 Ϙ_ yœdŢ|3xk43fƭ͸iΝTrL]Bk29̅+ *D˂Q8Æ `2[r5tِIV shyk6p-h1<7]Çp`&3>̞?~D+'6ZPYxaF$tl[ktOALMAW:oнi.\)2ɓ4d%2e3 l-CjaP ތvkg8!RWTD${vcgb^ZD;7@jtvmJДOa r699r+HݶD iWL_^6@n(_?&:5G.4FUhҭ~ݨBMCOıssٽP Ĩ d>*Ӫ7VP`WSdža8 H0 .Ȗ%`@&:do^'ژg 3u5~ԩf/NB:dXnK1 T ɠYx,MkM'!Fs4̓=MGx˄Ǩ3[ Iʣ 9 Lh w7Kp7@"VKDYIqZr,$`Hi e" 6$E ISg0T"DP7VR4ROhXT^3C`+! ۉdG5 p[x' g'N LOL}@_ F{TG4% 6t5]I{G;Siд70{I ‚lE(1Q pώac疢]mTAK5-XiOr:Lݙ#ΑJ a||޵ %U:\}&q= bDFNxno4A_dvt555rǏyyڸ{'oo%f|wqJgGxlp!)} R{SB~q; 7t°p]?5j_IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/48x48/zoom-in.png000066400000000000000000000065471260417502300243240ustar00rootroot00000000000000PNG  IHDR00W pHYs^tIME fQbKGD IDATxYYl\u>uBr]"EQ*+)P}h6@h4Hؠ(lȃ+YI਍,/rN,Pwg3wKhѢhю83C?_%O`]׿~áe, HNlq}- 7/d?*J<@ap@qns~\~/W/_H$ /|s/ q??Z5h>!@ !?Ml6 vT,׾mvFG~  OJ8s N]."dqRͦA"E?b\[[ _=܋|]yX*"qd~$dٲ8.  8nW|m,.5ٱdž`v8xՆ@ )=̳ra^͈7>YRigbnbW1&9xaWKDk W4ʚ{dp߾}sӧ/3@~O0>>,BvO 𙾈hԚ2jZ;RRc0_ ΂?dm΍TSH]@;.1yۇ΍l1z>FBNۿ!afr˖o9gp.5ȹk:9bl\Do=9ihێ$lYd վ]dIh#m9?8cFY{Wz'.cW7jUPqp~~- xrra"[]l-*pueeG [:LQ^ ʓ _ HɒQUպ+ IVDP)< h/]EQԊʲgH5F-KC:oR4E]@3|Y&78"em2LSU|F$W$l dXr )绚D<P(h0bӟ=af-OHղBvň ZELǩ7VgBޕ+W>DJHu,Mx=H2d)w90|J{2~a;]M[!8r]?8+87Ɗi@,US%pGBB`?ɑQx @k2ڌ D:cZ_~Bpf[bqtۡG1T SMW @Y(%h+@@=| 8^'JQgbtp腌'OT;ym[qA9 v1=@wru纎]/gfRcJzĉF7*pƭKLJLLN<|t?]JmtՁ "3ԾRT]laBAVӭ7k᧟6nӓ'O«`ݭyXXIF}`ql5"1\8BÙvzWZr(Sͦ˵õavZfSGs2dy~3s5p;r{D33{7;;3 5^Cvg}#cH [+uU3Y0#F3J턻жj3s;4.⥋WeYJ d@#ő1"|yy%|{.m/UÓY̞2́<==:tNqmlG]L___l 7ﰁlW `4P6M3׷W$-0!=RP777{ L\sA# \(>9{@@0ZX̂EAau(5 GG| cz甫Nz s G0r#-#ã֭[^ ީT*>D+.P.oj(AQJ@OAx!:ġ?efqV@ oa-a,P+>"4(@dٳ֐iLauo4.rZ>nVVV@pcD6SdrAC{ h%X?gB)`'#3i֋R`++$(hEX c% 8[bp S,tbZTUtZE4Aj<cqS$Z,B ~D*={K?ӏ aSH:XjAܔx?1Om~-A9瀳Fw l( Ċ>W'kBB5L_E0X~ïa 8D XvIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/svg/000077500000000000000000000000001260417502300222125ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/svg/ipodtouchicon.svg000066400000000000000000002442321260417502300256110ustar00rootroot00000000000000 image/svg+xml iPod Nano white 2007-08-28 Simon Pascal Klein http://klepas.org/icons device media ipod nano multimedia player music white image/svg+xml iPod 14:00 clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/svg/media-playlist-repeat.svg000066400000000000000000000061111260417502300271260ustar00rootroot00000000000000 clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/svg/media-playlist-shuffle.svg000066400000000000000000000153131260417502300273060ustar00rootroot00000000000000 clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/svg/multimedia-player-ipod-nano-green.svg000066400000000000000000000723261260417502300313510ustar00rootroot00000000000000 image/svg+xml October 2005 Ryan Collier (pseudo) http://www.tango-project.org http://www.pseudocode.org media device ipod MENU R clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/svg/multimedia-player-ipod-nano-pink.svg000066400000000000000000000723251260417502300312110ustar00rootroot00000000000000 image/svg+xml October 2005 Ryan Collier (pseudo) http://www.tango-project.org http://www.pseudocode.org media device ipod MENU R clementine-1.2.3+git1354-gdaddbde+dfsg/data/icons/svg/spotify.svg000066400000000000000000000272471260417502300244440ustar00rootroot00000000000000 image/svg+xml clementine-1.2.3+git1354-gdaddbde+dfsg/data/last.fm/000077500000000000000000000000001260417502300216445ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/data/last.fm/as.png000066400000000000000000000047331260417502300227640ustar00rootroot00000000000000PNG  IHDR szz vpAg bKGDԂ pHYsHHFk> fIDATXåW pU}Kޒ6Adc ) t+Vҕ.X[etuڂ3e8JQ($,ݭ_?y|; mN %CqR+z\>A$+J3]c]-UwbW<T4+yzƏ!e!3 K`tvC;_XՉxMV$#0cJ&*CBk fzJGCPql-6"FrB0Et{v_ xul!}3oo2tC}R>;t!C{!Ho./.lj#;B^,Z Ji6XdNowY/mۧGN}xßx4<z[7"܍[.yѾC3* G.߸y3|ݒg^d)!Ĵcvن 3}ֱn=.umižQ4{YS$^@6zS&y\VHKL-ϲyJXH!)dh˞%jn!_lt$n.m+++%Yp=0J2PƠ]dmTn =cZP“: >+9ؽO-JHPTJ=봌<bmUoPRGO)Fuf$9/eOC6~gīePi~RdMs.:WD"D좙$m+@ E2"`9=7xKɘ61~')">J`j5zPko;N)߭9Emz,زZVSVJ76;։.G$c[!!t ѡ#ELSʻR<+~ _&T*S dHA-8b3sbH;UQT72LmKP I4{ldp7]%íL4HX~Y\OBMz򲑸x; c7']5u/ AL;!O.7?/|y*l&Lzm$&23Ty ̢r(%ٶb [x`Ӑ;ϺN74?cj[*YwYUi?oQC9de)62]XsߌH86;AOOEծ̄,㻶- |ug΄xj_~(i=SB\ ;s~ ToZe9Ez >ZlͫuN?5RV^R<:7˜/^tkX9N;icLZ~+WP;#oK^*-qa)ȢQȕH -;վ|Ƕ(m_L$Eq[=(UT>Q4Kl)2lڽ!'yDn_6ܵǫVA?lqׯf:tC, [pɸҢ T k H [<\'~)?@Cɴ_NP0 I]( 224Lƚ-:9:j1BÇyo7^499,t&k*/tYݱ;.EdIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/last.fm/as_disabled.png000066400000000000000000000035561260417502300246150ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs  tIME.IDATXíylwt=LS,ELYq,Y5C,IeYuh5Gժ[:(*UFKUiU"-bzou|'=YQD@y󊳳͵k͛7͕+WLqq),,4J9UVV/ 6<2eJlLL{:uj֭[ի̙3&//O{WgϚs }#rĘ-wQU|f˗I(;@9rssr9hѢ G7ҥKؖ-[`>~9q'#ٳgo@@@Q!ǎSOMپ}WR>{oILL<+.P%w ۦܺuKK&33oٳGcnܻw~`6ol<8t+P QMMMovܩ{k.h׋/z܋ҜcSUU>|X&?(O F$BcjE4:݋܌ }/C> """*޸qEnIu(ᾴ4SRSS +7m8 Bnݺ8Zj3vr> džޏ2JReѢW^mk׮]ۋdӫWA??QQQ2@T(̓E]f \s%wjk=V#@ iJfȐ!9ܕEfjֲH, (bQIIIڂ={Du~q7sG9|||Kﯞ1c7n `P2d1 ffɒ%fʕjQJJd;XqV˗ 8#FdfΜi1bDIllu J=mnjcd ~4SzXZ JJ ,fL/ a2nMcc6+]yXNO*$ŐYf>00Kн{d5 /xO 9z1PT"!|$'Pxȑ眍HѷF[Dc xjŊ*ss= $ߨ([!,{upss:th& f$Ç,pIHɓ2 4B\ov1\N Xl2SVZwrS֭ !'{s~;|@ǿx*%oe$)]]ϋs@lݨ .<hqx朓0邨ˋ`a7a0|*9SgP)kߘ0;jq(vÂK׾F< _ﳋպ[L k֍b9hA1m드#ّyϡwZ1[Ig&sqVy/N>t_/J4k̐[h@\ ISf2 ,+!CVJACk@ 9k17 O$/h+ X& Ad Azf:܆%e+b{O"W6o2; X~.XYY{(#cte 12^<[\"uu'9`m]@ 1ŽFRHĘB!Kr Q}DqeHQ\s\(Kqy:n'$~MhI`B Vncf~Vċd`$eǫ>!ܱぉMj۷ay! VܯҮ#kh08 nx&⯶8>ש})G]'<&r:smDNrʔ BagdضELj00{&&.+ԁ̝w?sE*=ǖWWe0Cgq

YW`|ʛxqOE齑S s%9S:LeR/"|))f@u ҹ[UAQye0bn)_PIpV\K brެRpM1RhWŕ<qtع^u' *DoYMUDI4 tI6J%' >wܡpUՃ+ B[?s0C" KڴٚqR $Q\ZKƭmhl118 &j^/U[VCLWp/.Ru0c,JWa)"ی ,9,kge婹 *9pFҏugE\ E HFN*l啭Xnj,A v%ڐHO4J %\&pո_zGwؔ>a-J5)*uVr԰Kv$ئ]#D!Eo}_dII樨[QE+:~Ƃ0P'xvBw/}mudXDm (`,Q/^xkXYtҢZ~5p Q  hыq2N`lI<4;Et} fLL=~310 &آ7>|q#!Ndž'*Ʊl؄ulZalsqtN_KYRB4KNMM*l3]ӏ+jznQ4u8aoم^A[S)CRJr*ق2o~߱o6Q'>O``ۯ [IHN|'233qkR1GAf W0܌Aq'IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/last.fm/icon_radio.png000066400000000000000000000006161260417502300244630ustar00rootroot00000000000000PNG  IHDRagAMA asRGB cHRMz&u0`:pQ< pHYs  IDAT8; @ XDE,$A )Ub6Ժ+7ca}rT^8^̼ DA~~. 0 }ÄƬٓPن٬S 9:qMI6jI+aG>k}Tap8a {r.Sd24dM&& ;Ntfi_X@ܠތLb~?>i3˲!ꋌ ø^I7^g~ wIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/last.fm/icon_tag.png000066400000000000000000000011301260417502300241300ustar00rootroot00000000000000PNG  IHDRagAMA asRGB cHRMz&u0`:pQ< pHYs  IDAT8˕Kbau"6C,g*hӪ" 4 4(d!٥Bqtfhk JEd]+nFН[FtŽٵk \N*I@2XU($ir]!? mKP(4)Be#HHLFTqrE!bx4:=ϟ=o4W1jw$f̶95h鷛yL_A2W = ݗ̶'$%Kkg*CcA#.b2/[?.rjC/3vwzf/`4(w* Uza '[}s"FY'%/n"S(XM=85Wpx_f@gjp: A=a @ 0z~ &挢/"OasY\ z@ߔf UzQ莞2,|4$Ϭ@4ՍmrUˌAYk8Ǘaa(X^fCU:m/gϣnrd X^fkc/HYo_/}YFkЫd*sgY:SaKs;95֔pAʿvLEF*]\(*'WS7^Z7IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/last.fm/lastfm.png000066400000000000000000000311171260417502300236430ustar00rootroot00000000000000PNG  IHDRK!sBIT|d pHYsZZ0?tEXtSoftwarewww.inkscape.org<1IDATxwUհ'B % E $BR"R (ҥJ(EQ@D*HG&^Ϸum9eg?J½3{{?FB!0M',+\&"<(8 6 O B2) У~+….’ L<* @nb)`]ԡ ҥ"N2+&"~eȥDlu:(¶0 2 Ew(}}"ddE ›TQ\" 2FJg!z3,=2Ėzjk%_32L@}d6 & s4QK &{?L PHj¹F8\dDbQmD d*my˜FL PHw+ zdDbi5 +y2mzr"E-q ,X$ db{r d,  -W1H'Gn2L"1c`v d =|#L 0HgVb@=#L 0L̝n^dEbDbPf#L 0L\m}.7r#*<.)\'PK^f=:PヌdEbE¯U|焃KuBp{H"O@&`VnN$ϽEO6_O&O@& \L׺$,L\<Njiл/%+1W}2L f|ĺ@& /W|S[ @& .WWd@& \@S7#r!q@& dtQGd@& \ZhMw2L f,N&2L@:٣LI@& 3WxSjsL y:d@&Ո2L L 2L2L2L L  L  2L L 2L2L2Fa!aEagapzppCmD_6L34G& 9N8M8^8Tsgwaa aaUaYaL2L6w\;0QumG~ D8U8J# +SvRQjҶ}uo6K"kk^"<$#t =B,4)mBc,nppAsdIW_/']p9Ү֮I;]sܿp}aG3d\w/Ew Җ45ۑ6G#·tjxm as “گվXK~X]r+߽ց-=Ltvh2{e6<]/ WE$|54?iEF3n(HV]JB&@&rm5?zRjSbbрnMd%m۴z.Vŕc:b2NNـR's礚Fca._$FVՍ:MGz.|4`\`,~Y&4+ x88avT{<n\*l?oruD`wnXX_0^8WxW˲] $IỮ'W*L_uIWt0'+m_NvCmK^Gm~@Y' P1LdߡAz˦Gؼ[tek+{2m:3M7z3  2 Q4!4BJKPh1#̲ꀧ `xTCNùX˥-gvOْ(~ 0#.SA^ 8 d dˆtdi ܩm$f*E&n6촜WZF'!8F/[Ng| 2L2L:g';> Lҝ5*~wڭ9eu+sdi=-Uԙ dD!>=9s3qu~ 326wTLst v=lɡj% f[:2L ve:s CJI[;D˭'yߡB@&V"W <Щ-YJ/k# @v82L2ciaq EJcwKᲹkr>Q!*yw{m˓ o!UUx  9 i[峭t&v||hQdNn&f6"ix6;yO"פ6[L 2aW&\}3/lG}[˨HtpTd徳VH]T̩%_㙟dOԅ; ^aId@& G2ﯫFD8W ͊!TqJSÄt0se_D"J d@& '2Ws}W2D}G&'7z;u&$W֣J^ @& ȉLg9AULr֛+r7vɇPTM:O 2Lؖx 0I_E۔eꃮHW$4_\ξ@& ȁL%(k w0+O?<'+:s2NP|/"aQ(60/{+ _L d\&\[ m V4Da od" $ׄre>inSd@& 2qI|@ >{ea؂eFd"{7M$ZC ijƉ2L@e m͐)#WN#Tkӡ@C<62L ap\֯]pm /-n \bF&j ~i|ySi9hqcM"\ZdƺPl|m*S+WʇWꐉ$פ7wHNd" WPdKIiV$ XGtTqp֓iHjٵQQ-G6;?qSF`+˝zg2o(-2ڱ{p \A9۩<ɕ*WcRz׏<5Wρ7<| @&r,z8tZ/\ܰ C^*<א\L '3Gd:~f3_3xi[[@&+5|y崈."; qg db@M44>ǟ\hhD#/Q}yk d"2f%v0VV;p٭0g;db@Hgf)OӍH1 $zjH_D&ʄk~ia29{嶥~SoMF>2`mbh}k&| ݀f\ݢ":rN6~7L 9=Lf-n@sm2z88jGgpRo5|< k*ESEEF}i^wqQaC 22}[py0l@jv%"fSn1hfdD{beEўFZZ}ʧtk[٩T ƕyQVj"DdµkS(+,{Om=>i2?0 As~^Lq$Nẓe:^ĝM]:{ D6duW &;&3ڃ8udPR6<*gשF⑄'f\NCL L^&\t{ e6̄_;4Dm@$.a㵄KY=9^'{!B& @&r/?u@r=Ln7ivىx}~rM͞L@&ȽLX]oh}Wdbly͞nddmVx!  70$#;N peG/2a' {|7bL\lW{q}[SL LV&z;q嶋=mԄs3 ;xshvqx|{STgWdU&^ 8ѩ5c d4ϓZ⋼hȢItuY9\|,L LN&ܬZLpb=Ȅ@yV!cw}_;1r2L2+h+Oh74nD&ld}&_q/|'|wG" X5# u4.G&68X#ӝk1t’2Ld^&> z=H=r;g!M #XVG ??f _2Y%}< ۙz21#+ Ӹjk j/22L D&eNe074蹄iY> # #" 2L p2x渽k`d|& WV7d@& d"22x]yY;Sn;i dd@& dxc̤9n[ct︛K*ƕu22L D#pmZ㶐0RUR~ehނ0T$G  2L y{N1WخsLu1=۳XLD& @& d@&F L 2L$=/Gi=;n%.ҾtP;>8d@& d"QX2:dЀǃ ,ujo~Y4 EEݍLPW2L 2F><c{\e5o;d d@&K;9Ҁ%˟8.ndb3Fg(z<L 2L IQ/Χ!K$Whg޷LA4Yr('(K>WWaj|p#C@& dȕL|{iIGKg1s{9ݐXx rn^@&Α d6\,:8Cn=/ >,`:AF.+I,.'K+ȿȽc=f,27pL 2L8`@2pvpmuʿ1={F.[p1?4f11S <m~qC}r2L -F0|B|Ua~7 Nf\fw\dvLaCYC' c6>q2L 2Q= ᳲq 7_sٻx- iJCt꾘9j4^zλ#oN @& d1l-?\P|9ȍX{| d"wS2L 2Q( QckC3ԑ|J%>i{'9ȝ#w+ twCO*_yX]Pr 2L 2Q G((xxEeaNG8dh?L^G܉xLd90!.G62KS.nPG,(G 2L$Fb5 .)u 0 wX.Gs⎊DAGһS <5<4P'Mg2ߤ傮lLf+7{CмceN%A& dE&j;U4dsem; qHH(;\nυ Mqfv[@\gyIz~eVmYo) ߷aoK(s' 2L"'>"^I!HK25^Z*Т1uŶKl TKlYF߬D.K{yުtE?N>]@pޣסH]C&l#b[Z]jJ3 #2L 4RS Ϥ3֎GEUnԯؑ#q%E[6i&ϣ~QboyߦF(Qn-z-}Ih^י ̟ @n,(o2R鯒$ۀcC"2L tdv0b `ӂ14GY[)Uڌu]':!@QdIOƯlYy݋[2V=E͉H}Mz܀֞;1u9fy5SC L 2L,4FQ:O ČI5̿PcN oX7!2LؗC\펔;N4'W<`wKKRX-fR,_ }2L 5jڀ]M!X q]TGCk^ſ.%#FVQ2L ? [v'B}s)vePdc9ܿM[̵tD~DJehXd@&‘ܓ7 ; n i)vݠA9M{yH3n[T$po#2L&f`̭=[Ϲzҋ9f(hdsF{@%2L Ʉd *a-SH6e+ىl}] d@&’(\!鑆xyc.b":1Fى-^O C& dY&b uD0+CC8NmP|(r9]X>F`M [|J彪Isd@&eb7Fx ZL6e7X7oϲ'b9=fCF@ 5aJ}zuF& dW&@;L~:T9-_s3O ވn@|rxVe=hYٵ "2L D21Z; m3Gp b΄c"q{P{$ΫȩyܟrY_ap/"2L/t|uX#e.Pp(wxms|3]ĩMՅ|[:,rkl㻋UFr@& d"~@ah, /9y앦DѶ%wӸو]Y|'I )Wzvd@&L'kKg2߭ yQd}>|w&~W取o'#2)/k΅)Ԧ_֧z.^y]P!2L$(Ň >~`7+ Ҏ2bnTl=&L xLx38ox4Q[>^hC*mv;菹Ldqo6hO ri=#rڡ ݈\ 9vC& dHA&>y/yVg) (;j+GB|AT T$-;NX21-ᡳ%lkfBSY3F @& d"E(>/lml`Y},ukuџ#v\^{OA"̡7z2"NE|2rK>@& d"ust𖎘x;2Mw zGWF6Gr4rƒZ69[ Uo׹z@ rgXg5;W7VEA<42٩{4o PLtGɊLx( D̀Ltf|wQj6d=eGKعek~_Rqqzl 6TGCSiܛRnM%a{Aܳ kӑ+dͅk=aN~Wخo.7Oge 6<<ޣ#/0|dBoVӶbvVKx|\v,m^UPKQTa8P:]/]ݫhqW݇ᦉ']cNyE6P6[~2ݥ?(?Hݨ:.|ʺy TFݯ`i/C iqݟ\.LWÌT̛IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/last.fm/love.png000066400000000000000000000035461260417502300233270ustar00rootroot00000000000000PNG  IHDR szzgAMA asRGB cHRMz&u0`:pQ< pHYs  IDATXWYPW֥h7ul (b 8F **( ʀѶ[ǽ*ATCt/uߜsrϹo쿄{p@Z0媽2ճr++YFcR`gk6#ԄW<6hhjq$`{DS~e}?26QK (؇1( &;dIz8Z J#By2m׋g9 Sv$b0L"O oTN 4:RhA 'څOOH qXSur磹7sդF(gDGz:= v1~%'ZR@8TpC`Wd]"7 *s ~ԗO $c~u(x)9=OOQ];5lZ8嵳hž]uͫ83Z;N<$&Rz+пٶ2d7QPh8n\uQT?Hl NſLtȯG@ub? iPIܘ/;MFvx:dO ʯ0[ѽP<; $-5BVeBe2w'qev֯(/P i} @jd'M(B)AX[9 at<Ev v"MO:d26&>/*tboT'xp`?/l4K Z@ǼOVCX)cPKP0?T΂t NZqc=H^w\C<-*1?[|=VOyx'R7A͡>q#P> }\Ztk62x>λњs} |HB)ҚPXPGٲ*F3=_->iT]Ii |\є Y:T-"`7˿߈qge4R{#D'ioQڐԮ 0)ǯ1%Pm\ 16nC"Ğb]V+4GB>n[6%1}kv>DmPEBE:i(Gyc1?xL͞PLЗdPw1w%؃c)sH2. MPFjQ>"JF+Ui1#,=hA"Я^lAzNqdPz!istTz>;hWAu).إ?^Cq ЗEgЛd#B|"ChFt&?w=553 %>(pzH%ч7y% `IlRo>[+mޓ.Xv9?p׏4 L\'/-9ޓoڞ <_zKNN6Bss3t?o~*v)o. "+ILT/b`t10D4#~:QDf&[0tqO]Kl(aFAϿ:lG#IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/last.fm/loved_radio.png000066400000000000000000000016501260417502300246430ustar00rootroot00000000000000PNG  IHDRagAMA asRGB cHRMz&u0`:pQ< pHYs  IDAT8˥RkHQ,mAI}miӲQ7RӬTT`A$tQf-x%sK(K8ަS+$Z;|}xn; EzOACa0};B\絺p8e'kWn n[M_у?ٙtbv6}^P`RbH_--Ȅ]ݰ?ўu>r\@%|Z"_09p;Vmdvk迕G7陁;W@4_HKq취`? KN2:N}h=mx# 1^Ѳ_<]iKKZbbЬB @".V0vIs#kt2.$Bȸ X;Dt: oطP/C0#IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/last.fm/user_purple.png000066400000000000000000000014361260417502300247230ustar00rootroot00000000000000PNG  IHDRagAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDAT8USKLQ%a1.Pc ~]0! Oi-e:3R m(P@B)  ;7nXRCg}Iwιw'+Hd`++yXƕVګnW߮C=8s5# f\>|.ʠdfes#VV˟4 'W5ˮ*_{- Et=T*cw17Ă?4%\lf7iL;f!Npq4%<;[G[`) k؊s}+XZiiHKVRƃ![Xu0>큥6Mh#v&-ǰɎF,6?;8MVA<oԏ ]jP Ie "M%d2#7:l)oiTMuὥG/`7zV~ ` V(K2e]e)lpZ,;p(BS! 0Ώ8%zEګ7Sͅ1i` =^OKi.0eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9%qIDATxwU׏*wzRxH T/`T BГP)XQALǾ9'/ $0I;<̜{Zd2L&d2L&d2̛G1h,5ƒ-1TAz ҿذ?3t->'d2,ll}`j'={Ca-Q'XS!"(>EEX.0{f2,l?R~^:U` #`|GۮhcjӚf=-A7a0)]wLZD6=ͧdޖqh?r1 ִ}z9:9f>g?|OQMPMN2oQOv*bb2&UX=\|):|Lmg-$X)xX8]O5bC]A )59ջIFXKY΁ad29b˼Ѽ7!?BizSQ,pG9Z=j$m߰:|LwgV#$`!BH^(P#Eјjp"_ɽlL& [տökOʡ[CCaXDub UC?kJ .Px{ WVlⳍYDDqLj hTDͪϦL&6ONEx;~PeCV_"tGaZT{>XEIͤٚCT")20ڶeѬ !c$ƈiű?Z?}jg2#1MD7Z=Cu1F&QkGQC`=@T;18\]b,Xc12$5>ͯJ&das/?_vE,G"S) ^[X,:sEӮl1I $q̦5WN.u[ίH&$7}f K=^4N<}psNC͌]b1uxgY~.0M(mrH nhY}O>}?[3Lf$7 Q#f|ɲ^,8>(_!?qi<7jMz:YW챊%\{+( ʢ©9{9Rd2߃ly3 4^8^崪\!S lkӭnX54ajӀ%!#3L& 9atN=ؙO3}cmNh@턾_/d_>󿣳 )**Kf; Ge)[utiN%g2"7h7 Vie3&[;ST%b qXead2,l]Jԕk(f[lo͘MDc#L&] 9C#CJG10f5a5 Mמu-<#3L& ^FsEli% 0c{ ZbXs-Xtᣓ|zL&q>MTJ8Հctu*oYkV7-d:KQ\ؚ]bI5c ]?z'd2y~u*FU5E:GO, 9\0Ƙ~L&# h&*7 *W1*eQ[&[>+ûfݢ5Ƞ a~ vM *#,`kpƚOnTIf2e Ϻ]٥%+\IYDcYvK)Xw,#|L& [\-M闞lU;%We'98cC01r䉜d2oT9?kʟ40K#Z5(O&_?l6d2IHs̳xyX T;Vx \ٽ" qHMdrĖ9oɺ9)`T(liHt]XĀ1¿e29r߱ٛ_fRUM9Z\n,?qONdrĖ9AҪf,؝̩ѫ')j3||Ls?L&-s՟.O8pC7xݺfZL"FZk8>`&y[""B|VJ+)zӡe6H"~8Zު?;4Gd2Y2j+ ! NX[ `&8Ñ3L9e:*5 teCz 9da˜?vgA+,\ݞr_1De94}O;tt퉻q#>odrĖ9_<ʳ4u =}P]Ϣ[niO ۙL& [-+^mջr%:Ikشӡ [=da˜?+`;-&lQDsRַ|Ǣ;qO3L9=ٛ\+l"бZJn^_ߘL&-s~ovVLk(eVT m5~qsx2GmL& [+j'{bi8v)W6',C98zWLe2VrZ-/is:,01cr[xmq:B %Td!`&[շo';rEa,9uhS9drĖ9.qsR11!@0DaVLy,7lg2e!ϸfC2$;& 4]˺]=]Q[&–9|~u kSJ'_q?e;~}R;%H2L闞ۡv O<.xۏ-da˜OKpe~Ŧaہ[[VY2LKhwP CDO: \94S |rL歉|+ ywvb (a= ¬(03+|zL&Gl]|F]Ce-XXee:݊_Zܮ>e_op2L24j_iяQ0 (P(k bDr~'O/ɼ5q77FcBUn7KbpYݩu>L&#̹7fX:AD%YFy5aVN~G?~:O"d2o[)WwlgDb5v !r<4,_<$da˜c~n L&-sn/zߙ^qZ@I)ɓ~qwkYL&-s`[Z5`;0" =wM[__V2L޾ߞ8:(,vگ9n]=mL& [O s;s5KH\Z>"t~]vkV,lL& [Gm߮ݫwBm I[v $L& [|>[孫Ք ǕHwi̧e2,l˙VH#,|,5ҭ;2da˜oqno'Zf Qeٯ醆Э}ϷJ>L&-snOz^޹rc"1 NYPa7vK|ߺ9de7\|zUmʖi z'ZQNGf2,lͷK0qeq asʢYUm>L&-s}-:TC "pڮ8lN}gӖde7]x8q֖`,F@S: mזn}ӑL& [|zߙS[=m&En#GnE߭// H3L֕n*j;NToUp.}kNNn-da˜o]xP[GiS*7CAЇ?t42Le3O\IeVIQbTNM߀/*e2,lsY1ՉuF h&v+)tŷ ɇ~Gn_Xq5 10 OppCqgO\O-ce{\wGe3,.MQ D(jKDgH #RقV8-ԚRp3_>-oִlNa8b Ӝrsu+f8e>ۏ?-,*Ch1FD-L(+T~YwKuZ~GmTQt;Mu͛@ I؂QLTR6VDDT!r%5pC`Sk'ZaZ;ѯOA2焿i#,Xt{$*Z3yޕe_;6ŲUE[ӇN@qbSĤmtcXT"tCd0Dykc*=1)Dh/J&ťqF)| cP 6/do`blIa:)wlrߙ=]zɇ}柚,l?&> ?l~ivI qy?ŽugOya3}+K1fnWm\~a;6oi@}+>I;FViQI=cT5j1)!? &:UUT| ,=0RLR4=#8Qb2¦P,T6=9%JMObF,VvBUuRIKZ-֜S#W* E5V (n龜ߪ,lo%|6Ove_OLz1C>BIt潂BPEsI"g%(E cҊ#A J(>bcm;e ©T_'Egy&o4(bU*S X0RXՀjz!v(Z=C,c[oL [N)^XP}+>{-/>_xziׁ*:#Zg+m]WÜ| j27x:Uw߆MT%&&US$"\pʎAGeP!LƏQY!>AQxv\:mU?>$hcQ((N.(~ va)X2/`bafe^ ʼncЈ׈\B84aňMXE(p8SRiPWj> c̛_ߺ:m(qϟf[ϾKG'ժ?to̠I15 cSxPbFFQA0D!Q Q17jX (}l@i`F>ExAW(+)MI$A;"R,OhD浲!F!d2QSP[ߣ(Lhɉ`G)'v,8S,n~g~} Ω{tyVlGSDB^vK킪vӑv7_S-~MVcTx5rbLVly%Ę5p+/AQe`NqQXELe&mI)FՐ0Va|"*YŨ2!G:#=?X7>=)G `,ZL\zN$A4FH5X\BMDƔJ9޺MB =F  NV1(fwɥ~kz_3lF[/_ݍ >`(ۂg^|:^x_3Ox֤cT4 `c8-FR؂UTɌbnkz_]e~S=qDKLaѴ\پ.>+37~W_?F>><`XuS.](=alXD$BmˈepOLA7s:/,)lY49ǔ]IQ&QMʨ]("YjR {6=b֧`57N8#(&pDZ6=7:eXvAPI_g9&[B:Z*;61mLjoDH2Ae )(L3TX;trz{Gm҈S+vuylNDLo%bF %ǫCr"''r:/--W'~-}2V 1 J7//w~sxWm4!Ed[Q"$ !4`h& n_ƈʌ_A&J4 B1\ zEUbjh.+9">1bdKƭ 4ZaE"ő6cPpWB16f ]cM)B*QJ !dLQi50$U=LU=냋>EM5+F 2w Lp 0CS]Ocћrx~>m?ʷq`9}_a_}엷_܆ & +\ھՋO{3:; |և˛պ]c豉X:dLSf2!F hHM[7BDn~rc"R-lJ:R=50+ {`Spӄ:FUFBcZCTŚdn ѤԟI=uhWUf D-'=v H%GnST_שM$6GSzH^$F q fVVe#4jL0Xn#.ͺ8;ejN.uVa[Y8XK@fXs#xn1cRß~׿~YyOyŇ~crpDnnT|&ch$1Հ7v`mRsg,DRMm؛Վњn&i;66QMHUHbB )Z3coۘa#^$ :U\KB܇LSO DfQQaecvȩIB*$xs2QT(r,qtj glю}Gg1rO˞Qh\5vKCUmSJS ! MlՄ"*ϊEaM96g -ѹi(nR__A_R# ۗcv1LcEW3ۏV@O瓿s]a@6> ul3YM zHdhiRj15DO"TNƋbLa㸐J ^#w^pQHuD" AAYԭ67BqDnN,=8þLǔiBI-x6aSS6L7YgJ5i6CD_J`8Ȕ23g浰c醢0wˌ8+^/1L!$3K\JS" >0>vtV_ iRA1 xBÙ4#'ƚ[ljM.u;k×k–#f7~S R CDv!ga{#ۿ1yknzxwF]1]1F$F=# *-Ura5BxA9EΌ0# Q 8^x6aRsLF#o$CHҁ6`4De<5RM2^ʦ]Y)hά.:bJ13*FÉ4%e 6RI(B`nDMԒ,)-_{HqԜ"C H\( \@%P Oo{__oƝLNl)H*h DØ>+@2PVolV/b!IoXJ.HBTVjC3D) +K? ۯf7i"KC:*@p)eSTׅq^&U1F(6F n&UHG<8FynҍCvk7fd3٬ Mq] bЄ?ZcH#K3)p}\gV؝DQUzB7Q:dek)!0ܦg@&Lݔ:VkJf8 Z,bb KƖѹi_;}݇}y2o{}uTzIa`V]E=7<x?TyST:|md pw]HQ:Ԝœ6cBLQX(&͸Ō3IS9=ucpTo['h22-Soc*JS#vk$MMMK-pa_S/G;$We݋AT)7FPŖŸA#2IZ=0D"mo1l' ;ϱP _c w4HZ L#4".D"JH}LabJ?56Gi8VQK&,8.FC4JUd~B?/ܼK 5 [\sqj7)_3Ø4]1)`EC* G}Tb\}0weL($;aҟe];i6jBqgfFٸ7z}b-gs$K6JRmzF45-ogObyNS[ؐyK)3 mH>*U4t>}>tXbG8rIj@4Ҽː0ӹw#4:]4YtHL_;ʺqrLTkaӌb 69K6cQ pBK@!WǘnvLߣUn"tI"X1#4yOeІ{XǶEH>zF#Ū=M/oe%gL~5;X=C>x~A y S9GG5t !E+84II FG^Lгii 4AÌu$w7F7RsrMP3cHK݆jAڍUNf6qk hrܭJm2(xFi"1&qQJc:Ӽ1-܏$ᔨg.Ÿ٠mSj6-OM)HpghjDc q|tlH"4AHtWE>{?hnw@xћDkl7Y/MۮtC #155W{DiR:|]X]?ظ qWdT4КT:F?~yǑTcmicldx],QPm|'iJYR[5mzA( AMdҼD7;9ÖjWĔ6DuO0D=@Bà3'aa w'T؂'ĸiVdt<(N*jSZ3)5)ƥC 1Ƴhū ƥ bQgudRz"]H7Mn;e< B1* Ӓq&u;FGQ,tFतt3fAAYX 4CDk qi-(L1k u E+?[,ls]ORyG_ޖ'qjuT>0s63Uىy"KgxAPfU26`Ω#c4Ga?hPXI:扗1VMo %>($E7ӌlԈ]hw{~{ j1Wair6\8\v!i$3J8W"bւ5XkS-E% '.9 ccp4:9lT9K)Z6giAuR+>8Hi]:5q`RL$"EIQ55f!zԃZP TL&QGz?&mØBsnQӞ~XA;bgϥ25(l9KPX $J 7bMv__&r*2F5[?xBtgi}Ϫ]>q7<%_r|7.Bx$n^q4 `"Dt lRt>tѐT2*gQ`mҤ~6)I(wwt ȣ{08L u{"-H?haPXfIj(ǞQJƆVXpˆteY-bpn$X,E/!FOIqbDoc lcx ,-1!5ˏ4 ::w4)(t9)Mx6XјljdqL3GQa,]C?FB@!6j2cMD*D=kgks>v`3>D5E%Į ~Uvmi?Q]]_n_aga3fa^TEEpQ;.2UдK9:Q-.׾gimF1{QKBCrU';яa@cEe=:NĂH#wz1XH2q2Wh7T5o|lizIz}Q7D/N7F[&R4)ڪ݈ A&Z!`0*jXĔ񎿴%b  F@O+)UhmAig,>t5FW  ; C@U0R$ ,*ڣ5H+q8YBHbEbS}HÈ{8KF`Ĥ51Tq,to>j1zB1 ^Aŋ!jJ 5JTGFPS6DK1]Y:kV&k/ezr*2FiW>3 55elp5Ww.{sG_V9?ܓ~cr|dݷk]11q"13pȩH%Z;nev$G1{boWM93s{fhzXS8j0N2wfYf)\2bi=^o7\LR$: 밦Jh\z$ 3ڔ³k=ߍil"q Q(iwA'qi4;\ߵ@ct 2*aĎ)@9(Qt(B5B# 8SL$ϻMǟ{OItro=OQXԐ"8{t^9R3K;)չWV7^m_F)sĖy5Va.<3i?TۭX7G5oe?_1 qtT)x7klژm\tEudltK^+RcDa2_ 8!IFM7IF; WiҴ3^ ɔ XwcV4H1HzWh{XT +k"Nh!-󌤡/m_FF IHPS${1LP:z 8q; {֬#3Znh. ]2c{+U'%ѻ ds(0o(5FlrF6_CH7wEr#~IR7 jL%<1z}il@CFqH`007D~L%IeBڈeчb]?>Tڗ~ww9b˼y./^]%tECSH"fQYt/>Ϳeo,+Ǫ];w%YcM6{ߣ Ў;8= h| Pƍ!-%5W1sLCg6; "g"ݵ*r6hBIW62Z `k1E9MgEYc֖Bٴ`ƕ$<&3'zpLۍWp6gygіv7Ⱙ5Q#FhĨѴTd|.jF%WIڈ@V$>/~2Z}O~ ;C/B.y$Y0oE 1QQ-]CaLYbTg'tlr>Gl7mQ`k>mÀ8ez~c7_]_OW~?]scƻ軘;yl C4~w-mX3Ke^EjެR!Ta)l{mXĄ5T4w{7N=b\ gnb4*Wpn5֖Lwg%kJe#Xɭ(n-wB6Qר2F\5b)1n<OcMqrP `It~EWtaE%T ӃyDΆٌJ)>="fQ!]FDRov~Nl8VUޱX}`t(KT*-) 3=q1ws%P5F\s 7lxprtL[ HY#K[Q:1JZH tY.n7~}R/_~}=[>W'1~HB(0lFohm›D\uҦi֌[G[V4rJ 568Inƍ:cMEku7H˖8[6(Tbb 7b>|>da˼uQS7]?7cC&]Ϻt t*YŖq+' 1L0K_,OO_ڟ.ud6z;LHbT6iQdi**3M)DcOոg̍+cȥiYҲPkdKFq쳲&Zautq)mF;̦k;Dpc-̺s5H6Ŵ/y_U[}Wdda˼0͙-Jf=/QVcڱ$1P*Yć 86v9 __?Rq_7_]遱} fzl4$Rٱiyg,[!xqf4mXҚ4Ճqଌ3pY 1JmXQSbs5ΕQ8JpEQZӆE1!_W ee2+ߎF044[Tn\!JdC$шJǐv:z4O|%}ٛNͺ_~h8e-b}ۼɟgiO)|`Sott^TQ>孤Ę;֯471oL$VFfkְYjfZ8ݹFy&Ve1(WLx:XWսsu1%ٸy$3o45ٗD'&-!տ86/Z(ScSs و5E]?[kpb]]+JJWSջj\{Ţ e9j쇽(te29b˼)WU@JqQPЫrj)ނi|2-&r=)7_3?վEE^57~ zУCZТ+1g 4~(gqƍhZ6Fs' sco5EQQ-i,w?^SL̛;h_\TDCۭX.KXE%DtiHlCŻ?-?W=uG;o3}߱}`9 fKvj'oFZaD a 8Iۄ)-S5x*.i񤙎gz0dø)wGbB,+(PSjFUnQUs-y(P*edDTdGL<}Vk KCG*W c3@` ֲ397ϼOO }_#;?1yίLz=,l]bu3rg 1H?4tJa%ݰ CKĮکߚ]wo/=8|3J9Y.7ա['|ѧYX#8g) GQڗseQSS8w'aR ܯͩL& [_lnYCS-\Q,ʡg>y/əL[:?z2-PcyNO{Y])|gLJO3o͓' `K3ilLak;uVoO.vk>+–ɼq|׿GVL]eJd­O 7VVl׆8c6s~uqv|[PjE/gΞde|=m{3B\qi[^cF)uͥj?='dޔ|?,OzNSxEۆf`ѷLf[}Nms%X7`IkgY}+^o2̛ =앭UwDhKXzd2e0L@UzJaRO ??LMFc˼IljzIwcLvaggrR#Qh{ E' f2,lsVqQ{Է.K._`6a^CO0QRp̧deU8Ae@B$J=xUŚY=خ}Ns:<ɼI̛VlSqAe;*Mzt}Cb6|w|iO0-s"z3`e*6%+zn{6Мޡ-v&lSMf'<}L&#a:0X[P̩cMD0{g 4 Ê&moO1ɼ)=D7_wgH|ĝ%.0CY' )0eEKs%_x}9<,8-s``\Kh5`. tm'oL_n}c6d2?0Ɩy}R~01Fl1aRT @-B` ADuO'У3v⻅W|zw>k[nU}S!zQJTEUQbқJ=C釖fXq-9hN8V A;,tRm ۓ~w] 3,G9'"3oRpTw}<QC=YY  Vtq)QAjkD D,54J ʸ-AH1'zs2xS#Vڃݬv`nBYLcUwfb3_<9[3NJaxg)+;!zLk%Ǡkֈ[S 55RJ P^*AŪ!mcFD,,u,nqdٯiF!(h vhG``=!!u⠬qvriZm?|sėda˼%Ql]}.D:,%0yZT!z- TE\>zL!6aG+qՉVV=];C'0NHQPYGU,%Rb Q,;Ռjƕj_q:44CK3tCO>ޓP xhni~VuwK[u>e2Y2WC3. J7D +J9֖&鄲B'W[} AH])XC,%w4/gwN4ř vQ.m]XN`  %Phy bcS{DsМ\w9T㋚n 5hzmץ~^bߺ`gӿ2dev".rEx%Yt[*E|q`sc^׾Y؟rO_o[;ńSbe榈Asv݂rKh';JE;^up1BD1:CYw$N4}wm/~?LUe#29T2:\I3䧟\t׾Aȿ{;Kb;䘡8Z^闼><0Hk,rY1gRV-'Q x̣*JjHx=NEEMu83FtoΌf.O>ղkg_~V_52ߛ|+W:Q4 a0*>ޤFGx/L?O\F+XzĂ+`kZVTϺ~}isuÚjb#[Մ][@=}  ]Ӄ~v67!g;־e,|zЪW=;?%ߕE.-I!~=] Z""-PW/4x$p.ZA}"Q1q@O=`P"5iJ@0nsoM 52IQu*`L!5')OvK%'8:E<8m_0=-RD ,OO f;QT%NZQjjU醖خ4Mh@e't^5C! *AՃ+*Hk[t[+3ՇX-&ۻԓ=4x,n[ 7SSp֔Lt/nͭ1'~EUne{= O7v nɰdhŶnMw=ҳ_{2Y2OA7ZүKBoј,z лQt1}}{"S:pS^hĚ$F LLs6Ԥ&1P;Gb@%Ф7@ KP!YНIѺDIe="Op-q9 +JsgE:dƒr0 TnF-`VVL Ħ# b'zJOĀ}+ \5#,%° Bsop*k?)UU?e>婃ꀣ),;G\3WVʒ[sa˖N/]qcRlOV,V݊e_҅ՈUP[S{a{vpuiӮ]ҏ\daVҜLJhH&w $b(pMͽ"IRZQ7iú_HR50] 4I1Tt/` "]AL:m6ʁ'ak1O5Gd, K],N rp*07ʴQ(!do7azgޅ,֨QPKpZՈXP)ŭMN5 qL\Ieѯk0R+Pؒ i|O#b8jW3WʵLIAosUkwZKDTYs 7УC(1JBӅywݾQ"Y1{fqеHSd' }Rbӈ֤$, Pjf.G(aE,W}@VHC n\fm+lYR`G G!B_!EC)]%[4Fh)5XMfkvw 9>K q6+`KhLѨq:98m5 qhAiE5ޟt)r+Mr gNiSrPh$n=B ӶXOѰ5}{9ᩣGx eͭnɝ.E3%eYVzLmS풕Ff\/2q5cd[Cb(mż"^`ս/Q\& [XeI(NKa-,@$]c+<0[=ҬАMav.}LS- ߧ#D#*&}+ѡEdREiFZ5b]ǩ"`Ǫ'_!~H_RtW54TkaHQbvelץ3)&Ik Eo@4HRouT -t+r%4cEİm!]-}z.mKWDߡP@CK׸zo+s|eir2z|V>UpNwA<ohcdكk=CCC%y1n=rp*M|T 'e}Eg}qVn+pm>NWp{y!CåjY51Xh +;)Cdb&\\b}i=X~{SoPԚ&`bwW>cr@& ۹Ot ʥqnhU5U@L61# dKOaܙ҅wI&[>zzuHU+LҊ$\.P:⦍@=&'? :\ߦƚh[T鿭BMtzV=_O;0%RHQ"Bg 4 cw/'hDR i ֤HHHQDIgSf`hȺ'b3? $ ==ihDLw-fh]`|D}Юw`koczJ8>@g3L=e8:*w=mpaut驦^?.DXzP 93Ym_ .> _z^8xvAj-B8VWCrxl ry}K;l3J;oEi3WNB{|eI\a&E?9٢[N_3Qgq>s6Z-i씘tw:D.n  cҙd1.]|D kpHY]~tў"F$d\a|Ѩ?& fHߧ)\I4c2(jf"m2.0ށ-%{1s trRi;LQ*! x&")ԋIEŔ5h9&u$1tWI&%b4B]Tk4gS0I4iJHפH94HhS{Al@=:dTۻT BE=1cVN0iEQ> k,xͭ7Epn5MAN)))f圹,.VwL? 8Pҝ"wF;^wN?o*L8?rNiO~q31Nl4i 3(knReRCj( mӴCCDH$Fq/ک!3h<鳭[v։ƜoݞyTI B脤 \cpaqE.a (JR AI(%Rۜf}9?w$4HgGܸs^{5s1'm+P=`7c7ݓP$,G )Jt}cG5lP8㨫PEYSXNm.RP(AkѴĝy7tj(BģEjءcz8s?۩HQFFpH@bbN7 ˦h(qÆ9:A;9(&PHy ]Q{/j 7+# QzaEm0e7@a87 #o,--u0 Pqh4H "jஹ3Igƣs8%)2%"QH B0TTTQN?_zձ{~HwUF^#70X5tf&"8ȧ,#:9@ZWfHR8:ij46e< F.diB6t ãXW)CD8. m~Ϳ)KF4qp&*\#QF2 +s+b%2gRN8{d8)vsdYTdѡC)CwVT=?D uShCH'ϐ4%fJ9uv-ܽ| 9Pd$r8sYI'/E*xш2#yi 7.uzb1zO!!S~۫(:@i6J<0>0-I) {>}.c6Y%u!D8 .PG<.glfq1%'/H 7NxGIT}vοOu?ïvp^E}&ǡvwbx"Y Ƕ׉ɸTs!JIߤuR ͑@Ro{%4\,])Ĩ:U!3b4#+Dx; xƒCt -ЮGA}x&cq6Ϟ2u,]gI}qEKtuj08Vu.H+Zr[Qd"C̞S0'KpYz=xrlj>CFNF3湍V:Ea5MH>м=ϣϐkDHc\%%uJ~= 5x0xJ*pz-%ImvuǬPS4É'OKVŒi:9:<-)eહdCO"Tev\.h N΍.uv8ߕo?{՘׫ourAu7ꮐNpgqIEP_@yNps4 [l"8|ve9=R܀ T1M13+C":itrzGmx:kprZؘ"lD#XmTqs,cash_cOP%:J4?FaT/:ص&S72uX շzc *d:׹Z,M,SLQoЗPU d8k<{ jvuK5>D V`9B®s }D'#TYy9LyÔyA( uw@Uc;Hjn8k!(͗L)|F2D<^<91iwc~7y|1oNUa7(j]LpSH[9DO!5Ϗ{[ =RLss\vvv h@pxAv]Wh^Lt1Cn -s4(w9~ л[t b5w2{ e5v4)-ۍB& 0vuH&DON *vLW0_>5d7e2F;m ɐngB UbQ ZMk)=2N@̈*@1{6KK|SH$SwHHs{>ԸSBn9)~ m0[o81@b5m.? S!CGqx(JԨ*>dŢ9?yU{jT3_w-iS~u{-G6k٢}mC\bUQK D]bqֽIDʩd([!r1jim8nl[SYb)&Vq Ejm"P#٤j`("mk{4wbT5_ a}7vnsSmNb4QHB>=9:AXa]fK9ch|QB\fX8A8g{1)JB>2XL⭕  {=;7RBGTpACp|%1F6͊)RG y'ã7F%uԨC$C@qK$ϘO&di$K @LK,l*v^#>};Ȟ7?ϾR?b5]5$YIשk9$P!l~8,QChڥ9!bD54 1tz{o=woS?jDUa9면U*A,9$MW.1U舉uv $KL}6둢[!Fw6c+Y.Cn0ø'!$).MQ whA 8ZA[\c4kkGl؈l~~ h!Nbk|FBﮠoҊ=#,yƠ].M2$-4;ThBnI2u@$%F qݕ[Ap>AbJ, h9M#EfBlXᚃS3Ëglr 45ySA12GÑ') d y2r9.Xj k$ #NHfGG'+&l)@BY*҉'ފ]Rc8N/*@6<[@ճΙ34% Λw39}}0&,'d>%P&)w{am(|;G:h? tq5]z?od; ܫW `[f&B1-Ftge{5fSfT&Bh{3uȠi . 1q&}h2%y7 R\ߣ ka n:LM%f.R3z\⌿/&oh&IO&L,1[X[\u ;\;ZAG;Ĩ }|iősl)V؊)JK 4qe HJ+}`U f&@M@3S7O"۝).q!X`vD<>1!qHW MQOL:hpbl3*N~^@:8rh#P̬+ \!Ӓ<_iEӱ Ij-I KTN,XGE[53=s]MդɌE9#I3H/i9!OJa<3˦l[.wz-d3&7/&@Y"YLV,! vq$ * ]o9{CՍ"C`KFNkq7'FjbԺ;}Y /z˚C{Eᶪ{Lf$I6pQ''1lB&{s )҄vh q4Jongw'???S؆_oI_]JİbE\!sP{aC |Nl"%Xn̴;(F@ĖmkTgB !Id#+MG@VTċSdZ"3PdUYL̜Unjΐ AB$jD\aD yːKQqi[|n=ɉ)W <9C)̦0fhV ˕ַ`qEds; l2d>C͏pM MI'?^[[ݡnd "<~hEkh&rDqu Y)sSK]6|boi1(wLjæNrjv kZNqc{%bVfN!"ii.'EFi,5;yL*%I%HhT羄(2qjHJz];nuͺP.(çhNXA"[PKd.lNxw>_.xх& l 'JR30r}a0ʠ=}hfw}o? ܫ_ۅm_M뙄$ `$S>6rBwNs+jIѶSہ9Fл7jDc0î4* I6bF9uCǰQ0ޡG)$kLRJON`n;cVŴ@0"o|-l(y}ry3!{S]NΑmGwhx8vH2td= ~lvf^#7HӍ-h nhzac߶?۵C3 =Z j& n5RaujP!iH/$B@)Lçrb;Iq&zR(f͘N)<$ъ$(ٰ!Ghw$:C/֜kR9{I2NzHu[na4L ;OHgO^)bN.-GUV7=P3 ~Kwd~6I]hFZEcnoO?gSSNW_ 鿖$ 18`~,8iiˇܽ}K (fnk>zĠO?@5PԔ] p[e$F@'"[p)L֕&vuG2:^čac(j&8̉D=Uj\Cv6vf' 5YnL9&hU3do22p=(]\r6M:p[^+gpe''*DrME={T"J,cȃ|"+iw țD<{CK;CC;T{)j#z$.&>CƓ~ 5%43K ?XRo{"n eA1-N 6 fv3v8$B4bzi͈~G=ҷ09{ʕ?>5QfOj^/F[r_B{+>GQ\!Yi|a#`Yp8F}|չ:nڇAW܅-|$tCW05=Zo0tKbn44T XX#vVgVhq3 M̏&~+HڈL0?AN ۣ/}kWf,}yKPiiw51+x@qlgpue4B׌h:6)M'zvV4YA u5U\]Xxw~0]>ځA6:ݟK䰃07H]Ll5*+F}.XZw6Hf0,V].9%Kݺ)Oyӥ>MbF[boIq`fv&% Z!.c13&K6ANm:Sfvinp{^_;O, 5Kc2B8z%MؿĴMFũ张 =yS]6Lwk2:nkS%NjOmRslH&dYy$uG$Nkv!T89 5۾k w]M@W*m6"O3~NW_O CQ ~3$7FڼE%a 862/dH/:c?&& (=1p3 iaţ7ٛv_nn=031`衾^#.;P(KW>}cc@o$7eU5@V!ukjͮnoCeEk&D~Q@fKT;9~l;%t" H_vK[񭶐`!X27t=nDc2 \Ln2C M )̤,])0?BsIYa{D\!u7?6teᩌ>ins'+?D 4{to9g 2[3@y?:#lI Do~:g^}7 "!/bw)vi2\-7PbN#aP9^t"_p:(/5k U"+fSr03À:KУz ַo˟W_7Ϟ X<& 8g͕At5qF-`[/<1NMԣCĵIϝC4<.ݰ1£[H6Uǹ:Ĩs0o#Eʓѫ5 BaTINr+fh.6*޽qA|aatj lF~1tƔ\#H%~,t$I2eE$3oR?~oRy{~[+#Mpәua0d!PouNY> yӈbZ@TI4#}(!-Cget:ǝ=&vMaU췦vB, 78ݯ-vz %-THۘCj";OdYOY#GNIhw0?J$2Œ{eCO)3+vs`i6aVH}'8Dedjd4.OHē'^<Ȝ'08z68ЇNmlemӫUoԟ~~U [jF2bL :z=R)Fh7VdCJ34PܛLqj}l(a E( bMbP<5-n/ pقQ̜涇ưQo#reQ*>F1G hH>?F{0&>Go|F/ X87j^Dth{84h@1+pc.hPE5q EZJ3g%2;2c0d#Bhp[|jĭ7pqVm.+t֊ M*~ M# 6UWoh;Y6azc8:1tL%k=5[zeIe!ݥG)YZV)X$IZ[h/hp Y|I>2T-]Q If"*'!t5Ϛib0Dbɬ()#1Dyzs I`s>P - DS& 9N9aZ"CCT%@ b{|7S5L<i)W3ڕ&n7at桇f\o^=B,'fk`A]alju:!ʀ+=zdCejRΨa>A]Ēg&0;w7{'o#\#Gq { =x^˛=sA0t"DY>,t  ܊F~uw0$8Q$)v *9$%K )sV.\$*y сx2(\,)Ȳ {g|F1tӅF&_eugOӯW?_Ō틙]>h{@Bof@$VP1Rny6f]wfL40twz˙pkhsbq1Fy]3Hs' =1,o 햢I{? 8:9z07Ls L;v;C }5--8JTLH?sΖC>!{l*FJ1Z@=}g>f0 ;EC !|ja@̒ P&1T31KhQr@V1j֊h9 f<,i>v>{"-p_/6 di(h H$^/( Rm6ΧH )ZX( vZKn{6|Wmk#ܛQ^P5] I |곑YV0ht1{ f}3d69!΍Yri62n8o|2_!:_;%bS k8_27; ag``Cm"Co[$tmWF78PNtmikn 1&q_#s9OH\4u.E'#o‘aLH$ ^y]B{{Dx8&7Ruz~~.~gWG?^QQg":vV(#4vv`u-9OM쌞K# Ԉufvc75 ycJ4lf(1M hAV#2g6$[I+K?CD͠=*5hX犇'6 :":T}_gHĈ$_ybY (5K!qx!dz">{wyxjP^{}a wI2ѣ/%Sߚ竜1rwa1tFHh.!X7pTt0L"PHȜ 2༠Ebv2Eʉ ܼy / 켫n⪝T}o6Kb"#Str[,Ե5M4]۠"dɊEv3DEUqn ڙu`\3C|6X.<&'?∎M!:1{ Q"BsJ"w106sFe @O&{U{r,fIsE f~\g^W5A<3//-7ÆfDcEwcT]6CDlO֏MRl"cZ * t"6 L00v8b,|fa["$Nq?~H,f`mD#jޚWj:3o|qv<}  tҘ@ʅ]0d&AKji R"stBΞe .Mm;),țTV8Pxn )g$ǍB$I3b~4Hfށ 1v8ъcߎ"c(z]P7/z>űM|F!T{%;$t8!WE`{Z&'O9dN9]0X$Ǽ]Q~^UTrdɄ,)%UJ$KF=FT<%Ŵ/?#A(Ψ8ИS tLv,%UРK'+S+]@vc}.aD!B@Qԗqbqx(shh9j(`q] =;Bs0i![F^h2_w{ ;Lld:N5Oө=c4EG YA6A&+8KOjSS5A`90@[#jq |fe%b# 6%\AI0gvhB_zk\`[Mtu$ $ b*~hkB]:|BRľ yKxV}9$H' :gwYAbGa-w>Zڡ2R)GiA*=cnXr{'ڭoُܫ{*j49Qsnr⭸ iL-A8gㇾBnoXgeĔuAGi~0v׌Y!W.ƤkgDl!>1X>lnd}~nPj0rGPS1ˆ*r#WCK2if‡89A%ZΡ7xw0ANS[@Oj;⦜CELJjN斔̸w^G@5m$!DI=4-+zD'}~w6=YӡuΡMeܣ3ԜI޼o9۩9rtl t23:x/s06gp@6bW H:a]j Ʉ Ys22`[%<0z}@ ~y\wsQ?ŋ)$mۨcbM+eh,W %WE)&FGqcx]O~7~}c?*lf3cJceh f(7]xa~ᜍn7j]xk{Y=2;yg{<ÎԏuXCnFϢFIm)B 5\2E RSqި+dߌ38mc%K h^I<4҅oMUawL'2KĐh LԑH6!ƈS#cB(p\a؛@1QV]; :mqfb JLY};o@ݤ[I FN!3d>7~ /Z#3xLavnF~G&_gj4Jš_5!RrGOpGP=v7dό/-a1gY^ *€^yNMU^1;F{x94/q>E77 :@I`vjEp67O޵q9 ws9NM%0yТ^pC@"=F0؞\,3ʼnfN}bBjoᰵrIK~J2˝ѦƭoMzthL՚D .ھo ݎ0t:v;s=}$ B7; 7/yv}t~,qcR&B{Bik'=@ OyN8Oyz"MhP\Jha^h{fyAꕞD"xTdg),2Y 'j7r6t-ָ^*kZ7Sӗfx=@nnѢCk^{y@w6ePwoc4hC zg37[#t,hVzl+vhF}p5sd6F>Ap˅u')hZ @SdF(IЦF=]=Íyʥ$cJh$>%0Pu{d쐝hkK 1Isr1NԻ????򪸽*l5OK_En1b>3{l}k]eѺ)ʲbanjYbSxdvpt2eLo񟋭^;LFSN %-2ҨOMVnbfdCe7 WEڇd;'|m܇?d3<~&] 8}.Rq3&w}CD1-܉9<%T7̐210C-jҹ K넻ݭޏ3J!orfeV1Z[8q}p(yהCb>&qtaA{-\}`3~shmVLOP6l*FmNl—-A[":v5Է&{9WG~od\h(SkbO{I:u@ԧ/<&~Op_•&esJ8{E ڳ|,/i7> s0{|by^\>_|}>% %B.E(D< A#~ ux$g us̒.*/~~ןs/yU^EG']5 iIuaٙ)!Kq!pKd#{33- U*%goaȋQM~N/Ebm8ͷ-k}EE)N_H*ǢC-n2ݍ%7OdlmrqW;d'ϐoq띩B'K}q^#_U|(r_-% >kCoj{{cKx/Dmq-|,3E`l9hA?YfctP&!e 5I4C$DEN \FBh:rfaL]HґnBn_7Fiks{{eubwn/M d,`)?SdrdB[t1)ggprf.-i CCM_',$;#Y"x?~^QT2!4"`cكG\34ɌvwG1[\B:4Ə<ÇcA݋WL4NK(O7ϝwB&>:}$"x7)|NOPr#fϝ;/pH6?_W۫o DJo,E](*i6m4ኪ=ҩ \4tPqHӠCmj(O#CD#9g&iLƀx?2=B9[1acJ Amh`-ù992ڇ,: #ۖom?-tkSd{m^U~m]L[)Oѳ# ìװlBj{bcۣSfn$#.OIat춨'z}4k|JS1m- rd3qcD͍˙ӎM$ysj4ѼD dqf% 2=W5E܃pU ʦ ue|C bz+^C9E.Thz H8=NF' ]؎N~0`8GBh{QYk 7(dn ZڼO}r6'v~9CWcٔCMf Og7C%u>h7 ˣ82㒔p$"8880h$\B$GG;g6n[$;ٙIh,Z{ޯ@}/h*4Ϭ1x]!WusT34K-,/!31"GOг7PpUlV MR|Db' +|ԺDΊ+SnނB>ײ@4rL(0k:,!~ 0u]m6qTOܤ)^*zY22@">kEm9|BNO' Nmb0{C@L( {iS/>}?'ͷ vs/ x|dL\RN' )`8XaikdfwE?BD.덉"nᚈ& v[!<`'0[!o~8ן"?uyh-{c@Ĕjƞ݅=DnבɩҾ;>u ]_~E; 's+WٖKtq [@f`__ka 9܍_bŷP38 4-&p@BUWuG1 )cT&13 {+/Jg vYZ xո~q$'8ahYO&=>̓n,0ҔtN:}v{*t$q|!zۅ{6Yʰ"?$>?;?S}7~e+z7+9|g rWhDәED(GָCPAC77p{.6p}usXv1N(=L`зa$8 ΉKdq̖͝="=r}i`٦s$4&_o$C'9<|&Hݠ>QkE>abeiYA(3ʅ)U-HuA]t>GqEE tof_C= ۧ03֍__!/~Mgȃ0]H87;F.-(ўw@_Gƈ5/h#̆q1+I|oc|RڎSM?q8f)&|тkW ְ:GV'6NYO~$#?ѧqXɽx |FrZE2^0ʈRx牣,F54F3$٨ش0""M6?/#.)M'tQXc۞شAL惩W siQd'FiCof亲QO,Ƥiiũ);EKJ,O͞Pp7WUhZ+16xSgrfCr^NwG X5$H )fL& z Aw[UA LQmh+p_'w9j̗|fjs89G. rº˄ ǸELH:5cG駑6jma-L OM\7? ӹbv0&OѺva6jeh"BK{/^28lmdpqi;8&sB@Ipq&~{0=6#̻U%* Y}:Agfp1A/3S4pǧCݽ 8F$1nzd)z IL*c(t :&$$"JjGRjG a&r& oI'3,&N=&RR퓿?Qύot jS]J׊x0/s$vq]l (B7IF:/>ɺٺ?ث Z"}5.4[AG)xpem#U[\ߡD!QCgdź:؎q#x1ƏF8+  @V+XiaO׍E|9gوD >7E5Ƒd>~ =ZYFEumzpP[':ǕK=."6ڕ\ PR̉o}v~^vӅ=Xj;`rm^˩)GF[٣~3랳 u>6ڋLڗ[g77E-r{h{]c弰ԩE)\Xx8}d֔8W{3'wSuV'ݵU%W0'F&uJQE f sWr2P}+lhբg)zČq "h͐lEmV ,ʏ̛P+ p ]G9]aWĶ&ƞCRuLvMtaX5H\7_j0'c 8$#Ocq+8OB@>"Hđp":]q_>_ismp[ Cf%{K6TH?ޢbDź;q\FijvvQ M_؈.oM>nˋ#]=2IlT?ӕ$5Q}7CQ NAFw3@ 7",y{<}@|WC|@2n..F lٱAc]"OGN_2BLb )Rf*5} 7&Y̑ys0Y 6f e ;%h]hK_LuP7 ^)N")4>,97Zn6Hי#$),.: oF;J|YcS-s7hψ?;{b.j{# rY{}a C*S?зw89>°}iS#5]#L2)W0j@tubmo) ӇoԢҴD$xE~#??;~O=!xqc܏x+lifO] >!B1UF+wOn98ɺZo>*l^;v;qw~fَqhv[Pc"G%C@ Cmؙ AcҮ\!_\;͐?F>`]s۟ylX6fe1zHl$pzIp8PWBѮɼ!bgZ' 8y ENl:z t=9{B>Ad6Qh~yWzxmSH慥CYs/.wy%2PBdpxq'&Z9} ,3  8÷47xv7Om;Ph]oLⲩEH6GHA~`I$.ѣG6<+N1[yaӐȇ>0qF޷"6et1*)IQPU78qxsҢ᳄C]3=>#_BP(ǣwǺYt_ *Iw^vdXqcOW/&(8HC!n>Ux%j?^q*l>_ZͤKhw! K+.֭hFtؘ3Ř,ȗ}#DL_UTWx|n?/|np C>w}ߏѹ3?sD DL#̊ S m@! OśIG׉SUۘvECu_o_un [p=zu)u6/&@aK'ah7_#>`7th0=>ˆql\+W֍VCeV$2H6AN!,E]+3 ݌̀/C[`Ѫ7~LNpgoY^=TzE٘5 fM _v}~"j=E4"NQpCcCc?Ù544e3=ǭ)rMy.2[A^d)}f.,X$Ց x¦^'o[hϾ! M1dj3l:V*~ -CY#Ok}S]E,>~̌ފ" 7&LiCk/<ڵ \x:ޗX8#L?ϟMV(fM0P,I 92d9 _o{?/,"7}of pފĥTB3۷8RɜP!ō98$UwJP븰}'njP%3Y1S;gC?R(V ""ފ,E.̌Dt|Coܢc#?;vf q\ ѫ#UJYi"w0ï}jX.g!ѯB2o#'AW(9;ODyآڙyx~a8k3f NlwxsezC4۟@7Z(F9{fKT[~sۧ}h 9=]]Z}"5zd:zCm,W%HhfkSn/XrËQ!i !@]qV=?ύ9ڑ%8.8llGykЌ8~<8raIjpq M { X&]|w]bH{dTȋ~e2\6G+BՎڎ|qD>]׷.ziw{_v%| ܏2xQ)Ov}ݟS+䯻6|wlgs&⍜QMf&l萛gFڄb7 cE4-7]6f1!~:v:92b荾q~j#+K,avVڸ`;2,M@&sxCYgwn{lnNKۙY"!XtߏR2Vj#WQHKKl/ +\CJXC:n9!$HDU9}IB-FUBCBfO=]ÁlkZB ɂGZiK3\ /iUΜmB9,͍wvܰZm5bLD}JdTMWUCa>_RogLF>C]nz;Vo\C'Trs|!tDƘ.}vw~/,--4A{$YۮD9,ljClE0?E| nk_ĠX&ݑzc6U({8MW5%>BWO1͎߬PH>{!_O+'[8qxo^$&F( ;2Br6mƜdDշ|sW6_ۅm[%1NPpFyG]ۛ9:|$ckFZFR Ф"Xߢ}eMW#P K"~?ꔣuzwkA2t 7>JƟf3Σ#UK,RÉ]_AƽQ#OJ1)K!.E"޼ 6d$STAC@%G'+#}cBSy`y=8(384/wH@Ap@ '=I IE Q/O6 .]Gp0~@klr?_ZgOOƯC_'.8$qYҔ[77@;g^#aK+W|G|k}rB{y{+HY nCAq$@o蠦ald^$!_̷㛐؏5H>߀zq%bP$7` $N!~~ݚe(<~#!=jk٩E?W n;f}H_LqEngoj S?O)7Evɘsg@`)JmؠޡO#=G O'3(fr=_%/H~nڣ.3;DF [ڈMFXH&&in0fshd TXt DgEF'򌸿@<8MLY-pAVPlYqF}k"al 2g=:{.df$f3sK,& udyY`|Nl_)(?c bL9FSF/KSX#!_<1q> 9zFo1}{9dwc`I bأbmOC CQMBo{lW@ |%<~ cq;A$A]st<]x Z\<5zێ)Ue>נmKC,E yuoS]m["O8?Sj L Y %,0͖*KAqTg\bd\"$Pi7Dgb Ƙ }~! =׉:0ƚLq#L9M(?;ht;뾟/;,"F$`m1){?O0Pj(a($AGBBIݧ'?-OxP8]ݻ~-^uά%[T[@w =vLq޼=ϭ{2ǝzl+Яy@K?|^x?K_Lr/>:38] # a#_w>~kNJ;fО[_bNC溿9)"!gHLg^w= ҔK>P𣛚O5Ztg3u:r }ܧ4{1`ȧqnhKq"~:ٜ'?=A~Otݒ#`_Q{ _1n{fS``"Ut#@Ғ?mrChi~m?6?]/%EȜ8ɭ}x9N sH[.bIlSً 瞐f91ROrh9ګMX"*]|l :;\NV < We|raG”aVp4A1:ZK/-ANLᆬΕ# ١:S8~33Af1b/o`bn1MOjRw^ᅣ Z]v-O oԏ"Ϡ}6g++Kib:(|KGh*qkne~VMieq\P<8/'1:lw7 obWBac!V)!}0k#<|GE)XSkBެDz ֟K9!X|a_IqjBW?HȗPQ%[RF7nw`GjWI22}O>[ASC ~GrX ށW?"焬h`bl ݉KV|[˙ѡ*h a;A\zy-ar6oݾ#=)┨O Jԛd;o3=ַmoƲ"d,PSWm)^goF(!ik˭ _s(l_44)_')R&Δyf&mLT#݂ cƲI*u᱊;[lvO ̱l,%VTFEk$rU;|nSy-g~1nNohϹۊ̴;#]y|ӀY|]ecxmL8du}/uclgvжb޸!SamL.щfv.k:{KX4|J?s=}pbE clN0woqθ"M=ScqyL8Нfv>>%%Vt|)aiïm?Wg|N}Ϸ}7SN1XfO "fIG]uq3tU\ȍOa75;3% چBg ig/L) 㠢8(bw3an';UbAp3![\R': yRUĥ'MYVŖuzO ܓlj×?F 5-Og~ϰ{Fjkt_;EZ@,w[{p+!hLD1V)'4s&DFR~ڎ2@*$k$_W,,O\c奘3f1;aƧQDMr%LCz"b}N( k'KY$3Ip*l b\ɱ'J[Qs;.Fc 2 UҠ/Rmi ; j 燺n xԏKc(pqDppؔa' <Boik[?BxUml{C {5 <4~Y/DUҒݸcN^^"/^vxTh/aFUw{bn_ay viaq$}%\uڻ[Bw Jcx6F:AWʲ+ l:#3ޅ"'2Kf_(ANIbV3l.uK2q~_]aT!{xMl~*Q;T<"Fx.>l ?<(ã#E$6gS"TC OLEUMkiBlx+$ϸ'1//YܸOlxJM+2Hj,T׌Uʮa*i"u2CZߐ'Lߥ4T~$_m֬_X5C,Mbvk]FV[دKhI.pVn=\$tNY$ `i4A`ҵY) 0:dO^bZ^[~*DVy(aA)u[1aNm5%حlCr. T- .Bفg`$Zn].%m\gĎãҔ~I/ˇgL`w7-4yY~{)ª_cGw: C/rwXUs*be^^'-yJDoQvXm'6c*\&8>ik? Mj~i' އ֝"{M$&Y1.I3vx_g49me:V6h )x~ َ Ӈx]0$H&|ʚjJmDU`h/@QvFq+d 4}$+#Xb*,FB$( cq(_|CM:`"js[&8[($ -4 =~Я{vOmP |;B9ga;l6]򝻄\<(Eslbgš/>kDW^?9KCǮ[wn!KԝBDsn.>9uX.!$3ZS\Q`JeW';ԃR?[ab=̠YB+{&[U3--BHVh鹱2Rؖ͢Oxޮ.gL =V-0Z- Qa)ak s`J ?:OȟIggݔ8E;#~EBP`%}|#231?QsxvpWYn k'ކj??8P kvx⛧> R&8[w^Rp%.kZV(!m~ As&|GMMO'ǖKbﮰB>j-\*9,^%6)##)t`4xwiGH[?Ň+H ? SQau,W^>r@mm 4AcKXȋC}OaN4HK/ՙ+,ح$r^ciGF:诣`41RW-dڬ;\hg|LLs.? 珩׹O}֟?v?*/|iU"M=gs<Ao9g%B\Ooy C dbS%9ƾij ׈UI,gvh.}X|aNWXM*]b+$#L.Ӡn̋Ӿ]04(Vfa- =9o)cYQ[!,,'Mw_*F&q'",fr(I {H7"59lVJ_j=WBh_K89^.+a1@orQkaUȁ=ؾWh>7ڣ[yV=MbS.nKf맂 7X{"\lv|ۄfFLx{p6)vu%8p{"4FOhҽi[luN8;=vu! ]#݉q4:“lG"XJWl:*Px%/8a~wU%aK/I7ma{Fxf!S!yRњ4-ZzӈϠ^j+ӆNl/4'18:=CWt76 4|q+vxJ,nB8$v-i{Esp@ !1']?kbX<`VK#1(g(T =gg* %)] _ ?~?} z`e4iu3?{ WBPϠcsf'0;n9 !b[ F/'< dBMk+ef{: y*w]RTX&6wk@hC%׮zb~Z;^|\BWY=Sw( 6!av Gq߆W>Ƿ#1evP~klIP),t= ?筠i+b. ^Şs=Dl'|{UQ 8OYz&gSXTM 5}?~DZ?E51ٝ%f k;yWaS@K=䍈z$ | Èk-';k Ӈُk*jUDl%J)(5;7nvsv0Ġ)R|ݹD zN*}&t9~Ln+Iels̙\=i=>e< 䆜'blS3ID`8:Ul ^tnRgSR9:&3_ ]6ذ?0< zu3u=}/H C1"ˮjfV;:>%&41DCR@\Ax&Lȃ8!4$rN;,xDVň7Ck [ꙘIY]l~$F3M@y_ W;8Ig+ r%_}ؤWWp~&Z>5U <{=O/߆?& bC(`N%ًX nǟI[|ܗoОp6kj)&i{G 6my/8FwlA]h']pr&%t?)xam^/ցqNMO%0 mX#c^^tv+wPI?6 _;`% fGlyDZz4^{ƏHL="\<Ք4[O ɔQ@*?G<7:v2e#g$YCJbvbVo*ڽY8\Gح۟DlL{~`>'=[wsWG'˙&i0`sq(xU_K1ebS,Hjd-J)D 2E L ;;8 զ`I>? ۷|Wt4i$:=̊z^ WQ <E,gSIZIEFbӀp%rXIg^K{XkwewuŲ= T A.u#i.嬃"YwahNb[nxǮQŭL37o@q *(~{д<ŧl~8œF!$|{#T !K~7:!J[jZ=y<`:È:ԫ#L&&ç-6[M΋t?Ş6oaXaMhmX& .awǚ}YC%&}q7GgvU!4́Jв[M_=#)`qXtAy s<q#3)6$/IMF&Û(u3lfa4,(3hsٟ?`M8e 9P_&?/C몊pjh,v2EPDVhCdqOI>/ 7o_`LJ k,xoaKVjCv6L,oKWq$m eZ-9:Y:< xQ O߅']k?* *m,dyom`Ƈ:k³%LWúq6[ZLkSK>&}-1yilEpŻ9vp+B7=PX{֢vH ϸN;넴WD Us1gZTx wꞣ4s̶Ͱq VU-|9"=aܫ l|Hhn]g&lowB&=١80:2Ӹc 1k̻CݾOsxZҚCB;Zu:"6ۿH(S?`+#XĚyn$/{6)0<~ 8I> &yڏ_lUISR[ (`ϓ,TNnɪ-?5 ]ONjdolk?;|wøU&K&f#|~PtLIx)'}a!x^0'] Eq;hvrUK8f13)خ"Va -k67^ԚKn:H x-^eP5>8!C3KayGs%n<'0>&N.^a|f O~55 1킢IX 0'ǹKB>9!b^۲,? 3}ùk2[MzY$ǸSӇ)K=BcIE$zaw?Gz,xBf'O#,]&ϟ/o" ٍ[Q]cuZs#b &<0u'(C $m! /{_~n!KWr3oM,̋cA Ju,x>™kRI])7!_8måW*0i]`|iKP:yqxQ¦੼QDʹ).xXbf/~nQ9a^C<:ObO23_K^̥n[,7"oW7`6Ï_zLx_>..go"%aWc[?ZLӠ{^`6'+|6l^׳Z55vp) !s *).kDU2mU5άUX).x+0̺GSW3ƃ334e^s*?Sa_vܢJYs̺M1MLCOeUP,rtY7|~<ƿ0w8 -o qˇJ*j6 X]9Za{'FDoC] ]aƮ.Ty UeZh`c+I@qj_v'~$ץI[_^#]`A%q{_v26jlh@W` ĚHQTegWb>{r5+DHp!m!OcVbC hf1CS&n}@Уcr?{V]`'G_5c*Е->aØٯP=b5c4_n}2 \ؾ뾲cEw?$8y?+m_}TZBm\7cALx}܃=7a'١sclGGi2JV~cn«WM97/cnKQ{FBsl:Law`j,wv;"equ. `rIQ(^IMJEmPHlrl$@8]%CgW !T^+CĖG>+Sj~6}#X?͗}OW4Ss-Gr('-#_i/\;sJ`ky,;~%JޓݙFcGXaw]nvXSE5Nbi-) C3nȴ_oy-`fFlZu B 1?/'/~ͯ76*Xmnǔ61*^Hyq|?x% Uئo$\n4Z:V8c:,(!T ۭ0$-:2s y Q;(w9TrD9,1aPXhvēWd =9ue"X%wH.A6m*AzIhJ @HrPjeٗvͬ$H+&!=Kz8' Ş4-|;O`ذeW9c7?/!qa؂7p̢S/А U[` nIW/`6vPrKo0;( SlGsꋮE> JNjop>6i Xȕb2`4crOvxldkAg(N1WkMAؚj4$TX6.=Kny`%{}_ظ=˫*ux3jV O+,Al4%/RƮ @0#-2m{HiGNE3 #-;ĪӔ[RCZb|/¸6!;UI71jXE,qï0,_Ϳ犧qꉖ1Di^ júogq,^tb*XjŸjYznYR!+5iGPn`zx=R{<]R'hA~:\ϰz!F|&7^]tN:ڙҢ+:14'1rƇ'uk$Xƻu4MqN ~+ sG]F{Wŗ5ejbk3? gg''Óbgjz>>Q0kOacD6sry.^ǽ&8=|]izM#[yF|e&FD8(L6x>״í.B^i|SB4kOHL19sOKa5L2o ٍpy-Yv@ו~ {-$M@VvyǦK'p{vb].O @Ł&nm4nk9vCёO:_,7$0=rXߓ˶NzPSg2U}ѷL%jioH\P@=fiB88<1b݄}C~ ?__>^m/Cƪ*6V CQ]B9= k~糰Mg!9GEo= [JT= F!b~侗N=ðtWrsߜkIPB69~#o:2D6JL%Vb;5»ݘ)QUE|Z ci܇H>PrYN wxHȫ1jI3ɺ*V:Ĭ2_.VE*.rQ=Mo9FSbLPa'7ɇ 5E /Rʞ!~uFx|` P_ibDX=PA<\8V'?5~)IcXAZKWpE_FMkwF0}lO[lXibbS^)o%F#HugO䥘wba9<-`2cFġWϔ;I,(Gi=}"kZ4qV";l|*~q- Vr Q'Xb-Y'ak0[J3: Yɮ<0IJk٬ѓ%{0rb~E02nɩ4'LgL)y~L{p]a ݌$hjbݘ }w]-J:P, 3H9a椩:!iqO>$Yؾk減T\V%z_K{A@jo[aFjV ۭK$vO4gkXCpu#HnʰۜYi!HčEa~+~U&XuL+չm^+':X e2YfA; ?#=*Tbhd}u?}mÚ`QG".J@ƣwd,v=|Ía7$a]-L a;x4 rXϰ(" _$ROTSZ]ۿB=ׂi 8:!V`D?EpxOZ4ݦ2 مuJzH{nsABf%[hEz 4bD2S?bn#*gxn^2 Ҏq[݁PBe\qjAu+o=nJ:NLΩ9zl&RxKF$aMKBBlI8 y+gFx!N7r )m!HiGa.>f7OHϹ=`ʉ&*~ismPSņi`Ī&v3BZ0|׿|װd4T'D@k3~ cI|ua 9k}ݡ)U|KfPU.S Gc]HWUb3B`55]G΄4+av{"JΚN{ a'xR,Nq]uѸ ʹ7yKm()-ׄ;5Í;p]>WX&\ݹP=i_ψjVXsKLŪ'l(̬DvqbV.u U^+!~g?zp&ax\dΡ9aEXޮ|x5ч2)v% a"؝[z}@=$W$nDك@찐4)9֝c݋Q#4^ɢ&1՞YxL*B{"Ɉb]:rK z/ Q&4Vˍ6Oj!䬒6 HJ$5v˪'䤄&V/JP\hƸVyqٔbZʑknkbo>bM+4a^9(/`׺j/jDP18p@i,4G\Az]o=,O*(`iOoV?oo?׿گU1VhAIhbddOa7o_Y?ׅmq$4J$Qi)WѾ7a^;nȱ.#o%rFKu x9˦ \Dָ .MkKGU M4%\ -~*fʾrY! ♺v׵nseXg-nƏW:O=^9v aX+IJ# dh~a`}W"lwS^q]҇4^>ԡ}x[,Ֆt6ax A-thATAO$Z&ҡc^ROoaM$nI]I~ګMO% %\pKbz§5wL%N5wK0&`$kgU[Dش$dխ6LΉ<a8u1ۤjl2Ջ#bJ!RU5|~Ata?_x VաXvn=G;4B(,kIoC|{hx4o7~iHIc1ӚNGa@Xju@46=P᪔L=oM)b*;W4bUq-wl{VECQS|JƔvv ƪ9`T}bY,U"#">ro/ bmtm8. 7`_cs%'MljQA+4)tvW&(  $`{2-4K^xYE ]se&0? mk%`6D ;| ח>ag?m*`%ƨ"U߀0Cu.?xçK1d8&=[/c|.@S# Ix$Jd%ʴ_5ŏT~"9RӴAZҸ&ƚjyĪ:eB|@M) &P5U1Pvf472mΉC=U nT br u~}7q[ ͌D A%Mk0+X|WOoz<o]2<뫮[(j`B00"A;9fF qUY!dCף(˱$#DQ%F$t->%[1l:\OKYKe9{OD&rPK| APEC%Kq|"g;P^G];!["m= 9E NDi;2÷ݚp~)vyw0J#7 4 ,;!9[#9ڗ bZ>쮰O UXLө{9̰vQR|HM%L\%A{4:@aW%w@bmƭ#tfi⾌ lVBӴ?dVjɴ1 5 nrG_SzJ/0;D`erIwrEl/ 5a$WKB!0`tB1=|vEeÖY'}|Z+nC@ü?/s8a! ->aM3Whi=7 7KSiK-3TU  TuvsBEU/:[;yړ*Ö GkN;U`] _gg+ 59gqdLω#1YaݽyL,Olj5.Z7gJ% i{UzF|#E(ں6!6)WV b#\ź!gdT:b|]QņlkSM(z7{`Oހ͹9 ^3yTAVy/0mfP.8yfeOppK{9M0U[MgJFQ%aӊ`]B`sjD*vXd>baZ'xqE) ^$L^?Pz9#-!r[|vNَ[lPEZ;Mq& 61 ?%[τNԎE7gĚ Yd%RA _$tԑ?LI<[9kMjy'D0 ʮj>_Q}5Ehj}y0Qn)^` ΰi4IZf%8xPOeLȩWa!*q ^WÆԏ l>cZ]i|YȻ5MÛ!Ɩ4؀HW?/W7q CUE*i$MMm ?C?훿kf`๠ӆlCxB'w3p-\ Ũf.6PU Bg`hFղ*'k}NY\uѦMVS*3+tWʔ q)=OsdC+h|4kZ% XiZ_(q œ Yhu`xƧ M7pA6+2]jyXU+gKWI*:,Hx1a͉,F^LѮj&@<*sB_F _k,+pf@ɚNU{lҞ0{Z.S$Ց$p7J6NguP}G-wR.+e@ Uһ9n8TwoȻZKV^1{#?Dx%TqGpp 08 9lޒHaA0 Knjz/46&19KJNI3+Iߖ⁲ZQY5:M&#*,Y[:L a$'o$ݚ,&ͻx6Wn@}zƽé uC*}۾+j XQRLmFv dB1]gGڛ&BLn:8T17YLWxs'<]pRV5"s2.U&Mcd#@*^*z&iڅUA.5efc\ik&?r$X|yLU=)}aXQ^l0]McVT"cںHO}'c&L\'-\~z5$0xScMHi/Nχ@F.W먒k;B$0ta8xʴ7^jZ~$PfeZBJ'wGqG0ge՞y}L8)g*w4exKčw韾oSƿ碍ٸ\W"IXD]b).Af._a]P a?JI%W)a+CLaI+ee1dz2&uYJ0=8Ҥ 2܋mA^~#t"I/xN%bx4"+}1dEY>y+,郈M Gb x߆}"?ֵK;1 P;i5˔2^EJxrX\e0%)Xu!1wdpx+BTvX cw~1~"~ݯר“`ǧ(N6E, ]Υ?脪cjXRS1x ;n%9wOEN=Gδ 5~#ҰUJ 7<[J)ycw&1 `[X&q|nq:8 @f)|xuFTm 7;Cՙ>! ߾#? ierCk0#9즑:B dqo}'nGlp- e DIM9$7ehn!B3dbOI^h>_ }51,% NOx6ȡ#ZyP493e,fX=Ǯ(y(n& 6ĺ> nqsZL&@N^~O J2nb#Ͱ+"2V" +i,vO4ႜ$۲±0Ѕ{^"ɘE1ȽҎj6A)q=H;9MJ3y[Ѹ3^=`ji_0 ckۯ<ǁi{ƸM.7 ]~6?InnYW=]Џ$!ǟO$Yؾ_%96 -߭g߫ZB.1z@ϭBȒA;ATúU"Z1ﴸFLAO{, XT%  ZX6IcM$mcAImX݉6{TjQN#9_9Jiq.8'% Y(UKBnǦ.s{-VXǕ+ꅄ@%=!>!i=a1a[7&IwJ{Ki[EPcw G7$&x0ɮril-Ɲekʢ.T D\elT쌧D9c"N>He瞋~aB<^&[X]~ |V D=4xz&`quʂ.(rO=m#`8 ߯ɡ"۸ )x-Tsna(2 29m UD[UU Oꤓ?BdC}+PV|}T7ALgxrkFzL{zq?B} NH 7TuC<-(G$T5_bʎUuqGrbJS!~<_v[I i,*Aa {?ˁ}vaJ&-D1gc#h*\=5 X(l6`saIOV"Thp z@ ˱ױ E/Ipjn~fl7vڗ%3Ȇ7c;C4bN^6+B݆}22_~9ㅦ8'42&-nm1͝r* 2Mgbpb0XoGZ="o[hn*uKX`.gg2Nr<)f `G$~Wޘ# w=-? IB*s? 9h!|~bO^gvtogX-rHDyEZk&VR30ӈkY71j\: g'Jύ_9;Sa{f Zr@`V鸁&&B5]l`hrqklJs K YA_8ZѼr]G %VA5KI+XFY%6Lgzu:`4TK|{> T3FlstdYCGվH|AQaH^=Ɂh&߼M[7:,hjǤ gC/#4CxJ ?|Z v_v Bԕ͜<=k~Ml<`9UTTC@l|}!)R;P^7fzMfZ#Jy߫Ջⵘ(+%b9PErؐ #fd*Yo);PҶB>-&k܈=Br*sS` vO TP% dHAN6!5)hf^^5VA뚴'0;ք=[J Ox}&U ZW w藓＀Z0_bd38-{|aCJ$0;)ޜ`-7kf{#MƸʴ;yAe ^-,t 2;@m*ME5/"f]lvAHAv8/"Jx]50R]͊9J={+ؾ'D5P뾜 ɺs¬Sgr̯bV~|PV4~]z+:ay$Lj0`O9F^ #A@𷹴^1ҎiDk,TCBPHL"\^R=\ }/ricnNW%\Vmf^a[~|OedF{9]xBCND??xPՐ&|6òRU%w‡wZd)i*SV7p:ZK6Zt{%#k)Bd Xb.N԰YP 4*E}J^#34s½dӎ@$>K܍y w%zN;x2x'sc+gUpkA>Њ==2T?ٟ!Ď\((;{ ˻bu[>1OGT,J{ cڭX9ߦ'&bʮ2p팴\p:ebb/z\x|t[$W*@VXҎc=.GګtlAa*O[B Xwe۾7:K!!V | V*i Eq(Y]Vh-ʮm.^~kP2\H3A{G$Q` VN8Ig@cbQ.N{qs m^(O|>])Pǖ< .fsFj`j:y{2O*eٲڏHK$WW>% o: MFDNVIK% 24OaeFʄ ʯva"tu+YHzEX3l^hqO"H(:WΪZgBtBИNmVCw$%1@dQb(:Vj%]H;ÆVL *a/_Vx!~C2;]˼+t0=PI&ŚP;Jfب WН1zӗ5Y/U!6E^%DM~{#WV9OyW-9._WOr*uir{*vzL䔊4wȾN1'B A.Hɍۯp\ Qy%+$lQfS!aÅPN,TRP~'> i e\VoPRpH˒>kX]a M]$< =Z/4mIFiJiEfP+w.!9Jȓ9o1UFrliloǑ wLÎ%3,F<}| Vm{x >~o[á.ḅ~UU*@.t7u- Jyp>]X%|H=T/;X_~|&uYSR Z:^Z7vߟaVk[|"y > -ű\S Jz<Ӧ0ȚYv/7A 篿N>aғvui+/;\ߡU%X4tocluuSfnrXg2r,ސѰJmJ'U ]q¬+ ޱ^LaGpeA LD72 iĚۚƪc|<Ç5ʎ70^uk5{߾Mx$Y v_^='ǙCu=OCÏ]IѨɡh*bK3ʬ#/x3Ǫ)@d .TMiU1[ΥfPFJ"vD< TBJ>7i +LOaGyci80kZdL?S2Pwyp]K⯃E MQ}O"6rxrrU1˜c|oR-VސED%BC5zSf"4 Jm\5*P{bѵ%Rr{E`LE/5If@+k#W~:AWHs]<פI ra7Q ZKptָo"hc}< In)BnX 2ȥC?6/Ưr8r\JS!*1>/\MxgT=s΃k DmsJTH#eוzcL4)߫VB%fn\BړC6=;% Lݗ.CK=΄,"l\ARhXsmCsnɮ17|M=)lVHN)$MqQp7*VR$ۯXSV~mϱՅsnjB_ =avB4Rs+Uc S>8"TGX bNϨr8&~a|ahg7sXvӾykkvlFpW<4}Xv]5xb Y'w4T*:U['?P#4P-\DeVNz&>"jI 73,Q28֔MT 7}DT*\y-ȱRr؁i(;U'HED R|_,{R@,#%& 6sX%=KeHlh k?$mT}[N1$m_\j|S AS[i.(W$wA7o8 X8 [R bKR ̊ E7>>f4;9l5WhbqNTuf:*%M B Z,UJ6[3 KROŤ9DeDL)~Z6f!nOq5\ܜM3~5ȁ&_@m[sxGDǨ(L"`0eb<0#{lUKH{,J[ڍVsl*}ؒWS#R5GLbM!  DX'nB-y8gpxHfϣ]_쾐盇U/ڹ]EZٿ'pgz_?Z؆]?4N: .r_l \ע$:"qS^E9y"7EI'  &'{0+k]O*2.]y/8ڧYsTP`6i[H; kcP .[͋rbS UP:XD]ꀟpb < $k`Uć\vh@)7ZZ 'Oȃ0 @XieZ]bC~b"¤b]>7M=^z< =ΥjElq_ ,Mrglfʉ\e3mc#ϝ60jrBӄY fMyʎ§VGBhknQB?K΀3NTCY=#kҜbmOOTcEHtԞ9]i?ﮏԄLȩMh &ɕP5BN?O[}ܗ1ZVE, &lL>] ꅖBKs}l䁺R\=Tay Ul0k &Yɀ侟[0h &ɩL~Te,a1dE@xD =dϱyW&9!֯q;|.`JŷE苰ӏ^+Ger~LJx48/t-vD󻗆 ]Hg=9`Z +}O.8`=zz.*)_IouTKȮݕW%WsV\vcƦLQMJP-)$]u]=3V^ŷl DT0@gyOMBeKCq boU$b^ z|#WEGV@r}݆KY%11.UW_I$iҚ0MW;;Ξ1 y*Kn'a; 5MAljŲ[=![75 [7*i [-Uw^h"NSwzFtG73]B abm۶譖ZJ`مZևo~ﴻɱͰf)#È]Q?/S9"_I2yA`[Z#e cT mDip$D2CעXvv[1V[h)垝lͧ$mQ@7 oU)H+j |y?1="UK=I. >c~;IAN[hEsYKS5ROS;(b5ㅰdF ` dLXh3 )Hհ::|j[m<eNP0Mb.Sh7#@}kS6tpsŇ2`(\0uxocLBy iOYeb((ydp埃 +|YGظ $<(Z^۲ R 0 pw&)Y@RB-\ }^lnf( AȚ Tx&F͸/Q)aQ1NA}GNLhF: KZ`9>m{<ӓkh-<4FB3%]/('h ו?Q `kdBX@y\ ~@08 TT@TvGI ĐH>F(̌#;'ɭ71Z;@}ip|^PzITKtsa는|,?|Lp Mn4&>)<!")I1yPHy; _)K}zK LϘu' )>GѢR$Զ0@ݠXܡ{ 5]c-9vkPl2 2" Z?sWh`Z3x(u-bG ??tri؆Vvٟ?;r#~"z`TfZlWos:qfokIHO;{< [gʿ}%\@{8d´N&+#v^gH?Ad0֠T%IGRM<^r) ݀{ g&1b(ZU-Sᤚ|Ⱦr/FC~ YHo8HUx]c[C>[ew'?cUH"3OHh)XE6N0v<`J'E_D1SO[Cc8 Rr6zW *ax P$̏ﰼ)O8n[WwK.UX+IR5¤dg}όR' 5l>?*S]6 vo&`W==] h+5<P69-;hED0?>E}g -[vC}t15#INV2|Yǟ"wyYcglԚ̧s M(Z bևP&a4iWQEi:& J*( ]K~'_.i"uɺ'X_+.#8>CJ)"^ƍ(,B60!P$%*) `v9rx×KwR!AZ'DCѠm% z/a?)-gvԉT?~fbt- ag4+5>hz)PQ<||HGR `bR T"ę1XDnS#,Ud$lG:D^Y 5 e9Zwl[k9MR)mt79T:cGx;"t @7Xu;z\(b xAG1uAՒT ýEAe?An~fPkW ?p{%c|+N{m!1/Hi) g}tR5lQĕ\z y6g)h iw)eAgh]`'@%a|B o%OsvYSFRŐR}?po2*[|=!L# J,LzBDK 02GhEHabH>;;ޮIS_،k%0Tk4;=oTo,HJ@CY[q m" #cxäȣ0%!) Z^\ݐ.h(@zL €~wd QlG O/o5_@q^BM]Y _O-ԁo;9uY(p l9ah0< ڡ2?*bjԯ |%p#囈z΋E: ޟl |c~{ {]W-cZcШw&MƤn?r[Ҁ<@8 ms C?atPRgr l770''Wxٱ[{ls 9|绶r n`P޸ ULcRH'8}R29yz C*%h?S40nRDhB E:i3Lְ~H3O4sdT^ōQ\ÆFꝈ#_WݴkӁ|?(Du,Gэ5fkt3Dy?#L+`tO̷3@xk "ndb!13ЀAZ(lBjb;ix`;{Jip@@U7tr̨E.rKū0_Tb'-$B@4݆"4:gwseP{Cp:D2[l1Ni8B#E*Yc 1RFzG.tVUK (wuM3Cg|6#U;q9;ʎT\6'RUÖM;sa7K{눎MRvBJ-J6O(g8}S6*.PĮ*SDB{m>|@ ~c>~`CNN^3v /u0Oe&ܻYP6N 2p#w"{:dy.z7n{X(Xr ZF I8D=L=P^3Y:dDZCֽcw{|;5*;&'L34A=A;xcl4'i$(~ˋ\;|]wؐnM&e߲Φѡ!yȀ5OpȡKp4$h,[SH;pl>cC@87cx, S6n!s41`3>P<,-_ KZ繡T |ݼooL۰ 0-Sΐi_:|#S#֊>?FQg1XlwW ZEzB[OܙP h_w5)N9%:#?l :/"kqM#>)PpzsOZ)YJZq X %xwfBI>C67H@7P#Oˮ>7P(SD(”[ 3wg'4zS$2xH@#HׯC4RC=B±BzgtJ[Z߃Fdw@'2&D爽_"F\zV DI@ QOjb@U?nP(D(Kt"0~J3/0lGHebk|^6#n±}ARt=<ʱP >T6b$29-mxDx}8m®O17vl  RgLt9$H!".NٱwptD`tJ3v䲅ĐୣGv$- RLM7 򴅔 EC=Pz |g3>vlvurf"Jaj'fآ@q4@J\(PNf^a=3u [`x G| sE嘃RtӢ&3)+>~Kn7W[$RLH^hrKIT胔Q*B ~AݩFzCgycl"iGQI_tvO9ջ U!B2RvddϠ H~CdŞ .cIsПayXaUj_cČ J@K=0\v>txOᇟA |q|#~VvwхBqRs) ^:]_=B(oa;kXy|T!"˫,'tw͞ˌ<퐳Kӆ' \ P߶|Aq| 2x/;6 %qX #WF} g`7yUȸ/q{:ȷ$ xN N@-I Z%),C`TM)payp+;CP_+; ^FbQF7 !{ !"zÐK@|/cȽ$kdQ؟Θ$QW>:C EA\.]-<Ӗ]qkj'xҞKX޳H 80HIpX@LNK)GN-Aђ_s,Wϡ`l1ȯ by=L~q`7Y$'~sQ (䗜+'|`g`@\tk31Vm=<'zCZ'~_Vf #5A;yV琛a#R*޸v9P CWaiMns[:xt*7>%C@7r:/.iQXķxX!]Vi y~zT8)@2t_&Hi Z #߸3doJLx[3 4mvoټ{ݮaL]qy oDv$i S@ w|{& 1ƌ[#4ū2zAcuGs 59} ;bȴޘ'W t]yh':×#GD+F0#$¿;]P\_{{Iz)0b?ھc ~oh_ H ț 85vko D3ayƄ˙0\ }`P€\YŇ,j~V)' Qm+˽1Ie9h)jg暵L +q.>1n'mz!LX V]"G򜥱?¥F7LijI(@,Wyv]V$o6_;\o'S 5uzܥ"mL3Yw~/G؍B_Jjf#z}FWfev+$\shk]'BBc<1e + _.خwKt8ɐ? Hc\3|C+x;A#l_qw?䤡w" $/k>=j ^6_ f]>-*, Єzq5{Ѐ 0M-;W\/L7d~ :S?V,`>HkE7б 4NHfߣ%숂c?.)<.<|纶/ݕWgȅb!12s-9K!i=o!NH.:=1iXC2sp=RGڳ![.iX # h3t}8bj8t},e-R"S-;{%4k_~(0k'`CAi!~3_5'o,P>úXTq Ky;:@e*d>BVeDJ{$J?o'J5v)A7CIA  +TCTV%zNA 7AqD#kZt :T8 ~FNg$-19rJ I3VN'%}ƮW<3H[ 2qP} ECx/~V"pwJGJ#[PA~ 9m :Siu oH:0PV~=uA჻ ]-\2C,!̭4A'zC0 mxݕz)VasvZRIrٌnXѧ'aH~hvz([Z8(Yט6x#Xh| Go?, q$`R؉e>ds {y9i L+1hb3\(3>GMaWxQ~ zb-wx#ΜB5%(Ws.,W!WA% B*4;8LE)3Y?;(*=L) C/!iϮ$x H0cyV0o Asma֘twh&ėڡ-v ` *^BꛈuPy^2vp SiS;@`c+;"́a tXrIEj_ zTmm^Q$R&xvI7@} +H3v`ۻ{pGp@ y) +yM7hBJk\h'ݷ32 fv9Cs0LX:C]rZ7{thG0naB[W!譡hBX/D;eO )7|>o"LjEmW V9S7 dyeh LR$wX쒣xxQ"A8ƚZ'X/ɒxB)b,1-vFbbE>8Jctr[1A93 39GxsBA;wS'F>/?v6 `LNwpTf05C0A`5P$bRPa¦ † ͯa>@l6|䯲n(G5vu 2=v _\!!C{9!yKr/+Y>d;sY1#ǭ9)ai+ W A'Ln`g@y$Pb?ӧd?{:=CRCLr_/Kd?>3յ9tW vz{ U \0@6/"V ~>S=K3XL0JT~^ axrCJW^t¦"<Ȯ3TkcSj y"C+TD[JE _\`kDC~|I4٢} v:clZ 5EJ ;A^?ɰ$5ޡr ֩fBI[+ #3R׸'-G q4X)My Ra3n|_Śu{%#Q&~,Sjt92/ouډ$WQF~o iy?@3m!3Fo٭ǁao]$rCwؽFІף!m%v{4̠ 2@_ϑ ЀR 6[ זoʀefB EjwfNjK}\cĢ7 ,踁|H =m+x*Hl~q*3SD24E9Y|vh}8gy[uσ h)8,-|}ӵ<r .#3˙*D28R}/ V\@O evZi4Ɉ)F793ށdޗg&).܏vWN]u}Û[;|h_~L41Ci1(zJ R ^:N_z[BD wBL_%YYukL)S A #tTchOVIeJs6ן]t>e@kG | K0zo`8W-Op;F\;#?waJHwId]&Pޠ=0qZk0;f~BҐ?p~ vCR8GAj.vm0邏`96KJwI/O_ b? NQ+ޣ t>>CJ戥?U_J^(38 D9"!@fh\0>:I -(ɡp`6C;9}BpƂ܏<sO~mNF$1{Z0XB&F✎'‹} ıRGCՄn֯% }5RE -o(> ޡ iyv( DGHzs5z~Q'[P[ΑYC6C]iey 7#lt+|QHio8`_]`[($ 9-,-@ n-|i>A@vzCHs$'s ]-; =:HƱ',Gt<<}OwpBd9Ez,s&JTCojoBėGHi+,hN,ܡ3|nC7;rmßGO.ف4LaҺk$0;.#-һ¢HB,mYO3|*SAA7P  H5^ BuEՕ]R2H0.M3q@话}&M7 NwF @% X9v>{Nё,Ӟ!,)NkHNtdNHN‡KBD!r M$ؙ{E|(xx,^QM~#|Tx{s)i͂V\˫@M2% HZ2>@}\ݐ]Pݡ+ g()a-CWDJEkkaYe7B;=A HvF%^B3sTHcPO>B:%&oP{ rO+:t=3}"#N/=|= L@B'ܲ3 8|D+0zd[4$ho! 05} 8l{8ѐsKL4r }9"M;ϴ@2fΰ׼9R 'to _7;Q`ʻy}'=lt5|f q@y6t`mR%FKa]SASs T'x]Q#~b'%iHu 0bl BfdKC2/8aм+CZzC(o9T8n#J v`ayx 鎦P/BD2a}0ѶB3/[+`~Wy(.̎PMpHH␬aGwaҐ }9 b` 5P=S*R 2mFK \;ցt7 "VY!Ka iP|>r;>ay b&-="a vz!\` wHK:RxykK7𒹯ʌ=x]X||ʝ|Wk}NP8j+;ud{/<)'%1%#-|q5H)|-g6G!JJ}y<# #Y][`>Ž3:X m6q"j̈́ӱ!A}cfryM@AH=QJozIи!K€aጤ/e6LCN(*wrdk 6mʖK92re'iz D>CC`%}ܙ%*G9LFSIj}qUkL$k \J+ 3,Be-  iˈ4r'抾|ͷ k(HI jݖvy{ 0U+D,p`R6T͕=!Úsv"{sJ0H0p!A#>I'<t=u*C]K:RC-uAN@GH±)~Fl>G2d1eCs+HGo90Ia>_!;y*ƴEH*T0$8򰻂=#oLdRG~6~+) D+:lt ID? )Î'`]8}]).Qi QoןH+"6_V.lEɌst5]JFTj6vd9f7g[Tz*I)DjYgЁ*4p\\.m R"/u|#BWL#TAW5T+%\@ܗx0@}(_"4N@̙-З:I2@#ADШSExwϠ7储@?|\ N ,`E6`em~inYX' H- t][Rm*][7nveGhDu#WȠȲFw*{xIM̖e!7Oo Ng@Uaʐ?}}KoV83cԤNVog1)90O==D9% H1LG|}ay3LJG^UАkda/#CLTŊB֘ؤNu-zzUQXed- Ct' ;:r_@UaI$ "1" [|;=u~?8|[oLSr~a#@zz9| !M$790ܸw`@#d t RdCIp9Rޥic4NIO`j3fmh=r*l}n 1q@4h467xD,O__$':8 FgwUH ]6~~ ^F27X579|~ P!rLlW$%w@y {" |8au=Q?2֯khu dad;$]9R&vHFמI5~f:u=)<^U ߵw1U(3?IF>g7z2+}ԏ؏z2nkH;^^ߣT YI9 j"h]@4ۡC XoV{ r /dJZ۶5荣jщ3pωHtVs$/ޮNJ:-DQ(vxs$`m,+4' nHbfv**)3_ 3v?4~}?SQuuc" w[ϔ;㗶x|9.)ɩlKWԙȍ<˨_@C*s(@DS8h2 <GhFޚq~ǖ6CE 2QNO1 ǂ>S_>Cg4Vc}ؑKVV_3^˜m-TWjʁbi⯨`+Wi@_}9wOGt"举/)˜^=My kGC+1aaIo9-  q닱-AC I4Ì3ԳkDP7V[2/-v&4 R]#rr-/ݦ\ d /~`! U7dIy#=E.G_lB2{1pg9=g`w>xwCCo3ĬDLT13OU,\`r>|ܧ| =m=5 D@wp79Wq'#/)UH Mf2͘vM22nXԂzejNG}Nwwc UoMQ GAKg~H'i2=@ z Q̏|omrgtć9mo' UvE&oXCK R˞dybF¸p` oϦ 2]u?<ڢQP^q39qX:ם|#k"J,Krp+ e(!X>;@7<DдaHkSH}t~~-!0~ߝz~ .v^8.kn޹taxt 1l$E_XXU4 `k/ mkI_#Y~)H4J~iYW@=Zܪ{xR.*w,meK Oj#ȶqIy Hyz4WP)R~nB1‡MķI§[\9mYgA{gѬP”ԭI+L si hu )e CGNK 0Ǎ觯8ǿ][U)"3wx1rͨGXqAsZȀF3g4i')au)G26CB19c̛ڰ lTogu)W\CH;hvIyICqk2q|Ԃ1ƚ w'`|FU [I24x+EAˆq Ȁ3yO)м5Kw-,aRte&=-+v;yoMnE&ᜩҝ$[H&iNw֞Sj,L&G^ @zo2=TGK[IB# )B$YT$R1t^TMw$ uA20VC6]ps<//m I_ȸa: 8UZT_ 7~- t?:@&{+t3gD$ `k/1,#d*=d`sΔ2,g؇|MLV0gf1Dw?~&u~ܵ}؄# MVH]-L9ԀFDRiR#f$ $P\M୾{KТr+wu5 ,ri21`w'] P]Z{By\tC_Nv [X9ibqG*J[=HL@y;c @OθrC> i%iC/ ݍn3<)Yܑe&`c}vdGQݥT:;$id"K $ð}uΛ%1wL1w 3#Iр}{ y7e۶ۑ*Kf'%C9?]W z06aiBn9/2%Р[-q?i02@Z6Dbp@cBkx%F:-,8ߺѠ-A0#l&"v1X3w63UC#PoIYOsDdF/ؑBEa$+ؓA1 wQ `كh,bȜ{z&@H2!Q"_[: )#M] XWvs9C>:)NwS{Bw鯠"/aYx#lܓ'&lev$M}(W݁L?dg#f$֑ӗP1TRTM*H4?`ݸYX!6 1*Xw!r*Ja,T¹h^HPH=R?CmF=sn1 'Ƿ1fc{!~ `fp` v%+ Qyp=fD'?c(t 2)@u_څF-mblU];*XJzc7TA<|͛-z-=)FIp,: rzqe(Z[ Va3 Wh0p-1Jۡ /ugi- ѓ(V?`kL=R Wz.{Rxasc/#K^Noї9vπX1@\ Gx?S9e%-3&>ȞSxU3MM5ށyѰt6{D&rF;іXÑ}eehLѵYwNWqo(BD]H7G#&$} J@."TLd *1a/ . Àyx7H.!xb(PBf9Pև~N^ iCBz+Hpnxhy$2(msO0nqv9e`3>P*E6x(]ʞʱ½X.q GsYtgp<揿[ǕBjY!L˝; Hc2R20ՏDZ:`ς1: ,?=M4-J5Y=/S~ i|KHpxV9Ln;z7SM:)0ʀ4* eeRCt!%Ƃ@2:y#(ۧq - \ς eiC˳,(dPkRx#)|i+9nTD{|͉nN^=WqdDȜz<6 7i $|-*m/;_|0\%lpP#}Uxxx ,u佥 n!}3 dg~@ ;=rq}hcv0|P =>E!q Wp;c"&׫*16 d!9:n ը9wG vz|ަqOS( _RN~]/ ~1_i\dJDpIU$]WxH#r4ؙ,1hp|Djix#+> Tp+gd T+&D;H")K342vdH恁(OD{)t //\Hϙ}UL/}>ufocQEai4=slr o' r&>3 Z=1A3X R }Y`HJ C^%1O[4 ϐ*F!(Z aOp6<lVzz >oaLg}C0B3<X1]d̀=q:EAiC.הz]}>D@(+hT :C _*q0*&!-#F%R}aQ]=yDy[^?s5fL[v|%CqB{HöK0 ѦR IyB{;OK%r 958j9 5E[CA)L1T&Be?oHcǖꗔow )2\! P_ex1C5]Ml@WbL* v{m+oi4)Ő襩-J.Ofޢ|( B#Ԡ>$L3"]!%  Fcmژ]^ 96SDZqФ JPߛZXrA m4y'9(BWfaok*]kaπ+GrTet 0pO 8Yzi _ `#HZ` '*=X@qCeQzDN_>VX=B (cbk e9gƙݛYcA7^%T}I+'rMw۸BR;\b,, R˜?yg-)| Yk>;E^6!3d@2ڠe@ Jz3OorVG⋫V֐ =x*m'j6B.^: mOts@|8>3.篷C PRfar@ Ӷ b>MCS L_W q>2nieE=A 6gˆWh/J^3pAdl9||[X-F&p%s'5uGug)ϗ~+wS}ƿ?;wX lʈOr̷`m3 #: 6ı#h s38# t4@ѭºX@^h&g!_W]ޮ__AC !T[?i`G!{j]`^Se2>ZϓT{> ;KXr3lGkWR#X#,nLeGg<3 4 +wن-[9x<7@$);2MۉlHsi ;پ}*l _wٌ?oiv_U4*rHHi^xh!U*gF.IxQ]Cp*) r܁[2&A6/a9(^ii_aYT~8|9cHbOd' _O<3.;7חz\+ `$^`{Xl?n|%]CŽ $'$sh-, Kda}DA_4?H;;way>-<~b)m/*E4߰(}gu^L$(3G9Bk{pđGٺA+9ʳI PMLP:R,h") 7 t>JM Q -!uaMM:x!OY<q&g$M{-\hpJZ='%`H;twgb8&AH Vf,SB0?YSx@*bBTYza1w!U7f &:!KʵƲ{a ;1yz"RԱ~moE07YμmC(_V52x,%'1T=z1X..#͜)3rcv!WfKy鑴}Yдc삶vD9#Pq4[{1hel'h[xL UyDJ[ 6>n `C\F/fH?Q&-AR H wgw8$c9%EB\`9tZb$D)8_OT=G&X}oyu}15Xf|F.e UZ6Ⱥ ߢģt,Tc @[ЖmM RХC PB/y!2~4tc'v%29R8sh->L8k)T0Bd1#b峠" 2E9`{/,ZBٛxF{B'h(U+Yi; %Bv0ZEH- r޾`wz 4 w2s-J?culATUxh |s ?agP66AmMʰ=>> ]@$.;ݡB'B7ڐ{J9FfO GI=LTTw,N6|%an/@'o(w1[cF-'PYȐh67hly^Qhց4B ystea[ +G 6q$Mg7 <8ݪ0*, 9-L9`R+wLA61e%oן/pϖCcJHb9~kLu=PvJK!\,!x1v` Kl9Bځ kYGeAJ:d7H-$C|L+3EBkLWL):'"WL3^"D&` d]-gAڄ#b,[%׸]ܘI&tb409$H&uDLӁS"34 'ȿϯi7?7JU|q,Lܡ%_uawHjʇ+Vc4-qll=3)HGh"3J.BcLxYZp/#"q]ƩPb6G#7eRmW `E7m[hggL40lL b#;2md$ڂYxc[=Gr!B ^ۆcGb А;JwaQ3 EMPr K{R7la *bk'6 T6EуkEΕ s$J.M﫺cy:4 `ni?PTn%=2r+WkB`/ / @o x߽{DvB_զ-|7WH%5@v<, "F nho3f~s).a>z`w{滫RhfJv'~vsUэ񜸿q#KN@yq&`i{GzFۗJT}8zfcr59$ʔ x (n{t;cKwz*-4f]XfR3}G+-#&$b3x#.GHI4oZ ^) WR`KƱ,Rqf0\i@UW@RZR H,DXKV% ]J=En+(W7it "#@ k@}ndT "݀>3ǡNQkZBz"T 1MA d`v_;++Œ?t; ـ.U\gPĞ:#9kf KX{B=?Fg&`Led|QRN|8ӋX<k&IXբ ~=N/!i` ɗ|;Vy Cqw`Uz%+ >xO93W.,p&D|T>>ÅCʆr\?$d? UOaot50sty)"*?I3PLe)#L2twK* R]Uy&!Mښ )({szpH`90l$L7/`W=V{K#aΗ+ؘC$Wwؽ1ht$ s j[vm&+Bgǭq@16V}-ܟ`/C_}~#t|ޅԉOG0xTؠ0kN@AJL J,gtH|^E#w~N!HS?V2V=>s+/ lTCa{9M‹!@>R*@ c<lQF RpLf; x0#D:"ub#d#@2lúv4u*pG䴣`$H 6) Csp>p9 aNyc, PkEE7d(iM[81a ̵k H.$@7e!2wԀA!{z+c\|.JWT>66>J mS-RU| &`'H %rnxxSTܣL3KL؎ b 4lc&G[ZT2_=/e]<|%O>]0]ѭ [fҚ`)!Cw.–# ա.d券-_Q>#' ͅԓt]txyzmv@[w!IvB 'XW@%SINI$h\:jgNq"#wB#—¾}1ƍfq&r&NlcUJ;tNk4ik T"kHqB*| 6I[(hw 48B7vmG*}xր'$L;2%朷,:@ /vzi`P"S('H>JD9c%Z)l'chNYÀߙKHE@ŵjv;bB9;xJ@YydrSOh*r1s㶇  ,($Coafny9.6~Xk )Y^P-J¤% ;<@!̎]{*΀ `<<% Uzd-P7KG t@"R ޹AQ֫Bw%3HHY`9A=9broA7p ?^ I%i]"FT=s&y*z$r .?'?S/6}zD)"~dGXQy(~ o uc_"DOԅ벃A@3ʄ^͛؃2HKx9CdCWbUyk)ATb }=4!/>@T.+EI}Ux?1_ozg 1xU[Ȏ E<Æ{gj3Ed T[*$FP ͐tBUgR d\4 &k 7R(=i)JmK(dx+v.̖ɼG)lfR)Uѡ)cFz0 ReZZ"Bv| D$g;l8&OTz)n=m` yˉ0h '?7/4& P e`ҧSaƞMR 32 }ʇי p\)mO||c lq.f@P!-!h+ qJMwuN QHn7L62XLkBaDl-FƈX >޳[]_# Gi2l=9}& _ ,(3`r~\ SjP^4oln՗ՙCI6Gœ"4ނol<+""9(+Li"|%_0{μ̸@{'p|dgb)_> m~b_)!; aKRf()p`e %ԏB`]i@o7P@6k2[TzFoѻ#M߷`\(,{]``^!d; ;Jԕc/eQV1qK6#-|2('>\G#=ghiJJ+WuGrc[ȀȥS2kgqo tk(ƚO4TaNo6RZ {(AcL!yK&DJDځHBOe3PWXN\qK.3~d_A M9^D_eCO߅7 wѩܩkdĂ3VWŸFIwX f͑#d;8.Xه, q|̬'L Pnr_o=3tC_jaE'Fo|@PxKA?S # >G7`<~MIPi/83MPXEuꁈ+3lgHPUz6xHQkhp$M72:ܥ JE":CB |)Tb-aE(nn u7b;bP+H{jrz/ -,MR|U$ؐ ϙTҰL<>0=ԎHb0VnB U0s@t "gt7H[!jz1Sak SVD\4W;j=l0&eؽY_B€#;\JqԐ{R\/( ǒQ{t3qlEN> Bb4\p=cKZe>s%al dP 77B`-4T X?WzΆ=\LRBDb\DoB^k zH Q ꕦr@#XWjF|NڸQ޸+$xQT ď̳M;QR|C}~D zDJ'(;SIh0QxҖb4zk3N{Z5pw R0pdt]iGŽ м$Li>@~|&]RRޠ3' bzq4e ^@"qqD#f{nbk1-)'^"@d^Cqa)ótQ!:Tpv%vV d訵k*4[4Cbrnϴ*l!Ϯk}HV^&k" _~ vkB/WF"bg9F,$>H8wo[enSlNJɻ:pYi[0e [ (T(;r!uJOQ{gh#s 2F w% \3,xX|K⻭G_T#V V#6k塷@[`OgN y5ҕ6L_a-X3MtZ70;\qf4+=Qt lƲ~Webg[[!/1r.ou~>`9pV[KXq4O 0O6$h }aǟ}_w@pbtol >$~Vm{e7Hcahu:#ʌ*5sRϸQeJ9 a 0lh7SQ9|=ޙ)BaL1]rX7k47y,Xb@͟ ۧ%"69ndb\EW@呍&Bx E3g(3?\G06$r˖fl.FXZD>.Ou C LLa5'X;f8l>W # wx-ȲJŦl4zqdsB]ϰHؖ;!WA7 =`JNf%6 2W^n C@U%JDG "4w-Gn82 ܛ-T:`ڨKխ3Dols0 Tl`Zˑq7]WIn'sϔ!su2cCAY]pD*Ud4zuy1%@ʋd,979ҶX0CMP-D]qCNHh+<EEH̻Zg4Q[`meoc5$&1>LTZJ8=չa)4PggY Ո=.M}_Tu-l+%AB PCN!"KTv[/Q#f~Ku:`0i K?@J^3P҇$Sfqߦ/с;+;T&XTE,~.[|kphXB7g) - n$%Z0Vx w!vCg@{'O0e[ZQb,*poH^Aо Ỳwށ4ԽHdwm(hݯnۖ=9{S;"EH0UeQp, 68(R$.8VHV !SNUZkc[ic]`SU[*s^k~%bf Ս1@ћ~Kiٱ& -0r_ Mi`|V%k l[!kXnA)@Y~LþFfq 3|9s_YJ/d]!Dh*ؘO KI 8FG`@7Iݯ4R:H(Hq0LvG3)  N|X5~ޢ!TxX0]@`^N% h1joT4:)EA%;63uG!bEPDtrI\o #o*Jμe2ÌKf9o`vc`WI*Q9f±Q \>gtcA@"P1RaS{CcܡRL a,waTF'DWfd2$w<ҥr b oYXrQPD Uv|K}W?ro@eP7 M,ZB+=톱=|Vz")V8VVPʮ X}[!5wn(˅>"yAX8qJBbLW ȘXLʉc:! -®J~:dW*>ÀP1C\7vK!)Yop}RoO;(~M#AUiv0Q(꒞pl;qa"XnD>A4m{78Hvsl N(Yg&3t:Rby n?!VXqNt^+)Ri,'rhP6\3ԃqP:o A(߰LQ.Ta!L/zX~:(<hT@nDFb< xLs6Ւ! BT!|W_';]E3ٕ)kJڣ |_hp >LL} j$@3 H0m.}BDJ2!+d5:MᯈavA@0]&?튢L`)1i@O{ڂNOP(||y8h !e0BeW0E335hD 5gf*&6eNGF6·hWmq_:b`Ѿ 3w#{Ԙj92wk֯9<][ juK n _y @ :8ޕqkX; A c:cyR h5|hs1ߍoL/>]i|qҙt,7Ivq[ TdN_vs+d!ڃMD*`K.BJ2`[h%>dwr6Jd!Ob iLi:M0$,Tt ^Ѐ?2?{3_kU`܈ "d@|eR21 `gzQѠv4 88!z"躜uswH_|0[:,-ՊH1C_7< %ۆ6sυ剝IQfQke^V F&Xth~gtR})sR= ۖɘL3)s Xǃ]duKe FFsH-&kύcQ^"RR=ʃE 2m"~A/|å >!;=q$9O,NܷL=̼&GʄX؊=u74QT3sx%=bca{-p-^@@q@Nl?T(7fIW #UzȆ86#ҏFC;UTBq 'eNVO&wܡQԢ.AGHyBkd } *8`^V+W֒h@˙4;cװwB,X>}p\vVX}O%O1uj} *NpT@"|NԤ[$3*K!zzf@O(圄s_!-Ǎ1}Nnp&EU+dwfzb@Q&&H)!0RE=(q Ϝ" U LQ % IS)Ʈ\$0TV3a1"h8&7x-FH`Y1VvbH8M}fN^PF2s\` ן`Y>(JDFonߢ/p + Gsdkʠ1rau$;Qb3^cH|v~K+̩^2&-fR@=_{,Emi̎ۥ2"qq2MP?Fg1dK BJڬd:M"IV̌4;6C4D@+'aeh DSC )a&ĈRG9Y"$m'q<^wW'KumQI{G=[%,%;r'2-{ NM/ w Zv'`+)0oፁqpܢ eܿ+tteX!fIjZ!؉7 Pv>R" QyP~P=N)Ap 1C{^]? $fIx1Q;FP 1c=#vA3LJ;&X2 Ղu#vC8iU^~F_?+ wtz - :LLxP+#wV !y# 섋@)Pm4vkB5F*|O=1~^QT2^@,skMhr_&R * 'X=,zo;qc㿝ְr+c 7a*d :wg2(i,T'&${D )8 wNg ] 1&ߙu{JHufr@P׀#V"x XU8$3HBa %ef ]ڝP5"i,g~ BվSN@R1 :u*P%$H3?fЫqg}KIiao8>28 Q0 R&Hu7ϰU1b_e9߶_cmvxn+$VyZ g~KD^bB,TXB-H.P1捙R;6 I<}dgtZWP 5%d\}['y,;}k:2-pDDoljTk?U1ws(K4UN ueinP[,O2C(*/R:.@߻_a+oe2WvF/"'}AlwhodkGJ}CF(-pcl0{NCwÇCოlKՏxgYg^B*xqgrե^=f3rbmSq'R7DىUo\uv%E !<$]S] x?mǐ, 镫dђLZ?B' QjR !ϼTxp+%j3<:QMڙ2ZcCx#Bj}EvuU$ǠW.Pm!;r 6'w@EBl-C Gb^.8`x-zVDrim ؍;C+#&GDtHcvB%VɍГ gM)Z2yW~K0W wLs(ˁӞ]P |%l#s!*K4Cp(+1UQuޖ?Րώc&5-iAl=?r2A诼kĂ;.tLnrB0=qDO_Cb42*B_8T`f-ǩ{FuN!CN,hB\$Id;zez]RMWx&:s|)rp)PlU(μi{aA5 'ASRj30,T!cl zZ"W3< aV =Cjtmڕ_R >Mv cGyf<Anv.fjK׎1`5S& E0gwhYĞJ͉GĀQqR\F+$}o'|kck(d+qW6CCbB)ܾUwΌ̭C.DBH7~t䈍6){1ͽo#9e9mœ*7|Ic{ J ,E 5!K[ NS" Jb83RKKRtX|6~ ^~Bޑ#%o!y'7M)~}b[Xx$r/Db>К.EF0]Xơya@$DTD=\ k\Q>%GF~iJy27q?TRO`pMާ6 ߠ<Ԥc wqwT[\?9Y޼e23 \4[}|(vJ&@OaLz ,_=Q{% Ʊ)3g M_HPKF"MaV r5# }@B !b Hv{9f Sb:Äke}ǽV2<^Uo E->?qL!4o3՝E-wȾ4|_:uiFKaoG ixcqV̗>NՐVUƵڄ |ɜNKe#LSڮF葆g\}ZI7`9=`4NZT"G5;f(@v;vgVH_&%7H %5Dg BiMDv&o?26stJ I3c@> <6X bGc/k m0nWxt2?st#G`HsHBVTT4Lo$qq)jcǤjY-`qNۆخ#ըR9Sw7~qܦ RBa3 9FϢH",/6b fjCZ+ -b H"Aڀ O4UϏ<^3C r(4+'KAxZ@߄o7hXt!|P|Ӈ~Ŝ~<)=Z{Rvߞg13%7r=12u`Pawģ._[%! tq>|C*' ꌘoA^CGFiJox 6hNjާ]8_ cަwaCj@i>`L_qXBcOASx"; 0QDfq.H%a쇧@ 5 *$+ !l<43 xaBvHS ͸8{vEvE "tI %|C,nLp8@ЧoEFw(Nsk_C֮zJQ9hبv@ `ڡ=f{=[曁}y| xq7z~ g&I/ -׵mSR1x1ܶ]萭;CjϬ(Ch;F|\rLKq[{6!V E^O93 ƱQXb@'锢 zzKͿqGRIf?!HOI؟xpwJFpU@GhTK0hhGH&_{pf, Hq"Jپ $[b=s,8e) B&P"Zh+t{hMi2vP*]/LoUFN SF0'D 0tjcӇw~ 1q"${})8B` NψWwLoX2_-j}\@GJj %qV o$2 stb^T H8 OIRi #x DG":Xyc3RWݡYJkk GS:A]5T~Hy WEfBAșb5A>.!h3Hw@O қ#G6AYR| ʸDL3,lcc ?FG D;3 jv˴>hVB4tzL\W1 3y χe7m)(Ā،wH4#r׌ IŕR5[*m99Ώ05aJ>0͍k@N w-푠l9@KR"ρ-:4TW$G1`"ZlBs?wVV/NLKmnM s#taz~x?ɅD4Lrq!GWhk2g(D a4nWzD86v#/QV"q]OLoG;ȎE(wޮP_'0ҴߡM-ꕗܝL(O.theOf)¦$;XXhr)AV*%ǴncH1 N.ȋ MʻhL*J$,BA ~ 3DQmAS=3hkT)vP!~WxQh0Pb5 J(S= ۗlDqOCfzX`H m=(aGuL/L}UӜIƟ۔SS`#=6v#2Οۖ~\8~/iwitB,hTļOh/i\G‹򁫐2![{"rcG+D0(;i"#*3 i ʉȯ}8!K# ܿy=mpt0AH,[z5$wh l7D *D4&b!Ųd;lNj bޘ3-nyY% x{4ǮHHE&G vb$s*RQ B fA*cm@Hzl<#ܿ/R+wWZ5%R9SZ\Cesa2a+w!5/dBoRˈ%;b"r5h)owD7g5Crؘa]$uP /U;eD@cZg4 ܭ`mK>R˞ViqDT L9@[^0 LmPS\0]^x՚" @]Nsgׄp޵La?٣L+ʔ#D7E-; J|RxxK4yszzL pz>$1.krLcI)S.q8NCSJxmD`Ȣ\ry`(4lPDH K4- Aߞl$kEk'&Cc$=<,u7p籷$mc%c fL)҈n>|CM])TB2p~da7WD&Uz Hv|DSPr1]J>+`LC@ (3lk.0 b3@eN}{@)Z]j ΑM _ݡۊ蝦iwvbpD׮L%a )1DJŀ;) T;aKk^*bә d$`FoǶ?"jGƛAO 1eS艳ĺ --ꅇoW@B{*Ӣ!0gh&ǝ=$=͇"Fv߁J-wAs7^eБQ<| Te:.#w'DXt"ϲ&*,:!PaGqĸc}eh4 R|!;’ib>=eYSGB#.)2C<3,cbж~X0iB#'M!nxO x@ =R:(= 7X&S0~&?xl#Z^"VqBۆh- BVa `^VwĠDӪjf5Z#Amc.RۆZ ZB/Xѓ9$m]IQ#Y^3(c  a "#'xf -DkŞ@kvӉ!Ir ֫uRirt)/b@cNA%?KL?s[m%6Tǘa6: w7EQ:b<(`H.LNy" b[ ɄnwJ CV UZ<Ү`(B'xR:@Nn̓x9[Ec1-mŽ|zŝ9spY^2`a1weK PpTvxOS=ϋ&0;ɱH‹ wA?-bKV3_ñwL o##jZhcp\YNFiZǎX_np*6HbB.% ;k Bp-,3[ (Bu:*)- HO!\B Pӭ!lFl`SI/30" y8Q[Hx@cn N eu{,Ws_]Cm6 ϐA_x8w.)n zRCFх8nBR;IV"v;J޴y#(d|9K~QBP_ fV_!l:8J;Hs)Gă9ߔ{ _ʃ@=31Ѡ7ە&XYݱmh?}1=.ʤhicDU*44&;גh 479yԡܭ]2P$Qok=y|~qGl7xoGWvVyIqZI`b2 &f1Ah޷@Q %΅EQ}\@AnsO6- ֎8Ts8ҝBiOF"i(=<$Oc(CP{3T %P!jp562̐1&( /FI9RJS^sn/wdK*ǎYPD8w+3n-ca4 =U2D2l,H}͑~(04TVlVkac]:ýcml[J8Gx % ;ph7ΓTyK?Rx6_~?~z͗U>S r'(#)B?ܧgv1Lo2|-)C? +Ƹdo°B\ mB{ޘ7S"/zmk fp ԣ@cԌ+%8B(-B7t;<6 TS8zCؙ\*0q!ss"E3>z)XoBñ_3iy7v|܉2@ ^+tT ĞCV*wbc`էp-CW3{G)xCT {Džzgvԧl|!Ad ʱ1/D@ z2=3}1Pʌsm݇*Qӷ)A6Ǒ0 \ք LÖ; vYDĭvg 9^= ,6Yz.TBIR'SHq5tĽct'̜>oLYBt^^}Ly?~zHX؟!2^;|d+=3ˤ%qO?^sGboU6=ordmJ]>ugNiDHws⩬LPފ9]Q,T{҅7Odg+ E85v=Fk~,ۉ'.9&E/4LM`GSfelS$H>L4r[)_jGquԅ_;Qͨ%wZ+XZO$[fF\sƮ?=ZGtHrt:Pl2?LUsyMOo(bV~O5 ȥu#*鉔x;xGR!~!Gr1HIiiHbܡiЙ~;  [{:9F4o"382!Nba. cTHƣ(m-`6ב "cdKMcO]4"I X?lZ HS(}@(ꁧo1ܟl7&$OvS6@@z@q7q1y NV J)+\a+!SBG?PhHP)4/K2 j@nkvך gPq܁\x4bo4'v¡Yx!X{ȭ?ǰ[37N&\ zzF| osFiLw`4ը)ηvuAUj2F<@PGL*n X`r;>ɿ.y 5eE _ =]'27ΛtthC3~'!̏J2MUX"t "ؓê@aKt "x*N[{671Jğ,7cFs]pGqD,O +)dZ1,1\FY|щ2C"z:RDfpZ% bQ!%01/( ?p@sT Y j3?P:qg^BT"t <+ x}98>]mC`Y7tA<E=Ib2{}V#5 rzA</xKU`xƮ9rgO+)'8=i2PUz,pI}Elufgwo vf+ox.N2h]gAfC9pRUvpK.~:`#ha{ tFM5ߢ؉{tBU`$I X jdUv'A0+|~b@dO$`[jJN7(;,,h&EfD{Op D=GȝȮ1"7s7ut6ջ߱7z1CF;=TBfݮẅ3n+$kTg7fp5Iw؋Aj[e/5 Hflg6=Fh: 2 m:4֊GrɭD5`Z8jL'Ňq`Ǜmt85 sՒo1%[JCNpS Gwhl_2v-HJn<'B5<% tҹK9w ՑRӤg+p~ljNZr|=./; ^r C@P8AXT O!ݙNk x;S}dLS=ɥ߾[*@gPoXr0h+"N\YP0*!\oVDhI2QM3A|>9  @4n_02~ *&txrN;C9#MQ T)B-(9PNTrZJ' $ ;n1rLZP-hJ1 &,x! q A{Le4 y+Y1:bQ{7@v@! /G89B Dp</EI*?L賛ch_. WW@ :q)DµC>p\Q2롲d,yH6* ɢ z_Q&rtbny3^GͱBl!p4T @0숬ZYL 0zP92-E# icE(ʜ3<6hdh>oT:rԴ":}X  L ̟>Aupg%N)TA.(:C1  |Le!wqelVLtbg0zdT ^+ʼ>+Gq Vf^` ^S@1H 7ۣ((*2Uf r>|=\(pXEH)[ L{O[LLy/րvPޒض$()&+h0zvjR3y܌~zͩN hMoLups睅WJeCP6:Â? n].@Y< ߋQ$ݰ<=0{T#^)_O_0wrM".2 ]RIzJ>ݗW_6}) wI.p2dG0G}1R&J<ȵ4c`A{zN#2b|KJ S+كX:Ө۝J %_Pe1;n3&!`F GۑL4TL ΄0y_0P_+r#NuN0;rݏǃs#1=R(ǩEe&WA oمwsZG|GrB?Du>Ȁ_ *r>.=2 ⼸lLU\U޻ma?o=px(Ư++ԗ fwA &' !̐o4:B.Z0RY|ԉ&X10à)>:1u0z75/()%G9AQ`ڻZ{Jf>3N]ddOw#|d- @v85jr)@+}o,*R,5U~Rw5w-B7_g3yorWH.#/dcOY2{Nw{e 0_&Nwv ۘ(([bp_vؘ7t*߱_1BL@ /9UG&x>|^6>ޠn & 1ʲ p-@vsᕸ]*)@2P4_ V ? BUXT %6NNCOGz1?SAȱ*\wxpL 12LI!,-;)wѯY &tH!RT% x0wmfADŽ#DB ije4tn{N֔'yFp(ù5 J /@p#z RLes_"$R}}isY33ZLM+TDBYwH}C3&ǘQ Џq Cym#HfY L2S%lqEahcA xRɌ2T x|B2L N7%ݯ힇#̑ l¡ ]ĝ&Q̬= O#w*@#Վٰ4 MФE@"8 %S'}Kn odyB,p>yl+F |OIwckL@|VФxvŇR%oo_yCVIh~Q?T1%v Ҋи P _~5 t7_!ꂨ?oP}t d:!i=K[{(lP7̗J yC|: s9_x$K4V`M '.`cJŔzfiR|N ʉ _#oe<ڂ(<%"G:FaUl(4}diJ\=C=kB-%zʷ9Ƥyr-p`N3ܭH|D=ALQNgbҎ"p<|Ⓗs E?fkS!~cRXDu ?3^n`>nG*rA#TbX?3|%k ڍs/?KyI#vkNH;lr3G56>HI;@ ;@ P'[ ;N ; !ﳠ ۔1 %[/}I+2Ue+[+ą!>OG̱h`X ,*69#!ļM:Yc`}H[rܦcKŞ%Hc {WƱ&`d4eUdQ war]D cmgȩiJ ctB]H˔vZ>}tkQkHa5dOpwDC@l9bǃ<vMFjť?|WB?~{5}3zK6cf~Zf pgD : Ǒ6[m5)Uψ'H'@D2ݚ&n}'{0`# tmڕqIF/LVC.%&Cy_iz#$L7{; Rhr$0IOIsGh z; g`vM*WJ)%W0.&O!DIqyTgo3]lfdP,N=ALBI3&]Q0e'8qM$LZŗb f2Ą0gG[qJ "C┑1Q V#0x$#,s=E0w8z}?&Ai91D{`b>2"hoabϟiu#}3HG;!pV n KDt~_ K&MF))vcKhvn֒0C&Vy:GǡVN&!Gل#P*`~(Gym%Q#qːjIMVH~_*Kh88Fs{H\,oz<;R;2˒zC-zoAK2 sƣν=:rja=;L,#T% "dkJG8gU.cu1PojZj7%4CU ^ȇD^b0hV^\ƃd-{gv&,h6I/Z ^FSev_RXR >U1蔗"~C|_-EB*3mMSL0LJ[F`iPE3f  A14q϶W2O? (ط¿q?`LkaV*Q./,JR)X1=gcu0nc?s](g̻0_C0nG:0 +± E&{]) BL0b@0+?FF=!Q? "R*\ ]Qt x;=$NjUPzqNHXKl'KǑhzv C,U^SB&"`ʔ#,h)4 ٟ;F|ӏQNi~p yv!$RJ-gF}~dףc$6qqmWb θN%#Q쁔U43dsQ"?,&*wǂ̪*D9O mʱ.햊|1$o6 [}gČR%ռA .VgFz3eg0 b3#i 5vZ^!zFK˽r<g+'Z08&*>_xQ;&r!ڌ@ 3p v[{ӱ@ſr#twK _|N)A#YđW[w O\?r,Qm?/5vR|ʔ0%n)^, \mRl$Ȑ)]Wy]K [Dr$ G`z'H0#8:4;^!~#s$Wh]x 1=ʮεs\8/P)(6,R5ȏnOXl3A"FiONǀ(ɶ¹C E-s:+"ybwb+ ;=D D]<ʬ8xLAհqR>L7W-ew2gwˮ-" j`Niv; d1z-Wvh cOc7ߟɨ|m˥7GB +;t1؁)5:ESd?߫P=bw7v?0R !:]:~k-)s3ۡT$Y%mMHy*M⑩=ޠ}sZ>`tBvh9)uc~>0Gc f$ ,RLZ \](#D"c(3G.9z 4F"r칏3G3:O?@pw鿿pb8= ן7!!gƱ_Jb'2,s*9Ӵ XrkCSϔ=M|8}2^[" `C02F.Ia_v#XDnr㣼œ5, Rc3\ _wQfIF^<1g Ldm'Fwx#iH 5;ӗ0A^5b8^$tHObL[:SemS 3bXKRgh-toLw 1O3kcQW&0dw-Fk; ]i ~ ?-l0ܿŴF|r$>v"vT@ʁqIS21.% :]ch&VH%6LRĕ"Q2P&h9'+=Q(2@N(lv=H=2aR3U:FKP_ &=C{G;P911]h{ѾQH)dik)t hSךYT4,65si)9&9jMtIE '`! ;nDEw#"vKO!|y~A?E]M`b0q{$ ,0jvT4YAwc" aցh2n+Sr;bM"-F%%V ±Oٻ C)e:pex~"~:3S-tiưDK)P&@|D 2S9vev6шU#:>W!ӉI DB24u[)(#bE%d B ȝYvԈ oSSd+Ymc;DID񲃑Ԗh8]8rYB8]FIDykZɌI<7?!l85;cJ"SPR'=t|_ Sy7mv/?wl_Nv7i,M=uR6|mf!cy")>X+GmEaܿg/QW8=aQ*SR\J2~phB r|[yv@jie7dQ X˔Z\ػDl Ǯb7#WvƂRf#mh_!:7U>2N2ZCq$$nN2 Yz2W,r!qi r:% h3oOeߞa&cF16m(}C~^5K5A4UiT$ ׋ϛĘL?f46P8rAP)w9L ޴E,m6“151Z?.aH+sZi< bO3 hgٔ>6vTEf5ةLߏ4 #/?'gT){.Al7h#,>8%K S CSIY<~zAOcD@ǟ`NƲn{(435g}п66v;?8?C~%&V"Yۏק_A?,l?[A\(7޻;.npU q|zp}4b. }0#GAQ(锡7 Ԅښ1R8|bX#v~}lZ,\zC!Bi|-gQĊJ%hAhEŚ{6s0ShihqgT!;,씔aKGpg!ZseBih5g+͞KhJL4!9:f4N$әuJb"odnd/pa 2ç ooqC 6Ж"HX*E@lWHV!c1 kW`:EM;C|P18 Ex OK|[;jIϝS=.wZI1pP[bOjj r_vj79uw|!t^\z[yYuӔa;GhZ7#~o1o'f{h GʕTrJ$R 'F*IW00_xpOb2R $Wrzqe37i%E0u~Ž# Hc,1. X"În"h!rpI9.4K 왯؏텓I cC+b{=*i6? C@ H-5Xi.Q2N&r7}OvMJK }|{fTel Enr׸úwۣv]e. j=@뙁}cg? ˉf [ҩ)p؉Hz ҒFAGx?8Lᵼ;&H9h@BEYcP}EwhFtX?AC3%-&iD':'`{@3w-,~CDTDU.o" $_xLǨ7bo33ͻ'Z`&f1ګ5co*rʄ$&9fm&^byjTG h("DN-U,`Kb""Xw*JPq"{f> E!Jb]B ev3 hE\I=YrS|h7Je\#r(Ym#NmqXW)0_g#֬6^d"?a_0F~n$qD#S> T/DWF_ɁTɝq%Q+f&PiIgBDXzvb5vGV,\U(n ;=dkgMv1}.,]1n쐼S*HPm(F?VX!4Vq9 j\IvvB5lc5G`E){1@D 3ljBT ȴeJi84N<}'Fq=)3WH !N)ӌ>b]!/ϰ2{y Q`~Jm~z.毽竽?!DlH4Px,E 4 gc )4B4Q0VTh.(,C C!ހ)$PX ;E> kghOHJLUnLi7_L-i;))E"JŠh @!YᚘRd|wU,a;$^&fOA{o@Y %*'9 +T P[16v7X9fh`)@1er%ӨuUH1sA{‚);^?'|4s(6yI(2VB` Fpz5E'4X|mf2Mf ӵNN(/I$yzk[Q<+{Q{wl?}\1FAo\hYOo-6AO&⣾|`Mp4\Kx| "]^xpm7Bz4¯r$oя )gے;zN0#!.c^:2`CѷO췘>U!A}Kuh|&<: ;# 03 ]H('=ꠊ耇1&Š#wytʑU P nP'(b0\ W a)_"'(bg58X,?#-vS`i܃/%k*jPˎ^"~VGLGYKZ2i޹B#m ڃ{rouKA ~g |~&̸-luq?}x}+ JԿ:a1-3pgv2:mCNGI [+ JuGc26 D\;v s0;l58 %ۅ`'X9g12#D0+uso#Z %e7ԔUfkmwu 7v5iZƎ!>*G1t#s һDˑ@'|I{=-%w`|lo@?ᡫP)ǃ1루-ݼ=_8F!xDɤTI@K8rm{`^= cC?S v>t/jw5>TpL('Z =GvEDs VvO b3BH00'^bqѿȿ#=natc 4~HK84I/ BՊi&GKPe'Gt)#zD' 8 pzGz:oe:dnyWɟFe *vmF0e9%4\a2g+ 1}HAClwO#(tcO >>sF R!=ZtF c-,Uo V?/Aۃc%-9Dr<;Z p ̗)C9Y}}S!ݞ؉Pp[,^ǧmDy5MdEKTˢ֠e&ǁ!F">S_^=^nV;| JxT9vTT$F+g7"QD %c1P&DQ|e 2?zwXY灔#@@:9: .lOrƀp=֪2sg ;頹# ndg3O`o57WDRT_:r cIttz:Fo<1dm] ՞/+ݯFqAjRFB P(F=ʙrzݗ<@,H!bb50AVJJx@[Ţh NR_3uڡ5 ԝ !scLUv i5)+b4dqMwq虈85[2eA9z ꙻ0r˜8D1ڠwmJDe4G/?x߱}<ֿ[=ҷI֛]I+{# ;DThWRm ~3#?"t%o*-=EjocWWlp 9{HDC $s0cRo5,(P),e2n?Ct~Ó-Mp@UNRa9fܒ<&$h :/ RL Ds]9LOP[Y\vs`l?`&ni΢ޯ0=P|n>i7A .@~0}C/D yOkx)I0$C)2@kۑEFLVؑn=r6H3fM{+XvX}Y;zXw5WCS3`2}T8l/Ͽ#ޱ}>!EY0IL`">+gIUrady=ɂ)1Bzvމ~h+ 9o T"z4AP;,,Da 1ncAl;aS)"wν*DOPn2L5d|936Gf'3BFr 'r~]ŗ .wΔlQ*)YT+ӦQ ^hʅ| 3#/*O8DPMO .^Q Z^ }fLAlai@FUb~]Jx]!4̆'ceNLW]IH_)c$Ŗ1Et5UbtB3Vc[3`dZO ),c#Ta l鿴q?|kO'C!mC'AW4Z*wLsmH-)~eLЭLvQ*8*+gTۃ#qF=>%.0̜mg77\f 9&iT~=<`Oٵh$+\2JE;FB `@ T& aAqPIó|:@)g*˱Dϳ kPiIK@)2V̪_sgg剣=IiWH}fg\Ooľf@98~U?SD$ Soݚ(B)DHG3:b|N +b 0.BRu  ck7q?<@VQٝ);? /3-7~?p}^~;g9a2@ >ɯ HgĒU}m{ERz]8A4^z~FBDt H!،!@C䄸/C?zJǝ7r\?(?Ϯl|Xi A5y[ ѽ" D%I4x ƢPŽϽ_akAAuHyW'Es/h$^fr"y93wXiD@s) x𵌞,!^N% x yc];LŽ{6o m#_{ZȴܙHn x0 _50:/g}S1{@Pۤ )9{Zg曕S |L(S9rij .4 c"@f_WO|wZO rx;Dl+^:%cpOTX?f2q`؀iHoؒ>%g>wF"3#=I$Xa* 1׶ح:&9B4B$*"4P 3KfoVoPSo(zWHyI@@pICZ~/I` ҋ) IX8E:ZJ\%jI2E'Br'D(3*.;K~ 4>o~sפdo^5} d $[Dx % 5VN(h Z!5\GPGl&ĠO3GĝپNF3}'?wlc;_W~~hN*.CDm6xbkՒ .4Ӧp}^i>fuP]a0 ڍ}0[fIxrUDOZ赠e2<Ì8.:C/{a~~q&}T/ƑM xo>2JBhcwB (Љ ΋J>#PMl3c^>{<>e઩ZTyw)ߣQ$ TbL<gȼ?R 3^R($`l<8JO* :s3B1Р:C7ąݹoYn4>ߕ/ɔAz9 \8,Jt> fh',V{x `< `0) -i0B5{7o9B:G6PaL1I%g&'x8|IW <0jS+M4/X'gst@'`:%dig___yW?? O.mU" H(\iZ ƸaI F^}eđǥ A$&70! *Tbf03 uSb"Qg^%}EWP_ &_cC±frI߾ P1b m@T*2 (T`nm|ήV1 㳀w!0> [vY{&q Tz蔢z)~;Z";6o=~=X~ȍ@ϑ} {gK0.Ò#7Baљ10?c4 t9ҵ.3Z]_|~˿+oCYIryZvGl :0Uvh3;NW$Ѷ;(<РYub)|Yи=zJ)wK hl݀N@ wDpå I,e΃rA' 'Ӝ o2HD#`QNvzc--('`Bu*:c5*L-/qWPO!r`"PԣΈ+d YYQi0$캦v,]Fb  Sd+L>M=l9eeR9!,즕ݬo0P g vV!<u6_]?_x/jw/*F^XL1PI,yzRڹr#%Ibx@yY2 w{+YEN>Ǽx oX`!c@`l@2X21HX# F؀,F$l`C`=s2F 9!tVf̬z:qqQnEgyʶ 2$^nm@ Ѷjs*z N: p Fx\ HYvX{gɱa@P Td.l!4 p{^FKHtaݧ(_-?24H?@R($ iuG,ӠPQ_C%c"G"?fvb;4""4C6k)y(mcx!/ʤ I0WFJe1D6n"nBja}-}޹{}~\뫦t0ϾSvzp9<=-gmbCGR'@v Z#Do9>,광l$x`Ɇw ـyf,3aW NEhR~QnKBxP&/﹒@š?pi6g#K(g;8 "/Bj`#c6o~G/[FԞ4a͌W-燒%IHmGwv6'9{ʵQoP{?/f_4O 2xv}ķi|:W PY^)Nr+"wEhp;Td(#"]1)5 +kN [>I]=4c^%N0`&zL(5aH(*BY@ m} 'H|T!/҅`7h`kӡ\WFDH׷={d<>K7P{AC/6xN|\dYqd~^@H0m@B4bRL:/tYbМ`HE&ZkG =І=< ">+ci@}P͒>b#r|CMo~wz\kؾB}{`/}!:)NckfҡD?صɫXb@+[d99@ELlw2޲KA6t@lxŀ8^ǒ %b3(囬PnF& ;"Hڗʰ@呡AlDZ+wa'`nkg)J9XT<8T-+%7|>tOtxDud rQ`no:goݧWb}g|MC{%g5ϝSXԔO~wR'8C 2 :8f LC>jA۰e dVTeTc҄UJ,"mH=oa& OGY "/^Dg? `gg%O+C09p͎ //{MfZ]㖄V30S+AdOD'OL6hY ܯܥl~e969Hk7RT6R,6)Dtv+J[c̈́Od *0Hk~B"'8cyP\2a #={$#-vEM)RHf =hatLs{I3$ vpL2 Nx]r2yfV$4R鳂W3JvtkQH$,Ȕ+]` s]Ou18=$ʱcXבKt[ڟ'wDPØQ#w6zOv 7v;SRѹcn =0Q6۷cuYkE~{g ޿~yهB=ו#$e4'i\6i1G@s"<d"&"?'TLynZD{{@MoaxDgtk;jf^MoO3E|_g`1^POmS(MEУ6 O 0c7øG&`AO ~ bYFNm0(I(: qvLp ^TFsd]ё^P8d4d{"槞1!3ݰ[s&`'3 Dx_F9Wj0X7C- yAO}_]GkZ!x.?| ]>A#aM>!;}ݑ\3h!.LO3E/Z.A3eI24ḇ1A@n1#Kt.=/ڬjs`!cj{@u&:Od,4zhaDK$'-2#t*1 {^dT̻3U2n ym1N@FD@zgT5ҍy!&űv%N$E.i&YiPJp` ;t1TL PBR%Jid,FS" ֐q7'9ȓ}XOk _] tyfD S4[sZz'a@E!9cCJ/eDŽ9C I7m9g֠>ߑ8,(/>0}x= >;=K,Auģ|up@&)6>b' aBwΑ0v$8m׮ଜ8:.?첤14fTQU 2Q|-A f#@q}BY#:k3XOaP )(0ۋ;rP۰S#Ng&h\$ $36뢅[L8`U?rLd@Cȹ^!s*Lj H]U]1R":n`x1-t0qm]=^*LhFM"ҭ?5L*~zm* }nOtx )ZEȨlM#[lvoA;_':|$ l_+G,_6_~ŗE^?EN\,Z3[N˙'G4K 06eeP6!+8W| $1@ w czA`Se04"N`W'A*!"QքW3]2G("Z2q.99Q=?"Da` քL!Lb Bcn:}/uL =ZÀ6  ':=[a[<:UWS^b͊ܚ#p(w Pgr(Y eDЅlЛ7މg&{7|wk5Z!w;p+3W_F g4n)8\l  FdG(?0"$tR`tِ8;̴4W+$zbS* < _o" /aL)0 )^11rDzIZ q Z1RȢ2=ͤJfP^ sh6fL!0LbL/_'XM߰;LDc(>CxYB Loy@Lz5(;()QEı%e ERoj<'E:jel-o=ToO> z\kO_Ry.pG1DJB\ӷE&egz%n\Y-UTYc<DSdy$>#({8:ا5O )BQ]!e1#3#՜`Vѳ2\#[NI}?d>ӌ`LHzOgl!%SFK*k?OSLf(^>K_ [xำO^ -HgЀyqf.# F8 nK vi;L7?u^rM/ lkZϾ2/"O%& <=*Ė,h4Lv 5?;*!co9&?1Z+kChZBe"@J c~ vK{Qt,̖!zl`UҤ;G*niK)}WS- 2_PRg]/j#z?Agؙ#JQ^Y8_Yis!dzGx/ߐ,Xx ";>& D3̳&?}w_mq|l^| yy|^`N\:6wg@U]L Z S1ZCCIt8Az"e]s-Z1̡Gkɼz @~84ݙPA~D|=8`ףX$@бcGU>=!02}bRBd20C.ϟs?8xMy3 +M_@-!lO l_̓=)ZgH+v]T/ h[Oo]khqb}ϐ3+*;.0YuOS@Cf{<94tn' ]. W!6/B<i2jKGur&#dܼ=~-?c+}V`i7yb/sy:Ykel6T% {܅~6B & A:4 Ib<*)d:CGCɲ2˅t!YPG\=Up?oV/] mNiBpe7MQ 0l яH;b /{nM<}dO^}6/ Zϡ{%s#9 XX0.j{d6 (a=J}2O77?Zk6^ly Ne|B?]1k|"yb hmdBx]5,yp9yΣTzL3:tagYٓ"R%; 6惫q%f\L;R'|8G$ٕ<.A.J2Z w}B`yR(V{"D]piEQ%a$+x6ʑ"[7ݼvl^;غG[kֿ߮pm?YZYY,F]E 'E`:(˸/US1Y=Jad^xWehv=t6q$9%HR02aVTaN\rZEep/Hs׸˞k!bsrY)S. ?cMO<<,GIdǩcΤ _&LbFr yyzolݣ l}8Jm̠dW{yOT#ꮮǐ삒DP#^kvycSo ǫvyA/Ȳ2oE %EZnX;Dt@@y@>/@sv\q DȠ&ZA:ܤnnvs{?W@[k~Owͧ;<`79NT3|@N/ hYTVP)1h>Ts2R.LHfOL ;w]?r}Mi:HSO>GdN΋0IB_^`7)jtE1vcJ/~cֲ ...>#Dž؟r+Z^7f\2FGm qmsssZkWw|O'I/'6U:.gQkD p"GLgNUgiZRrJZDukzGK2X5[~؉%'@ڥc;P^7B0"wM@33H5 tymsGp!( _H'Gq׺'N4IJgGE"1 f[ذ vSm?zV`ꨟ-ߨt~~8ix b^+Q% guaz6\OyDeH\f3=_=^8r T><@e(& >e ?^sϻ"S_f˜)O4HNx 2f>tTBÅJ G]"1cF*QiIap#P8]+C`Q|0 HCc0lNø=WZkɪu7C?O>G eX;riZNqp*e&@DN1쨑hPcų}2nו[p3".nǞM3f1 .c;&+tN{}YzdL!F:?:$bI#tp` TI eّ@"f6J hCن8Nmܞ]+ l{MyӧicDZ8 v ^'xnn&$Z4Uaw `\N$$tZƋ Lt`G^B-F6 qvq0:L2?1Ja&2 sRÉ{F)"icGyxWݠuk5Ԇ>4ahS>n{~iZk>N>~m0]j}S&+ᥫJK*MYDe*@9f2 Yz3XnjgԞIWԲIp%j<.zE= 88iX `ztZkNƆpp rTV?fЫt] dфs-;#MD.'~T7ٮs `P>_$V"&d"^Vyl xx<Ԇ0b6}r@ou1\kV`[Q?39hM9Ec>|~f!f sWӮS.˶guxW L F22y ˫ RoS៬Z+PTݵTzս>?w3w~m#Ga))dOeݼaj:#hoZkZkZkZk'D#r-IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/logo.xcf000066400000000000000000014220761260417502300217560ustar00rootroot00000000000000gimp xcf fileCC.3 icc-profile H HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Kmjpeg-settings d exif-data ExifII* #(12iTangerine against white backgroundCanonCanon EOS 350D DIGITAL-'-'Adobe Photoshop CS2 Windows2006:01:23 23:39:59"*"'d02212F Zb j  r x z ? 2006:01:18 21:49:162006:01:18 21:49:16|Q@B24j(#F( HHJFIFHH Adobe_CMAdobed            n" ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$7ֺPB1apǿ5v?{FotLdJS$I)$IJI$RI$I%?TI%)$IJI$RI$nC;ڙl7"} ewb=kA=,m-?7[+ ۩tNXXͭ˳!Z} I$W)%=is&oY۳'PkO@74@q$22A8WpPJ2)RI$I$TI%)$IJI$RIVh6q,n?$ Y4c"A$ <c[ӳ=źB֖eT5B߬T<\tY?XzWZ,\7{ \Coysx/%}b/қGYm UV>nf0Uޚz֯YƮrpq+>k} S}vN6.kZmfǸ6k= |?=EZ.ʾ;mw͵7X1<5":F2?VHlslʿ?]cڿgT:ݗCZZty5_eߣr+>>V0og6OMTۨ[csO\c:7qzc7:u^z"O qlyJK D04f}tKW5grJ@+I?TI%)$IJI$S_;-ƍ$𸼬2/q{̒e#$ A .RbD{13,7s|F?pTu]1 04K8}sQ,kX=Ft.I>ƹG~E'0ACv潞/'4Jڑ=r}N"X$;&4,iOOYںZ3 DG&nNn~[h~8o{gJC:+͘$˸5WCWSd<^4d`<TiդLC{r&~?r-@߈QzN:3qI q-}&<}:S"uUA73Mmmކԫus^K\5i$?I"I$JTI%)$IJI$S}d'햍t X.N+όw%noscp#,~!.^/$s(ǔ4*f[ࢍFSi{?)T@BdmWaoSOXhatUqrOlop'4+cC3}E}dNk^ǀCuQt LO''L?gWml@$?m 3.3 IMG_6647.CR2 As Shot 2550 +6 0.00 True 23 35 0 0 25 0 25 0 0 0 0 0 0 0 0 0 0 Medium Contrast ACR 3.1 True False 0, 0 32, 22 64, 56 128, 128 192, 196 255, 255 0221 1/13 370044/100000 63/10 5310704/1000000 1 2006-01-18T21:49:16+01:00 2006-01-18T21:49:16+01:00 0/1 5 50/1 0 1 1 0 3456000/874 2304000/582 2 3535 2424 1 36864,40960,40961,37121,37122,40962,40963,37510,40964,36867,36868,33434,33437,34850,34852,34855,34856,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37396,41483,41484,41486,41487,41488,41492,41493,41495,41728,41729,41730,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,42016,0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,26,27,28,30;1FF9937897EEDBEC9A3350C2D83E4C85 100 430229292 50/1 50/1 0/0 0/0 50.0 mm 247 38/100 unknown 1.0.1 Canon Canon EOS 350D DIGITAL 1 3000000/10000 3000000/10000 2 3535 2424 256,257,258,259,262,274,277,284,530,531,282,283,296,301,318,319,529,532,306,270,271,272,305,315,33432;54C94A4535CBA8BD71F55B3D049D6E0C 8 8 8 0 2006-01-23T23:39:59+01:00 2006-01-23T23:39:59+01:00 2006-01-26T13:36:31+01:00 Adobe Photoshop CS2 Windows image/jpeg unknown agriculture aliment background breakfast bright close color delicious detail diet dieting display eat flavor food fresh freshness fruit garden green grocery harvest health healthy isolated juice leaf macro mandarin natural nature nutrient nutrition one orange orchard organic produce round single sour stem sweet tangerine tasty tropical vitamin Tangerine Tangerine against white background uuid:6276D02E618CDA11965FC0FA3A6909AF 3 sRGB IEC61966-2.1 3r*f Background     4-4M55b-kHkXkhkxkk~ks,iFBg|sI|$$TM4Eu{D^5Eeh?===}===;?;;=> :}===: ?=}=== Шſý˼Ƹ̹θѻyxپİpαڷӻyxȸѿǭ{ڧθƵ̳þӾľ̻ƽ|v}ƽɾxfMU\O\aI+$CLBIgqSB-,96@LVoɳƸhKA8 6V\QYuƴɲkRGCA>:7LjrngiirzƽƧd]]^`a`liececacfmȤlb`a]Zd]MEGDBILPZvӽi`YQE+.3:@FWܵq^RB, *8@Kn仔xgZI15%7;Ek u^;$8;Hj}mT+!0?Pdݤ~r[<0!#7LY^⫉}rZ>::CUZ[\Ӭ|oX@;FT`^`\ìzgXEGQOGU\[pϬpZKFQb]5DNVbܧvS6*Gih76DG7!,Gt g8'1@TF$%;[ ~C+ *QR9% 1Hx ]4$=MO#(3L~ p$,mzD983)#CP6'*4S_?>;,5RK3+0BqЄMED6%KUE029XcFG>(?VQ835GpҀIG>& 2MOA54=XSE8$7C?,)3Hwc@2 .: !+A_w?/ *%=RԑN0 7K{p>&-El٠_3>^ԌL#3Qnn4 (DYۖN "7Igo,  &/IQQZhyƸ{_TKA64>Sjsqzȵ{cZVTRNO_w~{w{Ȯqhhijkkuvrpprrv|ͭwlkkihpj\VYZ\bgmyĦqjcWI:64?JOTY_gxຑsaQD:""/6=CMW_k潓qZK?2$+6;?Sec`bkyڡvfcVF>I_fcagskg]P?DWddadn{ܟrh_QC@P_a^ais{g^TE@GRZ[]dmyɆf\UICCJTYX^hqؓh\WNIGIMQRYclyܤs^YRJHFCDHR^gp貊h[UMGCAADKWbi}ݯcYPIDCA>HQ]eqۢt^SKDDE>CJWajƎgWOHDHCAHR\erx\RKGLHAGOU_iɏeUMHGJHLNPV`ptYPJEINZXOOVcѳذǨݶz㰍wmdbRlȬ赋{|}~taMVWIjʞ’zvw{y[GNKBS繊uy|xzcSUED֪ىrxզi^UE^εÿݾrqrą`^SK|ھȿyjefi~jWPMmھԷ{pje`]]_hvl_NbϺre_]\XWXYZ]akzlV|綒|ja^\XSSUUSQeshX֫l`^[UOORZLUKLTQO`ùܺp`ZVPOOQKGD93*5J\۟j]UQPPGA9)9IHbкϬtcWNE>0 -0=Qsȳ¥kQ=+  'EV\oԾşuM/(KVMHKPgyҺʨxK1)(''&&6A=867>LZoݸ_@.('%"22%"'+5?HTjѴ_:(! +25=EQnݪrC( ".;EZwH*  5?PzL1&$3;J~|J3+ 38Gyi?2' &8HoރJ9,  %=LaS?0 %7CNV ֏YE2 0ADMN 泎]G0&&!9HI| 콏]B(!.-%8Ch ؏T/8<$6T @78&A p- 1`b&  'H f)4%  8cҀ7 02 .JX',0 &:hۋC  1+"0Or5  #.$)>m[*,&#2QٍF! "&!(;u q4#+-UT)1$$>~~?%  %,/\_2(!-)&DىF.+ $/%"6^d51'/- /H}ۇB4)+-$ (9^S3&&! ".Gh0"  '8i5!  !0PޚI%)>}o7  2`!ޤ^/ )JڑL$";hu7  0OS"  $<;;::;<69<=34454.155333421,00-.    j%DOC36Icߑ@ 2A>88K`{a& )8448Nbkև> '+6Ocg^& (.Haekԃ= %9UZ\[' "FRS΀<9JOZ% -/>Hр9'1?T"/x4L#* l0#. ߏD#!*B!`,"$# ҃>" !Y' !##|6"# #N#"#&#m.#""B$"!]+!$:!#S''t6'N''n4 )ߓH"*d+)ׇ:+S,t,*D*e+݊+*,,/...11///000002234442246̌bTNG@GU[TNO\rqYQJBCJRPJLYiƇbUNFDGKHFKXg{oYQJDCEDFKXgqaUNG@;AFIUfmޟmZRKD=?EBN`is콂aVOHA=CAAWbiڝmZRLG@?@EP[b컁`UPJCAAKKT\ ۜkYRMIC=DHNW%~^UPJ@<;>FQڗhYTNB=:8?$ܠnZVUNBA?!케^UUSGB>#ۚhWUTLA?$w[VVUFA#ՎbWVSHC"oZWSHC!Ń`XTJA*jYULC"z]VNE,ԓfXRI-v\UM'̍dWP*rZS/ņ`V)jX/|\/ܕe*t*̊+.*,,2.001422/0000054453531:;s/ !- -UG% *H}i-+EdD ,FUe- (CNrߎD  ;H[e, ,>J؍B  2>c)'3ڌ>  ) ]& ۄ8U$ y4!M"% !n/$ݒD!b'#܈:$V$#z3"J"!i,'>  %Y' '}7)Q% 'u3*K *l+)ߒ>+[",܀2*M*p+-*,,/../1122/0100014553483:=/%1(0,z106W11H22C33I44j566777G78k898099l9;z:$;;+<<H<=|=)?,-*))*k)X*Mv,Gc+CZ';Uq%.O_(!HRz)@J_( 5EL%%?Cj&5AX%'ATu%@T_% 9TU%+QRh%GPU% 8NMw$&GK^(;JN"*FGk;EV# +BL| 9If! )EY,Sm"Z'Pf {8IcN! ;_q"j.)Whى>JeS%  8atm1$Zmߋ@ Lg~T)=com4,_kۊC"VkyY- Ilrv:!7irߖM*$`r~d5 OpuπB'8isT. Yql7 BmtևD$ +cmU,Uiyl5 Edj܇A$5^bR+'T_th5G[gՂC$ 7T^T-(GWsi7"-7NdσE&(AX+,,1)*0v/i0b*^u0[n.Vh.Qct.L_l&HZgx.CSbn*BL[h-CFTet+DBMap,BCH]my*CEFVjr*CDDOcm})ADDI[hr$ACDERbl(CDBCK[gy"FBA=DSbnIC><==IYl!QJAA>>A@J_r&VPHCCB@DWk!ZTKGCCA@Odz bWOGFCA>H^r o[RIDCA>BWn"aVMGDA=?Qj&jZPHEA<>Kez"y^TKGE@=E^t$͍eWNGFCA@Tnn[RIHDA=Ke|$|`ULGD?Spn\RKH@<;EayՎfXPJIB=BYtq\SKJC>@Qn aaVMHC@AJg|֖jZOIEBAE^yv]RKHEACTrĆcULIHCALh|"ٜkXNIIC?D\vy\QJHD?>QmʋbSKGFAAHb}lWNGGA?BWuy[QIEC>>Ml}ыbTKGDA>FbvjYOHGB>AXo|w]RJJEA?OhüdVMIE>?H`oߜlZOICA?BVivy_SJEEG>L`nljfVLFKP@EUf۝oZNGHLBBL^t+--***y*\-G,9h+1U+*I{*!?b*6N*/@k* '8R)1By)'9^(4N)0Gi))DU&?Jv(5C\& '\wڋA ,TmX% Hft0  7_z@%TlU"Fap,  8Xr; )OcQ% EXm0 8PjA  (E[V(  7N|o2  %@fیA  0R>==<h<<0;;:h::3998h88.7}76F66)5~54U443]332B2O2 2I2.32lj2$3,2my2#3.2Zz23(2Jq2 3-21z33t/2+|33~5253352H2) ;90,-.)'! © ߿mY ͭnVE:2 ίpUA4+$λoXD3' ̭wbQB6-% ۻx[H;3,&!  t3, 0*/.#  " ǵ ʶ| ˷{vrppijyrnljhgg˺ysokigfedbcӽ|uqmkigfeefecd z:, 0/10* %"   ѯ ΦY8 ְ[5  ײ_9 ʪb=  ۶rS6 šnF)  -v9(v6T3R/L-SD           ¶Ȼ|qh`YTPNLKKLMOSÿ~l^RH?85320//..-,*'#ǹyqke_ZVTUY_ba[QG=5.' ´znd\VPJFCA?=:8779:3,'"  Dz}rh`XQI@82,&! $),-.0233210.*%"     ²yk`XQLFB>:4-&! $(*,/44-.+'"   xfXME@<97630-*%  #,,+,)#!    J?8310//.,)&#    #()&'#  +'%%(*+*($#   #'!#"    &'% )(! $'      $(&&# ,,    # $"! $''     "! %$!  C&         ɼ~~}|{zyywvuu}zxvuutsrqponnû~zxvtrpoopmmnomnlnnȾ}zwutsqppoqponkmplimkklmopǻ~}{zyz{|~}}{{xuutqppnlostqmllmiijjmonl~|{zywywurswxzz{zyvvtstutroonklkosqoihjfddfkmnkfǁ~|{|wzxuttussrswxxyuttponoloqnmnhfhkpsqmigfdbdghilhcyxxyz{{}|zvwuwzupoqrqqvxvvusrommlkmnkihfgjnrurnkgjgghgdiffbppruvvuxwutsorsspkiknoouwwtsrrpnljmkjhgfhf`cmutrqpnkiihigfhhfchjlikppqqrqqnkkmliihkmptxuutponlknnkhggfd_fruurqonjhhgefijjidfgkhhlmllonmmlfiieehifdiqssrnlmlnoomllghffnuvwrpolihhgikmijfhihhkllkkihfddfhhfdirrqrrnmjjloommjjhhfjrstsqnkhgefhfgikkiF&        ½˴{j\PE;3,(%&),/3:ɿ|fQ>-  yiYK?4*!$09:4( ̼pXB1%  и{cL7'  ʹ{]B-  jK2       =x͕)1o Z 4s L';y)</37B *$$$      Yajrz$*18=BEHKOSX]bfjou} !#&'')-3:?CFGGILR\k    %'()*+,.036:?HSbu %))*,.12248>ENWbp%/5512798772100/049?DGKPXf{'2335//3.*,$'-++,.02459>BFKRZes %-0..+%()(% %$ #(+*,.16<@ABEIMS[j(+.3.-'#&  #!%*,.13346:=?CHQ[hw #11,02(! '(%!$($$%$%&)+-./27>ELRZgx #-+*.."  (-.*).,  "&!"*16;?CHMS]m".1*)*)' '0/00+-/*&!+37Vw"&-7G_ W<ʛj;/z4%ϏI!ݨe$h'x6Ƅ=#ώF *x1 *u--t&4ݟTi+,*" "!      -++"           2.+"' !          >986534)/*++*)%%%$!"" >>z7;>) 7)/+**(#!,!!!˾ >>z536-3)1**))%&'!"Ĭ!Խ|6657568516788989:9:66899983876112#           =55<55863{;9<=:><};;=s696<67        ƿļ霝ü𜙖˿܏ɼآ˾}yz~ο~{y{z}{Ǽ|û~ɽ~}~ʙ|xv978<88859;:9;:99:;=<:9<;<;9986969"     ǿ~ô|qida^[WTRRSUYa{rkfcbeilprsrnhda^[XURNLLMɼ~upmljeaabekpssokgd`][ZXURONMMLMμ}yyvrmha^^_q{zuqjfh`\[[ZYTSTWWTNOһwqoquxzzyxwyzxrkbYSUYchgd_\^`\[[Z[ZZW^jge\SSҾyuronnortusnkjknoeXQOQOOLIIMT\\ZX\YRIHFTegcZMNëxvusoid[_afc[UNQW_dZQORTQQOT^fhe\\WWOGFGIPTVQIEĸ|njkmmjcZTMMSPMKOatwf`acgghljb\ZZWVUUSUQSV[]UQM̼|qgbbca]WTRRTU`mi^\`t~usunf[UMMSV`bb_bjnjiji¶xronicaaZWVXV\_bhv~xhggiszyss||wqqzl[Y^ltoims|zqluv~ysonoolhe\XZdeikonrpkeb^ZVVUSLKU`djkmz}yzw|~hX][^^S|uqnjillmqpoojedhfabejj^SQUTWTPMNSLOTVaegiijmw|nbegcSGHQQNFG|uqomkklnmnovxxvr]YY[^`ZVSWWTJC?L^NNRY]YY][^[Z^gc_XWXWSPOLLIMO 3G@+$;Xkb@%.cҿJ HaC#=$ 1( +|*X,Z01~2A47W( 3Kto4  *<_׋C  )1LV& (+->fn1 '+,6Rڈ? -,2Es P" )/?\d+ ",;My6 $6EjC -@X Q 8My^*-Ea h6$ "mӈQ<81 (1OoF96/" !(8g]?76/1(  )C|S=:9?@0!-OP>9OYG0 &$5XRA@doO2*& )<]WDFcX5$ 17% "-?]ܳbFJfe;'8=%!$/=V}üurIL^h@( :>+(!!)3:Nuѽ|xvpcQ܈OPV_aA+ 26("(498Koѽ|maZZ\\WOH[QR[`H/ $)"*HRG77Fcrga\XUTSOLKIsMGRYY<' !##H{~U;7@RlŹ{pga[UPMLLS]eٛ\AHTTL, !0Y_C=>GSbq{}wpib\WQMKIKQ[hz˄MGJRO7"&9WŜoPDEEDINRRQOLKJJMS]mpD@LLN2$ #)>@BCEHLQXan|^?FMMU? (GSurVE34=OTKLDFMXjgVD6+3GR^\VX^gndUE4279AKQWiṄuusnO/&1@?<6?GNWjøΒvuqqX66>DMWf{xld^[ZYYWUTSSTUVWVTQLFآwrlf_=;@HKQQG@AFPTXZYYZ]^]^_^\ZXUTTUSQNLHyngbaC==BVa`RGAHPSRRSQWZZ[Z[[ZYXVTSRQPQQOMLK~j`YZI?:@WabWNNXRNKKJLNPPQU\cXQQMGGEFMTZTIKI·dWNG@=7:GNOSTSTPJFBJZbhfmkmjPJD53*."*>X^\^XՓ_NA1$ !%*@N?!)]UycJ $"LIJܟ]F7)!)5D<0W׼nMJHPZWs[@4(,36A@.TۥZ?7.%+;BCILM~ǕXB?<4*&0?HLOOSWǤ~XFGEIIDEKGMSST\tƾͲt\DEJchbcaU`ĬxvmZTNcĪɭЯݥ̴Ƕ|^QIDABCGUiˎeULGDABFP^~nYOIFBCHPVo|^RKIEFOQRbҍdUMHDBNPQZwlXOJGAGPQUjx\PKIABKOSbʆbRLJCAGLP]v ۗhUMIEAAHMYlqZOJGA?BGTd~ {`TKEA??CM]q̅fZOF><DO_xَnbVNB==?CIXkʊocWPA;;>AEQb}ncVI<8:=?BLZnݣ{mbQ?6448=AGTd}̒vl`L?6--47;BO\l ul`HA6')139=JVav쭂uncHA4"'-37=GRYe뫂wshZF4#%-6:A==MepnlnȺ|wuv̛~{w`D3(&'-8<>>A`xikyƻ}wqnnqvyⵋ}|{oR6++-.59=@Imlks|voplozդ}zygF/12,38>CNk̬umov~zvxwsr{ŕ|yxwdD63-29@DPbֽzx}}yuuy消xxzxiP9.07?EOZñ٢zwvz~nT;28GPUdޚphb`mup`QLHTWaraWGP]joigaZ]f{w\QCCDSepxukimv{ZODA<@QdrzyssvZND@A>AK\ksrsuLjZNE@A>79=HWfosԔ]MGA?5.1758Oan{ަeLHC;( ,44:M_ptLGB;##/:721$3?@>;=SPNMMNRW\bjryzyyzz{|}~~}{yyl;4.."&2=>A@EUQPNNOPRSUV]enkdfcbdejmsxyxxvz:/'"%/3=CNQIA=9;@GHCJHPZYMFCDEGEIZmuwyv͆=* 3BD' )U}umkō@' #.;<"$&#&&$&n}ȷE*'/2:>0#.9BCC?@8;033APX[fnJ3' ,9??CIIOX\XX\\ZXVS[cmyutjɠ~P?74($#/@?CFBGJJKU`oyv|~|~vbWOD<:93.,.=HD,t[JFFTVV\[MHMX[bflla\cdfe\WOKIEB?=1*&05-& |q^SLUa\\`a[V\cu~wnic_bj{{wqw~rgj^S@+'+&##~|}}~q]X_a[Y^[c`\gpqmmxR/*$$&$&'zue_ed\[`eloipy{~~rdO@1.-+,wzzw|}vpuumj~|tt{xy~lkcSIDCxsmin~{zvrvoz|~tlf|{{~zrmlbe~rommjfix~s}~z`lux}oikihu~~zvuphceishgmklkh{tmu~~t}~poy~}rwcnk~vU$ ?|q-  ,`ߑ= FS 1po) $S 9 > M  0de' )N2"?w @  4^P*K_&  0$;%%'..7##Rεn`VPJD>80(%&\" 7oo7 6`ƷwfZQIA7/'#0!!+1ߏ6QB5Qhw|ypeZPF<5-#&;Vsm   RɔV#  $-3553/*'))"(=YzQ  DҮ|J&#%&'#!.?Sl8$  5}Ҵv\KCCJVfwu2* *`ĿH *7) $Iv  #/) #98 #(!" &2iL*93,-2VZ0;;32Hd$ &22=}q( !,3] ӄ0 (?i?  '>cW "8\u$ 0Or~uokihfedcbaacefec_YQߓ/ !+378;@GOTWXXVTTUVXYYWTPKE@  !()&#2AOSTNJJKMPRSSOIEC@S    #5F@12+-16;?DGEAA=f -:8.())'&)'*0ALD<6+$# ';@BBt($ /. 2[W6.+y  $3_}[KDǾo  +8@ILVqy\OSOpX (*!%-9O_my}mZJFY\>P[m}{zys`= #6CB>?@ENS_faWSLC?==?/(9KE*OOS[dkptwxxvutspjaS?'  #*49FPRKOWL7*% +%PRUTTUW[bgijjhbXK=1%!'(.4''2554.&  VXTOMOOMS\c]RPF4&" %=D?81(%.8JLG@EP>22!PU[TKHKNQUVK;1%+5*#)IYPFFOVJOWZ\UaeL340.K)DJUb^W^bhcb^SC, 09CG4 "/4(6CLVUX[XXZ[SCGGDAJJKO:+PMcpj]dvshgvm]F18>>:>?:/54/+FLDB55?;L[P>SQTSXFLTZ[YUYYKGA+/.$ ijvujfaXQIKWTRHC<3-3DZSQZYOMTL?<816+KG=5*vurkh^WBCGOLMPB785(*V^MUbWVME5-', ;TWchhad^YXFWWTNUURHHLOOGFA2T`e`]SOMROPKYhiUIRF1>KNLSM@D+%6DAGPSXXVX\[Z[_]VWJOTPMPMNBJNNQXSAEKM?>PHW^nk`M6)!)6@-(4/)&?6(7DGHJLMPNGEKRTJILSUWIJRRMJGMP?5OGJLILNFGg_ahkiVKK22ALJF9?/&AVHFD>=84(&.Fu'1CXjkXCL v]lxyqkebhsx޲y +ƢaG5+%!  ٹnO?g@( &,057789<<;<;;9;<=?@?;<>?@BEHIIGHJKPNOOZ2  !'(.1589<=?=<::>=::<<>BCBEEFJOPQPPQRTVY[\^_aR1  &1367626699:@AB??BCDBCFHMOQPQRTVXZ\^`bfjorux{S;0#  %,3598866534469=?ADDFFIKONOPSUXZ[]`ekptxz}D=5.)$..569::=<<9;988;<<=@DIEHJLNQSVX\`eilorw|F@;88;<;;::<<@?@@AABBCBDGJMOQTWZ^aeimsx~GDA=<<;<>?AABCEFHJLNRVZ^bfjnrvzf`VKB>==>?@ACCEFILNQTW\bgmsyn`VOKIHHJMQW\aekrz¶~ zojs=.   .>Qcr}B3  +;M`wKIC7(   1JeHKRRNC5,#   .HfSQWVNKDFH@>>9#  7Txpc[\XTVWTT[ZNJ>99*!1* 5TvqUTNST\gpj[BC?6178/# -Q{p]YYNKYpv_]XD1# (-)+" ,Q{DjR\OSVXmxmY=)#" ,.'  /V~mlib\KU]c_im\HA.&"(%!  .$/0' 6`~zxvwsoe_`XTTYkttlWF**-&4DMJA8-# @i𙝚~|}y|rkb\ZNRZcs{zgD. "!95%+L]b\UG;+%;Zߛyumef]WRHRSZlx^K: 14;2$($1AObke_SH<.'&)(/=Ut}tokkdXTTVFHQUfzi>;-$AG7.*.-6M[ZZVF;1,),-4@Sƿ}wupldYSTU[PAKZlk`L6('./86)#&! :BEJPKC>5/02:F˹{rjda]]YTTJGTnrdJ*6 "04:.-'1 6KTOMB66:##8AIW\XRRǻymg`YNF:2@Vg_C(%%&-=>=85=9./@KPZ]ĺ{rl]SRH?G^wiWB/2=<:AC:;>+&=Qį}pf_WSH?Sc~z^PJKTUNPM=?=1 ìxpljigfeeddfbcfg ѹzoigeedcdeccbdcbggͳwnifeddecaacbbcabacef̲vnigedda`ba`a``a``adfʰtmigfeddbdc_^a^^_^aa`dè}qkhgedccbdcbc^_]]^[]^^_bexmheedccbabddbaa`_^^`^\]\^]]acŨymgdbbcdccecdcb`_]^^_^a_^^`_]]`bè{ngda_^^_`a`bdeebaba]\^]^__``_`]\]_bܾwkeb_^\\][\^`abb``\][\^\\[^_^^\]arga^\[Z[\[ZZXUY\^_a`_][YZZ[Z[Z[\]\[\^^Ǩug`\ZXWVWWYZZVWVX[]]\]XWYYXYZWXXWXWXXY[ʭyja\ZXVUTTVUVVUTWZ[[\YZXWUUTWUVUTTRSRSUTUUǪxia][YWVUSRRSRRQQVXYYXWWSUTRRPOQQOPPOORȪuf_\ZXWUQSQRRQMNOOPSVTVUSRPONOMJMMLMLMOPQPPOQTʭvf^ZXWUTURPQPOPOMJKKMLMOPRROLKJKKLMLOOQQSTVUUWWZ]ϲyg^ZXVUTRPONMLLNNLLKJIJIIJKLLKJKKLQQSTRTUXWXYZ[[]^`bѵ|g\WUTTSUQMLMLJJKJIJHHGHKLMONPPQRUXVVWXYZZ[][\\]bҵ{g[TPONNPPMKHFHFHHIKLMMOPPQRRTUVTUVWVXZZ[ZY[]\]\`bcԸ{fYROLKJIJKJKHBCDFFDILJLPPQQOPPOPRRSRTTUWY[^_^^acdggi¡iZSOLJGDFDDFHHDEGHIJLMMNOQPQPPOONNOQQRTVWX[^bccdffkkllmnմs_TOLIGFAABDFFGHIHFJHIJKMNPNOOQPOOQRTVWY\\^beffhiknpsuvxz|lZPKHFFCBDFGIGFGGHEFEEFIIJNOPPTUVVWY[^`aabcfikmpruw{~o^TMJEDFDDFIIHEDCEFIMOOQTUWY\]^_bdgijknrw|vgZRMJHHFEFGJKIJIHFEHHIJKLQRTVVXZ\_behlosvy|rfZRNMHIHEEFJLKLNLMOONOQSUXZ\^adgknrw{ti^UPMKIHGHJKNNOOQRTUWY[_beilptx|xqg\UPNMLKLNOQRTUWY[^aeintyzoga^\[ZZ\`ejnrw}ƽ   wpg`]`els|wrkbZVUTPMLNPRUY^emxyxvrkd^YURONMNLJJKNRX_grx}yupnid_ZTNKJKJIJNOPQRTVY^eo|vw||yxvvstpqh_URNKLOONMNPRVXYYVUZcpprxzz{|}||{wrnmjd_gcOHNONQVYWTSRRQRV_myvtrluwyzpqpkikjhd^WSOMORTSRSRPOPNOQV^j|}z~uory{ss}~zmd``_dffdc_SLKPQY\USRRSUWZXW\h{PDDQglmmfdqqvxyyi`][]\^fhha_WRRUXVVWY[]^\[[^j}$#-;EKF6,8E\fis|||oka_^^edeeaXQOOW\^fdhhea][[am'(+*%%3I`lqtxwnb]d_]dgfdba[RTaluyvqlhd`\\ao$'&"#  2Iaipwpc]XZb`bdnoh^Z`o||uohc_]]bk{%&'"!#$ 3Mabtw~tj^WYZ^jmslhjjmw}|uoifedgmx'))'))+))*)%   -Qjlpw{li`][cotnklmlcir|}tnjhggjpy.039=?@?CB:5/%  !>bkir~sg_cehlmggiid_bptuxzwsokikmqtIPUXWSOOMIA8-!!)Hfpnxscib\[dikqlhildcfqy}xvrmnqwbfebacb[W_bYMDA:7/+,3/% %@dxut{lom`\_fljlmspi^`o{{}~wovy{|vmpjeqicfaWTOMHHLKFEA91'!"AW^gnuuna\`felnqlsqijoux|{~~xlrzxtld]\e`^`\XVSNF=60) )AZeem{pcbdehpqpoptplnv{}tz|wxwt{~yp_YZeqonidb\WPMHD<4& 8Thko}qgbipomqtpstlgirz|tmhrrns{wsnffbfsvv~nypnbZmQ@8,1R`gw{uv}~xzwrvsnc`dԣuI%^0 㸇T)  ḄN$  ൃN# ԧtCڣk8 ޮw?جzG Ҡl< ۦm8|C 㻉Q"ൄP% ẅN" X(  Ǘa0ɛf5ɚe4͡j7 ܮxB̕W%   F $)-39AI@ #+16:=BIQY`hq}   &-5>HR\dlt|  #,5=FP[fr~   ")18AKXgu.# #.;GS_kyΐlS<*  %/>HIC?9<80)'( 'A^47BHGFIJGGMM@6*&# :Z|?76.(MfnXQH1! -T}(0IOLF6*65>FLgsgH,  0T)*%  *)?RWN]cM8,   "7\,79CL^ki^E2 %3<;60)!=g-4EO#%  $ -KB?ThJ.42!(('/;, 6NOSVN>NU=>6,2*"4'  *8@YYC3 "(02*/- (8DLXb_XYKJADD;'4<93-&%  "2O`X7&787,,:/+7EU\bg5:BB;>:6=?<4"20-"  '.=YsaN:(/872==26:,*3FZ@6*&55-8=;22'' '88:D0;E21+!:&+G^}xZMGHQRJLE:?92&#-+/(j &&$'"' -OIAO UO"/$(%,' 5) ++'-'/&1u3A5 m5-ئj0&֤g-"ΕSݮs6բg0 D~D*JÍS mǍL2ҝa() ˑO"ܩj+՛Y~7 ΑM"ݤY 'ݡT +̈́4-Ȃ73z+4Z5t7:=    ,%""  +'    /-$ *.$   !  )1**$  &3 "   -+$ )(  "4:$%%  %.*    '+"!!)484 &$"  .1&  (,,' (5870-!%##$)4,    '*'%"""*484/)%"$#(2(  !&"  "-1+&$$$  &'  &&!       !&$$""  %(-,28<=@@CFGIK ! !'*,,19<@BHIJINQTX^_`cgjk   #((++236;=BADGHJNTUY^a`_^_bekllosut !$(.2566757:?BA??@EHEEJMPPRVX[_bdehljgfefhiklmmlm%+24468<<:<>BBGEKJHJIHJJMPQX[]_^\\^behjklkkjjiijkmnn67789;;?=?@@B?>@EEBFGMPSTXZXXYZ[^`cehkmnmlkklnprssttuvwxyz|~>=::<==?BBEFGGJLNMNSWZ]aeilnprsuvwy|~?=<=   $*/15851325:EFBCKOO   %(+07:>ACB>>:9;?CDDGJKI '*-../15;@EIJJGECAABDFHKLKK  #'+.26<@DFFHKORTUUTRRSTVXZ^beffg $).26:>BFILOSX^bdeefhjkmoonorv{ !$(-16CIOTZ`it  )2:CLU^fow '09CMWalxS]gs     ( !) ) $ 1(2* ' ',%&& !!" Ud}WX\nYZ[^_^j[^`aa_dbr gekiihhggiu cgosrnkiiggis?Tcnrrqljihhgir -ҩ}Q'ѩY5ṉY.ؤe)&ϗX+ڬu=2~>z!=҆3;h8ρ)6ӄ)4Չ42X/x-)1.,,(+'$  $&',+% ,2300,)!&$& $("&334667877:?ADGKOSW[ah,5.+*(%()% &()*./-+%#+34/.-% %%&&)*).+#"*6745::99635;>?@ACEFILQ74+*,((+'#"&,,-.-++1/-0.+''(*(&**,-0("$4;567=;=:557;>B?8989:=A84-,,..+*((+21,,/4/20200.,3-)././2+%09:74599742358>:934635;@441-.223/.+5871..,.3633530.,-2../3.1+*1<<9:940-.0015?=684229C01+,-0-,,+-5851/14124549<3/)'-3221,(&1AA?>:70--+.129;74641128AB&$""#(($$.3-((+).2316784-%$,/.*++%'*9?;;<81*)24665982335614>B@!! #,+"'*+-,00#"%#"!$"#/862120)""-20,+-.,.1334;>;<%'!!# #&&+) """,/,&&"$" $%*),4;877")**,0636::931037234347:>;86440.-.0346651.--' $,($#-1,,-NRTTX[WTTVUVWXWUVYZ]^\WVSSTNMOPVUVXXVWTUUQPQPMGHHC>;;3298340jigegkhfcecdfddfhiijoommjhghigdggeinpqrrstsqrusqomlkjc__^[XXqolkmomlnononjiknpqnknrvuvvsuwvvwxtrpprtuvwxy{|~~}||{zywvmnlkklmnqsvwxwuuvwxyz|~~|zyyz|~nopqrsuwz|~ゃה꭮辿    mrvwwvusstutwvtrps{|}||zwrtwxwtsrsqromsz~~~}||{rvuvuvtvwtsuvwxwyvvtsy}~~}{vquvvwwyxwwtppu{~~~}|y{~~vutuurrttsruwxvxyvv{~|}{vvxwwxxzywrpsy~|}}{{~~~uusrrttqrtyxuuvy~~~|zxwxxyz{zywtrw}}|}~~}zwy{}~}}zz|z}uuqpqssttsovwxvttuut{~}|xwvyxzyzxvtsx}}~}}{{vwwxz}|~zyy~sqonoppnpoptwvttutwz}}ywtxyywwxuqsv~}{wvvwxy|~{{zzxxy}nliijmmllnqtqppqtwz{|}|zvtsuuwuttros|~|}|xusxz{zz|}yy{xyihhjhijpojhjmmptuvvuwwrortrrqqpmqv{{yxwwtrrvyywvxwwxxwxx}fhjhfiimomihhjllorssvspqrronolnlpuxwusrsqnorsrsqsttsuy}~}~oqrrtuvwxwusruwvxyyz{}~}|zzxvvwvxzyz{zxwvvssvutrsqttrrpsy{zz{ɉ|{}~}~З󝞟'   '   #(,2;HY    $(.                         $()')..1,,+.,++-././/002110/,+*%$(&*')-/,..0.*'(% "  >@<:=A>==>:=>99;?BBCCDJJHHCBABA=@A>?<=BLLOPRUTPMNPPOLGBAB<66741/LJCBFIFGLLNOLFCHMLNMIKQUVXVSUXYZYZVTSTWZ\\]^_acefggfecba_][YVSIIGFGIKOSWZ]]\ZXXWWVXZ[]_bfilmnnmljgecbaabdghjjklnqrttsrqoKKMORUX]aehjkllkjiggiknoqtw{~}{ywvwxz{||}hjmortwz|~       &5z6: µj\SI7 r UZ_fp}FKPTX\`en{ACFJMOQTVZ_gr CBCEGHJKMORW\afktD@ADFIJJKLOTX]aceioy@JIKPNECCHLQRV[^`aacglt=@GFBE@=>@?EHKNSX]_bfkv11+,3300;EF?:=>A<:;:AEGLMPSVY]aejp{WXTPPLFEHH=96;945578=AIJLNNOPSW\bgiltutsrpmieb_\XUTPIDB@?=@GDBCCBJKNRV[`cehr~~}|{zzywurokfa\VPKIIJKMRUSX]_aeip||vrokgb]XVX\\]`cfkt﨧옗~xqjd_\_ddgkq|ý׷|unighjjkoyzurtvw~¬     (*搔∊~~z{y{|}}爆{{}||ꇌ슏ߣᰮ¾ýȸʾ     h1n 4?CKWk *./.0234679=CL[r  -.,%%+)*+-037CJYp "(*.259=BISc{,+$!#!  #$&),-037BHP]u~||{yusstvwwurnid]WQLHD?:51159;7996688:@IYqþ|rg\QHB@DFEHSg¾th_WPMR]\yɽ|pnnҸxl    33ުg(/LJD *džA&x0#ݦb  ΍D͆8v$ӆ3u%؏=m !ρ+ "ږFBs z("D~t,0lx #        'ȼ ǻƺĹ οʻôƶͼõ˼ǺƼƼƻĶñ瘝®xw|uyzԼ}{{v һ}|ss «~zvxʹ{y}yw ռ񊏏z}~}}x{{ °{sx~}yux{ ȵ蠔z|tx~}|~yswzx Ϻ婥||z~|{z~~|wv{s׿垒vwwy}vuysƶ~xppu{vvxtxwvʻ}|squ{yxwxz~t˿t{zxz|~zxswvst}}{{~sovux ļyq|yz~|x|tploquwͿuyxrzwrzvm|wssrrqvļ}|wtvxlpxompss{vqsrǾ}wzxpz}qovtpost{zsrn~ɾxtrpw~}sttqqsrvvsonqϾxspnsy{vuspqnknropmw¶uqonoywwsqnpnlkhkqonmozȶwrpopo}~}xspnnlmnnljjstʷ~wsrmjl{tolmnnoonjfekuoϻupsslju~tomkmmnpmnkffenwsDZwojoopw~xjljlhhjkjokddiuxrھprpkosyw{~~ofdfjgehkjqojmz{ri̶zltnopvrrzsslhfefgeksqrux~xk]׾ysypooqmpsmmljjfcehrqruy}}xnhadz|nkpprukgkmmkdfhpokqqyxtkhoֺujnoovmhjkmplhkprmqqomlho}ɲxkhknovmjhknnmnotooppmnjhbhwp׼}ykkollpkhjmmloqnhkomnmjhddkoȲ|~zmookiljlmjollonjhlmjkkllkjlmؼuoqjijnmqlklkorgfglhdglklmkmmͳ|qpojijmolijjiolfhiifflkjjlunojikkmljjhgnghimeeijddeijշxnomklkklkjifjmjkjmneddfgcddgjűnlnmmnklhfdelokkloohffheaeddih׺xkmljqvplnhcbgrlkjknolgjmfdfeijg˲}nkkjmxukjld_bppkhggnmklknffgjlmg{nujjkgozkjkjcaivnkfhjjhjiklkmijlmlҶәmknkjhfswkmkllowrleefigffbiijjkhllnįmlnmmggxsmnortxtmfabdggeadghljghmnmָ|spnmmej}slqstyupjecbgfggdcgmmehknpmʱxnljigyzsuutqsmmjghgjgdecchnddkmnpnskllkutyxrojjkoplmjkhedcaihellmmon#Թ ո~ո~nʹ}mbŭsg_^ؽ|of_]`iΰlbabdoxwεoc\__hzyؿsf`b_aex}u̱shdacipu}qoս|pjgis{umg^]lѸzsop|vf^\Zawиzws{oacg^Y^gҸ}|t[[fpbRU^Uӷwx}hdfgaUT\^Uײwuzsg`\YVUY\[TӰ|jZWVUVZZ[UQU֯{~lVUTURTYZXCCHԬtvyuvzd\ZSSTZ`\L?FIΦjjpw{}oq}vj[UXYZ[ZPIGGB ˥~fbfqtworolvrpj[\YRURKIMJ?> ٲsifluwlohimebjd\\URRNMLLI?C ÛxposxkfjcnfZdj]^WQONKGDILIG Ѫ{{{kjdgpc__W]ZNGIMIIJIEGG ֲpg`mtjhUOVK>CIKKIA?HG ⻝zh`apttdJMKCHIHHJGD:@IC Ʀud`cpss_NMKIKHGDJGH@BG<Ѱvdbfhompm[XQOPLB@@DIBLN>F>ٸ}jajgejcm`TTSNME:6;E@BC@EEDzvvllj\_ajlRLOOLJ>9>EFEKEEIK@sqz|sp_Z[diTDINMLICIHIDNC>E[RDưvpw}ucU[Y]W@CLMKKJJMMGMI>5BODCԶzsrwqdVWWVWHS]M605H74:@>GB9<5NһhR[YYULGIG>IKL<7B@87>@GYD<71Iݽ{stzz}]SUUNC@=:36ƫzghku}{o_bVZQE@89?OFJEB?>692(2PW<584@Բ~mh`quvjeim[LE;;7.04458450%*):E@⹖|sloqgkqroqoPG;0:;>GLOOE.3.0)+.0,:0$&/EH?׫~|xri^^iqpooY>?8/:@HHMLM:%!',(!+0,<7.8JI?1}bRZedmnoI9C97:DAAJDB3-*)'"$0@;=AHLME2ҬZSU\]nqiHEF>79;8@B663.0*!"-A<=>DIIC:+߹[WQU_qxbNPJ:1::AI3*096/'%->;/99AE@/))>Ѧs_VNTbwwaTTE.2:5F>+./6;1+/>?6799543-7N;优~{k_QFTcusZVW7)067F60+07567:@:78622.+-=2ԨuxbXKHYbkhTTR75733>0+.4407<9-276760+$"03Ἐ~vnSQJN`hhbMVJ8;;0.5036.71196.)36,/4335056ԩ}xu_OQPVlleYNQA=<0*.76<30107A*'(3-$*3558388Ù{}xt[USWkqibWVK?>7.).4:5/0.275*-//'',3542263౐x}upcYUesfb^YSA9:0/2061,,.)+5*-/8))')1/&&)16Ρ}spqhX\neUZWSI9:603001/..',42004:&&-0#((&.4㶗tfpnYUcqVUTSM717468503+'&'37203;:-'+-)'&(3-ӥlfrcPZclWXQRE081239/*%0?//.0995.48,&+'10.~miz`QU_hbSKN93206EC5.7(#>>0-,*96255:-),.36*ݯ~~qp}h]P]ocG:A225,:I5.00# 1F:5)-22-.-53544/14-̠~~utteS_qZ85:52-'>E04255?GA5)''1.(%/00)015ᶔ}~zzxhVdlQ89:88..HB65=?CE@5'$..+&.-30()194ңzu{yxd\aaK@>:88+6N@39@=FA@0)!#,*..(#08:&+/5:4侘|oq}~gZ_eVOI950/0HJ>??>9<880.-,1.()'*5<*&04585ڰvcpqTVclWSD2535CNCFC=:5/07;3622/'(*&63&334675<#:%9%817T5|4'3X2G0!/U- ,. +4 *. )%( '#& %'$=#<""q!@  k@# t4!T +  !m"3#$$N%%.&'6''<((4)).** *S+, 5- - - Y- . 8. . 禢㎌|wxuzޅ|w|yy{鉋ywy{{xĐ}{}~{|~~~}twzz{w{w}yx|x҂{~|z~ywuwyuz{z{~|vs||}yzz|y{z~|}~~|{~~u~||ruuz|}yxzxsx{~sqqtzz~~zxy{}{|ywsrx|x~tppvyy~}y}z~}|y}vvyxyuqruu~|x|}ytuo||}z}~Љ~{w{sqwys}}{}}q{|z{y~}unqynntvt}~|~xv|pxz|wttvrpqxv}vw}uuywyv||{|y}vms}|}usx}|opsp|ytv}|}|z{{xz}{}qux~zztsrpswt~~~~yy}~}{px}w{y}~zv{|}|㇈zmsuw|w}z||}}z}؉w{uz~}~{ny|nu~wwv}}~xxytr}z|tv|zx|~|{t}zztssusw}|twxzx~}}yxwqqssv}upv{{v{{||}{|~zutvuu|~{}y{{uv{szvpwxwvvpnpsutp~}ur{wtqqwvv{}zzz{zwwqqrqrqplku}}}uxqrnsy{~}{v}{|yxspqttqqmltwvqomoy|zzw}v{ypsnorsqrqptqop{w}{vwoqszwvzz}zss${rppnkppmn{|}y|}{~ur|}~y}~yq{~yxqnkkjnpoqvttswy~z|{vszzxyx~qqyvvleginoonsqpo~v{zry|wqx|v||wkpwqlpgjmlmkpoqno}ts}uvsry~qswyxu|fpymnklnjnkpnvrt~vzyssppqo~x}zskrklrwspqlz|qvzu~{v{rqrqmswtvttz~|z}{wpjzwtrstqns}yu{~~xwq}~|}~kk|u~ymr|vyxtyt~}xzzrs~sijnx{zt~tuyxxltuy|}wtz~vmideizzvxwypm~tw|xuvxx}{w~rtzgbfnk}z}|trvwwmq}z{y{y{vm|tum}uvr{o|uxtlyv~}yz~{tpn~|xmmmv}ssh{rysut}w|}w{ytqst~~zikyst|gvxntsup}trsvzsms}vqoqwos{nfynwqlpr{pztqotsrpptqurzssollujqpgek}tyurtwpotnrnnoqu}}rronmp{sml}wmmoorrv{oh|xkqqtuukknopqyzvrrk]kphxzehsmqtxoohnmqq&yqqrzft^egfooel~muto~|uihoqqp{srrsss|umvrkeffmmzspqqtplmojmpdqlqrmoqkmphpoljjhhojv~uxx~qkjq|kjwxohkorytnlnnlkrni}y{}{momlmrqqrpqtqmmuvutpjlmzlqokfdki~wnnopqprppsnnxrqow~{t}wkpqmik~nopnpnqomovqmnpqmjxu~zztutpvxomjlpomjnjknqslmn}}{ywvoxllgjlljeehhlpp?mjl~z}z}qxjcgfjngaeglkhgdeglnmsomlw~~wsusmukefifdaxe`dcgnojgklmkjopspsuwunlr}uqurg_`ghgmoktmc_bdgmnnklkgghkmnn{}tvonmv{tvwpjrmgl}~poi|uhcbadbdchmmpqmhfegjmol{nrsnouuwvt}wz{nhusnxlehrshgb^ecdgjgoplngeaghlkinkttvrqtprtrtxljtkimopkhgifebcjmopphdcglnjilqruspnlusqllnsnwlkoqv~~geadbglpruplhkoqnnrqstrnkm{pqmjgmnxwjhwlmlimopf``aclpqsrpusrqtsqoqtsrljigiplhkmjdfgiv~zkcpiiedmoomig_dbeoprqpzurrqnostqpkkfdgorjtpkgablynd`jjddcalkljajhcjqroomimrssqpmkoopnhhgkrprrjiegp|tmmfjd`jf]ghliepooqqploolnsurmjekyknrpqkklqprporomouu{tmlhgbrkbgied~vqonnooqljhsuaZ[\\]]ZZ\XUK@C>IZMOTUSVWVWTSWY\YVTUVUTTNIHIKJqhdccffihkv{~l_]\\^b^[^]SLLNJGKILNMTVQUUTWWTUTUSTWWMPROK@=@CE@dZWYY]_frtumg_^]_cgge`[YRIIKNVSOMRQXXUVUQURRQQPPRRPTKINWF6@BDG=^[[X]fq}~qj^YY\Z^acggh_XVSTVZ\ZYTTWZWTURRPPONdWNMMeyZDQ|K?KACHCcca_cqi\VVWXY]^ionxm^ZWVYY^ZXVXVXTXXWRJGLbbMNHMqtSI^fMFE?EG>lgaarr`\[_^]YXXeilha]XQRSSNNQRSQPTXVVd_KPWIJIGRgXLKMOJD>KRQLka\f|sh`]\YZVNSUXXWW\WRLJIUIBOTVSRSPPb~m[NIJJINPMSTUQNLOSSQMg`arz~~oc^XTRY_YNSSTSWRLJINMMJGORSQQMMK\[a[TTOGRONQOOV_[[XQNH5>>rs|xbXUTQNNZZSQRTRVWTLDHIHEIQUXTPHBU`^HMOXRPRURTTVZYSHCGG8316{waWWQPJFIOMMPVVUXWNDHFMLIQVPJFE@=INKMQRZXZYXWYVUWQNQ;.0?AATHz`SPLGJKNLNLOUSQQUMDKLJHQVQKBBEHLQSUWZXYZ__]]\VOLR_Y935>?{wR}pslSMRPKMOOLMPPKDNNHVKKNOQUUTQONSUY[\]ZWURIa]\ZWMOMSRhMA8>0CiJUY]cXSUVRKKJKMMILPNMOOPOQQSRSRSVZYRQURVidPXSPRKWyqc\[C@G:9GI@KSX\YWWUODGIKLPLPQPNPPQOGNSRNLRQPJFGTcw~`NPDIOFnU?19F29@D>QPSUSWY]ZQLNMMKMPQNMPRQMRPPHMN[VLQQKC@ObvPK:CDHYnNE;=B949EDOUMIMNXXSNPQTVUQQPNMRRNRYpvgK?C]RMNNK??FNrvWHLFJJGPSPJHK?.:DQLQSSOHKORWSKFRSRQJNNRMRQSrY?BHFCLodHKHD>FDhlD=:DI?:B\NGGPVBECY\QB@FGJLMI?:B??QMHIEFPNHACHCH;BYGDdrvEEDB826>A>:WNKIC=RWGB?=MW^X99E?BGJIDKNNHKMBBCBHXdZUQSTUXL[dXP_o{EE;979=960->IIS_KYYM>@4ObX?9BIGKLHGBIJMMGECAOXbgnpkhYWRTVivdRO]cCO>69;=9910>@BqlPIYR9LL;8;IMMJIIO@HMKKFKOB[lv{saZWY[[WGAPWY:>26:<6798>956QwxKE@DC@?5GL=822/8611GZLHIELHAHKKNQPPK?=SOHIGQAFYpLLNnusbXUJD9GIFC><`xZ@AGKEJKJEG?:GKDKzz\COm|YP~VPYQMGcDCI96FBDq[8/,.1355<943TaPRWIKBGBQZJ9DH?3KkjXCJk~_y~{BHHBpuRea(4ERayC9B00.0.+359--CLpmaSI=:Y]JF?B<7FRWG;<@isaiv`FEJv[RL?HPjU0@L8906702(0%9HWky^R?7=IP?DFUYN<<24295NqpMUar`EIDoi>-`cl}rA78AHD@AYP3<>DXXK9>>aDGYqyZLJ\c`i\PKJOMH>4PsPDbMBV[lkECSoM7<=6Lww{jj]bT9@HJA>=GDQ^snlsGgYC@4IQQLPMKLRM75RREQIFVf^`R4?juJ?F@=^w{nLhV@IFCBBOX]hrk[cL=:blGILO@GJC??CCMrueidTFGGKMNE[yzl]kU{f9>I#'15FEKZgh^J>:B@@6<`mQDJJEGFGUAE?4t|igcXEJOQPNBNkzgLQ:?U2LQCD`=GpoefS5KE>@>1DWQBEDDIZe[C;42UZ_b[LKDLJH@YtigTpX..y~m4?KS@YD-Gki`^J=AAH@BGFCEy{[EA=4<=[b^WRDGDSyqHOeG%+dw^@<>HM&BxUE6C\_fXJ:>4I`T>;93=S<=86=9J>7BcpeM<:3--KkfaYV;$6PlzylN8 -KO_Zc_`_>WALTAYWA@E`N85AL9=92569;FfygbI:73/.6MX[WC:.-Fiaij[?.,Jijh_qrdf]7RK:=QwV=DG:-KH/99=>>jn[L1-5:89CB[aT?77Uf[fr`]QKi2Scwxluu7;+En~TJZU)-W@6<>WC5c|sXO7)6199"OjjbA497BVp`gtuX+>v|~iVc ,(%7[Z?\hT%3O4CAQw^:L_geKG.+799:S}YE:758IMr_8:pjJA4]y|LD\/2)**88IeP@;<3XweQ\olt8=.4;$91gqjU;7136&2Wc8)rorpc\tR::_x02.-,3.BIAHEKN;1.<^gh{YJ52GE5)-54Wq~ukgzj`/&%DRw{yjeO^vI)#(&.67.&/160.7:<::A?>/-5Z\D>7>UuyhYq]7$ ,+(15OTKjiPmO/>S4%)+0675010+(+/422GF=?/*,@?=I_yw`@DUPC1#Gahc>2L`@)4K8!$ )*,04-6832%)(+1+#2-=9<79:87=:;jy}yye^_N@+*WWZnVRe~^6 *04+$K//,%%.4588)$ (12**+94;8620><9-0O]mWgwYVhh7<2ZfYdlnW=!!-4:76;<969;870*%"'80%/.,,SOBGE^{QIQ*6%% .20.%*("%56798DO>774138=46(( 37$=4( 1FRPZhstI2 **0+)&0+ 099530%.7:8680-55842$$+7877+%8JThs}N6*',,##)+%::96077028<70.!2F02<89+-0;67637505??GRazayZ6,&"A\L8&$:     {s~}~tw}~x{{~w{uzzw{{|}|}{~op|{{y~}|~sv{sqqz|}zz{}}vzxx|xtn}~zkmkt}zxx||}}v|uuw{wyv~u{yonnk{~~rvxuv}tyw{{}{zwrtt}~|r||vw|q||uxp{tvoz|x|}{~w{urqy~}}y}x|r{~}}|x}~~{{~u{{y}qs}xuzz{tz{}~{~zsux~}|xzyvy|uwztu}||{yswwty{tz}|{z~yxv|yu}}{xysv}|v{~yqx~xy{~utyutx~wws{~yru}|nxq{xz{wvwxq|p|zjswt|{z}sttvu{}~sw}}{x~xw{{rjmvyyry~sxtswtrvzv|}}swumwxx}tvpuyuurolwvlpxyjt}xmjpy}}roszrorwttuz{yymltt}qvvqqrwzst~urpnmpxnqzorpqrrsrvxv{ptqxz{xwru||w{|suzy}uwyxoygglnwrlhoqspovz{wrxwy}wrywzwuzwzyy}{uwyxwvssu}qgkpzsp|vrjsyv|oy{}{quy{~tx{wzyuwzyyz}qnksvtr{lemppuv~srnuwvrtwvvz}|}|}zwsyw|}~punozrvss{{rwyxz~{zwqyp{utwoq~urv}rtyz}v{}{{xzyz}plmor}x{}~{{xuzruorrwuyvrwy|~t~rxxv~|vfruv}v~znswrx|svsutsq~q}zgoow|rrxxuqqt~yº¿sstrpyz{~m~qzvvzu|y|pmy}|pqouyx~mv{kkv{vsquqswv{|unktpznjwsvv}x|}|qw~njygvmjp{r~hjp~|otuppy}mjmonvru{qgemmoo}tttlpom~ox~kennehfelu|zpqtuoeqp}vljtcbquduzmp}png||~lhorlhfb`ili}molvynoq}mrgyqrlnjptslth{ormqqmhowvyjmhx|nkpumhxflsppt~oy{pu{pqor{klupnpqin{fhjpxzuzpn}wo}xtxooq~}zvyrqmomsrtw~o~my~ptqsyppmv~ruxrkm}}rtnxlosp~nno~o~pnowxwpzrmgjr}qlxmmk~mu|kszyzqlfgijvrq{qus{{yvuzumzpnmmzunr{~rmlgfonu}}wxtqpuundhoe~qgdfgr{yhggjlmjlinlmotzogimsoqvtuspstikw{zmfbhkilmhjkiikfhfggilrltomjqpwtqkoirlljrkdbfsjklkkjkkjjklgffhdkpljfefefkoqqsjltkuksslfmklkifbjgikjinmddemoelfehdbapvbfelfbjj}quqiojw~khheieeggjghgkfbbdc`fecg`qhrqnoiikh}ffkn~kkpffa``dfidkdhenoccarfcedd^jmf~tjxiigfdgjoc~yjkjemoYfhfjncgedgf^]djpthia_rrijgs~rbc^`jvgqjifojtlqec^_jshop|dghjfir{skjdqrjix~g`ctnrpgmy`Xc|uec^^mxsohYV^kxmlltqljnoolgu~vvrtn`bgmnjmszfnglsevvcj}~mjhkszoquprkjfulyomfbZ^_elmxsmqjrmru}u}h~xroqpstvcugmkd^__fkrjfosnyjhlt{~tffsrorropnlq~z}tnglifdfjlz{qkhsrmbek~qccfqtotxxtpylo{mjgfdeeght{rjefifj|{irczpogkcquhv~ppmjccl{xe_ddacacdglk~sdbcge`ba`]dcnidiqj~nmqkhaadvejh\a^c]]^`adefehd`prxkhifmgkb_`aao}kmfhtmejny}a]{~ligdeejc[[^^a_vl[[]ccbdbfehnoidfiogixvitytqpkda][Z]dr|qc^\ahlcdfnuaf_^^_\ek\[\_]]acahciqxma`deezsjtjmlgb\\]_crnne`^bff`bofed_`a`[_W\[X^\g`[`adeedYY\dfgfddhzikonki_ihegfklkfcciec^[[cdb_dcdbYYWY_Y]agaXY^jc``Z[[]ddfceedjfvpijkegdeehggkeekfl_aYYWIOSJLJGUfeZZ\VL8JKIHLOKSRGM6=MCE;KLD??EGOJNPLKKRVSNOUWTNMOTUTNHG=FTLC>BTTI@GQQGHLFBFLGLWN24BIBCE>GZWGE@BMNLHKPTRLQRRX[]RHEERZTR8?ER<37GKKEFLNKGLRKFYTf[bL:MVRIA=;ATD@6STUSNRUXYYXYY\]USND,CWSNKIRF21/>LIEEKJKIBOONR^kx[XBJOTUSM>AHG=@:UZ]YWUY]TPLUX[YUPFKA9PRGDED::/IMRYO=BH?BK@IGO[GICCPTUYYRMGG@57GLQZOKLPQPLLMSMMPQOMOU8DLJMKNKANUWVPJJVU?BKPRQQRGFF?=HNMQMLNORNUWSLLNRULJRTXZZVY^\a]]UK<2BRWPD@BFEKE=C643;GNGECBC?>HF?@HKLIFGKUdmh]O?CNTUITXSPTYWWTOAFN;BT7HCGIQNb_FCB;FAFFEAA?J=DHH/=HRHFEFKOWjl_L?:BEKKOI9?KLHB8>FBBCA8HS?WL=:mb^KAQQSHHBCC?6AFBCNGACLOGLQLORQGCQ[\Yr[mllmQ;AYdc?hM=CI^qepQ=7EP}yLN\OJ.BJcYIDINMOQSSUWVTPOOID5>FNia\|sFIafd:KpS;GTfs]@ACl|]=?J=H;)EbWSGSXNNJNKHIHNOQLHN4XWHt`IhSS`NS/DJEKGDg\DYpvM558E7?L__a^``TCJID2:GXSNIMFEdlErzuWhewrQKC@GG=,0BDF5FGooT>EXb`J32=6/8Ycfcbf[A:BLQGCRifF:?;QWV4JK\PEKM@B3?FAA72*@B.8FH,CLE1,8@FE4)0A4-Zktb^[R4=NcWY]bir;69BCFF43CELO9DB65:@OB:;LPI>74208EP2;I+40/468K7W{peZW>>:=[_hlqux.5/@AC@E7?JLE?GJ:9KSNKBAJKMJF>@AH3F""-/?7&-1:8Qrxj^T-?F?WbcfmyvG@5;?BIKE7A=A=9B?BKU_YNKAAFC68>@=B=88;FK1(;J:4Hin]FC*8A:PXUSR\kSH+ACDGSV99>?A9@M`howof\[ENT=DA?@>@DAABF9/+@D=:EQN3%688HEFNH>BLOqbY`RdbbrgYDEI851Mntw|k?O?BDIHIHIJJKD@`dorhrU/-Bro7D88CC5??ABKMCSNGIQLONMKLFEPIENFfEM=@-9^cSdG>K5?CEGHIILMGGIKP[nec]WURcrodsbb]5;SdyztiwJHZi_5??i\MLSjwT=>DE?4?@BYA5IA-;>Kff_fcbVQ^[]\isquxyuxy@Ga{uB?Xrc#T?EEK@G\aQLLYD/8?4=B2826381GdrxskUTPRY[[es~y~~3F\I :9CJSfQdSIM^gd=NU5?@3/*5DN>EWgpqlX[hkhRRLbufpR8:676@BCPhdYmGKw{j.GS1?<9<7JV_WSYYba]ZVatuMEVTAUJjO0.ADSPCNSUKStNTlpP3409@?SZGNbr`VIGNSX[_eyoSJziYdt0?Z_|iVG(%?aeVOE<64;L]cgrlV42=:?JTJKfyhXQNEMMOHXaeQ\k?2ZzO+>V>Id{lThR4$@jvtcU_fkG?gL&+Iaqd\c8MJ29RXKS]XOb~VL962ASprr\VSW\`mxwliwrdF,$.52BsnL?OiUCXubJGKsT7 ..5J7FMdan}tU=:QWZstg]eaUZOSdyn`\RN8.42.\dT`lkudI7CvG122!)""Ui}ko0JY[dwaCNYj]I8Tnaqp9PXpX;>-wvYS_p{~lU;>oSZL@1*=Qm|`9>ScklQ$EfxhPDSct\m4:d^F2/J{tNMLYsyo_cfO-+770#*OVwP1QJ0%F[kp\6:]sbSWU`cd_1BwoYA/3;IYagNawsru}~s`6@"A9709'8>+G27MT_URNKWTRUUVTUY6<\pU90!-@R~eBAfWvce[Qjxr,4!@GHLH5(2;4ns1E*)6..9DJRTQROWTG/BCJ>\piOXT9C2K\;7@ImvyWRli/+9PKSY[Q3/.1%5C&$0;?9B2/FOXUVVO5)F]XCgkps}U;@-JaiaUO59GzxXlsFEIQ[REPSBE::13.3.846=E]\0OYlfYSYA*AZdMGYhR8618Cu;:OwmjQNrmUQXYHSJ0>E45>9+.FDH46SkY&;fsi][ZYG+2J,*&[pMP[GYoY6TyoJ`Hi>F,:Uvw?@al\P<1# DjqV>4AJeV22.,NbA7*1=JD1$'-+7CKC=;EURNl>76;>YZetkksum[2'Tlk_3E9cM&# 8?=885%?CA*$+!'*" &1)9QH-$/4=|96+Q=6prV9)+$5/8$%#%-,(($"%%'*40$&-698(.;u]/>/fj|@NmQ80,&++'$# !10*/+:D# *(KQ\R9;6%5,bYH^^oD+##!!$" /%Q"9+A\922!%!&+)LfgI(2L~wkzuG((:#* #%Y`-#"57# =%.6,O>'@!(0S]U-"EXtp@$('6]Q:#+*^T.9 ",\c(,%*2=)/==%$ &BBK&,)/%%9CK<(*97*!@UOUG&NSp]b~hrojnp;7=8 4H# -KP?).F<;10CZ0)+99+$/--&9SVSWRJGY^@Sjw{dMBUU=>2".5,S8@^r_B#1$0:'D? ,FPE,$&3F74# 00LEatXJ:.4,=69>FNF>DM)KM;4'/046CNIG;%<5-41-0/0OUYQ4IjpD_kuVFR=1"+'$+U^{wBCw]Z6/ <:\k8"/JKG;9=05;;92@KMQL+5ShXTfiaVC4$!6UnbVEOqxvU=*%,J[E/=OE25&/;?&:DI2.MUOJ.$+TECQQ' )(HYYLGS^YdX:   !S/%%O9.K5.U\J9KhWJ(! ?.#  $45@I[TJ+!0&-2C&.)>4".2;JOFCE+%. D3 2RUQ2!3#*C<'9D=52'  7B4 +19)P7  '9=1  A8,QXYUS;"),  72/ ?d   & @MUp^%-2/("+$!"++( "   0 *  .Tp^%?2! %# ((0 ïqic[VNF8Ekzvl\`]YTTML?C=/DzxpigaYUN>:BOp|pgc\QQIQYYIHɽzslkc\YWUO>8Ugspf^WMJKUc]¹ysoha\ZRQHEDRmq[a[TVMShyqmfd`\TPIBAhyzwjabaZǿyuojihcYQSJDNjs{zqpk{vommf]ZVI=:Ghxsoųwrptnhb\XRHH5Jzо}wrnfa^\YPDBGg~ƹ|tnifd]QQUIGXxprnhbTUWUKǹxywvqf^Z[X¸~yxwpfa^\Ŀ|ysmgkcxvprtǿ~wsuʽ}z ķ̾ʼƳ̽ƴξȶ |qnpliitqhje`k}}|vnvnypMD8*" &A\fq||wvswska{wz~}rt|~{zcND6,"   :Yhq|yyv{yx{vt{smlYKB=4-%! Dcki}wwx~~plvrww{x|nffiif^JD>80+  !F\lry}y|r~y|z|mjo|}~~|~c_d]]ikjTIF>94-%  "Jflq~{|sry}w|nvz~~~tea`baffbYMH@=85+%# /Xopxwtu|}|}yqzxp||xqossklkmh[MHE>870(#   +Kblr}vnt~u}{wuyzys}|wl_^[OHC?8-(  -Tlgt{tvttvwy{rlvpioulZVOKA51,"  5Uiqsvu}zpqy}}z|z{vyqxy}tdVTJC=71+"  @Xk|~pns{qmmqx{|yv~oh`VSIB>7/'#  0Oqkpy~xvx~tyyxkYWPJB;5+#  skhhw~|zm^XPG=:5/' opnqr~xruh[WJB>:82,$qmux}v}cXOFE>9:60+'!!}~qsz}|rw}oYPGDAB=612.&}r~~{wt{vvtg]SLKJE;434-% u~{np{pk~{kb]ZTME>651*!wqvxkk~{uvzoorgmokc^RLE@:61(#"%qxvsvrs{w{rrpu|kbZWOJF>90'%&}{su~{jz~|rqpozv{}l\]\YME>7/)&|~{{w}ypmr|{wq|xZ`h[MF;4+){rsx{pww__ooTJA7/+yttz{udXYddlkUJF=43y|s~wngj\X`dmjQFA75|||snxmflg^^deneHE>1}|uomikda\YWdpNHC9ww}{oddc\XWQLOMGI>zpzm`\_`YYWPKOHDAmiuzq}g}^Z`_XaZSMOKE=oq|x|{|{{xtcb_c]`xswhWNG=}uovqtqnmpfqr`^e_cdhiXOJ?v~vkxtrrkkmzvhfgmnlba[TPJ|mp{ostrtspprqnkfjtw{~lgkhnkbZ]WQzlkt|vprwxtuunmgxxm}q}|nochq_^_Ytlgrttvzvuvtpicqwqpm{``g\bhnhm{zqswqq1sru~rhzqymyoebdf}tsuvrqvsprotmu~ypruod`fnppqp}rsw|trvghbqvnpqptkmwqnvu~wm~~eh}k}}tvrmzquqlsurmexs{|zmxtruqoquhxd{q~yuxrowrxyxpivzd~}wqrvlyumtoq|}yl~km{tm}kqoljmvorqqkwwiiovznedkxznkjlkmjglqhjhjqvuwlwumr{xv~{{vobbk{m}{p}lomwngstiglrsqurwvvrsmfirnttlrwv~u}{hkauz{qtqrqs{}vpkrrqmlqehu~mrqv|nrrkmoryngtopln{tkgkoqnmlzkbcgnoslmqpsm{npjhkdyvpns{uzylpnoomolkrkpszf`bmpuoghhorqnvywtoyu{kpvurpjlkhqpifafnqrm``gkqoskpyy~w|ysurplhay}}gabaamkkgknqrra`ghonos}tpsrqruedfow}bc__kflmqssqncaahjp~jom~srl{pegkjjuwyqb_bhousojea_``vgdmsll{mlhvrwuqbxutiyskkmsurld_\\brjjegqknu|omonlbghiqwohahj~}yyyyzjmnpmj^_d\Y__dgegdaa`jptknsvpqokuysl|~uolwv|x}looj]_]ba]]prha_`cjlpyrvzu{s|qjkfr`eelqbbfmqnga`cxvfcdablpz{nuqquzxwvcggeoteredlqndkpzwejbcffh{{p{}lotpoory|szyfgentmlookmo|tgfjghghqeemmrokmqpl|umjorwvkjoynplnjkqs{dY^ihhitpvpkmrtrkzmlgm{hpvqkputsrknppomr~x{wdcjqstlnopri^dkjkledhjmdv\llv~~kpnnmkfun}ddekrnlnempln__geqfa__lhyKN>//4)%!5/'*(<<88.8Q]WJhyvn_ca_YYQNCGB5&OLNLDEG=9:EGHD56IQL;=GO`nYGCB'':Qt}vnj`TTMU^\QNGJ=JSNNECHJFFE:6GY[;LSUmcZM<34! $(1Zn||of]SPO\meKPMAQ]WMHDF20<7=?CF9L_ceB4--.,2,5DZuzfle]_X^p4KPABQXV>@?@',3BDDBLPRE# ((/0&*Am~slmlgA:@.1KKJ>D:FFB-;60&."P?FH3QMP[KMRNG43GH621<:29DFD<>?B@7728)98<@@3 +NDKPNPPKMNROJF=$%0;F44C9;>@864NO?@@FLB-%NOPPRPGNOPMPHMC*.>D@:9=16EMK?:@EJ>DKIHHOXPU_dUFIK(NIEOIJFHPIJKJJS?#1295D?=>>;/%?HA@3GZZiqo_SdV$[YISWJQTROORMOJF='':;VLMIQV8FbZ]e[T\Y?qpZ]i\YSQNIJDDMMKJA*(7?MH<9EaZeaee@1IKPF:CS^SI0xwy|}xcIGCDJ4AJMA=E3EPOOLQajrxq_D6;EL::6T]bg`"}{m]PIFHM4OOPJT]IJGIA;Sp}|qYE-2M[C4-APPMN; rw~kkm_RFFEIK5)M`h_maXMPT:;Yun_O((KXRC>! MPQKOV\A06CHAKA;' HOSNIGG?<6DLLOP("7JUP^nejojXdcWCSZZY`gC:7/@JQWaovjYMV: (IGMRSMKIC@ESY_jP:48UYQ_ZTTSNPTUGIWX[q}paVD9?TY\_b[X5?<58 PKLUSSNML:K[aggaRJ36ABGCIIKMHHLLHNMXn{udWaOPeZVD7D/4?[XaolhYTUXast}tbQHH6BB@CFHKJG>0LLJHFE=YyvpiVTke[S/", !2I2 S\cqsjUMPcuzweRYR>PKG;;VgXUMB*JLPR]G/Uq|ueitmM;.-(%)6Q.LRe{xfRMOQv\LS_HOVU\DNnkaV_bmy~quyox|nZ_pzdmzptmcUOP_UEFmrkexrab?*CbZK+LgD!+" 34EV]ky}~zpuh]ncnohvi_SlpbP9<;>=RWaRoh[?96_qsJNN-%EBG9_eMIU\dtm|}ufm[k]dyjgd]]Tmkb1)8153'&6Xmnq`KBOqy`%3S11%-.56d`OOTI'J^C1[lh`G>PhhB10 +;YXWS[dS6$4XopqlbYYLMP56:<8;866'dwjnLSP1=G52PsqnP'GWj\Z]?&*[[ZZbsW/*?K]\[U[^A38=33b259AR7&J`ngJTX[ZH3>\q|lW&8WiVQpk\-'baWOKTgsdUD>8OX[Y??:6?:8SS:5>ipQ4>S[GAHUd]^^ksb<04^re>O{z_2%aofk`QM^|qzfOKWYnQ/6464ZwnL=]e^l5=JPJ@HKXxvbYEi_D95:S{r[,f{[!;ipssXOKovyvV?UjnX4694=aeqW8dpTK4Ja`]NTh\do^:4PP187DUqM@6E~xA)p|znZOLIQslF(FkmcNRF9BbmW?8OnVAgwwlh_ng[JF373&67Mk^PWWLa`E?8#HWZXGEUkxvixj\nQPMdO55Grcb@6I093G' *8041//Q^EO\?-89@AJ(#JT[^Y>AX_afbjc_PVQSP50P{cO2346. +3" 16:;0EA8=h\IA;8A::6-%GMWo}N&DC0D[{wmokXJHMRheyN3;6NG2"86 !454;<@DQgrwyqNEWK712*%?2@YmU;'5=DcnqwvqE)0Y1IWAJ?153548EF\sdq~yW<6-541*';+;I4O438BW^Z[SWk[277Mjyi]Y/47?I<2pcl]6-0'1CbHYlstXbpy9-&-641,'D-"2]\MU`gtyiP78-.66:XcW4E2;03:.HspjuL<4/:CK>ae_UMOB@0623220(KJ7+4O]PQ8KTitaB .6>3$)+3795BLeukoqlqA?;5A>CWnnULY\H(4:>5:[U,0SWRVXYQWI%!9LZ:.167. #/;38j[hjnuz|Q/8A[UAUQWfA=BNX@87743TP3YSWX^ZADD  4/(+297:&77OjhctajlX7:do\TaVYkMC9ZjT4:74=A)(%ZWXRSI3J=F  /#3.9:895 &,:KKZXyr`[SH+7gbX8ZfO]\D8Kvh5-CIPJ8),TOdX+*,>?A1  )IUN3><70!BN("2aWNW^:10E853@bQYW5:;U\6JpaHKH9Q>LH;*Dhu_:(%1Yuz_:;53( =20&9/2>B3.595"0PaN#!3:3&)-Kzw]=T<]@>S>DM\}fI*0Qibq\164,#.$(" *69ETV`\`C!*57291-;dttW8LE60Bdq[MEb:3I?>B@PF033,'&&" :VN5),08MR]p_o]>/6:7TfprkeZ:.8*$#4PP_$)5QOV4 .34%&+HYYNZxmB" 06B`RNRYW=/9319F`iiYLL9334 2`uZ;+Qi^bV2-61/>dm|\IG^l,2#CQQ?2?XC+2642I3JLG58A;056 2;kuuri{k`utQ(#)2-03BShuo@0,403#$7"Q]E.152(.42+FdT;, -FeE-32c($2@bonbnuyRZG/2'/(-78CSfpgl( /1V[MO&%J;2<2&,464&D]Y4+*?_L,86(4>;8SnidodP5(/22-.7HG@UuiSquiWGQ}p|l@+6880/225!-.()$*6+-XS2JifFR~ywV_g[d\$(7202".2), (4)8 *J[`e__\ZVSRPR^u7" EY_ecd`]ZXUTUUTYmKME2J[aea][^YWVUSTOVhdZNC8 (:@[HWjyomkhmpg[K196?NW\WTUVUWGB>;2-*8VSCFPz{tpomjpn^MJ)%6;KSSRUTHC@;2*%%*9Y[XN?@?8/) /r|okihhsbP`x{yvtgYL==CB>;?8)$+twnnmkkp}YLmy~zwvtlZPD@C?><>;2$ /zz{|prz~oTWmzxztwzp\UF34:>?A?:3%  5}~|~su}|{aPjxyxtxvriTD894577+ 7zﭫ~ww|wsN[asqrtvp`PHPG<178:A>8*) 1qzwzywttOYejoqth_WLMPE9E<99;;8301;=<6-˹ʜtecba``eXHED>>;A=5.14=EДqbb`__^^XTEC=>B@=8518<žש}a]__^UK>;AFE>8656恺a_`ba`_hYL:3=DD=;98Žīґmgdcbabi^N94¼õ֥|ddc`_``ZLAB=BAEGȿļ͋jdb_^`eZNM<=@BGǾ͔pdbabdecSD<üߠxgghih]MC>;?䯃ihhkni]QD9=ĸ߽jilnniaWNCźŴˎmppqoke_Vźܘwsrrqmgaǻȿुsrsrmdƾȹ籇rstrmƾŵ굅mnpnĿ鷆mknϿ俎mgĽȾוoüɽĻɽשׂĽʹǸʺ³˼ĿȼͷƾÿZaky}|ph^ct}||zuhfpx~~}||~}wogis~삁~||}݅zvwshks{}||}څzzwqnqv}~}|{{~~yqmpty}|}||{||smhkv~~|{zxwwyztdgp~~}}{|zxvvuuvӑ|xvfbq~}}wz~zxvutsqs}n}{ndernsy~}{|}|~urpoonoz@]ny{{kb^`ipqx{{|{vqponkjjoz+Ncu~vaZ^ceitwvxzwvsrmjiijlr&Map|um^Z_cnsvusqopomkhhijnx*BOer~tbTVbgrxqonlgeedbabdio}'##7Te|~kYYbt{sppga]^[[YXY]bgo)+ ":Sdpw`UXcuzwvjca\]WTQQSX^bhr#-2&,@YYfsiZV_jsuslid`XSNONQTZ_bhy).;"$.7IMMVczvfY]hotrpmia\QMSROSW\_cn>B29A:?AMP`kunb`enroomifaWNPTSRSWZ^ew;F-&KBL@@J_`dmu~lbdlqqrolhdYOORLHMQTV\j16*+FBQG5M`a`fprikornoqjhe\SPMHHORRSXc|,*(&@WbVKOZmlnrwwporqpmnlecZTVPJPUPPRWay,%$!6_mchkw{x}xuvytrrqpnpnid[YVRRSOPRUXaz4#$%#$3HSabswvyqms}~ullnpqqolhd\WUMLQRUXZc}8*! (!)-1FOQyzloinrqv}tpnllnnomnlf_^SNWVWXZ\e~53&!"##%5IYzsrov~wt|v~xqlnllnnled`VTX[YZ[]e|60-(&#!##!6K]e]y|vz|}wrpolhkiibXW[\[\^]bv81-/,))'$!%+&!$$%&W~wx~ywrsommlmkkc]\\^]^]]`p866511.*)%#+1+$&(%/[`@6bmo|s~|vvxvrpnllkkge_`b^^_ab7<>>;710,)%$,:,&(&'BhL2Ba[w~~vxvvtpijlkkljgcdbccde?>AA=<;62/-&'9>,-&'/_OBNE)?.*G`>CO@[Q^x{|Ĭyvssnmnnkjkopqr[TXWQKKJA;61;B>I4-*&.MYLG:TXIk߾|wvqonpqolijmruaZ^Y[MLLFA;98:<=9<@8>--,7CNgM:Tmbt޺yrosutponlojUXdXQLIGC@>;9JI94-*-LUja8=gspqȡ{snqssoopnYVWUNLMMGCA=9=_=7.-+?eojB3Swqb}ک|qopttsrrmf^UYqYMMIGEBA;9YG840-4broI7Akt[hݸzstoqstubb`X\cWQMHECDC=:QI1<70.AjiOL?cv\Rr{ե{{pqrqtabbd^[[SOLIEFDB>E=/>K3/0RfEZSawcQb}حvppqpcghbdbZVRLLFFDC??806V9.,4[HKV]ta][v}涙yspoqedcfdeZYUPKHEDCB@:31JE/--DX?b]iabdcj}{spquokaclucUUSMHHFE@<86?M2/-6iZfb_kkiWXa̧zuvnkcdgjhZXYTPPID?99U=F82/0ftgaYctj\VZs֩qpoldgc_\TXUSTMDA97LTI=544Tti^]QgnhcbjⰘjqqslfd``VYYTTNJB87>]RB987DfiOXXJjtlls~湟jnrtlfgad\[[VRQHEA96OZIAE:8SgG9ZGPnner£}khjh_af`^YTRKGC>Q`LME3257A@FJ?Ga_WD5:XR:>kqkkgoorphfpedZZ\ZXPNLJB?C`B]EAeldkcdttrkfpgb]Z]Y[RLLGD?=\L>>MA[W?9bVMcumlcde_orrnfmg_b_b^dUQMKCA@IL@BG?GRJ@gl^ekX{pdcebjqlaahkcde__b`KFMGA?@B?BTH@RSKfykidSmwqjiiqtl`a`kjfd_`bdLIMKGCDFC?S[1 ,CQROLKFGC<721138DZ} "8Umqmx~yy{rh]@# (4HQC>==4,,+(%%'.9Ic!Jfzrw~bS/$DODBB2&!*7Ih&8`sxkux_C%CNNL9.'  +7Nu 7"'8^~ujP( 3JNI>8.$!):[&*# FbrZ<";FOMGB:*  ".Fo!$"/&&0Fo|cR:&%4DLKIG=6+  2T'4&4$!,HB/0GutbU5(1ELOLKF=/  =n +(:+2IJ6*8Zu}nSB-6AZS?3>djTJEIPOMHJE2. (VJ]LVXgmhjP;FurWMLMPNKIKE?0  'V/=NMdqgghV27Tuy]TIAEHKLIIG:+ *\ (39ij]]STL39gt_JCD?BFHIGHB8'%0_%Amcb[fniE+Rg~oYOYKC6.0,+/26?+*6Y|yzxcignqoom]E?EFEBAFGBACE?=84567 ((1 'Hw{kqaclnmnpaNAAEEDDFHC>BBE@<:9,'3,"8Oqubq~~`dnmmnnkYEBFHFFHHFB@?FGGB:+">+5->cfinvponklmmoaLGGIHHIJIC?AEFGF( *8'" ,1#Mssmpy۫jhklmmliXNLGHGJKID;=BFM    :1<02qttz͎jffkmmhaZKKIJLMJGD@EI'  )J'/PB]wsv{}١t`bknnmiYTKHNQRJHGEFS.+'0N> GWUYxw{|~]]joqqprbWJBKOOIIJaL 5 ETL.[TAhuxwwφahmppopsdWDCIPPON.,?/ B[R$ KY4IloosלtjkoonmmeUMOIMPRQ  )%JK*&C\7.YfoptʅiiomlmrgZWIJMOS   %0H 7/?[?-Deoryˍnpmmnppn^PIJLM 0  9%'1LKI53>h}庉pqw||xqdYR6(% ., 0!K[ME4BXL50.Upɉqqz}}zvlc/.+#!  -! 4ZL>;.GOJ>R4()7m`coquyz-;@@.'#!  1G/"LcRfcq{y):30&/(  '8#' M_ffl|yx($0+!!-%  #1+# 1$`qra{ywz0.0*#).&' 651 .(Kx|w{yvs/&(--4+."$  ; 0':3@hp|smp)-031',(3!1- 9/#;TH}shl)!041('&"!' ' AG5=B-_xru0!%3'!,#$"!!++)$A[HD;)Jzz{51'%%43)(*%(!&(69/*TQI<0K}zo+ ~() Ջ7'l$ρ("Ն- ӄ(҂(҂(҂(҂' ҁ&"q$6)ւ%)l *4 +v -@ 1y144g4p5Y6R:Z8k;쪲GMAOZ131z2T2D(1~0M/@!0^-..@- , l+b 4( 'Z ' )j ('  s'M=' '-(*U* *T*+,k, ,H =<;;:98554,11/0.--%*'O&M%!(T$'-,V%,**N%0.(*)J!81+()*M"<2/+),,S#7310/-+.R#;54510/,/J<:642110G<8674422311K I>655352245RJB;7756422377XJF>=<;743369^G?@?=;=;82454;iAFA@??=@A=4433Az=;;<<732246KNA:?==<=:63422456V_RB<>?><:94434539`c^RDBDEC>:<862442>ljf`QCFHHA@@?8554456Dwnmk`TJEKJFEDC=877866Ionoo`QKLLGEFDE?CC:9:;bhkopnh_TMEHFB;;=:99:Fuݚomoruupg\PMDCBCAA<>::<;KxppuwvrlVOGBCBC@<<;R鱃lmuvvsh^TEEFDC@;?=;;9=]iiswwtrdSC>AABF@@=::9Aj ӋhhswxwtfS??A>EEAB::8Fw͌ihsyywmfX?B??ABA98656MڎigqxwwtnTDFC@EC=75328[׌fcowwvgSJKECBB;4323=n ͌ebnvwwsbSPJB=>?85433G =<4?<>=877,-125.--&)(#n&ep'gfq(igfp,kjggo%pkihho)qkjijiq nkkjjkjr'mlkljklkr%pnmllkklmqpnlkklmmquplkklmswtommlmmllmou!uroponmlmmnoxtqrqoolmnozstsrqqoopomlmnosruupqoonnlmnq }uqsqqponmlmllnot~vsrqrpnmllmopx~vtvtrppnmlmoqq|䎌~wxwwsrrqnmmoqrr璑zwyvutsrqnoqrtsⓒ{{yvttstsrussru򑒓~ywyvuuttusrqx򓒓{wxuvsstsrr}ߓ|yxuutsustsrss~{vuvuusurrt繚}wtuvuwtssrvĢwwxvwtrstrrx̧wtuututtsrr| ۨwsurtustrrsةutqqstsrqppsߪvuutuutoovߩyzwrtvrnno{ ٩~xtqpspnnq=<<<:99999,2243..-*)(&N&7O(:9Q(:79P%<:7:Nz'C=:;=M{&E><;?@@P}$GDCDAAOv#JHFEDBBDCOt#LJHGDDCCDNw"TMHGGDECCDQ~XQKIIEFDCDEFVWUNLLIGDCDEFH\UNONJIIHGFFJaPONLJKLJDDKhLNQSKMKIIFCCDEMt[QJOMMLJHFCDDFERj]PLNNLHGEEDFEFXoi]QOSRNKLLJFDFFGH_xsk]PRSSPOONJHHGGJMe|zm\TQUUSRQPMJHIKNNn}~~|hZUWXRRPQRONOLMIR|v|~wfZSSRPPLJJYlv~}ue]VRRQPLLMMLKLLakiw}n_WSROPMMNLMLKLOgkiw{mcZVPPQOKNLLMQmrnw}r_XQOPPRPMLLMMLTw{ourd\RTUSSNKMMLKKXhsyj]QPQQNMLJIK_ Ѓgt}n`ROQLPOMNJJHMeɅkuzseQOLLMNMIIHGNo؇lux`QQOMOPMHGFEQ҅mtt_UVRNORKFEDE\ džnq~m]ZSOKKOIFDDIk=<;:98765!4+3!210/ . q. 7- , +*) h) 3( ' & &u' >'|  (O (1 (% h)& 0)! ) x     Թmjlnvzyrkklnmoomljfbdc`jhimmnoplȲzmmqx~tkjjlmmkgkkdd``^oolmmjrgnټnhmqpw|ijhijjgjhgmvjgd_\aspolkhshm˰gkmrpr|qghkljggjhfhknmb``kxrnhfgkj{޾ykjptklyljijkjgikjkhhnsimqmqikggjgmkӴwjjrrfmx}ieeijjiinlnmmnvxmkkokjihjjĮromvmdmswgfdjjiljoommnopx|uffjnpnfggֺkkorjfmongegjfdijnoolrrkjkloqmecfhƵvhknlginpmhilgfeefjomqikiknjkmkoqnehhĵkgmoonmpnokmmjgfegjlplfgg_hhjmoqhhimķfgmmoklnnpjhccegjmohhgkjhhffjllnn¹|hhjjmruhilmmjgeffejmlhjhkmhfdfkklmmkilrljigixtfklmlljgeggfkmlljolhgcdjii_jghjϼxollfezsfhkmlkjlfbeejllopnmjfdjicbgjmhiȷpknfdutjfllmljlbdccjmoomlhefjhdbbdhjljlmncdqukhgmqmggdcdcjnppojgeggfbafbejjcҹ~mikcemmdcgxpjigcefnjjnnked`dfd`\e`hheaƵzljgefjlddq}nlmidenogjnmhcba_ge_d`bjhc_ܽtjjkjsef|wllklgitjdellhb`aakjdnmhnibbعjfilmjirgplilnlmnrebcjkjbabdknjqzpneebնdeimllgnjzffklnmoneaafklhcehjjnyr[jklεedkupjkovuehkjnlliddfklmjjkigcgjxkejmnȴmjozrhmszrdhjljiljhgijjhjmlbcajqdbjln³okt|kglpv{migjgghomgjnjjhhjkja_djebbdhm³|yysl}{fjnppnklijfcbhmkkgfeehhgmiecid`abdj||unsxoimmjgc``eihgdbc_ehjlokjmebabhhۻ|wwrrq|lrmkmogghhfd^``hmiaa][chffkrrjlgcehiԴ|pr~ukuhfmrgfgg_^]agjhcb__dee`]jtjljehhfȬpw~|gwhdpnebeijc\\aijjgbdeef``\\snkjkjgbܿv}os`bplcbgljiaahifhhedhee][Y[kihhjjhaչ{~}wedpukdkmmkeghdciggkfda]\\hldfkkhaӶ|}wojmskgkjmmkkebceegfedda^ahihgkfgdҵxwrtpttliimkmmjicdcfhhegifgiigfebdj͵w|yxpgntxwskilmkllkaa`hijkjkkhjllecgffjkȵwsstmdepx}}pefmjmlkb`dhfeglljllgdcbcghl~lmrvnbdox|vcdghmjiibdkfdjjljjkmgbb``gijлhiprrfhku||jiggjkjfeikfdjjhhfjmfaa_bjij÷fkonpjfds|pnliggiikiiehgfcbbhkidcaeigf޻}|iknmkefgirs|vqpffegigegefgbb_afhngbbijfb߾~~klihhgfdeedp}wtddbmifdcbdhba`_immljjfeeaõ~pokegiedcabcxxufcdkjcca_dihd``fkjkjhijdc̷{rrjcdgfdbeacry|kcgkrj`bdgikieejkjihdjidfѷs|~swh`bhhgedd`j|qikntohghmmGgjkkjkjhljiiѷ|kwzpyf`bkgdgcb`juupklmqqkjmnnmomkjifgmkmkjiͷ|}jsowlfgnbfggfdgnttmlppnoonooegjiggfggfhkji˹lrtkpqjlqfgjiggiklnppnlmonnok_ahkfbdgc]\ehfлvslgprmrqkgjjggffggnoldcfonoc^`dkdacc]]^^ehԽ|zrlronxuieihgddgghloh`^akonjca`lideg\\`gcӽ|yyrpmpw}fegkidccggigdc`^ekhljgfimjgec`]_jbμxsywunq|~fadgifbejieedfd_gfgihibegdhf`_Zbheɻ~ror~|ppu}g`bhmifimjddgddcjkhhefhffkhia_gjkȹpmnp|oykosxoeiknphmmpkjhjhjjfhjkllkijihilgijgƷllp|ixopmkwklmmjklqohhjiledegiljjljjkljgfgömolnxjxutnfz|qoprnllprihhkkeceffmkmjlkijljfdfh޿vrohxpxyuuft~tspmpmnrnjghjnefbdhpllhebcejhbb`lݾyuqipouspumn|vqpllhkookheglmhfgkmjohb^^gfb_`\hݾ|rtmlmsrlpllxsonle_flphecfmnlijdcnvkY^]cgcc_^eݾ|lsqpmpnnjkluneff^^cljid`bmpolj`_nus`]acghifcjܾ}mptrkspnhdotmadaacdmkkcacjmpmhdckuufdcgikidehsu{pfpsndepwmb`a`bcijlhfeimkmkgfnwuiimjihghiİzlbimnfir|tb]_bbgfhmiikikhjgjnxvpnomnifijjȱogifklkr~ydbdggiedjjhkjkggekgjwunimmlfacdgȱ~xoodgnpr~}ifgkmmfafjilhccejiioywd`ijle_^bgưw|vueemos|spllnplacjnmd_^dilnrwvjdeini``dhϥsarbPXjq\Q<.19FNLIH=00/398:7830*%(*!:3/8857:3侚lbpw]TboubI866ELNJ1.)/.0+.+"4B2,(*D>751-B-4˜sh_lx}o_`ZaqxT089?BAJQ>*)/30((./%+07: '8I=9+*.70GݮzaZ^vxrnia[_skI76@E79IN9.+./.(,0.-)+58)/3.,')'0;6<-/.0900407<5"&))޷~fmyrLRcp`8.6;::8@772684.,),.385#(*++)),47;)&/4۷uZj{zidpkOTfk\/.88:;7357820&#',.67))(20+)'%,3379225صm[k{iNYkvo\adbU3346:AC/0366..'*')063+,)56)*$%02544/'0ӱjarxXDOityiiZXV97426IE-206332,+,.-3431.73+( !21/40&',ȫxil{yVIXk{riSZS=9;4/MD)+563525* )+117;96.'$./% ,01$+廢sp{v[Tat{riWaT>:?4.GF2*3583.7"(#'24:763.%,.-& $+,1.ٯzv~wfdl{vuf]fR9<>*,CG7-*8<6.,&#(*22::74.)0,' ')..%ʤx{xrnowmscbjI<68*/<>,*8K>41.#+-:20;70+(&,$ "-1+$⹞y{ufdno|lbdcF860,/7;.,CL;38/&):=,.76-!%."$2-%ٮ{uwmV_krl[^ccC644776E31KG5353-/C4("35- 34$24+94"%ԧrotvx]N[cnYP`c]6-19664D2@O9/3958:C) ,30 "&79.3:49$+%Тwmijm\T]gmRPdjT,%18830<6MJ,*2378;<+*55+#'+4../97053Ȟ}rmimh`cgkWXmnV.(7A>55;BSA+-219371&$%216.,//(!0,=/!.67὜~}trrpigchX\phV;5=IA-4,59ڴt{~vsvogXXQ]oYN?7CK8,3?')16#&146.% %)*##D:500+"ׯ}ddhorszvh[SFKR`XOP@VRE&%>;#-32-31-3-"$-'%8/+).0+Хmdegrt|v`YTGM]kYRNMSNH1*>E7&2682)03(*1,*0/*"&!53$(00- ϠvimvwqurTQTJReiTRPPQOG?78B7,226806,"*))*'"$,""31-(/*,&ʞqx~xnrjHPTMYm`UOOKMGAEBCC9//826643*(!')-+"(.*,.11,() !/Ĝ}m}kkmcHT[Pcm_VOJFH@2>EHG@7/312357""-/2/035-035+!--'.0ໜikxZ__^P_`OgkTVEBBC>./BHLL@)+6,538)&-')*534339,(%%#--1ֱ}\g}lUYRWWcaTk^MV9:?F?).=GKMF*&,.86/1"&2*!003.026."!,/0Ȩy[crj\\LW_bW\kRMV36@DA-5:EKPN:4,,252-)/3)$22-,*48,"//,߲~tc`dkgf[_bVNWbZVM-7?<=6,+BJNPB?9/,.1151/)-.)#"-5/(* )/.%۪wtndXkong\`LKS_i]R67<84+-.3EHKJFB-))./0'0'',"  *0:.!/2'"۬vwyfWguziT^MMN\laV:96330-*+/0BPJI.("81*! &/"+48322+)'"ᶞtv|nXesyoVe\RMQafRB@7,.1+&%(,0KKG4*(76(!&1/(!*0100-/0(&qmwp^guyj[lgVKTVaTAA6*.0,(%3*-CLK:*07A7"&0/71)',0..)$.4&-Ƣl`muidou[ZprWBKM_UDH6!%330+02(7KLD789BB?=?A=>?<6/6<4&*0((*.3--)*+''/-1",45㾥}t{|yqi^^_sx^><<>KCL>5.+.+40--.01351./-/3,/4.߸x|wqgijen~|T99@K7I?B>>1:8;@:-)003'$"*230..3..032.-0ᶡtrilejtrz}R:=;953)"#)2/' 7گ{pk^k_\u}wqgYIFA4@?FDBG>AKFCB==6:C?5-".963*.884;3#--"6ܯ~vmdm_Uuvn`U[KA@<9>B@;B==IE??=/%4@B5)!,8:916+*?F7 %.*'+ڭ~vkdoc[ouqWPZK;@@9><<7:;G?11"$-=:7(%8>=97!?CB!!*034,+7٬z|qb_mjap|y[OZL<>AA7@>?3.?E>*+*(-.<::*!#7<>:50*:CE,,*./66.,5ٯ{vwq]Yggfr}tbT]QBAG>,>B;(,@G>)#(&)*;7=5/+188;20?GA4138415036޸ysqsdW^_brudaX]UILM9'38<16DKD&#))643>9368473687?EB>==<:1-767἗zpltlc\X]ls``]ZVNPP=041:;:DMI0,(2251(7:586800,726GA:46<9, *+2侘ziassj]OXjsfa`YVPQQE==.2?@DMN;1-58:4&4:993+*,211;FE+148))2众zbbpyq\IPeomkdVVQQPJDA/.>=DNREB939<;&+:?>+(499?ED7++499,1 . M1 / (1 z11M1263333333s444\4555A6z667777Q7888D8q888$8e:::::::~:q;f;c;m;;;;;;;;;:::::::   qoprromuqoorsnffhlfmoonomppompklkmoqomvjyhmf_jxmX`eddaqonqokhuplsu}lgccejmnmnlkmmiilmimlinkgfpustopoygZXWeef^\mkkpogfgjkox|mhegchjmkghfgllegjkjklhfjie_^bdulzq{lfb^csnopnhhgluq{uxpkikpojgcce`kmhghhkheiljf_\asmyoyppmnqqjjmqs|syzy|wstneb\[cgonj`efgcaflljjeiu{yoyqkYWjqotrqqpml|wvy}yde_acllhfb``bdgjkkhihpvxtnwtods_jomqqsqmiosql{jbcajonmeaai\bjkkhekjfenkeho}|qviennqpopokhfgikhywywsyx~__g[_jmlhdjiee\[]hozllpomnopmomnhccjheihq|~~gkpafnmkiihfc`__tymm}olpkrsqunihomhfbfjhffhowvurzuoomhlnkihbbi{{snnkwskhnropojggmjeffmhgjmks~qqtruqu}uohgt_hlnlotvnihilke_^^ag|mnffcdgjjmkjlhfdbgnpqpmj~nehyg]dllnkhddfggeha^\]djlomkdcadfhjhfidjlfhcagmqpphizpxyxjfc\[Zcjmmefhwn`da__bfhhghkcdcghhgddcejnkfefhknpleca`eprqkeiqnkfb\\]iolnkffif{r\^cbbdefekhfeefifdcebadknkjgghlmkfc^^gnonohejnnia^cn{mh`ceba[Y[]cedeebc`bhjlkffb`bgljligfddlomgcbdillswjghjnmjjlpgsdehiddbYUYZ_abaa`ab`fhhjhebcdjlkhhe`baionniiljnhupbfihhkmlnnjcffiddca[YY\]_]^_^^_`bbeegjhhfegmggefc`^]ghlnppmmkea]]cfigeknmokhhidgh_[[]_`[Y[]]_^aaefcjkjjlmolgcehc\[afejjpqrokf`[`ddedginlmlhhlkdda^_ac_\TWNX[]bfjljhhmoqnormfihb^_bfhflpmomlea]bcenmcjhghefdje]_fdd^Y]d]TY^jlokefghkopopmkjgecchlhijmnmlkdd``cls^dec]^ca^YY]`cdd`ZUYRSWU[oogdceenopolnlkkimongcfjkdga_`[\abb\W`d_[_b`WUY]_bba`_[UTQRTV\nnmebcbekonklimhmnprpngghm_`]a\]_a`YWY\f^^`aecc\[c_\[_^bYUSTUY`loofdc`inoojgcghkoqpoojjegaZ\_`[\]a_]WY[dc`^afeea`]_a^[^b`^]]\dcklohcckonnjdfd``klqnmljfe^UYZc`XWX^^]XZ^b`badggf^_a]Y[acmqjmp|uhihhfllkolfdf`^^hjmkmnidbZYWZa[YVYg`YZ\aa`__aa`cf_`_[Y[`deeolqugeefhjkhlfc_cc^`hefjljghdb][\^^WVejffcd^]]YURPRW`db^]_bbehkejwbcdchjffheb_`aeeaghddfhc]_^[[cjddgcc][Z]ZSVPNPbcdc^aefsweddaqb`_affecfddcegcdb`ae`cghheaa`hhjfb_eb_][]^YRTONQaddfafa`ha^`^`[^`^adjmjkmkkgfd_b__`ikfjkjgdehikba]]e_ZZ][^YVPPQV]``agebaZWY]_][fb^dfhijklmlhff_`_]_lmmlighfgihh`]]`^`YY\_aeblv|ba[\bge`YUYY]][c_Uiggdaekmfhdgceeaagmid`bbfkcgfbb]`_[WZU\cznd\]cbb`\[[Z`]\ifjjgea`_dfecehgeb`eed`^\\`cgdc_]^\_]SUT\akpsccdaed^]^[\]][lkgghba`^`gjffjjhfhfc__^Y]dgc_ZY[_^\WXUbkjlmfa`ltngdbce]]\]_]YZmncegcda`cfjdgjnjhfhge`\XU^fjb^YZ]ba[WWbchhkkhaceabeaah`YY]]Y_\jjgfhggfdgcechkjgcegd^[ZUajke`Y``dgc`cgjjghhccevhc`aaYWUW^_Z]Yhghehkhfeekfdghhfddijg_]Z]efkhfc``egcefijjstfafbg_\_^_YRTYX``^YXeefghkhjhmknfgee`afjkqfcbghgjgffecbbY`ffjbmta`ca\YZ^`\][ZY\aa`[bcedghjhlnnkda_dcefhjkjklgfhhdgda^[YZegaa`YXZ^][YZ`ab\[Y]aabc`dc_[aghhkmklg^a^aefgcehkkje_a_cfda^_WSU_db`SRWW\]\]_^`bb``acabab^]ZW\fhjgegmca[[]cfecbghlgb^YY_ed\^[RSX`da]USUW^`_``a`b^`c`_a^Z\_^]^elgfcegkeaa`eddecfhjg^XUUXccb^WVXZafc^`_X\_be``_`^^ac``a[U\fdcedeb^[^dijfbidfeeddije_XVZ]`dce^^a]ddb_b_[_``eb_[ZY]_`\\]bbfdfedc`\Z[]bjjfjefa__dhhb_Z_`ceaa^dbdcd_\\bcab]TUTY]^ZZ\cheehfhfgd\YV[Tbfigfgca``aeghjfe`_`_`defcbeba^YUYY]^ccZUTVTZ_ababedWigbadd]\UX\eebdcgb_^Z[eihicac^[YWUdfeeb]^XVV[^`]XURTTW_bbacaYQfeceffb`]\bgd`defbb\Z^cfhec`^ZXXSOYbcegbb_]WWYZ]_][]YZXUZ^^\\XTRbefghfhcbdhkecdejbebb`gjgc\]]WYUOOT]^^dae`^\__^]a\]]a_]U\WYW[RRQbfjihjkjjkdffhjijjedbdgieb[\[ZYXRQX^\]ccdcdbab]aa]]\^[ZYUUTUUS[ecfdihkmjab``bdfjkeedhghf]XU[^Y[YS\a`^`acbeda]b^c_a\_^X[\UTWUURUbb__bjkllb`\Z^ehhehggege`[X\[b`]]dfcbaccbc``_`aedaa_Z]\TUUWZZb]\Zbhfnmb_\Z^ecggfhhefdcf`]_aedhhg`cb[^aa^_a^acbbcfee`aa\^\WY^`a__\ehjlkgba]bfddefegbffcd__abaeged_^a]^`^\Z[^[_`cecedbad`b[[^^\kic`eiijkffbaceebbadbbc``]ehc_\\aa^]_YYZY[]`aabdcc`b\]]\Ypjgeefijghcebccabc`aad_a_`^^\X]bffe`^edb^_XXSY[\^^_[_aabf_`^^[[Ynljcceijd`^]``]`[[`c\\ZY\\WTX_ffjgfjjb\\WSUZZWVYROO[bb_b^`_a\^nnjb^^bikb_XUY^_^YZ^b]ZWU[[YXX[_bjhjhhfe\YQQYTUUROLNRbda]Y_`eddnone`_aikh_YY[e`YXUZaZWSTY[\\^_abhfgffeca[WYZZ\]TTMOO[d_]]`cbbcnmlhddcfimfb`_daZYSWba\V]^]``__]dgdccdefa^\_bbaeaWXVVZ]bcdcb`^WVlnlkeejcfjhedcda[Z[_db\``aa][^_bgd`YW^egcbaeebY[\\[W`gd]b_WVUlibgjhje_bfiihdcaa^\ceca_cffbd`VT[aYWRR^eiggfhge\XWXVU_dec^`a_]Zf\\^fhgdb_adiec`a`]_deecdege[]]VQY]YVQW\ciigfjge`ZYWYZad][\]aaf[]\dfhdba`de`_`cbaeffdbdiia[`b^ZZ[]X]Z^efaacd`_\]\]_`a_WYYabaccb`Ycfeccaafjeb`cfhhfea^dfedb^^Za^\W^\[X]]^XZ\\`YZ[^]`^acc`becdd;:;=:34?X?32582##+1#1352528665.2+-+.5956B}g6vKYHMF>#,:M8 <52930+>S8-:9C-& "*42.20/42''0.'.0'1/&';?3DUcy[N9Gc3-R]R #<2389&&1A9B;F@6-'/85.&!#)04$"))&,)!)1.#>2" !&77,',0!#10,*.DYnbVGA3Rg@cZ`pF90535=79;843UH@?DPJFKJQA$'!00&( %%.,-%')6`[BE@5@SYPmybG6-!@#,54;9<94'5R<;1GaWGWaYX. ,554""$1 .0/'+*#!20&6DQWT]prsB4A00FHQ^qr804%48;?2%)34)""0)"")7@eYI<97>9G_zwyxV574)32//&'GC:/2(=H:H(#273S85*$$(4,"##4)$,1/8I97;4949Fgxzq>:)(O@)-/-3=?/!%0(  BE42%# !*0,.060,1)"$/642.,Ksm\mjj~ybI2!+F$001(!")$)-40$'-.+%*$*0#$ &.326)'DWK;@RAYTLC,",..&@2  !+1 $,+-%&$ ".5/#&-280!899-'61( -302%#'%G7 &+%""%4%! ) /2/,$#&$340" 2325'$11% 2E[O.!-.5/%%(1.1+$*!374%%01<@'$(14**-2"2!  '!'))&.+& &00-++)"$3772''.,5)>6 !!-1-2/% #%%"&.+)#%(6$&'!!&+122.-!!"!//03(!! "$)##.2,,5.33$+#"'",+23:/+ $'2),+!&1+   "'01.++45967:1#*) "*$#08.3.-!56 ,)").!(,570!%()-54586-,(" -0)**,1.0+  3@  77& !!2785+210-+'052 ",-"     756"/55/1'4).1;720""$&8  " '    677% +757.& ,++39633**(   ,)'   037- /772.!%-+92.0,#   !..%.<*08C9-,++*31/71'$%),4-44'  ,    *, 516;J(""#+00+3' +"',1.(+ ".#$  &)+,@Y #&#-.#'+""%%(-!'+  0$(  $#<@9%'#$!'$&"* $%) &))!$+.* " $'%'- !$2821822('!"/2%,02$)+- " ($/ (*-125763+%*3841/+)##*+-+'3BH (%(/.*& +86*)(!++,81&%,%%'Df}k9,(..,)$"'& ")+''!$!.$  /6TQ^cS<!$ 1/&(+!..'(,0.)%+%#&0#/.16 -:1#!)  46 "& $!*,$&.52)%+('#*4   ))/-) !0 00&%++0,'&*#" +/.&!&.0' (.! &.*"&&"?) )&)"-0+,')0%&))'',* "%5+#).#'%*,,@@*#(  )'%&)/+,+656%-'%#,-6# *+*,(%#"  %'.%:C  !'(&&.)1572&$!",),-.+1,%&))"('"*     '(+)/405,)**!!&/0,)'$ &      '-2,)08*  '"&+0()($     "3,,*,28+ )$$'#),(%*' ' ! *&!'$'",66*"*$*'"$!*." (+. $ $$  ! !"+$#)$#!#!'64*0%) &++-" !+/*&$$!&   ++)+'-'*&)-1,'.'+.).'"#0//#"   #  +,/* $(,'"$!,  $+).   ./,)$  !!#&'' "''%#'.$)* &*+"  '#+%    ''*+*-##(35)!$'. +" *.*! &"   -.1+02..8(',-.*,.'&$.,'   !&%" ,!,$/+540"$%,0$"$--%    &$    #,/13" "))+,+*,%0) #&' !    +*74 ) (&%+-)''!*)$'+*  *)$$  $ ))010,%" '$!''+ *%#( !('!    "#+& &" 71%)++.2**" %)'%%""(  % ")  "(##  >60++%*0*+%'%!% $$,"''" '$  "",<96*%!)/2,!!#+''.,*..# )  <:7"%48'  ! ",   .+0--,+)( '$$?A?,!&586%/#* "-**,,*$  ( !"#?>;50.+59>4,#.( /*  &#&0(**(,1&!%" )$  "&(#"!=<;;117-4<6.0-.,'2*%(#&&%0,( ".2*'")+)+"!.&";6,2:673%*5973.+**$+-*$*/+'.! ".320-0-' &+*4 5882,'*26,*#(&(,,*+,0,*140,00'&  ""1.462,,(.,!*%$,1/().11"!'  ,-$ #$  %'*//#-51+-,*14,%*-33-,",-,,'    &% )*(( babdbecl_X[aiY`[YYWbehba_\_bbcdedeabkld^aejgikfgfjqijcehehnr]][]^_ajfp{zrqgXXUY`acbeb_aba`bd`aea^]Y[\cgihljgl|gibbagjqzd`bVZfdk{{ttgXX_ljbbcbaab_\__^^aa][]\[aecfiuedlshl^dgafmsmjef~zxmjy}{}y{|{q_^aa[\j^[\_a_\^affgcebffha]_^Y[Y]cdfjzrmVXrktdamytsgpo^_]^YgvaY[ccbbdab_^a_af`WYYUY[chbkbcrfgfTZfgezzomkpmref`r|`\Y`X[]XXYYad__`_\^`^]fe`acWWY[[hc]\\Y\acf{jdqnskmn_aY[YYepaXY[Yolgb`^YUWY\[qbhhf[Z__`cdd]ZY]_a_rgdc`_amjvvx`[YZZhsjnoe`_WSSVZab[WYcfdbhdffhdb_]_`_[yb]]_`purqxob\]h}zl`YZSSY_\ZZb`bedgedgcaa_`\]]^eb_`\]woZbvjcabhuwwpb\\ZTMOUU`jca`dgibehdpo`^^]^WY]yqn^_[a`_[bi_Uacbefbcdgr{jiec_]^\XQOWX^a_`bdigebc`]c^\WWY\UX~la[\\]_`\][WXW_`b`]^a`fkkqe`bhgedb^YUT[ag`aa^^ccb`ZUNT^\ZYV\ZUqsc[\\^\a`[YYWYU]`^Z^\_[dic^`ceeb`afda]dole][^]`g``WSNV_`WVQNWXpkc`\[\^`a`XYWV^^][^\[UUghhbckwbb`cabfjojf`b]^\_a`c]c[^^aTTQSU[of]^^b_^_c`\[^`ba[ZXPQSUcknnb`m]aa[]]bfeficaa]^^][^aa_caa]VUW[eb^\[]`a`^]^UeabcaYVSKMRZhjfb^ed]__[^adbbee_`Z\Y[ZX[[]_`acb^_aaeYY[Y\_b]YX\^bcfcc_]UURYlhdY[\a[\Z[__`]e``cc^[[]\ZYXUX\_^aacbbd`c^]]\\`]]YT]ejemgkhccuqdb_\ZZ[^ZYY]bZ[[^bcb^\YWUWVTRVY^\_abc^^c`c``a\Y[YZZbhfup{ur|~rngc^\YY[Z`[Y]`ZYY]^aca`^UTRPRRW\[[__^\[[^\`]ZUNOR`fcjmxspmtkffa\XYWYW[`\^][\][]^^][WUUSRT[][[_^\\]]^[[USLKKQ_hcg{nbpils~oeccb[Y][YW]`^Y]^YY]][[c^YTUT\X]WTVY^^[^_^Y[URKLKU`hc`^[[`afjqvk`cfc]_gbZ[]^[YYZW\TUY\bba^\\[WTUUQY]a^^\XZRNKQ]hhf`\[\`bcec^__`egchga][YYSW[WZRVW[_baa]ZURRORTU^`\YcacX]\^cwjkd^\ZZ`dc`]Y[]ainpivcb^ZWQOORTWXYY\``ba`_^TURPTTZ]^^`sledemuuihejb_]Z``_\[Z_elpljla_Z[YYPNROWYZ[_^^\]_a_]XTUUVW[``^]{fgiyxohhffc_^^`_^^dcbmlmps`ZYZ\YUNJKNPW[^^[XYZc``^\YVW[[\YXXbdkrrzlc`d^\__^_\\ba]_uhOiZX[_a]SNHJNRW_^^Y\[]^_^[XYZ[TVTjc]bkqvgcajjZ[\\YZUWYZ]qj[^]^]TPLMORZ`__^[\YZ^Y]Z[_^]XY]SOQY\[_vwc`ehca`^[\[]XTSTQTW]jn_^]]_^XZUZc^__`_a`]]XXSWW]__\[[VTNY[\dfglffi`]ZW[YY]YSTRTPU]_`]Z^\YXa`b^_a_\\[^b_^\XUTXU[`^^[WXX[Y^cddeede^Y\\YWZ_YSQRQSS^_]VWW[]_`afec]][WX^]__^UVVZ`^b\YZ^TV[_]`achidba[YZYX]`[UTTSSY`^[YYX]_aacd\XUZYVU[_a_`^WVSVY_`^VT\\WZ[]dkcda`][\^`c^\YUX\_`^_Z[[]T]__^b]TUVTTUX]`_]WUPTVU`c_ZW[__[YY`bd`]_ab`^[\^^acace`ca`_`]Z\WY^]\_]YTURORWY]^^]URONZ\Z\_a``\]XYY]`[W[\^^][WYX__bcadd^_`^\URSRT[[][X\VUYWUUY\__^XZ\\a\LKOWZ^]]RWY]`[Y\\^[[TSYY]_baa[\]_aZWRSSQY[WUUVXVUUZ\`]^^\_`dbTMKKNV^[^WXX`_]_\^^\TUUTY^``]YZ[^`_WRPNRQUZTVYVTVZY[`[[Z\a`bdb\QLGJOTUZ[]Z]ab`a_a]XVURUR[^^`__]_^^WQPOSQWVRRPTT[__^YYZ[[Z[UVQLKNQ\WYWa^`_aa`a`^[TYUU^_`_a__a\[^\VRQTV\TTQNQQPY]]UWVUWX]UVSVYQOSYaZVT^_^^][\]^\]YUU\__\^^_Y_`Z]]VUVZ_\SVUUTY]\YTVUUTW\[UUY_[VZcbYWU\\]^\[[^^_^_\]\`edZX\[ZTUXX^d]^ea^^YVU[`a\VRQPTQT[ZZ]]c``a`a]\[]]^\[[^_b`c_]XWW_]WTOUY__cdbdac^]]a^TUQKSUWZY\\_acddb[\[bbebb][Y]\Z_^aba]XRQTZ]^^Z\[^_`bbaa^`bcbaa]WTXWYTW]ZWXW^]cb`^^]Ydcead[WYVW\\`cb_^`\XZYaecc_]]Z[_`^_\`_b`aacb\WZUY[VRSSVX\^[^ZYX\TU]^_ZVUUVY``acabdb_bdeihhfa^ba`\ZYY\_^[[\__^[[Z^XTNOUX^_[X\WYXQOV[^[WSUTU[acefddghjjljkhjieZ^QSX_`\^^_b`\\[Z[ZZ]X^]\YVVWXNQQ[]^b\_a_babghgjjgjjijjgfjgeaYUUY^ddb^\^_^`_X\]\`b`\^\\[V^YXNQQX[^a`ca_`b^cggiijfeedgjfddhgca`\_]bhgaWUW^_Z]^][_]][a][[_`b`\WTTY\_`ab^__[XXW^ffca]]ad_[`ceca``begb^\^_Y\W[^Z[YVTWZ\Y[_`be_WSX`^dbdcb`^UUSTXcb_WNNMT^`]__ca^``aeffeaa`UNPSX]WSPOSQXZWX]_dccZY\`hjdfeeh]URRSTZZVKOOMOY^`]Z[VTUX]`cfdcdZQOOPW]XRROQQY[ZZYSWY\^^_jY]adged^]ZZY\ZRONIKNUZ[[YWROMNSW]aab]WPNRSY\XXTUUPU\]YRNOQS`a``dcaefde`_`ac]XTQQOSPQVXYZYSUPORPV[YZXYZXX\UYT\YW]VYY[SQQROSZ^`cbcbcb_]bcacbbVUTR\YVR\YVYXWUWZXTRX\YYXW_\]VW`UX^^\X[]YRQQOUV[]_`efcb[OKO_addbXUXTQQSZ[YWXY\[TQQS\[]X\]ZX\ZWY_ZVY]\[^^WXYWUZW^_cegge`YMJMQ]^^_[[][[Y\Y[YY^`\\_]]_`]]Y[[\^\k\[[\Z[\\YUZ]_\^dcbcc`b\XXQTRTW\YY\_a]_]X[[]^`_^X[]`b]^[YWVU[[]^b\^^YYXVWYZWXZY\bbc][[YVQ[\VQY\YWY]`]\]^[YY\[\^YZY]`^^\ZSSTRX`_ZY[]]VRQQXW[[]ZZ]V^`_ZUUVWTSU\[YV[Y\^]\[]\\[YZ^\YVX]\[]\YRQRSRX[WVX\[STPPQV\[^]][V[_]WTUX[[Z``\YY\^^Z][`_]][\[[YYXZYUSRST\^\\TSPNRPUZ]_[[TY\_b]`VY\_a`\][V]a][^YZYZ]_]Y[Y\[[ZTWUVUWZ__`^bad__\ZQSWUZ\^_QQ__ddce_V\^_][Y[]^_^]\XSWY]a[WXUXZ\TTRRQ]]^]`ccddqc`]]\^ZW[X\XNPbafced^]Z^^\[]\]^``]][\^c`WSRRXZZVSOOUV]aaefebbfdf]]^\]ZZ\__\UTecce`^[\\^``^bZYY_bbcd_ZRRST[^^\VY]]bfhfeb^_aba]Z\^^]^^a_[[Z - / !   -'$%,9%$/M7 $8JGPG=<,    '!"0RF$' $9KRD ! ' /JEV[E>>L.3*  %>"5O@-5 .KQK8'U:-,I_KDEK0*AIEIDJJEQ9   % #)#.NVA5*A7QWLP>4D>OI<";ap; *?  #$07"R,,-IRQD50-84;!#=H  #O) # T|lQGSSNXM/92>,4:":50"KAB;A:+IKgba[XQLD0     ca`RqO" HO=B,);?MYfQQ?8, $%)83 UOD<2  "1!#$7S\E0)    '$!  EX0   #/-5#" "  6:    '  "2+# :1 &$)0E%/$ :*   /12.      ),# "$   !   3$"    *0"/&#>H9    )#?;C?7BEF52"   '#0\nJ4@664;-"     /!,IN22%+8D3      -! ".*'*1.45(4-  &,( +:)52  ('.*-4$(# *542561)  /&$%*C!)7% " !().7! 2:(-)&%-%'1=,(66'  66 /20,91&31P8*!",6E]`_Q0#7%,'$;-.35.!!  !$@;4,343$8IcJ%*%#.9J`ephRC#& #-& .1<7  %!8I634+#)3YZS.00 %E=@CIPXJQ[A1 +' 0168,=JG #GP11.(36.232+2=%%&/-)"1#2/7R$43 ?F?PMH) 1&+.2642/7#)05-)+7^O-("+& ,2& '$.+)'%9;QAG7(% /311/+"(5,.-D?&")2-00-, &'/@G8-&* )24-*+ *-3/'&)'7I,$"&"&.763)  #46-'  +$! :$&-$$-+$ )/&'.44-! A: *'*.-%+( **,0 &! $,(-  )%!$/3+&. %+1)0$)-!-' $ &# *((1!-" &$34-&# &&2")9-#- ',(+$ &0@)"/ % +12" (&  '24,'9XL/#   # */+(+420+-/0."+,&%#! $' "2431=I?1) $!'-*4+0/+).0/),+(*#  -151197>($  -%%&31.-#*&.*)"  &+.  &./(*0#17#$  $!)'&/--/,-1 #$!+"&$# 7(22/8,%40), "( '!%24/,!  66,," # # 0# "1,)) +2/--, &    3/$&(-$..+.-) + %(#16262-"074&12'..+!  (#+)  #/6584*5<&!)2%!D,*.& '-$,+  %334841,$85,+0! )3 (  -  !2160# ,)*'&1*  !  )* !(3/+$)+&)1! '   % "-..###% ' "&,#  " ,-'&#+ '13)''.$$%+0(# # $/*&+ !!*1352)$'  )#),0  %-(+(,!"(#!&0231,&( *& !12!$#(,,)+*  $ ' %,/2,+! $#"',  / $%('+))$&" "!$'*0.-( $(0(' &) *0..*$+/*)  /,1* ! ).01$    (  #2+,) ' ' )(-00(&  !'#& (.0.--+%&    -)',.'0,"%- &'%$+. !# *& '014-,!  (16/0((5'%%,' "#"*%   '24-('  .130)-0,)*)" '.2$ %/53*+" !.#12,*,%  "##(  &42-! !   (.(  !" #$  %"*)-1# ,! $ ! %%+.-/-"' "    " **)(% /  (#(-1 & !  *$! &"%%("(  %(&  (" ',1"$  "!!'"'.,)"**-)#-%%)(& !%  +.2/4+    "%"'..,*,.*(++%&"&' .*/ *).-. ( ! " (,%% ! ""')""  ).-")-,)*(!$$&*, )'$* '$ "*')' &,,"*-*'&(((#"#"%,'# !!*,)-.!,-* $'!(+*+$ &! ')$ $/($,-./,)%%*0,("%,)&"+# ,''"*-.4.44.2./'*,0*%&*(!&%2),$!&"%%') (..0.0,*+/11,0$.+/,(%%')/(.-ϼǶĿ´ǹľĶƾȽ½ÿʽĻĽþ¾wporutj\Z]ghhbcXZLILNLIGGF@B^C8MdF^ujn_vwwusqrpk``WWYjgebZUQLJNONIGIB@RF9;`FIpln`vrwtkosof_]YSQ`sgWYXRKOOLJHFDDJE9:VIA`xrmrousswcmkf^X[S_fZ[XX[WSOMIFEKPG=;ME>Iozuktokvddroe`XY_zbc^\W[[VRTMEDNeKBBKK?>Nzotn_dfaoxk_cadsuihci]Z]YQUUEEGkUA>NZA?Sruxfmla_imvvwqggffecjkgc[^i_XYSIFS`H@CVE==M}vtforpfjqvvuomd_be\\flhecfbXYiNHMeUGDLD@BMwqyiotspnssqloqnb^daYbiiehgc]UoaRPU[TGMBA?Pwizkirrpofprsrvtnba`X]ofefid\R]kVSRL^OYCAAKxiuyoirlqpiqpruuorjec^Zll_ajk^XWl[VRKeVYDC>Frpskaz}cgwekmhnpkjliiojge]iebZ`hb\Wd`[SRmgPIECBlrreRv}`_`dhlkmjb`fjeonmmlhb_Y`ff`[ccdULepSNLFElnogSue\Zchlqom`]_bdlutqrpe]\`ffb``hiWKUudPQIOqlbl[ztg`cforsmh^bghoqmrpqlab_hiied^iZNNtrYMLVlr\rchkklpssrllkopqhjkpqpmkkmkeci^g^RRcklNQ^iuoum|hlssustmoonoslffjomnooklj`WiiqeTSUUsTQmakzu|r`dktwrqmhgoikjlhgkfcdlmjgf_T]wv^VVSMm_Kn^S~|r^fmtqqpfdhdehijhdfcfh_b_`^VS~vUUVTPfhIc^Hj||ciovqeempldag`mllhfhkgY[]\_YUqRYZUQ`kNa^GVuntwsicgbmsibbd|tlmmkk_[\^babuSWfUU\m\h]HQfpwwtk_bfdulgfdeanmiabhddcf{tSUeTSTopm]JW~]nmoyyj`bhhlheimywqd[fighknnhdfqiVRXTQRr|ubRYyafahswoaciproswvtm]d[cbabfjfc`c^VYSVVRNiybUTsjjacq{wqkpvuuzzyvpgc^d]a[b__\i[V^ZYWTRX}v]TNp~urhkstwsuwxyw{}rsyribb]\Zd[^a]o_W\^]ZVQQtvW_Pfwtkptrvuvvu{zwtkilwsog]][deiecjhWY[[W^UTvuPlTR}ysxjpoprsttnmvuogigrvpe`]afjeicbp^WY_Za]WyxNg\Jv}pm}knhfjqokehssea]flssma`hmiddfcep]^_\`iaz[d_Mpvuduilg`chllejttg_dfnuwrhangdhfmhcle_`__ifs~sie\nfwcfol_Z^flikqwvmekmrvutkhlgbelolagc_[^_djt|}vrfh^tg`rl^V]chfbkstsomqrrplhgolhkomjdbe^Z^_]bpx{ztj_nghsqh_aekkdisurrqnnmgdelpnmif`egd_[_b\_mll~}vmkjusrtoimpmmorsrppnlopfefeboiae_ccb^\Um_fr`\{y|xqjxsruttrqjjpprtmadikolpid^if]`[p[_]\Xrfq{aVvm~{wmpnpmuuxq`djjtslZ]ednolbd`fg]^Ysafde`pdwrugZqfxuqri_dknql__fdrpj^_]fqqhbebgm`edpefgkij_v]mq_miog|zc[\amrja_``poigfhkppmjmffphigjkcckifhuZlxakqh^y~}_]T]mrmeemiqrqiilnrsukonnqonabjgeeghrs\ps\ordYsywje^kosplkmnrrnmlnqssprqpoppka]gl_`fcnnbql`pofaxynllknzwssqplptptlpsonpsqllmnkhbgjfgiagmkoehthgpwkmprvvzsuulgpnlpllogghplhecgkj_pnbngcasof`ooZgwuhotrqnmmppbb`dgbcmkdhnee\ehc`ol[diierq`YsjVg}y|~dkkje_dhol_\abeabmmlmb`c]hh_`nl[ihld`pg`xmZn|~pefddaX_fjf]Y[fcc6nmllmfcc_eh_kup^qhj^Zlvnyody~~n^[\b`\ckmf_]`dehkpnljlnekfjnmmufrfe_Zmunho{zpYXb\`fkkmofadjngfjkcdfikhkpqonzuafbdcdzvig{}uuUT[_]^bjqosrqqpigfhbafbmtqqrkgnxge`cem|sgqzux_Z]_]`cfonosrsoqokf``bamttmomiezlf^hqtwnmany}ts~dd`dbbaaYcjrtoemnohcdngnqlkfeda|oc`o{ubij\i}rq|sahlojhb[[`gptg`cepnhhlmnhhddmeh~kfaoq[jf^m~qo~skrtrofb[WYbeti`fkpnmmoqohknprlq}mgfwn[mc]svmt|psusoeb[]YbitmgmqqtsqrqpnlquuqvthilxqaoU^vuypjvfjqrqfdedekpssutuompoprmmkgswzunlgkltidVc|ywrex_clqmifkpkoprurrmmlmopqkihdy|ndhjggyxsf`n}~wf}ackphcemoqqgiqtpojckionjdehxtc^adejau}wifs{||tdijojfmnoppklpnnlgafbkpkdfhula]bggi`vtligu~{}bbejjonjgptmnmnjkdademnlhjo}idagpmgbtsim^p}W[afkod^aennhegbejffmonmjkt|ldkjspjesncrds~{zSWZdmj[[bbkl``djpojnqrpqokhxuhfopkhk}lb{px|uuz[ZUgqf^]bejd^`dlrqmnrprsqhgsumlqrikqoj}wwuni}a_`lsgceifjkbcjnksrruokumdctxoopoduwpq}xvriafekntlbffgkfejjhnrtpnlumfcy}tpmnq}qu~svtba53..-475$%)+%'  4&;6SHK5Xysu~5312120(  .,) #7MIM4-EA # 7!bogaiw+5*#-9( 04$$!- <",Dm]^^s%0%/7&'&*$)$-00 &eSW_ot*'%*/23*  "&& *#7 )ZQRjnko-/0"*201% &#!4 6$ SKYmplm#*32,'..)!))( !!$& ;+ + (U?Zcajj~(!41.)(*+*20& - !($ !7 /'V?PTLdhr"'5)0**(+//)- '+)- 7"6&*LFMD6Y`ey$="-*'("#% %!%"&! @8 EHL:(S[fp )) $" %('*'#!$$!!) 4?DDE<&Pimu&',)&&13//("" *,G/ H@4B.Vxrx9" "--0$"!0/*1011 &)&"%, D@&%DI1G7^zmrH)+().0+-&++123#$&0/..(&*(!+)0980;OFODhw`]B$)204.1*-/1280(+*/0-&)% 309'A@5CcYQdmZHs (67//.&%2#-,+&&(")*$"!@?! ;,A0$\j]_i]Gc,3/1.4"&"&''&  H?  336,Am`ZgiU\%-61.4-(.0-&#&+$ K;'72+*gcPiud_u*372%"*8%BH60..-+ (I?/ $;)7- _e<^ysd0,573%#7+$#$DRG/+' )$! *A< , ;?=* (Yb0Dryl()68$&#)#&.>=6 %)$'/11)#:.   @ME/+O\39lxu05- %*/)+3/3, " "%**% ! 7VH/#GZ=Bmpx*74*(0/-224-.$#$*" *!NF,BVJIhgky"013.-014059*.6/- & 1" EG&-5UKK]]g!(1+4/22-35.,!&5.)("&)+GF< TOFPY]k$+-,-.,, 0-#!+2, $%,"%5" !GJ8+NVE?Ykt+/&"*3) ,. ".0$#,%!#2 /$JT*1/ELK;M8;s2+ '+$%,26(&'+433%&")-'%0ANRGC5=0F<6b{}.+ #%03.+*1--0&))#(-*$$?OIMIG?3?<9^|{0,$"(&!01-//(**"#./,%#!#   9U69POH>?=Gf|}.-3+%*2(,-/0-+.*)-0/'$ 2,?S&MKQF?;Np}{0-10117'$0.45'%(-'.%%" 2 8(:DL(F>RMH>Cu}x((&115/,*32+ !*0+#!8$ "7%?;@0 >4KEUADypq}! #*/' #!42% /3!".)#2"'*,)(=!8:'86<4VPPy{keu*/" 2/'(%)&0.*$.�&)#*+ #-+#,=3B+9>4<Srsdcr'/'"+%151''0*/24(-//3-/*("$)%7<:52QJFGMcxsz$/-,"$)20$!,+,+,# +)431-0(#;.(D97IFNL89/.6@8E:-EOJUL9Tqfc~  -.'"$#(2/)*02)/%.2.1H>,9,)7L=73:MIMVH% &',CNA31GUKSOCCeodi (3-2/11#K")'18434("/>&"#+9JE=H>_)+-" $23" !2/))../)%$.'+A-'5M:51$7OOVTK>_+13-+ "6%(0,**-/-)/16505C.&&?M9:'(>KM`UC;@OGj2240)  %6.$.1162141010499<9&%+@I:,<$BAFiO=6CVPr~"*,2,!!+22457-,0-./*./&5=?910&%/F=2/,GFCcT?1GZ]u|| +1,%"+2/121644,,),-03('&$AB2$),$$%@@<+!5JFLZYC2K^arz -4+"0344&'150-'(#-/'"-A=*"!"(;C@0*;HMMEVG>Tbet!),2,#02336--0-*)$#(1(&%-A3" &&'N<.2;TJLNKLRPir$,05$)22&"(!&.%'02/,,0;B0$-,54.)=N4&;+?WNNIHLTIflz(64 "%/1$.350245233/);7$#02-+0FO3%E97KZSkn}"3<.%+/'.+"!,2-8457-+70$!6;%).+!;?LH6:JJREA@5*Tfcpo,+07;0 ''(/'),..)/462//90%#A?1,'(3CGIH;>GOS?C@.*Mijn}. / /C . 0 0c / / 0G 0 0 0 0A 1~ 2 3 2243h3343444444Z4555#5T5566666#6M667777777777777777|7~766zݒieovvn[MFBA@C>95436U ldnuttkULCC@@<74338545I sgjrupfZPIHFJD><99ACo {emtupgYRJKLFCAA@@M|jnuvpe_PEJKGCCB@@Yinuvpg\MDEKDECB?Bfhmvvqe[QDIHEDCBDHu췀ipwwpb]QMNLJHFEDOnsyxph]SQRNOKHEA]ﶃquyxrhZPPNRQLGCHpﶄqtzzrfTOMPSOJHKR﵂nrzzrfVNNPQMIIc﵀ls{zpbRQURQLJJM~~pu{ym\NUUPOKJFYrt{xjYNVSRNKGHmpsywiXPXQPNKMSčqsyvgWSTQPPQbѐrqwueXSPRQPQPxΖtrwteXQSRQQPWyqwseXUVSRPMgwquqbXXSQQS~tptn`YXURPO_tqtl`YVTQOPwusunbZUSQPWuvxpcYUSPHlَv{{qcZVRGO{}|pc\VLG`黋y}zoe]TJLy|zxnf^UQXy{ume]TPnzzskd\T\~{yqjd_`k ֘|zvoib]Z Ϗyxslh`ai빆wvojc^_wtmfabg|wtjc`\| ϓzxrh`^dzxpe]^宂ywmcdgꥀyvja^~zshdjΑ}xpdayvkelzwqgcҒxsmgnƅspjixqonsܖpnmmЃonn}xmpvܘrsyˇt{!񭀀 ۛ~|$‹ 海#ӛ$쿍%#$⮑{vtuturpnnt貓{uuttrpnnpz 뵔{uusrurnnps 치}vwuwsppqtw Þywyuprrtu|Ǟwxzurstvv ĝ~wyxvuvvwyĠ|xwwvwvww|Ȣ}vxwwvwwɢ~z{{yyxwxȢ~}~{yy{Ȥ}}~{zzȤ~|}|zz ȣ}}~|zy| Ǡ~~{zz Ơ}~|zz|Ƥ|{|ͩ~~}|}~Ҭ~}~ܭ}~۳~~𾜙𹙖봘촚鲚ᬛ}Ω~}̧̩ƣ򿟛񸞜ಝګʤ𷝚ۮ̦¢@춟ۭǣ﷞ܮҤ꽚䯓&ܡ "㰗֥!&ⴢ&Щ 𾥣(ݵ+Ϭ&*ێln~xdTPOQNRLIEEFRlm}u`WPRPPOIGFHJ_kjz~ncYRRPPOKHIKPpniw|pg^UWSVOKKLNX vgv}ti\WUXSLMMORc vhx}sd\VWVQNNPTVs vmx}oeZTWWRORTT\ykx|mcXTTVSTTUUc {ky|of\SVUTTUVVjxk{{mf_YZYWWVVXt yp~{rha_`]^[YZ]|q}te^^]`_[YYe}q}~r`^Z^a]ZYYt {n}}rc]]`a\YW_ xm}{o`_e`a[XXl xpyj[eea^ZZ\}zxibfdb\YZd uwiaga_]\]qzvhcea__`d ΍{tgc^`_adk ̔||sg_aacdb{ {~rgcfccdg }qihhdcdr{piifdee {qjhedcl}smgecc|ᘀtjgeafԏ}tkgd^sslg`d 뺍}tnhjp|uolk{tokoztpqy yton՜~yusx̑{xsr췉~zvvy񭄅|wts쟅yttwΔwsr}vvx歆|us륇{tz堉ywΗy~~{뢆|ә}Č~}橁}}ۙ|} Љ~} ~z~!ܙ{~ Ɗ"򫅊#ڜ% 򨇈&Ӛ(n'($  <* *s+ 3++t, 6,,,_----q.'./<//fu1F/1&1Y223334 F4>4uu4 ,45I55v6+'6W7(67+7<8t57 8+89<+9v9+93:o39 :$):L;':';j): };3ÿ);j~;<7=t=332222312+*/.,,*,),)))))+(&(!'''%$$!%#~#󱅆#hj3il+*3,32.,*/**)))/),%-+'&&)&($%򳮱#Ǭ"G23423322-+201110.2**))*+****)('&'&&%%#󱊑" '3y3 2e;2FO312:1 ɱx|ywhfjnpx{|snmpqpccirskb`ekjmsywpiejklieggѴ{~w~~ywpjmolgumkosprkfjpnmidgmllpptqkhilpliidظ}rzvvtnnoedpphnssqignnokgkjmckoqrnlgfjmkh`ܼrvzmlsromlfmvlnrmonmnqqkmimnd^ajrhpj`]gjkd^޾vu|kejpqlojn~|qonggknrqnmmkmofb^fnoplg`cjkh`ܿ{w|rcfkklnmvzqopl``hnosqjejlnjfcfkoqmfcdkkhٻ~|}tihfdffkxsfgpmd`blmqqhafjmlhegkpopgegijkhٹzyskigihenzr`fmphbchlpsmcaglkhhkoomkeejjiiܽ}vupnihhidhyraclnjgfhfnopdbflnkikpqommkinmggȲzjpspkhhehxxielnjgflglqpgghllkmlmpnnplplca͸xdnsslcdhhkuyhflpljjlnmorlhkmmehnbgmpooinld]Ծ{zeltxrebjknvxnmlolmlmmpqlnqrh`^gdgllkdfmph]Ķxklswvfdlmpwwpllkililjlmllmrsja]cifmpi`ajll`ʺztsusuihmisuwrlfkkihheimjeiuwqe^dkmnolc`^lleϻ|vzzyrknkoutpeagjkffe`gidmturkcdionmmg_`hnnмyz||upqlprrHjabfjhgdbfmjpvutleekmqmigdbgmlҽvt~~yrqronptqedejjhg_fjqpqttljjmroeggbdjlj׿}wvtjorngmnfefjligdgispmpqgglmqn^[cfhlkjIJ|{ys|ygjqtghmieikligghkoechlgflnqo`\afmjhjͳrvzqy}ghpsifilgkjdkijigpc`biliihjra_ahmllfѶqtyrvehntlejpljefjlljpj__glkiffpl`ckmiifӹvsutuomornikonjaajijknplcafmkijairihhkjghؽ~vxuv|nssnnoqrmc`fgcfkolfbejjiehqnjgifggĴuzyyutspmprsphcggcehgkcdgijiiginskffca`̹rv}||xvrrijpttkhkiffhligjeeinqrqdhb_`ttzwuvtrslglusljjljjkkljgjfc`ekrmmrkhdc_˵zwts|trtqlgjurhefilkhjjmliee`emqlgmnka]^ֹ}woz~zurrqninutibagjigjgmihhichlpmgmlhfZ_۾qyqrtnoolpwwnccfigdhjihcgjkiomljlhifa`ųu|pnrnromtxxpabficcgihbcdilnlligidbη}{yrjorrtyumeehjfcbhige``fhnlfehge_dgv{yukjrsonqvuulhjkia`cgie``gjkme`ef__`b˳}ow||mmvtjekruwrlmlg]beiie``egmre__fe_]aٸwmqz~xruxnegpsmonlmkccgie_ceimoe^]cfbad{rnuy{wypcemtjilonlgddhihdfgiine``deebeʶntu|xuffmqgdimnmliikmhe`efhkibdggivsqy~wrmilvladjilljjlji`aadghljmkihif˼|opw|rpokkqtg`gmmihfijhcXZ_dfefmoicieøysrwwngiihlrmiimjidcfihda]^bedbemleeh̼wuvwv~ofigdgjmnqoonbaehfec\\bdda_hniifywuvv|sdihdfhgjsqplhdefeiea_aeda^ammlgǶzxwy~{gfhgehhelsomhgefcffddedb`agnlnѻzyy}riihifdlqlnebcdc`bcfededdiglmnĬ}|vxyy}|mhgiihfjsjlfa`ed`__cefeghdfhikӴ~vwsosuvgdhikilrplma]`eb\]befhigbabhlurumjsvlbdjkkjqrlnca_db[[adffhc_bgjΰ{ntmgnurbcgijmmomjg^`aa_`addfdhfa`fkݽmpocirynekifijihfhdbecca`dbaaef`bci˩vnrmgnvurphefjfcabgdebc_ahb]_cecbejٳxyurusuxxufadkjc_cgfdb][djc^\_cdggiྜnqrrsus{~|jabflc`aegh`]W`gf^[`dfgjjɥqehonnopqa_bhd__aecc]Z\aeb_`bffdh׳~d\fkmolwvgacfid`ceaVGPV`ejedcdbdhũwbajjmlv{soidfifbcgcO37O\`cggde_`gٹsokikjsxnpqlffhgdeeS?B**7DD8%!,84:BFE>4/::;4,22˜|giqztZMSgyeMTSGKMHG?:@?=8HRA:=@@E84:B?>6.2899>>C>957;?966.Ԣklosl]QVn}~iLUSCILFFD??42BSB6?BBC62A?=2/7>85!٩mlnnfYRYo~z|nPTVDFJ>;BD?@A5@TF=??><@C:>7AOKCC<20:?AA?>;8>?4)"4FJCCB=##3B6**6=BB>+*8=:936;==>8//7676ۮ~jdrrdjmrx\XLDA><6331(3HA*-=A<2485@C@2,4=?:6:@A=:<:7::22἗ytmwunibhq`YI6>B@833+3IK71=A<84=8=CE826=9=:;;<>?<=9>9-(ǢrprtxyumUSi[^H.:BB;+,337FI65:B;76@@CD=6=>>,3?)2>@==9?;2"ѭggptw|yrQK`WaJ39CHA)'68=?=>=@@BD=ACA6# 200==<24A?6$ܷ|a`pwx}~xWIY`eS89DEF1,9>@GHB;=:7=9;<@ACC@DD<$+95@?;($7=;(~j`mw|~y\J\hi^CBGDG;596BEGD848<7367>A?69CGD1 0:>A8'&8?<ʫviikwwsm_Z`kx`PIJKKGBC;>ADD<**4756827AC<>80/8>=ϭykfgqtji^\ber_VIFNQLECDB?BFC1.17768-7BDBCEE@<<>D?1:8/.<=<ֱ{gimuynoc^elu\RNJJRTFEB>BC88@AD?$ -15:8:ẛ{fhu}}xxefjqzZKMIEN^L6=CD86@;39=;98:;=C42;@84=DFC-#,1<76<Ɲ|jjz~|{t`jlvzWDHICI\O86BE95>=8<<0;9:98C-&,9=99;44:==57C?0-7>675ͦyr}xswugluyxbFDGEGVZ?>?DB;?B?:($797=?B=-,4><;?2;E9558726ԭ}{kmzpq|uqcOFHGFS^K?DDAA?CDA-(/2-5?B=5/4<<7>9=DA:87/22ܸ}iawrr|pc^SEIIHNTJEEDB@BDEB6-58+/68?3289<;;>BE=44-)&Ǧk[psnvj_\WDFLKKRMIFAD>>D=;2-(Ÿzm`Zghk[Y^YIGEDJOMFAEC=8?GD;349;:6<:@=;46)3@D=8@A?0'*Ҧob\Zfkt^R]`RLGBIMIC?ACA;AGF;*,8<96:8>99;956=B@8@=;7*گtVWYaozkQ_cZQPCIPEDE?? =BHHA--5;528<9;/8;?;B>?<==;71+ຜzXSX^u|s`emgXNGNRBAA?A?>EHIB*14>1-3:;6/-3;@A?=?=>;<61ȤiXZbqzohkrmWNMLRE:?AADDEHEB349:5-/6>:4,+5;B@74=:6/28߲sf_aqub\isqUJKLQG8CFCG=66)-5@?A3)45((+1ÝznjjpsYQakmUCHKPN@@HD<3=:/3;94006;AE4('79+&,զyuuy{bJZfk[ACIMTIDGIA32BE@??=>=3008?4(24>AC6$&251,.߳{}tMU_ebDBGLTUMILB34@E<9=??=8026>;47:;>B9++033/3à~~tXSbgrVBEGQ\RKIG77@D<49><>=;9?@;3+65;??/26889>԰}pXZbgufJFFLY`MHC@9;IC46:9==<<@@;1..48==<@?9697¨~|wX]dgugPCDKK\VECA??DH<1:>@96:;<;3"+4797A?9-64׶{y{\^git^LEEJMZ[B8;>=@GD>>@>>407>;61#*16627A@346êvv{_]mvzcHGGJLSZC5;84@DJDCA;247;>;.+2664,4A@=8߾zwxzmcjxw`SJIHLO[O:5989=@9AEC@;59737;64466204>?=;AFCF91565-1:796988><@@A๕}|z|x\PSMJILLNPA>>=BJBC=.0780--3979<=67;>?Ϣ}{~{yiXXTLHHCHIJ>5;>@?CIFCA4+192+)597=?<1./;?ܴ|z~x|{umc[IJKABHL@26@@BFICD51/42+(4677;3(1:<Ȝ|vvyx{skgQDJD=>62;7:43:21097013>Òniq{~vxxaXLDID@FNKIH=92)*57329?֠shn{yy~_MNKIKJKMOPK=4:@B706:;85/,:B7.&/58::>ޯ|lp|~~eDFIGJKLQSYT?45=F7-4;<=5- 3>=0*067:>>罊uxyiFEHGEO^XL<47??80594+%+3乐}syscP;8BBHELXTLC?:=A=57<7$ 03:<<8903<ը{y}s^YLGEEFOVOBHFC==>=:;;& 0500<<60.3ě|z~vOUWNCACEIRME=EF?<;=?<7--25),7=;;70+ⴑ~vNMXXF<>BDJJKEDHH@35?;:2*&*25/0::990-өvVJT^M9:@AGFHHG@HF7.5;>7*)(378:;78:41ɤxgSR[S=;@=?B@AFBDM<+29>=+''07::4+0589Ĝ|zrjXWZKCE:@FEB@AAH@..7>=4,-19;<5).148㶎{yyu\SWSNL>=FH@:=68;<74377:=;0&299ҟzyy}ycOOSPOIBFLD66=>BA<87<<7377:=4&/49麏|yyfNMWLGJJFOM63=@@?<<97577647:73205ث|yxvcULSRFHKHMN@6=B=<==<<:337702313803a:&::::9989x888888j868766k5:5 55f543=333]22|1/1 1 |0 +0 / +/ . :. - J- , O, ,g++z*-**)/)(+'m''4'Y$s$ %4$|""Q# fa\cbgb``djigeghjjhc[X]fhe`ca_`a_ZYZ]`__[WVWY\Z\Y\aadcbdccaab^adbeebdgmiigeiimhf\[^deedabbY\_Z^^b_]YQQVYZXVUUb^^bdcb_c`fbbcecahgjjljhd_afgikfb`acdeecc]WT]ade^_YZWOQT[Z[XW[]WU[`ab][\af]`cfeceeihlokh^XX_ffddea_^ecd_WTRU__ac_[]XSTW]abba^]QPV`b\VQY[a\bfadeggjiidb\YZda_cda[YW]db_[UWY^cdbb`]\]^cceccb\YUZ\`\YXU\`dc`^^aefeehffed^]_cb^cb]\WV\a_a^\\cdef_a_``dbeef_^][\]b`_\`a_fd^\\^bdcfhdbde]_]aY]bb]]WW^ad_a`^]_bccfcddcbcca^]][]bbaabbhjc]]_eb^`dbbebcc`bU\ca`_]]`eecd`cab_baffgfcdb]ce`_]]^eddeebfihe_ad^\Y`fdhibaffb`c``a_[^effdc_^VOZdcfggdaT]]cbbc_]^ddcfgigafkdcdc]YV\dgffghhf`^^dccbfebcefec]YYZ\bgdea_VV\^dcec_WX]ddhgj`fjmjffd]\]ceeaeahgdYX`bdfeidcY[bde_^Y^ZZceed^]]YY^bfeeWSSTZbfef]`gkkjcg^]^efdb`cikd][\befbghf_]_fca^X[\^cegc^_`\\_bggc^XUZ]`decagjkmkgcdbcdfhbafeje_^_dfjfkihcbceda_[]^]digg``^^_`cggd_`^]^`cbcklmighhcdbfijjgeeffbacffheffddfddfdbb]^ceggbb]bcegegea`_`^acc`jlkecbgjhfghjjfe__bhlgdccebdce`]``dfgda^[accfehedeedecjc`b`a`a^kmjfa`cihhggihfa`Y]eiifa^abaa][]_dfec_SOWaccdcffecaa`cddh_b\ZXgijh]adighcfhfda^[Z_gg_]Y]`d`_Z]]cggd^YUW`abdadcfdb_[^]_`e``]ZZecdibdhhgaa`dca]^_W]hnfb\Z[__[_]dfgca]YZ^aa^^a`e]`]YVXW__Z_`\ec^cihkfc]X[]ce`a`[afugd^[Z_a`_^]_ffgfg`^_bc]XY\^afaZ\XUZ]d^[[]^db]`jljgc^]VX`dfcd_`gmjd^^]aa_^]adfdffacac`\^Y\\bb``\XYY]efbab^ecacfljgc[WWU]cddcbdjmfgeb__cecaaeffba_`cca^]\]\`bbca\YW[cgecaWgebdhmljd]W^\`ffeeifjljlfdceddeegedea\[Z^_ba^_]_^`_b``[X[^cggcaXiffijojij`]^aeffggkjjilkheddefegfd]^Y[Z]dec`__b[X[adeb^\_dgca[ggjlonffeddbcffgghb`fglmljhfbbdcbbed]]YY]\eefecg[VVW]bdca^\_dha`aggjnlfd`cffigiigbZ[]ffjhjiaa`ae`cad`a^\_]acfeca_[UW_df_[ZYZaab``fejkmgb__bihilljaWWUaeggfa^bc^Z\agda]`bdccb]\[Z`fcdZURT\fgd]dfknmjea_bfhmjmhc^YW_eddbdeec^\[\\dhgffcd`Z_`_[YZdff`[SQT]bfi`dgkjklf]_bddjmjjha\\^cfc_]accd]]ZZbcgfgefgb^]^a]\\_aebb_][[\behbffjjlghc`eeagjikhc_^ceeb_[\`dba`\]`befeedbcb``c__cfecc`_]^`defdgdfhkihdbfb`cglmigbbaeeca\\]agb`_acedeea`bbecbadcfabeec^^]`bfege``glkigfhb_]`gkmiffefhba]^^`ccbcbefgf`YT[adccdcdb_]\[dfb_abdechgc_bggdflge`^^dlieheghfgdd`bdceddeegfc`[VY^cd^cdfc\[RXaddbabbclhb_aheeflkg]]aciffeddefhfccdffbbedbdgd`\Z^^ce`b`ed_ZVWadb`_^`_jgfebcgfihjjgbaadhfc_^bdfghfhffgdcbeb`dg``\^aca^`acdc][\`bda\]`aeiifceiigilgdbcgfea`_\cghhffeedgeiddbdfdaad`][[bfa``fca]]_`dhijgigigdfighfccedc`__`gffbdb`cfggddeceecb_][Z]ddcbbdec`_[]_bdcfhgeeb__feic`_acba]_`dhfga^\^aeddceec]aaddc]][[\chhffeed`_\`^ba_bffcca]aghc_[[_gc__chihdb_\^^dfcdfc]^\]afd_`Y\]affdeaedba]``cd_bedfec^^`fjcb_]^dfceggkkgc_\__dheegb_^[\[eea_^]]behb_]]bfedcaabacafggfbabglfb\_`afhhgfijhe``^`bgfgca_`]]^acgb``acffb]^^`eddc^Wgdacfijgdadllid`a`bdfegfihleb_`cefcdac`__`ffeddcdeba^^bgec_[Wldcehiljfgjkllhcbdfedefecffeffegfegdccda``cgfhfeec`acfebcfgda]]Zljhggekkghglmkiffdabcfeedeegcecgfhfdecdedefdgc_`\]^bggfd_]\Xffghabhiid`djefhmked^^befa__abeb_adbcedgfgebcbced^]]^dkfgdaZ[]cceffadimea_gaaddjd`][afaa][]`a\\^_\cghigc_]Z`ee__`Z]\`fegce`]`b__beffknibcfeabdhca^Z_da`\\[]^\]]^_bdjfgfc`^\[cda_`]__`ffcbadhe`^edgihnkedgfbbdgeb^^`fea\^]a^__^]_defhgeba\]^ceba`]_`cgfc\^_dgeb`bbffgkkhfefefhkhecaehfc`^`db`^]_^efgffedc^`ddcbddeefc``dfebcdcffcgpmd`cehlihe_bbchhfggec`^_ccggccdeecffca``bddgefdc`dbbheefecbqoe^`aegfdc]][]cekmkjdhddcceed``dcfee__\]bchhigeaa``gfddf``kmg^^`ddifaa\[]^`\bfdfeeddcacbc__]_cdeca^\Y[aeighdc`][^hccbeecc`hqlc`_cegfa_`\]_b^`dbceegc``cd__\\`decb[\\_bddfed`_YXZhc`adcefdgopfbedcaefd``^_bieca^^bde_^]^a]]\]`ced`_W]aefadcc]\WV[he__dfgilnqhfca]_cegca``eefc_[[_hba]a\``__``ccdbaacfedc^^b]ZW^fh`^]`fijnlnlec`[]`gied_^bbfc][Z[cb`a``_bc_aacefeedgfgec][[_b_]`bgda_dfjgmlkkfd`^^]aihca``gca`\ZX[a_^_a]cddecaaeddgfde_[X[^^adXggbacfglnjlkifa\]]bghdd`bgdc_\V\[ac`_]]adfedd`_\\^acefdc[ZZUVZabdeefeghihghigd`_bdffcfefdec\\^_decbbecgcda_[\\[^`aeda^\ZUX[`eefehfddhh`afggfdbeedfbddfddb]]^_abdebeddcecb]^\\adfda^[[]`fgffdfd`djaabffefgd`dbb`^chdd_]\Z[^adabacb`ebc`[]]\[]beddb`a]_`cgfb`aef`cfdbeeddfea_`c^]^chca`_]\\_c`]]`acdebdc^\[^_dcadccaacbfjc`\ba`accfeeb_^ed_`a__\efb^`]_\]\^d^^]^`aadbceca`ceeccb``aabccjiacbbfbcfeedd^\_dbda^[`ahb`ab^_\\_c`_]]^ac`abbdeedca`^_``a_cagjfa`ddadeggfcXY\`cgc_\^aecaab`^^_^cba^^\XV^`c`c``cbca\^^_``a51)&('2"!!(640+0366-* /51#*&   "!((&%%&*%$()", ))"$0866/,6483/"01/+('%% ")  '(*%%!-''%*+#**.2346,$-247/,(*-03/-+ $&) &&%"-%-+#)'/)3775$%440241,($322%  %"%" !&)$%/"(+..,0//42,0,'-2,$&0+%  *(%%'(#',**)# (*!"+*)'/,/12'%21$-*##,%*"+*,+,"(##&(',+,- )#"4,%(*-3().3&(&.//&&$(2'(# '**/*,,.+*"**$)'"&"#56*,'&()'1/-0)1-*)'!'"#+,'(!**$ $-/-2/+,%*-! /.())"145)&, #/,56+(14,(-&&(+--.*%" ++-2/+' !()'& 0,*,./.*48.*.*.0//25954&$ (*##%-+'*,-,-! "2.+& +*,% ((-,.!26874/.*,,$-&682#'(-/1,* '.,%$*,,(  '*,, 1'*),&&2886-2 ",4,'#+782&',-)03- 1+$"  *,2( %!!',0*  #(++(268862+,'',/1%$13:4($%,,1-513+'+/.&' (/.0&# "%&*00,%#*)*7;87235*,'/1460/0557/,-/43//-,./..1.%&)%,.2''!+*/2-0,&! ! &+*#<;81-,5:5/23660/%(1;;80+*,+.*/#$)(,/2,&*+-,3/(3/,(,*4*#)!(#$ :>:5*(+6532243-*)&4;994& **(*"&'./1*&**.*/10**(&-,05) 89<6&(.623,,3-0("#"-88'!$).)'!!+22, &&'+"0,/.*' $&((,&! 422>10652*&&0-("()6?5/''(('!./0*& *( &#/&('!4-*39984-$&-.(*0 .7E82"'.)'$&'/12/2' ',+ ,4*&0 4/&-:;:2-'"&.1/.%(8<:4"$$&..*$&*.1./4**'-( *)(+,,%"%62+05;:81! !*..+*,78/21/%%-1-**//0)&%#--*"!!(*/-.!(0,*"83/16>=:2$( &,-+)1,4503/(*+,./441.1)!$%**$%#%$(%*)# %20*$9546:=:97(&"$,,+.007421520/,.311212#$!.1+&'(,""*.'%(2*&587==?744.,*3--..%,036323-'*.+'*10&& /11/08"!),*! (0$#,247<=40(045/.1/0% -/4341&$!*1&-,2),&!#*-/10,*!(./$'#(54:8>8,#%1733534( (-00.02( )-$!.60*&().*++-+&&$!&/** +/($04:<><3$/438483*"%,..,).-/-$# #%252//-*,!%)+ (//&'-1'06::;5!%,3,49665* !"+4+%*++0#&/0252,/2' "( ,))%%+3/7477;56-)11*0/485-%$+11*%&.'$)%&.11/1,0'+'##&##,)*,# !(+,26246:660/5*(*08864**,31-*(2)((,03.3/&!))-*)(,%,!+/* #'-,84))2=86276,%#.58745325**""#++)*)1541# ',-*,+(% ,/)%()*,*;8-(,85.4=81&" ,97/318545.*!'.++.,+.25*#"+, *.-*(..)&'')*;:/(*63159;8(+6451023451+/+11%%+,'.2.&" +1&)#/. $.*# &"7:74*-85:6::/,*0652'',242645412(*),)#,/(&$*-* !(+.*#*.*#(/;?704>9989;82/-44.+(%0255411.2,6.&).10,**.2(!,1*'!#/*(%&,6><8;89845;:8403623+((+5144*()'*/20..,3+30121%!&0.+'),,+&%%)43598332*+7493(%*020''+0542+ *,.+-1/+&**00+&&!+35//1,,&'#").(*55-03.'.8;-' (:2((05753/%$,/*./-&$"(40')$&51,.*,,+(#(+0')3443*$-7<3/%$253002884-%%'.3/,/*(! 11+($!!&15)'//0**(/*-*5887/.28=5/%((455226753+($()/42**(#&(*,2)(#(-54,-.0*$82*-5>;86.4==;0)(#+.41246593*%(-11+,&+#%%()414/,.2+.1,(" '21-%=0/569=:7:A3,(8+&(.7.((5,)).%#!,(*2342+%&/1'%)!#//2+/()1'(2457?A91-41*%.3-*$'0*(&*%&&$(-,210/-(-0(')%%&/1/*'(.15)(448>=B?6285&%,01*$$)53*"**((*&(0//303** +1-*("%&+01*(09/)1277CB5/12-*142(($'/51-.$$/23'"!$,'&#-10("$.,&.+-&  @9(+(24:9AAC85-,$'-18+*)#112-("(8/,&(!()(('#--0*(*(*-,,-$$/& !=>0*)-7;;A=?930)!&563.("+/1-& 3,(*)(%/-(,*-1433.2-23*!(2(&)5<8.-25<8@?:842)"$*63+(##2-*+*%''.&-2,,01-,+.0.0/./'$''.22<<20358=A:=:95*&!'23.,#)22-(" ,0((&&,4410.+(!!$&+//,- ,7:9956:;>686982+(,.11/'211./-#!!&'21*,/1-5-0('  $&*,,*"#!")99=766=;0.75850/11.1),..-.0,&&*(,,0/*100+1*'&$!&,-0*"  &+<<7767206<.,2755480(+,)&",3,+%&!,*.)),-*&/++&"$!! )10+*()&')3<;21197-1=61440244,%)/$$-5+(&(&##'-)#")*+.1/0-$!%'0+&,+-**(0,?B50)24..33743/''42'&.% 15*$(&(##$.$$&&((&.,*3-,)331,*'&&**+8@?13219217;942$#*212,"(,6'&*)$(##(/)%&"&&".-(*//.010+&( '&#(%+6COR?FE3/Phgr::7630#'2/4710/,&%5=89<<4-6>712$*DEDMB:@@GPFKG9;[fgt56760.$.035430")8>69;95/:;>;0 3KEDJ@AC9:WMMHAC^dm|894-' !$5344.(0B6(,364049><*);LBHM>@@2>aJNHDM\_w}87.% 351241126B6*,12003;?<01@PEEIC<7*G^GNDEO[]~||83($-4-),9/(+,./09>2-400.227>=45HGCFJ@,+)ISKOAHPYa{y23,,19003:"&%* %,;4,.-10++:@A;8ECJMI7,.-NaNI@KR__m|2,)-35378,"%.-&/=8-+.-1.3?=>JO>@6;=;QaRLPbcYLo! ,/'&./+&+/,+,292&32!%C>08@;>KID;2:91RaQMUdbZXw (,),00.001224:2-62 .F7/;@;:MJ>0)977RaPLVdcXg}( &00,,)13,,83=9215<6%'0J<2@<=BKM4)!;9>WZNEWc`Yo(' !#'"$#3.!%2=;63;;6).=L?;;:84BQ6*+E@HXKLHVbYTs.0$(&!*4)$085<<=:5/2=F?6872)6J@7;J@HOAMLckXRm// ,/*-&07))404=?>7648;C>899619247=>MDGIK:6IGC@[pjZIq102/01502-&*2.86794421'#+8?:878;KNCFIF:\dj`X1-/221+&%)05;94<1120)!+==?=52ARMBFEB:DLH:=8400458742;;2:HE@?=4*5QK9K_OIPyz/0/ 1/20/6<8829;3)-55204@?>HBE;6;23;KE8JUJHTwy/4.&)*42258<7941=:5024182/4DCKJ;A9<=16=LC;NUOLctx}493(,/545794+048=866220;35?EHR?;E@=:2:HKBHWNU\spuz45344/43785-.44:9785433@79@ABL9?B>==7@JGNT`L`bimr|4487577662+)6<73356-07@<9?BCA7==3=7?=;;>A?GaiZWVdhiv(-7&,71-7:425:82/59.,0=:79BA37A6A==<>@@NebUSV_gj0774;0'+;<::;4.,2:9009>;8<@:3>@9C:A;HA?NbSLJS]do23762.)(>;46:7&+1;>=7>>639<BSbNGLT\`x1.255--6=84743008@:<;8950.5@=@<;>DF@B7@W^KFNV\d/,0848:99205/2438=<6650++9@=<8518,0489??8,'47202:;<9338GGMI@A\[^UQWiv244/'/<5120/.299=802755445378229JHGNHPWSZcYfo|4571*9:22131058>@9545761-/6>52-:H?NPNTQ[_pkmq~78857C<2355655;85EABSKKPcfpspps~9<68:;853434..<@;:40.39928=<86:E9DOFCOidpoprs;;25;7<78434/7>;<70-'5@;8=@=79E=7FIA>Tj`qruuv=93488365597><998-((5B@>;@@8CC9?JH>?ZdXruwv==87;446767=923580*0;@;5>;6@DB?HIH>NdUSpwyx466776/12446;2.7896569>:7>58CCDEGJII\cKUlv{120362*-4618>/.8;78995=@92;EBEEHJNM]UIakt|/272*-469?>23:97=96158699553,.8>><;BB@;:Q[KR\WSdov12581,1169>><067060+->@<>@EHA6=V[Sb_PViu|023540-55?;8467:70*.?@>;=HC97EUV[j[Y\r~1/316550:7.07>=81.6?>;29H?9>COSep[\f~1,268951-0271*.;D?<715>7:1=C<>62024499@D?=7?A@XZXcq}(.776877667?>A?2//4518AAOeY[gw+*:;6345401<=@>4/015586ALKF=:@ELep``n+3==6610-.19@>1-0665539IMEB<>JLUqqihx39=6001)*-3?>9,,68652/>QPAABIHIWpnmo4;62201.*,LL?BDCD:DPgruw4,*044637;>:=632/5==?ID=?@6@E<:>>JJMJYpy{ 3..210*-3::5:51207B;:@@9>AGNQPTfx} 02554**5>::51572?C;>?:6EMMRUV_s 6e6J6-6 5655y5;4544k33442~363 1 0Z 0 / /x /- 0 .< - -T - . -5 ,,Q-,**R*+*+**0((h('(&h&%A%&=$#h"!U!!>" ; N~#((*+/),-+.0-1-2,49;9:9;:;<==;}<==}<)/1*&+.63/551452&<==@5:;:==~,+-+,++0-2222337-<<<;;<;;;<===}==~ᘅ"~"ܙ|"z"{#|!~%Ŏ!訄"Ό"蛡#򪨭#$"$"%*,,l跰#ɰ"丩"ˬ"滦!Ү#쿬#մ'&ڰ"길##Ƕ%#)&&,+64d##٘""%"垂('䞃(ƀ%劗'(%"$'%,.6 ?-2.3.2.3) 2 k                               Ѵvlrrtqkkpdbcegde`^]b`\[^``_[ɰuqsopmnsvk]bddecc`\ab^Z\]`a^ êurqrnkrwoaadedged]^ca^\^Z`a ׸}tpnmkpuvpgfdaccda^cc_]__a_ʫwolmoppsxujb^abcdcbfc_`aa^޼mhloommswvf]]_ccddfdbca`_ гvgjosofjswp_\]adeiiebdb_^ ˯rhpvvgciorobacadglkccba^ǭssuwm`ejjkmgfcbclrg`_b_ xtvqphdhjedifca^bom`^`a ظyorqkpoihgcdfec_Zamg][^ ȴ~{kkqqotmghddebab__ioe^] ȵ}tjkpquqhhfccb`_^ahnld` Ѻyojlnnmohcca_`agmjmd غymhjjhqpc`cd`aa`bchj ӵqffjhlqi_ae`__aadei Ȱ{ifjhgmnebhh\\adffb ïulmhefikgjm`X]chj` Ƿxjbbehhdhe]\_djb ubc`_cbbhj`bcciǵldd_\_aiplhg_aů}jgc]\`goplhd^ |ple_bhjjdaԽxrlebhjdcbbdҿyshadhc`abbî}zna_fg`]`eĭ}yka`gfa_cí|slffijc^Ŵyohffjh]ʼuiccfj`~qgbeff°{nfceh{nf`e~oeböneĹqù   ¿¿ ¿  ¾ ¾           ͣzwviUY]\OCKKIMKEEH;57;<8;30/93.,4554-xxoZ_gk^IILJLHILLC258:;;73-492*-/364 ޷{xti_glhYNNKKIGGOI85:9:<;:/0:8.-.)36 ӨyuoiceeUMJIFDHINH@=847:;60:;2/0042{urk``b`_OEFFGHJLOKB7,17::9=70344.۬wspgZb^cZFCEEGEELON=+)07=<>=:78200 ɡxuofacddO@DA>A?=84:GC1.-4 ԧ}ugXZPGIIEHGACB:>?<;5.9F<-,0 忠}o^STEEIFEMH?@>;><8955CE92/ ܾyhZUMBEHINKC@=:;93228CIE;5 ˩viZ\PEBCKIHGE;;:8256>FBD; ԫ{tpeVD>DFCIJ:5:;55:56:@B Ѥ{ucF==B@CHA48<92488@@DF<:CC--8;==: ַxaK@A><=AE@DF7(0;>@7 Խk`ZO?9:<@C>C>228>B9 ͷobccK8:97;:?@B;<==Aտsddf`A9;6169AHECB89ټ|igihW>?<029@EHE@>2ԵvnoofTCB;4:@BB>;ѱ{qom^PHC<:?B>=<:?϶rncXQI=8;@?78::һoe\VRA73>@>:7Ѿ~nbUF?>>AB4ŴraN?<<>C7ʺpZH>8=>@̻lVF=:;?˻oXG=9=ʻw^I>>ʽcK@ǾgO½p       ÿ ¾  ľ  ƿ       : \> s }"_#C$Q%~%&(S)&* +% ,1 -8 .1 /( 0, 1-23 h5X6W7S8=89g;3<I? ߺ՜¿¾򷸻½¼ſ݅ž~}|wutvy|ysonsrojjnsx{}xsnjlswwrlkl¾|xtpli^afhcbdeegfgee_\]`becbb``igfcdbaa^_`ba^YZX[W^b^_\^]ac^^\\^ca\_cfgedfefeegedba_abdb]\\^bdfec_\[_]^ba`[[XYZ]b\\ZZ\^aa\[][\]b`]^\bddcdcdfgccfae`ddg`]\YYW^bac_\XXZ\^ba[Y\\Z[`a_\Z[]``]\\Z[]`b`^^aea_bcdaic__ddfcdde`\]Y\[]aca^[YW[Y_a``]^^ac`\W]\]b\\[]T\\^ba]^bfea^_bacg^[addab\Z[__``^]ZZYY]__`a`dcacd^W]]a_ac\\^\]`da^_`cea]^a`^^`]\`dceb`__`^^__]]\\]\[[\\[^b`ecdihkidbbfieea__^`aca]]`c`a]`c_^[`_abad`^Y\^b`^ZXYWZ_]__]\^afdeihlmfggfihfcc\[Z]ab^`\^`a_]\^^\^ckb^cd]Y\^`a^[YVV[]`ba`_Y\^^e`bccdcadcdhbcbc[\\[\baa`^^c]]\\_`__difabe_W[_b`_]XTYY^_c^``^]^[\_^acc_^fadhbbdb\ZY[\_abb\[`a[]]_aaedcdd_`a_]ZTZY^`bcb]\ZXW_\``dd_[YY[]bac__YZ[[^baa_^^ba^\a_bdga``cfgcbbd_^`\[[]__`b^\\ZUXZ]^__a^[ZVVY`_`a_a[Y]`bb`_^_aa`_]_acea^^afdba`__a``_`a^`^][[WZYY\_X\]^\XXW[W]`bic_a`b_`b_\]`aab^]^age`^Z\^ab^[X]^__^^`_]]Z][WYXZ\\VX[_`][Y\]`ceca^\__^^`b^]^a`c^Y[^adc^ZX]_a_]\Y^^[Y\]]Z[YVY\[\^]ZVUW\aa^acaa`^Y[_]WX`c]]\^`dYYX_bca]ZZ__`\[[^a]TWY\\WYYZ]`^^][UZZ``]Y\]_a[XXWVYcYWZaa\^^`d^VW[_bb[Y[][][YZ]b`XW[ZYXTVXW^]_^\[\Y]^^\YXY[^a]ZXVPUe_YW^``^\`cc[[\`cbb_^\WXZY__``^\[\\ZVWWYZ[][[ZW\]]YXVX]\_^XWVP^_]UO^__]^`b`^^b``aa_YUSWW\_``ZY[\X[YXY\YVSYXXUUX\\YYVUXU\\][WSSYWZYY[ZY[^_``_^__`^\TTRUY]_^]ZXVTUX][YWUTTWTUSRY]]YUWXW[]YYXXV`VVYZY[XV^`^\[Z_ZV[]]WPRSWW][]YWVSQTYY[WTTWWUUPUTZ]]YVX\ZWWUe\XVYX][W[__`XW[^`ZWX]^VVUV[ZZ]^YYSUTVZYYUTWZVTTUX\\][\\YVWUWTcd]\XZ]^Y[[^_\UWZ^]XVWZ[WWYWUVXZYXVUVXXTVWXZZYZ[[WYZZUSRWX^bb]VY\]]\ZW]\XWWZ\Z[WTXYZ]YXUTUVZZ[\ZTTSSTW\Z[][ZXWUUX[YYVUUTWbaba^ZUZ^`\UV[^[ZZ[YVWYWUVXYVTRUWZ[\Z[YSRQPWZZXZYXUWVVTVYXVVSTW^`bba\WZ\``WUW]]^\]^]ZYZYQJZYVTUTWYZ[Z[ZWSSTWYXWWUWVUSTTUVVUTTSW][\ac^ZWX]`\WTX[[Z[YWZZWWTSW\YVXYYWXWVVZXWUVWXVUUSSPUSVUUXURRSPQaYUZ]_\XVW[\YXVZ]ZXUTVWVVSSW[[ZXVTUSUVXVTVSSTVQRTSUSWYXRQQPPQ_\XX]]\[WXX[ZWXY[[\UQSRTWUTQSUYVXXVVUURQSVUQRSTRURRSRWYXYYUQPLPR[[\Y[ZZ[ZYUWVVYWXTRPSVVSPPUXXYVTTUROQOUTTPQPSQUTSTPUSVYWVUUSWZYZ[]ZZVXY\]YUSSUWWUSQQSSRSTTUYXWTSRQSRQTWSTTROPRVWYXWRPVVXTPX_YY\[YWSV[[YWQPQTVTTQTRSSPPUVVWURPOPRTVUURPPTUTSUXYYVRSRRSRVVSSe_\X[YZWSSTWWSQPUSSRQSTTQQPPTVUTSONLNPRTUNPMOPQSTSUSRSQURRORTSRdecYXX[XTRRUVWQPQSTSONPTRRPNRQTTSRPLLMJNTOOLKLNPQOIQRMOPOLKPSUPdec]WSWXVQRRQPOQRQOONQQNNMNPQSUQQPNLFGJMJIJLJPLQLKLPPNMLHGQSPMcda_\VXZVRNMLOMMNMPOOPQONLNKOPNMQQPLLJHJKMIKJKMNLHGGKMPOMNPNRMMgcaa`]Y[VSPLJLLKJKNNMKKOLMLLONMNLLOQPLNOJKJKMKMOMIDGHFJLNNONLJKvjc`_`[VUPOMJIIKOMLIGJNLIIJMLKLLIKNMNNMKLNPNNJKIHGFFGJIMKLICHqga^ZWSONMLKLLJKLKLHFFLLKHKNMKIFHGKLIHMMKJMNNKHIIFIFHIIGIJHJHE|pe]WROMLLKJJLJJHDFFIJLGHLMKFFJIGIIKIIJIGDFGGHIGIGHFIGED}oaVOOMKLIHKJIHGGDDFIGGIHGEFGEIGGHJKJEFFACECDEFFDEDEDyfWOLIJKIHFFGGFFDAAEFEDFDAFECDCECCEGEDDB?BA@CBBFDCDCBDBDkZOKJKJHDDBD@ABEDDBA?B@AABBCACCB@@AB@>@AA?@A@@CCAq`SLIHGDCC@??@ABA@<=>>=@??@BA@??<:=>>?A@>=??@A?>B@={m_SKFCCA>>==9<==<>;9887:<><;=?<::9:<==>><=:<;<959:;9876832554::9::78657:89889:<<>=;:84ugZNE?;:887656885421232376676322454575569887762uj^RG?9765446466431/1210+15630221-21223235334612{qh^SH?96420012122/-.01/'-/02-/0.+,.112112.//.ź}vle[RI@951/.-,,--++*,.+)+.++*+,-,-,++,.++,,*,,~vni`XPIA:3.-*(''*''(*%&')(%''(%*(&&'&&%&'&%'&voje[VOHA81-)&#! #$#$#$%##$#%$""  "#%$""%wrngaZWPH?70)%!! !zytmgb]UMF=7/("¿~|xtoid]VOF@;2*#  |wric]XPJC?81)#    }yrkc`[SLIB<83.("  zuoke^ZRNIDA<630)%ÿytoib]WTRKIDA=862.'  }ypkgea^YVOLJGC@<72,(& ÿzysrifd]\YSNHG@@<841,*& }yvroieb^ZWSOLJFC@>:540-(ؕ|xspplhea^[VTUOJ}{xr26?>526;9<5:996*%'+/62//)-78520/.+'()/)*!"*1*(!$!*-&&#!!&+,+17=<787979989610).141&#!$,0533*% (&*1.) $)1%!!$*,!&-)&0.7>:36367<337.6-258+&#$/.-(%!"%*/."&%"$0.(%&++&!# &)/)..6;4-2324A7-/445326+&&! &.-.*$!"(.)+'**,.30&)#'2%%"#%!$/*/25=<.,/24:<.(.0322.1%$ (-))*)!"!&'++.043136,''.-12%%(%&)3,.21:<4+..00/3/+-0341)(++**+('&&%$&%"$10636;;??6119>;90-+-*+,04//3:31)030.*1/42020.&(10*!"-)-+(+)#*.7259;@@7<<5>;755'$&,/23..340)+.,,-.9?3,38)%,0.*"&+/.(+%&.7+1332:088>5323$%" %,441,.5/)%+/--/8?=12;/$+1-+&$(0'++*)$"%(*.21*,718@6-22&% !*477+(14())/44987:66-(+0.+)#!')/0/'&$(&-022/%"$$+2,--+! *5440,.74.+./28<41137<3213-*+' "'+()/*(&! ")*(+.*&#!-(-./4"&+5510,/441/)-1594.*.47620.+-00,++*,*'&(!!%+%&*&"&)/;3'.+/0570+)0442.',4<;1,%&,62,$")--*-''&)" ##%"(-)&!'')2320*&(*.039.,,217.&$,1:5.$$)/4/)%",.$!&))%%"%$%,'"%,1,*,*.2,.,*(/"%37-)+438$" /571)"$/-0)&$,1'$(( "!'--*&$!/-+'!#&,. :( +84-221:0!&051&#()&,(%%)20 *$$! *)-*&%#!'**#!"&.'";0('2552+3:7*(+1525/,(!#),/00.(++(&!&&)&&!%'&'! &)+*  12-!022/2591.,21344/+"#+00-&)*+%*)! ("  " (%$%&'%*&)*"-)&-2533200//01*.$)/.)##  #+*$!))!$&!!7%#&,*-% 252.,,2)-/11!#!)&/)#"$&%!! %).!&"#>2)&*(1-%*553%",23+'%12## (##).&)#&$# (&'&%%=>3,#+12+,025. "+1.%$$++'")#! #')% "#"###&%&!$#!#  7<=5&+0/1.+%-.("').)*" '()+(%!"*''(+%%%+)'#!$"$:9:84+#+25. "-.,)+),'!'()'#(&!%'(-''" ##$%&# "#779<80$+057$$//0.//-+(+*+( #&'&%(# !"" 8.18;6,&'13,$ %,,)'++''$-(!%&'%&!! '#!!f 9,'-682*((/2+%$+-,%! '(("$)-,+)& !$  73),463/((,1.,'*+-) #)%%+()*%%  "#""  023223/3//.0-$(%%+($&& ))'' !  **-042/*+.34.# #&))&!!!""%(*)&"""# !!6.,.321*%)22.*" ##(%%$" "#%(% #  !#$=93+/01,$$'.0.#%%# !&& !%$%##!"!>;4)&./+""$g #!%"" !%!   >?=<1*..-% ##!!#      B=<::502,%"!!  !    XH?;9;54+&#$!!   }gTF=84,)$!      zgUF9/&#!     {iT@/&%" !   xaH3'!!     kO7(       qXA0%     }jWD3&     |n\H4$  ݳvhWD3$   }uj\N?. {pe[RD4% 㰯~xsj^YQF:/# xrg_\YNE=3( {tof`^\TKE=4) ݯ}yrogc`_WOLF>2( ~ztmigc`]UPJC:.(   ۽~upkie`[XSSMC71-#  ž}spmkf_[^VSKC;;4+" ƿ}xrrme_a[SOICEA6-)&!Ŀ}zvqjfaZWRONE?:2.-'%$ ~vqmge_[VSNHEB<9211,'#  Ŀ~vrjhe_]WUQNHIEB=83/+(&# ÿztrmhgb`_WRLHCCD@>31/*)%  ¾{vqnida\WVVPOHGC=<96-/.'(*&º}~{vpifa`[VXOPKCED?<|ysromke;98 Z6v454T1v/!p, c* X)4%_#T -xUaZ /}" M&I *3k03Og7+Qu ˵ʿ첱ޮ񰯰⤥򨧥딒~~zwtvx||z||~󆃈|}||{zywvtssqomjllkllmmnnmpijlnnjhljnmoqtuwyz|}||{zxvtrpoomkigc`\YWTQOMKJJKLNRgdb``_^][WTQPRUY^cfhjkllkiea]WSPNLKKJHEBDFGJIGEFHLORUX|xtpmkhfdb``^][XTOJHJPW]bfhhfbb`]_\VOLKIIJKKLNPSUXZcdgjnrv~{yvtqnkihhijjhfddccdbddcdhfiijkmnrsuvw~¿񸹷cbca^\Z]\aafgeebbafec^\^]`a`cdee_`^`cciecegec^^]]adgeabbch_[]aa]^^\\^_dfggdggifehhefdb_^]^]`bfba_Z^adffgkffc``Z`Vbhfb``dbg^YZ^a]^[\^[`dbcceddfhgdcggdfa]^^_a^fdb\]_`bggigeceaddgkebdacfd_]]_ad_^^]^ba[aa_acefcbdbdefc`^[^abfi`^[]`egecggfhegeffehiffdggdbb`accbaacbb_]]^]`abb]]bcfef``fgifhecgic__beigdd``bgjigjnliccb``aaddeedb\^\\^^a`\]]_`abadadaefdhghjiihd`cddcdba``dggfjmkjjbcba_``eddbd_^]ZW`]c_\]Y]^`bbdgfdefgjgjigeeb`^bedca\_cefebjnhec`^^]_caa\_^b^^\\c`^\\]cebaacba`beffefce`]`_dfdaacffcbcgmkha_[[Y[ac`^\_]a^^adec`^_\`cbebaa``^\]_cc^hfcb``aa_aceefihghjmlkg^\Z\[[]^[ZZ[]]afea_^_bccebbca`_^\\^]afcdadcb_^``dfihfebfggjgg][W\\_ZZ[Z[Zabba`]^`b`db`^]`c`]]\^_cd`]]_`d_]^`bejggf_a`eddb_d`\Z\]__[Z[YV\aa`a^\^``_]]_cd^`^aed`]^^dbaceehgfed`]afe`aacb`_\]][Z[ZZ\^^\\][]\b_\b_^\[^\cddbcggc``^`dggcdegda`dfaadbdbaae]^^ZZY[^_`]]\[\\^_cc_\[[\bdeddefedba`ffcdeffa``_^chkgcbcacZ_`]YX[Y[Z]``ZZX\\^][^bc`_^]^U[]``^`acafdcfcc_]ce^_[Y`bfhkjcedkTZ^ZWZ[W[[^`]\[X[]\X[[`baaZYZX\\^`_^][`bcceec_^dba\_`bbjkmkjkjkSZ[[]WW[]`__[YY[[ZXY`_baZPZXXYZ_`[XWY[[_bdcdb`^_a`_^aeehiejljjeUTUYX\[\]``acaZZ\\`_`aa_]UVXWXY^^]\XYZ]_\c`ccb^\[]^_deeddgfghddPQQRVZ]_`_^_a`c``b`]\\[[_^\WYW]``\]\]W\[``ba_[YYX\^ddbba``afgfcSUMQTY\]^\\]a`\][YZ\``]]^\`^\X]YXYX]]^_^][]^]\_b_]]__bhbbWTPSS[\_ZXYXUY]]^]XWWVZ[`_\][W[\`]a]^[]XZY[X_`\[[\aaec_^a\a_djhdZYWVZZ]YTXXTVY[[YUYZZ^]YXYXZY]`a`_^YX[]\Y^``^`aadegd`_aaegji[[][[__^[WYUWTXZVXVTUYZZTYWVVW\_^`^XXZ[Y[^a`abbdfedbdedcabccf[]][^\Z]\[VVUWVTVVUXUW[[VXTUXWWV\]__``_[YZZ^]`a`bbddbaa^_a`_bX[\]YZ^ZZ\^\[[XSSTUVUX\WTTSTUUY[^]^a_`_]_Z_`a^_``ba^__^_^``abdSW[[YVTWWY\[YVWVTRTTXZXTUUSXTUVZZWUX\^\`^`a]a_^[[\_`_^_`_``\^_adUWW[TVXWVTYXVTSTSVVZXWTUTVUZZYWURQUTX]][^[\^_YXXZZ^]^]\^^`deUZVVURTUUQQRQQOUSUWVTVWZYZYWTQNKMQTWYYXWYX[ZXVYZ\[\[`bbeed`_VUUWVTVQTSTWRPPOQNOQPRUVVYZYWXVSNMKMMPW[XWVYWWY[XW[[]a_a`a_aa_^SSQRVQQPQRTUUSNNOPOQNQQTSWUUWXWWQMGKPUXZWYWVTUZ[Z\^`dcdc^\Z\_`[\SQRRUVRPPSVWWXUURSNQNMRQUSQQRTTWRPQTWYXXWVVX[\^a`aa^[XY\^`\[RQOPNQOPOOTSUVSSRQSPNNOPPRRSVYYWXYVVWXWYZX\_`_a`^_^\[YUVYZ[_`PMNOKPLKKMNORQQOQNOHIKNMLPRQSSRWYXY\XVTSTUVWZ[[X\]_\YYVUVVXZ_`KLKJNKMLJMJMNLMNJMNLHGOMJLOMOMSVXXYYWQSUUVUUWWXZ\\YWWXVUXUVUY[\OMNNLIHKGLLMKKMKKNKLKMJKIGHLQRUUQWVXWSOQOTUUTUWXYZZ[Z[WVUTX\YX[ILKOKKHJHKKLHHJKHHJJHDHGMMOPNPQQSTUTVSRQRQSTTUTVZZYYZXXZYTUFHJLJHFIJKIFHIFFLIKJHCGDFCJINLMONPNQQOQTTUVUPPOQUYYXWWSVXXWWURSFEGHGDCDFIJKLIHHKIIHGHD?CFEHLKHMMOQNNOONPRTVTSSTWWUNSUTSWVSSRRDAABB@:@ADEHHLJFIGJIHHGIKIKKIGHJLIDGLJGKNNPPRQRQRQQRSQPRPRQPMLDB><<9><=ABCDEEDDEEFHHFHGHIIFHJJGHLLIJJIIGILMKLONLKMNNPOQPMLKDCAA<;<??C@ADDBEBDEDDBHGEDBGEFDIJKJIIHIHJIGHHKLLNOOLKKJFBB@@C??>>??=@@?@?BA?CECCEDBACCBCDEFHILDEHIJEGHGGEIJNOMMKKLKGHC?=?AA?=<<=<:<:=<<=>@DACDB@@AA??ABCFHIGHIFEFGFFHIFEGILKHKLKHHKG=:=<==>89::9:78:9669<==>CADDCDCCDHGEFHGCDCFHGEHFFIGGF:99=:;9898989876356767:<;9979:=:77;;=<;?ABBACEEDB@CCBDDEFFEEBC568859878633465534455775677:<<8899=;==>?ABB=>??A@AEA??>>A13454012125867330213011/122422548868779:9::;><<:<>?>==:;;./031101/022/.,,+/,+./10//1131445453435775868788:99=998344,/.-,+)**-,-+*)(,*(*+''((*++//0/.00/1/2024457411212(+)(*&""$%&''$%!"! !!"$%$%'())*+,,+**+.1//-..0032010.*+,,%$"$" !"$"#!!"!! !"%&)('('()())(('*++-..,**'(%%!!   "##%#!!"#"$%$()'$$'('& #! !!"!!"!              E#'%#  IIEAA>:85220.+'$%%$"  !%%(+*.133:qrlihd`^ZWTURQOKJIFFECCD@??<<>;:<<99;988;8::9:;;?@=@@CEFHJIMORP-0*'#!,*/013/,*,,//-'$&((&+.// ##(*1)(,.+*&*0+" %&-%!,*&$'!#"'012208864/55.4.)'$ #)1)$((-,02-,(!##"-*%('*$ ,&$ $!)0,--120532.+5214*&"" ! /,)#'.0./.+-,&+,.,2)"("*,('!')0%$$*/..*',+02-'+*.12+&" ')16# !,/+*.0-3/0,,-,-/,*&,.$-,(*0-,*,*2/1+&!$&),,*&&/+11&#!##/24,0)%01*"+10,-!#%*01,.21--2/(),*22343/%$#!$$,+!&(()*.*,*3/.3.0011-+%((*.%& (+.*.10..,0**%&(02./2($&'!-(!$#))024.,-.2.210,,)#$'+((*,*' .2+)2)$$&%0.,'(*1*"#-0)$#$+1)(*+**%)),,*,-*,#!(-("$*-+&%#*40-,% ,/)$(&0&$*41-)$(#&-*1))(&("!#+**01*)&&&*,)-/-,-.21/,$! "&*"""&&,13,%$(,+-0**-(&""$&/*((*+'# !&(-1.-+%*,..,,#& !%(!!$".//,($),&.*(!(-(!"%*,!!+# $,10., ))(%$+!#(("!"%,,)*$!$))&)%!"%-+#"&/,& ,%%+,30/+,!*+#/+(%)'&""!"%$*##&/%/'"$-..*-20+!##,0.*(-/.*&(-$$(+(%)&**"$"$$++&#"!!$%--%+0/..//.' +,*(+-)"&# *00.#"#!%+,'"&+)"!!"*-(%$!"&& &,*'-(*,+%*1 #')-0.#'&2!*$% *+&%"! &+*($&"$#''*++,% .)&%#'%.02/./.0!$$'m!)'' )'*(%(%%&#(% "'!" $+,+/)./00)"%$#&)),-.)()*$%'$***%#(,+*((-*,+("  "'()'$'*+-)(/)&!%"!)##)%$ ((%%"$-,'#%&,##&,**,%(&!!$!%"!' %"+  #*"&&$&#%#$ ,% &.-&!!!"&   $!&!!! &+0("+*0/"& ((*"  # "!"%%(,,&%+)(%$"#%,&&$&&%    !!""#"!""&(&%"$$% #&!$#$   %     $#%&"&&!!'"   ( $!   #"($*%#!"("    $#$" "#()  !%'++("    ""!&"$"      # #(#('##     !$&&($$  !      ""#%&#   !        " !%  #                                                                                     c5  ;=9430++&%&$"    !"%(*(/aea]\YVTOLJJEB@<;:573-16100**2-+--*,0/,,.++.-00.67278:=>C>AEFHHw(༕u^G)<] ϩmb__^]ZS@!%OyϩgO3ءÿ¾콻վ𱵶̹񿽹ű񸴳Ӫ𰮭󪨪ᗛ񦦤~~}xtplhfddglrx|{}|wsmf`[WUW\`caekqw|e_ZVSRPPQSW[`dipv}W[VQRUX\`dimqy}\`cghotz~x|jhghnpjec`]X_`gknlgccminmi_a`bfilmmfdcdjnjillpnmmikigdbcgqjglghknnldffd``bbgjljkceegmqoc`adchkmnklkifkonnkkgnnlkgffhefekoegiaajlmliffddbbegjkkljgfghoojcaaglnkjefonlnlklieeijkedccifejpjefgcfhffjkfdeggfjmljggefeemnrmgeegkkjgedjkopjnjgddgglfdgfeiljkljgjkfeecbfjheemjllmkjedaaffmopklffgkkgcaajkmjegfca`fimddfgljhknlilidbabdejjkknlqmkkdbbefponkgdbgfkgcbbjkjedefcdejkkbbehjkijmmghigfe__cejjkijnmojjfcfjommjebbaggjcdhlgcbggegfijknmkjhkjefnjdejefeddcfheehomjfhgkjignpollbacabfggjimhb_`dcedfigbkjkgegffhjghjjhjhdhggaadeknkccdgimigjlnke_^][degjkkga`aaebccfdijkjhiffdecdfecejmknjbcbdbhjgddejkkgefgjlje`begeefghgaa`bcdaa^bdhehfgjgfdacbcbcfempmeaabdchigebfhjhecgfjnljlghc`bcdjdba`eed^^aecd`cgjfebdda`cglelokfdbddhhjgfcdekefbhakklnjkeb_`bcigffcgc`^_bcabbdggdaad^bcjmelooheghhejmjfhglgddefklljjljc`aabgjkilhdb`^^`a^_`bdgd`aa_cadfebgppopmjhefjlnklmojjehlmiefjggda`begieggfa]Y[\^^[^_afea^`bchfic_`knlnnoohjijjmmkjgjjidbbdeb_acddfabced`Z[Z[]a``acd``aefcge``ajhjlnnlkjfdceigd`edhggb`abcaacddbdcedc`[ZZ^adccdaaccbgeaacdegkmmfc`_bbhe_b`afgaa`]^`aab``a`dda``^^ccda`[_adeda`cggda__dgejifa^]\`aeab`bbgfba_^^]^^a^``a`bdd^^``addc^[X]bega_acfe`\__^dbhe]__]_bfbaa`bfijgga]^[]\`b^[]_^]ba`^]^`acd`\\[`cfb]Z]_gd^^c__cef_]\^^aecddcdfdfhhb]Z\^bd_Y\Z``^a]\]_]^`ad``_bc_YYZ[`ec`c^ccgfc]]\^acdeeddbdbhfjfeebaada^[[^\\][][]^^`bca`aa`[XYY]ca^`ccjhgeda`_]deebdc^_^^dghgged`^`a_][\^ZY[\^\ZYY[]a__`_]YW[\^[[\bedefgcdccefedab`^\]\^`edffca`_^aa]\[XVYY[\\WW[[]_^[[]^[Z[\[YXZbdedceccdfcea^[[\^[\]]acaaca_[\^\ZXYYZXWY\\VUV[\_\YX]_ZZ[[^WYZ]bb_cddbbca\Y[\ZZ\^`^^`_a`[Z[ZWVVSWY[Y^_YXUWZ\[WYY\\XY\[[W[^b_^_bcfbbdbddaaZ[Z\[[^^]^`_]_][ZXXTVTVVWX]]\\ZXWYYZYY[[XX[[ZXX[^]YZ^_bb_\c^`aa]ZYY[__`]^]\[]^^\ZZVRTVUUWWZXYXUUYWYYZ[[Y[XWWYYWW^ca]^^_`]\^`^\]\]_`^^YXX\]]_[Z[YXXYUUSUXWZXSTVXXYYXZ][YY[XVXYWW\cfd^_`^^]_b`]^]\`__]\][][[ZWY[WXVSRUUWW[WUWXXVWYZZWVY\VWYZY\cefb]]^]_][Z]^_\\ZY[]_][ZWWYX[XYXVVUQRSTYWVUWXUNRWWYWUWZZVYY]^abeec\Z\]\ZZ][[Z\YWVTUUYXYXYPSTTUUVWURTVVTSSTVVTVXZYWW]`^_bgji^^ZXWYYZ]XXVWVYYURSPQRVUPTVUOQTSTUVROQSSRPQQRRUVWWVTY]]Y\dhjl^[[XWVXWZ[XUUTVTRQPPSTTNOQRPNNPPRQRQNPPQQOOPSUTSSVYZVVbjmr\[YWVVYWXTTUTQONNRUTTQOOPROJKLNLPOPLLNMONPOQOQQRTRSURVVTZhnryZYZYWXUUVUTTUTTSQPQSTVWROOQPNIMMPOLJKLLNPRRNONSSVVURSTWV\cmszVXWRWTSTTRQRVTUQQOQPPQNQNPNLLIJJMKKHGJJLLNNLMQQRWXVSSVZY_juRTRRTPQROMPSOQQOONMMLLNNLMMLIGIJGIIHFFHGJKMJJNOOTWTTVX[Y]hyQNMRQQRTPPMKKONKKIIGGHHIHJIKGFHIFDEGEEFFHKJGGKOMRWTOU[YZ^j~IKKMNPPNLMMILGDCEFGEGHBCFHFDBDGDDECCDEJHGGJNOVUNPWY\crJGFDHLLJIKJHFFEIGDEFECDC@@?@ABCBAB@@ADDFGHJMMNPPNSZal}FDDJHCGEGEGFDHJIDCBA@@>==<>??@A?A@BCCEFGFFEKMNOXetCDDGFFDCDEGFEEGEDB@?:<<8:<9>??>==?@@CCEFECCFILMTexEFEDCBDBCCBA=>?;;:88989:<==>@?ABCCEDDCEHKScyGHB@@?A?AA?@>=?><=<<:;958:978:9<<=;;<>@ABCBBFMWg|DEB?==<;:;98767998643665467998798<>@@AGRapB?<<;=:7::957321565210211212345354578:=<==?DMYiw:978797335021001/.-*,-0/0/11/1345458;<=BKVanz332356641.--,,*)'**(&*++-,,++-/13347:=DO[enx.,//11/-++*+'($#!$&'&')(''))+,,-0148=DNYclt{))*(&(''&#! !"!"$#"$%&%&(*,/27=DLU^hory&&""$$" !!"#$&),16=DLSXainty!"!! !!$&*/6CFIPRTVY]chilqv};=ACEFJMPRVUV[_eijlpuy~STZ\`bcggknprv{.0-(+240)%& %-023.**#61761#&))*/1214-,*.45.-/05246/0/,$$#,9201,-/220&,,#).1102*-+28<7&#$*-+0413641-2550,2230.-*-)-)27+,/"$.00/*,((%%)*.00312/0-772*&&*20202,'7736353/)+/02)(*%/,)060+,.%*-,,./*(),(%..0,..,-,/25740++0310,)(0058062,((..3-&.*)-0.010*.1,,'#%*.-')0,0-./.)(')/-65625-/020,#""0/4.).-%$,14((,*1.-050.1/(""&'0.00/2030-/(%'',,4322.(".-0.#""22.)(+-%++033%%)-22/044,-,*)&')../-,102,.02,*,2512.)%%$..0#(-30*)00).,10022/0-1,)-4.().)*)&(%--+)'-34.+-.22/.78310" &$%,0.,.43' !(+,(,/.%0/0*),,-2.-..,)&+-, &)/10#!'*041.2321),,.0020&$$,%%8,&/./.-.*'(,*(,)%+.202,#"(%-.*&$).02,)-0.0.)#$,2+)*.-.$$!)*+$$ "(-)**..,*(&*)%'*)).2.' &#-.,' *-..)(/,.2101.3,'%*.(""&,,($-*("*.0,)'+,$#.3'-/*'(%&(--2,*#&)0,,%-$/012/0,'"'(/.,,+0+# %*$%%'(..*""&, '*18'-02)'(--%02,'+*/*&+)*01-.,0.*"$'./3/3.+' !!!'(,(!"$**.11,*0200..+&(.12/1450*)+04-),..-($#%,0/),,$ $,+"'*/-4-()-/+//223+./,.44/.*..-&%',,')*+**#)($!$**!$,--0/')*.)*+-2-/,'&%)/.(!)(+,*"' )+(!($*,.%(%)(#!",**($$%**)0,)**#(%,+.0'&%/+'#'( $&& #(()&#'((&##*%($#(*,+&%*.2.)&&-'.-*"$)!% (' " "" $ &%#&#'(( #&$(*#  ),0( &'-,)&(".)%)%"',/.+,)#)"%"&$! "#"%(##*-) '/+&%.#),")*&&#,/++%',##"$%#&(%##$-+(*0,*1+!#,,* %(+)(('(%+*.,)+'&$&$ "!&)**(**(%.-+,102/0)(!(++"(% (*+*,+(%&$"!,'%')&& #(,##).35),,%(#*+-)("! %)(')*"! $$ %(%!"$&$#"&%#"1432%+##(,*,$ &&""#$""#$)##+%##%- $+113.*(( %%'(*$  # !$! &'"$#)(")(%%)0-,-/'*$%+%(($$  !"  "$ "%(%(" )-+&&-0%%(#&(# "   !!! "%#%!' !''#!+43 ! & #  #!"   ! $+%!%'$$%!!,364!)#"#%%!!#&$ * !'('/5663  "'  #%#&( %'+044984# "$&'$"%.20179=; #    $ "*//**0><>##    *-,$&2>?D        #!$)&"/:AFQ !      #))#!"('18BJVk        #*-+##(,.5AOaw          '+)'(*/06CYs         !)1.#-535;Ke      #+02*.26:CWr  "$*+-+19CRh  '*+.:K_v    '*,7Mf} !',8Ni %1AVn  +EJKNSV_bhhllrx} %)12:>CGLQRQW^cekpux}v #'*25<>FJNTTWYY_elos{} !"*/.5:@CCFJNT[behjlsw~ #',24067=CELIMQRW[]elrvy{ "(#')+.267:?BDEHLQWWV]bdiosx00446:;=@BEDEKORUVX\ailnssz~JILNSRQWVZ__cflpqtvw|;<987|4U3.1W/u/x#,Ӆ) +ܒ: *Q 'j%ӄ'#ܕ<!ٕ@͇7j!ӏ=t,֤f+ ช^4 # Ɨj; (ƝuQ,.l\L1x           klnojffgqrqgfklnn{zqssjr komlgensslcflljivvouss|}{ klmjmmlpmojfiolhnursvsvzyvkhfhkppomqojnnmsvpqqpprytw gdefiilomoopswtmkkikr~|~bcclfdfpnjklqqsoligfej~ dcgibcjrmggqutsgjkhdcs dfmgcflijimtrvqjmjgfn klfedfijlmptuommlmoloniccdmlhloppqlloq|ljidacimfgommonjlpr𓛯ifecaejgajmhlogjspw acdbcgf_dighnkdrvta^`dgcahdckqgk|~ a`adhhdbispp~ aba_cggiflytqx~c__^ceglpttnszz\[\bdcmrstoow{z\Z`kjlnknqmv|}]`iknkejsjr}cfhhkhisrrze^agijrvv|^]bdgjsw|\^\_gmps^\[coox[Xanrpt]cjprs{abdnsx`^gpu|cfmsxkotyqx~y ؅ 蚱 20230,,.9=<0/554GD<><3=JLNY]Zh} 20510.-9<<3*,5522BD:?<@D>85542=IHKKNSi%#*3-,066405<<@=93.-,1K\SLKL]}(%.1)*4;80/LRZfky(*"#.2+)0-,7>29JKQRV^iw*((.330.(5?=CD??HIGQaqy#!,:9=@:?B=ENMPXgu'.89=;49C=@DO`nx315=BJYjz/.7>EQcy46+N, W- I. 7/80J1X2R3:4!5x6O8~ 9G;,<> @======= @======= @======= J J J Jmo67 New Layer     BNZ!1bv7|F 2'Sm "2$2Po %D+""| " -|-C!w?F &%O$"tI!})C;rm`&+c!U#)%N&t($i*A +4 ,8 +^ O+ , , C+ + '* {* )S))H((73(y( (I U) (( R)R (  r)C ) O)= * !)U [)  ) K)s  ) I)6 *\ A) *M * $2Po %D+""| " -|-C!w?F &%O$"tI!})C;rm`&+c!U#)%N&t($i*A +4 ,8 +^ O+ , , C+ + '* {* )S))H((73(y( (I U) (( R)R (  r)C ) O)= * !)U [)  ) K)s  ) I)6 *\ A) *M * $2Po %D+""| " -|-C!w?F &%O$"tI!})C;rm`&+c!U#)%N&t($i*A +4 ,8 +^ O+ , , C+ + '* {* )S))H((73(y( (I U) (( R)R (  r)C ) O)= * !)U [)  ) K)s  ) I)6 *\ A) *M * RқZ*o|&b $ o#!_!by!T NXc4 W}#|Tx u@-yF#0}&_8)A.* p,8G-<-Z./01J122151u1 17/!/A ..3.'.;~/~.^/M01/%0b(/ 0H)00H./0/JW/ 0l-/060p0(0m0&0|J =[= =[= =[=    ,K +  ,S ,;{;';;2;;:;;;<;B<;S;;;2<;B<;J; ;[;!<;G<;J; ;S;<;;<;S;<<;==U=?,K +  ,S ,;{;';;2;;:;;;<;B<;S;;;2<;B<;J; ;[;!<;G<;J; ;S;<;;<;S;<<;==U=?,K +  ,S ,;{;';;2;;:;;;<;B<;S;;;2<;B<;J; ;[;!<;G<;J; ;S;<;;<;S;<<;==U=?/%1(0,z106W11H22C33I44j566777G78k898099l9;z:$;;+<<H<=|=)? <I<<:;;;Q;<%;]; ;I;<3;;;P;<!;Z;<;;<;S;<A;<;O;<<A;<<A;</ I. . - P- - ,Q P, - -I I- - -A I- - -9 J- -| - - -G . - - . - & <I<<:;;;Q;<%;]; ;I;<3;;;P;<!;Z;<;;<;S;<A;<;O;<<A;<<A;</ I. . - P- - ,Q P, - -I I- - -A I- - -9 J- -| - - -G . - - . - & <I<<:;;;Q;<%;]; ;I;<3;;;P;<!;Z;<;;<;S;<A;<;O;<<A;<<A;</ I. . - P- - ,Q P, - -I I- - -A I- - -9 J- -| - - -G . - - . - &>==<h<<0;;:h::3998h88.7}76F66)5~54U443]332B2O2 2I2.32lj2$3,2my2#3.2Zz23(2Jq2 3-21z33t/2+|33~5253352H2)<97:53 333:4|<97:53 333:4|<97:53 333:4|-v9(v6T3R/L-S p@&5""2+.38 p@&5""2+.38 p@&5""2+.38 =x͕)1o Z 4s L';y)</37 @ˋ69 0⻀81ċM7ÏU!7ĐW#7侅D7径A7ĊI 8̘_+8ȔX 7˒S8ʒT9< @ˋ69 0⻀81ċM7ÏU!7ĐW#7侅D7径A7ĊI 8̘_+8ȔX 7˒S8ʒT9< @ˋ69 0⻀81ċM7ÏU!7ĐW#7侅D7径A7ĊI 8̘_+8ȔX 7˒S8ʒT9< W<ʛj;/z4%ϏI!ݨe$h'x6Ƅ=#ώF *x1 *u--t&4ݟT 3L0L, 3L0L, 3L0L, >;99>;99>;99| 1# *, /16746369 1# *, /16746369 1# *, /16746369 3G@+$;Xkb@%.cҿJ HaC#=$ 1( +|*X,Z01~2A47| . - -D 1- - -@ - - - - - , , + *?)(''&=    <   ,,+*)('  =>==++ +08| . - -D 1- - -@ - - - - - , , + *?)(''&=    <   ,,+*)('  =>==++ +08| . - -D 1- - -@ - - - - - , , + *?)(''&=    <   ,,+*)('  =>==++ +08 ~;2.32pW2(3)2y2F2 5221g1z1t;00/. .; 8-, + * ) (R D  R (A k S A  6CQ7 W fΊB 5DŽ; 7罁@7 H%^_) /8 / D/ / / /3.A- m- ,Q + JO    R  q:,!$)-147. (.AMRWau ,%' ; Tt h1>FD>=84(&.Fu'1CXjkXCL v]lxyqkebhsx޲y +$'~5'~6'~606667667176667876@79;/)* + '+= 149 9 ;;;;:<:;:>$'~5'~6'~606667667176667876@79;/)* + '+= 149 9 ;;;;:<:;:>$'~5'~6'~606667667176667876@79;/)* + '+= 149 9 ;;;;:<:;:>+/(j &&$'"' -OIAO UO"/$(%,' 5) ++'-'/&1u3A5 m5-ئj0&֤g-"ΕSݮs6բg0 D~D*JÍS mǍL2ҝa() ˑO"ܩj+՛Y~7 ΑM"ݤY 'ݡT +̈́4-Ȃ73z+4Z5t7:=<-% + ** 1z<;;:<;;;;(<-% + ** 1z<;;:<;;;;(<-% + ** 1z<;;:<;;;;(-ҩ}Q'ѩY5ṉY.ؤe)&ϗX+ڬu=2~>z!=҆3;h8ρ)6ӄ)4Չ42X/x-   5z6: µj\SI7 ÏU!,ďS-I.˗^)-ĎO-ņA/ӓK.؟^%/ΗY .LjA/ӓK.؟\!/ɍH .؞\$/LjB'ԛh J$O-'X ÏU!,ďS-I.˗^)-ĎO-ņA/ӓK.؟^%/ΗY .LjA/ӓK.؟\!/ɍH .؞\$/LjB'ԛh J$O-'X ÏU!,ďS-I.˗^)-ĎO-ņA/ӓK.؟^%/ΗY .LjA/ӓK.؟\!/ɍH .؞\$/LjB'ԛh J$O-'X 33ުg(/LJD *džA&x0#ݦb  ΍D͆8v$ӆ3u%؏=m !ρ+ "ږFBs z("D~t,0lx 8:::9&987&7+888;;<:9;:99,:::;,;;;99":;<;:<<;;;;<<;:;:<<<<<=<=<<=<=<<=<48:::9&987&7+888;;<:9;:99,:::;,;;;99":;<;:<<;;;;<<;:;:<<<<<=<=<<=<=<<=<48:::9&987&7+888;;<:9;:99,:::;,;;;99":;<;:<<;;;;<<;:;:<<<<<=<=<<=<=<<=<4<#:%9%817T5|4'3X2G0!/U- ,. +4 *. )%( '#& %'$=#<""q!@  k@# t4!T +  !m"3#$$N%%.&'6''<((4)).** *S+, 5- - - Y- . 8. .::;;:<;;;;;;<;-:<&::::;<<;;;==<<::7Q7&5!54421&10 // . - , !, , -<<<<<< :;;:<;;;;;;<;-:<&::::;<<;;;==<<::7Q7&5!54421&10 // . - , !, , -<<<<<< :;;:<;;;;;;<;-:<&::::;<<;;;==<<::7Q7&5!54421&10 // . - , !, , -<<<<<< o+ ~() Ջ7'l$ρ("Ն- ӄ(҂(҂(҂(҂' ҁ&"q$6)ւ%)l *4 +v -@ 1y144g4p5Y6R:Z8k;쪲GMAOZ131z2T2D(1~0M/@!0^-..@- , l+b 4( 'Z ' )j ('  s'M=' '-(*U* *T*+,k, ,H @=<<<<<<<<<<;<<<<<z<<;!;<<<|<F;+;;<;"A!! !| D !#~!@=<<<<<<<<<<;<<<<<z<<;!;<<<|<F;+;;<;"A!! !| D !#~!@=<<<<<<<<<<;<<<<<z<<;!;<<<|<F;+;;<;"A!! !| D !#~!=<;:98765!4+3!210/ . q. 7- , +*) h) 3( ' & &u' >'|  (O (1 (% h)& 0)! ) x    =<=<<<<===<<==<==<<======<==<<===<<==============================<=<<<<===<<==<==<<======<==<<===<<==============================<=<<<<===<<==<==<<======<==<<===<<============================= . M1 / (1 z11M1263333333s444\4555A6z667777Q7888D8q888$8e:::::::~:q;f;c;m;;;;;;;;;:::::::0<<<<<<<<<=====>==========>===>=================================0<<<<<<<<<=====>==========>===>=================================0<<<<<<<<<=====>==========>===>=================================. / /C . 0 0c / / 0G 0 0 0 0A 1~ 2 3 2243h3343444444Z4555#5T5566666#6M667777777777777777|7~766z#J$$|%L%2%$}%D&%{'I'({(5()P)  ) {* B* +L y+. (+( +' <,) -2 P-G -| z.;-.-I./ .0K/6/MR/x/s0*0Fa0|!1v1'15b2O)1x2 24]3S3U3-4K55(6P6 ;1;W; ;7;^;;P; #J$$|%L%2%$}%D&%{'I'({(5()P)  ) {* B* +L y+. (+( +' <,) -2 P-G -| z.;-.-I./ .0K/6/MR/x/s0*0Fa0|!1v1'15b2O)1x2 24]3S3U3-4K55(6P6 ;1;W; ;7;^;;P; #J$$|%L%2%$}%D&%{'I'({(5()P)  ) {* B* +L y+. (+( +' <,) -2 P-G -| z.;-.-I./ .0K/6/MR/x/s0*0Fa0|!1v1'15b2O)1x2 24]3S3U3-4K55(6P6 ;1;W; ;7;^;;P;  <* *s+ 3++t, 6,,,_----q.'./<//fu1F/1&1Y223334 F4>4uu4 ,45I55v6+'6W7(67+7<8t57 8+89<+9v9+93:o39 :$):L;':';j): };3ÿ);j~;<7=t= 3T32T21R11J12B11'.`.- 3T32T21R11J12B11'.`.- 3T32T21R11J12B11'.`.- '3y3 2e;2FO312:1=========================>=====>====<=><=======>======<=<<<==<='=========================>=====>====<=><=======>======<=<<<==<='=========================>=====>====<=><=======>======<=<<<==<='a:&::::9989x888888j868766k5:5 55f543=333]22|1/1 1 |0 +0 / +/ . :. - J- , O, ,g++z*-**)/)(+'m''4'Y$s$ %4$|""Q#8=====<<===<===;;=<;;<;;<<;:;;;;<;<<;==<;<;;;=<;;;:;:;;;;;:;:;;:&8=====<<===<===;;=<;;<;;<<;:;;;;<;<<;==<;<;;;=<;;;:;:;;;;;:;:;;:&8=====<<===<===;;=<;;<;;<<;:;;;;<;<<;==<;<;;;=<;;;:;:;;;;;:;:;;:&6e6J6-6 5655y5;4544k33442~363 1 0Z 0 / /x /- 0 .< - -T - . -5 ,,Q-,**R*+*+**0((h('(&h&%A%&=$#h"!U!!>" ; N~=7=`=?=7=`=?=7=`=?W-,U,W+I,W,$,WZ,-W-._.#/OI W-,U,W+I,W,$,WZ,-W-._.#/OI W-,U,W+I,W,$,WZ,-W-._.#/OI -2.3.2.3) 2 k<=<<=<<=<9;%;<=====;;=<<<======<<<<<;<=<:><=<<=<<=<9;%;<=====;;=<<<======<<<<<;<=<:><=<<=<<=<9;%;<=====;;=<<<======<<<<<;<=<:> : \> s }"_#C$Q%~%&(S)&* +% ,1 -8 .1 /( 0, 1-23 h5X6W7S8=89g;3<I? =;<=;<<;<<;<;<;<: 9 9 66 =? =;<=;<<;<<;<;<;<: 9 9 66 =? =;<=;<<;<<;<;<;<: 9 9 66 =?;98 Z6v454T1v/!p, c* X)4%_#T -xUaZ /}" M&I *3k03Og7+Qu3Y"3Y"3Y"w(༕u^G)<] ϩmb__^]ZS@!%OyϩgO3 ?<;988888998888776630 *'- ?<;988888998888776630 *'- ?<;988888998888776630 *'-;<987|4U3.1W/u/x#,Ӆ) +ܒ: *Q 'j%ӄ'#ܕ<!ٕ@͇7j!ӏ=t,֤f+ ช^4 # Ɨj; (ƝuQ,.l\L1x!:9;;;;:9;&::!889::;;;;:;;;;;:::999999;<<>!:9;;;;:9;&::!889::;;;;:;;;;;:::999999;<<>!:9;;;;:9;&::!889::;;;;:;;;;;:::999999;<<>7#e %!G"p#~#k$W&^'((#)4* >+N, W- I. 7/80J1X2R3:4!5x6O8~ 9G;,<> J J J Jmo67 New Layer#1       :$$&$2! !!*!:!J!Z!j!z!!!!!!!!" ""*":"J"Z"j"z""""""""# ##*#:#J#Z#j#z########$                          J J J Jmo67clementine-1.2.3+git1354-gdaddbde+dfsg/data/lyrics/000077500000000000000000000000001260417502300216055ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/data/lyrics/ultimate_providers.xml000066400000000000000000000312501260417502300262510ustar00rootroot00000000000000 clementine-1.2.3+git1354-gdaddbde+dfsg/data/mainwindow.css000066400000000000000000000016601260417502300231710ustar00rootroot00000000000000darwin { font-size: 11pt; } darwin QMenu { font-size: 13pt; } #playlist { background-color: %palette-base; alternate-background-color: %palette-alternate-base; } #playlist[default_background_enabled = "true"] { background-image: url(:logo.png); background-attachment: fixed; background-position: bottom right; background-repeat: none; background-clip: content; } QToolButton { border: 2px solid transparent; border-radius: 3px; padding: 1px; } QToolButton::menu-button { width: 16px; border: none; } QToolButton[popupMode="1"] { padding-right: 16px; } QToolButton:hover { border: 2px solid %palette-highlight; background-color: %palette-highlight-lighter; } QToolButton:hover[popupMode="1"] { padding-right: 16px; } QToolButton:pressed { border: 2px solid %palette-highlight-darker; background-color: %palette-highlight-lighter; } QToolButton:pressed[popupMode="1"] { padding-right: 16px; } clementine-1.2.3+git1354-gdaddbde+dfsg/data/nocover.png000066400000000000000000001173741260417502300224760ustar00rootroot00000000000000PNG  IHDR,{sRGBbKGD pHYs * *otIME*90QQ|IDATx}%UqГ2"]_uuu 1A@@$!La'tN/[Vսnz肞~bUݯC>OPWWW s=y^&mr~3'L: inPJ-|g2q =dxϥnv <ʹMNUUUAuu5>o>r> D>Oѽ‘#][NC@CS`Ͼ}av[Ŵ PYwjڲEyJ3_._T[S|]ja)bb[]<JAuU5dG CCC(a}  xܿ-;v̜>Hπ*>s4س3ڧ>`>ܭS2P] =6^T^1 jl&zvkRROOȢ,` />xN[H*X(xх/+j`R@9|xgɐF.9ٕo Ad_ֈR' 9%㺨QkTNJ3-;K? njkjaxdlկ` /q=UU+4EfPB q!#%^+AgpI5llctR\kg68̓~pyR5^]]$pC< o|3).&aCB KvիZK~]7~*Bcu~γ`g't9Mc|HAK{7Xox,9.6Ģx5*[+&-,0Ԃu'[{B` h}cXS9`!ú'^󟓲a8WØq2wcXW4M5KDEͥ"Sa t{G1;T4 +3|a]m߷- wa ,Ac݂c1,/$LIO˻S1PSS *'^ueۇT R}EU߉4N=[(Ma @) whZahp@Ʉ'SO7 |/lD%M~[D7?wBˆðuX/'`wG"MrVZ%CfG S5{%j~p DZX`Uc.8e{{!l}ρϹ\ى><<Ŀآ/{U2.< tȆz 卼,ݎ CHu ciHַz]р5Vɠ1dA [c}464?S$1{1S6pZJy0!}0*|TA uO -+yvpa <(K๊6ZtKL x;  vBu|Gpl u u5<WeG Y\ݣK%Bo$Nl@+恜NZc?!ԓ&C ly|I|V+a}ۉ59E4t&]9.uNirl+ٟIgqTc0*0vpb}}.eN-(z5,j_f CBOtoqwdg2u@<‰Q m-xR΂ *1+" BLчz!k`;8| 8x٧-tHdQe] հZNBσ!EQu: p!).1c9/>?)"_QPSOhb2E$ex+b:!߹"u10WA 5 k S9_O xǵ(9/"B<(ĂH(U$=BDs \+ yWG [ako^w aO,*);㪪ZAt^:Q2ң[Ks+OvB>ѳ eR('fE@]L 0Yv t{0@U\hVJ`X-+zmY՘QOvƦ[y_j΢@0blǸgI+ODRXKP8fZ"Ưl*oŒk_X9&"=JuX D݄k_Zn8 [[uTuUUUXCxSHFA> !CPS"Do<`%{V k;ls#C/QW2aX(cf3,X&`M^x/!i3mjgS,~) Vzq}`KXܓA6q]7J4$HPn@bP:(N{1 u 048#C#pdჰaӋpXݫ*ZOjAӺlֹ05hkD(ぜɀej+U[E9p; KIX"XQ#2bWI@qTg+kQ`*}h0 p1ð wߞ~+@HkXaur ~BseMXơ-0s,cl  VVf,T[&# %) P>Efm [ ħK+,jHDc\ 0:x<jxW U|?!u猓+:]K+cLwOsZX! |[H f-E" ͬ4b<1Zl[QPBm&@l-~,9p C ufX:7$%DaP,0$9gLE}4o$+XU{ 2%GEw+$a?ᏒXg}5OdUK,z *xg=/F@`ņvY hYfֶ¬KJfJMج>XP{ 4+e>0Fe6Tɛ^V'GB?mS[a> ؕ)Z8*(?oxæl=_Z sbt5X!D#fHwEU5 '1B 2/P` G(=|MNò ^+Xg}^` dἅ}U03X 1lKͲYVs\=LT, Mؘz̚-mlDuB˶F3?GOO/KGUfeT+bI200 Cü GW> A]D|Q,dXaX?N`yh<PNcΞW -U9E2) ;4QЬoa#>д{.Yl+{ndY}ma ^ܽSlR a[ '?N `(,8be ASsT1V5`Yđ_^Zy,CKH )EB X2B FNuB|PQ%3=+b" ˛_g9CFTw݌ Vբv3THX5!%bZ`;@q f`E@ql08k wl|[N5_tGu3$!uCkKؙQ!)Ͱt1ު5FX!FxYU9ӑ@B /,LEOO­"@BbyB91`@q^#MKDñ]M/c[kٻx"\aUVVrKgXӟ49eaMeG\L`mm `{)9XՓ.seA CB"GЖR?2g(4Aq*UQ)\wHx\fTm.OX#J!΁9m,Z]9%6)Hj4*Jr|,fXTh u%aф?D /!vk ^.e+ۋ<]iGhFpo޽E'a 3YreIa칼g EI V/zZ\NRKUDW{^ˇ̺$"r<Ȃ]3;DQ(Rclq#TP˯בG௏=2XK,j𢶺;ag לhg[-t,3fZ6:;b:ʕ!x١'KV_H4Tb3/6*Rq5+oWރ jvRn"?X#ȴ0 < [{äl }2 ׼flm O'1Kôv J"X<5-  @\G5'Uҕ7~'#V12!X;z O>lٶ%lϛϢ 8ppϓXʰ=%/;Zڦ2pf-cpd>((Y/Rm+.XQQ*EL1="Ey%G UČ+5hzQ= /rY(a;:/=X  Xt;;V,[ӦC}*XJy@Erq6xQOˢ/K0dR"DӒ1gT9d>Is|$"&::1r)_N7x`mEcM\0!?ohwC«~~UBkLSBlt2=kgTHbuVDH|@(vm(u 7n&NqL$9 V2Q`>ubeXi CoO?=sl"jXv\: k~q/Xvj<^8g!Ѷ6Zܶ*k qV}EhEò B ڳU gЈIjDS.bMVΏ|6bבn;HZбᗿH `zj⋟0pٰxb 8u's*(2C5ˢEa-y?B "m.SQL"ZB_`%9xpA__3aєXa5֩+I MإˡҲ. B@G"rsO쉔T$ѺCF5Z~D_hbDSx\ ;XUr2+U+Og< ~_ ;<"GEbXWS8`$i xjg0*Gdw5҆F\q lkP6ӡuesc#-!-J H@`%cvho/޵k7qnGQū3,HB«9 Xڝ)^ k'B]]-^M)%W1.J >%22*8"aI$%K>5HQBrȾ| V ] tm֭[ឿɟeBR#$ΰð`? G8`]:eƸB9N9SxYšةvHXJUF!bT cg - ;ÏSxPxFwVUŰ~&N8ZZ[ TyuJ[qv1 ƼQ1UBv3Pc־hǰH( TCU% UQ\ V!03ryޱthpyQKR0Ѻ՘D:YH8 ˿(,X K-=*nͤC$ aJҙ-Zd=C!Т( _Uvl JY5i9|VłpA_U8Fw[hqC}0BwG`RV]MM {PUSUS B{T1 &)C+8ܭn&~w׮FS%RFX>SX->UФ_X]Y@ :l v-֢kprwO`Jw,O?50m4ȤSޤgAb2++>WS]Tp{Hg脲0Ɔ`Mkܟe`!u#p=[ʟ5Tb1, QUhY`Wf)'L *,嵈!$#}gZN4= B*?"kʌA4*DnkDvDa`xㅀ ŞRhFB:s0FM e_RQ{H$S$V73**+_dY3<=r_ [Ԫj^k>._wXYHV<5`W-򰰪26sVLJwԝqb*ū B*£ {S <-KHijHzs2 HM,IJe Ñ]pVR4 ?^ Z {/ƋϻD3$ %YÐImCᝯ*[&LBֲ`DB{>z]}Uߋ9x'',;˪kƌi_Z|t%]n )/;U ZU"5*15bG,9ئR* =!:"^XiFUV1}JE1KBŨP ' #/Mg"nVbiX/byĐٯ)RX8P¸<C@ cK}$lEuJNzB`JR8'e2U$PSsѽ%ve=ӏ{MZa  ]:V[yK2̛5N;4hE[($&-JHk5fS q|Wf.R VN7҂0)Z+M@%*C3;jD^iH:wҘѺ\[*w8WBβ3OdXiIHxI22,)I[+Y"OIԍ'Lmi h{i9"~A&c"2̫82$6'Όa͎dW?KeԊ!t!)L%,]yVYfYg鲫QQ)e7|b9CѱCH{oZLSa0+&wh<-sO./kX"醄ֲeưts.i-\lϤSf(;MIphZX *-rm8WwjǁюɋEEa=mNFiI*G#%/ -.X9!Ú9c: XHxcrki -)^ǻVd2%Iy%*"A\ms9^+jzETX1{fQ1hL{(xa@™@RbaW 4keK?C)cUiWQiŠ< 3sn B}VHx ZtiyD@fΆrU& h :C!CX [6p,角vư`FOxF L0QÝ B">OS(#tҘXE/Z4w1w5"ARa M1)Vĝ7_к2)#Lf5)cG7ڣ4` M!ס]`[lݤx53^vE󝉤ކWNh1&`"jqTw_qbĒ 7dXlV> qmEb0521ɀU36.g~oWQSW:1=r9k&bޚp'4)D4{Zԏ%;DDʹmh¦SfL~B wMtbf`1ɪkmk@u7% `(U 3P0d1TdfbGE#W(FTjTdv# /Thٞ P[Kb.{2j`+g:FJ|PZxe+!M16`ݔZRNLAUuUqt`24v`HG 4)U@z`wDsÝ 2-\ )B`EW '1*!кpP6[f=-ȌaX3,៓XKְbqp'@*M"1)l1BΖX-KV~p|I*tJA>(ЋP: L!!-ѷPDU)"xlRJ^ͬ\F%UdTGtÖ-[@g R#<'wv[mM-̚=5uEoZQ+Jc.] |D=}0IT;)-/3 !z X逆!_X  +NCʀi'#:c@󽅘U`H B8aԸ0MdY\}mvسg]-X;UdV> Wc;.J)LI.M(e~avw~mɎ@aY5k"`ݚ ZpQ]o-kyMV|*UR?".XOܐP[)jR`ی;`u$7#_98(!=rCD O?kӦO:3YёbW`QJ_iKamX5!H wPUU3+I`%0l$PY4&hW%x=- Mw_xFDTRF˛e R)Uqcø0bhi MMMQ s)^*l ~*^jV~>>$v-~/1, úֿ$ 5fL‹x l%ZjDbJuHENJ"f 0[_z`;)B kQB@d?6Pץ!е"hFVٹm Xaݏ@TU|3)jLQ;쑵}N?2ұ2YȰl$:,>,8x)gZxr%8MP K2-C+;%WK)ʻ0عs<#E pbNu4_a\6Ӫ3f*++Udƻ!Z1* ǩfXJ1j^D<:VO|q>}"ú}"ko}[d:G/AI[n#m^> vuš#…(&:?H{3'Ƶ1BYRò-"q;-B)Kxt|$ ^0FkfT΀1S2Ģ)5^|,e1pHx_nK``먋q7kg=ʙMc'd@/+ mOV*JP׮a3so֬Y)85iA OS @x Qڱm7֝-10!X' ;5vΆeKp Kry0,!7 7*R-U_ <^I[Ңl"dI9@ Q=y̝;3/ެ.E J Xmcu1y: p &2ݶugrk~QYB',o)+B&!E`Z6@D:";%TɆ *{],5ɕ@';f. 3#V紀!Bб) WA]˾`U`sy !ϒE`;OC.{K~)SR#>ZmLʘ ‹¯;xvh˧a9!!cXwqGBkne[.E ѬKǒv.5ND0^n=lٺ ]]ғJ%п*LX]xǃ_b CRS$2,,,]V1˖ZĨѢrTX&Vb j ̜?Spm8J;!ǰJ `͛7+l 2Kkf0Y5fU\`Yݍm*æVAhRشeYМfIChM m A)+ /?A\숝v5/oP {CC,?Ҳ,"Fd"PCˀ)fc `ŋVt,35m39[ӎإ™ga<yJ#{>?Y\bUbu{1z'0  d͛#6sq[`ojmͪRJ݊j@1O9ȲBMm-ꛧLzڥ1. bx)싆984jY`yZ ΜHl &"Ac>7b2 53lacܾ񽯇+YXgX I `͞m%t3봓OSN>]4PTX$1SWǑP Po_{v7"/Qc\4E n۷o}<:,B/h€CVL NGl+,&P8RpY-˰"Jv(®#=/;[cQ]-V,KH}p1w@*cGM=O`r%P:P,,U 6l| V_K`Ȏ'UcAg߲y ^X' | |4+K-s:wWiYyB ίNh{(4,Q1t|DUpɛY$Z)ba*kMƌF624_ꗡHdǰphdVG1,*i]6ṲSY/!fO !O>{rM@̿úWy[=D]`WQj9%ÇV2W heVC0#΃P[R>8!'tz|,"e,\k|^{lRV ,'Hqϒ5.CL!G#*$?IͰ=Zដ?//jFaa]8tQ^7h  o$FN Bww? ?UH?]g̈]P|N:$ xPÔPcPBC ] UXHaaDԜ hX^(nM#bXsf;! &6`}ITi||AZE۪"BMh޼y3\l9\OfNfg`㶈!v6R,V60a͒ŋmo`y/dkjx,d:4ؙCO%u u7)~Fp"s 5>h5&#FE<% y5Wn&T 2]wq X34,Gtv?!~UB|߻f| 5 \;b{1ܫ Ag;yT:%tVH)C,$\n ^gt8뜳]\t->t0tXI9ŦҰX!sCf0&]"er:QʐyiV7Os.xǤvx >|6lg}.Ĭbό%`lA%t{"Xq{]ʹmvYVxڬJ|=lSMMHӢͣXLb^/ 8gO%,+$DD% f g=uxF02^JS tϥ5klo+ /[ T]afr;U)p/oQ}88/,tBDA39GlEVBfRJiwj+NQZC|gKLfX׾wr -`RkNw?eo⋧" =i72 Dӊ,yw*ܜF؀oܹ\[P^xVZmy)wPD97A ߿'İ$ASOl۾ qz4b1,TE0yј027^VXq!`펮ڵg | sK/ "fT[k<˞D #nAD9}>?d=dž|;{akNczEc~nGw\z[| X]KK7*,,4 #>0 w m51 Q]2 ,mp0Y6nXK@K//z#_`L`e(X 8RW>v /bIzzI8 )r9sf0OU3^?xSVQ,˩ htǮhǢQ{kRS97Yy9f;x ~ 9T'KEI*AHc9ϺI k,"zS i9fN> >,S4 YCnl7 ^Y6pL -[Tm6mVtʑׂ1w(;.eG =]~mmoZ \SXJe?O;u#İF]]#x\dX%p\ 9g2jSF;> گiԖ! zz[oz_Яp[q챰aIXuaݺu˰?}{khZ[;e*JPkp_\@Kv\z>1+#* 둇 X!,ÉǯE@T2P( wDIْ:/nqp{2^Cz6}z(X]akkie`/m\e2|ӦE\~*1ʈӸ퍙=ßoz6piX`\J `!XiV$bN:'] #q`VRE0Dw!L(BB h516zᇓXmmfc3΂_s:0a`N9ױ\ 5؇o!%?.^kU?䓮ƀa9~:xe){.ew [ ؝sqnۜ4&,-$,2H=g`uu¬[a}!Nn8O9Sx"10*]6E t3|{PÊ~%es|tl;­{_Nc-oӦE^9s`moNw|K'{t҉e GIGcO*xuO|Pòs1$5=,S K: }8 v pu>V acadϟf-EbۈVVE4tpq*56q`;{N?,Y X4 3A]_hcݳ>dXaBV+imfYB-\o}˥! >LK9(nӟp "$4655L6C[0@Vhhl޵ s7 éAHȑ<*E&R`8g^\v9 ϱGXlL35PԁY3g]#%h%%)$#q.8y@pfoA|~s !(]|bбmJi;"޾}GQ k]7ԖRuz1w*fEufIÊ- GX/K?NU`i_if+^ M <۷ Ѷk胥I-\('2syofm(x>8DaK{F! >LY}u% e0n-|ƨX7׿57$Զq4,c%ZZ[ y!a-;i>/8%hVh+K|sVCTk2R4-_Kq3Yq|׍7wbeQaF%Ρ7]|r=Ua3;G_R䰌 `9qI Xe`S/3r#99aժ}gk&5XF#x؇?j QBBVtMY@k5*t%a;NHmć>:obZ.tv"h=a!e E^J7֭یaB,Sv|T"B9P^Tєm^ǎOÏӰaO`D?EmG|v?,]ՆHh3Ebv^y\w mH&\ Y3}{{!6hBCԻt]&c+HZ>jLz{p$1|p+k5EgtGMԥbXo/K8w>xBkjT.RY*ޟ'Ð?< .,,&2F#LwqvkٔeMЏskXHD?tlǮ\GXphii- ٕ[qBCsrzՏFx(̣x$)A3|ުBλ{)q wp=9ž/rYB>.uu2`eX5o۶ЃyϝP̊8@~oe츦{z,=^pwp?@  ء3#u[&SfLW℟8JJWo}`k>|dy=wDJK[u- uj XPz7$"X֔eSѺӡ\wWg'z*\HW8:>U cQqGoXX|ܒepꩧJSeϟ =Xx=tV.)Sx+wR]4ŵ% &5hea=V8'r_a_O,GXwsnLa\pI\z{ga/H"^ Ns5m*;Ǫ*a+!˙/POw obheUQΠ:1HP+_JBT*ITϸ??g EgO&]Q^7q˗Pv3*$c!(cƗ7c/H<ʛ'腇ۚN8Yw[`}0ͅDld8KjZ[ی 9Xap{^;0?JJ+z`Q1Jq5>#NPʲcn a O> yo8d'Rwɧk>/ʪP25+Rpٺ7}ixӍ7YDd~N8(mN3gʡ/Ld9c0L:$\b8ʮ H OX N:d_2B<4[9`͹ac)6hV6ţ*%/ :C{cX;wX&YBZw/ʪh+/Kמk׮Vv5+΢ ڀEk`afiq jYA*\[}m-ɠiuxKѧZa5uH,BUB\ BAbb'.Xr/y((bp9&JDe !Ь n}_++}\\ Z -u'giPnN ^N Nʾ2 3-b+WraUڦǏHWwG w<w dIˮFM*޹ؿ7_q+!òl(LJ#^WW}|XE8 VqG{~0p`p >ډfQ]U7o;T0v JuR )Jʑ/`xZu[+`q  z!@p׮\+`MЋUQ1#U X%uQ, hOiV])ۧ/lmfnī駽>OQSSe&P b? ,h(n]]WCˢ<`Jm,6X!!, ur*xZ[[:}*1{A-Ȧ.&]-_'^'L`dPN҂Bzͫ0nX(~)?]{ӟπ(O&b0۹3L0d++a[k )%;1xq`޽a')Y[hf?B@C+ ,vUҶQ9(( } 񐲌(ڭ3Zg]^8x[04џ" 7`s..xgWC-bWTUaM= 1L2_^S/B3H'+0_@khڣkM]Bz/?0v%k:JEOHH=2 t@%jť- +<;nJ舯uvay kճ&"k qϞ-9aْe RJөz.A`@RfR,_jz:t* 0+#;Ӻ 0zXE bқ/x=` io!>RD㰞bRHNj<!9`>w!o+#հ }. عxmcȿ{P][&$d4@%"%EwnE=r%/pϊ/Z*_Ya.q,}qrYYdSf|I]?4۱VX9{PBT+rt* hH?ķIh)ԯ{zC[pW 5%#j aݺ^/oaN7'SUM=*< @R*Κh??𫇝pO?2VѴ"Q,B9BT6h 3,ĩ/,+>EzO9X?ķL#b4dJ/uL͙Mܭ^L#ukׯJ~FMQa͟煄, JsPl46 U>/*2lqeʧK`'N*6 _k׭w{;BWS"GYa z2Xd93>~õ_j@EAsSM$x/7H<;\{ҠZVaqҜXjUKYb#>E8vq˿_pS4ТoZGJj"\Ȉ_}a!f3DV6$<[v( ]7??R[[EbU$:Khh3ݽ (]Lwמ 耖F[Ψ?;, F(*R\t۔zxi@Kt`* < ,ԣ\l7#]I q#>aKBB׮Zӆ?o7~ >}|qV*˛ 4aVPlyjY≌֒=˛6Gq;+;䄐ᗷt|`É' Mg.M!VTBG?[U0/]·ի7_RѰaVY(v:w‚/[*&ā 5P,NL/?X`п&‹`dxĶ#V>qѯKC L`PUU^vhEkiRr@Tw(LjGCU)˦ˊ1 }62bD~ wa ºVm҇vuSn~N8$'Sme|E47T]EVOqW`$;-/S(X5*P:C^iw̝ .)Hg*Д"BBpP{EhUR^dTŋ>AN8-eLJ햆n͚df;Juz &I?8HυG JRFaư vlVrFʰ=b]b"ϯK`֖-V(Xf@uU UQ1׬n+I`l`H20{?m]*6Ea>`MeL6[']kcVQ+*XWQYƆZTV{FwtbpP5U<4Z'Һ)u`@)lBBIRs)Z;~}o,v5+ NX.aV2,8QmP\% >SN:;k`EdH|: =.nS>yP9<*{U#\)أ?{[`Uɿ]"S!}QbSe Q2g.Юw %Eb8V$Q^ 2ƀQ xcYjV>#]!C$!!cX/_3#GË^2XBhK,>?j)QoDTH)M, Us~C]EZa@p;ّ:{U>%EdHQfǎ(/;vnO~?Sl =Y%n޼:G 0e㿚nwe'ghlUV4xU-}U<:Q(m$D8.V6DCa(s- yR#`Th2mgΊ5səwos8A9b}װ^|VUaa8c %.zΪk!!$[3Qv#V0Sb Q)Z*C`){wu:D50WeLkݮEx &GR]Թd E={#Y?~y5> !Q+0ư6$*9`Y k}84b(ހ}wX[(zHSs4 L[%Y%:6\8!LApPܥSδjU tձ"'=Hv TaRjx.bTJZd-6-[p³aqѝ1 /i-4K !?)\+az >Z!JPb -U)gq(QAOkY{PN!a JZuZ7NDhWI F麓 j:b(;;Ш۾SϮꁩQӰKI,LWO6߾zo;oOZW|7X +#IYX(@iB>8R[);$tXMGL,B3BUvtLJ= > b9?OLEce xXaMԯbUES߿*'qR'*XpISn=բt:zj >c)(![% ""p2rC 8&QbLIy)Һ Qw?pW*3yB3 :cZගaW~罁P8);i[gT3D=TX Jl!lYBBVKTsE ^("Rtp " kW6†dX׏Iar I Lc! E ']QAJmgÕV#8R&!_t! ET\)XQz J(7{@2Uv)Ѳ~FJ6ElF06}x KПIak>Ï=K^"$ܸ!Q5)n 4)|S qZ`Pd{9**D-?ix0 1XV8`uyH 44Z7 F>(m46fG(V+`W8{ !as($Dz9)fXV+wfφ}뻌ee8{ِ %hIXN)L&+4UhL#礖 )<⚊ôp1Xsz?$|#$іm%6: _4BG_QHjoC#XIaO7-Ϩ^"Ut̅,K L3h &цJt*߁ učeW(rZM;w̹vm+Ma-e$Yޝ \=/^ 7Q`uUPU]5 `%`*jHKFSTQuLY, P}\3@,*BVBִjҴTz9TVCZ7"|mtl*vԈ/Kk6/'0rmbAhq},ZʯM&x5M㳭Fsfò4x)`r/;%^;L}DiYC/\񉈦 5H5˭> [nv cMƆ)l] IWl1o[ˢfY.__W8WWW@M}+ys%14:4+"R O H?8`F9 P$\Qx(5ars ׮ K%{_Fx]Ty X 6mJ`ވ;ŤLK~3pkjCSd2izBR$x$u8 麴uT_qJ#mQ.p\jv´`Xh8a!ضTߧI}r)w&E֔F7^H{ .8?iص{(JJ08SW$67*CRPѤzŷzފqJңQ+j2Oew6]9 {GTTsǨU߲(>>,Pf; jgQּ]GI'GQ^*BJ]SaGw~A?γn̙p̒cE^4I^~YɰJ:_6 7.s:NnZ^1LrTFYAtI VJrmVi-PgZPJeQ pXRVQ~վ@t$2QcI Z,!_@=Vf˿-xg]SL 񮥻vamݼ99E)DZ :nq{mCuɇWX*m0FQ+JuڙA*d@~?Kc٭dQfX$%"wC4YTNOFE]T#0jcl*Cµϯ/.2]! ;;w`VamK `mظd*iXX{e>?Bk, x3 0* ]2E}LnY(Č!Q !AW "4XFalK b+ J#hq!62l'@=KtŎXjkok9s3fmw4m[$^zYB~ S IA'(XYȬkVZE@굢!AZ5Dz: pӾTL=tҘI*LMNYOxuv8- Gbr5{\Xضm;cX n~ư' }3_t1.U "k8=N ZHpzSHI^/oLm,Ǘ0,q~!h)q\V2p.$iQjpqC*# pJ};X#H Yѽ'> >6Jya4sf"VX 01h ޟ5HkuX~0aRDV%u]M E?-N<)I3P*`$uk cX)BE*Lo*.b{uFq*w|[_uϯwKh$ZFv<,Qt΀+aCY>45`Y`Y` ,|+ܛ円X:0zЈn#g.kE?:0 @=-,7%H$nU0^wQ*>u"[mQp&"rST ]~!?,s(4Xsy@ag k gX;X/ X1y ;8o>t*+6&X+#$B !1OT}ưE%2 T2B(7U]CTx^S_›y CCYv A_Dhv%amX%2bxe!`O}pYsGUT$C`Wtԭq#eA޲FIHY14 uB'+HS"`)L:T2Zi:Fw(ՋAg l>>徫~l@| )Rf5Va3ڞ zGUt7 o֔S+e?w?0h(ŎVl 1aD_&bP1u![Pe ݝO,l UD-]IhR&?R5?Up}J&z6`֘n:o:nr45A*b9 "GGsu\e]SF [53bB2:Qz[e,WH#*5=}NC}i1V7:P;BGW>߽{8I7\â>B +1ƌaBCqY TVUBCsmq{,=Kh`EՌE Pje"j̟]"#q4رFgmpB14ճREJ%Nd֡ A) Z/g_Yp{vNvP~4Y7Kօ! 9a jVr&?y!+gXslVX s- EIu XTdE5t ҳ?0"@*e`Z#a-QŨ*U+pSLz +C7dR9{hYTxZzE#HYl }O%" PB1#] ww> :Ă3,{V @,@<464j `E ^A6!JI#`jBXZϋhp+>;Ј xY#+m9NS׈4z$ZA*|'!8AѐUaup<1G߷@6[9 EDAm :`m<$-`g7?246G( lk,1u!YJ FX'd dꎘD*LL3zX,RsA>IeĢx5W.PБN`s_,@HI!! ǢdхԒp28:Lq #pVLJ8<. XC]kW|'C:FnvawdVTlq^г>~= YFj1 9X5Ir`'~CyT*-Zw0ՔeoH6W\Êo9&$,/$D  P췚u~mx)uQ+FkkX[־ڵc;u;2rEcwx)gdŚGcP"lfU!P!-(k[0!%)~˲gZ!k$'ڙ7/ cnAbt@Z }1G򩧼Aқխ 1ͼ4g= h"qX`9+:mET eh{.~3"f(**8# p#B8Bbz&(H (F s9 Q ->8|G\7g 9.^*3]0nEwa $VYܿ|"M˖>Q蘻ߵjjܞH'P㬟AlN#/dV<*J*5֬}F5cT2Th+[B !}k5F0-8foNUrSU sp۽g])iNPưݛJZO93bxX' : Vjej͋?-s"I%1D4,ĚƁ*N,h3ʰĭ |p_"`58\B.+\_I4:\JXPt_pAիG% 0{O{aἅfacS<=QPV7+`(Tf}J? k]2&R+[qioXJdg:vR?-z;^"XRge3\l ??ؠ"v?O`X oXIݤ"Zxx{ ,9UU4WDFhVjdFR M-C塧,K&nJ,mv$U9:L zIÜ@!峢V3ZP`nO0`V"X"4Z[[aaBbyxxe+\J`Z5\4h-Z'8\j 7`VX %i*Ȳ@h)>Ac)&+ٱ q/Bf`U.kiVV=p7_3."CƬ /Z Cs.:%,,2R^I)f5klƴ8,~2w]3+PȄr]鍩)4D3:n2! U. O,80'lAѱW␲3jīi~+Ye-k҄[9r]<{xAwI(X69.[z D3=7Q2}ἳ_Jv9h.b ̺ ˚|"\V0p4`XQ!.HAjkX Z)_eYbc c{=cx =OHy\_S+Y!UWW ':‘#]nHuGbklfxMP]UZL+ ;1 J K pEb9xzYOGs7pvղRمlJui(FԳ`vZpE yfp׾]_ֿ|rEH|ܹ a%~QGrf%Xjjjp/~7ҲqDJeT SJŬ4(-N3LאPf(JAKanrfXNH- LM&&VRftL΄f0  훷o+1g"VQY%1sCOo:Xm3-7.-0mUU4NqD. BCwjVa, ~Ar;1.(YaŬH,[HŸ.ʋ> CySfŵ󫯂{jJ8],2>Bu3!gJB Zvgq&\zɥ|qv)m1#a8T Q(* 0QM&BzĂtw@ ,d'4Lz  ݑ`0xL PD1*O`G y^閛Xu;<̥plݡc|osN-T[mik:^Ex-c)~S*TBdE nАѴ--ic PЄ!p0 Wa6o~1{.VI74!6"J`= M!u3\0]% Po" oUY] M5|Qf{$XE`1%~2b4+Ь@YɌAlp0X}+,TgFBߙ>*  s}믅/ot{ϻ]xJĢCXm-K+93V,=/ !`ee` mNa֠eM*я(d v%2jTbo@44h=pKu aF7S YRg5Q}",DUoO7=p7Ñ.{`Y9O^LYU)hyAjYKkA.ȟ{P[cuUx;nh{"Eu;І {V A?}&H׬Ԯ}H&GڇS@mLy2h{rd/< 8leam߽:xG!B@%\M6"K8VcC\|Ep.bp7^꠺B# Ȼ4IWDa,!!\(l-_ ȲjfRi gYV:m[3$%zʎ-zy^n322 ϮyᏰ񥍂Lh$`*u`W3<;pq'3VCA'iVT& *<̗jb!0q;`%jYXkIbPysA6`Z{n8uX`5!뉧q ;E8s9:lX0wmlJDƸҎb ՅgQVdj/i e doXrV,e>YD%^<_>g}rJ޻auۯ2zVE%e[.bsYp)gAKs+?; _TYRPz|غ OJFjA4aK ` 3z!%*c3-gZte8y]!vXf-ffa;o|(ի&$`=p4oZ>}H14}pjUUWĺ -%,3iRcTC<)AM  i_.>8:VޭPdY~p@TDV~y›(4=:Y$`M18+N .@̚5g٧ fuFM xWy1RA܄aQW{LJVRf7wo("7[(g=Y}<8I6 Z܅0X5dqŎE&v]nOx_c+jF&Ł`ݎc7ox===nߪ[R 8jCI: ؖ 3΀O<] rKPw#^, RV\PCf=[F3N(qr= T4# @eamcã=ʇ,KīUM¶\֖8'cN-jAભR΢= QY@uK::avNT[(vX)tpvtv۾,Кمغm ljs3Yx̉6e\PPmfTfgJ%vYOb@*Qez* 2|%DON[`XZVm;Ýk }xp/}V^-B-^j .sOdkq+cOiVoR]Sɵ.\\A8*2,Br XI=1 FIVj_hs!riꂖ31!gХPqڵka. f߫ &h }긇 ̈́5%?*UU !.(SRtYEЬ_׵I 5Np@q ƂcdRhol > 0)YjDӠ3;:Vغulݾ=z6 > T5I SlZ^--Sa;ٱjkkf:ZB}m=|&%D%Ii+q?B8Vz)2;l |pC>_;yaU0u#`ン*%؀$hSͦ'j&7=p. ӧskkmg|&;X8j|WpFˌ3ml`--J{ *aP\ok yќ.8ᗪt?~8|9gAj?  l `%jS0M$`Mn\Q%~0lZ[xC{k465BmmLm S jyԪI5{Evp16Z)C#0Ȁo3#=zz{Ì=580(u&%0)pBlJM$`Mnc^s@ 83 k Ljjj!{Ie8Y8P;!I*m}mq 93pɍ@_tvAW}Bo_/tw7*M陔MM$`f2=Ts{@uU_H084u[8JkCr[ui4Z2/,m31+YN8=ǟc~{6Y> 0agM@4 R~:wy!v 40 Xͯl! N\Gڻwo"4 Od\}@/:1OaVkS~B@$7MOʦLk[APi{?eAl&0`a2cLaW&CF~Uy+D $]2 :̩)*(Y $-(zKADr#kL$=@ʉ۠PQW[ Ç&&ƃؕza=D|V:S0(2U=j Gˆ R"̙3geLC0 `I j…,dpZdWiV`*R`Hh}w= XfϞI0zMMM ZudTQ3_&dM^kk+*>d}*[;v mXH2J|pJܶl:!BòXbUH( %n.\{zJN`o ؎Wh8!h#l(:p Xvnbj̟J9&G㆙l~Z!0408}u*d@5"%Y]mbXi)>*eZ-+*2PUYUH$^~Ӧs[B!"m,i2*XcdM`eƾ@{[wDkX&={D:uꔒt= Y:<K6dV΁='$wHDO=I LiW- e;Ri/ozѱJ٦Li=ǑGʺ@'V__"ie(oٲER=cX8 XΚɯV8~֭02,6y]E&03vr^hqCk'kߡ?-*QaXClX&+}χY!v{V}}̙na\5/,u&Wˊn6[ɹQӒ:aPtl ;-߅t&Fݸ!}(}@4Cf1Qiq<m3]]M%9s9 zIl_3qw߭tn1(ge',gDޤm5eE޸eoP^>:?ƙSf݂Ad6n~xCF3+%y:&(mvrsyff1n1s"s>qK~?:TN|򂍶mGy} xx,L8?> Ol`>NAA9*ѐ'XIۦ/z\Yl-,'tumm&3#݀B7v|P k _wv7V]1?HaQ-fy\V9_&w;qȗ]2[#o}#"  A$#D2<Ӯc~}/]/]/u7 ',]et$?m%ȗ,;\. v0.􌔞! l)}|W^o ,n[We2͗c̍_8 .%m"P\BD\p!mK H.cڑST>W{ S67 z /Oθ$~W^yශx~Ƭ7ĘYQ  bDiDb BG׻Vt$RV>?/_l^yŤ3FIpny++ _xfo.y-LFצTT ")DXb Nx:l[]! d`R# KYT'K :LU8!/~_ x~:KޚҔ#)qbMHDSz,B*Pd)ܱEEqɔMmLo&B_} /=ejLIXiu:dSV+ Lr6d_jDCXK_|ܷ_=nOJtak$VPVvN,XV_V"᪜h1kԄqZY_G~O! hLUd0,'gN :aEHة%mt˲eIt5E4YW:zݙ|`j vlYnqZwoF8 :,}첐Y`v |@ '{'t|xJ6wM]@dllXRnV,%+'eܼf=Q4Fe\-m` &"MDtȀG_XҕKm2qfhc}n10gd^{ liT.⾍t< )  n7^A+X{?θuIekPQK&A*Cu% gsb5V!%Ls'# y1D{1c8y +^lg5^ә޶ Qfغ]{Y0dgaq 5)-=&ND$0S+(~?{PB'aN!- 6c%ZX1;ŬH,ub%VGan9\xNamsQ$bIh Q o@A`)Ek(_I֒0"SXf-cA)EI/m#!} \W])"M;ȯ>VMoWp2sI*(/- \5fM rD nym]}YDK$>[D`@#$!G 1!RsX1]LE>8k"MhfԹDZf;M237 κerI6ܚ.ZyX [QKހu/[̐Iff"'r IʺN[D}fA$Z4RhY%>:'pǁ~#m~?G7 h. FQ0{~X`YeL %4GB2B xR\&H sa vQk˂3տvWj?"sEx[ȣ _3<6!oFiR7U*]0lv:ZK4_ C9kEs͈cy!lDX-["p_[Qj)_[ԓL@D6"DDDK/p/ &)|'M"|b| lsT{X !s;W/ؿ|ox](̝cs _! C )dAx4'r}pA9x½ <^* AD 1"|`b @C <("8Vpלevłʺn]s3,k6-03bR`RJ+EgO:np|lS'ÅGȆANPRUl:`CJPFʩS@^2Xb_(^x {krYd궃Դsı"D>d>B_~>5N+,h:5ސO%f^'Dx%DEDQ P)){0.)"BY.lfW5!xun~n[vD:BL*!(HeHI*>Y>V4'z5: Vw6Qںģsw[5^xDD[2GYmQ67ZjNj>\% [9QKHq8}ӆcAe?`}_VRՃ(*t:I,jOC끝~|z2I2"&:j%_f<)惊^-)܎|Fvڿ\NAKuuK3§FG~?")&erdf( `E_Z 5`X~%u _g$ Ĥ 36%;9BXLZ`nK7_\5NY(Nݵ.[<811EtCSQEPR?b`, =U~{Ll|xyRqٱb-bXHSUڽL c:o;qP^{=8. C# \ 1R_G>PRZI - x4t@%@QJ*"+ "²?[Y,s75phֵ|$!4 (RP'":ɿZCm@ѵa}1;-G.^=S--6uU!**ː )"= " ae>f4SsqYQPDzHVQ`܍P1Bt$sx;2:&Æ8Z r[f y%T(,Ij6"dZ}DJS?gy|mCxTC`O!9":TKB lI%ёfKX=[wf/t4jQxQH);II&|m|Io2:|;|8h2D̚*:+HJfBAt}c֌&o4*BX HREDnGEo "I>嗲RXJ6s45aD5-.pXeˢ|vvwwܽp{U'&h Z'!CrZXQ$Sk`BE2ˆռ+CACN$V֐m]Nj44o!M{˺]Fiy^ ޼_7t[1*蚊!Ƅmt-e,m!@tJJÐJLAhUaOZdX]P!ǔV 5HKdscdEz wRp^)AY272?u%އ:$[ ؽ , ,6й ydB:g҆&`cdCI`%RAoe5~ =1V<"@e ddDxvQ`ttC4#K&Unf?{ Xrc/w1Fo,(aPA=6Bas8Opن&c3" U`eHeUHk֏vP˟Su"X@vu@XZf!"JtCVG%ћc,[Y'Z]m6}1Q,۔bI?61`rTlB" ;l5cy?p[AAcf#̊{O)C>eu39}eF@=l82&1QAM7F]P1h#&&.McI>SR!+p(LA-;)UC6ުZGPO3tcKQ#2qȗ ڇAя?sU,$r?({I aUİˌF4Jh0B6D6>SF V^Ԣ_һcDHՠkD1uXUfKf6,%C1rF9тjFu?rNYh'2vorb8*(*cXJ.|XaJVegCe%S".1,@Pj h)`ɬ{-ڔeeh9l,ih;4ro7-X|-Ī7zN-E˥w)T4*DVd2HY*RJ9~pQ,{lqp>а j^/ʦ S*u r.ʢHDDDV.)+"w Gi-C+VSZ$kRKٴ Q28;

%appName

%image

%titleKey

%titleValue

%artistKey

%artistValue

%albumKey

%albumValue

%lengthKey

%lengthValue
clementine-1.2.3+git1354-gdaddbde+dfsg/data/nyancat.png000066400000000000000000000015221260417502300224430ustar00rootroot00000000000000PNG  IHDR"ZbKGDC pHYs  tIME  kx&pIDATx r ESO;N$ bLo!+JuR0W I -?bB1-' b y{w\Σܓ'@1/!9`XxodB*6N@1E>!m<*n{]B:,muY/"{*ҍRotZ JLhtl=Js^4bwS<Ŭ ?>(~.4v ^Z) tr("Return to Clementine")

tr("Success!")

tr("Please close your browser and return to Clementine.")

clementine-1.2.3+git1354-gdaddbde+dfsg/data/osd_background.png000066400000000000000000000145161260417502300240010ustar00rootroot00000000000000PNG  IHDR,a?>sRGBbKGD pHYs$G)tIME"IDATx] S"MEe[T?lӀL33Ī)\W;'SS5=O>-^{Vw|$> _c]!|TF8pyہ a>*oyZ' 5FYuZA~}xȒ%.'T#P ~"(  @teOо=?y'D%?]b#Xbl֬1T430BGkFP@8 qZ~n)%|RK>WkDAw#6|#ْ8qswPezwL8b8 IKZdɮxug]scB [laݤ1.*\븥R>,اdX]aώ },"<(žwmI(h-.1(=a IlɒgdFҽcxAHXrMt%eKQ8\{_18JV8 n5>tڳ$v^Pfگ+"2z|х^YǮpx cɷpzl9ZF[hOw/|wKE8YQvL[{R8m}(k{oxU+ɿ/*A%*:^ )kproKX9K?!!pal3Iv֒qH5W8TXOpsJctOj1,|퉲)X)_hiS ăM Y5d>j ŸqA(wQpL\(A A-Ig(7|*hs t⯪ i(eU$sbqrdLÛWPD'Sݘ X&B Crԉ788s}Ѹ qC.s݀=m 6|ōQyO7qC 7D~{4'pgGRn94v*W!xԅ}A&jFVp9KljR 2{HCGrU+uXyesgS" `)uh;lIb|=p~8hV4Z tUʸ!nbE & ֩\-aCb CQo!l#oiJZ)0Meo >K-5j|X5ftK/)wOkJ1SQj YU#u\A?j:r{=qxqg뱘ҵƠ`ŁMQO|tڇOU(/QxW@bJj|}1lG= q]7e\H r mUO|d˘ +KJwL~'Č)e6 go<'>"iTܓLGAӖPa?o&ꉏ|EiJwD~{F Ȝ+*KZSatFmAiJD~ڍfS6PsZ gq+֥:&r=3a(M33߾0:; 9aK).!2% 2q qW ఩ zSat"قBnciiV}]0%2*NO}PeɴR vs <Xw`3XSq4>95pL9,2lD9V}[`76B|}rmU#{(Ro;g^"֛a߻]Tv*OrhFRDƒ+ aO*zR^xQ@&KU'ڂi(4icFh:&BCfZFMr$6:xWHzߢ߭p^bNJFpgaC]HiqatIŬ|N̆: \qO{q'o9"VxB5|&B'4N U>rGB mEL( @ cݒבđ+߿HO(ըeLK(Ea2w:M(.HH-k9b[I X1|N3o+ McYQt-pǗ3}-;87c"#oa+U$1OqwT;p ]4{Cx<)\`4gڵ2G+&Ի4 "ҫD䓜eTh.΃AD5!U؝!1 :(0VX#{NȁPlrPy^:sQXz㡛o gvFDU]9A+0^7,e$=bYg PM7k'/N+ N`YA'1k֡щ;//{biCOXdÃS3 \ظWþ+,*+/|zI- xY^hV162xZ3};Ŭ'%pl "Z®_vZZeЎAKP̺ .m33#֐y{>ᗘ jgPPRLa, ώ#^S铉òeQP㝠Poy7ϤRƻ݀ Lr|J#dJehbZxK`͓5Pppn0 Q ~_12.sQo&4kYhTHx mV6)3re|ˑw3 hv&G'FzD`bf2k Ϩ1s#uO @*m ÚK@ Hw`DH0F!Ea u=A&ߡ3X=IxIcKtiTJ<4-p ZRVy"E\pPvODpgflY7XBh>b7Q|"k3_ksX7<~Vɸz b+ZC15{"QhOז? ʩE@=e_$aQH*F"7]v"ܮhŶ8Ul ՈpW gz ,T^[ Ho(" MQ4yM3]*j.sE qJẅ́-Nm#Cf.-1+-w4:@KۈaC, !iB4MV}FkPme}@TиBe-מ2;Jp4irJ[O0Nm=mܳ ÂĬbiY-]/LY]h1g\ow-L>B'%eNy}j\񚱈 ܍xdI:箠=b3u t؄_8 (CATE1^|õ='"z8~[,Mfz 6pgx t8ϔ9v OMA+!s)-vkCWn[IbGB=dǓ0p~> co$kcqG8hSJxL()KwvMц6ƈjFQfOѢ\N7L$NvNZ+w`wE̎f *K`ZTq-ǭ1Pzi&}tRPKxPߦ:Ϯ\dJܮi5Fa]<7ݍi.*y)8b@߃+%^Ev(ROKė5RqfY1ZՀRU{@k\GWEqL0E(Jئ~Q+XtaCҴF}-KDܰ1I# # =!0UՎ6 43meȈ7ͱhL\_OZPmZ#q~_, x-wLG F7NÊ&kx@K`[ .c=1!:Qe-WDU[D]YK*vd-p~L G*$a:X ZB};K\34ZҘT8.= ag5R#}-,Ί c ~eFJ|UWX)nϏ!/82)B'*@Ge=`d,4}9 ʌJ':XhPL:a-vs2Mmzƶ}"A&3p̸͠ͼ&C]!YC bF=nVIK}chN-?Ʈu^f@o' ea@G֐*gϹ$P'9-.&TYC0t{$iNbDkiulk܄r phNNZncpIRӘRh^Ҏ vW.et0Ǿ%2bX,P"$obZ7}B|e, .1RI^^IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/osd_shadow_corner.png000066400000000000000000000006451260417502300245150ustar00rootroot00000000000000PNG  IHDR*ԠsRGBbKGD pHYs:duhtIME2tEXtCommentCreated with GIMPWIDATHǭQ DPuYy<7[nCDM@8yL?tNp29݀ j D` z:xίa )P,WZ4Xƿ& >c݄H+X'FـQOpcI~7~d0 I7%SV8Xr}%uT^t[?-8r[xmPٕҖuՔS!gQs oEpآ#'g/ IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/osd_shadow_edge.png000066400000000000000000000003171260417502300241250ustar00rootroot00000000000000PNG  IHDR hsRGBbKGD pHYs:duhtIME-JtEXtCommentCreated with GIMPW*IDAT@@o)DWm&L G8v R-IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/playstore/000077500000000000000000000000001260417502300223225ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/data/playstore/af_generic_rgb_wo_45.png000066400000000000000000000151661260417502300267720ustar00rootroot00000000000000PNG  IHDR-~ 9iCCPPhotoshop ICC profilexڝwTTϽwz0R޻{^Ea`(34!ED"HPĀP$VDT$(1ET,oF֋oZ/K<Qt`)LVF_{ͅ!r_zXp3NY|9,8%K.ϊ,f%f(Aˉ9a >,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV2>~8Б X7l0Gw_^jށ+xb;O>>P!ΝKt"66V>|9rױ{n7n܀w{.X@\sy<7os۷oǑ#GիWC~7ŋo@@([ضرcŶy{]^oܸ'ODQK 2G0`/W_z;{%Qd5)Rqyعs'ݻN>~Y֭[R=y˒EÌDcۇ{hѢ\C1 p>mJ n]6 k!ֵ@@Q/U)-u6 ߊm}UbA&"_TTr-S1c8^Ju׮]m?'ODsvƦl;a\rik a@͛78}^]t8_}j׮ R*p4HQuԭ[W+WƐ!C0~x :THyAhժU7SN0G{{{!AF)cl^A`d#l?1CfƏFBQ١i0=fEr>P?ŪU~/cVL.[ŋp7ӦMޒ9.˗/DЈL|gKA@P}zʢza/ yqrV:˗EA-U0HC/}h00AEz_D WsY.h,?`Nfx;qvn9x2̔A5j0oFAvFިu]}h2e aX~>SjPtUϣ$aMi l"3d-;(hu!l9Q^T8Zch;ZAmh ĭ83oApp>;˳2(f"&f$Y7@iQRtmJfgǎ`[~dT0IK>2ΝK0?؞ !˜>w]d4y sW\obl*".T̕۷3gVT%r@;-A_x?ܓ7+)pɿ{ЄmeA%}HyyymU ;;;][Yd2ĢLG`w}oPԫWO>UIQH?]i\~=W. R.jS !q G3xo6 TUZkÆ v#S Zm@x@ۣ'`{?}N_ |m]S7n # :E HZ4%b9d_DeV^]֦Lj<&PUߛ!.]ٳu `BL"뀳xm۶|Ii1Xc4zYq'S$ui cgG=LgXn+n*#0d EV Q]qx"YoA{ZTL{yG{B F+{ OSq9/W00>u"RS<4<\Ը=9L[XAkW<_Ȣω/RWb{$#P=SWbP+Tҿ; P%8.d c gcΝӀ@JAIpYNA͠– g>%/BĠLEz] -p45v½j=qQ/\i( 5.*a.D͛7kNhO],͜9S7`t?嬧7)\ IfLwYRϊ(z+^Aa֬Yuvss{Jy)WEy}/)W1DZJCix[Rm9нj2'%C^Q"_-g4J(!f RhP hM  @8 FdZF@vKh T3Fx)ZJXoR?C !G^C#t\,? cN]Gÿy;4/X(Ӗ~Ϟ=ȕ9i#Ԍ>4G:(÷ե_hZ.}kC.(D= 'l… qL"fe)<7 d #r$$>HGX.ƲԞv#R Q:~ƼyD{YZ _ Ea0I>BE Oo/7 ;-.b0FK ~Tbp/? Ұ2eГ lOAmKx,c4]>4B,Y"t\EZj8OQTBrS-iYT!iQ50DV X~.D 9Yx̒6A)+ MH\Hb+.A+ZO2|H81V랛6m [i\w6ޏ!]j&H3r-Cu Ψ'AŒb>HxqAb+#\٦@:uJ>gF  ?$Y4<1(S4[Uqvj$CB W6鿄ЮxAI5-۪_ J]Ri G2Gt'9Ȕet5^>4%_%~f}!>)ҡ201 !6wA w2nd`<fPMݗ!jlϗ,]>Dx51r~ u"|0vME<7TqCam=v?Y¨q:~0iܠTa>u>¤ Xڻ ^ڊYkk?( 0Zȵt\W"*;0&4}[<ػ3a5LAmQ$A2!oJ֌ j 뚑~+[p&+Ѯs^W߃?buU^{/o~%;- [oppK4NdvGMpu:Cɜ$Łs#z2 uB/Wf O_3zsTn;q,tZҳ oSKG'ŝI qyD_O|N>DxDoj"ptbߐ.χ0=?yԺO+Ep4YnE4H'gӠ&HA/bz+o/LjL_Pj(,Ɗi቞s=`AD`kCY.ÜrRU-ܳ#㩉@Le}b0~{7oê&)XŸDh~|& tu.NN X hùȠ-5iMNNpl#uK}~Uҙu1W nWBDXh[GQ1,q,>Bmh(: V`cfcNIX Qoi`r]sNΚ\g@50hI=v3-Α,jm۬]8(",eec;BSF O6MXcb_\k$U{¶[F$/B{}J5CU/q vB&RҗN"p56~FMϣjz3WD֐@NQOUL놔7!څ-\Z:i9Dw>M"Dy-Ř}"Ѭӑ;:\^f+?yU2PF?04L1Apd5Ag1OKYE ލ04P/%:#]$0QƩ/YY ~~WO@IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/playstore/be_generic_rgb_wo_45.png000066400000000000000000000154761260417502300267760ustar00rootroot00000000000000PNG  IHDR-~ 9iCCPPhotoshop ICC profilexڝwTTϽwz0R޻{^Ea`(34!ED"HPĀP$VDT$(1ET,oF֋oZ/K<Qt`)LVF_{ͅ!r_zXp3NY|9,8%K.ϊ,f%f(Aˉ9a >,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV8|78qB}U*UTT)/_9-[VʕSYu8/,2ez!g4 { "N#G/ݻw_*"qyx: Ӷm[RJzwյkW= 97n \~=<_|wFJ,??nj׮7x82 4Pڴi=}Q+Vk<3ʕ+sҤIUHL|.]ڵkgٲeKe̘QyQ…=d͚UO=RN{NǏׇ~h@>}z3dɒc|e˦f͚魷2O*纉%RF_bŊ|I]r%" ::p4iMtMD#'Nʕ+Uxqխ[W.]2c裏<|נW2dm߾] 64sov1XBcƌѡC4b ~asٳչsg}F`=#:;v42<<\O<_֭=suO<^} 8.\ &`+ @?_~a t9}}D)7|cqt4}t߿ ycǎ5+S2gά`6Axs1O͛7-@jƆnӢE 9,,̣ZjKI&7h{ ЦNzπtÿ}~9—Yfy>\Q_~y/^lPdz̓!QFW^1;=44Ԁ,X`Ʌ,YD=z0`clڴife˖q _~sGVTT~ig;wݻ=&'O[`,0,!Cyc$Ibvaw196 +W6ӫW 1ėόZӧ)SYp 06l'|@ٳu0p,,Yhɓ'l>!3.ݻIaVq,Xofc[Afl7@@ho-3f>PZʷ8b͚5flذa:zGx|G8׷={V*TLAx|7n8$W_}}iРA"FcGD0sL8h?pC]jQ,-j;Z sJ( 1  B饗bPB!4s=իg<~Z6d"B{3K!~wI'QI >Jg}}< ҥimO?#Dzc3.^hz2eS5GmnQ!Au즭zq-|m* ,Ms0kH}VP1I$TV͜gw<ڀ.[vmfݝ?.\0l?yJȚ %iH2KuHޗOk>a-(9tL74 VG!zvPՊUUwF5޵A.SҧViwQwia鈣Imt As2(BK_&aw;,`;_v;r2D?`v(ӗ /Bg\!lLJ+W(gΜssA kmUMgۤ?UA2jnti 5tn@}:UP1=W>Wz:x̃ ELKjc Q{Sֱغ~h QdMN* T v"UÇ[pj`6mWnBwA>Ś?ׯ{Z,Uw&5:05:YlQCaoRt:C-HKV ӄ'v$אɂ:Mxb _mCy\6h.'7h+-Pl?>'{'[]L ݱt0qLGLMA2kf5?OnUj'(Pꧭ^nU)㩖TlE7ϝ;̩Q @{e'X.%v/0 l:wNv ybw{;hmiIA{;BXaZm_=!T;ud_7dˢ~5?M-lSTmkcDUy[g_UU4iQ)*.:5;@ 66}=F wuZQ902[$BDvݏ͆xk J-['0-gj$q1}wDMcڬvDh x#':?z4^>:ֿE͕5p4@ZS|}5J }guKKvj3x[A_w3v|"_}WvIiB>_8cSQxc[m?$!8ڂC5c|y|8N*ܭ ldzm},,CdϢ6";vhQaEי-zc%YlݸCٍq}I۸m5^x>CN5wI'¸ Gm:9 h(ڮ%&3sVm䩥T%M0 "n6YR)EX|v晧^;(k CE}̙X;HaoׯW@kbvءsyޤx+&by .P Prga4qoIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/playstore/bg_generic_rgb_wo_45.png000066400000000000000000000155451260417502300267750ustar00rootroot00000000000000PNG  IHDR-~ 9iCCPPhotoshop ICC profilexڝwTTϽwz0R޻{^Ea`(34!ED"HPĀP$VDT$(1ET,oF֋oZ/K<Qt`)LVF_{ͅ!r_zXp3NY|9,8%K.ϊ,f%f(Aˉ9a >,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEVٗ1cF5n{饗ٳgWV믛%IϚ57o7xCuQt<;wn)R$@;t蠷zs3pΝ;k_O]v:3`+W4˗/ծ][o>a@&ls=B[}f{ӧΗ/.\۷>~zeΜsݗ_~cyDO81ھ,YhժUʿkݯ_h?4C r 8{}Lo ;CKu֙U*gΜf%:cgΜiL2\jժf{„ &a l}U 4|PB 5?>+p:tr&oo۶ < .(.`-`4[ha1;wT+xÀCpA0i$\mVvDDƌc|@`9 #Fhǎ{/Q~GSSJM6&Q`ٳGmڴѢE|ZիoSJL}<{0 M43~خ76~MܤI3[6ύ52ń?h7 Ǐ7Ix`A`L'dϘkH[nqRرc̈́{gAap#Gx΅|AR rID=@ 4(`q.\`H*,L(ϴd}c vs{qsi};lٲf駟>Ỳ|g`0QF+osJ`~O8!u~j ZT)OV n]Rʕ e?V} ȘEeRa*7cZ߯V*5k& ԬSQ˵W! "5KI #Tn)Ι3d%={lk z(5=ҹTA S +͌6lP4P@Z@T?TSq(eq:|&cXqALYTaU^֨µ8H.R!*8XOOq&V\+OtR-\EeIdp_|(آPR-D(X ]~vD)%+cŋ˗Mg(y;zs,n LmyxQpuS E,$HoVu&XՃUsCWbP6Yhc f)]4kl&u,:ZwY  ,>v&ϔ98Ѓ h/3+ڀ!].8Ǐ{:,u릭[82eJR#}X;ލ1 Y5yW ll QͰՊبzBT>|ۼQK@'~kK#J -k>P4ỉqŵ- +ϻy:4{"k va۶m3۶ zW ?UXW&Tc[T+-Gb}q_Xz((chߢUEBCTggC3ٵNd Saj{ \:!7әٽy=EݤUpf5 Ÿ@L_`.}CYkuXVTppO‡F, `>|ӦM.bˊYMyעl+&qE7\bJC' K`b _|X :|݃ ?'|nW SLKJlf${'[~Zm'[K.mƁرcf ujy~E͎oU[fEmZEUsjH h*XYC*' OfDVIiB>__BB f|*& =|oer!$Pc-h*䋑qH&mEe?,gp@ȳx,pA3]ܥtDڡCLJdI\=$w!` t%j[뚓'O6m evbhwf@sIc'¸ W6u}8 h(ڮE'sQc嫣4$7 "nwE5  YV)R+W#;Vjv曯>:){ʌCE}X;H Wjx1ގ!x+&b,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV1;-so 9q 5j\r\r\bEUTI]vUtt#fq8/M>]=s/cׯ@q8_;6i ӧ<TEE$Oڵkgs'4yFo(wL?sy׀^r%ɓ-ڳgf='k̟?_ϟ׏?haʕ:uJǏ7 40ԩc'/:{)b}^/hSHO>D۷o7׭[gܹݲeN8СCtAMeʔx[В%K w?>#د3 m۶WRuπ˗ϜzꩧI&d̘dkɞDDD2Ιѧ~;vsĈp¦ m}]sݏΝ;… J6 ;w\9ZWGNsL? p@[_tIɒ%SppFi;H5B3gGuWR\{嗕7o^(fD@P6l8p4 jM`f;tPmݺU7n4GGӦMg̘a7uT=cqڠ~7.]h@ff =V)S?43jݺY! f?`믛e@_| pٳP}رc46mRTT>|p߿'Mf7ߘӧO{`_<P\T6ydd>3eΜY͛7˗/,auoY )SY1qܻwo[G}dY*ѣ8xWHJ*޾ݻ<D_,V^m#$$#G({ޮ]̌z0 @f͚FBŊxX֭1Fy7p X&8fC@Cu#LW^yEիW7u;P ;4Dl}%YQ;aÆqU~v Q4lٲ^z7tP@[ cP]F1Ɵm gok6G(KH廛-0^Nbkа%kR=ׂw1O[A/VXao5]yAAA?N2-T B}ec (2j_ [×0 ?R uV7͚5 ;wN]tQ߾}{OnNzzo6&oq@2SVB&oP鯿S1Ttw3M.lmЭ?a[26P"HnP|+dY c_N JM Rٛ?9Hgu*1e5rhZVZe;[R4bh Tg|C7I&bZ]WL2 ɧ<qe(_˻͍A9XJUajUF Q4 mgkVjBy.S(&`SxB m?7of͚el 2L8L 77|߽{u ` R&7n!Cߐ&Y`0&$Њ8X>wtZj$ȓ0 TY҂z.(BU%TeY VE,DNOs?IA*F -JrdK!26;X!srJs쪗3DəmKf`LuL}L&P{yī J,iLm>M6};v|M68 3IҌwl҆]dyĉ:sL▃TY!RVWUUcmj٬ZT 6ӓtuHsI Ք -SxɬH% ufDςpmǏo!xwՑ[. 6$Ι6=m@x9؍/L{8&ifAгgOOM۵kgE" ;qE KRgˮk7( rjlP-Gml UPՉؤBUqVI+X'~kczI{H3 ,'k?NU<\th AZjٙf26 C QݖZEڵkҧcwUvE+Ms[PǬR 5*~⛱&Z |)uRhw^zZK[,p8 UC#Qa;pWZڤBMjcGv?t cٲV>*h̙v!`  `~Jr3u | cE/u3̔ `bY&v7+YA[˙(q^Xo{QwmV=hf5!B-WTpm/N'ҥَ&rRxH]vdɯ\;t`իOGe9'2 j lulQDMN*?Ղ [>5ڹA`5`ǎ)gA趚&b? *lAn@#ݬ'v7=懶H>.Yg 7޲ul-]]h`MQq} p<_5Y-x|c#ZZ@,^7XpYz~v`'*mK,?nh[nO ޷AYFK A6gv5;6ѭjy LXCnwǛ)El*߻-3WT0 62ww3~44'S@ H*!fwx!> 7,4v%F JR|'a ȕCNnS+6=MM HKо'*:)RMUʐ1і>պ\; VPP&M< ߲#|`;ֺI6-a[˄o !w6fCT"cI*i@bo >F KK[3f'lfh#EK l3)ew?6aGs3k:^VGt9ue*>Wgg۫q|(| bPmrKܡ#l auG 1 :f=M WfAi\>_/1B 4n8O53(%0@mEr߾}~%_968FK T[[a=s`s!}NfY ă wu7tX]ܡCJK (u|_nA<#KH8٘]մL!~fm@ތa"tw&䷄Qu }' |0 ȓCݥZ*VckE:EԚ)C)`f7D [ ܲ[['xV(A_cVN٨ʙ:}U!fj|BXo %uvy 4"є`+b,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV}cvTRyz%Jɓ'u ( )zH_~OD899(;v,iٳg5BBBp #Ęu )~-+*/o^X1$&&߶mطuVNj?s_DTT:vfpM!EIpu-[s,X S3& ׮]jڴ[gH$r#/o^ti?}~wsAllf W& aիмڵk @-Z_|RRRSB\pׯǟ)LΦM< ד4 @]O>O3~ QBMMM]j k|`"@suuh^Cst޽|%1 >\lӫ'?~\3|b;88hm޼.]Ct&Em8w1:F͹BehZ\9!3ghTRJ䂡Cj9;;Z :u(TTIׯf4"AjGGG @ALu޾}{REm:{ }b˖-[uʕ+]vZ5xZE}^qZ0/F#A`d#(\8Yo/Gk:tۿu'@֓ni 6?cLj8YY]N:"o%KbPr[6CGQ>f ,?دU,^Ü>yϞ=|fV~Vxqb.Wy?,V4X遦Ps'.;Y !Xv  ǠH/AD)[V ÿ;"9r^7X Q[Z<Afh-\r/ v`؇3X^, 1ekfV)2ܰaWzoO~ 0Gmh/]n7oE3WNޅGm?S[듪Vjp w$28U'I1|fZYݹ̩ꂚdCTPd_XwAPmwDGP{|G+7_Bvw' s 4"/ߩS'1OP؃BHmXY޻w58HC O?$sV\)=<.hXx fԒ%K9^rE<Ή!p|xxЊo|Zu5"{Ir ")tGç`uV~Ah;c;"HcS KQ?!E k 1/4H;wFpDu\N0zW_}І4AErٲe—nYvGݾ}A DKEpA1$ eqCXb7_,"+sP]: ݼNӰ>3}/66) 1ې?Ro:eK$W-. t{\ $eX6kEfeV}ROPfMɶ8 %8>55UN( )S 222xIlaHMz3=zɓ'E-Tl#leA t;|사SU g+8 F[`@x>FQaÇ";(/lXEAOdbB`.zn`XI`)?8\SXi@ڽ{):&kmh$K}lܸQe+!C{L⊒ '0I:\aS YFy׮]\OI`^dܸqZ n4W6MOS$o]Zj.^(utPL]t'ǡo"08\Cap9/ W0<)͆# O<6  _ĹX0  f\})33So7_BωO?4[HrÆ Z+U}}}q(fEN*eo\YYĜj2իmjHC3v; gϞP̧HG9ƙ atp J9A"aJ8 gpܩ? mJdQ .*a!D;v $8D/XG_86o<`% 9$d)W=O@/OFviK2scdW.]6IJ [&/M1rq 񿛛sMsAP>H1׳"1Vl"dZ{ ZT;|k~xIpG>,M$(ur%H0p%z59uȀ4nNU@mnz{)ӀLA>;EM )f Yĉ"Jw%EaD KGw0A x--b{;GRsC\9!H64&PG=@S[T\!ckC!(D#u+m6iҥ9d%1""B#09 6꫑o'|:4}49h2mL&hjG Z;ŋxAJq'Qc4 V t\ YN#ѿbJ_rqReq:_'tfΜ)$53bP{^ʘda<͐OtBWX!l*Uu։㴭.R&(PY݌3F iy4!h40DV VZ&`~.^ pAPqp+  # ٻ"8Vm 拰3'PƜ~/}v1qx~ ?2ޏ!N599)t{>wg֓œ%:aģ44S7,q bx\(Fg)k -ٖM1J \u֕ VÅ XRgtzIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/playstore/da_generic_rgb_wo_45.png000066400000000000000000000157161260417502300267710ustar00rootroot00000000000000PNG  IHDR-~ 9iCCPPhotoshop ICC profilexڝwTTϽwz0R޻{^Ea`(34!ED"HPĀP$VDT$(1ET,oF֋oZ/K<Qt`)LVF_{ͅ!r_zXp3NY|9,8%K.ϊ,f%f(Aˉ9a >,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEVw^h&kӜ={=%#9ȁ8aG:2ۑc ~ǏW>}TbE/^\eʔ*UJKV f8O4I=s/Nb p$_> R:u<䓺zj߉'H➃`̘1r ٳgu-ZT_}Nj\pA7t`Ŝ;w|/W\:/9~5ݻW;j˖-ܢE̹ӛx̜.XY?sZr~ac3~k#1߿ۛ(Q"`m_~; _t{ァuF9X܏֭3߶駟<NITx}`?cw=o3g61oal? D`zܫjժڄ+&=܏P1E3繖0wС[!d c >8I$ H8&IY]WGQD\$IDrbΨ3cw5?Hir' #>N<c3gY'ق`ֻn% 9udwGZ!ur KӴ7$A M}@x]k5ׯׁL{蓨@@}h۷馜xss/8\&@A(M:Z-QUv] Up^J. мS&(xz:D 4Q iv\ $ʘ%x_7ɄT4t\!&<$rzkd!X4k즶P~ȓ'.n X ):LL=zI$JN-Wu*l*XT?@U`Ԛ&rLkߕfε.U(2|jԨc0x6ZBpum7b6u^{5șO`ٿH{[*y'(nOYK  d(CFH&YG 8 !bҫuE֩lTՠ@U ٠Z[U*x^ݠ%.NzH;ԻMYŏ@.\4_ Rs DR D;; !ﺐJ(IPoips-H#3+)Tm d4o |շ 6~IȽ51P5vls=P/:]=ljoTA3HvnPG,p;?4\MZY:h'l\9M )šccкnE$O5찀SQa) `@*׭`bV0vn+1E6ͦa 1A5nT;Ts3;U{w VB -t"{e]h0G .* }wDzfϵUVF0ޮ;G-/UȈڣz{z D 3@CwVG$Z0#PTON ㎖ Y6ƴY'%?ӳQ tފdfKFRZ_ W=G5E+n[V留϶TLYD e"W q؇D3P[A2Xd!&'rQX0)ea89@%_9;i`VpoFLyd!92gP ;ݟ"iQi瓃ux֏UMg">hCUM]_0a8:}t0? ;~8 {FZQ<wgPEO3z ȒAm/TG[$8{zB*V5졄 b}.a"J %w@51=]AEk{yY2&NB.bmv6Eb%NZ3>6h6ؕjb<4ٳN/Qb+H,ރpd_KƷ+UEq@F]xqMvj9[2~E vql!Sb Ξ|ij5u]_/ qБP${gX/b;'%ډ{+feQIv[wd ol:!qJW?L˖~N:88 +#>I1]Yomjk׶91ABb8ɓ'\p\-dqy I7`IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/playstore/de_generic_rgb_wo_45.png000066400000000000000000000150731260417502300267710ustar00rootroot00000000000000PNG  IHDR-~ 9iCCPPhotoshop ICC profilexڝwTTϽwz0R޻{^Ea`(34!ED"HPĀP$VDT$(1ET,oF֋oZ/K<Qt`)LVF_{ͅ!r_zXp3NY|9,8%K.ϊ,f%f(Aˉ9a >,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV}:p)5֭^AO2:QE:'O #G4t$^x^N\}eˢVZb\rhӦ >X[[fjj*[h {Q*V]K.@FGnݺ} кuk{]0}&,S0;w,-[|3/(ŋ՗Yp!ݻN\pϞ=z{ѣGx`7_~%2228q]N0w\swLa癛?Xq8`EǏ|E)P %Ku$%%3g [nťKH.X )"F>ϝ;wɚk*T'O`bʕ+sN4HhѢXb"##3͛7dɒ<RJq0͗r>x >|(q17NnBϜ9SӀ3&>BCCxbcӦM?,f8p3f I ^|9>ZnƍB'988rڂ>#00?PnnnҥK2w}gANP޲e&8{,,Aij}ǎ(NNN*hTrYfB4B LܸqwͥKv@jjرcqN$R_˗5 o(4???ܾ}[x|=]?iժU\t8UL8_|&L!CĽ:vz@``# l?42A&pA`֠]ea:pͳ 0)]UFCpLŐCKPne2S+VL DXYF.J΢è_oԜSaI/VMCJ9I6l<<<ڵ "^zz1O\k1[J4WAPoQ4SN&lZ ZB>hꍕ;p3~{v ~s3:~3\=It1ÿSj֠15 3oSLˌ>;*U1E___vFAi  (mV;N{0>np v\w3mG Tڢf͚ڲ9`[v#%9 ,[LA?>8R 2޻o߾~)߇D؞ojE98}2-ϻc:؉'^I- 1C'+aXEO_4u@~pOݦ Ҷ+ԇ82i0ٹ$ 333Q)Urlll4m[ ͚5Kd@LL N0egL!Kj:XźSH0{Hw5 G ߢ68 `:>&lJWm޼Y$˲545Cc:Ξ)XCW_?tw:VE!*u Wp[\'ìT1Bu(LJ$5s$RRR4`!pm׮]+Qܟ?WJc]MPzuL ^siNsl/X"'A$WxxxCb]jk3?ɰlYYt9y6aw֊ڲ @ ]DچE@xn=qAI NӁe🍹#-alYG/=jԨl$9bQImߊmKKLm":DZS6]A&"S qT6سg+N53өoIJUH.@W{~FQ4iH3=(lۘhEWxl`w.:obH `(;8\SXΜe!iΝz?B`/ :kԥdr,A#qݰa!z]a4<%8#WZ%u#0ui1ɜ&=z+ m(lN <">"*Uhc,˶wPXymd&Ơw"_A!w9/W04!M"5Q4ALg"#~掳D>̖#D*XWΟB!=zT7|#*I\F=CX#sD1(UE4 N@ "H"fUW^{1P@jNY4_~Qo9S ise?զ$Z漖`DZ J#DAMB$cf21~x9O)G-\R6u;)Xj ˗h޼y~0o1,ZFa$1IGW=~^ ~8VK vLRObUG iM6M̓ lOAmKz(c4]>]/iژs\$ mj<:Y$o Ұ<2} c2/~fi:42Su+{g/?o?)![v 2)^{&Ps 1Acc =&ky+i,p bx_i0)Fc!kƿ-نE1ъD_}4fDžsRkwIIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/playstore/el_generic_rgb_wo_45.png000066400000000000000000000154521260417502300270020ustar00rootroot00000000000000PNG  IHDR-~ 9iCCPPhotoshop ICC profilexڝwTTϽwz0R޻{^Ea`(34!ED"HPĀP$VDT$(1ET,oF֋oZ/K<Qt`)LVF_{ͅ!r_zXp3NY|9,8%K.ϊ,f%f(Aˉ9a >,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV0g}f#Mǎbo_`AM2E ,Ч~&MO>߿~mkҥ>|2fט1cԫW/Xg˖͌kԩ1cYi.]:{Zl9m۶j߾FW_}UǏ7ɝ;fΜ/B=,Yȑa@pՉp'0a6lgɓ';Aiڵ9ݺujѢ>#M}u -w9 H6RK'HlӳZpqi(XaU^x?n&sœ'GJ* | ei3E5 0Ɨ_~So&$ k͚53 pQ3$.p>)"U')o{~L̩P 4rzbm-٨7@ZKUye^::ZѧJBdr![2N#@ ͚5f/g=ԲeK[oL޻WwLէĒK6$K ,Pڵkk=oŊ3%qpA9_gpow ŀ5_7P\K9H=X["TsfZY7N`m R aM?h:?U'.-!}=\{7Q,$8P <g%@4gX@W \;gСf߭i"h h aIww D\]pz|[jAлwoEFF:C^4RCg\zt?%isT[Su^hoSCOElj-ә>Ҹ^KHw4KuL[!7_:ٕf*%Xm@b}._@7n0Ν;ͶbqsU=7&*!k*6_ *LI\+&#!x_>m>Aϡ?pc8/{w;BӎDaT U}jo\=v7~Ҋ G+8eb :>D X\/hAK_Zawi:,`+_v+2O>1`L ~Opӗ /B+w\!lL/X#&&S:dKpty`]!jvdv/LM056\ UuUP*Ag 9 Q+Jˣu[ܳRvL )yrJi4G+dDAipTo޴i9Ί"hpU/@ `e.,b|5 (Ν3mnXa׫WϘ`'b͛7== Ajr0L-7Boq$\-mWj{,\_.mZhqҩ6$:YpX /[l+ ^_c]D\v KqLhn i}]TB37:N:e= H;u,B.R;tڞTs1unv肋;iWxU%5kUZhA%w! &fVub%@29D=GMCD9ԫہ6mgu{;ع j;WI 8ޟe_ωR;1ڝߩwv:ThA:Pw~UߨQLdʵN LbʕM gMb10o4ڴgε:'"B RIWpàEW'ӇqGK`ڴ@;"X_=iom:c\zB:1QjhnGpE>OWLa y)p>L-# ;ȇ~h;kcG2vD P2,ӄ| =z`K'ۊpqJI !P~G[ @`%_9;i  wk+|:>A#~ w1n'yszIjhnѻX{x6JqL6/B#f|ҡ~U͹I27jL0? :~+cݩf@kIߝ' _.uiz: hhuޥ%^wzj N2 "n1:!²;;'DVT@耠O{^۪=j`ʝ6kbuk}C\B$뿄W@kbvޭ˗/BSAW,M`>uy tC4!*@q E1]R?M1ׯ_Đ!%Ν;z*_Կ2@E IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/playstore/en_generic_rgb_wo_45.png000066400000000000000000000154051260417502300270020ustar00rootroot00000000000000PNG  IHDR-~ 9iCCPPhotoshop ICC profilexڝwTTϽwz0R޻{^Ea`(34!ED"HPĀP$VDT$(1ET,oF֋oZ/K<Qt`)LVF_{ͅ!r_zXp3NY|9,8%K.ϊ,f%f(Aˉ9a >,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV$7.e/rʪWz͉+]jt5ewr1^f @ zrr֭DӧOo-Z]{2e_T:u\2ed׮]ۜRTJ2c=+x裏*s*Vիg㏫Az=Ȗ-[C*P>%K3dȠŋ+k֬:u6{衇C| Q4'___k[!y"#9s˗/~MUVu]\txcG a;_P!m۶͌9~_PPk׮+P{ŋ]ǩ%>v{Z!wmAw͛Wy?x`7K4i+Zy#a_ 5lhV}"E\ǎSLL={v5JriJC<ZzS ;VܹsWo@wޭiӦcTvJJF0zfLppr.+yI[pas[l_|d,c*>=z7(66VQQQ.`6R ;k `Gi{l3<{Ψʌ>|l쥗^Jr]V;رÀ},@9 zwԭ[7ѣ 3<{eƊDMrϝ;gV 1 <~@ݻwO5j:9˗/7N_t\τݻy˻L`^5kح[ȑ#"_tbΣ~Ũe}x$ì@w͞=.XgΜщ'[ol2[lxĈUV^܉X?7Na,Y\oo߾F9rpj7V|\А{jժe&{??? 6L}1ENҴiSW ֤IDzAe/%fL}u oSmذ. ʌ_#ĔzjFNXSViiZxnBW*\4a۷B=C,[L(Ɛ/W\r(%BC Nz%_Sm(F9m)s3n_̟?3 ȘOO^1FU3KTcEJ-TZxzvkB/LUx"#tL4WU)"1)bFFO>pQ(3_KΡw}Li&W- a۷oo6]4 Ω zCXn5874*Wnvה O>$~`8y :n83fڹsg?ހ. yUeAjoQWW5UnH<7M6^-~ҏ5O3y YALM.74î] Fa :{*GoI2v̙3fc U0+s;ꔊ'ĪbRıu^bq/}G,H\MyWN2h|h5'l<5ڊժ)V֩pՋPݨXWآZr-։kSty\oixOkV|}έ}WWWl<… Cw@@hRd9}}Z=2 ѵ>"FҥK(5CưC|Q~~hFfLN~¼ؚuJS+\Ңwِ"dWuIئQ`sE*(>JAۣtGZT G2&̒HKoJ4-iq-PfPx~8M8CDar=}}ᇮ~O h={)+bhnq u6' 0a gQt8Ę۷{ uݦM(!A㯿j̟E\;y1jz`GIBVӽ1jnq}zZhm/F' řHK-ZFzWUȞTAMD^gWpu xa\UOi*T`l,^%l @`-Z07nhFJ4ELr h*~?Zh7YK >{ȫthMLu> mjulR1jf:YmE/TWlkutm1Yct MX%cPf/Y{q}O Vܑ *6~ݺufٓJC6쮻o+ ".jiy p_Yqd'rC[Aỏp>an~fk7B1{3(ܹfzr|1؛yn9c`^=Iu@/nU[/ת'(ί5ACR/4%C0 NE3{&¶(a: 2L:} |\gر'p< J&DߢT8`E~!hC}px m8l!ʧc WZXkyϵ+iO'mı"gha{i"~cxZ[NYv}㫌>iRLmh aQsK[jc4ƙ3gA2j^Nk˯{9u2e xg>}t0ɹ[vGSL!S"%=IJx<-d,%憔O:X^B}YP:e#IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/playstore/es_generic_rgb_wo_45.png000066400000000000000000000156051260417502300270110ustar00rootroot00000000000000PNG  IHDR-~ 9iCCPPhotoshop ICC profilexڝwTTϽwz0R޻{^Ea`(34!ED"HPĀP$VDT$(1ET,oF֋oZ/K<Qt`)LVF_{ͅ!r_zXp3NY|9,8%K.ϊ,f%f(Aˉ9a >,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEVq2gyfpLTLլYSYIꫯ< a/Æ 3{n_F OD{#ѣGm$J9{q\K9UTrXNh?K[/ Ȗ-vb^ ,,30+ڵkf҂4fsA{V / @-[L/*^۷hҥKMP;#G4yfs|رlhժٳgkڴi1cFߚ>S\Ҙ… k޽9sytR}g LG5;xVMMVN8a&cǎU`~wF/Yu &`ܸqF_~ ApI1B[n5FҡC|a-0A3QhQ;wbݺuFc~l@K[rQL>O>DٳgW6mb]j*cnݺemxqSb>}8 _~f,{96ZO>Fx饗 ҥK9@px*U;X@oV臂J=~rmΡ&xN!ի! W_5 5I&ܢEvZsm@6B#ZQh޽{< ԩSgDFFӂow@ ( X8Uo*B?;!C[I-c9rPƍbz)}ᇞks6 Tp eBb SOc^({ {.UNՖu:z 7jr-P/V~(pjP./O9WQL9z'hǒ]`Νk| 2ܮ];Sh\Cg|y ѩx@-Z0%mٲe)VիqJ rΆ ةzUQ[[C ,D ÷UݶCFl*-韧~Ҹ>KJ{֖5[ NW˗/7+$ 4jB/DRڀ %D'X*{5}<} vw%gд2yE̚ MHH͛gN}=?XGB|_mIR5= ,ɿ$ qnG!zvP5 U=aj7LmnU'!d9_0@Z]_ZW:h'lWD 3gN/(َ]InoN<가C(|9|a:0dJ0bHpӗ /B @Ȼa6cA^D sƻBpvwߦwjmj:ńiWN:Ss4A% .ѭCjHJ:ڥK37o4ޮy^!X~?gjBFԞmΰvz*fE4M8ݪf7P-XY Q a@pرxӭLV`vjM>f3ɧXA˞mMV>#Vv9 W]plU[@6:Rn.upktrn>|$lɂ:Mxb _Vz .~UO4h̖<-ti[O'dB>yvӊh{<]!=F[lCG&A1on>jw*R:Ng#hWxU[K-kV*^6ayo97(PcY ֹÇ!{9x&&2s WI1w5ĭIA{?;&´{ Au\;$ҐI %6}=F wu%ڴgε:'"BY!vtC*%MH7Y#? ar=icLuю-ϴ}iaQsވRKG8F(:pn4Ч;EBd18H" bYC;>NO#+$ 4!/qB d?"\RCv$08j,1qTw!d"|t(1_U3oӝSۀh8cݩf@kIߝ'„@uyz; hu٥Uԓ^iLM2 "n9!²'DVU@쀠S~l*lў"K4LOM=Iu/\o /!w+o _fQhJ0*&b18{d){{>M'/8JH(F 2J?).];)|oS8i2Q Zv J%?ZN."2r(KʚW|)͛(!d sٳG\B\8[od[IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/playstore/et_generic_rgb_wo_45.png000066400000000000000000000154771260417502300270210ustar00rootroot00000000000000PNG  IHDR-~ 9iCCPPhotoshop ICC profilexڝwTTϽwz0R޻{^Ea`(34!ED"HPĀP$VDT$(1ET,oF֋oZ/K<Qt`)LVF_{ͅ!r_zXp3NY|9,8%K.ϊ,f%f(Aˉ9a >,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV)SꩧRdO[ǎM[֭o@s(QB:si7n{L׮]SḆaÆc{1۷o77?u2/SNŋW^Uڵ u!y1{;믿<#w}-'OT=mvfQigK/믿9sf.]d&N:ڲere9Ҝ1~O^j2i˙3qΟ?똑JPիIv$4hp]ٳI{ӥK'g(X~wYFӦMӌ3{]o7;@{ݍvZmڴ,,;ŨX 7x1voL`X#H 7ƏS/{zmf,[L>iϘ1gXXFy ӧkҤI0au3 ܿf7˜l۶Q#=`;z&Yp8ӈml h5P/_zQFkb `$D-!Q5y{;'@E-6wzB!Qsӧ5p@#Q#FKc~so{[X$K;:2RhƂ|zCcH5Jp-UZ BrX5^xcLvݬCn$!n$;f͚FwsEznݭ=vX;Du˖-k믛sE%چxi#D.] I&uկW~$O)'AbemNyO& h  $*kLNu<V*Cɍc H. ^b֪7?(*8 >Y/ mԘإ-_LLLIÒKD(ci!JDA&LgW Tf2ZE&}S5LsyB}A˗ Y<_4iRwK[)u@sȑ#^#App D0ɓl[Hs3ssϤSW *;}\ ߯Ti!*1s&u4RR‡Pbq~xҰĉ6mƎ!I&y_,dIbkЗI'Arm*7Pad$H`|aÆ4h9gݺuڿMM#""T$[7yd5l/w>,}˺v p>yT,&l53ŵh);v0ފwj'\dȑ#̙3oRn Y3ɁH:GoRQjyG`Mc ] @ H!vwj'6_عId1.p"TbKu [8YmUf;Yu P6=OtVDt&u(|uO6ޖ>/ rC6H-">4D!Տ6|>fAX@Ħ%,sLLֱ <d###MR7o)ʑ@cP9now&lfh# `y裏L0;b,zT:h]V+jHNNJzXWjRسm0[[ _TRg ~ѿ!;c$x n2]FNE[V}iA,@`%_9=j wK+l#Fx~$gp@ȳx' pA=ڟ߮uPڪfU[;&*r?݁x6̓P:p(1oU5yb֭k&I0 Ytw\B{:g' |0 ȑE/PW1[}z"jSVpas NN0 -%R; tqZ:ܦ %i[y[&O*]ڼ3[ HM֭[͋0ޥ7okM&wuI 8sM%5ʕ>WZ|7cAX2XWV Q\jdL vogLhdePRIv %e}c0R&N\j&$5:@º'8C3c'%R˼2W˖_sd[dvx7 =/8,3:K"$?߿:b%dM+)zVLJ< /O8dk؀SԵIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/playstore/fa_generic_rgb_wo_45.png000066400000000000000000000155371260417502300267740ustar00rootroot00000000000000PNG  IHDR-~ 9iCCPPhotoshop ICC profilexڝwTTϽwz0R޻{^Ea`(34!ED"HPĀP$VDT$(1ET,oF֋oZ/K<Qt`)LVF_{ͅ!r_zXp3NY|9,8%K.ϊ,f%f(Aˉ9a >,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV]-ZФI\kN6lرco%{t胹rJIɓ;?6;SYdQppYP2gl",/^q{\(G} X…݂ƫDׯ7otԩSc-[,Z(;m.VBCC͢UdXֳ>k1Gd+tO<񄈒n%ȗ/ߋCZO~W^mܹ1,\?W^yE?s/^[] X}~7o4kL{1Q Eg(=׭[gf͚i.\hL/.a޼yڿƌݻwktiYjqggc-Μ9c={,&@<}c 2$8HK.5T+e2-&ϙ3yߨQ# RoL>8s6p e˖ӯM6zU^=3&9酏n@%MEUodS}2p;QF 3~ʕշo_cAN:W_}5YNoDn%Ŕ s*1rKOߤvF*Wbi21n.H޶Ѱ0<@x,Λo)___lWs*A*7fz]7΅j:9ȗ;U&ԪU+qO?߾nX= D{T=++ oUx*M,W}5ꀯf+Do^C*S)2v͛dN4PH qM8u] (&aF?~BBBW *NX֫uU2=Ks/jhܞY׽u+'oΓ'G"lڴ01wLgJ6S, ?UQU?rótͿB քmT;y!ٵvF1aH*]ύۻwG%`wqG˚5i y8UU}jZsW<_Tݯiwj6k"A֎VG&z:ȷ~lIlW@ {}i̙_9c7q-[4֊+?jUq<222\~ވB͛6/ܱc [ZJJ@K8Ç>>s,g&5A%zgAZFV]VScu(Hӊ33T<;S/Re]϶U׎H'L?rqvf+W6ۺuk=y ,A UpkW_K{Y X=ys>dPX7[*/F8O>NVnP{Uef5Z^Af蘾Tk驺k҂1Ңʕ3Dž\lvFR]C}^̘G57gayws̉ lo70}DH޽ݺG,wJ@ȡCׯɏW`)YU.MP Y&E&t5 ٨aU}V]@-3u~Pis^vչUҐΏ$t 4%7iҤ d޳Ӝ} ;ϫD&m}O?\p݌X®*  6̌B^|X%GvÜP!ymT˝jn-cAjI-#6`޹Y#7ܙ {KҼW,+X(탏>AA_L+زwyw`v8>l9d7# 4δJжI& &!%:tIby:Ny&W Hƅ-YX'(Mw(5Jd%fEXDEMfߵYmvu9X Rǣ [1euq[FXoY NZ>H}2u25eȹsR\ɓPb1A$@L>- 4k%ົl%`Qr"k׮M%C wGGGBW%*PiEEy#GR5;wA5JP!xlYQ[u<CD!:\uLٶUC,:N~W 'vTRa,3Z g@76o73BbJJv7\wVĉ e;pJEJX'vҥK3Y!b"EUӻp:ݪ.=:T-t2BuXhW{w.Qǀt-N 0OΝ;w, ns}){wMa]@m$؂1lb_#8æpcX hp0{RwUO,ZXݭk-zssa:X{_1 /6T}Fr~?.qup,*7B0@|p\2n*CM?wr :Oc]p }1?[AXHγ"`A(|8\%ME l t+DWbeX %Xil8RJR~Ǯ1(Yx.!kuW ĿN6̀VH("TYVT(DbjNVD-0תMX Vs;5R.R9CGS (AqC$tS M&v}DUwOJ6,M]?:^'vh]}2_eJ,*==UTƆ|API.MzPyS.h]HM;N |NN;˓Oج!O5JS/pC&%˄k fQ/MWyeN]Kɷ3W ǒ;.+w6&+N_)8Wvʞa9KpERLN8k.C4tӦM3;Hb'<Bl$X/_1WX% xU2xa iNK@$)J3v򌅿A~t łZ0vdQD,sOqrK+O&..wT'g:5EJ Zp<ᔱɧ(/+z¯h,O{cl# #LP0BkEՊ@CI'y4݊fCk"( 9w6JwXŅNq2gj& ~(0[q_L,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEVs{9yOsx[y{p95߯VZzGTJGUJԭ[7EGG;ˬig%'OVTV_GbÆ KցO^EUڴi=msr!C;O֭[gy?s Tuٴj|ϛ7?e* @G5eʔ16m ̙3-EK.eQO?t;u!˗?ʭBCCu mڴh:udɓʖ-1_A4h 6`:uꔆnٳgS[lT?5 M0ASL1ۧOs~FS`"ԵkW/*&&FWVxx2eʤ={_jU>|ĉ=9NY|3f;pN&2ܹs5zh}Fk5 .4 qϞ=qFeΜY؍f.]ZM";?e͚5PbEtƢ_~@8;v4f>u,zBTn]ݻ~7FHR9u+B/BXd̂m۷o^{5u,,-?^>_O`2dKT Axh^z% pſN&mժUwm ݿ\rQ9Tc=fCΜ9UvmPҺukeɒŴ ҥ22Yܦ_ULJnl%Y u*oI_)S|69r8L\y뭷4{l־7&H% o-q>zD x^e*jذ[3v NjaڷooO?j09Ty*5*Xw@?;fk"9ӫRM$a&ϓ'o߾]wu5"⸚Cqm*=.TG/нCyZ[&ZW,4_B{t ZP;}BBBɖCԕ*;>Pe*;1PvO#5B+\S95yJ& gb2W2qW ctg<`L?P˗/vmNZ!ȞS,QY0u*N RtU6HģU__@/.9r!0X5_A!,D!*xOZ{dN~4c4m L&7θT!`+@1 }| d,!T>5aVXXy~7M4a@߾#cr(V(ٵk믿 ^@Tt!E RYt5T;8TuVPݰ_jRWUPhv{I4__lEgyl_Iwni} ;!DEEwGȚ+hĮE0T/ٗӻwos m #rV=22c"x_\rJ5z΢?Q znW*vݭV낥ݤ^h9m H.tƏo{9[v 45eHHp8wm?f7C޵iʹZ!@XXh g9nK;vH|||իg'>E5|1aNS $ӦM#;3d0#8.V 62j9BMDWZTXN/S_Y|G#tȱ;>u KSA, F2Czfr &׃w}8u-H`OvܕM8hBȂ-[hM%t:P!1=W~Lװxh;Eɒ%/Crr=B-m2,nX"f{jkXuUh&TWЙ=:X:fo…];KPsػspibBwKeQm5o8q)wX@{k~R:| a64>5k4uOX+^xEV;g,zzz5w;( KLzgu*pp,*BAecЙ7R[1U* A 8Ƒvxw駟zL l]$,Ya!EU9@#<` ǻ}?~-HĂ`5Y!2|!ȗ[Oک.g7#O CS`5ؚԽp%eH7)%1p0 K:n8B5XTeގaR@$6$zn,DjG/.sAkũhͮ8A{LSt-\9q]$t 7!_+# ǿ\!$%,vEBxk:|| ,[3湩*E8^jWA8sA.4C$!R$V8}R˫jL*M[*&!o&o^7 ֭[g$+1̙F4?D~5$~iЕJ'-[o6^nxaOyeҤI,>彃N>83C g a.x,F ^ ~zSC޹P]}zz L,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV8| |s{ν04hj֬rʩrI+RJڵbbbi AӧOC=\KD;cǎMWɓ'O׬Y :uJ[l ~B xGϪN:*VXߞ|I=oڴ1jcSNEZj c=Ysj׮ҦM gȐAO?9Α#ym1*}ovKN%JPժUsϩzzoo5ԳgO.\؜c{qnK?qs7oxN1zj߉'1 .ڽ{zjo'k̛7OΝӏ?haʕqD߿_3fo<n/ǃ6۶m9R9gU~駞L#1Rb7w?8.\#qlF;ΑH$p[=zX7i<ÂNqL>@{ p@ì˗/+Yd  A9sxNK/d&Zx^~e3 \76lVZe$͸qrGp{{iϳׯ_o5ʀݏf͚Ϙ1C'OԩSoPOvUQ\˞=.^h&ض={H\vKg@o͎}b&4i2eJ}:rm &XY&1p Aj0_|gЙT_ `%:T7n4Ç׾}|`ڴi <߻]tΝ;M[E xt YUv;>i D)+<**̙3E{|r_n׭{uUb2e~Ws*:wަ-{:裏<:=z TR'^=&LЩS;sG%§O6Īݻ~`LT @,C!!!f>|؈H~cŠ^!BժUˣg}Yͯg`Ava>vʕwkar Cj oA]~={]f L[ 0ki"y:t(U pp@"hD5dbV/W ~g{J2ZW϶cqMϗ/QG}ĸ{Wխ[7{^zU̘1cʙ3:ߺuBs8 IHB)ӤHɕq>[hX>i|p4iL|!т Ez=KE͢R=0©Dܖ߁p п- Rd̪B+VKtF\V/U<&&D4/((HջF@q>\7T7X-Wo|MW^F:+UwCH={ ,hܹsHk 6R{)3eUqUjz;REA;i֕yMb5m%Y_m#U˖-[Puw c<}A6r7rRkUbj?C ?W)D زa[[oID#5E݌$!x;Ŵ$pG($`_ }| D SB]mnTn*UZ VժUtfY)fh@93]B*VT;O D篢“<< (Eoh[|yS1k,ckЖAvVZL |oa~ߵk @= }nRC 1K Y`0&$ݐP;E:[NjlUS@*K6UFU"UyUYVUƊ`\ KC4g')T\=ڠSkI*#N"ks lٲ݊+̱^%g-YHY35;vwD{> ^IPdI`"l(mڴRO_IQ'A_6aD4<4,'ݐ%u*k6U]T}:XN5ׄVplU_'MpŜkcߑ )=)[N$"t `z_g%@d,X v7&]u$ VmI"mz2rߋ SiO$,M$CݞJ '.5dV WHRgˮk+ jjWmGll UPՍܨ[BU1bڨZ&^L I;G5S%O~D.Y$N]BdWDҀ %D%w[j!)]&A d*!*6X22_OC|+Dk#1l_mJ3݆%_n NBU6gC3T?&L pܹQ.UUǎLܾ>ҒaG*8eEnp3gI&T+0`]fҵz_} 3e!kxZl)inLL_R2jj7!}C]1٨*^5& U݅+ Aj͙j;BFj}ņkkv:.v$A#KF5{%K~ڡC3\#LҥK9'2" SbRV"|nQJU,ي0 YʔڹA`%jcǎf)EG0 ~)Va_Pg ro 9ў8LzjqpZҿF&8Iuʹl ([[9p}tt&h>|<_5<1Z@,Z7XpYӮzG:| (JR|VF&D)NVZxȆqEרZ4,LisfWQjsnZ٬VǢjw2J:?nV:ؚZԤm%ufJ![cAnJ>$vX䐻?k)}Bn|%g$< I`'J; WLH8O)^$ r-juڜڢg-H^z>U5G7覐JT)C[EA'`mB Ƈ؉d ߢ|`;ֺI#6-as/`e·HuV?:V cI*i@bo >F (9acT5L,Rɦ>tqAYD/G =C/Q'WK1x5FM e֖hoݡZožm&VĠ :DpP/uG 1 D2&+ 4.w@p= (%0Ąڊ}C %_9=j wK+lѣGńD,w2n:rP ;ґ]biik#uEU+]g3tۄCY UM[_ϤbNfm@މa2BG{1x'„ OuSR:nu=Q= WR&V7k!ܲ'xV@J˥jc|hl տDWL9QURzN]Rwj@&M Rm ɟG]tJ^WF?2H2KTf 0W_ܽvE|o`%_ :x~r~K1,(#G21۳5. T~) ?(b /pXJl?).U;I|oms}e{يI8{/šC&iM'x<gY^ɏXp1ܔ\fyHa&߿(v6LJ< /\>y .$g2^IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/playstore/hr_generic_rgb_wo_45.png000066400000000000000000000155451260417502300270160ustar00rootroot00000000000000PNG  IHDR-~ 9iCCPPhotoshop ICC profilexڝwTTϽwz0R޻{^Ea`(34!ED"HPĀP$VDT$(1ET,oF֋oZ/K<Qt`)LVF_{ͅ!r_zXp3NY|9,8%K.ϊ,f%f(Aˉ9a >,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV^g^d'ϋs:<sP"簿̽0ɓ0`U2eʨbŊ/˫B ܹ"""1k|`ԩSC9{9s>}B jщW^<TFE$M4qr] :t8) 7o~ xGϪVZzg|[oyF۟&MkNm۶Ut̾%KzzUlY zGur9}O=1cF2)yf\?~9SV"E ϾbŊ{uӧ7,Y2>9K,;Rz x'uSNy?y…P{5k֬L?;w4o9!Cm߾]D1.\of&wܸq7ty*^/^)Sx pΝ;gݻ O?l+WlY_|L_|9? 0De>}Z}g{РAў~3rG~K~-[_ 6h"ͤ"L27|g;@X֭=+ו+WԻwouv!<|4i֯_Vԋ/?Y,eʔjڴ9VNs -1"],e0-fb/^ԦMXPl СC= 6ԙ3g Rf͢ԗ_~i ]tID4n8xCL8ѳ h&ꫯ{1< 0ڵh;+Lںu4cƌhFA}?h]vՉ'rdF%Lv6+5^tieŊ;b̘1FEW%}n|VZy4†:?SÇ7wF۪'^^JmgȬc *?j ^"hy-{jjvip sco#)V˖-GP"}}/CV8Ą*3k'Ti+Up:FNӂ}m-~J=.3onFk:miv&!U{'ʹQнDpȐ!4 7ߨPBc IAkې-0Uk:{lAYܲ@U۰UUVWUUmm U`u~8GQę 19?Ѥ %Cɪ(÷g% dLa\;g{%;V- l)I׮ |b 4F  ix LCH =3v-n H%ݠ[zpVMaT{ʇn [7i䕉944>ẹCPII*%K~5js3<:6B yWl DOKt0AYfJȚ YfEBgϞ1X*GB|_ǰ7{a^ȿ ;EGu7nfC|&|\WK;*n#^ҒQG+8enӧO!^8tۯ_[4Z0c_@_/;i `iR\,c&ȋ@y64xL-oм;wnyE^8 s;6H~w UjcJ:6Q!QN孡M%=҅ay}ZII ]yHg_ϙ!hSȈڳ]+՛XQdMN*?Ղ dȑ#1V;7 oBgOYۈ7d˪B#&5;U9j)Qg 6Ѿtt XH@MZ }b l˶%:YpX /[l+=]leO8'ϑeK1LFl)"ZOS ~ozmLmA:{V5=U.WcDs*\mNoUMV۟i7N;uTT5S-TjPF7QxKpǛir=`9r`l8o")^$ۻ%8m4O2&´{Q㽴'^g6?Vr乣%+Iv'@VDmF,~,,Cw̦"ӟ;vji0?I[+S䳙lVؤCY}~sfz _h1DT3 ͹Q} NPaA+:^٭Z(Jvhyщ:|*CM"}hѢzUOA+jxdBJmԮ| շXgeO1^uy!%N!@/!ޯݭ1S;b Juӛ$M\3p#4ʓ1Oq ,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEVsIǏ9s?fq .lʝ7?-'@j~T(YpBy2 mxb!0dj7ojrsŋk.yggg$/.3o̙3G߿8ݻkv("EAjjP={r cƌvD{.Gbbbe˖ Xz5v-Lq"Hv;wi:` d ?vxB`¡zj?>hҍ B c\P{ hݺXXׯcٲe[Ebb؁{MLLC̚5+5hVMj"ӧPA to߮>ccc"I~~~/f`={0au&:Qs a YXh'OڴiN0"ꫯ8FC\~7X~0 rS669&L'ar.QfjݻU75,Ο?X-LDYQ<C0QL`ZHH Ɯ"c: o|od"b ?)SC @*R[0qڊ㨽FoŮgg&i/lFٽ6/M2AÌѣG?ʹjժVO?ԩSfhMvr'nD +'yvS5B\rzǰ֠̚5 V^'/ɺ@([l.d827tL_r7C'5v@s/:;|Ή .!8/ENiٲXLp^leɗ%`-Ta,+{}58^H.߰f9<- P cw$du͛ ߰."Ck"s_5߻:T'40C'3aoX/\*ϔ-}C82?Z$ (!>Lӧ8\TcH$x^D*]qFѐ%s t(zB`}}|^hG[pmMH]5 pY[qv0+VH kIYǎ" (M$ZR؛`#رc|fhw4lB4:*j&9$<,:pf, P:Y4= y1鬖eYI$ɝfV._Bظ=o҄.>3T)))bll `w%I jќH]gTߎmԨGus<E=f񢧒@y`@FG)BGE]a`1+*n"_quE+(e53L-^$y{H }tdvhwYֵ;$`hIQ:>at<%z!>\R} G`bi&ai[ FsEa44E1ʗ/'Fg|4E) ݅`^WBrp $U鈧M#iåH٣8ʺ=dvPnnn_/d#}Jw6{{{﹣MC jJpg\$f3k׮VV@jA{{{!lPO{6ٶuXb0>/;>}ΠP|ko{5zb>ڸ#R)H[ܚK)~!D[ $8D/XGW86sL`% :s\2O@+OPD ц&Iϊ9ͳ*TsgTE2Z&ɅWn%2R(i/B1%yeR 0YDX*Ca8kSmг3'%m>xþD5(r'H/p'رGz:fd@oH@;@v 7o,잢ӦKf5ZRR/jNLG-]JYR8<ŀp Vp:.U1x`nۢ=Z.eO=TrYC>Yf"&Kcea LNoTC&BP:$Fލ"D\ϻ.@`!Yk/8CObr¶p_u֐_fxF j^2+w,zN(\M vtO)ebHDm>F:jO#9A;N' pO|r1C@s:!E%}52O\(U4c\Kmþ%r|673n실lC'qcHSif~:սv3IPaAPOb0ZA?>.6#~t܈qUmQ0wl MbBz   H8>@$95ùHW<[uqw1˯:S%~ś~jM(n MJMJY8"s2ˋE╲L$9Ю<2SEt_W1B(j!8Ǐoc!whVF02t$@N1t̎ϭy5y]:@ک) 1D _N[aAkB/З_7pdRj(A`Y1,PxB)uX:D d)G<,eʚ/}֖læ(%L`X/߹sjJJ +_DžYR;IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/playstore/it_generic_rgb_wo_45.png000066400000000000000000000156401260417502300270150ustar00rootroot00000000000000PNG  IHDR-~ 9iCCPPhotoshop ICC profilexڝwTTϽwz0R޻{^Ea`(34!ED"HPĀP$VDT$(1ET,oF֋oZ/K<Qt`)LVF_{ͅ!r_zXp3NY|9,8%K.ϊ,f%f(Aˉ9a >,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV1%?:|{CN7n\CܧOy0 H:uXb7{GyߴiScɓNZEUjzfͪΝ;]vJ68(P!C=f;G湶O?m ӛٳgWv+W-[6UPAO=1˖-{{J􋉗%Ksc=v6F&/!e^v-ԩSG; EBݻ]s(ׅ wߙvX >ti8ql7jȴ[uE0O͹%JgyHB|va_ߵkݶmg=|޽{Əo߿ϧKN!!!t3Ο?o`:r;32@Pwnݪ>l)R … [oTR渝Q 6#<"ofp|ҤI:x2f_z.^lsN_JGz:tH#FHjժzuQs[^d6n;#x7on/u *L2;waaaW\Qd#Gzf4w\ό{7o^(h^PP…5dEDDhϞ=F/^\W^h4ׄ 6 7Б#G<y@oqgك%X'O6} /sɭp^oQ =V+)Sx13m۶57ʽt钾[#_|ѨZs,cƌ1?M ǏkСڼyLo n`9Fe? /+у5mA >֏>H3g6}͊+2p \pTXJ5SN5ge W^-ڇ}^:[m'Nl͚5s5̟8qǝu$$$q8 H:RI4X.+KU}W*а|Ҁ4iҘDA9ݍz"p:W#p;1sr0HX21?qkа%ZT}φjč 5 e̓=A:Ϛ@W_?hުUT^>`]ďuqs]AQT B/Q} 4C~v TiS%!Kؗ0j.]L}!`YOwJ:!?d/ RfʪWԔ**8vNZkpj5mҍ˗-T(}lBB1a섎U*7gRTxzVc  TVNmٰwQM}ID(u-zf4 )=p@ =ʸ00Ȧz'B:=Q?zwAl*7s*- SkTqZUZ2skꉙt%Psf^(pHS*/OUDϢ $Tx-_͞=eݒh\CƏ>+đ7X¨Ԧ= }w&MLJk6mdr 1 y ,;E:ZLj"0 TY҂u*\S%UeYj RE!,XLw?Y.MSڧM:sqjb9\/("erJO QrfےEaC5g#e˔>VA2k!A³e^nf&@X@λ-ȭΩO(X gd4^s1v!w2)&aɨ[Sĥog\|$ٲƺ خZUQ[CT',Du7UܲMOGl -ɟ^Ҙ,IGƦw4S%O~ .]j:K/ k6ٙf2oi6 C Qݖ.D:K:݅@6mA@Kچ9sz>߻wXg,YNk#!x_66N nC:K/!zq]/2TBpWSݛUq Y#器9:HK{JG8-kf͚K"tw:wU)XwI03_0d O fXƍ6inϋ e˖ꫯF&-Vx+fp1l5.̮P 6<֧"ttXۦ=t,Y15K⿤&|\3.7SQ*߻-3W|LrWt7=:tгgI(ur0J U}P]7DOW\n+| bPmrKEduG 1u@{<uo,#Ȃ?KPw`ME[;[cp1J !P[̇%j,Y!X1X y`}!̲6Ax)Z/눺S- %fݏԩSQm:>d fyԉK8Li1T'3X6 G0_1P3 ˵Qu NPaA':[T:ЊSt =I= WR&f7D _)Ae `Kae6iWE_rΜ*]|[ _B++o _fh3*b}ҥKd2Gzr)aIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/playstore/ja_generic_rgb_wo_45.png000066400000000000000000000153531260417502300267740ustar00rootroot00000000000000PNG  IHDR-bI 9iCCPPhotoshop ICC profilexڝwTTϽwz0R޻{^Ea`(34!ED"HPĀP$VDT$(1ET,oF֋oZ/K<Qt`)LVF_{ͅ!r_zXp3NY|9,8%K.ϊ,f%f(Aˉ9a >,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV}ٳ&E^USX]  @ǎ_ yE|L 2U,YL5*R[99?beO|Rreܿh ԫW@RĜ hiOT qª^zt0lLfJR~}@8]|yfe'uo0 177G9sD\\ܕ t-*3fDn!c{|X?y3pkɜ9s4u8v`ԡ3(c &#JMۄs|P|F B˪]{y5k ֭[w^={o? 41hF*Edd{WjPF~ABٙ[Pu?Jݧ^߅¿q0Țja1ӧOGٲe-[6!tqv@-#GBf |Qm~Yryb-r\vxTyY *O?>ŋ@]x~/wwwxyy}X T^]'jo: kPqpy 'X7L :T }>s?Z+B ~KF3M >|`ܹ}2eʤgff&$(pA}PvvFè싪|"f+b ~D!#md/_ɓ')cXv-N<)D46 ۶m}]sΡRJ ,!C`_x1VZ/B.- Y;dϞ]YƌqơDϣp5%>ʔ)SN֭[2w?@5jժIZ]q{7l$ϟ7j^g^y7l_4Cˣ~:ApۂX{϶O;b؎(hD%I.zƍf`4h*eWtOe+-C#H A04ffΜ),YW<9\Zoג1f͚{ad 4tu3hG"av'P/8 Cz/bϷM{&ЙX=9,- n>rH[lI6.^{y}=z8F- ĉF رce]$ܦ;?(pXBe͚5<&ߌYhq4mT{;ؽ{w>ϟ?7j>w@+emD ڞ B3AhngPe4xq*:^ݥLHtwc7֭N&8Uի4ˉtw.~)`۷o_q|hٲ&0劗@`.'m¤̝;51 0]LQ@,[,xp8MkAy4.fGH W&l: FǨc ؼ?pl5681F=G n.W [.]4V/n[/^蟓5kVїQקia۳g`\ݲ'Em$-Z$IђV5!$Ǐ \&!ٕ瑈c$ 8?ΗBJƄjZ m#m7O]qFKܬ C:{T-vE{rI\\\d$Ll> DI@MCϦkҤ8pBM{.[ΝQn]ܼyScqMR]DW^Q ży7SG ?\0tv(( 2 M MbvhӶlXllx"նTo{T} ct h~4qDDGGc&MJp_ H+AwdɒEh9s\/ȁ{Ν:{ω%qFq->ܗ#Gar#45G`niN^+p=N耋& q%@;GFL6d?ďʕ+:OwNmT9v~W'8:OF2wcf^}opW,]?|fF U;ߛ(|gWتTJ 'M'UV{~i#%o) ?n Kq&Hn:o9aP /Ü8XH{Xtp%W 0UƁcɘ9•Fߏ&_~/6FٗUzj_I1YFvNƄ/X}HA6 4YX Ay2N9X-_ M .A֮n5wڬǥfs1T#d57Oո7æw|+ sr}>:f`9\ r0~%W9AV T4=aÆXI ' ^0\.acwg,ΘUOΒ+]pШf Z\!$*dcw DO0b ybA (h6bԐ cO1PD'߃RzU2b X(!,&) P#Ot)ڵglrH(CI0(;cHDFD/ ˇ@ M, nڴI|HK@AQg,gg*Đn͛j? ӑ1ʗܢVV0+WT- ֪? 0ªo51lqrх֢hѢ"L̔13o Đu3ȝ d3IJ2i{txs&aX/cm `1w@+ p>(88 f qę5k.VO*«Zimt~g| d0+WlbN+ 6C,=#pڴicYh\FUK<,c_?d2 ;W}ɓ'V&W>3 3(,b \Lʤ31(ZYI?.2w2T̿lZ!l>A&TɴieUL]0I~1)d)Ps?<N}=z$ZdQ:Sj07 \|{@D&5wI ͥ 0( ?*Ď*)L=S[4/ꓥ[Ƅ@`iXգC+]X^?H{3y$ \ Uɧ\|YLyԩSu\qL3YW`9 +'L`PGz͐3YSiUNiߙfmַP|bo>A5dW*I)IY F5N;aؙ$=.'+W2 MOFυR{j͒O bFi3q$ RXgx!Q@މހ@Ĝ.%crGteG3F4Y5RPi'T8F&EeQ~d,/-1='gt[LjX麺čJ N#e@p2Ve/䇊UH t?nOSSjUj)o f$J( g)o7d،%5Lkp RO\\m?7L|cE|͛7;mݼrd.IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/playstore/ko_generic_rgb_wo_45.png000066400000000000000000000154011260417502300270050ustar00rootroot00000000000000PNG  IHDR-~ 9iCCPPhotoshop ICC profilexڝwTTϽwz0R޻{^Ea`(34!ED"HPĀP$VDT$(1ET,oF֋oZ/K<Qt`)LVF_{ͅ!r_zXp3NY|9,8%K.ϊ,f%f(Aˉ9a >,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEVՙ̻u׼s}9}{/y-,#>',]`뚻`S4x`ժUK*TPժU}zkʕUJuMQQQ2k< hƌz~>aY jܸq i߾}{0 H2]\r)]trɣ̙3_s\l@Xn@&v9Y\K/s*}5k,*U*NڼN"!CqٳgW֬Yoݺ-[f=/_ތ+^xA˖-AիW#)r/t*W{15lL2 9o<)Smĉ5`uI_2]tѫjH&M7x#85ehBSvhwK&zQF)o޼ի/Ə)Qz-թSǜYf ΛWlll_LḺL2 hԨ:6m `O. @cϯ5kVRZcXpJ#hʕqsֆ +K,*Xaw5h@#G4W_q WǎjСCΛ9c~z\UT@O4LG}7|Sz2pX^ p%A8uv2f̨9s'Lp,gΜ*Tk*U9w}g~-ZzN_iɒ%fXv/Id}]Çaw՘]̾y"L;|GڵݣG$ޫ[ƎkӴiSf,nc{ٳWqFW>$Q١aaa͂jJ .4 {Vwyǐ.ȑ#A47cX\7Kw,F\˱cƌ/`,IQL._c~'@؝e8!Cw6 #o0st ԩSyc3WNM̙3ݢv7'Lb13.\D,<k L6MiӦ50Xc,>_7|aÆ%8/\gX)>_|a@ ( 9 X駟0$0vs +ecw_"]ߠA%l ; $w3 H $b%Lu> ҦRt|AJ}mj^VM~`G %ReͭmSd.lE ݑ ' #DNΝ;M1뾶2gWK*8d ȸ`5]eΗ\$t(k 2վ=aΜ9CՄ|O=W~wAPlr&XTKBPF]F(MBHO:!CCͤ.Mݿ<۷=Β]%ǯT)UTxjٗhiB|tot?5&.?~VX,L(׊8CIQ ȡ2TafO RřA*:iJM]gj@ͽB!ڪÁ`ڿ1AOHLgRZ$ED=@}˗[UkaWZbE͟?_g6\L~FjT!(!E5ڝBs.NmFI& g6mڤ#G0'@pcwm'u}tN-4 4ru֩0bO0:/Ҁ^LOVVyz 5x\| ZwA:w=jZ[hV5>UM W},^1ks,Kie}- w} QM)R3Wt+Wwvti2}Wko!#fNuUv@ӄOmJ@A\YĤZ2@p1>}Z/B7H=M-nE3؟'b?իWM WN5:U-N3pZݦ#hjc۴B-LʷБueqcC4ed+ H!ӧO:I,_lS8/ Z=] .;w=:= ![qLG5N{5ъ]Bd'NoO̥$ spP-ٮV'#&&ROG(@GS쨝(T+74֊qTt g㩝3 ϩ\;9FPpDiH5yuHvk m, )hk绰b^qu";I&Jt O.١;CC- xuSxt> +s)u3}L1SC9H{914B{-!Ƽ֝iM[`|02[{ A!uݏFcRI0ɓMH\3Z Nlm?`o-[69>3: g 3]v… n' Ju} Ug4|4*}N!0wOGbqHj2YWS%q-@F]ti[=:,Y5T_~~A- e>1=}?N^}|迥qБP ñB@,tj1~_ۿ^^y:XRANKPMп"KevKW&Y8>{WYG8E1.)k_~ )ʕ+(!O]=}/R Qrw}IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/playstore/lt_generic_rgb_wo_45.png000066400000000000000000000156761260417502300270310ustar00rootroot00000000000000PNG  IHDR-~ 9iCCPPhotoshop ICC profilexڝwTTϽwz0R޻{^Ea`(34!ED"HPĀP$VDT$(1ET,oF֋oZ/K<Qt`)LVF_{ͅ!r_zXp3NY|9,8%K.ϊ,f%f(Aˉ9a >,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEVI(Y>21Yaʞ!kw{=z2h}]>ysIsxÇޟx>g;\{ν0رcׯU2eʨbŊ˫B رiN SL<K̽zNW#GL{?ՃAeDDҤI.s޼y:ujɓGiӦZ cڵk8 mVk֬G״iS@0k衇ThQI ^xs ]qs.Gz7T~}3gN=URE]vUB~$IT@=f,XPɒ%\,Y6[l+sXt5VR.\Xʕ3[5jgbL?J>a>sXbn;ھpӧO뭷޺#cϸ]r%艉 թS'ڵk:.^?CZRLtaٳǴLoFfk~G0pܹs^ʖ-˗/+[l߳gOxw~I 6Xrl29rlJJ/ٞ]!!!f} ߃v լYz˹Ν;V +W.sN::s挹F#ҥK 1b.\nݺEÆ oEս{;2vm&-[hҥpŊ)RĈT^/LĶaUs/Ⱥhҁn 0lc3'ٳg?yh}@ >\͋ @bmҥKk e'X07,,̨&$C E[ha5h D5 7tP# (mTJ;v L&>4iL$bX`b! @mXްaQW1V 0믍1$CZ<:W1>hgu3}q9#nݺ0;y|yߎ&iٳYQFہ6d&{̘1J2}A`ݻDܧ HX YdJ*Y`ݿ HRY+o惱9d)Gkj4\-VyX(;{/0:$={Nؒ YL?prg_B4Z}匟(%KMXc)w{&ZZ֪ķKorTM˳5C4,w@4$RLD:ŋ"wl7@л*>.@efW *;5@ƮVщ+5bT=3^XA }U_[˗/7裏؆H]c "5yHHN1gA" wV $N3P[=˻A!L] BUn RR՚xt]hi5>l ,UB3g$BZnK> l 2Ⱦ͚531~5$xG*8cǎ@ R\rr\n::}aro><$֦q &TqVMO[@λѣj l+ҝ%r^s1vcJӞI[P&yC{R\j[ ]pK̜EUW&UZ_^6|F=^K4_.Nеݤ]iյuoJJƉz2]yn&cHdӽ '}6ޠT,*!*6g̘a|?UC1X2Fb}ی'iq$ _S{8 Vm[I d׎ QCtzpD-WH;"n3zJsE=]CTpf5 6>mڴV"SAgS}1y-F9V bEQCC `Q}SNVd/)N".G o+&QE6}A;mN;H<5ܷMu8=Lw051\MU%W\穡K3Iݥ!}\IIhi ?tILM+bcr{_}UwB("[Rs+ p٢J2@pSFɽV6ɦväc3뉧X}quSAwd͢3Ɂ jr(B-8A;ʴשt/]CW;pmt& >1|4W n5<ܱ?3ћ-iW=#P[QXb)&u Qx˻B۷oŻ=X.=GyǼJ)RgˢP˳F5;#Du@ڨͥp6\Vs,6⑍UX ޒf[E@ͬk\QJZr"h<i[jS@ H[wP]b% !hw^H;Va`zEH8O5^ٳMj}eZܤޤ66#Th>xGW{Kg_*TWl7n؈\; >4DՏ6|>fBX/̹02[b$Bx8 8dp<%x>Dre6ljF4ґEJ0|@aiO/G A"~ ;em7Y65u$@[0mbכ}RJlPp(1_U=)/x K`rp;aȤC̀46BG{1x'؃ gV]4^ݻYKLѧ(Xu[GiH` DX1'xV+:*:m;OvTT _ob"d?z]qDMR[RkʓStR\S`( rgȝ&`#xvǗEUTbW ]pa vj=FTPERK1,(#G2!i:q]7/pW=  p4WvmlYLDN=P >E&qNxg^IXp1O#6I1]BĿb[[؟Wnq|'N?,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEVxlڴ 9sT9I(Arٲeq<0555O8A 'V<8Kh"XÇO1vvv1|1{I矡ժU{7/_>|ȑ# (+++im۶E-+W./_%JHslV0gL6 5mZGX1{~W,Ye˖EҥڵkaÆh߾ئ>z(YnUTѭ;v숑#GڞRJxyIRRҕ hҤ W^E`` .]{ ջ8p 'Exϼx>|* 9ch `BDp-p )z}Lp^^jN,SCuj9VZt0SJd"fԠAˣ_@{{Iޏ?.e$~ŋ\j!!!oFPP8:;OpL{CJ->0/DǕeʔkҤe0Ak2fES03SX6'''X[[^GN=} -*~.1tzҞycH=y-Cr5j?x"f:l 0rY3kf|Y.LQzrٵU_fA3ۂh ~ ]91}G8?~QW8Lfm)cf ɜ 28`&aڵkW[ f2Lyi Uu)4X.9Z+~̨l74V$pǷ˷qqq{Yaȑ# {%լY^L@r@ Ēw;6Lm;vLP6xRs;wn5:Q06ʹL1䌜R>x{{Βy R9Qȯv̫AP7Gh8D˽ wza}f>uλ8?-@L֯_(fgϞ=zEʕ.ڵ ۶m%k{ȽzG(aY_JjA@$֭[o4c|}}E:խdzB9')}d0kA9Vhz7F~hz7*_G|=b847XV|ꦏ(K&Zz?iԩ: 'z~vӢWCIlb1 XKx͛+*I7ͽ!W5PV-,jS !Qq<7N*}kڵ!sxT=N>A{_XynmVND$Ëeそs~ю(R 9kI,e+ $%XHIE, fjuW_F}+uHvj;HrץK691\fÌѣEsv295z {K@<]""N@8Fg?=~ǁيۮ`{xph4pU J`˶FpuueI!Kn2e8R1ViwY7;$`hIQ)A֥Kn%y\OI`^%q5B>M@_{˕+;… Gy ڇk|:G* tnb qI$U&Uࡱ@dNŌas$/^ޮv?Bd7߈j)(Z9M 8ժJT ,I,bz5Apoݺ%, f}6iv(t xSg7 wFq5}aC\9sqzw4ˍl"YpY }  $"mܸQo$!&z<1vIJ@T=HpSzFE0A`hl0* CHܳSli,aO{Bʗ6m[n:(ӷc`wzFjS=sK01dblm(Hbne&͝;W8$7D[Na$}5O QGKJJiڤMHRKPloРAk̞=[g3KYb F<=tS4K|pxiZ Dג*}ė*3) &w ?!;v)NR3p<#w/ꕳI }I'T/_.ӶRtJ]&LYЇGUZ['XxnF 9YxϢ-fIB %Ea(HT4K\$[J !r|6_6TRJr6jw 6߹sgARw' 1թfwJSkά'AAK8?puCb=]U?gl MR"nݺbòwwOJP@$ +ggOD٪C62)o%_BWAI3)`) W2KT.$cx[E`qᙨXbA=w}Gt*f})eU̩7J_ 0UgsimsS <%= &fٻ_$c2u3K(M;I.J(CGbL ѻgr~.]8 o1J{QCu#gO?(Ea>N(4Vg NGGG@ #g](Fg)k -َM1/^Tb%u֭[=zp_j6 IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/playstore/ms_generic_rgb_wo_45.png000066400000000000000000000156151260417502300270220ustar00rootroot00000000000000PNG  IHDR-~ 9iCCPPhotoshop ICC profilexڝwTTϽwz0R޻{^Ea`(34!ED"HPĀP$VDT$(1ET,oF֋oZ/K<Qt`)LVF_{ͅ!r_zXp3NY|9,8%K.ϊ,f%f(Aˉ9a >,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV-RLH}ØƮ-kYC\ygyk}]>ys&ȋs8<}q@GRs AǏ׀Tzu)SF+VL8/_^*TPΝLpZ_ X1m4=#D O>a j̘1 q^?`@P$Iyx͚5 ߡCAyy?э7"_ YdzgUjUըQCٲe橧R˕+1rjժ… 83x˖-jժ` J2x =M)TfMeϞsO?yz#}c9r0f׳yNr墽#mK*eSJEG} ^ĉҦM{_Ar~W9'*u-Z(s6jٳ~sN_̱3׵k?l&/00P|i&M:uj˞Iyfϳ0lbۧ'O*qfܸqڸq6zݻ޽{ `ޙD[c=v_… *YPQÆ ~6mt)3A6Æ 3L:+?08h sO'O@-#O>؆ |r1B76ضa5ϙ3G^j_~YǎgW^-`q{.{/z7T:p9 8SNE|)ֿEDDŋza gΜد$+-Ꙝٳgm^zfM!!!fѣfcOdɒCgΜlh´O.zjYz{r\P!]xqsɀ~*7os-[fޗwxݺuڴi^re4UPIVƜ[WTIZ2ۻv2͚5˴;t萆18pic#ŋ@O?êy.ψmȪ"(M>c|Gf{…ڵkI#F%CB'FpA"EL ejȑU)S&e͚ՈWm6}0ФI}cXAA!g CD</1g}f D,s;Z+}V?mΐ!yuбcG_?TbŌ$d*}~@]n]uOJv m4iR#ޱP#jl\gq̪ڵk{$`Ƣoݺ=h*sl>~U`A9T,(~@5hA?xNA' )*Yʤ r>VU|& &oA4C6hߥj0e,y q}%$&I,74^K2)jHOk]˙垼nҥK 'G$nŊS0\GZ g[􁁠*MrY|CϞ` =\ tTT)ʋ!`DSN&Jjm۶&޽;F^0{J)Ϥ"c*2R-ӀS5Mwb4c#e[m#Çkɒ%"Ԧ/|&AY'PYUj B&Uɫ5zt;\Y@{b;[ RH Dg\ 3$h落sl do~D9g C띠)g̬ sר0UFU<@@?5ՙZqaNmЩKGKΚ間hky2b6rv"`6k#l%g&һStb>UBZ(6kf"E(ȅm &:a36,T0aޖ:H)*/ P᪺|\kU# P6PU ߧWwlEkc-"-(s4N$"t `<8+HÂpmmئm:-)H{s6Hv4^s1v!}  ljB$l)wb iGһt H9Y/-^51HBT;lo Rz1|j_{HI3 #>T$Ỉ zo Bv幙j4xw<5 m)VHbS/ȶ;AA D*!*6AAAԴd-Kx_6 '[b4| {|NhG[r>CZ@,X;XpYӮzG:| >RlvF&D NVG*&7.]ڌX27/٦^f* H- Ws{f8PAe#yikXJjɘ&*P,nqox3E9nPrjak\+uG`MCx1īۀ bu{;(rh% A{;Bɴջ=6RmSN9qAjyb^ݧV-jw~:觽OuVXu(B UH-&MkD*|!J~[1xZwW0bR˜k.ul.(F".g!CLbxx9&Nh@bʑ@<cP9noiў1HG&)dSYDhOL{0;bzt:h]TjHN#`E,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEVݺu gφ-4iVZ͛E9r$17 k{˖-ȝ;r9NJ (\L U˗/7v{'N?ӃASSScg|1#AfȐ!Nyw_^z7> 6D|[.ʖ-rʡDB;լY ԵX"~ۋZ}Nj\rFhԩS[6mڠx=ڷoڵkiӦbhѢ]H <i+V ¸(P [rxYIRR… чS ?뎵k׎$, sN]@,X@l?|=B||hxtq}+( HJ !!7n@۶mqF<~ϟ?ϸ}6Zl|ϧOߑ*,p>}sn )Pռj*FJ*033C.]ҌTkMN*ϼp8]Ettrr<_lxwcѢEiDv 0F69f̐'_hk;:65vӅcA`V$wu\bhb(_5cjժiqف2.\"5mڴ ̊(?TscaMAYB xzz fxGM|![A{ڂz~  ziP-ﵼ0D;l0TVMy4h.J_D`fIVY_~E3Gh;jKØ;Nʤ]`Q7C 2xСlBeZ<~lFA荦[Qc/>r҄w==K ojȑ#C 2Ԇټ 螡NIXP*Ŵ 15  dd>4j0U(ۼ-dQpAG64rkV{[/C \N.Bݎ 2, ߙ ={, sZa^VڵKik-;Yݑ_U0!wdXϞ=˜d{̔{w]y k#._,އpEl*3g.qwwG߾}58AhZ{վc9 ?C}@4{fE \qH~艃 K2 ۪z9]Xի86c `牚`:uHX}7-MP~}.(O{Hwk1oQj %x7egJ&SA^s >ahu1GXD+@>ڄ;Xh7D%o:  $G-! ?Α $X \RWK9s}:gbĪ!}RJb#U{4$z9ϥK"8ϱ}bb؞5kƍ  Z"u&qDk|I ֭fEuV]!&0dN1" B~+ Sϩ7XĊ)ykx]"=!]Ǟӹv$z\ E!e AGTT4ANB!5nfA.\%Z$iC(D~N ~bېHGbu;#U}}}y(FEN*eyYQČj2sγsi@ 5ALRجCf3"?,Q:dVp:nB^WN׵0 [)m2wkƽpW9vU\6]>H7ot$8D+s;6sL`% Xd\vഥ'zViK233$UPA;<+]dy7onnn/R^ %-ɕ0poFpK ǀa ~cq`DEb6 D>Ȕ$+$(dձ9qUT)1H,ժvf>@G35-c LkH/!hw罨 0]BU=6Re?zhh='c (eI,# ~E8_ GHPq$Bm྽2wѢpL[Փk !HجY3CX,G|LzΕ5.D˜Lt[rAi$Zj&$8d&1,,L#6l @0ƌ#!>@N}rҥKuacNm҈v`%(/^\gȢWasİ`i+ !H'Qp~F#D\=uнTW _rSer:?:jHnʔ)bf`{z ZK^9d?MOk%P rN b ݲ7 F)CrA i|NKZ9iqj`*\h,YDOP#,AoOfIB ̃Sb0W1E4z+`X|4<ʋ芰6\ 懰4#Pƌf[{nڴIt;k׮i3A,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEVI}h3j(… ? l"Ϟ=+>o.Ꝝ`ܿ_E J}HLLDHHhjժwο2HŊ{w*T ~o۶ Olׯ{űc\r4iU'O_~߼y^n]qݻk*UJ޽;ֲg̘!ڰ;/EG.A@u_JDGGcΝ}1-+iN_ƥK$q_?Y{qɓ ׯhӡC}fgn,&L6t)ΝcƌѨu)eʔϽ~q222MXh]xQl<ԩS`/~3c&4:!ȑ# ,0mts²׷.]s}R62x`=cǎXOworbРALnvg^z {y.]ݺuC߾}1j)-aA 0 0gH}0)nz<6AGQ{̉قObNau؎rxc0ȟ>n#Iɨ߇w%̍8qC 7y@X:{6/.X 9aCЮ멭G&hq6lyYٹS2M __L%J@Ŋ_"pDͫAP MCK`4y -\ި]} '8VŨ۱a F1ɱR-nKfS"`[z (YdL.IB`{BƔ~0|qڗ/_1 Z̙3b4DX[=!CG-iW(Z?>rŗh~pK٢L&xn_ $Rxkae믳 _D!}LeNe $LL2?j>M6R . $PY;6l R̜Yl‰$|mU7Ν;򚚡a_X |y:wZf:E"*eWp].`Vމe'<zIK`a!ۮ^Z7U,juߊ:mIwdQ}m^}i>))I|5kƍɔ0`V|4(W3Hc-[ gf/6,a-t @@GEit cgd,, lW6]30k3OCD-"W6c $*S[3-}R]*1Ky& jHd!UWIxѷb6'^M=߁Bی?^  ]L2Lv EL0b;6@c84lA֑NIg|BNM&Σuڵkq{:$`pE>" O 0%`&Ozn1%|6nWln <" HKK6)$l{E{B F+s!v!=.`X2#$W]&W @TbdMǬVer%'Z Dҹ^?^pXT{,E*Ɛ +TR@ "XE̪&#\[/B q :::&#']McYAi M8K@ vpFpHZ=[e: ~-ۣeٶ{)Tt A$%>4K=4 r?zNҩ|9%2ѷHd gcH㐙İ0QGmڴIaڦ+G4qQ{K˗/ׄ%v#'Ze$eNʼyD{a^;bXމ$`(8E%Dl".ti]# t/]—\AT bpB0_uԐɓ>It^d?MO4B/^,T`YF[94JℲڂ/P#nK,rn!UZ[&Xl7C@s:!E;%m5pL\hapo#am%rx6 j[ld!pv*?s,$aIW ҬIuc~vF= *] :Y`XV@pG=g$ڇPWs1n uD]]zVo@*`G^9'qRJ(W}mK)/!zuZ_KL4e|+U_J9 C ˀeJ%*W 0Z2iT- *The*7zL1^hmd #a% 4h1CcQʜܚWץNeGȧBHW$Z 0^r3矔=-_yZez# 9Ohxٷ"癠1 Ч =߆Y*rD(Ó 6b4vfKRlIIOOV|D% ʭ[.2?.zEPnKIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/playstore/ro_generic_rgb_wo_45.png000066400000000000000000000155361260417502300270250ustar00rootroot00000000000000PNG  IHDR-~ 9iCCPPhotoshop ICC profilexڝwTTϽwz0R޻{^Ea`(34!ED"HPĀP$VDT$(1ET,oF֋oZ/K<Qt`)LVF_{ͅ!r_zXp3NY|9,8%K.ϊ,f%f(Aˉ9a >,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEVw̽0رc߿UҥKB |srT|yuYQQQ54@8e=Cրܻwotn|9rȄzgϞ<TFE$N8ap0^j@t!aP@n޼9 p|H4~iUREիWW֬Y=RHa>]^z%SL*S9gUʔ)o~%Խ{wm%2M>g[Μ9 8MhgyF*UR59y*C J$ (ɓ|?hѢzTjUeΜlO* .lvsϸO>+WD?~`4i0/_/ÇDnݺ}Ŋ3ٳgWܹuYݻlc>#k.qFϵqpfΜ($$ijxb,8qB-[4=[oeo{L׮] nU9op~7=#*U~}C9|p0v5l0;?[=x` 4tu>[54m䯷d [kY!;ş|֬Y ȤbUzz2SjR#M35b+\WLm-_ ͪh/H,h T.ތ$Tnq j/N'4؉❙7bTz WܬJVkѩZwifZ] *TX_n wT2E}t}fϞm 2$*{s@xٿs Qx@SB-hΡ.AaL#""Vܶm1y^_Eֻ}S$ːIRUJVEA,HE煨`;98+[t-Rd[!2[ 4`33Tf{Ҹ}v0mذT))Yzj])MۚJVb<;~Do1҂ wq;np )s Xa2`|9*de̤JTmFUYFUQUZUre*ho8`NՑ'$-X7Pt Y QDU L6Z@XlZV  re֙t h ۧf]pzxZXׯ/P>M6Zm7-ֽX y̪jjnܬkUQ[5ׇVXjGW!*Io\%c'ڈn4zK;ںԯCE%NStATnT ;Le [90˲a?86Z`@пH KIHޗOx{,@ok=۷:B DnTo Sajc]8V!+7^\wQOiaw鐣E1` $:5l۷9uZ 1c| 1ČǗÇiA kذY/ Nju3L_Z2fkv!Bؘ)_myQ_n9:HܰP5ڷ]:pO?Mtik GD:jpRXP]uDczڵ3Hwޮ~^!.ZtBfR_Ȉڃ/az33ʶN*u T fm#[M2v^xXl߾6}`'bY2p5;ɾ5;AmD8A;KwԩMT3/UCW;6\:2@sB>!I"fK_u<±>#X | .~YO4h̖<!4Xo؎*Zxvl߱cVq D>C2ͬ73)7AʬF:GoRH9Q5u@mޤ-%pvR9jRZ<][r;A,jy|^٫V'7jwn:H=OtVD7ucuQp*ֿu kDڿ!ڲ}[1!F㭻;G 9&B&bk!(N"Dn fC 2!Dz!7n8ðm5|@L&-1“6ƴY'`>Mەm~cG Hhx*JO.F(5v4@}QZ]cE>S{j+u*ٶj-m/A -# ;_ww1vD ޟWfIiB>__ŌME[5jُmE8$m`G %_9;i  wk+|mshd:w.fY [A,j~^Aus;SV-*_xrןc%.l^ؤCc}]Yl9<2x6 "tw}c~wvYuu@BjEK Oѧ(XuSWJoD9_a`"* v@vQu,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEVM6F`j}>v@7oF(Q?@,Y+h*[۱bŊ驧rmKNu5飢E*_|FO3gVΜ9dCTR߀4f=cX5쾏<~aUXS4i}c>u7|Ss{\rdɒm]xq\2etρWBBB_||lٲk]nu1UZu,""B/_vmٲjŊfo>YFk׮5@:t }f͚e-[˗+66ٳ/^?ٳgO?d_7oެ;v߿{tUAim2Դi{;gpn?@4i\CCC;eʔ1j޽jݺ׬Y3m߾|jժ}aaajӦ6ٿ:ur{7 M07((HF2gϮ[H"^_4షVVrmOrʕKdm 3ԩS^13tPcr]+W,Ym6;~&e^x8́}-@x7 ,A3اO64*j!._q^z%}xW^uۏ#/ 8rέ mAj>p@SsA3NtϨ(61E 0hDgϞuz{}ύ>B'x-to ̳B_{fz_O>1}mB8!) p mty-?]P!so@@@7>'>A>S:ǺAV_QU}̋L H3 UOWӑ|r,v KxvhuH֬YM8K:z&L՚ ]*1z QEGԠa{#X?{K #D֏XoLrdy|#ؼysSpfzf':J__5*>f\9 ӘbxeȜ<ɛ^/^4=bxtdɩ˾ 0σO%*ȭרŒZ^ٚmh/R@ ;qqqIrݟ8qBW'T(J8t'Cr˖-% UY]3TunJN۬r37j⑹Zz1PZ!P@5gYҧ7 2x=@u&!}{+dZZI S Eʥ~3d[&4 gUA5 pj~Q煨͚yz7P /v*0b4ǜ9sF15 ('-!g.u| i@&g|q8 Q? AHk{{nx#G4P:zyIR ddъp-0g({'1N C(m>]bF„r^Јr<KOEÆ sBttt"h3f4!5gIϸrKUM[K BQxGnW]SFm-י3tcbiB_ie}uc{ֽҦM&mbV.*Sx2 -Gc=%\L417v*߳/3vx1hMi6Ў iD9ԫӁ1cfv{;yӀ=k ~ g 8ޟE:D)<ȧ%:ۥNvvVxš:X/EC,߬Bj4PlS6ktjGVi6ho 10oIFm Ϝs!uR!(N"MsH%! M>݄0{и? arx;mih#`7ryh{4'o2 p>=>FuD]ƨ[BZ[m4JяԡƣdžVn7 6/C]UM_odO|`j4hp tg&\R{O结T@|ʧWSZSvN?D _@TCavAxc#s"[* e@j:z߫J۴2 )K3LU !f d r-_qڳgYG) `Uq%iRO7  WER;s隳H,~yKߪWS7J ĵwʕieM~K8VvSG2g,ej|ot8@T~/QBGB1Hx$g8EjpI hsv|rww(/^.ORX @@Ǣ" g-Y-ZT,$}q(KʚWR s=V yX'_9{˗/SB4IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/playstore/sk_generic_rgb_wo_45.png000066400000000000000000000152571260417502300270220ustar00rootroot00000000000000PNG  IHDR-~ 9iCCPPhotoshop ICC profilexڝwTTϽwz0R޻{^Ea`(34!ED"HPĀP$VDT$(1ET,oF֋oZ/K<Qt`)LVF_{ͅ!r_zXp3NY|9,8%K.ϊ,f%f(Aˉ9a >,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV":u*1m"? /^7F\ B>s Љ 4bĈfbܷo_诿 ^;@2e`mm?M6Ez`bb"Q,9F9rϞ=& *$!/ݴi4h Ƒ??J*!%%wkא6mhql ʝ7?b-'P@;}4o 8瘘?c߿1c7f̘~~~8y5kp-,XP|ơ)l]$S믿Ζ +!b]BR~+v'?/^Xxb>t" h̙3C K,իW5iGb۶mpttDݺu5޽{OA64o<1ǚȀvԩSb\XX8yf@իFٴ.]C"`xN<;v~K.E||;}|'zMMCYoƍ yy3i?}T?@MCo>I.jFQD .}¿y=FrǨ5CBB`Ur~t$9?45;}РAӦMj4 3H=Z<Ќ_:jckk {{{!$ݦP<;z b=f;;;qo&Lh#25D׮]ѧO2|%p 069&L'a>^uhwh55,Ο?Q͑ 0)^yELcQFw21oV%K~P ƚ01k֬ L(wTYxcy'@Y2!C3{17}/k S 1ceS]z/ 6{RT[v3`7+DD`BQFZj"gi_u}hR[e}~H{o Sֹvo4>Â]0'87X!ܸq#M}2Jb)+òٳg'`v74[=wۃpIx!qhԖ, +WNXgOyj WՍ,lRyfZ!]2,K*[:[Xc(ij7C=)FsGw;jB#GHgp~p%!pvjoٲX;v6Y7`ޞ?S[(bgVkp,Y_U׬\Ȓ)dgY[4ax,KܣGQ"5,q5 ZE0O=y6K_sn o 38rm܂>ΞhNh]-y'^@4|'&G] "_dR WWWM?r DX'z##ӴLΝq?l/c_ewj ;ݻweQCaIϢv8  &ÊJz$~޽̙fhsVhzO/tB'/X/<]lR#“!e4q)db OfA@˿el&!@HXDϵ"x~gőVld!?~,c5 4ihkɗ/Ig H|rÆ iv6{xxQ&|jUX5P%vׯ_{]P@jÇ afBWw81" K~駯 sGB'ƀ XbWH9 upk!/濾>}|Lvڥ3tN|b ]ܹs5PYKr34[l^a˚$}?3N&M0줊ъx6r"cהl}Iy% 4G` |x}?~ !wax ya{aX+Sm'B˾A:fv:wTcsUT)H!u+8ibSzU;۷o߹EN. [RR/=BV;2?~Rt'c (e"B1~(= A@ٸ\q,&bWhQH=}QEg A\f͚>iea LNo]Fզ$z漖`b$_fI~6U:$=6ua5MWtihrի5ic6DS;R6+6l-;-0^8F ÞcpT4px4Z Sq-GJo =u >O?$:kHǎ/NR3p<#w/ꕻI tI'tŊ¦RKZn8OJ)ebqjӧ G@ity4!h40DV VZ!f|b!W'Gb cU48/*@,+ \l>Hҥ3n[7w) ߸Y ,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV ?~}Zl.\XLi7j( |A@Sfg|TRt"]x1 BBBp}!9r\#!!w̙EN2Eϓ'}e,ZHv܉H7n͟?_\f͚i BxxKtzPB8 ?0qIlܸ>*_޽{ r5]r%JNoG o4iUlp Mnee%[nI/q ݻ7ohGuΝ=z1-ܹsu+Hѣ8qئ@qmӦsT|@!^TJdjժ\ͤ/B7ICri&0B %%%~GԩSL42 h)p'QȄN۷X@ND(mVgYPoܸegg'̋VAGs„ W_뫯·~+giivaO\aWy/z'>֭3M&g X@pA`CW4aFjYrCBo"R<cv&t{&Q SL3ٔYr,Qy sb ,JI(P<=woooQ`ɟw=a?888Z!5j:.qGTZxVamO8yra:TTI8p.ÿpY0@%j@'PwaTZvW-dv$V%WLmdC*J7xA`:pW oBm^lƲmw?9?%;j,!35qj NH"&a UiY4Vɋ-Z . YdzSX̋AP ES`4yM\ި\})iVgŨ١N_Yfb2E1S{Ş={Vyj uWb{nQ&dDJf UB,YD<#;x̙3 c6$dV-[n7o8_ypNCCCVd_~wssC>}4ɚ c\A"VhZzchq-}n({ [=pplԴ|9`Q&OOOZ+ SӦMiN蹎 &٫?,2=yDן@M " QjCbe]UV^]T@v/Qlh=dEShk!s -DZ{G#a{m}C7>6&*Q6ي |lB dooaPx,J z>B"ǮZJI$:žn7W$v&hHrKgDpxVC=sLƌsIrŵا) `v=:c ee6N.,mN!8C&!.,؏6"uX`h`@O-`nn(ȃ:thVg/\GD"G~GDDmj $6A&Zz:) 8cl0zkp]wO)W6`c|BNN*Σ:g͚58.;V 1+#Z0I:\a]v,3۶mzL--&fyaÆAwix" `[yϟe8:ȭ>2b%Z|lφt^?>GrxK<8[Ըi9z `z"~N@22R=%+U&WM 8ժjJpe\$fӫ;VYA 5͠6{&iv(tu)ѿ`r2k8 Ag{$gI%.ęCpJkdzR`.Jc'`$i˖-tKhcl2ؿ3HpSzF<ځfK+Of8JJo3ɋL̖rllVdzY1ch綫 M A5>K C{S# vHY40CoxM>uš=PvD$uc:vTcsžA;葓ԭ猣Л&1)PHvK HqZ2켖lq0_BU4nE;t?pSqpڎ];wm4 {ʕ8lb Mbk2}K{L0z/kԭ\!ckc!(D#ulz]`pYId4c+@0VtihrҲetic6DS;R6Օ$3y`( F=(tW4sB|Gx8q>vfѭXWJ_rqReq:__tM;I޽dW2&YO3NŋM $3mp21$-&N(5OЇGUZ['Xt7C@s:!E%}536pJ0\hR4s|4k a©T}d{lN6_]Ir5jպ͛qE'?k$6cHSize ^Aݙ$@~G7 ZTm/Bۯǘț=Gi6PZ1eoo0zR>Ώb90inpU8Kuqu1־sN!&h_ _߃Zf_juKARս"IS$q ·~re)᫙V呱8,2~U_Ŝ } >|x ޶4X "k ұ:2:}Lc2+tuS42td({&g/rY=ޗ]W X~Y0JQX1MЇ #3KK HǁI&μL9aQ.Sd;6<{,Z!B04q7n\JIIap&_jbIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/playstore/sr_generic_rgb_wo_45.png000066400000000000000000000160221260417502300270200ustar00rootroot00000000000000PNG  IHDR-~ 9iCCPPhotoshop ICC profilexڝwTTϽwz0R޻{^Ea`(34!ED"HPĀP$VDT$(1ET,oF֋oZ/K<Qt`)LVF_{ͅ!r_zXp3NY|9,8%K.ϊ,f%f(Aˉ9a >,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEVq8-so :y 5jlٲTR"\BUXQ;wVDD#fu8/O>]=7I"'`ӧ@t8_3&q ի<TEE$K,qr0^n@w!qR@nѢ ƍ !C.\س1ch&J2}9rP˖-oW^Q̙=pݺu5dծ]۳@zGIPB:M4rzWհaC%O88T3o޼1c?G}9sz?3zձcGJʳ?SLzw4tPsoMVE5f;]tz駣i%KWO>^ԩSGҧOAPV-x۸qcm޼sL2T]v?~N8a>ΝM(v?#xf̘={3W\FR`` u?4eZ\=@zAM6M ,3z'1~z]<>ϹtR}w:wj֬㚌#{f\r @^|e5_5ʮL<6n fAtM4ɳo̙۷ok1QK,1kРJFp|o߾EzM_yse'cCddFٞ0aY"eʔڿ]t:tьVlذA?F$_?{8?M.^I2?s,M4f޳ ˷~ gGiV/h|:~&O@geTX1 8PSN5*m۶Sm6Z饗o髯2>?SDھ}d ~ɘI ~~~}4q(&!z̙͛3&E=Տ n۷O_~΄!IځF &<ڲe6mx 7:udԥK,>Ӏ? l4NѣGkذaFCGl/ٳFoc<@)k֬F#ԯ_s.("Mf?&U`(FWVͨ_{. 8MLjժ8#lYBpUVUԩ=~\rY@|sG3[nǛ\"E y~V"ټ(A"{NA"' 䩒+E䉓 r6VR'<ڔwAL9磍zfu<K)swIS!%D+}@! Y<U _ ݑ"B &&qD҄Az&MKQ]#e^J{ #7;d ]>jhUj4RIu[$K,&G4-I!%SQ{{55 &ߌ`@"cR%'oToPѫUd9M,mոSUKxRmTTT$XByV$ѝϧ~jYUr,*7_&W)k5 -:?IsPB4$Ukի̈́+qLZ& J5Pz3FPO3-)@8Yø0ir; [3p3YL6iͼތϹ92eUkTqq^ ֪kUdfJ[)'fh'i޹ڬUګ M uJy>LwAVQLs… MڂR~*g62LoFa", L$w2%m-9 OH?t=xhq79f͚L7AYUq:UUETyzU^Tbq/3O :EIg.ԲT4{WL.DnbwWSȞۼysL鹎{쀉r/5 >X5+Wzh :\LN!jpA`$UE!9,LJ1A,YUeEjl SUT}X)P~kCT) H_4qfyG7Dato*HV-䮊ŕY ',>wܸqg0VBn j!+!(8>T"Nʂ{(7S:(6RC=\|P[:3Reͦ6vv ܨZڪ9HuT7tnRmz>lVjN>YGFuf:@XG=B7}*+Y k܇ٕf*p6xww7eȁ_#;߸t9/[l@@mCwΜ9Z{능j}$'u>6q,E@ Տ=H/8®E#`57jFQqs--r>u1]-k!Zb$BCG}3C]_mcw-:,`+v0_v+X'Lນ/-f3A^^7!c\!lL/XիJ[R;7cTw5?ŏCjTZG;jpYO)tax_VVd1=vڙ v횧7 !._ܾ?7|@=.z+՛^XQdMAрjA\Yĸj2@@mlO>m: 3H,¦ݭSÿq龺udϦFB#fCV5?U pdi_:T-qp}t|&k>|$ Z}Ni[ hŶ93XpӮz~vl"bSbp2!hxvLъ40v-qݷy H#u8L/WcD}*\mN۴ïk5:*VԤViB%7&V, T\ѥJhCq44D$S@H!Vw.!'n Sk 0/q2ZFn'&?kܬ# ș]NmW۫vv] hK':+[:_۱ (bMUL=f͚k'DZ!}[1!F㭻[Q-`"d"-I~V?6wJ"/@nĉ& $A >N ㎖h?icLuю-yoT=艄aGųꠃj{_PSGt:+^_w-϶Uy㕾d18H0>_ww5vD n2UFx84bSQS \RCKmA/!@1Kv'@VrF,w1n:reWKz]G鯝jhNQ;H~rN51?%l&t(1opkұ 1SۀxvS̀4.%c;YO@ qAnuu@RQjC+M։*u__iJ`DX9c;ߓ BdR:~tBRpMڕ2%Eˡu ߮ @kbvܩ .ex+&b,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEVqЃ 8z7s=z`~  av5zIT ^y+ƍk׮E54LMM닉'U\n]dgg_)[+cܺu RSۋk-Z Bdʝ7ߓ˗/;о}{ܽ{5kw؁$q/~hgXp  ? HW:}a`ii8xx葈k8]v x#f<_~\q;w@yK1Ahz2 ɀTV  3zB2e4第0pgծ][hRJo 06oLJXI` 0Fkm.shg0.Y$LLL&+Shzc"02TjXttҨW*WF e˖!44111={~krh0j `P, (WݼP:4bx{{ f)䔔ػw>` Q)r,+5m]ty h :KQa̺}2KT.:3ׯ{O$Fk׮A'Ͻn00M*8sA h-NզP14Y\a}؃Xv_'u6)RW^ѣGʾ/{ruϝ;4af{̊)~/ˢ?8&@B+={Vϟ~Is8T{&g?.&@AP:?.|+g0{3s$-ڊlw\@2ƑC%}g;qdggi˵ܹs5'j|wo4rҥKwj(Cw=$VTmڴ 5B&MĻ(N%؆DA6kL'ѱ9#(V~ [q %m-Yc wp et $)T ed8֭(x~_pT_|8w<>A:uwHV*!%i/>--M/X@)S ***OÇbCj҇~'L<` (afN]d4><[ImمGX0zF!:Ϡ{dq7!wT`d`Y@ Â06+#GN;@`Q*IyJfŋ5믿yڲrzXZI?#++K377$ɦچK{AnTB]3uW ڳ"4ԩSE/v^{G>6gA !hI*n$3ҧtતrm<puu/sN/I!ax ۷8^z3$ Tb2L0/2nܸg@@h(lodggk6ɉG%DŽ_Jm pl޼yʀ8tjdp< ~j-A5 8eciI99^-~DBHwpGd9pa"`EVt(gc~wUonݺU O>bsm?xxGǐBW ߤ׮c~wf= *5-0a&J d8%GfLgEMg79k͛7 0z2c0YzxT.QQ*8ks#J!&h_ֿЯxAI3| Mw*kEƲ: .S^ _tHVө|Y"j)eU̩7_ 0ĕlsymSc,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEVv<ʿ!yM' Bμe@te6l؀ݻwc޽8rBBBb ԬYOX"** _5[h_۷oڵk1k,Y8d -\g*W{N:aȟ??6n(@uM=zj/M 333lٲE􏉉B*s=˕+']˭RA"Ex' 'Bhu\`捃kg+ZxF\B bo ΝΞ=[L^"-OqySXN\ӧOȾ-[Dbb"~war#.BrŋC6p¢'_ %Kr"V+Z(Zj%[ӦM}ȑm׮:t cy (R={&mcc#Ms}<^Co~7ar3uߢAo<| <|`>{$-}|dn`bg<_`^nwcfMSBH w3 V _pI?>7oNvs#FHv-I%8+Yo^"lLiݹso r+E0>6ʤ;6'1؃ qFeܦQ q{D8tȐ&s]&7o\L6ޗ ཨׯ/רQC|& } &6XR2~!&X9GF*uv~x¼EşlhΊ qzINdc%5D@;wokf̘?#E+W.ܸqC߿?1_pp^NLΝ1MǸqvӧO 0abccS$n4-44jN@BKʦMrJ⅁K 4H,,HiԼ:k)F]@tݹhz8AH9{ୀ!dr%ܥT{DvルW 2G2ƠރqI[I26|pݾ6w A6o޼$}?.PkaSOK,)&R r{@մiڻ1Mׯ RXR0z^A EGHܯ g&]ws}Ԫfrgݺu˰<v4 Ç ^)ؗ;,\o 'O4,([xqA * Ι<7IbqgSHph ҄Is L[Nh /&߽ʎ!Q rz.X]8uZw 8paǏb?Y62o~f$LۗLZ=l@P *@ G|jfC;A6~'[ț7oA2djؗ,Y"XZPjph+ɖkժ=x52,@oL^OڱQІ+Ww XV{$8U;ٽe&EĉXr֭[ D7ڍTO I.p#yKc QԾ ~pay/3mg"l\@lU^;v0LnyujZNŮ!7Q߃ -6Jc( > <=_.R0mgXszglzӻt"( 4H1\+ӆHu} fqiFvM.xZaYj9,S>Z3ĀRZs:Jc oD`3T،6.p>eL fZn6r;s 뾋{;P})'QG#i Xl#,KP gH)KIL.G5On6J$kAPBiOqYF%f٪!I< N𻸗t]3Хg 5LJb?ִ?&0əKAd#"h{.LZ*K>w `0'{A6mj]i(Y_ 0F.?g[npppHeݽ{ٗI j_aM6"oE L]xuPחUC$2!ick֬Y61mA:^dȔ,'g;{tُIH1c::Nxx&eT+2L5dV]ϺaDH6WWWC?N~4  3!#w|K׫a߱P cz{# H-Kc E heޞ& \JPuTLN)SD3ǝ $Y0LЍc;tZM S\{raRUH1_$5s )v?9>"XFSC-j !յ 2"NHLB V,pq˧h:lL˲J`P@0K3,!k׮d `" \n*L IaA:uXUgdZ3VtiY}ҚYe5jPK6L2cPxe^;6᫮z輲Dž3bQ4%XY0IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/playstore/uk_generic_rgb_wo_45.png000066400000000000000000000154741260417502300270250ustar00rootroot00000000000000PNG  IHDR-~ 9iCCPPhotoshop ICC profilexڝwTTϽwz0R޻{^Ea`(34!ED"HPĀP$VDT$(1ET,oF֋oZ/K<Qt`)LVF_{ͅ!r_zXp3NY|9,8%K.ϊ,f%f(Aˉ9a >,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEVL4I$+[ {O9r0O.]TJnڼ\ѢEOzyGUHIFM65Nҫڵk-6mZ,X3>s*Tg?9.Yd{fk?u*YRHqπו+W"bbbK<pƍ_~E}5x ={V|vޭիW{ӧNry߿hVO?S}Ǟ1Wƍ `kٲBBB6`.]K ,s'Nv C rdn<z֬Yf/4*U~XP/[ɒ%3BV۬\3gsz-{ꩧ|A5hkѢ:]SW^1{xyG?n0UF pqpXQ #}饗sϙ˹6m z26O4)&@؀g1m6l`<:x_xw| 6`@+e{~իF~r}w}8kk׮\vxSL(yھ}j֬+!c`Z+7ilu kժe9b}:|}:w >-O:hܷ ؼyTTcn bEc\O{رGr1P͎ׯ뾶x&TxD\o?#&Lu_?@ev`c=f!F} l5G3D}? H2J柬I1:[_?a>aiAٕzj^u8V*S|/_>eϞ0 LCՖ-[LH2Qkd3ZDnkAJ+y^xA˗/7L,Nn  :u X~}9sd T w/UѯgrX4mѐ+ՠH<~$u:vh~R$W!X]o>9];QsMf>hb0U<#M" Lc.'_M5CnbEr NsTn_Nw{Ds !oϠ> enwFFtVaUGʇnsᛵ\tI644ҞẶ}k_II,%KP*n1=ڀ] L vi?cPo8yJȚ -iVgK]\+FT#!x_>*JeC# ep/ [BT7j#=NՍܢjg \:V!k7^ҞҒn1G+8enzЌ3|Ip8t$k8F"t3mjvV_{ }:|a:0Z #3ʨ/eyz  ac<Ȗ7\bZu0%8:Hܰ-jt(Jv9B@oU%Vtk䭩r4A. ӵ_JJfϕa]B;sQ(=%Jfz!V@ӄӭJX@ `e.,b|5 8zhiycj`v팰it twk<k/_n[lY`kP٦f#an2t`/LKEN Ф'n$4uTu<1ͭ`- -Z,liW=ף0[2e]ږR 18 *Ttj`i">G#b`;:_GmZ3ZDDlW!~l6Dk!ps OH/|H q1}wDMcڬvDh DGav0H!5RD:hO=HW ԖgڨQlYR)F:GwkkMڝo:!q?jN>""?s9P%eM+k s]N yX\>}/R". NIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/playstore/vi_generic_rgb_wo_45.png000066400000000000000000000157341260417502300270230ustar00rootroot00000000000000PNG  IHDR-~ 9iCCPPhotoshop ICC profilexڝwTTϽwz0R޻{^Ea`(34!ED"HPĀP$VDT$(1ET,oF֋oZ/K<Qt`)LVF_{ͅ!r_zXp3NY|9,8%K.ϊ,f%f(Aˉ9a >,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV={5kBm@0CR[ggyƌwd˖M}54h˗/;O<^wĉC3f |.^K.2ݻG4r|ڴiLÇc݃oڈtEٳgyյk hϜ9Sׯ7ݿٟV5m~6-[䞿{L;wԙ3gtu?^k׮5?s- o߅i߾} 4_uVϽ,Y;7/<2m-Z0ǖ-[fv~m9r$}|M 3Yw RJe˖J&5 0nr劑 `m۶1x`=#{Y … F X`&@G !!-ZyW ;B~9p; ̙33g> YիW:6}tLO?vwN3ʶY(v[ҥ5qD 80=VXMjv-; ɼ+ f\,;j6;ԩS=ziO&M2@9rjo۶Mg6y$mc7|7o/j&ԭ>ٳg7Y\9M:գB,/_܀{عrofb`q?SNq 5$jd Q_L^,2}46e,֭aӧ7'_]OF*M^BCϞP 9\ tTiȋF%L|Y~%K 19` ٜ/B7oN<ΜM%F/U Ue*4rY;&k9Msb4m 4Ҩ]! [駟d" J_36 UBEƭUɉ5rT;W(X -ZrP2q7*"VOy],#IN1-@8ri9wq %6o7;{1dWTy~*N_JVVi*;k& 5mrVÇx 44>ẾCPU)S]H*h |Zjs3D[4xwfxihXuWmoPMtv%dU҆3L}1K]Xx_6mp(>d%cUtc8 QۜEыb׍ UP5;|FxTBVI;"n{K󜿋{IK)y)|}| AgSp@K_|Q2lM5<-aTDCf*lZ<>eq* ubT`YnRnr_#^5?Y-E'dtPmڬt@;mQ15KҿƍdTS)?vwK~3`AN%a*w?,r|ۏ3c W9afw{;!t▀ I`J;hn#׮]9 Ajyb^ݧV-jw~9(駽wVDu6(rMUΘ-}v!XI ];~[1 xZ%\FKX\ psA1![%dm #?~qa𭄯 >F h"bvRMC .Xu>;;{={g9̙"" =hr^G2NOIoFapJ*Ȓ͘9`bbccř\뙀ǭ |߯?ܼ8 v㍎tuuSM'Y=@(BIii87cGl> !AА=x!{=0Ϝ>{j2,/ȈΊUbdN<\Vfd155>cdM {LNN g]s5lg;|MY |&usYy=ڌq^?B п_nEEEe(wUffff./^oBrn@^mn֫;ihlLޞߘ2ؔxZgÍ\_={R0,x +y5@J |;{ԩ U{Ecc8??B/ZġCq/`0:ٹsi'u 0co/.6QȑTu 3hii$V~@gg*ڊh4j>`PDǷmuY13&Ԯ^M{ٝrO*ʶ'R?SPB: t40@0DCGh,Hu$9i0;H:&DFw uxXypmChni'`s䡴T܆ oBFF%X 60ZKm->~v9)΅w)'~rq78r0zɈ j e lc넫dK7.? v!hz;l$r*b:63("ەMA{O+6^ͫVZ8dIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/providers/amazonclouddrive.png000066400000000000000000000060361260417502300263760ustar00rootroot00000000000000PNG  IHDR00`ngAMA asRGB cHRMz&u0`:pQ<bKGD pHYsHHFk> IDATXÍY[Y{mogZ^]VزV"#ǐI* %@ɕ`R<@Q!$qB  bJqdK%kw=̙a̙sU>|}@ ra8'g + UشRh&foAٚ@v^hBNoR@U6([ - TSr K'3 S`,+iSQJ9ClP*A]Ҍ`f4`cB\p͂9Ô+z0.%UCIBI(>%g^$RK&ի">JĿ}&t:@|"r/pQQ0e[0_&!nq] &ߪ'4qkhRkyzpj > M-Ovԃh+n: @drO=|u_//F_>y6Jޑ SS2s7+ȿ֜1Q9((&V.7*Љ׋:r7/E1]gnb~rz60ST4rlk71'%q/&"F'>07=Db&ߛr2!l׍I\W?z;W}fy׶΋j$~O-З:z9Ca1Bq;Ǐ1vZ /_՟9{y ,MOeR$N]x㱻wܔrjWT%xe:M2= Cz0y* 7=[V\?+;lQkD%&P/%0s~#33Dxc=tǎ+[ ȉ "]3|*O]f&Uf.k6LDi G/<(H|Un@=F_%Oj/^j#I+=[FB{9:uETevtM卹#>X_xGy_|9œBOБOvCS?4:W2r)jZ?zl Q.W\i={%F@ƴ^ō7_YtJL1x(a<ijz*j^g^Y1˨c|'HUspj D'Vo__N`!ɿlhB%3wϝXx-Kr3%E`rM޿o걻OW~/\ f$aS&̷w&D %AvGnOjWC'fS?{f|gý7M4b1[?a Ϝ*0Nʲw$ IC"9|sw{󶛦kUWoW.;*Lj tw O3=ҢQQ'>Cj0Rx#Pjl3+X56%,x `ʶTcDՀ`!V%I<#5*p1dYHѬD%8F;V1PDZ %"@@%s  *%9l!7ݮNg7 Y]}Qm#A90JaF%JF'E:4ku@ ¤d#>i~@lmhP2rz)>y&kL-0xUMj4<,x٪ ~OԍzI  &wמz~^@%pҲ(Iɜx)uI1-l[ }씘 1(K{ \.~mԬt 9( AڲQ(@Ds)"FXNw42Sdd^3-g.}VXEHk#|{l+W.{T PJ7竒O\>I7>{davl5t%H\py 6qF_=6L:z>ӗ}0~'zo$;w۲ǏnڌK*!ۿ)Nt^3 A>u73V1Q΋u^WtLso b$aG[^,+2 \O(L>Vv=xhvYCb6PE=:] l7x1cp+N tr= _Zv`rBL^0ܽ e!%iO5ێ ΃`]!0'b_[&jfx&ڲzm\z%J<30PJ: PE"*GyB 77ToMovLXD1MIs7.*NH˒MI{ZdذaZ7zDi[@_b& y<0:m; 0[âeb-ώr+5l:'aB5([Ï߹k|q= L@ >"2krqfB=j-tMΩbMM Q2U0Xxy%tEXtdate:create2015-03-26T16:12:44+01:00%#_%tEXtdate:modify2014-10-23T19:09:07+02:00F7]QtEXtSoftwareAdobe ImageReadyqe<IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/providers/aol.png000066400000000000000000000017131260417502300236000ustar00rootroot00000000000000PNG  IHDR szzIDATXí6-Ax$DDDDx^HF$ڼPHDH, $sZSӻgYKe{{;Eaf^Z/WTQ 3255e299i37o,'%c0([JIYj?8?/Ɛ& ԣ:U }kprrn077WTg[7TN RJ&㳳,,,{3X-Ҙ'a@,CmBJ>\}0<<Cggg;'xk9Xcc+8Jg%GGG6,暓>.r^2CCCFrddc0RPJJ9Y:wl&.//ҒC)I 8Br %K+F'0`HVuب;|gm:Jߘ܁fV8we!B]osN9L;:#jNz_#/#766[1N٪K>4O h%'ގ˳;%8"Q}?BrW% u^ V4 I[5L-323bbjyUAfmh IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/providers/bbc.png000066400000000000000000000010651260417502300235530ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs  tIME0숖IDATX9AE-p7DO`G<hb"z ft%tA3UtSX,ʾC(%`x|>U*B?)p|f}"8Nl6zlݾfIGĠA=á /"ٌ*5 !nKNq\9jdYc*JN'^<M%f5zC^/M&!R8Tn7n5.rV%L~v:|PimhUOtRpd2R bV!dp8 @('ea0IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/providers/box.png000066400000000000000000000107221260417502300236150ustar00rootroot00000000000000PNG  IHDR00WIDATx^՚{E}r&A ,*rq re ¢%,UE-Eq]$A `IB!!3|vNwMM1o9U]oy<<9]#_O0wv@#Ě ( Z3y˛[LJ`[|GeA< i Ol!݊#ɀd@"4D{Fuh- ~vEm 5kުhN#"1; LB`@ 2 dx#G)9^^g?3DŽ~yf+ 8`?FqbO~;T#:M x:]m ٓ;( Xz/9(y tϜz׆W 1~Ⅷ,j p< zNbw$m,:pׅB l .>v&/@RTkU 'JTNup9},_\<-q3K%P#t$Fo9yaf&( Ρ6iETD"IXgBGewqaPEיCcUB AQTm\sA|atr] T>rd ڕ]Asiglx>m=r[*hi.`3oNut+B"B1 Q>; :2}R;מ1_0V7EQx gCIs&O#ԑa>Ɛ4]-Vϯ׿;t/2zxrV*U#gb DGqΝ7K6нn2Ξ勧rDW{Bj1-z"pPV߷ ,9b ױ Fa ^(bI*ԑ*LܛC8xJ;?:{.%H:gE$F٨6_8#˶hXm1`FS@ |hWTjDT3w?< =@NJ@ (T66EB Lc3%ElhPX#,@H̭@CmA[0x EA{gx7͡h 1C4{g `!()1꘤Usռ8wRH"G?pleJ) "eCU1S(F%BNG Cj XATycoOSт̉ڢ8mbB~h{$EXgJ Z)G8bV=0P\HTHI\+r%DuF)ʰc*XucK[C:uD ΐӶ='h ذKaB*PhNT\!"s"AC!Iԭɢ{\#Ĝ5"8T\-h"P8?F4j2WhT7CLIgZq[41~PV:uVAs1@ZلhbhZHe#4[5wU鷏_?ʽ+gP2jͨY?>$߿a~qjV:ï^,gZU@cS5*BoܹGlDQl}$F׀f8xR3Xs㝫x4@$t.:Xv1%eÝOgw1q|&ɳ6,ʖ-^ݹʱ) oW?u ;/]o}W6 Άj[|s ~/QP7߻^÷uϘ1m P@#0T!Q(l?ri^o~j/N(pAӸp'sGqТcgwn]Yl-A #U `(eʄvwbL 8/)ͼټuemO"eO=s?݊ʴ)|ᮧ(,]OǷn*%?X c;_=E1 p~iڭ p2:" JV!Ҫ*.=cǶY )KIe) }g3MZu#{+zgcquv38ZZp-+=5g=~.{ P$E$`jb{"UUSe\{P!lM #9&ؒVLzO7M*[6y]33}DFP^K @z Yƶ{j" 8q8[qeQm;pHMTTHf_Y }{iŚsM2X}=p(.2TGC]æ^5:9it#Qa*7Fϋ[wQjcwỷ:8{fÖÚ ~4hΛ3Ų0ЬYcCE޾SXFgQ+h3{h%u*,6 [gOM@(X6ȿܴ=M1)S Fg@2}PG4ּ `ӛvjBPE:JB {rVO2}\yAyӸK=D<ǔqT'm| @Q @1$3'r1 L3|Ƈ{oƥgOD-O.9 .~ۭ\}g8%EH+Î˞FKϪx|vWp¡]\~Q8 Ǘozc۞WlJ8W(Ӌ  ;fN`?O?{ s*=bSw(Hb#7|D4maxsΔ c\Ѭ+ӹ+wMCgh(P3oY9uթ|}(bYx;Bpz[LW-fw俿t ߸!zȚ嚋1X^u:|j!}f1}t6FqUq 8YLמNhVn4\!Xc&%D )Qf:>,D**[v2|of3X+QgMٓM1 bk|tv79 Hp"5ԞN:j ^T鈧D hEi]Ȁ-F 3ԚBfW[4Z* )̃YCx#7X1&5`樚n Duf BlD=#WVF'AM ))LDCi^:O J `A` G&wTqh < ߆@)ahGMMb!f6ԙZ`R6 *Q-@GݽiRM\p6W %i*: F谚 QS!NPK{I\v^i5^@ ճmNJ}(Ea'P3/|$6ʙMv DЄ¢,sZGJL N Er9EIl ܿO8 `pMKv5kp9Z3G$ eY&e@|'xpQq֡6|)2 2jK=sFi+=Tܹl vNOK*T=u͞sOQS׶2eNϸ"Ih2yY89lQ c/;MQ5x ެ޾W6һ[^gCwT#DGU8];\E>^ì"]ERF-jhb\㼂)E/g٢;w_j٥@GWP}oT39?mc;i 9ZJAe{HrPT $eD$0SqG0u4`[׮|}f#Pjdm|4g6ٿi5}N|9; 4&#$,r"2'E: jJ)4yg6Uzq5Cu5k~\]{E=kvnx2?hQn)Ύ{aIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/providers/cdbaby.png000066400000000000000000000007441260417502300242540ustar00rootroot00000000000000PNG  IHDRa vpAg\ƭbKGD pHYsHHFk>oIDAT8˝KKQP"Yy̒4M **iA`C*hU*AD-ZoqƎh!laB~@ V?Ʊ{q)sa/Nn)=!rT+!IPzW`![!6K6RWey>GiMgϐ1 jyB(o_'Xk9͠\1yxE0˙d, R5'#"(Qr,26oFbԐ.d:(" &J{D70v.4mr wa^==Խm; ތix* Zzᱞ IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/providers/digitallyimported-32.png000066400000000000000000000022641260417502300267770ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYsMWtIME "-!v||tEXtCommentCreated with GIMPWIDATX;U^`!+BP(Ho:HJ+hgaM!1(Q|BI$Wܛ3{3sf&)l̞=kk9y'+^\Iʹ5og0_4mM}fR[FV>;{07>`Hlo$8zjPͥQ/)z̯/ ?tY<2t2-0+X$ d)dd@V D(M+xttiׄIn,ak9QA0,'\wXm!Lo  u1 /9_:GV;#{v;FSƉ+0uT.[l3s3<~q$^pW }Ca83{gapfvI4WYjThCOԺXsO#wA C$0!@|,YX:wݙ9MAapB(TV_(]]T jPS{y<66T17%qL۫n oiIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/providers/digitallyimported.png000066400000000000000000000002661260417502300265550ustar00rootroot00000000000000PNG  IHDRasRGBbKGD pHYs  tIME)3釩6IDAT8c`H?nMI ki&xC,~v d"8bibsIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/providers/dropbox.png000066400000000000000000000066231260417502300245070ustar00rootroot00000000000000PNG  IHDR00WbKGD pHYsHHFk> 3IDATh͚Klu}37[Ȓ68FMhдeM]Q-iWAQ]u[PډmٖʑdeIO=3{Ç( p1syRIYl$ɂ~+UiQE%?"`;V-:s_C~tb]mV.f/2ZyUyFhr z5SFR+IZCezӓ$S{G뮽 kW0]+Ā1y֐wEF`9j5}6 Ov4(i%fn)"gmj Y4bWr0$7>$Jv;zHO1`\bljϮSK(`9!@zWnaqa,.'Dڇ;#yUp(,;ؿ[a,Ki -F{ܨTI* vՌ]ʹ6\} Y\dbݮR>0T$53`đ#0L12φzA1>(,2Vu PmG!j=';ZozA584b*QlnՐÚᙃ|"* ZU}}P\EeҌ,Sں)vP,؍dSh 'm}eę n:7S/r,_.r@AރAK{ƮdPC1t=@{D[)w+?QV^ JKǻ[?bf%Z *hX+j;,m,\N7Dp^5(@$eevtl>Rd(7YYK& 봜M{elp]N *Dq>5 ΢3~s,#<Vp)ʛTHc02re6~Q TH{x ֳ%`t aMdP i{o/QݷѵĆ};"z-CIP,.xBU)+RM|>۪>So"r \%:XVzFjUvw[L/%Ũ>&#?xc6a3%&th)SKJ+mNR'eR?+8KrV{7j,"ށf"b@#}/k^ u]M)s.[JJ5e`sΒ`͚3ֽ~i:.V8@BT7Y%Ю6kܞ\FYVu ؞P@JzB24́;)F BM4QJ[` 'T9q|-PBdh6{-\Z>P'3>͐ط=X# ~<;7F7PaeMi yKyJEOS,4C)[^}q֘89Jؑd{ ]v4 LYܚg5|}8f+'2~io&9f(֯^_߹̊Xo42ɡXC9#4S޿r{1K<]lFB)F&G)%FU*"b̞= %#*Ehcn8y#tFlGvPM2NÛ3*.';iDh94 Y!::[Eu[3jfXm[po{3"GXuWXhֵjqa|jx꩝݃vhi^3E z,{;ji.o14dYࣳm3\!|,]} pVXN<#g1=9ѧw!qq:֛ ± mdh_kԘ495S'؂[ljtÚBa:fg>8 q;HFˆrI6LR맫Β {R>8O>[QbShˣ` U_M_4ddueC[M Ei-z]Mf:YI8uf+Bi}!'sA4bb"T5K{ܵ(hCXx2KI$鱴9yN}B fT* %Zb! Jo!wuOY2LQ|U 0}B5΂Nz 6"bر ,)~KfY݈{gh1$?k\"\~[c[g?=~{fŎ"6 u2_G03W^({}B-9ɹ[Lpxwޅ޵a=ir'޽µe$1+϶@^٪h$^7G?^J]MQp6;u*=rަuŽ,BďGeunޚx{Q>O*x\|S]btr #ĹG_HBUU|[)0~R> g_g0QA ȪNJv'3XJ3x N9}_'^̽n]^?R䊵/Tq_U-?d]ac,.'\2G2 QbPɍO?H:Qۿ<+UGBƂ % .t{ Kmѫ/.1~N]VK%~Nҥ_,?A?z[]L*b!/m4TQ9!O|_^ uD0IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/providers/echonest.png000066400000000000000000000004651260417502300246400ustar00rootroot00000000000000PNG  IHDRa vpAg\ƭbKGD pHYsHHFk>IDAT8˵ 0E={R,` jwкgYO 2D2'wQ~k+qUߊ `=@r `%ь-ԘT۞h L仑5~7-'~0Ro Ij226pѺA`d"yHl晈6$ r>kטk|H9&|gR^/~rIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/providers/googledrive.png000066400000000000000000000041441260417502300253340ustar00rootroot00000000000000PNG  IHDR00W+IDAThZIlEzVg\ " aāC.\b$Hg/\I"B PX$AbLwkӎci{*_>Ǐ/o:g4n-"?40>YuJoBW71xn8a`mO6ˡ~e>5A>sprUkߠn ~Hq`  Xo^߽*5F]+Uh*A!ZxƀC?1LY&k<5ˀ_{{>hl/D1zCNUE^XD @zmf- ,Җfsp^,4nH'ګ4kDP/v:cMaƮ7p&BC&IZGRdo  9WYc(A-^9#Kz@ tFDf27g1 03c+!5(z'臢l 13 2EPMȁ걽Qc@!i* yPB8$ Hg  dI1QO3c0ׁ]7u:BlkTR4]F[}oamɰN':orzv-FB&PukC@bd|"}O(Q ")̧dd7Yގl&ѹQk ]r.]RP̴Uf&NAuqnFN=W.7s&~U KЏJ dddW ^Af,TrCnx5?n9@zR5. ^ݻt;FEBI9 ݹJ涢^C؝Us0~!2 TFFsT,Ѩ:j-p(܃7ΐ:)Vͪ8Kԏol2,$4 '(EEmQtQm/z/P+D& }lɄ3#FG 8h6(8N`TQT*! Emddt=}ӓLk>NFLH1MidFQ,a[wEB.3b0do #o[珟ɣ yPi }/غS X !R끑l D\q~ZЗ{WR9+E K6.ВrpJCtNXs>z^G422IĹz=.륹3Fџ5񘡪PMy|X\: E:mkz e3k9@Yh'ܱ\HwrM5"`2iG89ݕ71Zޙ+k%7~:%|Jo*84#^WA%^}Jw҂^? \ 5>gfNdC/98|4>VEPj8q.4DQzh!!k|B+~ H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧ|_ cHRMz%u0`:o_F pHYs   |IDATX]luw%CdI%ba+Bmn KNS.E4 60ZhSqhqڢn؎cU_%%s\rwgwΝSvHcz̽c ΰ5}?1hN4 ;mvX~cU*r 0b@iR1X fIFr,'˅ȍ5)і4 L ҲHӔ?z8c۔<zaЋ"QVܠ$$MJ1RJ;ҍ/ttkrC=~?>s`4%1 A"l"#8TRM|@aɰKksǟ͵lnn)yqdۀ_tPz}FquZQ2mX=i眿Ç=r7t]Ha9.GӑȠKq t84!M%bJAz)eYV2,iaYI$ Bk+m󭂫je*Ţ_P K,N8N2eIlf0`A.Dy{Rt՟S{է{o|/a4ceh%k>~',/M ayǶ0$"(" $IB[}SFPu/{Ji9SK_|&FŵzZѡ9QZSj5,Vz« DqF#,CXKXAsmFtakW(Izxl~ofx͉+3MVc;w-8M} T)!,~@R,u\Zkbvkݻw&B=H :3{G͎e+$ssY[;`Zٻw$I}0F!|7 l9i/ZMWHig&''Q" EۢZ2s,i1111>===ÂWrqLɉ^G5J)8˕V[52wPc˂WhMQ\Z'Jժ=>6vڏ666F Y22`@IJǨD+_?cmas[[ٳΑ|J(bxLDk3c mF^wkEju(" ~O~@# C\yG7⟾]LgsKVO9ruFq­rgszar x{mm/|? J)4N( `轔W( '|os^ (IR^yy;e]4MIҔ,GO>bl)M/yb$ 1Ҕe~z)|Gp|h>؈4[݄VoHvϜ$Rremp9$ i",?Fʀ卄^J4Ra(U ےセƺgQ?FҔ w_y Ö6j9hw~=?0]Zk$ 4oFh94e{H,n/agFdkgz|UP((ryS?/Ju6MDM{hD{VH}p+U 9qĮbwVFo~~_x?7OlCS>tffe\twrl:Kg\Y(p-Aiǥg_z#Ew/~8;bH˱);6jfv3{\//iV*4k>:ϝ?_ox.`\}L3}ʝjOX"56UZNp!`H-|d#TJvj(enIͦg3_1 < F e`xo'1qF8<Åv_Ir֫0VΓ*`EfB'/nK>G8=7dh`~kYL|tZe\XOD㦗NMv5h@v[/}K; gJUH5[,7}kjRhG!{zwٷsDNBO@,XDH;htb&oѸ=cNʥr$:GADDHG#/_>)^X1> G~>9+"}2 )ڦR$=H&bۚkIF ښ[$@q$,_:DԴw{'+V-gz7a@x82:(sĢADӨ)3')AT'0\vեēQfsw(~L!9x`p/ޔ[# 7"144dZJˬ:1~98W fRO(`XV!FΞ8͗4Wѹl!{%,a^>YK+rntR]4oЪR3|9akUVwtc7"T4LHf})+e6fWTRC$Y!Q``VKPM0gNPg}pJ] |1O<0|Y٤`m0"(zznrbŸmlC~3#܇)œDRִTD֪g̀A oBǧքH0rz6u]xppc[T vG؍ T56 *]oP6wTئ-!ﱓLg.;]{Anc[`VY6=/&Y` wZIc6hY-e4>=ad&IDAT8c(`bO f|4%͊ߜ߃o_Pϒo `y_? n>pH3@hHdb %`lr= ## \,WZ _hO0 `| ixP(3- ^(ċI2`M%({a8XoukxYوl( ~VhR¦@v&T&S S6(2A"%IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/providers/magnatune.png000066400000000000000000000115501260417502300250040ustar00rootroot00000000000000PNG  IHDRddpTsRGBbKGD pHYs㑤"tIME4> yIDATx]  )ȱ;{s(x^ȥ1BBJ =` 2(*G luϛffܻT힝{s8 $ȕQo'}/00x'*!U԰vz=*}d$6W6hg!ux@16񌪌"L@ 2?M{'RMdTBQ{(vU*Cq?e*!0@,*KZ#r74j1ws]l}iwafs Q!v <2כ:\PRyM_5_3$#WtMj̬ ]0{W&eS䆵klBg66}nBٙP[PdatZTc < M߃um6^ x#q"a`C9!Ҫ`uRwڜ<d(lzaP>^Ss{BQ&#k=,~݆~j[ʤ#N]ѨxX} q(gQS<*(Rs+F?mhvy}RR&I ^joY׸Do5u"e& bgmj5廃V}B^%~BMt}A72jݏz0XԺ例ח0P`A;$a Lƭ t7n"*I̦0% *m4J3Zf'pb@D.F=ѷպ=O$ĢE0T~( { ң\ lXTAAAK.2(ԼB{5b9QT% _ͦ""Q}@6:02zz ʘB VԄq '%AAS@T.(۬a(d3o(F^/g,NDX^8"7Pjwbr.ey2 I/myJt 9#!cz0O[e|&gOz!ԭ,Ц-Tk|&˄Us]r8ltkfw/O ]CX$b*xC6dF}oju](0Ɏ xHJcq7pRK5X? MT945@(}CS:N": 0\"U cf" &? #6 iAƨB"1WRPӣ}R6Z?56&wʺ,@X׮a`Ƨ}ɀڹ[sR!-7 ed: ľGxSjBeS?CKa am}S0h t7d0<"a0et@t4YSe5$N]/ljlw('kiֵ achN~_ [txƮTJ#d6 :X{վvl̋Zja~: K?RƳ& +[J4@+V+~ |@t tSdG,UZ$+bLFRf%ҖΏF_{pġ:^w4^M15K'B7G\Z8'Fme,/ ]ƃ+M4{r # BYN! w_x,ebAg5ƅ^mGiq pަq6QS[YbgWd'ұK|BouxEv(5y^K"cƒ[+d3'g\||{isVmjy$ȗ$@&q[˓!- Vug_ $sQs,l?:mʟEj/ұGI ",I$%,2F|`QW+,%Ʀ 9SH3^לg6@bnCjo/s)+gBp) y>'s<,b:bw:U!Ո!?dݾ1EHXr󬞽HGfIkao!JJd/Zme9F̜v+'|ZH.3?jb>s8e,|I˫؞ d& :uW넭h9Hf^t7Uz{.K [1)R ^j}3^@D_vHi+ⱑp2!,p+7ƀ Ѽ'I0{al[ b_ Ur)"?)#*>5ςrǚrYEK]f:J dy78M'c2YQɿ!w-\C?iy t@,n|N*rUS}g|^)GNϤxZwڵ2 b9;of l p^dzH$n=NI=.%tHY@3vm*cfz0Rۈ$Ğ_F,/,O󉷢 5Cg4tZ*TXj:P^|cE-` L6; p( Հ_ښAJIH3 ݼ$C{mh E7tDFkR^VXN_{Ƿc S#lJ\C}|篘Q0ʸ`?(עzvl+k쾔cl ;6w]0gcnq5+~1 Fwo&U 5~9:(߰C}uv8&J)ώ+ہ;,2oD]c 12 q}/i3?|.P} <0#;b811z(#f I떋$ЮiN\-k0X=+z4qt;;Z AwKʴ1IȥkŬm]SQc-#<^ .Xq"8ot )bВA d>7R?(eSEf.FKgSUZUdzx?1Xg&J^-_f\[HְEkYIj :VO/O*?DTh;e8v?;fֆL؜PGc8gnk. -9^+v *AUebN IOCRja&r&e'mi8 4Br] O(9fFSYɷ,%<֠G;chڽV>M\G+v#PZ͟dSc*'D$2@]Vőچ^%OpH|duu)S 1/Fv"O`zEnQO9:VC[,qSq¾yHޯ9jp skTRg5V.Qy`&fvE8ZLˆ2PR/CWϬB¢jeZ0J-N ґ磐|9E5ܚ)4'?y$gal 2J]JJivqRKm|2ϬZnW^Z8ϭصRr7`5 s2`By!;B|6if'LsE8WPޅg{h>d]p356: `_YJͶ=7XJ|`*bĎxqҺ,L-mcn0IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/providers/mog.png000066400000000000000000000004201260417502300236010ustar00rootroot00000000000000PNG  IHDRa vpAg\ƭbKGD pHYsHHFk>IDAT8c`@ @aX.TX4clߣns +1 Cw yZfAb 94C d 6Ȇd? 5zP  53\/PE# *IDIvb1L^6IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/providers/mtvmusic.png000066400000000000000000000011431260417502300246710ustar00rootroot00000000000000PNG  IHDRa vpAg\ƭbKGD pHYsHHFk>IDAT8˭KUA_VAP*$Ee)RnL2 BMyD%vE7M<{oszu{f=fNYHQ6qa$Cq9DP0p[5 *u}5ԭY贼O'6A7ơ!.O@RTsXݜ?3_HDA{} T?Y=yi 4' Hq ]u} => uu $T E?=/~"iͪ%~?nGtA\|Q5F%jhv"Qf%07 R^iI5vN\Dvn%Iy1SPצX?}QnnC:M6l#-|%ii퍆 v΁(B] 0e028[~2Rzi[ٰݾn)[ne+#IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/providers/musicbrainz.png000066400000000000000000000031131260417502300253470ustar00rootroot00000000000000PNG  IHDR&GbKGD pHYs  tIME   IDATHǽViLTWQ":Ⱦ86 +qAh}e_iaMkj֤mn֮<`mow9߹3f?c!q]S"xϒsA/9%1B!NC0zzلYHf?Ɇ1pIrNHLgHH22z)|_gPXy\iiYp%'.ȋYC\#,pnk8<3*Ucd| &o7PZG+"@lA: (9CIr|td9>H@sFS vUx~ڧӁ j|aG&{p)\\Kw#W#C*lCqi{*9.HpuWyBBqep%QEh%h7QJ6Ӈח5#%B77HevqE]"YXVubÎrocSY[ M-x;qlKs0K,mc-DDii^18S*xaan׮R ZlWNz+ND!?Ue`%n~*}p}oב5uۻ!_+~usn&/b0ESIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/providers/mygpo32.png000066400000000000000000000054221260417502300243260ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs B(xtIME!V IDATXåypu?Ui_0ZHY%c!60=xLچǙNKɤu &lX6?$aS'ifs{ι{O )Ez>,}_޼aw8Wo&4YWщę|j4>gvpOj7_߸iݒ[ ^rRJ"WD'yp/#U~ȯwygo]s}˚}-"ѷ"Y 3c08S6)c1XZ5MF|67v@%w2XWIdz@`>:Gye+k* v!eH\~ꨫ3DJk s}U$2<.޹rm]}~%Ǹ87H*[ҥLGG9IM^#a Oq>K,xӗд1«O A۴ly`MpSuKded ':F}F8'صwin8T翏 뚔Ĺ;uK+*sg,j]vݷKz.8΢߂b!z *JذHR pVQʤ0W問$CyXtWz =ex챯 IJ,<^403CkkBLIJ,{U,Fn`QXG7|+G_Ax m41M`N ,RZXi7evyOw&(^ӧǚ'/Ogu;)~~P:D?Cz:55h1 1ڠSQ dpִ 1 znKe)+έt=(\oMPL0w+cY׋iוh;۶hk#a?gM""X|$4 2\(8KօUU'x, 0CH'E*ܴ4Mv !,a&܇!I]mf-f2n*\[6٬Eu{zaO/399 CX 31>RÇ-o@;_BYvѿMT*>ο<毎_p'_Gk{>OI^?+x?ѱ1ʊycڽGoV+<Ɗ;= OW2J Aj#v=؀rzr喿(5~f}[/Z22yK/'e3SQVH{} hmᝏ7$d; ϯ9eKTzyAK6Dp8N !y=dY0~tb D'\:>"MPhm% \ CI|KKLML%3 R GZ zWvvwa-Z, n `І8+L<__m` SӺy1Ykk}yZ@:$bf`q,\Dz>B00%"R٠5~$/'?(7Қa ,-tq3?|4 oI0J@0\/, tu3d'qLuL:-31a :8Gz,O-ŧdO45MJJӌIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/providers/myspace.png000066400000000000000000000020441260417502300244640ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs  tIME %slIDATX Ladz͝B.,F5wIд0\.vHn%5rKRjIn \!\J)|s:<|>}﨩3S'kDLLLILLڭMQ4-@|[`K[2q(S.֡Gf_kp<8 F>\x5u?I~KU |B9%:;xmYs}fۅ,%Uɻ;ŎH.A+D((~’7]o*-Sg<*~-@(JދTB Kܑ^+?l]DI=tmr[SE^wKCW0l m`Ӿ`9W(@y}ALG/=;^ww2tp;V\d`L ge7`Q$?(/Fg`TL[퉜'e( `*O4%7&O! ̵l,qU?YJV]cˁP?d8bmb[1%E@yҞId/E܅YP $j)4L^b{4VCOXsWI }f J/ Ka0+L}b;4[_/-3fJf3qn2f RS!<"QM'>B4(>~ Tʨ+UPACv &`ϱp9n` oC!A81y2yЀl~m)ob3UR-0c`b7.zGe=lTUGxIe啈I76he _bm ʤ!~3^ni4׮[ t ] NEQ\t`Gˬ\U3]c]I%0PoMn0ށIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/providers/podcast16.png000066400000000000000000000013271260417502300246320ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<iIDAT8}SIOSQ??‰ĥFaE!h%Hp8!q!Uٸ6(іG:wBw3||tsztɂHBVDly_ckG~b˰lB͌DI6=vXSA'N( Neǽ~7ONs")c$^^SE(>T)8s[cd'AA2|Jä!pێh ̳^-'=64k\xT/\v>8aȯ JV3çK2G]\vnve-TF@=벥GNv :\2 n/( U=oH/h@>G2,wфPeN{0wV#$:^oGl9p[˖N{;:c&j:󂧽߳w.;H0v?CY5Wu%U%kw{^j=曪tmGQ@ AU遑gM/xL_gZ jƓz(m vޣ `pnMmd%#i[u+uDβLi/: g,xU<%=|U竳"594B.' R\c>MnY y- 1BREW: ƾGi5A0K۲S0^q<[ -hYýmaΣ* p&nsT!m\eL5SDaF|,7MQ;k/Ѹ]h&fFH wʒo2a襝j)ˇ Y$:ۦ>N wjE#Gg.7ʆk-I6 pǾEp;vx R^b8D- ۛ! lC&yv$_ñ\ݭ0ۋEYz]~ su_Z( HVüDG : + ̰[ !vbv ԂxNܩ6vX|b |Y&"b8 ;|upYq lۧ.*z* GۃtPnQsag kV1W9g$nXhm/ ` ]oIvww |pRԷn]%ҧ 8R+[DCL! N&zaC劜+ajvl`פMRu5Fv6R &Ȟ7M)8$;:s> (<'zӖO&8|(hi~g=k/ݰKK"?_7/.KFGIk3]-:no' 6(aU/ ľ~gʤHJTuI۹嵇P xw㣰 r2J UgLrCP$dCʵ-yT P# g۸+ *8uS'>z?yr{6`:fz6cnQ?腵pXVa8Z~ -qgjzMcI=mOȋ:l)cirmV̽國J P;@~>w⧺S~dzQo>{]!Q̰e˸$bmh-ny~/fDwDH1TiX.>ձG+bjϗcm#8'i"v ˖B}~+| k$V"I NZşr~BMDAP4. YktqlWF,'Y'כTq\_wbUS92LZHp֚o+m}9TcjT/$ɔEu;R;<>nk?/󺐁6x hm'8 D\zٙ_+P$k5:"piw}(uOel"m]w03LW-ٍfO>-3+qSl_t8eGmCqlKі(Aw;Q,]+*}U&|p%FIm{6|_TTQݔR F8guk$4 b6eR۝%}ڍ{HMc1YT15=O`e0iתr .j7ꥒ3 ] jSׂs%{pz[fN"v7?l1!ԑ0jhUJ&" ݪT<++gup`h`cT) X)gєl+UnD6RK"!Kx]“a P'R&eӾ>;j}o5Q 01o߾hm:o|ey45@ kMgpX [=mWKCXwaS_5Rgr3P JEU-tD;:y 1 =ߺDҟtR[K'V#;y.xp>ANf/\E=d\/Dls?长VS|߻4:n}k]jPT>_տdh-ß_ӣu7BrcδCwIm!kWIOI|Qp2AhVm[0z>"_4>FZ%@@z{W1vefEǺp R5K1=(Msw,**]7=sﱜ9fp .{=Tο8fSs\#qަ+;EJzsIVjZ :;|ꊝ KKKB/ )[IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/providers/skydrive.png000066400000000000000000000066151260417502300246730ustar00rootroot00000000000000PNG  IHDR00W 9iCCPPhotoshop ICC profilehޝwTTϽwz0R޻{^Ea`(34!ED"HPĀP$VDT$(1ET,oF֋oZ/K<Qt`)LVF_{ͅ!r_zXp3NY|9,8%K.ϊ,f%f(Aˉ9a >,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEVXgpA|uXwtGRީg6:n+),cׁ!k/~ ɰ_1f0c &|<5X/% @! ~ZqdL5S Lu<;Zxpǥ1*PHeG;߂`|x]ܓBpB*DRJyl亾 =^=8d XRREi8bRN7p(x˔z7 A'N`ygc Ա/wAk;-ȼIG˂,Uf.8EE@NzS IDAT8]SKHQ>2 A)A6QPepQ&A.(զԅX"Fآ0hBͅ搐Q3{:>{=;;\"dX ؄Il/]]uQh9"p$?5GPD[XĻA(PKA+BG$PjzA hd>s3oNppEU\4WTuRj&E= at:F#{/ C`$A7;s\_V}ny,>_MH @T&JqKQ&Ey%(="dâD\ t/?@?.FSD5DI{$A '݃rY5a48TeH7߯ad O'w@kH'OrQ}rJ6bm  n e喓εi.NHF֞&[1"HiiS(kNXRX'NӴP|VJD![q$RT_y;!JF(ٞQJ~`]K84 J; O4}y9^hPIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/providers/soundcloud.png000066400000000000000000000622271260417502300252130ustar00rootroot00000000000000PNG  IHDR\rfd^IDATx^A0 D87`ф'E6e=eOjy @ʏ&nu;}}ϰ?<(V |ve Pnm<5;v@g~z浓}`1^L1\EV_}}/;oa͙[> kmk9g._XH+o{ϗu_E@,5!$_+vixrS ^zYPlՠ}]`ݽ>b@1~?;ttyQ 7eBຫ~|o#޽{ prjH 18iLRPm\F˜rPy?)#]FQ1Tgz/s0_lF]DFKwȶ<ػW7u9 f7w[2h` X! W-]_?8_n0ZF/+e~׿l4_<;tIk 6uHm :`%HUPX#jc@/t5Ay9)v290J Ϯm"`? XSXPF\ށ]d,u:'^Ege/l5 Zw}tJ)xK y'wmFxꙀw&n05BkQT u" 9{yza]1;to7Q2kwɈE$v&{ŗa#ϠF@bH} qD@hhuO/21K/.eƷ]Fk{0s ڻT$tXS}Q"1cY laĀ!,܇PZLw@wא~X1̠8i!1Fe=3 |Xw̾҂PD׶?DS k@`<­g!3fv%hOXŐE0y=,\]O\*UH_WGn#CCș{/3oi8ȃe*2.4`x^ƆQnهK(*2G z+Mb]X )]{Pۼ ~'HzӒnK}s!^@|%!3#Le 8@7pS8}.x|/ y=62^yj<|n hQzi '{e_:XY'0# uQSQ&:7{NDL6ܓ #u;;x?9R Ͽq7%żt`-lټx)!tw`Ѭ7Diw1>WEȺʫk޹h.W>:Ae>7c('kM1)>D87`kA k~GbA꘼}k޷]J>gǾ @u @{b~oZ  p3 3ڹ kn1@3{E$_ J s"d%BH0Di*J:ef 1O{H&L=u $k=o2Qd/u@ם\wG0uJ?^ @R] @dW+TC^CZ@|ir+Q@t{楊I[o 0;&EB-.?Tg_2y<&zR5HMf 05K 6>z]P @0}S#H sDk.;yGv\l\btpAsK֪w @y !Y3[bA뵰8d1" AiȊgCϽ{ Q[XF-.H489 Xf|=&{)fϢ{XҐh޷q럝8tG2;h"IEo OCojޒw/%ٶ: ey%ĐF *@V nzy¢g[ Po;Ӌd "&Q+A)'Hm"(` A@- C;/ -hrא.,T` 0G-O y$> Y-ekvO|4f᠏?cm,N 2. E *B5e^>;jmU\}үZ0 2>G.BJ4BlQM4vPS\x"'b|P$>$K xCt0t/ { A*UW.jC?$ Ph휙ЀB?Fc]^,{ӵ_} 0ko c~?Qg6-,1OKCZ.G gI2YI^̵S!"OD 5?LhgGSQ*@.ܾqQ i @W3Ƣ!gރfHOtiw*4#E ꛁc^Wï eTֵ_lM]{3 upɎ ~ADW:Duy@KB6fNil`Ý@Afƒ~|хÁ32v5?uai|8{xyko-x`Ԫ&}9\uc:h Ac%үLybEAJg(LZ e/8_L-~A^` iEu2h̜!0`r˺“\~1p) {%f0a6 Kߥnڀ@ɩ>΁+ëSkQvpj5@+B E(GB\P'rQ RkҪz bހ-Qi/(* X]ywMׯ>=Bkj:_<ҧE o%+赩n.GɏXO)SfUSHh5z{N {Y;)S~O5D "| 7}҇_ i͎/}ǥWw"F h$. {W/XHuÅ_TQAYOW EuW|7AoH L1+\'Px#(:g9#_j߳sO?TJˍ޴"8Ecjs[ry?_G@sx+>"Sx ZX )PͤRȋd~e~VЙ=}y76UnJJt/fq/ވF8 D: j {uA{BA,nPфF6_M n'YXȗ! ۉ.S!AN,5Zh'9}S>r4bDf5h1heǰ[aT2)\cB$;9{2u6{fw5ID!j (>H%bDK o"/ɃŠAC H6&3;=sw(k9Ω>_BMFV B'8 u1 , k;٦`FاeU{e Tʮ Bql,Wנ6p=$s\u%~s  G!6c2jb"F&& 7c܀kT@vA>ڒ^ P(au&e0s("lFڟ9bH`&0Yrwe.o <}w f]dra@oG"7C:NJIxO\F8B܃KN;KC\35ڟ~^I"1׼=@&>D'Z(mz rHes?S7aD]P79nr~_Ga[~.baxj򺠈g V=m:BH#;]R۬BnWn2E*ֿweNPL tP┑v@Rt.1kyg3MlDUUb—(xU1- I:ܫZ^w}]:]<
Oayhx_!JZAyLfpvZx[._Z 3H:=`Um=UC=|WJgP.?yPڱ^i/旇i@|oK/Pn.^O HێBfv?m)rs=Zu>5'h>pp*w⻬~Āj76)IJ@ Ԣxג2C( ݤ$>8]sNā/^lB.7QpR~n݋;rZEU'6J@YvB쩩w! U6::*Vfa :Mh9VuQ5: ]x"XevO뱲'rY+*hU`q9t] x  Z-03S|Wġza*ok|>XC"Z,#P ,sx.J[9Q P= e) P!2:`kS-iNY Z͉6# #zA~'C߿A_y0Bϼ.儀g4uDgI\m/{= ZܱLA)r2~W]|\ [ɳY0 [{%r`0. Ac˛\~kxFH"gm--") gB5$ si4%ekt߈9kIW\~ZFx/sY> pbOB+IAQℵW(|֐i /QO h. @#&GuDs )8C/@U~a(.Ao޵gx)oK#aof}#4?\s5/lVoT,J>h7Z[/+lA{篑/ UvkOPUj\"<>9 L R Xtc8@oVvx8{ ~VIC"`Ƀ_]dL"4Bw'.L{ˮ /Pg0nA z~72e^!v@N&[I_ V,r2fml mwN݂ 73ZI@1̨4RcF4|@x1k9P鋭2$_e,)b'Y:~9޲gIn +e@l=dL2(y]2R8WɃFyׯWz1#' L ^әo@(}G&{`6Hz!8=.~K {;Ŋ p2eu} xmçEbE;Do{s̗#HӢ Xfr=mKZ N:BjHxfxB+יbEa( 퐀ۓ/@uPU;pHo`SI \ O^K<)3412{pZ~eށHj^F#vv[lKT(9{g 3OJAOn@ީ)(Yw\_VTbE G[l@>2kpE) kҌj6A) ܀f@9rʱgdxb + !C* 3 w<=6Ǣ@r #=xɁPc›Лkk琟} QW FBhwǜBѥ F,xY[KOfXayJچaCJހ<l1p@(Nuh<Ȯ2(̈ <BG~ gK/`g"Fxk+(nO(i׀۪@)Jb D~5٩ŵ5 d Z7݊yhQVH%vxQ]Y|3xxwm2,s@AWs@hw,$`^ 77sh߼f: YF̡R>p"k) %0Yz.qaE:mP;1XHo|/:7)л^! 9\81=BM+"!?1!Y+`]~؆:Wncȟmw9Ml>pG`}~EmD)NwO+?6W/`s+ȿM`jf3#G$T;Sx(z6+:})BJK yhvY[G5D-X;:<&s4U37)ojȇ޾>tn]TZGƑG32 =A pdD["tYqKFX65z}6C:ƻZ:q oalryv:=:f(z {֢i e)2y&c𙇐:Ϳ g4I;p[?!W :]QLG b%R$k o?\񳕗7o>0s} ~Cc-g%]qG^{!l=[ P}61Dđd * Ue!14]d/D=pwJ̧GTo}V'0x?/,=|s> 0[25 U֛B6UTg(-0^v؟9| kKek`-9yޛv c-V T@,%͏B6%$ d HѺ*%" mhS %&6X<̼yw^.ms^k֎uY8|v!yPV'(w]n痲:,Oq7}q(s *,$GB)2[ӰR w~=y5 ^WĄ5p̟n)uvtĵc{`bEV1]-i].a#hnV(\GЕиbFtB' a2:m5/;o| _GmxȾUs`g3;vmő~%2>_{ )\ҳP6G9j^f1@t"_k1+XSh?1C0)s5b99x8Oaٴ]cG{- i4- rfBgg{:b+a8_=ѵr9(]絍1Hx-hj,E3SO~OCඑǝ`ٓXp{'|MŻ߁ۜl>mާk z~_0_̿%wv}Aa)Y9+<$'&o!i 5 ^"(=zlw _Hgx_[e'FdaHUk`'åwi6U $ xA팸A v"9st}h>F 3y_:Gh$yZxdJUs^aMҖכz~@OsǠ$4T&!BRkZ]@3'*  BA@G8>_ Xcg~'㨿F8e:˘ΖT8aAYMք ~$XH±74;㬴W:@ /?۳e[/dL'£TCS. `M{/CMs,(xdX|Zi)md}NR9284>{Df֐xA!P&n$̿ǰ*"` ~fd0"W>?#KR8 0p+Xb5~ISZꡟ.Z& W >hHŰ7$枵(QUx"B 4Հ:!8W!f~ɸ0XcG@@̗R}&nT@) %qUq#k i͕33n4d7} w~#S!Ba@ 1`砓Nw s;:_cѨ)$)"n2˯%/?>_@/2V^>Es C*ȒxX+| 30( h z_JP"|T^ 6lI26t!j pL!@bTT&n9iR-\[-b$dhRbK<44ANg@JEJӀD  kR@\֒BnAb3o7q2ɠ.|kRA_:>K@Iռ|?j́*2(w9t8PUFP)h],^"ؕw-j FyJ3(Hh`ֳ~;gÀ>sQc&BIjq#97'u H_R^58  yf{ 'k0JE\`cI L;@"Pڟz0F B}noh6 iFW$T"sFI'ټcq掃U, 2u؊D#OgTo$'w7ݯDz[:_x{_}G =FSPHv ӄǔ5] pP?P/Dp!w,uGkF[fv}l$s1eØA 8b"5nr Wi,FU1 }1' @ѵl*3؆G'!ਛpc]^z?RS{?;]aO+x;7=)J~.yEA+h EM<,%I|9И*L2 oDrU/zN#8?Bm˽ k&-íJү6NOA sapk{OD@5?comK_su=+ߡ\S}."$autˀSo;XgvrGgpJWuM ̋f4hcݸs0&MQ#]EyZn >S bćW͹ X[Rr$i>)'pGrV CMG-=N @Lހles9RpjD,삧|1<*M:*IbKBN@ w"X7ɫ^P] MZ|Fzhw&$Ql&+0 +:9+0*i4aィxF/i"BAQ~IB- xc7Eila ?E|'Ɂ`'ި,Hҷљoɳ1{=~z"@K 00Pt4 ?1fX#K"AY+m(3*!4`)O@8v0_3#.ie~ڟÃM/ t. b (%as@ AJK6zmg l8V՚u2G#: =.F)k~ AHNc>S]Nx& \]GOpg`;zO;J,x9JٖFƖ1-q8wl!(0[*\x˻]S$vf~k*؆sS#&g ILo!Usy}1%R?Z'@XZ|qD I9 8zLCv.xڀ15~<WUQl%+O?-/V: `#p}DZ"賆^X ZHCe31}A*'7f)(0E+3bENd UﱏΞEeAv+u+d`ڃyL4v-t?/̂7Îܔʵ|_MVVda;.=}, vg o;dEd xF26`t ]kؗjZI➷"l)./1e'F& S(׽2OYq\b Lp gr:&LNmB/߄!}?3zwa^%Px6LDʥ2T3@PL;U+(_O `+(R[nKNfN=9~rSc-7$N3Q$<D8<|P'EKB)P8>! I}ЏS"`-KE hɉq]< 4GЧo1! ts.z$l&A85 [%VKƉ2@[grc#c~WY yX@T'3>MX\F$+g1Dzgon P' y:)l>&$Q]tXμw_[7 N&5@1b6ppZ>i.̣(GHc@Q]cATNjn\L|X/Q@LFr4wّVBmA*)dc@JKW0T%)TZCr߯ 6&]mW`˨-ZY<ϑ/_["d)VRGͥQҜR^E\E_*ڑS(=v?]{(O'q o疡Ni=uӳeDf͡ox|U =<$ESHG#L] *Z X\1hya4?I]oWN 794iҺ\HXt^AF`ynث=,C+ }k}$9_[ڟ_qr+U\*\Ɛ^=1X՟!/>(qw֡u-¸SE,w~ fp+3}.d|@g$Sn {&pg ~C>gS ,!P{#Cm vﵝ="f~ږ"иTn>qyL1Ebb޹Ѩ+,n#$N P%a\Kbu}{ nw a O̐a>Ӄ@\al\tc5$a,S8J탍X\K9:X 9rL=ang}v.rm"g䟾{{/Vi0#?Mə5ycxٸ4Cnhpl=K.l]4&%0yVdU5!`C_h$~`g\-x=!nc_RXpdc!uh)Β؂K?cϒP$tajH@&[NDF XN LBZ1 0\%w( :.`ى?dx_e_@[Ѓ-$ %Ln׀F4Ek3. i]?̝[.ى["KaCh]o_rϊ ?^'][,p1{ރ%b AD8.@u/[D}'GY{JX Hc21ӝ?gr$Ax !@'O9I|"^܆VXB#t2CoߋzDZ$_f>5;Xsm*V&cJm_419ͼ,"4κ$ E=1Lnw6|iFC=4w7Fj01wL%G07{[H4c10:-(]b[+EE(<dN2読)}Pw0Ӥ^B0<$n6ՀŁ@[ |@mCAk.^̎]΀֗,@EHoZo^ --oGIz]h^wB'¦0yٹsl%w @p?080AoaĒAHTp`&qd)Z7@F\&gX3Lr 8$+"hg$ $$XlsFC]>phn޺̸!xOu~ٴ|8x|lA@YU)O?l揣?\ |zY21yrydtL#+cΑhtH͏ E䁅`w%KflO( y+&fPk\ ֿeJ@Q\h,DhJP)>}o!'`XQh#<k+8Hr?:wZ^5`Va&S2?EPEEB<2"m_Pc0X|Xe|L脐1;_7&a냓4mPi>:A r@gAa7[ݧ(+@۸rLϿ}@ ߤQB3 Õ2kKyw4ezDkH;(ue>%v)4kjDm=`ͷY98Ds ן7~n}+A׏ Nj  ǿf\\{'o@!5PQ49|/BnX O(Q/?DؗјQ-{S80{HΣ_>>YcavŌ̍'ڟֿC-{}ӻ:C:{ɹ ?y JC$:Y x=07|aO"A^ Ft}itOBOt _z9@}w-qC-eH֞=!H4.^ֳ&ѡ$fx @ @7[eovT/,~uY/ILd 8ZAH(cEEF@1 JAYd&-eډ33oީҧ*շwJS &@]}V cw8b#ooS15X !]|kfl !>csfuWյa7af?7p`*@$mPkPmꆊmi?1X5Dj^E6u/m"h{*x@j%vLČ %#߿mxdZg9Ϭ7[4!84湮pۑe*5/{oA/m%1  鄂ȱXm{T7_20[)dh(A).v5-ISbkJTy15 t#b' p2+eV:`c@m]\G;Bl0 &;) @f/xMj 6樜!+Y'rP1[K<ꚥŢ" xLe*AQ4Pm~~H` O)V`܉,;1ۛ1GX+R0 * !dɶxbu[AѦ*"|*X!{RKGa4#,Qz.^̴bW`*Sa/+q' Q B@ б`mP`(eZA9">NMrL\_1-l?nx"( 0挡zKb6 ZqPΨL~~0# 2j!ԍ@A`_s;@$ᒱrp*]J@^1R#欎BXm5h*lB)ꃪ6^怵 A c28W:&s[D`6%Ƨ>T,0tf=K(ظ#dK?QwHa]ge#}|"b L"eт A?5RAFӓY’uX^h ATc_7 ;၄Ds$7!l`&*#u<@94g&†F֏p=}ӈ5Txu#$k|kC|şz $]\p`=Ft+O+Se@3$s`P!EEA {=X9xxBQ}wq q\cܟlӒB ; b90n]a\w0N%0!V=t &F?#q~vJV8\0ZpfƴiGʈBKW/mlc{ . pܝ]K40Fp~\}̝<Ï&D@BU\ތw3bc8Xg6~xa=L O2LFҨ!a6%;٦Qؗ[5[_CiQdn~K?S?uY|l&?0?1&|M{\/<\oy4ZH`8)"3Σig}ZT P `.;YAڢ} K^=!~qgL%Uc"Aq_NY\[>[>'+Ce?&л殟2ЂfFݙeTؿKx_dVJ @=P6{z#bāߞWlgΒ[o-C3͔ rA?V SE-2!(_ ӀlVx[⿸D&>O@rf<i R LPeāM")IKgRQK Gҫ'Ik6k#?Wg<7<]p8w'AH js)bq],?{O?016H_13wd"hpfppHd,. JqgB2 > a/BK"F!3'KNpĽuzqH$GaƚJB:3oC3AF=Ag0f' 8T};HO/}cV~!TWr3ߒa 7̀ ,H6&^'"8(IACL`%%|~x4Kj Ti#;Hpz}c6,-:*P<)OiLZZIG}+1Css9߳{W?]p]?X  )=v=P\fv}Ī'fATf4Ҋ Ȏ ' _vq|*BFzbP2\y\77=@hf"4^ဿJP>$tVK<ݠ '_w+D:ȼ?|Oo}ퟛXDt0wm6UЄ xi޳Kn4GFꀀ,B8ғ6]#="t\KYZM?H|P\DK!S2<"\03̴9?`YQoMgT @ȳx]߼޷¿vGEĹY( B}%XHK ZV\lF]s>5k)ٛl?<^'9}oˠr{DC0^UXˀAEU[-/. CvIAwʇ~*j'x5@?:;?WV ;*|!0D(C8=He/C&}5*]-)4kc iG{L<u.-,8աUeCwg]attG~}#/-paa_}GE[@Tw1|?\uCKĢ'Vpf*#*URY"d,^ho68µo ?X'G>'B)!X ~<zNcΖ/Fq/p ;YO>_}g>`$ ZـSvGY`)YHlo*lg%Q|'ӘGUu.OQ}V̏xG2l7Ϋ.BX[B-eDӠ |pzߔEǪ}qK+\8cM& -8ݿ^0JvY Hu?/ ,{0qf'4"t0j\y? Gݦ]@1 q(eaWOg){ayr"_X-8;vD_//,+@ahD Ԉ@V{{v2D`A욡3eP歫]un ,+VnUe`5JLۧ @ #V@O+|g ,?{=l%7\! B?xvRs"!!Tڵ oy{88͡nH/9^8Eĝ{D@}c~߻{ٝ#?$/Sog p=q=I"l HU3}sw@,ap##t 9UtmOF=7wޑjox!X,jEԧ3~#/%'0 &'cW%WXl|1k "Z#_: ̎lox?I8Xg / kqVK~^Ma00IXz)sJqEL!FD ę`,f{S8*F*='zO{wA>F~p̃ᖿ lkZ.aX w;O+bP~|HLƈX &p]&Z#plǤp?aG5z]hg7l:SjK Xܰc9&qߠ}/_g7ŋğ&u|F~J𖇮|'“x[eqbf0H,IQ}:vb`XsSi ,^"TeG,z7gZ@]Lu@g {Ȧ0_\?x,<=xb;JU ~\*àԂyo#=b$虨J$"$5Z h_lc׆qCۃ,9kM*9 @q?>.!k~0@Dp+tcP_PPei0 1hDAW?^?}y$+}GDf pt]C %mpnם+aqAo58E'f*Vm'Ó{ ۯ}qn;WC;m}xcÒ/?ϾxJ/=^<D5 #?"ՠs v0=Zp񝯿;^sav+vK8ӽ5.ζr;yD""Ã>pmWz}/ЧhchH kٚௗ!BSU'$:Rmb[^oVP۸G2U?B=ʊJԝ#u°RSkgXn 8"$ŊtW]^Po A_{v +D}M$|acNϵ}`SmJ];F7ׇo vM]vPQk:v}qխjbܗ6Z! "@q_ ,ǵx̴F `_AU';T@*}wo  v`a"̇{QäI9a]d DsCxŵ#mc잢'|!^JjSk< _|Uդqp6̤.j1֣CyYQtosPK6-5@HcAiܛaD;G US?:C6Οi*L'+]Sƌ4-Z;e^KLh&Dx/&!F7~O`=~  07QIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/providers/subsonic-32.png000066400000000000000000000031261260417502300250740ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs>M>M(tIME  6;xIDATXV}LU>r.ߠJVt˖jk,9M Im.*M /P@MA?o]f\>.9W$5pg{y>W73̩枵5D1Z2-%'rqqu[` O4ϴ^[˷R2S&c3Erlk1~06ytΧz1mc|8:]+L ai"5E8ԟۼ?Ɖ;S ̻ՑDL10&>Et<%QyHe;>?(pw^/I:I2gE\{L .1]cEJɋ{QxytQLB$4O6Lia !  "яhF;i6ˍv={ܬwƶdG:(ERA 0Ia ;!j"=!t,D Qc,Y@ GH^grsx EFp\Nռ3eNQy7˔`re!sP0xp 8tF@H. dcPw|$th7 UTT)o^7L{xjoD!:8PDF" >p.@)q<;a㉯ēt% #A\&̃4~ ޤt7V:؜  Ic|}~L GѤB!!N37 BY"O;uЕk/`̣$1W`7~K1oSˡ,̛LT$4nlY A"CHКHj!d"sW[CorEN6vD]_V ɲ`1qI62lrs9f^$BbAL[Qexvv u|,ZD 3% Xo+*1M1\cul#_Eȅ@j:.252CP%D*Up g*rH%@$w-ҵ\?qz/ Bx^!NG~""=JlHb68;OQ؝(4NfB  B:,0W@DX/'=NN 0?5DfALuKO%&]Kѷ]szVT ;翤;R_? r%:P)k3l|1Yw;1\> |FT)=xX|1xXb֋ cӽ^bnJɎ vru]_n86f8qnb(QF~-p}޷a@8`Shs( 0X M5HT eĨӿ0;CÀy k=;䑏}+>Fx,h[v9IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/providers/subsonic.png000066400000000000000000000012311260417502300246450ustar00rootroot00000000000000PNG  IHDRasRGBbKGD pHYs>M>M(tIME  7%TIDAT8SKTq=͛yƙ^jJ XhQA(- '@DH3!" ,E"D\:oH6{9 M\AF mث]~z$`%%F`- `%*W钴HׄX0oȾ>D}g D"F7^xMr,e} 4| jf6; M4= 7_{tkNKxFDD9DX7z&$\1_ěwk&aqm'IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/providers/vk.png000066400000000000000000000043571260417502300234540ustar00rootroot00000000000000PNG  IHDR@@iqIDATxpTW?޷d b0!hmR*0ʔjA#c3v*8:t:NI-TJ[L4(@YBzfwf7!Y |w?{睷Oh0ZRF hoRmXr3E$=0 p\b`ʅSO]u%%EWr0W-Z|(ZR<x{cM[ִf-).JաjѴp$0sqq&pKB0tNH~thp8dZ.o8X04d~r:T@x )f64fZ3·N$ D|E(R"E@EfB@'܍k~h?J߃_r7'iqb5b]GڍC\~**)x> CE]/?qI7Ь1>@J r׃sq۱swi#h. 'ǁyd7d&iQد'Xu}x^BH*.Vy}D17ۭKǝ$!|?~3![1j3Ȇ0M ˲ 1Jbg.^F#o5^ jL5S:昖ea붖G\i`c!lu,≱pY@5@ ={_LcЎKJڭRy&&# B d˲pL,#{;lXZ3up BpQ9R DR%-jQT_o`ޣH)mIɓGݵY_aro_у 1o"DJa,DRJo7_&2?fu;mP c{)%}wg/ J8K RpmPZ~f1!~2GCI4K[y=Ŝ}0}> lY@PSEa;C>>6¾=іf>Ia֌9)czmuR\Vϲu;0)e뢄L%{w7za#4M>/3S_P㱽c1(rgm-76 (H hҲL3!=zQ:>Gn ~n.F\=}9u #U{S$B"P֖bgplwtnk J`Vo\獍{p:q!G1[vl>҃BzzzB373eLa~yGm)X!nզHRz^?xz D(Iu7Lp$=.pP]o3ZYroA϶l? 9)PKo"ÕIZZpu5\.W\'x^i6R\z=2+R uaknd IT< 7`ABEd D wy=(*Ka\rzt#/+}YL`u}T\Tױv>?ʈ.CťRU?{m5 A RԴa(vfgXV;^zF ň&KBJVs&D)lyPR"-8t2i[:՘ ?2 ZD+j Uq7S@ORu@2IBpb.:D`D긤 gS&T٩ӡ08m44t[ۖ;v%[KBvy>OnH9O62dwgs2x;L6~89n+:VL6QT+]1Ǎl1KW?z8knm4#~vCoC̲ `0"PIb`ˎ^Cú-zIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/providers/wikipedia.png000066400000000000000000000062031260417502300247720ustar00rootroot00000000000000PNG  IHDR szz 9iCCPPhotoshop ICC profileXÝwTTϽwz0R޻{^Ea`(34!ED"HPĀP$VDT$(1ET,oF֋oZ/K<Qt`)LVF_{ͅ!r_zXp3NY|9,8%K.ϊ,f%f(Aˉ9a >,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEVR*q1W?L~%8My `4IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/rainbowdash.png000066400000000000000000000046651260417502300233220ustar00rootroot00000000000000PNG  IHDR516}gAMA a cHRMz&u0`:pQ<9PLTEldƝv5>3f-y@pͬ̆tRNS@fbKGDHIDATx c& -9ޒ;$!>l! lm2c@Z9`oʱ***Pg"\p *]4Yiev*HEޱe^goLk`b!ьƷ@'Bd9JbںBOjf^nq?H%c"*Bk\]cJT$$[-&U5QcQ/E2kmamI[H;_DƐԦɥ@"s]ROYTHZwl+bWvu B" n Z uUǚ:mFUg:X ""*x@\VTdL>.\'S*\5#Cp$:+Щ^R^SOp꟣Qo,sS|l./ zp$@lCgT5DTUTz1;!ᄩ)DuD 2ziܤ=X} xEžȣ֢n/"YJڟ\/1O=o"ez)0oC3s: Wx/QOG{h׹z'-zzYz9KzޱJZoXYFdtQ2s5Ĥ2`;kx7oa^4Z8\^[ j,&&$T~aL*Ҝ+GƱ."ln3z1i*E'b=m=$3Ç^G8a*4"_ +U>tƽє pU6; )LxV>׋UDn!Ƭ?{aALXRǵmR֫ZiZ`;_v87RO>nQ+g#ⱑz%@=7g;pC1]K=awEdJz cz܊NHӣY^vKQV frԱҭ懱^uibdžO5? ]M )16b}Z9^"?5NVr=)/VO<+}o#?QEȲ267g"?KT>3O(swH#?;+;+fᦩ!3jv8V5fw8⠲Okc8Cc8uRpʆ+c8yԆg e3Du Axr ʙ i 'rDzp!1JSg} 'HwzI 'u4"Km pp] g1xWPu~]ΞpB=̡3Tv h+O=8Wz__)N zB\ A ̅NfU:&?{B\ - $_ߑPI(DIB5̅3~k =sg.dTo@\]̅^v8{B\x0g׫jٞ$EcVkwgrk:"zgq)hWv8{\J\H]4=s!|̅cV|SC"375աzjoM zzzҳ׳~|_zY~eEcS/:XT%*-:'iE"byܪ8z٩B%gYUօ9thUUNӄ}˨r220h*upz@h#oɭrǃk˷vG LzS>=\r2ɲ ;T\O+*yB#^E2TTŲdxf5XW]5 $$8IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/sample.mood000077500000000000000000000007651260417502300224540ustar00rootroot00000000000000`# - V_ ,HN%3; @Q --;4u0|9P8=;<7/?2n,UՕ8JĿ0[ν|yvbXϰ+,NMhBp# [+?2$$c-#ŭH4”yprtهuڴWR3TB*q 5^/:8 ,g{)<      "% F7# 5+<295-$BD% 7n=\\eKo{OCOGpGvIBԎP_r{z\tag\s}9L:f)ZR2Xt[ YlM#$   q37RCl9W@^sn4g9D- zTQ1{w*"clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/000077500000000000000000000000001260417502300215405ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/device-schema.sql000066400000000000000000000034531260417502300247630ustar00rootroot00000000000000CREATE TABLE device_%deviceid_directories ( path TEXT NOT NULL, subdirs INTEGER NOT NULL ); CREATE TABLE device_%deviceid_subdirectories ( directory INTEGER NOT NULL, path TEXT NOT NULL, mtime INTEGER NOT NULL ); CREATE TABLE device_%deviceid_songs ( /* Metadata from taglib */ title TEXT, album TEXT, artist TEXT, albumartist TEXT, composer TEXT, track INTEGER, disc INTEGER, bpm REAL, year INTEGER, genre TEXT, comment TEXT, compilation INTEGER, length INTEGER, bitrate INTEGER, samplerate INTEGER, /* Information about the file on disk */ directory INTEGER NOT NULL, filename TEXT NOT NULL, mtime INTEGER NOT NULL, ctime INTEGER NOT NULL, filesize INTEGER NOT NULL, sampler INTEGER NOT NULL DEFAULT 0, art_automatic TEXT, art_manual TEXT, filetype INTEGER NOT NULL DEFAULT 0, playcount INTEGER NOT NULL DEFAULT 0, lastplayed INTEGER, rating INTEGER, forced_compilation_on INTEGER NOT NULL DEFAULT 0, forced_compilation_off INTEGER NOT NULL DEFAULT 0, effective_compilation NOT NULL DEFAULT 0, skipcount INTEGER NOT NULL DEFAULT 0, score INTEGER NOT NULL DEFAULT 0, beginning NOT NULL DEFAULT 0, cue_path TEXT, unavailable INTEGER DEFAULT 0, effective_albumartist TEXT, etag TEXT, performer TEXT, grouping TEXT, lyrics TEXT, originalyear INTEGER, effective_originalyear INTEGER ); CREATE INDEX idx_device_%deviceid_songs_album ON device_%deviceid_songs (album); CREATE INDEX idx_device_%deviceid_songs_comp_artist ON device_%deviceid_songs (effective_compilation, artist); CREATE VIRTUAL TABLE device_%deviceid_fts USING fts3( ftstitle, ftsalbum, ftsartist, ftsalbumartist, ftscomposer, ftsperformer, ftsgrouping, ftsgenre, ftscomment, tokenize=unicode ); UPDATE devices SET schema_version=0 WHERE ROWID=%deviceid; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/jamendo.sql000066400000000000000000000031111260417502300236720ustar00rootroot00000000000000/* Schema should be kept identical to the "songs" table, even though most of it isn't used by jamendo */ CREATE TABLE jamendo.songs ( title TEXT, album TEXT, artist TEXT, albumartist TEXT, composer TEXT, track INTEGER, disc INTEGER, bpm REAL, year INTEGER, genre TEXT, comment TEXT, compilation INTEGER, length INTEGER, bitrate INTEGER, samplerate INTEGER, directory INTEGER NOT NULL, filename TEXT NOT NULL, mtime INTEGER NOT NULL, ctime INTEGER NOT NULL, filesize INTEGER NOT NULL, sampler INTEGER NOT NULL DEFAULT 0, art_automatic TEXT, art_manual TEXT, filetype INTEGER NOT NULL DEFAULT 0, playcount INTEGER NOT NULL DEFAULT 0, lastplayed INTEGER, rating INTEGER, forced_compilation_on INTEGER NOT NULL DEFAULT 0, forced_compilation_off INTEGER NOT NULL DEFAULT 0, effective_compilation NOT NULL DEFAULT 0, skipcount NOT NULL DEFAULT 0, score NOT NULL DEFAULT 0, beginning NOT NULL DEFAULT 0, cue_path TEXT, unavailable INTEGER DEFAULT 0, effective_albumartist TEXT, etag TEXT, performer TEXT, grouping TEXT, lyrics TEXT, originalyear INTEGER, effective_originalyear INTEGER ); CREATE VIRTUAL TABLE jamendo.songs_fts USING fts3( ftstitle, ftsalbum, ftsartist, ftsalbumartist, ftscomposer, ftsperformer, ftsgrouping, ftsgenre, ftscomment, tokenize=unicode ); CREATE INDEX jamendo.idx_jamendo_comp_artist ON songs (effective_compilation, artist); CREATE TABLE jamendo.track_ids ( songs_row_id INTEGER PRIMARY KEY, track_id INTEGER ); CREATE INDEX jamendo.idx_jamendo_track_id ON track_ids(track_id); clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-1.sql000066400000000000000000000001471260417502300236610ustar00rootroot00000000000000ALTER TABLE songs ADD COLUMN sampler INTEGER NOT NULL DEFAULT 0; UPDATE schema_version SET version=1; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-10.sql000066400000000000000000000001621260417502300237360ustar00rootroot00000000000000ALTER TABLE playlists ADD COLUMN last_played INTEGER NOT NULL DEFAULT -1; UPDATE schema_version SET version=10; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-11.sql000066400000000000000000000001561260417502300237420ustar00rootroot00000000000000ALTER TABLE playlists ADD COLUMN ui_order INTEGER NOT NULL DEFAULT 0; UPDATE schema_version SET version=11; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-12.sql000066400000000000000000000001051260417502300237350ustar00rootroot00000000000000DELETE FROM magnatune_songs; UPDATE schema_version SET version=12; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-13.sql000066400000000000000000000014711260417502300237450ustar00rootroot00000000000000CREATE VIRTUAL TABLE songs_fts USING fts3( ftstitle, ftsalbum, ftsartist, ftsalbumartist, ftscomposer, ftsgenre, ftscomment, tokenize=unicode ); CREATE VIRTUAL TABLE magnatune_songs_fts USING fts3( ftstitle, ftsalbum, ftsartist, ftsalbumartist, ftscomposer, ftsgenre, ftscomment, tokenize=unicode ); INSERT INTO songs_fts (ROWID, ftstitle, ftsalbum, ftsartist, ftsalbumartist, ftscomposer, ftsgenre, ftscomment) SELECT ROWID, title, album, artist, albumartist, composer, genre, comment FROM songs; INSERT INTO magnatune_songs_fts (ROWID, ftstitle, ftsalbum, ftsartist, ftsalbumartist, ftscomposer, ftsgenre, ftscomment) SELECT ROWID, title, album, artist, albumartist, composer, genre, comment FROM magnatune_songs; CREATE INDEX idx_album ON songs (album); UPDATE schema_version SET version=13; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-14.sql000066400000000000000000000002161260417502300237420ustar00rootroot00000000000000CREATE TABLE devices ( unique_id TEXT NOT NULL, friendly_name TEXT, size INTEGER, icon TEXT ); UPDATE schema_version SET version=14; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-15.sql000066400000000000000000000001621260417502300237430ustar00rootroot00000000000000ALTER TABLE devices ADD COLUMN schema_version INTEGER NOT NULL DEFAULT 0; UPDATE schema_version SET version=15; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-16.sql000066400000000000000000000010471260417502300237470ustar00rootroot00000000000000UPDATE songs SET title = "" WHERE title IS NULL; UPDATE songs SET album = "" WHERE album IS NULL; UPDATE songs SET artist = "" WHERE artist IS NULL; UPDATE songs SET albumartist = "" WHERE albumartist IS NULL; UPDATE songs SET composer = "" WHERE composer IS NULL; UPDATE songs SET genre = "" WHERE genre IS NULL; UPDATE songs SET track = -1 WHERE track IS NULL; UPDATE songs SET disc = -1 WHERE disc IS NULL; UPDATE songs SET bpm = -1 WHERE bpm IS NULL; UPDATE songs SET year = -1 WHERE year IS NULL; UPDATE schema_version SET version=16; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-17.sql000066400000000000000000000002571260417502300237520ustar00rootroot00000000000000ALTER TABLE devices ADD COLUMN transcode_mode NOT NULL DEFAULT 3; ALTER TABLE devices ADD COLUMN transcode_format NOT NULL DEFAULT 5; UPDATE schema_version SET version=17; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-18.sql000066400000000000000000000001651260417502300237510ustar00rootroot00000000000000ALTER TABLE %allsongstables ADD COLUMN skipcount INTEGER NOT NULL DEFAULT 0; UPDATE schema_version SET version=18; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-19.sql000066400000000000000000000001611260417502300237460ustar00rootroot00000000000000ALTER TABLE %allsongstables ADD COLUMN score INTEGER NOT NULL DEFAULT 0; UPDATE schema_version SET version=19; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-2.sql000066400000000000000000000002061260417502300236560ustar00rootroot00000000000000ALTER TABLE songs ADD COLUMN art_automatic TEXT; ALTER TABLE songs ADD COLUMN art_manual TEXT; UPDATE schema_version SET version=2; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-20.sql000066400000000000000000000002431260417502300237370ustar00rootroot00000000000000ALTER TABLE playlists ADD COLUMN dynamic_playlist_type TEXT; ALTER TABLE playlists ADD COLUMN dynamic_playlist_data BLOB; UPDATE schema_version SET version=20; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-21.sql000066400000000000000000000025011260417502300237370ustar00rootroot00000000000000/* Schema should be kept identical to the "songs" table, even though most of it isn't used by jamendo */ CREATE TABLE jamendo.songs ( title TEXT, album TEXT, artist TEXT, albumartist TEXT, composer TEXT, track INTEGER, disc INTEGER, bpm REAL, year INTEGER, genre TEXT, comment TEXT, compilation INTEGER, length INTEGER, bitrate INTEGER, samplerate INTEGER, directory INTEGER NOT NULL, filename TEXT NOT NULL, mtime INTEGER NOT NULL, ctime INTEGER NOT NULL, filesize INTEGER NOT NULL, sampler INTEGER NOT NULL DEFAULT 0, art_automatic TEXT, art_manual TEXT, filetype INTEGER NOT NULL DEFAULT 0, playcount INTEGER NOT NULL DEFAULT 0, lastplayed INTEGER, rating INTEGER, forced_compilation_on INTEGER NOT NULL DEFAULT 0, forced_compilation_off INTEGER NOT NULL DEFAULT 0, effective_compilation NOT NULL DEFAULT 0, skipcount NOT NULL DEFAULT 0, score NOT NULL DEFAULT 0 ); CREATE VIRTUAL TABLE jamendo.songs_fts USING fts3( ftstitle, ftsalbum, ftsartist, ftsalbumartist, ftscomposer, ftsgenre, ftscomment, tokenize=unicode ); CREATE INDEX jamendo.idx_jamendo_comp_artist ON songs (effective_compilation, artist); CREATE TABLE jamendo.track_ids ( songs_row_id INTEGER PRIMARY KEY, track_id INTEGER ); CREATE INDEX jamendo.idx_jamendo_track_id ON track_ids(track_id); clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-22.sql000066400000000000000000000004661260417502300237500ustar00rootroot00000000000000CREATE TABLE icecast_stations ( name TEXT, url TEXT, mime_type TEXT, bitrate INTEGER, channels INTEGER, samplerate INTEGER, genre TEXT ); CREATE INDEX idx_icecast_genres ON icecast_stations(genre); CREATE INDEX idx_icecast_name ON icecast_stations(name); UPDATE schema_version SET version=22; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-23.sql000066400000000000000000000001671260417502300237470ustar00rootroot00000000000000ALTER TABLE playlists ADD COLUMN dynamic_playlist_backend TEXT DEFAULT "songs"; UPDATE schema_version SET version=23; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-24.sql000066400000000000000000000001641260417502300237450ustar00rootroot00000000000000ALTER TABLE %allsongstables ADD COLUMN beginning INTEGER NOT NULL DEFAULT 0; UPDATE schema_version SET version=24; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-25.sql000066400000000000000000000001351260417502300237440ustar00rootroot00000000000000ALTER TABLE %allsongstables ADD COLUMN cue_path TEXT; UPDATE schema_version SET version=25; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-26.sql000066400000000000000000000002261260417502300237460ustar00rootroot00000000000000ALTER TABLE playlist_items ADD COLUMN beginning INTEGER; ALTER TABLE playlist_items ADD COLUMN cue_path TEXT; UPDATE schema_version SET version=26; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-27.sql000066400000000000000000000004761260417502300237560ustar00rootroot00000000000000CREATE INDEX idx_title ON songs (title); CREATE VIEW duplicated_songs as select artist dup_artist, album dup_album, title dup_title from songs as inner_songs where artist != '' and album != '' and title != '' group by artist, album , title having count(*) > 1; UPDATE schema_version SET version=27; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-28.sql000066400000000000000000000001561260417502300237520ustar00rootroot00000000000000UPDATE %allsongstables SET length=length*1e9, beginning=beginning*1e9; UPDATE schema_version SET version=28; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-29.sql000066400000000000000000000034401260417502300237520ustar00rootroot00000000000000ALTER TABLE playlist_items ADD COLUMN albumartist TEXT; ALTER TABLE playlist_items ADD COLUMN composer TEXT; ALTER TABLE playlist_items ADD COLUMN track INTEGER; ALTER TABLE playlist_items ADD COLUMN disc INTEGER; ALTER TABLE playlist_items ADD COLUMN bpm REAL; ALTER TABLE playlist_items ADD COLUMN year INTEGER; ALTER TABLE playlist_items ADD COLUMN genre TEXT; ALTER TABLE playlist_items ADD COLUMN comment TEXT; ALTER TABLE playlist_items ADD COLUMN compilation INTEGER; ALTER TABLE playlist_items ADD COLUMN bitrate INTEGER; ALTER TABLE playlist_items ADD COLUMN samplerate INTEGER; ALTER TABLE playlist_items ADD COLUMN directory INTEGER; ALTER TABLE playlist_items ADD COLUMN filename TEXT; ALTER TABLE playlist_items ADD COLUMN mtime INTEGER; ALTER TABLE playlist_items ADD COLUMN ctime INTEGER; ALTER TABLE playlist_items ADD COLUMN filesize INTEGER; ALTER TABLE playlist_items ADD COLUMN sampler INTEGER NOT NULL DEFAULT 0; ALTER TABLE playlist_items ADD COLUMN art_automatic TEXT; ALTER TABLE playlist_items ADD COLUMN art_manual TEXT; ALTER TABLE playlist_items ADD COLUMN filetype INTEGER NOT NULL DEFAULT 0; ALTER TABLE playlist_items ADD COLUMN playcount INTEGER NOT NULL DEFAULT 0; ALTER TABLE playlist_items ADD COLUMN lastplayed INTEGER; ALTER TABLE playlist_items ADD COLUMN rating INTEGER; ALTER TABLE playlist_items ADD COLUMN forced_compilation_on INTEGER NOT NULL DEFAULT 0; ALTER TABLE playlist_items ADD COLUMN forced_compilation_off INTEGER NOT NULL DEFAULT 0; ALTER TABLE playlist_items ADD COLUMN effective_compilation NOT NULL DEFAULT 0; ALTER TABLE playlist_items ADD COLUMN skipcount INTEGER NOT NULL DEFAULT 0; ALTER TABLE playlist_items ADD COLUMN score INTEGER NOT NULL DEFAULT 0; UPDATE playlist_items SET filename = url; UPDATE schema_version SET version=29; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-3.sql000066400000000000000000000004141260417502300236600ustar00rootroot00000000000000ALTER TABLE songs ADD COLUMN filetype INTEGER NOT NULL DEFAULT 0; ALTER TABLE songs ADD COLUMN playcount INTEGER NOT NULL DEFAULT 0; ALTER TABLE songs ADD COLUMN lastplayed INTEGER; ALTER TABLE songs ADD COLUMN rating INTEGER; UPDATE schema_version SET version=3; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-30.sql000066400000000000000000000021331260417502300237400ustar00rootroot00000000000000CREATE TABLE spotify_search_songs ( title TEXT, album TEXT, artist TEXT, albumartist TEXT, composer TEXT, track INTEGER, disc INTEGER, bpm REAL, year INTEGER, genre TEXT, comment TEXT, compilation INTEGER, length INTEGER, bitrate INTEGER, samplerate INTEGER, directory INTEGER NOT NULL, filename TEXT NOT NULL, mtime INTEGER NOT NULL, ctime INTEGER NOT NULL, filesize INTEGER NOT NULL, sampler INTEGER NOT NULL DEFAULT 0, art_automatic TEXT, art_manual TEXT, filetype INTEGER NOT NULL DEFAULT 0, playcount INTEGER NOT NULL DEFAULT 0, lastplayed INTEGER, rating INTEGER, forced_compilation_on INTEGER NOT NULL DEFAULT 0, forced_compilation_off INTEGER NOT NULL DEFAULT 0, effective_compilation NOT NULL DEFAULT 0, skipcount INTEGER NOT NULL DEFAULT 0, score INTEGER NOT NULL DEFAULT 0, beginning INTEGER NOT NULL DEFAULT 0, cue_path TEXT ); CREATE VIRTUAL TABLE spotify_search_songs_fts USING fts3 ( ftstitle, ftsalbum, ftsartist, ftsalbumartist, ftscomposer, ftsgenre, ftscomment, tokenize=unicode ); UPDATE schema_version SET version=30; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-31.sql000066400000000000000000000000461260417502300237420ustar00rootroot00000000000000UPDATE schema_version SET version=31; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-32.sql000066400000000000000000000001641260417502300237440ustar00rootroot00000000000000UPDATE magnatune_songs SET filename = "magnatune://" || substr(filename, 8); UPDATE schema_version SET version=32; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-33.sql000066400000000000000000000001331260417502300237410ustar00rootroot00000000000000ALTER TABLE playlists ADD COLUMN special_type TEXT; UPDATE schema_version SET version=33; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-34.sql000066400000000000000000000006101260417502300237420ustar00rootroot00000000000000ALTER TABLE %allsongstables ADD COLUMN unavailable INTEGER DEFAULT 0; DROP VIEW duplicated_songs; CREATE VIEW duplicated_songs as select artist dup_artist, album dup_album, title dup_title from songs as inner_songs where artist != '' and album != '' and title != '' and unavailable = 0 group by artist, album , title having count(*) > 1; UPDATE schema_version SET version=34; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-35.sql000066400000000000000000000001261260417502300237450ustar00rootroot00000000000000CREATE INDEX idx_filename ON songs (filename); UPDATE schema_version SET version=35; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-36.sql000066400000000000000000000003641260417502300237520ustar00rootroot00000000000000ALTER TABLE %allsongstables ADD COLUMN effective_albumartist TEXT; UPDATE songs SET effective_albumartist = albumartist; UPDATE songs SET effective_albumartist = artist WHERE effective_albumartist = ""; UPDATE schema_version SET version=36; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-37.sql000066400000000000000000000015241260417502300237520ustar00rootroot00000000000000CREATE TABLE podcasts ( url TEXT, title TEXT, description TEXT, copyright TEXT, link TEXT, image_url_large TEXT, image_url_small TEXT, author TEXT, owner_name TEXT, owner_email TEXT, last_updated INTEGER, last_update_error TEXT, extra BLOB ); CREATE TABLE podcast_episodes ( podcast_id INTEGER, title TEXT, description TEXT, author TEXT, publication_date INTEGER, duration_secs INTEGER, url TEXT, listened BOOLEAN, listened_date INTEGER, downloaded BOOLEAN, local_url TEXT, extra BLOB ); CREATE INDEX podcast_idx_url ON podcasts(url); CREATE INDEX podcast_episodes_idx_podcast_id ON podcast_episodes(podcast_id); CREATE INDEX podcast_episodes_idx_url ON podcast_episodes(url); CREATE INDEX podcast_episodes_idx_local_url ON podcast_episodes(local_url); UPDATE schema_version SET version=37; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-38.sql000066400000000000000000000023251260417502300237530ustar00rootroot00000000000000ALTER TABLE %allsongstables ADD COLUMN etag TEXT; CREATE TABLE google_drive_songs( title TEXT, album TEXT, artist TEXT, albumartist TEXT, composer TEXT, track INTEGER, disc INTEGER, bpm REAL, year INTEGER, genre TEXT, comment TEXT, compilation INTEGER, length INTEGER, bitrate INTEGER, samplerate INTEGER, directory INTEGER NOT NULL, filename TEXT NOT NULL, mtime INTEGER NOT NULL, ctime INTEGER NOT NULL, filesize INTEGER NOT NULL, sampler INTEGER NOT NULL DEFAULT 0, art_automatic TEXT, art_manual TEXT, filetype INTEGER NOT NULL DEFAULT 0, playcount INTEGER NOT NULL DEFAULT 0, lastplayed INTEGER, rating INTEGER, forced_compilation_on INTEGER NOT NULL DEFAULT 0, forced_compilation_off INTEGER NOT NULL DEFAULT 0, effective_compilation NOT NULL DEFAULT 0, skipcount INTEGER NOT NULL DEFAULT 0, score INTEGER NOT NULL DEFAULT 0, beginning INTEGER NOT NULL DEFAULT 0, cue_path TEXT, unavailable INTEGER DEFAULT 0, effective_albumartist TEXT, etag TEXT ); CREATE VIRTUAL TABLE google_drive_songs_fts USING fts3 ( ftstitle, ftsalbum, ftsartist, ftsalbumartist, ftscomposer, ftsgenre, ftscomment, tokenize=unicode ); UPDATE schema_version SET version=38; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-39.sql000066400000000000000000000001261260417502300237510ustar00rootroot00000000000000ALTER TABLE playlists ADD COLUMN ui_path TEXT; UPDATE schema_version SET version=39; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-4.sql000066400000000000000000000003061260417502300236610ustar00rootroot00000000000000ALTER TABLE songs ADD COLUMN forced_compilation_on INTEGER NOT NULL DEFAULT 0; ALTER TABLE songs ADD COLUMN forced_compilation_off INTEGER NOT NULL DEFAULT 0; UPDATE schema_version SET version=4; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-40.sql000066400000000000000000000022361260417502300237450ustar00rootroot00000000000000CREATE TABLE ubuntu_one_songs( title TEXT, album TEXT, artist TEXT, albumartist TEXT, composer TEXT, track INTEGER, disc INTEGER, bpm REAL, year INTEGER, genre TEXT, comment TEXT, compilation INTEGER, length INTEGER, bitrate INTEGER, samplerate INTEGER, directory INTEGER NOT NULL, filename TEXT NOT NULL, mtime INTEGER NOT NULL, ctime INTEGER NOT NULL, filesize INTEGER NOT NULL, sampler INTEGER NOT NULL DEFAULT 0, art_automatic TEXT, art_manual TEXT, filetype INTEGER NOT NULL DEFAULT 0, playcount INTEGER NOT NULL DEFAULT 0, lastplayed INTEGER, rating INTEGER, forced_compilation_on INTEGER NOT NULL DEFAULT 0, forced_compilation_off INTEGER NOT NULL DEFAULT 0, effective_compilation NOT NULL DEFAULT 0, skipcount INTEGER NOT NULL DEFAULT 0, score INTEGER NOT NULL DEFAULT 0, beginning INTEGER NOT NULL DEFAULT 0, cue_path TEXT, unavailable INTEGER DEFAULT 0, effective_albumartist TEXT, etag TEXT ); CREATE VIRTUAL TABLE ubuntu_one_songs_fts USING fts3 ( ftstitle, ftsalbum, ftsartist, ftsalbumartist, ftscomposer, ftsgenre, ftscomment, tokenize=unicode ); UPDATE schema_version SET version=40; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-41.sql000066400000000000000000000022301260417502300237400ustar00rootroot00000000000000CREATE TABLE dropbox_songs( title TEXT, album TEXT, artist TEXT, albumartist TEXT, composer TEXT, track INTEGER, disc INTEGER, bpm REAL, year INTEGER, genre TEXT, comment TEXT, compilation INTEGER, length INTEGER, bitrate INTEGER, samplerate INTEGER, directory INTEGER NOT NULL, filename TEXT NOT NULL, mtime INTEGER NOT NULL, ctime INTEGER NOT NULL, filesize INTEGER NOT NULL, sampler INTEGER NOT NULL DEFAULT 0, art_automatic TEXT, art_manual TEXT, filetype INTEGER NOT NULL DEFAULT 0, playcount INTEGER NOT NULL DEFAULT 0, lastplayed INTEGER, rating INTEGER, forced_compilation_on INTEGER NOT NULL DEFAULT 0, forced_compilation_off INTEGER NOT NULL DEFAULT 0, effective_compilation NOT NULL DEFAULT 0, skipcount INTEGER NOT NULL DEFAULT 0, score INTEGER NOT NULL DEFAULT 0, beginning INTEGER NOT NULL DEFAULT 0, cue_path TEXT, unavailable INTEGER DEFAULT 0, effective_albumartist TEXT, etag TEXT ); CREATE VIRTUAL TABLE dropbox_songs_fts USING fts3 ( ftstitle, ftsalbum, ftsartist, ftsalbumartist, ftscomposer, ftsgenre, ftscomment, tokenize=unicode ); UPDATE schema_version SET version=41; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-42.sql000066400000000000000000000022321260417502300237430ustar00rootroot00000000000000CREATE TABLE skydrive_songs( title TEXT, album TEXT, artist TEXT, albumartist TEXT, composer TEXT, track INTEGER, disc INTEGER, bpm REAL, year INTEGER, genre TEXT, comment TEXT, compilation INTEGER, length INTEGER, bitrate INTEGER, samplerate INTEGER, directory INTEGER NOT NULL, filename TEXT NOT NULL, mtime INTEGER NOT NULL, ctime INTEGER NOT NULL, filesize INTEGER NOT NULL, sampler INTEGER NOT NULL DEFAULT 0, art_automatic TEXT, art_manual TEXT, filetype INTEGER NOT NULL DEFAULT 0, playcount INTEGER NOT NULL DEFAULT 0, lastplayed INTEGER, rating INTEGER, forced_compilation_on INTEGER NOT NULL DEFAULT 0, forced_compilation_off INTEGER NOT NULL DEFAULT 0, effective_compilation NOT NULL DEFAULT 0, skipcount INTEGER NOT NULL DEFAULT 0, score INTEGER NOT NULL DEFAULT 0, beginning INTEGER NOT NULL DEFAULT 0, cue_path TEXT, unavailable INTEGER DEFAULT 0, effective_albumartist TEXT, etag TEXT ); CREATE VIRTUAL TABLE skydrive_songs_fts USING fts3 ( ftstitle, ftsalbum, ftsartist, ftsalbumartist, ftscomposer, ftsgenre, ftscomment, tokenize=unicode ); UPDATE schema_version SET version=42; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-43.sql000066400000000000000000000022321260417502300237440ustar00rootroot00000000000000CREATE TABLE subsonic_songs( title TEXT, album TEXT, artist TEXT, albumartist TEXT, composer TEXT, track INTEGER, disc INTEGER, bpm REAL, year INTEGER, genre TEXT, comment TEXT, compilation INTEGER, length INTEGER, bitrate INTEGER, samplerate INTEGER, directory INTEGER NOT NULL, filename TEXT NOT NULL, mtime INTEGER NOT NULL, ctime INTEGER NOT NULL, filesize INTEGER NOT NULL, sampler INTEGER NOT NULL DEFAULT 0, art_automatic TEXT, art_manual TEXT, filetype INTEGER NOT NULL DEFAULT 0, playcount INTEGER NOT NULL DEFAULT 0, lastplayed INTEGER, rating INTEGER, forced_compilation_on INTEGER NOT NULL DEFAULT 0, forced_compilation_off INTEGER NOT NULL DEFAULT 0, effective_compilation NOT NULL DEFAULT 0, skipcount INTEGER NOT NULL DEFAULT 0, score INTEGER NOT NULL DEFAULT 0, beginning INTEGER NOT NULL DEFAULT 0, cue_path TEXT, unavailable INTEGER DEFAULT 0, effective_albumartist TEXT, etag TEXT ); CREATE VIRTUAL TABLE subsonic_songs_fts USING fts3 ( ftstitle, ftsalbum, ftsartist, ftsalbumartist, ftscomposer, ftsgenre, ftscomment, tokenize=unicode ); UPDATE schema_version SET version=43; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-44.sql000066400000000000000000000022201260417502300237420ustar00rootroot00000000000000CREATE TABLE box_songs( title TEXT, album TEXT, artist TEXT, albumartist TEXT, composer TEXT, track INTEGER, disc INTEGER, bpm REAL, year INTEGER, genre TEXT, comment TEXT, compilation INTEGER, length INTEGER, bitrate INTEGER, samplerate INTEGER, directory INTEGER NOT NULL, filename TEXT NOT NULL, mtime INTEGER NOT NULL, ctime INTEGER NOT NULL, filesize INTEGER NOT NULL, sampler INTEGER NOT NULL DEFAULT 0, art_automatic TEXT, art_manual TEXT, filetype INTEGER NOT NULL DEFAULT 0, playcount INTEGER NOT NULL DEFAULT 0, lastplayed INTEGER, rating INTEGER, forced_compilation_on INTEGER NOT NULL DEFAULT 0, forced_compilation_off INTEGER NOT NULL DEFAULT 0, effective_compilation NOT NULL DEFAULT 0, skipcount INTEGER NOT NULL DEFAULT 0, score INTEGER NOT NULL DEFAULT 0, beginning INTEGER NOT NULL DEFAULT 0, cue_path TEXT, unavailable INTEGER DEFAULT 0, effective_albumartist TEXT, etag TEXT ); CREATE VIRTUAL TABLE box_songs_fts USING fts3 ( ftstitle, ftsalbum, ftsartist, ftsalbumartist, ftscomposer, ftsgenre, ftscomment, tokenize=unicode ); UPDATE schema_version SET version=44; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-45.sql000066400000000000000000000015061260417502300237510ustar00rootroot00000000000000CREATE VIRTUAL TABLE playlist_items_fts USING fts3( ftstitle, ftsalbum, ftsartist, ftsalbumartist, ftscomposer, ftsgenre, ftscomment, tokenize=unicode ); DELETE FROM %allsongstables_fts; DROP TABLE %allsongstables_fts; ALTER TABLE %allsongstables ADD COLUMN performer TEXT; ALTER TABLE %allsongstables ADD COLUMN grouping TEXT; CREATE VIRTUAL TABLE %allsongstables_fts USING fts3( ftstitle, ftsalbum, ftsartist, ftsalbumartist, ftscomposer, ftsperformer, ftsgrouping, ftsgenre, ftscomment, tokenize=unicode ); INSERT INTO %allsongstables_fts (ROWID, ftstitle, ftsalbum, ftsartist, ftsalbumartist, ftscomposer, ftsperformer, ftsgrouping, ftsgenre, ftscomment) SELECT ROWID, title, album, artist, albumartist, composer, performer, grouping, genre, comment FROM %allsongstables; UPDATE schema_version SET version=45; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-46.sql000066400000000000000000000001601260417502300237450ustar00rootroot00000000000000ALTER TABLE playlists ADD COLUMN is_favorite INTEGER NOT NULL DEFAULT 0; UPDATE schema_version SET version=46; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-47.sql000066400000000000000000000023261260417502300237540ustar00rootroot00000000000000CREATE TABLE seafile_songs( title TEXT, album TEXT, artist TEXT, albumartist TEXT, composer TEXT, track INTEGER, disc INTEGER, bpm REAL, year INTEGER, genre TEXT, comment TEXT, compilation INTEGER, length INTEGER, bitrate INTEGER, samplerate INTEGER, directory INTEGER NOT NULL, filename TEXT NOT NULL, mtime INTEGER NOT NULL, ctime INTEGER NOT NULL, filesize INTEGER NOT NULL, sampler INTEGER NOT NULL DEFAULT 0, art_automatic TEXT, art_manual TEXT, filetype INTEGER NOT NULL DEFAULT 0, playcount INTEGER NOT NULL DEFAULT 0, lastplayed INTEGER, rating INTEGER, forced_compilation_on INTEGER NOT NULL DEFAULT 0, forced_compilation_off INTEGER NOT NULL DEFAULT 0, effective_compilation NOT NULL DEFAULT 0, skipcount INTEGER NOT NULL DEFAULT 0, score INTEGER NOT NULL DEFAULT 0, beginning INTEGER NOT NULL DEFAULT 0, cue_path TEXT, unavailable INTEGER DEFAULT 0, effective_albumartist TEXT, etag TEXT, performer TEXT, grouping TEXT ); CREATE VIRTUAL TABLE seafile_songs_fts USING fts3 ( ftstitle, ftsalbum, ftsartist, ftsalbumartist, ftscomposer, ftsperformer, ftsgrouping, ftsgenre, ftscomment, tokenize=unicode ); UPDATE schema_version SET version=47; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-48.sql000066400000000000000000000023541260417502300237560ustar00rootroot00000000000000CREATE TABLE amazon_cloud_drive_songs( title TEXT, album TEXT, artist TEXT, albumartist TEXT, composer TEXT, track INTEGER, disc INTEGER, bpm REAL, year INTEGER, genre TEXT, comment TEXT, compilation INTEGER, length INTEGER, bitrate INTEGER, samplerate INTEGER, directory INTEGER NOT NULL, filename TEXT NOT NULL, mtime INTEGER NOT NULL, ctime INTEGER NOT NULL, filesize INTEGER NOT NULL, sampler INTEGER NOT NULL DEFAULT 0, art_automatic TEXT, art_manual TEXT, filetype INTEGER NOT NULL DEFAULT 0, playcount INTEGER NOT NULL DEFAULT 0, lastplayed INTEGER, rating INTEGER, forced_compilation_on INTEGER NOT NULL DEFAULT 0, forced_compilation_off INTEGER NOT NULL DEFAULT 0, effective_compilation NOT NULL DEFAULT 0, skipcount INTEGER NOT NULL DEFAULT 0, score INTEGER NOT NULL DEFAULT 0, beginning INTEGER NOT NULL DEFAULT 0, cue_path TEXT, unavailable INTEGER DEFAULT 0, effective_albumartist TEXT, etag TEXT, performer TEXT, grouping TEXT ); CREATE VIRTUAL TABLE amazon_cloud_drive_songs_fts USING fts3 ( ftstitle, ftsalbum, ftsartist, ftsalbumartist, ftscomposer, ftsperformer, ftsgrouping, ftsgenre, ftscomment, tokenize=unicode ); UPDATE schema_version SET version=48; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-49.sql000066400000000000000000000001331260417502300237500ustar00rootroot00000000000000ALTER TABLE %allsongstables ADD COLUMN lyrics TEXT; UPDATE schema_version SET version=49; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-5.sql000066400000000000000000000004701260417502300236640ustar00rootroot00000000000000ALTER TABLE songs ADD COLUMN effective_compilation NOT NULL DEFAULT 0; UPDATE songs SET effective_compilation = ((compilation OR sampler OR forced_compilation_on) AND NOT forced_compilation_off) + 0; CREATE INDEX idx_comp_artist ON songs (effective_compilation, artist); UPDATE schema_version SET version=5; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-50.sql000066400000000000000000000004001260417502300237350ustar00rootroot00000000000000ALTER TABLE %allsongstables ADD COLUMN originalyear INTEGER; ALTER TABLE %allsongstables ADD COLUMN effective_originalyear INTEGER; UPDATE songs SET originalyear = -1; UPDATE songs SET effective_originalyear = -1; UPDATE schema_version SET version=50; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-6.sql000066400000000000000000000002251260417502300236630ustar00rootroot00000000000000CREATE TABLE subdirectories ( directory INTEGER NOT NULL, path TEXT NOT NULL, mtime INTEGER NOT NULL ); UPDATE schema_version SET version=6; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-7.sql000066400000000000000000000006371260417502300236730ustar00rootroot00000000000000CREATE TABLE playlists ( name TEXT NOT NULL ); CREATE TABLE playlist_items ( playlist INTEGER NOT NULL, type TEXT NOT NULL, /* Library, Stream, File, or Radio */ /* Library */ library_id INTEGER, /* Stream, File or Radio */ url TEXT, /* Stream or Radio */ title TEXT, artist TEXT, album TEXT, length INTEGER, /* Radio */ radio_service TEXT ); UPDATE schema_version SET version=7; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-8.sql000066400000000000000000000016341260417502300236720ustar00rootroot00000000000000/* Schema should be kept identical to the "songs" table, even though most of it isn't used by magnatune */ CREATE TABLE magnatune_songs ( title TEXT, album TEXT, artist TEXT, albumartist TEXT, composer TEXT, track INTEGER, disc INTEGER, bpm REAL, year INTEGER, genre TEXT, comment TEXT, compilation INTEGER, length INTEGER, bitrate INTEGER, samplerate INTEGER, directory INTEGER NOT NULL, filename TEXT NOT NULL, mtime INTEGER NOT NULL, ctime INTEGER NOT NULL, filesize INTEGER NOT NULL, sampler INTEGER NOT NULL DEFAULT 0, art_automatic TEXT, art_manual TEXT, filetype INTEGER NOT NULL DEFAULT 0, playcount INTEGER NOT NULL DEFAULT 0, lastplayed INTEGER, rating INTEGER, forced_compilation_on INTEGER NOT NULL DEFAULT 0, forced_compilation_off INTEGER NOT NULL DEFAULT 0, effective_compilation NOT NULL DEFAULT 0 ); UPDATE schema_version SET version=8; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema-9.sql000066400000000000000000000002021260417502300236610ustar00rootroot00000000000000CREATE INDEX idx_magnatune_comp_artist ON magnatune_songs (effective_compilation, artist); UPDATE schema_version SET version=9; clementine-1.2.3+git1354-gdaddbde+dfsg/data/schema/schema.sql000066400000000000000000000012501260417502300235170ustar00rootroot00000000000000CREATE TABLE directories ( path TEXT NOT NULL, subdirs INTEGER NOT NULL ); CREATE TABLE songs ( /* Metadata from taglib */ title TEXT, album TEXT, artist TEXT, albumartist TEXT, composer TEXT, track INTEGER, disc INTEGER, bpm REAL, year INTEGER, genre TEXT, comment TEXT, compilation INTEGER, length INTEGER, bitrate INTEGER, samplerate INTEGER, /* Information about the file on disk */ directory INTEGER NOT NULL, filename TEXT NOT NULL, mtime INTEGER NOT NULL, ctime INTEGER NOT NULL, filesize INTEGER NOT NULL ); CREATE TABLE schema_version ( version INTEGER NOT NULL ); INSERT INTO schema_version (version) VALUES (0); clementine-1.2.3+git1354-gdaddbde+dfsg/data/sidebar_background.png000066400000000000000000000211441260417502300246200ustar00rootroot00000000000000PNG  IHDRFߎusRGBbKGD pHYsMWtIME  htEXtCommentCreated with GIMPW!IDATx]iўvs[,O ##! 2Bxrlm5`x7b;] Ǫ_$|oVfmP?g^CRk%XY'_7mk ܩY s !qC>`,T7Aðf̼wͱs'I$<4ϹLz|@rl.O0VI7~(#Xk2a%cs}õOv}=OpgU%!(d#<ɀ5n Ҙ:/# 1;#=1z+S#!RC7:ǏG<޽ܻw/G/^90"$7@`3Da 6 \MLO?QѐFzf#Y38lX U]BM1 h[>㜉w?SCGi吉EŁEmi-'OL̆CX3qDARlO= F-"E*Dከw>ٵgDI)6r=A[4$yCL C`aCD!8iPCYspDa;m\~A@;#m}#',?gʕ+%6tRwyG-G.a Uƻ䄥DKJj mq8pE V~4q/_f|FjR.\?ؓ+Gh%`RpԘ $B~fU%|eBI҂yN)2#xSN&͈+K,,ԥ2 :;3ԸE"y% OM/@F? 2ƹsN 0$M4%X^& L e.ح:zS6D#ppODB-D)E`.CA%'KYӕf ')rԷ ӌT :l_H@ rW!NGl7x7PB~Λ,B %c$'pvKJ.3&9Fa+C\X5CͶg,h1̐Mh! $r)yEV1dO0}_cB(NkM5Oc+q*Th.3nkk"~; "m qb*$˹CwLW0ٚ5-UKB)!;p o1s=F R;@G6&$NU= hk\Q@uޕWRlMWHMĮnB׀~E/RgH,wxw߅0g]Dҭ1z:#z>2(ƘJ&J0q]xIY8EAE @3TH5% VE7aVhN/SlU膠g|M &޿ etLA%Mt}+t LBJ\7#ha5_z:b{ܸq#HX pғvYDƄ-!s>=WTS77+faţG$yZ*Keʻa=Dd).Q !@SUv9zjntY5b$yc %rҮf̞Ӝ>BLpԃ+͛7'O6 6.O-DJȡ (JXcweO'q aB'4a2ҜEbK<_l(_;D}*`s}[!,GJVr`7@u̙/x3&rDu5 HYġ9葝H1u(iLDTzK&<| rjKH; =39U YVngp]#P)X-;f3:g S^Qnmy]#˗=170zO䁗{45iVAȤ%59ƣܨ;"OЛT`/ړMC1jT|M-Zvm]]% -a3 J'c$8O Am =-ad2)J>u JԚMR;O  WD(-$XyoyN]; .$tgBdpc$vQlS+O6R֒mЁDܣGJ7g xٗ(1xꆦ .T J bMJ4A[ m⚠(–oIFɁŞwƹ)p~R2ve,YF:rY(YvMsT R,c8.'n:7Iw=B3m Aګ n\T##.]QoD[ C';}/S=-TnpT64Z7oFg ?_D.!'. D!M Q6uV Dֹ ZE:S?s wݹsl[%wZ-Di4 uU<ϑ(_qbuT$%&\rBQ@3cr{DjΒR -$Q%N1u%VZ1# *=3'`bvH=Km(TD1eBz5 n@ɦQL'iUJքT;t̶NrXR (]jʍ %𷶉Cv+"[IeL:P=YD L&)÷mZF+ɍ`چDӡWws@S9+ߣ#hI\9elŋ%M7J,=`֕n^dTv$ ŋgk(1No%>ffǍTާkP1Ζ (+ʟ2PeAhv ф^SI= >N !r >@Rr߃5ltha^\"U׮]۸~zCy}$疼5X#s =y@=RKu L%fR">Ep;wN\eYעMBj@zKoLܳ|̚S$? tBfI2Kꨱ9GܻwO) . –W=s]{`9uBQgl j msBpN$.`O1"<-6w(:j-zmeZ̯Zq ϳwx='u`wĸ\w! qOxڜT&z""$w̉kNS=6}D4DT&vE{8IOӨ{dAİdsz/Zr `"8rДY oj5٭>nq;b~WRa84ʴֳYݸqc*#S9g/y8ufnד<#B˗ T/0w=t);sLY~ɓ'f:2a4@"G&~ 0oS^|7Ff@!ᾊʮiM鼥R QAݳgB{*g) pSQؓXW 3' G#I= F JALܨ g PY7 mOj7{pxȱҼkԬÄfaxnBWK'aSŦ2@G` S)'o6H%2jSWy^RdzA9cI ( DGgpj-lm0DY R#z6r(V6ȇVwتyVEVѣO9d ˉ8kKց6/u\q7SϊK)GpR$;= )c/RԂЬ?S>z8綎3!&uWɮ:S D򬩅)mz 1UdPIݬkꢱF]v-1+_|5 )}CT[.UN}i&C|.#U'2*RA%VU!d=LvcP'zc\ 2(*q軴J,)C<Yɰ{2360󆒅G=Zǖ>|k<Hs-[JS^\:{N:pB}0 xָЛ%m)(Ɨ ]eC7:6RcN qN؂6'/,r?cǎGG你C,[{nR[u筏/T= ]ЉMƛ4JZl޳6z_5c z&lJU^z'ɻ"SlTf$3='ŗ:Jv׫gSdjM>GRbGebKpJ?: : ه'ӧkdBk{N&8yWe O['7 81IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/smartplaylistsearchterm.css000066400000000000000000000015071260417502300260030ustar00rootroot00000000000000#frame { border: 1px solid palette(mid); border-radius: 5px; } #container { margin: 2px; } #remove { border-top-left-radius: 0px; border-top-right-radius: 5px; border-bottom-left-radius: 0px; border-bottom-right-radius: 5px; border: 0px solid transparent; background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 %light, stop:0.4 %light, stop:0.6 %dark, stop:1 %dark); margin-left: 5px; padding: 0px 5px; } #remove:hover { background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 %light2, stop:0.4 %light2, stop:0.6 %base, stop:1 %base); border: 0px solid transparent; } #remove:pressed { background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 %base, stop:0.4 %base, stop:0.6 %light2, stop:1 %light2); border: 0px solid transparent; } clementine-1.2.3+git1354-gdaddbde+dfsg/data/songinfo.css000066400000000000000000000001141260417502300226300ustar00rootroot00000000000000QScrollArea { background: qpalette(base); } QTextEdit { border: 0px; } clementine-1.2.3+git1354-gdaddbde+dfsg/data/soundcloud-ca.pem000066400000000000000000000111501260417502300235410ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIE/jCCA+agAwIBAgISESFtsYPeX3c+ePAiBIwNao1HMA0GCSqGSIb3DQEBCwUA MGAxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTYwNAYD VQQDEy1HbG9iYWxTaWduIERvbWFpbiBWYWxpZGF0aW9uIENBIC0gU0hBMjU2IC0g RzIwHhcNMTQwNDIyMTY1MjEyWhcNMTYwNDA4MTAwODQ4WjA+MSEwHwYDVQQLExhE b21haW4gQ29udHJvbCBWYWxpZGF0ZWQxGTAXBgNVBAMMECouc291bmRjbG91ZC5j b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC67uRdDzEzuXKEVVty cZxocxsNKKB+zzBop6kkuslPLlABo0PtbqbihKxZ76m94JrdtkLE+rTTmffuO9An tIwpHbrTnreG9fbt6ql6E82xSkNscL6n1FTnI9gYqKXMhMEOX67RFh0huj+WzFil Xs6wcUDvWDoTC50/lpRVOacAPZxkZ+nuv7DGo3syAytygsa2JF+iH9ZS1AjlQziD B8ZtM/oJoZ/8DD11YZ7IXt+ExxtWTNwmNQ4IWyNnK4PRHo0/w8gpsXg68581PWGq S3DGdCsuwcS2nj0E0/P9tY3IFM1JSPJzKk2/TtKFRPVORAT/XQrovN/ShRgk30T0 to2jAgMBAAGjggHSMIIBzjAOBgNVHQ8BAf8EBAMCBaAwSQYDVR0gBEIwQDA+BgZn gQwBAgEwNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xvYmFsc2lnbi5jb20v cmVwb3NpdG9yeS8wKwYDVR0RBCQwIoIQKi5zb3VuZGNsb3VkLmNvbYIOc291bmRj bG91ZC5jb20wCQYDVR0TBAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUH AwIwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5nbG9iYWxzaWduLmNvbS9n cy9nc2RvbWFpbnZhbHNoYTJnMi5jcmwwgZQGCCsGAQUFBwEBBIGHMIGEMEcGCCsG AQUFBzAChjtodHRwOi8vc2VjdXJlLmdsb2JhbHNpZ24uY29tL2NhY2VydC9nc2Rv bWFpbnZhbHNoYTJnMnIxLmNydDA5BggrBgEFBQcwAYYtaHR0cDovL29jc3AyLmds b2JhbHNpZ24uY29tL2dzZG9tYWludmFsc2hhMmcyMB0GA1UdDgQWBBRJ2etdwCnK SvnPLE1TTbsXAUc/SDAfBgNVHSMEGDAWgBTqTnzUgC3lFYGGJoyCbcCYpM+XDzAN BgkqhkiG9w0BAQsFAAOCAQEAgnLlEtTA6nVQrMRhUSeFmrx2GqTyn12PxZfSrLJO 3efOBHAZkl9n3ygHk8FpSaK0KDPfwKkB1zXp0z+ZJp+VXd/jnRu0gBe9UlmWy/F0 DkEGFrtdYCWAJPjCO4ej0P5CS4t6uNnNKLi7lXfWwlsxqEdS8gX+R3VcTJP1/Ouq Ab+Pm7Lp4BRDB+TNV6hx7VsRoGu18PKIlD2GI/zFMGLdOBrVR4figC8vM4uVuZ+u VOO2nQbuiUsSKCzgHIckRzI8oQr4omUVBs4TkWbksU0FONsiUsg437hO3bfZVveE 9Do3gHio/oe5p5ksh2DuWTSvzxLUBbUfJdbBSB2x0W0EUA== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEYzCCA0ugAwIBAgILBAAAAAABRE7wPiAwDQYJKoZIhvcNAQELBQAwVzELMAkG A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xNDAyMjAxMDAw MDBaFw0yNDAyMjAxMDAwMDBaMGAxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i YWxTaWduIG52LXNhMTYwNAYDVQQDEy1HbG9iYWxTaWduIERvbWFpbiBWYWxpZGF0 aW9uIENBIC0gU0hBMjU2IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK AoIBAQCp3cwOs+IyOd1JIqgTaZOHiOEM7nF9vZCHll1Z8syz0lhXV/lG72wm2DZC jn4wsy+aPlN7H262okxFHzzTFZMcie089Ffeyr3sBppqKqAZUn9R0XQ5CJ+r69eG ExWXrjbDVGYOWvKgc4Ux47JkFGr/paKOJLu9hVIVonnu8LXuPbj0fYC82ZA1ZbgX qa2zmJ+gfn1u+z+tfMIbWTaW2jcyS0tdNQJjjtunz2LuzC7Ujcm9PGqRcqIip3It INH6yjfaGJjmFiRxJUvE5XuJUgkC/VkrBG7KB4HUs9ra2+PMgKhWBwZ8lgg3nds4 tmI0kWIHdAE42HIw4uuQcSZiwFfzAgMBAAGjggElMIIBITAOBgNVHQ8BAf8EBAMC AQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU6k581IAt5RWBhiaMgm3A mKTPlw8wRwYDVR0gBEAwPjA8BgRVHSAAMDQwMgYIKwYBBQUHAgEWJmh0dHBzOi8v d3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMDMGA1UdHwQsMCowKKAmoCSG Imh0dHA6Ly9jcmwuZ2xvYmFsc2lnbi5uZXQvcm9vdC5jcmwwPQYIKwYBBQUHAQEE MTAvMC0GCCsGAQUFBzABhiFodHRwOi8vb2NzcC5nbG9iYWxzaWduLmNvbS9yb290 cjEwHwYDVR0jBBgwFoAUYHtmGkUNl8qJUC99BM00qP/8/UswDQYJKoZIhvcNAQEL BQADggEBANdFnqDc4ONhWgt9d4QXLWVagpqNoycqhffJ7+mG/dRHzQFSlsVDvTex 4bjyqdKKEYRxkRWJ3AKdC8tsM4U0KJ4gsrGX3G0LEME8zV/qXdeYMcU0mVwAYVXE GwJbxeOJyLS4bx448lYm6UHvPc2smU9ZSlctS32ux4j71pg79eXw6ImJuYsDy1oj H6T9uOr7Lp2uanMJvPzVoLVEgqtEkS5QLlfBQ9iRBIvpES5ftD953x77PzAAi1Pj tywdO02L3ORkHQRYM68bVeerDL8wBHTk8w4vMDmNSwSMHnVmZkngvkA0x1xaUZK6 EjxS1QSCVS1npd+3lXzuP8MIugS+wEY= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp 1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE 38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== -----END CERTIFICATE----- clementine-1.2.3+git1354-gdaddbde+dfsg/data/spinner.gif000077500000000000000000000014401260417502300224470ustar00rootroot00000000000000GIF89atttGGG! NETSCAPE2.0! ,H Z9}HIlTQtAޭpe0&|.@P^ڭ"'N! ,H ΡZg) }HIl0taޭp%&|.P^ڭ"'N! ,H JZ}HIlTtޭpE  &|.P^ڭ"'N! ,H ƠZg}HIl tqޭp@ &|.P^ڭ"'N!,E BZ}HIlAtm8SQ A") @ QjJqkqbD! ,? XZ!}HIlatm? )&!h$ytBf+E1!,E Z1}HIltSޭpp &|.kzV-D!,> Z'B}HIlqt ޭpP&|.jJ";clementine-1.2.3+git1354-gdaddbde+dfsg/data/spotify-attribution.png000066400000000000000000000077651260417502300250640ustar00rootroot00000000000000PNG  IHDR1@xbKGD pHYsHHFk>IDATh{]Uuǿks_$3!$FB(%A## !j[ Rl?JA!" E"e@4@$@&!d&:{̹IB?=sνwkz#Obrzg' |PD? p"0h|{6ʫ kvqJD7{Vw=mJ=ED @bFV-QUyZyMD Ӹ [‹*>f FBq$:(ZKaĪ?}pՆB f데@0 @a Vêrp)!f=zwP2b74*»SB#T:4;W%"SJP >تW.O_n$WWӱ0L.¨}W"7nPYW~72s ,KU&[*w=/X%DA&LPu1ww_}~t*xw3ݡJ}Fᆢrs R ֊zYӐ  b36 T>m 6ƈjgY+c(aFҌҤ'7dhHM>9L7׀gR9J>o3TPqå,%-Ɛ0ࠖղ,VY||р@96oڛȔ 8ôտR~3GqZ[ 0\KM/|zm'V-Zgz1Lצpe`o|YNXa 1.1ޫmw;{cjrAv4Y 6.+8AUho8)}O^dFdֳl mpF?R'FƉY!Hxb`smŠbG`mF|<3 $L 4AiRt4A{q51ovpU@_̪J\"wۯ@Q c \iC(D]'0ē:^3)TS3iNϢ1=LXbh̉ǔq#⳹AAB`ȬNIU:hV*97I[l'IN 7I#^*-P mz/3Nl} -uJ[{ܺMF-f*'1ݴ5gGMev<޾_3P܎b-Tjr[nD4] $hGc8N>2jίl~ $}Ueց*c1d`a'C] :)ab7$2%.y,D;"iVw 3:.e˾ٸ{ϭC3 |Aa% ͆$Mit DoPb53pm )TZfx6R:#9X&Ƭ_f lgUIp+rSZs.Ԉ`DPluiH\-ixƧ.y,p|bi^@o޾jmaPY_ahD ORNBƕq Tox=C;pRULkdLԃQ-TGk`A+`4@Uf'5[H'HHz$K`s^nJ]m/ \ݻ}gS8y<BiZ5-Xҫ"YX ?xI h:SiL.Ao]S(1Á7;:Л{QS`uYv,B-g# o=8B6?{?V|/u =[֮Gq`9F* 婑hm^R?U(ЫqiV 9^r,b|R0"7~3x2vR~+IB:qeJ ^{TYo>BD%{|)9K N V _0I{m43q4gBdG@UȚ-_cہ5]\tDLā|crpGb )$4ǴgD`ׁ,{ *oE@r>!֦ N85R7`~/dk/,tҜ>Ȏ t-ǪݗP TӁ^ b~ԉquiJOrF ˛ЖUtƈJKbG9*Vn&;0p'U'Xr?jAmh[im Xa p%2Gp44*<8}A[frVMgZډ5ehUڡƛVDx(@# LHv0hL#!v*^t` M`b1e1sS&^/2UsޥB`Edk-"&*yq`ZF]s_O_~^t\HkܼN8N?7v ;+%V۔t^g;kNgSN+E7;34Rw(M493lVa.@{X&X^ʑ\`|o3ݘ\6,qܼDp3-g܀/s׻U~s8Grpw 6cYl?:':יS8 1\>$g9=0ͥ8[12JjS+7Rݎs+ntNXт+>H:6.9nD93<π9?8g~MvK 7_uy@9 nq6e֙wߑċzp-!yCC*q"JϤ3zgi6I7׷Atgr;윷?n}QtcT| rǁ{`44/IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/star-off.png000066400000000000000000000006401260417502300225270ustar00rootroot00000000000000PNG  IHDRsO/sBIT|d pHYsO`tEXtSoftwarewww.inkscape.org<IDAT(ϝM+Eq^/%yFY+RXRDB (%#6(uK86n9yf<$MӤVy5yͣHWIC1}E0it у4M7xձT%.Qw1ajF/p= : 9-b;j7Q! X bM8erkQ0!0FM1y%F>S\b2k\ #"?9PHUW}sx&-tgܠ5nT *)bzIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/star-on.png000066400000000000000000000005441260417502300223740ustar00rootroot00000000000000PNG  IHDRsO/sBIT|d pHYsO`tEXtSoftwarewww.inkscape.org<IDAT(c?. "])-OF/n8-@"a9ܫR S/ yTU4x,D4VM1% Jר)!B:% ï5pirg#(fs'A|.j 784骥XU@<rNk8@+ R #orn1l+Ps5@]*8 j<%( $Kp@)HNU^4Zb /)S\W *e\.Y,h@r_[Rh͑֝j?}IF\b`xTxJN|hY԰N~j f|o9W}@ {zO`kReVAB@:@8fo j%զCkC%*`݀KB2@nY?<< -JsÖZHsA?0 pqq.//Ç*53Z%кҔx@# #\\\jj5&V=ǘsW1FB=jS~}ON\__ |6 l6sӢ'n}ûw&sBP儹7K)߿{xxxV+Xpuu6 |ß?`vv n PaǣRP)%vsaɐ-,x3W ڏ@òhiuOY0> %PAk9, ^ #OP>Zjk̽/nJ7!$뺣+%ǐ59PJs!ď4]@ Rh9b H=|N8 OV KA_@?^ojCM + V,y G )V'u[sB+ͫ&A+?s-䦧D@dZ{-3L֤C)\ I^0V Q +B֜ME}S8˒U@VUc)W88pXp<(E<PcU-Z 9暮G`5@Vx+!`N%VG AKvd-R| uB"ˋuVeTA(""@zJH%g5BZX9e#TDV@Z5`i@sJKV25 RB@ 9K8@VAdHree!-8@9 Mk8(RR YK;@VVJGQ|""zI :0|'v]7w)+pKi/=まdtbtIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/tiny-start.png000066400000000000000000000032601260417502300231250ustar00rootroot00000000000000PNG  IHDR0@\ FsRGBbKGD pHYs B(xtIMEf0IDAThݙK,GopBuB\F (͐b| FL H$ JD㋛?!&1 dRL 3U5=Ɂۺ}QuZz?544Teff*h!7YLPS745ٱ `NhnIirMS6'''vn i4\Tb ԫ`ccE3  R,FѸhoo/((5rww \4 h:-\XYYy5 T?vuu_TTr(@ Z /$QO6a4NfELL<z 7><,f4?h|PUUGDQnh!K!N 5Jrr ]V$ -' _`ff 67^x5SF=i+IIImmmSvLOO)C޲ `1?&UXѐY311񰩩i/O P^]] h/,'գ 066 (#lЕmzzmCF@K!,02L,1=!!ᠰpvn `dd`4ŌB`"c[zpO<4N!&{,h;~499)a3 )+LGiW777Qh຀xu (}pڣk9hHG`O9\?L1;`揆ZRRnn+2XM6 qP˨hUA#?DyK5Ge99i3hQc C`D ˨f#""<\Ⴁs:;RE$HpmC`L#RoP2hxz\yyHv`[@^-Ċx܁w2 N{{{ZHJ,mxGHnB0|gQbE<w ·bE<D@\7OV%,GazT V]]*)@LJLmhh 88Д(2[y 5Mӕ(3rLjJ:00`.\nz}{{[W̨p[[[_pK{uh U(+-WUIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/vk/000077500000000000000000000000001260417502300207205ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/data/vk/add.png000066400000000000000000000002711260417502300221560ustar00rootroot00000000000000PNG  IHDR szzbKGD pHYs  tIME FIDATXcd $tO~Ay(#)11 0uF0Q0*G`hpuF{ ]IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/vk/bookmarks.png000066400000000000000000000012171260417502300234170ustar00rootroot00000000000000PNG  IHDR szzbKGDNr.( pHYs  tIME6/G)IDATXŗu0 ?ylLk;HsIʾ .Lmp A#SPκJ$0s<+qT/Yh&4ށ 's W;[ϯ4j48A3ub !_ʝ$`o杽7nCtLBn@>gS'`6K|diTcf=ʇHK5Ȁk;hޓs-cJU t b+Naѣwv7 ǞGof'+^RwE·Rq ӛHܴAnRBZ\c;5RxgM s̄wZ.;痐!>NRmqn@)!̅!'xl;4 w6Ep/KlPؔڵ|LUzj"[ut%P0A>ܘjIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/vk/deactivated.gif000066400000000000000000000021231260417502300236620ustar00rootroot00000000000000GIF87a22q,22*"*"   D\VE,  &EX^ZH ͤÑFqc4 ٕ 6`o1 ]B 8cb^H-^8߆8 &L$ .[@,#1Bf"YH+,;1F!$䊍6)Q&?48``G4j r^; N, Āo@0WHRܭE@MUۛ׵&zߢtEvRuqPXƺ(h7% PuTY t3= р?0F4MZ#@ug:P@8nNk`ښ{}S3:qUW Ib ]=% 7 G &f`K8%w օyn@z~ͦs! )aP iԺB_ IL T$ $x -f'_>ߨ 73|s4ZfQ$)FMA8āDX^(N;@pf(@C^3@7Xd ꨣTƁ dhDJ^jΦs+2zH| "f*;clementine-1.2.3+git1354-gdaddbde+dfsg/data/vk/delete.png000066400000000000000000000005371260417502300226750ustar00rootroot00000000000000PNG  IHDRr ߔbKGD pHYs  tIME)bSIDATHֻ0 _ dpQ! +'>HBbMu1 X{ҥR&KZtvP9; 1.=؂!"'fV%rڀ&&yE/Yɉ$Pc2c!cY9=tW4eZ͵y[iؐ+Hǥ" @~4W#Q ^;KYIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/vk/discography.png000066400000000000000000000007461260417502300237510ustar00rootroot00000000000000PNG  IHDR szzbKGD pHYs  tIME^pFsIDATX͗q@?n(% ;$3p9qB\%8Yi͐sݻ]I|`xVg0qP YXa* 5q`$lB߃ $% ӠC ly U˄WU![ 8Vbըr$m"G]X[%|WFɩB;B|5o]6N8$)MM'ұzpN`R8t G񎮎i9:O6ǰt!p?8+XQ[2qP]E@ mwDbM0ĺu35<`ل{W֣=܆":jIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/vk/download.png000066400000000000000000000005031260417502300232330ustar00rootroot00000000000000PNG  IHDR ^8bKGD pHYs  tIME g`IDATH핽 0F_P`BFp5e:6AG"c:_c˧u?vAĚ~xUe@d@d@ 읣CD':KO :"ll-ҊVTdp^!.ĽE4vSZq jjJ@*1}40&tKeڀrŤ@5no23UIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/vk/edit.png000066400000000000000000000006341260417502300223560ustar00rootroot00000000000000PNG  IHDR szzbKGD pHYs  tIME$ȏ)IDATXŖ0E+:J#:BG@(wB TKp $G}J+f]}Idf\nYК%Y H#'FH'H'ЀGЂGЄ hEr$/icF ϑ\:AR?7\:>:[7[=u}&l+(+NyO_6@WOo$N7fN6''ӆk&L;@dNxre) l8gD?E`r[N]5Hp!af%Љ?pZ±ExC^Qj\xE$;%QeE)a|1]Y)J~JY/9k^Y(udGDĘ} ě* <1BH"pIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/vk/link.png000066400000000000000000000010631260417502300223630ustar00rootroot00000000000000PNG  IHDR szzbKGD pHYs  tIME 335IDATXŖq0F@ Ќo t|*l'uT /tӯZu6K]pMD ,TP ^|Cb,-Q $6w?,8&oZTޱY2wx<,^?pEENUۿ]R:kN? ɅT?{9;H JZ.WZ2[kTLئ^ʟ~^: )|k T2sI8I 1fU7"> ^) +#B5{EG"_~+Κ26&Zh8H5Ff¥8Foo<`v4 Ij]Jpu '~|PBsA3bk"# U>#4ϊFVd9s>?K$|WΚ9y"ˈF#s;0j\@#!7;_"mBz桹hy-J@8DMӈK7^dGh퍊 IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/vk/play_alt.png000066400000000000000000000007401260417502300232340ustar00rootroot00000000000000PNG  IHDR szzbKGDNr.( pHYs  tIME8*OmIDATX͗u0?x@6l@ *sRR2) b&0#0#Tp $"KVC_8k==+jo YVLBtfy2Xi,ⶀ*D'iLU"3\61q}r J%CCg/D pp֤MnưĴ8;o([)>gG߈ b$\]'@@gGнB+#bYڭG W<,YPIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/vk/playlist.png000066400000000000000000000003051260417502300232650ustar00rootroot00000000000000PNG  IHDR ½"bKGDNr.( pHYs  tIME767rRIDATH! ;ڹQ6r ;`ᣋnzmRi82(_(Le ?Kv; ;`~߁ &i/FIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/vk/recommends.png000066400000000000000000000006461260417502300235700ustar00rootroot00000000000000PNG  IHDR ½"bKGDNr.( pHYs  tIME7 (#3IDATH픿u0?<#IB&pbPt( POLl<$*xH;Wt> L+pr m_F}E΁F( PXcQt |;{{t6fYkTѿ [#`}MkT fIJkKk/&4Zaz+tBx ]L;\-83/o_y_n N?.cEyWp?DBX06he`?uݾ{u}[%,.qlz`ZYIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/vk/remove.png000066400000000000000000000002161260417502300227220ustar00rootroot00000000000000PNG  IHDR bKGD pHYs  tIME .ƅIDAT8cLaQ:`AǖIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/vk/upload.png000066400000000000000000000004741260417502300227170ustar00rootroot00000000000000PNG  IHDR ^8bKGD pHYs  tIME 5IDATH !E?KX;}gN[Νv[%l vYC8cO eE=6XY2w2ϩTj Yeg]Y42.W@mg/Y7ĀޅuGL֑{Nl4'2ul5 c 8ѷBA -mhUiT@T@1!\IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/vk/user.png000066400000000000000000000006561260417502300224130ustar00rootroot00000000000000PNG  IHDR ^8bKGDNr.( pHYs  tIME8s#;IDATH핱u0E/!l\qIPO2 A#0s8N@IRHLfTj?> nY ?)>SN˂Ȝ9@rUki ]D*pxK5tn s2y4_uҡ9@s]u]wgu0u[7E䁓<2YNdMN;0uէ/n68W3vqJgup (G%9K%M Xeo; 88+j;YZ~IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/volumeslider-gradient.png000066400000000000000000000006001260417502300253070ustar00rootroot00000000000000PNG  IHDRp$Q pHYs+2IDAThNQ5(E_Q1 3^OP/ui""""""^dƨ~q]l6&&6ZQǣq:7$3Jm3({zSaA4l5.(Se\1+ԺOq-hWfZ֝r/Qv X{RMқr}|1Dy7ٖL:՛rK)GYY(3dR_r]C7{ R5Aq*p%Kf_Zs8IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/volumeslider-handle.png000066400000000000000000000005401260417502300247500ustar00rootroot00000000000000PNG  IHDR$*rQgAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8cπ2*U0$ĈG #; B4ryF ǿ'6цAn/k`I `Ҍl9CA6Uf Vm@QT9.~v-__ 2;NtrÕPhJt<|Л":@`zALh(آ @P_0 *>IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/data/volumeslider-handle_glow.png000066400000000000000000000013331260417502300260010ustar00rootroot00000000000000PNG  IHDR$gAMA7tEXtSoftwareAdobe ImageReadyqe<mIDATHMHA<<D uK!)D֡ѭ̠Tʗ($Ɋ. YIn3;  s#1P P _B+ 8' qߟa'+g|#k? 膆xHb:|6O:dֶͮlܲ,ɤ5n@<}IEQoߎ955KR6)Gay cJn:s/& exW.Ōՠu-J-ƶcYR)/cuCS)\qp~)CJ/RZrhmڐ~'D"_sp$ )*R&(ePk9 )TjjIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/dist/000077500000000000000000000000001260417502300203325ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/dist/CMakeLists.txt000066400000000000000000000050521260417502300230740ustar00rootroot00000000000000execute_process(COMMAND date "+%a %b %d %Y" OUTPUT_VARIABLE RPM_DATE OUTPUT_STRIP_TRAILING_WHITESPACE) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/clementine.spec.in ${CMAKE_CURRENT_SOURCE_DIR}/clementine.spec @ONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/maketarball.sh.in ${CMAKE_CURRENT_SOURCE_DIR}/maketarball.sh @ONLY) # Create two installers, one for the normal version, one for the portable one # Create normal installer set(PORTABLE ";") set(NORMAL "") configure_file(${CMAKE_CURRENT_SOURCE_DIR}/windows/clementine.nsi.in ${CMAKE_CURRENT_SOURCE_DIR}/windows/clementine.nsi @ONLY) # Create portable installer set(PORTABLE "") set(NORMAL ";") configure_file(${CMAKE_CURRENT_SOURCE_DIR}/windows/clementine.nsi.in ${CMAKE_CURRENT_SOURCE_DIR}/windows/clementine-portable.nsi @ONLY) # windows/windres.rc is done by src/CMakeLists.txt if(EXISTS /etc/lsb-release) file(READ "/etc/lsb-release" LSB_RELEASE_CONTENTS) string(REGEX MATCH "DISTRIB_ID=Ubuntu" IS_UBUNTU ${LSB_RELEASE_CONTENTS}) if(IS_UBUNTU) set(INSTALL_UBUNTU_ICONS_DEFAULT ON) else(IS_UBUNTU) set(INSTALL_UBUNTU_ICONS_DEFAULT OFF) endif(IS_UBUNTU) else(EXISTS /etc/lsb-release) set(INSTALL_UBUNTU_ICONS_DEFAULT OFF) endif(EXISTS /etc/lsb-release) option(INSTALL_UBUNTU_ICONS "Install the Ubuntu themed monochrome panel icons" ${INSTALL_UBUNTU_ICONS_DEFAULT}) if (NOT APPLE) install(FILES clementine_64.png DESTINATION share/icons/hicolor/64x64/apps/ RENAME clementine.png ) install(FILES clementine_128.png DESTINATION share/icons/hicolor/128x128/apps/ RENAME clementine.png ) install(FILES ../data/icon.svg DESTINATION share/icons/hicolor/scalable/apps/ RENAME clementine.svg ) install(FILES clementine.desktop DESTINATION share/applications ) install(FILES clementine-itms.protocol clementine-itpc.protocol clementine-feed.protocol clementine-zune.protocol DESTINATION share/kde4/services ) install(FILES clementine.appdata.xml DESTINATION share/appdata ) if(INSTALL_UBUNTU_ICONS) foreach(icon clementine-panel.png clementine-panel-grey.png) foreach(theme ubuntu-mono-dark ubuntu-mono-light) install(FILES icons/${theme}/${icon} DESTINATION share/icons/${theme}/apps/24/ ) endforeach(theme) endforeach(icon) endif(INSTALL_UBUNTU_ICONS) endif (NOT APPLE) clementine-1.2.3+git1354-gdaddbde+dfsg/dist/DS_Store.in000066400000000000000000000360041260417502300223470ustar00rootroot00000000000000Bud1    obR  @ @ @ @ .IlocblobR(.bwspblobbplist00  \WindowBounds[ShowSidebar]ShowStatusBar[ShowPathbar[ShowToolbar\SidebarWidth_{{494, 323}, {500, 392}} ". NSPrincipalClass NSApplication CFBundleDevelopmentRegion English CFBundleExecutable clementine CFBundleGetInfoString Clementine ${CLEMENTINE_VERSION_DISPLAY} CFBundleIconFile clementine CFBundleIdentifier org.clementine-player.clementine CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString ${CLEMENTINE_VERSION_DISPLAY} CFBundleName Clementine CFBundlePackageType APPL CFBundleShortVersionString ${CLEMENTINE_VERSION_DISPLAY} CFBundleVersion ${CLEMENTINE_VERSION_PLIST} CSResourcesFileMapped LSRequiresCarbon LSApplicationCategoryType public.app-category.music LSMinimumSystemVersion 10.7.0 SUFeedURL https://clementine-data.appspot.com/sparkle SUPublicDSAKeyFile sparkle_pub.pem BreakpadProduct Clementine BreakpadProductDisplay Clementine BreakpadURL http://crashes.clementine-player.org/getuploadurl BreakpadReportInterval 30 CFBundleDocumentTypes CFBundleTypeOSTypes **** fold disk CFBundleTypeRole Viewer CFBundleTypeExtensions xspf CFBundleTypeIconFile Generic.icns CFBundleTypeMIMETypes application/xspf+xml CFBundleTypeName XSPF Playlist CFBundleTypeRole Viewer CFBundleTypeExtensions wav CFBundleTypeMIMETypes audio/x-wav CFBundleTypeName WAVE Audio File CFBundleTypeRole Viewer CFBundleTypeExtensions pls CFBundleTypeIconFile pls.icns CFBundleTypeName Shoutcast playlist CFBundleTypeRole Viewer CFBundleTypeExtensions m3u CFBundleTypeIconFile m3u.icns CFBundleTypeMIMETypes audio/x-mpegurl CFBundleTypeName Playlist file CFBundleTypeRole Viewer CFBundleTypeExtensions aac CFBundleTypeIconFile mpeg4.icns CFBundleTypeName AAC file CFBundleTypeRole Viewer CFBundleTypeExtensions ogg ogx ogm CFBundleTypeIconFile ogg.icns CFBundleTypeMIMETypes audio/ogg CFBundleTypeName Ogg Vorbis File CFBundleTypeRole Viewer CFBundleTypeExtensions oga CFBundleTypeIconFile ogg.icns CFBundleTypeMIMETypes audio/ogg CFBundleTypeName Ogg Audio File CFBundleTypeRole Viewer CFBundleTypeExtensions wma CFBundleTypeIconFile wma.icns CFBundleTypeName WIndows Media Audio CFBundleTypeRole Viewer CFBundleTypeExtensions mp3 CFBundleTypeIconFile mp3.icns CFBundleTypeMIMETypes audio/mpeg CFBundleTypeName MPEG Audio Layer 3 CFBundleTypeRole Viewer CFBundleTypeExtensions 3gp CFBundleTypeIconFile generic.icns CFBundleTypeName 3GPP File CFBundleTypeRole Viewer CFBundleTypeExtensions m4a CFBundleTypeIconFile mpeg4.icns CFBundleTypeName MPEG-4 Audio File CFBundleTypeRole Viewer CFBundleTypeExtensions mpc CFBundleTypeIconFile generic.icns CFBundleTypeName Musepack Audio File CFBundleTypeRole Viewer CFBundleTypeExtensions flac CFBundleTypeIconFile generic.icns CFBundleTypeMIMETypes audio/flac CFBundleTypeName FLAC Audio File CFBundleTypeRole Viewer clementine-1.2.3+git1354-gdaddbde+dfsg/dist/cacert.pem000066400000000000000000007705701260417502300223160ustar00rootroot00000000000000## ## Bundle of CA Root Certificates ## ## Certificate data from Mozilla as of: Wed Apr 22 03:12:04 2015 ## ## This is a bundle of X.509 certificates of public Certificate Authorities ## (CA). These were automatically extracted from Mozilla's root certificates ## file (certdata.txt). This file can be found in the mozilla source tree: ## http://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt ## ## It contains the certificates in PEM format and therefore ## can be directly used with curl / libcurl / php_curl, or with ## an Apache+mod_ssl webserver for SSL client authentication. ## Just configure this file as the SSLCACertificateFile. ## ## Conversion done with mk-ca-bundle.pl version 1.25. ## SHA1: ed3c0bbfb7912bcc00cd2033b0cb85c98d10559c ## Equifax Secure CA ================= -----BEGIN CERTIFICATE----- MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW 8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 70+sB3c4 -----END CERTIFICATE----- GlobalSign Root CA ================== -----BEGIN CERTIFICATE----- MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== -----END CERTIFICATE----- GlobalSign Root CA - R2 ======================= -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== -----END CERTIFICATE----- Verisign Class 3 Public Primary Certification Authority - G3 ============================================================ -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== -----END CERTIFICATE----- Verisign Class 4 Public Primary Certification Authority - G3 ============================================================ -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM 8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== -----END CERTIFICATE----- Entrust.net Premium 2048 Secure Server CA ========================================= -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= -----END CERTIFICATE----- Baltimore CyberTrust Root ========================= -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp -----END CERTIFICATE----- AddTrust Low-Value Services Root ================================ -----BEGIN CERTIFICATE----- MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= -----END CERTIFICATE----- AddTrust External Root ====================== -----BEGIN CERTIFICATE----- MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= -----END CERTIFICATE----- AddTrust Public Services Root ============================= -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB /zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL +YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= -----END CERTIFICATE----- AddTrust Qualified Certificates Root ==================================== -----BEGIN CERTIFICATE----- MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx 64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= -----END CERTIFICATE----- Entrust Root Certification Authority ==================================== -----BEGIN CERTIFICATE----- MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- RSA Security 2048 v3 ==================== -----BEGIN CERTIFICATE----- MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP +Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj 0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA pKnXwiJPZ9d37CAFYd4= -----END CERTIFICATE----- GeoTrust Global CA ================== -----BEGIN CERTIFICATE----- MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet 8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm Mw== -----END CERTIFICATE----- GeoTrust Global CA 2 ==================== -----BEGIN CERTIFICATE----- MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF H4z1Ir+rzoPz4iIprn2DQKi6bA== -----END CERTIFICATE----- GeoTrust Universal CA ===================== -----BEGIN CERTIFICATE----- MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs 7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d 8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI P/rmMuGNG2+k5o7Y+SlIis5z/iw= -----END CERTIFICATE----- GeoTrust Universal CA 2 ======================= -----BEGIN CERTIFICATE----- MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP 20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG 8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 +/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ 4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS -----END CERTIFICATE----- Visa eCommerce Root =================== -----BEGIN CERTIFICATE----- MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI /k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt 398znM/jra6O1I7mT1GvFpLgXPYHDw== -----END CERTIFICATE----- Certum Root CA ============== -----BEGIN CERTIFICATE----- MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ 89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ 0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== -----END CERTIFICATE----- Comodo AAA Services root ======================== -----BEGIN CERTIFICATE----- MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== -----END CERTIFICATE----- Comodo Secure Services root =========================== -----BEGIN CERTIFICATE----- MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP 9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm 4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H RR3B7Hzs/Sk= -----END CERTIFICATE----- Comodo Trusted Services root ============================ -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y /9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB /zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O 9y5Xt5hwXsjEeLBi -----END CERTIFICATE----- QuoVadis Root CA ================ -----BEGIN CERTIFICATE----- MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi 5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi 5nrQNiOKSnQ2+Q== -----END CERTIFICATE----- QuoVadis Root CA 2 ================== -----BEGIN CERTIFICATE----- MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt 66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK +JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II 4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u -----END CERTIFICATE----- QuoVadis Root CA 3 ================== -----BEGIN CERTIFICATE----- MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= -----END CERTIFICATE----- Security Communication Root CA ============================== -----BEGIN CERTIFICATE----- MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi FL39vmwLAw== -----END CERTIFICATE----- Sonera Class 2 Root CA ====================== -----BEGIN CERTIFICATE----- MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 /Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt 0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH llpwrN9M -----END CERTIFICATE----- Staat der Nederlanden Root CA ============================= -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== -----END CERTIFICATE----- UTN DATACorp SGC Root CA ======================== -----BEGIN CERTIFICATE----- MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA 9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv 33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI -----END CERTIFICATE----- UTN USERFirst Hardware Root CA ============================== -----BEGIN CERTIFICATE----- MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM //bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 nfhmqA== -----END CERTIFICATE----- Camerfirma Chambers of Commerce Root ==================================== -----BEGIN CERTIFICATE----- MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 erfutGWaIZDgqtCYvDi1czyL+Nw= -----END CERTIFICATE----- Camerfirma Global Chambersign Root ================================== -----BEGIN CERTIFICATE----- MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J 1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl 6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c 8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== -----END CERTIFICATE----- NetLock Notary (Class A) Root ============================= -----BEGIN CERTIFICATE----- MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC /tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM 8CgHrTwXZoi1/baI -----END CERTIFICATE----- XRamp Global CA Root ==================== -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= -----END CERTIFICATE----- Go Daddy Class 2 CA =================== -----BEGIN CERTIFICATE----- MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b vZ8= -----END CERTIFICATE----- Starfield Class 2 CA ==================== -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 QBFGmh95DmK/D5fs4C8fF5Q= -----END CERTIFICATE----- StartCom Certification Authority ================================ -----BEGIN CERTIFICATE----- MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT 37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh 3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl 1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro g14= -----END CERTIFICATE----- Taiwan GRCA =========== -----BEGIN CERTIFICATE----- MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O 1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk 7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy +fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS -----END CERTIFICATE----- Swisscom Root CA 1 ================== -----BEGIN CERTIFICATE----- MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4 MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn 7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5 haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9 MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3 1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW NY6E0F/6MBr1mmz0DlP5OlvRHA== -----END CERTIFICATE----- DigiCert Assured ID Root CA =========================== -----BEGIN CERTIFICATE----- MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== -----END CERTIFICATE----- DigiCert Global Root CA ======================= -----BEGIN CERTIFICATE----- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- DigiCert High Assurance EV Root CA ================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K -----END CERTIFICATE----- Certplus Class 2 Primary CA =========================== -----BEGIN CERTIFICATE----- MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR 5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ 7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW //1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 l7+ijrRU -----END CERTIFICATE----- DST Root CA X3 ============== -----BEGIN CERTIFICATE----- MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ -----END CERTIFICATE----- DST ACES CA X6 ============== -----BEGIN CERTIFICATE----- MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 oKfN5XozNmr6mis= -----END CERTIFICATE----- TURKTRUST Certificate Services Provider Root 1 ============================================== -----BEGIN CERTIFICATE----- MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ 8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H -----END CERTIFICATE----- TURKTRUST Certificate Services Provider Root 2 ============================================== -----BEGIN CERTIFICATE----- MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr 5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P 9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 UrbnBEI= -----END CERTIFICATE----- SwissSign Gold CA - G2 ====================== -----BEGIN CERTIFICATE----- MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR 7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm 5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr 44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ -----END CERTIFICATE----- SwissSign Silver CA - G2 ======================== -----BEGIN CERTIFICATE----- MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG 9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm +/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH 6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P 4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L 3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx /uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u -----END CERTIFICATE----- GeoTrust Primary Certification Authority ======================================== -----BEGIN CERTIFICATE----- MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG 1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= -----END CERTIFICATE----- thawte Primary Root CA ====================== -----BEGIN CERTIFICATE----- MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ 1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== -----END CERTIFICATE----- VeriSign Class 3 Public Primary Certification Authority - G5 ============================================================ -----BEGIN CERTIFICATE----- MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq -----END CERTIFICATE----- SecureTrust CA ============== -----BEGIN CERTIFICATE----- MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= -----END CERTIFICATE----- Secure Global CA ================ -----BEGIN CERTIFICATE----- MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW -----END CERTIFICATE----- COMODO Certification Authority ============================== -----BEGIN CERTIFICATE----- MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== -----END CERTIFICATE----- Network Solutions Certificate Authority ======================================= -----BEGIN CERTIFICATE----- MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc /Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q 4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey -----END CERTIFICATE----- WellsSecure Public Root Certificate Authority ============================================= -----BEGIN CERTIFICATE----- MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ tylv2G0xffX8oRAHh84vWdw+WNs= -----END CERTIFICATE----- COMODO ECC Certification Authority ================================== -----BEGIN CERTIFICATE----- MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= -----END CERTIFICATE----- IGC/A ===== -----BEGIN CERTIFICATE----- MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF 0mBWWg== -----END CERTIFICATE----- Security Communication EV RootCA1 ================================= -----BEGIN CERTIFICATE----- MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO /VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK 9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 -----END CERTIFICATE----- OISTE WISeKey Global Root GA CA =============================== -----BEGIN CERTIFICATE----- MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ /yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 +vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= -----END CERTIFICATE----- Microsec e-Szigno Root CA ========================= -----BEGIN CERTIFICATE----- MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA 4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a 86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= -----END CERTIFICATE----- Certigna ======== -----BEGIN CERTIFICATE----- MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== -----END CERTIFICATE----- TC TrustCenter Class 2 CA II ============================ -----BEGIN CERTIFICATE----- MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB 7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk vQ== -----END CERTIFICATE----- TC TrustCenter Universal CA I ============================= -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG 1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a 7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY -----END CERTIFICATE----- Deutsche Telekom Root CA 2 ========================== -----BEGIN CERTIFICATE----- MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU Cm26OWMohpLzGITY+9HPBVZkVw== -----END CERTIFICATE----- ComSign Secured CA ================== -----BEGIN CERTIFICATE----- MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs 49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH 7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP 51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== -----END CERTIFICATE----- Cybertrust Global Root ====================== -----BEGIN CERTIFICATE----- MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW 0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin 89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT 8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi 5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW WL1WMRJOEcgh4LMRkWXbtKaIOM5V -----END CERTIFICATE----- ePKI Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX 12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= -----END CERTIFICATE----- T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 ============================================================================================================================= -----BEGIN CERTIFICATE----- MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR 6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= -----END CERTIFICATE----- Buypass Class 2 CA 1 ==================== -----BEGIN CERTIFICATE----- MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV 1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt 7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho -----END CERTIFICATE----- Buypass Class 3 CA 1 ==================== -----BEGIN CERTIFICATE----- MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c 1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 -----END CERTIFICATE----- EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 ========================================================================== -----BEGIN CERTIFICATE----- MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0 Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB /wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK 1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt 2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9 AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT -----END CERTIFICATE----- certSIGN ROOT CA ================ -----BEGIN CERTIFICATE----- MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD -----END CERTIFICATE----- CNNIC ROOT ========== -----BEGIN CERTIFICATE----- MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m mxE= -----END CERTIFICATE----- ApplicationCA - Japanese Government =================================== -----BEGIN CERTIFICATE----- MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g /DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL rosot4LKGAfmt1t06SAZf7IbiVQ= -----END CERTIFICATE----- GeoTrust Primary Certification Authority - G3 ============================================= -----BEGIN CERTIFICATE----- MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr 2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt -----END CERTIFICATE----- thawte Primary Root CA - G2 =========================== -----BEGIN CERTIFICATE----- MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== -----END CERTIFICATE----- thawte Primary Root CA - G3 =========================== -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC +BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY 7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC 8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= -----END CERTIFICATE----- GeoTrust Primary Certification Authority - G2 ============================================= -----BEGIN CERTIFICATE----- MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 npaqBA+K -----END CERTIFICATE----- VeriSign Universal Root Certification Authority =============================================== -----BEGIN CERTIFICATE----- MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj 1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 mJO37M2CYfE45k+XmCpajQ== -----END CERTIFICATE----- VeriSign Class 3 Public Primary Certification Authority - G4 ============================================================ -----BEGIN CERTIFICATE----- MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB /zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== -----END CERTIFICATE----- NetLock Arany (Class Gold) Főtanúsítvány ============================================ -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= -----END CERTIFICATE----- Staat der Nederlanden Root CA - G2 ================================== -----BEGIN CERTIFICATE----- MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ 5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65 48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737 qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz +51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm 66+KAQ== -----END CERTIFICATE----- CA Disig ======== -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA 4Z7CRneC9VkGjCFMhwnN5ag= -----END CERTIFICATE----- Juur-SK ======= -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC +Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 yyqcjg== -----END CERTIFICATE----- Hongkong Post Root CA 1 ======================= -----BEGIN CERTIFICATE----- MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== -----END CERTIFICATE----- SecureSign RootCA11 =================== -----BEGIN CERTIFICATE----- MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= -----END CERTIFICATE----- ACEDICOM Root ============= -----BEGIN CERTIFICATE----- MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4 MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2 3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9 2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz 4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU 9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1 ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA== -----END CERTIFICATE----- Microsec e-Szigno Root CA 2009 ============================== -----BEGIN CERTIFICATE----- MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi LXpUq3DDfSJlgnCW -----END CERTIFICATE----- GlobalSign Root CA - R3 ======================= -----BEGIN CERTIFICATE----- MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r kpeDMdmztcpHWD9f -----END CERTIFICATE----- Autoridad de Certificacion Firmaprofesional CIF A62634068 ========================================================= -----BEGIN CERTIFICATE----- MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx 51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi 6Et8Vcad+qMUu2WFbm5PEn4KPJ2V -----END CERTIFICATE----- Izenpe.com ========== -----BEGIN CERTIFICATE----- MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ 03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU +zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK 0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ 0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== -----END CERTIFICATE----- Chambers of Commerce Root - 2008 ================================ -----BEGIN CERTIFICATE----- MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ 0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH 3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF 9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ -----END CERTIFICATE----- Global Chambersign Root - 2008 ============================== -----BEGIN CERTIFICATE----- MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB /gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp 1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG /5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg 9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z 09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B -----END CERTIFICATE----- Go Daddy Root Certificate Authority - G2 ======================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 -----END CERTIFICATE----- Starfield Root Certificate Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 -----END CERTIFICATE----- Starfield Services Root Certificate Authority - G2 ================================================== -----BEGIN CERTIFICATE----- MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 -----END CERTIFICATE----- AffirmTrust Commercial ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= -----END CERTIFICATE----- AffirmTrust Networking ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= -----END CERTIFICATE----- AffirmTrust Premium =================== -----BEGIN CERTIFICATE----- MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== -----END CERTIFICATE----- AffirmTrust Premium ECC ======================= -----BEGIN CERTIFICATE----- MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM eQ== -----END CERTIFICATE----- Certum Trusted Network CA ========================= -----BEGIN CERTIFICATE----- MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= -----END CERTIFICATE----- Certinomis - Autorité Racine ============================= -----BEGIN CERTIFICATE----- MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw 2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g 530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna 4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ vgt2Fl43N+bYdJeimUV5 -----END CERTIFICATE----- Root CA Generalitat Valenciana ============================== -----BEGIN CERTIFICATE----- MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt +GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= -----END CERTIFICATE----- A-Trust-nQual-03 ================ -----BEGIN CERTIFICATE----- MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 ahq97BvIxYSazQ== -----END CERTIFICATE----- TWCA Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== -----END CERTIFICATE----- Security Communication RootCA2 ============================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ +T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R 3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk 3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 -----END CERTIFICATE----- EC-ACC ====== -----BEGIN CERTIFICATE----- MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw 0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D 5EI= -----END CERTIFICATE----- Hellenic Academic and Research Institutions RootCA 2011 ======================================================= -----BEGIN CERTIFICATE----- MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI 1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa 71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u 8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH 3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD /md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N 7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 -----END CERTIFICATE----- Actalis Authentication Root CA ============================== -----BEGIN CERTIFICATE----- MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC 4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo 2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== -----END CERTIFICATE----- Trustis FPS Root CA =================== -----BEGIN CERTIFICATE----- MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P 8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl iB6XzCGcKQENZetX2fNXlrtIzYE= -----END CERTIFICATE----- StartCom Certification Authority ================================ -----BEGIN CERTIFICATE----- MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT 37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA 2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= -----END CERTIFICATE----- StartCom Certification Authority G2 =================================== -----BEGIN CERTIFICATE----- MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG 4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K 2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG /+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm 7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm obp573PYtlNXLfbQ4ddI -----END CERTIFICATE----- Buypass Class 2 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn 9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b /+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN rJgWVqA= -----END CERTIFICATE----- Buypass Class 3 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR 5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh 7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH 2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV /afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz 6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi Cp/HuZc= -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 3 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK 9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W 0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== -----END CERTIFICATE----- EE Certification Centre Root CA =============================== -----BEGIN CERTIFICATE----- MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw 93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU 3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM dcGWxZ0= -----END CERTIFICATE----- TURKTRUST Certificate Services Provider Root 2007 ================================================= -----BEGIN CERTIFICATE----- MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK poRq0Tl9 -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 2009 ============================== -----BEGIN CERTIFICATE----- MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ 4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm 2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 EV 2009 ================================= -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T 7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv w9y4AyHqnxbxLFS1 -----END CERTIFICATE----- PSCProcert ========== -----BEGIN CERTIFICATE----- MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA 3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2 0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH 0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/ AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG 9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52 ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1 n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo 5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq 3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5 poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km -----END CERTIFICATE----- China Internet Network Information Center EV Certificates Root ============================================================== -----BEGIN CERTIFICATE----- MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV 98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23 KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC 7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5 0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM 7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0 5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8= -----END CERTIFICATE----- Swisscom Root CA 2 ================== -----BEGIN CERTIFICATE----- MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBkMQswCQYDVQQG EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2 MjUwNzM4MTRaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIIC IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvErjw0DzpPM LgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r0rk0X2s682Q2zsKwzxNo ysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJ wDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVPACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpH Wrumnf2U5NGKpV+GY3aFy6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1a SgJA/MTAtukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL6yxS NLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0uPoTXGiTOmekl9Ab mbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrALacywlKinh/LTSlDcX3KwFnUey7QY Ypqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velhk6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3 qPyZ7iVNTA6z00yPhOgpD/0QVAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw HQYDVR0hBBYwFDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqhb97iEoHF8Twu MA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4RfbgZPnm3qKhyN2abGu2sEzsO v2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ 82YqZh6NM4OKb3xuqFp1mrjX2lhIREeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLz o9v/tdhZsnPdTSpxsrpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcs a0vvaGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciATwoCqISxx OQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99nBjx8Oto0QuFmtEYE3saW mA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5Wt6NlUe07qxS/TFED6F+KBZvuim6c779o +sjaC+NCydAXFJy3SuCvkychVSa1ZC+N8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TC rvJcwhbtkj6EPnNgiLx29CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX 5OfNeOI5wSsSnqaeG8XmDtkx2Q== -----END CERTIFICATE----- Swisscom Root EV CA 2 ===================== -----BEGIN CERTIFICATE----- MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAwZzELMAkGA1UE BhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdpdGFsIENlcnRpZmljYXRlIFNl cnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcN MzEwNjI1MDg0NTA4WjBnMQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsT HERpZ2l0YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYg Q0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7BxUglgRCgz o3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD1ycfMQ4jFrclyxy0uYAy Xhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPHoCE2G3pXKSinLr9xJZDzRINpUKTk4Rti GZQJo/PDvO/0vezbE53PnUgJUmfANykRHvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8Li qG12W0OfvrSdsyaGOx9/5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaH Za0zKcQvidm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHLOdAG alNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaCNYGu+HuB5ur+rPQa m3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f46Fq9mDU5zXNysRojddxyNMkM3Ox bPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCBUWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDi xzgHcgplwLa7JSnaFp6LNYth7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/ BAQDAgGGMB0GA1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWBbj2ITY1x0kbB bkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6xXCX5145v9Ydkn+0UjrgEjihL j6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98TPLr+flaYC/NUn81ETm484T4VvwYmneTwkLbU wp4wLh/vx3rEUMfqe9pQy3omywC0Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7 XwgiG/W9mR4U9s70WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH 59yLGn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm7JFe3VE/ 23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4Snr8PyQUQ3nqjsTzyP6Wq J3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VNvBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyA HmBR3NdUIR7KYndP+tiPsys6DXhyyWhBWkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/gi uMod89a2GQ+fYWVq6nTIfI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuW l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc= -----END CERTIFICATE----- CA Disig Root R1 ================ -----BEGIN CERTIFICATE----- MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy 3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8 u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2 m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6 vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ 04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85 YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ a7+h89n07eLw4+1knj0vllJPgFOL -----END CERTIFICATE----- CA Disig Root R2 ================ -----BEGIN CERTIFICATE----- MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa 5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV 7+ZtsH8tZ/3zbBt1RqPlShfppNcL -----END CERTIFICATE----- ACCVRAIZ1 ========= -----BEGIN CERTIFICATE----- MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ 0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR 5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J 9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd 3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p EfbRD0tVNEYqi4Y7 -----END CERTIFICATE----- TWCA Global Root CA =================== -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M 8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg /eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= -----END CERTIFICATE----- TeliaSonera Root CA v1 ====================== -----BEGIN CERTIFICATE----- MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ 6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA 3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx 0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= -----END CERTIFICATE----- E-Tugra Certification Authority =============================== -----BEGIN CERTIFICATE----- MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB /wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G C7TbO6Orb1wdtn7os4I07QZcJA== -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 2 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR 3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN 9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== -----END CERTIFICATE----- Atos TrustedRoot 2011 ===================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr 54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G 3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed -----END CERTIFICATE----- QuoVadis Root CA 1 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV 7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX 9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP +V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh 3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV hMJKzRwuJIczYOXD -----END CERTIFICATE----- QuoVadis Root CA 2 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD 6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr O3jtZsSOeWmD3n+M -----END CERTIFICATE----- QuoVadis Root CA 3 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe 6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX 0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 PpxxVJkES/1Y+Zj0 -----END CERTIFICATE----- DigiCert Assured ID Root G2 =========================== -----BEGIN CERTIFICATE----- MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH 35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv 0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo IhNzbM8m9Yop5w== -----END CERTIFICATE----- DigiCert Assured ID Root G3 =========================== -----BEGIN CERTIFICATE----- MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy 1vUhZscv6pZjamVFkpUBtA== -----END CERTIFICATE----- DigiCert Global Root G2 ======================= -----BEGIN CERTIFICATE----- MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO 3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu 5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl MrY= -----END CERTIFICATE----- DigiCert Global Root G3 ======================= -----BEGIN CERTIFICATE----- MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y 3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 VOKa5Vt8sycX -----END CERTIFICATE----- DigiCert Trusted Root G4 ======================== -----BEGIN CERTIFICATE----- MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy 7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN 5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb /UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa 5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP 82Z+ -----END CERTIFICATE----- WoSign ====== -----BEGIN CERTIFICATE----- MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNVBAMTIUNlcnRpZmljYXRpb24g QXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJ BgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA vcqNrLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1UfcIiePyO CbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcSccf+Hb0v1naMQFXQoOXXDX 2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2ZjC1vt7tj/id07sBMOby8w7gLJKA84X5 KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4Mx1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR +ScPewavVIMYe+HdVHpRaG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ez EC8wQjchzDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDaruHqk lWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221KmYo0SLwX3OSACCK2 8jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvASh0JWzko/amrzgD5LkhLJuYwTKVY yrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWvHYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0C AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R 8bNLtwYgFP6HEtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1 LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJMuYhOZO9sxXq T2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2eJXLOC62qx1ViC777Y7NhRCOj y+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VNg64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC 2nz4SNAzqfkHx5Xh9T71XXG68pWpdIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes 5cVAWubXbHssw1abR80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/ EaEQPkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGcexGATVdVh mVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+J7x6v+Db9NpSvd4MVHAx kUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMlOtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGi kpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWTee5Ehr7XHuQe+w== -----END CERTIFICATE----- WoSign China ============ -----BEGIN CERTIFICATE----- MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBGMQswCQYDVQQG EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMMEkNBIOayg+mAmuagueiv geS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYD VQQKExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjAN BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k 8H/rD195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld19AXbbQs5 uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExfv5RxadmWPgxDT74wwJ85 dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnkUkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5 Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+LNVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFy b7Ao65vh4YOhn0pdr8yb+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc 76DbT52VqyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6KyX2m +Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0GAbQOXDBGVWCvOGU6 yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaKJ/kR8slC/k7e3x9cxKSGhxYzoacX GKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwECAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUA A4ICAQBqinA4WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6 yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj/feTZU7n85iY r83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6jBAyvd0zaziGfjk9DgNyp115 j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0A kLppRQjbbpCBhqcqBT/mhDn4t/lXX0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97 qA4bLJyuQHCH2u2nFoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Y jj4Du9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10lO1Hm13ZB ONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Leie2uPAmvylezkolwQOQv T8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR12KvxAmLBsX5VYc8T1yaw15zLKYs4SgsO kI26oQ== -----END CERTIFICATE----- COMODO RSA Certification Authority ================================== -----BEGIN CERTIFICATE----- MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+ 5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX 2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3 sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5 WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+ nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52 7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I LaZRfyHBNVOFBkpdn627G190 -----END CERTIFICATE----- USERTrust RSA Certification Authority ===================================== -----BEGIN CERTIFICATE----- MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz 0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O +T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq /nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8 yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+ eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ 7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM 8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 -----END CERTIFICATE----- USERTrust ECC Certification Authority ===================================== -----BEGIN CERTIFICATE----- MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu 9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= -----END CERTIFICATE----- GlobalSign ECC Root CA - R4 =========================== -----BEGIN CERTIFICATE----- MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q= -----END CERTIFICATE----- GlobalSign ECC Root CA - R5 =========================== -----BEGIN CERTIFICATE----- MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 -----END CERTIFICATE----- Staat der Nederlanden Root CA - G3 ================================== -----BEGIN CERTIFICATE----- MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5 1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp 07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE 41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1 v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA 8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b 8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq 1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk= -----END CERTIFICATE----- Staat der Nederlanden EV Root CA ================================ -----BEGIN CERTIFICATE----- MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r 0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8 Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr 08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV 0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd 74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq 5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi 5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4 WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg== -----END CERTIFICATE----- IdenTrust Commercial Root CA 1 ============================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi 1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl 3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH 6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe 2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R cGzM7vRX+Bi6hG6H -----END CERTIFICATE----- IdenTrust Public Sector Root CA 1 ================================= -----BEGIN CERTIFICATE----- MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL 4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ 3Wl9af0AVqW3rLatt8o+Ae+c -----END CERTIFICATE----- Entrust Root Certification Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP /vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO e4pIb4tF9g== -----END CERTIFICATE----- Entrust Root Certification Authority - EC1 ========================================== -----BEGIN CERTIFICATE----- MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef 9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G -----END CERTIFICATE----- CFCA EV ROOT ============ -----BEGIN CERTIFICATE----- MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD 7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB /wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua 4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su -----END CERTIFICATE----- clementine-1.2.3+git1354-gdaddbde+dfsg/dist/clementine-feed.protocol000066400000000000000000000002651260417502300251440ustar00rootroot00000000000000[Protocol] exec=clementine %U protocol=feed input=none output=none helper=true listing=false reading=false writing=false makedir=false deleting=false URIMode=rawuri Icon=clementine clementine-1.2.3+git1354-gdaddbde+dfsg/dist/clementine-itms.protocol000066400000000000000000000002651260417502300252150ustar00rootroot00000000000000[Protocol] exec=clementine %U protocol=itms input=none output=none helper=true listing=false reading=false writing=false makedir=false deleting=false URIMode=rawuri Icon=clementine clementine-1.2.3+git1354-gdaddbde+dfsg/dist/clementine-itpc.protocol000066400000000000000000000002651260417502300252000ustar00rootroot00000000000000[Protocol] exec=clementine %U protocol=itpc input=none output=none helper=true listing=false reading=false writing=false makedir=false deleting=false URIMode=rawuri Icon=clementine clementine-1.2.3+git1354-gdaddbde+dfsg/dist/clementine-zune.protocol000066400000000000000000000002651260417502300252220ustar00rootroot00000000000000[Protocol] exec=clementine %U protocol=zune input=none output=none helper=true listing=false reading=false writing=false makedir=false deleting=false URIMode=rawuri Icon=clementine clementine-1.2.3+git1354-gdaddbde+dfsg/dist/clementine.appdata.xml000066400000000000000000000033731260417502300246160ustar00rootroot00000000000000 clementine.desktop CC0-1.0 GPL-3.0+ Clementine Music Player Plays music files and internet radio

Clementine is a multiplatform music player focusing on a fast and easy-to-use interface for searching and playing your music.

Summary of included features:

  • Search and play your local music library
  • Listen to internet radio from Last.fm, SomaFM and Magnatune
  • Tabbed playlists, import and export M3U, XSPF, PLS and ASX
  • Visualisations from projectM
  • Transcode music into MP3, Ogg Vorbis, Ogg Speex, FLAC or AA
  • Edit tags on MP3 and OGG files, organise your music
  • Download missing album cover art from Last.fm
  • Native desktop notifications using libnotify
  • Supports MPRIS, or remote control using the command-line
  • Remote control using a Wii Remote, MPRIS or the command-line
  • Copy music to your iPod, iPhone, MTP or mass-storage USB player
https://clementine-player.github.io/pages/images/screenshots/clementine-1.2-1.png https://clementine-player.github.io/pages/images/screenshots/clementine-1.2-2.png https://www.clementine-player.org me@davidsansome.com
clementine-1.2.3+git1354-gdaddbde+dfsg/dist/clementine.desktop000066400000000000000000000152051260417502300240530ustar00rootroot00000000000000[Desktop Entry] Version=1.0 Type=Application Name=Clementine Name[sr]=Клементина Name[sr@ijekavian]=Клементина Name[sr@ijekavianlatin]=Klementina Name[sr@latin]=Klementina GenericName=Clementine Music Player GenericName[ca]=Reproductor de música Clementine GenericName[es]=Reproductor de música Clementine GenericName[pl]=Odtwarzacz muzyki Clementine GenericName[pt]=Reprodutor de músicas Clementine GenericName[sl]=Predvajalnik glasbe Clementine GenericName[sr]=Клементина музички плејер GenericName[sr@ijekavian]=Клементина музички плејер GenericName[sr@ijekavianlatin]=Klementina muzički plejer GenericName[sr@latin]=Klementina muzički plejer Comment=Plays music and last.fm streams Comment[ca]=Reproducció de música i fluxos de Last.fm Comment[es]=Reproducción de música y flujos de Last.fm Comment[pl]=Odtwarzanie muzyki i strumieni last.fm Comment[pt]=Reprodução de músicas e emissões last.fm Comment[sl]=Predvaja glasbo in pretoke last.fm Comment[sr]=Репродукује музику и last.fm токове Comment[sr@ijekavian]=Репродукује музику и last.fm токове Comment[sr@ijekavianlatin]=Reprodukuje muziku i last.fm tokove Comment[sr@latin]=Reprodukuje muziku i last.fm tokove Exec=clementine %U TryExec=clementine Icon=clementine Terminal=false Categories=AudioVideo;Player;Qt;Audio; StartupNotify=false MimeType=application/ogg;application/x-ogg;application/x-ogm-audio;audio/aac;audio/mp4;audio/mpeg;audio/mpegurl;audio/ogg;audio/vnd.rn-realaudio;audio/vorbis;audio/x-flac;audio/x-mp3;audio/x-mpeg;audio/x-mpegurl;audio/x-ms-wma;audio/x-musepack;audio/x-oggflac;audio/x-pn-realaudio;audio/x-scpls;audio/x-speex;audio/x-vorbis;audio/x-vorbis+ogg;audio/x-wav;video/x-ms-asf;x-content/audio-player;x-scheme-handler/zune;x-scheme-handler/itpc;x-scheme-handler/itms;x-scheme-handler/feed; Actions=Play;Pause;Stop;Previous;Next; [Desktop Action Play] Name=Play Exec=clementine --play OnlyShowIn=Unity; Name[af]=Speel Name[be]=Прайграць Name[bg]=Възпроизвеждане Name[br]=Lenn Name[ca]=Reprodueix Name[cs]=Přehrát Name[da]=Afspil Name[de]=Wiedergabe Name[el]=Αναπαραγωγή Name[es]=Reproducir Name[et]=Mängi Name[eu]=Erreproduzitu Name[fa]=پخش Name[fi]=Toista Name[fr]=Lecture Name[ga]=Seinn Name[gl]=Reproducir Name[he]=נגינה Name[hr]=Pokreni reprodukciju Name[hu]=Lejátszás Name[it]=Riproduci Name[ja]=再生 Name[kk]=Ойнату Name[lt]=Groti Name[lv]=Atskaņot Name[ms]=Mainkan Name[nb]=Spill Name[nl]=Afspelen Name[oc]=Lectura Name[pl]=Odtwarzaj Name[pt]=Reproduzir Name[pt_BR]=Reproduzir Name[ro]=Redă Name[ru]=Воспроизвести Name[sk]=Hrať Name[sl]=Predvajaj Name[sr]=Пусти Name[sr@ijekavian]=Пусти Name[sr@ijekavianlatin]=Pusti Name[sr@latin]=Pusti Name[sv]=Spela upp Name[tr]=Çal Name[uk]=Відтворити Name[vi]=Phát Name[zh_CN]=播放 Name[zh_TW]=播放 [Desktop Action Pause] Name=Pause Exec=clementine --pause OnlyShowIn=Unity; Name[be]=Прыпыніць Name[bg]=Пауза Name[br]=Ehan Name[ca]=Pausa Name[cs]=Pozastavit Name[el]=Παύση Name[es]=Pausar Name[et]=Paus Name[eu]=Pausarazi Name[fa]=ایست Name[fi]=Keskeytä Name[ga]=Cuir ar sos Name[gl]=Pausa Name[he]=השהייה Name[hr]=Pauza Name[hu]=Szünet Name[it]=Pausa Name[ja]=一時停止 Name[kk]=Аялдату Name[ko]=일시중지 Name[lt]=Pristabdyti Name[lv]=Pauze Name[nl]=Pauze Name[oc]=Pausa Name[pl]=Pauza Name[pt]=Pausa Name[pt_BR]=Pausar Name[ro]=Pauză Name[ru]=Приостановить Name[sk]=Pozastaviť Name[sl]=Začasno ustavi Name[sr]=Паузирај Name[sr@ijekavian]=Паузирај Name[sr@ijekavianlatin]=Pauziraj Name[sr@latin]=Pauziraj Name[sv]=Gör paus Name[tr]=Duraklat Name[uk]=Призупинити Name[vi]=Tạm dừng Name[zh_CN]=暂停 Name[zh_TW]=暫停 [Desktop Action Stop] Name=Stop Exec=clementine --stop OnlyShowIn=Unity; Name[be]=Спыніць Name[bg]=Спиране Name[br]=Paouez Name[ca]=Atura Name[cs]=Zastavit Name[de]=Anhalten Name[el]=Σταμάτημα Name[es]=Detener Name[et]=Peata Name[eu]=Gelditu Name[fa]=ایست Name[fi]=Pysäytä Name[ga]=Stad Name[gl]=Deter Name[he]=הפסקה Name[hr]=Zaustavi reprodukciju Name[hu]=Leállít Name[it]=Ferma Name[ja]=停止 Name[kk]=Тоқтату Name[ko]=중지 Name[lt]=Stabdyti Name[lv]=Apturēt Name[ms]=Henti Name[nb]=Stopp Name[nl]=Stoppen Name[oc]=Arrestar Name[pl]=Zatrzymaj Name[pt]=Parar Name[pt_BR]=Parar Name[ro]=Oprește Name[ru]=Остановить Name[sk]=Zastaviť Name[sl]=Zaustavi Name[sr]=Заустави Name[sr@ijekavian]=Заустави Name[sr@ijekavianlatin]=Zaustavi Name[sr@latin]=Zaustavi Name[sv]=Stoppa Name[tr]=Durdur Name[uk]=Зупинити Name[vi]=Dừng Name[zh_CN]=停止 Name[zh_TW]=停止 [Desktop Action Previous] Name=Previous Exec=clementine --previous OnlyShowIn=Unity; Name[af]=Vorige Name[be]=Папярэдні Name[bg]=Предишна Name[br]=A-raok Name[ca]=Anterior Name[cs]=Předchozí Name[da]=Forrige Name[de]=Vorheriger Name[el]=Προηγούμενο Name[es]=Anterior Name[eu]=Aurrekoa Name[fa]=پیشین Name[fi]=Edellinen Name[fr]=Précédent Name[ga]=Roimhe Name[gl]=Anterior Name[he]=הקודם Name[hr]=Prijašnje Name[hu]=Előző Name[it]=Precedente Name[ja]=前へ Name[lt]=Atgal Name[lv]=Iepriekšējais Name[nb]=Forrige Name[nl]=Vorige Name[pl]=Wstecz Name[pt]=Anterior Name[pt_BR]=Anterior Name[ro]=Precedenta Name[ru]=Предыдущий Name[sk]=Predchádzajúca Name[sl]=Predhodni Name[sr]=Претходна Name[sr@ijekavian]=Претходна Name[sr@ijekavianlatin]=Prethodna Name[sr@latin]=Prethodna Name[sv]=Föregående Name[tr]=Önceki Name[uk]=Попередня Name[uz]=Oldingi Name[vi]=Trước Name[zh_CN]=上一首 Name[zh_TW]=往前 [Desktop Action Next] Name=Next Exec=clementine --next OnlyShowIn=Unity; Name[af]=Volgende Name[be]=Далей Name[bg]=Следваща Name[br]=Da-heul Name[ca]=Següent Name[cs]=Další Name[da]=Næste Name[de]=Weiter Name[el]=Επόμενο Name[es]=Siguiente Name[eu]=Hurrengoa Name[fa]=پسین Name[fi]=Seuraava Name[fr]=Suivant Name[ga]=Ar aghaidh Name[gl]=Próximo Name[he]=הבא Name[hr]=Sljedeće Name[hu]=Következő Name[id]=Berikut Name[it]=Successivo Name[ja]=次へ Name[ko]=다음 Name[lt]=Toliau Name[lv]=Uz priekšu Name[ms]=Seterusnya Name[nb]=Neste Name[nl]=Volgende Name[pl]=Dalej Name[pt]=Seguinte Name[pt_BR]=Próximo Name[ro]=Următoarea Name[ru]=Дальше Name[sk]=Ďalšia Name[sl]=Naslednji Name[sr]=Следећа Name[sr@ijekavian]=Сљедећа Name[sr@ijekavianlatin]=Sljedeća Name[sr@latin]=Sledeća Name[sv]=Nästa Name[tr]=İleri Name[uk]=Наступна Name[uz]=Keyingi Name[vi]=Tiếp theo Name[zh_CN]=下一首 Name[zh_TW]=下一個 clementine-1.2.3+git1354-gdaddbde+dfsg/dist/clementine.icns000066400000000000000000005453251260417502300233510ustar00rootroot00000000000000icnsis32Y6{K$- d Qc r9 . 3  b o 3 S{[D^dś*ĪAϡ ĩe ï?@W &ƚʭj Ʈq[ǚHĘAũJx#v;h 5N\]S95. RKMpIRS"eFRdV WoHYe~I JzH]my2(#F[jxF iW\itLPzLek{|SmB 5rVShmnsmaZ[L" [RQ_agaZUORL(doHKNMHIJ@Z-`wtgfhx_D\uU  *13.s8mkU2vF"(`K_l4*/z\j/{NwWil32&  VIVXVT> AXROGLTa; YPOYUHI[g1!bCCGU[_[hf9cSJIHNZhjr_ f]VVWY``cqyOh\SFJMTfjjt~5Va|lRY]_cs|,hkx>KR\djqw| i`FLKS^hov~9e][Y\diltGXcvmBVY[istt}V"Ak_L[`gicfs||^/"k\fHQV]gry}|vstnljW \eeEX`fhfrrvwyt}sip^f[_T::l\{LTQTemitjtoup`l\X]PUHJ&ed_W@Wcf_mbdnjkl\a_O\JWNCM)?l`g\TVRc`Ubfdad[TaITPIZLDJ< ]g_m`;R`QQ`\^ZZ\JWTLXDMZKDhe_mYGFL^SYWL[IEWQWQDTKO)je_dƵ{P@PDKTCRUCKTHT>@u_(gia\tżjY\FEVFJ]Wmu Ulh^]pϐ ,Zkkc]^gt~? $DZfjigdcdd`T:"0;BCC@6*l8mk2nqu: jG.kM b CU t8YL` ;}&@\\3fQ+#Ko]2it32L H{7wo l_(YKvj?jd?!aw?*iw7KN&=w_-vNk-N*_ka7.&0w  ww 0^ P0 Q   F oW 4! _  # PV p # 2w 2* P 0w 2*k`:96w`&44!!w!n݈@*[6*4-4d4w44 _(_d0 = N Nt O  0 : K F  Iu Hxܧ`Gz‘`/ %J_݈ ۲_K"&%)1N]Z]Fl|@aꩊ6&ܻe Pӡ* xC էX}˝XdֹXeҤXGŕX*׳ =&֥9\ӛ $Ε aǐ x  ׿bB׹H׵(ײFժ mwԡ_Қ 23ϗ \Ζwy͕D ͗  Μ( ΡdB Ϥ*NѦ ӥm ԥD ֧׫ رX ׻#(ŏ$  ͖qҡB լ  ' ׵ Ǩf ׽ϊ?ǔ)]A И1 ֤ǹ ص.ʦ ď0ϯ( И2^l ש5Э\O ׽8ϻo'> ͞+À ÿ‹@!!խƒ ¾ȗ= ׻  Ʀg˖€ǵ7d֤ T;ػu(ϖ F 2׫hc Ő@;<ՠUZ׼fѠ|$P ׷,q ˝ ,6 ֬SkPǁ:edקZɒ G=BدEu!ЙBZ k?|!%[֯CJХ f B ƙKw Zضa[ե'ћ0} a%˕1gđ 3Ea" ؾ5NJ!ؽ+ Ÿ* *Ɲ, \ț Ϩֺ=̦cֽ}wг5 ̳ ɉɬ ĵ!Ȭ ("ζ [!߀ĭ l"߀Ų"߀ļ!ö& lހӀ(ĿՀ > ݀ րց ݁Ӄԅрہ>݁ՁԀ҂ ہ܀ |h ހ݄܃ڄۅH ށ߁ޅ݁ނǿ% 41ÿ 4M 5yh  a '1i q/0YN 0Pq o?/Ql`@ 1?Yiw viY?1  %-+-"bSIKH<Yj=GEHK?#Ͽ@GFEEHK1 J˲`@GFEEKBnķCGFEGI  {վkGJGFEEM* fӼºZTOJGFDL+:X]WQLIGFEL+;veZ`]ZUPMJHGFEL++f~¸LV[^_]ZVRNKIHHGGFEL+i]AOSX\^^][XURONLKIHGFEK&Ui^h@JKOSWZ]^^\[ZXVTQNLIHGFFI7lbcWBGGHKNQTX[]^]][XURNKIGGJ aebiMDF GHIKORUWZ\]^ ][XTOKHJE 9kcaqEFGHILNPRTWY\]^^\XTOKO=\fe_}DJIJKLMLIGHIIKMOSVY\^_]XSMT3'jce^KTRSTVWUQLIGFGGHJMOSY_b`[TNV'Mice^U\[\\]^]ZUOJGFGGILRYaca[TQUd e^}W^]^_\WQLHGFHIMS\deaYSTT *kbde^pPVU TUX\^]ZTMHFGIJLOWage`YTZGGicde`aFLKOTY]^[TMHGFGHIKLNT]ehf_YShN `ed bVCHGHLQX^_[TOKJJKLLMORXahid]ZTn/icd cQCGFGKRZ__\XUSRQQPPQQU]fkib\Z[r6kbd eNDGFHMU[^_^^]]\[ZXVTUZcklg_\Ze`HjcddcfMDFIMRVZ]_abcb_[WYajnkd__Yu<XgcddcgPGGFGHJMPTX\_bdghgb\Z_hoojd``]z!d cfYMJGFGGILOSVZ]bgkhc]]dmqpidb`iigd cfaUNHFHIKMPSUZbilib_ajqsoiee`vV'kbd efZSKHGGFGHJKMNPRU\elmhcagouupjggb|'/jcdch\ZRMLKIIHHIKLMNPQRTYajnnidfltwvqmihjrcdbh\_ZWUTRPQQRRSSTUTUW\empokilrwyxtpnhyXde`hV_^]]\[Z[\]^][YXZ`horrporvz{{xtrj<de^kMZZ[\\]_`acdeffd`]\]bjptu wz}~~|yurzde^rDPQRRUVW XY[]`begijie`]_djpuxyz|~|v|ode^}?JIIJKLMNPQTWZ]afkmkfa_`diotxz}yKd e^?GFGIJLNQRUY^flolgcabeimquy|&d e`u½CF%GHJKMNPRTY`hnpnkgeegiknrvz~ d bkÿNHIHGHJKMNOPRTV[biprrolklloruy}_dc`NRQQPNMLLNOQ RSUVX\ckqtuuttstvwxz~;cde_tV\[[ZXWWVXYZZYWWXY[_elquxyz{{|}}~~%hde]W^]]^^]_`bcba``adinswz|~=hcd e^PWVWXZ [\^acfggiijikmptxz|~w%kbd;e`vKLLMNPQQRSUX]acfhjlnoprstwyz|~Q&kbd ciÿRDHGHIJKMPTX[]`cgjmopqstvxy{|}-ed eag@GF,GIJMOQSUX[^aeghjkmnpqstvwxyyz}ed e^>HF.GIJLNOQSUWX[]_abdfgijlnoqrstuxz}[fcd e_~CGF0GIJLNOQRTVWY[\^`acdfhjlmoqrtvwy|~#Qhcd blRCGF2GIJLNOQSTVXY[\^`bdegikmoqsuxz|~M@kbd eanBKI5HHIJLNOQSTVWZ\^`behjlmoruxy|J/kbdEe]KRQQPOMKKLNOQSUWZ]`cfjmprtuxz}W!%kcdHe`x]Z[[ZYVQNMOPRUY]aehlortvxyz|}l6fd.cftX^]^_]YTRRTX\afiloprstuuwxyz{|~ t/  `ede^PXWZ]`_\[\^aehkmmnnmnprtvy} ~RMicde_OLNQW]aabcefhiihgedeegilptx|a,HFFGIKMNPQSUVXZ^biotvutqonmnnoqrtw~ }~sN;kbd e]DF0GILPSUVXY[]`diossqnljiijlmnpquz}yx{zc5#jcdFe`t`AIIKNSX\^_abdfhloqqojgeffhiklnorw~~}{xuz}rC _ed[e`EPQTW\`bdefhijlnnmkgdbcdfghjknqv|}}{y}|ywvtquzzJNicde^_UZ\^`bFcdfghhgeca`abcefhimqv{~{~xux}}{wrponmlnuvX0kbd cfW_\ [YXXY[\]^^]C^^`acdfhkpv|~~}z|wrsx~}{{zwrnjfefhikqmGd`f]ZWURQQPOPQSUVWXYZ[\^_acfilqv{~~}{{{x{wqosy~~zuuwxvrmhc``bgihi]N%NicdbeapsHMJIJKLMNPQSTVWYZ\_adhlptwz|{yxx|}}zvywpmotz|xroqsutrnhb^\_dhf`ZY:/kbdbe_FGFFHIKLNOPRTVY[]`dhlosvxyywttvz~~zz~x{xux}wollpvzyrkilnqrqnib\Y]dgd\POL3dde`zl?HFGHJLMOQTW[_bdhloqstuutrppty}~|wtv}yux~wsu}|}~vnkjlqwysjedfilnomh_XX^df`WMHKH+Micdde`GFFGHJLNQVZ^cfikmopponmkjijov{|ytpou}}vrw}uqsz|{~}wnihhmtxtlc``acgknkcZUX`ec[PIEEKB'kbdfe_|x>IILNQTY^begijklkjhfedccejrxzwrnlov}zspv}|soqw~{y|}wnhgfipvumd_]\]_djlf\UTZac^SJFFEGK9 _ede`SHPTWZ]`cecDbb`_^^_`afmuxvpkikqy~|vont|zrmou|}xvz{vmgeeglsuof_\[YZ^fkg^UQU\b`VKGFEII+@kbde`vLY\^_a_][ZYBZZ[[]_bhqvupjghmt{|yqllr{}xpkmt{|wtx{vmfdcdhospg_[YXXZbhh`UOQW^`YOHFEEL<fd\e^yXa]\\[XVTRRSTUVWXYZ\`emsuqjefipw{yslijqy|wojlszzurvyvmfcbadkqph_ZXWVX^egaVOMR[_\SKGFDIH Micd\eblfYWRQPONNOPQRSUVWXZ]ckqspjecgmtxxsmhgioxzvmilszyrnrwvmeb``agopjaZWVUUZcgbWOLNU\]XOHFEFK2'jbd\e^SNJIJJKLMOPQRSUVW[aiorpjdadjrwwslgeehowytkhksywokpuune`_^_dlplcZVUTSW_ebYOKJOW]\TKGFDL: \fcd[e`CHFGIJKLNOPQSUWZ_fmpojd`agoturkgdcdgovwqifirwtlhlsuoe_^]]`hmme[VTRRU\cc[PJHJS[^XPIFDID:kbd\eaoh?HFGIJKLNPRUY]afknmic^^ckqspjebabcfovunfdhqurjehpsof_\[[]cjlf\URQPRX`c]RJGHOX^\UMHFEHD aed\f^¹XAHFHIJLNSX\aehklifa\\_fnroic`_``afouskdbhptqgbemrpg^[ZYZ_gkg^VRPOOT\b_UKGGKT\_[RJGFEJ<:kbd%e^ȿLCGFHILQY_dfgiigb]YY\bjooib_^2`fotphbahpsof`bipph_ZXWX[cihaWQONNQX_`XNHGIOW]^XPIGFDK2 aed#cdFDGGKPW_cdcbaa_ZWVX^fmnjc]\4]]_forne_`gprlc]_fmoh_YWVVX^fhcYQNMLNT]`ZQIFGJQY^]VNHFEK!:lbdeaoEEJOW^aa]ZWV TTUZbjmjd]Z[_foqkb]_fopi`[\bjnh_XUUTUZbgd[RMKPX^]TKGFGKS[^[TLHFD  _ecd#e^zEMV\`^YTQOOPQQRU\ekje]YXXY6Z^gnog_[]emng]YZ_gli_WTSRSV^ed]RLJIILT\^WNHFFHMU\^ZSLIGFEK&,kbd!f]¼PZ_\WQMKLMNNPRXahie^XVVW8XY^gmld\Y[clle\XX[dkiaXSRQQSZbd^UMIHGHOY^ZQIFFGIOW]^ZUOJGFH>Qicde^ȿ¼][WNJIIJKLMOS\dhe_XTTU:VVW]fljaZXZbjkdZVUX`hicYSPPOPV^caXOIGFGMV]\TKGFFGJPX]_\WPKGFGgcd;e^ȿ»[LKGGHIJKLOV_ee_WSRRSSTTUW]fkg^WVX`iibYUTU[dhdZSONQY_a]TMHGGJS\^XNHF GKQW\^]XPIF7lbd _ȿ¼W@GHIIKPYbd`XRPPQQR,TW_gidZUTW_giaWSRSW`fd\RNMLLMRY^_ZTMIGIPY^[RJF GJOUZ^]VMGFQibd;ed`ȿ½l?DHFGHKQ[baZRONOOPPQQRV`gg_WSRU]ff_VQPQT\cd]SMKJKPW\^[UNIGLU]]VMGFGHMT[_ZQIFaecded`½K?GKS]a\TNMNNO-QV`fd\SPPS[df^TPOOQX`d^TMJIHGGJOW\^[UMHJQZ^ZPIFHNW^]ULGFGE$jcded_i@CILV^_XOK4LLMMNNOU_ebYROORZcd]TNMMNS\b_WNIGGFFGIOV\^[RKINW^]VMHFGJS\^YOHFGDL;jbde^RBPZ^\TKIIJJKKLNU^d`WPMMPYbd]TNLKKOW_`ZQJGFGINV]]XOIKR[_[SLGF HOY^[QIFFGDJ[Glbde^YW^ZOIGHHIJJKMU^b]TMLLNV_c^TMJIIKQY^]UMHFGIPY^[RJHMV]_ZRKGF GMV]\TKFGF>4Sibde^nZLKIFFGHHIILU^aZQKJJLR\a^TLHKRZ^[RKGFGLU\]VMHJQZ_^XOIGF GJS\]WMIE=agbdeaatI>DHGFGKT]_WNIHHINW_^UKHFHMV]^XPJGFIQZ^YOHGLT[_\TKGF IPZ^YQCDagbded^rtM>BGHGFIR[^VMHGKS\]VLGFIPY^]VMHFHNX^ZQIGHMV]]VLGF HNX_[L^%agbdeaaZD>BGHGIR[]ULGFIQ[^XNGFGKS[_[QIFGLV][RIFFJR[]VMGF GHLRUbTagbded^kvUC>@GS\^VLGFHOY^ZPIFHNW]]VLGFGKU]\SJGFIQ[]VMHGHGD?B[bagbdeb^tƀ}cQNUWRJHGHMW^\SJGFJR[^YOHFGKU]]ULGGJR\^WLD@>BPnЀ_hbd$ea_z~hRC>>ADKU^_XNHG)FFHOY^[QIFFGGHLV^_XMGDELUWQLSd~} Qmbcd"ee_`yqaSKNUXSIC)DDEFMW^\RIEDCBAENWWPJHNWg{}@lebd ee`_s€?}n`VROMJHJS\\UNLMRXalz½~%ajbcd eea^j€ ӂMkfbd eec^`q ׄ%`kccdeea^`m t >hibcdeb^^cm{2Mkibcdedb_^^cm{ŀŀƁsefX Pjibbde1db_^^afmv|smgb`^]]akM  Pjjcbcdecb`_^`bcdfhjmomljigfca_^ _abcdedelc. Hfkfbbcdedccbcdde dccih>  :[ikfcbcded cbejjP?[ikiecbbcd cbbdilaD5M_ikjhecbbccdccbbdgkjcN.  /DUaikkhfdcbcdcb cdgikkeWC%  0@P\dhkjghgdfhgjkhcYM:% %5?GWTWd e[TWG?5%t8mk@'dZOE:4 /%RHsYxfwsanC\K9Xbv7FCq1)]Jl"02RhMr6 V$k\iD9,H}NYl1"0S mD:o5Z v!7=] wPTn@?gpG9 `  l If`HX 3`c 3Ia oozo7j [8Lt7,.A(uf(|##eF%P;%Q{Ǜi;&@a{ֿx`C$  $$ ic08_ jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2R \ PXX`XX`XX`XXXPPXdKakadu-v5.2.1 r 6Kt5 13(U(M&3a0B@݌ZpTNGs6,;ju! %)KmEkH8\R}vF0-71%n' Ďo¼;v6@Ys5\J7Jyq"); &$ /4*a;QVW(PL#nr 2f̾Yˇ1'U _к}'C=܉He? 䚭*][TbwhRz+Pl~d(za]*M'~6ɲQ~h`h\84I !Xmw^>Ⱥ XC5bgD;񈀢d9'Ę@ӄ)x30U._0`52vM27=aFCĢR6R5/,~m3rHh u%)q?i!#<0٫zZFg*8ٳS2DAgnMGPY1 ~vЮ%O~CVվ%Vm2M1ǝ6ܘh Es O_B 3N2 2&e3.AU#K*8򙬬BqBK78h|ֹeҬ3]VQc[Z>Jhez W6qFO.cwzYÜPPi>@E ')[W3W3M UX[: Q}FX;k]&%>b#i[( VW@.Z8-<+Z0PgBGtWb+7sgv6?!Lj(KZeWwꀪ<'vh[w퇼y)x:*K-P!rfz6_X j9-솩b7)Dω{pRֻxK_qHrCD/y%kw'= &o/aw=-nowdy`:4:xW-?TΚc}WqDq#SsI]ޠaØ; iZ!Ӑ}dߏ}Y2S% B9g-~z-O&rg j*KQ\H=g^߉D&[^m.v(-M.W"SJE?"*9ɚK;~bRl/ͅr! y碶I+tT:,}G#JN11[xV6n5Y@2W^^ /5pJ08N @gI %|@E ?o)Oϊ~$we^"I.Ơ/4X쮥o)%OVku"مǧ9 v=#0‡΅dό/RO38njl;yLV3qzRH,rFWo0hp]ow`!/ V禮i5"A 6,Gh' %aM䵖r4qvұ7M%(XwD"%y,#gѯ'Pi(NXĞ'#oXoy "[ۖyh؊ИOf'xslI  jO#~\JlNNlmH_7U{]6/XyO:ªNO)%^Ι`bػ⥂t]ݹaZyR5 f~ݻ/g3Z>eB0&~(f쿙jF %کQ"-ur{ԏvvmPK2IX0K—h`[#-'RB{"v=>6d-p9/RE|ָD[tw+o#z_*ys.$ о̏w|:mS}L5 AnJ?("Æ8y,9vOUL4A= Sc"!k&TZ_kREX dQ3/d`|]m 2Lr\eV5x+WwnB*5m`أL.x{r5B@?[Nm0=6cmwhHmM< p pSrH/;v(9`kL3\ALQc4|D5&}ǂUO8YMH>Գ3BAaXS6(Tu1:; j5&%`ƟC@$Qԉka޵3GSyjWNa@̈́/qafù4Yll˝Ĩ%ɀIϝ#iR !54 &XW,OOaeo쇔Eei_o= U6aq0me4WZԦH>`mO? 26qmIcL$kGFBg@W'ԧ6şkqy\o(6n95 ?Y.@:4uΈ؟/nD\oD <ÜԀT>M%JvբDA*Hlv(Zǭ=2 4 ۏQ eEDذIȆ92XDlŜfM}QA\&8Zw3uNaqhzzV%ٟ;Wx9h631 FAjD QU]\RI;[OS~^ M i[3^`c쭿0ItesWfX2M;3}r|\9: #e}: ] 3[D=u֥+pwGkre7%©8Qʿ-#n $I¾&)&(DH:w mvaB_nr¨pYH6*lXl]< rrx6F(EFi"=E:*r.#*3Kŗ,1*ٷ')J=VƤxŘ:a5{'Ru,n^q3Yy<ldhwcկ\A/V /SZkf 5"1|cVF幅nkFGJv12|UB풐UQlf1ka I)3@8eLV:]gʐ;tǶŹ+Ps1߼,x.%Lj4ɭ5+6VV,Pms$-KS%6aYz8#SR꼎=r&9M5GڣQ1^j W՛?ڙnOo}|X]G)P9qW^=^',"vLIjq EzOoFeyq`;O@ϵT`SY$~g췈^W*u .a{N/:>Nq<n\"?$R 2C>qp]u@"aI+;3ky[-P? {N&!&.'d+wZ}l ɴ/s.➏[;Rnoh B|seD)lv*qal0|8qf%)ѡ/>;uT!mD?ҧf((%'M9tڿJ0ցgoD%dXR5Lt1w9 `FVyLͭ&1gn^:M/lv& 0Emˠgqx_iiWwC'vv%OPg;e2SR+3&om[yT!ڂD}P)dgCq4pVCm{@q~5 S9XaÓFٔۦ yY H$qv'$7o'9(("t!:9[W8)a "9^)L8$)&xE"ݡ3@A()v`VCĝཡXր Rug#vz˳u 2o A&ǢG pǂִ_#b-($]$S{p_f.Cpf.0tQC1_Uq]#ml7"W*ٍ{n&nSD_]x2B:TQ_c'cʦGx='2٧:ԗk>ljЖ}d LjGM<;K5;{f֣QZy'`/P`y*_Z4gu4#tJev?!z7b<Ɓ{'vjcܑ[X+c[Q " /2b`.X Ԗ~%?zśyl %^'ޘ/,b-Mu1+6WEd 43^&ąnLoi(!q y爐. k~|5P"O`i$Y?YGFw|A8-#/aٗq"H5e{F} z /W8xeAc`[6 6Z؍ߍu (5i+[r#x*nnv^Xgn+y~'~cz⼖B(!BG!10 F1J,`2xvnب#)$7>ZD8F{̏[_]q‚bn3VSGѡٳ-ax)w1U V,;#K~@$c|"rlCe7"k÷9.lM%F0A+8d݌!o)עu%]6o~XnDhfaH۴fl%QKG.JZjJD 0y9?^Kjgd 68`#`XL6Z Rug~ u*aЕ ӑpBXa=P5S(&;c㬀Ύl(=HO}}Z\?&FQ Gw.ԡ]B=鬼1^Jړ/к?~<X8?CȻk]V}i2 \g# D3HT ӬHEqJRh4%VutqF<|9~ѢF&[{ÀK`sRuCM̚Ώe?FKkڴJo/[K ]7(E3>$Z͹U[$R8Ȫ{r1 6!3Ȟ}#gBk4̀Pi(Kw0JOd`Q|޳Qk$iO"bKiB^ (`'ب/'–=)8r_gS.I|?#MoC v}e`ͱ*`K>d7 %܄!V+tx@nґ8!^WXwvy\$|2(X'pP4OE31?Wg<Ǥb:ĉSܵ|t}Ng|3)k;|1a k"/K27h[)_N몜j#iLg]]YuXB)%kھu gaKAAT1ā. . d8a;ʕ :GWd2i*\XlOg?4 sΦetNi ʊc$ a+`.渌Ɣ F&#L Qo +]{-J2LXg+RLbzƯC,Z,Vwu 9˦yw4} \–1ʥ1-lnO6U| ?S4!.xxOGfLoC{uu۫NtΙ* 0 qE}˶Ƞ~=#tSҗ DrTГͫRV}/$b* zbXxAQQsAj~0sgIВ WZo}QVFKBgq'Q1_VL@2ϘQufK٠.!Sǜ[T,  mMepTFBZNY7;5/f5|щYUt+͛ތvA[5h7='LvVz^k=1Eo5fjƲM.uJ| )VJ._%Ox9 sNbbvu_U@[ TMTB Bt cF$ZQv2ԕPNq;`^{gRI1H%>  ";4DȌuDZI* (ڀA{,\'PːHEb+,5]"*16p@x(H>\hOPzy(ySj Aͅ,}mO!=o]1~3#4nD⋡zXQkԘ39qR찷3$A}g!爉{AK :aavϙ)X<: 5t(}J(E$2y,)y6Gukd^xm: ^7k #GOM!U FY+Ѳ?*%)|ᓷamFkddWb%?<%{^XV\ v?y aYƒ̎:G={,]G%5@/;cjnަIM >SG쵹u`B P'^rZJ8X g+Gko͡}Bv 7P^y$TٔmVw;y\;~EZ!5C/p%K{h@5cmL*hD;YIMu,9z7P 熂"sLgT7>:;o>BT%āpGE'ެ^p xKFh [i~>lrP$b4(M,мzhDj9U#|͝kmfe4٤Mr7q7E:5Nl@*_$7qYkq?nUԒX1ʉ`F;miTkgU?xDUYB;`xVďa̾pd~nj2&43:al obѰZx:U5M>ƪwŴ`Mm8<5Sn.)IH^IcV4 .-*1awl>@ͺ%NRp7flTpPbxEb8s9?jsɛ&w (Î)X/ d_SLp&0z ,;s*HlXv RjVmG{f rG4K 6͋QO!t>``Q31[L#0Oʓ'/,Rdpm$j,¼3cRK H)PGC "e ФWRLtο} 0 j괥])IJtnP{=\H>OLe[:f(? ޺_W{jJ4d=C ӓކu Hn@@Ç#.k ~V/#}ǨcCҘ̝aYV?D*. - xwU/7D4 :{HnB9B(l9̭?G x߁YݿSR^W &@䎞k\R{@}9u`#f /ފ9BH쮄7 vRcm \$ $9v"=ۛ~C]9 %[¡Ze`!|j@ }hG=D N GpyôUbśC4¸.ř'Pl~phD'#amf%g|zNR\ @IN_j΀%Kaz \[!sX$3u6-R^4Ga:5֏,sGϾA #X٘`@Ty)B@pmC25}۷\\ʚ$Y-ݻ*ϼ \ §ol.n4xhAC"S%ȔZh~U9FO!T ._?AE p)d'  Rm۷@8^xEC)PomLy"Έz{yk5^JފŰO^^91I,Yo8N!SJ_`{(w|*f} ?ȳW^U^zI4Y_Towq>7 ek" &# ,wX+Wy}[QU`t`!ݹAM`w$"M1h=6GcT 4~ +;@; {X q@3Y·A,p36?}tf"3 .!UO>h}ŀPd#F+>!bP +2~W<}+3Qn(QI ؑ.2_H13_1.So.H>Dsn X tchfs [&&>,ty2f-aO4el &-T6Z{)|QM+esm6V0:A *6%E];m ő+ň1L vNU='avC=؁6C;8'2ÃfVFh5T@˖8ԧKU?kb'GAHĔg?Ķ3ҠIﳮium]_wE7.GY?ƜLke0w5Ly@Z,Jw>DS\0%VD36RX;zpx}F}cRjT-f\"$Uk%yȬ*(_ $'|`uc `PIl)1~>0y&!){+&$Ä/,/s^&PpE%XL21KANxZ&k6p,W^H&_y,DC"0/L9B_\DEFH5y5pM˫Ty)7-84kp0/cYےPZHi/3?V?lzv^qu+^;n31GU-t yB5=,jK86*FWT$r͋}YtQi?"Y-1#uz5lf/#!ȿe |Ly&ѿk+r :b6!Vd3և\PJk[-uK6K L(Z *JnIk`橣@M̈a/??B×<44)!k͢_Fi;MWY),!/Q҈  !ϠlZydkbQ жU͐i ۋ3/3 >*G9>8^2;<a*#% ,*skҐew`B$šu0 \-ic$]rosRl86tBPa" 3+ I8P}Θ^f 0Cnyh-C0A4#\*MK$(Z2<=!OMR[XSʄ wb"ֆUlCy$NUTg +qGSas^Aj?",]Qy0hH?yt.Ȗfۜ5rY2bICUuF[-,v\ *VOPj႕ H0Ch_ZJ0c7~Jo<`itApox$әmvY'vvвO;$ Iڳ&JJ(uisTޛL[ i=|h? 9e5zKC+H3ʸF|&b Θ%.z')kG:{\ŸA)gD=\|ɦx͓\8AjH<"Tj"Zsxd?iWOMђ)|C޽+e08tR<@t'U븫\3JTUS=Ұ"ڊ[ۙ6 5ۏOuVVbMXK`\cDAzE'<1y8PTa)7Ӻg ܯP4Z5X*B&&Cx/Ү`y) 44$wj[6m@7pƣfS s|C`?XW(DT\lN{X5z؎V͞Z_YKa /bJM(@CR=M!]9jN.%K2*>REX>{G Jz, LE k!)Av7]~@.RˎxY6ljנ16]YzjԉcZH,mQ//CbSpDqk@m7y Ku(REx$%>C茖 u^1eJQWjh |xRg9b񄕛cR߉P G=r>_<͠2ھo~GUljMz;L]Jn`s/X<ٗxZ'`l[cJ2> # o>۽6>t\Dj[='>wi;^zUtGhS6l %2ZaaUyړ,UҳpR'*?ID6xGA dmc Ѣ@UUq43ݸȆ1޶oA"KYˎ;FSaj4hy1+F!&I/A f¬P>GKK/Nڰm\bUh@'02Kl`ƞ/Z ldVd<39NV H=zWHKnDEa";b*\5|F;8"_@BH1O%ׂƈlK>G9L H;1˿꡺BּY &^u|ڑ Տ̨B+| w[bTp&sbGNuew>bY>XkyljeTEC/3qGZ3R˕<ƑN^w(GkIhJeq9ޞQaͿGS6F/]''”uńn kGQ w~9NC|UCH1yZH Y`;_Y5\C5BAୂI"iH'j/ cfFP()D 6SƩTX >ۚBؕc\`W0ɨoNI2aXqR RޚmP5[++4٭'À"hhFԝK@'8?1ߎl[J[D'Tq8Ͼ@./hݬB \y\.üz=_Y$u.f`%pMutVIex9Evʗ2?< ){%J;,q)ajoMԼ:|pKbqBtBnQ$h2X5o?s-g ΉD-DY> uԿzv~Ұq~74@Ztuw!'eW1=XAv8Sn=͐u(bi׶,Ǹ=%vX5/\pOM^CA"S.ƹWW#P9&&GinS$ɺWED7Z-UC"\峙mc*rD QLCppmR:&qun&{~g^P;>] RHICl;oU2Y=P"xS5z( FY@AlgwJhT*T6^({B͆_zbhIe•Yj57b?jޞ4 w`!OG 34&*#ս$$,A-sp^mDt9lQ@ _ԍVE8cQ}7 G .]]!Χ4$,/reO?3f96C̃CRS4MQȬ!JENP'&iT³>m}qsm;u:,#=15Ay4" z䪾mvB|vJ dV 0J(BV >+T\-"&0k.,D9:h˄F *iEWog54cn\Rdvj1>nlbJlu0.f>&q g󶎦[rwwr|HPO)EeȸU-3$6%ghLFXMo$&?r~ DZB ߱8onuC:zn[~dYO,ikԭ9촠cuxfms2Sg4D$DHgBF#pJ/tۉԋ=y,{AO03#ۢ9 :m ZNNTޖ>Kh*)<7o٧A'S-Пj3I% #P ,2lf=Ũ׋T#v;?"i'$/ e©7pX1$RMsa5>=m<-l[6@)_-)4v s&&@䀭2d\^0-Bḃ/Fi)v0BNa%_%Ψg5X?RqAY#bhB,4h|`_3 Z5='0:K<'@wd|ج,sX~B؝X <BM| +GaIfMbju I ~ȾF|EZ7a抎/Ӎ_撟 I,4/]LUn76A^E0K|)\ja (a YȧޘcY!MH둤CɮQ0|INS6D BgS;э̼)ֳNʇTQBMcnc ?(JC/#n>፽lPL a;쨣=#ת/d_Ζ4hJw$yMqܑԿ̲| I\&DRэ±nE5E6x/}{ ?cӂ2#eXl= N(8)sNޭeVxf7,)/S_b +rAo_eJյCh$+` ;BQ ѦY1FMT `ZD_! C@NWߧvBrvkT^z9x#etRZ}Mn<䕛s7yirkb ȫ&de̷$co?R]zu@c<.2MK+˼0%_`A!ߌb^*yjA& "M?%}\g+yl YR38/Qw4Wic֣U}˃MfQIxnn8Sw17#IѭS; @1&NijW<&r4s0x 0,r)i㵯AQx͍>M䐫V\\au NqOfs6.g&9sS̞Ko&!wԗ%a{#P.Ks;t:v,i&BI >NYbx꼇Dc"SGms~ @ ,SG:#R Z_K "!}`lL!eu{pJ=71{gtC?.]A<)[YGq!k2gS5φT4?lgW"⼿;`+3#?BX™;vo 7<55foXjΞF ὾I)4Gg/R;B'Ulli?Lo >hVys3dOS8VeCWS4+]ٚYP027oAof2ipb¨%p"O8?rWsb儻%y7^ B]΅A r6n=_?Wa|q_nsط;8AdaNJWI\$% ^z|I a /UX!^,l%LY:Ejy`|dFz7aZAHcԟP 蝚rgN45]jl Ft։faqMa_#ѡ5mO\Sˢy]'#7֊{˄h c;^!&ma,[R6F>54cV"*۔~R<"< ==}n;>~o\H] +\ɒ!9+6q|GC <YsR3XN\9s*h iDFr#"qb ^+e xg5hcxU9b$FΕw_z4UW0w|eم^t\lX^>#NjIBZtlZ܃>d~x 0:|HL>EhlP5_} @ՁPG7uL9ߺp#4:F'ٿħ*w1Ӕx<(ȘאQpxPgo;̖_e0KqO+SX&՞F?whV:a,4{`؉#^&agBEY;i@arĥ=(B2c@av66Ӥ-$u;HCʪ0uz`DK^3!6Ӱyx>>uК%Ǽ?#p=l%L2 ؚ̧UIL{07ߤ'wwwqTG}p,ƥ/(Ug8UK%!^)AIa(SPר?(h9jJK&Rm!["}%`SD nGD½q̓J?eR(yOԌM#pEĖ$WP㩎!IW-ojJ@>pZvb#:r"]EN}16Nh jޠ%|MԷ̫Գ9iӄsq6C(0h@'^:إl%JcԸ#I 8};k6e vHa&#4$@T^#31o J}c U[-~;8K7$h Hn1"3>yFṝb0-NP/8pܶ*Uz5FWi=Ok %-N;UuBP-ҏH8%Q' )q)x m^k縥̟e$fFI{N\ TzBD5=,"A4G [ZSbZ=8Nh6MM(.d>,B`UVѥK/ԯwvC#㯫L΋a3"Qm0'NT*5I23_wn=rsgx_n_sl!/!mqÔr!68aOB*a+-$mC*6lkIBIycZJN cއm ,ə)[L|Ӫ.4;8 槸^yO_墕9fT*Gdd#$sAc0Igۅ`S|\4~?@uD8]F%<2f-3Vf?ׂS65Y?ɭMb[I_+BIS7^4)3t)^$v]zu}nGɒ6 'v5eYgX\(Ti)5H}.0,NW,qfipIqCY>1x&#{%{ԟ5.#KնC>({y O1&Ai ?%_詯qrMh!!u象]^:'%juZLE c(]ܵF79 ."GdCĠk5=ոa3Эa[ *.<Z&3 ?G@^ݝ6R#fJӳ~?՚9LOST1!<&rY@$7P.lgl`"SVQR 6YzIK!G3R 1 ߫<ԡJ>Ll 8}vy_C۶2%;wO]edPB:yxw͸y-x,J9f3t=TxKWB'r{pkqLF^C#  H+:ź}$;20GPtCb$T2RuM?3BިxdPeŸXSQ'(vbԣM:Sn gU5dZ`/v_t[ t_dlp^1~g$ cmJQam%rlH[! cf2ea6Ǖ͵yl}K/$I2Lkwު+J"<tO6`&e7mh K[ ?v _4ey~yo%m$]]!ȧ(ȝ xA )B/5BtSY4xYb *&KnZzc jQfƗxL"ʴ'UǷAu$Z*w]C*)aFbfąq襗GEK8۵pMR8aL:q 0q#/\im>x .9foU%'(KQ6:g(G, 'ݎ5gˏ22Em7F^ 譶g@,Ema*"=ԇ!yNZ8b_3:%iByh6l 5Q+aey[7SX 4¤SVmsxؔB) x hI3QH/?&DgZj]m f;_p#8,a"-Aw/ G dq[:R.@fh[ض6)#h 0ĐE7aՎ_)KǧTxpFpWFƈWbZ8G(2Q dlc"lI!#zh`1_.Xӭ0&PI=a%FءNec ,k -;}t9un4wQ%hW >TxK,<sI)s`uXoLQ+.YЩyluh{kLT84(фtʠlT1]6 7qXzw sQfP 8fa_.m8krn^W_e~AЎWM"):2W獩'TkSp0īw6NXvlpr޽" [ca(RRI0,%%_E烆󗽸āIt7C$m6xT*E2S:QwWtAAwuDjrcboS;ݼ=8 2t8|cg5Qq,"_zs͖7Եfpoej{VivUT*l+ nпHͰ@M)Ec !ț,L*\*͜/& W=u* #txʅD \sw >HO[o`~4+%kg 'ۊԢpnZ$YBgI{0ksB;8a!Up+B^>`< ^ܢHd@*C\+M&@\_<`VW /N3Ml&bTr ɻG)5f!+3SBhfIV16;F7`[gוl9!ԍAY9m3xś&eR޾Ob*BvX;ri wO_a{L,Kg3XMIܨ!ʽ*$ _A˽@ބ^`awT+ ./ IH@BnB77bgَ0e#)h?1vX9(w4X} Ԕ7::dύ];gS$%ZNUR;V25sDMH+v^#4)"K 3D)u\iD֍){z-2f+9 TF3E;Y􈕜e+179HP3n Otxe=*ga\tӍ4M3lٙ ^%̨,#Ry X+*<_uWċ`5F -'D]tA V&cVMPUqK˒,Qqs&C\u|azrgLp[9loRʼιb\>Y5ɞ:?6Slp_"1|w=#.ڔLÙjPP J'|%83 /6݊m}E  =Kz&V#թ7 w8Traa'e?h4n \ K0 T̈sK$ҨQ'Xet|gG7z.ުU~t:? /DԞ_%q Q#Z֒"H\CF st}yJI%J=e/Ѳ͢j(aRn< T=E_U&-)gȽ݈fiN*j0#J N:϶&Y Fr+[wMh%gz1VPu+Uz8&'F5\ɟAv.h,6p$۫Vz[`}/ĴtU3wbCř4tOqZΦ"!4J(-%6S2L.J)@*qWk R|Se :{fjTŻ7QՋwdDgc@''(v[0X/d%bsr?ZW3 Jc4xB6 8bت\o,L$&`(Z1+Yjv=C!^?40)s ')bEE xXgEW@4ü:܉v w- ]w>RbXv'3eFYNG}!W=QYJEY(K/?W_Ժ7Ȃ kK\i"RܮtH)H_^Ӷd-MICj:_gؔgH> '8íD58/^O6,+Nr֚~Wշ5|ߚN"糫sԥK[$J:NȕBm9:ʻBbۖ-R! V<$CyW0 LN]10xХ,_MWgTY0u}m3dkuO5Dt$l'iy,oCz6^3wXGw%,:5ιH= jW,Oa_*#i ]ڸY٤髼Hyrh(,RԄ5ΠdYMq.7Rlrkw'~\T`j7j@<^?_ k%P6}: P,qoDۥr⵨,3R+TDE_mCtB h_;i5AT)-STQ' \%fa*gTGG ;ܿi]q/kn2] l/g9ө3cSŸ-leyKxw_ZQ)麒LM?R} 1l䔉KrvOMi=gKؽ! 5S%qȗ'AA]|d~-Ql8\3A+1ŹHd=R& r*[UW)CN,ZCM}Y{;!% >>nlD̞ >Ұ.Lss Zb26vVLT'!"+ mhUos"]prh;|A}/o,I0vεNU[=_+Vm"`mc-iR!l$HEL0TsT5VvUJxwjQ) ̟<䋘(V x GYB.@gr=R67_}HGecxnp8a<>wVy4"|0^,o^Ltu$,ZArJz沉p,TljL۱y(Ui$,"п$&ƍK/ZcۻV #ptC_>QҰ=,8#qLSfvqPWv}3Hj-/ -Wa)[f$D;;iba]}o]6eOీ*9GNu fO*, h59u00{ CiDn iљ¦8m(7;8M{6!sism6 w?wǹYzW$!؄ulKz:.ȴuEW IǭRCUvL_5/Sis%uyYNk VspZHn(eŹtoQ%GdE$EuѹI$?=-&yI9頰Q7 * ɢ-fES(Xˮv1@.lLJ+1Om$vc7ia;HI wdNQF6"i9a#R2b>L` 4>sį_-ׅ!]0ۨ Rj^%E>+c~>X] U  lG Cg}X ȴ›*l#Ih,DDDfbfH$ް_ӭ3(6zTC}ITG_QHވ=;^~fI f{Q48>9Oͥa6k8BIxg~)fkqDl(Lrs-ch>jwh,]2kVM]de ";,ZC {+foKqS%(va%s "uXRG2#@ BV+)lza8,veϙeS~ d;_c{%#fT!4<Ƣ)U>&T4qd)wo`jٹ$\pZ΀/q-lXYe?+NhAW 7X us^m_*C=㊎Pv}2:lV"%_\iTt }l 5TIX d:#d.k=둱:>ؼ|flyשvhVU5۱{6MO徬'e̮xrI]`3\\h+m0#3biA W^u  zU8ֿBtX :}A*!j*Lt.ɑrL,fWz;<n d#}b\cNs`e؄:] |c640i#;LݔٱIҨ^{wu'&NJ oB݋ۮTtP, 1,wA:9cμDn`buԤN}A}+*m9IG8PQ(a(1nJ,yv?:j?bHL У_p}f&ZBJ>YBTFB};<ju̞/t5Nɫ8?-MW<Qc &0Mvlt:jsT: @@j"@z! ЅXe FۆT p^> \t a:leINfe+[3&xsoީM\V; 鐺婮E30O*o{gd.=8L[k,|sh1IZ嗯Vw,rp"<{Hğut_'7t;A]` R|ˏW I9OG.DH(/ªQ]RZwV5A0ڈ0b<7sOE' :f!;}yl:s.Yۑ^Dk۵de$bpw6ђt8H9vzEdo렚;}O{CW6unL)K ðZjN}Mv/h+BݴӍ2 s&bfM}{|!̋N9VfV!cĤ|9oa'v|ws២b £ UwDŽR|6+x#'m=da{Ha||NxOuES՘f\y+d>a1g5܊[C|c~P%\稸7 [Lj\9`F3Z\fezl(yZx5 J_%泟]_a˸CȸqWz2 ƙSD=r ok\dq JΌٓ_b!hbwpĦψhZ%}sWЍI2Ng''] 7 ˍ.T2;g>&G7;V۷Y(G C3'B[:vw4d+FA0ڠyt`@%^% hq::&P` yZ R9l; n]`Ħ0JG@DsnՒҨ;agbY{驑eW*Z&ؚ5?u #K1('c'bxB!jU{m9ʈ]۲2SȠqqG"73nƟQf^șĭR4&ɩA{{di'J_ f2}Q.={42vǼRD{zg$)0${8Ò>[MI*NHAp?\!i ⷇z<"V0CuMI2ԳP\mrM*BkMQ_6Mm9oΚx*辊 7vS ;?e}D=n>BAY$*n|=Ku# Y".w7j2A4T~ .mJ$5[ g^ X% tu Nab^?nl z/V+ %\uR5Nٯz"J Vµ'?Z<(,dgV;҃š!S`]dmaQRօD9M@ݘo/R] y~Oh=SMW3=4XށeUY\jJ+<:5/B}@$oC*P%d*b=L,e-ݰF1 3 QY*w/kF!m x#]m +uÕmW (,[$S-w.OGy68Pws{fہ[ oeԧUQẋyE E X1㯈'NafU#NdƱR#h#9#;uPȴ>T?H@ |9-J.3AIS \%Eci(xI'{-D΁z7sç8lB3=BCRߊ7CQ`7+2m#==CC8kspG뺨hJD{OUťwbCei Y=gnY-Hgyz/jIOX7Y,)A(xKE˴LP{2V11jguBf0&_DcXiۇ3PM<7WзziEƊöE8 r ]zGsBpu2fL7U 4X!q+_d-_ ϗou8ۚxb͹Z-HٺYÀ6푪%z".ә`HB_*,ap@emK`fkZf{{h%1^ơc!כmν) kdP \SEn'p@Տo.ndvu20gȯ<.ʿBu)Qg[;Yzxf3>jLcKak{V9 n n/џgT9 ~@(\i'xMg¨bp([S)*۬KmxN]}|RCSgLt2H)R/gx#mi>N=CZTDkCّ(-ZZ'JNISXv 0sdƇTsQkI܇VJ=ZNvH#Pԗ(ThҙmdL:ãbz`-sשC##nn:F j+@[wA=N g4H0^fnw*2eZM5hTmX d ԏ[x8y Y&HS?+·1}L@JKF=з *XjOgX{Z6r6/V yvxF̯`}]ڼ)BN-͒A2+Q_2텊0?ؓZն2\k1?)n X:u/t\5EMHt NZ+wڻ+< {QjֵŸWel3뗠|(m9TjU5f_I̺-_$Gf:;m smDJ[q;/ym.C \PӺO/,&N+y\K_֤zѝ js0s=Fu# 2*\]`W#rߝèloV?gATC]PĚt ~ҚJsH1UqtoK۩?n~~4+z.WYFrK0 @Q6R%Ԝ+)ƾZ+ڕֺ:1B >:C54:yͿ L/R[@Q*%(ޚ[}֬8I8\t:U5&GӰ#I\7M"vJPzK6ME\;d{nɿՍTiGXEBOwet-劝dWKm:q.)7iLsM:a/&}l'l.8IMYn}L-h2^f > lO&@#S狝U@몓8-f;(QJiq򘅤1)ݵQD|rxq6@_שX.ps:T>3"Ad<׼a_4h 85# 'f.hɕGq#ʶaa.a$b9:fehf9*m%&)jw,s9cy4lΖ̢48g0:"4qGƊ/'-OuYIUGfffʣ仗{?jp8]N5-nuʥXPcQ#:h:X~.ۼSָ(fy&-o6*Nܞܻ+BRe??t*80Dzu@8_ N LEމ4F;S3[=3HyLBmϷd YߌKa YPnVY 'm([wuܟ1^lb\.Cqt\ptU9Xi:dR1oK]Gt_jKlO"6ˢ9o=K^,q`xGޔ?yy"ԝU+8J[| Rt88 *F5׆?D ov(?>' 6A)Zr56mnfp vha:䗬+:ݻ2 .Rɐ&݈#ǧ^W>UaK{ǧ⥽jsQ1‚ꬅSIu,֮tv,Y|׽@vw1OYB"cpyj.pAi@.NÆ3!%㾘nj ~R2TXjs?Hg[ЬK.dwjHS,YAu9\ PqNd]"[7emP(8d2x]&~~>V/SO<])oL=aﭤZħ@\0{i?E h n>e*ڙ^G꓊eJ2ި'|FǞң_<1B )\a ^D4#c~X;l <"=EƃӫE7g95Ic,ծ]+"#exLÐ?/Ⱥ%'KzAYK@vvZncBG'F##ϲm֭d a\W@".)ZNcH,|nXsE%2 v g ʇQe_faȬ g+M~}f&[K,&#dVso .ܬ|4&^>[4LZR? i^JLc#zL:o]X| `,hI+X2~|&刲v4g-zހULfd{)IXtk;ghSwic09 jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2R \ PXX`XX`XX`XXXPPXdKakadu-v5.2.1 |y3@/E1o~0y[kB7< a2f\ӌL6ocK3h%g oهƚ,vehUې8eEEחnl(;?33?oqt04'H2%*%3ma'd6 >Pb3ϽRᣪ-=H7袱_iU-ЁW?]&,2S ?޵JB!-\?ff辡5Fԏ}hYmXt`,D 0vڦjSmr@٪hQ/i0 wڕJXfG $* b w-WkoEiLXd1``WT%t,>²(eayMx2{i0X>\YI6LO֣]=QKH , @/"ʫ: YgDQEvc&Y5zڨgRiYҮbi_lFLs߅W0*E&$-J+ϟ5%z}k[–mRM}?^?0lt(+oѕG p;gԞT+J4n^*u\W`'KvY+-9mUR3B O}DY(U懨IKɟZ?x3Ĥ;$bkKҹX9@6 dgVV4AQPz' Ad8_BT#OGU𪀌|We@ ]!8<i?4K3@)ܧ( -n[`g|+3 Ӛǟ۟-NY `VZOMw; $aVq62?@NZ`E [>@!gӎ`; s*#y>nVi&{ *Y]Q6M\6p],k<;}RWVD]Ҳ<Խ8V05N*@TQɯt7:Lb(uHe2MRaP8N}6}n_ctJ}u%O~CVվ%Vm2M-K[MN?F.l@Pr2ARgpA %*}\5Lb_"a nElĥKSM49!Kk ZNj_2^dPi>HE 'j KV+d>3Ic̤'YZd/.x]K0E`)j߷BrC7^2?|WàE՛LIs磺댜KB4dǮ*\s'.whQ_n?:ŧ> Xt5@mTuuYo3} ;xRr2=Ehj-9Q S!"ψA{twJ>` =5A$T½5Oykh ϻ,na7I")j([Hݤ׉h]<%kw'D}!@30Hxr!xEc U[mS;07gC{5:(۰M~^}ٴ$p**Jb70zyŷCzz,ҞU+~ a0}d׍h ;^<&Roy)/Z߶Aֳ/TT{ZzTE_ox| -.[)Mn9o#)`?$U]ߠ(%])re#PmojZ9eF! y碶I+yWKr&V|':qU8'-[ڇ$Gkj$NQV-vAԧ H &8hq<@"'"G|90(QQ!n I`|Zsyj[z%OVْUa!9E[H& tCkߪ;3CFt2[]!<^@^e];" [D K bH`o)BF[ecQf?4c ~DmPIrbC dόG3XeigZlA4v|$(+܆xP9lK<o ޸ *#('6 T\j3by0k:[.=N4qKC_qK69׏#7xp҅g0 %?,w-Io:\NxHˁxq$ϽGxuJ;:C^ ]{hrS``Kzl\VݯCT%%OL4 47&B}* WĴR;kܖc]؉֢ 15j8 ɼw?9Дc2.v`wAs'I/aY詒e/9f 9+o舉@>!A)f7pflƾ_n9U)mgM.}vzC6 D#.ɮ'}XT#f>c\.Mnߛ>fjކs(~3l {ga̾ZI+۷ ,*ǁypb.z8-R߶ԓ)jk7isϳ(c(m(mvXuzAPqy 1CfTqRp]=L4_yMe\P˩8پj|b lኇ\[VNyIEq/`D]*+xV$>,0ػ pqbZ_…7R70 E*Z|lVCm),8n*pϓȉ ׹}M*s>uC&`IB\˾{ t2 |RLXaK$LluQ+{mXU"!aD9#+|«=PD~7ZF`P CaqaExj >cr1Q<k{&p04 O4NT~*fdn u\NaXkB3F|PdM[vϹs/^5-ރF.LJd<"&aN/L>Kx5@> L|fO I,߄/gt)0EжZЍ1x{ ᫜|vo"D"EU wAkvV 5#=Ō[g;A3) ]+L-@+?H]28-󡍹7xABDHjI8&+5bX H";AdJ}`;!Ue-7ՋJ5FJ_? Х鳖m ; I6SCb$xYݾst_DYcLXg"*\ 9XTWumPS|,4[n~LċTWB:v9!m{ \dZX ;ۀ yymU$˩0$Ё־st6ՏѴ)a/׈>mO=zAaPi)jA#7'| >(A/tGbSML:о~5Fv|S: $4]aqPia1(D 5XJ~ 8%u[C d6"|µo*3wق"ޣ2$5 ~xTBZcuYc:T.3\Z@3!:C,ŸF}RSpw:=^OJPl;_ߖ@MP'QLJz XRG(FaNڨC -sLsmVVfEmo~kF 5a `^kD7Y<771RY$^U V%׊0/۽e]*?7ͥ\ }POz¿@@Ϊjdz߆)y}A. ۞jF`X1'E6L4 u~KU\NY{YhJ6AT=m1Iʼn-|CoуEֈt28[%tf 9dYw&--XdCf (}g۳`/NXx-ȼByBeU !Xdanݻ锨JGL2}VFvJגCӬF,Җ>҃n#tgGC# Xd9(X:A캶ˬo_LAclXt;rՌ\oxD܆(d{9tv2{*œEv3מCzچ`9jee\%< /eEt"$ڦX1inav gF";FMM'ji&w\i$6S_3F%pag\\"EA zKƦ{&$E2;A9nu/T)2N!B̋dIb}&1ϦlͱUIFz:$,zQH7v_nЪ HXzÂЅ;H/s-V^/E3skYfwp}[ KTS`ɫ{QT-dZmim}D5s?jYpPqN+;6Ge 3Cue'e7qusPR)%vcC8r@F+}Tt#DdDAq,K*pQR`dW?2X >~Dbt/)B S?T!nugk2H%yDTÜT2 n_xhnu|jrM>kjK@)9(눩Wix,l|ɊZo&RiR+'%\Pk~다k' l)YNg?Ę m {3=3e8en&cx x\p!w%-q@XY%Jgѷʏ%8V3C2sPpz`Fל1Yͳ.YZD.hksoiV AyK VZҚ(ʖ}s1/@t5؁NENᅹ<>Ed$- ' 3 ϛ;a ˠ9r@8wg!B)u 45ƫ[2u-I.K#&+[r4i 3s<纰h1OcN9RЬ4鰶pQFP3kwTWTc!vtPLe4hU, d h{-bk yBG'Zdoᠱhd~z 2b`.1DH/R 3h#= Goɡĺ. Teu|ikdn Le@`p 񟘄ުb//#  ܌IH,|a !:c1ѫ9`-҈)&_yDc$۾4ZC%ҎȹZKr-l<$.m8$m6D`īM}7Ug؝?"=b iV8F*BTtv*nnv^Xg{еXN"=lLK h:!X`Et${{dBO\;>]?Uf4^ey'N{LBCCќ Bhl֪ϗ +i)_ IҝB1HHZ]CcHnS/ ɣ{JOL7 pwgNΰ]z/XMvЯy HA0Kn[=iL$H1T-C)p،F\N5E!4J5_<,*Z}Dѯ:faκݿlc\9%/t3mSD͘{5=@3sy,|FfI^wQobQ}sHvIhO@ws&Iy|zVs[BX%YI8 !gMkb9si !倒VДn1bndĞ'e?0xN6LɸukpvɱKjb@cWA!z/!wNō0uN%/U eah9ɝgPvt TG8t@ aw6Ox,wydC~~|C;BgP8AvT=wU'HG2\45_0)9a,VϐR6@ Wv~c0stbBosd#;BߵT:*Ih ue*&Hƨ ( ({!?|(WJƳE|oExyk>ۃ#Ij]gm][ Z5oo NWӛ5.ؼ^-K4}'C^7JXǣsC_Lv@Jq)u~"ãHtB„!p?1W'QLVwأk ;rg~a` :\ U}^@ UFd.o)>Xvx`k6Fʥ%ȣ?̂nh>4m]bg u@x?Zx\=Yt.ඪEY4ʻsja]2Vv+1fFJj&R!r).4ԅyгPeghhct'A+NR m*Oy"l>M|B+ؾMev~:hiР϶O\E5r_eQ\Ic\SsN1xP00̓_:rh(zH~?;Lj˿vY/Ms &1 ۂQ'>4U$o*NC}B9V([Z,ݳC/f^ $uR{P? `}6"Ci`r>5k,:9_c89J0zI=DefOm71' z):K;y=*blZ[G=i|QixqI6Y7U?ZT61b2f}.BZ']p;',_Y<@}8Zq+_c㌹w8 79H{pp_3 (3?m/DZRkc>amvOUD)fW.Ҥ"Ą>KpP70x%ۓzwT(;׮ҁ6ir6m01)]#RV,o|$$jl' yaID=f)YE({{V+8 8VY(߀&ifQ xڏ9$ P3&IPGV&z4ߜZWq?lɫ0<@RTgUF>b\WzfbsbxefB(HܤjQtsd3ysM7!O{vv5L^~ 3B9'd,1ZRy͑#g7i#"QgCLFb:c> =x['0kM Gu.gRi5_$3Chx>i?.U=E!G]|<"sOgr<tG9@P:ǿ;ak/zxT~Aْ)qzG1]bTz;ͩb'B?0OQ lJT8>MjCeX9eK Z8Cn^߶f^'Xc'~Og~YxenZW7t gMdgqfu-Gٻ4 7:fGh6JXIRQG w)ݼovygc/sg0YvMfXP!co f_1 X{ؑBiH`2Ϝ \:B25%^nב SU$2C,An '%=3G^noZtl!8O\*0K'G~%΁v;-&URP%&K)9$L- 3>·dq~7:{#216{4$ʦ*aKҦۂSNrrY {ru?u1V]&XՐfJE:x<'VoJ|1~zgW8ua-URWHȕ؅SpZ֦[]inbald%׺L-7DpGl4:?f':0ck`Ri2$qډJ @*GAp )TښaݠT'Aeg5i ?FHqd{ {:.mk{7O-6j'2g 0`T:za i%‡ J@p57OxlPHvߘc7P21+kUb0Zx))E'ۅ?/VvGf!>T ssP6b 1g:\ˢåGB:FVALT@b{DwgT,൙]e-vQ ,+&wn0ɿw)sw_RVE{Escncofc2LrA6O.V&ѐO'F:Q?FBu6 SeE/tBr#AikTEĞo{SPH.?xK\Ghhb&ݠ H Af[uvSw,6mm'i1`wx㝟O2X ZLAyXv^6_Xʫ^}5B:Bnڳ5͞x-rE~Z[Qui8_ABrE=xELj3cn%G_p@Y_&x_M2Xh<[?`. oZghXXu)>[ʧeΘԶc\Šz0k#@܇ִi(*yuG䪘j˼7{ \+KIEdd3./!bxO3/\}*CwKLGX51q%T=yqZ::7̡ X*}nMQP;)H~m`K9> (!J 36;('z`wIHY&2a؁)Nu҂@8/E2kqgs R4XNot9@B92Fx$wFris -)IqERVª Á+|IT LMeinT"8tg<a%B E|ɷ.{G$5c bD0I\l$%ؙ n{Q "7shVJD隨# go*w;t*C[wo\_ Hͥx( yQV;+Ccazf?NXSD=DZ%X:󥴑Gu8=gfirlЖMwSMiLhԔvJPSF]]fyNz( ˿G+ll*lwb*cX"o,6ۭDQ.SlٰJ|贽l73 c?v]oFJHhM@[a)8`x&r4{KS[ j)zMkwl_Rbs|ai6҈Aa6s#72 g}@߮><4֓|T 0,}]¥ցRX|.ӕ;+dΌZo'#|:WPƙ{aAhv{!5BH=Nt1lBlt6߅ԞX6G\}'^U^7zo^9@ S3m\L貽e_N`qLzkUZtֶxVǷ{UG[~Ty5 rJqM~}$&4\̨k2 OP/QuA"3Mw/Y}fA#rw0DՠeHrqa Xk h_Z$j+CrՀy'uT]7v*Ş01$/Q *>4bE&:KKVL}tcZ?V-Es& P'> )9['y/l 5$H`̪EP,ĝٔczV#z0LtUYb,xTe*)O]G²Ƿ]YE ClӘ\W =>bbKu[4xlon`ʅZ]')W5~ǰ~ GZ˅>BjI 0qW1 VR[$>,W.IUVys5H¸8b89Ƈo\o|jLv>sC v&-gI*8 Co}7g~0d,17lI7s Y.#TU*1=^]pU:#'Amr"-_ Xȏ6S2cvzKEeG 1_',ҸMY uJ3•1{O'Zmꦘ8Q\d`2 =5h|ÖrtmԞ?K+aFz ,Rx)1StEH+)[Hxܜ_݅5@x#߯@HhzRAE܊uPԾs/al;wv4f崤mȌJjvmWEab{lv>&9ϞY1`dzz{#\wvL(#T4Z,`Rس#8vsSPX[(aY,nH~U-P 5hX)陫@{ "e2;WbA\\#FRMn6^SSg>ew_&;׊ożIt(Ȉ:N`.J.+[@H,R{Eɹj^!.Y u~Eͷkj(4 \ņ X2&e:{!RэyI0D>'o8oqqɔ8]IQdT$ҽtSFEhW8>K㊉U螋^SZ=q haTGu;θ\ʸ߭q 0< nUY_V5 ͲzR,?vo{q'7ӹELW2R(4hd56^]!=EwT[s] Uמ/QHd~s tjI?_Pꆔ4,*8fD+ҥDLVsX0Sb|w`  J9?geh"n;1 ɒ챷߄ JOϩVhq&һd$5gQGw|epT=g 7Jrɐ9#%nkNLôxH` aVX${ Dר-6Rw;nKi!͕=Z'O=Ҹ٣,]K
ʿ!.q#9i'=^a7I+Y|z]e[]qː+7 JJÏp%) jt.  [ .JI9qi^'ʆ|jZaIʇHߣ5SYЋD>B CA'Օ "F^L> V'gh! %GCY A.M-S;‡O,O@AF2CFϰ1‡ {bŮФ05u\;L˛bWՎaYRa@^/$Ve܆swߜ!zuc1c'yyE=a'=q`"wuUI4cj[ >[açU6$ &Nʇx,jo ꠇYxBj,[ X5}]R{Kץ#i&Xq1LB[%gSok^kX*~SQՇ=(Py«:6Cb,d i4ῑt5A`GUJ#ci tyCj|%l|wڧ4<ҬN2 ZmIyShҮME &4OF.>m<,k7(]3 Ȋ `hI fiw#{mgKe ܵ4 JP$Hs^A3懶b~L8&<Ӛ|x6p?ax{>sߕ $λJæNJ-f.;~v{L \-ӱ"hZd,Ep޶f t[ ~d~ݓpPpe?T$B=+R]M]0JHT ̃B%zO냪۰G=:UQM9h1zޟZQhmT c`i;Ӡ绷G&&9ѫ F}{j)vG¥l $BNJ*6.Vqɧ;pPHKҴ>(DJnAQ}s԰ȥü+.e`b|Zl0 ReEt )Ţ\n^k.҄= p'ndx1(3=`.X-ML4'wqw=m뢶[Ė'yJMw~Nz:{nL|kh$Ͷ!$x] wm#^oiw/={3@~b"_v!hBRWʯ+?Wzn 0 +]"Bj7\Pi\<1@"Ƣ7zXw?]{E|;?fΝLJ^'h(?3Wdjiػ?ŏ6`!K0cxNLfW[ #5=`p>޵vE1;=sh,vORKO/x;ۢ> 覘F,3њnNxW$:# 1 .8Bnq֚c3WKm%R̋kO]sdIroA6dlaBm_#>ѭ{ :l> `#Ӧ"\&sDUBRa0\bոD [Pnᯟ_Amz~Xp-g,BhG#`醨˴! `d{&`e-w}ïA_odø\wv{^#$2\ @$:WH1 hlYvn=&e@nɶ5bL<gc 4 4 hC`sI~ DBF!܏vubc =W4J|ʼn ).fL9n?I^V$,JMH`w"eh Au9uܘ8frt_;[t$EL4~DI3Od;6صGmAxr!Ilonfg)nn2ʲc""'5ʒ.?9ƋXdlG[_8ج?e>a -EasѰz ^b`wTWDOD7'$_q8 z鍸o^!R?7..T~cDjVc[k;04 jvNS73>]S0C]cqp4qFrl'f|IIUv:2X&$f텷R|w CP7 ёd*JT$`e"A5kEYw@\ PE%}#̮@')c{ܿ %%2"#뵬SYh:p+4)YZGo#\ &|OHa\؋̎\Ī4}+ϕi.Ayyy消Q`-:^SfM7-nO)m6S:ӉNi(ú6> nA^ tTB>T "=Z@I])Ʊda4Vp;knؑ,7b6sC(xcl΁ CI? (V-J?혪AtlX2c C-m*b(8H#6>Qw`S(~Ys]}^ :֦jIpʏh0'诔Ȯ{L &,}/q{Soire Mܢ3ieuӧ 4ZdCARdnPl+䯟)/:TzQj`n'{sC0]"_J5_t9j &WWyF WSnLLC,,G["v ػsD!3r9y<#6n||9i&rYuQ8c |c1CU2&^Xw>5Dڌi}ר%/ZEb*߀LR|rnmbipyP=х7GRDRP&j&]0饢*gڣw!Jm`{)nG.g <&k, Mc-i[ɏ.HT#} oTπ*dw] ֢vKvi(ٟϺ_¬Jb_hhdIvC4X=q"`Ƥ'V$R9e efVgP)ĞJ nAG g_TXnm[Х*TϤNW"&TF!aE] .<+`<+4 ˍnwÔaAݠZl.)_J_L:1_tWvɹx Rm/FP|HZ&P6 $ԅ{.V EG:dc'fM<|%a0yNf|i6k[იRT]Ǿ0u űǽueFpzW;PAchhuvp$Ϋ]O0p6?kʛŬEc11^ Zzkɉ6f()%$$g 1f(ţ'; so ??WDٓ'I6gpCF@}na*2LK W—(lI/T}x`LsPqTJP fz{CnwPd?R+ԟ'U֭ ? W:, !P l;תNwQ4 :FAJsyBbԍڭt"Uikh" x=$|uldbt+'O# h]?NJxv}ʣ]]`e8sD"dSD71&NWBD}|Jek#ȃv6%H1 %HoЫb{̪\cxYK?imUn̾$$@%auQ$@R*A6TcLi/r}"P!.D׵A8_#.{.o؅[HFX P(8s͒ʀT^eBuX7Qdݷ2,ViĒ$'ηE2NO?M&q.ɯT[)j)UGZES=ⰶ(]!3b6h*jr]YAᩦ-Pও_ oZ-T6rF=++m3eIjO& Gڻ!1^`xRUfԱejW^źx T!XCvBSw^ja =PH?7.H35VEjFMtP$f'O%XRf}v$~YcRB]6jn~ܣ1N>#otCjj&xvϋ3kl`IS#YPkIJWd*0גݧy¼{/*#|G)Au0X2S Q!*vZ]1=ݺlZ0rvZϙvRXZtiUE<{UZ!i!59! *8*uM+lAϪK?' "E^l qyu/Djui~zAyLӯRU-I4P2%]! wo弈:12HesDz?fwcѴR1TJ;(Au1e.f1w6"g#&A Mm:=5x&֤֓T!菪 rXfn>՚QvnP!U\7cP'M-|^e߫hl!ռg7} ru/(pjwR~v7ō nIk JОgPۀ{d"N:@=PPĦJ6--S<lY7(N夐S&-.XH*p^ >9z,H (s| khQ\9yQJ H.;q2_^0ז ( b/72,=8A+YhvEF\¡gaGQ(b璘\2sgZi*WTXelmLе"2w)+'WԄQZJYD Pˎu PX+&nOB/v-,##ú'MS}:e̊M'O+qx b9ROJ}yGlzw/1xjCpI{;ds0aSp˳x u\WS^Yܙ\Lun)VT6 >%!mzTOzMl̥~$ԸjYsʖ l6 .QN=M8m,I09rxF`ޟ r\b_ ,z>tYDa96vTx Vq S(??BBeqN*O8lhTIs^ǙBփ? !/xG+: ,py9 S{S!L;+]|q£d},(%u{+Ҿ`?0'NdxྐྵCud(20Y^@??V^3v0yރqۡPi􅖃4h:c{ɻ#\SYKdHRbeUA;?s֬1` t2ハ Wh+ph A]> +Mu紆0_NZJA4ōҒTsice[b=JH@qz:/3lA_b;h]o'tNР¨5gPhѽ*d]ͪ2f ?mcf?&yArZZxo(VDVR)!Ѻ.9|y:2~=tR/NGl(Mok ̾a!=- Ml}jf@&m|΅ciÝwOP]7 U >PS]ϒ]v]l~?C  ǭm6ȏ=$lV,r%}NWB`) qv11mcDm鬦ѐ%0gBo6WwJry| 'A62 \g;rNPuYt:UD=$=Z!Э#z FjI g7܌ )"  W8+5۬wgp\6AahELOZƶ9 >Jkt}fa z&ZH> N1iMMW/1E&k6O^!S-)AVI]Ju><9To!F5yJb,F{MI XWͯi8nBN.zC(Ws YsކǻRk{eFGۼZn7PWc߱ (>ikTSn˄JXK&ۦa+z*,.+h4 CSSC 5cP  hK#mʀBT(Ǩw, ;͓KGV~ʃw;"i*բ</XL`3K:^r.2ǝʏ$-2b{o3Y.HďOy:- u har۰a-4!44(Yo{IT5Ww E˞ N(GĊ8 IN+Yk/6eQn1eM9rY00?XG Pynx%VZxx{z<))[5{|?846rx>y!O\I_?\f)Zi۔|YU( zТ_fDoBɃ:*'݈muǻY+i"^b0+/(\F3dt #6 ˔d6+c s@QYlE,qЖs%@!i$*YC3%ϐnK_{Z s&Ib79* 4՚*ťf'mڈ&k sDtJ^&=m2im\]J.@mi1p)Z[F @7]=[w)y8,cy0+,FMIs'rz"gv( S.pX&WH%10be<$FYF )ҷ9DU?u|bMaYZfViS@e:w3n|C&+1ƝU|* dd6ξxȢ9z";nYϠ nY,gfyK\XW9ABY4p b5tE] c9ԗ}g bV֬(rNd.KP1{u/..wv]zN qE6䧷 K֓y]kA^h\>&sjڀ7،j`X jv8Ӑh~0)r*Ρ"6qv0VgS(>Qrnh%R ΐN<5,ߩ5WUE}T) TlO)^Xj# *y6$%_u6̅gy S8\8'BYH$SF"X<3qߟy=sq':qgz`M{3@%߽+[S*_0N>(.-iik<\F2WGb{-GUXJ.kr!Pg sZn閸}QᄌG\ɞ}SCy8iܗG ǁ*t6ۑyWI^U)rT_:XFe_+.7-cdEER>\]*3[-O0fVIs43xG88*Z9Q6粯Y͆skR;Z1E9d_] Vu&z`aˆ5S-,#{f9MJc0a hDȀ\u%}M-|8abE/O+ԧ>x?5K 3' X(2ݰ72uщj79KثJGTlh>OBV} 2<9VG Z -c,וl=`kedZZ" :ժ0[,9*<#8%;< /Ԓ9%=ީw읆Q~ADwC%R M7"RS[mC@Anwy]/ǼLBP4Ji^I=0 \w`#DId*+ [U-zBW[6i{ko 'OA=;u5& MFE&˹ݦSz?s)liReQA W H޴ak:9\*%(J2n\k];(B'C罍&뜐.L@"@w( 2zpPx/%S#`P_o: ӛg#3w0}ijO2,cǭ|Χ$x)>U.0$_e7T zjnA٧ (ŌEě tL 4BOMl MQ@,Z&9-oEN%hG3:yr}lMa-9АFemHPΙEWр/5 CqHث #D~ťF_E>رAWssL2nVgH 7ms&NSP'T s63[1$"ZVC)h 83:"$>GxF ^P$/C؛Cx[ ,@/ *X"gb\`?m"J$Dc̒`%r W;m@Ifix m` ~ZZ["SO'>k:9A&Xao;6)5qx:1%D7_HG[oE'_`qc:&MGIL;Yp$qȀ#s*{T'(e%b|Cx\ܧiu4`#v|8˸R Sl̽i<+$h8HǾ?ɝPSumQ Q9k/MIG01jltdl|~6?:4t)>MEb=泠om $dvוBkM5bERuQD*=F@{ !9p5Q}Q! upVop$%dR*zgcLjrG*i.:[&.=ŭ?lަVj?&(s ZOiF ][bۏ{ӳ+:vq\l>T5]W㫠PƅkI'C  !`TQTi6UYrCI7t|i.n' jd=h FE<_\xP>b4 Q@7+D].hPwQ &\gR*U}]O}]po_S-v/{]m}K?P?u:\DZXx!CHۜnG$ s1TGaϘ5n !|9*C}6)msY.~`fP*f$,68O $IK縖4:+0 8 u|Ǧ$,RѴ{ȭB'^v'%ZGvUhsqaQ|#43HzhdŧMs092u3MV$]ƺɄwpij^$[I-pܪAUe륍9V ~ Q+! ~חyU kRٍJq# %893gQ`?~h2{Qadp aZŠ "܅~A|_ʜRi.NǸ*BėQ;hpsfITj [\Z?0hWrœCu`ԭI4kMH,a&F"z&fb¯J"LR؇%;d9U!xιf/U j8Pr? m4h[u@ai~A+Ҹ [eWU]3_+.*"q&^6+m:~M,3;ȯg,%iudER,os_@ȵ4kv])#6;mmf'`/402tf=>g귭nLHм|^!fx:-G4.Y3rʬzҊ2Z2S*nE4,VN^/X# Z ecf<7D$AEw+ŭ韼0df#c? 4v!+F|f>p;WkF9ʴΜC$]s<.g8@R#]~K:3a~NkØZ}+\g_;/U*^ XHC۟)t%󘩨jN2@*'#Zg^gsZ5St#Gy2A6|AÎ,~)Aз-gs 2SYxfB&{T|JG )kE%.C&C{4w ѫj _tǽgF,F'Jipurgɋ;~GMDgX dgci A<@NizX36 Md-|.0u0g'j#֩x?I~PAj*dAlVAg iOvq'«i(1T1])׸^cT "X)X$aًx@~ Uyʤf^ |1Ux{$ϜlP'ii;r2+m/7+A"PkBDydD;=B/Id=cH2p6' r >?2:Ήn_ ^{c;># .OtAΡL Ʒ}@]+mƽ֘rJSRhbY蹠(Za,GNHHBL~Y @=ىo,iq;HX,eȽc2a,V#'qߛ7=8/p_9G3@6M\JH@=z{h5;YkQ9|a@Hw](m(a\ ,M`J:RܹDZ68iZw ck,ލA5Dҭ\:yNOgjښ șOeX1i8=i_; I5!/ޙ@yC3ꓤ&;/PQ+u9 Q rZQ *}#v+9eIA{V]K FJyg@[Sci#@.X죗p;0S5;6~@/vHdù]vzu Jڀ UWlG+BbC")WVN=Iڷ"֑WNsM*8U.#0 qv=De3"`הq}ة[Dg@2qC Y3OhFVH-k+'Xʹ]ZB"*ہhÐpP@krM6,vp)%Iz>% hUTx{Q5rQVM,I? x/.P[pq@^o[ zиƋb xپmBCINz>,uon;SÒs,HV3d`Qx^F@LT}IRB{)'ǘFn[W{2W~q 45 )r@]̲ׅOL0H㯶eD'Z]O]C}JBL]mYRvq!A3!W8G l(IX[-xļ*6܏UHY8?+0yrBhCnϵ цf֬ /} _N$a"]d,jdj#h8J~Ru% Ih{9w"^*!y1D-smZ +AL3S:j0b56.L~ڰ5͹EP, zMZKx)7EbFUe(¤a2[O)"^d $-qulnX´ub6dLbCl@ѷ1KH iKGf4Nz#`YACw`,-*wI}MnKJqԛxsv]WXWZ2>ax{k0,&z0 M.3]1K;y v0zf~6h-o=M&&@*MVN14q_~(@)ZMD-Rf/B&}ȽW&?dz* hJ1)x=Z &so6qyjE?EV^`ԡB;!L͠6;PD\ XMkxTK[[Cyj1Yxب (HrG99cVd*LQ1IO^@zvozΟ::GqFrQzUkM{'2 C Z 4i ]G2c.4suS?)5CY\O,.EӠOзۢd](JmIKZiѨD ._h`/"[ƆW!"g%/ "Me8*Q>[N\cnQnxKE (s=.wMrG3< ZzJ=#,K|*m@[Yez]=Й]{Ow9?R |KiĶЃBON "\Ke۸-ں*1J`N3aj2 c F"KY43L Ces$NT =ֆ],[i/jϟtAj/@O,'5l1BIS˺d3~n" 9ms P3N- ?m-e;8M}͏mΖ%]XBńӸBHIQŇ:Ԟ@O(u(\N4/q-`'Mm,ah ΐQ"m s㵂3 -&j=Ѥ4=W7vK]_L (y8B!rS Ey{[1rﭮɑj17"[@`ٱKpI3#DQjƞ^<01JlTa'86@ g0DP5E(?¼b³y=:8C9nčfH DV{fB]X*A|-BPZKz-f9ntT:2>R! $SFzST U-3efZte1p)ܗo,|@ڂDDU(y3!sڀ@m04%Zh*_U6yb1 Е8dHl97h #XZUeB<Vn嗜ߩ.* Նb(%S^;&Ս{C~i`Ţ}մ,+*$dPݗvԥ; p} ʫgʳl%x~-v|HKt/=X?Ltp'Oّ%Kρw>`Q*@#~ [kMl8-bbgdO8CO V*\:6 G~`a pkUAjT@OQ5g1 ӏ᪟gh`G#e'|Jq`Zy$ۋlb?  ـYeZgm?"L̳j`,XN-(\z5W<|(B6ndQ8i"ۤJK^lY=[H^ Y'π0dr/ UJn_'{iz|U_oL&f`I„/Okז=Ч^D´wlQk\BԢS1Rw,Ṁfv-lY >9.f07M#^ G6/"o']*s%F8 롄iIT@LG +3cN /jW' JFҝL@Q'Gqv˜ǝȁd-k{Eb%CC?u:OU9mDH{1>>WWK\痠E߅ ; T{P XCY"d>kaLf՘nIMg8CYOu_32zgfluR6Τ+ R~&W dtH;>Yc&=P+(sw xLל{AL)x :0ߐ]m>-JBk9|Ov.j}eX@%hmq!e+;gj.ׅuBABq5:2m_U![kf숌)}X_3]jjƦu%Ǹe"Y 諔V+^9nl8cW cf7`$4)}54`q̮=i4fIXI5eGTիK8o_J䢣2Kjz [ՏGRT|V_VBg&='v X_&gR|q:gmbw~v4InTaZA}._r•mQM vB&ߣ-X"( /({]uhlӭm2r3N3gzRlAiq0@p 鸺MKBZFKpmg0pus n?e귬ʝC̷1N𐙸bs ͐CNh<-/*`Oe vWj&7ĉe$ZrQB0`0zí+3,=70ᮓvoj EZYB&É/GE☬AM4(&nqAT+ӊZ\[y:'.+hC?:tQ@eD$> zXp#=Y;k.+*lN8.s_m#?]ZFn9/Aٰlɼp{RqOh#YU%.H1?M` " 3$e>Z]j&2s~ .ժgiGaEu?`+[ƶ)܏oZ{H<SS?_uU)V߁%,y2_)چw@J⬨Rܾ&`Mc#<7[-78eKm}#;(U:PquqC d^bԜ^vݔ߂h9y?迊h*J GMDҵnN&F'*—F"^ ERwќݒ=ܗT 7iXHxLBN^.ǻΨHYoT CX[&@_+`G1mo`bvD%i ݄q9Ka-s'#1h1t ?i3+K} 22\7JN2?5lv%L圹zfN˵bTQ|vaMf(*l9M,A=cD8^b6 LD} Kt{~ހoL}5weNnK[/V>Nxt7{ݕݧm.'7>SoO}6D>4MmfY])Jto/\@9foş/ߺ.v'Xni.q\Æ1? ׫Va^k"鿬-,o%ƺ܆L|MYva!y.&6S%C磘;?E0d)_eO+z96r]d<H )| "{!N",˛# 3@)@WFX@]e,{cF}J<>&X.[4u\gb6)k&J`jHxw5w>rSRegr02=^J֖$!__Bo 6vh˔Ѝ+K> @`Yx"\Do2:򏿗!ɡ[Q ;@-p$ŬL)q[)Q0#j~Aes 3FD3f24[Z;~pq[Yc?5숌y6Hnn&u)N{gD.6P"WNZDjmGГWO&%q$:1JLS &Q̀c6ֻ.En*Q$Xgx@kH)JyB~ΰjQtW@5ȞBH|; e-<= iqΠLW韗הwo rbZ-P HT/_)%WVO8z6!+6FKA PZa2*`bN?vj!K MvPRyf2lgxo!_Ho9`9Xs$ "VTlQ4bX6I(P" `#4{EXޱVUɟ׏K,kzZnOHn|@zh [QU ((3״5.cӼN\# ~%+-ttbj*}LJ(v94Ko8>"v7^#,).yRk 0謟slOO,@x42o" 5>/NFvt Buq~uTAdmt*zr_` x3=n \i&l&\ĕJ )60#=pN=iRb([lTmp ꄿ+Dͪ*RzSʁz#(B-&많'Gj,cf= ҳQJήiY Hy< -Q+]Tc>N堌pHtgpkPiT#҃>dΊr%xq!A"=hG*L"Zz"T6g[헐 }*k,HIQL61 HYv3\?vL녱 Axf`o k73 #"v@U 6{Qj?#NPƵȦL:SzKL;6 .|||qMRCFG&k2g+Fur= r)[ߨwsGh@MR+* [vڜV<}j 6grDҲM,yhFI5viF14rZ4@S-{ktIIM]SJTDҼ-r6Vx68^:p]YFh:TOdpC.<$$ol@ IOXD*BVL4h]Ism8^BF+8FD%SdKhD@R%enjF=UI5yR_/c`kUc轼;0)̶6gxabk}&]pC# '%@Ez9La{@}6L @$*Ϲ==yjK)#p飢&?&]r/6\6F֧k"_q 92|2am27"fBRΫ1 DMg0C"i2,g{hͭiA[Ji+4Go{=\S`> =%~uﶵ`ykNECKD=l&Ϡ9@7[6j`!]ju_7z맒xgs`ZtV22f{鸄aNA߻!D;0Ci3tw|HJᓌ*m+Il Al%(=Uwk>d c5/jv[b3_;#|BHjV%npH77h@PpWs."v*|, J8dQ-,B%\ "G|tm }QU?Иk"(8ZꈫSdtfg2@%\&6/&&D)V%g3y BMY@`z~;`Eq_z9syO2j)}Q_ 4d,U @=-B׫ЃŽ+c]wP[~j ' KoԖ7p ڞgٹ'H~ c,PL ]6[!">|BF- l;PNpSsvQ n۸ħp&gj;L%77pM@]pu'݇&}_ L>'/~Vg+gmw6uw{ vՃri<^/*)@U)%nF.vDոR_b>)J7 \^X|*9{dsKD,S^,ѪW J1Lna_Ld*,ȉD _ j=9Fڛ? lK݈2~^+¬k) d!fMjjLVe|'m֪HL2=㵯Gi‹,K3gR m-]QPYӉI-y%#3bꜚjr (ɷ 0?``}s75P&ޱn⡎8v!J1;>i=(pKes5qXbh'(6 c- -g72·oxt1$ȔԵcGZ `h6i8Y?X37UNz9{y3X峮lZݗg;W >a&g73ǫ嬑e [ ` 3`wQ'2(D(V$1RpT8'%0 0bJ9F/>A2Q|LJ2NÐ=}P[GqƬ/}L N)\4ٕJ[ra9"/K Z+#.u⬒&|]#5l]]p02]I6鷯){~H_F{ f%$T3u~Ʃ]EjVKö<CUC2Z9RG,E# y)n_6֕ٯ;X.+!cwy,ipKh3<"P V]%I|k2b쏾>ƲydA$iU VUKL)L1q@wA)+*<,Ǥ.3 >KϤUEŊWh?lLWNesH:E> qv${bp(̸88MtU=Yݢ-E*U9p$G}DAޓ^(ylm7puuPl,%^/cX: ʅ!Rlk`(+2Z,ܙEfYMV'hXqJmh#4^Ut3 f|(N^It2#a &W9Pȑlgv\ٕҴ;Y2sM! }'DO_p*,$"L]5F^/7\o~\2ڦ.O1nVr#% C$KZnJ5W-ySM/XDmJ}\Q;2sh(ΆLę*'SIsZ$Ο?!B.|vܬ Y^kȪc7vv%x635[$]*סX8> ze!f@}`9N&DyPd 3KU#|̛mke HDHq O4͐kicx d ^cu~ծ—8(PKo~hɚLX9,OH0e/}0T6)!xݎۏ*l*oς)lQ`!+Sh!vYX<5jڥk@Ur 9cO߂*eXw;Ol:_XJ0DC1e~68).4z@o5Ĵ&ӓM4&JL9(se21*w(cFu)\46Pl5NFx5@V_dQ0fkESΧ-$:yflޥ :H9G TrnVI8c0.rd3mЮ(q ލ jÙs.%Rk5`ϲU/C54ܼ JG9| hTg_"KhLޙ[}&S#6,I j* qkG2[…X^AψKYXwҵs7o˜B m@iiO|,7[W} fώD09Ԟ .F_нl:R$y`,0 || $dT QpAc텿p.KL[]ڈ;O-q8V„)7'].@ wVoŇa4̲duyJacE} sp4Lmh1Img]!+񌾙fftӝFh@bQ0*%%jtȉ/Ǔ O9\2ؘloNhҾ2iY=U}L] "Y]yO<yjDm:B]"| B #{r!ݎw3 :!zf:9X8W0WV^8^JbcZeGŘs"WX@ִoyvG^x櫚P&)K:4`Omc>ж2{&FWZ]spԴzB?&S^c<,sgR+f`S'Ƿ(u`BEݬcP-B8@9G0~#dE4|jԥa%|T;s6 Ǡi !ԑLb`X6 >s{ TuN(`q.(20>,VG8K| C U >fm.}˅Q򅦳܆h5xIbך_O<=; nU:i[e_O5cvvDVL_K:f=_?,eH.NZ`yY&_[4e'=t'JXc ֕=ȝ8l>9w*/3u6χ<]ŊP]0֕e*8wo{~ 0]&~ehߐ'8='i tvň GPWTcX q1 V֏ڇ/(E_\ܚ+ԅ|33{Tt)ᖡג e/Mve0f|oVjI~F5t+$*1 dvŸтOUs{s"Kƛ%v{7SE DCF2€BE]E+罕}i'DL\̸f?>[>ĺrf9DW9CDym2@itݛn)-_WF׉5oO(Kki7$Ic@-&ȇb*l 5d{6Vx:C(FN)_ZyOUھI9j\ (,|! b^81V׿Z*\I{8B`|98OYʼnj8(`6|nXx$ /pwީھ: aEm/?.FsLIM8L^1uH^Т0:g)>u!I-c0!ǕG: k^܏QD3bkDrnwd^îLsXu'H4GRRj)Dq(3| UqoϡW7phtG,Wy$mxӮlTog105JH:6L|3}Pz؁:4HpjəyVd#, ;Sjk|OWÓ$Yy6B@$*L?x4xffTm. @ĞyK~K_Рm,5p^]rN۲D想MY@'g Jq'¡cւF59f{AGZPV¤Cfkzя蔻u^<MwW, Qa)m~V-K,iaY,%N z,tPͰI#. _kiQX$+EQFVa6gRig(5oH6}"Ft8Q15 jm-q& x[)IW8}SCJXqny)$1}OUT=/i/TvA@4oΊƆ\N>f*llV%f[-=vӞ}'6?-BK..^Ϯb/H7h&b^Y Ύǻ_wjVo=?g]j1-~ 8}<^ɖT|oȍTp6lG~dwVh)sYy!sZy_W&GZ[߇lfΨ`v6RtDZV>,BQp[[R?n|kƏ~YoS(OO2h9o}㴁0{L,o >aP:5Zi1ս"@ϲ-tgD̊${xjA9t* cQ8[|<| ,mA3|&d KGP*Qae9!u3l3Y*i6 6gQ@A84N]S&»&%XBEh /؀ m=x3/XuyBUOK,6Xdv.T(T֊1=ȿ:+3dyAK94w~ Mؠwغ@%j~bfU"ƩԆ^a@RAgzXn=;+˩l2wTW\VLjхw13D\ -3Nh^& >JcfPWg)@/iG:y4Gb;nO~uA]1;Ht{7aIRIaK SJB Q|Kk>Keˆp>)q J F Z"5g-pVP4)}\$ƚބV𸕱$LK ╦E@4eUsA{Agl:+ Svcm(2MiSFj(S&T=MYjƩd 2mR0o#=?_aYII#OJ^X8DŞZ#V?Rœ "TF,7em#ls=QQ^b8UYùϒoxgQ'r?av/칳xM*dSYP&.UW^ATn5y6̰4AcI_) wO`Kد塋bRD\Wgv`f)Tܕ(۫Adׇ<}w|\0yb'EYWz,ڷ8=`u9$ܩpq{vQa( ɰ7,9޻9 py.j&P a"֏iTX㩴q0'XtH:5ϵNoJiL6b/cqQ2s+NȐJJ0WH +āEOHo.A֥a%\<@UU- )BByƘ6\ϤCkҒ@\]Nc+z8̬\%Sd:.OnSw5oˁڥf%/f;XCD&E>[i2-4ɟW@⩍ !̚^:/7Vd,L9_wnƜwØ>`9㻝h4b8$7WINz7@j1D>8d%ޥqT?F{mvT-a+M!sX\,  Wq[WxFQ8wHq4sxތl$A+( Q5r_ZxS )t\3lCD1 !L2'e˻Ƈ %ӼBf3g@f9p!`*b/^AU-Q3&\6O ókƸdfe 9R~(Onf)e~Z?WEv?&oտMh~ϓ%~??Rճ߫k8_t?VOն~ؾsޗ)iimkdEK4-0<ע\Lb& ٠\9XEm8LsP#r媶\gKXS!hwU~*>{6۬'δ<ݾ2+ a>OKsǻ Iݤ~[ӒTQYΙݏ;}hH`ȼ*4~X"4`>}bMѹ/W" UXՅ7zw uR EWAen'Z1TrՁFdӵ|bOXV| :t%fLp|]峷ZL!gq4"2?*A M.WC~ &|T`%hķ9P(f.q% ;1ʍߐ& >r,;ԱJ $0 5_!U swIpjpgq/63< DL,@%b"R%X*m쯵I*nh|UU_3Xћv_Ywk/RMx1~ q=qI,pD G# y e@BT ƟT<|~/OIB'[EVerk-)U]}p?e6 x $xU$lWϿx.mnI寙?my'؂FK"Q)1F)ͯ&g|}nh "wDJYAX(yv/m4f 读NR xv"*ftnY}a TFǯh"(sc:P,E.;awƓCQ!mMU_&P%Us֭EAz* %BB՗t$gjG]||%]Y]"8uHX3jyY/KҙSS@vąփRoM Zts5!00Rx;u?__vXUUOTmf ~.@*!-T$ZO փؠGN^mLBW=v`UMJ"!Z$C?pSkl=9<9.SÕԀ.N<(GEbZ05T3kQ!+!JKa<-;_j wtV'{͞Թ ;Z? ܾ5vjjs^n>CPSpVtBgpp6!C$Mdx3ORqΪxWZ-z#pr%V cGPn%.O?2@/f,ϊR ;R KJBh(/~-_ {ZГXbfUE`N`jL܏32Of }# G EDO=bce 2YPJ3ꌊ.$CNJ$if.8sAv)4ksI0&jģ;^\ K7ܸW@>`'{yW H,ώTل::~{m'Y۱/]q@ʶ'\CrRIW{2}湣CA@V×@&s^6DIݸ [J1ıKs8-HT{힛QI@>n_7jVoD-N)\gzEXWPJ10wZEPrqÝl9WpV4 ߌ*$ voFr 씎T6Y %d+uIԎ%6]rc ?Sm0"˱ԸF0yvb'd< Bol"o# &})BdS"Qaeh &[)Nft8QXΏ"6CkAt6uXbE \c,Ef/o^U j)F?l ^ˀ13Ou Q43fvyȿ=araWQ8t<Hؾ P}.?*8J @Q@Ql 5'}'4B{uk{sV>T=H{W"VU>:q0L5Ƀ?kS0OyVf.35wB:r6BrM/\(:SDs-`y`^H] wG%Si&>L~m)R1Rq o5Opk3(( Q)qٕm_f`&lpjF@QGeQO'UO|cbl4H~)my{}ei"S`Ťƨ>=V9t) S+[*Or"NsNy"eM]:_.=͋/PMfR_:AVY8uj&T3T Ɂ.F AJ3yi@TuYjފE#r)2U1lk>KJWde׸ _pqМqo.;:©qR(?q{MpuL}FT`{b wiMt"u yk.`dg*V =]3SF)?x@oY96{GO, Ư:W$0(b-w`z(׼FJlE3\{pQ(+KAʌ{SO(Ib#,/I x71m 0t N ֣DHq?485[/=լ`I,1=7A`F' ˞/SIWv^YCEjtlBfNW*қV9V$ r|ĆH?N.k`;>a Cpg! |OIz,[ _ɢ5Ngd)!^9Z i)IPDж&m~c-9t1nptΕ^nGM0:_a0N%)BP~Lȩ6Qck/@ZjŽpaV*zp[d6P0lq*w#W"ZR2rWESLML%=ˉgըVt/_/ר XIE۝O'=$0Nj=Ų,Dڕmsr!8;P=Qx(&'өbhTMZcH;dp^)Zwv(*8k+`bc}{ǵg;`Ku;IAh"_hkM$ UE'\_r @#∟`)=n2 z2A_3\¸R+LK/{q$=9q& vxqfmD2wG^ /@A]45,Gخ^/,0A@v[䏯liW%bV~˵װ/M0l{/(3(Y^+s$|5wsLhL?-ObG[׿;*鱴sO;r95HK(9^6}mGrh/7S%%;YSGehc1։MQuҍ'{pp-c8|f[*GqBeCиK$l7/ ::I;"'\J[Rt q`w+g׫>KQ-F3.G#,]&HJ*R/뵌ju&jOh-CD4&Lu[Yֶho*7 1YKi*h@q. Z"i6)p=fk]Jp-h{x<|f[}4#H5(׷@ut2,=US` ʉ+=*g@<Kz826?RçI_sKRwUܔ2 Rw. 0pݲ:hK9/ vO (Cpb>5)k绝, 3a@O4 3ov B?AsI/ na+ &{GcJD Ch7dIms>(~ON%qn15k{$okwɁ„HQ~+u}"a-pޥо?gY%kI=:@j@q`#Hť!VfMƣ*glffNsɽ1$T7ĞYSģl(Ĵ#6fDRGf2B";)QـD_l̕u)獑QosTqd4qSo눉g z[{ R.3s{Wfތtx p8M1k Ox\'GWE8~BVg7"=M*}W\w?w"ukFjcpmCgƗRa\g5E"!L@EMlXuK;9Y F%xqfc4_HnWhr%K1C@ۀe޽av!aP[sam\`-&(LC9P(FgF ,#.uzQ&氷zY]ƝZfCs94B ڮ |$>ϝa:$߬U}bujNu~L\!oى_2?,t2LѸfUxdX*9Uڝ\9W7  {|AӂmmӃ?QΚDnLқ׷qV:ȩk[0\`)av2Ip5 hʚ 5%&!YH%jy$.mGYD'c d4 פi/V_ Ź!Vxp}=tҮaTU ^i2%_I5jPwvSDQZƫƶ͘ܥ/zI31dDw#)~2m̠3O0e%Ls2}}\m,O!n:Obg63TxiNNI5S±x=(<-&oMZ$YI(x='^Znq0~1e4ϒDNhSraҚGh;@l7ӭ7O{j15B˼aΩ9OrBMC-/1#HcԚ<'$yoH%B_,:N 2fPL`cDER_>3tڃBpfEqr<mHZbȻRŌl0j 2 Y,`iPi{Tu׾7)ꎦ)%o$Ԕst8fL~c{mZrl3؉9-JTklQq&EJ17Eϩʏ4F\NԅP]*zо"dR}늊R?HK-Jw끕.LL;vDM͂M+&*+(qڴ%PjKӲ&tY `p>9ZeOM{v)..dt(8Kaoʝ%flh(Q D+3չq;qO2T>>; kagʌ-'Gvz\_ b30Z'ﳕIkQK ;YqzV)+ ޣkr6eM &t7Es[T) T+,\!Yo>)<}<:S5.ntРߵQK\ y+ybMmp{lX\IrLG!0/v2GwLKaǏJ!7zFtMX=;*T)VGk1Q3-we4L8(M0'\80>r~0\JBlcV.灖uvVHȢV%hrl֌4p4xK.*m7=Iqv޺H'z{V@;Gg^8htd{zY~ݮ=ymU>X'k<_f/~{A*hv@+Y3z^B%ĕr ϰ-az[CwFQW ϒ]{5T9pqʒESr3k؟cN޾6e u̫Ba!Ik20u~urƐHD*Z[<8IW%IU]$FIˈ8d+]TWW5JlPXhR0PZ$s,~kunInqko2(M+ 88.a-*J0QŔ^ 5R6\^"n` @wM<>޳');LjFpB j7ve0n#Y_ }%B|nc؋ȧ M`=%+ wA,6PΧJ-O,'- zrr`}}3jY`_Q.JoUc.@\=v @hW~G6m`_$!&i;"6T<ʱ”fWߩgu=%^TVCZݬG<hSv7޷㊌ZrrÔ+0 Q3'Dhqn"QI[ /|4|͘ @ Tq|1 ocuc[u{fF) HEAUe,mSuBgE|&u|Ib6(8xZ9!@`g忏{6~YÐ2!߄.`fmBn-]{ШCّ⣥ԋ9j7osx -ԭ?v*fQ6N 'n|hk:(Tz P? mL{L92WߨҾ+١Ki1hh(K&+88㕬UqYժ` >oF 4R_!!w`S}VM,*/Le¡g`#"Z,kЏHu[5.lNd YTL\尭cW~"c2QHP~fdt@u8r tƘtxkl.(+%mi"5FqRHΚu9T3Gw ]Uhct}&DLk=7ͨs~[B'Y\ګC`M:sf8?J1$E 1~UDiNh9rh8VD|UTsL_`x& KUr( 9.)Kd*^>h Glx@Bu1i=S8b A.bY\=Y`r( aK:c"ѵ15|-nX\-+A6t@4Cdec HeB*\50".A0b7BU{|$۷c|~Y } O!=M*B7ƶ&ïC:" VhݥPԔ\G7ţuW|,`O Gâfz9Q iWI 'pGsǓG+%c(At+.fUx ׭7-ҳ=3#.aNFׁ-XS߫{Fs呁8}+Tsov=)Η*`K%Nkḫ*PuVFƒVſjFKtOܗ}# rd" zo] A'gԥDxrP1#(hfZNyMV Xk}| _ՂUj㝉C\E6~uխ=0$H@W2== E&S3_?Ԡ% ch2󱸦C_A|XEظvQj_ *RS$%%V"Iŋ CLtPjgJ !6whN [B?-LWԊdQejc{`rssٚl%K=l>'PV{05?3S?¶V72i ڽHș Q^Jxǂ)GE3Ӄ3 õ[=X"Oy ~&E{ lH? O4 u?xx@LSbǻ_rBօUI `H<|ǵ0.G_>Df-#n+K=E=KY!i. ;XDj/W&#E-m># dVqpi"ǘ| LB*s~* O KL6IcwBقw5O5 `2?qW4t}/m5"sT]i(?Iw2jޱwQ% ]nX ƬFzq\yAig}-F\$<)NOOI5u?zn SۑVcix zG̏pyPۋE;+yĖ9`gcQɊ6 :x1p :f e+ WTى)XG\o o[uDJT'kI"l: M&c:7v~U*Jiob.]_2#P[z=lcL1(۫GS<$+2V'@u8EtF#?ΑgBd%MI!mf}NL5.yϤS?O䆈É1!CD5mc[K_Nj&߻?v9c*G s,e?nCo4s+cUJ_塗&7%%QҡeB+nƞ 4T.44Sv3AK>?x-;0 5H3"jmT3H,@mE eľ7M笘Q)OW0UZܯV6zxs*U `܏ 1C&<m>$ `|%G4 Tn<- AKIWWrZ 9^jBwՑ}%hh$8"z*%0G--) qz`nnwrqvR('dܒ29 hvz0羓4ÅBUaM<^l٧ELY\59']q(C0+LWyhbuٚgg )H[]X fO찙mvdq?w "Vu4a\zE*;Y١ * ,eM<]ZbKRO`х FFS?bGXNv6.96S" cPA$䆋YrUn?DI6%nZ Y7YY[켣6+h:sm+|fUXPX3tgAL=a9Fs >ꗧP!DFw _/ FoNn76|ϨwT9KY"j!pVTU m<`x3ikZoiH#pޠy\Rw E&$eg-| -<=dbs.d#BxZD%pzOQUZca*-X+r]-5L,>( {8ɉE}p*CGEawYA=2 m)I?-RkW{ Xb 4zN*M?OzhN  z[8?<"=D\nX+w` U͸t:{Si-ŐBNMF} ˕nx>_<.͆HE4^JS)J&ZWp`U$:,&_V}1!M\oJZoHU oI!!tհ!Y F_(; rҦ̋pcg1󶵊Nj結CI4_[tzXDhto*zCBv: )/FFx_rTz$ yG> % v W:X޺XlG)"\E/ zpl_Y>{]0{  g힂` l"w$v+W,Wxg 3%Q-Ize* SKt}e^ Sa0xgv`;;=oK3TN }[xF[x'b6Rq?J$g "2 lөdo;t}=G^rԉ6~U`BHn{2Sk֠W(`@Q#VV&D h1Fǜt/Ą)mb\:rpâx/RBf xʂѧU]5\!_mB/bR{kJRq*t>_r|= dvBM +),{p} BiZ%?utqP9"`e[#R8394UI>P#t調c/v ok|'V;,d_dQ9gPTUt?.H3v @cY}.ŬNs0q![mh1~M` ۡ R $C ã@aCgTF;meM 2Zh%t{W'#j7޶v#4CQb`k~19qއxk:0j/ QRd[Xղ^Ad0}U9α"!2pv&y{ǎQj@r 6mJ?9Ip,snpN˘/$.e,~=Ѿ c'ԝ7bNUvZ Fg8RYa9g,+V+<ؑdh: qȂ?o-m- N)ÛD>=[м4އv58eA1ŀqOwԒzT8q+VlKtjO ٿ$pn~[zBe`g)pTCҴp0.[ רŦ\3!B|Ni /V۠C>qD5OzDm pVuxDw\-DwⓜrM]+e6R\Ϻu Bt{[eq N 'hlD犱BW-p#ܥ6fd$iTx |)2LT_a@n Unކj( Y27ޯneǶle v*Z 6y| xE ]ž8BFtd'RZ*YgY"]F#q韨Ÿ"JW/f"%sCm(r|54`O^s3,Z;o|8W,ݡmp`-'v-$%GcM>rQ oRuشcNoV iJ`hIbC|".ri@8m͜}wr ۂHvQa[)F2]@eju'PG4_0)izVט ¹ƖtPO󔮚A빹 mML7moOTyN+3uByɎkk90(K# }+pS\C jHXXŎ0Ewn 9ҟQ|xbxc []x(1#XV, W<WI@I"pdWjRP|I\ah㵁kMp'j`^zԄ }W C$Nv a =\+ÅfJ%'rkEoDŽ6_( {`=nEMDnCk I OGbzN%3r>ݖ<'Oиe@i lC$:679'tΨNcI|Fh-)lc 58nҤC8΀d$vԓrjc$Hm$];:q5¯ ٷh2tӛDANVo¼p2Мѵj+[ eۦ$%le|MK \\ΖG|#d酂.dݐt]f.Nlw[J (5LiNt=3ZPC<^wkZx&y KCV;rIJyf:}Am1rw*oгvWo?*#\y' %=YZI\8hP]̭BwUV'rtyٲMX KL)+~;' 32Ei?Ӥs{[ņb|^_'a A:U%%T#m|bgRIyR㞮ղWһcxYx bobrs6Uzud+B-Ī&?F%Whu0YM*Tn"]Tp}Dk쁨rY>_Ϛrxȍ쭒Dr -8!0S B3ǽ[T /jn&_8'=8t7g/WQG!cϫ 6:k-D/"'xsp\~W]~'|n~ծwե7հn_VIcU߫vo}]~Jc/hrxn~_VWT_ P}Z/u$SzޗFb Bi؏NOSvO>O5p>gHcaYZYjR}+h͑]X;Nե dMЛri*T\ ^u?uh8!#\T#N~@c?ˌ3k@i%{\<Ҡtt#Y(n5%QXѪ7Mi&kMZm nz9W-NIGEpAZBnP̚ktR'C~4H }M[#y$0h_oAG] d=qpЗO2ћbazT]{P?!0u C C >owhӶ_GlD*4r W`d$EY}vWm!2POC0DBA/OS߁HMLy?\n÷N<`Ȧp+q5%l tX98q. JjvtMTՙ` lk'ӎ8 e_nC5-eɺԞ{,ܹr@TlX+N%lƤYO!@ꢚ$y[@\Q`zb#WEdTP6rd[ͬ~"%:57E_t*<U8?*B@Xi`-Ӻ?UqzvƻIz ̘5"#IV3VLSzL ?ZAREU:?Fr ӑݙa+iW"1S步@A pБR" 14e|(zӓuA;c$g(C5~mB2{ع?uCnI@9ЃwTtw뭅.,fޘJgxko(r<-Oҡ-3׌wĤN\p#e=,&4.I/ Md*qNpyhY . 2GϖQx${Qb7 V  (#{&!"vhhK Lf${ 9NJzQ WQ+2vC#=EhhE2`AIWJ 3٥CJ|&=!,%؜B#U"6LsӪ)LVYVVev3*͵-knz*bni%7! &pH$ 1i%_Hi̧NsG Z;.TAPR~Q8TeZ}ea~{MKӳT>낙B!ԴSKFmxY[%4ki DJchC^]/U@P^qHg-Y!!^^ C EGM/'pc3n#r'zo.A3^qɬL2uѮZz͉BuyU6Lgޚ͊`BiRzN#K3"4ʳ\GۂX B m1Q/ o^v!&o*f=\D7;>d+pH<8\na<3l!1ʹTޛ?}v 6W\>a#Rm^!  PacCGcEt(tW]:Dz^jSge//) ɔ@;JVk(r$T<1>}YDVa?pa5%k rHH+bDmƳnn+99B" zQC2NH`Yݙ?vaŁC$D m* ZB+*}٢!Ŵz(c-_,TBhu THv9řqBB[NKLdN9O< Dg}G,Dfdjl,ߎ1~޵j|_frPSLki:MdSQn:G==&$6Iz}p".L Hݸ$T> ƾ=y{'T0Fh','"oSV,ѳ`#+]i^ڤi{lj'q7]A xZudskfŮbtvEDK>MWtC$;A.h?]r2_=ts SIq^{OwxRv."똃5Hԕ["͈sɓg.R]JclL:ӊ2W -=Ɔc4l[nq֓.LiaeIX*ya@K_\%&S$Id(lA?nD*ML%73aFNpĄQq*Ud3pqѵ , 3BhM וi٫nhe|TWaQO6>R]5nuSԇ-KFZF&75";-eIke{C@'ufŵϷX|5f?W8p}o2Q9Ų-Iz`O_u@_^~MhK//X^YCvyuׄ;OZjIM};g<&Չ9bIxݫLty3z&sz&s'x@^F0/^ hKH/sKH+~5cJ4X"*$q?R9dƳoKYt}cʼnsޖ0>5љp~{Ȣ%$(-"vњM߲2 /8frL [!Gv`|>g$qC]6O@{1 B@N ۭ[mQپx+n_u"AQ$JeFߵ#Qh>s~#q+Ў G.yw~&h ޝ[{h=QIhqX6;~xvp[@k3(nl kkU Ef # D2\kOPa1ݮI:#Kȿn!b+f\D &LV֝kR5@L!G^@"I+g k<},~!e-a; @ͺ*~"B\b j&p~}錅/J0 . rt J s a|J1q!]6mt[_,]p Vi|!6 {lr` \D1yOI`2S}߀D$s)V~{C72Z V&{`xSh_kA)^~Qŏg_9Ww%u/fbVO3"Nb:n ;b1)D&[(5*vZUʅ<Ny{&@aW/OrJ, Z'#i VqcbKAa2 %VhN%fNy#xb|b Yu|7aNn מV n#8/u6L 3r$ gg[|8w Tɋ+YLoᣥV@ob@}|z}-(2 R]~mWV'6z5.'!6uJfY噩2,( T2~xW0 =i`Ta|}y,Ic˨Κ,eH5Gmr vƔ((| >@يLK[U沦ڔJSD`k+1AY!MXuXf;& hzUўMwCA[ /.e|`Z]"1u n`!D @|(W>&cZcyKCK4oDip!j2LcXa@$@#ӟqt =̟/̩$8сcV]{5Y@,+r)t&ffZO䕚LB?A5Y@n~dJU0v= M*zF<l{ m9џ: Φ]adp8QL@P? N<9I-ڞSS]\iZr<Ѷ|-q|R()+]E޴<mWm."N57UxfJ^%Ã遵os;ma:Ysly=q@>#A@]kOC/X5[)/ '."NԤ&'Q8VI*ĹxE0qNzP)+zmLd`m˨"F\n̾qZ{[x0d>aRfVPj"B܁'G<_3E@?sbIv/8XM5uя`rQsU@79M ()3*1sQ{Nv;z9\in~v\cFתtQ[;d uP^dSW+R/iwT'2JD[@<oSTj$%E7g!6G{d_!>m oUubj MN n3!bN'z- ڐբ"QJdNaǺ/m|Ԍ>1Obe{M+2KDMf1~3#ow%ii :::s7]; hMT(X+_Sʰ5-Q 1 :/$<o`+]z&Rc6[d*P_yE.1|`r =Pf&{#jL9l(iRrI?JJ^ DGR~Nϩ{ J<2: AN"bx7'0&.^)gW4),-=Uņ6$!Xn7&NM|( NEA޸-t%0l6Ym t8p~{U3 ݅T^z*,)YYY#Y"*[6g%)WPM;RDT8,bPl[\3<ѺU>[uXx}2~u`:5"+Gy)>% l?:U u2h\bTnСY($deZ92AyT(ʁM5bf>䥞,9*pǍAK?O4H/:CݔT%dgHQ5U51sզ${a4DK-Η((3P; hku>Ph9x6ctZ{x n I|v9>%l 𤐱R֘1O .2SK٩/TJK0 ×"$7F/2i,bA? Bč \IEE~Gm/?|!/Ar7l,dy s-51`'q8 =[wui9$x᎗N@kq@TEn%@xV5uƏ@k.D,KvNwm@/a,dP줢^F(64y?. [_6X!Z_B#v#Nq O%_j4:ʜ0һ`zQ-V 6Tɉ)/ 4eKPHս]Uǧ Q 4q`봥J?Una|}CVlf(Gdv|- _a"z$>Fb+jeP_u (w >GZ $h$O)}2[Y7/w@;0"(s_p+J,ø5_{R!q92CNYr|?aQQ5wJc5{8x51<(DY,cg'FG{SK0'&8\g a|:O]G'r(UgnL-j]E\%>NFK>taoT̪Ssr,©4mRF"5+:-uxᦵ|ݩI<7&L!䈊ת%G߷TjT ?`"A4DhU_vMj=v$r"x^RF,E F؉IE c maa6>i?F.nZ1vr0{ 0z/l(Q|5%N@+"\%_Г"173$baז;^hHrѲܦ9wl}"D؏ 4LT[rL DIaDM;eU޼mx~TyB1!$骃IZԊSA "R`ab8;R|yvjyx݂CemԞ3p Px&NMnv24#b( hjy7`!Bc)x ePM~6ܷ]$!u^~_,b }_'cW$ML4ਖa gmcU.H yĂXOVSC'e[MVV8CIųe PTΦf.z وO>Hl2QbZa5jbNJݨVp q F%3 4׸'_j`[>xnopsK+]c Qie$W " WN2pCRyQx8aG,jlH4(%< nrI̮ 0Sl/J#4AJ%C" s"XnKdOjں"(+#Z= T1ppVK+ѵ[\\穚k#Sp΢KXi](<'=hC{CfLC< 9; ;| 8YƊc%ع:ck]M>@ `3<:jA*trb[J 2_-QvBg_T!hx(b4m\YnpJuZvS "@l_Hf4A bGoz Ɋ=P(x$5Uk q%񵰒cjUh<.ʊD0R$܁dq&ie[gxzpX`3wÉe0 V@3Ҩ16T{h<הFdzҺY^%{%'AF^CR+PFt^+r *{6fHrq_CLmcK?.#@B\6Jh]dԊ=@8"|v7& ,@V=HBh ⱸe\E+}~nX!Z{ˬٔ ;l8?F˻yJE( u?ҫbz)nTDq)Q:5 .E ^z5dL~](`UT\krzpMm}@ ĒZ=^񲜊ZTኇ"<:?TI͕*lNYCPh}=.;QDPp ˳޵"[CŕU+k%^ZXўȨA{u5p6@>Y:6 _t|z C X1V4MK`L7îU>ޮi7"Bav  ~ђv`l"tv$v fo\Z~ p֒vB'2@-Vouۧ^aK+Ȝ% R5ĶUE2ڳ'o˂bAf8x +)W10m َ:ݟA=SO|2`4xDa^CXsrݲ1_^ _/q Oӄ?$?(UXSsУH_|'8i3 x2ZgM%%^k: ,qx'y@A^YQ!#!)dI46kp}prz)0Vν/W' lVoJ֫w6Th5̀V%w|*^i|cA>3-E;eVGg77ЮtwKٯ?5.)d-%Mػ*CFݼR`bh_hB3Ƚ̌",&>2\hʐ Q63$(Poxwtմ]jknذB3c ECNfL>YJa&BS12FV= 4ZiY_!:@,%-&-=2"H[KN.[nA'y,p) ,Rsmd#Gٲ%zl " X~ЬZB>}wH=X9atRcAW]RLpϠogA36m!+;79ӯ#T,RN2"?26^CCDHMCd#|69'+} ee`%UtFh|?H14Z3=8T7.>?c*%kykɯŒEMN.HWLNf|S$xs QRjn0s R}z+uV97?tD xӐL0f-Vd7vo&62jbxU k5-B֩B熫l.Y醆dtژnxK?q+Y*L@MMfr@|l$,ߌFF=lcf&\`s"&+<#E3 jZ,aJ{G"\zdۥN2r5/ȉJ`݈|9(Nsؘbi܍mR$EQ7tF!5BwdO=FUYvK:^j4S N\@v*'}/[[U]~?miձKCjS#c QʉyQgE]a4|t.T]y^\5 Kc>2#z"XEifr:!Y|l\ ;xtܠÂ1 y@}rkDlrLLx1>qL݌!"E : ^ f;nl|+~āfu* ϰ؅5ïxlц "MI&7A<[] *(x\S8;0cbΥ9D} C./{3 WPT9zoCD1$ыR7+1e4w{S3b ٱ'_ort,D9 VWG'XtH:5ϵNoJiL6b/cqQ2s+NȐJJbЯ"/B(Ϗ$<_/ͣ5B]* s8xL7<2r47m..=K>rSOShDҴ8/srO>v5">+ȳ綊yd&L-܃;(vA#FkI~U#lN+%)y+~IcXx >v$K" eg+T1)s(!J +R>S΀m56%QN+0խ.4tóyOڦcyG ۷Bm<ХKM7.`m R@ w(ī} =A^ Of*ڋj'u6O8αՠ|XoDH̲G@ǩR\auN{ʕy9*2\xS"w5*ɏº=P@"T97tGx&5oHhFRteR^K\[`gѱ.R;fO]n!C9BaAB-Ǭ(W2bfEdY!' o1C-|'\a}z۠V#כOҴ_P=e=^&<$ac$ )qPXoA+4$i鋚x0R[+B? l@'FH&lJ`=>:o]+6Hxa:\]uALNyJX:->LpBN ٘|FE<;{:ëT&ũ)N Q }7u40y*k+/; {s3 //9̘Bed9&)Pb2,O3qLܸIu/ހx_)ybm^}ď>n}UcҋS`-^?Ӿ6GGӎI?/,0}>\sIO# pZ-5, R~5u0z+ۦQDho,f%TU ףMz}G߇]&@?f4cOM⚲+APG^<2~f㭴42kڧ:Z2`:Դ[x˜'"5$sˀyߪm[Xn˙׻C5<^{tm%6W>T{lc*$1;=)T<4H0p{}%IwXz{{%6bڐ4{ L keKT 4IvJ]igxL&:7R !daW'4JJ飴eD  LEo)_Yd {d+|R^ r?]BfĄς* [( iKNF!0u^Lj@ćtupdtGCA0w)UӛbDw&8pJS45k 鼝JM4 x'hV12,$7J - C„[ M_ACMaHѵ]!V{퐗 ?{'8=^ՑvJ#sT(J5~2…t>BeZg ; I~̠ A,mp%~Z7F!sB|lC<* exRm@maz,282vu cruVb ǣ 넝?luI/k1Bj d}w**ЎkE1.U:W{sQ^!jG ٦]TN|ig gl'adt S9j"&){>( IcZ 8$*Iϫen8YaT\q䂄WS xǔ# sgL>R]|BB^6]tkO99?;"=oL9 h'ӶV zXzuege30lN:nES͐T,AީdlEYawr63P%/9 -lK; F7-my+н=nA>5X(FIk2?E+F5@hQ/:} DEZz5CdlZ܇%ԓhߏp;ۏUb5G,o@K%DVՁTغ ,刺QQ!4c^ V;Pڭj&Pag I|z6BbIH.,V}il2݁-FzマX@~(Ի<4/o4<-ŧ^?#y*t; [3oJXǘ1[7Iܙ5,cL5 ;c &jw ]>iju;||nI[EN-Epri@\6Q֥CoW#f_G2yvVMCJgd-4[gU/zk& Yuܕs 7cn1@_GKoeJB2aV}AnU)DEM}e)C4LQ60m&K4 5 }mŖk {C#o}~T7f, -%6ī Q&4<vglp*@:P/`EtBV}#ĦܱXmg#YtHh+U(:lBOO"[~|>Nc.ȻX1_nl^-X|03YWi72a\8bg譞L I!sIIVGn#!y.n'vU JXź28f?t3̍\Mgi%!vB:. )Z&oyW+%羓^V0o]٣&$9%8tyT{6ݖ`MHѷ1N56Wm#8t`ߒTfWPŹk$A[ZxͮVO<~-ۿ΍ۯSϯ1ø> FK]T0%Aw3*\y"u_ 3O5%hm v&$<3ȟRZtqNCaF=jt3,7}z?0yqݏOY:ɝ";2ΉiUD ipHnZ-ZR(s~+|ep] MwիiW!lد;q+@@t!L}f9ci |zw֏OR.A!Lp;M\v_Zimn j0@b6W݅;G>Jkcӎ@i /@Kà*w^dL ።^NK` vegхϟ:'f@_[dEd6 qk5sU َ]H%1o*6s8! mB+n,߾R3ռ/۶MA;A?PPrAZCM|Y-[΋UtiCpbvEb$3Г(Ѷ͑UN@u8$c] =u?Pcq_S2I,l!ܪ)Qu6AGwSC)~PH *?aF2Bx-m&Ċ2^m8#ռ?gw+(Ӝ[HeCaCǂ8 Emi;fib׻Q H R%㲳p_}8:aO8!A&FZw,2,{mC98 ~H& =E-hj@{ɴV#ѹ!\~)X 8n}R2 "dy1Z/ Kprgs RONB;0Pm9[ T ygЃӳ2慳ӈNsyW޺-w]0;b*sc_c ]2Ws'%\ˌag4Ot + * |+J c=}ztqh icnV Bclementine-1.2.3+git1354-gdaddbde+dfsg/dist/clementine.spec.in000066400000000000000000000066711260417502300237500ustar00rootroot00000000000000Name: clementine Version: @CLEMENTINE_VERSION_RPM_V@ Release: @CLEMENTINE_VERSION_RPM_R@.@RPM_DISTRO@ Summary: A music player and library organiser Group: Applications/Multimedia License: GPLv3 URL: http://www.clementine-player.org/ Source0: %{name}-@CLEMENTINE_VERSION_SPARKLE@.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: desktop-file-utils liblastfm-devel taglib-devel gettext BuildRequires: qt4-devel boost-devel gcc-c++ glew-devel libgpod-devel BuildRequires: cmake gstreamer1-devel gstreamer1-plugins-base-devel BuildRequires: libmtp-devel protobuf-devel protobuf-compiler libcdio-devel BuildRequires: qjson-devel cryptopp-devel fftw-devel sparsehash-devel BuildRequires: sqlite-devel pulseaudio-libs-devel libechonest-devel BuildRequires: libchromaprint-devel Requires: libgpod protobuf-lite libcdio qjson sqlite # GStreamer codec dependencies Requires: gstreamer1-plugins-ugly %ifarch x86_64 Requires: gstreamer1(decoder-audio/x-vorbis)()(64bit) Requires: gstreamer1(decoder-audio/x-flac)()(64bit) Requires: gstreamer1(decoder-audio/x-speex)()(64bit) Requires: gstreamer1(decoder-audio/x-wav)()(64bit) %else Requires: gstreamer1(decoder-audio/x-vorbis) Requires: gstreamer1(decoder-audio/x-flac) Requires: gstreamer1(decoder-audio/x-speex) Requires: gstreamer1(decoder-audio/x-wav) %endif %description Clementine is a modern music player and library organiser. It is inspired by Amarok 1.4, focusing on a fast and easy-to-use interface for searching and playing your music. Features include: * Search and play your local music library * Listen to internet radio from Last.fm, SomaFM, Magnatune, Jamendo and Icecast * Create smart playlists and dynamic playlists * Tabbed playlists, import and export M3U, XSPF, PLS and ASX * Visualisations from projectM * Lyrics and artist biographies and photos * Transcode music into MP3, Ogg Vorbis, Ogg Speex, FLAC or AAC * Edit tags on MP3 and OGG files, organise your music * Download missing album cover art from Last.fm * Cross-platform - works on Windows, Mac OS X and Linux * Native desktop notifications on Linux (libnotify) and Mac OS X (Growl) * Remote control using a Wii Remote, MPRIS or the command-line * Copy music to your iPod, iPhone, MTP or mass-storage USB player * Queue manager %prep %setup -q -n %{name}-@CLEMENTINE_VERSION_SPARKLE@ %build cd bin %{cmake} .. -DUSE_INSTALL_PREFIX=OFF -DBUNDLE_PROJECTM_PRESETS=ON make %{?_smp_mflags} %install cd bin make install DESTDIR=$RPM_BUILD_ROOT rm -f $RPM_BUILD_ROOT/usr/share/icons/ubuntu-mono-{dark,light}/apps/24/clementine-panel*.png %clean cd bin make clean %files %defattr(-,root,root,-) %doc %{_bindir}/clementine %{_bindir}/clementine-tagreader %{_datadir}/appdata/clementine.appdata.xml %{_datadir}/applications/clementine.desktop %{_datadir}/clementine/projectm-presets %{_datadir}/kde4/services/clementine-itms.protocol %{_datadir}/kde4/services/clementine-itpc.protocol %{_datadir}/kde4/services/clementine-feed.protocol %{_datadir}/kde4/services/clementine-zune.protocol %{_datadir}/icons/hicolor/64x64/apps/clementine.png %{_datadir}/icons/hicolor/128x128/apps/clementine.png %{_datadir}/icons/hicolor/scalable/apps/clementine.svg %changelog * @RPM_DATE@ David Sansome - @CLEMENTINE_VERSION_RPM_V@ - Version @CLEMENTINE_VERSION_DISPLAY@ clementine-1.2.3+git1354-gdaddbde+dfsg/dist/clementine_128.png000066400000000000000000000230311260417502300235540ustar00rootroot00000000000000PNG  IHDR>abKGD pHYs((ܮ<tIME-8XS IDATx}y]eoὗy$$bp$]UbevյDWh-Z iU%*EbiId& H^oߴϹg}{w;zGw;be4}ٻ &2",@!m-uzsa=cq }>}ߊOPSMW}'u`KgWD&UҩmR4f#M=`;_:u5cPfb͊+xh琥@ c˨scjt¯>C90In9>aMqFiIC gv7T,Ϥ}ܞvlΥ5!6cb;{Sl^o >YKZCd˛n%WL *SY3Ss:}H4 Fh Yxkڛ"vf]B"lJIdcH=1LlWZZ&/޴el %*P*!P|X%+!PcɒqW@g?4tc8@0EFS;`Htӥn }D e9FYK(y~ͦtnr+dh-( D^|qĞ8jYrFw} gI@Ӧ ښȘvWrEjݸ.XX|+?{*rA)OSg.?%h &q*DX@[BXqE!6+(@iD:Jh%SeMs5 k#[&F^ϮR($uc7ţQj#nM(hl3d- iYHC[Z"Z(H5"HX.~jO9ހʋ* D.?ͥy$JN!X\;pV X+aEPΎ뉶KZwv:)< +h^>JnTO)S M @ ؙ-`%J\whz. uf(+4  

tOs;:i37Rj&zYJJw% _w.Q} 85dEֽ(c}o bm:'W m=Qw 5Fړ+uӆ ۰{[&a-z_5Cl8()Jk+>'. d(\$x!rN>ԭ~]6J( t\1kQ:үN艼- t3;}8OE9t e.KciR 6rұS8PGV> 0uzѮQ9ZT|zL" LύxB (WQGN,@~`-nW&G5D/$+Z?ŝ,d,hbIK=dgQ5{R7dJ< o LQ ?}(J3 lM`(#A \ B`݋.- \|#V5OG>;.N5Q;!R "3&je5vur&z܊;.} iD;CP$<lWww “fI%(5&:aݾV|+m#[ZG^*,Y(iq>!ʚw$PPvz4b:H :T)'䐾w?(b@ _ NYbJ龙oSWgn_/^M3) |wQH7GR6XQ!cCX4{l5̼Ou):aҝ`6  :EuDT Wx'Vv|yowYmj"?PP w=,R !*.&o=@+z]|4q~W~3/0k^h|iK8Nت*VnX|˘#Qz)%έy'k?e|B^v-xyWgo^ٮhڡa#sP*o;)7ºq@. N&E<4x~jn ?o9h%]jW qʁACsΩ%&\rcaECID Z:.`Hun5._.ƯzK*2U{.;tWh0;9QA~~38Tҥ^PQ> p$z$=)9eN) T.(.L@qF_fr~xM-h-;M-qA7g. BCb^f#){41EQ}l5Pn *Uv[ Y_8[7 mݹn`0ȓ@eV~LT/ HSED1਼HybNLUP= gv(i\VJ+J7K-@Ow GMVtO {6\Ѹ}-?3$#xD+[ɡ[6 T4B"0`$7k I; ==]jjQ޼+Z ]G߲dۍW'S'.1)>Eg4SHJK7Fcq}5 3aڳPU,})4BT OԭU';3gZ+  &/@xOPqR@ͶI`zɛt*mו!ZU+m'T_3 :-}C/z'uC0$%@ G}( +^=̭8 p$)WDcSp#B"t˜ĺ#pQ &҈k0 &:~5 נ%] ?S?6 a"_s d7'EqԂa!Tvvm5HzO&+l5&'jk#1O~?ĤiZq^P1wG%%#'1H$`ل `\@Ŏ+ZK6DfM9Z|Jgy|o @q*;ko4w0 2P&%Ysl YG4|'(S@b.I"r}20\15F7[Y“a1~>x,lT\|Ǣh)Kk`3ж>]عzl#0R\&ۑ>}[3\(_EG@,J ~pyrlSpR W3}^uhke)_a[ϘZօX >(>r*21OG3ݾXl> tv`ceLL'+( ZL"̦dK|d2{? ؁,{˭d0S=Ц~j W;d5Hݛ]}ǬKW0HNE0B QTV ) | Yr6w\\p^hiad2դ[ieiL @ݙx񨬀N* g=@ ȾE0R ʃA23 d-~;+/b OsN:+ڹ!΁`)s~3M)A]@3aꏾ9u-I jGUб4h<%w yfq"DH:iWἵ!A9p3E cyW4 Jhv*, `kϾx @8т zmmxT} :~+"l0LG%yDoy. 8-(*8pYh; '7R 4|GJ@8j+(A1q訳#ZklrOwGaa T0ϐeG W&\4.Td*Vfb4wtJ›s[C13烎<+H-KI#$ 'b٬ is&׌iw0.8NF ]Ͷsn=_Es=J .k%x)`$^vj_`aڡ7`R(}B)ed,k4UJDŒnJYM: VڐY]u`%;!d Z%,w>݃E@B n )kVhN{(UQ.^q%_4sh)-* 1$abI.ʿ:0e_(E%5]x[S󏼂9PD>xڨwڤE7X(G+D3]$17DJ'H@tKbML-GHr"z, jgѲPt`Db5? 1m)&:[wI`W`'dT꠷:C@`*n=].|*2tz>JvA1u1$z:K*Pt癀ݬNfE-TG @3o^]Vߣv~f| j}yk0`;>nj]PXC"mt<],x`K՚τYwu{A |אUhUPef1c.L4}븶$K/K;v`t.m{hn &5׽WULq* )?P0>s?mYZ4n9!-.miytfٴW6k=9N`5c.Z(AF7.P0Etl|6$rUdzpGS͜6*X':J ΐk=cOaQъUh62ќc[.Q8.T1h̐JwV`oxL2X*@dj_iE[DbG[QN] C}@cJ ? uїֹ4K*3|^u\ o]kP Z0&5K[r7Vl?xNQVD]OwQپH}0bwkAs-IS w;[[7 jQ@Ci轘=Y(@ 3̾MS4{68 M`Ձ%j[`A flqxu4H`08NwQ)}#c#cxǠI1uVttNYGxɰkFI@do*7ɶDUL$,c aK/zgzqxTM :OfYkg5-uvfCWQ8>PٍͫM3.+Qg&܆I{\L nwۛ L70Вm+^pi"P6{"47d8!-,E7i\ `,Д̦,1֦H$VJ9 FF*4>^{ ٠MgRߔ|!:lmW3@421Xd舳,/ı }'ߣoL O LR#m-&{ mʲﮞ# _< ̖8ɠ)澜mەEĐȭ!4+K>r1}ݽMy8[cDt{ק#ةo%Xɞ݆c馡4!PAHݙ7;cQ=#z3;؞VY!ύJ݇q .Ȑ^E๥.y7FqIIM{ (3h澳r5+N1NMj|璃}0-Elٮ 6 :1p› a-V/~V\9w,SgUT8b/pk!|iUS&Qp%OYG?mp xC (ŋЇIP:RϘ'EAD$M<&( 4la脘hP֧Zjlb0}Ƥ+;zGw;zG duIENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/dist/clementine_16.png000066400000000000000000000011611260417502300234700ustar00rootroot00000000000000PNG  IHDRasRGBbKGD pHYsM]tIME.\H#IDAT8˭;hqiH 6b -^c}֞IA6ALDR|@|a.,6 Atc c !׫\zK<NcvXX7;sU5 @aN _i \<\[Z;@1p4Wq}W#@}by>Xo3hϖMԃHGf m摨"qI꣊ݜQox <76M / hcj?Е,~0wΌ&Otn>4* MESܬ5\'*K~tqdҀ PmHX[JS=a[Fv$A?Nu6XԆ '߿TB Q1 RuX ݃}òXv!Œᡪ^<ӖՅ԰Fߛyg%¬۶醥wD$DC.jуPs-R3g%5ϫ 9&eMmϛ|T[ 7bco`1-ovj]2{Em?@SO&FPv-?}HK7"^i,(R E7ZQ2ﶬZQ<.Jrه9`a͵НCgу[4nXeSe[k9I3y\}M9UyxߩU̇! x}t43Z Yx̲/279koĽv6'}d ȚKƲλ۶m ԍP Uߐ^q=,-Dʥ*L%W JA?7?+~7>}DE.zƫǂ%G3Y狁sEE>| % < <8}I>32O\ܴu;n xrhNބמo6>3 =r\jO~!$7!vAAQcu:r;ʕ`)PBB\`\f?r<޲ypyL 'GҐ|"@Xƺa_Ҩ0<3= f<@e(A .*V@} =#QF#0'=W9-k>+"0 BG%9W`MHDc Hj%J2WW?sq!\9e],T\Xu/TEjɁ4 @r=*'yny83ShN)Q)@D$EFޖg ZbƟy'м~ ,\ҰBZuKr_ YSC\`~ [on^` I@#һ  k PajcZV%@vmﮓ (tDe) D6\@\@WK|vp`YA d DpISé><9OxjqZX^a@D#<r\+Q&i}A?v `WB)Z>O(`&or OFg|`f =J69oC" 5O}˹5{LJ1W~;S8j UJC ATؒ"!Di敭Wh@ԄtٽH):awQPϝqN%9K$ՙ\s9liy@@˹[qĆmoycDoY]{.r!0vj?/@b ɼB;GR |l%Ma,w&ΡjP4rz]oME>3?y βip"5ƄMDUh[Gc:pLS'BL*L_xs@s:¤f20rk@waA*DA$=v͂Ӳ0H-²-:Vh<`-?x`oll]\v=b=od3><@>  (tK Q₱f@牜Sʚ[DSi#*-XG_p}+e%ه%u|/\PXNIaA3/\ֲIRZ X: idi&^gᛀ@qg 0xPTY1a_(dx@i#5lhiVҰd*,X'"϶ kCc6m89o cQپ{i 9BU mۖjYUk64Ljv[3LAu/,\w| ]%]}3n@_kQ,8C1-Pn /眡 Τ6Ƈ,КD%۠iZr\J]fW&sMWQ,<Y&<,[BҞ1Wwр]2GdmoEx}cGߵo s/vAtE)+јӖ v"uZvh\r*INCD'e2O6޼<=%`<߹^gԂ=04v8vWfE`,7 "lj)QA'^l f*{yK$yFﰱ u`-g[7 *j"O|iN`t}?Hc`#C4't Ԃמ&_TZZFC(xܜA\U]F.1 :v eWdBkR>]e|\'s !|si[,-..㲬d S".fmyَkO(0>ߧmO7/,&}@uzs@>>g09%y)H(0Ԓi m#t<*Ry>;t-6{Qg Gw:}6:9A74k6< 9/&5GEm+>$g޶a|]0iX֧p {B6Y+,odm?D;z]2[[e5 % *οty~e .yos5S =}H!k`A(>Gެ‚Y@wײaa o8 x#BE<=RENZnI`oNh{oBSo)+t9e:'eMR]X]^E]V[{2EE\d 1i4(5c,8Dh9+gn*K1"AERRrtrDn %K**/vYODNջG\Y?Stjmd1Qt/1.#j&e_1o^: R&v&v JղL4dwtۜ^2jX[/ HV~"]#ެg=p/ºGor)+)4~ ^s R_tZQhz,!TFʨ~9G9!+ZXN?/.67Cx! 9N81p?j<IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/dist/codesign.py000077500000000000000000000020401260417502300224760ustar00rootroot00000000000000#!/usr/bin/python # Emulates the behaviour of codesign --deep which is missing on OS X < 10.9 import os import re import subprocess import sys def SignPath(path, developer_id): args = [ 'codesign', '--preserve-metadata=identifier,entitlements,resource-rules,requirements', '-s', developer_id, '-fv', path ] subprocess.check_call(args) def main(): if len(sys.argv) != 3: print 'Usage: %s ' % sys.argv[0] sys.exit(1) developer_id = sys.argv[1] app_bundle = sys.argv[2] for root, dirs, files in os.walk(app_bundle): for dir in dirs: if re.search(r'\.framework$', dir): SignPath(os.path.join(root, dir), developer_id) for file in files: if re.search(r'\.(dylib|so)$', file): SignPath(os.path.join(root, file), developer_id) elif re.match(r'(clementine-spotifyblob|clementine-tagreader|gst-plugin-scanner)', file): SignPath(os.path.join(root, file), developer_id) SignPath(app_bundle, developer_id) if __name__ == '__main__': main() clementine-1.2.3+git1354-gdaddbde+dfsg/dist/copyright.py000077500000000000000000000067001260417502300227220ustar00rootroot00000000000000#!/usr/bin/python from subprocess import * from sys import * from os import rename, remove from datetime import * def pretty_years(s): l = list(s) l.sort() start = None prev = None r = [] for x in l: if prev is None: start = x prev = x continue if x == prev + 1: prev = x continue if prev == start: r.append("%i" % prev) else: r.append("%i-%i" % (start, prev)) start = x prev = x if not prev is None: if prev == start: r.append("%i" % prev) else: r.append("%i-%i" % (start, prev)) return ", ".join(r) def order_by_year(a, b): la = list(a[2]) la.sort() lb = list(b[2]) lb.sort() if la[0] < lb[0]: return -1 elif la[0] > lb[0]: return 1 else: return 0 def gen_copyrights(f): commits = [] data = {} copyrights = [] for ln in Popen(["git", "blame", "--incremental", f], stdout=PIPE).stdout: if ln.startswith("filename "): if len(data) > 0: commits.append(data) data = {} elif ln.startswith("author "): data["author"] = ln[7:].strip() elif ln.startswith("author-mail <"): data["author-mail"] = ln[12:].strip() elif ln.startswith("author-time "): data["author-time"] = ln[11:].strip() elif ln.startswith("author-tz "): data["author-tz"] = ln[9:].strip() with open(f,'r') as fi: fil = fi.readlines() for i in fil: if -1 < i.find("Original Author"): da = i.split(" ") print f copyrights.append(" Copyright %s, %s %s\n" % (da[3].strip(), da[1], da[2])) by_author = {} for c in commits: try: n = by_author[c["author"]] except KeyError: n = (c["author"], c["author-mail"], set()) by_author[c["author"]] = n # FIXME: Handle time zones properly year = datetime.fromtimestamp(int(c["author-time"])).year n[2].add(year) for an, a in list(by_author.iteritems()): for bn, b in list(by_author.iteritems()): if a is b: continue if a[1] == b[1]: a[2].update(b[2]) if by_author.has_key(an) and by_author.has_key(bn): del by_author[bn] copyright = list(by_author.itervalues()) copyright.sort(order_by_year) for name, mail, years in copyright: copyrights.append(" Copyright %s, %s %s\n" % (pretty_years(years), name, mail)) return copyrights def change_file(filename): content=[] out=[] extended=0 ends=0 with open(filename, "r") as fi: content=fi.readlines() copyrights=gen_copyrights(filename) if -1 == content[0].find("/* This file is part of Clementine."): print("File {} have no Clementine copyright info".format(filename)) return 0 for i in content: if i.find("*/") != -1: ends = 1 if i.find("Copyright ") != -1: if not extended: out.extend(copyrights) extended = 1 if not ends: continue else: out.append(i) with open(filename+'_tmp', "w") as fi: fi.writelines(out) rename(filename+'_tmp', filename) if __name__ == "__main__": for files in argv[1:]: change_file(files) clementine-1.2.3+git1354-gdaddbde+dfsg/dist/cpplint.py000077500000000000000000007135251260417502300223750ustar00rootroot00000000000000#!/usr/bin/python # # Copyright (c) 2009 Google Inc. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above # copyright notice, this list of conditions and the following disclaimer # in the documentation and/or other materials provided with the # distribution. # * Neither the name of Google Inc. nor the names of its # contributors may be used to endorse or promote products derived from # this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """Does google-lint on c++ files. The goal of this script is to identify places in the code that *may* be in non-compliance with google style. It does not attempt to fix up these problems -- the point is to educate. It does also not attempt to find all problems, or to ensure that everything it does find is legitimately a problem. In particular, we can get very confused by /* and // inside strings! We do a small hack, which is to ignore //'s with "'s after them on the same line, but it is far from perfect (in either direction). """ import codecs import copy import getopt import math # for log import os import re import sre_compile import string import sys import unicodedata _USAGE = """ Syntax: cpplint.py [--verbose=#] [--output=vs7] [--filter=-x,+y,...] [--counting=total|toplevel|detailed] [--root=subdir] [--linelength=digits] [file] ... The style guidelines this tries to follow are those in http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml Every problem is given a confidence score from 1-5, with 5 meaning we are certain of the problem, and 1 meaning it could be a legitimate construct. This will miss some errors, and is not a substitute for a code review. To suppress false-positive errors of a certain category, add a 'NOLINT(category)' comment to the line. NOLINT or NOLINT(*) suppresses errors of all categories on that line. The files passed in will be linted; at least one file must be provided. Default linted extensions are .cc, .cpp, .cu, .cuh and .h. Change the extensions with the --extensions flag. Flags: output=vs7 By default, the output is formatted to ease emacs parsing. Visual Studio compatible output (vs7) may also be used. Other formats are unsupported. verbose=# Specify a number 0-5 to restrict errors to certain verbosity levels. filter=-x,+y,... Specify a comma-separated list of category-filters to apply: only error messages whose category names pass the filters will be printed. (Category names are printed with the message and look like "[whitespace/indent]".) Filters are evaluated left to right. "-FOO" and "FOO" means "do not print categories that start with FOO". "+FOO" means "do print categories that start with FOO". Examples: --filter=-whitespace,+whitespace/braces --filter=whitespace,runtime/printf,+runtime/printf_format --filter=-,+build/include_what_you_use To see a list of all the categories used in cpplint, pass no arg: --filter= counting=total|toplevel|detailed The total number of errors found is always printed. If 'toplevel' is provided, then the count of errors in each of the top-level categories like 'build' and 'whitespace' will also be printed. If 'detailed' is provided, then a count is provided for each category like 'build/class'. root=subdir The root directory used for deriving header guard CPP variable. By default, the header guard CPP variable is calculated as the relative path to the directory that contains .git, .hg, or .svn. When this flag is specified, the relative path is calculated from the specified directory. If the specified directory does not exist, this flag is ignored. Examples: Assuming that src/.git exists, the header guard CPP variables for src/chrome/browser/ui/browser.h are: No flag => CHROME_BROWSER_UI_BROWSER_H_ --root=chrome => BROWSER_UI_BROWSER_H_ --root=chrome/browser => UI_BROWSER_H_ linelength=digits This is the allowed line length for the project. The default value is 80 characters. Examples: --linelength=120 extensions=extension,extension,... The allowed file extensions that cpplint will check Examples: --extensions=hpp,cpp cpplint.py supports per-directory configurations specified in CPPLINT.cfg files. CPPLINT.cfg file can contain a number of key=value pairs. Currently the following options are supported: set noparent filter=+filter1,-filter2,... exclude_files=regex linelength=80 "set noparent" option prevents cpplint from traversing directory tree upwards looking for more .cfg files in parent directories. This option is usually placed in the top-level project directory. The "filter" option is similar in function to --filter flag. It specifies message filters in addition to the |_DEFAULT_FILTERS| and those specified through --filter command-line flag. "exclude_files" allows to specify a regular expression to be matched against a file name. If the expression matches, the file is skipped and not run through liner. "linelength" allows to specify the allowed line length for the project. CPPLINT.cfg has an effect on files in the same directory and all sub-directories, unless overridden by a nested configuration file. Example file: filter=-build/include_order,+build/include_alpha exclude_files=.*\.cc The above example disables build/include_order warning and enables build/include_alpha as well as excludes all .cc from being processed by linter, in the current directory (where the .cfg file is located) and all sub-directories. """ # We categorize each error message we print. Here are the categories. # We want an explicit list so we can list them all in cpplint --filter=. # If you add a new error message with a new category, add it to the list # here! cpplint_unittest.py should tell you if you forget to do this. _ERROR_CATEGORIES = [ 'build/class', 'build/c++11', 'build/deprecated', 'build/endif_comment', 'build/explicit_make_pair', 'build/forward_decl', 'build/header_guard', 'build/include', 'build/include_alpha', 'build/include_order', 'build/include_what_you_use', 'build/namespaces', 'build/printf_format', 'build/storage_class', 'legal/copyright', 'readability/alt_tokens', 'readability/braces', 'readability/casting', 'readability/check', 'readability/constructors', 'readability/fn_size', 'readability/function', 'readability/inheritance', 'readability/multiline_comment', 'readability/multiline_string', 'readability/namespace', 'readability/nolint', 'readability/nul', 'readability/streams', 'readability/todo', 'readability/utf8', 'runtime/arrays', 'runtime/casting', 'runtime/explicit', 'runtime/int', 'runtime/init', 'runtime/invalid_increment', 'runtime/member_string_references', 'runtime/memset', 'runtime/indentation_namespace', 'runtime/operator', 'runtime/printf', 'runtime/printf_format', 'runtime/references', 'runtime/string', 'runtime/threadsafe_fn', 'runtime/vlog', 'whitespace/blank_line', 'whitespace/braces', 'whitespace/comma', 'whitespace/comments', 'whitespace/empty_conditional_body', 'whitespace/empty_loop_body', 'whitespace/end_of_line', 'whitespace/ending_newline', 'whitespace/forcolon', 'whitespace/indent', 'whitespace/line_length', 'whitespace/newline', 'whitespace/operators', 'whitespace/parens', 'whitespace/semicolon', 'whitespace/tab', 'whitespace/todo' ] # The default state of the category filter. This is overridden by the --filter= # flag. By default all errors are on, so only add here categories that should be # off by default (i.e., categories that must be enabled by the --filter= flags). # All entries here should start with a '-' or '+', as in the --filter= flag. _DEFAULT_FILTERS = ['-build/include_alpha', '-build/include_order', '-build/include', '-readability/function', '-runtime/references', '-whitespace/line_length', '-readability/streams'] # We used to check for high-bit characters, but after much discussion we # decided those were OK, as long as they were in UTF-8 and didn't represent # hard-coded international strings, which belong in a separate i18n file. # C++ headers _CPP_HEADERS = frozenset([ # Legacy 'algobase.h', 'algo.h', 'alloc.h', 'builtinbuf.h', 'bvector.h', 'complex.h', 'defalloc.h', 'deque.h', 'editbuf.h', 'fstream.h', 'function.h', 'hash_map', 'hash_map.h', 'hash_set', 'hash_set.h', 'hashtable.h', 'heap.h', 'indstream.h', 'iomanip.h', 'iostream.h', 'istream.h', 'iterator.h', 'list.h', 'map.h', 'multimap.h', 'multiset.h', 'ostream.h', 'pair.h', 'parsestream.h', 'pfstream.h', 'procbuf.h', 'pthread_alloc', 'pthread_alloc.h', 'rope', 'rope.h', 'ropeimpl.h', 'set.h', 'slist', 'slist.h', 'stack.h', 'stdiostream.h', 'stl_alloc.h', 'stl_relops.h', 'streambuf.h', 'stream.h', 'strfile.h', 'strstream.h', 'tempbuf.h', 'tree.h', 'type_traits.h', 'vector.h', # 17.6.1.2 C++ library headers 'algorithm', 'array', 'atomic', 'bitset', 'chrono', 'codecvt', 'complex', 'condition_variable', 'deque', 'exception', 'forward_list', 'fstream', 'functional', 'future', 'initializer_list', 'iomanip', 'ios', 'iosfwd', 'iostream', 'istream', 'iterator', 'limits', 'list', 'locale', 'map', 'memory', 'mutex', 'new', 'numeric', 'ostream', 'queue', 'random', 'ratio', 'regex', 'set', 'sstream', 'stack', 'stdexcept', 'streambuf', 'string', 'strstream', 'system_error', 'thread', 'tuple', 'typeindex', 'typeinfo', 'type_traits', 'unordered_map', 'unordered_set', 'utility', 'valarray', 'vector', # 17.6.1.2 C++ headers for C library facilities 'cassert', 'ccomplex', 'cctype', 'cerrno', 'cfenv', 'cfloat', 'cinttypes', 'ciso646', 'climits', 'clocale', 'cmath', 'csetjmp', 'csignal', 'cstdalign', 'cstdarg', 'cstdbool', 'cstddef', 'cstdint', 'cstdio', 'cstdlib', 'cstring', 'ctgmath', 'ctime', 'cuchar', 'cwchar', 'cwctype', ]) # These headers are excluded from [build/include] and [build/include_order] # checks: # - Anything not following google file name conventions (containing an # uppercase character, such as Python.h or nsStringAPI.h, for example). # - Lua headers. _THIRD_PARTY_HEADERS_PATTERN = re.compile( r'^(?:[^/]*[A-Z][^/]*\.h|lua\.h|lauxlib\.h|lualib\.h)$') # Assertion macros. These are defined in base/logging.h and # testing/base/gunit.h. Note that the _M versions need to come first # for substring matching to work. _CHECK_MACROS = [ 'DCHECK', 'CHECK', 'EXPECT_TRUE_M', 'EXPECT_TRUE', 'ASSERT_TRUE_M', 'ASSERT_TRUE', 'EXPECT_FALSE_M', 'EXPECT_FALSE', 'ASSERT_FALSE_M', 'ASSERT_FALSE', ] # Replacement macros for CHECK/DCHECK/EXPECT_TRUE/EXPECT_FALSE _CHECK_REPLACEMENT = dict([(m, {}) for m in _CHECK_MACROS]) for op, replacement in [('==', 'EQ'), ('!=', 'NE'), ('>=', 'GE'), ('>', 'GT'), ('<=', 'LE'), ('<', 'LT')]: _CHECK_REPLACEMENT['DCHECK'][op] = 'DCHECK_%s' % replacement _CHECK_REPLACEMENT['CHECK'][op] = 'CHECK_%s' % replacement _CHECK_REPLACEMENT['EXPECT_TRUE'][op] = 'EXPECT_%s' % replacement _CHECK_REPLACEMENT['ASSERT_TRUE'][op] = 'ASSERT_%s' % replacement _CHECK_REPLACEMENT['EXPECT_TRUE_M'][op] = 'EXPECT_%s_M' % replacement _CHECK_REPLACEMENT['ASSERT_TRUE_M'][op] = 'ASSERT_%s_M' % replacement for op, inv_replacement in [('==', 'NE'), ('!=', 'EQ'), ('>=', 'LT'), ('>', 'LE'), ('<=', 'GT'), ('<', 'GE')]: _CHECK_REPLACEMENT['EXPECT_FALSE'][op] = 'EXPECT_%s' % inv_replacement _CHECK_REPLACEMENT['ASSERT_FALSE'][op] = 'ASSERT_%s' % inv_replacement _CHECK_REPLACEMENT['EXPECT_FALSE_M'][op] = 'EXPECT_%s_M' % inv_replacement _CHECK_REPLACEMENT['ASSERT_FALSE_M'][op] = 'ASSERT_%s_M' % inv_replacement # Alternative tokens and their replacements. For full list, see section 2.5 # Alternative tokens [lex.digraph] in the C++ standard. # # Digraphs (such as '%:') are not included here since it's a mess to # match those on a word boundary. _ALT_TOKEN_REPLACEMENT = { 'and': '&&', 'bitor': '|', 'or': '||', 'xor': '^', 'compl': '~', 'bitand': '&', 'and_eq': '&=', 'or_eq': '|=', 'xor_eq': '^=', 'not': '!', 'not_eq': '!=' } # Compile regular expression that matches all the above keywords. The "[ =()]" # bit is meant to avoid matching these keywords outside of boolean expressions. # # False positives include C-style multi-line comments and multi-line strings # but those have always been troublesome for cpplint. _ALT_TOKEN_REPLACEMENT_PATTERN = re.compile( r'[ =()](' + ('|'.join(_ALT_TOKEN_REPLACEMENT.keys())) + r')(?=[ (]|$)') # These constants define types of headers for use with # _IncludeState.CheckNextIncludeOrder(). _C_SYS_HEADER = 1 _CPP_SYS_HEADER = 2 _LIKELY_MY_HEADER = 3 _POSSIBLE_MY_HEADER = 4 _OTHER_HEADER = 5 # These constants define the current inline assembly state _NO_ASM = 0 # Outside of inline assembly block _INSIDE_ASM = 1 # Inside inline assembly block _END_ASM = 2 # Last line of inline assembly block _BLOCK_ASM = 3 # The whole block is an inline assembly block # Match start of assembly blocks _MATCH_ASM = re.compile(r'^\s*(?:asm|_asm|__asm|__asm__)' r'(?:\s+(volatile|__volatile__))?' r'\s*[{(]') _regexp_compile_cache = {} # {str, set(int)}: a map from error categories to sets of linenumbers # on which those errors are expected and should be suppressed. _error_suppressions = {} # The root directory used for deriving header guard CPP variable. # This is set by --root flag. _root = None # The allowed line length of files. # This is set by --linelength flag. _line_length = 80 # The allowed extensions for file names # This is set by --extensions flag. _valid_extensions = set(['cc', 'h', 'cpp', 'cu', 'cuh']) def ParseNolintSuppressions(filename, raw_line, linenum, error): """Updates the global list of error-suppressions. Parses any NOLINT comments on the current line, updating the global error_suppressions store. Reports an error if the NOLINT comment was malformed. Args: filename: str, the name of the input file. raw_line: str, the line of input text, with comments. linenum: int, the number of the current line. error: function, an error handler. """ matched = Search(r'\bNOLINT(NEXTLINE)?\b(\([^)]+\))?', raw_line) if matched: if matched.group(1): suppressed_line = linenum + 1 else: suppressed_line = linenum category = matched.group(2) if category in (None, '(*)'): # => "suppress all" _error_suppressions.setdefault(None, set()).add(suppressed_line) else: if category.startswith('(') and category.endswith(')'): category = category[1:-1] if category in _ERROR_CATEGORIES: _error_suppressions.setdefault(category, set()).add(suppressed_line) else: error(filename, linenum, 'readability/nolint', 5, 'Unknown NOLINT error category: %s' % category) def ResetNolintSuppressions(): """Resets the set of NOLINT suppressions to empty.""" _error_suppressions.clear() def IsErrorSuppressedByNolint(category, linenum): """Returns true if the specified error category is suppressed on this line. Consults the global error_suppressions map populated by ParseNolintSuppressions/ResetNolintSuppressions. Args: category: str, the category of the error. linenum: int, the current line number. Returns: bool, True iff the error should be suppressed due to a NOLINT comment. """ return (linenum in _error_suppressions.get(category, set()) or linenum in _error_suppressions.get(None, set())) def Match(pattern, s): """Matches the string with the pattern, caching the compiled regexp.""" # The regexp compilation caching is inlined in both Match and Search for # performance reasons; factoring it out into a separate function turns out # to be noticeably expensive. if pattern not in _regexp_compile_cache: _regexp_compile_cache[pattern] = sre_compile.compile(pattern) return _regexp_compile_cache[pattern].match(s) def ReplaceAll(pattern, rep, s): """Replaces instances of pattern in a string with a replacement. The compiled regex is kept in a cache shared by Match and Search. Args: pattern: regex pattern rep: replacement text s: search string Returns: string with replacements made (or original string if no replacements) """ if pattern not in _regexp_compile_cache: _regexp_compile_cache[pattern] = sre_compile.compile(pattern) return _regexp_compile_cache[pattern].sub(rep, s) def Search(pattern, s): """Searches the string for the pattern, caching the compiled regexp.""" if pattern not in _regexp_compile_cache: _regexp_compile_cache[pattern] = sre_compile.compile(pattern) return _regexp_compile_cache[pattern].search(s) class _IncludeState(object): """Tracks line numbers for includes, and the order in which includes appear. include_list contains list of lists of (header, line number) pairs. It's a lists of lists rather than just one flat list to make it easier to update across preprocessor boundaries. Call CheckNextIncludeOrder() once for each header in the file, passing in the type constants defined above. Calls in an illegal order will raise an _IncludeError with an appropriate error message. """ # self._section will move monotonically through this set. If it ever # needs to move backwards, CheckNextIncludeOrder will raise an error. _INITIAL_SECTION = 0 _MY_H_SECTION = 1 _C_SECTION = 2 _CPP_SECTION = 3 _OTHER_H_SECTION = 4 _TYPE_NAMES = { _C_SYS_HEADER: 'C system header', _CPP_SYS_HEADER: 'C++ system header', _LIKELY_MY_HEADER: 'header this file implements', _POSSIBLE_MY_HEADER: 'header this file may implement', _OTHER_HEADER: 'other header', } _SECTION_NAMES = { _INITIAL_SECTION: "... nothing. (This can't be an error.)", _MY_H_SECTION: 'a header this file implements', _C_SECTION: 'C system header', _CPP_SECTION: 'C++ system header', _OTHER_H_SECTION: 'other header', } def __init__(self): self.include_list = [[]] self.ResetSection('') def FindHeader(self, header): """Check if a header has already been included. Args: header: header to check. Returns: Line number of previous occurrence, or -1 if the header has not been seen before. """ for section_list in self.include_list: for f in section_list: if f[0] == header: return f[1] return -1 def ResetSection(self, directive): """Reset section checking for preprocessor directive. Args: directive: preprocessor directive (e.g. "if", "else"). """ # The name of the current section. self._section = self._INITIAL_SECTION # The path of last found header. self._last_header = '' # Update list of includes. Note that we never pop from the # include list. if directive in ('if', 'ifdef', 'ifndef'): self.include_list.append([]) elif directive in ('else', 'elif'): self.include_list[-1] = [] def SetLastHeader(self, header_path): self._last_header = header_path def CanonicalizeAlphabeticalOrder(self, header_path): """Returns a path canonicalized for alphabetical comparison. - replaces "-" with "_" so they both cmp the same. - removes '-inl' since we don't require them to be after the main header. - lowercase everything, just in case. Args: header_path: Path to be canonicalized. Returns: Canonicalized path. """ return header_path.replace('-inl.h', '.h').replace('-', '_').lower() def IsInAlphabeticalOrder(self, clean_lines, linenum, header_path): """Check if a header is in alphabetical order with the previous header. Args: clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. header_path: Canonicalized header to be checked. Returns: Returns true if the header is in alphabetical order. """ # If previous section is different from current section, _last_header will # be reset to empty string, so it's always less than current header. # # If previous line was a blank line, assume that the headers are # intentionally sorted the way they are. if (self._last_header > header_path and not Match(r'^\s*$', clean_lines.elided[linenum - 1])): return False return True def CheckNextIncludeOrder(self, header_type): """Returns a non-empty error message if the next header is out of order. This function also updates the internal state to be ready to check the next include. Args: header_type: One of the _XXX_HEADER constants defined above. Returns: The empty string if the header is in the right order, or an error message describing what's wrong. """ error_message = ('Found %s after %s' % (self._TYPE_NAMES[header_type], self._SECTION_NAMES[self._section])) last_section = self._section if header_type == _C_SYS_HEADER: if self._section <= self._C_SECTION: self._section = self._C_SECTION else: self._last_header = '' return error_message elif header_type == _CPP_SYS_HEADER: if self._section <= self._CPP_SECTION: self._section = self._CPP_SECTION else: self._last_header = '' return error_message elif header_type == _LIKELY_MY_HEADER: if self._section <= self._MY_H_SECTION: self._section = self._MY_H_SECTION else: self._section = self._OTHER_H_SECTION elif header_type == _POSSIBLE_MY_HEADER: if self._section <= self._MY_H_SECTION: self._section = self._MY_H_SECTION else: # This will always be the fallback because we're not sure # enough that the header is associated with this file. self._section = self._OTHER_H_SECTION else: assert header_type == _OTHER_HEADER self._section = self._OTHER_H_SECTION if last_section != self._section: self._last_header = '' return '' class _CppLintState(object): """Maintains module-wide state..""" def __init__(self): self.verbose_level = 1 # global setting. self.error_count = 0 # global count of reported errors # filters to apply when emitting error messages self.filters = _DEFAULT_FILTERS[:] # backup of filter list. Used to restore the state after each file. self._filters_backup = self.filters[:] self.counting = 'total' # In what way are we counting errors? self.errors_by_category = {} # string to int dict storing error counts # output format: # "emacs" - format that emacs can parse (default) # "vs7" - format that Microsoft Visual Studio 7 can parse self.output_format = 'emacs' def SetOutputFormat(self, output_format): """Sets the output format for errors.""" self.output_format = output_format def SetVerboseLevel(self, level): """Sets the module's verbosity, and returns the previous setting.""" last_verbose_level = self.verbose_level self.verbose_level = level return last_verbose_level def SetCountingStyle(self, counting_style): """Sets the module's counting options.""" self.counting = counting_style def SetFilters(self, filters): """Sets the error-message filters. These filters are applied when deciding whether to emit a given error message. Args: filters: A string of comma-separated filters (eg "+whitespace/indent"). Each filter should start with + or -; else we die. Raises: ValueError: The comma-separated filters did not all start with '+' or '-'. E.g. "-,+whitespace,-whitespace/indent,whitespace/badfilter" """ # Default filters always have less priority than the flag ones. self.filters = _DEFAULT_FILTERS[:] self.AddFilters(filters) def AddFilters(self, filters): """ Adds more filters to the existing list of error-message filters. """ for filt in filters.split(','): clean_filt = filt.strip() if clean_filt: self.filters.append(clean_filt) for filt in self.filters: if not (filt.startswith('+') or filt.startswith('-')): raise ValueError('Every filter in --filters must start with + or -' ' (%s does not)' % filt) def BackupFilters(self): """ Saves the current filter list to backup storage.""" self._filters_backup = self.filters[:] def RestoreFilters(self): """ Restores filters previously backed up.""" self.filters = self._filters_backup[:] def ResetErrorCounts(self): """Sets the module's error statistic back to zero.""" self.error_count = 0 self.errors_by_category = {} def IncrementErrorCount(self, category): """Bumps the module's error statistic.""" self.error_count += 1 if self.counting in ('toplevel', 'detailed'): if self.counting != 'detailed': category = category.split('/')[0] if category not in self.errors_by_category: self.errors_by_category[category] = 0 self.errors_by_category[category] += 1 def PrintErrorCounts(self): """Print a summary of errors by category, and the total.""" for category, count in self.errors_by_category.iteritems(): sys.stderr.write('Category \'%s\' errors found: %d\n' % (category, count)) sys.stderr.write('Total errors found: %d\n' % self.error_count) _cpplint_state = _CppLintState() def _OutputFormat(): """Gets the module's output format.""" return _cpplint_state.output_format def _SetOutputFormat(output_format): """Sets the module's output format.""" _cpplint_state.SetOutputFormat(output_format) def _VerboseLevel(): """Returns the module's verbosity setting.""" return _cpplint_state.verbose_level def _SetVerboseLevel(level): """Sets the module's verbosity, and returns the previous setting.""" return _cpplint_state.SetVerboseLevel(level) def _SetCountingStyle(level): """Sets the module's counting options.""" _cpplint_state.SetCountingStyle(level) def _Filters(): """Returns the module's list of output filters, as a list.""" return _cpplint_state.filters def _SetFilters(filters): """Sets the module's error-message filters. These filters are applied when deciding whether to emit a given error message. Args: filters: A string of comma-separated filters (eg "whitespace/indent"). Each filter should start with + or -; else we die. """ _cpplint_state.SetFilters(filters) def _AddFilters(filters): """Adds more filter overrides. Unlike _SetFilters, this function does not reset the current list of filters available. Args: filters: A string of comma-separated filters (eg "whitespace/indent"). Each filter should start with + or -; else we die. """ _cpplint_state.AddFilters(filters) def _BackupFilters(): """ Saves the current filter list to backup storage.""" _cpplint_state.BackupFilters() def _RestoreFilters(): """ Restores filters previously backed up.""" _cpplint_state.RestoreFilters() class _FunctionState(object): """Tracks current function name and the number of lines in its body.""" _NORMAL_TRIGGER = 250 # for --v=0, 500 for --v=1, etc. _TEST_TRIGGER = 400 # about 50% more than _NORMAL_TRIGGER. def __init__(self): self.in_a_function = False self.lines_in_function = 0 self.current_function = '' def Begin(self, function_name): """Start analyzing function body. Args: function_name: The name of the function being tracked. """ self.in_a_function = True self.lines_in_function = 0 self.current_function = function_name def Count(self): """Count line in current function body.""" if self.in_a_function: self.lines_in_function += 1 def Check(self, error, filename, linenum): """Report if too many lines in function body. Args: error: The function to call with any errors found. filename: The name of the current file. linenum: The number of the line to check. """ if Match(r'T(EST|est)', self.current_function): base_trigger = self._TEST_TRIGGER else: base_trigger = self._NORMAL_TRIGGER trigger = base_trigger * 2**_VerboseLevel() if self.lines_in_function > trigger: error_level = int(math.log(self.lines_in_function / base_trigger, 2)) # 50 => 0, 100 => 1, 200 => 2, 400 => 3, 800 => 4, 1600 => 5, ... if error_level > 5: error_level = 5 error(filename, linenum, 'readability/fn_size', error_level, 'Small and focused functions are preferred:' ' %s has %d non-comment lines' ' (error triggered by exceeding %d lines).' % ( self.current_function, self.lines_in_function, trigger)) def End(self): """Stop analyzing function body.""" self.in_a_function = False class _IncludeError(Exception): """Indicates a problem with the include order in a file.""" pass class FileInfo(object): """Provides utility functions for filenames. FileInfo provides easy access to the components of a file's path relative to the project root. """ def __init__(self, filename): self._filename = filename def FullName(self): """Make Windows paths like Unix.""" return os.path.abspath(self._filename).replace('\\', '/') def RepositoryName(self): """FullName after removing the local path to the repository. If we have a real absolute path name here we can try to do something smart: detecting the root of the checkout and truncating /path/to/checkout from the name so that we get header guards that don't include things like "C:\Documents and Settings\..." or "/home/username/..." in them and thus people on different computers who have checked the source out to different locations won't see bogus errors. """ fullname = self.FullName() if os.path.exists(fullname): project_dir = os.path.dirname(fullname) if os.path.exists(os.path.join(project_dir, ".svn")): # If there's a .svn file in the current directory, we recursively look # up the directory tree for the top of the SVN checkout root_dir = project_dir one_up_dir = os.path.dirname(root_dir) while os.path.exists(os.path.join(one_up_dir, ".svn")): root_dir = os.path.dirname(root_dir) one_up_dir = os.path.dirname(one_up_dir) prefix = os.path.commonprefix([root_dir, project_dir]) return fullname[len(prefix) + 1:] # Not SVN <= 1.6? Try to find a git, hg, or svn top level directory by # searching up from the current path. root_dir = os.path.dirname(fullname) while (root_dir != os.path.dirname(root_dir) and not os.path.exists(os.path.join(root_dir, ".git")) and not os.path.exists(os.path.join(root_dir, ".hg")) and not os.path.exists(os.path.join(root_dir, ".svn"))): root_dir = os.path.dirname(root_dir) if (os.path.exists(os.path.join(root_dir, ".git")) or os.path.exists(os.path.join(root_dir, ".hg")) or os.path.exists(os.path.join(root_dir, ".svn"))): prefix = os.path.commonprefix([root_dir, project_dir]) return fullname[len(prefix) + 1:] # Don't know what to do; header guard warnings may be wrong... return fullname def Split(self): """Splits the file into the directory, basename, and extension. For 'chrome/browser/browser.cc', Split() would return ('chrome/browser', 'browser', '.cc') Returns: A tuple of (directory, basename, extension). """ googlename = self.RepositoryName() project, rest = os.path.split(googlename) return (project,) + os.path.splitext(rest) def BaseName(self): """File base name - text after the final slash, before the final period.""" return self.Split()[1] def Extension(self): """File extension - text following the final period.""" return self.Split()[2] def NoExtension(self): """File has no source file extension.""" return '/'.join(self.Split()[0:2]) def IsSource(self): """File has a source file extension.""" return self.Extension()[1:] in ('c', 'cc', 'cpp', 'cxx') def _ShouldPrintError(category, confidence, linenum): """If confidence >= verbose, category passes filter and is not suppressed.""" # There are three ways we might decide not to print an error message: # a "NOLINT(category)" comment appears in the source, # the verbosity level isn't high enough, or the filters filter it out. if IsErrorSuppressedByNolint(category, linenum): return False if confidence < _cpplint_state.verbose_level: return False is_filtered = False for one_filter in _Filters(): if one_filter.startswith('-'): if category.startswith(one_filter[1:]): is_filtered = True elif one_filter.startswith('+'): if category.startswith(one_filter[1:]): is_filtered = False else: assert False # should have been checked for in SetFilter. if is_filtered: return False return True def Error(filename, linenum, category, confidence, message): """Logs the fact we've found a lint error. We log where the error was found, and also our confidence in the error, that is, how certain we are this is a legitimate style regression, and not a misidentification or a use that's sometimes justified. False positives can be suppressed by the use of "cpplint(category)" comments on the offending line. These are parsed into _error_suppressions. Args: filename: The name of the file containing the error. linenum: The number of the line containing the error. category: A string used to describe the "category" this bug falls under: "whitespace", say, or "runtime". Categories may have a hierarchy separated by slashes: "whitespace/indent". confidence: A number from 1-5 representing a confidence score for the error, with 5 meaning that we are certain of the problem, and 1 meaning that it could be a legitimate construct. message: The error message. """ if _ShouldPrintError(category, confidence, linenum): _cpplint_state.IncrementErrorCount(category) if _cpplint_state.output_format == 'vs7': sys.stderr.write('%s(%s): %s [%s] [%d]\n' % ( filename, linenum, message, category, confidence)) elif _cpplint_state.output_format == 'eclipse': sys.stderr.write('%s:%s: warning: %s [%s] [%d]\n' % ( filename, linenum, message, category, confidence)) else: sys.stderr.write('%s:%s: %s [%s] [%d]\n' % ( filename, linenum, message, category, confidence)) # Matches standard C++ escape sequences per 2.13.2.3 of the C++ standard. _RE_PATTERN_CLEANSE_LINE_ESCAPES = re.compile( r'\\([abfnrtv?"\\\']|\d+|x[0-9a-fA-F]+)') # Match a single C style comment on the same line. _RE_PATTERN_C_COMMENTS = r'/\*(?:[^*]|\*(?!/))*\*/' # Matches multi-line C style comments. # This RE is a little bit more complicated than one might expect, because we # have to take care of space removals tools so we can handle comments inside # statements better. # The current rule is: We only clear spaces from both sides when we're at the # end of the line. Otherwise, we try to remove spaces from the right side, # if this doesn't work we try on left side but only if there's a non-character # on the right. _RE_PATTERN_CLEANSE_LINE_C_COMMENTS = re.compile( r'(\s*' + _RE_PATTERN_C_COMMENTS + r'\s*$|' + _RE_PATTERN_C_COMMENTS + r'\s+|' + r'\s+' + _RE_PATTERN_C_COMMENTS + r'(?=\W)|' + _RE_PATTERN_C_COMMENTS + r')') def IsCppString(line): """Does line terminate so, that the next symbol is in string constant. This function does not consider single-line nor multi-line comments. Args: line: is a partial line of code starting from the 0..n. Returns: True, if next character appended to 'line' is inside a string constant. """ line = line.replace(r'\\', 'XX') # after this, \\" does not match to \" return ((line.count('"') - line.count(r'\"') - line.count("'\"'")) & 1) == 1 def CleanseRawStrings(raw_lines): """Removes C++11 raw strings from lines. Before: static const char kData[] = R"( multi-line string )"; After: static const char kData[] = "" (replaced by blank line) ""; Args: raw_lines: list of raw lines. Returns: list of lines with C++11 raw strings replaced by empty strings. """ delimiter = None lines_without_raw_strings = [] for line in raw_lines: if delimiter: # Inside a raw string, look for the end end = line.find(delimiter) if end >= 0: # Found the end of the string, match leading space for this # line and resume copying the original lines, and also insert # a "" on the last line. leading_space = Match(r'^(\s*)\S', line) line = leading_space.group(1) + '""' + line[end + len(delimiter):] delimiter = None else: # Haven't found the end yet, append a blank line. line = '""' # Look for beginning of a raw string, and replace them with # empty strings. This is done in a loop to handle multiple raw # strings on the same line. while delimiter is None: # Look for beginning of a raw string. # See 2.14.15 [lex.string] for syntax. matched = Match(r'^(.*)\b(?:R|u8R|uR|UR|LR)"([^\s\\()]*)\((.*)$', line) if matched: delimiter = ')' + matched.group(2) + '"' end = matched.group(3).find(delimiter) if end >= 0: # Raw string ended on same line line = (matched.group(1) + '""' + matched.group(3)[end + len(delimiter):]) delimiter = None else: # Start of a multi-line raw string line = matched.group(1) + '""' else: break lines_without_raw_strings.append(line) # TODO(unknown): if delimiter is not None here, we might want to # emit a warning for unterminated string. return lines_without_raw_strings def FindNextMultiLineCommentStart(lines, lineix): """Find the beginning marker for a multiline comment.""" while lineix < len(lines): if lines[lineix].strip().startswith('/*'): # Only return this marker if the comment goes beyond this line if lines[lineix].strip().find('*/', 2) < 0: return lineix lineix += 1 return len(lines) def FindNextMultiLineCommentEnd(lines, lineix): """We are inside a comment, find the end marker.""" while lineix < len(lines): if lines[lineix].strip().endswith('*/'): return lineix lineix += 1 return len(lines) def RemoveMultiLineCommentsFromRange(lines, begin, end): """Clears a range of lines for multi-line comments.""" # Having // dummy comments makes the lines non-empty, so we will not get # unnecessary blank line warnings later in the code. for i in range(begin, end): lines[i] = '// dummy' def RemoveMultiLineComments(filename, lines, error): """Removes multiline (c-style) comments from lines.""" lineix = 0 while lineix < len(lines): lineix_begin = FindNextMultiLineCommentStart(lines, lineix) if lineix_begin >= len(lines): return lineix_end = FindNextMultiLineCommentEnd(lines, lineix_begin) if lineix_end >= len(lines): error(filename, lineix_begin + 1, 'readability/multiline_comment', 5, 'Could not find end of multi-line comment') return RemoveMultiLineCommentsFromRange(lines, lineix_begin, lineix_end + 1) lineix = lineix_end + 1 def CleanseComments(line): """Removes //-comments and single-line C-style /* */ comments. Args: line: A line of C++ source. Returns: The line with single-line comments removed. """ commentpos = line.find('//') if commentpos != -1 and not IsCppString(line[:commentpos]): line = line[:commentpos].rstrip() # get rid of /* ... */ return _RE_PATTERN_CLEANSE_LINE_C_COMMENTS.sub('', line) class CleansedLines(object): """Holds 3 copies of all lines with different preprocessing applied to them. 1) elided member contains lines without strings and comments, 2) lines member contains lines without comments, and 3) raw_lines member contains all the lines without processing. All these three members are of , and of the same length. """ def __init__(self, lines): self.elided = [] self.lines = [] self.raw_lines = lines self.num_lines = len(lines) self.lines_without_raw_strings = CleanseRawStrings(lines) for linenum in range(len(self.lines_without_raw_strings)): self.lines.append(CleanseComments( self.lines_without_raw_strings[linenum])) elided = self._CollapseStrings(self.lines_without_raw_strings[linenum]) self.elided.append(CleanseComments(elided)) def NumLines(self): """Returns the number of lines represented.""" return self.num_lines @staticmethod def _CollapseStrings(elided): """Collapses strings and chars on a line to simple "" or '' blocks. We nix strings first so we're not fooled by text like '"http://"' Args: elided: The line being processed. Returns: The line with collapsed strings. """ if _RE_PATTERN_INCLUDE.match(elided): return elided # Remove escaped characters first to make quote/single quote collapsing # basic. Things that look like escaped characters shouldn't occur # outside of strings and chars. elided = _RE_PATTERN_CLEANSE_LINE_ESCAPES.sub('', elided) # Replace quoted strings and digit separators. Both single quotes # and double quotes are processed in the same loop, otherwise # nested quotes wouldn't work. collapsed = '' while True: # Find the first quote character match = Match(r'^([^\'"]*)([\'"])(.*)$', elided) if not match: collapsed += elided break head, quote, tail = match.groups() if quote == '"': # Collapse double quoted strings second_quote = tail.find('"') if second_quote >= 0: collapsed += head + '""' elided = tail[second_quote + 1:] else: # Unmatched double quote, don't bother processing the rest # of the line since this is probably a multiline string. collapsed += elided break else: # Found single quote, check nearby text to eliminate digit separators. # # There is no special handling for floating point here, because # the integer/fractional/exponent parts would all be parsed # correctly as long as there are digits on both sides of the # separator. So we are fine as long as we don't see something # like "0.'3" (gcc 4.9.0 will not allow this literal). if Search(r'\b(?:0[bBxX]?|[1-9])[0-9a-fA-F]*$', head): match_literal = Match(r'^((?:\'?[0-9a-zA-Z_])*)(.*)$', "'" + tail) collapsed += head + match_literal.group(1).replace("'", '') elided = match_literal.group(2) else: second_quote = tail.find('\'') if second_quote >= 0: collapsed += head + "''" elided = tail[second_quote + 1:] else: # Unmatched single quote collapsed += elided break return collapsed def FindEndOfExpressionInLine(line, startpos, stack): """Find the position just after the end of current parenthesized expression. Args: line: a CleansedLines line. startpos: start searching at this position. stack: nesting stack at startpos. Returns: On finding matching end: (index just after matching end, None) On finding an unclosed expression: (-1, None) Otherwise: (-1, new stack at end of this line) """ for i in xrange(startpos, len(line)): char = line[i] if char in '([{': # Found start of parenthesized expression, push to expression stack stack.append(char) elif char == '<': # Found potential start of template argument list if i > 0 and line[i - 1] == '<': # Left shift operator if stack and stack[-1] == '<': stack.pop() if not stack: return (-1, None) elif i > 0 and Search(r'\boperator\s*$', line[0:i]): # operator<, don't add to stack continue else: # Tentative start of template argument list stack.append('<') elif char in ')]}': # Found end of parenthesized expression. # # If we are currently expecting a matching '>', the pending '<' # must have been an operator. Remove them from expression stack. while stack and stack[-1] == '<': stack.pop() if not stack: return (-1, None) if ((stack[-1] == '(' and char == ')') or (stack[-1] == '[' and char == ']') or (stack[-1] == '{' and char == '}')): stack.pop() if not stack: return (i + 1, None) else: # Mismatched parentheses return (-1, None) elif char == '>': # Found potential end of template argument list. # Ignore "->" and operator functions if (i > 0 and (line[i - 1] == '-' or Search(r'\boperator\s*$', line[0:i - 1]))): continue # Pop the stack if there is a matching '<'. Otherwise, ignore # this '>' since it must be an operator. if stack: if stack[-1] == '<': stack.pop() if not stack: return (i + 1, None) elif char == ';': # Found something that look like end of statements. If we are currently # expecting a '>', the matching '<' must have been an operator, since # template argument list should not contain statements. while stack and stack[-1] == '<': stack.pop() if not stack: return (-1, None) # Did not find end of expression or unbalanced parentheses on this line return (-1, stack) def CloseExpression(clean_lines, linenum, pos): """If input points to ( or { or [ or <, finds the position that closes it. If lines[linenum][pos] points to a '(' or '{' or '[' or '<', finds the linenum/pos that correspond to the closing of the expression. TODO(unknown): cpplint spends a fair bit of time matching parentheses. Ideally we would want to index all opening and closing parentheses once and have CloseExpression be just a simple lookup, but due to preprocessor tricks, this is not so easy. Args: clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. pos: A position on the line. Returns: A tuple (line, linenum, pos) pointer *past* the closing brace, or (line, len(lines), -1) if we never find a close. Note we ignore strings and comments when matching; and the line we return is the 'cleansed' line at linenum. """ line = clean_lines.elided[linenum] if (line[pos] not in '({[<') or Match(r'<[<=]', line[pos:]): return (line, clean_lines.NumLines(), -1) # Check first line (end_pos, stack) = FindEndOfExpressionInLine(line, pos, []) if end_pos > -1: return (line, linenum, end_pos) # Continue scanning forward while stack and linenum < clean_lines.NumLines() - 1: linenum += 1 line = clean_lines.elided[linenum] (end_pos, stack) = FindEndOfExpressionInLine(line, 0, stack) if end_pos > -1: return (line, linenum, end_pos) # Did not find end of expression before end of file, give up return (line, clean_lines.NumLines(), -1) def FindStartOfExpressionInLine(line, endpos, stack): """Find position at the matching start of current expression. This is almost the reverse of FindEndOfExpressionInLine, but note that the input position and returned position differs by 1. Args: line: a CleansedLines line. endpos: start searching at this position. stack: nesting stack at endpos. Returns: On finding matching start: (index at matching start, None) On finding an unclosed expression: (-1, None) Otherwise: (-1, new stack at beginning of this line) """ i = endpos while i >= 0: char = line[i] if char in ')]}': # Found end of expression, push to expression stack stack.append(char) elif char == '>': # Found potential end of template argument list. # # Ignore it if it's a "->" or ">=" or "operator>" if (i > 0 and (line[i - 1] == '-' or Match(r'\s>=\s', line[i - 1:]) or Search(r'\boperator\s*$', line[0:i]))): i -= 1 else: stack.append('>') elif char == '<': # Found potential start of template argument list if i > 0 and line[i - 1] == '<': # Left shift operator i -= 1 else: # If there is a matching '>', we can pop the expression stack. # Otherwise, ignore this '<' since it must be an operator. if stack and stack[-1] == '>': stack.pop() if not stack: return (i, None) elif char in '([{': # Found start of expression. # # If there are any unmatched '>' on the stack, they must be # operators. Remove those. while stack and stack[-1] == '>': stack.pop() if not stack: return (-1, None) if ((char == '(' and stack[-1] == ')') or (char == '[' and stack[-1] == ']') or (char == '{' and stack[-1] == '}')): stack.pop() if not stack: return (i, None) else: # Mismatched parentheses return (-1, None) elif char == ';': # Found something that look like end of statements. If we are currently # expecting a '<', the matching '>' must have been an operator, since # template argument list should not contain statements. while stack and stack[-1] == '>': stack.pop() if not stack: return (-1, None) i -= 1 return (-1, stack) def ReverseCloseExpression(clean_lines, linenum, pos): """If input points to ) or } or ] or >, finds the position that opens it. If lines[linenum][pos] points to a ')' or '}' or ']' or '>', finds the linenum/pos that correspond to the opening of the expression. Args: clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. pos: A position on the line. Returns: A tuple (line, linenum, pos) pointer *at* the opening brace, or (line, 0, -1) if we never find the matching opening brace. Note we ignore strings and comments when matching; and the line we return is the 'cleansed' line at linenum. """ line = clean_lines.elided[linenum] if line[pos] not in ')}]>': return (line, 0, -1) # Check last line (start_pos, stack) = FindStartOfExpressionInLine(line, pos, []) if start_pos > -1: return (line, linenum, start_pos) # Continue scanning backward while stack and linenum > 0: linenum -= 1 line = clean_lines.elided[linenum] (start_pos, stack) = FindStartOfExpressionInLine(line, len(line) - 1, stack) if start_pos > -1: return (line, linenum, start_pos) # Did not find start of expression before beginning of file, give up return (line, 0, -1) def CheckForCopyright(filename, lines, error): """Logs an error if no Copyright message appears at the top of the file.""" # We'll say it should occur by line 10. Don't forget there's a # dummy line at the front. for line in xrange(1, min(len(lines), 11)): if re.search(r'Copyright', lines[line], re.I): break else: # means no copyright line was found error(filename, 0, 'legal/copyright', 5, 'No copyright message found. ' 'You should have a line: "Copyright [year] "') def GetIndentLevel(line): """Return the number of leading spaces in line. Args: line: A string to check. Returns: An integer count of leading spaces, possibly zero. """ indent = Match(r'^( *)\S', line) if indent: return len(indent.group(1)) else: return 0 def GetHeaderGuardCPPVariable(filename): """Returns the CPP variable that should be used as a header guard. Args: filename: The name of a C++ header file. Returns: The CPP variable that should be used as a header guard in the named file. """ # Restores original filename in case that cpplint is invoked from Emacs's # flymake. filename = re.sub(r'_flymake\.h$', '.h', filename) filename = re.sub(r'/\.flymake/([^/]*)$', r'/\1', filename) fileinfo = FileInfo(filename) file_path_from_root = fileinfo.RepositoryName() if _root: file_path_from_root = re.sub('^' + _root + os.sep, '', file_path_from_root) return re.sub(r'[-./\s]', '_', file_path_from_root).upper() + '_' def CheckForHeaderGuard(filename, lines, error): """Checks that the file contains a header guard. Logs an error if no #ifndef header guard is present. For other headers, checks that the full pathname is used. Args: filename: The name of the C++ header file. lines: An array of strings, each representing a line of the file. error: The function to call with any errors found. """ # Don't check for header guards if there are error suppression # comments somewhere in this file. # # Because this is silencing a warning for a nonexistent line, we # only support the very specific NOLINT(build/header_guard) syntax, # and not the general NOLINT or NOLINT(*) syntax. for i in lines: if Search(r'//\s*NOLINT\(build/header_guard\)', i): return cppvar = GetHeaderGuardCPPVariable(filename) ifndef = None ifndef_linenum = 0 define = None endif = None endif_linenum = 0 for linenum, line in enumerate(lines): linesplit = line.split() if len(linesplit) >= 2: # find the first occurrence of #ifndef and #define, save arg if not ifndef and linesplit[0] == '#ifndef': # set ifndef to the header guard presented on the #ifndef line. ifndef = linesplit[1] ifndef_linenum = linenum if not define and linesplit[0] == '#define': define = linesplit[1] # find the last occurrence of #endif, save entire line if line.startswith('#endif'): endif = line endif_linenum = linenum if not ifndef: error(filename, 0, 'build/header_guard', 5, 'No #ifndef header guard found, suggested CPP variable is: %s' % cppvar) return if not define: error(filename, 0, 'build/header_guard', 5, 'No #define header guard found, suggested CPP variable is: %s' % cppvar) return # The guard should be PATH_FILE_H_, but we also allow PATH_FILE_H__ # for backward compatibility. if ifndef != cppvar: error_level = 0 if ifndef != cppvar + '_': error_level = 5 ParseNolintSuppressions(filename, lines[ifndef_linenum], ifndef_linenum, error) error(filename, ifndef_linenum, 'build/header_guard', error_level, '#ifndef header guard has wrong style, please use: %s' % cppvar) if define != ifndef: error(filename, 0, 'build/header_guard', 5, '#ifndef and #define don\'t match, suggested CPP variable is: %s' % cppvar) return if endif != ('#endif // %s' % cppvar): error_level = 0 if endif != ('#endif // %s' % (cppvar + '_')): error_level = 5 ParseNolintSuppressions(filename, lines[endif_linenum], endif_linenum, error) error(filename, endif_linenum, 'build/header_guard', error_level, '#endif line should be "#endif // %s"' % cppvar) def CheckForBadCharacters(filename, lines, error): """Logs an error for each line containing bad characters. Two kinds of bad characters: 1. Unicode replacement characters: These indicate that either the file contained invalid UTF-8 (likely) or Unicode replacement characters (which it shouldn't). Note that it's possible for this to throw off line numbering if the invalid UTF-8 occurred adjacent to a newline. 2. NUL bytes. These are problematic for some tools. Args: filename: The name of the current file. lines: An array of strings, each representing a line of the file. error: The function to call with any errors found. """ for linenum, line in enumerate(lines): if u'\ufffd' in line: error(filename, linenum, 'readability/utf8', 5, 'Line contains invalid UTF-8 (or Unicode replacement character).') if '\0' in line: error(filename, linenum, 'readability/nul', 5, 'Line contains NUL byte.') def CheckForNewlineAtEOF(filename, lines, error): """Logs an error if there is no newline char at the end of the file. Args: filename: The name of the current file. lines: An array of strings, each representing a line of the file. error: The function to call with any errors found. """ # The array lines() was created by adding two newlines to the # original file (go figure), then splitting on \n. # To verify that the file ends in \n, we just have to make sure the # last-but-two element of lines() exists and is empty. if len(lines) < 3 or lines[-2]: error(filename, len(lines) - 2, 'whitespace/ending_newline', 5, 'Could not find a newline character at the end of the file.') def CheckForMultilineCommentsAndStrings(filename, clean_lines, linenum, error): """Logs an error if we see /* ... */ or "..." that extend past one line. /* ... */ comments are legit inside macros, for one line. Otherwise, we prefer // comments, so it's ok to warn about the other. Likewise, it's ok for strings to extend across multiple lines, as long as a line continuation character (backslash) terminates each line. Although not currently prohibited by the C++ style guide, it's ugly and unnecessary. We don't do well with either in this lint program, so we warn about both. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # Remove all \\ (escaped backslashes) from the line. They are OK, and the # second (escaped) slash may trigger later \" detection erroneously. line = line.replace('\\\\', '') if line.count('/*') > line.count('*/'): error(filename, linenum, 'readability/multiline_comment', 5, 'Complex multi-line /*...*/-style comment found. ' 'Lint may give bogus warnings. ' 'Consider replacing these with //-style comments, ' 'with #if 0...#endif, ' 'or with more clearly structured multi-line comments.') if (line.count('"') - line.count('\\"')) % 2: error(filename, linenum, 'readability/multiline_string', 5, 'Multi-line string ("...") found. This lint script doesn\'t ' 'do well with such strings, and may give bogus warnings. ' 'Use C++11 raw strings or concatenation instead.') # (non-threadsafe name, thread-safe alternative, validation pattern) # # The validation pattern is used to eliminate false positives such as: # _rand(); // false positive due to substring match. # ->rand(); // some member function rand(). # ACMRandom rand(seed); // some variable named rand. # ISAACRandom rand(); // another variable named rand. # # Basically we require the return value of these functions to be used # in some expression context on the same line by matching on some # operator before the function name. This eliminates constructors and # member function calls. _UNSAFE_FUNC_PREFIX = r'(?:[-+*/=%^&|(<]\s*|>\s+)' _THREADING_LIST = ( ('asctime(', 'asctime_r(', _UNSAFE_FUNC_PREFIX + r'asctime\([^)]+\)'), ('ctime(', 'ctime_r(', _UNSAFE_FUNC_PREFIX + r'ctime\([^)]+\)'), ('getgrgid(', 'getgrgid_r(', _UNSAFE_FUNC_PREFIX + r'getgrgid\([^)]+\)'), ('getgrnam(', 'getgrnam_r(', _UNSAFE_FUNC_PREFIX + r'getgrnam\([^)]+\)'), ('getlogin(', 'getlogin_r(', _UNSAFE_FUNC_PREFIX + r'getlogin\(\)'), ('getpwnam(', 'getpwnam_r(', _UNSAFE_FUNC_PREFIX + r'getpwnam\([^)]+\)'), ('getpwuid(', 'getpwuid_r(', _UNSAFE_FUNC_PREFIX + r'getpwuid\([^)]+\)'), ('gmtime(', 'gmtime_r(', _UNSAFE_FUNC_PREFIX + r'gmtime\([^)]+\)'), ('localtime(', 'localtime_r(', _UNSAFE_FUNC_PREFIX + r'localtime\([^)]+\)'), ('rand(', 'rand_r(', _UNSAFE_FUNC_PREFIX + r'rand\(\)'), ('strtok(', 'strtok_r(', _UNSAFE_FUNC_PREFIX + r'strtok\([^)]+\)'), ('ttyname(', 'ttyname_r(', _UNSAFE_FUNC_PREFIX + r'ttyname\([^)]+\)'), ) def CheckPosixThreading(filename, clean_lines, linenum, error): """Checks for calls to thread-unsafe functions. Much code has been originally written without consideration of multi-threading. Also, engineers are relying on their old experience; they have learned posix before threading extensions were added. These tests guide the engineers to use thread-safe functions (when using posix directly). Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] for single_thread_func, multithread_safe_func, pattern in _THREADING_LIST: # Additional pattern matching check to confirm that this is the # function we are looking for if Search(pattern, line): error(filename, linenum, 'runtime/threadsafe_fn', 2, 'Consider using ' + multithread_safe_func + '...) instead of ' + single_thread_func + '...) for improved thread safety.') def CheckVlogArguments(filename, clean_lines, linenum, error): """Checks that VLOG() is only used for defining a logging level. For example, VLOG(2) is correct. VLOG(INFO), VLOG(WARNING), VLOG(ERROR), and VLOG(FATAL) are not. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] if Search(r'\bVLOG\((INFO|ERROR|WARNING|DFATAL|FATAL)\)', line): error(filename, linenum, 'runtime/vlog', 5, 'VLOG() should be used with numeric verbosity level. ' 'Use LOG() if you want symbolic severity levels.') # Matches invalid increment: *count++, which moves pointer instead of # incrementing a value. _RE_PATTERN_INVALID_INCREMENT = re.compile( r'^\s*\*\w+(\+\+|--);') def CheckInvalidIncrement(filename, clean_lines, linenum, error): """Checks for invalid increment *count++. For example following function: void increment_counter(int* count) { *count++; } is invalid, because it effectively does count++, moving pointer, and should be replaced with ++*count, (*count)++ or *count += 1. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] if _RE_PATTERN_INVALID_INCREMENT.match(line): error(filename, linenum, 'runtime/invalid_increment', 5, 'Changing pointer instead of value (or unused value of operator*).') def IsMacroDefinition(clean_lines, linenum): if Search(r'^#define', clean_lines[linenum]): return True if linenum > 0 and Search(r'\\$', clean_lines[linenum - 1]): return True return False def IsForwardClassDeclaration(clean_lines, linenum): return Match(r'^\s*(\btemplate\b)*.*class\s+\w+;\s*$', clean_lines[linenum]) class _BlockInfo(object): """Stores information about a generic block of code.""" def __init__(self, seen_open_brace): self.seen_open_brace = seen_open_brace self.open_parentheses = 0 self.inline_asm = _NO_ASM self.check_namespace_indentation = False def CheckBegin(self, filename, clean_lines, linenum, error): """Run checks that applies to text up to the opening brace. This is mostly for checking the text after the class identifier and the "{", usually where the base class is specified. For other blocks, there isn't much to check, so we always pass. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ pass def CheckEnd(self, filename, clean_lines, linenum, error): """Run checks that applies to text after the closing brace. This is mostly used for checking end of namespace comments. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ pass def IsBlockInfo(self): """Returns true if this block is a _BlockInfo. This is convenient for verifying that an object is an instance of a _BlockInfo, but not an instance of any of the derived classes. Returns: True for this class, False for derived classes. """ return self.__class__ == _BlockInfo class _ExternCInfo(_BlockInfo): """Stores information about an 'extern "C"' block.""" def __init__(self): _BlockInfo.__init__(self, True) class _ClassInfo(_BlockInfo): """Stores information about a class.""" def __init__(self, name, class_or_struct, clean_lines, linenum): _BlockInfo.__init__(self, False) self.name = name self.starting_linenum = linenum self.is_derived = False self.check_namespace_indentation = True if class_or_struct == 'struct': self.access = 'public' self.is_struct = True else: self.access = 'private' self.is_struct = False # Remember initial indentation level for this class. Using raw_lines here # instead of elided to account for leading comments. self.class_indent = GetIndentLevel(clean_lines.raw_lines[linenum]) # Try to find the end of the class. This will be confused by things like: # class A { # } *x = { ... # # But it's still good enough for CheckSectionSpacing. self.last_line = 0 depth = 0 for i in range(linenum, clean_lines.NumLines()): line = clean_lines.elided[i] depth += line.count('{') - line.count('}') if not depth: self.last_line = i break def CheckBegin(self, filename, clean_lines, linenum, error): # Look for a bare ':' if Search('(^|[^:]):($|[^:])', clean_lines.elided[linenum]): self.is_derived = True def CheckEnd(self, filename, clean_lines, linenum, error): # Check that closing brace is aligned with beginning of the class. # Only do this if the closing brace is indented by only whitespaces. # This means we will not check single-line class definitions. indent = Match(r'^( *)\}', clean_lines.elided[linenum]) if indent and len(indent.group(1)) != self.class_indent: if self.is_struct: parent = 'struct ' + self.name else: parent = 'class ' + self.name error(filename, linenum, 'whitespace/indent', 3, 'Closing brace should be aligned with beginning of %s' % parent) class _NamespaceInfo(_BlockInfo): """Stores information about a namespace.""" def __init__(self, name, linenum): _BlockInfo.__init__(self, False) self.name = name or '' self.starting_linenum = linenum self.check_namespace_indentation = True def CheckEnd(self, filename, clean_lines, linenum, error): """Check end of namespace comments.""" line = clean_lines.raw_lines[linenum] # Check how many lines is enclosed in this namespace. Don't issue # warning for missing namespace comments if there aren't enough # lines. However, do apply checks if there is already an end of # namespace comment and it's incorrect. # # TODO(unknown): We always want to check end of namespace comments # if a namespace is large, but sometimes we also want to apply the # check if a short namespace contained nontrivial things (something # other than forward declarations). There is currently no logic on # deciding what these nontrivial things are, so this check is # triggered by namespace size only, which works most of the time. if (linenum - self.starting_linenum < 10 and not Match(r'};*\s*(//|/\*).*\bnamespace\b', line)): return # Look for matching comment at end of namespace. # # Note that we accept C style "/* */" comments for terminating # namespaces, so that code that terminate namespaces inside # preprocessor macros can be cpplint clean. # # We also accept stuff like "// end of namespace ." with the # period at the end. # # Besides these, we don't accept anything else, otherwise we might # get false negatives when existing comment is a substring of the # expected namespace. if self.name: # Named namespace if not Match((r'};*\s*(//|/\*).*\bnamespace\s+' + re.escape(self.name) + r'[\*/\.\\\s]*$'), line): error(filename, linenum, 'readability/namespace', 5, 'Namespace should be terminated with "// namespace %s"' % self.name) else: # Anonymous namespace if not Match(r'};*\s*(//|/\*).*\bnamespace[\*/\.\\\s]*$', line): # If "// namespace anonymous" or "// anonymous namespace (more text)", # mention "// anonymous namespace" as an acceptable form if Match(r'}.*\b(namespace anonymous|anonymous namespace)\b', line): error(filename, linenum, 'readability/namespace', 5, 'Anonymous namespace should be terminated with "// namespace"' ' or "// anonymous namespace"') else: error(filename, linenum, 'readability/namespace', 5, 'Anonymous namespace should be terminated with "// namespace"') class _PreprocessorInfo(object): """Stores checkpoints of nesting stacks when #if/#else is seen.""" def __init__(self, stack_before_if): # The entire nesting stack before #if self.stack_before_if = stack_before_if # The entire nesting stack up to #else self.stack_before_else = [] # Whether we have already seen #else or #elif self.seen_else = False class NestingState(object): """Holds states related to parsing braces.""" def __init__(self): # Stack for tracking all braces. An object is pushed whenever we # see a "{", and popped when we see a "}". Only 3 types of # objects are possible: # - _ClassInfo: a class or struct. # - _NamespaceInfo: a namespace. # - _BlockInfo: some other type of block. self.stack = [] # Top of the previous stack before each Update(). # # Because the nesting_stack is updated at the end of each line, we # had to do some convoluted checks to find out what is the current # scope at the beginning of the line. This check is simplified by # saving the previous top of nesting stack. # # We could save the full stack, but we only need the top. Copying # the full nesting stack would slow down cpplint by ~10%. self.previous_stack_top = [] # Stack of _PreprocessorInfo objects. self.pp_stack = [] def SeenOpenBrace(self): """Check if we have seen the opening brace for the innermost block. Returns: True if we have seen the opening brace, False if the innermost block is still expecting an opening brace. """ return (not self.stack) or self.stack[-1].seen_open_brace def InNamespaceBody(self): """Check if we are currently one level inside a namespace body. Returns: True if top of the stack is a namespace block, False otherwise. """ return self.stack and isinstance(self.stack[-1], _NamespaceInfo) def InExternC(self): """Check if we are currently one level inside an 'extern "C"' block. Returns: True if top of the stack is an extern block, False otherwise. """ return self.stack and isinstance(self.stack[-1], _ExternCInfo) def InClassDeclaration(self): """Check if we are currently one level inside a class or struct declaration. Returns: True if top of the stack is a class/struct, False otherwise. """ return self.stack and isinstance(self.stack[-1], _ClassInfo) def InAsmBlock(self): """Check if we are currently one level inside an inline ASM block. Returns: True if the top of the stack is a block containing inline ASM. """ return self.stack and self.stack[-1].inline_asm != _NO_ASM def InTemplateArgumentList(self, clean_lines, linenum, pos): """Check if current position is inside template argument list. Args: clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. pos: position just after the suspected template argument. Returns: True if (linenum, pos) is inside template arguments. """ while linenum < clean_lines.NumLines(): # Find the earliest character that might indicate a template argument line = clean_lines.elided[linenum] match = Match(r'^[^{};=\[\]\.<>]*(.)', line[pos:]) if not match: linenum += 1 pos = 0 continue token = match.group(1) pos += len(match.group(0)) # These things do not look like template argument list: # class Suspect { # class Suspect x; } if token in ('{', '}', ';'): return False # These things look like template argument list: # template # template # template # template if token in ('>', '=', '[', ']', '.'): return True # Check if token is an unmatched '<'. # If not, move on to the next character. if token != '<': pos += 1 if pos >= len(line): linenum += 1 pos = 0 continue # We can't be sure if we just find a single '<', and need to # find the matching '>'. (_, end_line, end_pos) = CloseExpression(clean_lines, linenum, pos - 1) if end_pos < 0: # Not sure if template argument list or syntax error in file return False linenum = end_line pos = end_pos return False def UpdatePreprocessor(self, line): """Update preprocessor stack. We need to handle preprocessors due to classes like this: #ifdef SWIG struct ResultDetailsPageElementExtensionPoint { #else struct ResultDetailsPageElementExtensionPoint : public Extension { #endif We make the following assumptions (good enough for most files): - Preprocessor condition evaluates to true from #if up to first #else/#elif/#endif. - Preprocessor condition evaluates to false from #else/#elif up to #endif. We still perform lint checks on these lines, but these do not affect nesting stack. Args: line: current line to check. """ if Match(r'^\s*#\s*(if|ifdef|ifndef)\b', line): # Beginning of #if block, save the nesting stack here. The saved # stack will allow us to restore the parsing state in the #else case. self.pp_stack.append(_PreprocessorInfo(copy.deepcopy(self.stack))) elif Match(r'^\s*#\s*(else|elif)\b', line): # Beginning of #else block if self.pp_stack: if not self.pp_stack[-1].seen_else: # This is the first #else or #elif block. Remember the # whole nesting stack up to this point. This is what we # keep after the #endif. self.pp_stack[-1].seen_else = True self.pp_stack[-1].stack_before_else = copy.deepcopy(self.stack) # Restore the stack to how it was before the #if self.stack = copy.deepcopy(self.pp_stack[-1].stack_before_if) else: # TODO(unknown): unexpected #else, issue warning? pass elif Match(r'^\s*#\s*endif\b', line): # End of #if or #else blocks. if self.pp_stack: # If we saw an #else, we will need to restore the nesting # stack to its former state before the #else, otherwise we # will just continue from where we left off. if self.pp_stack[-1].seen_else: # Here we can just use a shallow copy since we are the last # reference to it. self.stack = self.pp_stack[-1].stack_before_else # Drop the corresponding #if self.pp_stack.pop() else: # TODO(unknown): unexpected #endif, issue warning? pass # TODO(unknown): Update() is too long, but we will refactor later. def Update(self, filename, clean_lines, linenum, error): """Update nesting state with current line. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # Remember top of the previous nesting stack. # # The stack is always pushed/popped and not modified in place, so # we can just do a shallow copy instead of copy.deepcopy. Using # deepcopy would slow down cpplint by ~28%. if self.stack: self.previous_stack_top = self.stack[-1] else: self.previous_stack_top = None # Update pp_stack self.UpdatePreprocessor(line) # Count parentheses. This is to avoid adding struct arguments to # the nesting stack. if self.stack: inner_block = self.stack[-1] depth_change = line.count('(') - line.count(')') inner_block.open_parentheses += depth_change # Also check if we are starting or ending an inline assembly block. if inner_block.inline_asm in (_NO_ASM, _END_ASM): if (depth_change != 0 and inner_block.open_parentheses == 1 and _MATCH_ASM.match(line)): # Enter assembly block inner_block.inline_asm = _INSIDE_ASM else: # Not entering assembly block. If previous line was _END_ASM, # we will now shift to _NO_ASM state. inner_block.inline_asm = _NO_ASM elif (inner_block.inline_asm == _INSIDE_ASM and inner_block.open_parentheses == 0): # Exit assembly block inner_block.inline_asm = _END_ASM # Consume namespace declaration at the beginning of the line. Do # this in a loop so that we catch same line declarations like this: # namespace proto2 { namespace bridge { class MessageSet; } } while True: # Match start of namespace. The "\b\s*" below catches namespace # declarations even if it weren't followed by a whitespace, this # is so that we don't confuse our namespace checker. The # missing spaces will be flagged by CheckSpacing. namespace_decl_match = Match(r'^\s*namespace\b\s*([:\w]+)?(.*)$', line) if not namespace_decl_match: break new_namespace = _NamespaceInfo(namespace_decl_match.group(1), linenum) self.stack.append(new_namespace) line = namespace_decl_match.group(2) if line.find('{') != -1: new_namespace.seen_open_brace = True line = line[line.find('{') + 1:] # Look for a class declaration in whatever is left of the line # after parsing namespaces. The regexp accounts for decorated classes # such as in: # class LOCKABLE API Object { # }; class_decl_match = Match( r'^(\s*(?:template\s*<[\w\s<>,:]*>\s*)?' r'(class|struct)\s+(?:[A-Z_]+\s+)*(\w+(?:::\w+)*))' r'(.*)$', line) if (class_decl_match and (not self.stack or self.stack[-1].open_parentheses == 0)): # We do not want to accept classes that are actually template arguments: # template , # template class Ignore3> # void Function() {}; # # To avoid template argument cases, we scan forward and look for # an unmatched '>'. If we see one, assume we are inside a # template argument list. end_declaration = len(class_decl_match.group(1)) if not self.InTemplateArgumentList(clean_lines, linenum, end_declaration): self.stack.append(_ClassInfo( class_decl_match.group(3), class_decl_match.group(2), clean_lines, linenum)) line = class_decl_match.group(4) # If we have not yet seen the opening brace for the innermost block, # run checks here. if not self.SeenOpenBrace(): self.stack[-1].CheckBegin(filename, clean_lines, linenum, error) # Update access control if we are inside a class/struct if self.stack and isinstance(self.stack[-1], _ClassInfo): classinfo = self.stack[-1] access_match = Match( r'^(.*)\b(public|private|protected|signals)(\s+(?:slots\s*)?)?' r':(?:[^:]|$)', line) if access_match: classinfo.access = access_match.group(2) # Check that access keywords are indented +1 space. Skip this # check if the keywords are not preceded by whitespaces. indent = access_match.group(1) if (len(indent) != classinfo.class_indent + 1 and Match(r'^\s*$', indent)): if classinfo.is_struct: parent = 'struct ' + classinfo.name else: parent = 'class ' + classinfo.name slots = '' if access_match.group(3): slots = access_match.group(3) error(filename, linenum, 'whitespace/indent', 3, '%s%s: should be indented +1 space inside %s' % ( access_match.group(2), slots, parent)) # Consume braces or semicolons from what's left of the line while True: # Match first brace, semicolon, or closed parenthesis. matched = Match(r'^[^{;)}]*([{;)}])(.*)$', line) if not matched: break token = matched.group(1) if token == '{': # If namespace or class hasn't seen a opening brace yet, mark # namespace/class head as complete. Push a new block onto the # stack otherwise. if not self.SeenOpenBrace(): self.stack[-1].seen_open_brace = True elif Match(r'^extern\s*"[^"]*"\s*\{', line): self.stack.append(_ExternCInfo()) else: self.stack.append(_BlockInfo(True)) if _MATCH_ASM.match(line): self.stack[-1].inline_asm = _BLOCK_ASM elif token == ';' or token == ')': # If we haven't seen an opening brace yet, but we already saw # a semicolon, this is probably a forward declaration. Pop # the stack for these. # # Similarly, if we haven't seen an opening brace yet, but we # already saw a closing parenthesis, then these are probably # function arguments with extra "class" or "struct" keywords. # Also pop these stack for these. if not self.SeenOpenBrace(): self.stack.pop() else: # token == '}' # Perform end of block checks and pop the stack. if self.stack: self.stack[-1].CheckEnd(filename, clean_lines, linenum, error) self.stack.pop() line = matched.group(2) def InnermostClass(self): """Get class info on the top of the stack. Returns: A _ClassInfo object if we are inside a class, or None otherwise. """ for i in range(len(self.stack), 0, -1): classinfo = self.stack[i - 1] if isinstance(classinfo, _ClassInfo): return classinfo return None def CheckCompletedBlocks(self, filename, error): """Checks that all classes and namespaces have been completely parsed. Call this when all lines in a file have been processed. Args: filename: The name of the current file. error: The function to call with any errors found. """ # Note: This test can result in false positives if #ifdef constructs # get in the way of brace matching. See the testBuildClass test in # cpplint_unittest.py for an example of this. for obj in self.stack: if isinstance(obj, _ClassInfo): error(filename, obj.starting_linenum, 'build/class', 5, 'Failed to find complete declaration of class %s' % obj.name) elif isinstance(obj, _NamespaceInfo): error(filename, obj.starting_linenum, 'build/namespaces', 5, 'Failed to find complete declaration of namespace %s' % obj.name) def CheckForNonStandardConstructs(filename, clean_lines, linenum, nesting_state, error): r"""Logs an error if we see certain non-ANSI constructs ignored by gcc-2. Complain about several constructs which gcc-2 accepts, but which are not standard C++. Warning about these in lint is one way to ease the transition to new compilers. - put storage class first (e.g. "static const" instead of "const static"). - "%lld" instead of %qd" in printf-type functions. - "%1$d" is non-standard in printf-type functions. - "\%" is an undefined character escape sequence. - text after #endif is not allowed. - invalid inner-style forward declaration. - >? and ?= and )\?=?\s*(\w+|[+-]?\d+)(\.\d*)?', line): error(filename, linenum, 'build/deprecated', 3, '>? and ))?' # r'\s*const\s*' + type_name + '\s*&\s*\w+\s*;' error(filename, linenum, 'runtime/member_string_references', 2, 'const string& members are dangerous. It is much better to use ' 'alternatives, such as pointers or simple constants.') # Everything else in this function operates on class declarations. # Return early if the top of the nesting stack is not a class, or if # the class head is not completed yet. classinfo = nesting_state.InnermostClass() if not classinfo or not classinfo.seen_open_brace: return # The class may have been declared with namespace or classname qualifiers. # The constructor and destructor will not have those qualifiers. base_classname = classinfo.name.split('::')[-1] # Look for single-argument constructors that aren't marked explicit. # Technically a valid construct, but against style. Also look for # non-single-argument constructors which are also technically valid, but # strongly suggest something is wrong. explicit_constructor_match = Match( r'\s+(?:inline\s+)?(explicit\s+)?(?:inline\s+)?%s\s*' r'\(((?:[^()]|\([^()]*\))*)\)' % re.escape(base_classname), line) if explicit_constructor_match: is_marked_explicit = explicit_constructor_match.group(1) if not explicit_constructor_match.group(2): constructor_args = [] else: constructor_args = explicit_constructor_match.group(2).split(',') # collapse arguments so that commas in template parameter lists and function # argument parameter lists don't split arguments in two i = 0 while i < len(constructor_args): constructor_arg = constructor_args[i] while (constructor_arg.count('<') > constructor_arg.count('>') or constructor_arg.count('(') > constructor_arg.count(')')): constructor_arg += ',' + constructor_args[i + 1] del constructor_args[i + 1] constructor_args[i] = constructor_arg i += 1 defaulted_args = [arg for arg in constructor_args if '=' in arg] noarg_constructor = (not constructor_args or # empty arg list # 'void' arg specifier (len(constructor_args) == 1 and constructor_args[0].strip() == 'void')) onearg_constructor = ((len(constructor_args) == 1 and # exactly one arg not noarg_constructor) or # all but at most one arg defaulted (len(constructor_args) >= 1 and not noarg_constructor and len(defaulted_args) >= len(constructor_args) - 1)) initializer_list_constructor = bool( onearg_constructor and Search(r'\bstd\s*::\s*initializer_list\b', constructor_args[0])) copy_constructor = bool( onearg_constructor and Match(r'(const\s+)?%s(\s*<[^>]*>)?(\s+const)?\s*(?:<\w+>\s*)?&' % re.escape(base_classname), constructor_args[0].strip())) if (not is_marked_explicit and onearg_constructor and not initializer_list_constructor and not copy_constructor): if defaulted_args: error(filename, linenum, 'runtime/explicit', 5, 'Constructors callable with one argument ' 'should be marked explicit.') else: error(filename, linenum, 'runtime/explicit', 5, 'Single-parameter constructors should be marked explicit.') elif is_marked_explicit and not onearg_constructor: if noarg_constructor: error(filename, linenum, 'runtime/explicit', 5, 'Zero-parameter constructors should not be marked explicit.') else: error(filename, linenum, 'runtime/explicit', 0, 'Constructors that require multiple arguments ' 'should not be marked explicit.') def CheckSpacingForFunctionCall(filename, clean_lines, linenum, error): """Checks for the correctness of various spacing around function calls. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # Since function calls often occur inside if/for/while/switch # expressions - which have their own, more liberal conventions - we # first see if we should be looking inside such an expression for a # function call, to which we can apply more strict standards. fncall = line # if there's no control flow construct, look at whole line for pattern in (r'\bif\s*\((.*)\)\s*{', r'\bfor\s*\((.*)\)\s*{', r'\bwhile\s*\((.*)\)\s*[{;]', r'\bswitch\s*\((.*)\)\s*{'): match = Search(pattern, line) if match: fncall = match.group(1) # look inside the parens for function calls break # Except in if/for/while/switch, there should never be space # immediately inside parens (eg "f( 3, 4 )"). We make an exception # for nested parens ( (a+b) + c ). Likewise, there should never be # a space before a ( when it's a function argument. I assume it's a # function argument when the char before the whitespace is legal in # a function name (alnum + _) and we're not starting a macro. Also ignore # pointers and references to arrays and functions coz they're too tricky: # we use a very simple way to recognize these: # " (something)(maybe-something)" or # " (something)(maybe-something," or # " (something)[something]" # Note that we assume the contents of [] to be short enough that # they'll never need to wrap. if ( # Ignore control structures. not Search(r'\b(if|for|while|switch|return|new|delete|catch|sizeof)\b', fncall) and # Ignore pointers/references to functions. not Search(r' \([^)]+\)\([^)]*(\)|,$)', fncall) and # Ignore pointers/references to arrays. not Search(r' \([^)]+\)\[[^\]]+\]', fncall)): if Search(r'\w\s*\(\s(?!\s*\\$)', fncall): # a ( used for a fn call error(filename, linenum, 'whitespace/parens', 4, 'Extra space after ( in function call') elif Search(r'\(\s+(?!(\s*\\)|\()', fncall): error(filename, linenum, 'whitespace/parens', 2, 'Extra space after (') if (Search(r'\w\s+\(', fncall) and not Search(r'#\s*define|typedef|using\s+\w+\s*=', fncall) and not Search(r'\w\s+\((\w+::)*\*\w+\)\(', fncall)): # TODO(unknown): Space after an operator function seem to be a common # error, silence those for now by restricting them to highest verbosity. if Search(r'\boperator_*\b', line): error(filename, linenum, 'whitespace/parens', 0, 'Extra space before ( in function call') else: error(filename, linenum, 'whitespace/parens', 4, 'Extra space before ( in function call') # If the ) is followed only by a newline or a { + newline, assume it's # part of a control statement (if/while/etc), and don't complain if Search(r'[^)]\s+\)\s*[^{\s]', fncall): # If the closing parenthesis is preceded by only whitespaces, # try to give a more descriptive error message. if Search(r'^\s+\)', fncall): error(filename, linenum, 'whitespace/parens', 2, 'Closing ) should be moved to the previous line') else: error(filename, linenum, 'whitespace/parens', 2, 'Extra space before )') def IsBlankLine(line): """Returns true if the given line is blank. We consider a line to be blank if the line is empty or consists of only white spaces. Args: line: A line of a string. Returns: True, if the given line is blank. """ return not line or line.isspace() def CheckForNamespaceIndentation(filename, nesting_state, clean_lines, line, error): is_namespace_indent_item = ( len(nesting_state.stack) > 1 and nesting_state.stack[-1].check_namespace_indentation and isinstance(nesting_state.previous_stack_top, _NamespaceInfo) and nesting_state.previous_stack_top == nesting_state.stack[-2]) if ShouldCheckNamespaceIndentation(nesting_state, is_namespace_indent_item, clean_lines.elided, line): CheckItemIndentationInNamespace(filename, clean_lines.elided, line, error) def CheckForFunctionLengths(filename, clean_lines, linenum, function_state, error): """Reports for long function bodies. For an overview why this is done, see: http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Write_Short_Functions Uses a simplistic algorithm assuming other style guidelines (especially spacing) are followed. Only checks unindented functions, so class members are unchecked. Trivial bodies are unchecked, so constructors with huge initializer lists may be missed. Blank/comment lines are not counted so as to avoid encouraging the removal of vertical space and comments just to get through a lint check. NOLINT *on the last line of a function* disables this check. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. function_state: Current function name and lines in body so far. error: The function to call with any errors found. """ lines = clean_lines.lines line = lines[linenum] joined_line = '' starting_func = False regexp = r'(\w(\w|::|\*|\&|\s)*)\(' # decls * & space::name( ... match_result = Match(regexp, line) if match_result: # If the name is all caps and underscores, figure it's a macro and # ignore it, unless it's TEST or TEST_F. function_name = match_result.group(1).split()[-1] if function_name == 'TEST' or function_name == 'TEST_F' or ( not Match(r'[A-Z_]+$', function_name)): starting_func = True if starting_func: body_found = False for start_linenum in xrange(linenum, clean_lines.NumLines()): start_line = lines[start_linenum] joined_line += ' ' + start_line.lstrip() if Search(r'(;|})', start_line): # Declarations and trivial functions body_found = True break # ... ignore elif Search(r'{', start_line): body_found = True function = Search(r'((\w|:)*)\(', line).group(1) if Match(r'TEST', function): # Handle TEST... macros parameter_regexp = Search(r'(\(.*\))', joined_line) if parameter_regexp: # Ignore bad syntax function += parameter_regexp.group(1) else: function += '()' function_state.Begin(function) break if not body_found: # No body for the function (or evidence of a non-function) was found. error(filename, linenum, 'readability/fn_size', 5, 'Lint failed to find start of function body.') elif Match(r'^\}\s*$', line): # function end function_state.Check(error, filename, linenum) function_state.End() elif not Match(r'^\s*$', line): function_state.Count() # Count non-blank/non-comment lines. _RE_PATTERN_TODO = re.compile(r'^//(\s*)TODO(\(.+?\))?:?(\s|$)?') def CheckComment(line, filename, linenum, next_line_start, error): """Checks for common mistakes in comments. Args: line: The line in question. filename: The name of the current file. linenum: The number of the line to check. next_line_start: The first non-whitespace column of the next line. error: The function to call with any errors found. """ commentpos = line.find('//') if commentpos != -1: # Check if the // may be in quotes. If so, ignore it # Comparisons made explicit for clarity -- pylint: disable=g-explicit-bool-comparison if (line.count('"', 0, commentpos) - line.count('\\"', 0, commentpos)) % 2 == 0: # not in quotes # Allow one space for new scopes, two spaces otherwise: if (not (Match(r'^.*{ *//', line) and next_line_start == commentpos) and ((commentpos >= 1 and line[commentpos-1] not in string.whitespace) or (commentpos >= 2 and line[commentpos-2] not in string.whitespace))): error(filename, linenum, 'whitespace/comments', 2, 'At least two spaces is best between code and comments') # Checks for common mistakes in TODO comments. comment = line[commentpos:] match = _RE_PATTERN_TODO.match(comment) if match: # One whitespace is correct; zero whitespace is handled elsewhere. leading_whitespace = match.group(1) if len(leading_whitespace) > 1: error(filename, linenum, 'whitespace/todo', 2, 'Too many spaces before TODO') username = match.group(2) if not username: error(filename, linenum, 'readability/todo', 2, 'Missing username in TODO; it should look like ' '"// TODO(my_username): Stuff."') middle_whitespace = match.group(3) # Comparisons made explicit for correctness -- pylint: disable=g-explicit-bool-comparison if middle_whitespace != ' ' and middle_whitespace != '': error(filename, linenum, 'whitespace/todo', 2, 'TODO(my_username) should be followed by a space') # If the comment contains an alphanumeric character, there # should be a space somewhere between it and the //. if Match(r'//[^ ]*\w', comment): error(filename, linenum, 'whitespace/comments', 4, 'Should have a space between // and comment') def CheckAccess(filename, clean_lines, linenum, nesting_state, error): """Checks for improper use of DISALLOW* macros. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. nesting_state: A NestingState instance which maintains information about the current stack of nested blocks being parsed. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # get rid of comments and strings matched = Match((r'\s*(DISALLOW_COPY_AND_ASSIGN|' r'DISALLOW_IMPLICIT_CONSTRUCTORS)'), line) if not matched: return if nesting_state.stack and isinstance(nesting_state.stack[-1], _ClassInfo): if nesting_state.stack[-1].access != 'private': error(filename, linenum, 'readability/constructors', 3, '%s must be in the private: section' % matched.group(1)) else: # Found DISALLOW* macro outside a class declaration, or perhaps it # was used inside a function when it should have been part of the # class declaration. We could issue a warning here, but it # probably resulted in a compiler error already. pass def CheckSpacing(filename, clean_lines, linenum, nesting_state, error): """Checks for the correctness of various spacing issues in the code. Things we check for: spaces around operators, spaces after if/for/while/switch, no spaces around parens in function calls, two spaces between code and comment, don't start a block with a blank line, don't end a function with a blank line, don't add a blank line after public/protected/private, don't have too many blank lines in a row. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. nesting_state: A NestingState instance which maintains information about the current stack of nested blocks being parsed. error: The function to call with any errors found. """ # Don't use "elided" lines here, otherwise we can't check commented lines. # Don't want to use "raw" either, because we don't want to check inside C++11 # raw strings, raw = clean_lines.lines_without_raw_strings line = raw[linenum] # Before nixing comments, check if the line is blank for no good # reason. This includes the first line after a block is opened, and # blank lines at the end of a function (ie, right before a line like '}' # # Skip all the blank line checks if we are immediately inside a # namespace body. In other words, don't issue blank line warnings # for this block: # namespace { # # } # # A warning about missing end of namespace comments will be issued instead. # # Also skip blank line checks for 'extern "C"' blocks, which are formatted # like namespaces. if (IsBlankLine(line) and not nesting_state.InNamespaceBody() and not nesting_state.InExternC()): elided = clean_lines.elided prev_line = elided[linenum - 1] prevbrace = prev_line.rfind('{') # TODO(unknown): Don't complain if line before blank line, and line after, # both start with alnums and are indented the same amount. # This ignores whitespace at the start of a namespace block # because those are not usually indented. if prevbrace != -1 and prev_line[prevbrace:].find('}') == -1: # OK, we have a blank line at the start of a code block. Before we # complain, we check if it is an exception to the rule: The previous # non-empty line has the parameters of a function header that are indented # 4 spaces (because they did not fit in a 80 column line when placed on # the same line as the function name). We also check for the case where # the previous line is indented 6 spaces, which may happen when the # initializers of a constructor do not fit into a 80 column line. exception = False if Match(r' {6}\w', prev_line): # Initializer list? # We are looking for the opening column of initializer list, which # should be indented 4 spaces to cause 6 space indentation afterwards. search_position = linenum-2 while (search_position >= 0 and Match(r' {6}\w', elided[search_position])): search_position -= 1 exception = (search_position >= 0 and elided[search_position][:5] == ' :') else: # Search for the function arguments or an initializer list. We use a # simple heuristic here: If the line is indented 4 spaces; and we have a # closing paren, without the opening paren, followed by an opening brace # or colon (for initializer lists) we assume that it is the last line of # a function header. If we have a colon indented 4 spaces, it is an # initializer list. exception = (Match(r' {4}\w[^\(]*\)\s*(const\s*)?(\{\s*$|:)', prev_line) or Match(r' {4}:', prev_line)) if not exception: error(filename, linenum, 'whitespace/blank_line', 2, 'Redundant blank line at the start of a code block ' 'should be deleted.') # Ignore blank lines at the end of a block in a long if-else # chain, like this: # if (condition1) { # // Something followed by a blank line # # } else if (condition2) { # // Something else # } if linenum + 1 < clean_lines.NumLines(): next_line = raw[linenum + 1] if (next_line and Match(r'\s*}', next_line) and next_line.find('} else ') == -1): error(filename, linenum, 'whitespace/blank_line', 3, 'Redundant blank line at the end of a code block ' 'should be deleted.') matched = Match(r'\s*(public|protected|private):', prev_line) if matched: error(filename, linenum, 'whitespace/blank_line', 3, 'Do not leave a blank line after "%s:"' % matched.group(1)) # Next, check comments next_line_start = 0 if linenum + 1 < clean_lines.NumLines(): next_line = raw[linenum + 1] next_line_start = len(next_line) - len(next_line.lstrip()) CheckComment(line, filename, linenum, next_line_start, error) # get rid of comments and strings line = clean_lines.elided[linenum] # You shouldn't have spaces before your brackets, except maybe after # 'delete []' or 'return []() {};' if Search(r'\w\s+\[', line) and not Search(r'(?:delete|return)\s+\[', line): error(filename, linenum, 'whitespace/braces', 5, 'Extra space before [') # In range-based for, we wanted spaces before and after the colon, but # not around "::" tokens that might appear. if (Search(r'for *\(.*[^:]:[^: ]', line) or Search(r'for *\(.*[^: ]:[^:]', line)): error(filename, linenum, 'whitespace/forcolon', 2, 'Missing space around colon in range-based for loop') def CheckOperatorSpacing(filename, clean_lines, linenum, error): """Checks for horizontal spacing around operators. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # Don't try to do spacing checks for operator methods. Do this by # replacing the troublesome characters with something else, # preserving column position for all other characters. # # The replacement is done repeatedly to avoid false positives from # operators that call operators. while True: match = Match(r'^(.*\boperator\b)(\S+)(\s*\(.*)$', line) if match: line = match.group(1) + ('_' * len(match.group(2))) + match.group(3) else: break # We allow no-spaces around = within an if: "if ( (a=Foo()) == 0 )". # Otherwise not. Note we only check for non-spaces on *both* sides; # sometimes people put non-spaces on one side when aligning ='s among # many lines (not that this is behavior that I approve of...) if Search(r'[\w.]=[\w.]', line) and not Search(r'\b(if|while) ', line): error(filename, linenum, 'whitespace/operators', 4, 'Missing spaces around =') # It's ok not to have spaces around binary operators like + - * /, but if # there's too little whitespace, we get concerned. It's hard to tell, # though, so we punt on this one for now. TODO. # You should always have whitespace around binary operators. # # Check <= and >= first to avoid false positives with < and >, then # check non-include lines for spacing around < and >. # # If the operator is followed by a comma, assume it's be used in a # macro context and don't do any checks. This avoids false # positives. # # Note that && is not included here. Those are checked separately # in CheckRValueReference match = Search(r'[^<>=!\s](==|!=|<=|>=|\|\|)[^<>=!\s,;\)]', line) if match: error(filename, linenum, 'whitespace/operators', 3, 'Missing spaces around %s' % match.group(1)) elif not Match(r'#.*include', line): # Look for < that is not surrounded by spaces. This is only # triggered if both sides are missing spaces, even though # technically should should flag if at least one side is missing a # space. This is done to avoid some false positives with shifts. match = Match(r'^(.*[^\s<])<[^\s=<,]', line) if match: (_, _, end_pos) = CloseExpression( clean_lines, linenum, len(match.group(1))) if end_pos <= -1: error(filename, linenum, 'whitespace/operators', 3, 'Missing spaces around <') # Look for > that is not surrounded by spaces. Similar to the # above, we only trigger if both sides are missing spaces to avoid # false positives with shifts. match = Match(r'^(.*[^-\s>])>[^\s=>,]', line) if match: (_, _, start_pos) = ReverseCloseExpression( clean_lines, linenum, len(match.group(1))) if start_pos <= -1: error(filename, linenum, 'whitespace/operators', 3, 'Missing spaces around >') # We allow no-spaces around << when used like this: 10<<20, but # not otherwise (particularly, not when used as streams) # # We also allow operators following an opening parenthesis, since # those tend to be macros that deal with operators. match = Search(r'(operator|\S)(?:L|UL|ULL|l|ul|ull)?<<([^\s,=])', line) if (match and match.group(1) != '(' and not (match.group(1).isdigit() and match.group(2).isdigit()) and not (match.group(1) == 'operator' and match.group(2) == ';')): error(filename, linenum, 'whitespace/operators', 3, 'Missing spaces around <<') # We allow no-spaces around >> for almost anything. This is because # C++11 allows ">>" to close nested templates, which accounts for # most cases when ">>" is not followed by a space. # # We still warn on ">>" followed by alpha character, because that is # likely due to ">>" being used for right shifts, e.g.: # value >> alpha # # When ">>" is used to close templates, the alphanumeric letter that # follows would be part of an identifier, and there should still be # a space separating the template type and the identifier. # type> alpha match = Search(r'>>[a-zA-Z_]', line) if match: error(filename, linenum, 'whitespace/operators', 3, 'Missing spaces around >>') # There shouldn't be space around unary operators match = Search(r'(!\s|~\s|[\s]--[\s;]|[\s]\+\+[\s;])', line) if match: error(filename, linenum, 'whitespace/operators', 4, 'Extra space for operator %s' % match.group(1)) def CheckParenthesisSpacing(filename, clean_lines, linenum, error): """Checks for horizontal spacing around parentheses. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # No spaces after an if, while, switch, or for match = Search(r' (if\(|for\(|while\(|switch\()', line) if match: error(filename, linenum, 'whitespace/parens', 5, 'Missing space before ( in %s' % match.group(1)) # For if/for/while/switch, the left and right parens should be # consistent about how many spaces are inside the parens, and # there should either be zero or one spaces inside the parens. # We don't want: "if ( foo)" or "if ( foo )". # Exception: "for ( ; foo; bar)" and "for (foo; bar; )" are allowed. match = Search(r'\b(if|for|while|switch)\s*' r'\(([ ]*)(.).*[^ ]+([ ]*)\)\s*{\s*$', line) if match: if len(match.group(2)) != len(match.group(4)): if not (match.group(3) == ';' and len(match.group(2)) == 1 + len(match.group(4)) or not match.group(2) and Search(r'\bfor\s*\(.*; \)', line)): error(filename, linenum, 'whitespace/parens', 5, 'Mismatching spaces inside () in %s' % match.group(1)) if len(match.group(2)) not in [0, 1]: error(filename, linenum, 'whitespace/parens', 5, 'Should have zero or one spaces inside ( and ) in %s' % match.group(1)) def CheckCommaSpacing(filename, clean_lines, linenum, error): """Checks for horizontal spacing near commas and semicolons. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ raw = clean_lines.lines_without_raw_strings line = clean_lines.elided[linenum] # You should always have a space after a comma (either as fn arg or operator) # # This does not apply when the non-space character following the # comma is another comma, since the only time when that happens is # for empty macro arguments. # # We run this check in two passes: first pass on elided lines to # verify that lines contain missing whitespaces, second pass on raw # lines to confirm that those missing whitespaces are not due to # elided comments. if (Search(r',[^,\s]', ReplaceAll(r'\boperator\s*,\s*\(', 'F(', line)) and Search(r',[^,\s]', raw[linenum])): error(filename, linenum, 'whitespace/comma', 3, 'Missing space after ,') # You should always have a space after a semicolon # except for few corner cases # TODO(unknown): clarify if 'if (1) { return 1;}' is requires one more # space after ; if Search(r';[^\s};\\)/]', line): error(filename, linenum, 'whitespace/semicolon', 3, 'Missing space after ;') def CheckBracesSpacing(filename, clean_lines, linenum, error): """Checks for horizontal spacing near commas. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # Except after an opening paren, or after another opening brace (in case of # an initializer list, for instance), you should have spaces before your # braces. And since you should never have braces at the beginning of a line, # this is an easy test. match = Match(r'^(.*[^ ({]){', line) if match: # Try a bit harder to check for brace initialization. This # happens in one of the following forms: # Constructor() : initializer_list_{} { ... } # Constructor{}.MemberFunction() # Type variable{}; # FunctionCall(type{}, ...); # LastArgument(..., type{}); # LOG(INFO) << type{} << " ..."; # map_of_type[{...}] = ...; # ternary = expr ? new type{} : nullptr; # OuterTemplate{}> # # We check for the character following the closing brace, and # silence the warning if it's one of those listed above, i.e. # "{.;,)<>]:". # # To account for nested initializer list, we allow any number of # closing braces up to "{;,)<". We can't simply silence the # warning on first sight of closing brace, because that would # cause false negatives for things that are not initializer lists. # Silence this: But not this: # Outer{ if (...) { # Inner{...} if (...){ // Missing space before { # }; } # # There is a false negative with this approach if people inserted # spurious semicolons, e.g. "if (cond){};", but we will catch the # spurious semicolon with a separate check. (endline, endlinenum, endpos) = CloseExpression( clean_lines, linenum, len(match.group(1))) trailing_text = '' if endpos > -1: trailing_text = endline[endpos:] for offset in xrange(endlinenum + 1, min(endlinenum + 3, clean_lines.NumLines() - 1)): trailing_text += clean_lines.elided[offset] if not Match(r'^[\s}]*[{.;,)<>\]:]', trailing_text): error(filename, linenum, 'whitespace/braces', 5, 'Missing space before {') # Make sure '} else {' has spaces. if Search(r'}else', line): error(filename, linenum, 'whitespace/braces', 5, 'Missing space before else') # You shouldn't have a space before a semicolon at the end of the line. # There's a special case for "for" since the style guide allows space before # the semicolon there. if Search(r':\s*;\s*$', line): error(filename, linenum, 'whitespace/semicolon', 5, 'Semicolon defining empty statement. Use {} instead.') elif Search(r'^\s*;\s*$', line): error(filename, linenum, 'whitespace/semicolon', 5, 'Line contains only semicolon. If this should be an empty statement, ' 'use {} instead.') elif (Search(r'\s+;\s*$', line) and not Search(r'\bfor\b', line)): error(filename, linenum, 'whitespace/semicolon', 5, 'Extra space before last semicolon. If this should be an empty ' 'statement, use {} instead.') def IsDecltype(clean_lines, linenum, column): """Check if the token ending on (linenum, column) is decltype(). Args: clean_lines: A CleansedLines instance containing the file. linenum: the number of the line to check. column: end column of the token to check. Returns: True if this token is decltype() expression, False otherwise. """ (text, _, start_col) = ReverseCloseExpression(clean_lines, linenum, column) if start_col < 0: return False if Search(r'\bdecltype\s*$', text[0:start_col]): return True return False def IsTemplateParameterList(clean_lines, linenum, column): """Check if the token ending on (linenum, column) is the end of template<>. Args: clean_lines: A CleansedLines instance containing the file. linenum: the number of the line to check. column: end column of the token to check. Returns: True if this token is end of a template parameter list, False otherwise. """ (_, startline, startpos) = ReverseCloseExpression( clean_lines, linenum, column) if (startpos > -1 and Search(r'\btemplate\s*$', clean_lines.elided[startline][0:startpos])): return True return False def IsRValueType(clean_lines, nesting_state, linenum, column): """Check if the token ending on (linenum, column) is a type. Assumes that text to the right of the column is "&&" or a function name. Args: clean_lines: A CleansedLines instance containing the file. nesting_state: A NestingState instance which maintains information about the current stack of nested blocks being parsed. linenum: the number of the line to check. column: end column of the token to check. Returns: True if this token is a type, False if we are not sure. """ prefix = clean_lines.elided[linenum][0:column] # Get one word to the left. If we failed to do so, this is most # likely not a type, since it's unlikely that the type name and "&&" # would be split across multiple lines. match = Match(r'^(.*)(\b\w+|[>*)&])\s*$', prefix) if not match: return False # Check text following the token. If it's "&&>" or "&&," or "&&...", it's # most likely a rvalue reference used inside a template. suffix = clean_lines.elided[linenum][column:] if Match(r'&&\s*(?:[>,]|\.\.\.)', suffix): return True # Check for simple type and end of templates: # int&& variable # vector&& variable # # Because this function is called recursively, we also need to # recognize pointer and reference types: # int* Function() # int& Function() if match.group(2) in ['char', 'char16_t', 'char32_t', 'wchar_t', 'bool', 'short', 'int', 'long', 'signed', 'unsigned', 'float', 'double', 'void', 'auto', '>', '*', '&']: return True # If we see a close parenthesis, look for decltype on the other side. # decltype would unambiguously identify a type, anything else is # probably a parenthesized expression and not a type. if match.group(2) == ')': return IsDecltype( clean_lines, linenum, len(match.group(1)) + len(match.group(2)) - 1) # Check for casts and cv-qualifiers. # match.group(1) remainder # -------------- --------- # const_cast< type&& # const type&& # type const&& if Search(r'\b(?:const_cast\s*<|static_cast\s*<|dynamic_cast\s*<|' r'reinterpret_cast\s*<|\w+\s)\s*$', match.group(1)): return True # Look for a preceding symbol that might help differentiate the context. # These are the cases that would be ambiguous: # match.group(1) remainder # -------------- --------- # Call ( expression && # Declaration ( type&& # sizeof ( type&& # if ( expression && # while ( expression && # for ( type&& # for( ; expression && # statement ; type&& # block { type&& # constructor { expression && start = linenum line = match.group(1) match_symbol = None while start >= 0: # We want to skip over identifiers and commas to get to a symbol. # Commas are skipped so that we can find the opening parenthesis # for function parameter lists. match_symbol = Match(r'^(.*)([^\w\s,])[\w\s,]*$', line) if match_symbol: break start -= 1 line = clean_lines.elided[start] if not match_symbol: # Probably the first statement in the file is an rvalue reference return True if match_symbol.group(2) == '}': # Found closing brace, probably an indicate of this: # block{} type&& return True if match_symbol.group(2) == ';': # Found semicolon, probably one of these: # for(; expression && # statement; type&& # Look for the previous 'for(' in the previous lines. before_text = match_symbol.group(1) for i in xrange(start - 1, max(start - 6, 0), -1): before_text = clean_lines.elided[i] + before_text if Search(r'for\s*\([^{};]*$', before_text): # This is the condition inside a for-loop return False # Did not find a for-init-statement before this semicolon, so this # is probably a new statement and not a condition. return True if match_symbol.group(2) == '{': # Found opening brace, probably one of these: # block{ type&& = ... ; } # constructor{ expression && expression } # Look for a closing brace or a semicolon. If we see a semicolon # first, this is probably a rvalue reference. line = clean_lines.elided[start][0:len(match_symbol.group(1)) + 1] end = start depth = 1 while True: for ch in line: if ch == ';': return True elif ch == '{': depth += 1 elif ch == '}': depth -= 1 if depth == 0: return False end += 1 if end >= clean_lines.NumLines(): break line = clean_lines.elided[end] # Incomplete program? return False if match_symbol.group(2) == '(': # Opening parenthesis. Need to check what's to the left of the # parenthesis. Look back one extra line for additional context. before_text = match_symbol.group(1) if linenum > 1: before_text = clean_lines.elided[linenum - 1] + before_text before_text = match_symbol.group(1) # Patterns that are likely to be types: # [](type&& # for (type&& # sizeof(type&& # operator=(type&& # if Search(r'(?:\]|\bfor|\bsizeof|\boperator\s*\S+\s*)\s*$', before_text): return True # Patterns that are likely to be expressions: # if (expression && # while (expression && # : initializer(expression && # , initializer(expression && # ( FunctionCall(expression && # + FunctionCall(expression && # + (expression && # # The last '+' represents operators such as '+' and '-'. if Search(r'(?:\bif|\bwhile|[-+=%^(]*>)?\s*$', match_symbol.group(1)) if match_func: # Check for constructors, which don't have return types. if Search(r'\b(?:explicit|inline)$', match_func.group(1)): return True implicit_constructor = Match(r'\s*(\w+)\((?:const\s+)?(\w+)', prefix) if (implicit_constructor and implicit_constructor.group(1) == implicit_constructor.group(2)): return True return IsRValueType(clean_lines, nesting_state, linenum, len(match_func.group(1))) # Nothing before the function name. If this is inside a block scope, # this is probably a function call. return not (nesting_state.previous_stack_top and nesting_state.previous_stack_top.IsBlockInfo()) if match_symbol.group(2) == '>': # Possibly a closing bracket, check that what's on the other side # looks like the start of a template. return IsTemplateParameterList( clean_lines, start, len(match_symbol.group(1))) # Some other symbol, usually something like "a=b&&c". This is most # likely not a type. return False def IsDeletedOrDefault(clean_lines, linenum): """Check if current constructor or operator is deleted or default. Args: clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. Returns: True if this is a deleted or default constructor. """ open_paren = clean_lines.elided[linenum].find('(') if open_paren < 0: return False (close_line, _, close_paren) = CloseExpression( clean_lines, linenum, open_paren) if close_paren < 0: return False return Match(r'\s*=\s*(?:delete|default)\b', close_line[close_paren:]) def IsRValueAllowed(clean_lines, linenum): """Check if RValue reference is allowed on a particular line. Args: clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. Returns: True if line is within the region where RValue references are allowed. """ # Allow region marked by PUSH/POP macros for i in xrange(linenum, 0, -1): line = clean_lines.elided[i] if Match(r'GOOGLE_ALLOW_RVALUE_REFERENCES_(?:PUSH|POP)', line): if not line.endswith('PUSH'): return False for j in xrange(linenum, clean_lines.NumLines(), 1): line = clean_lines.elided[j] if Match(r'GOOGLE_ALLOW_RVALUE_REFERENCES_(?:PUSH|POP)', line): return line.endswith('POP') # Allow operator= line = clean_lines.elided[linenum] if Search(r'\boperator\s*=\s*\(', line): return IsDeletedOrDefault(clean_lines, linenum) # Allow constructors match = Match(r'\s*([\w<>]+)\s*::\s*([\w<>]+)\s*\(', line) if match and match.group(1) == match.group(2): return IsDeletedOrDefault(clean_lines, linenum) if Search(r'\b(?:explicit|inline)\s+[\w<>]+\s*\(', line): return IsDeletedOrDefault(clean_lines, linenum) if Match(r'\s*[\w<>]+\s*\(', line): previous_line = 'ReturnType' if linenum > 0: previous_line = clean_lines.elided[linenum - 1] if Match(r'^\s*$', previous_line) or Search(r'[{}:;]\s*$', previous_line): return IsDeletedOrDefault(clean_lines, linenum) return False def CheckRValueReference(filename, clean_lines, linenum, nesting_state, error): """Check for rvalue references. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. nesting_state: A NestingState instance which maintains information about the current stack of nested blocks being parsed. error: The function to call with any errors found. """ # Find lines missing spaces around &&. # TODO(unknown): currently we don't check for rvalue references # with spaces surrounding the && to avoid false positives with # boolean expressions. line = clean_lines.elided[linenum] match = Match(r'^(.*\S)&&', line) if not match: match = Match(r'(.*)&&\S', line) if (not match) or '(&&)' in line or Search(r'\boperator\s*$', match.group(1)): return # Either poorly formed && or an rvalue reference, check the context # to get a more accurate error message. Mostly we want to determine # if what's to the left of "&&" is a type or not. and_pos = len(match.group(1)) if IsRValueType(clean_lines, nesting_state, linenum, and_pos): if not IsRValueAllowed(clean_lines, linenum): error(filename, linenum, 'build/c++11', 3, 'RValue references are an unapproved C++ feature.') else: error(filename, linenum, 'whitespace/operators', 3, 'Missing spaces around &&') def CheckSectionSpacing(filename, clean_lines, class_info, linenum, error): """Checks for additional blank line issues related to sections. Currently the only thing checked here is blank line before protected/private. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. class_info: A _ClassInfo objects. linenum: The number of the line to check. error: The function to call with any errors found. """ # Skip checks if the class is small, where small means 25 lines or less. # 25 lines seems like a good cutoff since that's the usual height of # terminals, and any class that can't fit in one screen can't really # be considered "small". # # Also skip checks if we are on the first line. This accounts for # classes that look like # class Foo { public: ... }; # # If we didn't find the end of the class, last_line would be zero, # and the check will be skipped by the first condition. if (class_info.last_line - class_info.starting_linenum <= 24 or linenum <= class_info.starting_linenum): return matched = Match(r'\s*(public|protected|private):', clean_lines.lines[linenum]) if matched: # Issue warning if the line before public/protected/private was # not a blank line, but don't do this if the previous line contains # "class" or "struct". This can happen two ways: # - We are at the beginning of the class. # - We are forward-declaring an inner class that is semantically # private, but needed to be public for implementation reasons. # Also ignores cases where the previous line ends with a backslash as can be # common when defining classes in C macros. prev_line = clean_lines.lines[linenum - 1] if (not IsBlankLine(prev_line) and not Search(r'\b(class|struct)\b', prev_line) and not Search(r'\\$', prev_line)): # Try a bit harder to find the beginning of the class. This is to # account for multi-line base-specifier lists, e.g.: # class Derived # : public Base { end_class_head = class_info.starting_linenum for i in range(class_info.starting_linenum, linenum): if Search(r'\{\s*$', clean_lines.lines[i]): end_class_head = i break if end_class_head < linenum - 1: error(filename, linenum, 'whitespace/blank_line', 3, '"%s:" should be preceded by a blank line' % matched.group(1)) def GetPreviousNonBlankLine(clean_lines, linenum): """Return the most recent non-blank line and its line number. Args: clean_lines: A CleansedLines instance containing the file contents. linenum: The number of the line to check. Returns: A tuple with two elements. The first element is the contents of the last non-blank line before the current line, or the empty string if this is the first non-blank line. The second is the line number of that line, or -1 if this is the first non-blank line. """ prevlinenum = linenum - 1 while prevlinenum >= 0: prevline = clean_lines.elided[prevlinenum] if not IsBlankLine(prevline): # if not a blank line... return (prevline, prevlinenum) prevlinenum -= 1 return ('', -1) def CheckBraces(filename, clean_lines, linenum, error): """Looks for misplaced braces (e.g. at the end of line). Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # get rid of comments and strings if Match(r'\s*{\s*$', line): # We allow an open brace to start a line in the case where someone is using # braces in a block to explicitly create a new scope, which is commonly used # to control the lifetime of stack-allocated variables. Braces are also # used for brace initializers inside function calls. We don't detect this # perfectly: we just don't complain if the last non-whitespace character on # the previous non-blank line is ',', ';', ':', '(', '{', or '}', or if the # previous line starts a preprocessor block. prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0] if (not Search(r'[,;:}{(]\s*$', prevline) and not Match(r'\s*#', prevline)): error(filename, linenum, 'whitespace/braces', 4, '{ should almost always be at the end of the previous line') # An else clause should be on the same line as the preceding closing brace. if Match(r'\s*else\b\s*(?:if\b|\{|$)', line): prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0] if Match(r'\s*}\s*$', prevline): error(filename, linenum, 'whitespace/newline', 4, 'An else should appear on the same line as the preceding }') # If braces come on one side of an else, they should be on both. # However, we have to worry about "else if" that spans multiple lines! if Search(r'else if\s*\(', line): # could be multi-line if brace_on_left = bool(Search(r'}\s*else if\s*\(', line)) # find the ( after the if pos = line.find('else if') pos = line.find('(', pos) if pos > 0: (endline, _, endpos) = CloseExpression(clean_lines, linenum, pos) brace_on_right = endline[endpos:].find('{') != -1 if brace_on_left != brace_on_right: # must be brace after if error(filename, linenum, 'readability/braces', 5, 'If an else has a brace on one side, it should have it on both') elif Search(r'}\s*else[^{]*$', line) or Match(r'[^}]*else\s*{', line): error(filename, linenum, 'readability/braces', 5, 'If an else has a brace on one side, it should have it on both') # Likewise, an else should never have the else clause on the same line if Search(r'\belse [^\s{]', line) and not Search(r'\belse if\b', line): error(filename, linenum, 'whitespace/newline', 4, 'Else clause should never be on same line as else (use 2 lines)') # In the same way, a do/while should never be on one line if Match(r'\s*do [^\s{]', line): error(filename, linenum, 'whitespace/newline', 4, 'do/while clauses should not be on a single line') # Check single-line if/else bodies. The style guide says 'curly braces are not # required for single-line statements'. We additionally allow multi-line, # single statements, but we reject anything with more than one semicolon in # it. This means that the first semicolon after the if should be at the end of # its line, and the line after that should have an indent level equal to or # lower than the if. We also check for ambiguous if/else nesting without # braces. if_else_match = Search(r'\b(if\s*\(|else\b)', line) if if_else_match and not Match(r'\s*#', line): if_indent = GetIndentLevel(line) endline, endlinenum, endpos = line, linenum, if_else_match.end() if_match = Search(r'\bif\s*\(', line) if if_match: # This could be a multiline if condition, so find the end first. pos = if_match.end() - 1 (endline, endlinenum, endpos) = CloseExpression(clean_lines, linenum, pos) # Check for an opening brace, either directly after the if or on the next # line. If found, this isn't a single-statement conditional. if (not Match(r'\s*{', endline[endpos:]) and not (Match(r'\s*$', endline[endpos:]) and endlinenum < (len(clean_lines.elided) - 1) and Match(r'\s*{', clean_lines.elided[endlinenum + 1]))): while (endlinenum < len(clean_lines.elided) and ';' not in clean_lines.elided[endlinenum][endpos:]): endlinenum += 1 endpos = 0 if endlinenum < len(clean_lines.elided): endline = clean_lines.elided[endlinenum] # We allow a mix of whitespace and closing braces (e.g. for one-liner # methods) and a single \ after the semicolon (for macros) endpos = endline.find(';') if not Match(r';[\s}]*(\\?)$', endline[endpos:]): # Semicolon isn't the last character, there's something trailing. # Output a warning if the semicolon is not contained inside # a lambda expression. if not Match(r'^[^{};]*\[[^\[\]]*\][^{}]*\{[^{}]*\}\s*\)*[;,]\s*$', endline): error(filename, linenum, 'readability/braces', 4, 'If/else bodies with multiple statements require braces') elif endlinenum < len(clean_lines.elided) - 1: # Make sure the next line is dedented next_line = clean_lines.elided[endlinenum + 1] next_indent = GetIndentLevel(next_line) # With ambiguous nested if statements, this will error out on the # if that *doesn't* match the else, regardless of whether it's the # inner one or outer one. if (if_match and Match(r'\s*else\b', next_line) and next_indent != if_indent): error(filename, linenum, 'readability/braces', 4, 'Else clause should be indented at the same level as if. ' 'Ambiguous nested if/else chains require braces.') elif next_indent > if_indent: error(filename, linenum, 'readability/braces', 4, 'If/else bodies with multiple statements require braces') def CheckTrailingSemicolon(filename, clean_lines, linenum, error): """Looks for redundant trailing semicolon. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # Block bodies should not be followed by a semicolon. Due to C++11 # brace initialization, there are more places where semicolons are # required than not, so we use a whitelist approach to check these # rather than a blacklist. These are the places where "};" should # be replaced by just "}": # 1. Some flavor of block following closing parenthesis: # for (;;) {}; # while (...) {}; # switch (...) {}; # Function(...) {}; # if (...) {}; # if (...) else if (...) {}; # # 2. else block: # if (...) else {}; # # 3. const member function: # Function(...) const {}; # # 4. Block following some statement: # x = 42; # {}; # # 5. Block at the beginning of a function: # Function(...) { # {}; # } # # Note that naively checking for the preceding "{" will also match # braces inside multi-dimensional arrays, but this is fine since # that expression will not contain semicolons. # # 6. Block following another block: # while (true) {} # {}; # # 7. End of namespaces: # namespace {}; # # These semicolons seems far more common than other kinds of # redundant semicolons, possibly due to people converting classes # to namespaces. For now we do not warn for this case. # # Try matching case 1 first. match = Match(r'^(.*\)\s*)\{', line) if match: # Matched closing parenthesis (case 1). Check the token before the # matching opening parenthesis, and don't warn if it looks like a # macro. This avoids these false positives: # - macro that defines a base class # - multi-line macro that defines a base class # - macro that defines the whole class-head # # But we still issue warnings for macros that we know are safe to # warn, specifically: # - TEST, TEST_F, TEST_P, MATCHER, MATCHER_P # - TYPED_TEST # - INTERFACE_DEF # - EXCLUSIVE_LOCKS_REQUIRED, SHARED_LOCKS_REQUIRED, LOCKS_EXCLUDED: # # We implement a whitelist of safe macros instead of a blacklist of # unsafe macros, even though the latter appears less frequently in # google code and would have been easier to implement. This is because # the downside for getting the whitelist wrong means some extra # semicolons, while the downside for getting the blacklist wrong # would result in compile errors. # # In addition to macros, we also don't want to warn on compound # literals and lambdas. closing_brace_pos = match.group(1).rfind(')') opening_parenthesis = ReverseCloseExpression( clean_lines, linenum, closing_brace_pos) if opening_parenthesis[2] > -1: line_prefix = opening_parenthesis[0][0:opening_parenthesis[2]] macro = Search(r'\b([A-Z_]+)\s*$', line_prefix) func = Match(r'^(.*\])\s*$', line_prefix) if ((macro and macro.group(1) not in ( 'TEST', 'TEST_F', 'MATCHER', 'MATCHER_P', 'TYPED_TEST', 'EXCLUSIVE_LOCKS_REQUIRED', 'SHARED_LOCKS_REQUIRED', 'LOCKS_EXCLUDED', 'INTERFACE_DEF')) or (func and not Search(r'\boperator\s*\[\s*\]', func.group(1))) or Search(r'\s+=\s*$', line_prefix)): match = None if (match and opening_parenthesis[1] > 1 and Search(r'\]\s*$', clean_lines.elided[opening_parenthesis[1] - 1])): # Multi-line lambda-expression match = None else: # Try matching cases 2-3. match = Match(r'^(.*(?:else|\)\s*const)\s*)\{', line) if not match: # Try matching cases 4-6. These are always matched on separate lines. # # Note that we can't simply concatenate the previous line to the # current line and do a single match, otherwise we may output # duplicate warnings for the blank line case: # if (cond) { # // blank line # } prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0] if prevline and Search(r'[;{}]\s*$', prevline): match = Match(r'^(\s*)\{', line) # Check matching closing brace if match: (endline, endlinenum, endpos) = CloseExpression( clean_lines, linenum, len(match.group(1))) if endpos > -1 and Match(r'^\s*;', endline[endpos:]): # Current {} pair is eligible for semicolon check, and we have found # the redundant semicolon, output warning here. # # Note: because we are scanning forward for opening braces, and # outputting warnings for the matching closing brace, if there are # nested blocks with trailing semicolons, we will get the error # messages in reversed order. error(filename, endlinenum, 'readability/braces', 4, "You don't need a ; after a }") def CheckEmptyBlockBody(filename, clean_lines, linenum, error): """Look for empty loop/conditional body with only a single semicolon. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ # Search for loop keywords at the beginning of the line. Because only # whitespaces are allowed before the keywords, this will also ignore most # do-while-loops, since those lines should start with closing brace. # # We also check "if" blocks here, since an empty conditional block # is likely an error. line = clean_lines.elided[linenum] matched = Match(r'\s*(for|while|if)\s*\(', line) if matched: # Find the end of the conditional expression (end_line, end_linenum, end_pos) = CloseExpression( clean_lines, linenum, line.find('(')) # Output warning if what follows the condition expression is a semicolon. # No warning for all other cases, including whitespace or newline, since we # have a separate check for semicolons preceded by whitespace. if end_pos >= 0 and Match(r';', end_line[end_pos:]): if matched.group(1) == 'if': error(filename, end_linenum, 'whitespace/empty_conditional_body', 5, 'Empty conditional bodies should use {}') else: error(filename, end_linenum, 'whitespace/empty_loop_body', 5, 'Empty loop bodies should use {} or continue') def FindCheckMacro(line): """Find a replaceable CHECK-like macro. Args: line: line to search on. Returns: (macro name, start position), or (None, -1) if no replaceable macro is found. """ for macro in _CHECK_MACROS: i = line.find(macro) if i >= 0: # Find opening parenthesis. Do a regular expression match here # to make sure that we are matching the expected CHECK macro, as # opposed to some other macro that happens to contain the CHECK # substring. matched = Match(r'^(.*\b' + macro + r'\s*)\(', line) if not matched: continue return (macro, len(matched.group(1))) return (None, -1) def CheckCheck(filename, clean_lines, linenum, error): """Checks the use of CHECK and EXPECT macros. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ # Decide the set of replacement macros that should be suggested lines = clean_lines.elided (check_macro, start_pos) = FindCheckMacro(lines[linenum]) if not check_macro: return # Find end of the boolean expression by matching parentheses (last_line, end_line, end_pos) = CloseExpression( clean_lines, linenum, start_pos) if end_pos < 0: return # If the check macro is followed by something other than a # semicolon, assume users will log their own custom error messages # and don't suggest any replacements. if not Match(r'\s*;', last_line[end_pos:]): return if linenum == end_line: expression = lines[linenum][start_pos + 1:end_pos - 1] else: expression = lines[linenum][start_pos + 1:] for i in xrange(linenum + 1, end_line): expression += lines[i] expression += last_line[0:end_pos - 1] # Parse expression so that we can take parentheses into account. # This avoids false positives for inputs like "CHECK((a < 4) == b)", # which is not replaceable by CHECK_LE. lhs = '' rhs = '' operator = None while expression: matched = Match(r'^\s*(<<|<<=|>>|>>=|->\*|->|&&|\|\||' r'==|!=|>=|>|<=|<|\()(.*)$', expression) if matched: token = matched.group(1) if token == '(': # Parenthesized operand expression = matched.group(2) (end, _) = FindEndOfExpressionInLine(expression, 0, ['(']) if end < 0: return # Unmatched parenthesis lhs += '(' + expression[0:end] expression = expression[end:] elif token in ('&&', '||'): # Logical and/or operators. This means the expression # contains more than one term, for example: # CHECK(42 < a && a < b); # # These are not replaceable with CHECK_LE, so bail out early. return elif token in ('<<', '<<=', '>>', '>>=', '->*', '->'): # Non-relational operator lhs += token expression = matched.group(2) else: # Relational operator operator = token rhs = matched.group(2) break else: # Unparenthesized operand. Instead of appending to lhs one character # at a time, we do another regular expression match to consume several # characters at once if possible. Trivial benchmark shows that this # is more efficient when the operands are longer than a single # character, which is generally the case. matched = Match(r'^([^-=!<>()&|]+)(.*)$', expression) if not matched: matched = Match(r'^(\s*\S)(.*)$', expression) if not matched: break lhs += matched.group(1) expression = matched.group(2) # Only apply checks if we got all parts of the boolean expression if not (lhs and operator and rhs): return # Check that rhs do not contain logical operators. We already know # that lhs is fine since the loop above parses out && and ||. if rhs.find('&&') > -1 or rhs.find('||') > -1: return # At least one of the operands must be a constant literal. This is # to avoid suggesting replacements for unprintable things like # CHECK(variable != iterator) # # The following pattern matches decimal, hex integers, strings, and # characters (in that order). lhs = lhs.strip() rhs = rhs.strip() match_constant = r'^([-+]?(\d+|0[xX][0-9a-fA-F]+)[lLuU]{0,3}|".*"|\'.*\')$' if Match(match_constant, lhs) or Match(match_constant, rhs): # Note: since we know both lhs and rhs, we can provide a more # descriptive error message like: # Consider using CHECK_EQ(x, 42) instead of CHECK(x == 42) # Instead of: # Consider using CHECK_EQ instead of CHECK(a == b) # # We are still keeping the less descriptive message because if lhs # or rhs gets long, the error message might become unreadable. error(filename, linenum, 'readability/check', 2, 'Consider using %s instead of %s(a %s b)' % ( _CHECK_REPLACEMENT[check_macro][operator], check_macro, operator)) def CheckAltTokens(filename, clean_lines, linenum, error): """Check alternative keywords being used in boolean expressions. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # Avoid preprocessor lines if Match(r'^\s*#', line): return # Last ditch effort to avoid multi-line comments. This will not help # if the comment started before the current line or ended after the # current line, but it catches most of the false positives. At least, # it provides a way to workaround this warning for people who use # multi-line comments in preprocessor macros. # # TODO(unknown): remove this once cpplint has better support for # multi-line comments. if line.find('/*') >= 0 or line.find('*/') >= 0: return for match in _ALT_TOKEN_REPLACEMENT_PATTERN.finditer(line): error(filename, linenum, 'readability/alt_tokens', 2, 'Use operator %s instead of %s' % ( _ALT_TOKEN_REPLACEMENT[match.group(1)], match.group(1))) def GetLineWidth(line): """Determines the width of the line in column positions. Args: line: A string, which may be a Unicode string. Returns: The width of the line in column positions, accounting for Unicode combining characters and wide characters. """ if isinstance(line, unicode): width = 0 for uc in unicodedata.normalize('NFC', line): if unicodedata.east_asian_width(uc) in ('W', 'F'): width += 2 elif not unicodedata.combining(uc): width += 1 return width else: return len(line) def CheckStyle(filename, clean_lines, linenum, file_extension, nesting_state, error): """Checks rules from the 'C++ style rules' section of cppguide.html. Most of these rules are hard to test (naming, comment style), but we do what we can. In particular we check for 2-space indents, line lengths, tab usage, spaces inside code, etc. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. file_extension: The extension (without the dot) of the filename. nesting_state: A NestingState instance which maintains information about the current stack of nested blocks being parsed. error: The function to call with any errors found. """ # Don't use "elided" lines here, otherwise we can't check commented lines. # Don't want to use "raw" either, because we don't want to check inside C++11 # raw strings, raw_lines = clean_lines.lines_without_raw_strings line = raw_lines[linenum] if line.find('\t') != -1: error(filename, linenum, 'whitespace/tab', 1, 'Tab found; better to use spaces') # One or three blank spaces at the beginning of the line is weird; it's # hard to reconcile that with 2-space indents. # NOTE: here are the conditions rob pike used for his tests. Mine aren't # as sophisticated, but it may be worth becoming so: RLENGTH==initial_spaces # if(RLENGTH > 20) complain = 0; # if(match($0, " +(error|private|public|protected):")) complain = 0; # if(match(prev, "&& *$")) complain = 0; # if(match(prev, "\\|\\| *$")) complain = 0; # if(match(prev, "[\",=><] *$")) complain = 0; # if(match($0, " <<")) complain = 0; # if(match(prev, " +for \\(")) complain = 0; # if(prevodd && match(prevprev, " +for \\(")) complain = 0; scope_or_label_pattern = r'\s*\w+\s*:\s*\\?$' scope_or_label_pattern2 = r'\s*\w+\s*\w+:\s*\\?$' classinfo = nesting_state.InnermostClass() initial_spaces = 0 cleansed_line = clean_lines.elided[linenum] while initial_spaces < len(line) and line[initial_spaces] == ' ': initial_spaces += 1 if line and line[-1].isspace(): error(filename, linenum, 'whitespace/end_of_line', 4, 'Line ends in whitespace. Consider deleting these extra spaces.') # There are certain situations we allow one space, notably for # section labels, and also lines containing multi-line raw strings. elif ((initial_spaces == 1 or initial_spaces == 3) and not (Match(scope_or_label_pattern, cleansed_line) or Match(scope_or_label_pattern2, cleansed_line)) and not (clean_lines.raw_lines[linenum] != line and Match(r'^\s*""', line))): error(filename, linenum, 'whitespace/indent', 3, 'Weird number of spaces at line-start. ' 'Are you using a 2-space indent?') # Check if the line is a header guard. is_header_guard = False if file_extension == 'h': cppvar = GetHeaderGuardCPPVariable(filename) if (line.startswith('#ifndef %s' % cppvar) or line.startswith('#define %s' % cppvar) or line.startswith('#endif // %s' % cppvar)): is_header_guard = True # #include lines and header guards can be long, since there's no clean way to # split them. # # URLs can be long too. It's possible to split these, but it makes them # harder to cut&paste. # # The "$Id:...$" comment may also get very long without it being the # developers fault. if (not line.startswith('#include') and not is_header_guard and not Match(r'^\s*//.*http(s?)://\S*$', line) and not Match(r'^// \$Id:.*#[0-9]+ \$$', line)): line_width = GetLineWidth(line) extended_length = int((_line_length * 1.25)) if line_width > extended_length: error(filename, linenum, 'whitespace/line_length', 4, 'Lines should very rarely be longer than %i characters' % extended_length) elif line_width > _line_length: error(filename, linenum, 'whitespace/line_length', 2, 'Lines should be <= %i characters long' % _line_length) if (cleansed_line.count(';') > 1 and # for loops are allowed two ;'s (and may run over two lines). cleansed_line.find('for') == -1 and (GetPreviousNonBlankLine(clean_lines, linenum)[0].find('for') == -1 or GetPreviousNonBlankLine(clean_lines, linenum)[0].find(';') != -1) and # It's ok to have many commands in a switch case that fits in 1 line not ((cleansed_line.find('case ') != -1 or cleansed_line.find('default:') != -1) and cleansed_line.find('break;') != -1)): error(filename, linenum, 'whitespace/newline', 0, 'More than one command on the same line') # Some more style checks CheckBraces(filename, clean_lines, linenum, error) CheckTrailingSemicolon(filename, clean_lines, linenum, error) CheckEmptyBlockBody(filename, clean_lines, linenum, error) CheckAccess(filename, clean_lines, linenum, nesting_state, error) CheckSpacing(filename, clean_lines, linenum, nesting_state, error) CheckOperatorSpacing(filename, clean_lines, linenum, error) CheckParenthesisSpacing(filename, clean_lines, linenum, error) CheckCommaSpacing(filename, clean_lines, linenum, error) CheckBracesSpacing(filename, clean_lines, linenum, error) CheckSpacingForFunctionCall(filename, clean_lines, linenum, error) CheckRValueReference(filename, clean_lines, linenum, nesting_state, error) CheckCheck(filename, clean_lines, linenum, error) CheckAltTokens(filename, clean_lines, linenum, error) classinfo = nesting_state.InnermostClass() if classinfo: CheckSectionSpacing(filename, clean_lines, classinfo, linenum, error) _RE_PATTERN_INCLUDE = re.compile(r'^\s*#\s*include\s*([<"])([^>"]*)[>"].*$') # Matches the first component of a filename delimited by -s and _s. That is: # _RE_FIRST_COMPONENT.match('foo').group(0) == 'foo' # _RE_FIRST_COMPONENT.match('foo.cc').group(0) == 'foo' # _RE_FIRST_COMPONENT.match('foo-bar_baz.cc').group(0) == 'foo' # _RE_FIRST_COMPONENT.match('foo_bar-baz.cc').group(0) == 'foo' _RE_FIRST_COMPONENT = re.compile(r'^[^-_.]+') def _DropCommonSuffixes(filename): """Drops common suffixes like _test.cc or -inl.h from filename. For example: >>> _DropCommonSuffixes('foo/foo-inl.h') 'foo/foo' >>> _DropCommonSuffixes('foo/bar/foo.cc') 'foo/bar/foo' >>> _DropCommonSuffixes('foo/foo_internal.h') 'foo/foo' >>> _DropCommonSuffixes('foo/foo_unusualinternal.h') 'foo/foo_unusualinternal' Args: filename: The input filename. Returns: The filename with the common suffix removed. """ for suffix in ('test.cc', 'regtest.cc', 'unittest.cc', 'inl.h', 'impl.h', 'internal.h'): if (filename.endswith(suffix) and len(filename) > len(suffix) and filename[-len(suffix) - 1] in ('-', '_')): return filename[:-len(suffix) - 1] return os.path.splitext(filename)[0] def _IsTestFilename(filename): """Determines if the given filename has a suffix that identifies it as a test. Args: filename: The input filename. Returns: True if 'filename' looks like a test, False otherwise. """ if (filename.endswith('_test.cc') or filename.endswith('_unittest.cc') or filename.endswith('_regtest.cc')): return True else: return False def _ClassifyInclude(fileinfo, include, is_system): """Figures out what kind of header 'include' is. Args: fileinfo: The current file cpplint is running over. A FileInfo instance. include: The path to a #included file. is_system: True if the #include used <> rather than "". Returns: One of the _XXX_HEADER constants. For example: >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'stdio.h', True) _C_SYS_HEADER >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'string', True) _CPP_SYS_HEADER >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'foo/foo.h', False) _LIKELY_MY_HEADER >>> _ClassifyInclude(FileInfo('foo/foo_unknown_extension.cc'), ... 'bar/foo_other_ext.h', False) _POSSIBLE_MY_HEADER >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'foo/bar.h', False) _OTHER_HEADER """ # This is a list of all standard c++ header files, except # those already checked for above. is_cpp_h = include in _CPP_HEADERS if is_system: if is_cpp_h: return _CPP_SYS_HEADER else: return _C_SYS_HEADER # If the target file and the include we're checking share a # basename when we drop common extensions, and the include # lives in . , then it's likely to be owned by the target file. target_dir, target_base = ( os.path.split(_DropCommonSuffixes(fileinfo.RepositoryName()))) include_dir, include_base = os.path.split(_DropCommonSuffixes(include)) if target_base == include_base and ( include_dir == target_dir or include_dir == os.path.normpath(target_dir + '/../public')): return _LIKELY_MY_HEADER # If the target and include share some initial basename # component, it's possible the target is implementing the # include, so it's allowed to be first, but we'll never # complain if it's not there. target_first_component = _RE_FIRST_COMPONENT.match(target_base) include_first_component = _RE_FIRST_COMPONENT.match(include_base) if (target_first_component and include_first_component and target_first_component.group(0) == include_first_component.group(0)): return _POSSIBLE_MY_HEADER return _OTHER_HEADER def CheckIncludeLine(filename, clean_lines, linenum, include_state, error): """Check rules that are applicable to #include lines. Strings on #include lines are NOT removed from elided line, to make certain tasks easier. However, to prevent false positives, checks applicable to #include lines in CheckLanguage must be put here. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. include_state: An _IncludeState instance in which the headers are inserted. error: The function to call with any errors found. """ fileinfo = FileInfo(filename) line = clean_lines.lines[linenum] # "include" should use the new style "foo/bar.h" instead of just "bar.h" # Only do this check if the included header follows google naming # conventions. If not, assume that it's a 3rd party API that # requires special include conventions. # # We also make an exception for Lua headers, which follow google # naming convention but not the include convention. match = Match(r'#include\s*"([^/]+\.h)"', line) if match and not _THIRD_PARTY_HEADERS_PATTERN.match(match.group(1)): error(filename, linenum, 'build/include', 4, 'Include the directory when naming .h files') # we shouldn't include a file more than once. actually, there are a # handful of instances where doing so is okay, but in general it's # not. match = _RE_PATTERN_INCLUDE.search(line) if match: include = match.group(2) is_system = (match.group(1) == '<') duplicate_line = include_state.FindHeader(include) if duplicate_line >= 0: error(filename, linenum, 'build/include', 4, '"%s" already included at %s:%s' % (include, filename, duplicate_line)) elif not _THIRD_PARTY_HEADERS_PATTERN.match(include): include_state.include_list[-1].append((include, linenum)) # We want to ensure that headers appear in the right order: # 1) for foo.cc, foo.h (preferred location) # 2) c system files # 3) cpp system files # 4) for foo.cc, foo.h (deprecated location) # 5) other google headers # # We classify each include statement as one of those 5 types # using a number of techniques. The include_state object keeps # track of the highest type seen, and complains if we see a # lower type after that. error_message = include_state.CheckNextIncludeOrder( _ClassifyInclude(fileinfo, include, is_system)) if error_message: error(filename, linenum, 'build/include_order', 4, '%s. Should be: %s.h, c system, c++ system, other.' % (error_message, fileinfo.BaseName())) canonical_include = include_state.CanonicalizeAlphabeticalOrder(include) if not include_state.IsInAlphabeticalOrder( clean_lines, linenum, canonical_include): error(filename, linenum, 'build/include_alpha', 4, 'Include "%s" not in alphabetical order' % include) include_state.SetLastHeader(canonical_include) # Look for any of the stream classes that are part of standard C++. match = _RE_PATTERN_INCLUDE.match(line) if match: include = match.group(2) if Match(r'(f|ind|io|i|o|parse|pf|stdio|str|)?stream$', include): # Many unit tests use cout, so we exempt them. if not _IsTestFilename(filename): # Suggest a different header for ostream if include == 'ostream': error(filename, linenum, 'readability/streams', 3, 'For logging, include "base/logging.h" instead of .') else: error(filename, linenum, 'readability/streams', 3, 'Streams are highly discouraged.') def _GetTextInside(text, start_pattern): r"""Retrieves all the text between matching open and close parentheses. Given a string of lines and a regular expression string, retrieve all the text following the expression and between opening punctuation symbols like (, [, or {, and the matching close-punctuation symbol. This properly nested occurrences of the punctuations, so for the text like printf(a(), b(c())); a call to _GetTextInside(text, r'printf\(') will return 'a(), b(c())'. start_pattern must match string having an open punctuation symbol at the end. Args: text: The lines to extract text. Its comments and strings must be elided. It can be single line and can span multiple lines. start_pattern: The regexp string indicating where to start extracting the text. Returns: The extracted text. None if either the opening string or ending punctuation could not be found. """ # TODO(unknown): Audit cpplint.py to see what places could be profitably # rewritten to use _GetTextInside (and use inferior regexp matching today). # Give opening punctuations to get the matching close-punctuations. matching_punctuation = {'(': ')', '{': '}', '[': ']'} closing_punctuation = set(matching_punctuation.itervalues()) # Find the position to start extracting text. match = re.search(start_pattern, text, re.M) if not match: # start_pattern not found in text. return None start_position = match.end(0) assert start_position > 0, ( 'start_pattern must ends with an opening punctuation.') assert text[start_position - 1] in matching_punctuation, ( 'start_pattern must ends with an opening punctuation.') # Stack of closing punctuations we expect to have in text after position. punctuation_stack = [matching_punctuation[text[start_position - 1]]] position = start_position while punctuation_stack and position < len(text): if text[position] == punctuation_stack[-1]: punctuation_stack.pop() elif text[position] in closing_punctuation: # A closing punctuation without matching opening punctuations. return None elif text[position] in matching_punctuation: punctuation_stack.append(matching_punctuation[text[position]]) position += 1 if punctuation_stack: # Opening punctuations left without matching close-punctuations. return None # punctuations match. return text[start_position:position - 1] # Patterns for matching call-by-reference parameters. # # Supports nested templates up to 2 levels deep using this messy pattern: # < (?: < (?: < [^<>]* # > # | [^<>] )* # > # | [^<>] )* # > _RE_PATTERN_IDENT = r'[_a-zA-Z]\w*' # =~ [[:alpha:]][[:alnum:]]* _RE_PATTERN_TYPE = ( r'(?:const\s+)?(?:typename\s+|class\s+|struct\s+|union\s+|enum\s+)?' r'(?:\w|' r'\s*<(?:<(?:<[^<>]*>|[^<>])*>|[^<>])*>|' r'::)+') # A call-by-reference parameter ends with '& identifier'. _RE_PATTERN_REF_PARAM = re.compile( r'(' + _RE_PATTERN_TYPE + r'(?:\s*(?:\bconst\b|[*]))*\s*' r'&\s*' + _RE_PATTERN_IDENT + r')\s*(?:=[^,()]+)?[,)]') # A call-by-const-reference parameter either ends with 'const& identifier' # or looks like 'const type& identifier' when 'type' is atomic. _RE_PATTERN_CONST_REF_PARAM = ( r'(?:.*\s*\bconst\s*&\s*' + _RE_PATTERN_IDENT + r'|const\s+' + _RE_PATTERN_TYPE + r'\s*&\s*' + _RE_PATTERN_IDENT + r')') def CheckLanguage(filename, clean_lines, linenum, file_extension, include_state, nesting_state, error): """Checks rules from the 'C++ language rules' section of cppguide.html. Some of these rules are hard to test (function overloading, using uint32 inappropriately), but we do the best we can. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. file_extension: The extension (without the dot) of the filename. include_state: An _IncludeState instance in which the headers are inserted. nesting_state: A NestingState instance which maintains information about the current stack of nested blocks being parsed. error: The function to call with any errors found. """ # If the line is empty or consists of entirely a comment, no need to # check it. line = clean_lines.elided[linenum] if not line: return match = _RE_PATTERN_INCLUDE.search(line) if match: CheckIncludeLine(filename, clean_lines, linenum, include_state, error) return # Reset include state across preprocessor directives. This is meant # to silence warnings for conditional includes. match = Match(r'^\s*#\s*(if|ifdef|ifndef|elif|else|endif)\b', line) if match: include_state.ResetSection(match.group(1)) # Make Windows paths like Unix. fullname = os.path.abspath(filename).replace('\\', '/') # Perform other checks now that we are sure that this is not an include line CheckCasts(filename, clean_lines, linenum, error) CheckGlobalStatic(filename, clean_lines, linenum, error) CheckPrintf(filename, clean_lines, linenum, error) if file_extension == 'h': # TODO(unknown): check that 1-arg constructors are explicit. # How to tell it's a constructor? # (handled in CheckForNonStandardConstructs for now) # TODO(unknown): check that classes declare or disable copy/assign # (level 1 error) pass # Check if people are using the verboten C basic types. The only exception # we regularly allow is "unsigned short port" for port. if Search(r'\bshort port\b', line): if not Search(r'\bunsigned short port\b', line): error(filename, linenum, 'runtime/int', 4, 'Use "unsigned short" for ports, not "short"') else: match = Search(r'\b(short|long(?! +double)|long long)\b', line) if match: error(filename, linenum, 'runtime/int', 4, 'Use int16/int64/etc, rather than the C type %s' % match.group(1)) # Check if some verboten operator overloading is going on # TODO(unknown): catch out-of-line unary operator&: # class X {}; # int operator&(const X& x) { return 42; } // unary operator& # The trick is it's hard to tell apart from binary operator&: # class Y { int operator&(const Y& x) { return 23; } }; // binary operator& if Search(r'\boperator\s*&\s*\(\s*\)', line): error(filename, linenum, 'runtime/operator', 4, 'Unary operator& is dangerous. Do not use it.') # Check for suspicious usage of "if" like # } if (a == b) { if Search(r'\}\s*if\s*\(', line): error(filename, linenum, 'readability/braces', 4, 'Did you mean "else if"? If not, start a new line for "if".') # Check for potential format string bugs like printf(foo). # We constrain the pattern not to pick things like DocidForPrintf(foo). # Not perfect but it can catch printf(foo.c_str()) and printf(foo->c_str()) # TODO(unknown): Catch the following case. Need to change the calling # convention of the whole function to process multiple line to handle it. # printf( # boy_this_is_a_really_long_variable_that_cannot_fit_on_the_prev_line); printf_args = _GetTextInside(line, r'(?i)\b(string)?printf\s*\(') if printf_args: match = Match(r'([\w.\->()]+)$', printf_args) if match and match.group(1) != '__VA_ARGS__': function_name = re.search(r'\b((?:string)?printf)\s*\(', line, re.I).group(1) error(filename, linenum, 'runtime/printf', 4, 'Potential format string bug. Do %s("%%s", %s) instead.' % (function_name, match.group(1))) # Check for potential memset bugs like memset(buf, sizeof(buf), 0). match = Search(r'memset\s*\(([^,]*),\s*([^,]*),\s*0\s*\)', line) if match and not Match(r"^''|-?[0-9]+|0x[0-9A-Fa-f]$", match.group(2)): error(filename, linenum, 'runtime/memset', 4, 'Did you mean "memset(%s, 0, %s)"?' % (match.group(1), match.group(2))) if Search(r'\busing namespace\b', line): error(filename, linenum, 'build/namespaces', 5, 'Do not use namespace using-directives. ' 'Use using-declarations instead.') # Detect variable-length arrays. match = Match(r'\s*(.+::)?(\w+) [a-z]\w*\[(.+)];', line) if (match and match.group(2) != 'return' and match.group(2) != 'delete' and match.group(3).find(']') == -1): # Split the size using space and arithmetic operators as delimiters. # If any of the resulting tokens are not compile time constants then # report the error. tokens = re.split(r'\s|\+|\-|\*|\/|<<|>>]', match.group(3)) is_const = True skip_next = False for tok in tokens: if skip_next: skip_next = False continue if Search(r'sizeof\(.+\)', tok): continue if Search(r'arraysize\(\w+\)', tok): continue tok = tok.lstrip('(') tok = tok.rstrip(')') if not tok: continue if Match(r'\d+', tok): continue if Match(r'0[xX][0-9a-fA-F]+', tok): continue if Match(r'k[A-Z0-9]\w*', tok): continue if Match(r'(.+::)?k[A-Z0-9]\w*', tok): continue if Match(r'(.+::)?[A-Z][A-Z0-9_]*', tok): continue # A catch all for tricky sizeof cases, including 'sizeof expression', # 'sizeof(*type)', 'sizeof(const type)', 'sizeof(struct StructName)' # requires skipping the next token because we split on ' ' and '*'. if tok.startswith('sizeof'): skip_next = True continue is_const = False break if not is_const: error(filename, linenum, 'runtime/arrays', 1, 'Do not use variable-length arrays. Use an appropriately named ' "('k' followed by CamelCase) compile-time constant for the size.") # If DISALLOW_COPY_AND_ASSIGN DISALLOW_IMPLICIT_CONSTRUCTORS is present, # then it should be the last thing in the class declaration. match = Match( (r'\s*' r'(DISALLOW_(COPY_AND_ASSIGN|IMPLICIT_CONSTRUCTORS))' r'\(.*\);$'), line) if match and linenum + 1 < clean_lines.NumLines(): next_line = clean_lines.elided[linenum + 1] # We allow some, but not all, declarations of variables to be present # in the statement that defines the class. The [\w\*,\s]* fragment of # the regular expression below allows users to declare instances of # the class or pointers to instances, but not less common types such # as function pointers or arrays. It's a tradeoff between allowing # reasonable code and avoiding trying to parse more C++ using regexps. if not Search(r'^\s*}[\w\*,\s]*;', next_line): error(filename, linenum, 'readability/constructors', 3, match.group(1) + ' should be the last thing in the class') # Check for use of unnamed namespaces in header files. Registration # macros are typically OK, so we allow use of "namespace {" on lines # that end with backslashes. if (file_extension == 'h' and Search(r'\bnamespace\s*{', line) and line[-1] != '\\'): error(filename, linenum, 'build/namespaces', 4, 'Do not use unnamed namespaces in header files. See ' 'http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Namespaces' ' for more information.') def CheckGlobalStatic(filename, clean_lines, linenum, error): """Check for unsafe global or static objects. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # Match two lines at a time to support multiline declarations if linenum + 1 < clean_lines.NumLines() and not Search(r'[;({]', line): line += clean_lines.elided[linenum + 1].strip() # Check for people declaring static/global STL strings at the top level. # This is dangerous because the C++ language does not guarantee that # globals with constructors are initialized before the first access. match = Match( r'((?:|static +)(?:|const +))string +([a-zA-Z0-9_:]+)\b(.*)', line) # Remove false positives: # - String pointers (as opposed to values). # string *pointer # const string *pointer # string const *pointer # string *const pointer # # - Functions and template specializations. # string Function(... # string Class::Method(... # # - Operators. These are matched separately because operator names # cross non-word boundaries, and trying to match both operators # and functions at the same time would decrease accuracy of # matching identifiers. # string Class::operator*() if (match and not Search(r'\bstring\b(\s+const)?\s*\*\s*(const\s+)?\w', line) and not Search(r'\boperator\W', line) and not Match(r'\s*(<.*>)?(::[a-zA-Z0-9_]+)*\s*\(([^"]|$)', match.group(3))): error(filename, linenum, 'runtime/string', 4, 'For a static/global string constant, use a C style string instead: ' '"%schar %s[]".' % (match.group(1), match.group(2))) if Search(r'\b([A-Za-z0-9_]*_)\(\1\)', line): error(filename, linenum, 'runtime/init', 4, 'You seem to be initializing a member variable with itself.') def CheckPrintf(filename, clean_lines, linenum, error): """Check for printf related issues. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # When snprintf is used, the second argument shouldn't be a literal. match = Search(r'snprintf\s*\(([^,]*),\s*([0-9]*)\s*,', line) if match and match.group(2) != '0': # If 2nd arg is zero, snprintf is used to calculate size. error(filename, linenum, 'runtime/printf', 3, 'If you can, use sizeof(%s) instead of %s as the 2nd arg ' 'to snprintf.' % (match.group(1), match.group(2))) # Check if some verboten C functions are being used. if Search(r'\bsprintf\s*\(', line): error(filename, linenum, 'runtime/printf', 5, 'Never use sprintf. Use snprintf instead.') match = Search(r'\b(strcpy|strcat)\s*\(', line) if match: error(filename, linenum, 'runtime/printf', 4, 'Almost always, snprintf is better than %s' % match.group(1)) def IsDerivedFunction(clean_lines, linenum): """Check if current line contains an inherited function. Args: clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. Returns: True if current line contains a function with "override" virt-specifier. """ # Scan back a few lines for start of current function for i in xrange(linenum, max(-1, linenum - 10), -1): match = Match(r'^([^()]*\w+)\(', clean_lines.elided[i]) if match: # Look for "override" after the matching closing parenthesis line, _, closing_paren = CloseExpression( clean_lines, i, len(match.group(1))) return (closing_paren >= 0 and Search(r'\boverride\b', line[closing_paren:])) return False def IsInitializerList(clean_lines, linenum): """Check if current line is inside constructor initializer list. Args: clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. Returns: True if current line appears to be inside constructor initializer list, False otherwise. """ for i in xrange(linenum, 1, -1): line = clean_lines.elided[i] if i == linenum: remove_function_body = Match(r'^(.*)\{\s*$', line) if remove_function_body: line = remove_function_body.group(1) if Search(r'\s:\s*\w+[({]', line): # A lone colon tend to indicate the start of a constructor # initializer list. It could also be a ternary operator, which # also tend to appear in constructor initializer lists as # opposed to parameter lists. return True if Search(r'\}\s*,\s*$', line): # A closing brace followed by a comma is probably the end of a # brace-initialized member in constructor initializer list. return True if Search(r'[{};]\s*$', line): # Found one of the following: # - A closing brace or semicolon, probably the end of the previous # function. # - An opening brace, probably the start of current class or namespace. # # Current line is probably not inside an initializer list since # we saw one of those things without seeing the starting colon. return False # Got to the beginning of the file without seeing the start of # constructor initializer list. return False def CheckForNonConstReference(filename, clean_lines, linenum, nesting_state, error): """Check for non-const references. Separate from CheckLanguage since it scans backwards from current line, instead of scanning forward. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. nesting_state: A NestingState instance which maintains information about the current stack of nested blocks being parsed. error: The function to call with any errors found. """ # Do nothing if there is no '&' on current line. line = clean_lines.elided[linenum] if '&' not in line: return # If a function is inherited, current function doesn't have much of # a choice, so any non-const references should not be blamed on # derived function. if IsDerivedFunction(clean_lines, linenum): return # Long type names may be broken across multiple lines, usually in one # of these forms: # LongType # ::LongTypeContinued &identifier # LongType:: # LongTypeContinued &identifier # LongType< # ...>::LongTypeContinued &identifier # # If we detected a type split across two lines, join the previous # line to current line so that we can match const references # accordingly. # # Note that this only scans back one line, since scanning back # arbitrary number of lines would be expensive. If you have a type # that spans more than 2 lines, please use a typedef. if linenum > 1: previous = None if Match(r'\s*::(?:[\w<>]|::)+\s*&\s*\S', line): # previous_line\n + ::current_line previous = Search(r'\b((?:const\s*)?(?:[\w<>]|::)+[\w<>])\s*$', clean_lines.elided[linenum - 1]) elif Match(r'\s*[a-zA-Z_]([\w<>]|::)+\s*&\s*\S', line): # previous_line::\n + current_line previous = Search(r'\b((?:const\s*)?(?:[\w<>]|::)+::)\s*$', clean_lines.elided[linenum - 1]) if previous: line = previous.group(1) + line.lstrip() else: # Check for templated parameter that is split across multiple lines endpos = line.rfind('>') if endpos > -1: (_, startline, startpos) = ReverseCloseExpression( clean_lines, linenum, endpos) if startpos > -1 and startline < linenum: # Found the matching < on an earlier line, collect all # pieces up to current line. line = '' for i in xrange(startline, linenum + 1): line += clean_lines.elided[i].strip() # Check for non-const references in function parameters. A single '&' may # found in the following places: # inside expression: binary & for bitwise AND # inside expression: unary & for taking the address of something # inside declarators: reference parameter # We will exclude the first two cases by checking that we are not inside a # function body, including one that was just introduced by a trailing '{'. # TODO(unknown): Doesn't account for 'catch(Exception& e)' [rare]. if (nesting_state.previous_stack_top and not (isinstance(nesting_state.previous_stack_top, _ClassInfo) or isinstance(nesting_state.previous_stack_top, _NamespaceInfo))): # Not at toplevel, not within a class, and not within a namespace return # Avoid initializer lists. We only need to scan back from the # current line for something that starts with ':'. # # We don't need to check the current line, since the '&' would # appear inside the second set of parentheses on the current line as # opposed to the first set. if linenum > 0: for i in xrange(linenum - 1, max(0, linenum - 10), -1): previous_line = clean_lines.elided[i] if not Search(r'[),]\s*$', previous_line): break if Match(r'^\s*:\s+\S', previous_line): return # Avoid preprocessors if Search(r'\\\s*$', line): return # Avoid constructor initializer lists if IsInitializerList(clean_lines, linenum): return # We allow non-const references in a few standard places, like functions # called "swap()" or iostream operators like "<<" or ">>". Do not check # those function parameters. # # We also accept & in static_assert, which looks like a function but # it's actually a declaration expression. whitelisted_functions = (r'(?:[sS]wap(?:<\w:+>)?|' r'operator\s*[<>][<>]|' r'static_assert|COMPILE_ASSERT' r')\s*\(') if Search(whitelisted_functions, line): return elif not Search(r'\S+\([^)]*$', line): # Don't see a whitelisted function on this line. Actually we # didn't see any function name on this line, so this is likely a # multi-line parameter list. Try a bit harder to catch this case. for i in xrange(2): if (linenum > i and Search(whitelisted_functions, clean_lines.elided[linenum - i - 1])): return decls = ReplaceAll(r'{[^}]*}', ' ', line) # exclude function body for parameter in re.findall(_RE_PATTERN_REF_PARAM, decls): if not Match(_RE_PATTERN_CONST_REF_PARAM, parameter): error(filename, linenum, 'runtime/references', 2, 'Is this a non-const reference? ' 'If so, make const or use a pointer: ' + ReplaceAll(' *<', '<', parameter)) def CheckCasts(filename, clean_lines, linenum, error): """Various cast related checks. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # Check to see if they're using an conversion function cast. # I just try to capture the most common basic types, though there are more. # Parameterless conversion functions, such as bool(), are allowed as they are # probably a member operator declaration or default constructor. match = Search( r'(\bnew\s+|\S<\s*(?:const\s+)?)?\b' r'(int|float|double|bool|char|int32|uint32|int64|uint64)' r'(\([^)].*)', line) expecting_function = ExpectingFunctionArgs(clean_lines, linenum) if match and not expecting_function: matched_type = match.group(2) # matched_new_or_template is used to silence two false positives: # - New operators # - Template arguments with function types # # For template arguments, we match on types immediately following # an opening bracket without any spaces. This is a fast way to # silence the common case where the function type is the first # template argument. False negative with less-than comparison is # avoided because those operators are usually followed by a space. # # function // bracket + no space = false positive # value < double(42) // bracket + space = true positive matched_new_or_template = match.group(1) # Avoid arrays by looking for brackets that come after the closing # parenthesis. if Match(r'\([^()]+\)\s*\[', match.group(3)): return # Other things to ignore: # - Function pointers # - Casts to pointer types # - Placement new # - Alias declarations matched_funcptr = match.group(3) if (matched_new_or_template is None and not (matched_funcptr and (Match(r'\((?:[^() ]+::\s*\*\s*)?[^() ]+\)\s*\(', matched_funcptr) or matched_funcptr.startswith('(*)'))) and not Match(r'\s*using\s+\S+\s*=\s*' + matched_type, line) and not Search(r'new\(\S+\)\s*' + matched_type, line)): error(filename, linenum, 'readability/casting', 4, 'Using deprecated casting style. ' 'Use static_cast<%s>(...) instead' % matched_type) if not expecting_function: CheckCStyleCast(filename, clean_lines, linenum, 'static_cast', r'\((int|float|double|bool|char|u?int(16|32|64))\)', error) # This doesn't catch all cases. Consider (const char * const)"hello". # # (char *) "foo" should always be a const_cast (reinterpret_cast won't # compile). if CheckCStyleCast(filename, clean_lines, linenum, 'const_cast', r'\((char\s?\*+\s?)\)\s*"', error): pass else: # Check pointer casts for other than string constants CheckCStyleCast(filename, clean_lines, linenum, 'reinterpret_cast', r'\((\w+\s?\*+\s?)\)', error) # In addition, we look for people taking the address of a cast. This # is dangerous -- casts can assign to temporaries, so the pointer doesn't # point where you think. # # Some non-identifier character is required before the '&' for the # expression to be recognized as a cast. These are casts: # expression = &static_cast(temporary()); # function(&(int*)(temporary())); # # This is not a cast: # reference_type&(int* function_param); match = Search( r'(?:[^\w]&\(([^)]+)\)[\w(])|' r'(?:[^\w]&(static|dynamic|down|reinterpret)_cast\b)', line) if match and match.group(1) != '*': # Try a better error message when the & is bound to something # dereferenced by the casted pointer, as opposed to the casted # pointer itself. parenthesis_error = False match = Match(r'^(.*&(?:static|dynamic|down|reinterpret)_cast\b)<', line) if match: _, y1, x1 = CloseExpression(clean_lines, linenum, len(match.group(1))) if x1 >= 0 and clean_lines.elided[y1][x1] == '(': _, y2, x2 = CloseExpression(clean_lines, y1, x1) if x2 >= 0: extended_line = clean_lines.elided[y2][x2:] if y2 < clean_lines.NumLines() - 1: extended_line += clean_lines.elided[y2 + 1] if Match(r'\s*(?:->|\[)', extended_line): parenthesis_error = True if parenthesis_error: error(filename, linenum, 'readability/casting', 4, ('Are you taking an address of something dereferenced ' 'from a cast? Wrapping the dereferenced expression in ' 'parentheses will make the binding more obvious')) else: error(filename, linenum, 'runtime/casting', 4, ('Are you taking an address of a cast? ' 'This is dangerous: could be a temp var. ' 'Take the address before doing the cast, rather than after')) def CheckCStyleCast(filename, clean_lines, linenum, cast_type, pattern, error): """Checks for a C-style cast by looking for the pattern. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. cast_type: The string for the C++ cast to recommend. This is either reinterpret_cast, static_cast, or const_cast, depending. pattern: The regular expression used to find C-style casts. error: The function to call with any errors found. Returns: True if an error was emitted. False otherwise. """ line = clean_lines.elided[linenum] match = Search(pattern, line) if not match: return False # Exclude lines with keywords that tend to look like casts context = line[0:match.start(1) - 1] if Match(r'.*\b(?:sizeof|alignof|alignas|[_A-Z][_A-Z0-9]*)\s*$', context): return False # Try expanding current context to see if we one level of # parentheses inside a macro. if linenum > 0: for i in xrange(linenum - 1, max(0, linenum - 5), -1): context = clean_lines.elided[i] + context if Match(r'.*\b[_A-Z][_A-Z0-9]*\s*\((?:\([^()]*\)|[^()])*$', context): return False # operator++(int) and operator--(int) if context.endswith(' operator++') or context.endswith(' operator--'): return False # A single unnamed argument for a function tends to look like old # style cast. If we see those, don't issue warnings for deprecated # casts, instead issue warnings for unnamed arguments where # appropriate. # # These are things that we want warnings for, since the style guide # explicitly require all parameters to be named: # Function(int); # Function(int) { # ConstMember(int) const; # ConstMember(int) const { # ExceptionMember(int) throw (...); # ExceptionMember(int) throw (...) { # PureVirtual(int) = 0; # # These are functions of some sort, where the compiler would be fine # if they had named parameters, but people often omit those # identifiers to reduce clutter: # (FunctionPointer)(int); # (FunctionPointer)(int) = value; # Function((function_pointer_arg)(int)) # Function((function_pointer_arg)(int), int param) # ; # <(FunctionPointerTemplateArgument)(int)>; remainder = line[match.end(0):] if Match(r'^\s*(?:;|const\b|throw\b|final\b|override\b|[=>{),])', remainder): # Looks like an unnamed parameter. # Don't warn on any kind of template arguments. if Match(r'^\s*>', remainder): return False # Don't warn on assignments to function pointers, but keep warnings for # unnamed parameters to pure virtual functions. Note that this pattern # will also pass on assignments of "0" to function pointers, but the # preferred values for those would be "nullptr" or "NULL". matched_zero = Match(r'^\s=\s*(\S+)\s*;', remainder) if matched_zero and matched_zero.group(1) != '0': return False # Don't warn on function pointer declarations. For this we need # to check what came before the "(type)" string. if Match(r'.*\)\s*$', line[0:match.start(0)]): return False # Don't warn if the parameter is named with block comments, e.g.: # Function(int /*unused_param*/); raw_line = clean_lines.raw_lines[linenum] if '/*' in raw_line: return False # Passed all filters, issue warning here. error(filename, linenum, 'readability/function', 3, 'All parameters should be named in a function') return True # At this point, all that should be left is actual casts. error(filename, linenum, 'readability/casting', 4, 'Using C-style cast. Use %s<%s>(...) instead' % (cast_type, match.group(1))) return True def ExpectingFunctionArgs(clean_lines, linenum): """Checks whether where function type arguments are expected. Args: clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. Returns: True if the line at 'linenum' is inside something that expects arguments of function types. """ line = clean_lines.elided[linenum] return (Match(r'^\s*MOCK_(CONST_)?METHOD\d+(_T)?\(', line) or (linenum >= 2 and (Match(r'^\s*MOCK_(?:CONST_)?METHOD\d+(?:_T)?\((?:\S+,)?\s*$', clean_lines.elided[linenum - 1]) or Match(r'^\s*MOCK_(?:CONST_)?METHOD\d+(?:_T)?\(\s*$', clean_lines.elided[linenum - 2]) or Search(r'\bstd::m?function\s*\<\s*$', clean_lines.elided[linenum - 1])))) _HEADERS_CONTAINING_TEMPLATES = ( ('', ('deque',)), ('', ('unary_function', 'binary_function', 'plus', 'minus', 'multiplies', 'divides', 'modulus', 'negate', 'equal_to', 'not_equal_to', 'greater', 'less', 'greater_equal', 'less_equal', 'logical_and', 'logical_or', 'logical_not', 'unary_negate', 'not1', 'binary_negate', 'not2', 'bind1st', 'bind2nd', 'pointer_to_unary_function', 'pointer_to_binary_function', 'ptr_fun', 'mem_fun_t', 'mem_fun', 'mem_fun1_t', 'mem_fun1_ref_t', 'mem_fun_ref_t', 'const_mem_fun_t', 'const_mem_fun1_t', 'const_mem_fun_ref_t', 'const_mem_fun1_ref_t', 'mem_fun_ref', )), ('', ('numeric_limits',)), ('', ('list',)), ('', ('map', 'multimap',)), ('', ('allocator',)), ('', ('queue', 'priority_queue',)), ('', ('set', 'multiset',)), ('', ('stack',)), ('', ('char_traits', 'basic_string',)), ('', ('pair',)), ('', ('vector',)), # gcc extensions. # Note: std::hash is their hash, ::hash is our hash ('', ('hash_map', 'hash_multimap',)), ('', ('hash_set', 'hash_multiset',)), ('', ('slist',)), ) _RE_PATTERN_STRING = re.compile(r'\bstring\b') _re_pattern_algorithm_header = [] for _template in ('copy', 'max', 'min', 'min_element', 'sort', 'swap', 'transform'): # Match max(..., ...), max(..., ...), but not foo->max, foo.max or # type::max(). _re_pattern_algorithm_header.append( (re.compile(r'[^>.]\b' + _template + r'(<.*?>)?\([^\)]'), _template, '')) _re_pattern_templates = [] for _header, _templates in _HEADERS_CONTAINING_TEMPLATES: for _template in _templates: _re_pattern_templates.append( (re.compile(r'(\<|\b)' + _template + r'\s*\<'), _template + '<>', _header)) def FilesBelongToSameModule(filename_cc, filename_h): """Check if these two filenames belong to the same module. The concept of a 'module' here is a as follows: foo.h, foo-inl.h, foo.cc, foo_test.cc and foo_unittest.cc belong to the same 'module' if they are in the same directory. some/path/public/xyzzy and some/path/internal/xyzzy are also considered to belong to the same module here. If the filename_cc contains a longer path than the filename_h, for example, '/absolute/path/to/base/sysinfo.cc', and this file would include 'base/sysinfo.h', this function also produces the prefix needed to open the header. This is used by the caller of this function to more robustly open the header file. We don't have access to the real include paths in this context, so we need this guesswork here. Known bugs: tools/base/bar.cc and base/bar.h belong to the same module according to this implementation. Because of this, this function gives some false positives. This should be sufficiently rare in practice. Args: filename_cc: is the path for the .cc file filename_h: is the path for the header path Returns: Tuple with a bool and a string: bool: True if filename_cc and filename_h belong to the same module. string: the additional prefix needed to open the header file. """ if not filename_cc.endswith('.cc'): return (False, '') filename_cc = filename_cc[:-len('.cc')] if filename_cc.endswith('_unittest'): filename_cc = filename_cc[:-len('_unittest')] elif filename_cc.endswith('_test'): filename_cc = filename_cc[:-len('_test')] filename_cc = filename_cc.replace('/public/', '/') filename_cc = filename_cc.replace('/internal/', '/') if not filename_h.endswith('.h'): return (False, '') filename_h = filename_h[:-len('.h')] if filename_h.endswith('-inl'): filename_h = filename_h[:-len('-inl')] filename_h = filename_h.replace('/public/', '/') filename_h = filename_h.replace('/internal/', '/') files_belong_to_same_module = filename_cc.endswith(filename_h) common_path = '' if files_belong_to_same_module: common_path = filename_cc[:-len(filename_h)] return files_belong_to_same_module, common_path def UpdateIncludeState(filename, include_dict, io=codecs): """Fill up the include_dict with new includes found from the file. Args: filename: the name of the header to read. include_dict: a dictionary in which the headers are inserted. io: The io factory to use to read the file. Provided for testability. Returns: True if a header was successfully added. False otherwise. """ headerfile = None try: headerfile = io.open(filename, 'r', 'utf8', 'replace') except IOError: return False linenum = 0 for line in headerfile: linenum += 1 clean_line = CleanseComments(line) match = _RE_PATTERN_INCLUDE.search(clean_line) if match: include = match.group(2) include_dict.setdefault(include, linenum) return True def CheckForIncludeWhatYouUse(filename, clean_lines, include_state, error, io=codecs): """Reports for missing stl includes. This function will output warnings to make sure you are including the headers necessary for the stl containers and functions that you use. We only give one reason to include a header. For example, if you use both equal_to<> and less<> in a .h file, only one (the latter in the file) of these will be reported as a reason to include the . Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. include_state: An _IncludeState instance. error: The function to call with any errors found. io: The IO factory to use to read the header file. Provided for unittest injection. """ required = {} # A map of header name to linenumber and the template entity. # Example of required: { '': (1219, 'less<>') } for linenum in xrange(clean_lines.NumLines()): line = clean_lines.elided[linenum] if not line or line[0] == '#': continue # String is special -- it is a non-templatized type in STL. matched = _RE_PATTERN_STRING.search(line) if matched: # Don't warn about strings in non-STL namespaces: # (We check only the first match per line; good enough.) prefix = line[:matched.start()] if prefix.endswith('std::') or not prefix.endswith('::'): required[''] = (linenum, 'string') for pattern, template, header in _re_pattern_algorithm_header: if pattern.search(line): required[header] = (linenum, template) # The following function is just a speed up, no semantics are changed. if not '<' in line: # Reduces the cpu time usage by skipping lines. continue for pattern, template, header in _re_pattern_templates: if pattern.search(line): required[header] = (linenum, template) # The policy is that if you #include something in foo.h you don't need to # include it again in foo.cc. Here, we will look at possible includes. # Let's flatten the include_state include_list and copy it into a dictionary. include_dict = dict([item for sublist in include_state.include_list for item in sublist]) # Did we find the header for this file (if any) and successfully load it? header_found = False # Use the absolute path so that matching works properly. abs_filename = FileInfo(filename).FullName() # For Emacs's flymake. # If cpplint is invoked from Emacs's flymake, a temporary file is generated # by flymake and that file name might end with '_flymake.cc'. In that case, # restore original file name here so that the corresponding header file can be # found. # e.g. If the file name is 'foo_flymake.cc', we should search for 'foo.h' # instead of 'foo_flymake.h' abs_filename = re.sub(r'_flymake\.cc$', '.cc', abs_filename) # include_dict is modified during iteration, so we iterate over a copy of # the keys. header_keys = include_dict.keys() for header in header_keys: (same_module, common_path) = FilesBelongToSameModule(abs_filename, header) fullpath = common_path + header if same_module and UpdateIncludeState(fullpath, include_dict, io): header_found = True # If we can't find the header file for a .cc, assume it's because we don't # know where to look. In that case we'll give up as we're not sure they # didn't include it in the .h file. # TODO(unknown): Do a better job of finding .h files so we are confident that # not having the .h file means there isn't one. if filename.endswith('.cc') and not header_found: return # All the lines have been processed, report the errors found. for required_header_unstripped in required: template = required[required_header_unstripped][1] if required_header_unstripped.strip('<>"') not in include_dict: error(filename, required[required_header_unstripped][0], 'build/include_what_you_use', 4, 'Add #include ' + required_header_unstripped + ' for ' + template) _RE_PATTERN_EXPLICIT_MAKEPAIR = re.compile(r'\bmake_pair\s*<') def CheckMakePairUsesDeduction(filename, clean_lines, linenum, error): """Check that make_pair's template arguments are deduced. G++ 4.6 in C++11 mode fails badly if make_pair's template arguments are specified explicitly, and such use isn't intended in any case. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] match = _RE_PATTERN_EXPLICIT_MAKEPAIR.search(line) if match: error(filename, linenum, 'build/explicit_make_pair', 4, # 4 = high confidence 'For C++11-compatibility, omit template arguments from make_pair' ' OR use pair directly OR if appropriate, construct a pair directly') def CheckDefaultLambdaCaptures(filename, clean_lines, linenum, error): """Check that default lambda captures are not used. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # A lambda introducer specifies a default capture if it starts with "[=" # or if it starts with "[&" _not_ followed by an identifier. match = Match(r'^(.*)\[\s*(?:=|&[^\w])', line) if match: # Found a potential error, check what comes after the lambda-introducer. # If it's not open parenthesis (for lambda-declarator) or open brace # (for compound-statement), it's not a lambda. line, _, pos = CloseExpression(clean_lines, linenum, len(match.group(1))) if pos >= 0 and Match(r'^\s*[{(]', line[pos:]): error(filename, linenum, 'build/c++11', 4, # 4 = high confidence 'Default lambda captures are an unapproved C++ feature.') def CheckRedundantVirtual(filename, clean_lines, linenum, error): """Check if line contains a redundant "virtual" function-specifier. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ # Look for "virtual" on current line. line = clean_lines.elided[linenum] virtual = Match(r'^(.*\bvirtual\b)', line) if not virtual: return # Look for the next opening parenthesis. This is the start of the # parameter list (possibly on the next line shortly after virtual). # TODO(unknown): doesn't work if there are virtual functions with # decltype() or other things that use parentheses, but csearch suggests # that this is rare. end_col = -1 end_line = -1 start_col = len(virtual.group(1)) for start_line in xrange(linenum, min(linenum + 3, clean_lines.NumLines())): line = clean_lines.elided[start_line][start_col:] parameter_list = Match(r'^([^(]*)\(', line) if parameter_list: # Match parentheses to find the end of the parameter list (_, end_line, end_col) = CloseExpression( clean_lines, start_line, start_col + len(parameter_list.group(1))) break start_col = 0 if end_col < 0: return # Couldn't find end of parameter list, give up # Look for "override" or "final" after the parameter list # (possibly on the next few lines). for i in xrange(end_line, min(end_line + 3, clean_lines.NumLines())): line = clean_lines.elided[i][end_col:] match = Search(r'\b(override|final)\b', line) if match: error(filename, linenum, 'readability/inheritance', 4, ('"virtual" is redundant since function is ' 'already declared as "%s"' % match.group(1))) # Set end_col to check whole lines after we are done with the # first line. end_col = 0 if Search(r'[^\w]\s*$', line): break def CheckRedundantOverrideOrFinal(filename, clean_lines, linenum, error): """Check if line contains a redundant "override" or "final" virt-specifier. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ # Check that at most one of "override" or "final" is present, not both line = clean_lines.elided[linenum] if Search(r'\boverride\b', line) and Search(r'\bfinal\b', line): error(filename, linenum, 'readability/inheritance', 4, ('"override" is redundant since function is ' 'already declared as "final"')) # Returns true if we are at a new block, and it is directly # inside of a namespace. def IsBlockInNameSpace(nesting_state, is_forward_declaration): """Checks that the new block is directly in a namespace. Args: nesting_state: The _NestingState object that contains info about our state. is_forward_declaration: If the class is a forward declared class. Returns: Whether or not the new block is directly in a namespace. """ if is_forward_declaration: if len(nesting_state.stack) >= 1 and ( isinstance(nesting_state.stack[-1], _NamespaceInfo)): return True else: return False return (len(nesting_state.stack) > 1 and nesting_state.stack[-1].check_namespace_indentation and isinstance(nesting_state.stack[-2], _NamespaceInfo)) def ShouldCheckNamespaceIndentation(nesting_state, is_namespace_indent_item, raw_lines_no_comments, linenum): """This method determines if we should apply our namespace indentation check. Args: nesting_state: The current nesting state. is_namespace_indent_item: If we just put a new class on the stack, True. If the top of the stack is not a class, or we did not recently add the class, False. raw_lines_no_comments: The lines without the comments. linenum: The current line number we are processing. Returns: True if we should apply our namespace indentation check. Currently, it only works for classes and namespaces inside of a namespace. """ is_forward_declaration = IsForwardClassDeclaration(raw_lines_no_comments, linenum) if not (is_namespace_indent_item or is_forward_declaration): return False # If we are in a macro, we do not want to check the namespace indentation. if IsMacroDefinition(raw_lines_no_comments, linenum): return False return IsBlockInNameSpace(nesting_state, is_forward_declaration) # Call this method if the line is directly inside of a namespace. # If the line above is blank (excluding comments) or the start of # an inner namespace, it cannot be indented. def CheckItemIndentationInNamespace(filename, raw_lines_no_comments, linenum, error): line = raw_lines_no_comments[linenum] if Match(r'^\s+', line): error(filename, linenum, 'runtime/indentation_namespace', 4, 'Do not indent within a namespace') def ProcessLine(filename, file_extension, clean_lines, line, include_state, function_state, nesting_state, error, extra_check_functions=[]): """Processes a single line in the file. Args: filename: Filename of the file that is being processed. file_extension: The extension (dot not included) of the file. clean_lines: An array of strings, each representing a line of the file, with comments stripped. line: Number of line being processed. include_state: An _IncludeState instance in which the headers are inserted. function_state: A _FunctionState instance which counts function lines, etc. nesting_state: A NestingState instance which maintains information about the current stack of nested blocks being parsed. error: A callable to which errors are reported, which takes 4 arguments: filename, line number, error level, and message extra_check_functions: An array of additional check functions that will be run on each source line. Each function takes 4 arguments: filename, clean_lines, line, error """ raw_lines = clean_lines.raw_lines ParseNolintSuppressions(filename, raw_lines[line], line, error) nesting_state.Update(filename, clean_lines, line, error) CheckForNamespaceIndentation(filename, nesting_state, clean_lines, line, error) if nesting_state.InAsmBlock(): return CheckForFunctionLengths(filename, clean_lines, line, function_state, error) CheckForMultilineCommentsAndStrings(filename, clean_lines, line, error) CheckStyle(filename, clean_lines, line, file_extension, nesting_state, error) CheckLanguage(filename, clean_lines, line, file_extension, include_state, nesting_state, error) CheckForNonConstReference(filename, clean_lines, line, nesting_state, error) CheckForNonStandardConstructs(filename, clean_lines, line, nesting_state, error) CheckVlogArguments(filename, clean_lines, line, error) CheckPosixThreading(filename, clean_lines, line, error) CheckInvalidIncrement(filename, clean_lines, line, error) CheckMakePairUsesDeduction(filename, clean_lines, line, error) CheckDefaultLambdaCaptures(filename, clean_lines, line, error) CheckRedundantVirtual(filename, clean_lines, line, error) CheckRedundantOverrideOrFinal(filename, clean_lines, line, error) for check_fn in extra_check_functions: check_fn(filename, clean_lines, line, error) def FlagCxx11Features(filename, clean_lines, linenum, error): """Flag those c++11 features that we only allow in certain places. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # Flag unapproved C++11 headers. include = Match(r'\s*#\s*include\s+[<"]([^<"]+)[">]', line) if include and include.group(1) in ('cfenv', 'condition_variable', 'fenv.h', 'future', 'mutex', 'thread', 'chrono', 'ratio', 'regex', 'system_error', ): error(filename, linenum, 'build/c++11', 5, ('<%s> is an unapproved C++11 header.') % include.group(1)) # The only place where we need to worry about C++11 keywords and library # features in preprocessor directives is in macro definitions. if Match(r'\s*#', line) and not Match(r'\s*#\s*define\b', line): return # These are classes and free functions. The classes are always # mentioned as std::*, but we only catch the free functions if # they're not found by ADL. They're alphabetical by header. for top_name in ( # type_traits 'alignment_of', 'aligned_union', # utility 'forward', ): if Search(r'\bstd::%s\b' % top_name, line): error(filename, linenum, 'build/c++11', 5, ('std::%s is an unapproved C++11 class or function. Send c-style ' 'an example of where it would make your code more readable, and ' 'they may let you use it.') % top_name) def ProcessFileData(filename, file_extension, lines, error, extra_check_functions=[]): """Performs lint checks and reports any errors to the given error function. Args: filename: Filename of the file that is being processed. file_extension: The extension (dot not included) of the file. lines: An array of strings, each representing a line of the file, with the last element being empty if the file is terminated with a newline. error: A callable to which errors are reported, which takes 4 arguments: filename, line number, error level, and message extra_check_functions: An array of additional check functions that will be run on each source line. Each function takes 4 arguments: filename, clean_lines, line, error """ lines = (['// marker so line numbers and indices both start at 1'] + lines + ['// marker so line numbers end in a known way']) include_state = _IncludeState() function_state = _FunctionState() nesting_state = NestingState() ResetNolintSuppressions() CheckForCopyright(filename, lines, error) if file_extension == 'h': CheckForHeaderGuard(filename, lines, error) RemoveMultiLineComments(filename, lines, error) clean_lines = CleansedLines(lines) for line in xrange(clean_lines.NumLines()): ProcessLine(filename, file_extension, clean_lines, line, include_state, function_state, nesting_state, error, extra_check_functions) FlagCxx11Features(filename, clean_lines, line, error) nesting_state.CheckCompletedBlocks(filename, error) CheckForIncludeWhatYouUse(filename, clean_lines, include_state, error) # We check here rather than inside ProcessLine so that we see raw # lines rather than "cleaned" lines. CheckForBadCharacters(filename, lines, error) CheckForNewlineAtEOF(filename, lines, error) def ProcessConfigOverrides(filename): """ Loads the configuration files and processes the config overrides. Args: filename: The name of the file being processed by the linter. Returns: False if the current |filename| should not be processed further. """ abs_filename = os.path.abspath(filename) cfg_filters = [] keep_looking = True while keep_looking: abs_path, base_name = os.path.split(abs_filename) if not base_name: break # Reached the root directory. cfg_file = os.path.join(abs_path, "CPPLINT.cfg") abs_filename = abs_path if not os.path.isfile(cfg_file): continue try: with open(cfg_file) as file_handle: for line in file_handle: line, _, _ = line.partition('#') # Remove comments. if not line.strip(): continue name, _, val = line.partition('=') name = name.strip() val = val.strip() if name == 'set noparent': keep_looking = False elif name == 'filter': cfg_filters.append(val) elif name == 'exclude_files': # When matching exclude_files pattern, use the base_name of # the current file name or the directory name we are processing. # For example, if we are checking for lint errors in /foo/bar/baz.cc # and we found the .cfg file at /foo/CPPLINT.cfg, then the config # file's "exclude_files" filter is meant to be checked against "bar" # and not "baz" nor "bar/baz.cc". if base_name: pattern = re.compile(val) if pattern.match(base_name): sys.stderr.write('Ignoring "%s": file excluded by "%s". ' 'File path component "%s" matches ' 'pattern "%s"\n' % (filename, cfg_file, base_name, val)) return False elif name == 'linelength': global _line_length try: _line_length = int(val) except ValueError: sys.stderr.write('Line length must be numeric.') else: sys.stderr.write( 'Invalid configuration option (%s) in file %s\n' % (name, cfg_file)) except IOError: sys.stderr.write( "Skipping config file '%s': Can't open for reading\n" % cfg_file) keep_looking = False # Apply all the accumulated filters in reverse order (top-level directory # config options having the least priority). for filter in reversed(cfg_filters): _AddFilters(filter) return True def ProcessFile(filename, vlevel, extra_check_functions=[]): """Does google-lint on a single file. Args: filename: The name of the file to parse. vlevel: The level of errors to report. Every error of confidence >= verbose_level will be reported. 0 is a good default. extra_check_functions: An array of additional check functions that will be run on each source line. Each function takes 4 arguments: filename, clean_lines, line, error """ _SetVerboseLevel(vlevel) _BackupFilters() if not ProcessConfigOverrides(filename): _RestoreFilters() return lf_lines = [] crlf_lines = [] try: # Support the UNIX convention of using "-" for stdin. Note that # we are not opening the file with universal newline support # (which codecs doesn't support anyway), so the resulting lines do # contain trailing '\r' characters if we are reading a file that # has CRLF endings. # If after the split a trailing '\r' is present, it is removed # below. if filename == '-': lines = codecs.StreamReaderWriter(sys.stdin, codecs.getreader('utf8'), codecs.getwriter('utf8'), 'replace').read().split('\n') else: lines = codecs.open(filename, 'r', 'utf8', 'replace').read().split('\n') # Remove trailing '\r'. # The -1 accounts for the extra trailing blank line we get from split() for linenum in range(len(lines) - 1): if lines[linenum].endswith('\r'): lines[linenum] = lines[linenum].rstrip('\r') crlf_lines.append(linenum + 1) else: lf_lines.append(linenum + 1) except IOError: sys.stderr.write( "Skipping input '%s': Can't open for reading\n" % filename) _RestoreFilters() return # Note, if no dot is found, this will give the entire filename as the ext. file_extension = filename[filename.rfind('.') + 1:] # When reading from stdin, the extension is unknown, so no cpplint tests # should rely on the extension. if filename != '-' and file_extension not in _valid_extensions: sys.stderr.write('Ignoring %s; not a valid file name ' '(%s)\n' % (filename, ', '.join(_valid_extensions))) else: ProcessFileData(filename, file_extension, lines, Error, extra_check_functions) # If end-of-line sequences are a mix of LF and CR-LF, issue # warnings on the lines with CR. # # Don't issue any warnings if all lines are uniformly LF or CR-LF, # since critique can handle these just fine, and the style guide # doesn't dictate a particular end of line sequence. # # We can't depend on os.linesep to determine what the desired # end-of-line sequence should be, since that will return the # server-side end-of-line sequence. if lf_lines and crlf_lines: # Warn on every line with CR. An alternative approach might be to # check whether the file is mostly CRLF or just LF, and warn on the # minority, we bias toward LF here since most tools prefer LF. for linenum in crlf_lines: Error(filename, linenum, 'whitespace/newline', 1, 'Unexpected \\r (^M) found; better to use only \\n') sys.stderr.write('Done processing %s\n' % filename) _RestoreFilters() def PrintUsage(message): """Prints a brief usage string and exits, optionally with an error message. Args: message: The optional error message. """ sys.stderr.write(_USAGE) if message: sys.exit('\nFATAL ERROR: ' + message) else: sys.exit(1) def PrintCategories(): """Prints a list of all the error-categories used by error messages. These are the categories used to filter messages via --filter. """ sys.stderr.write(''.join(' %s\n' % cat for cat in _ERROR_CATEGORIES)) sys.exit(0) def ParseArguments(args): """Parses the command line arguments. This may set the output format and verbosity level as side-effects. Args: args: The command line arguments: Returns: The list of filenames to lint. """ try: (opts, filenames) = getopt.getopt(args, '', ['help', 'output=', 'verbose=', 'counting=', 'filter=', 'root=', 'linelength=', 'extensions=']) except getopt.GetoptError: PrintUsage('Invalid arguments.') verbosity = _VerboseLevel() output_format = _OutputFormat() filters = '' counting_style = '' for (opt, val) in opts: if opt == '--help': PrintUsage(None) elif opt == '--output': if val not in ('emacs', 'vs7', 'eclipse'): PrintUsage('The only allowed output formats are emacs, vs7 and eclipse.') output_format = val elif opt == '--verbose': verbosity = int(val) elif opt == '--filter': filters = val if not filters: PrintCategories() elif opt == '--counting': if val not in ('total', 'toplevel', 'detailed'): PrintUsage('Valid counting options are total, toplevel, and detailed') counting_style = val elif opt == '--root': global _root _root = val elif opt == '--linelength': global _line_length try: _line_length = int(val) except ValueError: PrintUsage('Line length must be digits.') elif opt == '--extensions': global _valid_extensions try: _valid_extensions = set(val.split(',')) except ValueError: PrintUsage('Extensions must be comma seperated list.') if not filenames: PrintUsage('No files were specified.') _SetOutputFormat(output_format) _SetVerboseLevel(verbosity) _SetFilters(filters) _SetCountingStyle(counting_style) return filenames def main(): filenames = ParseArguments(sys.argv[1:]) # Change stderr to write with replacement characters so we don't die # if we try to print something containing non-ASCII characters. sys.stderr = codecs.StreamReaderWriter(sys.stderr, codecs.getreader('utf8'), codecs.getwriter('utf8'), 'replace') _cpplint_state.ResetErrorCounts() for filename in filenames: ProcessFile(filename, _cpplint_state.verbose_level) _cpplint_state.PrintErrorCounts() sys.exit(_cpplint_state.error_count > 0) if __name__ == '__main__': main() clementine-1.2.3+git1354-gdaddbde+dfsg/dist/cpplint.py.README000066400000000000000000000000751260417502300233130ustar00rootroot00000000000000While using cpplint.py use the following options: --root=src clementine-1.2.3+git1354-gdaddbde+dfsg/dist/cpplint.sh000077500000000000000000000002461260417502300223440ustar00rootroot00000000000000#!/usr/bin/env bash dire=$1 if [ x$dire == "x" ];then dire="src" fi find $dire -regex '.*\.\(h\|cpp\|mm\)' -type f -exec ./dist/cpplint.py --root=src {} 2>&1 \; clementine-1.2.3+git1354-gdaddbde+dfsg/dist/create-dmg.sh000077500000000000000000000031411260417502300227000ustar00rootroot00000000000000#!/bin/sh # author: max@last.fm, muesli@tomahawk-player.org # brief: Produces a compressed DMG from a bundle directory # usage: Pass the bundle directory as the only parameter # note: This script depends on the Tomahawk build system, and must be run from # the build directory ################################################################################ #if [ -z $VERSION ] #then # echo VERSION must be set # exit 2 #fi if [ -z "$1" ] then echo "Please pass the bundle.app directory as the first parameter." exit 3 fi ################################################################################ NAME=$(basename "$1" | perl -pe 's/(.*).app/\1/') IN="$1" TMP="dmg/$NAME" OUT="$NAME.dmg" mkdir -p "$TMP" ################################################################################ # clean up rm -rf "$TMP" rm -f "$OUT" # create DMG contents and copy files mkdir -p "$TMP/.background" cp ../dist/dmg_background.png "$TMP/.background/background.png" cp ../dist/DS_Store.in "$TMP/.DS_Store" chmod go-rwx "$TMP/.DS_Store" ln -s /Applications "$TMP/Applications" # copies the prepared bundle into the dir that will become the DMG cp -R "$IN" "$TMP" # create hdiutil makehybrid -hfs -hfs-volume-name Clementine -hfs-openfolder "$TMP" "$TMP" -o tmp.dmg hdiutil convert -format UDZO -imagekey zlib-level=9 tmp.dmg -o "$OUT" # cleanup rm tmp.dmg #hdiutil create -srcfolder "$TMP" \ # -format UDZO -imagekey zlib-level=9 \ # -scrub \ # "$OUT" \ # || die "Error creating DMG :(" # done ! echo 'DMG size:' `du -hs "$OUT" | awk '{print $1}'` clementine-1.2.3+git1354-gdaddbde+dfsg/dist/dmg_background.png000066400000000000000000002525221260417502300240160ustar00rootroot00000000000000PNG  IHDR_WUsRGBbKGD pHYs  tIME -b IDATxyeE>esfje*ThP)Arh!0ˎx&l?#:J g hNVvidd?ν3s2>3sg𭵾Ť01a Y=>}gB1L&سgcM!DQޣzO}Ş-w)Y@GQQʹL&L&BhOy&VS׿W5|qQއ ]o7:H~,_SQ~cR{RJep~Gs>C%$`(!s 9ۤvs@V";l5Omoc\f꽶g CzO}SRAH ˍ077Lhho{H0f rNHa26bDFGqQ+xqR!~_וh4MAv{ ^|TH1KQR10Hl~qww`|RVO 9SBTŸŎR|@-\۞{ajs09M sɁ ޷\'$t"՜k{˳3Dy1)08/-MTRJyOM9x<&)]S=[!Eyn{=95**&NdhLޫ+( xswRboԆ8m'ރO>ӇjޕO!كdL}{&V d߻_0˲FKOi|JXR7|0^h4BQdD!H("s-buM!0VːKKC6U mV_ &$ߞUrɰ ].-}(#Z)X,+Ǽ> B )S 1L&yV6d;:Yt,em[%ܼ7~r׭ʐ ֶ2UZP1׈Y[ǭFdPi45Ǯ$=c! Uq 0TAu4>m/ n0Q{4gRrN@x4 qxQw>ꩻnl2`ȉh n-7QʼE@uU~!RvJ/s}Sq{`i*yX+x= B-e$s;{J9Ϧznnu#V.-ߛFѨs!w}~WPmGYCSZՋwϚUbqd9tPro:%S (uyᮔk]xhbuo//6N?T.abqЁu]q×RQl~BfgJR*ΥR!Q_,ʸvr<7φұt:Į k憱X2ۣ-@c,na,DseQd`LV*" w%ܹv.EP(Mw>5 +Pg: wEJuX/F%_b%+tp72YQgmZ.ZⷶP~xY$tKI$E!eСjPJ.¢;]ڷHh Q+VJ؆qs֋d]KTtW,7y-HP:Y{FdհpnײIs%3^c{#u~,ۜykwKUiU}$QeVJl&%n<}٣luugć+ZkPokK\MY Kԝ/iZo༶l6I(᭖M`Q]Tv|B#dx n7J;8N"mx_ nmPy%{DRTQge"3Le6 <2~ɮp!IqiK1|u* i*r 'kzFb% ļXfzMYR+;Ui_cNM<6׋bgܺ?WEJ/@I6Wΐ&|N#m>߫Jx)A@EQw} *dRa*&P KJ__z+3;)݆^c?ȜO%UItU>oB\V{H%ѧ@]JHa<#҇cU/`UgEm2G-Uc7 F6 0g\dJ\6Ӌ1: _m(D3rb>z_>:3 &_ 3kiX'CWyuv-$`(z<'t˦(H4br15Ahl/~ov9X4ƵO`[n@, P< (䍋7y0 gR)tvMfڋ}g*$R_ET/`(&.Yma%fꞥMZEi03IgTp5/ѹuR\Hy.ê2כOh4LԓUZ_e6UD8m p\JJ"UxA/)i9μ_˓r2]u)B(E\yE 4-oWB-rPz;S|U]HRԔv8yyQ@MHHlϘgX0 uD1K2"=[ ǜ !a,Xz, 7H'sYg}{̅%>Id='Z[T! eQOK$RuKxyظ4%|l" {9|uL^h\&V"'ãy ^V-6D*D"'N%*E>f{>C,D7??_ddTA3334ƧL(ESْBi:B*\5Yӫdžs1ﵨjW*dTdd<,#W؉o w~ZlVn麯ӽ^q騖Z;U`8\ 0p09-}pǻK@8$qD=,:7^jiX%@}UT&+A-+OIz.u 5ot œ]׀JJYqas+8wJܡ &j-DhHq^}U}ϑ/)A(53QNdVdCyhBp'f $٠JzS oR5|`*-v,~uzˮo!IӨy#φ(}r/}nZ)Fj'JQKI(V<(>|av6G_yJ>G @QX[MD> %'DuoQ,Pr3~wMNTm&T n6Wm#XUNlPqFMoK2 O]HRj?>|)\ MBC'x Z !g" KS2;Fj+ӵ$?|yefQS" 5!E;o2|\A\AWW,Q:plr]4bP/4 +hLd6TP-";tϫQ~!dmKM$zNZ!Yŵ.dZØIKb298TB?sxj<@zcUmJJQJ;H؋e*ri18}D$ZʭF'Rb1!9p8Èe3G imm'䈭Ab~ܕ">)I]>0AyV0.Ħ->R#*ODnFT ob,N=RF2uu6WaHP9`'$Lo xװU;@LɆ%Cm.#ceQڴ{4ߗ|XhK茈]SI_ lγ2OX^߷ahCSoY3/݆0U;V4bdPZTإ Yg]t}]\/B"JzJؚk9*Us%4([bCR}Mj]Pu%zk9K6|W yݮݩa/4eaHOPoĜDf3^EBp-8}⾼Ȱk&Q5==GB\ ݠp&4;u}q&:){ 6eNYu.=r3TԇGvvR3507%nj. 7A.v.l2g)sQđuR eaWRi\_p[-(9\2 QWLB7 YSW;4'hTU}`BWgTܕG n<#H2ػfdHNi JU[ ɞq)O2Hƕzw*SL]iaf-Jtuؾ❖άz?7"R Q4[k9\Kbp|Lt }QKb]/ic̈́:ٓ潦ld] FW+5)OB60QU+r> Ot=%DF)ڽt&o{t>R Р*‚'Ih%pvpXWKDF0M_k.gKBw Cz5cKI#(dFuoh(GmkS=r-DPjh*{kRn<0xc ѓg2.6uR]B 6*R=guHO$uP\, D>gg䦳~isbPҾCUX3hxƒݑP&]2N1JOQJ({K` %J ftzWw\+ n?wHjؑX\fe$11} ]d2W;KK%>Olt9jl<LUZ)s^Z%%sF:/f)-"0ŨcԊl*_QenIENhi ISF:Px<+xYl:6-%TgL+ZGȶ2^-\zWsS S@䥏''GZ33䫼蔃EK.Jvng+z<3{<;Ov qxne#R-} qHrɧh{ cBJM/G4}SUg[sň;!4ǫzfuYS~m5P틵.ߕO]_S3՝P" scK[ʑDf[*X ;\߃+$GF+N14֡M2`[Uf-FV!JOa߅*кuX(45]G@rzq̤j zvU8%iOt }憺q)#*sS0؝3=F=uBtoXWnIj)Nˣ%q5mSV;پ^ Ѻ)L:uzb0Il).](ah+[=lP^]Zq>M~1/@8fUmͬYx3^CuRZҲ*ٞ.fNc׳NMӸRI?\k֤# Kl5Е泒)C^WWj#i޿vqeڹ"_wG"Ki)y&kB]}SPGtS Fuv *"$]tyQw6(Jxp#dz?k_Ōld&bn.63cWО={:LPs&!{9@ب:z`!L|۲+z1АPt:(p]XhnǼm{}Bu4yF_gD%[׮>Cq\V`[Z֔2_eGX)CŷӾ+NdoT5_yC/2cWdXwгvT4T_C9 G18GfXal :9jP됕T':1D3;Xx[$(ܖftЯсM9tu) s.4 ,(@),#9 3UuceSU›Lu[KVuyyz6K=DR?kr Hk–}qp;S[7T<[N2N\J IDAT\;rz|-JT/鈯@h{q΃ŋK Cz)eJ5OEebFY(yJ r+Ʃ|pyUz؎e%e!£ҝdTzзGu&7WGyc)*6cc-m 7jXoH^bTIΦДx(=EQJs Hb!dA&؝d>&QSYӨpxep8H]k9܁39N\ rFMJ=c Zs.t*B]2bn~Ny=BVTCFC4"Rs*r7I /wR.} p9Ao84rbMrDBXe}(|_^Sm׍R.N8۹u6ssN,i#aub-ceԞTOr{*:0&àbsss cl 9V ٠ KR׫Ƃ^ed!gK< y A1RckǞ͕! 5&XrTѣs͜b]XhdPwTiW2[10T1~Q)RKk}tcRl҇5J(J,B3ƜI~cneI~~hO)_)DsT2L*UĎ] K* KY]'Tد.Z{CE1aj?hLlIVjoL/:H~ӚȎи:6cnTgvkF}j#صeqgprDts1]jf*U 4&+"=:U;_uG)}W+= =y{{ l/D'eDJR(+f)ewLų/hU4-/d C"ťons\[-5d/EB)D*j\;2졦^)DN!kE`B1}a6Uy޶R'Ŵ=CnzٝoPen>Re3Z}uu]PKhc*%(:[ Uq>#HyiBHa6TQr|2'՘]o__'v94tCC{SyfyUhb帹ٸQ$>5jiN"Ў+$䱋#=E0E?Q8 zQ̻F9'viˋt9:̢\c*5kcg/:1s"DL&r);R~ e(!󪻨 W)ogg6r ϕW^)UBjܒ6 )RPmj.WLu"(42,\z.Yߋ[kC^PBYd(8F(Q 쁽T{\1T3J˵7sjh6vZ?1uS͹8CR $ccXIlJnP!7u onDJqR !2G2+eӻ'-+7ѣ|T3BLɰlONCPMre|5/P HM3ְ 9w5I yk}%̽w]vMo+U)cKWY^c6 q.P޼s>rzNӇ+t c>8q^vuR(%N.uAR~xMzS{hP EQD˨ ~2rd~BT㖧f3b_n ZjYMe:NvñC;AGt<\MGz Ec1R^1e}ћRRV˻ze{!#Xt:t%do1PI^B_P}JQ v*Z3p*I-)$߃VM}k4a.!D *ʝ-ts2Bt*u5rs{[/˳=o9Ɣב=%˾SC0# Q|ngպ?kw}ʕf߈ꢦ3WRcզP k<gƺP.tO1HRu lJ (*hRZu2eVL 0!.KD!á1jF|J\Vhr> ۶Qe>'&Bzi&yzDYdM7!˶k];n݊az_MߵNIwtɩQzPBvMxj؇uS2qrHH: I3bIܣ.g_fY;A#z˃\A!H_J^fj`ts-$e x!x ԯ:RZ2(1ĵuO<k-3LK13Ĩ ][Oᕈyo)BHL&R 1hMElJ^xbE_QLBw領gp*s}IX8Sj@e #Z_=Ycd"=91_g֊3 Y%4LS0;Zzv] £Sz ^)$HXB)i)R[\ x&OҠ HH~ڼR<TrbrSk}OQ- Ty[HB]&I !JRoS{c 4," 58W̼K\H/ZX@&׌zXj EyMTx^ˬ#rOQuhxx2WF+UjѴ=hǀr"ҙ-fDuivJ͕ly6SUNhL jB@g7-^YdCW!r*,([klml:WvB%* } wvYiҴiy͚HRX#KJ i/*-5%Y^BKsX%U|+=>hY/٘m)* s9DE"o~nʵ}tQkr,gҔI5ڧ-:{Sߙ1VvI2U|Uv8n Z4紐1Ȕ=Q]٩KݛֈZ;WBRK)q%.h0ԸeZp!^Wcj)!+)8XTh;-WOjW6@$dDŽv&uNfiEשVw=dZxLBB7DMw$!2'`D&4sQJƙcYu_5lל^NO:{S-2UXqu5-uSZ R_ڂiuՐ>8,0K1`sNJץOm 1ڿF<n%Ǡ"}OBN.LSȻ7)U,UYdbȚBݮK60ZaN]ѻN&'Fs -8g6iJɮ hn(he%-bU.6?UL &XUC/g"GBR̪xੌQ´7{ ;B +d O6Jey:k:y-(Y*F{)j\6g&bl} rC.s5*gI{1]kaBa~~sssNj jsgXB"5]#S c (3ut2rB(+l>&*s%֓iK{^H[O}IJshZ*%q(F 6^SRu*mySaM6*y'#25^zyCE,SUM_/{c~.;p^xWc- ϫ|0jhvKCU͒oQb-ekw.J~HH;jz1(.]V6Y| pJ* $ +ak w24+Vު%$ U~ Z:C'iLqy Er#C Ƽґ}xݡDSWc\1i˫UYS昰v^ϋY!ddj煠4d."~*j¤ѕIS>]3Ǭ7>02봷SP45GPP6\U\)R!Peiz#YCQ)c%`Lq .;WҝgL`.!` 4 &yUV %ۨ zڃL1tRT4|$撺X\LAZnH,YFS>!`U*jhuz&*G V˚lFh200Bcs/#J~E!]%m |`LY;f>-:EdBY-DT?HV8HƄfP p^8%JⲏYxw_}xn~X骈PPX)פm`7Q=Me~gp&H5fX&# \C 1F077`azzua7dćDmf";=}ǸMYs*n`:0Qr309ب!RiPbc}dG3λuֻԷZUC~]8LCϽ핅6SsNOB댍|m뻠Vs1ڴvat Jٹ&;P%Ś5{HQ9OMT-ZJtsy>*?!l bDk6SVE`*aD6Eok#'Qz6k9ag e:`H3h9o"zYFX)_Zu9żP7G Ɲ1XYO2=t7aFɃ,BյDem""Ʌ ݊;ýA qbVb~XC!pXY3BL J /N0 eAcnV &0Z[C2:^55+)tVQ]DMT'J![!˔gdXvoKq.Ht(KdCǰ] U@1r KΩtvLk}d.guO" |D|ӌ  ,$@x&D!Rҋ^,RX3s3c^RѠbw#!Y!\%߫ @k\ѽl x e?23"T&LY1Iuq|d;<{1/3[?n#\>L()J$ lncli2PjHV)"ЦΥbrFBT]o7|oiAns> Ě 2*++| ݭ-C<s}h>gc޿=W#"A16aLJr؂\/C:5cԻEт8s=T3L<,ՀJ_t,qQ(@D6oLjvܠ{9s%% m!K!(tZec)P{N{ N0Hiy1Y K]6\e4Sl(FsŢk# ebrmRMxu7dmϽyϙ)nY!{ݮNK#%ˡzl^d"d䊵Ou3/4 R[.ֽ UO]PeQwpfdtzIfj'6yY%1L*z" #mHSL|ur EE8 1)'af&.#\qͩ4+nJb]w> h^b\>޺H?D9vYddI6xXԵZS M6x7B\c*'8lL9&_SPOߞԕ\ 7 ꕶJ 2'9 IsX4UWG<^ĹBuwe7JBS ͜VS|yx|Ưf9s^\]sWk/n[9{Fb\`XmlcU&kQh7 s\e\ }kk GX+m.oB!69XNlHn 3@x- m5[hJ`{(+MkCp C]ݖN޴oI,LmӺ-z]zl#pn-)^O̢~ATaJ/Ion°Nfxz3Y7؍aI_ry!K([BWUvzSd(;)87hB ٯJ.#0֪!C*Lt }67}+ckHm30,iu Ő ZK!ҒCVacI)177G$/<76LHi`\6OW}ܚ~G˦rjۗ_:UB+nlsSt}ߣW#DO4,t9ShUعf OQp &\E;F0*Ye I]>u)\ngO5%魌Seg8wBєb ̾a֩s)d2~[/RH̉ymfu'C|~fj9ڇaYt0Dʆe;rk$+or8e>Uz 8t4(` I| 㺉S֡=yFt, !)eu[<՝K8_J^KMX: ~ZJ]/#JN _q]@t˩k9mORJuTz\n[kd%<.B8It!@BnNHJy%pۨYI8!lل&"w]P=Bݐ{hP)ZPE.ϕvtP1Y52 Q2B}xƘ~_V AwEISG{}5J3&i[JkI+E"{Ku!GJRFJHNVJbfvl]ј -dRrAz5t~&G}xU9_} vZ(3z=T榪O(iqb9 .N5Gȇ n%5*Nܢ#No. ߣeFs,xOB_H3eME1p^hLJ! w!'}^UP pgSJ>\#ԗ؛i۽4|L>ɏF D!d\[VC޸^ +nVv`ҠtȋաRP|h76B߷.bzcZVȚoO/6kA!_/#DXe2`"'Pd5 'S2fmEP|{=߅n].U"sRRFN CK +&d4 ['j,xQsSXG]@'(toHSS΂Ow)'xQTCR@.l7 Q,9b1L jkDG\V!M)EU&X)̇b08V60lTXׁ>Zc) D'Em< ;wy¶וGhVsL;k՟8T0 M`)(Hˋϸd9J,M K.a3kK (-Ŵ{CHYLY( S+hyk(!r0Cm\V+s)0L3 h]36C]\KA/yK= qIԩuxHbD)r]?kkTJɊcdj\ wzsiAD)^f.rX[e1=vp;N^ ~vwfB!^/mrDz+W\8 "-$hl4% jksnXcʼ;}&)(Kz]Ϙn1G!"V(; ֍'.[{/S)޻IV ^ UROip++<}]zLW>6(] 0x>Vv=5ډ}jA FE"SM (ng6$]f˄P%RvR _!9l).l\ϵ0vwb5=!pwn콴C#HpQaM) .&vjokaѹCJU"&"0fH2}Cud:^MCӹ3 gOoWJJ6 }JiE!&ƌSf6bRN!8eZ]ϳ/B:wJ)MtO&T%G k 6&[y'2R4Ē㕱9?'!tj̻g2)E8:V!AE26F.)& 3ZBS鹲Z˜Wt%2xG|g{Se;qkKXLUH"s WuTC| akbqhiuIBY$3dd5W^gGLKKjGY8V9O -k7vQ{65X($ld\1xK K7d43 5(NCսvV-o=ͿIM%p|_:uۜ?XBy򈳸S>5{X@tBZdhYafe Ue68UVzND\_a UszDAAPCJ<$JK[I]D R/'|Ȏ}$`C>:vߙ]s&KVU 8JS˕9 `ubfB]u֜ r=++irL]HSɥ4Y)z2u%dW31ߣS oɦ*9VHuK{5l)hiv[,ݡ~oZ^` ^ RaBD6^WM`BtQ(b"a̻ 2 ,*Ck7kH)Zl);m%qljppb5Y(d-SGIV[̈uEWRdK{$z[{m\lbm 1̅д!,u;㻞$c V1s3JtB\uN{s׫8MqJ·ZB^Eqky}4XbLv/O#9`j wWNcW^!ʧܢ(JC6;ߵ}Aԭõ)R+[eutc[\ S^f{M9MM$w| )%,Jiqͦ!)7MrHe~ԍ,\3PIDd(ʉ¦i+l_;f-d5|CSwŦ“y<.91$]u]<#j,[h5k`͚5Xv-.]xY1a駟%\zl|3B;9H=vbM,tÎ9I{?B݇A lצYVݷ֝r=}t8]Vګ"0ҥK^z)d )pl3úK/ҫ}TuV j]ס-ͣ:}(T5J@1Xμ셊B+L<2<~vV̝6IL]إKoP٘[\~뮻¼^ %LX- 9Ӓ8/ 0:nrBmxB0Awa`S.ne'1 슧|n>6Y J;1plJ=+wvHd/p^0G>F>l\uU *R"kW.PUIBY.p #U]BB񶩈BthƁ`bmpXn+aSP0{oF %F鐺Rg%I"i|qaaƍXzuZB nVjCFi"B +9nouyY*d,Y'p6lzkp 7a[o_җ𶷽(A=033}{N9=.(=b=$QȼyʤxzHN;ޗ'/Bu62C_Eθ~e 8I^98w7HJ 7p %Wp7l؀O<uݻw?)nF<0o[\tEx;߉}٧~}ƍ5\SMnTX$J(ogJG뱙 OXۄ0q]Y%115PTV IMqFp4L4 [n>cEoOz~Ws\qeU"!<{YX싢0JΚ..ug`<|Kb4/8\s v1Ha Ollݺ^x!wa|[j07wv3OFYg*h僸({*]FDs#sBnB>k5+333FƺZSEs[\o|Nm6\p>a x[litr:,/Cd>d;J?wnG/B%hȀ =`]K¡ϟh+\{|{HT)`vvRF#Y}Aׅs-(;2=PlڴUg\y?[m{1lٲ<s=ר ѸRpKN'Yn1F'xi͉26+[Gt+A5Ht*uc=o: oٸzj+~Yw01aLw<زe mfn:s9X|<.fV>\$//^&Ӹo: f$JY߻r&ڕ4eSz ?җ[nks<Ӹ q=Y7o6?W7禼Ƹ-SQSfPNFA+(:b}u202nf\z饘L&맜r /lmeKPd}TyA !0Vgbp{(!)c+_iP7 !p% u1aLuW—V 'N;-"l}8ARZKnq{?G;'?h/&L;w}@9z7XN8(NN8<91o} oi3a cAƝwމ.v2^߸q#^׭Bġ$1S름E^Rf }IZj&}XgUC$2!>wJhnd;MJm\{ڔx ^/~ǃ0{Eܹx#FFd;v sZk!Ƈw%Ew㧰̹>9RҡCLФŠXҥKq'o߾W\q ]1a,ضma3<8[ʱrk5w[v;l)Wy )VՈ*gz}ߥdQwr'b}_L&K{A cX裏:h<@s9XdI"IsGg}jx.8*C_P:ׯ7^/w}D0}.6oތ˗wV]HIB]8$ /-#/Ԡⶳ 0r6oʎse/3qw1a c1Ν;V^-Xzue1J!}y)1VȾ֫w|Ə%Sn "rr كXbEd2ч1acݸqwX{nrǫpSY( Aty>K漰$Cw/T-z0lcZ6kG篅r yeWa(rJC`F]ݔR{ܞ9a~~˗/otMxG1ǒ%KvZ]x<ޫ}vvv= E_x]ux\?w}p} j.x/o= b3%-2Xm&ie˳v/^רz0L s'('|G0>╯|^uOpYgygws]}sx;1l"ĺ[ӛVWI'5,T!!=UӐl>3ຏ~bv 1gx䓉:` ~EIʚ8Yz5?p~ a 7RH} IDATRz ]jz~3; ki_s{NڭI@Q_|#u)$euid%/y}݇dKǾs9Gq. p7 /Ł+V`ff> nFó\j=\<ǒ%K裏.3<N8'pB 0|?.]?qWC:{vZ|SjuRc9眃C9Ξ7oƆ f͚9>c2qҥ83qGbڵرcoߎn)6l؀?V?wWg#<RJy睸KSO 0~`׮]8s\Wō7Uz4G{T] 5BcaZ>e84J JT 5!P(aE^YUKKaٲDUVaÆ ƍ?$^:VX|#W я~ŋ,[ ]wy,_6mۃJ=>L&{ns18쳱gϞX!CF#vi8}l@^㗿%vލFE^2>KUv]CT=D CUl\+_UEj;И0|~5&<zkބֻq {bX#eyܗRVY:^^8^{衇l{x߈˗ӟ4pwpK/%_u]O89yWF(D|0?|%/!+O~(ٿox஻߻iӦW_]CjRߴi,YO|xO=6oތc=rp;_wG\{Ňׄ$uu\x,ooZZ 2)eW \qp%8/`?.P7 \5X=cǎ~Wv]waΝ8ꨣ;LuV[~7 6l؀׼52,Y9^Z*BPwB2|[n5zCͽNalݺ;wʕ+rJ}Ja{¦Mjxݝ(*!p)*W޽>{ [TcWR>ʘ=c˲ il6e Cn3hN%K`C3Y.[M69IZ[W7;ڡHi+COMvћonnW{9/ ˄+MbPaC[n8ޟ㪫quB۩'|{SO}.֯__unÉ'x㪫“O> 7nĻ.{x wyx+^Q{_Zf] 88rJ<~o|{.2c%/LT|I\|8s/}K177zٸkvZz꩸[?ce7AO;gy&6n܈SO=v֭[t>O8qiaϞ=wvhn(c>: {,֬Y;vڌ#ڵ ]t +W4]Bdɫl%ZwNK1;Šp)hٙb6+twIiIpb*K)'A=-[}&Trt%&Av=WEy߾9W}6gPcWN2x;Acq衇O#<={`͚58餓O⦛n&`L&|_řg?~}vvg}6!15K}}}q)PA]{>O6 \SEۿ >/8 +߅?,6D\q0cvvׯqY=*K3s1aH@}z?JFxskF?coǿ˿ '2jڵ vZZQ8~zkv+ҡK ŭd{L/S3F5!/c1wQڱޔK~ }Ql߾}80U駟gQ[9^ע(FO~n\5)9S6ˤeggpR41;Gbվ$Cfէ䩜Կd6vYC z6s\>K HɌvmc9~k_Z rJ邜U N8a,M 0똯 P2«\ԧF6?*I.ce-QE (ƞkϾLp(_̣%S0& nAc{Wex!3 Wrdèwߍ/~x駍7n܈s=|T5꺠 Z>RhUouCu{XE~8غ(tJ<<̰7^M>ѯyP{8t?2Yfec}F //ftDž K샣ֶ=w{m= zO> q:=c|0%Re('He%c\S,}禂e`Y|K߼UO5sbS4{scɔ\7:^1^C:R{Lgه9on7xly-?~~nwڝe6~뷽_;DI8=mEQJS2ä*Bl)(/N;@9rvƪyҶ5|P{K^aƯYXbŠCf𜥥}/ۛCq7[> x<0;չ_0VXcxbĝ8lU!%~7܍m;DwXYec'vK_c7jSe[=R5.|͸ ז-[78#fl߾W\qEi}9S7;qe'x VX<ϲ:׭[w?zW$ݡoga+W-c=tPvۭۂm;=?TvHpl+@rf&C9[XRiqFЦnGaI. x|a^(B2:={-ieIC7%M+>UQ.͓R?ΙE)inC+'1߼UAw3:]|2.SݣmSÓ۫"_Uê* ^+f*`{AmU_c(٘3K}iw ˷f=}IndW_}5:::ϑYvxwફC=Ɍ^?>1Z7XhO._ގn> -'f[T`TT<H]a:ܴȾY!IG]*< MQNqYsNhޭ騩?Z؊dvVH6Z7sZc6ĎYoM`wOb'P?Zeڝ^boؖ\F#ZJ]h&KndӦMΝ;SNEOOm&_ۺu+z{{1m4v=CWW&Nc<<n̙3GRWz3z!tuu|߇5db0 !|6f0:X~{܁=Sb2@`MĹ*'jfA>:g$vng=G!Fd@_lZIV lkep3cy{v?uS:DWWW8s15}}hiio !#矏^,qM73΀y2N!六ũ"sunÂT7bF My|pa;|Թ:"b 7Ktnlx9ݣ&t8G6FV|>x >޿Q u[~:t1nܸآ5~xS}'@R?Fq`X$qQt8նBZsmo@V'哜ﳎ+}⍙"dS4$tcp7oLzq&D_<?*^pzN+.Wll1d7UB)|f+ҍA:lI%iQ-h1A~xPrSiqjϷ~&L07oތ&MB[[6mڔ؟2+VDAm\s οBxyDLhTlwlgGNsȉnv$Vρ)ڦ9#kRƣ^i!GI%٥gO~5uˇycAϽ_vlx@(\a6 `ʮ?Z}f!/cu;Qm6zN y'b?qwn߱pN*Y~z#˖-ù瞋ۿ?{ x|r̙3w}$͛7G?؟B{QT/9L_RիP̱mxw u! vg/h8H 2I5}OWs'e*Iэ<ՁOM N3bDcAmK=.0хB~# #<ER3 @lPnz{~W [qNbcD O|8㽐?S/L)Ћ+N/bjm6l+p9t|27Vn0gT-j+#½ދnӧOܹsq_~Qw}1w\/Y===M)ףR+_ \ͽx.ʥ2~=@)z 6~V840JjԚ&ͣgi9:532+ ԄAp,4mKaHcó ` !/q~(H#$ #(` 6LO~Ԛ_n[nO?rKl믿+V—.;^#mrEarWQ.´;"B.A֜ʤiB)exbjց`G4g4@$CSu?gs^%s|!K먇 hD nx4*K]%r-xV IDATb 5f̩+tv{ZrRڛ۶mQ44xD1r )BA?:ptanMv6?cۀEVg/$@qs-r;q6l0tM1ٵk7V|^TDRUˤ48\?|K{СXp!8 -[Éɓ'?!:::~K ðað`L2BlٲoqB.W]uU zXǵA,Bl|rPm~3u wU ͈+;J#5/yBԵ8Z%] sv*3p];ƶ:SFMK@=2C͟wyؽ{7.] ۶1k,,Zi`c'k---g$Ea֬YXn]~asDڕW^~1'G["Jq-"OW\ڂ/(65 m1}wHԴ4!ÇT< B!}X:~l:,ԉ!'Eͫ rIDCՉk/ y.L81Nl۶MuVbڴi'l&O.۷N;sęeY0gΜj<MxlJ0+T +rz72_7K= ȩ#xĪD&ּ);} \:#=kQӭ9/s[Ygg'nܹ'O>at'X,G?Q|on}q,ZӧOߏzv&mrm4AˆeS6ydinXV}a0@G:U#PIO%ԑMZ436̅[u,tSt,lfMs6+& 7ƤݍqSǏomf٧Çz(|~!B'2 8ڈ jZ:mbh6.Ve^,z>'9}"ऒ@z~Zek>o>{XI;^侾HtֆRѣG1|p{7o%\'Iֆ_~yPb[nE]Ca׮]Eir/is\ߢ;eCfQot(mXjGVߨߓx4m+̛I>|q@C{@t }?iЌɉFM =cu^a"=z4z꩑kn/۰a."tMػw/ƌ˗ȑ#X|9̙[͛#G6زe0sL|ċ/nJ%ttt`ɒ%Eco;0r> @]8,|Xk!`;6,~P4݅G!s7: CJS+]Dm;3|vyV34id hg*3a7ʨȠ֗?] c3$>wNW3PS*?AP(`(طop=zwnF̝;WFK,&n3uww{ 7܀Yf===رcG~rСCqwIJY{>J҈҄/]˲XXljrh0LE'ɹc U)O6@K:] Xt *YN-,y!-]M%?O]ו'+  gy&>x'5r-N9~舼sN,Y$6>|[݊Fݡ&0q ftK޶]15螯&}4M=Q SO=5Rs-RSOŋyc=s-p)+J8XvC4'-uX-Vk[!0H8: y_'="IֹhU;jw' )Iv\eN_mvk-< ^{5 `5U|KNa1؃u) ZԠqlE"B4)8\MdIRh#ZҶLͫ|2Kڀ>ZU/ 5uzwmS4dSju]gKu$pwވ'NtwwOrnK._c7JRpE?GcLekBaY6JUbQfn]ZhJc黴$T;UAI FM۫#I\r)pK?`}h=$F!}0fS^ȟ"Y܎5։3Zr+>X`O`֭HQɢZWT)W(J/ O}r'N#d?[wO/Vxȑ#8pvӢOMVݍP eNeMI;8}q90j(]Vj\qKOw݇~;+p}}} 6dOS]/?7nL\n,_;/zVòe˰spd&@7)RQt5OSX,FR7F)SL P~7rf"\$'+J]&@,'Nƍtꘙ25xu.Tk`ή-=OjZ L'#8qb|3k֬Mn?>N:$̟?gQFСCx?>gk;b 8}iooQqgG^#<={m&D1NE@N}R=z4MsDvy;Wu )SН${(سgOQƏGfP>j5m NvP{իRJPHF$o]=. ?x >, f̘kמT*aĉ1bI#G`ؾ}{ /==?yaժU'dVcq9`B_WqgD^#<"'ʈ΂$qjD3֑FL2%]DNr<:Q;9:,B0O2|T#Drل@uR\9uulX@"/mC<^`^\0Z' m6̚5K~~'ǍӧZD>vI'ᤓNĉ[o+NcRK.+VЏg`>Md ?V.qma1Gc5gv4;)@^ s~zhtwEkۧb` TYYU)*r-iwyq]ETPy e%z]r`tΚKoj5@X^E7({H7F@}ܸq8Sp3fT踳y6m¾}0o<\|x'"7ŋ1vX 6 ---8|0݋z 7nls:W麸+pgc̘1T*ضmBeu]3f ڵ K.v?˗cŊniiu]iӦw3|Xs.V\wu1c{/og~3ڷ-cСXplق~N<ϣG… 1auu6l,X)S@-[෿m$h"Lxf;IgUΉЩeQ>|8y P)Dזg DJ(&^`-kM33Q#Gދ(͞=/KO^DO}%*{ży0tP̜9ׯ袋bdgg':,dڤI0i$=K.\|ő >ÇǤI~WzӋ/̙3#Y,Nco|F]?!lkX^r~ h& '07 y+Tّa;G-#yge `T*ԉG&Ek׮7 ԩS1twzzzplذA*:#ϥٹ _7oFWWmq`9_%瞈ǰab۬T*$Fgu`v> 6GygƎ>Pk.SNEOOOM6a֬Y5jwl2̜9CW_Z޼7j^{ éjkpI'V IDAT QBuŊ={6:;;q/=F/ϵ`˗cΜ9eypȑķz ӦM_{K.Ź瞋o}[Xz5ۧ\y7_|(J%KHc\pX瞓ʤ@ñZ;h'#~|[>;&`z7L,..=9_it:*1Kq膡S(P#>|&M$3?Ňnַz+ヒCaС88q0d۷M-s^L:q_{zzpkɓ1rHj5޽---VXd * ̙C<>dV\ ۶qyITr?>\:uS_z$fbcر:t(:ۇ?x7G}݇osΕ%K"=O>$yCOO~9眃yR+yƽދnfBgg'zzz}e]gyoVt!wlX"OV]V㭃e95QWYuQ՚h; N ;wرc#M(dl.TcU_ٻwo GV,JڣVN!~'z֔ iWՈ0}Ggg',XC=t\ԳΝ(UQ XZVZ%rb_~yLZ O>d0&E~ɘFF~S@D"Nw'PiС#vލ7jT%E&<رcPTPV100 gg)zINlF߳6:jӪŌ3ѿۿ&U_<%rnB7|sL|?8X @ tx>|!8>/oqIFi]JҐbk7X|<< f0)xm*:xc?+b`NߕLW^y%v8q"Ν{$.۷/[na3fLGi*ݬ 8fR`!j un\Ui}eQ+gL#N"f2b{u5}UV6\&q;:$R] . ۶mKlwbشiS`r-$wܡtI{,9re1>k[]K3 Jp3yE_*d&(Xdp]W%u~*]7uT&J3,ۃ9i:&^~Ȱqh"J|E-dv';]# гhy={l=z4۷EiyUKPX,¶m i! @RV,uQ($s_E(T*Eo|Š~Jy_eLUP(}ԁk>q]8aSvJ- bx8Q-v/!FQwKT<_ )ȴM%vws!5k",OzDr-asnXjLH&T Mi*M hE~zět;EbQ∪>00ysDZ#r,S\.Krx&YYQ E:KtIJ1ZJē݂pz#۠fb\Q)uB<מ|A IcŢ!Çzj\z. [9ֹ[nYǵ^Z FVĦ6ɪXi${¤/N\) OHWVeZܲlT5ȹz79ȪA΅WmTfXDװP(H:y9B:ǝf,ClJ'}x)n*[^^) iavڅ_| רO?99@qsK_Rl[j6l l (M~0tkn D6c ]lű, S׿ywuBq/~1@<O?46nܨ'GTLMEi`#J~,|4#~xޞgY `L{ҨGG\.j2;Tcd!1hJNvy`Z&|K<Ox]WFnP ?'х6Ba͑:tPu]1er-f#뮻\rIZo()B%] lxpOgvJfJYY9 zׅVR nzG"P~}|ب[V*pmŲ|===xpСHD-4Q4Z ؄27U{2\z5!>2^,,YP(j!`1SFNSS<͉:` Һs"uQU@iD޼G^:B@|o< |"kŠ_(ڙBEA^P"M4EQ5֯_JK͞=cǎ<+WnV,^zjbҥ퍥 x,*`#Lo? nD\ٌ3CHA }֍G-r-4eGQ&Ik@Țk !P*"Z;wvt@OqKW,#ed'^G|9h"[&,X_h$:@tGwF mg4Յ3gƤdmƌ30c tuu7Ć p|-O}ٸcW^y=\lv/$B3:*Jb =R'ʡO'W=wjj_yt:8_'GeQ)gR,R>*LwιIZ 9*t[tlM`MIJ,؎k/[Ba};v<=Sm]1p8ׄ'/Fyc)e?{n޽'Oƌ3ڪMˍ7W^y%݋ 6`ػwoS2G;<\wu>_~Y yQbib4{N<}}}(RvxVBV6R捌~uNFkuj2\Q T*t(kCZ7wVك{CR̪N۟L֞~i_>% 6e998iv:_RZLf_Mk*GrR Щ˲ܑR5uP,瀷QM$I;T #iB PГ#"@r'_)cK_,HFh n3]~Z 뢥%yIrIi 5Cm6l۶ cƌc9b13gWrxDZqL ~^(8zh\JFufu` vJZZZ"v2cjnz}ۗ{:V|@5XWЈ.*+uSI\GU: di AJB~CJ?kH4 (j2ThJGΣ>[6q2ƏQFanѴzKb۶mMl*Zt`FRD-L7z4/=ij5Ĉ U`IAVrf{!]7Qܰ˯{`EY(] oB@mۆ[(&USQdD -9Nݗ:.p<`|8Z[[%ynĹ۟d۷ԬYhND']ʔFelf! ˶pxfi"(<_.9x벓#WdUwKiW< >%8[\7e+6+M'Q=> 'wSqN2ؤ^V:)R7(2nzB.E$TqOOPuQ.#.bpQz@qmMD4!8wdnr~6S[s]W: 7&,eIT*7 1n/! 4fe~Zz橮#:ߦ眷LuP R崍69:-=ktbd;xyQ6)&_sU%ޮBԃj"jCdO]MD|ΚCё#5}Ik3^T4D~gڡ"۶-Iqܱ􁳉j:^Jo" k\펷"2-ÑjI*8y~ ij>`r6hlfa>zM ;ɓZ&9S){ ,5K݋;=ˏSuT%tKۢrJ%s1p=$>L&r`hEyG]}3e*WgMJ UҕȺP 7$*YLюm3^7ZZZP,cȽh5w'_Ĺ ,}7 UwKf*; IDAT5teY3~GǕkP+j=/ P颿?9DL/rtRSA>M5g0J7>/Nȡ}liiD蚼T8 : CGYE@$f|x􎧙dqt"ťU-{RPQP()r5eT` %͚M>y˟X|I,eQtۂj #τ*ASTyuB%fZ O۲YeGrЍqCVF4yQM]lò,ȵG D$9H{ŝcsA%q'_#rh5uk:+ ɑ})%nCLQROd^cI;~"UęiC4 - \$@EzMv"4~N{:贂yJW%$-:0Z4"qDq٬:mK{T*J%"E*9+̥'%K N!M%*Ђ|Aӥ^f]J_JŘ䒣Y> PqeFg< k:@Gf*2!a$)biY*)4zk5OL-ӬnryZo5TD;OI j i":*Ʉ_yF<Xbj&| I=l|ҍTUz(R$n0{Y4R.JR$FMY}cʺ)_Xut/X-hu]F]!(^Jrjh:`A$K)nӐc) \Mםkv @%w[<*oύzQqQugv`Æ׵BYc66cx I;&v9r$Y:?;1jը4OpgJm_SF<L8Biz@xkj 9:+gGyQ6k"(fM_E< 7-2>ě2%lr\ץLu["iR۶ćِ UwX4K[~G>z{{%3.W)uQ3(RIaE?˴YdDM=s<8N}Z%͎rF)C@@tzN4%}چ00C2+CvF"KB~7MXJR[\{'?< OX@!r&D' 9?T<O z6:,}i|x Z&T繩\ȍ \hR਽eF/gݫޙ1xW5CT'yUDConm+|;&r+J\y?U 8+ |gh13='2+3 )fJ˧ӓpLAijWammp;8q :0k³bBI,~ /}|1BU@B]|u)A_jtL[6ԅU(KB:GS o!kMI~$Plڽ+*Ӎ]’@P,ՑMB1:mJ:(hmmM阖Hs(!kj&=[j/0?nuE%Q'-vh,:٠!\"tl`KYn4KLò /cɤD,K%JplM Z$d"a#kG$mTSV2E%ؚG.LﵶƈjrĹ@98n%ƟAېm<D2*XId1TP|Q'h]=W ifsX6JBRZ `A];*.h*HQwid/[-FL CX>%aQsgT . 2ϠqHIMs)^O F6-|ZK&O1+XC4?1 3,_Lh`VͫdRZ}x8۶gv&1,x Ӆ`aATd4)V1Ҡ|ߋp=* ,v"(*@2S#yʎVkAﺎ D*M["ꮅo4E~)QHKȒ~UkB=PpRUдPJחn4D8'9F*bɏA-;GT Qjۃ@Xqϛzrmێ-^y4I \RI@OCʵQ/hkkyY. omm "̩F[ivmږ:BdLu\%OM7vD28k:!iB\Z-2W}0d0$~ҩLDNb\ vߚޥr!L|!= x]c !3(fl`>?VP `̱bvn"4*N"*9MFpP*^ײZ\"țƒZ;l5`\\k^%Vc׽IsI#:v]S[LF >[Ȗuy \."CB@~ǰ}fDX,A@FǢ)ܶ5{XJ:y1XK )1ht1[?u2131C)0{'a`M/'Q"#Fʊ^h׻< 0*eJnq"@rI$BkeǮ%=cf 3fb!11I놼+;1o7O OZ';CqEb ;Nck8tdc\C籇c(qkL)V4xSu Xtxd8Kvs}seS{9+nYmz=Y֙d⼾䀼x<~ñe8: AP%g19AY߁KH/ .[mT %ziFT ;g#޻)˵8 2?d=5!vs1[6*Xչ:@sljکg-$TH.p\` oEX fуZ2ڥp~{% qvÐ#cΊ=Wsdh c6'rF2"Pvc}g:Y$h[9j`)b |>zZ~GmE:dY~F W8cL=f0A EI̮8|vKB&GDL$*SIЋˑMRn{ R^˞xz{=w)YqnG y6f@^J/prQ2u;&sY?udA+VLqxĻV(T+⻁RsbeQW^:g~yz0=o4%Clhve"It^y,]tlSzfq[WbWWǁc6Sc.yc6R-j#{|oSm"޹|:q`Pp]>&MV, 1f,"(Ѱab Z \a/6j s%W׊ZZG{ʩqbUiru>VjuU˽=.C6 ~5W4$:|/a!<ŹMbL#yD! M5T8cUҟAFshfLڶj-NL 6PAHOkZVCaL ی;:\{= (s.:t!ш_ U(;6v0lÿgJh#yVVowi]o֊xթX̓!jLU9:NW ;Г@J98=U)!\OJ ri ~JS;1']kb2@Zt=6>gN,Ѩ:)˼8u6"4y&Sa^I]/"[z2pwqcvᐨE(K\+#<:8h]0 "tCx;{inX\ig;s?/I n a֌u}ml|W\Av=]9-5cs0KZX#{/mGZ.WR i'i&jw}nr8L)o&dԑNs|?HɎ4N=f,Ε?Y׭ ɦVjSˢ7޻K{jQjb\w.a'rpn.$Ȭ77r8vΖ@X,dژnˉ0'q+D )X-\P&М9cs|CQ7%クvH2F9CtZljdUY3jLkѢ֙K@TŶ;mpQz^ϒ,ͼR2׋\Łkrrul6 J!rANt rle3u]1|Ęmk? 2!kl3sl% #z3x>q ñ`+;.ĘNvw "lg,ba2ܥ_3FR^hƭ[nC_N´1FP:h,s^@d6l: s{1;fx7"l^OZkmR X ½4ZQ: ,9:ݹ.7tl#r; aWr?s-v|vEu& T~X Kf3,x̰u%%i^}6GFx z#A1y@d q)/'hd9'?xi_nwi&aiK8Y3jܩ{MNF ٺ0MLetϨ#㳈]vފ`7][X,V^^GE Ȓ~^IUJ-y=]43lSaWOPceS-fl^/l6 l((ri UˡxVQ=ΆPhď4m#3Knw+v~jwIV3;F.W:#l^Kv pҰ'0n{zΞ72aŚJoZvW#mkiXk0^1KJl3.X,,du{3^Ry? hf[/3@/kDƤ: q_/˵. "r<ŷTUtCwH82>IY$O\ kvӍ{6Rc;d,2W]׉ tDB\+mA+޷H IaH@7{޷3nEVZ46 Rjv@:,r2im%"o.'\~w~ØgĊ R#ɘ9~""sm_5]zeH4۶" 8lJ0;C""΅ި!\xXUTu%"Ĩ'`4屡s꺺 ߟ<nDUU}rYem$UmS g@G kxIÞ ,7.jew|ָ5cf0}!@v\c>#u}5&bgsO<FC BRsBfhҤzwqX>NdrA~J 9iHF{r=p9ⰙC rǰM&}lw*=r7 RU&ì{ήRrp!n8祮|b@4|n:M Edȩs{:KNI rLc7}s*=N1}k%F瘩ppjH L𐐵z.F??j%%;:JQ?883 tZ6@52$=! [l9#\ 3KC)ee7F|X.c}*Xe*. 򀕰eDžkΚ8"Q3rf0)5wβ$.J<)o GbKص~j0F vƸ.,ov\\WLT8NE>Gr׀x&9pyT%H=kj| -rY~{f#8޲5s戴ͺ8 nvLIm:~N9A(u`Y #X,|e^ͻ`&x/:3 n_τCx=~p佒CUnXJόG6Ѣ1ư(-}1 $q{׏ckMM .yzJE) Z49tN䌪Zm-%3\y35~6N: h^.h^&V|.-r5zdŖ68"=``0L?`s[ȌPlgSJY"(3S!OmƲ } [cF}>d\exy2aR}tbSc[l~g-= ƼkA!aa'"%Dzy>#D!$Cԃ-M׷>N'=XP_$H[.h"@ Bj_Fth]XJ'-R =d<~Z !չ,A7sXP b1f7^x:sP/AS (@4w=+K ^**ވ3^k+"Ky/Yu.825ăpt+ ;3bXZK>yZBt6+@p^d\DuGd,fR*s!Ёsjq}áyy-XC+\0Qj3$+7 j57ϧ&3*uLОUUuϒZ* &E 2SZ*68L_J|f40n" @x ҥF*ׇpiU KׇC."Jl?29b)}}.1LIl7w7ּ]"?uv=otnAf'N-`~CZ,sgti[+XވkRexq:DSZx,uGkS\U.IhŸ$Ny?KJ$p`¨&~29}/W3C,$, d^ x2(s=Um٢S56tt=Nkгri䀹^c8a*[#uU͘v"sgy8t&*h KV;45G*Y9V|.sTwgGxVfrxj[2vQr,tl&i) ACz{sW|@82N]gFNDʛz͜Lt۶㌴MKO\x͟ye\\ƀY\)J0nfRcNpacN T;m0[U݀OzY.RSH^&1y/gvduRcXoLI+k5Œkiy0Z9W ~A~dȿ-\=AqيmBB(Y`װ8Z.!oAIUղZ-LTYn\w}fm32xsQVKW.)bD1?:?z=h^lnKwn+..=苯2\Z+M̡CZR:C+-|*6JzlRFuRnI 'r:JCo@n f.LmrCrbXG)%q#pX'xL 0mϰ6n>7'kIFS!kVNu-q 걠+À$ l99b4[ju(y켠lO>(c4Mqd s^&a]@݅%D{gY5m\ Ja[.TVS#rKNbvC#b F֋x<㽸&Dp(C=vb> R` Ri " o>6d. 1F^gNb)pn AǖU 8YAAE;+¡ijB ƻGºrpvCTn򺏋pkD ɵ=xe-϶l@Sme9 z1L*\ #ք^3꼋R9u=au;Zy%4=Ȧ^3tQLn"?(fFIuԜX[PsK̡6)2:!¥(va႘L7>o{Jc snAӴw2,38Qzy h7( 3&ڕ9rU,)g[7'D|{] 6&5 ^eF=)A);e.P7ghhџguCdL5Lu&q>G\ *VATzn/V+n\.QY lϞvdC68{ r1ϛA\v (3MklNC7f8ʦXサrn]q/ ǒ>D kYO?rIY:뺖 ""%2ϵkh/r /¤7> oǁ.yOR D(_|~o<+d4@x؋yr@gD yrP^C zǵC< 2#$" >@[q҈9ߟ^)"\=<3t 3]#J,X(U6)D4s4Z`#`:\)TQ748'bv+?~ z6O} 0q?727z-q[L뺮.eku(rY>5Q,۫A=:0Q>}6:VlӸvϒ)ީۣ4@G>v$7_lw[Y<aT] d΁2x7ur^O1&ءc N~O I3mjM{5F81]?J)5,> 7l5l ,#pLqC^m(I:\.ٍ1F6sR ~$ʠxѩ7겸@MPނ\ `1a2g[^>3DDX H"9g5' ]a#NPuJB&Xťzg<$%sdK`6g=\E 3hz5ig a#zfӵH?.3 Y(c3jO2D3QL ϽRj6V]FrPWv~0kC8w8&%&#Aeh ;vZmHxr\ߡgv"ؙU4 %|ޢ#'ͼ] T'삵6Np=LZ+___CJϜHgAŘj5ird0YrswٰbE1'5Gaɝx;cKd*1 Y.sEZ^x-j/K9σ,s3'iRvkZ<p{LupFw'b@^j3O`l :E֘Őrhb9 IgC2e*vE1 IDATM9kxjzNK;ěf0dF#JY;O/sO78EhgT~}mC'aohΖp$%=gF>WVn&vFLAݺHfLSbJn»8 -O,>9'LGfzr=CD{jef| n"ͩa5-eBu6C 'A zNg'DYNwE0A3ȹѷ d=;pͦsQ)?]ؐx)c*Ku'AcGτ[]R3ay" r, ,wDg  ' =x4JOl6l|>Qw^H [g-kHpJs$ɟzr$UˎSX5wQbFhD;-\w  6:L(c f:#L6 @6u@T\q4ah +MɼD/g@s(g^HhHlJ_z ΣQYY;\dC)!g=+})0ŶĮt!g0ME4uscFLB]rtJXf*P7È$m8pZa\f 箙pQbd>4L &6a'g F)U,xMnbXɾ m`6a󪪲}dV1d80Ͼ^Ol61jFHev0 ~'<[0w%( s^D4)A<,r9'zv;q}n'? vwt{ s+"/rm@+t}}e<%gMC5:!@1}% ^ҟ, s}d,0ܾj?Pn<[ 4"E-I9<X<W$<RCfߌЯ%I%EK7nf59i5~ⷶJ0vbD2!vm4<OI٤(55hx={S3ȾՊfbx?~tGbw]dr_Ըֿp2 y}J_o2$'Zԃ[Gs"1SA6 :@;}'d z`|EDNl]|f74X瑡wmb0^҄"5p2q]r\;=ڱq@A5"O \Uv`.XC'[9=j>yөMz(`\ HB9,}1IwҠƄ9BPģ˄ nk?dϗstt {ؼDj"Oh.[h ɛ- >}\ы%2 ;^sẫqv˓ϧwqmdQՍ3Oln-u^crm, |Ln|bsbh xt: %bq)I1M~#@`{YȽIT:qbI~;=N$C -}2琓wJ%Iqc܃5)u;vES L l%?&߉lA !K͑@p\>␉C@Q- hR;Fs0Ð-i\6tv5uf#P Yasm|>>*jDZ\lbwquI]׋Xkbx=`= `ypgҔ{0%s2fk-;ha7ses[Np?kC }½dʿ2-<<H(FZsFXuO\Fg@w^=Z֤4#9'~~/J @Րd+a;u#HzV7V+KRa| ~Ǭ|H53FUrG2sPFIICNژsu3a|0:>bSѡζZ"L\"0+coxۑҸVxy=F%BzFH<_ {kV,sbg89w#8C@ MJƈh Խٸf~~ "c wٗ!M!9ۈ *$.G,z;p^@d0<$-c9')",Bɘe"=[9r 4o9uAYn07ל7C:VdhaEf> g KiR9V<ى`A;-~ hq>mV2x$å+)Pq\vw.7 =GZ7JAÀkpKdJB_ FOOQC0lG,~`]yZ' Bx<%pL]gL ͩv-rZ¹\JC{Xg-/Fn H@`9=´s׊uoJ<7H;~_戳lX$mT߀)`Ѭ:jpmJӆIl9Me?(ot3w,: OeQ;/(p8Ė$5agY{lt؉QG`DK6ݚ'hsKDLN ;bQ2V.׋W;p:au֖ qNb]=7BV%{1-ọ  \^O#9 LIy_1~N^/j~fj=Y;z&8C%-_ 8T:߭kՕ&Е]e`#QB>Q@ Q ?5u'^TW2ϺӘ] 㯳ڜqt׫wfc)ks >fh OnPY C ڈW1Fb++svp}W匲'l. ١P0bg6A{KFT GqPu88#i 2g΁z!=,WI'HH8Ϫ<5a&UUU3rߩa)g9Y\nv'7} (mk-]#?z}!ރ_-EYԛlfkO;TF>8pv[#VRضm9yiJEwu)V(5 bY&ETf=dCwBi#ym;hz@%Eפ,y@4!F1ؙ␀4خl>Mz( 9T9-SZ*j@zV>>>?O̽Krg yC̑6[q^ez\(8rzṹȦȜsy=/l[wzDkI]֩>}b &l B7E)x'.A!.OyG> kdD؞tө04u~<'F*cD*Dj=wĉ~HPuLދ\p^+Vg.@ѳh?e]60Qo)QpF6ܔ/ c3`q; A^m!x%ǐ s !):?@{Aֻme([㍯L>'hL`=N'9Ne=kƙ;$eCv2% a(A80fcs%*Ș?aM `msR_/ڭ7|gNpfnlLV'? )%|70a, p`i#$̹fY("#F>KMs$930!.݁:v)qzSP/G `sX 2\D7sGαzpLDAd04)d Hs; ;\\8y/8|a)E gY&Mܚ3G`8ir~f}ct#(4;sύ`Y:Jv7F9kvR WU%H=X;KFrs=ˍe|iTB| ٗn}-fFpA9K7kb*z-:tm8Sc] IHxCDڀ:AC==F~Qvj|lsQYtu::Vßڨa6{-,66ernv+&ɰ"E-zIF"ߍPubr]9" FK AptaMMhX?3^SLuX1\{;W@8w$>0|X ez8I&*xЛ\XCi󲦁nIz}v?َ>{w2#zZ/מp9Hfې>n*duǺ_Hh63l૤7i8'9xZG.n+~DZ9¾dsxYCTp{>=.}4Mu#VAs5cCtPA U|9gt, U:E$!HS{cg/ҭ0s";yj^61. iTU,HT8|p Zl$7ilhz$g4QJ;;0=Ok~sJ^"Jp%00f? 22ۀ3r<\*<CM,ƶWb %~סOFƘ8R%ǐlU-db#~gc.u<8v!:\@|A B{oziĚI~aLcyߓ؟y R4=a*f` Dw"F3?rYhkkH_z!fLXkE꺇B,`iyb6 ;( 5WtYN}Ʋ9YZ/sB%8cBsCbQ:nkxi^iRUUw)S" CVX\kqIKsV:pv~ܩ!ZOO0SC s4 5iۦ[t` g @:\҃skciA -il|\\^'HS>׽)gS_*L;ɛC<9zd?kJVu%!8Ȕ%@R PI.5;,֟a T9~72Oz{̂% r)X,֕,: \ڶV9T,y//p}YM7P)8uv~O:da 0)F֜vaAVfR'+;{rL6Ѷ'z{<IV{!zdVp0LSc@z1?K !ti:;d@?Cԍq:({ʍ?EKu.9 8CƀúlZ^WF@,Z* 4<ּ4)nLyN?,a22!nU{-MdI0EXنYR x9ۘB3-1=$ vɫ@xTN,K|}} ȇ3 >{LT+']@rp8$A'm$5|V!AĈz(a?OviY)ڃqf7 ^o-יH jAwy LW6}E: yD?DA[AsNV4FZM 殃\3'JTp>he8Lj_#dc=r92+2pe \_ؽRn[)Fgk{Þp9`@2J Y5+[Kt=ХvG9:Tq-bc1EAu莉l6VJ>#*ujN&Ur'BIG`lx+}V ِ^gynuP[&S՜9/F!:m °$w$paJE>ے'!9qo&E뿇c*k[5w{SnډBk7.v (;t|?d$:qg 3ڡ~O٘lq&5u8iބs}9jawlAkTsm+ ,C_";0;St/3nA6جlb, 'K IDAT( 9e|/r 9n@Jx"Fi`D_399,p5p`9s% BѧQ~ӶVZK8 $5ǃɨof`Gt0':۲.XgdZj$\ycCPmEv{tp>Iu qFYXG,\RSwDU):zŚ0% Εka,fjAK%P\. \DWLi'g0KNϰJe^PV.j(p;#X"᱾tޒ fģ"}h@*J&)JNGVP?dF}52|G Z:b&У9D ca.Y;<4,'lgs԰@A^-A@RKXб<1As0e&*;I 3|~~leV؛̂]gC,}lό-s.C7狋gAbd1G wa 8BP"=e@(L+Wt o]<,:5j-Vwi "nNF|9A YsN>4:6V3AṖA) dfӶrZ]~\ucF<t"14c?~"L'` S]͹@DoScJ.Vxܥi$ )MB%:Իd̎( ?>>]cL5$r 9)>ݫ`?`oZlGUs-Skek画PMl5x=$~NDDl4c9Km-1^W&茞_pPkoAEOd s:s(u?~mTš{9ܾzs(5$l usqsF09բ.AX!r,6}i"a.+,AcFDCtJfl;RkԢN? "ЂY@Ĉ\lb똾&}NTLCj 1?w&i8PNJ i`E}F|>)D9&kjc&8ϵO薸#&<s]#}@:CzX(TIK+E,ý9zety@^i ) bf*dܒIbkQkkLPԳv)J̝5P3nq1fk]mZ.1YpLšۇ(Z9"̦GuO{"D:?'Z);!InX@;H0vY1Y0*^{#*a-#g~v9#E!!f_[7l4-n%йEE iA3Tޫnٚ3ۉ). : k)1FX2!ndJf@nwѕ3r\~ǾiS pCՃJ +9D& zH"ӣ7C2GB?fr8wdh[n50x Y3H%ZkeȪ ֆ$gQBF V(nHkH \zr.1G B녌e>X: ma <7F}*}L4ar?wcSgzcM'vaT\hZћ {0yaP&qq?a-u3gݜ޼xc0pVn&ٵ.މkX'b Czu@LDû٬wpJɮumjP.(@#ƌkꆙ9HF  @Y뜙\~BkE08 @M nR柂o`1'v~M}}}E[1ejf^-$ѱ9IM|@(hYe^sj UEҁlx9a-!܄NDtys, ͂=\7M6AK۵>#gScqEܐeԙSz8<ԡk<5hQegf*3pChll> @:ƞ"UhcN{ek掠ԋeyVQ'F˞#L).qtYZ[rH@؋}[Tq 8~S :=sA&9."{! 2idO.Ky`QƷsNMb8KrTF_)`9Դ;55Ϲ5RR9[\bbl鼲mv SX bH2hĈ[޵a-q8QBcFXTD`TsyMepܘIPԃA/lwq'FC؎ܿs4'haSz-GȘg9Dx` eaAk*%5YkGhib>ԑ9  `Dr9QZb1[Ku%MT~i@0Q:#OF_a'{KD']t3%q׺$kۙӵɭ%[s^!X3+:u{,JK .P/>IppVnd:f]gA30qY}!kE0T]-b"MJIg3\/pZ;)gHMp02[q-Fzgڢ4&0P;/&4rN( 3xLFE{xˏ?r@S{кh;@-Bru98n'UUGvCh<@A/s.jUq98 whq/n3z%ge湠]o?Eh3Tta zC~'YnLaިWOS|GG|UnCd0h0B2iu>h/#zjm+ƚvCZk@<T{mUBB)MCbҖe;9a6zD~RD}`'X yȯrKΠ&j7WzpNtEyȥ` (n&29C=n# \&2a\G*~ nG@p8~:kd~O"mݭ=C|MgN=ݶ+ c1v{z~s;56GrkT(qMCc"F|y\8иpc;8u,;u4+ Xm @YلU?~$@nInT;x8*R6}P 0?x`6YaCx>X?z,fnҽh$o9v5@Mڃ3oFcrN4b3q 19C9)19 \@ vt8"|3*VOdg3Gn*@+( o~I&EF"#'2$NChfI}}՗&K汋$ӿd;L.1  ĉ0^ q4b*+3db^i@ :k*Y0ϥ.pD\V8wdy&iP"_F +Z"A=gw樳]W9 =σ !d= F=<8Μ[I",{c-)w:` AcWQ2ɳ˳yP- Bs9CRhux?MdBNIܲ\&5>]Ԇȣ){cz`_kdɁlYh`3kܙ5W=l'-ݬm)B/m|9#s0>WuV ?~n-C1B*\j( ]Ǐ`Ijq9cCmViV) )^jՈk.2\b&T^oDJS`('I*l)g@U66ܥrDƫ3U}gL1uruu?3aYz8T.n̅}ng ^Rc왔lA}tJ˷/Y-p`"y J"n͕9v}rwsɠ?kh"inO)~.a?e7˹ʥI:u@^vwɢHb㶑\*qTĄT)sFmmZSܜ:}n4mlS+2rie kl^ƍtU!"FZiMA͈Mτ[SNS.=%Nj63GȈQq|>pN8Ã^+YXI<ae?>`lP?x̶/!m Axl"ҵwN@\Kk:,9* =($C6Ac|:IcRzp 7gώ1ÉaXɀr=3]ALFw [srψan/1IR$xcwVs?Ϩ͆*>Ƥ\aPcؙ{0xD.R>DbZ B5,fkJCX94lZkxZY.j9/|DnmĹ6FrK2Em6'eXjŹ& 1l8&L}^/طHqup&xtȁ j}V0l.79mc &kXɅ jQo.ϒBV \<&zCv}0~u@6~bf3 3c$ݗU^kVaV%gK]W@ 2οnIqnt6=WQ&B@~6M߱aPnqHye8;viCmP;+׳7 DH7=spiJ-JTI^A wXzMW5UVV NZ 8d\3gVvI% VSr%B;]mʯ/w: {rrwn?k0|AP :WcA _֝dE07 ZdAkHetM3i37]p.K|*']\Ve:.?N\x |vZ#:˜/i&ft\/xM֚}:RE5&B"u 9 e΍sڻz/8Y3a `MdFy)pH'NJm1-&y'H^7msfeuB耤3pޛlP]#nIw`Cu'}rn'X9#e<&!K+`iZ^zn x+h "2خd/NKqIۈ~@MT8<ՌרÇ:+=V6)R t_\EyHSi S?cKx?Fv9-lX之@T)8IS\)n+QE~8#q"BVcoU/dj']o7i[uTj Va3ZJB~|0;\hAv05zxmk.IΌ  ٔĿc}VpcG nKU#ҪZ 48XkeŒD$a@Y ;˹2 l&n"e"?3(m+1}eulxC:w }9xvl6XbҾ"*P FHL7S,X-V#EY։Hs6Y;ܴuclX.}sY}^GǞx;dD 8LCn 2@ ~H uY WU84S`ZU/qN/̥fn.l|>GV=&]ΧIm.[nS{{@___|>#T{90*fSI'bm&頛i؜d@@8Z 6֋QЭ@D@л^őJ5 xSِe:h $R5ruO[j%n?? ґx2Һ,R?_9Q?s*>l/m+}9S3GQ@4X?f~!jՂz5Q4#``/;f8iFxYG{so&QӆݒRלlُ}>?~H&^M9%ym+8b='Ҿ׭ez٩Ht8rr]W'>NIgJ$;r7Z1"Lk: iͧE-gX;ׯ_rߤuz/>Bk-xֻkr^[;@&3-s1Z/ 5Kގ9wu]:@su8YWGf\$Z14;Xz[]ց͘P_, F0'<6ZSX_ǁp E`jAy#}^gq¸A31@:CV*ho1l8&5IS>:1bj+NpZn7jcf%߭aHz8 9=KCDN6N {/~`8ƠpK(\`# B0Y ҙB,4?ԻY}xDr rCKg8* zuΧgԝbm*ǫm9 `l|*H2wVV `v_2_L~4X,p쾒 'Mm Ogv$6Tu%u`|~/"ǜ 1yT497)6JAF ?/t/ 2!v_(q:t=aVj[:x^X2{?,?<3x7D5h8NIP1gY&v,K4-^C2BT#KX;ϱ\e.vF캮ϟGwm0rfM?.Kα>'hJa`^_&$CƂ/-,Ǯ!wN10>E!49u\浪DѬZ s>{7n1H弸 jsSE %,|.yQ -t fSV%igNh9wH  SLDN0fҩ*ުs})'r)p~zffBԨ@x& C̼.yi%tr/yݻne}1;aH?;iJfhj! 9NZہ Jzy*`zww'1ZsԂf uzYؾux}2 ߥMmu=TYD8xM2<D@h~ȃ,34 ۀPkYϑ ~>?6aaEA#2w1ĻķmhU"L)i1͏ש?B3FѬ<KF9TZ،מUq[L_?+s`s*2f#k(NeG4:3 +LJg>xj +A׫\.@.ZRVnHC6hZTn ,X\Y<6GCVO9M2sp%W'z[|_ I/ ;߿4[qOWU:A D~DD^^^Lh,>N=n=cFZ {dwָ[:0]/EVm>TRLGer['fn udU亡M]z~Fp%̈v@3\2qs4y:z{)@OdhG*AyZ??4*Կ'#k"C sD,foR, nr<BP׎C@R/w9L>l%ldEHNxܧs%Ms,!hN^ v"(:{YIUbC )+J4T`PnɡDB`.s>9u ݶhO%3,sVgd*M1=]-q0~,Xu\6Pi>{>iCq U)hDV\Pl[yzz P#(U88pp&=Dr΁muZV+<0R4M6 B[G(j}440I `j [RL, \Z,yvG9,S"`Jm[PJfH?hɀkYY&]Em'=Ϭywh@MD%g/1 FDD^Sm+0M*z grs].ʪ}=X=Ü2`$nȣ$R>I7~ƞKR PJ aR$YFRԟ'v5 s[w³|JM!& zÉv`*%'|x/rCicm;8%**WyvdDY ޜÏF=F5i 2qT1TճٚńK{(gr a֘4-U9J*,GeX[%=.myԄl7Md Ӛ2<BoMӖ܀M)Azњ[J+nH?Xa~3_3g]-}5+r[IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/dist/dmg_background.xcf000066400000000000000000015071051260417502300240130ustar00rootroot00000000000000gimp xcf file_{BBpgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 1.000000) (yspacing 1.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) S  3' Pasted Layer     n k'#/;G' /6&+/38<'>G\P|YbjxNqߕ/.N@Rg-w&{~<j^&2 05F999:::/:?HVugx+H:#3CSM ?  *! ,! /" /$*&+*!!" ! ?  *! ,! /" /$*&+*!!" ! ?  *! ,! /" /$*&+*!!" ! T!                                               '$&  !$""           '$&  !$""           '$&  !$"" #                                                      ?963b            ?963b            ?963b            |7 4                                                       :            :            :                                                                                3 * (  (  ( 3 - 16631 " 4r878   3 * (  (  ( 3 - 16631 " 4r878   3 * (  (  ( 3 - 16631 " 4r878   1)$!                                              ., * '%$" ! ! %'$% - ,% ., * '%$" ! ! %'$% - ,% ., * '%$" ! ! %'$% - ,% gV=<                          v2.*&}!! !   !!#""##$$ " $"+v2.*&}!! !   !!#""##$$ " $"+v2.*&}!! !   !!#""##$$ " $"+@;741-- ) ) &$ "    g#% #   0   1 @;741-- ) ) &$ "    g#% #   0   1 @;741-- ) ) &$ "    g#% #   0   1 00   )'9<"4 "227+$ ' ! '  /#00   )'9<"4 "227+$ ' ! '  /#00   )'9<"4 "227+$ ' ! '  /#;651 0.., ***'&&'%$$$$#            ;651 0.., ***'&&'%$$$$#            ;651 0.., ***'&&'%$$$$#             l2-( b +-+(--+,- l2-( b +-+(--+,- l2-( b +-+(--+,- ><;::;<78><<;98876        r       <<;98876        r       <<;98876        r       <;987665                                                  !    !   3 * (  %  ! -.,01 ) 1    " 4   4 4 2 #  #  " 3 * (  %  ! -.,01 ) 1    " 4   4 4 2 #  #  " 3 * (  %  ! -.,01 ) 1    " 4   4 4 2 #  #  " 0, & !                                                          "    ,&"}     + !.%/,*  +  %%    ,&"}     + !.%/,*  +  %%    ,&"}     + !.%/,*  +  %%   _)$  !                                  /)& ! !  !$  %!     - SD /)& ! !  !$  %!     - SD /)& ! !  !$  %!     - SD 0*$                                                 Z&#"    g                 ! Z&#"    g                 ! Z&#"    g                 ! Z)$"                                                               "!"%* 040.+            Ij           "!"%* 040.+            Ij           "!"%* 040.+            Ij                       !    %    +   04  /  -   +                                                                                                                                         "            "                          "         !     + !    #5  782.  $ "h   / 3  5 78&$:<  "!    "   &&  !     + !    #5  782.  $ "h   / 3  5 78&$:<  "!    "   &&  !     + !    #5  782.  $ "h   / 3  5 78&$:<  "!    "   &&        !     !                                                                                                                                                                                                                                                                                           ! "  "   !                                                                                               (  !!!  ) - ,# - :; +      -* <65 $  ( $A `.)<<-          (  !!!  ) - ,# - :; +      -* <65 $  ( $A `.)<<-          (  !!!  ) - ,# - :; +      -* <65 $  ( $A `.)<<-                                                                 !                                                                                                                                                                                                                                                                                                    "          "           !             !  #             5        )""#$        & ( ) 6! ) "  "    5        )""#$        & ( ) 6! ) "  "    5        )""#$        & ( ) 6! ) "  "                                                                                                                                                                                                                                       ( !   "     " #   $                                                           ! " !                   !       !"       "     !   # 03 57:>:81.*       (6  40" $ ,#&"  "# ! " &$#" !)%:! <"8 < 03 57:>:81.*       (6  40" $ ,#&"  "# ! " &$#" !)%:! <"8 < 03 57:>:81.*       (6  40" $ ,#&"  "# ! " &$#" !)%:! <"8 < 0 3 5 7 :=; 7   2   /   +     '                                                                                                                #   #                "   &   #  #  !                                                                               !                         "                                          !             .             -/ 11      !!!  . %;7:9 -. * " 5         .             -/ 11      !!!  . %;7:9 -. * " 5         .             -/ 11      !!!  . %;7:9 -. * " 5                                                                                                                 .  /  0   0            -32+ 10  /                       !                                                         "!   "     " " !           # ) 71$$8+' 34 2 2 ,  '#! "(- + *)(&%$# % &: +$.0  ) / 4 & # * &-"  # ) 71$$8+' 34 2 2 ,  '#! "(- + *)(&%$# % &: +$.0  ) / 4 & # * &-"  # ) 71$$8+' 34 2 2 ,  '#! "(- + *)(&%$# % &: +$.0  ) / 4 & # * &-"41  579# <%  7"88 (760& )   ) #""!$  # % 0&*19458 !%0 +  !## %  579# <%  7"88 (760& )   ) #""!$  # % 0&*19458 !%0 +  !## %  579# <%  7"88 (760& )   ) #""!$  # % 0&*19458 !%0 +  !## %     5667764 1 /-,       ;7. 2"Ij               5667764 1 /-,       ;7. 2"Ij               5667764 1 /-,       ;7. 2"Ij                        * !     + )*" !h  ! !      2$:"         5 32*.*              * !     + )*" !h  ! !      2$:"         5 32*.*              * !     + )*" !h  ! !      2$:"         5 32*.*,  )(*")  *     1 % $ 5 5#5 9+                $2 / 36- )7 '7%" 2 0*""%,  )(*")  *     1 % $ 5 5#5 9+                $2 / 36- )7 '7%" 2 0*""%,  )(*")  *     1 % $ 5 5#5 9+                $2 / 36- )7 '7%" 2 0*""%<<< ;:: 8 7 6 5 4 2 2  1   1  2    ( 3 3  * *  )( ' &   %   #                     !                                                                 !             &    (      (    $               )#4         32 4 5 567,&" $" &(  (=!)"&  5  4                )#4         32 4 5 567,&" $" &(  (=!)"&  5  4                )#4         32 4 5 567,&" $" &(  (=!)"&  5  4                                                                                                             $         !                                                         2 3 3 4  5   56 7   %  !     $   !                                                                 !                 ! !        !        "          #!!#    #        "$  !      ! $'+)(&%#   2 .  (:  36 0( 2 ) /%   " &$#"  1 5%:! <"*8< @!$'+)(&%#   2 .  (:  36 0( 2 ) /%   " &$#"  1 5%:! <"*8< @!$'+)(&%#   2 .  (:  36 0( 2 ) /%   " &$#"  1 5%:! <"*8< @!%  (  +  )  (  %  $   #                                                                                                    "                                                              "   &   #  #   !                                                                                                                                                                       !          .           ! " 4 69<6 2 0,(   " ! ) %  !  ! ) 8 %;7:9    5      .           ! " 4 69<6 2 0,(   " ! ) %  !  ! ) 8 %;7:9    5      .           ! " 4 69<6 2 0,(   " ! ) %  !  ! ) 8 %;7:9    5                                                                                                  ! $    3  5 8<7  2  / +  (                                                                                                                                                           !       !   ! !            !    !         #           "   " j+=;/, 35 4 3  ."  ,)    + *)(&            7)  )   4 &  2 . *   j+=;/, 35 4 3  ."  ,)    + *)(&            7)  )   4 &  2 . *   j+=;/, 35 4 3  ."  ,)    + *)(&            7)  )   4 &  2 . *                                                             '   &    $                                                         +   )   (    '   %                                                                                                                                                          !      !        !         !          !!         " !        #" !         !$        !$! ! # '5- (  , ) 1 2 ( . 0 &)+ '"!!"'#   !#$ %$%% %&"" !%.355789< # '5- (  , ) 1 2 ( . 0 &)+ '"!!"'#   !#$ %$%% %&"" !%.355789< # '5- (  , ) 1 2 ( . 0 &)+ '"!!"'#   !#$ %$%% %&"" !%.355789<                                                                                                                                                     "  "    '  &   $  !                                                                                         %  / 3  4  5   7 "8!9;   !!"#"&&)) ./ I   !!"#"&&)) ./ I   !!"#"&&)) ./ I#             # "   %   !!      $   $      ! "       ! !  $   !  '! " !  #" %  " #& %  "%$ &   "%"!%!  ) ((   &*$&& %'&"( - '%')&&$#1   J&$#" " !#'/ &$#" " !#'/ &$#" " !#'/  $    !  &     !&%#    %       !"!  ! "#""   "%#"&'#"%!    #             ' !"   #%! "  ##&'$#(  /     +,/ / 2 69     +,/ / 2 69     +,/ / 2 69   #       "!    !$  $"  !   #   !   #  # !%!  !  $'   % # %    "!" !  %    ! $   +"  %-     ". #   ( /' '#2$'!&#"5   ! !#$ % &'))***+ + +, ,---..///001 1 2 2 58! !#$ % &'))***+ + +, ,---..///001 1 2 2 58! !#$ % &'))***+ + +, ,---..///001 1 2 2 58      $""$      !$%!"     ! "     $! !%    #"!      ##"     $"   !&    &      (&   ("   )%   )&   )"    *#   +#   *#   + &  + #   -(    -* ,$ -) -(  .+  . (  .&  %/ )  )/)  $&0 '#  .(1. %/*2, #0%2) %.+4')'#8:="!  !  #   !!""!#"$#$%&&(()+-./0 3 459:="!  !  #   !!""!#"$#$%&&(()+-./0 3 459:="!  !  #   !!""!#"$#$%&&(()+-./0 3 459%       !      !       !     ! "   "  !       % %   %  %!   $!%"#   #!  $ "  "%&$     ""  #    $##!'"!  !$"   '$ !  '$#!%"$!!!$#%   "!    &"!     #" !    !"$$       !% "    $ $%$   " " !  '  $!     %!  !  %   !#!%  $$(   $   &  !"%"! ! "  ) #$ "  ) "   (  &!!# !  &"! #  )# !#    * "!!     % "$#  #! $##% %% #&$ $ ! #%% %#$ %% &#$!% !+%)! "%)!"    %"'!##"  *',%#  ")"-)   ',..  %,,  ) -")   *. $'  '"/&! *2 '(,! 3 -%%(&!5 # #8)$% "$&# +"S :!<":$4/  3 1! !" &%!"%* 0      )$% "$&# +"S :!<":$4/  3 1! !" &%!"%* 0      )$% "$&# +"S :!<":$4/  3 1! !" &%!"%* 0            !            #         #       $#   "   !!   $ #   !  $       &&$%$%##!  ""    '' !&%"  '"      #%   $&   #(     #&   "#% &#     "   &'"#!%     '&        (         & *       #*%      "  (*         $ $)       ! !$       !"       %'%    !% %      & # &    )# +    & $ +      & ' *%  ($ ' "-   +" % -%     $,$ $ ".!    !'& !$ *)"   ($ (  +'"   &)  '*!  ('%  *%" , '$ &)-% !+() -  +  "+.,./**-+1,*$ $*)%    ))# -#  !1# $-' (,- ! &..'  $(2&%%-/(% $(-0)$) ',+-2-++""0   $/37423%(2093( ./) %2**'&6,  .# -."+-'0+  (/ -*#,('.(  5 0' #.$ !/'  6 1(  1# /* /#.( "2#*1  *--+,00&#7 (- *, 2+ ,* 8$ )+&1 7(  !& " %                + !    "3 3 3 - )$h  !& " %                + !    "3 3 3 - )$h  !& " %                + !    "3 3 3 - )$h : 8  $5##% 48 #    $#$$ !%$#""   " "# !#    ! %   !"$ #  $ #   $ '%%!  & %  &#($ ! "  '%'((   !)!$%& "  &&""'# %   ( !! )" "  #( )*!(  ') *"'"! #) *&&##(" !('')%!& %(  (&#&" %#)($  '&&!$$&"$+$ (  *+'( +%!#'$! $ )&!$&*#!&,'##%%# " ()&"$*+-++'' ( (  &+ &   * ($&'*   ) %#  %-    & ! (!%   !" ( *%    !$ +  + '    "" )"' +    "  &%,   % '%   ( )"!    & ,&    $! (.    $# &  -"    %" (#$)    - /,    - ..    "* .1#    && . -#  !  0 /($     0  +  %( "   ." .'0       . , '2$!  +& #(1!  "2 00     5  -   1%     -( -  %*23//51144*  #. $/ $2.*!.4+.41-#     1  5",5) !1!+/2)     5%  3.2&  0'"..- $2$  +' .0(    (1 +0*  %-   )-2,  !!',81+'# #+1( -/  +4&  *4341-.56/01511+$$1,! $4-  .6  (05(#3%"*,3/."+.)*1   ,/  ,//  3#(/41(!%0471  4+ '0+ 3##*53/$585# -6% 0*! 4)*17155*"*3",*4'  )5!+7:71*4.23! " ,4&$-474("'42%(57+)82-''+/0231-%"3985,-+  #8;;:4//-& &+/046//$2&'*) ,,.0 /24352/b            (!!  ) - ,# -&'*) ,,.0 /24352/b            (!!  ) - ,# -&'*) ,,.0 /24352/b            (!!  ) - ,# -@#  !,  !-%     /%  $0#  #& 2& $#4# 65 ""& !1 %*++)!!/ && %"# $& $*"!'%&'+    ","*#   +,  + - -,  +' ',$  !( + %"+  (" $ *  )(   *#$  '! . #'   -( %'  $$+  $ ( +,  ( ) ("#   * !) .+#  ( $& .(  $ )  $--  %" -  *"' & /   "$ (+  % *$    -,* % (%     (#/# ! ) *"    0 .  . ,%   *"2  / $-   -  *+ * 1  "" 0,* ) /  ! 30! - .  ! (* /  0 1  !  )( .+ +%   ""  )/"&' !-  "   $3* $& .     +.!, /     &4!7 0"  $$   !72 4 #3  "   )0+*  2  #"!  ! )4% !1 (.  !"$% # $&136  3 #$ " """$$0$ ,+ (0   "$ !"$$ -(6  4'  " $#%  /2  ,*8  !! %  *6#.7/# 2  *5  #5"41'"320) 10 #63 /. 8 3+)8 !!"#"&&)) ./;:                  %            !!"#"&&)) ./;:                  %            !!"#"&&)) ./;:                  %           H  !    $   !    %!   !     !" $  !  #% #  %# $   !%!! $    ' ((     %*#%%$&%!' - &$&'$%##1  <:$% 7*'#*! + (' &*"!!+  $(   $'  ,#  #&  $) *,  $%($ "(  &#-  '!'& #) '+ *  ($ &'! & . !+  (!  )"$ - &+ &"+$! '  '$ ))' $"    -  %! - " "%     !- &) *%  (  "(  ( /'-    (   & ,) 0    - , "/+ /   . ( %. .   ('  #, /+ ,!    /  &% +/ %*   1   .  $.(2    2!  "/ -/2    !0    *! /&),&    +.#!   1 0"//   *1*    -! ."-$3      &30   !  "(('$.))      #12$   0 !.!/1      -3 !  /" 12/"       $     #-.%.% /     ! !     / %-,'0  #" ! !!!  "##  2 3*.#.  !  ""!#     ," .0. 0  " !" !" ,      /# !54 "4  "# !!"  0#  !  %) 53 ,,     ! #!!  /  "!   +& ,6  4%        1  "   &) &6*  7#     4 "  +& 27  7#     +( "$ $   +$ (()1  7#   (* !  .% +" 3) 7' 3   3 *7"60 1!  1! 48 08#5"%$  9 -7 #55   0 ! ! 3 %) 9!  (53$  0"$ $4 )'6-  %05.#  (/#!  (2 5+8&  &0461,& &2&  6$"0 46%  #,2698654336 4" ." 89)  #''&   "          ( 4 /1:;36"  9r<<=  +./2 58762. *  $ ,  (6  40, ( )   "          ( 4 /1:;36"  9r<<=  +./2 58762. *  $ ,  (6  40, ( )   "          ( 4 /1:;36"  9r<<=  +./2 58762. *  $ ,  (6  40, ( )=  "#!$$%    #%!  & ! "$##  "#%$&#&%&%##%%" "#  #  "#%'&%!"!"!!&&%!  #! $ !$  #$   # $!       % "  #  "%     $   !  %    "   "$  $  % # " #!  "'  #'&   '  (%"    &  "%'        +! *$!      &" !+&      & % %)     + ! '    *#%    #$ "!!    %" '      % &     % +   $ )      &,            -*  $"*&*'+))#     %(   %**)/), "  '+'   ))+('$"%"'&+)*'!   +(!   "!   &*"  .+  *,.#    &-$-- ./&-+&,*2"*0//,-,+5 ".#8&.% 6+.! 5 #3 20*  (. %-&  "+2- *(/ "// ' 1#  !  .0 )1)  !  10 '%+*,.,/-402.*%  #!  #4*  ,.00-0)*%*&  !   12)42+! #    "!    )4$4'               &0 ',     # #  !"  -'/   "    $   6 1   "!  !    33   !!!""    70   ##" ""  %24   ! "#"#!$    7 8$    # #"!  4# 55 $   3)+:5      !4+318%    &,05:) //(0+  456970,7:" -$&0/% # "79 "/,12#  /'')*+   ($  " %'$% -  %%    .           246'')*+   ($  " %'$% -  %%    .           246'')*+   ($  " %'$% -  %%    .           246    )  ")  ) $)  !*  #           #"  $ !         " &!      ' '!     $&&(&#"!! '  &"%# %%$  $&!$"" '   $'"      "#  $!  $  $    $ &"   !  '    #&       $  &"   ( '   & (     + )!    * #(      ! + *      *#$ '     + %     & %  )'"&# !"    "'($& ( %     '+ /)' "        )!.(#! '    *&-%  ( ,      ',+ #,*+)-  , )      "," 0  ,/$,%. %#    +( "*)  )+ *    ,! %(#  %%' +    '" *'  , $ )   )   )! $$    * &#& (     #&   #') +   ! ,  -, ,     *" )0, -    1  /3+ !,  ! 1!  %*4*$ #,   3 ((0$) "+ !/! 01-#)   !)0 ,#2 .!) .  0 . /!) $)  .$$+ .#( +  .4'('( *#    /% -2++      !.    ),)*-6/    0  0!/53  )-   2#$,7  4 ,+ 4+/  3# #4'* 0)  0.  4 31%  -/  .(0" 1& /- /) "/ .,!(4'  3$ 7 (/3. -+/& .- &1 2"6& (230&  *15 /0!     }#/          0#)<1$$9+' 34 2 2 ,  '#! "(- + * /0!     }#/          0#)<1$$9+' 34 2 2 ,  '#! "(- + * /0!     }#/          0#)<1$$9+' 34 2 2 ,  '#! "(- + *      #"  #    "$#       "# $!" !      $%"  !    $%$%%$#     %$"&$##%$%%&%%     #&&'#$$ %   !&%"%&%&%%#"     #$%%  ##"$#   !!'"$ !$% %%   $!%! "#!% ###(("   '%   # !("   !)#   ( "   (#   "   $%"  (  %  (&#  ""  &)$     '  %!)%#%(&*    #(   )&$&')#$)   " # *$"!**"    )' )*$%*)* +' ++'&%(% *)  #,,() %) #( '  ')( ++  "* '% %  &'(#+%( +#* '  -% *"!%)&!!,&(  *) ")(&# +,-' &" )($,)*  ")",)-.$+/+ !-&&(.+,* (/+!   ,*''++.%$).,  %)#*. + )*'&!  "-. + ,&    %/)&+  !)+,.)&   )$(-'  #&.+/--('#!    )1(  )*,)$#!    )",0 /-'     *$'%(.(         - *.*#      )% ++,        , +,         0 , 2    (( ,-   !     #- ) 2    "   $) 0.(     - '% )3"      . 042    )& ,,03+ /# ')/$*,  $-# *- $)!),(  (/  &. )" +..            3+ 5 .,&32        !40! "3&+ #22.*   (11'  2&',# &,812+#!",121! $8 /*  !)0.5/3-0,3/413*  .0(/(   " %!!   "01)-+%     -5 "(4+   ,0%  '1+/$  '01-#  -0/3*/%+(22578872() &$14:87342/2:92. ,8$ $45618"+.(  /, #28)4  *6$:$ #)2<,& %! !   & $0  g<}#C6=)  1.+ 662#v?; 7'== (9:0) +  ) ##)2<,& %! !   & $0  g<}#C6=)  1.+ 662#v?; 7'== (9:0) +  ) ##)2<,& %! !   & $0  g<}#C6=)  1.+ 662#v?; 7'== (9:0) +  ) #              #  $          "   "!         !!  #       "  #!   &#      ##"#"$   "       #$&#    ""       $  #   $ !     !  $  "   !     ""'&&!      !&%$! "%$'##&  #    &$&'&#   & "     !$ )# !   $  ##   ! # '   !$#%   # $#      "' &  &#  & #   #&   &   $ ""    "!%  &   $ #   "&%      #' $ "!    ((       %%  #"#   #*    % ,&$   )&    ' %$$ **    !$ ( $# #*!    + $ % *(   + )(! $,!   % +) ! ,)   ' "# ""!  (,"   * ( +%" -(    ## ,  ,(   +,         ) ---   (-$      ' $+  .+     ( "!'  --   #   ( #! #'  %/&   )    !(  &%   /)   ,     ( ( %' !/+   ,   * %  +%%)--    !'    / $  $'0+    )   / (&1#     +"    , +".*    #(.   , !%&+(    * * !     / % &-#       , !'   / & '0'      $& ,    *$,11*#     ) *$  +",4-   "  !   && 1   0+0..  !   0 -& "4/!#.      &+ &+ *14!&.  !    . #4 01(/+'     ,$ /*'  11(,!/        -) '+0  (0+,(,     -. 4 /"   0"-,/$  +2 0+ 1   )+"/&$/          )4  !6 .$ +,*.$.$   -1  21 !44*,,  $2*  -& +) 5& 8-2 /2!  -( 4 &4/81& +4+  ++$5  687$    (7/  ,2 -5  (896*  '//-  1/ #2)*440&:753.'"!(+.46-$  (5% '*&0*'+.0/15863128:6.*(   #4. "-%!"  )23+52$    "48.  +.,&" )*/76( #'/320.-/341-.260*'!  "===<;<;;;::998:::999:9::9:;;<<;====  "===<;<;;;::998:::999:9::9:;;<<;====  "===<;<;;;::998:::999:9::9:;;<<;==== "!!#$ !  !<==!<&;&' ;$+:$&,:"&:!#9$& 9') 9(,8) ,9)'9(%9'%9#)8 +8 -9 + 9 ' 9 "9 (9 -9 / :*:%!;+;%) ;1;4<-<= =+ -,)&%#$$&&((*-03 + -,)&%#$$&&((*-03 + -,)&%#$$&&((*-03   "!    "  !    "   "  ! "         ! #$     !  # #$   # &  % $#  !% #     !$ #" '  !  & "    $"" & !#% ' $$ (  %'   %  &&  # #(!  " $(" "#!"* &  )!$,#(#+$ "!/ !((+*+$%2                 Ij                !!"#"&&)) ./              Ij                !!"#"&&)) ./              Ij                !!"#"&&)) ./!- 1.  &/3  5' .% $6 &/2$#5&  )1 0/  , ,-&4%5 =   ,-6%4%/% 6+ /& 4(!4( 0 "6  6"#42,  1+,5  6" 2+.1 3 < "):<&6  -*$5 #%$%;'1"7#;2. #"%#!544/-  */7 $"%%7 893  3+#7  ")"#2  <;' =3+! *0>4 %74&&###-09$  20  9#)!%+$4$8  5*%9!#'(6&9  > .2 ')#7"9  : .3%&> 6   =1/"&=4) ?61)7,1 & 912#,)(!3->' /85 =+2!)!*7 &;/'$.1:=1& @-8(#8' 258;851   ;*<%**(#.4   <!<&(>" >(A!#')!.4 ,0>%"**(+EB29 *"(%17 ;$ (?,)', #D0:<,**%&'+*39>37)+)'+#&'><4>)%*+,-!*'"A6&=53 -#,*'.4<C1 @+$(=1C'-6': :8<1 >+C/"A.(:E,'=& @# *?'39".8 88!=6&D =4D6<-?5C56= ?9"@7"D :<&?8I!7?+?; A""0E#+=?=("*G/&8D&?-%B:,1G3?$%:??"E=-&J(%8K3*:;;$$E/* AEE:CHF4)!(.0>H3- .7HCHHCCB?8)0  - 2  5 78 &$:<  " !  '  ++*)('" " "'/ - 2  5 78 &$:<  " !  '  ++*)('" " "'/ - 2  5 78 &$:<  " !  '  ++*)('" " "'/   0833.%"%),-/342+  /02 81$' (,-472012,# ,1"%+ 3,$!$%$&"" ,1*1 5% $$!$ # '$ #  014*7$&$$ %!%&$  8:11-#(#&%!"  !<8 /, "$%& " ""! /: 2/ $%"# )#!#  != !9 %&"&%%' 9"7))'$($! #8 ;0()"#!%&+3 90((&7!04"#('03893..%"%* -326&)%$)'$& ,83- "&/-5747466-'& !!),51$?&%"!->0# %(074885645762/9' !*"''3?/   7'!((#*+8;1 9.$)& "2A5- ".6$)$ ,>3$ " !62(%%)'182 ! (:=+"'$ /  !/?:+!''# ,<81" ")(*,# .;93"' -9@;0 %((4B8*'*!&#")'+! 8<6 ")*(,'+$+$#' &(!6=-%'+()("%&** 7@0 ($"##'$**+") >= &)("$,,&',!:3 &&'#+#!&67 %# ?&!=%: ?%5B93 9?#E )C8A=5H0+H>(4@BC9,),) "*'&244<@7:.'&$6C'-B=* $=B5.;91& .;J3/>A:3/)!*/AE>2!)8<::@B81581/;9:HGDC. ' #/621781.."/   , +         "    -6<65 0 (4A a.)<2- '') +,/ / 2 69,  , +         "    -6<65 0 (4A a.)<2- '') +,/ / 2 69,  , +         "    -6<65 0 (4A a.)<2- '') +,/ / 2 69, 2 #86+  .2  !4+154 3"/+ +.  04$ (.  !5.2  &1'  7 8( 09" "34&:79 %;('22) )149:8:470-*! 76=!4/ %278:<750/*((&,'002:432$2+ 0:-3<0)79;:80% '*/86-/8, #1-7 59*!1:,!#,5::4*!)7=:1#8?2>>6*"(058972,($'&%##(49/&,52(2929685.%#)36:8<;<><:9;><2  +5/2)6?/'3<<633;:<77030646;=@?>?>=83/221.2;>:5+%&569<-  ,79!= "?% *;:+"").363245,   "5>4, #66+:$(=8$ ,554& 00!7=)  29- %149+"9 ;*  97' 9!%6/9)8- 10.--7 &:) =#99)*6( %<< 7*#8*"40#6$98,+&! $;2*=".8&#-)'#( 16= '706,')*")**%" #7' =< $9) '&&(##$* "##!&&'  7.2.(7>-#+&)!&)&'&#&" #> ;(46=*>!'(%"/ &*7:@<6(86D 1473#*''*""-0>?C?A1*38.> 71,>*+&(+!*79B=?55&$ ; &?#?"65 #+,.>?@1-  @3 D%?+.,!:> -E.8/:+*+=.*@(38A&"/#)@-&E&54!B!%&*"8B C2;194 "..& 8A%=5 0D7. (E<@, 0H># .!,?6+J< ,7G.G5 :A'&>13D'/9 >8(D);<*@0/E+-+<&<@(.B/0J9/,I,$8H@# 2(CG=EB?&5!-8,  '')*+,)        & () 6! ) "  ' & !"   ""#$%%%& &% ''((())*)*+,  '')*+,)        & () 6! ) "  ' & !"   ""#$%%%& &% ''((())*)*+,  '')*+,)        & () 6! ) "  ' & !"   ""#$%%%& &% ''((())*)*+,7   !6 - 7<7+  : '5 %/%58;80(!#*4$  7$ ,(*1468987798641.*  : !3  #1  1--+'7 4% $5(5!*20*(2) 0--/)6,2%1*9  6+:+429.+.'(:  ,?07$)# -7  />?3  7. 42)'$/4@8) *;<89053(#"&4=9)9736 $84( !%*),39;73-&!096$ 1AB* /<& !-7:5* .71 '>< 19 '6=9*1@:$ +B05(6:2",:.7(= '26+":B& 2/@ %7<3 ,=&*:; $14& #=* (+04  7*-<2'@;39==87/4'7#:8&.!+:;129+:?7*);/+>, D);C>!,A,3B= (?! /;:" 78 2A"C%%@2)@$ 0=(((&*&!B(/D):6(:' !&,,++!&.D+!:?"*D (?1(,-((')+$*@6)A1!<6>:(,+', '$))#+.&8E2!5?#4?1=1!+.,#%-)+)! % &HB-%B1%G4G1%&!$(+*.)@GG8"5A"<%B3 $%-$0@7?>5B,3>;(-/);>5;?F</@E)(,(%:2)7CG>*#-@((#(C;"1F?FA1&B3 /#:=2@2-9G"A< &+.+('#&9?F4"!58%.,%6GD/#!=2).';HA91#"G!%0,$2<.=@# >5&0.&$'!,E*$)E)+&!J$F+ ''#D$$-@++$E$%B )21/.#L% A."-$!) K#%*@-.#C( &C+.*&F! %&9=.)#J+')F.$I1'H, 0B8'1? =7!?( F" @4 /A(D0?/88))H(?&#<#)A13?:1)-@>8 G*B,%C418+)D;>=7.)#  " &$#"   !  )%:! <"*8< @:="!$&9  #   !!""!#"$#%%''(.)#  " &$#"   !  )%:! <"*8< @:="!$&9  #   !!""!#"$#%%''(.)#  " &$#"   !  )%:! <"*8< @:="!$&9  #   !!""!#"$#%%''('7;) #7 )67   (211:;7%  /&'95,#   $38$) $0) $05;-*     +87' 2." 11:64-&#"+0::.#  *3*  "$1-0237465687:/'   00,!,8684=2"  '/:<9/% 2;    #43#79/85.*0-#/7* 28 (/4:/.,:# "+2:''5+ #01;>=32-.-2085<8-*7$08)+0,0)+ :17")6.   8!&(?0 <(#;5$*  #>3#':0& 0=6 !(?+%%  26@98"%)(# $5/9#62 *  /3A  '<*)! >*6  " (=4")**6+8-559 ()2:=A:6'(** <(6( ,691&97?! =2&771" *#"#%$)'$$)(,!C#(: ;%2<5%('()%&%("%*%#*! 85= #7.$5;&!"-++&+)+("3<.623!?7$%"+&%.$'28&A 07&;/)!#( +='71 "6(,;5!&?'%A54">/&*73"=%+8!?18 &@. 6743 5;"A3 65 >.'H!,F:)GA/<')'D1  .D@-  /C'4;  B'+- #HD3 %5AB5)D2 3426*()-+(CC?JA?7+* #,:?E@*2I% E&?)&,,! (,89/1:D?G?C<>:?@ECG8) =@*!=,9##!,'5> (%/-3.-#*AB/=43$/*,'DD#">E'36@*,/+ DED7% "9?4 >,%=$*)3="6B9=0#!$4;C><',?")-"/< %,=A>D7;12.249C>>63   =?.%)+(#?(  "C!>(&),/)>% %:$H)./+;%!)?-<)0'<!':/@,1/&>!,?65(%*'0-"/=!':97&+;4"'>=+ +- /@!#< ?0 )1+:6#!C#>' )+/A#@#>.(1F0$?/>) 3A$ 7/>1 ?* &-C#8. )<#&#D688/ '69:7*;"6   #"!&!! ! 6 . %;7:9 - * " 5  /)   "// 1 3 5779::;<<====6   #"!&!! ! 6 . %;7:9 - * " 5  /)   "// 1 3 5779::;<<====6   #"!&!! ! 6 . %;7:9 - * " 5  /)   "// 1 3 5779::;<<==== !7!5 ":  )6%//855)  '9&#5*(%&.473& 1= 4(  #/:5#;,-3 &2<3 % 8"  .87" 6   )-14-#/; & 055& 4:&+671 !// 9?$'&%   1:7:4:47+.488  )" !  8-9"  ' ,./3'),&'5'!%#!'(714 "7"43  & ) (2#7,  (()!!()' !(#("#5! (?"))% )'&)43:34213052530+3/.> )!& $%$$'*.'%(.3-*8% 56! !!(('&''* +  $,38( .3 ;8 ",%&)%* (*83<688775397@27, 2@%#'"'%0><>600'+#&#'(043'"-+.$#"("!$)972FC86.//02810*D5 2;?)4+B;6.>/6%H# 8:/9*D9?+:.>;@.;:<5<=(&%$#   $0  ) / 4 &  * &-"     !#$$&&((*-03T(&%$#   $0  ) / 4 &  * &-"     !#$$&&((*-03T(&%$#   $0  ) / 4 &  * &-"     !#$$&&((*-03T3  *62/'8  (4!,3%6)3$*5$:  +2#)5#:  /1,0"5!  4,0- 5#   8%5(  $$..32744&(. !:9!$ 1/9662/,)%&#**239+"4+89=8>5640"  "095 3/'5 !$%  3+ 6$#4%1,% =%4  /.'5!&#'&   65  8!7, (#*  = 9(*7 ?&  7(4*%)2,*;0#' $6 @"#%*) )19&7'* . 7)&*)&##:$55:%%')') : 5.'&&#')(*5 A9#&(  +=@'#$# #$7%A4"'  ,?5;$)%&,":' 2<;" 0:B$8/ )%$+ 01#>+> #-47C :$((<42!@+6>'7*>"')**(";)@"9?!;4)B31''%C94;B  /=-%0=0?3(%81 7-%*&C6"7:#A".A8$$95 9,!(&),-)F-+>)&C)4:<$*@* 9('&"7D.3=*?$.?82(7>C )=D,@./<6:8;'*@.C!,!AD0A#8<4'" <; +9),+$ED>4!<1!5B):2*.&#,)$$!CD;0&C$.5@2 :'*&$/%GE=&+E5B;4@$##&#EG: 9:8:E8$&<-,&6BH1 D27350+),#+ <6D+0C   C1'.&,$2>"B.><C1.))$<,<:0B#-A#! 0C0@;>3: @*EF! @*0ECFJ! $G&.DD-D 8='A#'G=,3.< 'K$ 61 /@84: #H/2A 83 :=1E" B* 0I$ ,? # F( +K( );+ $ E*,J-):5% J$.C2)<8& F&-@6,?6 '<82?92A1(.= <>7%:>'*D3!*J<3!8A1,?H7/!4?L?97=: /9EGMLJ?A,! 2 S"!$  #%  0 & * 2 3 3  3 4 !   0& !& (( *+,/.1 1 3 54797}"!$  #%  0 & * 2 3 3  3 4 !   0& !& (( *+,/.1 1 3 54797}"!$  #%  0 & * 2 3 3  3 4 !   0& !& (( *+,/.1 1 3 54797}   ! "$0.9450-* $$/6;10')!&!((*3.60'$ # /:1$    $+,6/ /4( (3/,"  &32   */2% 19  #'+*))$%  &05!"9. &/8:66-1.144:6=52. (2.";- %1=7+"&-1>76/ /-&>! ,;5+   !)0=8(,7&8)  )95)  )95/$!5# =%0=( %242&&0 8* #:/  #13,26 17 *3/ +<78$ 4 &;$  8@9 #,3' 4@ #9%=+ 9) )"$ )9  13&,%'!$  %8 52('()!))(+  A ,7" #(#(#!%'"#%%&%%'8 A%+&("#&'%%#"'+8 3*('$+((-: +$&!*+%*& !0>( $++*'*$%)*:C5 &&"#+"(6:>7)  *(&+# "/56<@C=:-%)*%%(!-/98>;=:60&" (*+*;=C97(" $-+"8?% !&+,>+&!.! 0>)'"(*(';?( ,+!)@5**)E4*/!8C ,1B;!.$@;..@,01>(1 >:23>44%;D%4%BG166CB498&:}                                ,. 0 1 58J,. 0 1 58J,. 0 1 58J,?9%K@D."K-=LD%01G*8L<2,B1,4;IC$ 4 '?B=7!8 J&)+,./0 3 459 &)+,./0 3 459 &)+,./0 3 459 &,G=975) 6HB*>*HI'!;1++F-2A- 6?,B#.8= &=6/<3"B0 2;="+C232E:9=:3 56158                         I$?e Applications     {.gimp-text-layer(text "Applications") (font "Ubuntu Bold") (font-size 17.000000) (font-size-unit pixels) (hinting yes) (autohint yes) (antialias yes) (language "en-gb") (base-direction ltr) (color (color-rgb 1.000000 1.000000 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) 2eJe^;zw^@hjhDEE6Y1Ryy}ܧ$F%$F%A29:,+trpZfZf<zCnCn0(Ä51L31L3(/+P3"NY1 {{ޯ߿W 11$szwNjh"Z  F(+_*7LޔChd ޔ*wCjBXM-.E*qD'OJ_[n2 < into the     {%gimp-text-layer (text "into the") (font "Ubuntu") (font-size 17.000000) (font-size-unit pixels) (hinting yes) (autohint yes) (antialias yes) (language "en-gb") (base-direction ltr) (color (color-rgb 1.000000 1.000000 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) |<<ttt j%u oo nujmiddddznl~;?+oT8HH.9=.mmjv++/folder     #gimp-text-layer(text "folder") (font "Ubuntu") (font-size 17.000000) (font-size-unit pixels) (hinting yes) (autohint yes) (antialias yes) (language "en-gb") (base-direction ltr) (color (color-rgb 1.000000 1.000000 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) //}}}n! Gx~!  +dd$z~um~;?&+oT8HH.9=;.ghzjv7hicon     !gimp-text-layer(text "icon") (font "Ubuntu") (font-size 17.000000) (font-size-unit pixels) (hinting yes) (autohint yes) (antialias yes) (language "en-gb") (base-direction ltr) (color (color-rgb 1.000000 1.000000 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) MMM]ju;Unm;jmi8;?79=l~_u\] Clementine     {,gimp-text-layer(text "Clementine") (font "Ubuntu Bold") (font-size 17.000000) (font-size-unit pixels) (hinting yes) (autohint yes) (antialias yes) (language "en-gb") (base-direction ltr) (color (color-rgb 0.992157 0.674510 0.450980)) (justify left) (box-mode dynamic) (box-unit pixels) ]&]:Ωs;2 ԗ#-@h84- q/8d-B uQ, u    ɔF'f1-2gF'f1+_bb}}:%  %  p5(J (K(DVK(DVda%Ԟ2ޯ ؗ ؗ'''s[zwNjh u ߣ +_F'f1b}%  M-.K(DV ؗV. To install: drag the     {1gimp-text-layer(text "To install: drag the") (font "Ubuntu") (font-size 17.000000) (font-size-unit pixels) (hinting yes) (autohint yes) (antialias yes) (language "en-gb") (base-direction ltr) (color (color-rgb 1.000000 1.000000 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) ײ׾Ԃ%!j!uo dddd % nK܌ jmin8ddxo;?u NQ9=mmme +ܸ7! % $o+܌ f $zum~xoj~ddzn &=NQ ;.gg hzme(wm7hܸ4+,Ws68tj6Dݣ&   aul~+oT8HH..jv)G #_ New Layer#1     pz_ؚv_fvنٖ٦ٶ&6FVfvچږڦڶ:ݎݞݮݾ"v&6FVf @ @ @ @ @ @ @ @ @ @ @ @6 4 3 2 2 2 2 2 2 2 2 2 2 2 3 4 5  6 4 3 2 2 2 2 2 2 2 2 2 2 2 3 4 5  6 4 3 2 2 2 2 2 2 2 2 2 2 2 3 4 5  64d3d 2 2 2 2 2 2 2 2 2 2 2 3d 4d5 2 3 4 5 5 5 5 5 5 5 5 5 5 5 4 3 2 2 3 4 5 5 5 5 5 5 5 5 5 5 5 4 3 2 2 3 4 5 5 5 5 5 5 5 5 5 5 5 4 3 2 /ш 1d 3d 3445 5 5 5 5 4433d 1d /ш S,-.///////////.-, S,-.///////////.-, S,-.///////////.-, S(d*d,,--/////--,d,d*(     шddddш @ @ @ @kkkk}W>+_ Background     A_a!-9_-9 Oj3 />UqL˾*+1Mk4 I%3BAOYreuA@~~~}~~~~}~~~~}~}~~~~}~򉆁~~~~~ ~~~~~}~~ ~~~~ ~~~~~ 􉈈~~~~ ~~~}~~  ~~}~~ ~~~~ ~~ ~~釆~~ ~놇~   ~     !~~쇈~}~懈~~ ~~~~~~~~ ~~~~~~~  ~ ~􉇃~~󇅁~   ~~ ~ ~ 󈊉  ~~ 򉊈     @~~~}~~~~}~~~~}~}~~~~}~򉆁~~~~~ ~~~~~}~~ ~~~ ~~~~~ 􉈈~~~~ ~~~}~~  ~~}~~ ~~~~ ~~ ~~釆~~ ~놇~         #~~쇈~}~懈~~ ~~~~~~~~~~~~~~~  ~ ~􉇃~~󇅁~   ~~ ~ ~ 󈊉  ~ 򉊈     @~~~}~~~~}~~~~}~}~~~~}~򉆁~~~~~ ~~~~ ~~~~ ~~~~~~~~~ 􉈈~~~~ ~~~}~~  ~~}~~ ~~~~ ~~ ~~~~~놇~         "~~쇈~}~懈~~ ~~~~~~~~ ~~~~~~~  ~ ~􉇃~~򉈅~   󉈉~~ ~ ~  ~ 򉊈     󆃁? |zzyzzyy }zyzzyyzzyy |zyzzyzy|{zzyzyzyy }{{zzyzyzy {z{zz{zzyzzyyzy}|{zyzz{zzyzy|{{z{zz |{{z{z{z z~{||{zz{z{z z 셂|{{z{||{y{|{z{z{z z 惄}{}|zz{|}{{z{||{z{z z ||{z||{|zz{z z}|}||{|{z{z{z{z{zzy||}}||{|{|{zzyzz{zzyzz}}|}}| |{z{z{zzy~}}|}}| |{|{|zz{zz{{zz􆅃|}}|}||}}|{||{|{z{zz{z }|}}|}|}||{{z{z{z{zz~|}}|}}|}|{||{{|zzyzz }~}}|}}||}}|{zz||{||{z{zz{}~}~~}~}}|}|}}|{|{||{z{{}~}}~~}}~~}}~~}}|}}||{}|{||{z{}򅆃}~~}}~~}~}}|}}|} |{||{{| ~~}|}~~}~} }|}}|}|{|~~}~~}}~} }|}{|}||~~ ~}~}~}~}||}||~ ~}|}}|}~~~}|}}||}}~~~ }|}||}}|􃄃}~~}~ ~}~~}|}} 􂃃}~}~~}~~}}|}}|}~~~}~~}~}}~ ~~~}~}~}}~~~}~~}~}}~~}~}}~}} ~}~}~ ~}~  ~~~}~~~ ~~~~~ ~~~~~  ~~~  ~ ~ ~~ ~~ ~ ~             ~|| ~}}| ~||  }}~}|| } }|? |zzyzzyy }zyzzyyzzyy |zyzzyzy|{zzyzyzyy }{{zzyzyzy |{{zz{zzyzzyyzy }{|{y{zz{zzyzy|zz{z{{z{{z{zz |{{}}{z{{|{z z~{||{||{{|{z{z z |}}|{||{|}|{{|z z 慆}{|}||{|}{{|}||}|{z z ||}|z||}||{ z}|}||}|{||{|}}||{zyzzy||}}||}|{|{zz|{zz{zz}}|}}| |{z{|}zz{zzyy~}}|}}| |{|{|z{{||{{zz􆅃|}}|}||}}|}||{|{z{{||{z }|}}|}|}||{|{}||{zz~|}}|}}|}|{||{{||z||{zz}~}}|}}||}}|}||{||{|}{zz{}~}~~}~}}|}|}}|}|{||z{{}~}}~~}}~~}}~~}|}}||}|{||{z{}񆅆}~~}}~~}~}}~}}|} |{||{{| ~~}|}~~}~} }|}}|}|{|~~}~~}}~} }|}{|}||~~ ~}~}~}~}||}||~ ~}|}}|}~~~}|}}||}}~~~ }|}||}}|􃄃}~~}~ ~}~~}|}} }~}~~}~~}}|}}|}~~~}~~}~}}~ ~~~}~}}~~~}~~}~~}}~~}~}}~}} ~}~}~ ~}~  ~~~}~~~ ~~~~~ ~~~~~  ~~~  ~ ~ ~~ ~~  ~ ~             ~|| ~}}| ~||  }}~}|| } }|? |zzyzzyy }zyzzyyzzyy|zyzzyzy|{zzyzyzyy }{{zz{{zzyzyzy {z{||z{||yzzyyzy}{|{{||}{z|{{|{zyyzy|{{z|{zz{|{zz |{{||{|{{ z󄅄~{||{{|}}{{z{z z ||{|{|{z{z z }{||{{|}{{|{|z ||{z|{||{y{||z}|}||}|{z{|{}|zz{|zzy||}}||}~|{{|{z|{{}|zz{|zz}}|}}| |}||{|zz{zyy~}}|}}| |}|{|zz{{z􆅃|}}|}||}}|}|{||{z{z{{z }|}}|}~||}||}~}}|{{|{{|{{z~|}}|}}~}||}~~{{}}z{{|zz}~}~}}|}}||}}|{|{||{|{{|{}򇅅~}~~}~}}|}|}}|{||}{{|{} ~}}~~}}~~}}~~}|}}||{|}|{||}}~}||~~}~~}}~~}~} }|} |{|| ~~}|}~~}~} }|}}|}|{|~~}~~}}~} }|}{|}||~~ ~}~}~}~}||}||~ ~}|}}|}~~~}|}}||}}~~~ }|}||}}|􃄃}~~}~ ~}~~}|}} ~~}~~}~~}}|}}|}~~}~~}~}}~~~~~}~}~~~}~~}~~}}~~}~}}~}}~ ~}~}~ ~}~  ~~~}~~~ ~~~~~ ~~~~~  ~~~  ~ ~ ~~ ~~ ~ ~             ~|| ~}}| ~||  }}~}|| } }|?yxyyxyxwxxwxxwxwwxz}~~~yxyxyyxyx xwxwxxwxxz~~zzy yxwxwxx{~ z yxyx x| zyzyxyyxyxxwx| ~zyxyyxyxxyxyyxxy|~yzyzy yxyxxyxxy|~zyxyyxyxyxxz| ~yyzy yxyxx{~zyyzzyyxyxz~ zyxyx{~ zzyzyx{} zyzyyx{~yzyzyyzxyz| ~zyzyyzyyz| z{zzy}  zy| zzy{ zyz} z|          ~      } ~|zw}zxww ~{yww }zxvwxww |yxxw|ywxwwxw |zxwwxvww ~{ywxxwxw~yx xwxwvwwv {yy xwxw 򃂂~{yxxyyxwxxwxw~{yyxxyyxwxxwxw}{yyxy xwxw|zyyxyx xwxwxww ~zyyzyyxyx xwxwxxww}{yyzxyyxwxyx xw}{zxzzyyxyx xwxwxww}zyzzyzzyzyyxyxy xwxww~{zzyzy xwxw}{z{{yyzzyzyyzy yxwxxwxw~|{{zzyzyyzyyzzy y xwxxwxww􄃅}{zz{zyzyyxyyzy yxy xwxwwxx}|{{zyyzzyxzyyzyyxyyxy xw}||{}|zz{zzyzy yxyxxwxxw}|{{|{|z|z{zz{zz yxyx}||{|z|z{z zyzy yxyyxyyx xwxx|{z{{z{y{{|{z zyzyxyyxw}|}|{{z||z{z{|{zzyzzyzyzyyzzyxyyxw|{|{{z{zz{zyzzyzzyyxyyxyyxyz||{|{|{{|{|zyz{z zyzyxyxxy{~||{|z{{z{zzyzyzyyzxxyyxwyz|~?yxyyxyxwxxwxxwxwwxz}~~yxyxyyxyx xwxwxxwxxz~~zzy yxwxwxx{~ z yxyx x| zyzyxyyxyxxwx| zyxyyxyxxyxyyxxy|yzyzyyzyyxyxxyxxy|zyzyxyxyxxz| yyzy yxyxx{~zyyzzyyzyxz~ zyzxyyx{~ zzyzyx{} zyzyyx{~yzyzyyzxyz| zyzyyzyyz| z{zzy}  zy|zzy{ zyz} z|               } ~|zw}zxww ~{yww }zxvwxww |yxxw|ywxwwxw |zxwwxvww ~{ywxxwxw~yx xwxwvwwv {yy xwxw 򃂂~{yxxyyxwxxwxw~{yyxxyyxwxxwxw}{yyxy xwxw|zyyxyx xwxwxww 󃂃~zyyzyyxy xwxwxxww}{yyzxyyxyxyx xw}{zxzzyyxyx xwxwxww}zyzzyzzyzyyxyxy xwxww|zzyzy xwxw}{z{{yyzzyzyyzy yxwxxwxw~|{{zzyzyyzzy y xwxxwxww|zy{{|{zzy{zyyzy yxy xwxwwxx}|{zz{|zzyz{zyyzyyxyyxy xw~||z{|{zzyzy yxyxxwxxw}|}}|{zz|z||{zz yxyx}|}||{zz|z|| zyzy yxyyxyyx xwxx|}|{{||{}|{z zyzyzyyxw}|}||}|{||}|{zzyzzyzyzyyzzyzyyxw|}|{|z{zyzzyzzyyxyyxyyxyz||}|}{{||{z{{zyzyxyxxy{~||}|{zz{zz{zzyzyzyyzxxyyxwyz|~?yz{{zyyxyxwxxwxxwxwwxz}~~yxzzxyyxyx xwxwxxwxxz~~zzy yxwxwxx{~ z yxyx x| zyzyxyyxyxxwx| zyxyyxyxxyxyyxxy|yzz yxyxxyxxy|zyzyyxyxyxxz| yzy yxyxx{~zyyzzy yxz~ z yxyyx{~ zzyzyx{}zyzyyx{~yzyzyyzxyz| z{zyyzyyz| z}|zzy}  z|{zyy|z{{zy{ zyz} z|              } ~|zwzxww~{yyww }zxvwxww |yxxw |ywxwwxw |zxwwxvww ~{ywxxywxxw ~yxxzwxxwwxxwvwwv {yy xwxw 򃂂~{yxxyyxwxxwxw~{yyxxyyxwxxwxw}{yyxy xwxw|zyyxyx xwxwxww ~zyyzzyxxyyxyyxxwxwxxw }{yyzyzzyxxyx xwyyxw}{zxzzyyxyx xwxwxww}zyzzyzzyzyyxyxy xwxww{zzyzy xwxw}{{yzyzyyzy yxwxxwxw~{{z{||zzyyz yxyxxwxxwxww섃|}|{{|{z||{{|yzy yxywxxzzxxwxwwxx}|{|}|z{||{z{zzyyzyyxyyxwwxy{x xw~||{||}{{||{zzyzy yxyxxwxxw}||{|{{|~{||zz{|{yzzy yxyx}||{||}yy|{{zyzy yxyyxyyx xwxx|{|}{|{{|{zzyz yxw}|}|{|{{|~||z|{zyzzyzyzyyzzyyxw|~|{{}}~|{{zz{zz||{yzzyyxyyxyyxyz||{|{{~~{z{{zz{{z zyzyxyxxy{~| |{|}}||zyzyzyyzxxyyxwyz|~?~~~ }|}}||~~~~}|}||"~}~ }|~~!~}~} }|~~~~}~}}~}}|}}~~}|}||}}{~!~ }|}||{xu~~~~}~}}~}}|yxtst~~~}~}|}}{wvststs~ ~}~}}~}}zvustt~~~~}~~}~~}{xustutsttuus~!~|yxut ts ~~~|yvttstts~~~~~zwut ts~~|xvusst ts ~~~ ~~~}{xuststts ~~~~~~}xvttutt~~~~~~~~}{ywtutt~~~~~~}yvutt~~~~~}~~}{wvuut ~~~~~~}zvuutututt ~~~|yvuut~~~~~~}{xuutututt~~~~~{wvutvuutuututtutt ~}zwvuuvtuuvuututt|yvuvvuuvuututt~{xvuvvututuutuutt}{wvvuv ut}zwvvuv ututt}zvuuwvvuvvuuvv utut~|xvvwvvuvu ututtzxvuwwvvwvvuvuvvuuvuuvuututwvxvwvvwwvvuvvuvuvuututwvw vuvvuuvuutuutuutuuttwvwv vuvvuvuuvuututuuttwvwv vuvvuvuuvuutuutuutwvwvvuvvuvvuutuutuutwvwvuvvuvvuvvuuvvuutuutwvwwvvuvvuvuvuvuuvuututut twvwwvvuvvuvvuvvuututtuttut twvwwvwvvuvvututtswvwwvvutuuv ututuuttutv w vuvutuututtututtuttvwy|}wwvwvvuv utuwz{|~~}w wvuvu utvxz|}}~}}wxwwvvwwvwvvuv ustuuvwy|}~~}~~}~}wxwwvvwwvwvvwvvuvvuvuttvv ututuuvz}~~}~~}~}~}} wvuvutu utuuvxz|~~wvwvvwvuwxz|}~~}|wwvwvwvvtvvuvuvuuwy{}}~~xwwvwvwvwvvuuvxz|~~~~~ ~xwwvwvuvvuux{~~~} ~}~}}wxwwvwvwvuuvxy{~~}wvwwvwwvwvvx{{}~~~}wxwwxwwvuwxz}~~~~~~~~~wxwwvwx|~~~~wxwwvwvwwy|~~~~}xxwxwwxz|~ ~~~~~}wxwwy{~~~~~xz|}~~~~~}~ ~~~~ ~~~~ ~~~~?~~~ }|}}||~~~~}|}||"~}~ }|~~!~}~} }|~~~~}~}}~}}|}}~~ }}}~}||}}{~!~}~}}~}||{xu~~~~}~}}~}}|yxtst~~~}~}|}}{wvststs~~~}~}}~}}zvustt~~~}~~}~~}{xustutsttuus~!~|yxut ts ~~~|yvttstts~~~~~zwut ts~~|xvusst ts ~~~ ~~~}{xuststts ~~~~~~}xvttutt~~~~~~~~}{ywtutt~~~~~~}yvutt~~~~~}~~}{wvuut ~~~~~~}zvuutututt ~~~|yvuut~~~~~}{xuutututt~~~~~{wvutvuutuututtutt ~}zwvuuvtuuvuututt|yvuvvuuvuututt~{xvuvvuwvuututuutuutt}{wvvuv ut}zwvvuv ututt}zvuuwvvuvvuuvv utut~|xvvwvvuvu ututtzxvuwwvvwvvuvuvvuuvuuvuututwvxvwvvwwvvuvvuvuvuututwvw vuvvuvuuvuuvvuutuutuuttwvwv vuvvuvuuvuuwwuututuuttwvwv vuvvuvuuvuuvwuutuutwvwvvuvvuvvuuvuutuutwvwvuvvuvvuvvuuvvuutuutwvwwvvuvvuvuvuvuuvuutuvtut twvwwvvuvvuvvuvvuutuvvuttut twvwwvwvvuvvwvuututtswvwwvvwvuuv ututuuttutv w vuvutuututtututtuttvwy|}wwvwvvuv utuwz{|~~}w wvuvu utvxz|}}~}}wxwwvvwwvwvvuvv ustuuvwy|}~~}~~}~}wxwwvvwwvwvvwvvuvvuvv ututuuvz}~~}~~}~}~}} wvwvuvvwwuutuuvxz|~~wvwvvwvuwxz|}~~}~wwvwvwvvuvuvuuwy{}}~~xwwvwvwvwvvwwuvvxz|~~~~~ ~xwwvwvxwvvuux{~~~} ~~}}wxwwvwvwvvuvxy{~~}wvwwvwwvwvvx{{}~~~}wxwwxwwvuwxz}~~~~~~~~~wxwwvwx|~~~~wxwwvwvwwy|~~~~}xxwxwwxz|~ ~~~~~}wxwwy{~~~~~xz|}~~~~~}~ ~~~~ ~~~~ ~~~~?~~~}~~}}|}}||~~~~}~~}}|}||~~~}~ }|~~!~}~} }|~~~~}~}}~}}|}}~~ }~}}|}{~!~}~}|{xu~~~~}~}}~}}|yxtst~~~}~}|}}{wvststs~~~}~}}~}}zvustt~ ~}~~}~~}{xustutsttuus~!~|yxut ts ~~~|yvttstts~~~~~~zwut ts~~~~|xvusst ts ~~~~~~~~}{xuststts ~~~~~~~~}xvttutt~~~~~~~~}{ywtutt~~~~~~}yvutt~~~~~}~~}{wvuut ~~~~~~}zvuututvtutt ~~~|yvuut~~~~~}{xuutututt~~~~~{wvutvuutuututtutt ~}zwvuuvtuuvuututt|yvuvvuuvuututt~{xvuvvuvututuutuuttvtt}{wvvuv ut|zvvuv ututt}zwvvwvvuvvuuvv utut~}yvvwvvuvu ututtzxxuwwvvwvvuvuvvuuvuuvuututwvwvwvwxxvvuvvuvuvuututwuvwwvuvvuvuuvuuvuutuutuuttwvwv vuvvuvuuvuuvvuututuuttwvwv vuvvuvuuvuuvuutuutwvwvvuvvuvvu utuutwvwvuvvuvvuvvuuvvuutuutwvwwvvuvvuvuvuvuuvuututut twvwwvvuvvuvvuvvuututut twvwwvwvvxvvututtswvwwvvuv ututuuttutv w vuvutuututtututtuttvwy|}wwvwvvuv utuwz{|~~}w wvuvu uwvttvxz|}}~}}wxwwvvwwvwvvuv uvuuvwy|}~~}~~}~}wxwwvvwwvwvvwvvuvvwvvuuvv ututuvvz}~~}~~}~}~}} w vuv utuuvxz|~~wvwvvwvuwxz|}~~}wvwvwvvuvvuvuvuuwy{}}~~xwwvwvwvwvvuvvxz|~~~~~ ~xwwvwvwvvux{~~~}~}wxwwvwvwvvuvxy{~~}wvwwvwwxwvvx{{}~~~}wxwwxwwvwwxz}~~~~~~~~~wxwwvwx|~~~~wxwwvwvwwy|~~~~}xxwxwwxz|~~~~~~}wxwwy{~~~~xz|}~~~~~}~ ~~~~ ~~~~ ~~~~?|}||}||zwtssrqrrssr rqpqq|{||{||{yvtrrssrqpqpqqp||}zxusrsrrsrsr rqpqpp||}}{yvtssrrssrqrqpq}|{xttsrsstsrssrsrrqpqqpp{vtsstssrssrqpqpttsrsstssrsrrssrqrqpqptt srssrrsr rqrqrqqpqppqqpqssrsr rqrqrqrqqpqptsstt srssrsr rqrrqrrqrq qpssrs rqrrqrqqrqqrq qpqtssttsrssrqrrqrrqrqrq qpqsstsrssrsr rqrqrqqrrqqrq qpstsst srssrsrrqrrqrrqrqrq qpsttststssttssrssrsr qpsttsttst srsrqrqrqqpqtsttst srsrsrrqrqqpqpttsstsst srsrqrq qpttsstsstsrqrqpttstsststtssrsrssrsrqrqrrqrqpqpttststtssrssqssr rqr qpqtsrsrrsrsr qtssttsstsrsrssrrqrqrqqrqpqrttstt srsrrsrssrsrrqrrqrqqtuxyt t srsrrsrrsrrqrrqqrrqrstwyyzztstssrsrsrrsrrqrrqqrsuxzz{zzyzzttstsstsstssrsrrsr rqrsvyz{zz{zzy t stssrsr rqrrstvx|z ztsttstsrsrsrrssrssrssrrtwyz{zz{{z ztstsrssrsrsrsuwzy{{z{z{zz{zztststtsts srssrrsttvy{{|{z{{z{zztstt srsrrsswz{ {|z{{z z tsrstuwy{||{{|{{z{{ ztsttsrssuxy{||{|{ {z{ztsttsttstsstuyz{||{|{z{zz{zztstwz{||{|{ { ztuttsttsuvxz||{||{|{ { z{zztstuwx{||{||{|{{| {z{zz{zztwy{{}~|}}|}|}||{||{||{z{{zyz{{zz{zttutuwz{||}||}|{||{||{|| {z{zz{z{zuux||}}~}}|} |{|{{|{{|{ {z{{z{{zyzzx{}~}|}}|} |{|{|{{|{{|{|{{z{z{zz~}|}|}}|}||}||{||{|{|{{z{z}|}}|}||}||{|{|{ {z{{z~~}~}~}}||}}|}||}|{||{||{|{ {z{zz}~}}~|}}|}|{||{|{||{{z{zz~}~~}}|}|{||{|{{z{{z{zz{zz}}~~} }|}| |{||{z{}}~}}|}}||}}|}| |{|{{|{{z{z{zz{{zz}}~}~}}|}}|}}|{}}||{||{| {z{z{{z{}~~}~}}|{||}}|{|{z~}~}}~}}|}|{|{{z{~~}|}| |{|{{|{ {z{{z{zz{}}~~} }|}}|{|| {|{z{z{{z{~~}~~} }|}| |{||{| {z~}~~}}|}| |{|{{|{{z{zz}}~} }|}}|}|| {|{{z{z}}~~} }|}}|}|{|{{|{{z{{zz{z~}~~} }|}||}}||{|{{z{z}~ }|}}||}| |{|{ {z{zz~~}~~}}|}}|} |{||{z{{z{z{~~}~~}}|}||{||{||{|z{ {z{~~}~~}}|}||{z{z{?|}||}||zwsstsrrssr rqpqq|{||{||{yvtrrssrqpqpqqp||}zxusrsrrsrsr rqpqpp||}}{yvtssrrssrqrqpq}|{xttsrsstsrssrsrrqpqqpp{vtsstssrssrqpqpttsrsstssrstrssrqrqpqptt srssrrsr rqrqrqqpqppqqpqssrsr rqrqrqrqqpqptsstt srssrsr rqrrqrrqrq qpssrs rqrrqrqqrqqrq qpqtssttsrssrqrrqrrqrqrq qpqsstsrssrsr rqrqrqqrrqqrq qpstsstsrsrrqrrqrrqrqrq qpsttststssttssrssrsr qpsttsttst srsrqrqrqqpqtsttst srsrsr rprrqrqqpqpttsstsst srs rpqqrq qpttsstsstsrqrqpttstsststtsstsrssrsrqrqrrqrqpqpttststtsstssrqr qpqtsrsrrsrsr qtssttsstsrsrssrrqrqrqqrqpqrttstt srsrrsrssrsrrqrrqrqqtuxyt t srsrrsrrsrrqrrqqrrqrstwyyzztstssrsrsrrsrrqrrqqrsuxzz{zzyzzttstsstsstsstsrrsrrsr rqrsvyz{zz{zzy tsusstssrsr rqrrstvx|z ztsttststssrsrsrrssrssrssrrtwyz{zz{{z ztstsrssrsrsrsuwzy{{z{z{zz{zztststtsts srssrrsttvy{{|{z{{z{zztstt srsrrsswz{ {|z{{z z tsrstuwy{||{{|{{z{{ ztuttsrssuxy{||{|{ {z{ztsttsttstsstuyz{||{|{z{zz{zztstwz{||{|{ { ztuttsttsuvxz||{||{|{ { z{zztstuwx{||{||{|{{| {z{zz{zztwy{{}~|}}|}|}||{||{||{z{{|{z{{zz{zttutuwz{||}||}|{||{||{|| {z{||{z{zuux||}}~}}|} |{|{{|{{|{ {z{{z{{zyzzx{}~}|}}|} |{|{|{{|{{|{|{{z{z{zz~}|}|}}|}||}||{||{|{|{{z{z}|}}|}||}||{|{|{ {z{{z~~}~}~}}||}}|}||}|{||{||{|{ {z{zz}~}}~|}}|}|{||{|{||{{z{zz~}~~}|}|}}| |{||{|{{z{{z{zz{zz}}~~ }|}~~}| |{||{z{}~}}|}}||}}|}~| |{|{{|{{z{z{zz{{zz}}~}~}}|}}~}}|}|{||{| {z{z{{z{}~~}~}}|}||}}~| |{|{z~}~}}~}}|}|{|{{z{~~}|{|{{|{ {z{{z{zz{}}~~} }|}}||{|| {|{z{z{{z{~~}~~} }|}| |{||{| {z~}~~}}|}| |{|{{|{{z{zz}}~} }|}}|}|| {|{{|zz{z}}~~} }|}}|}|{|{{|{{z{{zz{z~}~~} }|}||}}||{|{{z{z{|}}~~} }|}}||}| |{|{ {z{||~~}~~}}|}}|} |{||{|}{{z{z{~~}~~}}|}||{||{||{| {z{~~}~~}}|}||{z{z{?|}||}~~}|zwussrs rqsrqqpqq|{||{||~|yvtrtssrqpqpqqp||}zxusrsrtrssrsr rqpqpp||}}{yvtssrrsstssrqrqpq}|{xttsrsstsrssrsrrqpqqpp{vtsstssrssrqpqpttsrsstsuussrssrssrt rqsrrqpqptt srssrrsr rqrrqrqqpqppqqpqssrsr rqrqrqrqqpqptsstt srssrsr rqrrqrrqrq qpssrs rqrrqrqqrqqrq qpqtssttsrssrqrrqrrqrqrq qpqsstsrssrsrrsrrqrqrqqrrqqrq qpstsststt srsrrssrqrrqrrqrqrq qpsttststssttssrssrsrstsrr qpsttsttst srsrqrqrqqpqtsttst srsrsr rqrrqrqqpqpttsstsst srstr rqrq qpttsstsstsrtr rqrqpttstsststtstuussrssrsrqrqrrqrqpqpttutstts srssr rqr qpqtstts srsrrsrsr qtssttsstsrsrssrrqrqrqqrqpqrttstt srsrrsrssrsrrqrrqrqqtuxyt t srsrrsrrsrrqrrqqrrqrstwyyzztustssrsrsrrsrrqrrqqrsuxzz{zzyzzttusstsstssts srsrrsrrsrqrsvyz{zz{zzy tstsstssrsrrsqrrstvx|z ztsttstsrsrsrrssrssrssrrtwyz{zz{{z ztstsrssrsrsrsuwzy{{z{z{zz{zztststtsts srssrrsttvy{{|{z{{z{zztstt srsrrsswz{ {|z{{z z tsrstuwy{||{{|{z{{ z tsrssuxy{||{}{{|{z{ztsttsttstsstuyz{||{|}{ {z{zz{zztstwz{||{|{ { ztuttsttsuvxz||{||{|{ { z{zztstuwx{||{||{|{{| {z{zz{zztwy{{}~|}}|}|}||{||{||{z{{z{z{zttutuwz{||}||}|{||{||{||{}{{z{z{zuux||}}~}}|} |{|{{|{{|{ {z{{z{{z}zx{}~}|}}|} |{|{|{{|{{|{|{{z{z{zz{|{z~~}|}|}}|}||}||{||{|{|{{z{z}|}}|}||}||{|{|{ {z{{z~~}~}~}}||}}|}||}|{||{||{|{ {z{zz}~}}~|}}|}|{||{|{||{{z{zz~}~~}}|}|{||{|{{|z{{z{zz|zz{zz}}~~ }|} |{|| {}{{z{~}~}}|}}||}}|}}| |{|{{|{{z{{z{zz{{zz}}~}~}}|}}|}|{||{| {z{z{{z{}~~}~}}|}|{|{z~}~}}~}}|}|{|{{z{~~}|{|{{| {z{{z{zz{}}~~} }|}}||{|}|| {~||{{z{z{{z{~~}~~} }|}||}||{||{| {z~}~~}}~|}| |{|{{|{{z{zz}}~} }|}}|}||{}{{|{{z{z}}~~} }|}}|}|}| |{|{{|{{|{{z{{zz{z~}~~} }|}||}}||}| |{|{{z{z{{}}~~} }|}}|~||}| |{}{ {z{~}~~}}~~}}|}}|} |{||}{|{{z{z{~~}~~}}|}||{||{||{|{ {z{~~}~~}}|}||{z{z{? pomoonopoomonmnnonnmnnmnmlmmnmlmp ponnoonnoonmnnonnmnnmnmnnmnmlp popoopnoponnonmn nmnmmn mpqppopononnononmnnmn nmnmmnmlmmpoppopnonmonmmn nmnmnmmnptuppopononopoonnononnmnmmnnmmnmnmortwwxwppnoppqppqoonpopononnonnmnmmnmmnmnqruvwwvwwqppqpqppopoppoonoonmoonmnmnmmnnmnpqsuwxxwwpqqppqpponopnnonlnoonnonnmnnmoqtuwwxxwxxwwq pnoopoonmonnoonnmnnmnpqtvwxwxw wpqpnonoomnonnonnopsvwwxxwxwwvwwxxwpqpopoononppnoonoprvxxwwxxwxyxwwxxwwxwqppqpqponnmnoononnopqtwxxwxwxwx wpqqpqqppqppopnoononorsuwxxwxxwxxwxwwxwwxwwpqpqqpnoopooprvvx xwxxwxxwxwpqpqponnoppqqsvwxxyxwxwxxwxxwxwwqppqppqpqppoopqruwxyyxyyxxyxwxxwxwxwwqqppqpqqppnopstvyyxyyxxyxwxwxxwxwwxwxwwpqppqpqpqppqsuwxyyxyxxyyxyy xwxwxwxxwwxwwppqpswyyxyyxyxxyxwxwxwxwpqqpqtwxy yxyyx xwxxwxwxwxwwpqqsuwyyxyxxwxwxwwxwwxxwwtvxyyzz yxyxyxxyxwxwwxxwwxwwzyz yxyxyx xwxwxxwxxwwxwyyzzyxyxyy xwx w{zyyzyzzyy xwxwxxwxwzyyz yxyyxyxxyx xwxwxxwxwzyyzyzyzyyzyyzyyxyxyxyyxyxxwxwxwwxwxxwzyzz yxyxxyyxyxxwxwxwxxwwxxwwzzyzyyzyzyzyyxyxxyxyx xwxwxwxwwzzyzyyzy yxyyxyxwxwzyzyzzyyzyyxyyxyyxxyxwxwzyzyzy yxyxxyyxxyx xwxwwxwwzyzyzyyxyyxy xwxwxwzyzyzz yxyxyx xwxxwxxwwzyzy yxyxyyxyxxwxzzyzyyzyzyyzyyxyxyyxyx xwxxwxxwxwzzyzzyzyzyyzyyxyxyxxyxxwxxwxxwxxwwxwzzyyzzyzyxyzyzzyxyyxyxxyxwx xwxxwwxwxzzyyzzyzxyyzyzyyxyxywxwx xwxxwwxwx{zzyzyzyyzzyyzyyxyxxyyxyxyx xwxxwwxx zyzy yxyxy xyxxwxxwz zyzy yxyxyxwxxwzyzyxyyxyxxyxxyxxyx xwxzzyzyzyyzzy yxyyxyyxxyx xwxwwxxwxxzzyzyzyxyzy yxyyxyyxyxyxxwx zyzyyzyyxyxxyxyyxxy xwxzyzzyzyxyyxyxyxyxxyxwxwwz zyzzyxyyxyxwxz zyzyzzyyxzyyzyyxyxxwxwwxzzyzzyzzyyzyzyyzzyyxyxxwxwwzzyzzyzyzy yxyyxxy xwxwzzyzyzy yxyyxwxz zyzzyz yxyyxyxwxxwwxxww zyzzyzyyxyyxwxxwwxzz{zzyzyyz yxyxwxw zyzz yxy xwxwuz zyzz yxyyxyxxyxxywvvtsrpoz zyzzyzyyxyxyxxywxxvsrpponmnnz{zzyzzyzyyxyxxyxwvsqponnmnmmn zxyzyyzy yxyxyyxxyyxwusqoonmnnmmnmn{zzyzyzzy yxwxwvsrponopnoon n z yxyyxwvvtspnnonn? pnpoopoopoonqpnnonnmn nmnmmnmlmp pqppooppoonmnnonnmnnmnmnnmnmlp poppqooqpopnoponnoon nmnmmn mpqppopoqponnonoopon nmnmmnmlmmpqppnoqqpnpoonoopn nmnnmnmmnptuppoqqppmoqpnnpoopoonnononnmnmnnmnmnmortwwxwppoqppqppnnopoopopoononnmnmnnmnmnpsuvwwvwwqppqpqppopqpooppopponopponnmoonmnmnmmnnmnpqsuwxxwwpqqppqppopooppnnononnmnnmoqtuwwxxwxxwwq pnoppqpnonnoonmnnmnpqtvwxwxw wpq pompoonoonnonnopsvwwxxwxwwvwwxxwpqpqpoonppnoonoprvxxwwxxwxyxwwxxwwxwqppqpqpopooqpnonnopqtwxxwxwxwx wpqqpqqppqppqpononorsuwxxwxxwxxwxwwxwwxwwpqpqqpqopooprvvx xwxxwxxwxwpqpqpoppqsvwxxyxwxwxxwxxwxwwqppqppqpqppqruwxyyxyyxxyxwxxwxwxwwqqppqpqqppqrstvxyyxyyxxyxwxwxxwxwwxwxwwpqppqpqpqppqsuwxyyxyxxyyxyy xwxwxwxxwwxwwppqpswyyzyyxyxxyxwxwxwxwpqqsuwxy yxyyx xwxxwxwxwxwwpqqsuwyyxyxxwxwxwwxwwxxwwtvxyyzz yxyxyxxyxwxwwxxwwxwwzyz yxyxyx xwxwxxwxxwwxwyyzzyxyxyy xwx w{zyyzyzzyy xwxwxxwxwzyyz yxyyxyzyx xwxwxxwxwzyyzyzyzyyzyyzyyxyxyxyyxyxxyxwxwwxwxxwzyzz yxyxxyyxyxxyxwxwxxwwxxwwzzyzyyzyzyzyyxyxxyxyx xwxwxwxwwzzyzyyzy yxyyxyxwxwzyzyzzyyzyyxyyxyyxxyxwxwzyzyzy yxyxxyyxxyx xwxwwxwwzyzyzyyxyyxy xwxwxwzyxzyzz yxyxyx xwxxwxxwwzyzy yxyxyyxyxxwxzzyzyyzyzyyzyyxyxyyxyx xwxxwxxwxwzzyzzyzyzyyzyyxyxyxxyxxwxxwxxwxxwwxwzzyyzzyzyzzyzzyxyyxyxxyxyx xwxxwwxwxzzyyzz{yyzzyyzyzyyxyxyzyx xwxxwwxwx{zzyzyzyyzzyyzyyxyxxyyxyxyx xwxxwwxx zyzy yxyxy xyxxwxxwz zyzy yxyxyxwxxwzyzyxyyxyxxyxxyxxyx xwxzzyzyzyyzzy yxyyxyyxxyx xwxwwxxwxxzzyzyzyz{zy yxyyxyyxyxyxxwx zyzy{z{{yyzyyxyxxyxyyxxy xwxzyzzyzyxyyxyxyxyxxyxwxywz zyzzyzzyyxyxwxz zyzyzzyz{zzyyzyyxyxxyxwwxwwxzzyzzyzzyyz{zyyzzyyxyxxwxwwzzyzzyzyzy yxyyxxy xwxwzzyzyzy yxyyxwxz zyzzyz yxyyxyxwxxwwxxww zyzzyzyyxyyxwxxwwxzz{zzyzyyz yxyxwxw zyzz yxy xwxwuz zyzz yxyyxyxxyxxywvvtsrpoz zyzzyzyyxyxyxxywxxvsrpponmnnz{zzyzzy{zyyzyyxyxxyxwvsqponnmnmmnzyzyyzy yxyxyyzyxyxwusqpoonmnnmmnmn{zzyzyzzy yzyxvvtsponopnoon n z yxyyxwwvtsqnmnnonn?rpprppoppoqrpopqoppononnpoppmnmnnmnmlmp poqooqoqonoononnpoponnmnmnnmnmlp poppopopporoomnnoonoonmnmmn mpqppopopoonpqpponoponnpponnmnmmnmlmmpopqnqooponnpponnmnnmnmmnptuppopprooppqorppoonopponnmnmnnmnmnmortwwxwrppqpqppqppqppoppqqpoppoonoonmnmnnmnmnqsuvwwvwwqppqpqppopnppqpooqopqoonnmoppnmnmnmmnnmnpqsuwxxwwpqqppqpprqpqoopnpononnponnmoqtuwwxxwxxwwq pqpqrqppoonpqqponnmnnpqtvwxyxwwxwpqporqpoqpoonnopopnopsvwwxxwxxwwvxxwpq pqpqnppqoonqrtvxxwwxxwxyxwwxxwwxwqppqpqpqnppopnnoonopquxyxxwxwx wpqqpqqppqppopqpoopssuwyyxxwxyxxwxxwxwwxwwxwwpqpqqpoppopooprvvwx xwxxwxxwxwpqpqpopqsvwxxyxwxwxxwxxwxwwqppqppqpqppoppqruwxyyxyyxxyxwxxwxwxwwqqppqpqqppopqstvxyyxyyxxyxwxwxxwxwwxwxwwpqppqpqpqppqsuwxyyxyxxyyxyy xwxwxwxxwwxwwppqpswy yxyxxyxyxwxwxwxwpqqrtwxy yxyyxyzx xwxxwxwxwxwwpqqsuwyyxyxxwxwxwwxwwxxwwtvxyyzz yxyxyxxyxwxwwxxwwxwwzyz yxyxyx xwxwxxwxxwwxwyyzzyxyxyy xwx w{zyyzyzzyy xwxwxxwxwzyyz yxyyxyxyzyxxwxwxxwxwzyyzyzyzyyzyyzyyxyxyxyyxyx xwxwwxwwxxwzyzz yxyxxyyxyx xwxwxxwwxxwwzzyzyyzyzyzyyxyxxyxyx xwxwxwxwwzzyzyyzy yxyyxyxwxwzyzyzzyyzyyxyyxyyxxyxwxwxzzyyzyzy yxyxxyyxxyx xwxwwxwwxzzyzyzyzzyxyyxy xwxwxwyzzyzyzzy{{y yxyxyx xwxxwxxwwzyzy yxyxyyxyxxwxzzyzyyzyzyyzyyxyxyyxyx xwxxwxxwxwzzyzzyzyzyyzyyxyxyxxyxxwxxwxxwxxwwxwzzyyzzyzyyzyzzyxyyxyxxyxwxxwwxwxzzyyzzyzyyzyzyyxyxyxyxxyxwxxwwxwx{zzyz{|zyzzyyzyyxyxxyyxyxyx xwxxwwyzxz z{|zy yxyxy xyxxwxxyzxz zyzy yxyxyxwxxzyzyxyyxyxxyxxyxxyx xwxzzyzyzyyzzy yxyyxyyxxyx xwxwwxxwxxzzyzyzyyzzy yz{yyxyyxyxyxxwxz{zyzyzzyzyyz{xxyxyyxxy xwxz|{zzyzzyzyxyyxyxyxyxxyxwxwz zyzzyzy yxyxwxz zyzyzzyyzyzyyzyyxyxxwxwwxzzyzzyzzyyzzyzyxyxxwxwwzzyzzyzyzy yxyyxxy xwxwzz{|zzyzyzy yxyyxwxzz{zzyzzyz yxyyxyxwxxwwxxww zyzzyzyyxyyxwxxwwxzz{zzyzyyz yxyxwxw zyzz yxy xwxwuz zyzz yxyyxyxxyxxwvvtsrpoz zyzzyzyyxyxyxxywxxwusoponmnnz{zzyzzyzyyzyyxyxxyxwvsqqpnmn zyzyyzyyxyyxyyxwuspoomonnpqonnmmnmn{zz|z zyzyzzy yxvtqoopmmoonnponnz{|zz yxyyxwvvtspnoopnnonpp n?mlmmlmmnqsvvuvvuvvuvmmlmoprtvwvvuv vuvmlmnpsuvwwvvuvvuvuvuvpstvvwwvwvuvvwvwvuvuv vuvvuvww vwvuvuvutvvuwvvwwvwvwvw vuvuvutvvuuvwwvwwvwvwvwv vuvu vuvwvwwvwvvwwvuvvwv vuvuwwvwwvwvwvvwvvuvvuvwwvwvvwvuvvuvvuvuvwvwvwwvvwvwvvuvtuvvuvvwvwvwvwvvwv vuvuvv wvwvuvvuvvuvvwvwvvwvvuvuvvuvuuvvwvwvvwv vu vuvwvwvwvvu vuvvuvvwvwvwvvu vuvvuvv wvwvuvuvvuvw wvwvwvvwvvuvuvuvw wvwvvwvwwv'vuw wvwvuvuwwvwwvwwvwvuvvuvwvwvwwvuv v wvwvvwvvwvuvwvwwvwvwwvww#vuv wvwwvwwvwwvuvv wvwwvuvvuvvuvuvuwwvwvvwwvvw w vuvvuvvuvvuw wvwwvwwvwvvwvu vuvvuuvvuvvuvvw vu vuvvuvuvvuv vwvwvvwvu vuw wvwvwvwvuvvuvuwxw wvwwvwvwwvuvvuvuvwvwwvwvwwvuvvuvwvwvuvwvwwvvwvvuvuvwxxwwvwwvuvvuvuvxxw wvwvwwvvwvuvvuvuuvvx wvwvwwvvwwvwwvuvuvvuvuxxw wvwwvwvvwvuwwvwvvuv vuvvuvvuvuvwxwwvwvwwvwwvwwvwwvvuvuvwwxwwvwwvwvvwvwvvwvvuvvutwwvwvvwwvww vuvuttqpnmwwxwwxwwvwwvwwvwvwvutspnmmklklwwxwwxwwvwwvwwvwvwwvwvvusrpmllkklkklwxw wvwvwwvww vutsqpmllklkllklwwxwvwwvwvwvvwvwwvwvtsrpnllkllklkkllklxwwvuvvwvtqpomlkllkllkllklkw wvwwvwwvvwvvwvwvuusqpnmllklklklkllkw wxwwvvwwvtronmmlklklklkw wvwvtsponlmmlmllklx wvtrqomlkkmmlxw wutqpoomlmmlmllmlml lklkklkllkkxwwxxwwvusqpnnmmlmllm lklklkllkwxxwtrpommnmmlmmlmmlmmllm lklklkltrponnm mlmlmlkllklnmmnnmmnmlmmllmlmllklnmmnmmnmn mlmmlkllnmmnllmmnmlmllmmlmmlkllkklmmnnmmn mlmlmllmllklkmmnnmnmmlmlklklmnmnmnm mlm lml lkllkklk?mlmmlmmnqsvvuvvuvvuvmmlmoprtvwvvuv vuvmlmnpsvwwvuvvuvuvuvpstvvwwvwvuvvwvwvuvuv vuvvuvww vwvuvuwvvuwvvwwvwvwvw vuvvwuvuvwvvuvwwvwwvwvwvwwv vuvu vuvwvwwvwvvwwvwwvvwv vuvuwwvwwvwxwvvwvvuvvuvwwvwvvwvwvuvvwvvuvwvwvwxwvvu vuvvwvwvwxwvvwv vuvuvv wvwvvwvuvvuvvuvvwvwvvwvvuvuvvuvuuvvwvwvvwv vu vuvwvwvwvvu vuvvuvvwvwvwvvu vuvvuvv wvwvuvuvvuvw wvwvwvvwvvuvuvuvw wvwvvwvwwv'vuw wvwvuvuwwvwwvwwvwvuvvuvwvwvwwvuv v wvwvvwvvwvuvwvwwvwvwwvww#vuv wvwwvwwvww&v wvwwvuvvuvvuvuvuwwvwvvwwvvw w vuvvuvvuvvuw wvwwvwwvwvvwvw vuvvuuvvuvvuvvw vw vuvvuvuvvuv vwvwvvwvu vuw wvwvwvwvuvvuvuwxw wvwwvwvww vwvuvuvvwvwwvxwwvwwvuvvuvwvwvuvwvwwvvwvvuvuvwxxwwvwwvuvvuvuvxxw wvwvwwvvwvuvvuvuuvvx wvwvwwvvwwvwwvuvuvvuvuxxw wvwwvwvvwxwwvwvvuv vuvvuvvuvwvwxwwvwvwwvwwvwwvwwvvuvwvwwxwwvwwvwvvwvwvvwvvuvvutwwvwvvwwvww vuvuttqpnmwwxwwxwwvwwvwwvwvwvutspnmmklklwwxwwxwwvwwvwwvwvwwvwvvusrpmllkklkklwxw wvwvwwvww vutsqpmllklkllklwwxwvwwvwvwvvwvwwvwvtsrpnllkllmlkkllklxwwvuvvwvtqpomlkllkllkllklkw wvwwvwwvvwvvwvwvuusqpnmllklklklmllkw wxwwvvwwvtronmmlklklklkw wvwvtsponlmmlmllklx wvtrqomlkkmmlxwwxwutqpoomlmmlmllmlm lklmmlkllkkxwwxxwvusqpnnmmlmllm lmlklkllkwxxwtrpommnmmlmmlmmlmmllm lmlklkltrponnm mlmlmlkllklnmmnnmmnmlmmllmlmllklnmmnmmnmn mlmmlkllnmmnnmnmlmllmmlmmlkllkklmmnnmmn mlmlmllmllklmnmnmmlmlklklmnmnmnm mlm lml lkllkklk?mlmmlmmnqtvvuvvuvvuvmmlmoprtvwvvuv vuvmlmnpsuwwvuvvuvuvuvpstvvwwvwvuvvwvwvuvuv vuvvuvww vwvuvvuvuvvuwvvwwxwwvwvw vuvuvuvuvvuuvwwvwwvwvwvwwv vuvu vuvwvwwvwvvwwvwvvwv vuvuwwvwwvwvwvvuvvuvwwvwvvwvwvvuvvuvvuvwvwvwwvvwvuvuvuvvwvwvwvwv vuvuvv wvwvwvuvvuvvuvvwvwvvwvvwvuuvvuvvuvuuvvwvwvvwvvwvu vuvwvwvwvvwxwvvu vuvvuvvwvwvwvvwxwvvu vuvvuvv wvwvwvuvuvvuvw wvwvwvvwvvxwv vxwvuuvvuvuvw wvwvvwvwwv'vuw wvwvuvuwwvwwvwwvw vwvuvvuvwvwvwwvxwuvvuv v wvwvvwvvw vwuvvuvwvwwvwvwwvww#vuvwxxwwvwwvwwvww$vwyywwvwwvwxww vuvvuvvuvuvuwyywwvxwvwwvvw w vuvvuvvuvvuw wyxwvwwvwvvwvuvvuuvvuvvuvv wyxwwvuvvuvuvvuv vxwwvwvvwvu vuxwwywvwwvwvwxxwwvuvvuvuxxwwxxwvwwxwwxww vwvvuvuvwxwwvwwvwvww vxvvuvvuvwvwvxvvxv vuvwvwwvvwvwwvvxvvxvvuvuvwxxwwvwwvwwvvxvvwvvuvuvxxw wvwvwwvvwvwvvxvvuvvuvuuvvxywxwvwvwwvvwwvww vxvvuvuvvuvuxxw wvwwvwvvwwvwwvwvvuv vuvvuvvuvwxwwxwvwvwwvwwvwwvwwvvuvwxwwvwwvwvvwvwvvwvvuvvutwwvwvvwwvww vuvuttqpnmwwxwwxwwvwwvwwvwvwvutspnmmklklwwxwwxwwvwwvwwvwvwwvwvvusrpmllkklkklwxw wvwvwwvww vutsqpmllklkllklwxwvwwvwvwvvwvwwvwvtsrpnllkllklklxwwvuvvwvtqpomlkllkllkllklkw wvwwvwwvvwvvwvwvuusqpnmllklklk lkw wxwwvvwwvtronmmlklklklkw wvwvtsponlmmlmllklx wvtrqomlkkmmlxwwxwutqpoomlmmlmllmlmlml lkllkllkkxwwxxwwvusqpnnmmlmllmlklkllkwxxwtrpommnmmonlmmlmmllmlklkltrponnm mlnmlm lnmllklnmmnnmmnmlmmllnnlmmlml lmklnmmnmmnmnmnmmlmmlkllnmmnmmnmlmllmmlmmlkllkklmmnnmmn mlmlmllmllklmnmnmmlmlklklmnmnmnm mlm lml lkllkklk3uvvuvu vuvuvvuvvuvuvvvvuvuvutvvuuvvuvvvuvuvuuvvuvuvvuvvuuvvuvvvuvuvuuvvuvuuv vuvvuvvvuvuvvuvuuvvuuvuvvuuvvuvvuvuvvuvvuvvuvvu vuvvuv vuvuvuvvuvvuvuvuvvuvvuvvuvuvvuvvuvvuvvuvuttuuvvuvuvvuvvuuvuvuvuvuvvvuuvvuvvuvvuvvuvuvuuvvuvvvvuuvvuvuvvuvuvuuvvvuvuvuvvuvuvuvuvuuvuvuvvuvvuvuvuvuvvuvuvuvvuvuvvuvuvtvuvvuuvvuvvuvuvvvuuvvuvvuvuvuvuvvuvuvuvvvuvvuvuvvuvvuvvuvuvvuvvuuvvuvvuvuvvuvvuv vutuvvuvuvvuvvuvuvvuvvuvu vuvvvuvvuvuvvuvu vuvuvvvvuvvuvuvvuvuvvuvvu vvvuvvuvvuvvutvvuvuvuvuvvvuvvuvuvvuvuuv vu vvvu vuvvuvvuuvuuvuvvvu vuvuvvuvvuuvvuvvvuvvuvuvuvuvuvuvuuvvvvuvuvuvvuvvuuvuuvvuvvvuvuu vuvuv vuvvuuvvuvuvuvuvvuvuvuvvuvvuvuuvuvuvuvuvvuvuvvuuvuvvuuvuvuvvuvuuvvuvuvuvvvvuuvvuv vuvvuvvuvvu vuvvuvvuv vuvvuvvuvuvvuvuvvuvuvvuvuvuuvuvvuvuvuvvuvvwvussuvvuvuvuuvuvuvvuvuuvvuvvwvusrqplkvvuvvuvvutvvuvvuvvutronmlkjlklvvuvvuvvuvuvvuvvtqommklkllvvuvuvvuvvwutvvuvutsoomlkllmllkklkllvvuvuvvuuvvuvuuvtrqomlkklklklluuvvuuvuvvuuvvusrponlkkl lklklluuvvuvvuvvuvwusqpmmklkllklklklluuvvuvuuvvuspnmllkklkllkllkllkllklkkluuvvuvvutsrpmmllkkljlljllkkllkllvvuttqomllklkllkllkk lsrpnmllkllkllkllkllkklklklkllkkllklkllklkllklkllllklkkllkllkllklkkllkllklkllkllkllklkklk lklkllkllklkklkjllklklklklklkkllkllklllklkkl lkllkllkllkklkkllklllkllklkllkllkllkklkllkllkkllklklklklkkllklklkklkklklklkllklkklklklkklkkllllkklkllkllklklkklkklkllkklkllllkllkllkllklkllkllkklkkllllkllklklklkkllkllkllkllklllkllmkk lkllk lkklklkllklklkllklkllklkkkklklkllklkllkllklklklkkkllkllkllklklkklklkllkllkllkllkllklmlkkllkllklklkklkkllklkllklkkllkllklkkllkllkjl lkllkllllkllklklkllkllkllkllkklklkllklklkllklkkll3uvvuvwvuuv vuvwvvuvvuvuvvvvuvuvuvvuvuvvvuvuvuuvvuvuvvuvvuuvvuvvvuvuvuuvvwvuuv vuvvuvvvuvuvvuvuuvvuuvwvvuuvvuvvuvuvvuvvuvvuvvu vwvvuv vuvuvuvvuv vuvvuv vuvuvvuvvuvvuvvuvwvuvuvvuvvuuvwvuvuvuvvvuuvvuvvuvvuvuvuuvvuvvvvuuvvuvuvvuvuvuuvvvuvuvuvvuvuvuvuvuuvuvuvvuvvuvuvuvuvvuvuvuvvuvuvvuvuvuvuvvuvvuvvuvuvvvuuvvuvvuvuvvu vu vvvuvvuvuvvuvvuvvuvuvvuvvuuvvuvvuvuvvuvvuv vu vuvuvvuvvuvuvvuvvuwvvuvuv vuvvvuvvuvuvvuvwuv vuvuvvvvuvvuvuvvuvuvvuvvu vvvuvvuvvuvvuvvuvuvwvuvvvuvvuvuvvuvuuv vu vvvu vuvvuvvuuvuuvuvvvw vuvuvvuvvuuvvuvvvuvvuvuvuvuvuvuvuuvvvvuvuvuvvuvvuuvuuvvuvvvuvuu vuvuv vuvvwuvvuvwvuvvuvuvvuvuuvuvwvvuvuvvuvuvuvuvvwuuvuvvuuwvuuvvuvvuuvuvuvvuvuuvvuvuvuvvvvuuvvuv vuvvwvvuvvu vuvvuvvuv vuvvuvvwvuvvuvuvvuvuvvuvuvuuvuvvuvuvuvvuvvwvussuvvuvuv vuvuvvuvuuvvuvvwvusrqplkvvuvuuv vuvuvvuvvutrpnmlkjlklvvuvvuvvuvxuvvuvvtqommlkkllkllvvuvuvvuvvwvuvutsoomlkllmllkklkllvvuvuvvuuvvuvuuvtrqomlkklklklluuvvwvuvvuvvuuvvusrponlkkl lklklluuvvuvvuvvuvwusqpmmklkllklklklluuvvuvuuvvuspnmllkklkllkllkllkllkjkkluuvvuvvutsrpmmllkklk lmllvvuttqomllklkllkllkk lsrpnmllkllkllkllkllkklklklkllkkllklkllklkllklkllllklmkklkkllkllkllklkkllkllkmllkllkllmkklkklk lklkllmllklkklmllklklklklklkkllkllklllklkkl lkllkllkllkklkkllklllkllklkllkllkllkmlkllkllkkllklklklklkkllkmllklkklkklklklkllklkklklklkklkkllllkklkllkllklklklmllkklkllkk lllkllkllmllklmllkllkllklkkllmllllkllklklklkkllkllkllkllklllkllmkk lkllk lkklklkllklklkllklkllklkkkklklkllklkllkllklklklkkkllkllkllklklkklklkllkllkllkllkllkklkkllkllklklkklmllklkllklkkllmllklkkllkllkl lkllkllllkllmkklklkllkllkllkllkklklkllklklkllklkkll3uvvuvu vuvuvvuvuvvvvuvuvuuvvuuvvuvvvuvuvuuvvuvuvvuvvuuvvuvvvuvuvuuv vu vuvvuvvvuvuvvuvuuvvuu vuvuvvuvuvvuvvuvvuvvuvuv vuvuvuvvuv vuvuvvuv vuvuvvuvvuvvuvvuvuvuvuvvuvvuu vuvuvuvvvuuvvuvvuvvuvuvuuvvuvvvvuuvvuvuvvuvuvuuvvvuvuvuvvuvuvuvuvuuvuvuvvuvvuvuvuvuvvuvuvuvvuvuvvuvuvuvuvvuvvuvvuvuvvvuuvvuvvuvuvvu vu vvvuvvuvuvvuvvuvvuvuvvuvvuuvvuvvuvuvvuvvuv vu vuvuvvuvvuvuvvuvvuvvu vuvvvuvvuvuvvuvuv vuvuvvvvuvvuvuvvuvuvvuvvu vvvuvvuvvuvvuvuvuvuvvvuvvuvuvvuvuuv vu vvvu vuvvuvvuuvuuvuvvvuvuvvuvvuuvvuvvvuvvuvuvuvuvuvuvuuvvvvuvuvuvvuvvuuvuuvvuvvvuvuu vuvuv vuv vuvvuvuvuvvuvuvvuvuvvvuvuvvuvuvuvuvvuvuvvuuvuuvuvvuuvuvuvvuvuuvvuvuvuvvvvuuvvuv vuvvuvvu vuvvuvvuv vuvvuvvuvvuvuvvuvuvvuvuvuuvuvvuvuvuvvuvvwvussuvvuvuvuuvuvuvvuvuuvvuvvwvusrqplkvvuvuvvuvvuvuvvuvvuvvutrpnmlkjlklvvuvvuvvuvwuvvuvvtqommklkllvvuvuvvuvvwvuvvuvutsoomlkllmllkklkllvvuvuvvuvuuvtrqomlkklklklluuvvuvvuvusrponlkkl lklklluuvvuvvuvvuvwusqpmmklkllklklklluuvvuvuuvvuspnmmklkllkllkllkllkkluuvvuvvutsrpmmllkklkllkllkkl lvvuttqomllklkllkllkk lsrpnmllkllkllkllkllkklklklkllkkllklkllklkllklkllllklkklkkllkllkllklkkllkllkllkllkllklkklk lklkl lklkkllkllklklklklklkkllkllklllklkkl lkllkllkllkklkkllklllkllklkllkllkllkllkllkllkkllklklklklkkllklklkklkklklklkllklkklklklkklkkllllkklkllkllklklkklklkklkllkklkllllkllkllklkllkllklkkllllkllklklklkkllkllkllkllklllkllmkk lkllk lkklklkllklklkllklkllklkkkklklkllklkllkllklklklkkkllkllkllklklkklklkllkllkllkllkllkkllkkllkllklklkkllklkllklkkl lklkkllkllk lkllkllllkllklklkllkllkllkllkklklkllklklkllklkkll                 󇃁       񉇃         􃆇  񀂃􁃅         ͡wf齁ffvffrff фff gf f |f fkf f ff ff ff zff uffyff ff ff                 󇃁   񈇅     񉇃        􃆇  񀂃􁃅         ͡wf齁ffvffrff фff gf f |f fkf f ff ff ff zff uffyff ff ff       󇃁     񉇃        􃆇񄃂 􁃅        ͡wf齁ffvffrff фff gf f |f f kf f ff ff ff zff uffyff ff ff ~}}|}{|}| ~}~}}|}}|}} ~~} }|}~~}~ }~}~~}~~} } ~}~~}~} } ~~}~~}~} } ~~}~~}~}~~}~ ~}~ }|}~ ~}~~~}~~}}~~} } ~~}~~}|}~~}||}}􉈈~~}~}}||}}~~}~~}~}}|~~~}~}} }~~~~~~}~}~~~~~~}~~}~}}|} ~}~~}~~}}~}~~}~~}~~}~}~~~~~}~~}~ ~~}~~}~~~~~~}~~~~~ ~~ ~~~~~~~~~~~~ ~ ~             3ս}umf3fjf   􊈄    ~  ~~  ~   ~}~ ~~~~~~~~~~~~~~~~~~ ~~~~}~~~~~~~~~}~}~~~~~ ~򀅇~~~~~~~~~~~~~~~~~}~~~~~}~~򉇈~~~~~~~~~}~ ~}~~}~~~>   􊈄    ~񈉉 ~~  ~  ~}~ ~~ ~~~~~~~~~~~~~~~ ~~~~}~~~~~~~~~~}~}~~~~~~~~򀅇~~~ ~~~~~~~~~~~~~~}~~~~~}~~򉇈~~~~~~~~~}~ ~~~~}~~}~~>}~~}|}|}|}􇆆~~~}}~}}|}|{}󇆇~}}~~}~~}|{|~}~~}}~~} }|}|}}||{}|{{yzz~~}}~ }|}}|}|{||{z{|{zz~}} |{z{|{zz{~}} |{|{{z~} }|}{{|zz{zz{z }}~}}|}} |}{zz{zz } }|{|{|{{|{{z{z}}|{z||z{|{z{{yzz򄅆}}|}}||}}|{||{zyzz{{zz~||}|{z{|{{z{{zyz{zz||}||{||{z{{z{z{zyzz ||{|{|{zz{{z ||{||{|{z{z{z{zz{zz }{||{||{{|z{z{z{|zz ||{{||{{|{zz{z{{zz }z|z{zzyz{{zzy |z{||{z{zzyzzy~{{z{{z{zz{zyzz ~zz{zzyz~{zz{zyzzyzz 򄃄|z{zzyzz {zyyzy ~{yyzzyzz |zzyzz  {zzyz ~{yyzy {zzy>}~~}~} }|}|}|}􇆆~~~}}~}}|}|}󇆇~}}~~}~~}|}{|~~}~~}}~~} }|}|}}||z{|{||}~}}~ }|}}|}|{||{|{z~}}|z{{z||z{~}} |{}{{||{z|zz~} }|{z{|{{|zz{z }}~}}|}} |}||}|zz } }~}}{||{||}|{{z{{z}}|}|}||z{||{{zy{{zz򄅆}}|}}||}}|{|z|{{z~||}|{|{{}|{|{zz||}||}||{|{{z{zyzz ||}|{||{|{zzy{{zz ||{||{z{{||}{z{zz{zz }{||{||{{|z{z{z{|zz ||{{||}|{zz{z{{zz }z|{{zz{zz{{zzy |z{}}|z{z{zzyzzy {|{{z{zz{zyzz ~zz{z{zzyz~{zz{zyzzyzz 򄃄|z{zzyzz |{yyzy ~{yyzzyzz |zzyzz  {zzyz ~{yyzy {zzy>}~~}|}|}|}􇆆~~~}}~}}|}|{|󇆇~}}~~}~~} |}|~}~~}}~~} }|}|}}||{||}~{{|}~}}~ }|}}|}|{||{}~{{z~}} |{}}z{|{zz{~}} |{|}}||{{z{~} }|}|{zz}|}}~}}|}}|~|{y|{z{||z} }|{||}}{||}|{{|}}|{}||z{|}~}{zyz{zz|򄅆}}|}}||}}|{|{{z{{||{{~||}|{|{{z||{z{zy||z||}||}|{{|{}}{{zz||z||}||{}~}|}}|{{z ||{|}~|{}{||{{|}||}|{zz }{||}||}||{{|{||}~|{zz 񃄅||{{|}~||{{z{z}}|{zz }z||z{|{z{zz||{zzy ||}||z{zz{|{zzy }}{{|zz{zz~zz||{zzyz~{||zz{{zyzzyzz 򄃄|{|zzyzz |zyyzy ~{z{yzyzz ~||zzyzz|zzyz  ~{yyzy {zzy>          }  zy|yz} zyz}zzyz} zz|  zyzy| zyzyy{ zzyzyy{  zzyzyyzyy|~ zyxyyx{}  zyzyyxxyyxyyxxz~ yzz yxyx{} yyz yxyxwwz~ yzyyxyxyxxyxy} zyxyxyxyxxyxxy|yxyxwxy|yzyyxyxwxwwz|~yzyyxyxxwxwxwwy{y xwxxwx|yzy yxyyxyxxwxwxz}~yzy yxyxxwxxwxwvw{~ yxyxwxxwxwxxwwxwwx{}yzyyxyxyxxwxwvwwz}~ yxvxxwvwwvx{}~~~>          }  z{~ y{zz} zyz}zzyz} zz|  zyzy| zyzyy{ zzyzyy{  zzyzyyzyy|~ z yx{}  zyzyzzyxyyxxz~ yzzyz{zyyxyx{} yyz yxyxwwz~ yzyyxyyxyxxyxy} zyzyxyxyxxyxxy|yxyxwxy|yzyyxyxwxwwz|~yzyyxyxxwxwxwwy{y xwxxwx|yzy yxyyxyxxwxwxz}~yzy yxyxxwxxwxwvw{~ yxyxwxxwxwxxwwxwwx{}yzyyxyxyxxwxwvwwz}~ yxwvwwvx{}~~~>         }  zz} {zz}zyz} ||{zzyz} ||{yzz|  {zyzy| zyzyy{ zzyzyy{ zzyzyyzyy|~ zyxyyx{}  zyzyyxyyxxz~ yzzyzyyxyx{}yyz yxyxwwz~yzyyxyyxyxxyxy}z yxyxyxxyxxy|yzyxyxwyxy|yzyyzyxyxwxwwz|~yzyyxyxxwxwxwwy{y xwxxwx|yzy yxyyxyxxwxwxz}~yzy yxyxxwxxwxwvw{~ yxyxzyxxwxxwxwxxwwxwwx{}yzyyxyxyxxwxwvwwz}~ yxwxxwvwwvx{}~~~>~|xuuvvuututt ~{xvvuvuuvvu ut~}zvuutuutuutuutt~~{wvuvuuvuuttutuututt~~}~|ywtuttuuvtuututt~~~}{yutsuut~}~~~}~~{xvuttutt ~~~~~~}zwuutt ~~ ~{xuttuttstt ~~~~~}yvuttsutt ~|yvttstt ~~ ~}{wttsut t ~}|yutust t~~}~|yvt t~~}~zwuttstt~~~~}|{wuttutt~~~~~}~~}|xutt~~~~~}~}}|zvtts~~~~~~}~}zvut ~~~}~}~~}}|}{y~~}~}}~}}|}~}}||~~~}~}}~}~}}|}}| ~}~}~~ }|}}|~~~}~}~~}~} }|}}|~~~}~}~~}~~}|~~}~~}~~}}|~~~~}~}~}~} }|~~}~}~|~}}~} }|~"~}~~}~}}|}}|}}|~~~~}~~}~} }|}}|}>|xuuvvuututt ~{xvvuvuuvvu ut~}zvuutuutuutuutt~~{wvuvuuvuuttutuututt~~}~|ywtuttuuvtuututt ~~~}{yutsuut~~~~}~~{xvuttutt ~~~~~}zwuutt ~~ ~{xuttuttstt ~~~~~}yvuttsutt ~|yvttstt ~~ ~}{wttsut t ~}|yutust t~}~|yvt t~}~zwuttstt~~~~}|{wuttutt~~~~~}~~}|xutt~~~~~}~}}|zvtts~~~~~~}~}zvut ~~~}~}~~}}|}{y~~}~}}~}}|}~}}||~~~}~}}~}~}}|}}| ~}~}~~ }|}}|~~~}~}~~}~} }|}}|~~~}~}~~}~~}|~~}~~}~~}}|~~~~}~}~}~} }|~~}~}~~}~} }|~"~}~~}~}}|}}|}}|~~~~}~~}~} }|}}|}>|xuuvvuututt ~{xvvuvuuvvu ut~}zvuutuutuutuutt~~{wvuvuuvuuttutuututt~~}~|ywtuttuuvtuututt~~~}{yutsuut~~}~~{xvuttutt ~~~~~}zwuutt ~~ ~{xuttuttstt ~~~~~}yvuttsutt ~|yvttstt ~~ ~}{wttsut t ~}|yutust t ~}~|yvt t ~}~zwuttstt~~~~}|{wuttutt~~~~~}~~}|xutt~~~~~}~}}|zvtts~~~~~~}~}zvut ~~~}~}~~}}|}{y~~}~}}~}}|}~}}||~~~}~}}~}~}}|}}| ~}~}~~ }|}}|~~~}~}~~}~} }|}}|~~~}~}~~}~~}|~~}~~}~~}}|~~~~}~}~}~} }|~~}~}~}~}}~} }|~"~}~~}~}}|}}|}}|~ ~}~~}~} }|}}|}>tstsstsstssrssrsrrqrqrqrsuwyzzyzzttsts srs rqrrqrqrsuwyzzttstssrsrssrrsr rqrtwttstssrqrqqrqqpqrqqpqttsts srqrqqrqrqqtstssrss rqr qtsrsr qpqtuttsrssrrqrqrqqrqqrrqpqqpqqsttststsrsrsrsrrqrrqrqrqqrrqq t srsrsrsrrqrqqpqqtsttssrssrsrrqrqqrqqrqqpqqtsts srsrrqpqqpqqt srsrsrrqrqrrqrrqrqqpqppqqpptsstts srsrsr rqrqrrqrrqqpqptsststssrsrssrrtssr rqrqqrqpqqpttsttssrsrsrsrsrrqtstsrssrsr rqrrqr qpqtstssts srsr rqrqtsrsr rqrrqqrqutssttssttssrsrsr rqrqpq|zyvtststssrsrrsr rqrrqrqpqqp|}|{yvs srssrsrrqrrqrqqrpqpqp|}||}|{wtssrsrsrsrrssr rqrqqrqpqqp|}~|}|{|xtssrtrrsrrsrssrrsrrqrrqrqqp|}||}|yutsrssrssqrssrrqrqrqpqqp||}}||{||{xvssrrqrrqrrqqpqp||}||}|{{||{||}zzxsrrqr qpqqppq|}||{|{|{|{xtrrqrqrqrqpq| |{|{yusrrqrqpq}||{|{|{|zwtrrqrrqrqrqqpqqp?tstsstssrssrsrrqrqrqrsuwyzzyzzttrtssts srs rsrrqrqrsuwyzzttstssrsrssrrsr rqrtwttstssrqrqqrqqpqrqqpqttsts srqrqqrqrqqtstssrss rqr qtsrsr qpqtuttsrssrrsrqrqqrqqrrqrqqpqqsttststsrsrsrsrrqrrqrqrqqrrqq t srsrsrsrrqrqqpqqtsttssrssrsrrqrqqrqsqqrqqpqqtsts srsrrqrqqpqqt srsrsrrqrqrrqrrqrqqpqppqqpptsstts srsrsr rqrqrrqrrqqpqptsststssrsrssrrtssr rqrqqrqpqqpttsttssrsrsrsrsrrqtstsrssrsr rqrrqr qpqtstssts srsr rqrqtsrsr rqrrqqrqutssttssttssrsrsr rqrqpq|zyvtststssrs rqrrqrqpqqp|}|{yvs srssrsrrsrrqrqqr qpqp|}||}|{wtssrsrsrsrrssrrtrrsqqrqqrqpqqp|}~|}|{|xtssrtrrsrrsrssrrsrrqrrqrqqp|}||}|yutsrssrssqrssrrqrqrqpqqp||}}||{||{xvssrrqrrqrrqqpqp||}||}|{{||{||}zzxsrrsqrrq qpqqppq|}||{|{|{|{xtrrqrqrsqrrqqpq| |{|{yusrrqrqpq}||{|{|{|zwtrrqrrqrqrqqpqqp?tstsstssutssrsrrsrrqrqrqrsuwyzzyzzttstssts stsrrss rsrrqrqrsuwyzzttstssrsrssrrsr rqrtwttstssrqrqqrqqpqrqqpqttsts srqrqqrqrqqtstssrss rqr qtsrsr qpqtuttsrssrrqrqqrqqrrqqpqqsttststsrsrsrsrrqrrqrqrqqrrqsqq t srsrsrsrrqrqqpqqtsttssrssrsrrqrqqrqrqqrqqpqqtsts srsrrqpqqt srsrsrrqrqrrqrrqrqqpqppqqpptsstts srsrsr rqrqrrqrrqqpqptsststssrsrssrrtssr rqrqqrqrqqpqqpttsttssrsrsrsrsrrqtstsrssrsr rqrrqr qpqtstssts srsr rqrqtsrsr rqrrqqrqutssttssttssrsrsr rqrqpq|zyvtststssrsrssr rqrrqrqpqqp|}|{yvs srssrsrrqrqqrsqrrqpqp|}||}|{wtssrsrsrsrrssrrsrrqrqqrqsqpqqp|}~|}|{|xtssrtrrsrrsrssrrsrrqrrqrqqp|}||}|yutsrssrssqrssrrqrqrqpqqp||}}||{||{xvssrrqrrqrrqqpqp}|}||}|{{||{||}zzxsrrqrrq qpqqppq~||}||{|{|{|{xtrrqrqrqrrqsq qpq~| |{|{yusrrsqrrqqpq~||{|{|{|zwtrrqrrqrsqrrqrqqpqqp? zyzxyyxyyxyxxyxwxxwxwxwzyyzyzzy yxyyxwxyyx xwxwyzyzyyzy yxyxyxyyx wqsuxyzzyxyxyx xwxwwrqqrtvxzzyzyyxyxyxxwxwqportuwyyzzyxyyxyyxyx xwxwpqqpqrtuxyxyyxwxwqpqppqstwyyxyxxyxxwxwqpqppqppoponptvwyxzyxyxxyxxyx xwxwxwqponnopqtvwxxyyxy xwxxwxxwwxwqpqppqqppnoopponoqrtvxxyyxyx xwxwxxwxwxxwqqpqpnpopnonppqtuwxyx xwxwxwxwwxwqpponpnmnopnnortwxxwxwxwwqpqppopononoonqtwxxwxwwxw wpqpoopoopnoo nosvvxxwwxwwvwwpqppoponopnnonnmnnpqsuvxxwxwwvvwwqppqpponoppopnnomnnonnmnnmmnnprtwwxxwxwwpononopnmnnmnmnoqswxwwxwpqpqpponoonnoopnoo nmnmnpsuvvwxxwpqqponopnoonmnnmnmnmpstvvwwxwpqppqpqoopopoponnpnon nmnmnnmnmmlmnnmmnoqtvwqqpponoppnonnonnmnnmmnmnmnnmmnnmmnmlmmnpqqoponoonopoonnonnmnnmnmnmnnmmnmlmpqpooppopopqoonoonoonnoonmnnmnnmnmmlmnppoqppoopnponnonoonnmmnonnonnmnnmnm mlqppoponoopoononmmn nmnnmnm m popopopnnponnmnnmnmnnmnm mpqononoopmmppmnnpononnonmnmnnmmlmnmmnmpqpnmopoonopnnoonnmnnmnmnmpopoponnonononnmnmnml> zyzyyzyyxyxxyxwxxwxwxwzyyzyzzy yxyyxyxyyx xwxwyzyzyyzy yxyxyxyyx wqsuxyzzyxyxyx xwxwwrqqrtvxzzyzyyxyxyxxwxwqportuwyyzzyxyyxyyxyx xwxwpqqpqrtuxyxyyxwxwqpqppqstwyyxyxxyzyxxwxwqpqppqppqrqpstvwyzzyxyxxyxxyx xwxwxwqprqppopqtvwxxyyxy xwxxwxxwwxwqpqppqqpqponpqrtvxxyyxyx xwxwxxwxwxxwqqpq popponoqrtuwxyx xwxwxwxwwxwqp prpponppopopnnortwxxwxwxwwqpqppqooppqppqonoonqtwxxwxwwxw wpqrqqopo nosvvxxwwxwvwwpqppoponqopoonnmnnpqsuvxxwxwwvvwwqppqpponoppoponoonooponnmnnmmnnprtwwxxwxww ponppqpnoonopnonnmnmnoqswxwwxwpqpqppqonoonnpooppopoon nmnmnpsuvvwxxwpqqpopoopqonqqoopoonnmnnmnmnmpstvvwwxwpqppqpqpqqpponooppoponppnoopnnmnmnnmnmmnnmnnmmnoqtvwqqpprpqrqoppoopomoononnmnnmmnmnmnnmmnnmmnmnonpqqpopqqonnoopomonoonnmnnmnmnmnnmmnmnmpqpqppqpqpqoonqpopoonmnnmnnmnmmnmnppqppqppnpoopopooponnonnmnnmnm mlqppqponoopoonpoonoon nmnnmnm m popopopnnpponnmnnmnmnnmnm mpoppqoopnoppnnppmnnonmnmnnmmlmnmmnmpoppqpoonopnnoon nmnmnmpqpoopqqonnoppnnoonnonnmnmnml> zyz{{yxyyxxyxxyxwxxwxwxwzyyzyzzyyzyxyyxy xwxwyzyzyyzy yxyxyxyyx wqsuxyzzyxyxyx xwxwwrqqrtvxzzyzyyxyxyxxwxwqportuwyyzzyxyyxyyxyx xwxwpqqpqrtuxyxyyxwxwqpqppqstwyyxyxxyxwxwqpqppqppqportvwyyzyxyxxyxxyx xwxwxwqpqpoopqtvwxxyyxy xwxxwxxwwxwqpqppqqpopponoqrtvxxyyxyx xwxwxxwxwxxwqqpqpopopoonoprtuwxyx xwxwxwxwwxwqp pqpponponoopnnortwxxwxwxwwqpqppopopooponoqqnptwxxwxwwxw wpqpqpooponnopponnonnppsvvxxwwxwwvwwpqppsqoppqqpooqonppnpqsuvxxwxwwvvwwqppqppoppoppqpqpnnpponnmmnnprtwwxxwxww proppqoprpnnpmnmnoqswxwwxwpqpqpponoonnpooppnoqqppnnmnmnpsuvvwxxwpqqpoponppoppopnnmnnmnmnmpstvvwwxwpqppqpqqpponooppooqoqoonoonnopoonmnmnnmnmmnnmmnnmmnoqtvwqqppqrqpopoppqnoommnnonopommnnmnnmmnnmmnmlmnnpqqprpooppqppoopqpqnoonnmnopmmnnonnmnnmmnmpqprpqpnpqoonopnnmnnmnnmnm mnppqpoppqonpoonoqnnoponnmnnmnm mlqp pqooqrnoqpoopoonppoopnnmnnmnm m pqpqqpoppopooponnoppnmnmnnmnm m poqqrpnppopooqonnpqqponpnmmnnmnnmmlmnmmnmpopoqpnorqpoopponppnoppnmmnnmnmpopqppnoppopopnoppoommnmnml>wx wvwv vwvvuvuuvvuvvwvwwvuvuvvuvvuvwvwvu vuvwwvwvwvuvuv vuwwvwvwvwvvuvvuvvuvuwwvwvwvvwvvuvuuvvuvvuvvwvwvwvvuvuvvuuvvuuwwvwvvwwvvwvvuvvuvvuvwwvwwvwwvuv vuvvuvuvuvuwwvwvwvwwv vuvvuvuvuvuvw wvwvuvuv vuv wvwvwv vuv vuvv w vwvuvvuwwxww vwvuvvwvwwvwvwvuvvu vuvwwvwvwwvvw vuvvuvuvuvvuvwvwwvwwvvwwvvuvuvuvuvvuuvvuuvvwwvwvwvwvuvutuuvuuvuvvuvvuuvvwwvwvwvwvuvuvuvvwvwvwwvvwwvvuvuvvuvvuwwvwwvwvuvuvuvuvuvtwvwwvwvvwvvwvvwvw vuvuvuvuunnqsuvvwwvwvwwvwvw vuvvuvuvumlmmlortwwvwwvuvuvvuvvuvmmlmoqsuwwvwvuv vuvuvuvvuvvuvmmlmmlmlmoqtvwwvvwvuvvuvvuvvuvlmmlmlnmnpsuwvvwvvuvvuvvuvvuvmlmmlmmlmnmllmnorv vuv vuvvuvvmlmlmllmllmllmorsuvvuvvwvvuvvuuvvuvuvvuvvummlmlmllmllmllmmllnqsuvwvuuvvuvuvvuv?wx wvwv vwvvuvuuvvuvvwvwwvuvuvvuvvuvwvwvu vuvwwvwvwvuvuv vuwwvwvwvwvvuvvuvvuvuwwvwvwvvwvvuvuuvvuvvuvvwvwvwvvuvuvvuuvvuuwwvwvvwwvvwvvuvvuvvuvwwvwwvwwvuv vuvvuvuvwvuwwvwvwvwwv vuvvuvuvwvuvw wvwvuvuv vuv wvwvwv vuv vuvv w vwvuvvuwwxww vwvuvvwvwwvwvwvuvvu vuvwwvwvwwvvw vuvvuvvuwvvuvvuvwvwwvwwvvwwvvuvuvvuvvuuvvuuvvwwvwvwvwvuvwvuuvwwvuvvuvvuuvvwwvwvwvwvuvwuvvuvvwvwvwwvvwwvvuvuvvuvvuwwvwwvwvwvuvvuuvuvuvuvtwvwwvwvvwvvwvvwvw vuvwuvvuvuunnqsuvvwwvwvwwvwvw vuvvuvuvumlmmlortwwvwwvuvuvvuvvuvmmlmoqsuwwvwvuv vuvuvuvvuvvuvmmlmmlmlmoqtvwwvvwvuvvuvvuvvuvlmmlmlnmnpsuwvvwvvuvvuvvuvvuvmlmmlmmlmnmllmnorv vuv vuvvuvvmlmlmllmllmllmorsuvvuvvwvvuvvuuvvuvuvvuvvmlmlmllmllmllmmllnqsuvwvuuvvuvuvvuv?wx wvwv vwvvuvuuvvuvvwvwwvw vuvuvvuvvuvwvwvu vuvwwvwvwvuvuv vuwwvwvwvwvvuvvuvvuvuwwvwvwvvwvvuvuuvvuvvuvvwvwvwvvuvuvvuuvvuuwwvwvvwwvvxwvvwvvuvvuvvuvwwvwwvwwvuv vuvvuvuvuwwvwvwvwwv vuvvuvuvuvw wvwvwv vuv wvwvwvvwxv vuvv w vwvw vuvvuwwxww vwvuvvwvwwvwvwvvwvuvvu vuvwwvwvwwvvwvwv vuvvuvuvvuvvuvwvwwvwwvvwwvvuvuvuvvuvvuuvvuuvvwwvwvwvwvuvuvuuvuvvuvvuuvvwwvwvwvwvuvuvvuvvwvwvwwvvwwvuvuvvuvvuwwvwwvwvxxvvuvuvuvuvtwvwwvwvvwvvwvvwwvw vuvuvvuvuunnqsuvvwwvwvwwvwvw vuvvuvuvumlmmlortwwvwwvuvuvvuvvuvmmlmoqsuwwvwvuv vuvuvuvvuvvuvmmlmmlmlmoqtvwwvvwvuvvuvvuvvuvlmmlmlnmnpsuwvvwvvuvvuvvuvvuvmlmmlmmlmnmllmnorv vuv vuvvuvvmlmlmnmllmllmorsuvvuvvwvvuvvuuvvuvuvvuvvmlmlmlmnmllmllmmllnqsuvwvuuvvuvuvvuv? vuvuvvuv vuvuuvuvvuuvvuvuvuuvvuvuuvvuvvuvuvvuuvuvvuvuutvvvvuvuvuuvvuvuvuvvuuvvuuvuvvvuvuvwvuvvuuvuvuvvuvuv vuvuvuvvuuv vuvvuvvuuvuvvuvuvuvuvuvvuuvvuvuvvuvuvvuvvuvvuvuvvuvuuvuvvuuvuvuvuvvuv vuuvuuvuvvuvuvvuuvuuvvuvuv vuvvvuvvuvvuvvuvuvvvvuvvuvuvuvvuvuvvuvuuvvuvvuuvvuvwvvu vuvuuvuuvvuuvvuuvvutvvuvuvvuuvvuvvuvvuvvuuvvuuvvuvvuvuv vvvuvvuvvuvuvuuvvuvuuvvuvuvuvvuvuuvvuvuvuuvvuuvuvvuvuvvuvvvuvuvvuvvuvuvvuvuuvvvuv vu vuvuvvvuv vuvvuvvuvvuvuvvuvvuvuvvuvvuvvuvuvvvuvvuvuvuvvuuvwvvuvuvvuvuuvvuvvvvuvvuvuvvuvvuvvuvvuvvuvvutuvvvvuvvuvuvvu vuvuvvuvuvvwvuuvvuvuvvuvuvvuv vuv vuvvvuvvuvvuvvuvvuvvuvuvvvvuvuvvuvuvuuvvuvvuvuvuvvvuvuvvuvu vuvuvuvuvvuvuvvuvutuvuuvuvuvuvvuuvuuvuvvuvuvvuvvuvvuuvvuvuvuvuuvvvvuvvuvuvvuvvuvvuvvuuvvuvvuvuvv4vuvvuv vuvuuvwvvuuvvuvuvuuvvuvuuvvuvvuvuvvuuvuvvuvuuvvvuvuvuuvvuvuvuvvuuvvuuwvvuvvvuvuvwvuvvuuvuvuvvuvuv vuvuvuvvuuv vuvvuvvuuvuvvuvuvuvuvuvvuuvvuvuvvuvuvvuvvuvvuvuvvuvuuvuvvuuvuvuvuvvuv vuuvuuvuvvuvuvvuuvuuvvuvuv vuvvvuvvuvvuvvuvuvvvvuvvuvuvuvvuvuvvuvuuvvuvvuuvvuvwvvwvvu vuvuuvuuvvuuvvuuvvuvuvuvvuuvvuvvuvvuvvuuvvuuvvwvvuvuv vvvuvvuvvuvuvuuvvwvuuvvuvuvuvvuvuuvvuvuvuuvvuuwvvuvvuvuvvuvvvuvuvvuvvuvuvvuvuuvvvuv vu vuvuvvvuv vuvvuvvuvvuvuvvuvvuvuvvuvvuvvuvuvvvuvvuvuvuvvuuvuvvuvuvvuvuuvvuvvvvuvvuvuvvuvvuvvuvvuvvuvvuvwvvvvuvvuvuvvu vuvuvvuvuvvwvuuvvuvuvvuvuvvuv vuv vuvvvuvvuvvuvvuvvuvvuvuvvvvuvuvvuvuvuuvvuvvuvuvuvvvuvuvvuvwvvw vuvuvuvuvvuvuvvuwvvwvwuuvuuvuvuvuvvuuvuuvuvvuvuvvuvvuvvuuvvuvuvuvuuvvvvuvvuvuvvuvvuvvuvvuuvvuvvuvuvv4 vuvvuvvuv vuvuuvuvuvuvuuvvuvuuvvuvvuvuvvuuvuvvuvuuvvvuvuvuuvvuvuvuvvuuvvuuvvuvvvuvuvwvuvvuuvuvuvvuvuv vuvuvuvvuuv vuvvuvvuuvuvvuvuvuvuvuvvuuvvuvuvvuvuvvuvvuvvuvuvvuvuuvuvvuuvuvuvuvvuv vuuvuuvuvvuvuvvuuvuuvvuvuv vuvvvuvvuvvuvvuvuvvvvuvvuvuvuvvuvuvvuvuuvvuvvuuvvuvwvvu vuvuuvuuvvuuvvuuvvuvuvuvvuuvvuvvuvvuvvuuvvuuv vuvuv vvvuvvuvvuvuvuuvvuvuvuvuvvuvuuvvuvuvuuvvuuvvuvvuvuvvuvvvuvuvvuvvuvuvvuvuuvvvuv vu vuvuvvvuv vuvvuvvuvvuvuvvuvvuvuvvuvvuvvuvuvvvuvvuvuvuvvuuvvuvuvvuvuuvvuvvvvuvvuvuvvuvvuvvuvvuvvuvvuvvvuvvuvuvvu vuvuvvuvuvvwvuuvvuvuvvuvuvvuv vuv vuvvvuvvuvvuvvuvvuvvuvuvvvvuvuvvuvuvuuvvuvvuvuvuvvvuvuvvuvuvuvuvuvvuvuvvuvuvuuvuvuvuvvuuvuuvuvvuvuvvuvvuvvuuvvuvuvuvuuvvvvuvvuvuvvuvvuvvuvvuuvvuvvuvuvv4}W>+clementine-1.2.3+git1354-gdaddbde+dfsg/dist/format.py000077500000000000000000000050061260417502300222000ustar00rootroot00000000000000#!/usr/bin/env python import argparse import difflib import os import subprocess import sys import urllib2 def main(): parser = argparse.ArgumentParser( description='Reformats C++ source files that have changed from a given ' 'git ref.') parser.add_argument('--url', default='http://clang.clementine-player.org/format', help='a URL of a Clang-in-the-cloud service') parser.add_argument('--ref', default='origin/master', help='the git-ref to compare against') parser.add_argument('--extension', action='append', metavar='EXT', default=['cc', 'cpp', 'h', 'c', 'cxx', 'm', 'mm'], help='file extensions to reformat') parser.add_argument('-i', dest='inplace', action='store_true', help='edit files inplace instead of showing a diff') parser.add_argument('--files', nargs='*', metavar='FIL', default=[], help='get files as arguments insted of git') args = parser.parse_args() try: root_dir = subprocess.check_output([ 'git', 'rev-parse', '--show-toplevel']).strip() except subprocess.CalledProcessError: # Probably we were not called from a git working directory, just ignore this # error. return changed_files = subprocess.check_output([ 'git', 'diff-index', args.ref, '--name-only']).splitlines() if not changed_files: print >> sys.stderr, 'No changes from %s' % args.ref if not args.files and not changed_files: print >> sys.stderr, "Use --files to select files for reformat" return if args.files: changed_files = args.files for filename in changed_files: if not os.path.splitext(filename)[1][1:] in args.extension: continue path = os.path.join(root_dir, filename) if not os.path.exists(path): # Probably a deletion continue original = open(path).read() response = urllib2.urlopen(args.url, original) formatted = response.read() if original == formatted: print >> sys.stderr, '%s: formatting is correct!' % filename continue diff = difflib.unified_diff( original.split('\n'), formatted.split('\n'), os.path.join('a', filename), os.path.join('b', filename), lineterm='') if args.inplace: with open(path, 'w') as fh: fh.write(formatted) print >> sys.stderr, '%s: %d insertion(s), %d deletion(s)' % ( filename, sum(1 for x in diff if x.startswith('+')), sum(1 for x in diff if x.startswith('-'))) else: print '\n'.join(diff) if __name__ == '__main__': main() clementine-1.2.3+git1354-gdaddbde+dfsg/dist/icons/000077500000000000000000000000001260417502300214455ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/dist/icons/ubuntu-mono-dark/000077500000000000000000000000001260417502300246545ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/dist/icons/ubuntu-mono-dark/clementine-panel-grey.png000066400000000000000000000016611260417502300315520ustar00rootroot00000000000000PNG  IHDRw=sRGBbKGD pHYs^+tIME * 31IDATHǽUKoU=xf2~Ğ؎q҈(;m kV@UvٲAlX@@KQhW@xSZ:j{<܏Mb%q\iWs9|T+τEjesDiٹ\̶ظ|wkOJ ]Ap{jzfbXDObkMdJnI$!ͤ,Pa极]K'" wLk\vC!"L*a~tv;63G10]Q<5KAH|@B02v6_xO0^ύLPg;_=*((8kekĐAp($)"'zD{O !' ҙw /TJ,֫ʡM-JЁFW$ahmxp>$eKDt}M.:>b$PL$ƑmD"}߿8u7YW`pNbnK Pbu:?ݵUOn48#ә፥#N!"%<{ofBZX C710j?3#HBDԭwa8"TM{yGމf?0M ̘w6͇E)˄Ůf~p7oM'ޟ+0 ёx'lncܻ /8)<${u}ApY̯>T}VSh<c, U0~G#ڞ'4M[Z^cbo}3|OD 0TM~$OJ7mA!IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/dist/icons/ubuntu-mono-dark/clementine-panel.png000066400000000000000000000023271260417502300306060ustar00rootroot00000000000000PNG  IHDRw=sRGBbKGD pHYs^+tIME "sWIDATHǥ]Lg}b,h LaZ> ̱M\̶̛}8lnŲnWvg6wa,I&dhC2*_ڷgŏT9ssx0v hio]W}WYm>޳ Ϻld/oT>Σ];WZX[d0k45TZ-ScO =_>lK#^z2@AAkc:DH֖p+8ר5gQf2<2ɚjaɠ}{yv@ƆZ <¦ykr6ege<5.G-=O6S^`BD==(/-ŭ`~@je6+p'¤Ѩr:M~$5II5yvAoj@l{o!49P(1מJBK(D$ bͺ^O`jz6b6OP-Mmd~aSK^xEQHEddظ]L2VF]aMM;uTT{"髣(l\WRE"KNzʚj.1֚#cj.*ʷlVN ,C,NZV ZƆLWPDDPqq>Ԓ, s &sbbu!ȲǰtϏD@F?uLQbV>Y̴1-cfIJί/#~lf,}W rdxQޖą/8ܹ}vv`E"ӡRܓ> 0 c>OrY`4Uz"Ơ Hd"(LʽTj ;l J<:{T*eCDJKz!Pƃ|\MOx"B]X(Jۇ윚XH$?ʉ(^9E#33h/Nb5Qhg|>Rzb\geyA{:-k>a &5>|& l/_.t;1XVhs8ÚnQEX,vCtbWn^ghwWF)=0OɷOGj5 Fa-{ޮU6 src խaZVPgGKltS?uA't&s%TuΏo176M>5T$].oh4֐`_ =5*91!t\.o$9I حiBSA0؝.s~ \"P7h5sW˜h<=[bSo>\IENDB`clementine-1.2.3+git1354-gdaddbde+dfsg/dist/icons/ubuntu-mono-light/clementine-panel.png000066400000000000000000000021621260417502300307710ustar00rootroot00000000000000PNG  IHDRw=sRGBbKGD pHYs^+tIME "'IDATHǭmlSeyz_ѕ^`P)Mn"c 1D(dQ#%L|!D? $"3 Ag4A6m;1ٻ{i뺵Mp.?<9y R>CodthWM  0 0#׿Qvgg^ |`se `p 5b$2:1E{Ȋmd4w GxWi;{bi. import logging import os import re import subprocess import sys import traceback LOGGER = logging.getLogger("macdeploy") FRAMEWORK_SEARCH_PATH=[ '/target', '/target/lib', '/Library/Frameworks', os.path.join(os.environ['HOME'], 'Library/Frameworks') ] LIBRARY_SEARCH_PATH=['/target/lib', '/usr/local/lib', '/sw/lib'] GSTREAMER_PLUGINS=[ # Core plugins 'libgstapp.so', 'libgstaudioconvert.so', 'libgstaudiofx.so', 'libgstaudiotestsrc.so', 'libgstaudioresample.so', 'libgstautodetect.so', 'libgstcoreelements.so', 'libgstequalizer.so', 'libgstgdp.so', 'libgstosxaudio.so', 'libgstplayback.so', 'libgsttcp.so', 'libgsttypefindfunctions.so', 'libgstudp.so', 'libgstvolume.so', # Codecs 'libgstapetag.so', 'libgstasf.so', 'libgstaudioparsers.so', 'libgstfaac.so', 'libgstfaad.so', 'libgstflac.so', 'libgstid3demux.so', 'libgstisomp4.so', 'libgstlame.so', 'libgstlibav.so', 'libgstmad.so', 'libgstmms.so', # TODO: Bring back Musepack support. 'libgstogg.so', 'libgstopus.so', 'libgstreplaygain.so', 'libgstspeex.so', 'libgsttaglib.so', 'libgstvorbis.so', 'libgstwavpack.so', 'libgstwavparse.so', # HTTP src support 'libgstsouphttpsrc.so', # Icecast support 'libgsticydemux.so', # CD support 'libgstcdio.so', # RTSP streaming 'libgstrtp.so', 'libgstrtsp.so', ] GSTREAMER_SEARCH_PATH=[ '/target/lib/gstreamer-1.0', '/target/libexec/gstreamer-1.0', ] QT_PLUGINS = [ 'accessible/libqtaccessiblewidgets.dylib', 'codecs/libqcncodecs.dylib', 'codecs/libqjpcodecs.dylib', 'codecs/libqkrcodecs.dylib', 'codecs/libqtwcodecs.dylib', 'iconengines/libqsvgicon.dylib', 'imageformats/libqgif.dylib', 'imageformats/libqico.dylib', 'imageformats/libqjpeg.dylib', 'imageformats/libqmng.dylib', 'imageformats/libqsvg.dylib', ] QT_PLUGINS_SEARCH_PATH=[ '/target/plugins', '/usr/local/Trolltech/Qt-4.7.0/plugins', '/Developer/Applications/Qt/plugins', ] GIO_MODULES_SEARCH_PATH=[ '/target/lib/gio/modules', ] class Error(Exception): pass class CouldNotFindFrameworkError(Error): pass class InstallNameToolError(Error): pass class CouldNotFindXinePluginError(Error): pass class CouldNotFindQtPluginError(Error): pass class CouldNotFindGstreamerPluginError(Error): pass class CouldNotFindGioModuleError(Error): pass if len(sys.argv) < 2: print 'Usage: %s ' % sys.argv[0] bundle_dir = sys.argv[1] bundle_name = os.path.basename(bundle_dir).split('.')[0] commands = [] frameworks_dir = os.path.join(bundle_dir, 'Contents', 'Frameworks') commands.append(['mkdir', '-p', frameworks_dir]) resources_dir = os.path.join(bundle_dir, 'Contents', 'Resources') commands.append(['mkdir', '-p', resources_dir]) plugins_dir = os.path.join(bundle_dir, 'Contents', 'PlugIns') binary = os.path.join(bundle_dir, 'Contents', 'MacOS', bundle_name) fixed_libraries = [] fixed_frameworks = [] def GetBrokenLibraries(binary): output = subprocess.Popen(['otool', '-L', binary], stdout=subprocess.PIPE).communicate()[0] broken_libs = { 'frameworks': [], 'libs': []} for line in [x.split(' ')[0].lstrip() for x in output.split('\n')[1:]]: if not line: # skip empty lines continue if os.path.basename(binary) in line: continue elif re.match(r'^\s*/System/', line): continue # System framework elif re.match(r'^\s*/usr/lib/', line): continue # unix style system library elif re.match(r'Breakpad', line): continue # Manually added by cmake. elif re.match(r'^\s*@executable_path', line) or re.match(r'^\s*@loader_path', line): # Potentially already fixed library relative_path = os.path.join(*line.split('/')[3:]) if not os.path.exists(os.path.join(frameworks_dir, relative_path)): broken_libs['frameworks'].append(relative_path) elif re.search(r'\w+\.framework', line): broken_libs['frameworks'].append(line) else: broken_libs['libs'].append(line) return broken_libs def FindFramework(path): for search_path in FRAMEWORK_SEARCH_PATH: abs_path = os.path.join(search_path, path) if os.path.exists(abs_path): LOGGER.debug("Found framework '%s' in '%s'", path, search_path) return abs_path raise CouldNotFindFrameworkError(path) def FindLibrary(path): if os.path.exists(path): return path for search_path in LIBRARY_SEARCH_PATH: abs_path = os.path.join(search_path, path) if os.path.exists(abs_path): LOGGER.debug("Found library '%s' in '%s'", path, search_path) return abs_path raise CouldNotFindFrameworkError(path) def FixAllLibraries(broken_libs): for framework in broken_libs['frameworks']: FixFramework(framework) for lib in broken_libs['libs']: FixLibrary(lib) def FixFramework(path): if path in fixed_libraries: return else: fixed_libraries.append(path) abs_path = FindFramework(path) broken_libs = GetBrokenLibraries(abs_path) FixAllLibraries(broken_libs) new_path = CopyFramework(abs_path) id = os.sep.join(new_path.split(os.sep)[3:]) FixFrameworkId(new_path, id) for framework in broken_libs['frameworks']: FixFrameworkInstallPath(framework, new_path) for library in broken_libs['libs']: FixLibraryInstallPath(library, new_path) def FixLibrary(path): if path in fixed_libraries or FindSystemLibrary(os.path.basename(path)) is not None: return else: fixed_libraries.append(path) abs_path = FindLibrary(path) broken_libs = GetBrokenLibraries(abs_path) FixAllLibraries(broken_libs) new_path = CopyLibrary(abs_path) FixLibraryId(new_path) for framework in broken_libs['frameworks']: FixFrameworkInstallPath(framework, new_path) for library in broken_libs['libs']: FixLibraryInstallPath(library, new_path) def FixPlugin(abs_path, subdir): broken_libs = GetBrokenLibraries(abs_path) FixAllLibraries(broken_libs) new_path = CopyPlugin(abs_path, subdir) for framework in broken_libs['frameworks']: FixFrameworkInstallPath(framework, new_path) for library in broken_libs['libs']: FixLibraryInstallPath(library, new_path) def FixBinary(path): broken_libs = GetBrokenLibraries(path) FixAllLibraries(broken_libs) for framework in broken_libs['frameworks']: FixFrameworkInstallPath(framework, path) for library in broken_libs['libs']: FixLibraryInstallPath(library, path) def CopyLibrary(path): new_path = os.path.join(frameworks_dir, os.path.basename(path)) args = ['ditto', '--arch=x86_64', path, new_path] commands.append(args) LOGGER.info("Copying library '%s'", path) return new_path def CopyPlugin(path, subdir): new_path = os.path.join(plugins_dir, subdir, os.path.basename(path)) args = ['mkdir', '-p', os.path.dirname(new_path)] commands.append(args) args = ['ditto', '--arch=x86_64', path, new_path] commands.append(args) LOGGER.info("Copying plugin '%s'", path) return new_path def CopyFramework(path): parts = path.split(os.sep) for i, part in enumerate(parts): if re.match(r'\w+\.framework', part): full_path = os.path.join(frameworks_dir, *parts[i:-1]) break args = ['mkdir', '-p', full_path] commands.append(args) args = ['ditto', '--arch=x86_64', path, full_path] commands.append(args) menu_nib = os.path.join(os.path.split(path)[0], 'Resources', 'qt_menu.nib') if os.path.exists(menu_nib): args = ['cp', '-r', menu_nib, resources_dir] commands.append(args) LOGGER.info("Copying framework '%s'", path) return os.path.join(full_path, parts[-1]) def FixId(path, library_name): id = '@executable_path/../Frameworks/%s' % library_name args = ['install_name_tool', '-id', id, path] commands.append(args) def FixLibraryId(path): library_name = os.path.basename(path) FixId(path, library_name) def FixFrameworkId(path, id): FixId(path, id) def FixInstallPath(library_path, library, new_path): args = ['install_name_tool', '-change', library_path, new_path, library] commands.append(args) def FindSystemLibrary(library_name): for path in ['/lib', '/usr/lib']: full_path = os.path.join(path, library_name) if os.path.exists(full_path): return full_path return None def FixLibraryInstallPath(library_path, library): system_library = FindSystemLibrary(os.path.basename(library_path)) if system_library is None: new_path = '@executable_path/../Frameworks/%s' % os.path.basename(library_path) FixInstallPath(library_path, library, new_path) else: FixInstallPath(library_path, library, system_library) def FixFrameworkInstallPath(library_path, library): parts = library_path.split(os.sep) for i, part in enumerate(parts): if re.match(r'\w+\.framework', part): full_path = os.path.join(*parts[i:]) break new_path = '@executable_path/../Frameworks/%s' % full_path FixInstallPath(library_path, library, new_path) def FindXinePlugin(name): for path in XINEPLUGIN_SEARCH_PATH: if os.path.exists(path): for dir, dirs, files in os.walk(path): if name in files: return os.path.join(dir, name) raise CouldNotFindXinePluginError(name) def FindQtPlugin(name): for path in QT_PLUGINS_SEARCH_PATH: if os.path.exists(path): if os.path.exists(os.path.join(path, name)): return os.path.join(path, name) raise CouldNotFindQtPluginError(name) def FindGstreamerPlugin(name): for path in GSTREAMER_SEARCH_PATH: if os.path.exists(path): for dir, dirs, files in os.walk(path): if name in files: return os.path.join(dir, name) raise CouldNotFindGstreamerPluginError(name) def FindGioModule(name): for path in GIO_MODULES_SEARCH_PATH: if os.path.exists(path): for dir, dirs, files in os.walk(path): if name in files: return os.path.join(dir, name) raise CouldNotFindGioModuleError(name) def main(): logging.basicConfig(filename="macdeploy.log", level=logging.DEBUG, format='%(asctime)s %(levelname)-8s %(message)s') FixBinary(binary) for plugin in GSTREAMER_PLUGINS: FixPlugin(FindGstreamerPlugin(plugin), 'gstreamer') FixPlugin(FindGstreamerPlugin('gst-plugin-scanner'), '.') FixPlugin(FindGioModule('libgiognutls.so'), 'gio-modules') FixPlugin(FindGioModule('libgiolibproxy.so'), 'gio-modules') try: FixPlugin('clementine-spotifyblob', '.') FixPlugin('clementine-tagreader', '.') except: print 'Failed to find blob: %s' % traceback.format_exc() for plugin in QT_PLUGINS: FixPlugin(FindQtPlugin(plugin), os.path.dirname(plugin)) if len(sys.argv) <= 2: print 'Would run %d commands:' % len(commands) for command in commands: print ' '.join(command) print 'OK?' raw_input() for command in commands: p = subprocess.Popen(command) os.waitpid(p.pid, 0) if __name__ == "__main__": main() clementine-1.2.3+git1354-gdaddbde+dfsg/dist/maketarball.sh.in000077500000000000000000000011761260417502300235620ustar00rootroot00000000000000#!/bin/bash name=clementine version="@CLEMENTINE_VERSION_SPARKLE@" deb_dist="@DEB_DIST@" root=$(cd "${0%/*}/.." && echo $PWD/${0##*/}) root=`dirname "$root"` rootnoslash=`echo $root | sed "s/^\///"` echo "Creating $name-$version.tar.gz..." tar -czf $name-$version.tar.gz "$root" \ --transform "s,^$rootnoslash,$name-$version," \ --exclude-vcs \ --exclude "$root/bin/*" \ --exclude "$root/debian" \ --exclude "$root/dist/*.tar.gz" \ --exclude "$root/CMakeLists.txt.user" echo "Also creating ${name}_${version}~${deb_dist}.orig.tar.gz..." cp "$name-$version.tar.gz" "${name}_${version}~${deb_dist}.orig.tar.gz" clementine-1.2.3+git1354-gdaddbde+dfsg/dist/qt.conf000066400000000000000000000000321260417502300216200ustar00rootroot00000000000000[Paths] Plugins = PlugIns clementine-1.2.3+git1354-gdaddbde+dfsg/dist/sparkle_pub.pem000066400000000000000000000022321260417502300233430ustar00rootroot00000000000000-----BEGIN PUBLIC KEY----- MIIDOzCCAi0GByqGSM44BAEwggIgAoIBAQDdN5SuxsdDCpC+eYBDF8S2cDyQquRe fN5pOY4aUGUBmPE49SKfJHZ5vGrBZ47TTqOGPI4wtng4BLZnbIRcomy77XS0Cg41 fouomNdcOswSzr6FkhCo1E9iVmB7gvuLIVlbI8uz16VAIEpgK13VebzooIUwTjIM wdXMu351j/uVL5GQRwwYA4tgD3YtdPYx8pZ66RhyY4TOdVjNLtUUGgACah/VEQxh x374/rzCv1qjjMSucIGslfvkpEYZa/sj+EW7rf74XyC1LnG2PDLuupDkphm4Bk/v txNReiYr/CBVUpkuIz1+39cviP3i8Zwc7GtJJnJVZmabNqHjQK12jGK3AhUAjmnH BWVytsINTT53A1wc6a6gg2MCggEAbLAqLBqNSkLbi13l8b6XtkmPp0tpIRxNi+Vq eA1rwGekWq/8lewkQdCz5koxA2a+yXVJOjWaog8q/I/tylQsyhnB+E0NNmQPCKuT JwQ+580Kec/ScNZQaFpd2NbkQIa8EKMI/wu5pNTezvI9UqRjVZaJ/yxz+QsTrZD4 2xmNvBCfz/0KXEZmJGs2qcy/5Ci6MTB4TjSEalNJ0pYVCeUGPYkBcKhcJ+lsOyqK hoyJC4JHgCDNm7x6xxiDgWbOOM6XK4cuzvB+AOy1yU7IoR5uLa3Vv/cd2JzgUcne 6lU8U2exgsO2b9xmSAmMJbXDWGVB141Idkvc5V5K+a1R46y5ugOCAQYAAoIBAQCo WrWRqXTIKDFabx5JPpwbbOgMySLtqzQRmsPQqfUkGodjN6XYfR06MUrK/h4Ly3Aw czW+xxn/IzR9DJaMq4WeWRjb7kBd+BcGcQK9pSudNG+cSe9KZlDuuOhY8HTrsy9Z jW1WnOB0yVe3dT40pYuI5FZde40btJqTv+35JMbUyuqfuqP5fXoF/oT6LuYL7Tpw H1osrCtB7kl3wmoS3fpWSxzI4xHfhsi2Hk7pFSDsN5P8xOln57N5IGfJ0qoJwb5T MwL7/GJiP5RY9Jmqva1/6gPdGzG+1a+2ZCDQUE1z459adRu51mbdjmuazplA+3VS JAWNS0btCb5PSc0YJIRZ -----END PUBLIC KEY----- clementine-1.2.3+git1354-gdaddbde+dfsg/dist/update_desktop_languages.py000066400000000000000000000065201260417502300257500ustar00rootroot00000000000000import codecs import glob import logging import os import polib import re PO_GLOB = 'src/translations/*.po' DESKTOP_PATH = 'dist/clementine.desktop' class ConfigParser(object): """ Better version of the ConfigParser from the stdlib that handles unicode. """ SECTION_RE = re.compile('^\[(.*)\]\s*$') VALUE_RE = re.compile('^([^\s=]+)\s*=\s*(.*)') def __init__(self, encoding='utf-8'): self._sections = [] self.encoding = encoding def read(self, filename): with codecs.open(filename, 'r', self.encoding) as handle: current_section = None for line in handle: match = self.SECTION_RE.match(line) if match: current_section = self._add_section(match.group(1)) continue match = self.VALUE_RE.match(line) if match: current_section['items'].append( (match.group(1), match.group(2).strip())) continue def _add_section(self, section_name): section = { 'name': section_name, 'items': [], } self._sections.append(section) return section def _find_section(self, section_name): return [ section for section in self._sections if section['name'] == section_name ][0] def _find_item_value(self, section, key): return [ item[1] for item in section['items'] if item[0] == key ][0] def sections(self): return [x['name'] for x in self._sections] def get(self, section_name, key): try: return self._find_item_value(self._find_section(section_name), key) except IndexError: return None def set(self, section_name, key, value): try: section = self._find_section(section_name) except IndexError: section = self._add_section(section_name) for index, (existing_key, _existing_value) in enumerate(section['items']): if existing_key == key: section['items'][index] = (key, value) return section['items'].append((key, value)) def write(self, filename): with codecs.open(filename, 'w', self.encoding) as handle: for section in self._sections: handle.write('[%s]\n' % section['name']) for key, value in section['items']: handle.write('%s=%s\n' % (key, value)) handle.write('\n') def main(): logging.basicConfig(level=logging.DEBUG, format="%(asctime)s %(levelname)-7s %(message)s") config_parser = ConfigParser() config_parser.read(DESKTOP_PATH) shortcuts = [ { 'section_name': section_name, 'original': config_parser.get(section_name, 'Name'), } for section_name in config_parser.sections() if section_name.endswith('Shortcut Group') ] for po_filename in glob.glob(PO_GLOB): language = os.path.splitext(os.path.basename(po_filename))[0] config_key = 'Name[%s]' % language po_file = polib.pofile(po_filename) logging.info('Reading language %s', po_filename) for shortcut in shortcuts: original = shortcut['original'] entry = po_file.find(original) if entry is not None and entry.msgstr and entry.msgstr != original: logging.info('Setting %s for %s to %s', config_key, shortcut['section_name'], entry.msgstr) config_parser.set(shortcut['section_name'], config_key, entry.msgstr) config_parser.write(DESKTOP_PATH) if __name__ == '__main__': main() clementine-1.2.3+git1354-gdaddbde+dfsg/dist/uploadtoppa.sh000077500000000000000000000016621260417502300232260ustar00rootroot00000000000000#!/bin/sh -e REFSPEC=$1 DIST=$2 if [ -z "$REFSPEC" -o -z "$DIST" ]; then echo "Usage: $0 " echo "Example: $0 tags/0.7 natty" exit 1 fi PPA=ppa:me-davidsansome/clementine REPO=https://github.com/clementine-player/Clementine BASE=`pwd` DIRECTORY=clementine # Cleanup any old stuff rm -rfv $BASE/$DIRECTORY $BASE/*.diff.gz $BASE/*.tar.gz $BASE/*.dsc $BASE/*_source.changes # Checkout git clone $REPO $DIRECTORY cd $BASE/$DIRECTORY git checkout $REFSPEC # Generate changelog and maketarball.sh mkdir $BASE/$DIRECTORY/bin cd $BASE/$DIRECTORY/bin cmake .. -DDEB_DIST=$DIST -DWITH_DEBIAN=ON rm -rfv $BASE/$DIRECTORY/bin/* # Create the tarball cd $BASE/$DIRECTORY/dist ./maketarball.sh mv -v $BASE/$DIRECTORY/dist/*.orig.tar.gz $BASE/ rm -v $BASE/$DIRECTORY/dist/*.tar.gz rm -vrf $BASE/$DIRECTORY/.git # Build the deb cd $BASE/$DIRECTORY dpkg-buildpackage -S -kF6ABD82E # Upload to ppa cd $BASE dput $PPA *_source.changes clementine-1.2.3+git1354-gdaddbde+dfsg/dist/versionnumbers.py000066400000000000000000000017701260417502300237720ustar00rootroot00000000000000import rpm import subprocess deb_versions = [ "1.0", "1.0.1", "1.0.2", "1.0.a", "1.0~rc1", "1.0~rc2", "1.0-506-g044287b", "1.0-1-g044287b", ] rpm_versions = [ ("1.0", "1"), ("1.0.1", "1"), ("1.0.2", "1"), ("1.0", "0.rc1"), ("1.0", "0.rc2"), ("1.0", "2.506-g044287b"), ] def compare_deb(left, right): if subprocess.call(["dpkg", "--compare-versions", left, "lt", right]) == 0: return -1 if subprocess.call(["dpkg", "--compare-versions", left, "eq", right]) == 0: return 0 if subprocess.call(["dpkg", "--compare-versions", left, "gt", right]) == 0: return 1 raise Exception("Couldn't compare versions %s %s" % (left, right)) def compare_rpm(left, right): return rpm.labelCompare(("1", left[0], left[1]), ("1", right[0], right[1])) def sort_and_print(l, cmp): for v in sorted(l, cmp=cmp): if isinstance(v, tuple): print "%s-%s" % v else: print v print sort_and_print(deb_versions, compare_deb) sort_and_print(rpm_versions, compare_rpm) clementine-1.2.3+git1354-gdaddbde+dfsg/dist/windows/000077500000000000000000000000001260417502300220245ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/dist/windows/Capabilities.nsh000066400000000000000000000420511260417502300251310ustar00rootroot00000000000000/* _____________________________________________________________________________ Application Capabilities (Default Programs) _____________________________________________________________________________ By Joel Spadin Loosely based on code taken from http://nsis.sourceforge.net/File_Association These functions register an application with Windows Vista's and Windows 7's Default Programs window. Usage: !include "Capabilities.nsh" !define CAPABILITIES_NAME "[program name]" !define CAPABILITIES_DESCRIPTION "[description]" !define CAPABILITIES_PROGID "[progid]" !define CAPABILITIES_PATH "[path]" ... During install, call ${RegisterCapabilities}, then use the other register macros to create file type, MIME, and protocol associations. During uninstall, call ${UnRegisterCapabilities} _______________________________________________________________________________ More information about Default Programs and Client Types can be found here: http://msdn.microsoft.com/en-us/library/cc144154(VS.85).aspx http://msdn.microsoft.com/en-us/library/cc144109(v=VS.85).aspx Defines: All defines not marked [optional] are required. CAPABILITIES_NAME The canonical name of the program. CAPABILITIES_LOCAL_NAME [optional] The localized name of the program as it appears in Default Programs. This should be in the format "@FilePath,-StringID" where FilePath is the path to a .dll or .exe file and StringID is the ID of a resource contained in the file. CAPABILITIES_DESCRIPTION The localized description shown in Default Programs. This can be either a string or in the same format as CAPABILITIES_LOCAL_NAME CAPABILITIES_PROGID An identifier used in file associations. Usually, this is the name of the program. This should not have any spaces in it. CAPABILITIES_PATH The location where capabilities info is stored in the registry. The "Capabilities" key will automatically be added. If the application is a client of some sort, (browser, email, media player, etc.) use "Software\Clients\[ClientType]\[ProgramName]". Otherwise, use "Software\[CompanyName]\[ProgramName]" or just "Software\[ProgramName]". CAPABILITIES_ICON [optional] The icon shown in Default Programs. This should be in the format "FilePath,IconIndex" where FilePath is the path to a file containing the icon. If IconIndex is positive, the number is used as the index of the zero-based array of icons stored in the file. If IconIndex is negative, the absolute value is used as a resource ID. CAPABILITIES_REINSTALL [optional] The command executed when a user uses Set Program Access and Computer Defaults to select this application as the default for its client type. This command should launch a program that associates the application with all the file and protocol types it can handle. CAPABILITIES_HIDE_ICONS [optional] The command executed when a user uses Set Program Access and Computer Defaults to disable access to this application. This command should launch a program that hides all shortcuts and access points to this application. It should also prevent the application from being run automatically and update the IconsVisible registry value to 0. CAPABILITIES_SHOW_ICONS [optional] The command executed when a user uses Set Program Access and Computer Defaults to enable access to this application. This command should launch a program that restores shortcuts and access points to the application, allows the program to run, and updates the IconsVisible registry value to 1. Macros: ${RegisterCapabilities} Registers the program with Default Programs. Call this once on install before using any other functions. ${UnRegisterCapabilities} Un-registers the program and all its associations. Call this once on uninstall to clean up all installed registry values. ${RegisterFileType} "[extension]" "[executable]" "[icon]" "[description]" Registers a file type with the program extension: The file extension to register (ex: .txt) executable: The executable that opens the file type icon: The icon shown for the file type description: Description for the file type shown in Explorer ${RegisterMediaType} "[extension]" "[executable]" "[icon]" "[description]" Registers a media file type with the program (has a "Play" command) (arguments are same as RegisterFileType) ${RegisterMimeType} "[mime type]" "[shortname]" "[clsid]" Registers a mime type with the program mime type: The MIME type to register (ex: audio/mp3) shortname: A short identifier for the type (ex: mp3) clsid: The CLSID of the program to handle files of this type ${RegisterProtocol} "[protocol]" "[executable]" "[icon]" "[description]" Registers a URL protocol with the program protocol: The protocol to register (ex: http) (other arguments are same as RegisterFileType) ${UnRegisterFileType} "[extension]" Un-registers a previously registered file type extension: The file extension to un-register ${UnRegisterMimeType} "[mime type]" Un-registers a previously registered MEME type mime type: The MIME type to un-register ${UnRegisterProtocol} "[protocol]" Un-registers a previously registered URL protocol protocol: The URL protocol to un-register */ !ifndef Capabilities_INCLUDED !define Capabilities_INCLUDED !include "Util.nsh" !include "StrFunc.nsh" ${StrCase} !verbose push !verbose 3 !ifndef _Capabilities_VERBOSE !define _Capabilities_VERBOSE 3 !endif !verbose ${_Capabilities_VERBOSE} !define Capabilities_VERBOSE `!insertmacro Capabilities_VERBOSE` !verbose pop !macro Capabilities_VERBOSE _VERBOSE !verbose push !verbose 3 !undef _Capabilities_VERBOSE !define _Capabilities_VERBOSE ${_VERBOSE} !verbose pop !macroend !macro RegisterCapabilitiesCall !verbose push !verbose ${_Capabilities_VERBOSE} ${CallArtificialFunction} RegisterCapabilities_ !verbose pop !macroend !macro UnRegisterCapabilitiesCall !verbose push !verbose ${_Capabilities_VERBOSE} ${CallArtificialFunction} UnRegisterCapabilities_ !verbose pop !macroend !macro RegisterFileTypeCall _EXTENSION _EXECUTABLE _ICON _DESCRIPTION !verbose push !verbose ${_Capabilities_VERBOSE} Push `${_DESCRIPTION}` Push `${_ICON}` Push `${_EXECUTABLE}` Push `${_EXTENSION}` ${CallArtificialFunction} RegisterFileType_ !verbose pop !macroend !macro RegisterMediaTypeCall _EXTENSION _EXECUTABLE _ICON _DESCRIPTION !verbose push !verbose ${_Capabilities_VERBOSE} Push `${_DESCRIPTION}` Push `${_ICON}` Push `${_EXECUTABLE}` Push `${_EXTENSION}` ${CallArtificialFunction} RegisterMediaType_ !verbose pop !macroend !macro RegisterMimeTypeCall _MIMETYPE _SHORTNAME _CLSID !verbose push !verbose ${_Capabilities_VERBOSE} Push `${_CLSID}` Push `${_SHORTNAME}` Push `${_MIMETYPE}` ${CallArtificialFunction} RegisterMimeType_ !verbose pop !macroend !macro RegisterProtocolCall _PROTOCOL _EXECUTABLE _ICON _DESCRIPTION !verbose push !verbose ${_Capabilities_VERBOSE} Push `${_DESCRIPTION}` Push `${_ICON}` Push `${_EXECUTABLE}` Push `${_PROTOCOL}` ${CallArtificialFunction} RegisterProtocol_ !verbose pop !macroend !macro UnRegisterFileTypeCall _EXTENSION !verbose push !verbose ${_Capabilities_VERBOSE} Push `${_EXTENSION}` ${CallArtificialFunction} UnRegisterFileType_ !verbose pop !macroend !macro UnRegisterMimeTypeCall _MIMETYPE !verbose push !verbose ${_Capabilities_VERBOSE} Push `${_MIMETYPE}` ${CallArtificialFunction} UnRegisterMimeType_ !verbose pop !macroend !macro UnRegisterProtocolCall _PROTOCOL !verbose push !verbose ${_Capabilities_VERBOSE} Push `${_MIMETYPE}` ${CallArtificialFunction} UnRegisterProtocol_ !verbose pop !macroend !define RegisterCapabilities `!insertmacro RegisterCapabilitiesCall` !define un.RegisterCapabilities `!insertmacro RegisterCapabilitiesCall` !macro RegisterCapabilities !macroend !macro un.RegisterCapabilities !macroend !macro RegisterCapabilities_ !verbose push !verbose ${_Capabilities_VERBOSE} Push $0 !ifndef CAPABILITIES_PATH !error "CAPABILITIES_PATH not defined" !endif !ifndef CAPABILITIES_NAME !error "CAPABILITIES_NAME not defined" !endif !ifndef CAPABILITIES_PROGID !error "CAPABILITIES_PROGID not defined" !endif !ifndef CAPABILITIES_DESCRIPTION !error "CAPABILITIES_DESCRIPTION not defined" !endif StrCpy $0 "${CAPABILITIES_PATH}\Capabilities" ; add the application to RegisteredApplications WriteRegStr HKLM "Software\RegisteredApplications" "${CAPABILITIES_NAME}" "$0" ; write application info WriteRegStr HKLM "${CAPABILITIES_PATH}" "" "${CAPABILITIES_NAME}" !ifdef CAPABILITIES_LOCAL_NAME WriteRegStr HKLM "${CAPABILITIES_PATH}" "LocalizedString" "${CAPABILITIES_LOCAL_NAME}" !endif !ifdef CAPABILITIES_ICON WriteRegStr HKLM "${CAPABILITIES_PATH}\DefaultIcon" "" "${CAPABILITIES_ICON}" !endif ; write installinfo if defined !ifdef CAPABILITIES_REINSTALL WriteRegStr HKLM "${CAPABILITIES_PATH}\InstallInfo" "ReinstallCommand" "${CAPABILITIES_REINSTALL}" !endif !ifdef CAPABILITIES_HIDE_ICONS WriteRegStr HKLM "${CAPABILITIES_PATH}\InstallInfo" "HideIconsCommand" "${CAPABILITIES_HIDE_ICONS}" WriteRegDWORD HKLM "${CAPABILITIES_PATH}\InstallInfo" "IconsVisible" 0x1 !endif !ifdef CAPABILITIES_SHOW_ICONS WriteRegStr HKLM "${CAPABILITIES_PATH}\InstallInfo" "ShowIconsCommand" "${CAPABILITIES_SHOW_ICONS}" WriteRegDWORD HKLM "${CAPABILITIES_PATH}\InstallInfo" "IconsVisible" 0x1 !endif ; write application capabilities info !ifdef CAPABILITIES_LOCAL_NAME WriteRegStr HKLM "$0" "ApplicationName" "${CAPABILITIES_LOCAL_NAME}" !else WriteRegStr HKLM "$0" "ApplicationName" "${CAPABILITIES_NAME}" !endif WriteRegStr HKLM "$0" "ApplicationDescription" "${CAPABILITIES_DESCRIPTION}" Pop $0 !verbose pop !macroend !define UnRegisterCapabilities `!insertmacro UnRegisterCapabilitiesCall` !define un.UnRegisterCapabilities `!insertmacro UnRegisterCapabilitiesCall` !macro UnRegisterCapabilities !macroend !macro un.UnRegisterCapabilities !macroend !macro UnRegisterCapabilities_ !define MacroID ${__LINE__} !verbose push !verbose ${_Capabilities_VERBOSE} Push $0 Push $1 ; remove all file associations FileTypeLoop_${MacroID}: EnumRegValue $0 HKLM "${CAPABILITIES_PATH}\Capabilities\FileAssociations" 0 StrCmp $0 "" FileTypeDone_${MacroID} ReadRegStr $1 HKLM "${CAPABILITIES_PATH}\Capabilities\FileAssociations" "$0" DeleteRegKey HKCR $1 DeleteRegValue HKLM "${CAPABILITIES_PATH}\Capabilities\FileAssociations" "$0" Goto FileTypeLoop_${MacroID} FileTypeDone_${MacroID}: ; remove all MIME associations MimeTypeLoop_${MacroID}: EnumRegValue $0 HKLM "${CAPABILITIES_PATH}\Capabilities\MimeAssociations" 0 StrCmp $0 "" MimeTypeDone_${MacroID} ReadRegStr $1 HKLM "${CAPABILITIES_PATH}\Capabilities\MimeAssociations" "$0" DeleteRegKey HKCR "$1" DeleteRegValue HKLM "${CAPABILITIES_PATH}\Capabilities\MimeAssociations" "$0" Goto MimeTypeLoop_${MacroID} MimeTypeDone_${MacroID}: ; remove all protocol associations ProtocolLoop_${MacroID}: EnumRegValue $0 HKLM "${CAPABILITIES_PATH}\Capabilities\UrlAssociations" 0 StrCmp $0 "" ProtocolDone_${MacroID} ReadRegStr $1 HKLM "${CAPABILITIES_PATH}\Capabilities\UrlAssociations" "$0" DeleteRegKey HKCR "$1" DeleteRegValue HKLM "${CAPABILITIES_PATH}\Capabilities\UrlAssociations" "$0" Goto ProtocolLoop_${MacroID} ProtocolDone_${MacroID}: ; remove capabilities keys DeleteRegValue HKLM "Software\RegisteredApplications" "${CAPABILITIES_NAME}" DeleteRegKey HKLM ${CAPABILITIES_PATH} Pop $1 Pop $0 !verbose pop !undef MacroID !macroend !define RegisterFileType `!insertmacro RegisterFileTypeCall` !define un.RegisterFileType `!insertmacro RegisterFileTypeCall` !macro RegisterFileType !macroend !macro un.RegisterFileType !macroend !macro RegisterFileType_ !verbose push !verbose ${_Capabilities_VERBOSE} Exch $R3 ;ext Exch Exch $R2 ;exe Exch 2 Exch $R1 ;icon Exch Exch 3 Exch $R0 ;desc Push $0 ; create an association name ; ex: .mp3 becomes ProgID.AssocFile.MP3 ${StrCase} $0 "$R3" "U" StrCpy $0 "${CAPABILITIES_PROGID}.AssocFile$0" ; link capabilities to association in classes root WriteRegStr HKLM "${CAPABILITIES_PATH}\Capabilities\FileAssociations" "$R3" "$0" ; write file association in classes root WriteRegStr HKCR "$0" "" "$R0" WriteRegStr HKCR "$0\DefaultIcon" "" "$R1" WriteRegStr HKCR "$0\shell" "" "Open" WriteRegStr HKCR "$0\shell\open" "" "&Open" WriteRegStr HKCR "$0\shell\open\command" "" '"$R2" "%1"' Pop $0 Pop $R0 Pop $R1 Pop $R2 Pop $R3 !verbose pop !macroend !define RegisterMediaType `!insertmacro RegisterMediaTypeCall` !define un.RegisterMediaType `!insertmacro RegisterMediaTypeCall` !macro RegisterMediaType !macroend !macro un.RegisterMediaType !macroend !macro RegisterMediaType_ !verbose push !verbose ${_Capabilities_VERBOSE} Exch $R3 ;ext Exch Exch $R2 ;exe Exch 2 Exch $R1 ;icon Exch Exch 3 Exch $R0 ;desc Push $0 ; create an association name ; ex: .mp3 becomes ProgID.AssocFile.MP3 ${StrCase} $0 "$R3" "U" StrCpy $0 "${CAPABILITIES_PROGID}.AssocFile$0" ; link capabilities to association in classes root WriteRegStr HKLM "${CAPABILITIES_PATH}\Capabilities\FileAssociations" "$R3" "$0" ; write file association in classes root WriteRegStr HKCR "$0" "" "$R0" WriteRegStr HKCR "$0\DefaultIcon" "" "$R1" WriteRegStr HKCR "$0\shell" "" "Play" WriteRegStr HKCR "$0\shell\open" "" "&Open" WriteRegStr HKCR "$0\shell\open\command" "" '"$R2" "%1"' WriteRegStr HKCR "$0\shell\play" "" "&Play" WriteRegStr HKCR "$0\shell\play\command" "" '"$R2" "%L"' Pop $0 Pop $R0 Pop $R1 Pop $R2 Pop $R3 !verbose pop !macroend !define RegisterMimeType `!insertmacro RegisterMimeTypeCall` !define un.RegisterMimeType `!insertmacro RegisterMimeTypeCall` !macro RegisterMimeType !macroend !macro un.RegisterMimeType !macroend !macro RegisterMimeType_ !verbose push !verbose ${_Capabilities_VERBOSE} Exch $R2 ;mime Exch Exch $R1 ;shortname Exch Exch 2 Exch $R0 ;clsid Push $0 ; create an association name ; ex: audio/mp3 becomes ProgID.AssocMIME.MP3 ${StrCase} $0 "$R1" "U" StrCpy $0 "${CAPABILITIES_PROGID}.AssocMIME.$0" ; link capabilities to association in classes root WriteRegStr HKLM "${CAPABILITIES_PATH}\Capabilities\MimeAssociations" "$R2" "$0" ; write file association in classes root WriteRegStr HKCR "$0\CLSID" "" "$R0" Pop $0 Pop $R0 Pop $R1 !verbose pop !macroend !define RegisterProtocol `!insertmacro RegisterProtocolCall` !define un.RegisterProtocol `!insertmacro RegisterProtocolCall` !macro RegisterProtocol !macroend !macro un.RegisterProtocol !macroend !macro RegisterProtocol_ !verbose push !verbose ${_Capabilities_VERBOSE} Exch $R3 ;protocol Exch Exch $R2 ;exe Exch 2 Exch $R1 ;icon Exch Exch 3 Exch $R0 ;desc Push $0 ; create an association name ; ex: http becomes ProgID.AssocProtocol.HTTP ${StrCase} $0 "$R3" "U" StrCpy $0 "${CAPABILITIES_PROGID}.AssocProtocol.$0" ; link capabilities to association in classes root WriteRegStr HKLM "${CAPABILITIES_PATH}\Capabilities\UrlAssociations" "$R3" "$0" ; write file association in classes root WriteRegStr HKCR "$0" "" "$R0" WriteRegStr HKCR "$0\DefaultIcon" "" "$R1" WriteRegStr HKCR "$0\shell\open" "" "&Open" WriteRegStr HKCR "$0\shell\open\command" "" '"$R2" "%1"' Pop $0 Pop $R0 Pop $R1 Pop $R2 Pop $R3 !verbose pop !macroend !define UnRegisterFileType `!insertmacro UnRegisterFileTypeCall` !define un.UnRegisterFileType `!insertmacro UnRegisterFileTypeCall` !macro UnRegisterFileType !macroend !macro un.UnRegisterFileType !macroend !macro UnRegisterFileType_ !define MacroID ${__LINE__} !verbose push !verbose ${_Capabilities_VERBOSE} Exch $R0 ;ext Push $0 ReadRegStr $0 HKLM "${CAPABILITIES_PATH}\Capabilities\FileAssociations" "$R0" StrCmp $0 "" skip_${MacroID} DeleteRegKey HKCR "$0" DeleteRegValue HKLM "${CAPABILITIES_PATH}\Capabilities\FileAssociations" "$R0" skip_${MacroID}: Pop $0 Pop $R0 !verbose pop !undef MacroID !macroend !define UnRegisterMimeType `!insertmacro UnRegisterMimeTypeCall` !define un.UnRegisterMimeType `!insertmacro UnRegisterMimeTypeCall` !macro UnRegisterMimeType !macroend !macro un.UnRegisterMimeType !macroend !macro UnRegisterMimeType_ !define MacroID ${__LINE__} !verbose push !verbose ${_Capabilities_VERBOSE} Exch $R0 ;mime Push $0 ReadRegStr $0 HKLM "${CAPABILITIES_PATH}\Capabilities\MimeAssociations" "$R0" StrCmp $0 "" skip_${MacroID} DeleteRegKey HKCR "$0" DeleteRegValue HKLM "${CAPABILITIES_PATH}\Capabilities\MimeAssociations" "$R0" skip_${MacroID}: Pop $0 Pop $R0 !verbose pop !undef MacroID !macroend !define UnRegisterProtocol `!insertmacro UnRegisterProtocolCall` !define un.UnRegisterProtocol `!insertmacro UnRegisterProtocolCall` !macro UnRegisterProtocol !macroend !macro un.UnRegisterProtocol !macroend !macro UnRegisterProtocol_ !define MacroID ${__LINE__} !verbose push !verbose ${_Capabilities_VERBOSE} Exch $R0 ;protocol Push $0 ReadRegStr $0 HKLM "${CAPABILITIES_PATH}\Capabilities\UrlAssociations" "$R0" StrCmp $0 "" skip_${MacroID} DeleteRegKey HKCR "$0" DeleteRegValue HKLM "${CAPABILITIES_PATH}\Capabilities\UrlAssociations" "$R0" skip_${MacroID}: Pop $0 Pop $R0 !verbose pop !undef MacroID !macroend !endifclementine-1.2.3+git1354-gdaddbde+dfsg/dist/windows/FileAssociation.nsh000066400000000000000000000107671260417502300256250ustar00rootroot00000000000000/* _____________________________________________________________________________ File Association _____________________________________________________________________________ Based on code taken from http://nsis.sourceforge.net/File_Association Usage in script: 1. !include "FileAssociation.nsh" 2. [Section|Function] ${FileAssociationFunction} "Param1" "Param2" "..." $var [SectionEnd|FunctionEnd] FileAssociationFunction=[RegisterExtension|UnRegisterExtension] _____________________________________________________________________________ ${RegisterExtension} "[executable]" "[extension]" "[description]" "[executable]" ; executable which opens the file format ; "[extension]" ; extension, which represents the file format to open ; "[description]" ; description for the extension. This will be display in Windows Explorer. ; ${UnRegisterExtension} "[extension]" "[description]" "[extension]" ; extension, which represents the file format to open ; "[description]" ; description for the extension. This will be display in Windows Explorer. ; _____________________________________________________________________________ Macros _____________________________________________________________________________ Change log window verbosity (default: 3=no script) Example: !include "FileAssociation.nsh" !insertmacro RegisterExtension ${FileAssociation_VERBOSE} 4 # all verbosity !insertmacro UnRegisterExtension ${FileAssociation_VERBOSE} 3 # no script */ !ifndef FileAssociation_INCLUDED !define FileAssociation_INCLUDED !include Util.nsh !verbose push !verbose 3 !ifndef _FileAssociation_VERBOSE !define _FileAssociation_VERBOSE 3 !endif !verbose ${_FileAssociation_VERBOSE} !define FileAssociation_VERBOSE `!insertmacro FileAssociation_VERBOSE` !verbose pop !macro FileAssociation_VERBOSE _VERBOSE !verbose push !verbose 3 !undef _FileAssociation_VERBOSE !define _FileAssociation_VERBOSE ${_VERBOSE} !verbose pop !macroend !macro RegisterExtensionCall _EXECUTABLE _EXTENSION _DESCRIPTION !verbose push !verbose ${_FileAssociation_VERBOSE} Push `${_DESCRIPTION}` Push `${_EXTENSION}` Push `${_EXECUTABLE}` ${CallArtificialFunction} RegisterExtension_ !verbose pop !macroend !macro UnRegisterExtensionCall _EXTENSION _DESCRIPTION !verbose push !verbose ${_FileAssociation_VERBOSE} Push `${_EXTENSION}` Push `${_DESCRIPTION}` ${CallArtificialFunction} UnRegisterExtension_ !verbose pop !macroend !define RegisterExtension `!insertmacro RegisterExtensionCall` !define un.RegisterExtension `!insertmacro RegisterExtensionCall` !macro RegisterExtension !macroend !macro un.RegisterExtension !macroend !macro RegisterExtension_ !verbose push !verbose ${_FileAssociation_VERBOSE} Exch $R2 ;exe Exch Exch $R1 ;ext Exch Exch 2 Exch $R0 ;desc Exch 2 Push $0 Push $1 ReadRegStr $1 HKCR $R1 "" ; read current file association StrCmp "$1" "" NoBackup ; is it empty StrCmp "$1" "$R0" NoBackup ; is it our own WriteRegStr HKCR $R1 "backup_val" "$1" ; backup current value NoBackup: WriteRegStr HKCR $R1 "" "$R0" ; set our file association ReadRegStr $0 HKCR $R0 "" StrCmp $0 "" 0 Skip WriteRegStr HKCR "$R0" "" "$R0" WriteRegStr HKCR "$R0\shell" "" "open" WriteRegStr HKCR "$R0\DefaultIcon" "" "$R2,0" Skip: WriteRegStr HKCR "$R0\shell\open\command" "" '"$R2" "%1"' WriteRegStr HKCR "$R0\shell\edit" "" "Edit $R0" WriteRegStr HKCR "$R0\shell\edit\command" "" '"$R2" "%1"' Pop $1 Pop $0 Pop $R2 Pop $R1 Pop $R0 !verbose pop !macroend !define UnRegisterExtension `!insertmacro UnRegisterExtensionCall` !define un.UnRegisterExtension `!insertmacro UnRegisterExtensionCall` !macro UnRegisterExtension !macroend !macro un.UnRegisterExtension !macroend !macro UnRegisterExtension_ !verbose push !verbose ${_FileAssociation_VERBOSE} Exch $R1 ;desc Exch Exch $R0 ;ext Exch Push $0 Push $1 ReadRegStr $1 HKCR $R0 "" StrCmp $1 $R1 0 NoOwn ; only do this if we own it ReadRegStr $1 HKCR $R0 "backup_val" StrCmp $1 "" 0 Restore ; if backup="" then delete the whole key DeleteRegKey HKCR $R0 Goto NoOwn Restore: WriteRegStr HKCR $R0 "" $1 DeleteRegValue HKCR $R0 "backup_val" DeleteRegKey HKCR $R1 ;Delete key with association name settings NoOwn: Pop $1 Pop $0 Pop $R1 Pop $R0 !verbose pop !macroend !endif # !FileAssociation_INCLUDED clementine-1.2.3+git1354-gdaddbde+dfsg/dist/windows/clementine.ico000066400000000000000000001347011260417502300246510ustar00rootroot0000000000000000v h a.00 %    hY(0`EHKMPRUXY]_adcfilcdimkmqquxruz}z}J[1qQq/Pp  =1[Qyq/"P0p=LYgx1Qq&/@PZpt1Qq/&PAp[tϩ1Qq/P"p0>M[iy1Qqұ/Pp  >1\Qzq/Pp!+6@IZ1pQq/ P6pLbx1Qq,/KPip1Qq/-P?pRcv1Qqϑܱ/Pp!&,>X1qQq8, .4:! !  &08=BCCBBACCCB>:4,6,&4>CAA>>=<;9:9;<<=>@ACBF.>A@==8*  )/;AE.AA>9)     *D!=A=7     ?0B>:"      6A=*      .8A<       5A<        !.A<        %C=        +%>>/      +0A9      2A=    "0A4 ##" A= "$'#$$$" '2)B8  """'''"$'$##5:@" $$$*)$)*''$#$=C<  "')*-*+*)'3-A3 "$'')+///-->;:>$ "$')*//11D.A=  $)/1E&%A: "'*-.@1 "$$')*A4@' $(5;>"$(A=  ""C=   3!C= ,C=  B=   ;C=   A=  ;@ 5@# --A1 $C= "B#*D ??( @FIKMPRUXY]_adfildhmmqquxrtz}/Pp",6@J[1qQq/Pp  =1[Qyq/"P0p=LYgx1Qq&/@PZpt1Qq/&PAp[tϩ1Qq/P"p0>M[iy1Qqұ/Pp  >1\Qzq/Pp!+6@IZ1pQq/ P6pLbx1Qq,/KPip1Qq/-P?pRcv1Qqϑܱ/Pp!&,>X1qQq8*!2..&.8<>>==>>=94?&9><6)$ (3<@";<-?6=.  >:9    ":6    87     !,<    +=$   227  (="   3*<  ' %% $9,  '+))'6.> $'+-/>!&<  )<05 $'59) (< >  1> 0> >  1:%41 =  - ??( GHKNPRUXZ\adgjlcdjonqquzw~}/!P7pLcyϏ1Qq/Pp",6@J[1qQq/Pp  =1[Qyq/"P0p=LYgx1Qq&/@PZpt1Qq/&PAp[tϩ1Qq/P"p0>M[iy1Qqұ/Pp  >1\Qzq/Pp!+6@IZ1pQq/ P6pLbx1Qq,/KPip1Qq/-P?pRcv1Qqϑܱ/Pp!&,>X1qQq%"'*'&&(*.+-'  (  (  ,# !! % !&-+ $( ' )"') ?PNG  IHDR\rfaIDATx}dE&arda!0$$*(A07Fvuװ~gvuWE]L(AT\ Y'nߪ{ԩ{ootu%@b;P@CA bP(FA bP(FA bP(FA bP(FA bP(FA bP(ƈ'چϐO?x**Au *'Zu߯Jnk\I.Î-[6/S㼕~QmP s)P`$cD@fy'lnfs|yއ?+"xnϻ@a# ^ێ_T+  yS{"o׹(0R0,P{ƿmz2N>'~=ݸTCSq  R2Cnvn=A&V{-C%%8[O:(0R0dP{Bq5G jj=E}L(0=rz6ӍH?je~_Y@׌ 4tJ?[9zC7x ܪ^H8xC|IrS߅m'x_Vv L?+i@^:9$``ȉ@NP$pP@FWsլQ /޾O _j{"? JNk/:>_ COb)&!'m 8E/ r%@l_?`f7(z*U%خP$á $PJ ¿vgzwD?SH>=>%H!>p@|t47@N< ~V}엳WX"~GN7 Tp 'SdH% P#D`Kg()"چ2EB m~}8ɻ뚙Ս[{!LΔr xBQUu=.ݯrESPH-8v!--OEo0gIXݐd q|6$>VzOn]+P '4$} ~Kf#0vg @W}jEn< qGd@${QM#8;ιXFCPg ЉKafW=L~d`p%%ѼiH qd`<bj略w 62W풿$ke h1?˚3Q|O؎C͈ Ir\*"(2 @U?|f J+@Dl &vѐwL"V୥wn:AӺ-^b!w6{_~ЍDE>{H$NthT"QO;p; *Qzǥw.(&P=T 5laZ xt37uñU6:eq3hRb;`T!K1Ur`헽Ѕ{X@@#@Zo+$cfS gmZE ܌8MT&iJN1S, J*)y޼:KM :ĴEv oھa1|8X xMr$9 ʮ@ JTzGmJ@ߣj`+&1iL` y%(F8'R )(ROjпR@ ,IV@.` ctI\ @u͔lF*015hAMXB@O Xb2HŕHqE69m_ێ:S@@CIn<>(_%~7)4J~fM'tI.Hi AbTl\t;St޵Z@ `u咦VXz;.h oٙEyHI'q~aOD (+T !Y%nJO..F#@w4 8VVm?kg^= \}ddI p8@Al %ro#XJ8G>\@Uj%7'OT5pXo sHⓀW؃gJi b0YҗB<)@aD !(+ QnhzP0WPo^~W`CF‰ SmֹP-P*&-{"ʅ3 ڕ-Fwn1A-/mX&qԻ|nsD$Xȍ?yJΩoY_0%o`~jGrqlBM0` dHBT~:1:ԟxa 0' b>[LXާɭ W r:Q(C eHu FnDˉs |0:ĬeOur`՗i0D:8TӲY6vz~F%("A>DǃA 98:Ge taFep bp D[{"-^yhtCƪO-;J԰HAI0@\ǭz݅^BK_{Z5BpUOgz, lp5@z=[ АLZ/QPE5q lkP2P pP`Wm4 ϐlwj==n=?' H*S>\#Յk@.^Ē!,XկbwY0}3!7;eInkX)%F b "\^%cxxgK/^w9>F1D"H[{X bKPxTK|y_a`ΙANۈ$oK%zl@,R}5˝bc6K^5WFkNnbaJ,@PIP2C7Bx@ 0L)ŗG/)P@Ձދ[{toJ7d8W-)a\SEّ8U^ n- b# SMJ|+^zN/u P/.u@M@x!Oo-"iqN}{%C~ p~s=)XҏZ.}aђu7vpz=zeBeubp*TܴEAGb8ID^b@m0d a^M9:5F@ue 蕁Lt7o.LhKQr=b|[vm1FA-7$lsȈo~t(0j @ٳB˃3+i_9)A4䍳h$/n|۷,@0hW0JBI"<#zAI&IS ǣMJ[X~!w3v)yu/G؆geC F9.ITbsl68kEk);CN3v ZN7iNtKzCF0oQkL$Ré.De^ dl[g]);AT 4M/m0o? ń^p2zG4 F=lH  ~mP|/>/Bb^% ZOwT5iP8YR xUt2Ff o1363":ϛ܅V⊔SLJR|X|ھF 4QZn 3@~=W+ul`B 7T 3 ?(X'P;SoQ=؊hiGL򸻢/^'b H @v 勩|ؾ 5(yY"_KE'oSx!30 +H_kB TL0&Krf{F 4ܧ^tn ϯBEA !ysG҂a,H<{gF0[*cg$J n$)! `G9hUYn^ح *}W{;nh_)"n UA^]wf@\n,Wtjlk96G c2}b6Ӽ3vk6uz >^>qC4ؤ~Q ? ddKjZE"!3 &6mHgyM4igڂ_}b j}SG;ni kq#xՂItDy7 좈o}Kc.-Ă3z27H&ei@$ ~*1"|<B/bo -$u`,!'D{9`|v=uREED<,Sɧ6F":Nf (4܁#OI9n٥Cgr(0P' gQŎNhpUL !d؜ZcA3ds?>َV`)27:QrsJN9g}h x~\ג}!04 8q9H߱DA z\)->[:起vwNB* KEm6j„8)ē(L\y B{gpH#oI(\I*K:%j^!hUh[~]1^C2U|ID C3kG9go?k#5FkaI3/.s|Qux&]󹵼% f,#_(2a҃&yzi5t !\\=VwAo"PPbjP )83bڼ b `Õޟ !ͭk@?^Q ?6hA4jˈ/-=5E̠]"n<޹Cg(rn-=wJ!ۦ6@_ ?嘉&L=7l#. ~^=n`fX Rt@xVm4[ikfxGh^tI8EG0X9#XH5DP odz<,W՞S|EF/}Sn݂/'@LEu$QOo/!fvqVJepBG+>[XE9oD xd$\z(bt:kQ$pbqGZxLPn@utX#zfÉ9!٧G/3nDT<=11aCˀU2 CuAznN0F| 8IF6Foz DPJ3{J5X󪟋E"T_;#V_:C(Eq=+6G3v߰Yx 7)d' g-!}/  ZO/r@pwH1c-?bqW` 0""jfŪLONVׯH|Jjq I$qI4W'7Doc eM?+>{lv)vs8TgAN2"*GtS:@,u?s(xz!!^;6'ʇfS];"4l8 ~O#T xk"C $ >/aTxWP%> ~?k{< х5WR6ثe_3~G9B;@"|:i*|zS\sI}2sكA+lntH >x'`grHMKfĀ#%j)BFXs5 #`$%iu瓰`߯Fg}Qy>ӻ8^kh1  nP$Ń&Pxg/>=3fMMK>~h$K!{fHl/^.nZ̮,`"jKLqqBÆK&qKb+-Qo4 @`L_ bQ|/\+Hf9.s嵭B54Y'l|قp.cCףTF69>͠4žx;#!c"5Zrdql5 K$>WMb/gbj 5:$چI2?bTbBŤt21q@x2:PQ=3#9upM4zy%tL38d-T.$ӯ( o_E$+ R}o-ÎF|ga>D}AڇsG8D֗Ձ_d[cZ R'Q̐^D^`fq鈭" It`~’H B %=! `^ۑ1 {7l/ִH&1aڥ0oľ_-M6$@G~1A*?3 |3ȑa*50 ~!5Dapt'sjpyLOτh"ݗ௢ڋ.N:2v.}5D'cR!FEϳKDw%&P*IL[bo#޶[{H}:&j !c`(2P/rda.`N "%͌+у/qHJOs ,.6`R>~3 0PH`INHԞ4aK-S2ZUza>˘tc<W|QLo\rd#Rnd{c|+򃲾zӄ7?M݌f`@ ݎ4 ~b 1PoKxpϗu!]< JCeHKĦP#1c_!HF5e~E1u0aʧݭ܈*}_R?zgW)c'_ LfzACbHnzPP0vhI#˾%,#@#jҩ$ ñs\gݘg@UD<a a@Χ nqR3s*rSdt泚0!TNRQW>w5۳\z%u[>(^ph P4d d|GPW=H!3HAß~Bd+j5D P/I]&j5 ɵ5~${@j4`÷=qBzX}#^_~$! n-Gh5##mY@>0]N>PoL8`;DHGdn[A 5x63vPU!t]h̀k-q:F@@(/6Z8ON1_4JMH]^DVѵG!'~7!@CШ}M]҃=1s=d ~c3a!111e?j!N’M !4'jsX.W6D1H#V},YwTBNLkL 2U=t鿖dfdZbD)Pjͤ嵎@s"](MX[w6p$rmx&? =@c?cea(j-'$?I/=WG@z Pע 0Ö7Ƚȓ-(D% R)(\ X8h ^Kg|]/99 `oVv4amdK48<vO;#r`Hj RZBFчz1fBSH"tVXr=j?>3=@T@sAٞU |'j\k(l8J-ߔ4m"R#Rs{<U"`""EXMՀ :ܣҥBD;2v:DԀש__ҕ^KcB.A]2ՍE"6yY?#6pu|ɇ֋sL>iq vP-%/o݀`fR*8Hvg$5;qg̫7*8N.%E^ʊmJ]?Q5 [:jbE ̒Gd3-;fgzHe#<'Nl`Fw~; ^g, "# =)0)J IXg!dIݕ/` ]@ͭ_ -_λjDD6MՁ/wu'=K0%՝J ֍hF `fzL`gA3Aˎ\Y?mZӯr:{>$>f* 7`zAˣ!uW"\AE5Hv3R5" ڨgH#"56m8%D)ޟ kyV EBh,)[ny7Y ZXOzMƈI]QN zp%U4~D:qTgS^fn~5x'&\gCX1+.a7(`Ʉׇ/^ :0R`ՙO[QޫyW %Шޭv[ޕY =!$$)z>y*>b>ֹE e`L  b5^6Q~&!Iʹe18>T30R 2^Do|+*-@ejuGK^,)njxn%o'vp#1I"=uǍb?qd?3 @'56h 4ǀӝ9ėUkkLHH[?Hs=.LjD,TS?7;eX O~Zi2S%sd Bq <}_zZӱ=X+Ȇr{!ݖن 'JpZeɀ)Vw2 5s .qX{"b[j< ľxjj@(oҦ ^ .ui)ƍ]aZ&@Vmgߦ 7s* [ ;!7`7`;33?1a69H1?v]g KDen@;Ae!.%XEc<.F,b;0Hql 8PX `kT=NcvNtޕ]uEJ x{Q1R@lT"(ȿ? xr-f8섿Ǻ?7sXǝNAˎSvЃXx `vFqXp Zqt0j=.U=0׶fsg 3>^qC:3pRMs.A|7-8xLkAߟ.@\fK=f ^>}hy IE0X8I44l٢txtHrpf&"`9.x8ȹsd@GliH8F8mеԨTr#ٴ[Jn|1Š-ШW~(Y@ c8?$c:\7]LdP { E9V{ZcߣH|>qsaQ+Yf܀880>c'Hd9gO.A/ p#fY!V}\׊clCxX5{68M-^ r **xqdx0 G@ 7@G88z)S8yd~vVc܀ z cAl4֬ ddȄ ~,P' "b Z3(>Unv֐Զ@eĩyt$կe f!̀ݴz/z [ѥ D 5t\Kei@K $D `$`35z9old.gr Pc;")Ҹf#$VQJM}] Uṣx(Y9ꬡ :wzi9 V<Ё*IBH/&bʈ;I2e戆YZб`ݻ Nz.\D%MG0},јɜBq"6ND~ҹ_huߎ 6;Ex∐.b_Ilqo' bW 7ȹ! eFGb? 4Xݖ"Vfqr<[­1jXwGFNH#AA\iNR(U!ǝ%,(OQ-'-:&@&G.Kx![7"0ÂFfy޴A܍4ّ%`ڨ(:V1VM?KH"! %D&cE_m͒ ueb{lm?2,VQHgݡNfRt\>9@$]3`_ A*-(Q\vd|I QKA-+Na1:7jh o+8*: "Օj`Dv/ :LP.b X P|% D {P Q:>zO"]p]gc N= _=!^?h$8{@}ˏHx)ž=]'`=8iHf4/HzWYtizhj0+)M8*6eHwT W!BL&7_E|yt4a6τŊc@L]ocs=Txf/z`< 7␫`~ #pY4 qemcIXO2Il3OZk8F P$*`輍QnP_?F L<ǂX}R4"C~3C$0yhM1Nm)";KXٿ,AAjGyh"Y^v:k\`C)ɹq@aLX0^ƞxEUp2>Ѹa;7@2>gs?thgt ꯟ *LMبgH'-t$3} Yډd\lq^' H8X 64^~31Xm-qT 0Ud0G+IQ._@P^: i;NwL<;Ă5w CR p, ܙ5q!`tj Z\ fk%XM%ped+S? .4t&ḁAp9+x53/7(=R5@[`E*[TDϽ"WPR?F?YPG8S_gZmx1 $7&'gb C*KBYxVa~O'|rqt*QUL1M.3ۂ) x*F(i)]G甐Z–IXSVZ7&'j~P-~|ƏxxNVL,8hנ-,e?nߋglXXc] \}_\b\ndc7輸,3c/{N ْ:QAX/p)@pZ.|Nw!ؙTD>9U*dyvM>tϮrt0>hǔy V420]U4dawҌBH?[>(0tFr|ې=/F5-r$>o9flpg\Œ}L.Gc"$j2"o"yB]HxDXY>gCOE.P0A5}z;?k'.YNÅ.Vj'!~kOg~Gf,'F9:)A"N-u<x }@>C%~tJ:8Ý`ȅկ S|d΃#+)9hj܄?H*-պLOG"OTz >ؾNM>fr:#RQ` ]ٙɨH09i]hVq2^pLNz%*( "tvDqR)-zj?f=p>;ĀZ`e(3zO➎ !U&/ʗ<"5=&D 3x\5,H%wbƳ+v9u D8 ʭu+o=R*̾<)JL^2Nr]Nvnu=&XݽY{)9Kn|=jqWt@ d#Lu~oavBx!}0q7 eY8?(!0&ƎQIxR!a0Q4 i`7 w!輟=UШ ]ni VXy܃ r¢&x' oذbRN|D39.X(m )9tjuH#CD$b{:KID yI#c*xƬ` 1r@Rʏϻ⟻NՋV2 @g b~{YvY#E.V t ή "!CxŒ6+`6U1 v2@]4(H7C25<@$!Ձs ^b!uP` ly+7"1 5 qƢ@6{P)ՅshFTs1FkH ӲKJmu"\6QRv|~8.,o=s#c0-ExvL놄{ˑHCq< ւaށ;DDtg~l yEn&vڤK8^U_B&3 3Y>bupA"BAc'Z+.Cxv"9yfI@KD}7VCC&WsP~7TssVXt4W۞w3|U`?3E@  *ʩa 饪[m0U;3zm ɫu f̊hF m!dD1y_R5<ŒA+}VȰFeG68|#w>' ~ǻp_8p%Ji<n7lptQPX0(B,bCୱheܤtdn5 2h*S9yh{*}coUoqPG^v${ft:n6gj}9TǕu&8m2hg;ƐfM` 47^uAH!a;#ǓH ʤc4Hg4`xDT\?>$b0Be{.,:mQ7H@݄Xx7;( 0:3Ʊ〟,|~ci0`up_sw W9W[ٝ#1Λt{D-jdaD l M}qJPxrt.lrШ:s%Ŧ`PCjDE#_ '}?Y4WX0j@7s`JvjNL J'&5PD6%D=b)$L5m = {="bj"lWROW9d,;f=s5># pBãl_#U 8b\ ߐWn@@ #w Ӿyym/w$ TYJ ^ғ^G@@U $G4S7<,uF&֒@ՅEtq]]ʲ@F@?&P YB btpff''$%و5*^5ؕe *۸B5Fa=5T]Ɋ z68IDZ,.6Ш :pu@_TA8ci7kI@f_\z%>hcP4sgzLqAQs15B@ y.T,vlt ". H)HWpQW:zq&*'5rJՁۇ,9Ĭ苾sGˆ+ HBn:"z\#SƸEͱf"  @%!6N!8K BՔ2Ss%carrq`Xaf2RC;TzyULtX'XH]]H N2$0ѯ* ,qgo 7Kq.p9dBpyVrspNͥ qYcp%v=bCZd bSл^`x!lD@Յm>b`C\Ȳ; );+.Q#q*o|DЀk̋g5f-b/L{ѹUPq6Ep6#h[^rpJ#y襥W#4*pz9d!RC !nѝW~'C7褣vIH ZX #v(h Z\|Qѝ-U&P=K;~+Yud4e WzATKGdOXz{4y2d@A>7# [ܷkUb eh[tʣ)NzNzFp C!NSh 7,<@ljϣglML1w ZߵP}:oPsފ4g$O=">qwNLA{y@rA#d4/2yl^;F6s.;FTH&X]PD е,?az1cߏh_i]Ձ>rp#gLA?mh"xB :1n: V ZZ= fHˌA=9j_߻qsWZISӟelyׄ"3i6 m\Č_ G͸skk`ÏU1:Q5xEHSQ=o̽oLPt |׊ #[FmCJ+Eݗ1uAZQ bĺ^iVlZk M AK ?,+a%45CʐD2H!ri@+4nJɳĵXɡgܵ0eq-*5ڨNkU !"%)2Ǩt]uжKqFVH$5Ќ :c'ALռAc",f{㯅z/jk'=߽P*A\NK˘0`zf݇XInAU7Î-e={N ж1T%ij\c'h[<Wjۇr*f~1eqbr'Y.9>rXb]U~m/΄ 1Alؾ9%Zb41P[!8ZnB] z끬=cAhܘF]աa'DSw4arC/A"w}-NBg4: Ү I(ShuCt-gR:/u8[wffzq3|0}S]٭ @CjBz]|;cO3 yjTb(/l0YU)cs^]uD.!h"c4궂NTR!®Ss[L]1kEyC4O2UY dХ[jo W톭` gTAe`B?pp%WhV&I:rx!{ئz SJׇ]4ۢޫ~R봽pNgoȗ0ۆ &c<Q aDtW/@5}E]Ww_ QLTj UBK|cם$%maԍ@nzޝY>!GzTzOSsːb$rmfH!; +ԅ^A 9](rqoYHՂT|Ǭόq’tMtҕ^ROA_!^%QtJ錯2T]+AT_[-(7^F bH9m(Τ`;^hBV:󂎣ZApg:зLbUˈOְ9?kՍjC!,$|Y 73kd_˗zîJZ#iݗ sJg]FA@I|zFQMJ` ⬯0ɂr@i5!ޭ$w?F.RC}3/xf;BQ@-դR ǣ?I(=wݑ 58[]7 ?OK)?TB GՑGA]5GB7M]H/0B{KĆYvBk(`QX#@,%\KM>;Ԡ&ҙi;* &ȋ{+B8UݧM~Fej}tTzg R : C :?|3:!  P7tJo2Ã$(b^2:Y= ؅HA}xyRB>OjVaq~TC9 ]‚/R$c44;.!~Iq(`7DewYWoW"a+t"G !ŭY./0jՐ%!gG`v}U!uN7)IN&=j-5Q{U3{(@h)T3 i12]Wˡ^z(ԏGTu\J|CJt6b 9U$#%T"N8Tz!6ڢ&ܦo$T~rk錑9; F1 (P` F1 (P` F1 (P` F1 (P` F1 (P` F1 (P` F1 (P`3;z!IENDB`(0` ccc/d7cDcAc7c.cccc$cVccccccccccccccdcuc4cecAccccccccccccccccccccccccccdcccccccccccccemsw{zwskdccdcncdcSdccccccccfsdccccccccgcBccccccck}pmVKJT[KL[omycOcccccchlXYHFPYHEGWTFENZIKYJHccJcccccdwMFFNZIGUUFFPZLFFPXHPZIEHYbd1cccccf]JGHIQ^NL]UILZRFFHWSKZSGFLZKLncccccchQJ[SKLMSbTQaVMW]KGHUYKSXHFFSXGEKaccccch{GGJY_RPRUe\VeYR`[MLWYLIYOFGQ[PFEEcPcccceuZOKMTd_UVXfdZi]YgZPTaQGNZIFQ[QGEEEcccccdnHV_[ZU_j_Z[gk_mcajYT]bOKWUGMZOFEEEERc`cccc|FHMXahd]ima_hqdoiil[Zf^PQ^OIXTGEEEEDcccckMIKNRV_midqpfjviroqk^al\SX`MPYJFEEFFc9cccd`[[XVWX[erjjwqmymtvwkbil[W`_O[RFEEE]ccccrpIOXafiheepwnu{r}qx{{mgrj^_h]X_LEEE!d dcccHGKOT[bkruty|zyv~~nnwkkng[bZKEFDcQccci{VUTWZ[]afoz}zry|wsidgh\PtccccQS\adilgcfjq}|}vs|CccccdFHMRV\fqqmmpv}|$c"cccuYJU[^\[_grz|||ȇ` cVdddVZ[Y`hklmqw~5ddddRQLMRYaipuzcddl]FFHMQVZ_dhmrx} cddHFGJOV]dimquy{zcddSTVY_dgilt{dddUTQSUUW\jtuvy}سdddrFFFGKPVflfhnw5dddfOQTTW]dg`dqx~{ucdhiZWTTVWYW_mmtwqcdldKGFFGJOVgfgripcdnUFFFGLT\cc\kgaPc{clRFFFP[YWUS]h]}c5cf`MLR[SHGJRc^_ְ cccrYZYOGFGL[_SZ3c|csHJIILPVZXOMdccGLSYZYTNHGIcJT[WPJHFFFFfdNGFEEFFFYFEEEEFF(REEEEUFq)EYE>E???( @ ccd'd-c$ccd cOcccddddddccccPdc/dcdddddddiorrngdcccddcdddddr cMddddgzlmrm} c\cdddpVTFUKFTNFSMQOKtdLdddmfFGNXK[JMVGGWLYKFVMc$cddqmH[NNR`R`O\PHTSQQFKWFHdcddmgKLZ^TVfZfWcQVXHWILXLFFcVddfXP^_Yg`\jclbfVaTOWIXKFFEncddiIMT_kdpfmlrmg^hTZSRQFFFCc7ddsX\[\\hpnvrrwwiigYcTZGEE\dddLJR]goqwx~zy}}msijd^WGEccdmWY]__ep}v~xnil]$c6ddRKU\gokmu|〳|ctddMY_`aiv}QcdryUPS`jrx)cdQFIPX_fmt|cdOQV_flu}ܸddPNPSXhpry/ddLOQXceft~lcgUPPSU^kqrzcjwFFGOYdakhchuFHVURRb^GcOdWXQFGT]ZbcHJNSXUMPcPRXSMHFFm`HFFFFJFFFFH6F??(  c dcc ciccdejjecUcTcdcicwWOQOHQQW|c:c}SXR][XRQKRFcqO\ddjk`\UQGEc4d]Zdpvvzle^PEXcqT`gtwnj] cƐlWcrCcNTbq~:dNSbo~dfLN\jteOQP^ㇷcNOPOL8m]FFBZFAAAAAAAAAAAAAAAAclementine-1.2.3+git1354-gdaddbde+dfsg/dist/windows/clementine.nsi.in000066400000000000000000004244751260417502300253070ustar00rootroot00000000000000@NORMAL@!define PRODUCT_NAME "Clementine" @PORTABLE@!define PRODUCT_NAME "Clementine-Portable" !define PRODUCT_PUBLISHER "Clementine" !define PRODUCT_VERSION_MAJOR @CLEMENTINE_VERSION_MAJOR@ !define PRODUCT_VERSION_MINOR @CLEMENTINE_VERSION_MINOR@ !define PRODUCT_DISPLAY_VERSION "@CLEMENTINE_VERSION_DISPLAY@" !define PRODUCT_DISPLAY_VERSION_SHORT "@CLEMENTINE_VERSION_DISPLAY@" !define PRODUCT_WEB_SITE "http://www.clementine-player.org/" !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" !define PRODUCT_UNINST_ROOT_KEY "HKLM" @NORMAL@!define PRODUCT_INSTALL_DIR "$PROGRAMFILES\Clementine" @PORTABLE@!define PRODUCT_INSTALL_DIR "C:\Clementine" ; Set Application Capabilities info !define CAPABILITIES_NAME "Clementine" !define CAPABILITIES_LOCAL_NAME "Clementine" !define CAPABILITIES_PROGID "Clementine music player" !define CAPABILITIES_PATH "Software\Clients\Media\Clementine" !define CAPABILITIES_DESCRIPTION "Clementine music player" !define CAPABILITIES_ICON "$INSTDIR\clementine.ico" !define CAPABILITIES_REINSTALL "Command to reinstall" !define CAPABILITIES_HIDE_ICONS "Command to hide icons" !define CAPABILITIES_SHOW_ICONS "Command to show icons" SetCompressor /SOLID lzma !addplugindir nsisplugins !include "MUI2.nsh" !include "FileAssociation.nsh" !include "Capabilities.nsh" !define MUI_ICON "clementine.ico" !define MUI_COMPONENTSPAGE_SMALLDESC !define MUI_FINISHPAGE_RUN !define MUI_FINISHPAGE_RUN_TEXT "Run Clementine" !define MUI_FINISHPAGE_RUN_FUNCTION "RunClementine" ; Installer pages !insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH ; Uninstaller pages !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES !insertmacro MUI_UNPAGE_FINISH !insertmacro MUI_LANGUAGE "English" ;first language is the default language !insertmacro MUI_LANGUAGE "French" !insertmacro MUI_LANGUAGE "German" !insertmacro MUI_LANGUAGE "Spanish" !insertmacro MUI_LANGUAGE "SpanishInternational" !insertmacro MUI_LANGUAGE "SimpChinese" !insertmacro MUI_LANGUAGE "TradChinese" !insertmacro MUI_LANGUAGE "Japanese" !insertmacro MUI_LANGUAGE "Korean" !insertmacro MUI_LANGUAGE "Italian" !insertmacro MUI_LANGUAGE "Dutch" !insertmacro MUI_LANGUAGE "Danish" !insertmacro MUI_LANGUAGE "Swedish" !insertmacro MUI_LANGUAGE "Norwegian" !insertmacro MUI_LANGUAGE "NorwegianNynorsk" !insertmacro MUI_LANGUAGE "Finnish" !insertmacro MUI_LANGUAGE "Greek" !insertmacro MUI_LANGUAGE "Russian" !insertmacro MUI_LANGUAGE "Portuguese" !insertmacro MUI_LANGUAGE "PortugueseBR" !insertmacro MUI_LANGUAGE "Polish" !insertmacro MUI_LANGUAGE "Ukrainian" !insertmacro MUI_LANGUAGE "Czech" !insertmacro MUI_LANGUAGE "Slovak" !insertmacro MUI_LANGUAGE "Croatian" !insertmacro MUI_LANGUAGE "Bulgarian" !insertmacro MUI_LANGUAGE "Hungarian" !insertmacro MUI_LANGUAGE "Thai" !insertmacro MUI_LANGUAGE "Romanian" !insertmacro MUI_LANGUAGE "Latvian" !insertmacro MUI_LANGUAGE "Macedonian" !insertmacro MUI_LANGUAGE "Estonian" !insertmacro MUI_LANGUAGE "Turkish" !insertmacro MUI_LANGUAGE "Lithuanian" !insertmacro MUI_LANGUAGE "Slovenian" !insertmacro MUI_LANGUAGE "Serbian" !insertmacro MUI_LANGUAGE "SerbianLatin" !insertmacro MUI_LANGUAGE "Arabic" !insertmacro MUI_LANGUAGE "Farsi" !insertmacro MUI_LANGUAGE "Hebrew" !insertmacro MUI_LANGUAGE "Indonesian" !insertmacro MUI_LANGUAGE "Mongolian" !insertmacro MUI_LANGUAGE "Luxembourgish" !insertmacro MUI_LANGUAGE "Albanian" !insertmacro MUI_LANGUAGE "Breton" !insertmacro MUI_LANGUAGE "Belarusian" !insertmacro MUI_LANGUAGE "Icelandic" !insertmacro MUI_LANGUAGE "Malay" !insertmacro MUI_LANGUAGE "Bosnian" !insertmacro MUI_LANGUAGE "Kurdish" !insertmacro MUI_LANGUAGE "Irish" !insertmacro MUI_LANGUAGE "Uzbek" !insertmacro MUI_LANGUAGE "Galician" !insertmacro MUI_LANGUAGE "Afrikaans" !insertmacro MUI_LANGUAGE "Catalan" !insertmacro MUI_LANGUAGE "Esperanto" Name "${PRODUCT_NAME}" OutFile "${PRODUCT_NAME}Setup-@CLEMENTINE_VERSION_SPARKLE@.exe" InstallDir "${PRODUCT_INSTALL_DIR}" ; Get the path where Clementine was installed previously and set it as default path InstallDirRegKey ${PRODUCT_UNINST_ROOT_KEY} ${PRODUCT_UNINST_KEY} "UninstallString" ShowInstDetails show ShowUnInstDetails show @NORMAL@RequestExecutionLevel admin @PORTABLE@RequestExecutionLevel user ; Check for previous installation, and call the uninstaller if any Function CheckPreviousInstall ReadRegStr $R0 ${PRODUCT_UNINST_ROOT_KEY} ${PRODUCT_UNINST_KEY} "UninstallString" StrCmp $R0 "" done MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION \ "${PRODUCT_NAME} is already installed. $\n$\nClick `OK` to remove the \ previous version or `Cancel` to cancel this upgrade." \ IDOK uninst Abort ; Run the uninstaller uninst: ClearErrors ExecWait '$R0' ; Do not copy the uninstaller to a temp file done: FunctionEnd Function .onInit !insertmacro MUI_LANGDLL_DISPLAY Call CheckPreviousInstall FunctionEnd Function RunClementine ShellExecAsUser::ShellExecAsUser "" "$INSTDIR/clementine.exe" "" FunctionEnd Section "Delete old files" oldfiles ; Delete files from older versions ; 0.3 Delete "$INSTDIR\lastfm.lib" Delete "$INSTDIR\gstreamer-plugins\libgstdecodebin.dll" Delete "$INSTDIR\gstreamer-plugins\libgstdirectsound.dll" Delete "$INSTDIR\gstreamer-plugins\libgstwaveform.dll" ; 0.4 Delete "$INSTDIR\avcodec-gpl-52.dll" Delete "$INSTDIR\avformat-gpl-52.dll" Delete "$INSTDIR\avutil-gpl-50.dll" Delete "$INSTDIR\iconv.dll" Delete "$INSTDIR\libbz2.dll" Delete "$INSTDIR\libdl.dll" Delete "$INSTDIR\libfaac-0.dll" Delete "$INSTDIR\libfaad-2.dll" Delete "$INSTDIR\libFLAC-8.dll" Delete "$INSTDIR\libgcc_s_sjlj-1.dll" Delete "$INSTDIR\libgstaudio-0.10.dll" Delete "$INSTDIR\libgstbase-0.10.dll" Delete "$INSTDIR\libgstcontroller-0.10.dll" Delete "$INSTDIR\libgstdshow-0.10.dll" Delete "$INSTDIR\libgstinterfaces-0.10.dll" Delete "$INSTDIR\libgstnet-0.10.dll" Delete "$INSTDIR\libgstnetbuffer-0.10.dll" Delete "$INSTDIR\libgstpbutils-0.10.dll" Delete "$INSTDIR\libgstreamer-0.10.dll" Delete "$INSTDIR\libgstriff-0.10.dll" Delete "$INSTDIR\libgstrtp-0.10.dll" Delete "$INSTDIR\libgstrtsp-0.10.dll" Delete "$INSTDIR\libgstsdp-0.10.dll" Delete "$INSTDIR\libgsttag-0.10.dll" Delete "$INSTDIR\libxml2.dll" Delete "$INSTDIR\z.dll" Delete "$INSTDIR\gstreamer-plugins\libgstasfdemux.dll" Delete "$INSTDIR\gstreamer-plugins\libgstffmpeg-gpl.dll" Delete "$INSTDIR\gstreamer-plugins\libgstqueue2.dll" Delete "$INSTDIR\gstreamer-plugins\libgstsoup.dll" ; 1.0 prerelease Delete "$INSTDIR\spotify.dll" ; 1.0 Delete "$INSTDIR\libofa.dll" Delete "$INSTDIR\gstreamer-plugins\libgstofa.dll" ; 1.1 Delete "$INSTDIR\libprotobuf-lite-7.dll" ; 1.2 Delete "$INSTDIR\libprotobuf-7.dll" ; mingw-w64 Delete "$INSTDIR\avcodec-52.dll" Delete "$INSTDIR\avformat-52.dll" Delete "$INSTDIR\avutil-50.dll" Delete "$INSTDIR\libcdio-12.dll" Delete "$INSTDIR\libgcc_s_dw2-1.dll" ; libimobiledevice removal Delete "$INSTDIR\libimobiledevice-1.dll" Delete "$INSTDIR\libplist.dll" Delete "$INSTDIR\libusbmuxd.dll" ; Dependencies bump Delete "$INSTDIR\intl.dll" Delete "$INSTDIR\libexpat-1.dll" Delete "$INSTDIR\libgcrypt-11.dll" Delete "$INSTDIR\libgdk_pixbuf-2.0.0.dll" Delete "$INSTDIR\libgnutls-26.dll" Delete "$INSTDIR\libpng14-14.dll" Delete "$INSTDIR\libtasn1-3.dll" ; 1.2.3 Move to gstreamer-1.0 Delete "$INSTDIR\avcodec-53.dll" Delete "$INSTDIR\avformat-53.dll" Delete "$INSTDIR\avutil-51.dll" Delete "$INSTDIR\libcdio-14.dll" Delete "$INSTDIR\libgstapp-0.10-0.dll" Delete "$INSTDIR\libgstaudio-0.10-0.dll" Delete "$INSTDIR\libgstbase-0.10-0.dll" Delete "$INSTDIR\libgstcdda-0.10-0.dll" Delete "$INSTDIR\libgstcontroller-0.10-0.dll" Delete "$INSTDIR\libgstdataprotocol-0.10-0.dll" Delete "$INSTDIR\libgstfft-0.10-0.dll" Delete "$INSTDIR\libgstinterfaces-0.10-0.dll" Delete "$INSTDIR\libgstnet-0.10-0.dll" Delete "$INSTDIR\libgstnetbuffer-0.10-0.dll" Delete "$INSTDIR\libgstpbutils-0.10-0.dll" Delete "$INSTDIR\libgstreamer-0.10-0.dll" Delete "$INSTDIR\libgstriff-0.10-0.dll" Delete "$INSTDIR\libgstrtp-0.10-0.dll" Delete "$INSTDIR\libgstrtsp-0.10-0.dll" Delete "$INSTDIR\libgstsdp-0.10-0.dll" Delete "$INSTDIR\libgsttag-0.10-0.dll" Delete "$INSTDIR\libsoup-2.4-1.dll" Delete "$INSTDIR\gstreamer-plugins\libgstdecodebin2.dll" Delete "$INSTDIR\gstreamer-plugins\libgstffmpeg.dll" Delete "$INSTDIR\gstreamer-plugins\libgstmpegaudioparse.dll" Delete "$INSTDIR\gstreamer-plugins\libgstqtdemux.dll" ; No longer using built-in libechonest Delete "$INSTDIR\libechonest.dll" ; No longer using built-in chromaprint Delete "$INSTDIR\libchromaprint.dll" SectionEnd Section "Clementine" Clementine SetOutPath "$INSTDIR" File "clementine.exe" File "clementine-tagreader.exe" File "clementine-spotifyblob.exe" File "clementine.ico" File "glew32.dll" File "libcdio-16.dll" File "libchromaprint.dll" File "libeay32.dll" File "libechonest.dll" File "libfaac.dll" File "libfaad.dll" File "libffi-6.dll" File "libfftw3-3.dll" File "libFLAC.dll" File "libgcc_s_sjlj-1.dll" File "libgcrypt-20.dll" File "libgio-2.0-0.dll" File "libglib-2.0-0.dll" File "libgmodule-2.0-0.dll" File "libgmp-10.dll" File "libgnutls-28.dll" File "libgobject-2.0-0.dll" File "libgpg-error-0.dll" File "libgpod.dll" File "libgstapp-1.0-0.dll" File "libgstaudio-1.0-0.dll" File "libgstbase-1.0-0.dll" File "libgstcontroller-1.0-0.dll" File "libgstfft-1.0-0.dll" File "libgstnet-1.0-0.dll" File "libgstpbutils-1.0-0.dll" File "libgstreamer-1.0-0.dll" File "libgstriff-1.0-0.dll" File "libgstrtp-1.0-0.dll" File "libgstrtsp-1.0-0.dll" File "libgstsdp-1.0-0.dll" File "libgsttag-1.0-0.dll" File "libgstvideo-1.0-0.dll" File "libgthread-2.0-0.dll" File "libhogweed-2-4.dll" File "libiconv-2.dll" File "libid3tag.dll" File "libintl-8.dll" File "liblastfm.dll" File "libmad.dll" File "libmms-0.dll" File "libmp3lame-0.dll" File "libnettle-4-6.dll" File "libogg-0.dll" File "liboil-0.3-0.dll" File "liborc-0.4-0.dll" File "liborc-test-0.4-0.dll" File "libplist.dll" File "libprotobuf-8.dll" File "libqjson.dll" File "libspeex-1.dll" File "libspotify.dll" File "libsqlite3-0.dll" File "libstdc++-6.dll" File "libtag.dll" File "libtasn1-6.dll" File "libvorbis-0.dll" File "libvorbisenc-2.dll" File "libxml2-2.dll" File "mingwm10.dll" File "pthreadGC2.dll" File "QtCore4.dll" File "QtGui4.dll" File "QtNetwork4.dll" File "QtOpenGL4.dll" File "QtSql4.dll" File "QtSvg4.dll" File "QtXml4.dll" File "ssleay32.dll" File "zlib1.dll" ; Create data folder to enable portable mode @PORTABLE@ CreateDirectory $INSTDIR\data ; Check the OS. If Vista or newer, use Default Programs @NORMAL@ nsisos::osversion @NORMAL@ StrCpy $R0 $0 @NORMAL@ IntCmp $R0 6 HasDefaultPrograms NoDefaultPrograms HasDefaultPrograms @NORMAL@ HasDefaultPrograms: @NORMAL@ ; Register Clementine with Default Programs @NORMAL@ Var /GLOBAL AppIcon @NORMAL@ Var /GLOBAL AppExe @NORMAL@ StrCpy $AppExe "$INSTDIR\clementine.exe" @NORMAL@ StrCpy $AppIcon "$INSTDIR\clementine.ico" @NORMAL@ @NORMAL@ ${RegisterCapabilities} @NORMAL@ @NORMAL@ ${RegisterMediaType} ".mp3" $AppExe $AppIcon "MP3 Audio File" @NORMAL@ ${RegisterMediaType} ".flac" $AppExe $AppIcon "FLAC Audio File" @NORMAL@ ${RegisterMediaType} ".ogg" $AppExe $AppIcon "OGG Audio File" @NORMAL@ ${RegisterMediaType} ".spx" $AppExe $AppIcon "OGG Speex Audio File" @NORMAL@ ${RegisterMediaType} ".m4a" $AppExe $AppIcon "MP4 Audio File" @NORMAL@ ${RegisterMediaType} ".aac" $AppExe $AppIcon "AAC Audio File" @NORMAL@ ${RegisterMediaType} ".wma" $AppExe $AppIcon "WMA Audio File" @NORMAL@ ${RegisterMediaType} ".wav" $AppExe $AppIcon "WAV Audio File" @NORMAL@ @NORMAL@ ${RegisterMediaType} ".pls" $AppExe $AppIcon "PLS Audio File" @NORMAL@ ${RegisterMediaType} ".m3u" $AppExe $AppIcon "M3U Audio File" @NORMAL@ ${RegisterMediaType} ".xspf" $AppExe $AppIcon "XSPF Audio File" @NORMAL@ ${RegisterMediaType} ".asx" $AppExe $AppIcon "Windows Media Audio/Video playlist" @NORMAL@ @NORMAL@ ${RegisterMimeType} "audio/mp3" "mp3" "{cd3afa76-b84f-48f0-9393-7edc34128127}" @NORMAL@ ${RegisterMimeType} "audio/mp4" "m4a" "{cd3afa7c-b84f-48f0-9393-7edc34128127}" @NORMAL@ ${RegisterMimeType} "audio/x-ms-wma" "wma" "{cd3afa84-b84f-48f0-9393-7edc34128127}" @NORMAL@ ${RegisterMimeType} "audio/wav" "wav" "{cd3afa7b-b84f-48f0-9393-7edc34128127}" @NORMAL@ @NORMAL@ ${RegisterMimeType} "audio/mpegurl" "m3u" "{cd3afa78-b84f-48f0-9393-7edc34128127}" @NORMAL@ ${RegisterMimeType} "application/x-wmplayer" "asx" "{cd3afa96-b84f-48f0-9393-7edc34128127}" @NORMAL@ Goto done @NORMAL@ NoDefaultPrograms: @NORMAL@ ${registerExtension} "$INSTDIR\clementine.exe" ".mp3" "MP3 Audio File" @NORMAL@ ${registerExtension} "$INSTDIR\clementine.exe" ".flac" "FLAC Audio File" @NORMAL@ ${registerExtension} "$INSTDIR\clementine.exe" ".ogg" "OGG Audio File" @NORMAL@ ${registerExtension} "$INSTDIR\clementine.exe" ".spx" "OGG Speex Audio File" @NORMAL@ ${registerExtension} "$INSTDIR\clementine.exe" ".m4a" "MP4 Audio File" @NORMAL@ ${registerExtension} "$INSTDIR\clementine.exe" ".aac" "AAC Audio File" @NORMAL@ ${registerExtension} "$INSTDIR\clementine.exe" ".wma" "WMA Audio File" @NORMAL@ ${registerExtension} "$INSTDIR\clementine.exe" ".wav" "WAV Audio File" @NORMAL@ @NORMAL@ ${registerExtension} "$INSTDIR\clementine.exe" ".pls" "PLS Audio File" @NORMAL@ ${registerExtension} "$INSTDIR\clementine.exe" ".m3u" "M3U Audio File" @NORMAL@ ${registerExtension} "$INSTDIR\clementine.exe" ".xspf" "XSPF Audio File" @NORMAL@ ${registerExtension} "$INSTDIR\clementine.exe" ".asx" "Windows Media Audio/Video playlist" @NORMAL@ done: SectionEnd Section "Qt image format plugins" imageformats SetOutPath "$INSTDIR\imageformats" File "/oname=qgif4.dll" "imageformats\qgif4.dll" File "/oname=qjpeg4.dll" "imageformats\qjpeg4.dll" SectionEnd Section "GIO modules" gio-modules SetOutPath "$INSTDIR\gio-modules" File "/oname=libgiognutls.dll" "gio-modules\libgiognutls.dll" SectionEnd Section "Gstreamer plugins" gstreamer-plugins SetOutPath "$INSTDIR\gstreamer-plugins" File "/oname=libgstapetag.dll" "gstreamer-plugins\libgstapetag.dll" File "/oname=libgstapp.dll" "gstreamer-plugins\libgstapp.dll" File "/oname=libgstasf.dll" "gstreamer-plugins\libgstasf.dll" File "/oname=libgstaudioconvert.dll" "gstreamer-plugins\libgstaudioconvert.dll" File "/oname=libgstaudiofx.dll" "gstreamer-plugins\libgstaudiofx.dll" File "/oname=libgstaudioparsers.dll" "gstreamer-plugins\libgstaudioparsers.dll" File "/oname=libgstaudioresample.dll" "gstreamer-plugins\libgstaudioresample.dll" File "/oname=libgstaudiotestsrc.dll" "gstreamer-plugins\libgstaudiotestsrc.dll" File "/oname=libgstautodetect.dll" "gstreamer-plugins\libgstautodetect.dll" File "/oname=libgstcdio.dll" "gstreamer-plugins\libgstcdio.dll" File "/oname=libgstcoreelements.dll" "gstreamer-plugins\libgstcoreelements.dll" File "/oname=libgstdirectsoundsink.dll" "gstreamer-plugins\libgstdirectsoundsink.dll" File "/oname=libgstequalizer.dll" "gstreamer-plugins\libgstequalizer.dll" File "/oname=libgstfaac.dll" "gstreamer-plugins\libgstfaac.dll" File "/oname=libgstfaad.dll" "gstreamer-plugins\libgstfaad.dll" File "/oname=libgstflac.dll" "gstreamer-plugins\libgstflac.dll" File "/oname=libgstgdp.dll" "gstreamer-plugins\libgstgdp.dll" File "/oname=libgstgio.dll" "gstreamer-plugins\libgstgio.dll" File "/oname=libgsticydemux.dll" "gstreamer-plugins\libgsticydemux.dll" File "/oname=libgstid3demux.dll" "gstreamer-plugins\libgstid3demux.dll" File "/oname=libgstisomp4.dll" "gstreamer-plugins\libgstisomp4.dll" File "/oname=libgstlame.dll" "gstreamer-plugins\libgstlame.dll" File "/oname=libgstlibav.dll" "gstreamer-plugins\libgstlibav.dll" File "/oname=libgstmad.dll" "gstreamer-plugins\libgstmad.dll" File "/oname=libgstmms.dll" "gstreamer-plugins\libgstmms.dll" File "/oname=libgstogg.dll" "gstreamer-plugins\libgstogg.dll" File "/oname=libgstplayback.dll" "gstreamer-plugins\libgstplayback.dll" File "/oname=libgstreplaygain.dll" "gstreamer-plugins\libgstreplaygain.dll" File "/oname=libgstsouphttpsrc.dll" "gstreamer-plugins\libgstsouphttpsrc.dll" File "/oname=libgstspectrum.dll" "gstreamer-plugins\libgstspectrum.dll" File "/oname=libgstspeex.dll" "gstreamer-plugins\libgstspeex.dll" File "/oname=libgsttaglib.dll" "gstreamer-plugins\libgsttaglib.dll" File "/oname=libgsttcp.dll" "gstreamer-plugins\libgsttcp.dll" File "/oname=libgsttypefindfunctions.dll" "gstreamer-plugins\libgsttypefindfunctions.dll" File "/oname=libgstudp.dll" "gstreamer-plugins\libgstudp.dll" File "/oname=libgstvolume.dll" "gstreamer-plugins\libgstvolume.dll" File "/oname=libgstvorbis.dll" "gstreamer-plugins\libgstvorbis.dll" File "/oname=libgstwavparse.dll" "gstreamer-plugins\libgstwavparse.dll" SectionEnd Section "projectM presets" projectm-presets SetOutPath "$INSTDIR\projectm-presets" File "/oname=Aderrasi - Agitator.milk" "../../3rdparty/libprojectm/presets/Aderrasi - Agitator.milk" File "/oname=Aderrasi - Aimless (Gravity Directive Mix).milk" "../../3rdparty/libprojectm/presets/Aderrasi - Aimless (Gravity Directive Mix).milk" File "/oname=Aderrasi - Aimless (Spirogravity Mix).milk" "../../3rdparty/libprojectm/presets/Aderrasi - Aimless (Spirogravity Mix).milk" File "/oname=Aderrasi - Airhandler (Menagerie Mix).milk" "../../3rdparty/libprojectm/presets/Aderrasi - Airhandler (Menagerie Mix).milk" File "/oname=Aderrasi - Airs (Windy Mix).milk" "../../3rdparty/libprojectm/presets/Aderrasi - Airs (Windy Mix).milk" File "/oname=Aderrasi - Anchorpulse (Pulse Of A Ghast II Mix).milk" "../../3rdparty/libprojectm/presets/Aderrasi - Anchorpulse (Pulse Of A Ghast II Mix).milk" File "/oname=Aderrasi - Anchorpulse (Verified Mix).milk" "../../3rdparty/libprojectm/presets/Aderrasi - Anchorpulse (Verified Mix).milk" File "/oname=Aderrasi - Anomalous Material Science (Pure Splinter Mix).milk" "../../3rdparty/libprojectm/presets/Aderrasi - Anomalous Material Science (Pure Splinter Mix).milk" File "/oname=Aderrasi - Antidote (Aqualung Mix).milk" "../../3rdparty/libprojectm/presets/Aderrasi - Antidote (Aqualung Mix).milk" File "/oname=Aderrasi - Antidote.milk" "../../3rdparty/libprojectm/presets/Aderrasi - Antidote.milk" File "/oname=Aderrasi - Antidote (Side Effects Mix).milk" "../../3rdparty/libprojectm/presets/Aderrasi - Antidote (Side Effects Mix).milk" File "/oname=Aderrasi - Antique Abyss.milk" "../../3rdparty/libprojectm/presets/Aderrasi - Antique Abyss.milk" File "/oname=Aderrasi - Arise! (Padded Mix).milk" "../../3rdparty/libprojectm/presets/Aderrasi - Arise! (Padded Mix).milk" File "/oname=Aderrasi - Ashes Of Air (Remix).milk" "../../3rdparty/libprojectm/presets/Aderrasi - Ashes Of Air (Remix).milk" File "/oname=Aderrasi - Bitterfeld (Crystal Border Mix).milk" "../../3rdparty/libprojectm/presets/Aderrasi - Bitterfeld (Crystal Border Mix).milk" File "/oname=Aderrasi - Blender.milk" "../../3rdparty/libprojectm/presets/Aderrasi - Blender.milk" File "/oname=Aderrasi - Bow To Gravity.milk" "../../3rdparty/libprojectm/presets/Aderrasi - Bow To Gravity.milk" File "/oname=Aderrasi - Brakefreak.milk" "../../3rdparty/libprojectm/presets/Aderrasi - Brakefreak.milk" File "/oname=Aderrasi - Candy Avian.milk" "../../3rdparty/libprojectm/presets/Aderrasi - Candy Avian.milk" File "/oname=Aderrasi - Causeway Of Dreams.milk" "../../3rdparty/libprojectm/presets/Aderrasi - Causeway Of Dreams.milk" File "/oname=Aderrasi - Causeway Of Dreams (Nightmare Mix).milk" "../../3rdparty/libprojectm/presets/Aderrasi - Causeway Of Dreams (Nightmare Mix).milk" File "/oname=Aderrasi - Causeway Of Dreams (REMix).milk" "../../3rdparty/libprojectm/presets/Aderrasi - Causeway Of Dreams (REMix).milk" File "/oname=Aderrasi - Chromatic Abyss (The Other Side).milk" "../../3rdparty/libprojectm/presets/Aderrasi - Chromatic Abyss (The Other Side).milk" File "/oname=Aderrasi - Circlefacade.milk" "../../3rdparty/libprojectm/presets/Aderrasi - Circlefacade.milk" File "/oname=Aderrasi - Contortion.milk" "../../3rdparty/libprojectm/presets/Aderrasi - Contortion.milk" File "/oname=Aderrasi - Contortion (Xenomorph Mix).milk" "../../3rdparty/libprojectm/presets/Aderrasi - Contortion (Xenomorph Mix).milk" File "/oname=Aderrasi - Crystal Storm.milk" "../../3rdparty/libprojectm/presets/Aderrasi - Crystal Storm.milk" File "/oname=Aderrasi - Dark Matter (Converse Mix).milk" "../../3rdparty/libprojectm/presets/Aderrasi - Dark Matter (Converse Mix).milk" File "/oname=Aderrasi - Elastoid.milk" "../../3rdparty/libprojectm/presets/Aderrasi - Elastoid.milk" File "/oname=Aderrasi - Floater Society.milk" "../../3rdparty/libprojectm/presets/Aderrasi - Floater Society.milk" File "/oname=Aderrasi - Flowing Form.milk" "../../3rdparty/libprojectm/presets/Aderrasi - Flowing Form.milk" File "/oname=Aderrasi - Making Time (Swamp Mix).milk" "../../3rdparty/libprojectm/presets/Aderrasi - Making Time (Swamp Mix).milk" File "/oname=Aderrasi - Potion of Spirits.milk" "../../3rdparty/libprojectm/presets/Aderrasi - Potion of Spirits.milk" File "/oname=Aderrasi - Songflower (Moss Posy).milk" "../../3rdparty/libprojectm/presets/Aderrasi - Songflower (Moss Posy).milk" File "/oname=Aderrasi - Spillswirl.milk" "../../3rdparty/libprojectm/presets/Aderrasi - Spillswirl.milk" File "/oname=Aderrasi - What cannot be.milk" "../../3rdparty/libprojectm/presets/Aderrasi - What cannot be.milk" File "/oname=Aderrasi - What Cannot Be Undone.milk" "../../3rdparty/libprojectm/presets/Aderrasi - What Cannot Be Undone.milk" File "/oname=baked - mushroom rainbows[2].milk" "../../3rdparty/libprojectm/presets/baked - mushroom rainbows[2].milk" File "/oname=Bmelgren - Godhead.milk" "../../3rdparty/libprojectm/presets/Bmelgren - Godhead.milk" File "/oname=Bmelgren & Krash - Rainbow Orb Peacock (Centred Journey Mix.milk" "../../3rdparty/libprojectm/presets/Bmelgren & Krash - Rainbow Orb Peacock (Centred Journey Mix.milk" File "/oname=Bmelgren & Krash - Rainbow Orb Peacock (Lonely Signal Gone .milk" "../../3rdparty/libprojectm/presets/Bmelgren & Krash - Rainbow Orb Peacock (Lonely Signal Gone .milk" File "/oname=Bmelgren - Pentultimate Nerual Slipstream (Tweak 2).milk" "../../3rdparty/libprojectm/presets/Bmelgren - Pentultimate Nerual Slipstream (Tweak 2).milk" File "/oname=Bmelgren - Take This Highway.milk" "../../3rdparty/libprojectm/presets/Bmelgren - Take This Highway.milk" File "/oname=che - adela the flower.milk" "../../3rdparty/libprojectm/presets/che - adela the flower.milk" File "/oname=Che - Burning Hus.milk" "../../3rdparty/libprojectm/presets/Che - Burning Hus.milk" File "/oname=che - burning hus (oil mix).milk" "../../3rdparty/libprojectm/presets/che - burning hus (oil mix).milk" File "/oname=Che - Escape.milk" "../../3rdparty/libprojectm/presets/Che - Escape.milk" File "/oname=che - terracarbon stream.milk" "../../3rdparty/libprojectm/presets/che - terracarbon stream.milk" File "/oname=Che - Watch & Fly.milk" "../../3rdparty/libprojectm/presets/Che - Watch & Fly.milk" File "/oname=CrystalHigh - mad ravetriping.milk" "../../3rdparty/libprojectm/presets/CrystalHigh - mad ravetriping.milk" File "/oname=DaNOnE - Highway to Heaven (rotating).milk" "../../3rdparty/libprojectm/presets/DaNOnE - Highway to Heaven (rotating).milk" File "/oname=EMPR - Random - Changing Polyevolution.milk" "../../3rdparty/libprojectm/presets/EMPR - Random - Changing Polyevolution.milk" File "/oname=EMPR - Random - Look mama I'm on TV! 2.milk" "../../3rdparty/libprojectm/presets/EMPR - Random - Look mama I'm on TV! 2.milk" File "/oname=EMPR - Random - They're so cute Dad can I keep one!.milk" "../../3rdparty/libprojectm/presets/EMPR - Random - They're so cute Dad can I keep one!.milk" File "/oname=EMPR - Random - Turbulence Sandwich.milk" "../../3rdparty/libprojectm/presets/EMPR - Random - Turbulence Sandwich.milk" File "/oname=Eo.S. - glowsticks v2 03 music.milk" "../../3rdparty/libprojectm/presets/Eo.S. - glowsticks v2 03 music.milk" File "/oname=Eo.S. - glowsticks v2 04 music minimal.milk" "../../3rdparty/libprojectm/presets/Eo.S. - glowsticks v2 04 music minimal.milk" File "/oname=Eo.S. - glowsticks v2 05 and proton lights (+Krash's beat code) _Phat_remix02b.milk" "../../3rdparty/libprojectm/presets/Eo.S. - glowsticks v2 05 and proton lights (+Krash's beat code) _Phat_remix02b.milk" File "/oname=Eo.S. - glowsticks v2 05 and proton lights (+Krash's beat code) _Phat_remix07 recursive demons.milk" "../../3rdparty/libprojectm/presets/Eo.S. - glowsticks v2 05 and proton lights (+Krash's beat code) _Phat_remix07 recursive demons.milk" File "/oname=Eo.S. - heater core C_Phat's_class + sparks_mix.milk" "../../3rdparty/libprojectm/presets/Eo.S. - heater core C_Phat's_class + sparks_mix.milk" File "/oname=Eo.S. - heater core C_Phat's_on route_mix+beam.milk" "../../3rdparty/libprojectm/presets/Eo.S. - heater core C_Phat's_on route_mix+beam.milk" File "/oname=Eo.S.+Phat - Arm_upgrades - transformer.milk" "../../3rdparty/libprojectm/presets/Eo.S.+Phat - Arm_upgrades - transformer.milk" File "/oname=Eo.S. + Phat - chasers 18 hallway.milk" "../../3rdparty/libprojectm/presets/Eo.S. + Phat - chasers 18 hallway.milk" File "/oname=Eo.S.+Phat Cool Bug v2 + (Krash's beat detection).milk" "../../3rdparty/libprojectm/presets/Eo.S.+Phat Cool Bug v2 + (Krash's beat detection).milk" File "/oname=Eo.S. - repeater 05 - rave on acid.milk" "../../3rdparty/libprojectm/presets/Eo.S. - repeater 05 - rave on acid.milk" File "/oname=Eo.S. - repeater 15 - kaleidoscope b.milk" "../../3rdparty/libprojectm/presets/Eo.S. - repeater 15 - kaleidoscope b.milk" File "/oname=EvilJim - Follow the ball.milk" "../../3rdparty/libprojectm/presets/EvilJim - Follow the ball.milk" File "/oname=EvilJim - Ice Drops.milk" "../../3rdparty/libprojectm/presets/EvilJim - Ice Drops.milk" File "/oname=fiShbRaiN - blueprint.milk" "../../3rdparty/libprojectm/presets/fiShbRaiN - blueprint.milk" File "/oname=Fvese - 0 To 60.milk" "../../3rdparty/libprojectm/presets/Fvese - 0 To 60.milk" File "/oname=Fvese - A Blur.milk" "../../3rdparty/libprojectm/presets/Fvese - A Blur.milk" File "/oname=Fvese & Idiot24-7 - Rearview Mirror.milk" "../../3rdparty/libprojectm/presets/Fvese & Idiot24-7 - Rearview Mirror.milk" File "/oname=Fvese - Lifesavor Anyone.milk" "../../3rdparty/libprojectm/presets/Fvese - Lifesavor Anyone.milk" File "/oname=Fvese - New meetings.milk" "../../3rdparty/libprojectm/presets/Fvese - New meetings.milk" File "/oname=Fvese - Quicksand.milk" "../../3rdparty/libprojectm/presets/Fvese - Quicksand.milk" File "/oname=Fvese - Round and Round (geiss gamma mix).milk" "../../3rdparty/libprojectm/presets/Fvese - Round and Round (geiss gamma mix).milk" File "/oname=Fvese - simple.milk" "../../3rdparty/libprojectm/presets/Fvese - simple.milk" File "/oname=Fvese - Stand Still!.milk" "../../3rdparty/libprojectm/presets/Fvese - Stand Still!.milk" File "/oname=Fvese - The Tunnel (Final Stage Mix).milk" "../../3rdparty/libprojectm/presets/Fvese - The Tunnel (Final Stage Mix).milk" File "/oname=Fvese - Window Reflection 6.milk" "../../3rdparty/libprojectm/presets/Fvese - Window Reflection 6.milk" File "/oname=Fvese - Zoom Effects (Remix 2).milk" "../../3rdparty/libprojectm/presets/Fvese - Zoom Effects (Remix 2).milk" File "/oname=Geiss - Aieeeeee!!!.milk" "../../3rdparty/libprojectm/presets/Geiss - Aieeeeee!!!.milk" File "/oname=Geiss and Rovastar - The Chaos Of Colours (sprouting diment.milk" "../../3rdparty/libprojectm/presets/Geiss and Rovastar - The Chaos Of Colours (sprouting diment.milk" File "/oname=Geiss - Anomaly 1.milk" "../../3rdparty/libprojectm/presets/Geiss - Anomaly 1.milk" File "/oname=Geiss - Anomaly 2.milk" "../../3rdparty/libprojectm/presets/Geiss - Anomaly 2.milk" File "/oname=Geiss - Approach.milk" "../../3rdparty/libprojectm/presets/Geiss - Approach.milk" File "/oname=Geiss - Asymptote.milk" "../../3rdparty/libprojectm/presets/Geiss - Asymptote.milk" File "/oname=Geiss - Bass Kaleidosphere.milk" "../../3rdparty/libprojectm/presets/Geiss - Bass Kaleidosphere.milk" File "/oname=Geiss - Bass Zoom.milk" "../../3rdparty/libprojectm/presets/Geiss - Bass Zoom.milk" File "/oname=Geiss - Bipolar 1.milk" "../../3rdparty/libprojectm/presets/Geiss - Bipolar 1.milk" File "/oname=Geiss - Bipolar 2.milk" "../../3rdparty/libprojectm/presets/Geiss - Bipolar 2.milk" File "/oname=Geiss - Bipolar 3.milk" "../../3rdparty/libprojectm/presets/Geiss - Bipolar 3.milk" File "/oname=Geiss - Bipolar 4.milk" "../../3rdparty/libprojectm/presets/Geiss - Bipolar 4.milk" File "/oname=Geiss - Bipolar 5.milk" "../../3rdparty/libprojectm/presets/Geiss - Bipolar 5.milk" File "/oname=Geiss - Blasto.milk" "../../3rdparty/libprojectm/presets/Geiss - Blasto.milk" File "/oname=Geiss - Bonfire.milk" "../../3rdparty/libprojectm/presets/Geiss - Bonfire.milk" File "/oname=Geiss - Bright Fiber Matrix 1.milk" "../../3rdparty/libprojectm/presets/Geiss - Bright Fiber Matrix 1.milk" File "/oname=Geiss - Bright Fiber Matrix 2.milk" "../../3rdparty/libprojectm/presets/Geiss - Bright Fiber Matrix 2.milk" File "/oname=Geiss - Calligraphy.milk" "../../3rdparty/libprojectm/presets/Geiss - Calligraphy.milk" File "/oname=Geiss - Casino.milk" "../../3rdparty/libprojectm/presets/Geiss - Casino.milk" File "/oname=Geiss - Cepiasound.milk" "../../3rdparty/libprojectm/presets/Geiss - Cepiasound.milk" File "/oname=Geiss - Churn.milk" "../../3rdparty/libprojectm/presets/Geiss - Churn.milk" File "/oname=Geiss - Constant Velocity.milk" "../../3rdparty/libprojectm/presets/Geiss - Constant Velocity.milk" File "/oname=Geiss - Coral.milk" "../../3rdparty/libprojectm/presets/Geiss - Coral.milk" File "/oname=Geiss - Corpus Callosum.milk" "../../3rdparty/libprojectm/presets/Geiss - Corpus Callosum.milk" File "/oname=Geiss - Cosmic Dust 1.milk" "../../3rdparty/libprojectm/presets/Geiss - Cosmic Dust 1.milk" File "/oname=Geiss - Cosmic Dust 2.milk" "../../3rdparty/libprojectm/presets/Geiss - Cosmic Dust 2.milk" File "/oname=Geiss - Cruzin'.milk" "../../3rdparty/libprojectm/presets/Geiss - Cruzin'.milk" File "/oname=Geiss - Cycloid 1.milk" "../../3rdparty/libprojectm/presets/Geiss - Cycloid 1.milk" File "/oname=Geiss - Cycloid 2.milk" "../../3rdparty/libprojectm/presets/Geiss - Cycloid 2.milk" File "/oname=Geiss - Davod The Pod.milk" "../../3rdparty/libprojectm/presets/Geiss - Davod The Pod.milk" File "/oname=Geiss - De La Moutard 1.milk" "../../3rdparty/libprojectm/presets/Geiss - De La Moutard 1.milk" File "/oname=Geiss - De La Moutard 2.milk" "../../3rdparty/libprojectm/presets/Geiss - De La Moutard 2.milk" File "/oname=Geiss - Demonic Distortion.milk" "../../3rdparty/libprojectm/presets/Geiss - Demonic Distortion.milk" File "/oname=Geiss - Descent.milk" "../../3rdparty/libprojectm/presets/Geiss - Descent.milk" File "/oname=Geiss - Destruction.milk" "../../3rdparty/libprojectm/presets/Geiss - Destruction.milk" File "/oname=Geiss - Diffraction.milk" "../../3rdparty/libprojectm/presets/Geiss - Diffraction.milk" File "/oname=Geiss - Digital Smoke.milk" "../../3rdparty/libprojectm/presets/Geiss - Digital Smoke.milk" File "/oname=Geiss - Downward Spiral.milk" "../../3rdparty/libprojectm/presets/Geiss - Downward Spiral.milk" File "/oname=Geiss - Drift.milk" "../../3rdparty/libprojectm/presets/Geiss - Drift.milk" File "/oname=Geiss - Dynamic Swirls 1.milk" "../../3rdparty/libprojectm/presets/Geiss - Dynamic Swirls 1.milk" File "/oname=Geiss - Dynamic Swirls 2.milk" "../../3rdparty/libprojectm/presets/Geiss - Dynamic Swirls 2.milk" File "/oname=Geiss - Eddies 1.milk" "../../3rdparty/libprojectm/presets/Geiss - Eddies 1.milk" File "/oname=Geiss - Eddies 2.milk" "../../3rdparty/libprojectm/presets/Geiss - Eddies 2.milk" File "/oname=Geiss - Eggs.milk" "../../3rdparty/libprojectm/presets/Geiss - Eggs.milk" File "/oname=Geiss - El Cubismo.milk" "../../3rdparty/libprojectm/presets/Geiss - El Cubismo.milk" File "/oname=Geiss - Feedback 2.milk" "../../3rdparty/libprojectm/presets/Geiss - Feedback 2.milk" File "/oname=Geiss - Feedback.milk" "../../3rdparty/libprojectm/presets/Geiss - Feedback.milk" File "/oname=Geiss - Festive.milk" "../../3rdparty/libprojectm/presets/Geiss - Festive.milk" File "/oname=Geiss - Fiberglass.milk" "../../3rdparty/libprojectm/presets/Geiss - Fiberglass.milk" File "/oname=Geiss - Flotsam.milk" "../../3rdparty/libprojectm/presets/Geiss - Flotsam.milk" File "/oname=Geiss - Flower Blossom.milk" "../../3rdparty/libprojectm/presets/Geiss - Flower Blossom.milk" File "/oname=Geiss - Flower.milk" "../../3rdparty/libprojectm/presets/Geiss - Flower.milk" File "/oname=Geiss - Four Kinds of Amphetamines.milk" "../../3rdparty/libprojectm/presets/Geiss - Four Kinds of Amphetamines.milk" File "/oname=Geiss - Galaxy 1.milk" "../../3rdparty/libprojectm/presets/Geiss - Galaxy 1.milk" File "/oname=Geiss - Galaxy 2.milk" "../../3rdparty/libprojectm/presets/Geiss - Galaxy 2.milk" File "/oname=Geiss - Greenland.milk" "../../3rdparty/libprojectm/presets/Geiss - Greenland.milk" File "/oname=Geiss - Heavenly 1.milk" "../../3rdparty/libprojectm/presets/Geiss - Heavenly 1.milk" File "/oname=Geiss - Heavenly 2.milk" "../../3rdparty/libprojectm/presets/Geiss - Heavenly 2.milk" File "/oname=Geiss - Heavenly 3.milk" "../../3rdparty/libprojectm/presets/Geiss - Heavenly 3.milk" File "/oname=Geiss - High Dynamic Range.milk" "../../3rdparty/libprojectm/presets/Geiss - High Dynamic Range.milk" File "/oname=Geiss - Hovering.milk" "../../3rdparty/libprojectm/presets/Geiss - Hovering.milk" File "/oname=Geiss - Hyperion.milk" "../../3rdparty/libprojectm/presets/Geiss - Hyperion.milk" File "/oname=Geiss - Inkblot.milk" "../../3rdparty/libprojectm/presets/Geiss - Inkblot.milk" File "/oname=Geiss - Iris.milk" "../../3rdparty/libprojectm/presets/Geiss - Iris.milk" File "/oname=Geiss - Journey.milk" "../../3rdparty/libprojectm/presets/Geiss - Journey.milk" File "/oname=Geiss - Julia Fractal 1.milk" "../../3rdparty/libprojectm/presets/Geiss - Julia Fractal 1.milk" File "/oname=Geiss - Julia Fractal 2.milk" "../../3rdparty/libprojectm/presets/Geiss - Julia Fractal 2.milk" File "/oname=Geiss - Luz.milk" "../../3rdparty/libprojectm/presets/Geiss - Luz.milk" File "/oname=Geiss - Mega Swirl 1.milk" "../../3rdparty/libprojectm/presets/Geiss - Mega Swirl 1.milk" File "/oname=Geiss - Mega Swirl 2.milk" "../../3rdparty/libprojectm/presets/Geiss - Mega Swirl 2.milk" File "/oname=Geiss - Mega Swirl 3.milk" "../../3rdparty/libprojectm/presets/Geiss - Mega Swirl 3.milk" File "/oname=Geiss - Microcosm.milk" "../../3rdparty/libprojectm/presets/Geiss - Microcosm.milk" File "/oname=Geiss - Monotone Ripples.milk" "../../3rdparty/libprojectm/presets/Geiss - Monotone Ripples.milk" File "/oname=Geiss - Music Box.milk" "../../3rdparty/libprojectm/presets/Geiss - Music Box.milk" File "/oname=Geiss - Nautilus.milk" "../../3rdparty/libprojectm/presets/Geiss - Nautilus.milk" File "/oname=Geiss - Octopus Blue.milk" "../../3rdparty/libprojectm/presets/Geiss - Octopus Blue.milk" File "/oname=Geiss - Octopus Ever Changing.milk" "../../3rdparty/libprojectm/presets/Geiss - Octopus Ever Changing.milk" File "/oname=Geiss - Octopus Fat and Ever Changing.milk" "../../3rdparty/libprojectm/presets/Geiss - Octopus Fat and Ever Changing.milk" File "/oname=Geiss - Octopus Gold.milk" "../../3rdparty/libprojectm/presets/Geiss - Octopus Gold.milk" File "/oname=Geiss - Octopus Gold with Dots.milk" "../../3rdparty/libprojectm/presets/Geiss - Octopus Gold with Dots.milk" File "/oname=Geiss - Octopus.milk" "../../3rdparty/libprojectm/presets/Geiss - Octopus.milk" File "/oname=Geiss - Oldskool Mellowstyle.milk" "../../3rdparty/libprojectm/presets/Geiss - Oldskool Mellowstyle.milk" File "/oname=Geiss - Pelota De Fuego.milk" "../../3rdparty/libprojectm/presets/Geiss - Pelota De Fuego.milk" File "/oname=Geiss - Pinch.milk" "../../3rdparty/libprojectm/presets/Geiss - Pinch.milk" File "/oname=Geiss - Pistons.milk" "../../3rdparty/libprojectm/presets/Geiss - Pistons.milk" File "/oname=Geiss - Planet 1.milk" "../../3rdparty/libprojectm/presets/Geiss - Planet 1.milk" File "/oname=Geiss - Planet 2.milk" "../../3rdparty/libprojectm/presets/Geiss - Planet 2.milk" File "/oname=Geiss - Quasilinear Submanifolds.milk" "../../3rdparty/libprojectm/presets/Geiss - Quasilinear Submanifolds.milk" File "/oname=Geiss - Reducto Absurdum.milk" "../../3rdparty/libprojectm/presets/Geiss - Reducto Absurdum.milk" File "/oname=Geiss - Reducto Ad Nauseum.milk" "../../3rdparty/libprojectm/presets/Geiss - Reducto Ad Nauseum.milk" File "/oname=Geiss - Rocket.milk" "../../3rdparty/libprojectm/presets/Geiss - Rocket.milk" File "/oname=Geiss & Rovastar - Julia Fractal (Vectrip Mix).milk" "../../3rdparty/libprojectm/presets/Geiss & Rovastar - Julia Fractal (Vectrip Mix).milk" File "/oname=Geiss & Rovastar - Notions Of Tonality 2.milk" "../../3rdparty/libprojectm/presets/Geiss & Rovastar - Notions Of Tonality 2.milk" File "/oname=Geiss & Rovastar - The Chaos Of Colours (sprouting dimentia mix).milk" "../../3rdparty/libprojectm/presets/Geiss & Rovastar - The Chaos Of Colours (sprouting dimentia mix).milk" File "/oname=Geiss & Rovastar - Tokamak (Naked Intrusion Mix).milk" "../../3rdparty/libprojectm/presets/Geiss & Rovastar - Tokamak (Naked Intrusion Mix).milk" File "/oname=Geiss - Runoff.milk" "../../3rdparty/libprojectm/presets/Geiss - Runoff.milk" File "/oname=Geiss - Scary.milk" "../../3rdparty/libprojectm/presets/Geiss - Scary.milk" File "/oname=Geiss - Script.milk" "../../3rdparty/libprojectm/presets/Geiss - Script.milk" File "/oname=Geiss - Serpent.milk" "../../3rdparty/libprojectm/presets/Geiss - Serpent.milk" File "/oname=Geiss - Shake.milk" "../../3rdparty/libprojectm/presets/Geiss - Shake.milk" File "/oname=Geiss - Shift.milk" "../../3rdparty/libprojectm/presets/Geiss - Shift.milk" File "/oname=Geiss - Sinews 1.milk" "../../3rdparty/libprojectm/presets/Geiss - Sinews 1.milk" File "/oname=Geiss - Sinews 2.milk" "../../3rdparty/libprojectm/presets/Geiss - Sinews 2.milk" File "/oname=Geiss - Smoke.milk" "../../3rdparty/libprojectm/presets/Geiss - Smoke.milk" File "/oname=Geiss - Solar Flare (Blue).milk" "../../3rdparty/libprojectm/presets/Geiss - Solar Flare (Blue).milk" File "/oname=Geiss - Solar Flare.milk" "../../3rdparty/libprojectm/presets/Geiss - Solar Flare.milk" File "/oname=Geiss - Solar Flare (Reptile).milk" "../../3rdparty/libprojectm/presets/Geiss - Solar Flare (Reptile).milk" File "/oname=Geiss - Sound And The Fury.milk" "../../3rdparty/libprojectm/presets/Geiss - Sound And The Fury.milk" File "/oname=Geiss - Spacedust.milk" "../../3rdparty/libprojectm/presets/Geiss - Spacedust.milk" File "/oname=Geiss - Space Voyage Bright.milk" "../../3rdparty/libprojectm/presets/Geiss - Space Voyage Bright.milk" File "/oname=Geiss - Space Voyage (High-Warp).milk" "../../3rdparty/libprojectm/presets/Geiss - Space Voyage (High-Warp).milk" File "/oname=Geiss - Space Voyage.milk" "../../3rdparty/libprojectm/presets/Geiss - Space Voyage.milk" File "/oname=Geiss & Sperl - Feedback (projectM idle HDR mix).prjm" "../../3rdparty/libprojectm/presets/Geiss & Sperl - Feedback (projectM idle HDR mix).prjm" File "/oname=Geiss - Starfish 1.milk" "../../3rdparty/libprojectm/presets/Geiss - Starfish 1.milk" File "/oname=Geiss - Starfish 2.milk" "../../3rdparty/libprojectm/presets/Geiss - Starfish 2.milk" File "/oname=Geiss - Sunsets.milk" "../../3rdparty/libprojectm/presets/Geiss - Sunsets.milk" File "/oname=Geiss - Supernova 1.milk" "../../3rdparty/libprojectm/presets/Geiss - Supernova 1.milk" File "/oname=Geiss - Supernova 2.milk" "../../3rdparty/libprojectm/presets/Geiss - Supernova 2.milk" File "/oname=Geiss - Surface.milk" "../../3rdparty/libprojectm/presets/Geiss - Surface.milk" File "/oname=Geiss - Swirl 1.milk" "../../3rdparty/libprojectm/presets/Geiss - Swirl 1.milk" File "/oname=Geiss - Swirl 2.milk" "../../3rdparty/libprojectm/presets/Geiss - Swirl 2.milk" File "/oname=Geiss - Swirlie 1.milk" "../../3rdparty/libprojectm/presets/Geiss - Swirlie 1.milk" File "/oname=Geiss - Swirlie 2.milk" "../../3rdparty/libprojectm/presets/Geiss - Swirlie 2.milk" File "/oname=Geiss - Swirlie 3.milk" "../../3rdparty/libprojectm/presets/Geiss - Swirlie 3.milk" File "/oname=Geiss - Swirlie 4.milk" "../../3rdparty/libprojectm/presets/Geiss - Swirlie 4.milk" File "/oname=Geiss - Swirlie 5.milk" "../../3rdparty/libprojectm/presets/Geiss - Swirlie 5.milk" File "/oname=Geiss - Symmetry.milk" "../../3rdparty/libprojectm/presets/Geiss - Symmetry.milk" File "/oname=Geiss - The Fatty Lumpkin Sunkle Tweaker.milk" "../../3rdparty/libprojectm/presets/Geiss - The Fatty Lumpkin Sunkle Tweaker.milk" File "/oname=Geiss - Three And A Half Kinds Of Amphetamines.milk" "../../3rdparty/libprojectm/presets/Geiss - Three And A Half Kinds Of Amphetamines.milk" File "/oname=Geiss - Three Kinds Of Amphetamines.milk" "../../3rdparty/libprojectm/presets/Geiss - Three Kinds Of Amphetamines.milk" File "/oname=Geiss - Tokamak.milk" "../../3rdparty/libprojectm/presets/Geiss - Tokamak.milk" File "/oname=Geiss - Tornado.milk" "../../3rdparty/libprojectm/presets/Geiss - Tornado.milk" File "/oname=Geiss - Toy.milk" "../../3rdparty/libprojectm/presets/Geiss - Toy.milk" File "/oname=Geiss - Trampoline.milk" "../../3rdparty/libprojectm/presets/Geiss - Trampoline.milk" File "/oname=Geiss - Tube.milk" "../../3rdparty/libprojectm/presets/Geiss - Tube.milk" File "/oname=Geiss - Two-Pointed Pulsagon.milk" "../../3rdparty/libprojectm/presets/Geiss - Two-Pointed Pulsagon.milk" File "/oname=Geiss - Ultrafast.milk" "../../3rdparty/libprojectm/presets/Geiss - Ultrafast.milk" File "/oname=Geiss - Volume Zoom.milk" "../../3rdparty/libprojectm/presets/Geiss - Volume Zoom.milk" File "/oname=Geiss - Vortex 1.milk" "../../3rdparty/libprojectm/presets/Geiss - Vortex 1.milk" File "/oname=Geiss - Vortex 2.milk" "../../3rdparty/libprojectm/presets/Geiss - Vortex 2.milk" File "/oname=Geiss - Warp Of Dali 1.milk" "../../3rdparty/libprojectm/presets/Geiss - Warp Of Dali 1.milk" File "/oname=Geiss - Warp Of Dali 2.milk" "../../3rdparty/libprojectm/presets/Geiss - Warp Of Dali 2.milk" File "/oname=Geiss - Warp Of Dali Bright.milk" "../../3rdparty/libprojectm/presets/Geiss - Warp Of Dali Bright.milk" File "/oname=Geiss - Waterfall.milk" "../../3rdparty/libprojectm/presets/Geiss - Waterfall.milk" File "/oname=headphones.tga" "../../3rdparty/libprojectm/presets/headphones.tga" File "/oname=Idiot24-7 - Ascending to heaven 2.milk" "../../3rdparty/libprojectm/presets/Idiot24-7 - Ascending to heaven 2.milk" File "/oname=Idiot24-7 - Meeting place.milk" "../../3rdparty/libprojectm/presets/Idiot24-7 - Meeting place.milk" File "/oname=Idiot - 9-7-02 (Remix) (sustain fixed).milk" "../../3rdparty/libprojectm/presets/Idiot - 9-7-02 (Remix) (sustain fixed).milk" File "/oname=Idiot & Che - Various Abstract Effects.milk" "../../3rdparty/libprojectm/presets/Idiot & Che - Various Abstract Effects.milk" File "/oname=Idiot - Cortex (Spiritual Visions Mix).milk" "../../3rdparty/libprojectm/presets/Idiot - Cortex (Spiritual Visions Mix).milk" File "/oname=Idiot - Madness Within The Void (Remix).milk" "../../3rdparty/libprojectm/presets/Idiot - Madness Within The Void (Remix).milk" File "/oname=Idiot - MOTIVATION!.milk" "../../3rdparty/libprojectm/presets/Idiot - MOTIVATION!.milk" File "/oname=idiot - Nothing Yet - 03 - The worst of the pack.milk" "../../3rdparty/libprojectm/presets/idiot - Nothing Yet - 03 - The worst of the pack.milk" File "/oname=idiot - Nucleus.milk" "../../3rdparty/libprojectm/presets/idiot - Nucleus.milk" File "/oname=Idiot & Rovastar - Altars Of Madness 2 (X.42 Mix).milk" "../../3rdparty/libprojectm/presets/Idiot & Rovastar - Altars Of Madness 2 (X.42 Mix).milk" File "/oname=idiot - Sinful Code (unchained style).milk" "../../3rdparty/libprojectm/presets/idiot - Sinful Code (unchained style).milk" File "/oname=idiot - Some big word I learned.milk" "../../3rdparty/libprojectm/presets/idiot - Some big word I learned.milk" File "/oname=idiot - Spectrum.milk" "../../3rdparty/libprojectm/presets/idiot - Spectrum.milk" File "/oname=Idiot - Tentacle Dreams (Remix).milk" "../../3rdparty/libprojectm/presets/Idiot - Tentacle Dreams (Remix).milk" File "/oname=Idiot - Texture Boxes (Remix 2).milk" "../../3rdparty/libprojectm/presets/Idiot - Texture Boxes (Remix 2).milk" File "/oname=Idiot - Texture Boxes (Remix).milk" "../../3rdparty/libprojectm/presets/Idiot - Texture Boxes (Remix).milk" File "/oname=Idiot - Typomatic (Remix 2).milk" "../../3rdparty/libprojectm/presets/Idiot - Typomatic (Remix 2).milk" File "/oname=Idiot - What Is.milk" "../../3rdparty/libprojectm/presets/Idiot - What Is.milk" File "/oname=Idiot - What Shall Come.milk" "../../3rdparty/libprojectm/presets/Idiot - What Shall Come.milk" File "/oname=Idiot & Zylot - Unhealthy Love (Idiot's STDs Mix).milk" "../../3rdparty/libprojectm/presets/Idiot & Zylot - Unhealthy Love (Idiot's STDs Mix).milk" File "/oname=Illusion & Che - Return Of The King.milk" "../../3rdparty/libprojectm/presets/Illusion & Che - Return Of The King.milk" File "/oname=Illusion & Che - The Piper.milk" "../../3rdparty/libprojectm/presets/Illusion & Che - The Piper.milk" File "/oname=Illusion - Figure Eight.milk" "../../3rdparty/libprojectm/presets/Illusion - Figure Eight.milk" File "/oname=Illusion - Heavenly Eye.milk" "../../3rdparty/libprojectm/presets/Illusion - Heavenly Eye.milk" File "/oname=Illusion & Rovastar - Clouded Bottle.milk" "../../3rdparty/libprojectm/presets/Illusion & Rovastar - Clouded Bottle.milk" File "/oname=Illusion & Rovastar - Snowflake Delight.milk" "../../3rdparty/libprojectm/presets/Illusion & Rovastar - Snowflake Delight.milk" File "/oname=Illusion & Rovastar - Snowflake Return.milk" "../../3rdparty/libprojectm/presets/Illusion & Rovastar - Snowflake Return.milk" File "/oname=illusion & studio music - charged bliss.milk" "../../3rdparty/libprojectm/presets/illusion & studio music - charged bliss.milk" File "/oname=Illusion & Unchained - Frozen Eye 1.milk" "../../3rdparty/libprojectm/presets/Illusion & Unchained - Frozen Eye 1.milk" File "/oname=Illusion & Unchained - Invade My Mind.milk" "../../3rdparty/libprojectm/presets/Illusion & Unchained - Invade My Mind.milk" File "/oname=Illusion & Unchained - Re-Enter Homeworld.milk" "../../3rdparty/libprojectm/presets/Illusion & Unchained - Re-Enter Homeworld.milk" File "/oname=[Ishan] - Life in the drains.milk" "../../3rdparty/libprojectm/presets/[Ishan] - Life in the drains.milk" File "/oname=Jess - Trying To Trap A Twister.milk" "../../3rdparty/libprojectm/presets/Jess - Trying To Trap A Twister.milk" File "/oname=Krash - 3D Shapes Demo 2.milk" "../../3rdparty/libprojectm/presets/Krash - 3D Shapes Demo 2.milk" File "/oname=Krash - 3D Shapes Demo.milk" "../../3rdparty/libprojectm/presets/Krash - 3D Shapes Demo.milk" File "/oname=Krash and Fvese - Molten Indecision (Fvese Remix).milk" "../../3rdparty/libprojectm/presets/Krash and Fvese - Molten Indecision (Fvese Remix).milk" File "/oname=Krash and Rovastar - Rainbow Orb.milk" "../../3rdparty/libprojectm/presets/Krash and Rovastar - Rainbow Orb.milk" File "/oname=Krash - Digital Flame.milk" "../../3rdparty/libprojectm/presets/Krash - Digital Flame.milk" File "/oname=Krash - Dynamic Borders 1.milk" "../../3rdparty/libprojectm/presets/Krash - Dynamic Borders 1.milk" File "/oname=Krash - Framed Geometry.milk" "../../3rdparty/libprojectm/presets/Krash - Framed Geometry.milk" File "/oname=Krash & Idiot - Memories Of The Castle.milk" "../../3rdparty/libprojectm/presets/Krash & Idiot - Memories Of The Castle.milk" File "/oname=Krash & Illusion - Indecisive Mosaic.milk" "../../3rdparty/libprojectm/presets/Krash & Illusion - Indecisive Mosaic.milk" File "/oname=Krash & Illusion - Spiral Movement.milk" "../../3rdparty/libprojectm/presets/Krash & Illusion - Spiral Movement.milk" File "/oname=Krash - Pulse.milk" "../../3rdparty/libprojectm/presets/Krash - Pulse.milk" File "/oname=Krash & Rovastar - Altars Of Madness (Mad Ocean Mix).milk" "../../3rdparty/libprojectm/presets/Krash & Rovastar - Altars Of Madness (Mad Ocean Mix).milk" File "/oname=Krash & Rovastar - A Million Miles from Earth (Ripple Mix).milk" "../../3rdparty/libprojectm/presets/Krash & Rovastar - A Million Miles from Earth (Ripple Mix).milk" File "/oname=Krash & Rovastar - Cerebral Demons (Distant Memory Mix).milk" "../../3rdparty/libprojectm/presets/Krash & Rovastar - Cerebral Demons (Distant Memory Mix).milk" File "/oname=Krash & Rovastar - Cerebral Demons - Phat + Eo.S. hall of ghouls Remix.milk" "../../3rdparty/libprojectm/presets/Krash & Rovastar - Cerebral Demons - Phat + Eo.S. hall of ghouls Remix.milk" File "/oname=Krash & Rovastar - Switching Polygons.milk" "../../3rdparty/libprojectm/presets/Krash & Rovastar - Switching Polygons.milk" File "/oname=Krash & Rovastar - The Devil Is In The Details.milk" "../../3rdparty/libprojectm/presets/Krash & Rovastar - The Devil Is In The Details.milk" File "/oname=Krash - Season's Greetings 2.milk" "../../3rdparty/libprojectm/presets/Krash - Season's Greetings 2.milk" File "/oname=Krash & TEcHNO - Rhythmic Mantas.milk" "../../3rdparty/libprojectm/presets/Krash & TEcHNO - Rhythmic Mantas.milk" File "/oname=Krash - Twisting Indecision.milk" "../../3rdparty/libprojectm/presets/Krash - Twisting Indecision.milk" File "/oname=Krash - War Machine (Shifting Complexity Mix).milk" "../../3rdparty/libprojectm/presets/Krash - War Machine (Shifting Complexity Mix).milk" File "/oname=Krash - Windowframe To Mega Swirl 2.milk" "../../3rdparty/libprojectm/presets/Krash - Windowframe To Mega Swirl 2.milk" File "/oname=Krash & Zylot - Inside The Planar Portal (Indecision Mix).milk" "../../3rdparty/libprojectm/presets/Krash & Zylot - Inside The Planar Portal (Indecision Mix).milk" File "/oname=Mstress - Acoustic Nerve Impulses (Under Drug Effetcs (Hypn.milk" "../../3rdparty/libprojectm/presets/Mstress - Acoustic Nerve Impulses (Under Drug Effetcs (Hypn.milk" File "/oname=Mstress & Juppy - Dancer.milk" "../../3rdparty/libprojectm/presets/Mstress & Juppy - Dancer.milk" File "/oname=Mstress & Juppy - Dancers In The Dark.milk" "../../3rdparty/libprojectm/presets/Mstress & Juppy - Dancers In The Dark.milk" File "/oname=Mstress - Snowing Fiber City.milk" "../../3rdparty/libprojectm/presets/Mstress - Snowing Fiber City.milk" File "/oname=M.tga" "../../3rdparty/libprojectm/presets/M.tga" File "/oname=nil - Can't Stop the Blithering.milk" "../../3rdparty/libprojectm/presets/nil - Can't Stop the Blithering.milk" File "/oname=nil - Can't Stop the Cramming.milk" "../../3rdparty/libprojectm/presets/nil - Can't Stop the Cramming.milk" File "/oname=nil - Cid and Lucy.milk" "../../3rdparty/libprojectm/presets/nil - Cid and Lucy.milk" File "/oname=nil - Disco Comet.milk" "../../3rdparty/libprojectm/presets/nil - Disco Comet.milk" File "/oname=nil - Singularity in My Oscilloscope.milk" "../../3rdparty/libprojectm/presets/nil - Singularity in My Oscilloscope.milk" File "/oname=nil - Vortex of Vortices.milk" "../../3rdparty/libprojectm/presets/nil - Vortex of Vortices.milk" File "/oname=Phat+fiShbRaiN+Eo.S_Mandala_Chasers_remix.milk" "../../3rdparty/libprojectm/presets/Phat+fiShbRaiN+Eo.S_Mandala_Chasers_remix.milk" File "/oname=Phat+fiShbRaiN+Eo.S_Mandala_Chasers_remix - www.eos4life.com.milk" "../../3rdparty/libprojectm/presets/Phat+fiShbRaiN+Eo.S_Mandala_Chasers_remix - www.eos4life.com.milk" File "/oname=PieturP - triptrap_(getting_concrete_visions_through_a_diafragma_version).milk" "../../3rdparty/libprojectm/presets/PieturP - triptrap_(getting_concrete_visions_through_a_diafragma_version).milk" File "/oname=PieturP - triptrap_(ultimate-trip-mix).milk" "../../3rdparty/libprojectm/presets/PieturP - triptrap_(ultimate-trip-mix).milk" File "/oname=project.tga" "../../3rdparty/libprojectm/presets/project.tga" File "/oname=Redi Jedi - acid in your brain.milk" "../../3rdparty/libprojectm/presets/Redi Jedi - acid in your brain.milk" File "/oname=Redi Jedi - multiple points of origin, one destination.milk" "../../3rdparty/libprojectm/presets/Redi Jedi - multiple points of origin, one destination.milk" File "/oname=Reenen - phoenix.milk" "../../3rdparty/libprojectm/presets/Reenen - phoenix.milk" File "/oname=Rocke - Cold Love (Tei Zwaa).milk" "../../3rdparty/libprojectm/presets/Rocke - Cold Love (Tei Zwaa).milk" File "/oname=Rocke - Personal Comet.milk" "../../3rdparty/libprojectm/presets/Rocke - Personal Comet.milk" File "/oname=Rovastar & Aderrasi - Oceanic Bassograph (Underwater Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar & Aderrasi - Oceanic Bassograph (Underwater Mix).milk" File "/oname=Rovastar - Altars Of Harlequin's Maddess.milk" "../../3rdparty/libprojectm/presets/Rovastar - Altars Of Harlequin's Maddess.milk" File "/oname=Rovastar - Altars Of Harlequin's Madness (Dark Disorder Mix.milk" "../../3rdparty/libprojectm/presets/Rovastar - Altars Of Harlequin's Madness (Dark Disorder Mix.milk" File "/oname=Rovastar - Altars Of Madness 2 (Frozen Time Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Altars Of Madness 2 (Frozen Time Mix).milk" File "/oname=Rovastar - Altars Of Madness 4 (Spirit Of Twisted Madness M.milk" "../../3rdparty/libprojectm/presets/Rovastar - Altars Of Madness 4 (Spirit Of Twisted Madness M.milk" File "/oname=Rovastar - Altars Of Madness (A Million Miles From Earth Mi.milk" "../../3rdparty/libprojectm/presets/Rovastar - Altars Of Madness (A Million Miles From Earth Mi.milk" File "/oname=Rovastar - Altars Of Madness (Boxfresh Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Altars Of Madness (Boxfresh Mix).milk" File "/oname=Rovastar - Altars Of Madness (Duel Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Altars Of Madness (Duel Mix).milk" File "/oname=Rovastar - Altars Of Madness.milk" "../../3rdparty/libprojectm/presets/Rovastar - Altars Of Madness.milk" File "/oname=Rovastar - Altars Of Madness (Surealist Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Altars Of Madness (Surealist Mix).milk" File "/oname=Rovastar - A Million Miles from Earth.milk" "../../3rdparty/libprojectm/presets/Rovastar - A Million Miles from Earth.milk" File "/oname=Rovastar - A Million Miles from Earth (Pathfinder Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - A Million Miles from Earth (Pathfinder Mix).milk" File "/oname=Rovastar - A Million Miles From Earth (Wormhole Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - A Million Miles From Earth (Wormhole Mix).milk" File "/oname=Rovastar and Krash - Hallucinogenic Pyramids (Extra Beat Ti.milk" "../../3rdparty/libprojectm/presets/Rovastar and Krash - Hallucinogenic Pyramids (Extra Beat Ti.milk" File "/oname=Rovastar and Unchained - Braindance Visions.milk" "../../3rdparty/libprojectm/presets/Rovastar and Unchained - Braindance Visions.milk" File "/oname=Rovastar and Unchained - Life After Pie (Remix).milk" "../../3rdparty/libprojectm/presets/Rovastar and Unchained - Life After Pie (Remix).milk" File "/oname=Rovastar - Attacking Freedom.milk" "../../3rdparty/libprojectm/presets/Rovastar - Attacking Freedom.milk" File "/oname=Rovastar - Bellanova (New Wave Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Bellanova (New Wave Mix).milk" File "/oname=Rovastar - Biohazard Warning.milk" "../../3rdparty/libprojectm/presets/Rovastar - Biohazard Warning.milk" File "/oname=Rovastar - Chapel Of Ghouls.milk" "../../3rdparty/libprojectm/presets/Rovastar - Chapel Of Ghouls.milk" File "/oname=Rovastar & Che - Adela The Flower (Altars Of Madness Mix 2).milk" "../../3rdparty/libprojectm/presets/Rovastar & Che - Adela The Flower (Altars Of Madness Mix 2).milk" File "/oname=Rovastar & Che - Asylum Animations.milk" "../../3rdparty/libprojectm/presets/Rovastar & Che - Asylum Animations.milk" File "/oname=Rovastar - Chemical Spirituality.milk" "../../3rdparty/libprojectm/presets/Rovastar - Chemical Spirituality.milk" File "/oname=Rovastar - Clouded Judgement 3.milk" "../../3rdparty/libprojectm/presets/Rovastar - Clouded Judgement 3.milk" File "/oname=Rovastar - Cosmic Echoes 1.milk" "../../3rdparty/libprojectm/presets/Rovastar - Cosmic Echoes 1.milk" File "/oname=Rovastar - Cosmic Echoes 2.milk" "../../3rdparty/libprojectm/presets/Rovastar - Cosmic Echoes 2.milk" File "/oname=Rovastar - Cosmic Havoc.milk" "../../3rdparty/libprojectm/presets/Rovastar - Cosmic Havoc.milk" File "/oname=Rovastar - Cosmic Mosaic (Active Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Cosmic Mosaic (Active Mix).milk" File "/oname=Rovastar - Dark Ritual (Star Of Destiny Denied Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Dark Ritual (Star Of Destiny Denied Mix).milk" File "/oname=Rovastar - Dark Ritual (Star Of Destiny Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Dark Ritual (Star Of Destiny Mix).milk" File "/oname=Rovastar - Decreasing Dreams (Extended Movement Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Decreasing Dreams (Extended Movement Mix).milk" File "/oname=Rovastar - Dreamcatcher.milk" "../../3rdparty/libprojectm/presets/Rovastar - Dreamcatcher.milk" File "/oname=Rovastar - Explosive Minds.milk" "../../3rdparty/libprojectm/presets/Rovastar - Explosive Minds.milk" File "/oname=Rovastar - Forgotten Moon.milk" "../../3rdparty/libprojectm/presets/Rovastar - Forgotten Moon.milk" File "/oname=Rovastar - Fractopia (Fantic Dancing Lights Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Fractopia (Fantic Dancing Lights Mix).milk" File "/oname=Rovastar - Fractopia (Galaxy Swirl Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Fractopia (Galaxy Swirl Mix).milk" File "/oname=Rovastar - Fractopia (Upspoken Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Fractopia (Upspoken Mix).milk" File "/oname=Rovastar - Fractopia (Upspoken Mix)_Phat_Speak_When_Spoken_2.milk" "../../3rdparty/libprojectm/presets/Rovastar - Fractopia (Upspoken Mix)_Phat_Speak_When_Spoken_2.milk" File "/oname=Rovastar - Frozen Rapture .milk" "../../3rdparty/libprojectm/presets/Rovastar - Frozen Rapture .milk" File "/oname=Rovastar - Future Speakers.milk" "../../3rdparty/libprojectm/presets/Rovastar - Future Speakers.milk" File "/oname=Rovastar & Fvese - Dark Subconscious.milk" "../../3rdparty/libprojectm/presets/Rovastar & Fvese - Dark Subconscious.milk" File "/oname=Rovastar & Fvese - Deadly Flower.milk" "../../3rdparty/libprojectm/presets/Rovastar & Fvese - Deadly Flower.milk" File "/oname=Rovastar & Fvese - Mosaic Waves.milk" "../../3rdparty/libprojectm/presets/Rovastar & Fvese - Mosaic Waves.milk" File "/oname=Rovastar & Fvese - Paranormal Static.milk" "../../3rdparty/libprojectm/presets/Rovastar & Fvese - Paranormal Static.milk" File "/oname=Rovastar & Fvese - Stranger Minds (Astral Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar & Fvese - Stranger Minds (Astral Mix).milk" File "/oname=Rovastar & Fvese - Stranger Minds.milk" "../../3rdparty/libprojectm/presets/Rovastar & Fvese - Stranger Minds.milk" File "/oname=Rovastar & Geiss - Approach (Vectrip Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar & Geiss - Approach (Vectrip Mix).milk" File "/oname=Rovastar & Geiss - Bipolar 2 (Vectrip Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar & Geiss - Bipolar 2 (Vectrip Mix).milk" File "/oname=Rovastar & Geiss - Dynamic Swirls 3 (Broken Destiny Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar & Geiss - Dynamic Swirls 3 (Broken Destiny Mix).milk" File "/oname=Rovastar & Geiss - Dynamic Swirls 3 (Mysticial Awakening Mi.milk" "../../3rdparty/libprojectm/presets/Rovastar & Geiss - Dynamic Swirls 3 (Mysticial Awakening Mi.milk" File "/oname=Rovastar & Geiss - Dynamic Swirls 3 (Poltergiest Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar & Geiss - Dynamic Swirls 3 (Poltergiest Mix).milk" File "/oname=Rovastar & Geiss - Dynamic Swirls 3 (Smoke Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar & Geiss - Dynamic Swirls 3 (Smoke Mix).milk" File "/oname=Rovastar & Geiss - Dynamic Swirls 3 (Smoking Delusion Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar & Geiss - Dynamic Swirls 3 (Smoking Delusion Mix).milk" File "/oname=Rovastar & Geiss - Dynamic Swirls 3 (Voyage Of Twisted Soul.milk" "../../3rdparty/libprojectm/presets/Rovastar & Geiss - Dynamic Swirls 3 (Voyage Of Twisted Soul.milk" File "/oname=Rovastar & Geiss - Ice Planet.milk" "../../3rdparty/libprojectm/presets/Rovastar & Geiss - Ice Planet.milk" File "/oname=Rovastar & Geiss - Octoplasm.milk" "../../3rdparty/libprojectm/presets/Rovastar & Geiss - Octoplasm.milk" File "/oname=Rovastar & Geiss - Octotrip.milk" "../../3rdparty/libprojectm/presets/Rovastar & Geiss - Octotrip.milk" File "/oname=Rovastar & Geiss - Octotrip (MultiTrip Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar & Geiss - Octotrip (MultiTrip Mix).milk" File "/oname=Rovastar - Halcyon Dreams 3.milk" "../../3rdparty/libprojectm/presets/Rovastar - Halcyon Dreams 3.milk" File "/oname=Rovastar - Hallucinogenic Pyramids (Beat Time Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Hallucinogenic Pyramids (Beat Time Mix).milk" File "/oname=Rovastar - Harlequin's Delight (Endless Tunnel Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Harlequin's Delight (Endless Tunnel Mix).milk" File "/oname=Rovastar - Harlequin's Dynamic Fractal 1.milk" "../../3rdparty/libprojectm/presets/Rovastar - Harlequin's Dynamic Fractal 1.milk" File "/oname=Rovastar - Harlequin's Dynamic Fractal 2.milk" "../../3rdparty/libprojectm/presets/Rovastar - Harlequin's Dynamic Fractal 2.milk" File "/oname=Rovastar - Harlequin's Dynamic Fractal 3.milk" "../../3rdparty/libprojectm/presets/Rovastar - Harlequin's Dynamic Fractal 3.milk" File "/oname=Rovastar - Harlequin's Dynamic Fractal (Crazed Spiral Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Harlequin's Dynamic Fractal (Crazed Spiral Mix).milk" File "/oname=Rovastar - Harlequin's Dynamic Fractal (Dual Spiral Mix ).milk" "../../3rdparty/libprojectm/presets/Rovastar - Harlequin's Dynamic Fractal (Dual Spiral Mix ).milk" File "/oname=Rovastar - Harlequin's Fractal Encounter 2.milk" "../../3rdparty/libprojectm/presets/Rovastar - Harlequin's Fractal Encounter 2.milk" File "/oname=Rovastar - Harlequin's Fractal Encounter.milk" "../../3rdparty/libprojectm/presets/Rovastar - Harlequin's Fractal Encounter.milk" File "/oname=Rovastar - Harlequin's Spirit.milk" "../../3rdparty/libprojectm/presets/Rovastar - Harlequin's Spirit.milk" File "/oname=Rovastar - Harlequin's Spirit (Twisted Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Harlequin's Spirit (Twisted Mix).milk" File "/oname=Rovastar - Hyperspace (Frozen Rapture Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Hyperspace (Frozen Rapture Mix).milk" File "/oname=Rovastar - Hyperspace (Hyper Speed Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Hyperspace (Hyper Speed Mix).milk" File "/oname=Rovastar - Hyperspace.milk" "../../3rdparty/libprojectm/presets/Rovastar - Hyperspace.milk" File "/oname=Rovastar & Idiot24-7 - Balk Acid.milk" "../../3rdparty/libprojectm/presets/Rovastar & Idiot24-7 - Balk Acid.milk" File "/oname=Rovastar & Idiot24-7 - Mixed Emotions (Harlequin's Shame Mi.milk" "../../3rdparty/libprojectm/presets/Rovastar & Idiot24-7 - Mixed Emotions (Harlequin's Shame Mi.milk" File "/oname=Rovastar & Idiot24-7 - Mixed Emotions (Harlequin's Shame Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar & Idiot24-7 - Mixed Emotions (Harlequin's Shame Mix).milk" File "/oname=Rovastar & Illusion - Shifting Sphere.milk" "../../3rdparty/libprojectm/presets/Rovastar & Illusion - Shifting Sphere.milk" File "/oname=Rovastar - Inner Thoughts (Clouded Judgement Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Inner Thoughts (Clouded Judgement Mix).milk" File "/oname=Rovastar - Inner Thoughts (Dark Secret Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Inner Thoughts (Dark Secret Mix).milk" File "/oname=Rovastar - Inner Thoughts (Distant Memories Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Inner Thoughts (Distant Memories Mix).milk" File "/oname=Rovastar - Inner Thoughts (Frantic Thoughts Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Inner Thoughts (Frantic Thoughts Mix).milk" File "/oname=Rovastar - Inner Thoughts (Strange Cargo Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Inner Thoughts (Strange Cargo Mix).milk" File "/oname=Rovastar - Kalideostars (Altars Of Madness MIx).milk" "../../3rdparty/libprojectm/presets/Rovastar - Kalideostars (Altars Of Madness MIx).milk" File "/oname=Rovastar - Kalideostars.milk" "../../3rdparty/libprojectm/presets/Rovastar - Kalideostars.milk" File "/oname=Rovastar - Kalideostars (Round Round Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Kalideostars (Round Round Mix).milk" File "/oname=Rovastar & Krash - Cerebral Demons.milk" "../../3rdparty/libprojectm/presets/Rovastar & Krash - Cerebral Demons.milk" File "/oname=Rovastar & Krash - Flowing Synergy.milk" "../../3rdparty/libprojectm/presets/Rovastar & Krash - Flowing Synergy.milk" File "/oname=Rovastar & Krash - Interwoven (Contra Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar & Krash - Interwoven (Contra Mix).milk" File "/oname=Rovastar - LabFunk.milk" "../../3rdparty/libprojectm/presets/Rovastar - LabFunk.milk" File "/oname=Rovastar - Lost Souls of the Bermuda Triangle (Darkest Soul.milk" "../../3rdparty/libprojectm/presets/Rovastar - Lost Souls of the Bermuda Triangle (Darkest Soul.milk" File "/oname=Rovastar - Magic Carpet.milk" "../../3rdparty/libprojectm/presets/Rovastar - Magic Carpet.milk" File "/oname=Rovastar - Mosaics Of Ages.milk" "../../3rdparty/libprojectm/presets/Rovastar - Mosaics Of Ages.milk" File "/oname=Rovastar - Multiverse Starfield 1.milk" "../../3rdparty/libprojectm/presets/Rovastar - Multiverse Starfield 1.milk" File "/oname=Rovastar - Multiverse Starfield 3.milk" "../../3rdparty/libprojectm/presets/Rovastar - Multiverse Starfield 3.milk" File "/oname=Rovastar - Omnipresence Resurrection.milk" "../../3rdparty/libprojectm/presets/Rovastar - Omnipresence Resurrection.milk" File "/oname=Rovastar - Omnipresence Resurrection (Raw Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Omnipresence Resurrection (Raw Mix).milk" File "/oname=Rovastar - Oozing Resistance.milk" "../../3rdparty/libprojectm/presets/Rovastar - Oozing Resistance.milk" File "/oname=Rovastar - Pandora's Volcano.milk" "../../3rdparty/libprojectm/presets/Rovastar - Pandora's Volcano.milk" File "/oname=Rovastar - Parallel Universe.milk" "../../3rdparty/libprojectm/presets/Rovastar - Parallel Universe.milk" File "/oname=Rovastar & Rocke - Answer.42 (Trippy S. Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar & Rocke - Answer.42 (Trippy S. Mix).milk" File "/oname=Rovastar & Rocke - Headspin.milk" "../../3rdparty/libprojectm/presets/Rovastar & Rocke - Headspin.milk" File "/oname=Rovastar & Rocke - Sugar Spun Sister.milk" "../../3rdparty/libprojectm/presets/Rovastar & Rocke - Sugar Spun Sister.milk" File "/oname=Rovastar - Sea Shells.milk" "../../3rdparty/libprojectm/presets/Rovastar - Sea Shells.milk" File "/oname=Rovastar - Snapshot Of Space.milk" "../../3rdparty/libprojectm/presets/Rovastar - Snapshot Of Space.milk" File "/oname=Rovastar - Solarized Space.milk" "../../3rdparty/libprojectm/presets/Rovastar - Solarized Space.milk" File "/oname=Rovastar - Solarized Space (Space DNA Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Solarized Space (Space DNA Mix).milk" File "/oname=Rovastar - Space.milk" "../../3rdparty/libprojectm/presets/Rovastar - Space.milk" File "/oname=Rovastar - Space (Twisted Dimension Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Space (Twisted Dimension Mix).milk" File "/oname=Rovastar & Sperl - Tuxflower.prjm" "../../3rdparty/libprojectm/presets/Rovastar & Sperl - Tuxflower.prjm" File "/oname=Rovastar - Starquake (Sunquake Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Starquake (Sunquake Mix).milk" File "/oname=Rovastar & StudioMusic - More Cherished Desires.milk" "../../3rdparty/libprojectm/presets/Rovastar & StudioMusic - More Cherished Desires.milk" File "/oname=Rovastar & StudioMusic - Twisted Spider Web.milk" "../../3rdparty/libprojectm/presets/Rovastar & StudioMusic - Twisted Spider Web.milk" File "/oname=Rovastar & Telek - Altars of Madness (Rolling Oceans Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar & Telek - Altars of Madness (Rolling Oceans Mix).milk" File "/oname=Rovastar & Telek - Cosmic Fireworks.milk" "../../3rdparty/libprojectm/presets/Rovastar & Telek - Cosmic Fireworks.milk" File "/oname=Rovastar - The Awakening.milk" "../../3rdparty/libprojectm/presets/Rovastar - The Awakening.milk" File "/oname=Rovastar - The Chaos Of Colours (Drifting Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - The Chaos Of Colours (Drifting Mix).milk" File "/oname=Rovastar - The Chaos Of Colours.milk" "../../3rdparty/libprojectm/presets/Rovastar - The Chaos Of Colours.milk" File "/oname=Rovastar - The Shroomery.milk" "../../3rdparty/libprojectm/presets/Rovastar - The Shroomery.milk" File "/oname=Rovastar - Timeless Voyage.milk" "../../3rdparty/libprojectm/presets/Rovastar - Timeless Voyage.milk" File "/oname=Rovastar - Touchdown on Mars (Detailed Pictures Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - Touchdown on Mars (Detailed Pictures Mix).milk" File "/oname=Rovastar - Tripmaker.milk" "../../3rdparty/libprojectm/presets/Rovastar - Tripmaker.milk" File "/oname=Rovastar - twisted bytes.milk" "../../3rdparty/libprojectm/presets/Rovastar - twisted bytes.milk" File "/oname=Rovastar & Unchained - Ambrosia Mystic (Dark Heart Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar & Unchained - Ambrosia Mystic (Dark Heart Mix).milk" File "/oname=Rovastar & Unchained - Centre Of Gravity.milk" "../../3rdparty/libprojectm/presets/Rovastar & Unchained - Centre Of Gravity.milk" File "/oname=Rovastar & Unchained - Demonology (Vampire Soul Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar & Unchained - Demonology (Vampire Soul Mix).milk" File "/oname=Rovastar & Unchained - Oddball World.milk" "../../3rdparty/libprojectm/presets/Rovastar & Unchained - Oddball World.milk" File "/oname=Rovastar & Unchained - Voodoo Chess Magnet (Everglow Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar & Unchained - Voodoo Chess Magnet (Everglow Mix).milk" File "/oname=Rovastar & Unchained - Xen Traffic.milk" "../../3rdparty/libprojectm/presets/Rovastar & Unchained - Xen Traffic.milk" File "/oname=Rovastar - VooV's Movement (After Dark Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar - VooV's Movement (After Dark Mix).milk" File "/oname=Rovastar - VooV's Movement.milk" "../../3rdparty/libprojectm/presets/Rovastar - VooV's Movement.milk" File "/oname=Rovastar & Zylot - Azirphaeli's Plan (Multiplan Mix).milk" "../../3rdparty/libprojectm/presets/Rovastar & Zylot - Azirphaeli's Plan (Multiplan Mix).milk" File "/oname=Rovastar & Zylot - Narell's Fever.milk" "../../3rdparty/libprojectm/presets/Rovastar & Zylot - Narell's Fever.milk" File "/oname=Rovastar & Zylot - Passion Flower.milk" "../../3rdparty/libprojectm/presets/Rovastar & Zylot - Passion Flower.milk" File "/oname=Rovastar & Zylot - Sea Of Zigrot.milk" "../../3rdparty/libprojectm/presets/Rovastar & Zylot - Sea Of Zigrot.milk" File "/oname=Rozzer & Zylot - Force Field Generator (Slowtime Tweak).milk" "../../3rdparty/libprojectm/presets/Rozzer & Zylot - Force Field Generator (Slowtime Tweak).milk" File "/oname=Rozzor & Aderrasi - Canon.milk" "../../3rdparty/libprojectm/presets/Rozzor & Aderrasi - Canon.milk" File "/oname=Rozzor and che - Inside the House of nil.milk" "../../3rdparty/libprojectm/presets/Rozzor and che - Inside the House of nil.milk" File "/oname=Rozzor and Idiot - Any Other Deep Rising.milk" "../../3rdparty/libprojectm/presets/Rozzor and Idiot - Any Other Deep Rising.milk" File "/oname=Rozzor and Rovastar - Altars Of Madness 3 (ooze tweak).milk" "../../3rdparty/libprojectm/presets/Rozzor and Rovastar - Altars Of Madness 3 (ooze tweak).milk" File "/oname=Rozzor and Rovastar - Altars Of Madness 3 (ooze tweak with .milk" "../../3rdparty/libprojectm/presets/Rozzor and Rovastar - Altars Of Madness 3 (ooze tweak with .milk" File "/oname=Rozzor and StudioMusic - Vertigyny (Geiss shape mod).milk" "../../3rdparty/libprojectm/presets/Rozzor and StudioMusic - Vertigyny (Geiss shape mod).milk" File "/oname=Rozzor and Zylot - Associative Order.milk" "../../3rdparty/libprojectm/presets/Rozzor and Zylot - Associative Order.milk" File "/oname=Rozzor & Che - Inside The House Of Nil.milk" "../../3rdparty/libprojectm/presets/Rozzor & Che - Inside The House Of Nil.milk" File "/oname=Rozzor - Learning Curve (Invert tweak).milk" "../../3rdparty/libprojectm/presets/Rozzor - Learning Curve (Invert tweak).milk" File "/oname=Rozzor & Rovastar - Oozing Resistance (Waveform Mod).milk" "../../3rdparty/libprojectm/presets/Rozzor & Rovastar - Oozing Resistance (Waveform Mod).milk" File "/oname=shifter - escape the worm - Eo.S. + Phat 5362.milk" "../../3rdparty/libprojectm/presets/shifter - escape the worm - Eo.S. + Phat 5362.milk" File "/oname=shifter - escape the worm - Eo.S. + Phat - Before_It_Eats_Your_Brain_Mix_v2.milk" "../../3rdparty/libprojectm/presets/shifter - escape the worm - Eo.S. + Phat - Before_It_Eats_Your_Brain_Mix_v2.milk" File "/oname=StudioMusic Aderrasi & nil - LA movement (Intellectual Sens.milk" "../../3rdparty/libprojectm/presets/StudioMusic Aderrasi & nil - LA movement (Intellectual Sens.milk" File "/oname=Studio Music and Unchained - Rapid Alteration.milk" "../../3rdparty/libprojectm/presets/Studio Music and Unchained - Rapid Alteration.milk" File "/oname=Studio Music - Cherished Desires.milk" "../../3rdparty/libprojectm/presets/Studio Music - Cherished Desires.milk" File "/oname=StudioMusic - Harmonic Bliss (elated mix).milk" "../../3rdparty/libprojectm/presets/StudioMusic - Harmonic Bliss (elated mix).milk" File "/oname=StudioMusic - It's Only Make Believe.milk" "../../3rdparty/libprojectm/presets/StudioMusic - It's Only Make Believe.milk" File "/oname=StudioMusic - Numerosity.milk" "../../3rdparty/libprojectm/presets/StudioMusic - Numerosity.milk" File "/oname=StudioMusic - Twisted Galaxy.milk" "../../3rdparty/libprojectm/presets/StudioMusic - Twisted Galaxy.milk" File "/oname=StudioMusic & Unchained - Entity.milk" "../../3rdparty/libprojectm/presets/StudioMusic & Unchained - Entity.milk" File "/oname=StudioMusic & Unchained - Minor Alteration.milk" "../../3rdparty/libprojectm/presets/StudioMusic & Unchained - Minor Alteration.milk" File "/oname=StudioMusic & Unchained - So Much Love.milk" "../../3rdparty/libprojectm/presets/StudioMusic & Unchained - So Much Love.milk" File "/oname=StudioMusic & Unchained - State Of Discretion.milk" "../../3rdparty/libprojectm/presets/StudioMusic & Unchained - State Of Discretion.milk" File "/oname=StudioMusic & Unchained - Wrenched Fate.milk" "../../3rdparty/libprojectm/presets/StudioMusic & Unchained - Wrenched Fate.milk" File "/oname=TEcHNO and SandStorm - Psychodelic Highway.milk" "../../3rdparty/libprojectm/presets/TEcHNO and SandStorm - Psychodelic Highway.milk" File "/oname=Telek - City Helix Lattice.milk" "../../3rdparty/libprojectm/presets/Telek - City Helix Lattice.milk" File "/oname=Telek - Directive Swagger (Spectral Inferno) (fix...) maybe.milk" "../../3rdparty/libprojectm/presets/Telek - Directive Swagger (Spectral Inferno) (fix...) maybe.milk" File "/oname=Telek EMPR - Scanner - Trust me I've got a Melways.milk" "../../3rdparty/libprojectm/presets/Telek EMPR - Scanner - Trust me I've got a Melways.milk" File "/oname=Telek - Flicker.milk" "../../3rdparty/libprojectm/presets/Telek - Flicker.milk" File "/oname=Telek - Flicker (xis).milk" "../../3rdparty/libprojectm/presets/Telek - Flicker (xis).milk" File "/oname=Telek - Lost Star (Flash).milk" "../../3rdparty/libprojectm/presets/Telek - Lost Star (Flash).milk" File "/oname=Telek - Recirculate (Cool).milk" "../../3rdparty/libprojectm/presets/Telek - Recirculate (Cool).milk" File "/oname=Telek - Sine Wave.milk" "../../3rdparty/libprojectm/presets/Telek - Sine Wave.milk" File "/oname=Telek - Slow Shift Matrix (bb4.5).milk" "../../3rdparty/libprojectm/presets/Telek - Slow Shift Matrix (bb4.5).milk" File "/oname=Telek - Slow Shift Matrix (Ethereal Drift).milk" "../../3rdparty/libprojectm/presets/Telek - Slow Shift Matrix (Ethereal Drift).milk" File "/oname=Telek - Slow Shift Matrix.milk" "../../3rdparty/libprojectm/presets/Telek - Slow Shift Matrix.milk" File "/oname=Telek - Slow Thing (Spiderman Mix).milk" "../../3rdparty/libprojectm/presets/Telek - Slow Thing (Spiderman Mix).milk" File "/oname=Telek - Spiral Tabletop (New and Improved!).milk" "../../3rdparty/libprojectm/presets/Telek - Spiral Tabletop (New and Improved!).milk" File "/oname=Telek - Spokes (More Dynamic).milk" "../../3rdparty/libprojectm/presets/Telek - Spokes (More Dynamic).milk" File "/oname=Telek - Target Practice (tracking retreat slide).milk" "../../3rdparty/libprojectm/presets/Telek - Target Practice (tracking retreat slide).milk" File "/oname=TobiasWolfBoi - Cataract.milk" "../../3rdparty/libprojectm/presets/TobiasWolfBoi - Cataract.milk" File "/oname=TobiasWolfBoi - The Pit.milk" "../../3rdparty/libprojectm/presets/TobiasWolfBoi - The Pit.milk" File "/oname=Tschoey - Music Flower.milk" "../../3rdparty/libprojectm/presets/Tschoey - Music Flower.milk" File "/oname=Tux.tga" "../../3rdparty/libprojectm/presets/Tux.tga" File "/oname=Unchained - All You Can Eat.milk" "../../3rdparty/libprojectm/presets/Unchained - All You Can Eat.milk" File "/oname=Unchained - A Matter Of Taste (Remix).milk" "../../3rdparty/libprojectm/presets/Unchained - A Matter Of Taste (Remix).milk" File "/oname=Unchained - Bad Karma Oddnezz Style.milk" "../../3rdparty/libprojectm/presets/Unchained - Bad Karma Oddnezz Style.milk" File "/oname=Unchained - Beat Demo 1.0.milk" "../../3rdparty/libprojectm/presets/Unchained - Beat Demo 1.0.milk" File "/oname=Unchained - Beat Demo 10.milk" "../../3rdparty/libprojectm/presets/Unchained - Beat Demo 10.milk" File "/oname=Unchained - Beat Demo 2.0.milk" "../../3rdparty/libprojectm/presets/Unchained - Beat Demo 2.0.milk" File "/oname=Unchained - Beat Demo 2.1.milk" "../../3rdparty/libprojectm/presets/Unchained - Beat Demo 2.1.milk" File "/oname=Unchained - Beat Demo 2.2.milk" "../../3rdparty/libprojectm/presets/Unchained - Beat Demo 2.2.milk" File "/oname=Unchained - Beat Demo 2.3.milk" "../../3rdparty/libprojectm/presets/Unchained - Beat Demo 2.3.milk" File "/oname=Unchained - Beat Demo (Demonology Mix).milk" "../../3rdparty/libprojectm/presets/Unchained - Beat Demo (Demonology Mix).milk" File "/oname=Unchained - Cartoon Factory.milk" "../../3rdparty/libprojectm/presets/Unchained - Cartoon Factory.milk" File "/oname=Unchained & Che - Oddnezz 3.milk" "../../3rdparty/libprojectm/presets/Unchained & Che - Oddnezz 3.milk" File "/oname=Unchained & Che - Oddnezz 4 (Done it again).milk" "../../3rdparty/libprojectm/presets/Unchained & Che - Oddnezz 4 (Done it again).milk" File "/oname=Unchained - Cranked On Failure.milk" "../../3rdparty/libprojectm/presets/Unchained - Cranked On Failure.milk" File "/oname=Unchained & CTho - Bad Vibes.milk" "../../3rdparty/libprojectm/presets/Unchained & CTho - Bad Vibes.milk" File "/oname=Unchained - Custom Gramatix (Remix).milk" "../../3rdparty/libprojectm/presets/Unchained - Custom Gramatix (Remix).milk" File "/oname=Unchained - Deeper Logic.milk" "../../3rdparty/libprojectm/presets/Unchained - Deeper Logic.milk" File "/oname=Unchained - Free to Feel (Valium Remix).milk" "../../3rdparty/libprojectm/presets/Unchained - Free to Feel (Valium Remix).milk" File "/oname=Unchained - French Clothing.milk" "../../3rdparty/libprojectm/presets/Unchained - French Clothing.milk" File "/oname=Unchained - Games With Light & Sound.milk" "../../3rdparty/libprojectm/presets/Unchained - Games With Light & Sound.milk" File "/oname=Unchained - Ghostlight Whisper.milk" "../../3rdparty/libprojectm/presets/Unchained - Ghostlight Whisper.milk" File "/oname=Unchained - God Of The Game (Remix).milk" "../../3rdparty/libprojectm/presets/Unchained - God Of The Game (Remix).milk" File "/oname=Unchained - Goofy Beat Detection.milk" "../../3rdparty/libprojectm/presets/Unchained - Goofy Beat Detection.milk" File "/oname=Unchained - Goo Kung Fu.milk" "../../3rdparty/libprojectm/presets/Unchained - Goo Kung Fu.milk" File "/oname=Unchained - Housed In A Childish Mind.milk" "../../3rdparty/libprojectm/presets/Unchained - Housed In A Childish Mind.milk" File "/oname=Unchained & Illusion - Dual Wave 3.milk" "../../3rdparty/libprojectm/presets/Unchained & Illusion - Dual Wave 3.milk" File "/oname=Unchained & Illusion - Logic Morph.milk" "../../3rdparty/libprojectm/presets/Unchained & Illusion - Logic Morph.milk" File "/oname=Unchained & Illusion - Spirit Morph.milk" "../../3rdparty/libprojectm/presets/Unchained & Illusion - Spirit Morph.milk" File "/oname=Unchained - In Memory Of Peg.milk" "../../3rdparty/libprojectm/presets/Unchained - In Memory Of Peg.milk" File "/oname=Unchained - Invariant Under Rigorous Motions.milk" "../../3rdparty/libprojectm/presets/Unchained - Invariant Under Rigorous Motions.milk" File "/oname=Unchained - Jaded Emotion.milk" "../../3rdparty/libprojectm/presets/Unchained - Jaded Emotion.milk" File "/oname=Unchained - Jaundice.milk" "../../3rdparty/libprojectm/presets/Unchained - Jaundice.milk" File "/oname=Unchained - Making a Science of It 4.milk" "../../3rdparty/libprojectm/presets/Unchained - Making a Science of It 4.milk" File "/oname=Unchained - Morat's Final Voyage.milk" "../../3rdparty/libprojectm/presets/Unchained - Morat's Final Voyage.milk" File "/oname=Unchained - Non-Professional Music Analyzer.milk" "../../3rdparty/libprojectm/presets/Unchained - Non-Professional Music Analyzer.milk" File "/oname=Unchained - Painful Plasma (Multi-Wave Mirrored Rage) -- Ro.milk" "../../3rdparty/libprojectm/presets/Unchained - Painful Plasma (Multi-Wave Mirrored Rage) -- Ro.milk" File "/oname=Unchained - Perverted Dialect.milk" "../../3rdparty/libprojectm/presets/Unchained - Perverted Dialect.milk" File "/oname=Unchained - Picture Of Exile.milk" "../../3rdparty/libprojectm/presets/Unchained - Picture Of Exile.milk" File "/oname=Unchained - Picture Of Nectar.milk" "../../3rdparty/libprojectm/presets/Unchained - Picture Of Nectar.milk" File "/oname=Unchained - Picture Of Poison.milk" "../../3rdparty/libprojectm/presets/Unchained - Picture Of Poison.milk" File "/oname=Unchained - ReAwoke.milk" "../../3rdparty/libprojectm/presets/Unchained - ReAwoke.milk" File "/oname=Unchained - Resistance.milk" "../../3rdparty/libprojectm/presets/Unchained - Resistance.milk" File "/oname=Unchained - Ribald Ballad.milk" "../../3rdparty/libprojectm/presets/Unchained - Ribald Ballad.milk" File "/oname=Unchained & Rovastar - For The Seagull.milk" "../../3rdparty/libprojectm/presets/Unchained & Rovastar - For The Seagull.milk" File "/oname=Unchained & Rovastar - Luckless.milk" "../../3rdparty/libprojectm/presets/Unchained & Rovastar - Luckless.milk" File "/oname=Unchained & Rovastar - Rainbow Obscura.milk" "../../3rdparty/libprojectm/presets/Unchained & Rovastar - Rainbow Obscura.milk" File "/oname=Unchained & Rovastar - Slow Solstice.milk" "../../3rdparty/libprojectm/presets/Unchained & Rovastar - Slow Solstice.milk" File "/oname=Unchained & Rovastar - Triptionary.milk" "../../3rdparty/libprojectm/presets/Unchained & Rovastar - Triptionary.milk" File "/oname=Unchained & Rovastar - Wormhole Pillars (Hall of Shadows mi.milk" "../../3rdparty/libprojectm/presets/Unchained & Rovastar - Wormhole Pillars (Hall of Shadows mi.milk" File "/oname=Unchained & Rovastar - Wormhole Pillars.milk" "../../3rdparty/libprojectm/presets/Unchained & Rovastar - Wormhole Pillars.milk" File "/oname=Unchained & Rovastar - Xen Traffic.milk" "../../3rdparty/libprojectm/presets/Unchained & Rovastar - Xen Traffic.milk" File "/oname=Unchained - Shaping The Grid.milk" "../../3rdparty/libprojectm/presets/Unchained - Shaping The Grid.milk" File "/oname=Unchained - Subjective Experience Of The Manifold.milk" "../../3rdparty/libprojectm/presets/Unchained - Subjective Experience Of The Manifold.milk" File "/oname=Unchained - Unclaimed Wreckage 2 (Shamanic).milk" "../../3rdparty/libprojectm/presets/Unchained - Unclaimed Wreckage 2 (Shamanic).milk" File "/oname=Unchained - Unclaimed Wreckage.milk" "../../3rdparty/libprojectm/presets/Unchained - Unclaimed Wreckage.milk" File "/oname=Unchained - Unified Drag 2.milk" "../../3rdparty/libprojectm/presets/Unchained - Unified Drag 2.milk" File "/oname=Unchained - ventilation.milk" "../../3rdparty/libprojectm/presets/Unchained - ventilation.milk" File "/oname=Unchained - Working the Grid.milk" "../../3rdparty/libprojectm/presets/Unchained - Working the Grid.milk" File "/oname=Zylot & Aderrasi - Oceanic Bassograph (New Jersey Shore Mix.milk" "../../3rdparty/libprojectm/presets/Zylot & Aderrasi - Oceanic Bassograph (New Jersey Shore Mix.milk" File "/oname=Zylot and Rovastar - Iouo Stone Morphic Fusion.milk" "../../3rdparty/libprojectm/presets/Zylot and Rovastar - Iouo Stone Morphic Fusion.milk" File "/oname=Zylot - Azirphaeli's Mirror.milk" "../../3rdparty/libprojectm/presets/Zylot - Azirphaeli's Mirror.milk" File "/oname=Zylot - Block Of Sound (Abstract Architecture Mix).milk" "../../3rdparty/libprojectm/presets/Zylot - Block Of Sound (Abstract Architecture Mix).milk" File "/oname=Zylot - Block Of Sound (Fractal Construction Mix).milk" "../../3rdparty/libprojectm/presets/Zylot - Block Of Sound (Fractal Construction Mix).milk" File "/oname=Zylot - Color Of Music.milk" "../../3rdparty/libprojectm/presets/Zylot - Color Of Music.milk" File "/oname=Zylot - Crystal Ball (Magical Reaction Mix).milk" "../../3rdparty/libprojectm/presets/Zylot - Crystal Ball (Magical Reaction Mix).milk" File "/oname=Zylot - De(-a)range(d)(ment) complex.milk" "../../3rdparty/libprojectm/presets/Zylot - De(-a)range(d)(ment) complex.milk" File "/oname=Zylot - De(-a)range(d)(ment) strain.milk" "../../3rdparty/libprojectm/presets/Zylot - De(-a)range(d)(ment) strain.milk" File "/oname=Zylot - Digiscape Advanced Processor.milk" "../../3rdparty/libprojectm/presets/Zylot - Digiscape Advanced Processor.milk" File "/oname=Zylot - Ether Storm.milk" "../../3rdparty/libprojectm/presets/Zylot - Ether Storm.milk" File "/oname=Zylot - Global Earthquake.milk" "../../3rdparty/libprojectm/presets/Zylot - Global Earthquake.milk" File "/oname=Zylot & Idiot - ATan2 Demo (Spiraling Mad Mix).milk" "../../3rdparty/libprojectm/presets/Zylot & Idiot - ATan2 Demo (Spiraling Mad Mix).milk" File "/oname=Zylot - Inside The Planar Portal.milk" "../../3rdparty/libprojectm/presets/Zylot - Inside The Planar Portal.milk" File "/oname=Zylot & Krash - Extremophile.milk" "../../3rdparty/libprojectm/presets/Zylot & Krash - Extremophile.milk" File "/oname=Zylot - light of the path.milk" "../../3rdparty/libprojectm/presets/Zylot - light of the path.milk" File "/oname=Zylot - Mixing Pot.milk" "../../3rdparty/libprojectm/presets/Zylot - Mixing Pot.milk" File "/oname=Zylot & Mstress - Celebrate.milk" "../../3rdparty/libprojectm/presets/Zylot & Mstress - Celebrate.milk" File "/oname=Zylot & Mstress - Toxic Storm On Acid Sea (The End Of The W.milk" "../../3rdparty/libprojectm/presets/Zylot & Mstress - Toxic Storm On Acid Sea (The End Of The W.milk" File "/oname=Zylot - Puddle Of Music.milk" "../../3rdparty/libprojectm/presets/Zylot - Puddle Of Music.milk" File "/oname=Zylot - Rainbow Planet Under Attack.milk" "../../3rdparty/libprojectm/presets/Zylot - Rainbow Planet Under Attack.milk" File "/oname=Zylot & Rovastar - Crystal Ball (Cerimonial Decor Mix).milk" "../../3rdparty/libprojectm/presets/Zylot & Rovastar - Crystal Ball (Cerimonial Decor Mix).milk" File "/oname=Zylot - Rush.milk" "../../3rdparty/libprojectm/presets/Zylot - Rush.milk" File "/oname=Zylot - S Pulse Virus.milk" "../../3rdparty/libprojectm/presets/Zylot - S Pulse Virus.milk" File "/oname=Zylot - String.milk" "../../3rdparty/libprojectm/presets/Zylot - String.milk" File "/oname=Zylot - Tangent Universe (Collapsed With Artifact Mix).milk" "../../3rdparty/libprojectm/presets/Zylot - Tangent Universe (Collapsed With Artifact Mix).milk" File "/oname=Zylot - The Deeper.milk" "../../3rdparty/libprojectm/presets/Zylot - The Deeper.milk" File "/oname=Zylot - The Inner Workings of my New Computer.milk" "../../3rdparty/libprojectm/presets/Zylot - The Inner Workings of my New Computer.milk" File "/oname=Zylot - Visionarie (geiss aspect ratio fix).milk" "../../3rdparty/libprojectm/presets/Zylot - Visionarie (geiss aspect ratio fix).milk" File "/oname=Zylot - Waves Of Blood.milk" "../../3rdparty/libprojectm/presets/Zylot - Waves Of Blood.milk" File "/oname=Zylot - Wisps.milk" "../../3rdparty/libprojectm/presets/Zylot - Wisps.milk" SectionEnd @NORMAL@Section "Start menu items" startmenu @NORMAL@ ; Create Start Menu folders and shortcuts. @NORMAL@ SetShellVarContext all @NORMAL@ @NORMAL@ CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}" @NORMAL@ CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\clementine.exe" @NORMAL@ CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall.lnk" "$INSTDIR\Uninstall.exe" @NORMAL@SectionEnd Section "Uninstaller" ; Create uninstaller WriteUninstaller "$INSTDIR\Uninstall.exe" @NORMAL@ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "${PRODUCT_NAME}" @NORMAL@ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\Uninstall.exe" @NORMAL@ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\clementine.ico" @NORMAL@ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_DISPLAY_VERSION}" @NORMAL@ WriteRegDWORD ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "VersionMajor" "${PRODUCT_VERSION_MAJOR}" @NORMAL@ WriteRegDWORD ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "VersionMinor" "${PRODUCT_VERSION_MINOR}" @NORMAL@ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" @NORMAL@ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" SectionEnd Section "Uninstall" ; Kill clementine.exe if it's running ; This calling convention is retarded... StrCpy $0 "clementine.exe" KillProc::FindProcesses StrCmp $1 "-1" wooops StrCmp $0 "0" completed DetailPrint "Killing running clementine.exe..." StrCpy $0 "clementine.exe" KillProc::KillProcesses StrCmp $1 "-1" wooops Sleep 2000 Goto completed wooops: DetailPrint "-> Error: Something went wrong while killing running clementine.exe" Abort completed: ; Delete all the files Delete "$INSTDIR\clementine.ico" Delete "$INSTDIR\clementine.exe" Delete "$INSTDIR\clementine-tagreader.exe" Delete "$INSTDIR\clementine-spotifyblob.exe" Delete "$INSTDIR\glew32.dll" Delete "$INSTDIR\libcdio-16.dll" Delete "$INSTDIR\libchromaprint.dll" Delete "$INSTDIR\libeay32.dll" Delete "$INSTDIR\libechonest.dll" Delete "$INSTDIR\libfaac.dll" Delete "$INSTDIR\libfaad.dll" Delete "$INSTDIR\libffi-6.dll" Delete "$INSTDIR\libfftw3-3.dll" Delete "$INSTDIR\libFLAC.dll" Delete "$INSTDIR\libgcc_s_sjlj-1.dll" Delete "$INSTDIR\libgcrypt-20.dll" Delete "$INSTDIR\libgio-2.0-0.dll" Delete "$INSTDIR\libglib-2.0-0.dll" Delete "$INSTDIR\libgmodule-2.0-0.dll" Delete "$INSTDIR\libgmp-10.dll" Delete "$INSTDIR\libgnutls-28.dll" Delete "$INSTDIR\libgobject-2.0-0.dll" Delete "$INSTDIR\libgpg-error-0.dll" Delete "$INSTDIR\libgpod.dll" Delete "$INSTDIR\libgstapp-1.0-0.dll" Delete "$INSTDIR\libgstaudio-1.0-0.dll" Delete "$INSTDIR\libgstbase-1.0-0.dll" Delete "$INSTDIR\libgstcontroller-1.0-0.dll" Delete "$INSTDIR\libgstfft-1.0-0.dll" Delete "$INSTDIR\libgstnet-1.0-0.dll" Delete "$INSTDIR\libgstpbutils-1.0-0.dll" Delete "$INSTDIR\libgstreamer-1.0-0.dll" Delete "$INSTDIR\libgstriff-1.0-0.dll" Delete "$INSTDIR\libgstrtp-1.0-0.dll" Delete "$INSTDIR\libgstrtsp-1.0-0.dll" Delete "$INSTDIR\libgstsdp-1.0-0.dll" Delete "$INSTDIR\libgsttag-1.0-0.dll" Delete "$INSTDIR\libgstvideo-1.0-0.dll" Delete "$INSTDIR\libgthread-2.0-0.dll" Delete "$INSTDIR\libhogweed-2-4.dll" Delete "$INSTDIR\libiconv-2.dll" Delete "$INSTDIR\libid3tag.dll" Delete "$INSTDIR\libintl-8.dll" Delete "$INSTDIR\liblastfm.dll" Delete "$INSTDIR\libmad.dll" Delete "$INSTDIR\libmms-0.dll" Delete "$INSTDIR\libmp3lame-0.dll" Delete "$INSTDIR\libnettle-4-6.dll" Delete "$INSTDIR\libogg-0.dll" Delete "$INSTDIR\liboil-0.3-0.dll" Delete "$INSTDIR\liborc-0.4-0.dll" Delete "$INSTDIR\liborc-test-0.4-0.dll" Delete "$INSTDIR\libplist.dll" Delete "$INSTDIR\libprotobuf-8.dll" Delete "$INSTDIR\libqjson.dll" Delete "$INSTDIR\libspeex-1.dll" Delete "$INSTDIR\libspotify.dll" Delete "$INSTDIR\libstdc++-6.dll" Delete "$INSTDIR\libtag.dll" Delete "$INSTDIR\libtasn1-6.dll" Delete "$INSTDIR\libvorbis-0.dll" Delete "$INSTDIR\libvorbisenc-2.dll" Delete "$INSTDIR\libxml2-2.dll" Delete "$INSTDIR\mingwm10.dll" Delete "$INSTDIR\pthreadGC2.dll" Delete "$INSTDIR\QtCore4.dll" Delete "$INSTDIR\QtGui4.dll" Delete "$INSTDIR\QtNetwork4.dll" Delete "$INSTDIR\QtOpenGL4.dll" Delete "$INSTDIR\QtSql4.dll" Delete "$INSTDIR\QtSvg4.dll" Delete "$INSTDIR\QtXml4.dll" Delete "$INSTDIR\ssleay32.dll" Delete "$INSTDIR\zlib1.dll" Delete "$INSTDIR\imageformats\qgif4.dll" Delete "$INSTDIR\imageformats\qjpeg4.dll" Delete "$INSTDIR\gstreamer-plugins\libgstapetag.dll" Delete "$INSTDIR\gstreamer-plugins\libgstapp.dll" Delete "$INSTDIR\gstreamer-plugins\libgstasf.dll" Delete "$INSTDIR\gstreamer-plugins\libgstaudioconvert.dll" Delete "$INSTDIR\gstreamer-plugins\libgstaudiofx.dll" Delete "$INSTDIR\gstreamer-plugins\libgstaudioparsers.dll" Delete "$INSTDIR\gstreamer-plugins\libgstaudioresample.dll" Delete "$INSTDIR\gstreamer-plugins\libgstaudiotestsrc.dll" Delete "$INSTDIR\gstreamer-plugins\libgstautodetect.dll" Delete "$INSTDIR\gstreamer-plugins\libgstcdio.dll" Delete "$INSTDIR\gstreamer-plugins\libgstcoreelements.dll" Delete "$INSTDIR\gstreamer-plugins\libgstdirectsoundsink.dll" Delete "$INSTDIR\gstreamer-plugins\libgstequalizer.dll" Delete "$INSTDIR\gstreamer-plugins\libgstfaac.dll" Delete "$INSTDIR\gstreamer-plugins\libgstfaad.dll" Delete "$INSTDIR\gstreamer-plugins\libgstflac.dll" Delete "$INSTDIR\gstreamer-plugins\libgstgdp.dll" Delete "$INSTDIR\gstreamer-plugins\libgstgio.dll" Delete "$INSTDIR\gstreamer-plugins\libgsticydemux.dll" Delete "$INSTDIR\gstreamer-plugins\libgstid3demux.dll" Delete "$INSTDIR\gstreamer-plugins\libgstisomp4.dll" Delete "$INSTDIR\gstreamer-plugins\libgstlame.dll" Delete "$INSTDIR\gstreamer-plugins\libgstlibav.dll" Delete "$INSTDIR\gstreamer-plugins\libgstmad.dll" Delete "$INSTDIR\gstreamer-plugins\libgstmms.dll" Delete "$INSTDIR\gstreamer-plugins\libgstogg.dll" Delete "$INSTDIR\gstreamer-plugins\libgstplayback.dll" Delete "$INSTDIR\gstreamer-plugins\libgstreplaygain.dll" Delete "$INSTDIR\gstreamer-plugins\libgstsouphttpsrc.dll" Delete "$INSTDIR\gstreamer-plugins\libgstspectrum.dll" Delete "$INSTDIR\gstreamer-plugins\libgstspeex.dll" Delete "$INSTDIR\gstreamer-plugins\libgsttaglib.dll" Delete "$INSTDIR\gstreamer-plugins\libgsttcp.dll" Delete "$INSTDIR\gstreamer-plugins\libgsttypefindfunctions.dll" Delete "$INSTDIR\gstreamer-plugins\libgstudp.dll" Delete "$INSTDIR\gstreamer-plugins\libgstvolume.dll" Delete "$INSTDIR\gstreamer-plugins\libgstvorbis.dll" Delete "$INSTDIR\gstreamer-plugins\libgstwavparse.dll" Delete "$INSTDIR\projectm-presets\Aderrasi - Agitator.milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Aimless (Gravity Directive Mix).milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Aimless (Spirogravity Mix).milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Airhandler (Menagerie Mix).milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Airs (Windy Mix).milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Anchorpulse (Pulse Of A Ghast II Mix).milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Anchorpulse (Verified Mix).milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Anomalous Material Science (Pure Splinter Mix).milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Antidote (Aqualung Mix).milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Antidote.milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Antidote (Side Effects Mix).milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Antique Abyss.milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Arise! (Padded Mix).milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Ashes Of Air (Remix).milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Bitterfeld (Crystal Border Mix).milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Blender.milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Bow To Gravity.milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Brakefreak.milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Candy Avian.milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Causeway Of Dreams.milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Causeway Of Dreams (Nightmare Mix).milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Causeway Of Dreams (REMix).milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Chromatic Abyss (The Other Side).milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Circlefacade.milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Contortion.milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Contortion (Xenomorph Mix).milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Crystal Storm.milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Dark Matter (Converse Mix).milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Elastoid.milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Floater Society.milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Flowing Form.milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Making Time (Swamp Mix).milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Potion of Spirits.milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Songflower (Moss Posy).milk" Delete "$INSTDIR\projectm-presets\Aderrasi - Spillswirl.milk" Delete "$INSTDIR\projectm-presets\Aderrasi - What cannot be.milk" Delete "$INSTDIR\projectm-presets\Aderrasi - What Cannot Be Undone.milk" Delete "$INSTDIR\projectm-presets\baked - mushroom rainbows[2].milk" Delete "$INSTDIR\projectm-presets\Bmelgren - Godhead.milk" Delete "$INSTDIR\projectm-presets\Bmelgren & Krash - Rainbow Orb Peacock (Centred Journey Mix.milk" Delete "$INSTDIR\projectm-presets\Bmelgren & Krash - Rainbow Orb Peacock (Lonely Signal Gone .milk" Delete "$INSTDIR\projectm-presets\Bmelgren - Pentultimate Nerual Slipstream (Tweak 2).milk" Delete "$INSTDIR\projectm-presets\Bmelgren - Take This Highway.milk" Delete "$INSTDIR\projectm-presets\che - adela the flower.milk" Delete "$INSTDIR\projectm-presets\Che - Burning Hus.milk" Delete "$INSTDIR\projectm-presets\che - burning hus (oil mix).milk" Delete "$INSTDIR\projectm-presets\Che - Escape.milk" Delete "$INSTDIR\projectm-presets\che - terracarbon stream.milk" Delete "$INSTDIR\projectm-presets\Che - Watch & Fly.milk" Delete "$INSTDIR\projectm-presets\CrystalHigh - mad ravetriping.milk" Delete "$INSTDIR\projectm-presets\DaNOnE - Highway to Heaven (rotating).milk" Delete "$INSTDIR\projectm-presets\EMPR - Random - Changing Polyevolution.milk" Delete "$INSTDIR\projectm-presets\EMPR - Random - Look mama I'm on TV! 2.milk" Delete "$INSTDIR\projectm-presets\EMPR - Random - They're so cute Dad can I keep one!.milk" Delete "$INSTDIR\projectm-presets\EMPR - Random - Turbulence Sandwich.milk" Delete "$INSTDIR\projectm-presets\Eo.S. - glowsticks v2 03 music.milk" Delete "$INSTDIR\projectm-presets\Eo.S. - glowsticks v2 04 music minimal.milk" Delete "$INSTDIR\projectm-presets\Eo.S. - glowsticks v2 05 and proton lights (+Krash's beat code) _Phat_remix02b.milk" Delete "$INSTDIR\projectm-presets\Eo.S. - glowsticks v2 05 and proton lights (+Krash's beat code) _Phat_remix07 recursive demons.milk" Delete "$INSTDIR\projectm-presets\Eo.S. - heater core C_Phat's_class + sparks_mix.milk" Delete "$INSTDIR\projectm-presets\Eo.S. - heater core C_Phat's_on route_mix+beam.milk" Delete "$INSTDIR\projectm-presets\Eo.S.+Phat - Arm_upgrades - transformer.milk" Delete "$INSTDIR\projectm-presets\Eo.S. + Phat - chasers 18 hallway.milk" Delete "$INSTDIR\projectm-presets\Eo.S.+Phat Cool Bug v2 + (Krash's beat detection).milk" Delete "$INSTDIR\projectm-presets\Eo.S. - repeater 05 - rave on acid.milk" Delete "$INSTDIR\projectm-presets\Eo.S. - repeater 15 - kaleidoscope b.milk" Delete "$INSTDIR\projectm-presets\EvilJim - Follow the ball.milk" Delete "$INSTDIR\projectm-presets\EvilJim - Ice Drops.milk" Delete "$INSTDIR\projectm-presets\fiShbRaiN - blueprint.milk" Delete "$INSTDIR\projectm-presets\Fvese - 0 To 60.milk" Delete "$INSTDIR\projectm-presets\Fvese - A Blur.milk" Delete "$INSTDIR\projectm-presets\Fvese & Idiot24-7 - Rearview Mirror.milk" Delete "$INSTDIR\projectm-presets\Fvese - Lifesavor Anyone.milk" Delete "$INSTDIR\projectm-presets\Fvese - New meetings.milk" Delete "$INSTDIR\projectm-presets\Fvese - Quicksand.milk" Delete "$INSTDIR\projectm-presets\Fvese - Round and Round (geiss gamma mix).milk" Delete "$INSTDIR\projectm-presets\Fvese - simple.milk" Delete "$INSTDIR\projectm-presets\Fvese - Stand Still!.milk" Delete "$INSTDIR\projectm-presets\Fvese - The Tunnel (Final Stage Mix).milk" Delete "$INSTDIR\projectm-presets\Fvese - Window Reflection 6.milk" Delete "$INSTDIR\projectm-presets\Fvese - Zoom Effects (Remix 2).milk" Delete "$INSTDIR\projectm-presets\Geiss - Aieeeeee!!!.milk" Delete "$INSTDIR\projectm-presets\Geiss and Rovastar - The Chaos Of Colours (sprouting diment.milk" Delete "$INSTDIR\projectm-presets\Geiss - Anomaly 1.milk" Delete "$INSTDIR\projectm-presets\Geiss - Anomaly 2.milk" Delete "$INSTDIR\projectm-presets\Geiss - Approach.milk" Delete "$INSTDIR\projectm-presets\Geiss - Asymptote.milk" Delete "$INSTDIR\projectm-presets\Geiss - Bass Kaleidosphere.milk" Delete "$INSTDIR\projectm-presets\Geiss - Bass Zoom.milk" Delete "$INSTDIR\projectm-presets\Geiss - Bipolar 1.milk" Delete "$INSTDIR\projectm-presets\Geiss - Bipolar 2.milk" Delete "$INSTDIR\projectm-presets\Geiss - Bipolar 3.milk" Delete "$INSTDIR\projectm-presets\Geiss - Bipolar 4.milk" Delete "$INSTDIR\projectm-presets\Geiss - Bipolar 5.milk" Delete "$INSTDIR\projectm-presets\Geiss - Blasto.milk" Delete "$INSTDIR\projectm-presets\Geiss - Bonfire.milk" Delete "$INSTDIR\projectm-presets\Geiss - Bright Fiber Matrix 1.milk" Delete "$INSTDIR\projectm-presets\Geiss - Bright Fiber Matrix 2.milk" Delete "$INSTDIR\projectm-presets\Geiss - Calligraphy.milk" Delete "$INSTDIR\projectm-presets\Geiss - Casino.milk" Delete "$INSTDIR\projectm-presets\Geiss - Cepiasound.milk" Delete "$INSTDIR\projectm-presets\Geiss - Churn.milk" Delete "$INSTDIR\projectm-presets\Geiss - Constant Velocity.milk" Delete "$INSTDIR\projectm-presets\Geiss - Coral.milk" Delete "$INSTDIR\projectm-presets\Geiss - Corpus Callosum.milk" Delete "$INSTDIR\projectm-presets\Geiss - Cosmic Dust 1.milk" Delete "$INSTDIR\projectm-presets\Geiss - Cosmic Dust 2.milk" Delete "$INSTDIR\projectm-presets\Geiss - Cruzin'.milk" Delete "$INSTDIR\projectm-presets\Geiss - Cycloid 1.milk" Delete "$INSTDIR\projectm-presets\Geiss - Cycloid 2.milk" Delete "$INSTDIR\projectm-presets\Geiss - Davod The Pod.milk" Delete "$INSTDIR\projectm-presets\Geiss - De La Moutard 1.milk" Delete "$INSTDIR\projectm-presets\Geiss - De La Moutard 2.milk" Delete "$INSTDIR\projectm-presets\Geiss - Demonic Distortion.milk" Delete "$INSTDIR\projectm-presets\Geiss - Descent.milk" Delete "$INSTDIR\projectm-presets\Geiss - Destruction.milk" Delete "$INSTDIR\projectm-presets\Geiss - Diffraction.milk" Delete "$INSTDIR\projectm-presets\Geiss - Digital Smoke.milk" Delete "$INSTDIR\projectm-presets\Geiss - Downward Spiral.milk" Delete "$INSTDIR\projectm-presets\Geiss - Drift.milk" Delete "$INSTDIR\projectm-presets\Geiss - Dynamic Swirls 1.milk" Delete "$INSTDIR\projectm-presets\Geiss - Dynamic Swirls 2.milk" Delete "$INSTDIR\projectm-presets\Geiss - Eddies 1.milk" Delete "$INSTDIR\projectm-presets\Geiss - Eddies 2.milk" Delete "$INSTDIR\projectm-presets\Geiss - Eggs.milk" Delete "$INSTDIR\projectm-presets\Geiss - El Cubismo.milk" Delete "$INSTDIR\projectm-presets\Geiss - Feedback 2.milk" Delete "$INSTDIR\projectm-presets\Geiss - Feedback.milk" Delete "$INSTDIR\projectm-presets\Geiss - Festive.milk" Delete "$INSTDIR\projectm-presets\Geiss - Fiberglass.milk" Delete "$INSTDIR\projectm-presets\Geiss - Flotsam.milk" Delete "$INSTDIR\projectm-presets\Geiss - Flower Blossom.milk" Delete "$INSTDIR\projectm-presets\Geiss - Flower.milk" Delete "$INSTDIR\projectm-presets\Geiss - Four Kinds of Amphetamines.milk" Delete "$INSTDIR\projectm-presets\Geiss - Galaxy 1.milk" Delete "$INSTDIR\projectm-presets\Geiss - Galaxy 2.milk" Delete "$INSTDIR\projectm-presets\Geiss - Greenland.milk" Delete "$INSTDIR\projectm-presets\Geiss - Heavenly 1.milk" Delete "$INSTDIR\projectm-presets\Geiss - Heavenly 2.milk" Delete "$INSTDIR\projectm-presets\Geiss - Heavenly 3.milk" Delete "$INSTDIR\projectm-presets\Geiss - High Dynamic Range.milk" Delete "$INSTDIR\projectm-presets\Geiss - Hovering.milk" Delete "$INSTDIR\projectm-presets\Geiss - Hyperion.milk" Delete "$INSTDIR\projectm-presets\Geiss - Inkblot.milk" Delete "$INSTDIR\projectm-presets\Geiss - Iris.milk" Delete "$INSTDIR\projectm-presets\Geiss - Journey.milk" Delete "$INSTDIR\projectm-presets\Geiss - Julia Fractal 1.milk" Delete "$INSTDIR\projectm-presets\Geiss - Julia Fractal 2.milk" Delete "$INSTDIR\projectm-presets\Geiss - Luz.milk" Delete "$INSTDIR\projectm-presets\Geiss - Mega Swirl 1.milk" Delete "$INSTDIR\projectm-presets\Geiss - Mega Swirl 2.milk" Delete "$INSTDIR\projectm-presets\Geiss - Mega Swirl 3.milk" Delete "$INSTDIR\projectm-presets\Geiss - Microcosm.milk" Delete "$INSTDIR\projectm-presets\Geiss - Monotone Ripples.milk" Delete "$INSTDIR\projectm-presets\Geiss - Music Box.milk" Delete "$INSTDIR\projectm-presets\Geiss - Nautilus.milk" Delete "$INSTDIR\projectm-presets\Geiss - Octopus Blue.milk" Delete "$INSTDIR\projectm-presets\Geiss - Octopus Ever Changing.milk" Delete "$INSTDIR\projectm-presets\Geiss - Octopus Fat and Ever Changing.milk" Delete "$INSTDIR\projectm-presets\Geiss - Octopus Gold.milk" Delete "$INSTDIR\projectm-presets\Geiss - Octopus Gold with Dots.milk" Delete "$INSTDIR\projectm-presets\Geiss - Octopus.milk" Delete "$INSTDIR\projectm-presets\Geiss - Oldskool Mellowstyle.milk" Delete "$INSTDIR\projectm-presets\Geiss - Pelota De Fuego.milk" Delete "$INSTDIR\projectm-presets\Geiss - Pinch.milk" Delete "$INSTDIR\projectm-presets\Geiss - Pistons.milk" Delete "$INSTDIR\projectm-presets\Geiss - Planet 1.milk" Delete "$INSTDIR\projectm-presets\Geiss - Planet 2.milk" Delete "$INSTDIR\projectm-presets\Geiss - Quasilinear Submanifolds.milk" Delete "$INSTDIR\projectm-presets\Geiss - Reducto Absurdum.milk" Delete "$INSTDIR\projectm-presets\Geiss - Reducto Ad Nauseum.milk" Delete "$INSTDIR\projectm-presets\Geiss - Rocket.milk" Delete "$INSTDIR\projectm-presets\Geiss & Rovastar - Julia Fractal (Vectrip Mix).milk" Delete "$INSTDIR\projectm-presets\Geiss & Rovastar - Notions Of Tonality 2.milk" Delete "$INSTDIR\projectm-presets\Geiss & Rovastar - The Chaos Of Colours (sprouting dimentia mix).milk" Delete "$INSTDIR\projectm-presets\Geiss & Rovastar - Tokamak (Naked Intrusion Mix).milk" Delete "$INSTDIR\projectm-presets\Geiss - Runoff.milk" Delete "$INSTDIR\projectm-presets\Geiss - Scary.milk" Delete "$INSTDIR\projectm-presets\Geiss - Script.milk" Delete "$INSTDIR\projectm-presets\Geiss - Serpent.milk" Delete "$INSTDIR\projectm-presets\Geiss - Shake.milk" Delete "$INSTDIR\projectm-presets\Geiss - Shift.milk" Delete "$INSTDIR\projectm-presets\Geiss - Sinews 1.milk" Delete "$INSTDIR\projectm-presets\Geiss - Sinews 2.milk" Delete "$INSTDIR\projectm-presets\Geiss - Smoke.milk" Delete "$INSTDIR\projectm-presets\Geiss - Solar Flare (Blue).milk" Delete "$INSTDIR\projectm-presets\Geiss - Solar Flare.milk" Delete "$INSTDIR\projectm-presets\Geiss - Solar Flare (Reptile).milk" Delete "$INSTDIR\projectm-presets\Geiss - Sound And The Fury.milk" Delete "$INSTDIR\projectm-presets\Geiss - Spacedust.milk" Delete "$INSTDIR\projectm-presets\Geiss - Space Voyage Bright.milk" Delete "$INSTDIR\projectm-presets\Geiss - Space Voyage (High-Warp).milk" Delete "$INSTDIR\projectm-presets\Geiss - Space Voyage.milk" Delete "$INSTDIR\projectm-presets\Geiss & Sperl - Feedback (projectM idle HDR mix).prjm" Delete "$INSTDIR\projectm-presets\Geiss - Starfish 1.milk" Delete "$INSTDIR\projectm-presets\Geiss - Starfish 2.milk" Delete "$INSTDIR\projectm-presets\Geiss - Sunsets.milk" Delete "$INSTDIR\projectm-presets\Geiss - Supernova 1.milk" Delete "$INSTDIR\projectm-presets\Geiss - Supernova 2.milk" Delete "$INSTDIR\projectm-presets\Geiss - Surface.milk" Delete "$INSTDIR\projectm-presets\Geiss - Swirl 1.milk" Delete "$INSTDIR\projectm-presets\Geiss - Swirl 2.milk" Delete "$INSTDIR\projectm-presets\Geiss - Swirlie 1.milk" Delete "$INSTDIR\projectm-presets\Geiss - Swirlie 2.milk" Delete "$INSTDIR\projectm-presets\Geiss - Swirlie 3.milk" Delete "$INSTDIR\projectm-presets\Geiss - Swirlie 4.milk" Delete "$INSTDIR\projectm-presets\Geiss - Swirlie 5.milk" Delete "$INSTDIR\projectm-presets\Geiss - Symmetry.milk" Delete "$INSTDIR\projectm-presets\Geiss - The Fatty Lumpkin Sunkle Tweaker.milk" Delete "$INSTDIR\projectm-presets\Geiss - Three And A Half Kinds Of Amphetamines.milk" Delete "$INSTDIR\projectm-presets\Geiss - Three Kinds Of Amphetamines.milk" Delete "$INSTDIR\projectm-presets\Geiss - Tokamak.milk" Delete "$INSTDIR\projectm-presets\Geiss - Tornado.milk" Delete "$INSTDIR\projectm-presets\Geiss - Toy.milk" Delete "$INSTDIR\projectm-presets\Geiss - Trampoline.milk" Delete "$INSTDIR\projectm-presets\Geiss - Tube.milk" Delete "$INSTDIR\projectm-presets\Geiss - Two-Pointed Pulsagon.milk" Delete "$INSTDIR\projectm-presets\Geiss - Ultrafast.milk" Delete "$INSTDIR\projectm-presets\Geiss - Volume Zoom.milk" Delete "$INSTDIR\projectm-presets\Geiss - Vortex 1.milk" Delete "$INSTDIR\projectm-presets\Geiss - Vortex 2.milk" Delete "$INSTDIR\projectm-presets\Geiss - Warp Of Dali 1.milk" Delete "$INSTDIR\projectm-presets\Geiss - Warp Of Dali 2.milk" Delete "$INSTDIR\projectm-presets\Geiss - Warp Of Dali Bright.milk" Delete "$INSTDIR\projectm-presets\Geiss - Waterfall.milk" Delete "$INSTDIR\projectm-presets\headphones.tga" Delete "$INSTDIR\projectm-presets\Idiot24-7 - Ascending to heaven 2.milk" Delete "$INSTDIR\projectm-presets\Idiot24-7 - Meeting place.milk" Delete "$INSTDIR\projectm-presets\Idiot - 9-7-02 (Remix) (sustain fixed).milk" Delete "$INSTDIR\projectm-presets\Idiot & Che - Various Abstract Effects.milk" Delete "$INSTDIR\projectm-presets\Idiot - Cortex (Spiritual Visions Mix).milk" Delete "$INSTDIR\projectm-presets\Idiot - Madness Within The Void (Remix).milk" Delete "$INSTDIR\projectm-presets\Idiot - MOTIVATION!.milk" Delete "$INSTDIR\projectm-presets\idiot - Nothing Yet - 03 - The worst of the pack.milk" Delete "$INSTDIR\projectm-presets\idiot - Nucleus.milk" Delete "$INSTDIR\projectm-presets\Idiot & Rovastar - Altars Of Madness 2 (X.42 Mix).milk" Delete "$INSTDIR\projectm-presets\idiot - Sinful Code (unchained style).milk" Delete "$INSTDIR\projectm-presets\idiot - Some big word I learned.milk" Delete "$INSTDIR\projectm-presets\idiot - Spectrum.milk" Delete "$INSTDIR\projectm-presets\Idiot - Tentacle Dreams (Remix).milk" Delete "$INSTDIR\projectm-presets\Idiot - Texture Boxes (Remix 2).milk" Delete "$INSTDIR\projectm-presets\Idiot - Texture Boxes (Remix).milk" Delete "$INSTDIR\projectm-presets\Idiot - Typomatic (Remix 2).milk" Delete "$INSTDIR\projectm-presets\Idiot - What Is.milk" Delete "$INSTDIR\projectm-presets\Idiot - What Shall Come.milk" Delete "$INSTDIR\projectm-presets\Idiot & Zylot - Unhealthy Love (Idiot's STDs Mix).milk" Delete "$INSTDIR\projectm-presets\Illusion & Che - Return Of The King.milk" Delete "$INSTDIR\projectm-presets\Illusion & Che - The Piper.milk" Delete "$INSTDIR\projectm-presets\Illusion - Figure Eight.milk" Delete "$INSTDIR\projectm-presets\Illusion - Heavenly Eye.milk" Delete "$INSTDIR\projectm-presets\Illusion & Rovastar - Clouded Bottle.milk" Delete "$INSTDIR\projectm-presets\Illusion & Rovastar - Snowflake Delight.milk" Delete "$INSTDIR\projectm-presets\Illusion & Rovastar - Snowflake Return.milk" Delete "$INSTDIR\projectm-presets\illusion & studio music - charged bliss.milk" Delete "$INSTDIR\projectm-presets\Illusion & Unchained - Frozen Eye 1.milk" Delete "$INSTDIR\projectm-presets\Illusion & Unchained - Invade My Mind.milk" Delete "$INSTDIR\projectm-presets\Illusion & Unchained - Re-Enter Homeworld.milk" Delete "$INSTDIR\projectm-presets\[Ishan] - Life in the drains.milk" Delete "$INSTDIR\projectm-presets\Jess - Trying To Trap A Twister.milk" Delete "$INSTDIR\projectm-presets\Krash - 3D Shapes Demo 2.milk" Delete "$INSTDIR\projectm-presets\Krash - 3D Shapes Demo.milk" Delete "$INSTDIR\projectm-presets\Krash and Fvese - Molten Indecision (Fvese Remix).milk" Delete "$INSTDIR\projectm-presets\Krash and Rovastar - Rainbow Orb.milk" Delete "$INSTDIR\projectm-presets\Krash - Digital Flame.milk" Delete "$INSTDIR\projectm-presets\Krash - Dynamic Borders 1.milk" Delete "$INSTDIR\projectm-presets\Krash - Framed Geometry.milk" Delete "$INSTDIR\projectm-presets\Krash & Idiot - Memories Of The Castle.milk" Delete "$INSTDIR\projectm-presets\Krash & Illusion - Indecisive Mosaic.milk" Delete "$INSTDIR\projectm-presets\Krash & Illusion - Spiral Movement.milk" Delete "$INSTDIR\projectm-presets\Krash - Pulse.milk" Delete "$INSTDIR\projectm-presets\Krash & Rovastar - Altars Of Madness (Mad Ocean Mix).milk" Delete "$INSTDIR\projectm-presets\Krash & Rovastar - A Million Miles from Earth (Ripple Mix).milk" Delete "$INSTDIR\projectm-presets\Krash & Rovastar - Cerebral Demons (Distant Memory Mix).milk" Delete "$INSTDIR\projectm-presets\Krash & Rovastar - Cerebral Demons - Phat + Eo.S. hall of ghouls Remix.milk" Delete "$INSTDIR\projectm-presets\Krash & Rovastar - Switching Polygons.milk" Delete "$INSTDIR\projectm-presets\Krash & Rovastar - The Devil Is In The Details.milk" Delete "$INSTDIR\projectm-presets\Krash - Season's Greetings 2.milk" Delete "$INSTDIR\projectm-presets\Krash & TEcHNO - Rhythmic Mantas.milk" Delete "$INSTDIR\projectm-presets\Krash - Twisting Indecision.milk" Delete "$INSTDIR\projectm-presets\Krash - War Machine (Shifting Complexity Mix).milk" Delete "$INSTDIR\projectm-presets\Krash - Windowframe To Mega Swirl 2.milk" Delete "$INSTDIR\projectm-presets\Krash & Zylot - Inside The Planar Portal (Indecision Mix).milk" Delete "$INSTDIR\projectm-presets\Mstress - Acoustic Nerve Impulses (Under Drug Effetcs (Hypn.milk" Delete "$INSTDIR\projectm-presets\Mstress & Juppy - Dancer.milk" Delete "$INSTDIR\projectm-presets\Mstress & Juppy - Dancers In The Dark.milk" Delete "$INSTDIR\projectm-presets\Mstress - Snowing Fiber City.milk" Delete "$INSTDIR\projectm-presets\M.tga" Delete "$INSTDIR\projectm-presets\nil - Can't Stop the Blithering.milk" Delete "$INSTDIR\projectm-presets\nil - Can't Stop the Cramming.milk" Delete "$INSTDIR\projectm-presets\nil - Cid and Lucy.milk" Delete "$INSTDIR\projectm-presets\nil - Disco Comet.milk" Delete "$INSTDIR\projectm-presets\nil - Singularity in My Oscilloscope.milk" Delete "$INSTDIR\projectm-presets\nil - Vortex of Vortices.milk" Delete "$INSTDIR\projectm-presets\Phat+fiShbRaiN+Eo.S_Mandala_Chasers_remix.milk" Delete "$INSTDIR\projectm-presets\Phat+fiShbRaiN+Eo.S_Mandala_Chasers_remix - www.eos4life.com.milk" Delete "$INSTDIR\projectm-presets\PieturP - triptrap_(getting_concrete_visions_through_a_diafragma_version).milk" Delete "$INSTDIR\projectm-presets\PieturP - triptrap_(ultimate-trip-mix).milk" Delete "$INSTDIR\projectm-presets\project.tga" Delete "$INSTDIR\projectm-presets\Redi Jedi - acid in your brain.milk" Delete "$INSTDIR\projectm-presets\Redi Jedi - multiple points of origin, one destination.milk" Delete "$INSTDIR\projectm-presets\Reenen - phoenix.milk" Delete "$INSTDIR\projectm-presets\Rocke - Cold Love (Tei Zwaa).milk" Delete "$INSTDIR\projectm-presets\Rocke - Personal Comet.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Aderrasi - Oceanic Bassograph (Underwater Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Altars Of Harlequin's Maddess.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Altars Of Harlequin's Madness (Dark Disorder Mix.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Altars Of Madness 2 (Frozen Time Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Altars Of Madness 4 (Spirit Of Twisted Madness M.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Altars Of Madness (A Million Miles From Earth Mi.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Altars Of Madness (Boxfresh Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Altars Of Madness (Duel Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Altars Of Madness.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Altars Of Madness (Surealist Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - A Million Miles from Earth.milk" Delete "$INSTDIR\projectm-presets\Rovastar - A Million Miles from Earth (Pathfinder Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - A Million Miles From Earth (Wormhole Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar and Krash - Hallucinogenic Pyramids (Extra Beat Ti.milk" Delete "$INSTDIR\projectm-presets\Rovastar and Unchained - Braindance Visions.milk" Delete "$INSTDIR\projectm-presets\Rovastar and Unchained - Life After Pie (Remix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Attacking Freedom.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Bellanova (New Wave Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Biohazard Warning.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Chapel Of Ghouls.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Che - Adela The Flower (Altars Of Madness Mix 2).milk" Delete "$INSTDIR\projectm-presets\Rovastar & Che - Asylum Animations.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Chemical Spirituality.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Clouded Judgement 3.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Cosmic Echoes 1.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Cosmic Echoes 2.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Cosmic Havoc.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Cosmic Mosaic (Active Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Dark Ritual (Star Of Destiny Denied Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Dark Ritual (Star Of Destiny Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Decreasing Dreams (Extended Movement Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Dreamcatcher.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Explosive Minds.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Forgotten Moon.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Fractopia (Fantic Dancing Lights Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Fractopia (Galaxy Swirl Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Fractopia (Upspoken Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Fractopia (Upspoken Mix)_Phat_Speak_When_Spoken_2.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Frozen Rapture .milk" Delete "$INSTDIR\projectm-presets\Rovastar - Future Speakers.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Fvese - Dark Subconscious.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Fvese - Deadly Flower.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Fvese - Mosaic Waves.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Fvese - Paranormal Static.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Fvese - Stranger Minds (Astral Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar & Fvese - Stranger Minds.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Geiss - Approach (Vectrip Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar & Geiss - Bipolar 2 (Vectrip Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar & Geiss - Dynamic Swirls 3 (Broken Destiny Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar & Geiss - Dynamic Swirls 3 (Mysticial Awakening Mi.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Geiss - Dynamic Swirls 3 (Poltergiest Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar & Geiss - Dynamic Swirls 3 (Smoke Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar & Geiss - Dynamic Swirls 3 (Smoking Delusion Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar & Geiss - Dynamic Swirls 3 (Voyage Of Twisted Soul.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Geiss - Ice Planet.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Geiss - Octoplasm.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Geiss - Octotrip.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Geiss - Octotrip (MultiTrip Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Halcyon Dreams 3.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Hallucinogenic Pyramids (Beat Time Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Harlequin's Delight (Endless Tunnel Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Harlequin's Dynamic Fractal 1.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Harlequin's Dynamic Fractal 2.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Harlequin's Dynamic Fractal 3.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Harlequin's Dynamic Fractal (Crazed Spiral Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Harlequin's Dynamic Fractal (Dual Spiral Mix ).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Harlequin's Fractal Encounter 2.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Harlequin's Fractal Encounter.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Harlequin's Spirit.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Harlequin's Spirit (Twisted Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Hyperspace (Frozen Rapture Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Hyperspace (Hyper Speed Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Hyperspace.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Idiot24-7 - Balk Acid.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Idiot24-7 - Mixed Emotions (Harlequin's Shame Mi.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Idiot24-7 - Mixed Emotions (Harlequin's Shame Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar & Illusion - Shifting Sphere.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Inner Thoughts (Clouded Judgement Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Inner Thoughts (Dark Secret Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Inner Thoughts (Distant Memories Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Inner Thoughts (Frantic Thoughts Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Inner Thoughts (Strange Cargo Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Kalideostars (Altars Of Madness MIx).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Kalideostars.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Kalideostars (Round Round Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar & Krash - Cerebral Demons.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Krash - Flowing Synergy.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Krash - Interwoven (Contra Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - LabFunk.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Lost Souls of the Bermuda Triangle (Darkest Soul.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Magic Carpet.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Mosaics Of Ages.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Multiverse Starfield 1.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Multiverse Starfield 3.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Omnipresence Resurrection.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Omnipresence Resurrection (Raw Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Oozing Resistance.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Pandora's Volcano.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Parallel Universe.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Rocke - Answer.42 (Trippy S. Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar & Rocke - Headspin.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Rocke - Sugar Spun Sister.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Sea Shells.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Snapshot Of Space.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Solarized Space.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Solarized Space (Space DNA Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Space.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Space (Twisted Dimension Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar & Sperl - Tuxflower.prjm" Delete "$INSTDIR\projectm-presets\Rovastar - Starquake (Sunquake Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar & StudioMusic - More Cherished Desires.milk" Delete "$INSTDIR\projectm-presets\Rovastar & StudioMusic - Twisted Spider Web.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Telek - Altars of Madness (Rolling Oceans Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar & Telek - Cosmic Fireworks.milk" Delete "$INSTDIR\projectm-presets\Rovastar - The Awakening.milk" Delete "$INSTDIR\projectm-presets\Rovastar - The Chaos Of Colours (Drifting Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - The Chaos Of Colours.milk" Delete "$INSTDIR\projectm-presets\Rovastar - The Shroomery.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Timeless Voyage.milk" Delete "$INSTDIR\projectm-presets\Rovastar - Touchdown on Mars (Detailed Pictures Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - Tripmaker.milk" Delete "$INSTDIR\projectm-presets\Rovastar - twisted bytes.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Unchained - Ambrosia Mystic (Dark Heart Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar & Unchained - Centre Of Gravity.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Unchained - Demonology (Vampire Soul Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar & Unchained - Oddball World.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Unchained - Voodoo Chess Magnet (Everglow Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar & Unchained - Xen Traffic.milk" Delete "$INSTDIR\projectm-presets\Rovastar - VooV's Movement (After Dark Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar - VooV's Movement.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Zylot - Azirphaeli's Plan (Multiplan Mix).milk" Delete "$INSTDIR\projectm-presets\Rovastar & Zylot - Narell's Fever.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Zylot - Passion Flower.milk" Delete "$INSTDIR\projectm-presets\Rovastar & Zylot - Sea Of Zigrot.milk" Delete "$INSTDIR\projectm-presets\Rozzer & Zylot - Force Field Generator (Slowtime Tweak).milk" Delete "$INSTDIR\projectm-presets\Rozzor & Aderrasi - Canon.milk" Delete "$INSTDIR\projectm-presets\Rozzor and che - Inside the House of nil.milk" Delete "$INSTDIR\projectm-presets\Rozzor and Idiot - Any Other Deep Rising.milk" Delete "$INSTDIR\projectm-presets\Rozzor and Rovastar - Altars Of Madness 3 (ooze tweak).milk" Delete "$INSTDIR\projectm-presets\Rozzor and Rovastar - Altars Of Madness 3 (ooze tweak with .milk" Delete "$INSTDIR\projectm-presets\Rozzor and StudioMusic - Vertigyny (Geiss shape mod).milk" Delete "$INSTDIR\projectm-presets\Rozzor and Zylot - Associative Order.milk" Delete "$INSTDIR\projectm-presets\Rozzor & Che - Inside The House Of Nil.milk" Delete "$INSTDIR\projectm-presets\Rozzor - Learning Curve (Invert tweak).milk" Delete "$INSTDIR\projectm-presets\Rozzor & Rovastar - Oozing Resistance (Waveform Mod).milk" Delete "$INSTDIR\projectm-presets\shifter - escape the worm - Eo.S. + Phat 5362.milk" Delete "$INSTDIR\projectm-presets\shifter - escape the worm - Eo.S. + Phat - Before_It_Eats_Your_Brain_Mix_v2.milk" Delete "$INSTDIR\projectm-presets\StudioMusic Aderrasi & nil - LA movement (Intellectual Sens.milk" Delete "$INSTDIR\projectm-presets\Studio Music and Unchained - Rapid Alteration.milk" Delete "$INSTDIR\projectm-presets\Studio Music - Cherished Desires.milk" Delete "$INSTDIR\projectm-presets\StudioMusic - Harmonic Bliss (elated mix).milk" Delete "$INSTDIR\projectm-presets\StudioMusic - It's Only Make Believe.milk" Delete "$INSTDIR\projectm-presets\StudioMusic - Numerosity.milk" Delete "$INSTDIR\projectm-presets\StudioMusic - Twisted Galaxy.milk" Delete "$INSTDIR\projectm-presets\StudioMusic & Unchained - Entity.milk" Delete "$INSTDIR\projectm-presets\StudioMusic & Unchained - Minor Alteration.milk" Delete "$INSTDIR\projectm-presets\StudioMusic & Unchained - So Much Love.milk" Delete "$INSTDIR\projectm-presets\StudioMusic & Unchained - State Of Discretion.milk" Delete "$INSTDIR\projectm-presets\StudioMusic & Unchained - Wrenched Fate.milk" Delete "$INSTDIR\projectm-presets\TEcHNO and SandStorm - Psychodelic Highway.milk" Delete "$INSTDIR\projectm-presets\Telek - City Helix Lattice.milk" Delete "$INSTDIR\projectm-presets\Telek - Directive Swagger (Spectral Inferno) (fix...) maybe.milk" Delete "$INSTDIR\projectm-presets\Telek EMPR - Scanner - Trust me I've got a Melways.milk" Delete "$INSTDIR\projectm-presets\Telek - Flicker.milk" Delete "$INSTDIR\projectm-presets\Telek - Flicker (xis).milk" Delete "$INSTDIR\projectm-presets\Telek - Lost Star (Flash).milk" Delete "$INSTDIR\projectm-presets\Telek - Recirculate (Cool).milk" Delete "$INSTDIR\projectm-presets\Telek - Sine Wave.milk" Delete "$INSTDIR\projectm-presets\Telek - Slow Shift Matrix (bb4.5).milk" Delete "$INSTDIR\projectm-presets\Telek - Slow Shift Matrix (Ethereal Drift).milk" Delete "$INSTDIR\projectm-presets\Telek - Slow Shift Matrix.milk" Delete "$INSTDIR\projectm-presets\Telek - Slow Thing (Spiderman Mix).milk" Delete "$INSTDIR\projectm-presets\Telek - Spiral Tabletop (New and Improved!).milk" Delete "$INSTDIR\projectm-presets\Telek - Spokes (More Dynamic).milk" Delete "$INSTDIR\projectm-presets\Telek - Target Practice (tracking retreat slide).milk" Delete "$INSTDIR\projectm-presets\TobiasWolfBoi - Cataract.milk" Delete "$INSTDIR\projectm-presets\TobiasWolfBoi - The Pit.milk" Delete "$INSTDIR\projectm-presets\Tschoey - Music Flower.milk" Delete "$INSTDIR\projectm-presets\Tux.tga" Delete "$INSTDIR\projectm-presets\Unchained - All You Can Eat.milk" Delete "$INSTDIR\projectm-presets\Unchained - A Matter Of Taste (Remix).milk" Delete "$INSTDIR\projectm-presets\Unchained - Bad Karma Oddnezz Style.milk" Delete "$INSTDIR\projectm-presets\Unchained - Beat Demo 1.0.milk" Delete "$INSTDIR\projectm-presets\Unchained - Beat Demo 10.milk" Delete "$INSTDIR\projectm-presets\Unchained - Beat Demo 2.0.milk" Delete "$INSTDIR\projectm-presets\Unchained - Beat Demo 2.1.milk" Delete "$INSTDIR\projectm-presets\Unchained - Beat Demo 2.2.milk" Delete "$INSTDIR\projectm-presets\Unchained - Beat Demo 2.3.milk" Delete "$INSTDIR\projectm-presets\Unchained - Beat Demo (Demonology Mix).milk" Delete "$INSTDIR\projectm-presets\Unchained - Cartoon Factory.milk" Delete "$INSTDIR\projectm-presets\Unchained & Che - Oddnezz 3.milk" Delete "$INSTDIR\projectm-presets\Unchained & Che - Oddnezz 4 (Done it again).milk" Delete "$INSTDIR\projectm-presets\Unchained - Cranked On Failure.milk" Delete "$INSTDIR\projectm-presets\Unchained & CTho - Bad Vibes.milk" Delete "$INSTDIR\projectm-presets\Unchained - Custom Gramatix (Remix).milk" Delete "$INSTDIR\projectm-presets\Unchained - Deeper Logic.milk" Delete "$INSTDIR\projectm-presets\Unchained - Free to Feel (Valium Remix).milk" Delete "$INSTDIR\projectm-presets\Unchained - French Clothing.milk" Delete "$INSTDIR\projectm-presets\Unchained - Games With Light & Sound.milk" Delete "$INSTDIR\projectm-presets\Unchained - Ghostlight Whisper.milk" Delete "$INSTDIR\projectm-presets\Unchained - God Of The Game (Remix).milk" Delete "$INSTDIR\projectm-presets\Unchained - Goofy Beat Detection.milk" Delete "$INSTDIR\projectm-presets\Unchained - Goo Kung Fu.milk" Delete "$INSTDIR\projectm-presets\Unchained - Housed In A Childish Mind.milk" Delete "$INSTDIR\projectm-presets\Unchained & Illusion - Dual Wave 3.milk" Delete "$INSTDIR\projectm-presets\Unchained & Illusion - Logic Morph.milk" Delete "$INSTDIR\projectm-presets\Unchained & Illusion - Spirit Morph.milk" Delete "$INSTDIR\projectm-presets\Unchained - In Memory Of Peg.milk" Delete "$INSTDIR\projectm-presets\Unchained - Invariant Under Rigorous Motions.milk" Delete "$INSTDIR\projectm-presets\Unchained - Jaded Emotion.milk" Delete "$INSTDIR\projectm-presets\Unchained - Jaundice.milk" Delete "$INSTDIR\projectm-presets\Unchained - Making a Science of It 4.milk" Delete "$INSTDIR\projectm-presets\Unchained - Morat's Final Voyage.milk" Delete "$INSTDIR\projectm-presets\Unchained - Non-Professional Music Analyzer.milk" Delete "$INSTDIR\projectm-presets\Unchained - Painful Plasma (Multi-Wave Mirrored Rage) -- Ro.milk" Delete "$INSTDIR\projectm-presets\Unchained - Perverted Dialect.milk" Delete "$INSTDIR\projectm-presets\Unchained - Picture Of Exile.milk" Delete "$INSTDIR\projectm-presets\Unchained - Picture Of Nectar.milk" Delete "$INSTDIR\projectm-presets\Unchained - Picture Of Poison.milk" Delete "$INSTDIR\projectm-presets\Unchained - ReAwoke.milk" Delete "$INSTDIR\projectm-presets\Unchained - Resistance.milk" Delete "$INSTDIR\projectm-presets\Unchained - Ribald Ballad.milk" Delete "$INSTDIR\projectm-presets\Unchained & Rovastar - For The Seagull.milk" Delete "$INSTDIR\projectm-presets\Unchained & Rovastar - Luckless.milk" Delete "$INSTDIR\projectm-presets\Unchained & Rovastar - Rainbow Obscura.milk" Delete "$INSTDIR\projectm-presets\Unchained & Rovastar - Slow Solstice.milk" Delete "$INSTDIR\projectm-presets\Unchained & Rovastar - Triptionary.milk" Delete "$INSTDIR\projectm-presets\Unchained & Rovastar - Wormhole Pillars (Hall of Shadows mi.milk" Delete "$INSTDIR\projectm-presets\Unchained & Rovastar - Wormhole Pillars.milk" Delete "$INSTDIR\projectm-presets\Unchained & Rovastar - Xen Traffic.milk" Delete "$INSTDIR\projectm-presets\Unchained - Shaping The Grid.milk" Delete "$INSTDIR\projectm-presets\Unchained - Subjective Experience Of The Manifold.milk" Delete "$INSTDIR\projectm-presets\Unchained - Unclaimed Wreckage 2 (Shamanic).milk" Delete "$INSTDIR\projectm-presets\Unchained - Unclaimed Wreckage.milk" Delete "$INSTDIR\projectm-presets\Unchained - Unified Drag 2.milk" Delete "$INSTDIR\projectm-presets\Unchained - ventilation.milk" Delete "$INSTDIR\projectm-presets\Unchained - Working the Grid.milk" Delete "$INSTDIR\projectm-presets\Zylot & Aderrasi - Oceanic Bassograph (New Jersey Shore Mix.milk" Delete "$INSTDIR\projectm-presets\Zylot and Rovastar - Iouo Stone Morphic Fusion.milk" Delete "$INSTDIR\projectm-presets\Zylot - Azirphaeli's Mirror.milk" Delete "$INSTDIR\projectm-presets\Zylot - Block Of Sound (Abstract Architecture Mix).milk" Delete "$INSTDIR\projectm-presets\Zylot - Block Of Sound (Fractal Construction Mix).milk" Delete "$INSTDIR\projectm-presets\Zylot - Color Of Music.milk" Delete "$INSTDIR\projectm-presets\Zylot - Crystal Ball (Magical Reaction Mix).milk" Delete "$INSTDIR\projectm-presets\Zylot - De(-a)range(d)(ment) complex.milk" Delete "$INSTDIR\projectm-presets\Zylot - De(-a)range(d)(ment) strain.milk" Delete "$INSTDIR\projectm-presets\Zylot - Digiscape Advanced Processor.milk" Delete "$INSTDIR\projectm-presets\Zylot - Ether Storm.milk" Delete "$INSTDIR\projectm-presets\Zylot - Global Earthquake.milk" Delete "$INSTDIR\projectm-presets\Zylot & Idiot - ATan2 Demo (Spiraling Mad Mix).milk" Delete "$INSTDIR\projectm-presets\Zylot - Inside The Planar Portal.milk" Delete "$INSTDIR\projectm-presets\Zylot & Krash - Extremophile.milk" Delete "$INSTDIR\projectm-presets\Zylot - light of the path.milk" Delete "$INSTDIR\projectm-presets\Zylot - Mixing Pot.milk" Delete "$INSTDIR\projectm-presets\Zylot & Mstress - Celebrate.milk" Delete "$INSTDIR\projectm-presets\Zylot & Mstress - Toxic Storm On Acid Sea (The End Of The W.milk" Delete "$INSTDIR\projectm-presets\Zylot - Puddle Of Music.milk" Delete "$INSTDIR\projectm-presets\Zylot - Rainbow Planet Under Attack.milk" Delete "$INSTDIR\projectm-presets\Zylot & Rovastar - Crystal Ball (Cerimonial Decor Mix).milk" Delete "$INSTDIR\projectm-presets\Zylot - Rush.milk" Delete "$INSTDIR\projectm-presets\Zylot - S Pulse Virus.milk" Delete "$INSTDIR\projectm-presets\Zylot - String.milk" Delete "$INSTDIR\projectm-presets\Zylot - Tangent Universe (Collapsed With Artifact Mix).milk" Delete "$INSTDIR\projectm-presets\Zylot - The Deeper.milk" Delete "$INSTDIR\projectm-presets\Zylot - The Inner Workings of my New Computer.milk" Delete "$INSTDIR\projectm-presets\Zylot - Visionarie (geiss aspect ratio fix).milk" Delete "$INSTDIR\projectm-presets\Zylot - Waves Of Blood.milk" Delete "$INSTDIR\projectm-presets\Zylot - Wisps.milk" Delete "$INSTDIR\gio-modules\libgiognutls.dll" Delete "$INSTDIR\Uninstall.exe" ; Remove the installation folders. RMDir "$INSTDIR\gstreamer-plugins" RMDir "$INSTDIR\projectm-presets" RMDir "$INSTDIR\imageformats" RMDir "$INSTDIR\gio-modules" RMDir "$INSTDIR" ; Remove the Shortcuts SetShellVarContext all @NORMAL@ Delete "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" @NORMAL@ Delete "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall.lnk" @NORMAL@ RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}" ; Remove the entry from 'installed programs list' @NORMAL@ DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" ; Check the OS. If Vista or newer, use Default Programs @NORMAL@ nsisos::osversion @NORMAL@ StrCpy $R0 $0 @NORMAL@ IntCmp $R0 6 HasDefaultPrograms NoDefaultPrograms HasDefaultPrograms @NORMAL@ HasDefaultPrograms: ; Unregister from Default Programs @NORMAL@ ${UnRegisterCapabilities} @NORMAL@ Goto done @NORMAL@ NoDefaultPrograms: ; Remove file associations @NORMAL@ ${unregisterExtension} ".mp3" "MP3 Audio File" @NORMAL@ ${unregisterExtension} ".flac" "FLAC Audio File" @NORMAL@ ${unregisterExtension} ".ogg" "OGG Audio File" @NORMAL@ ${unregisterExtension} ".spx" "OGG Speex Audio File" @NORMAL@ ${unregisterExtension} ".mp4" "MP4 Audio File" @NORMAL@ ${unregisterExtension} ".aac" "AAC Audio File" @NORMAL@ ${unregisterExtension} ".wma" "WMA Audio File" @NORMAL@ ${unregisterExtension} ".wav" "WAV Audio File" @NORMAL@ @NORMAL@ ${unregisterExtension} ".pls" "PLS Audio File" @NORMAL@ ${unregisterExtension} ".m3u" "M3U Audio File" @NORMAL@ ${unregisterExtension} ".xspf" "XSPF Audio File" @NORMAL@ ${unregisterExtension} ".asx" "Windows Media Audio/Video playlist" @NORMAL@ done: SectionEnd clementine-1.2.3+git1354-gdaddbde+dfsg/dist/windows/windres.rc.in000066400000000000000000000013631260417502300244350ustar00rootroot00000000000000clementine ICON "clementine.ico" 1 VERSIONINFO FILEVERSION ${CLEMENTINE_VERSION_MAJOR},${CLEMENTINE_VERSION_MINOR},0,0 PRODUCTVERSION ${CLEMENTINE_VERSION_MAJOR},${CLEMENTINE_VERSION_MINOR},0,0 BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "080904E4" BEGIN VALUE "CompanyName", "Clementine" VALUE "FileDescription", "Clementine music player" VALUE "FileVersion", "${CLEMENTINE_VERSION_DISPLAY}" VALUE "InternalName", "clementine" VALUE "LegalCopyright", "David Sansome" VALUE "OriginalFilename", "clementine.exe" VALUE "ProductName", "Clementine" VALUE "ProductVersion", "${CLEMENTINE_VERSION_DISPLAY}" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x809, 1252 END END clementine-1.2.3+git1354-gdaddbde+dfsg/ext/000077500000000000000000000000001260417502300201675ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/ext/clementine-spotifyblob/000077500000000000000000000000001260417502300246445ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/ext/clementine-spotifyblob/CMakeLists.txt000066400000000000000000000042371260417502300274120ustar00rootroot00000000000000include_directories(${SPOTIFY_INCLUDE_DIRS}) include_directories(${PROTOBUF_INCLUDE_DIRS}) include_directories(${CMAKE_CURRENT_BINARY_DIR}) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${CMAKE_BINARY_DIR}/ext/libclementine-spotifyblob) include_directories(${CMAKE_SOURCE_DIR}/ext/libclementine-spotifyblob) include_directories(${CMAKE_SOURCE_DIR}/ext/libclementine-common) include_directories(${CMAKE_SOURCE_DIR}/src) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Woverloaded-virtual -Wall -Wno-sign-compare -Wno-deprecated-declarations -Wno-unused-local-typedefs -Wno-unused-private-field -Wno-unknown-warning-option --std=c++0x -U__STRICT_ANSI__") link_directories(${SPOTIFY_LIBRARY_DIRS}) set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}) set(SOURCES main.cpp mediapipeline.cpp spotifyclient.cpp spotify_utilities.cpp ) set(HEADERS spotifyclient.h ) if(APPLE) list(APPEND SOURCES spotify_utilities.mm) endif(APPLE) qt4_wrap_cpp(MOC ${HEADERS}) if(WIN32 AND NOT CMAKE_BUILD_TYPE STREQUAL "Debug" AND NOT ENABLE_WIN32_CONSOLE) set(win32_build_flag WIN32) endif(WIN32 AND NOT CMAKE_BUILD_TYPE STREQUAL "Debug" AND NOT ENABLE_WIN32_CONSOLE) add_executable(clementine-spotifyblob ${win32_build_flag} ${SOURCES} ${MOC} ) target_link_libraries(clementine-spotifyblob ${SPOTIFY_LIBRARIES} ${SPOTIFY_LDFLAGS} ${QT_QTCORE_LIBRARY} ${QT_QTNETWORK_LIBRARY} ${GSTREAMER_BASE_LIBRARIES} ${GSTREAMER_APP_LIBRARIES} clementine-spotifyblob-messages libclementine-common ) if(APPLE) target_link_libraries(clementine-spotifyblob /System/Library/Frameworks/Foundation.framework ) endif(APPLE) if(NOT APPLE) # macdeploy.py takes care of this on mac install(TARGETS clementine-spotifyblob RUNTIME DESTINATION bin ) endif(NOT APPLE) if(LINUX) # Versioned name of the blob if(CMAKE_SIZEOF_VOID_P EQUAL 4) set(SPOTIFY_BLOB_ARCH 32) else(CMAKE_SIZEOF_VOID_P EQUAL 4) set(SPOTIFY_BLOB_ARCH 64) endif(CMAKE_SIZEOF_VOID_P EQUAL 4) install( FILES ${CMAKE_BINARY_DIR}/clementine-spotifyblob DESTINATION ${CMAKE_BINARY_DIR}/spotify/version${SPOTIFY_BLOB_VERSION}-${SPOTIFY_BLOB_ARCH}bit/ RENAME blob ) endif(LINUX) clementine-1.2.3+git1354-gdaddbde+dfsg/ext/clementine-spotifyblob/main.cpp000066400000000000000000000026561260417502300263050ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // Note: this file is licensed under the Apache License instead of GPL because // it is used by the Spotify blob which links against libspotify and is not GPL // compatible. #include #include #include #include "spotifyclient.h" #include "core/logging.h" int main(int argc, char** argv) { QCoreApplication a(argc, argv); QCoreApplication::setApplicationName("Clementine"); QCoreApplication::setOrganizationName("Clementine"); QCoreApplication::setOrganizationDomain("clementine-player.org"); logging::Init(); gst_init(nullptr, nullptr); const QStringList arguments(a.arguments()); if (arguments.length() != 2) { qFatal("Usage: %s port", argv[0]); } SpotifyClient client; client.Init(arguments[1].toInt()); return a.exec(); } clementine-1.2.3+git1354-gdaddbde+dfsg/ext/clementine-spotifyblob/mediapipeline.cpp000066400000000000000000000122601260417502300301560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // Note: this file is licensed under the Apache License instead of GPL because // it is used by the Spotify blob which links against libspotify and is not GPL // compatible. #include "mediapipeline.h" #include "core/logging.h" #include "core/timeconstants.h" #include MediaPipeline::MediaPipeline(int port, quint64 length_msec) : port_(port), length_msec_(length_msec), accepting_data_(true), pipeline_(nullptr), appsrc_(nullptr), byte_rate_(1), offset_bytes_(0) {} MediaPipeline::~MediaPipeline() { if (pipeline_) { gst_element_set_state(pipeline_, GST_STATE_NULL); gst_object_unref(GST_OBJECT(pipeline_)); } } bool MediaPipeline::Init(int sample_rate, int channels) { if (is_initialised()) return false; pipeline_ = gst_pipeline_new("pipeline"); // Create elements appsrc_ = GST_APP_SRC(gst_element_factory_make("appsrc", nullptr)); GstElement* gdppay = gst_element_factory_make("gdppay", nullptr); tcpsink_ = gst_element_factory_make("tcpclientsink", nullptr); if (!pipeline_ || !appsrc_ || !tcpsink_) { if (pipeline_) { gst_object_unref(GST_OBJECT(pipeline_)); pipeline_ = nullptr; } if (appsrc_) { gst_object_unref(GST_OBJECT(appsrc_)); appsrc_ = nullptr; } if (gdppay) { gst_object_unref(GST_OBJECT(gdppay)); } if (tcpsink_) { gst_object_unref(GST_OBJECT(tcpsink_)); tcpsink_ = nullptr; } return false; } // Add elements to the pipeline and link them gst_bin_add(GST_BIN(pipeline_), GST_ELEMENT(appsrc_)); gst_bin_add(GST_BIN(pipeline_), gdppay); gst_bin_add(GST_BIN(pipeline_), tcpsink_); gst_element_link_many(GST_ELEMENT(appsrc_), gdppay, tcpsink_, nullptr); // Set the sink's port g_object_set(G_OBJECT(tcpsink_), "host", "127.0.0.1", nullptr); g_object_set(G_OBJECT(tcpsink_), "port", port_, nullptr); // Try to send 5 seconds of audio in advance to initially fill Clementine's // buffer. g_object_set(G_OBJECT(tcpsink_), "ts-offset", qint64(-5 * kNsecPerSec), nullptr); // We know the time of each buffer g_object_set(G_OBJECT(appsrc_), "format", GST_FORMAT_TIME, nullptr); // Spotify only pushes data to us every 100ms, so keep the appsrc half full // to prevent tiny stalls. g_object_set(G_OBJECT(appsrc_), "min-percent", 50, nullptr); // Set callbacks for when to start/stop pushing data GstAppSrcCallbacks callbacks; callbacks.enough_data = EnoughDataCallback; callbacks.need_data = NeedDataCallback; callbacks.seek_data = SeekDataCallback; gst_app_src_set_callbacks(appsrc_, &callbacks, this, nullptr); #if Q_BYTE_ORDER == Q_BIG_ENDIAN static const char* format = "S16BE"; #elif Q_BYTE_ORDER == Q_LITTLE_ENDIAN static const char* format = "S16LE"; #endif // Set caps GstCaps* caps = gst_caps_new_simple( "audio/x-raw", "format", G_TYPE_STRING, format, "rate", G_TYPE_INT, sample_rate, "channels", G_TYPE_INT, channels, "layout", G_TYPE_STRING, "interleaved", nullptr); gst_app_src_set_caps(appsrc_, caps); gst_caps_unref(caps); // Set size byte_rate_ = quint64(sample_rate) * channels * 2; const quint64 bytes = byte_rate_ * length_msec_ / 1000; gst_app_src_set_size(appsrc_, bytes); // Ready to go return gst_element_set_state(pipeline_, GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE; } void MediaPipeline::WriteData(const char* data, qint64 length) { if (!is_initialised()) return; GstBuffer* buffer = gst_buffer_new_allocate(nullptr, length, nullptr); GstMapInfo map_info; gst_buffer_map(buffer, &map_info, GST_MAP_WRITE); memcpy(map_info.data, data, length); gst_buffer_unmap(buffer, &map_info); GST_BUFFER_PTS(buffer) = offset_bytes_ * kNsecPerSec / byte_rate_; GST_BUFFER_DURATION(buffer) = length * kNsecPerSec / byte_rate_; offset_bytes_ += length; gst_app_src_push_buffer(appsrc_, buffer); } void MediaPipeline::EndStream() { if (!is_initialised()) return; gst_app_src_end_of_stream(appsrc_); } void MediaPipeline::NeedDataCallback(GstAppSrc* src, guint length, void* data) { MediaPipeline* me = reinterpret_cast(data); me->accepting_data_ = true; } void MediaPipeline::EnoughDataCallback(GstAppSrc* src, void* data) { MediaPipeline* me = reinterpret_cast(data); me->accepting_data_ = false; } gboolean MediaPipeline::SeekDataCallback(GstAppSrc* src, guint64 offset, void* data) { // MediaPipeline* me = reinterpret_cast(data); qLog(Debug) << "Gstreamer wants seek to" << offset; return false; } clementine-1.2.3+git1354-gdaddbde+dfsg/ext/clementine-spotifyblob/mediapipeline.h000066400000000000000000000033521260417502300276250ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // Note: this file is licensed under the Apache License instead of GPL because // it is used by the Spotify blob which links against libspotify and is not GPL // compatible. #ifndef MEDIAPIPELINE_H #define MEDIAPIPELINE_H #include #include #include class MediaPipeline { public: MediaPipeline(int port, quint64 length_msec); ~MediaPipeline(); bool is_initialised() const { return pipeline_; } bool is_accepting_data() const { return accepting_data_; } bool Init(int sample_rate, int channels); void WriteData(const char* data, qint64 length); void EndStream(); private: static void NeedDataCallback(GstAppSrc* src, guint length, void* data); static void EnoughDataCallback(GstAppSrc* src, void* data); static gboolean SeekDataCallback(GstAppSrc* src, guint64 offset, void* data); private: Q_DISABLE_COPY(MediaPipeline) const int port_; const quint64 length_msec_; bool accepting_data_; GstElement* pipeline_; GstAppSrc* appsrc_; GstElement* tcpsink_; quint64 byte_rate_; quint64 offset_bytes_; }; #endif // MEDIAPIPELINE_H clementine-1.2.3+git1354-gdaddbde+dfsg/ext/clementine-spotifyblob/spotify_utilities.cpp000066400000000000000000000034701260417502300311440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // Note: this file is licensed under the Apache License instead of GPL because // it is used by the Spotify blob which links against libspotify and is not GPL // compatible. #include "spotify_utilities.h" #include #include #include #include #include namespace utilities { QString GetCacheDirectory() { QString user_cache = GetUserDataDirectory(); return user_cache + "/" + QCoreApplication::applicationName() + "/spotify-cache"; } #ifndef Q_OS_DARWIN // See spotify_utilities.mm for Mac implementation. QString GetUserDataDirectory() { const char* xdg_cache_dir = getenv("XDG_CACHE_HOME"); if (!xdg_cache_dir) { return QDir::homePath() + "/.config"; } return QString::fromLocal8Bit(xdg_cache_dir); } QString GetSettingsDirectory() { QString ret; #ifdef Q_OS_WIN32 ret = GetUserDataDirectory() + "/" + QCoreApplication::applicationName() + "/spotify-settings"; #else ret = QFileInfo(QSettings().fileName()).absolutePath() + "/spotify-settings"; #endif // Q_OS_WIN32 // Create the directory QDir dir; dir.mkpath(ret); return ret; } #endif // Q_OS_DARWIN } // namespace utilities clementine-1.2.3+git1354-gdaddbde+dfsg/ext/clementine-spotifyblob/spotify_utilities.h000066400000000000000000000021561260417502300306110ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // Note: this file is licensed under the Apache License instead of GPL because // it is used by the Spotify blob which links against libspotify and is not GPL // compatible. #ifndef SPOTIFY_UTILITIES_H #define SPOTIFY_UTILITIES_H #include namespace utilities { // Get the path to the current user's data directory for all apps. QString GetUserDataDirectory(); // Get the path for Clementine's cache. QString GetCacheDirectory(); QString GetSettingsDirectory(); } #endif clementine-1.2.3+git1354-gdaddbde+dfsg/ext/clementine-spotifyblob/spotify_utilities.mm000066400000000000000000000025311260417502300307700ustar00rootroot00000000000000#include "spotify_utilities.h" #import #import #import #import "core/scoped_nsautorelease_pool.h" namespace utilities { QString GetUserDataDirectory() { ScopedNSAutoreleasePool pool; NSArray* paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); QString ret; if ([paths count] > 0) { NSString* user_path = [paths objectAtIndex:0]; ret = QString::fromUtf8([user_path UTF8String]); } else { ret = "~/Library/Caches"; } return ret; } QString GetSettingsDirectory() { ScopedNSAutoreleasePool pool; NSArray* paths = NSSearchPathForDirectoriesInDomains( NSApplicationSupportDirectory, NSUserDomainMask, YES); NSString* ret; if ([paths count] > 0) { ret = [paths objectAtIndex:0]; } else { ret = @"~/Library/Application Support"; } ret = [ret stringByAppendingString:@"/Clementine/spotify-settings"]; NSFileManager* file_manager = [NSFileManager defaultManager]; [file_manager createDirectoryAtPath:ret withIntermediateDirectories:YES attributes:nil error:nil]; QString path = QString::fromUtf8([ret UTF8String]); return path; } } // namespace utilities clementine-1.2.3+git1354-gdaddbde+dfsg/ext/clementine-spotifyblob/spotifyclient.cpp000066400000000000000000001136711260417502300302550ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // Note: this file is licensed under the Apache License instead of GPL because // it is used by the Spotify blob which links against libspotify and is not GPL // compatible. #include "spotifyclient.h" #include #include #include #include #include #include #include #include "core/arraysize.h" #include "core/logging.h" #include "core/timeconstants.h" #include "mediapipeline.h" #include "spotifykey.h" #include "spotifymessages.pb.h" #include "spotify_utilities.h" const int SpotifyClient::kSpotifyImageIDSize = 20; const int SpotifyClient::kWaveHeaderSize = 44; SpotifyClient::SpotifyClient(QObject* parent) : AbstractMessageHandler(nullptr, parent), api_key_(QByteArray::fromBase64(kSpotifyApiKey)), protocol_socket_(new QTcpSocket(this)), session_(nullptr), events_timer_(new QTimer(this)) { SetDevice(protocol_socket_); memset(&spotify_callbacks_, 0, sizeof(spotify_callbacks_)); memset(&spotify_config_, 0, sizeof(spotify_config_)); memset(&playlistcontainer_callbacks_, 0, sizeof(playlistcontainer_callbacks_)); memset(&get_playlists_callbacks_, 0, sizeof(get_playlists_callbacks_)); memset(&load_playlist_callbacks_, 0, sizeof(load_playlist_callbacks_)); spotify_callbacks_.logged_in = &LoggedInCallback; spotify_callbacks_.notify_main_thread = &NotifyMainThreadCallback; spotify_callbacks_.log_message = &LogMessageCallback; spotify_callbacks_.metadata_updated = &MetadataUpdatedCallback; spotify_callbacks_.music_delivery = &MusicDeliveryCallback; spotify_callbacks_.end_of_track = &EndOfTrackCallback; spotify_callbacks_.streaming_error = &StreamingErrorCallback; spotify_callbacks_.offline_status_updated = &OfflineStatusUpdatedCallback; spotify_callbacks_.connection_error = &ConnectionErrorCallback; spotify_callbacks_.message_to_user = &UserMessageCallback; spotify_callbacks_.start_playback = &StartPlaybackCallback; spotify_callbacks_.stop_playback = &StopPlaybackCallback; playlistcontainer_callbacks_.container_loaded = &PlaylistContainerLoadedCallback; playlistcontainer_callbacks_.playlist_added = &PlaylistAddedCallback; playlistcontainer_callbacks_.playlist_moved = &PlaylistMovedCallback; playlistcontainer_callbacks_.playlist_removed = &PlaylistRemovedCallback; get_playlists_callbacks_.playlist_state_changed = &PlaylistStateChangedForGetPlaylists; load_playlist_callbacks_.playlist_state_changed = &PlaylistStateChangedForLoadPlaylist; QString cache = utilities::GetCacheDirectory(); qLog(Debug) << "Using:" << cache << "for Spotify cache"; QString settings_dir = utilities::GetSettingsDirectory(); qLog(Debug) << "Using:" << settings_dir << "for Spotify settings"; spotify_config_.api_version = SPOTIFY_API_VERSION; // From libspotify/api.h spotify_config_.cache_location = strdup(cache.toUtf8().constData()); spotify_config_.settings_location = strdup(settings_dir.toUtf8().constData()); spotify_config_.application_key = api_key_.constData(); spotify_config_.application_key_size = api_key_.size(); spotify_config_.callbacks = &spotify_callbacks_; spotify_config_.userdata = this; spotify_config_.user_agent = "Clementine Player"; events_timer_->setSingleShot(true); connect(events_timer_, SIGNAL(timeout()), SLOT(ProcessEvents())); connect(protocol_socket_, SIGNAL(disconnected()), QCoreApplication::instance(), SLOT(quit())); } SpotifyClient::~SpotifyClient() { if (session_) { sp_session_release(session_); } free(const_cast(spotify_config_.cache_location)); free(const_cast(spotify_config_.settings_location)); } void SpotifyClient::Init(quint16 port) { qLog(Debug) << "Connecting to port" << port; protocol_socket_->connectToHost(QHostAddress::LocalHost, port); } void SpotifyClient::LoggedInCallback(sp_session* session, sp_error error) { SpotifyClient* me = reinterpret_cast(sp_session_userdata(session)); const bool success = error == SP_ERROR_OK; pb::spotify::LoginResponse_Error error_code = pb::spotify::LoginResponse_Error_Other; if (!success) { qLog(Warning) << "Failed to login" << sp_error_message(error); } switch (error) { case SP_ERROR_BAD_USERNAME_OR_PASSWORD: error_code = pb::spotify::LoginResponse_Error_BadUsernameOrPassword; break; case SP_ERROR_USER_BANNED: error_code = pb::spotify::LoginResponse_Error_UserBanned; break; case SP_ERROR_USER_NEEDS_PREMIUM: error_code = pb::spotify::LoginResponse_Error_UserNeedsPremium; break; default: error_code = pb::spotify::LoginResponse_Error_Other; break; } me->SendLoginCompleted(success, sp_error_message(error), error_code); if (success) { sp_playlistcontainer_add_callbacks(sp_session_playlistcontainer(session), &me->playlistcontainer_callbacks_, me); sp_session_flush_caches(me->session_); } } void SpotifyClient::NotifyMainThreadCallback(sp_session* session) { SpotifyClient* me = reinterpret_cast(sp_session_userdata(session)); QMetaObject::invokeMethod(me, "ProcessEvents", Qt::QueuedConnection); } void SpotifyClient::ProcessEvents() { int next_timeout_ms; sp_session_process_events(session_, &next_timeout_ms); events_timer_->start(next_timeout_ms); } void SpotifyClient::LogMessageCallback(sp_session* session, const char* data) { qLog(Debug) << "libspotify:" << QString::fromUtf8(data).trimmed(); } void SpotifyClient::Search(const pb::spotify::SearchRequest& req) { sp_search* search = sp_search_create(session_, req.query().c_str(), 0, req.limit(), 0, req.limit_album(), 0, 0, // artists 0, 0, // playlists SP_SEARCH_STANDARD, &SearchCompleteCallback, this); pending_searches_[search] = req; } void SpotifyClient::SearchCompleteCallback(sp_search* result, void* userdata) { SpotifyClient* me = reinterpret_cast(userdata); if (!me->pending_searches_.contains(result)) { qLog(Warning) << "SearchComplete called with unknown search"; return; } // If there were any album results then we need to resolve those before // we can send our response. const int count = sp_search_num_albums(result); if (count != 0) { for (int i = 0; i < count; ++i) { sp_album* album = sp_search_album(result, i); sp_albumbrowse* browse = sp_albumbrowse_create( me->session_, album, &SearchAlbumBrowseComplete, me); me->pending_search_album_browse_responses_[browse] = result; } return; } me->SendSearchResponse(result); } void SpotifyClient::SearchAlbumBrowseComplete(sp_albumbrowse* result, void* userdata) { SpotifyClient* me = reinterpret_cast(userdata); if (!me->pending_search_album_browse_responses_.contains(result)) { qLog(Warning) << "SearchAlbumBrowseComplete called with unknown result"; return; } sp_search* search = me->pending_search_album_browse_responses_.take(result); me->pending_search_album_browses_[search].append(result); if (me->pending_search_album_browses_[search].count() >= sp_search_num_albums(search)) { me->SendSearchResponse(search); } } void SpotifyClient::SendSearchResponse(sp_search* result) { // Take the request out of the queue pb::spotify::SearchRequest req = pending_searches_.take(result); // Prepare the response pb::spotify::Message message; pb::spotify::SearchResponse* response = message.mutable_search_response(); *response->mutable_request() = req; // Check for errors sp_error error = sp_search_error(result); if (error != SP_ERROR_OK) { response->set_error(sp_error_message(error)); SendMessage(message); sp_search_release(result); return; } // Get the list of tracks from the search int count = sp_search_num_tracks(result); for (int i = 0; i < count; ++i) { sp_track* track = sp_search_track(result, i); ConvertTrack(track, response->add_result()); } // Get the albums from the search. All these should be resolved by now. QList browses = pending_search_album_browses_.take(result); for (sp_albumbrowse* browse : browses) { sp_album* album = sp_albumbrowse_album(browse); pb::spotify::Album* msg = response->add_album(); ConvertAlbum(album, msg->mutable_metadata()); ConvertAlbumBrowse(browse, msg->mutable_metadata()); // Add all tracks const int tracks = sp_albumbrowse_num_tracks(browse); for (int i = 0; i < tracks; ++i) { ConvertTrack(sp_albumbrowse_track(browse, i), msg->add_track()); } sp_albumbrowse_release(browse); } // Add other data to the response response->set_total_tracks(sp_search_total_tracks(result)); response->set_did_you_mean(sp_search_did_you_mean(result)); SendMessage(message); sp_search_release(result); } void SpotifyClient::MessageArrived(const pb::spotify::Message& message) { if (message.has_login_request()) { Login(message.login_request()); } else if (message.has_load_playlist_request()) { LoadPlaylist(message.load_playlist_request()); } else if (message.has_playback_request()) { StartPlayback(message.playback_request()); } else if (message.has_seek_request()) { Seek(message.seek_request().offset_nsec()); } else if (message.has_search_request()) { Search(message.search_request()); } else if (message.has_image_request()) { LoadImage(QStringFromStdString(message.image_request().id())); } else if (message.has_sync_playlist_request()) { SyncPlaylist(message.sync_playlist_request()); } else if (message.has_browse_album_request()) { BrowseAlbum(QStringFromStdString(message.browse_album_request().uri())); } else if (message.has_set_playback_settings_request()) { SetPlaybackSettings(message.set_playback_settings_request()); } else if (message.has_browse_toplist_request()) { BrowseToplist(message.browse_toplist_request()); } else if (message.has_pause_request()) { SetPaused(message.pause_request()); } else if (message.has_add_tracks_to_playlist()) { AddTracksToPlaylist(message.add_tracks_to_playlist()); } else if (message.has_remove_tracks_from_playlist()) { RemoveTracksFromPlaylist(message.remove_tracks_from_playlist()); } } void SpotifyClient::SetPlaybackSettings( const pb::spotify::PlaybackSettings& req) { sp_bitrate bitrate = SP_BITRATE_320k; switch (req.bitrate()) { case pb::spotify::Bitrate96k: bitrate = SP_BITRATE_96k; break; case pb::spotify::Bitrate160k: bitrate = SP_BITRATE_160k; break; case pb::spotify::Bitrate320k: bitrate = SP_BITRATE_320k; break; } qLog(Debug) << "Setting playback settings: bitrate" << bitrate << "normalisation" << req.volume_normalisation(); sp_session_preferred_bitrate(session_, bitrate); sp_session_preferred_offline_bitrate(session_, bitrate, false); sp_session_set_volume_normalization(session_, req.volume_normalisation()); } void SpotifyClient::Login(const pb::spotify::LoginRequest& req) { sp_error error = sp_session_create(&spotify_config_, &session_); if (error != SP_ERROR_OK) { qLog(Warning) << "Failed to create session" << sp_error_message(error); SendLoginCompleted(false, sp_error_message(error), pb::spotify::LoginResponse_Error_Other); return; } SetPlaybackSettings(req.playback_settings()); if (req.password().empty()) { sp_error error = sp_session_relogin(session_); if (error != SP_ERROR_OK) { qLog(Warning) << "Tried to relogin but no stored credentials"; SendLoginCompleted(false, sp_error_message(error), pb::spotify::LoginResponse_Error_ReloginFailed); } } else { sp_session_login(session_, req.username().c_str(), req.password().c_str(), true, // Remember the password. nullptr); } } void SpotifyClient::SendLoginCompleted( bool success, const QString& error, pb::spotify::LoginResponse_Error error_code) { pb::spotify::Message message; pb::spotify::LoginResponse* response = message.mutable_login_response(); response->set_success(success); response->set_error(DataCommaSizeFromQString(error)); if (!success) { response->set_error_code(error_code); } SendMessage(message); } void SpotifyClient::PlaylistContainerLoadedCallback(sp_playlistcontainer* pc, void* userdata) { SpotifyClient* me = reinterpret_cast(userdata); // Install callbacks on all the playlists sp_playlist_add_callbacks(sp_session_starred_create(me->session_), &me->get_playlists_callbacks_, me); const int count = sp_playlistcontainer_num_playlists(pc); for (int i = 0; i < count; ++i) { sp_playlist* playlist = sp_playlistcontainer_playlist(pc, i); sp_playlist_add_callbacks(playlist, &me->get_playlists_callbacks_, me); } me->SendPlaylistList(); } void SpotifyClient::PlaylistAddedCallback(sp_playlistcontainer* pc, sp_playlist* playlist, int position, void* userdata) { SpotifyClient* me = reinterpret_cast(userdata); // Install callbacks on this playlist sp_playlist_add_callbacks(playlist, &me->get_playlists_callbacks_, me); me->SendPlaylistList(); } void SpotifyClient::PlaylistMovedCallback(sp_playlistcontainer* pc, sp_playlist* playlist, int position, int new_position, void* userdata) { SpotifyClient* me = reinterpret_cast(userdata); me->SendPlaylistList(); } void SpotifyClient::PlaylistRemovedCallback(sp_playlistcontainer* pc, sp_playlist* playlist, int position, void* userdata) { SpotifyClient* me = reinterpret_cast(userdata); // Remove callbacks from this playlist sp_playlist_remove_callbacks(playlist, &me->get_playlists_callbacks_, me); me->SendPlaylistList(); } void SpotifyClient::SendPlaylistList() { pb::spotify::Message message; pb::spotify::Playlists* response = message.mutable_playlists_updated(); sp_playlistcontainer* container = sp_session_playlistcontainer(session_); if (!container) { qLog(Warning) << "sp_session_playlistcontainer returned nullptr"; return; } const int count = sp_playlistcontainer_num_playlists(container); for (int i = 0; i < count; ++i) { const int type = sp_playlistcontainer_playlist_type(container, i); sp_playlist* playlist = sp_playlistcontainer_playlist(container, i); const bool is_loaded = sp_playlist_is_loaded(playlist); qLog(Debug) << "Got playlist" << i << is_loaded << type << sp_playlist_name(playlist); if (!is_loaded) { qLog(Info) << "Playlist is not loaded yet, waiting..."; return; } if (type != SP_PLAYLIST_TYPE_PLAYLIST) { // Just ignore folders for now continue; } pb::spotify::Playlists::Playlist* msg = response->add_playlist(); msg->set_index(i); msg->set_name(sp_playlist_name(playlist)); sp_user* playlist_owner = sp_playlist_owner(playlist); msg->set_is_mine(sp_session_user(session_) == playlist_owner); msg->set_owner(sp_user_display_name(playlist_owner)); sp_playlist_offline_status offline_status = sp_playlist_get_offline_status(session_, playlist); const bool is_offline = offline_status == SP_PLAYLIST_OFFLINE_STATUS_YES; msg->set_is_offline(is_offline); if (offline_status == SP_PLAYLIST_OFFLINE_STATUS_DOWNLOADING) { msg->set_download_progress( sp_playlist_get_offline_download_completed(session_, playlist)); } else if (offline_status == SP_PLAYLIST_OFFLINE_STATUS_WAITING) { msg->set_download_progress(0); } msg->set_nb_tracks(sp_playlist_num_tracks(playlist)); // URI - Blugh char uri[256]; sp_link* link = sp_link_create_from_playlist(playlist); sp_link_as_string(link, uri, arraysize(uri)); sp_link_release(link); msg->set_uri(uri); } SendMessage(message); } sp_playlist* SpotifyClient::GetPlaylist(pb::spotify::PlaylistType type, int user_index) { sp_playlist* playlist = nullptr; switch (type) { case pb::spotify::Inbox: playlist = sp_session_inbox_create(session_); break; case pb::spotify::Starred: playlist = sp_session_starred_create(session_); break; case pb::spotify::UserPlaylist: { sp_playlistcontainer* pc = sp_session_playlistcontainer(session_); if (pc && user_index <= sp_playlistcontainer_num_playlists(pc)) { if (sp_playlistcontainer_playlist_type(pc, user_index) == SP_PLAYLIST_TYPE_PLAYLIST) { playlist = sp_playlistcontainer_playlist(pc, user_index); sp_playlist_add_ref(playlist); } } break; } } return playlist; } void SpotifyClient::LoadPlaylist(const pb::spotify::LoadPlaylistRequest& req) { PendingLoadPlaylist pending_load; pending_load.request_ = req; pending_load.playlist_ = GetPlaylist(req.type(), req.user_playlist_index()); // A null playlist might mean the user wasn't logged in, or an invalid // playlist index was requested, so we'd better return an error straight away. if (!pending_load.playlist_) { qLog(Warning) << "Invalid playlist requested or not logged in"; pb::spotify::Message message; pb::spotify::LoadPlaylistResponse* response = message.mutable_load_playlist_response(); *response->mutable_request() = req; SendMessage(message); return; } sp_playlist_add_callbacks(pending_load.playlist_, &load_playlist_callbacks_, this); pending_load_playlists_ << pending_load; PlaylistStateChangedForLoadPlaylist(pending_load.playlist_, this); } void SpotifyClient::SyncPlaylist(const pb::spotify::SyncPlaylistRequest& req) { sp_playlist* playlist = GetPlaylist(req.request().type(), req.request().user_playlist_index()); // The playlist should already be loaded. sp_playlist_set_offline_mode(session_, playlist, req.offline_sync()); } void SpotifyClient::PlaylistStateChangedForLoadPlaylist(sp_playlist* pl, void* userdata) { SpotifyClient* me = reinterpret_cast(userdata); // If the playlist isn't loaded yet we have to wait if (!sp_playlist_is_loaded(pl)) { qLog(Debug) << "Playlist isn't loaded yet, waiting"; return; } // Find this playlist's pending load object int pending_load_index = -1; PendingLoadPlaylist* pending_load = nullptr; for (int i = 0; i < me->pending_load_playlists_.count(); ++i) { if (me->pending_load_playlists_[i].playlist_ == pl) { pending_load_index = i; pending_load = &me->pending_load_playlists_[i]; break; } } if (!pending_load) { qLog(Warning) << "Playlist not found in pending load list"; return; } // If the playlist was just loaded then get all its tracks and ref them if (pending_load->tracks_.isEmpty()) { const int count = sp_playlist_num_tracks(pl); for (int i = 0; i < count; ++i) { sp_track* track = sp_playlist_track(pl, i); sp_track_add_ref(track); pending_load->tracks_ << track; } } // If any of the tracks aren't loaded yet we have to wait for (sp_track* track : pending_load->tracks_) { if (!sp_track_is_loaded(track)) { qLog(Debug) << "One or more tracks aren't loaded yet, waiting"; return; } } // Everything is loaded so send the response protobuf and unref everything. pb::spotify::Message message; pb::spotify::LoadPlaylistResponse* response = message.mutable_load_playlist_response(); // For some reason, we receive the starred tracks in reverse order but not // other playlists. if (pending_load->request_.type() == pb::spotify::Starred) { std::reverse(pending_load->tracks_.begin(), pending_load->tracks_.end()); } *response->mutable_request() = pending_load->request_; for (sp_track* track : pending_load->tracks_) { me->ConvertTrack(track, response->add_track()); sp_track_release(track); } me->SendMessage(message); // Unref the playlist and remove our callbacks sp_playlist_remove_callbacks(pl, &me->load_playlist_callbacks_, me); sp_playlist_release(pl); // Remove the pending load object me->pending_load_playlists_.removeAt(pending_load_index); } void SpotifyClient::PlaylistStateChangedForGetPlaylists(sp_playlist* pl, void* userdata) { SpotifyClient* me = reinterpret_cast(userdata); me->SendPlaylistList(); } void SpotifyClient::AddTracksToPlaylist( const pb::spotify::AddTracksToPlaylistRequest& req) { // Get the playlist we want to update sp_playlist* playlist = GetPlaylist(req.playlist_type(), req.playlist_index()); if (!playlist) { qLog(Error) << "Playlist " << req.playlist_type() << "," << req.playlist_index() << "not found"; return; } // Get the tracks we want to add std::unique_ptr tracks_array( new sp_track* [req.track_uri_size()]); for (int i = 0; i < req.track_uri_size(); ++i) { sp_link* track_link = sp_link_create_from_string(req.track_uri(i).c_str()); sp_track* track = sp_link_as_track(track_link); sp_track_add_ref(track); sp_link_release(track_link); if (!track) { qLog(Error) << "Track" << QString::fromStdString(req.track_uri(i)) << "not found"; } tracks_array[i] = track; } // Actually add the tracks to the playlist if (sp_playlist_add_tracks(playlist, tracks_array.get(), req.track_uri_size(), 0 /* TODO: don't insert at a hardcoded position */, session_) != SP_ERROR_OK) { qLog(Error) << "Error when adding tracks!"; } // Clean everything for (int i = 0; i < req.track_uri_size(); ++i) { sp_track_release(tracks_array[i]); } } void SpotifyClient::RemoveTracksFromPlaylist( const pb::spotify::RemoveTracksFromPlaylistRequest& req) { // Get the playlist we want to update sp_playlist* playlist = GetPlaylist(req.playlist_type(), req.playlist_index()); if (!playlist) { qLog(Error) << "Playlist " << req.playlist_type() << "," << req.playlist_index() << "not found"; return; } // Get the position of the tracks we want to remove std::unique_ptr tracks_indices_array(new int[req.track_index_size()]); for (int i = 0; i < req.track_index_size(); ++i) { tracks_indices_array[i] = req.track_index(i); } // WTF: sp_playlist_remove_tracks indexes start from the end for starred // playlist, not from the beginning like other playlists: reverse them if (req.playlist_type() == pb::spotify::Starred) { int num_tracks = sp_playlist_num_tracks(playlist); for (int i = 0; i < req.track_index_size(); i++) { tracks_indices_array[i] = num_tracks - tracks_indices_array[i] - 1; } } if (sp_playlist_remove_tracks(playlist, tracks_indices_array.get(), req.track_index_size()) != SP_ERROR_OK) { qLog(Error) << "Error when removing tracks!"; } } void SpotifyClient::ConvertTrack(sp_track* track, pb::spotify::Track* pb) { sp_album* album = sp_track_album(track); pb->set_starred(sp_track_is_starred(session_, track)); pb->set_title(sp_track_name(track)); pb->set_album(sp_album_name(album)); pb->set_year(sp_album_year(album)); pb->set_duration_msec(sp_track_duration(track)); pb->set_popularity(sp_track_popularity(track)); pb->set_disc(sp_track_disc(track)); pb->set_track(sp_track_index(track)); // Album art const QByteArray art_id(reinterpret_cast(sp_album_cover( sp_track_album(track), SP_IMAGE_SIZE_LARGE)), kSpotifyImageIDSize); const QString art_id_b64 = QString::fromAscii(art_id.toBase64()); pb->set_album_art_id(DataCommaSizeFromQString(art_id_b64)); // Artists for (int i = 0; i < sp_track_num_artists(track); ++i) { pb->add_artist(sp_artist_name(sp_track_artist(track, i))); } // URI - Blugh char uri[256]; sp_link* link = sp_link_create_from_track(track, 0); sp_link_as_string(link, uri, arraysize(uri)); sp_link_release(link); pb->set_uri(uri); } void SpotifyClient::ConvertAlbum(sp_album* album, pb::spotify::Track* pb) { pb->set_album(sp_album_name(album)); pb->set_year(sp_album_year(album)); pb->add_artist(sp_artist_name(sp_album_artist(album))); // These fields were required in a previous version so need to set them again // now. pb->mutable_title(); pb->set_duration_msec(-1); pb->set_popularity(-1); pb->set_disc(-1); pb->set_track(-1); pb->set_starred(false); // Album art const QByteArray art_id( reinterpret_cast(sp_album_cover(album, SP_IMAGE_SIZE_LARGE)), kSpotifyImageIDSize); const QString art_id_b64 = QString::fromAscii(art_id.toBase64()); pb->set_album_art_id(DataCommaSizeFromQString(art_id_b64)); // URI - Blugh char uri[256]; sp_link* link = sp_link_create_from_album(album); sp_link_as_string(link, uri, arraysize(uri)); sp_link_release(link); pb->set_uri(uri); } void SpotifyClient::ConvertAlbumBrowse(sp_albumbrowse* browse, pb::spotify::Track* pb) { pb->set_track(sp_albumbrowse_num_tracks(browse)); } void SpotifyClient::MetadataUpdatedCallback(sp_session* session) { SpotifyClient* me = reinterpret_cast(sp_session_userdata(session)); for (const PendingLoadPlaylist& load : me->pending_load_playlists_) { PlaylistStateChangedForLoadPlaylist(load.playlist_, me); } for (const PendingPlaybackRequest& playback : me->pending_playback_requests_) { me->TryPlaybackAgain(playback); } } int SpotifyClient::MusicDeliveryCallback(sp_session* session, const sp_audioformat* format, const void* frames, int num_frames) { SpotifyClient* me = reinterpret_cast(sp_session_userdata(session)); if (!me->media_pipeline_) { return 0; } if (num_frames == 0) { return 0; } if (!me->media_pipeline_->is_initialised()) { if (!me->media_pipeline_->Init(format->sample_rate, format->channels)) { qLog(Warning) << "Failed to intitialise media pipeline"; sp_session_player_unload(me->session_); me->media_pipeline_.reset(); return 0; } } if (!me->media_pipeline_->is_accepting_data()) { return 0; } me->media_pipeline_->WriteData(reinterpret_cast(frames), num_frames * format->channels * 2); return num_frames; } void SpotifyClient::EndOfTrackCallback(sp_session* session) { SpotifyClient* me = reinterpret_cast(sp_session_userdata(session)); me->media_pipeline_.reset(); } void SpotifyClient::StreamingErrorCallback(sp_session* session, sp_error error) { SpotifyClient* me = reinterpret_cast(sp_session_userdata(session)); me->media_pipeline_.reset(); // Send the error me->SendPlaybackError(QString::fromUtf8(sp_error_message(error))); } void SpotifyClient::ConnectionErrorCallback(sp_session* session, sp_error error) { qLog(Debug) << Q_FUNC_INFO << sp_error_message(error); } void SpotifyClient::UserMessageCallback(sp_session* session, const char* message) { qLog(Debug) << Q_FUNC_INFO << message; } void SpotifyClient::StartPlaybackCallback(sp_session* session) { qLog(Debug) << Q_FUNC_INFO; } void SpotifyClient::StopPlaybackCallback(sp_session* session) { qLog(Debug) << Q_FUNC_INFO; } void SpotifyClient::OfflineStatusUpdatedCallback(sp_session* session) { SpotifyClient* me = reinterpret_cast(sp_session_userdata(session)); sp_playlistcontainer* container = sp_session_playlistcontainer(session); if (!container) { qLog(Warning) << "sp_session_playlistcontainer returned nullptr"; return; } const int count = sp_playlistcontainer_num_playlists(container); for (int i = 0; i < count; ++i) { const sp_playlist_type type = sp_playlistcontainer_playlist_type(container, i); sp_playlist* playlist = sp_playlistcontainer_playlist(container, i); if (type != SP_PLAYLIST_TYPE_PLAYLIST) { // Just ignore folders for now continue; } int download_progress = me->GetDownloadProgress(playlist); if (download_progress != -1) { me->SendDownloadProgress(pb::spotify::UserPlaylist, i, download_progress); } } sp_playlist* inbox = sp_session_inbox_create(session); int download_progress = me->GetDownloadProgress(inbox); sp_playlist_release(inbox); if (download_progress != -1) { me->SendDownloadProgress(pb::spotify::Inbox, -1, download_progress); } sp_playlist* starred = sp_session_starred_create(session); download_progress = me->GetDownloadProgress(starred); sp_playlist_release(starred); if (download_progress != -1) { me->SendDownloadProgress(pb::spotify::Starred, -1, download_progress); } } void SpotifyClient::SendDownloadProgress(pb::spotify::PlaylistType type, int index, int download_progress) { pb::spotify::Message message; pb::spotify::SyncPlaylistProgress* progress = message.mutable_sync_playlist_progress(); progress->mutable_request()->set_type(type); if (index != -1) { progress->mutable_request()->set_user_playlist_index(index); } progress->set_sync_progress(download_progress); SendMessage(message); } int SpotifyClient::GetDownloadProgress(sp_playlist* playlist) { sp_playlist_offline_status status = sp_playlist_get_offline_status(session_, playlist); switch (status) { case SP_PLAYLIST_OFFLINE_STATUS_NO: return -1; case SP_PLAYLIST_OFFLINE_STATUS_YES: return 100; case SP_PLAYLIST_OFFLINE_STATUS_DOWNLOADING: return sp_playlist_get_offline_download_completed(session_, playlist); case SP_PLAYLIST_OFFLINE_STATUS_WAITING: return 0; } return -1; } void SpotifyClient::StartPlayback(const pb::spotify::PlaybackRequest& req) { // Get a link object from the URI sp_link* link = sp_link_create_from_string(req.track_uri().c_str()); if (!link) { SendPlaybackError("Invalid Spotify URI"); return; } // Get the track from the link sp_track* track = sp_link_as_track(link); if (!track) { SendPlaybackError("Spotify URI was not a track"); sp_link_release(link); return; } PendingPlaybackRequest pending_playback; pending_playback.request_ = req; pending_playback.link_ = link; pending_playback.track_ = track; pending_playback_requests_ << pending_playback; TryPlaybackAgain(pending_playback); } void SpotifyClient::Seek(qint64 offset_nsec) { // TODO qLog(Error) << "TODO seeking"; } void SpotifyClient::TryPlaybackAgain(const PendingPlaybackRequest& req) { // If the track was not loaded then we have to come back later if (!sp_track_is_loaded(req.track_)) { qLog(Debug) << "Playback track not loaded yet, will try again later"; return; } // Load the track sp_error error = sp_session_player_load(session_, req.track_); if (error != SP_ERROR_OK) { SendPlaybackError("Spotify playback error: " + QString::fromUtf8(sp_error_message(error))); sp_link_release(req.link_); // Remove this from the pending list now pending_playback_requests_.removeAll(req); return; } // Create the media socket media_pipeline_.reset(new MediaPipeline(req.request_.media_port(), sp_track_duration(req.track_))); qLog(Info) << "Starting playback of uri" << req.request_.track_uri().c_str() << "to port" << req.request_.media_port(); // Start playback sp_session_player_play(session_, true); sp_link_release(req.link_); // Remove this from the pending list now pending_playback_requests_.removeAll(req); } void SpotifyClient::SendPlaybackError(const QString& error) { pb::spotify::Message message; pb::spotify::PlaybackError* msg = message.mutable_playback_error(); msg->set_error(DataCommaSizeFromQString(error)); SendMessage(message); } void SpotifyClient::LoadImage(const QString& id_b64) { QByteArray id = QByteArray::fromBase64(id_b64.toAscii()); if (id.length() != kSpotifyImageIDSize) { qLog(Warning) << "Invalid image ID (did not decode to" << kSpotifyImageIDSize << "bytes):" << id_b64; // Send an error response straight away pb::spotify::Message message; pb::spotify::ImageResponse* msg = message.mutable_image_response(); msg->set_id(DataCommaSizeFromQString(id_b64)); SendMessage(message); return; } PendingImageRequest pending_load; pending_load.id_ = id; pending_load.id_b64_ = id_b64; pending_load.image_ = sp_image_create(session_, reinterpret_cast(id.constData())); pending_image_requests_ << pending_load; if (!image_callbacks_registered_[pending_load.image_]) { sp_image_add_load_callback(pending_load.image_, &ImageLoaded, this); } image_callbacks_registered_[pending_load.image_]++; TryImageAgain(pending_load.image_); } void SpotifyClient::TryImageAgain(sp_image* image) { if (!sp_image_is_loaded(image)) { qLog(Debug) << "Image not loaded, will try again later"; return; } // Find the pending request for this image int index = -1; PendingImageRequest* req = nullptr; for (int i = 0; i < pending_image_requests_.count(); ++i) { if (pending_image_requests_[i].image_ == image) { index = i; req = &pending_image_requests_[i]; break; } } if (index == -1) { qLog(Warning) << "Image not found in pending load list"; return; } // Get the image data size_t size = 0; const void* data = sp_image_data(image, &size); // Send the response pb::spotify::Message message; pb::spotify::ImageResponse* msg = message.mutable_image_response(); msg->set_id(DataCommaSizeFromQString(req->id_b64_)); if (data && size) { msg->set_data(data, size); } SendMessage(message); // Free stuff image_callbacks_registered_[image]--; // TODO: memory leak? // sp_image_remove_load_callback(image, &ImageLoaded, this); image_callbacks_registered_.remove(image); sp_image_release(image); pending_image_requests_.removeAt(index); } void SpotifyClient::ImageLoaded(sp_image* image, void* userdata) { SpotifyClient* me = reinterpret_cast(userdata); me->TryImageAgain(image); } void SpotifyClient::BrowseAlbum(const QString& uri) { // Get a link object from the URI sp_link* link = sp_link_create_from_string(uri.toStdString().c_str()); if (!link) { SendPlaybackError("Invalid Album URI"); return; } // Get the album from the link sp_album* album = sp_link_as_album(link); if (!album) { SendPlaybackError("Spotify URI was not an album"); sp_link_release(link); return; } sp_albumbrowse* browse = sp_albumbrowse_create(session_, album, &AlbumBrowseComplete, this); pending_album_browses_[browse] = uri; } void SpotifyClient::AlbumBrowseComplete(sp_albumbrowse* result, void* userdata) { SpotifyClient* me = reinterpret_cast(userdata); if (!me->pending_album_browses_.contains(result)) return; QString uri = me->pending_album_browses_.take(result); pb::spotify::Message message; pb::spotify::BrowseAlbumResponse* msg = message.mutable_browse_album_response(); msg->set_uri(DataCommaSizeFromQString(uri)); const int count = sp_albumbrowse_num_tracks(result); for (int i = 0; i < count; ++i) { me->ConvertTrack(sp_albumbrowse_track(result, i), msg->add_track()); } me->SendMessage(message); sp_albumbrowse_release(result); } void SpotifyClient::BrowseToplist( const pb::spotify::BrowseToplistRequest& req) { sp_toplistbrowse* browse = sp_toplistbrowse_create( session_, SP_TOPLIST_TYPE_TRACKS, // TODO: Support albums and artists. SP_TOPLIST_REGION_EVERYWHERE, // TODO: Support other regions. nullptr, &ToplistBrowseComplete, this); pending_toplist_browses_[browse] = req; } void SpotifyClient::SetPaused(const pb::spotify::PauseRequest& req) { sp_session_player_play(session_, !req.paused()); } void SpotifyClient::ToplistBrowseComplete(sp_toplistbrowse* result, void* userdata) { SpotifyClient* me = reinterpret_cast(userdata); qLog(Debug) << "Toplist browse request took:" << sp_toplistbrowse_backend_request_duration(result) << "ms"; if (!me->pending_toplist_browses_.contains(result)) { return; } const pb::spotify::BrowseToplistRequest& request = me->pending_toplist_browses_.take(result); pb::spotify::Message message; pb::spotify::BrowseToplistResponse* msg = message.mutable_browse_toplist_response(); msg->mutable_request()->CopyFrom(request); const int count = sp_toplistbrowse_num_tracks(result); for (int i = 0; i < count; ++i) { me->ConvertTrack(sp_toplistbrowse_track(result, i), msg->add_track()); } me->SendMessage(message); sp_toplistbrowse_release(result); } void SpotifyClient::DeviceClosed() { AbstractMessageHandler::DeviceClosed(); qApp->exit(); } clementine-1.2.3+git1354-gdaddbde+dfsg/ext/clementine-spotifyblob/spotifyclient.h000066400000000000000000000166271260417502300277250ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // Note: this file is licensed under the Apache License instead of GPL because // it is used by the Spotify blob which links against libspotify and is not GPL // compatible. #ifndef SPOTIFYCLIENT_H #define SPOTIFYCLIENT_H #include "spotifymessages.pb.h" #include "core/messagehandler.h" #include #include #include class QTcpSocket; class QTimer; class MediaPipeline; class ResponseMessage; class SpotifyClient : public AbstractMessageHandler { Q_OBJECT public: SpotifyClient(QObject* parent = nullptr); ~SpotifyClient(); static const int kSpotifyImageIDSize; static const int kWaveHeaderSize; void Init(quint16 port); protected: void MessageArrived(const pb::spotify::Message& message); void DeviceClosed(); private slots: void ProcessEvents(); private: void SendLoginCompleted(bool success, const QString& error, pb::spotify::LoginResponse_Error error_code); void SendPlaybackError(const QString& error); void SendSearchResponse(sp_search* result); // Spotify session callbacks. static void SP_CALLCONV LoggedInCallback(sp_session* session, sp_error error); static void SP_CALLCONV NotifyMainThreadCallback(sp_session* session); static void SP_CALLCONV LogMessageCallback(sp_session* session, const char* data); static void SP_CALLCONV SearchCompleteCallback(sp_search* result, void* userdata); static void SP_CALLCONV MetadataUpdatedCallback(sp_session* session); static int SP_CALLCONV MusicDeliveryCallback(sp_session* session, const sp_audioformat* format, const void* frames, int num_frames); static void SP_CALLCONV EndOfTrackCallback(sp_session* session); static void SP_CALLCONV StreamingErrorCallback(sp_session* session, sp_error error); static void SP_CALLCONV OfflineStatusUpdatedCallback(sp_session* session); static void SP_CALLCONV ConnectionErrorCallback(sp_session* session, sp_error error); static void SP_CALLCONV UserMessageCallback(sp_session* session, const char* message); static void SP_CALLCONV StartPlaybackCallback(sp_session* session); static void SP_CALLCONV StopPlaybackCallback(sp_session* session); // Spotify playlist container callbacks. static void SP_CALLCONV PlaylistAddedCallback(sp_playlistcontainer* pc, sp_playlist* playlist, int position, void* userdata); static void SP_CALLCONV PlaylistRemovedCallback(sp_playlistcontainer* pc, sp_playlist* playlist, int position, void* userdata); static void SP_CALLCONV PlaylistMovedCallback(sp_playlistcontainer* pc, sp_playlist* playlist, int position, int new_position, void* userdata); static void SP_CALLCONV PlaylistContainerLoadedCallback(sp_playlistcontainer* pc, void* userdata); // Spotify playlist callbacks - when loading the list of playlists // initially static void SP_CALLCONV PlaylistStateChangedForGetPlaylists(sp_playlist* pl, void* userdata); // Spotify playlist callbacks - when loading a playlist static void SP_CALLCONV PlaylistStateChangedForLoadPlaylist(sp_playlist* pl, void* userdata); // Spotify image callbacks. static void SP_CALLCONV ImageLoaded(sp_image* image, void* userdata); // Spotify album browse callbacks. static void SP_CALLCONV SearchAlbumBrowseComplete(sp_albumbrowse* result, void* userdata); static void SP_CALLCONV AlbumBrowseComplete(sp_albumbrowse* result, void* userdata); // Spotify toplist browse callbacks. static void SP_CALLCONV ToplistBrowseComplete(sp_toplistbrowse* result, void* userdata); // Request handlers. void Login(const pb::spotify::LoginRequest& req); void Search(const pb::spotify::SearchRequest& req); void LoadPlaylist(const pb::spotify::LoadPlaylistRequest& req); void SyncPlaylist(const pb::spotify::SyncPlaylistRequest& req); void AddTracksToPlaylist(const pb::spotify::AddTracksToPlaylistRequest& req); void RemoveTracksFromPlaylist( const pb::spotify::RemoveTracksFromPlaylistRequest& req); void StartPlayback(const pb::spotify::PlaybackRequest& req); void Seek(qint64 offset_nsec); void LoadImage(const QString& id_b64); void BrowseAlbum(const QString& uri); void BrowseToplist(const pb::spotify::BrowseToplistRequest& req); void SetPlaybackSettings(const pb::spotify::PlaybackSettings& req); void SetPaused(const pb::spotify::PauseRequest& req); void SendPlaylistList(); void ConvertTrack(sp_track* track, pb::spotify::Track* pb); void ConvertAlbum(sp_album* album, pb::spotify::Track* pb); void ConvertAlbumBrowse(sp_albumbrowse* browse, pb::spotify::Track* pb); // Gets the appropriate sp_playlist* but does not load it. sp_playlist* GetPlaylist(pb::spotify::PlaylistType type, int user_index); private: struct PendingLoadPlaylist { pb::spotify::LoadPlaylistRequest request_; sp_playlist* playlist_; QList tracks_; bool offline_sync; }; struct PendingPlaybackRequest { pb::spotify::PlaybackRequest request_; sp_link* link_; sp_track* track_; bool operator==(const PendingPlaybackRequest& other) const { return request_.track_uri() == other.request_.track_uri() && request_.media_port() == other.request_.media_port(); } }; struct PendingImageRequest { QString id_b64_; QByteArray id_; sp_image* image_; }; void TryPlaybackAgain(const PendingPlaybackRequest& req); void TryImageAgain(sp_image* image); int GetDownloadProgress(sp_playlist* playlist); void SendDownloadProgress(pb::spotify::PlaylistType type, int index, int download_progress); QByteArray api_key_; QTcpSocket* protocol_socket_; sp_session_config spotify_config_; sp_session_callbacks spotify_callbacks_; sp_playlistcontainer_callbacks playlistcontainer_callbacks_; sp_playlist_callbacks get_playlists_callbacks_; sp_playlist_callbacks load_playlist_callbacks_; sp_session* session_; QTimer* events_timer_; QList pending_load_playlists_; QList pending_playback_requests_; QList pending_image_requests_; QMap image_callbacks_registered_; QMap pending_searches_; QMap pending_album_browses_; QMap pending_toplist_browses_; QMap> pending_search_album_browses_; QMap pending_search_album_browse_responses_; QScopedPointer media_pipeline_; }; #endif // SPOTIFYCLIENT_H clementine-1.2.3+git1354-gdaddbde+dfsg/ext/clementine-spotifyblob/spotifykey.h000066400000000000000000000031351260417502300272250ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // Note: this file is licensed under the Apache License instead of GPL because // it is used by the Spotify blob which links against libspotify and is not GPL // compatible. // The Spotify terms of service require that application keys are not // accessible to third parties. Therefore this application key is heavily // encrypted here in the source to prevent third parties from viewing it. // It is most definitely not base64 encoded. static const char* kSpotifyApiKey = "AVlOrvJkKx8T+LEsCk+Kyl24I0MSsjohZAtMFzm2O5Lms1bmAWFWgdZaHkpypzSJPmSd+" "Wi50wwg" "JwVCU0sq4Lep1zB4t6Z8h26NK6+z8gmkHVkV9DRPkRgebcUkWTDTflwVPKWF4+" "gdRjUwprsqBw6O" "iofRLJzeKaxbmaUGqkSkxVLOiXC9lxylNq6ju7Q7uY8u8XkDUsVM3YIxiWy2+EM7I/" "lhatzT9xrq" "rxHe2lg7CzOwF5kuFdwgmi8MQ72xTYXIKnNlOry/" "hJDlN9lKxkbUBLh+pzbYvO92S2fYKK5PAHvX" "5+SmSBGbh6dlpHeCGqb8MPdaeZ5I1YxMcDkxa2+tbLA/Muat7gKA9u57TFCtYjun/u/i/" "ONwdBIQ" "rePzXZjipO32kYmQAiCkN1p8sgQEcF43QxaVwXGo2X0rRnJf"; clementine-1.2.3+git1354-gdaddbde+dfsg/ext/clementine-tagreader/000077500000000000000000000000001260417502300242465ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/ext/clementine-tagreader/CMakeLists.txt000066400000000000000000000024741260417502300270150ustar00rootroot00000000000000include_directories(${PROTOBUF_INCLUDE_DIRS}) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${CMAKE_CURRENT_BINARY_DIR}) include_directories(${CMAKE_SOURCE_DIR}/ext/libclementine-common) include_directories(${CMAKE_SOURCE_DIR}/ext/libclementine-tagreader) include_directories(${CMAKE_BINARY_DIR}/ext/libclementine-tagreader) include_directories(${CMAKE_SOURCE_DIR}/src) include_directories(${CMAKE_BINARY_DIR}/src) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++0x -U__STRICT_ANSI__") set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}) set(SOURCES main.cpp tagreaderworker.cpp ) qt4_wrap_cpp(MOC ${HEADERS}) qt4_add_resources(QRC data/data.qrc) add_executable(clementine-tagreader ${SOURCES} ${MOC} ${QRC} ) target_link_libraries(clementine-tagreader ${TAGLIB_LIBRARIES} ${QT_QTCORE_LIBRARY} ${QT_QTNETWORK_LIBRARY} libclementine-common libclementine-tagreader ) if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") target_link_libraries(clementine-tagreader execinfo ) endif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") if(APPLE) target_link_libraries(clementine-tagreader /System/Library/Frameworks/Foundation.framework ) endif(APPLE) if(NOT APPLE) # macdeploy.py takes care of this on mac install(TARGETS clementine-tagreader RUNTIME DESTINATION bin ) endif(NOT APPLE) clementine-1.2.3+git1354-gdaddbde+dfsg/ext/clementine-tagreader/data/000077500000000000000000000000001260417502300251575ustar00rootroot00000000000000Equifax_Secure_Certificate_Authority.pem000066400000000000000000000021671260417502300350730ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/ext/clementine-tagreader/data-----BEGIN CERTIFICATE----- MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y 7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh 1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 -----END CERTIFICATE----- clementine-1.2.3+git1354-gdaddbde+dfsg/ext/clementine-tagreader/data/data.qrc000066400000000000000000000002261260417502300265770ustar00rootroot00000000000000 Equifax_Secure_Certificate_Authority.pem godaddy-root.pem clementine-1.2.3+git1354-gdaddbde+dfsg/ext/clementine-tagreader/data/godaddy-root.pem000066400000000000000000000026501260417502300302610ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h /t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf ReYNnyicsbkqWletNw+vHX/bvZ8= -----END CERTIFICATE----- clementine-1.2.3+git1354-gdaddbde+dfsg/ext/clementine-tagreader/main.cpp000066400000000000000000000041061260417502300256770ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "tagreaderworker.h" #include "core/logging.h" #include #include #include #include #include #include int main(int argc, char** argv) { QCoreApplication a(argc, argv); QStringList args(a.arguments()); if (args.count() != 2) { std::cerr << "This program is used internally by Clementine to parse tags " "in music files\n" "without exposing the whole application to crashes caused by " "malformed\n" "files. It is not meant to be run on its own.\n"; return 1; } // Seed random number generator timeval time; gettimeofday(&time, nullptr); qsrand((time.tv_sec * 1000) + (time.tv_usec / 1000)); logging::Init(); qLog(Info) << "TagReader worker connecting to" << args[1]; // Connect to the parent process. QLocalSocket socket; socket.connectToServer(args[1]); if (!socket.waitForConnected(2000)) { std::cerr << "Failed to connect to the parent process.\n"; return 1; } QSslSocket::addDefaultCaCertificates( QSslCertificate::fromPath(":/certs/godaddy-root.pem", QSsl::Pem)); QSslSocket::addDefaultCaCertificates(QSslCertificate::fromPath( ":/certs/Equifax_Secure_Certificate_Authority.pem", QSsl::Pem)); TagReaderWorker worker(&socket); return a.exec(); } clementine-1.2.3+git1354-gdaddbde+dfsg/ext/clementine-tagreader/tagreaderworker.cpp000066400000000000000000000074141260417502300301500ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "tagreaderworker.h" #include #include #include #include #include #include TagReaderWorker::TagReaderWorker(QIODevice* socket, QObject* parent) : AbstractMessageHandler(socket, parent) {} void TagReaderWorker::MessageArrived(const pb::tagreader::Message& message) { pb::tagreader::Message reply; #if 0 // Crash every few requests if (qrand() % 10 == 0) { qLog(Debug) << "Crashing on request ID" << message.id(); abort(); } #endif if (message.has_read_file_request()) { tag_reader_.ReadFile( QStringFromStdString(message.read_file_request().filename()), reply.mutable_read_file_response()->mutable_metadata()); } else if (message.has_save_file_request()) { reply.mutable_save_file_response()->set_success(tag_reader_.SaveFile( QStringFromStdString(message.save_file_request().filename()), message.save_file_request().metadata())); } else if (message.has_save_song_statistics_to_file_request()) { reply.mutable_save_song_statistics_to_file_response()->set_success( tag_reader_.SaveSongStatisticsToFile( QStringFromStdString( message.save_song_statistics_to_file_request().filename()), message.save_song_statistics_to_file_request().metadata())); } else if (message.has_save_song_rating_to_file_request()) { reply.mutable_save_song_rating_to_file_response()->set_success( tag_reader_.SaveSongRatingToFile( QStringFromStdString( message.save_song_rating_to_file_request().filename()), message.save_song_rating_to_file_request().metadata())); } else if (message.has_is_media_file_request()) { reply.mutable_is_media_file_response()->set_success(tag_reader_.IsMediaFile( QStringFromStdString(message.is_media_file_request().filename()))); } else if (message.has_load_embedded_art_request()) { QByteArray data = tag_reader_.LoadEmbeddedArt( QStringFromStdString(message.load_embedded_art_request().filename())); reply.mutable_load_embedded_art_response()->set_data(data.constData(), data.size()); } else if (message.has_read_cloud_file_request()) { #ifdef HAVE_GOOGLE_DRIVE const pb::tagreader::ReadCloudFileRequest& req = message.read_cloud_file_request(); if (!tag_reader_.ReadCloudFile( QUrl::fromEncoded(QByteArray(req.download_url().data(), req.download_url().size())), QStringFromStdString(req.title()), req.size(), QStringFromStdString(req.mime_type()), QStringFromStdString(req.authorisation_header()), reply.mutable_read_cloud_file_response()->mutable_metadata())) { reply.mutable_read_cloud_file_response()->clear_metadata(); } #endif } SendReply(message, &reply); } void TagReaderWorker::DeviceClosed() { AbstractMessageHandler::DeviceClosed(); qApp->exit(); } clementine-1.2.3+git1354-gdaddbde+dfsg/ext/clementine-tagreader/tagreaderworker.h000066400000000000000000000022761260417502300276160ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef TAGREADERWORKER_H #define TAGREADERWORKER_H #include "config.h" #include "tagreader.h" #include "tagreadermessages.pb.h" #include "core/messagehandler.h" class TagReaderWorker : public AbstractMessageHandler { public: TagReaderWorker(QIODevice* socket, QObject* parent = NULL); protected: void MessageArrived(const pb::tagreader::Message& message); void DeviceClosed(); private: TagReader tag_reader_; }; #endif // TAGREADERWORKER_H clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-common/000077500000000000000000000000001260417502300242675ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-common/CMakeLists.txt000066400000000000000000000014221260417502300270260ustar00rootroot00000000000000include_directories(${PROTOBUF_INCLUDE_DIRS}) include_directories(${CMAKE_CURRENT_BINARY_DIR}) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${CMAKE_SOURCE_DIR}/src) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++0x") set(SOURCES core/closure.cpp core/logging.cpp core/messagehandler.cpp core/messagereply.cpp core/waitforsignal.cpp core/workerpool.cpp ) set(HEADERS core/closure.h core/messagehandler.h core/messagereply.h core/workerpool.h ) if(APPLE) list(APPEND SOURCES core/scoped_nsautorelease_pool.mm) endif(APPLE) qt4_wrap_cpp(MOC ${HEADERS}) add_library(libclementine-common STATIC ${SOURCES} ${MOC} ) target_link_libraries(libclementine-common ${PROTOBUF_LIBRARY} ${TAGLIB_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ) clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-common/core/000077500000000000000000000000001260417502300252175ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-common/core/arraysize.h000066400000000000000000000026221260417502300274030ustar00rootroot00000000000000// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // From Chromium src/base/macros.h #include // For size_t. // The arraysize(arr) macro returns the # of elements in an array arr. // The expression is a compile-time constant, and therefore can be // used in defining new arrays, for example. If you use arraysize on // a pointer by mistake, you will get a compile-time error. // // One caveat is that arraysize() doesn't accept any array of an // anonymous type or a type defined inside a function. In these rare // cases, you have to use the unsafe ARRAYSIZE_UNSAFE() macro below. This is // due to a limitation in C++'s template system. The limitation might // eventually be removed, but it hasn't happened yet. // This template function declaration is used in defining arraysize. // Note that the function doesn't need an implementation, as we only // use its type. template char (&ArraySizeHelper(T (&array)[N]))[N]; // That gcc wants both of these prototypes seems mysterious. VC, for // its part, can't decide which to use (another mystery). Matching of // template overloads: the final frontier. #ifndef _MSC_VER template char (&ArraySizeHelper(const T (&array)[N]))[N]; #endif #define arraysize(array) (sizeof(ArraySizeHelper(array))) clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-common/core/closure.cpp000066400000000000000000000040531260417502300274010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "closure.h" #include "core/timeconstants.h" namespace _detail { ClosureBase::ClosureBase(ObjectHelper* helper) : helper_(helper) {} ClosureBase::~ClosureBase() {} CallbackClosure::CallbackClosure(QObject* sender, const char* signal, std::function callback) : ClosureBase(new ObjectHelper(sender, signal, this)), callback_(callback) {} void CallbackClosure::Invoke() { callback_(); } ObjectHelper* ClosureBase::helper() const { return helper_; } ObjectHelper::ObjectHelper(QObject* sender, const char* signal, ClosureBase* closure) : closure_(closure) { connect(sender, signal, SLOT(Invoked())); connect(sender, SIGNAL(destroyed()), SLOT(deleteLater())); } void ObjectHelper::Invoked() { closure_->Invoke(); deleteLater(); } void Unpack(QList*) {} } // namespace _detail _detail::ClosureBase* NewClosure(QObject* sender, const char* signal, std::function callback) { return new _detail::CallbackClosure(sender, signal, callback); } void DoAfter(QObject* receiver, const char* slot, int msec) { QTimer::singleShot(msec, receiver, slot); } void DoInAMinuteOrSo(QObject* receiver, const char* slot) { int msec = (60 + (qrand() % 60)) * kMsecPerSec; DoAfter(receiver, slot, msec); } clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-common/core/closure.h000066400000000000000000000155741260417502300270600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CLOSURE_H #define CLOSURE_H #include #include #include #include #include #include #include namespace _detail { class ObjectHelper; // Interface for ObjectHelper to call on signal emission. class ClosureBase { public: virtual ~ClosureBase(); virtual void Invoke() = 0; // Tests only. ObjectHelper* helper() const; protected: explicit ClosureBase(ObjectHelper*); ObjectHelper* helper_; private: Q_DISABLE_COPY(ClosureBase); }; // QObject helper as templated QObjects do not work. // Connects to the given signal and invokes the closure when called. // Deletes itself and the Closure after being invoked. class ObjectHelper : public QObject { Q_OBJECT public: ObjectHelper(QObject* parent, const char* signal, ClosureBase* closure); private slots: void Invoked(); private: std::unique_ptr closure_; Q_DISABLE_COPY(ObjectHelper); }; // Helpers for unpacking a variadic template list. // Base case of no arguments. void Unpack(QList*); template void Unpack(QList* list, const Arg& arg) { list->append(Q_ARG(Arg, arg)); } template void Unpack(QList* list, const Head& head, const Tail&... tail) { Unpack(list, head); Unpack(list, tail...); } template class Closure : public ClosureBase { public: Closure(QObject* sender, const char* signal, QObject* receiver, const char* slot, const Args&... args) : ClosureBase(new ObjectHelper(sender, signal, this)), // std::bind is the easiest way to store an argument list. function_(std::bind(&Closure::Call, this, args...)), receiver_(receiver) { const QMetaObject* meta_receiver = receiver->metaObject(); QByteArray normalised_slot = QMetaObject::normalizedSignature(slot + 1); const int index = meta_receiver->indexOfSlot(normalised_slot.constData()); Q_ASSERT(index != -1); slot_ = meta_receiver->method(index); QObject::connect(receiver_, SIGNAL(destroyed()), helper_, SLOT(deleteLater())); } virtual void Invoke() { function_(); } private: void Call(const Args&... args) { QList arg_list; Unpack(&arg_list, args...); slot_.invoke(receiver_, arg_list.size() > 0 ? arg_list[0] : QGenericArgument(), arg_list.size() > 1 ? arg_list[1] : QGenericArgument(), arg_list.size() > 2 ? arg_list[2] : QGenericArgument(), arg_list.size() > 3 ? arg_list[3] : QGenericArgument(), arg_list.size() > 4 ? arg_list[4] : QGenericArgument(), arg_list.size() > 5 ? arg_list[5] : QGenericArgument(), arg_list.size() > 6 ? arg_list[6] : QGenericArgument(), arg_list.size() > 7 ? arg_list[7] : QGenericArgument(), arg_list.size() > 8 ? arg_list[8] : QGenericArgument(), arg_list.size() > 9 ? arg_list[9] : QGenericArgument()); } std::function function_; QObject* receiver_; QMetaMethod slot_; }; template class SharedClosure : public Closure { public: SharedClosure(QSharedPointer sender, const char* signal, QObject* receiver, const char* slot, const Args&... args) : Closure(sender.data(), signal, receiver, slot, args...), data_(sender) {} private: QSharedPointer data_; }; class CallbackClosure : public ClosureBase { public: CallbackClosure(QObject* sender, const char* signal, std::function callback); virtual void Invoke(); private: std::function callback_; }; } // namespace _detail template _detail::ClosureBase* NewClosure(QObject* sender, const char* signal, QObject* receiver, const char* slot, const Args&... args) { return new _detail::Closure(sender, signal, receiver, slot, args...); } // QSharedPointer variant template _detail::ClosureBase* NewClosure(QSharedPointer sender, const char* signal, QObject* receiver, const char* slot, const Args&... args) { return new _detail::SharedClosure(sender, signal, receiver, slot, args...); } _detail::ClosureBase* NewClosure(QObject* sender, const char* signal, std::function callback); template _detail::ClosureBase* NewClosure(QObject* sender, const char* signal, std::function callback, const Args&... args) { return NewClosure(sender, signal, std::bind(callback, args...)); } template _detail::ClosureBase* NewClosure(QObject* sender, const char* signal, void (*callback)(Args...), const Args&... args) { return NewClosure(sender, signal, std::bind(callback, args...)); } template _detail::ClosureBase* NewClosure(QObject* sender, const char* signal, T* receiver, Unused (T::*callback)(Args...), const Args&... args) { return NewClosure(sender, signal, std::bind(callback, receiver, args...)); } void DoAfter(QObject* receiver, const char* slot, int msec); void DoAfter(std::function callback, std::chrono::milliseconds msec); void DoInAMinuteOrSo(QObject* receiver, const char* slot); template void DoAfter( std::function callback, std::chrono::duration duration) { QTimer* timer = new QTimer; timer->setSingleShot(true); NewClosure(timer, SIGNAL(timeout()), callback); QObject::connect(timer, SIGNAL(timeout()), timer, SLOT(deleteLater())); std::chrono::milliseconds msec = std::chrono::duration_cast(duration); timer->start(msec.count()); } #endif // CLOSURE_H clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-common/core/concurrentrun.h000066400000000000000000000100361260417502300302770ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CONCURRENTRUN_H #define CONCURRENTRUN_H #include #include #include #include /* The aim of ThreadFunctor classes and ConcurrentRun::Run() functions is to complete QtConcurrentRun, which lack support for using a particular QThreadPool, as it always uses QThreadPool::globalInstance(). This is problematic when we do not want to share the same thread pool over all the application, but want to keep the convenient QtConcurrent::run() functor syntax. With ConcurrentRun::Run(), time critical changes can be performed in their own pool, which is not empty by other actions (as it happens when using QtConcurrentRun::run()). ThreadFunctor classes are used to store a functor and its arguments, and Run() functions are used for convenience: to directly create a new ThreadFunctor object and start it. */ /* Base abstract classes ThreadFunctorBase and ThreadFunctor (for void and non-void result): */ template class ThreadFunctorBase : public QFutureInterface, public QRunnable { public: ThreadFunctorBase() {} QFuture Start(QThreadPool* thread_pool) { this->setRunnable(this); this->reportStarted(); Q_ASSERT(thread_pool); QFuture future = this->future(); thread_pool->start(this, 0 /* priority: currently we do not support changing the priority. Might be added later if needed */); return future; } virtual void run() = 0; }; template class ThreadFunctor : public ThreadFunctorBase { public: ThreadFunctor(std::function function, Args... args) : function_(std::bind(function, args...)) {} virtual void run() { this->reportResult(function_()); this->reportFinished(); } private: std::function function_; }; // Partial specialisation for void return type. template class ThreadFunctor : public ThreadFunctorBase { public: ThreadFunctor(std::function function, Args... args) : function_(std::bind(function, args...)) {} virtual void run() { function_(); this->reportFinished(); } private: std::function function_; }; /* Run functions */ namespace ConcurrentRun { // Empty argument form. template QFuture Run(QThreadPool* threadpool, std::function function) { return (new ThreadFunctor(function))->Start(threadpool); } // Function object with arguments form. template QFuture Run(QThreadPool* threadpool, std::function function, const Args&... args) { return (new ThreadFunctor(function, args...)) ->Start(threadpool); } // Support passing C function pointers instead of function objects. template QFuture Run(QThreadPool* threadpool, ReturnType (*function)(Args...), const Args&... args) { return Run(threadpool, std::function(function), args...); } } #endif // CONCURRENTRUN_H clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-common/core/logging.cpp000066400000000000000000000164531260417502300273620ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // Note: this file is licensed under the Apache License instead of GPL because // it is used by the Spotify blob which links against libspotify and is not GPL // compatible. #include #include #ifdef Q_OS_UNIX #include #endif #include #include #include #include #include "logging.h" namespace logging { static Level sDefaultLevel = Level_Debug; static QMap* sClassLevels = nullptr; static QIODevice* sNullDevice = nullptr; const char* kDefaultLogLevels = "GstEnginePipeline:2,*:3"; static const char* kMessageHandlerMagic = "__logging_message__"; static const int kMessageHandlerMagicLength = strlen(kMessageHandlerMagic); static QtMsgHandler sOriginalMessageHandler = nullptr; void GLog(const char* domain, int level, const char* message, void* user_data) { switch (level) { case G_LOG_FLAG_RECURSION: case G_LOG_FLAG_FATAL: case G_LOG_LEVEL_ERROR: case G_LOG_LEVEL_CRITICAL: qLog(Error) << message; break; case G_LOG_LEVEL_WARNING: qLog(Warning) << message; break; case G_LOG_LEVEL_MESSAGE: case G_LOG_LEVEL_INFO: qLog(Info) << message; break; case G_LOG_LEVEL_DEBUG: default: qLog(Debug) << message; break; } } static void MessageHandler(QtMsgType type, const char* message) { if (strncmp(kMessageHandlerMagic, message, kMessageHandlerMagicLength) == 0) { fprintf(stderr, "%s\n", message + kMessageHandlerMagicLength); return; } Level level = Level_Debug; switch (type) { case QtFatalMsg: case QtCriticalMsg: level = Level_Error; break; case QtWarningMsg: level = Level_Warning; break; case QtDebugMsg: default: level = Level_Debug; break; } for (const QString& line : QString::fromLocal8Bit(message).split('\n')) { CreateLogger(level, "unknown", -1) << line.toLocal8Bit().constData(); } if (type == QtFatalMsg) { abort(); } } void Init() { delete sClassLevels; delete sNullDevice; sClassLevels = new QMap(); sNullDevice = new NullDevice; // Catch other messages from Qt if (!sOriginalMessageHandler) { sOriginalMessageHandler = qInstallMsgHandler(MessageHandler); } } void SetLevels(const QString& levels) { if (!sClassLevels) return; for (const QString& item : levels.split(',')) { const QStringList class_level = item.split(':'); QString class_name; bool ok = false; int level = Level_Error; if (class_level.count() == 1) { level = class_level.last().toInt(&ok); } else if (class_level.count() == 2) { class_name = class_level.first(); level = class_level.last().toInt(&ok); } if (!ok || level < Level_Error || level > Level_Debug) { continue; } if (class_name.isEmpty() || class_name == "*") { sDefaultLevel = (Level)level; } else { sClassLevels->insert(class_name, (Level)level); } } } QString ParsePrettyFunction(const char* pretty_function) { // Get the class name out of the function name. QString class_name = pretty_function; const int paren = class_name.indexOf('('); if (paren != -1) { const int colons = class_name.lastIndexOf("::", paren); if (colons != -1) { class_name = class_name.left(colons); } else { class_name = class_name.left(paren); } } const int space = class_name.lastIndexOf(' '); if (space != -1) { class_name = class_name.mid(space + 1); } return class_name; } QDebug CreateLogger(Level level, const QString& class_name, int line) { // Map the level to a string const char* level_name = nullptr; switch (level) { case Level_Debug: level_name = " DEBUG "; break; case Level_Info: level_name = " INFO "; break; case Level_Warning: level_name = " WARN "; break; case Level_Error: level_name = " ERROR "; break; case Level_Fatal: level_name = " FATAL "; break; } // Check the settings to see if we're meant to show or hide this message. Level threshold_level = sDefaultLevel; if (sClassLevels && sClassLevels->contains(class_name)) { threshold_level = sClassLevels->value(class_name); } if (level > threshold_level) { return QDebug(sNullDevice); } QString function_line = class_name; if (line != -1) { function_line += ":" + QString::number(line); } QtMsgType type = QtDebugMsg; if (level == Level_Fatal) { type = QtFatalMsg; } QDebug ret(type); ret.nospace() << kMessageHandlerMagic << QDateTime::currentDateTime() .toString("hh:mm:ss.zzz") .toAscii() .constData() << level_name << function_line.leftJustified(32).toAscii().constData(); return ret.space(); } QString CXXDemangle(const QString& mangled_function) { int status; char* demangled_function = abi::__cxa_demangle( mangled_function.toAscii().constData(), nullptr, nullptr, &status); if (status == 0) { QString ret = QString::fromAscii(demangled_function); free(demangled_function); return ret; } return mangled_function; // Probably not a C++ function. } QString DarwinDemangle(const QString& symbol) { QStringList split = symbol.split(' ', QString::SkipEmptyParts); QString mangled_function = split[3]; return CXXDemangle(mangled_function); } QString LinuxDemangle(const QString& symbol) { QRegExp regex("\\(([^+]+)"); if (!symbol.contains(regex)) { return symbol; } QString mangled_function = regex.cap(1); return CXXDemangle(mangled_function); } QString DemangleSymbol(const QString& symbol) { #ifdef Q_OS_DARWIN return DarwinDemangle(symbol); #elif defined(Q_OS_LINUX) return LinuxDemangle(symbol); #else return symbol; #endif } void DumpStackTrace() { #ifdef Q_OS_UNIX void* callstack[128]; int callstack_size = backtrace(reinterpret_cast(&callstack), sizeof(callstack)); char** symbols = backtrace_symbols(reinterpret_cast(&callstack), callstack_size); // Start from 1 to skip ourself. for (int i = 1; i < callstack_size; ++i) { qLog(Debug) << DemangleSymbol(QString::fromAscii(symbols[i])); } free(symbols); #else qLog(Debug) << "FIXME: Implement printing stack traces on this platform"; #endif } } // namespace logging namespace { template QString print_duration(T duration, const std::string& unit) { return QString("%1%2").arg(duration.count()).arg(unit.c_str()); } } // namespace QDebug operator<<(QDebug dbg, std::chrono::seconds secs) { dbg.nospace() << print_duration(secs, "s"); return dbg.space(); } clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-common/core/logging.h000066400000000000000000000036541260417502300270260ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // Note: this file is licensed under the Apache License instead of GPL because // it is used by the Spotify blob which links against libspotify and is not GPL // compatible. #ifndef LOGGING_H #define LOGGING_H #include #include #include #ifdef QT_NO_DEBUG_STREAM #define qLog(level) \ while (false) QNoDebug() #else #define qLog(level) \ logging::CreateLogger(logging::Level_##level, \ logging::ParsePrettyFunction(__PRETTY_FUNCTION__), \ __LINE__) #endif namespace logging { class NullDevice : public QIODevice { protected: qint64 readData(char*, qint64) { return -1; } qint64 writeData(const char*, qint64 len) { return len; } }; enum Level { Level_Fatal = -1, Level_Error = 0, Level_Warning, Level_Info, Level_Debug, }; void Init(); void SetLevels(const QString& levels); void DumpStackTrace(); QString ParsePrettyFunction(const char* pretty_function); QDebug CreateLogger(Level level, const QString& class_name, int line); void GLog(const char* domain, int level, const char* message, void* user_data); extern const char* kDefaultLogLevels; } QDebug operator<<(QDebug debug, std::chrono::seconds secs); #endif // LOGGING_H clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-common/core/messagehandler.cpp000066400000000000000000000062231260417502300307100ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // Note: this file is licensed under the Apache License instead of GPL because // it is used by the Spotify blob which links against libspotify and is not GPL // compatible. #include "messagehandler.h" #include "core/logging.h" #include #include _MessageHandlerBase::_MessageHandlerBase(QIODevice* device, QObject* parent) : QObject(parent), device_(nullptr), flush_abstract_socket_(nullptr), flush_local_socket_(nullptr), reading_protobuf_(false), expected_length_(0), is_device_closed_(false) { if (device) { SetDevice(device); } } void _MessageHandlerBase::SetDevice(QIODevice* device) { device_ = device; buffer_.open(QIODevice::ReadWrite); connect(device, SIGNAL(readyRead()), SLOT(DeviceReadyRead())); // Yeah I know. if (QAbstractSocket* socket = qobject_cast(device)) { flush_abstract_socket_ = &QAbstractSocket::flush; connect(socket, SIGNAL(disconnected()), SLOT(DeviceClosed())); } else if (QLocalSocket* socket = qobject_cast(device)) { flush_local_socket_ = &QLocalSocket::flush; connect(socket, SIGNAL(disconnected()), SLOT(DeviceClosed())); } else { qFatal("Unsupported device type passed to _MessageHandlerBase"); } } void _MessageHandlerBase::DeviceReadyRead() { while (device_->bytesAvailable()) { if (!reading_protobuf_) { // Read the length of the next message QDataStream s(device_); s >> expected_length_; reading_protobuf_ = true; } // Read some of the message buffer_.write(device_->read(expected_length_ - buffer_.size())); // Did we get everything? if (buffer_.size() == expected_length_) { // Parse the message if (!RawMessageArrived(buffer_.data())) { qLog(Error) << "Malformed protobuf message"; device_->close(); return; } // Clear the buffer buffer_.close(); buffer_.setData(QByteArray()); buffer_.open(QIODevice::ReadWrite); reading_protobuf_ = false; } } } void _MessageHandlerBase::WriteMessage(const QByteArray& data) { QDataStream s(device_); s << quint32(data.length()); s.writeRawData(data.data(), data.length()); // Sorry. if (flush_abstract_socket_) { ((static_cast(device_))->*(flush_abstract_socket_))(); } else if (flush_local_socket_) { ((static_cast(device_))->*(flush_local_socket_))(); } } void _MessageHandlerBase::DeviceClosed() { is_device_closed_ = true; AbortAll(); } clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-common/core/messagehandler.h000066400000000000000000000131771260417502300303630ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // Note: this file is licensed under the Apache License instead of GPL because // it is used by the Spotify blob which links against libspotify and is not GPL // compatible. #ifndef MESSAGEHANDLER_H #define MESSAGEHANDLER_H #include #include #include #include #include #include #include #include "core/logging.h" #include "core/messagereply.h" class QAbstractSocket; class QIODevice; class QLocalSocket; #define QStringFromStdString(x) QString::fromUtf8(x.data(), x.size()) #define DataCommaSizeFromQString(x) x.toUtf8().constData(), x.toUtf8().length() // Reads and writes uint32 length encoded protobufs to a socket. // This base QObject is separate from AbstractMessageHandler because moc can't // handle templated classes. Use AbstractMessageHandler instead. class _MessageHandlerBase : public QObject { Q_OBJECT public: // device can be NULL, in which case you must call SetDevice before writing // any messages. _MessageHandlerBase(QIODevice* device, QObject* parent); void SetDevice(QIODevice* device); // After this is true, messages cannot be sent to the handler any more. bool is_device_closed() const { return is_device_closed_; } protected slots: void WriteMessage(const QByteArray& data); void DeviceReadyRead(); virtual void DeviceClosed(); protected: virtual bool RawMessageArrived(const QByteArray& data) = 0; virtual void AbortAll() = 0; protected: typedef bool (QAbstractSocket::*FlushAbstractSocket)(); typedef bool (QLocalSocket::*FlushLocalSocket)(); QIODevice* device_; FlushAbstractSocket flush_abstract_socket_; FlushLocalSocket flush_local_socket_; bool reading_protobuf_; quint32 expected_length_; QBuffer buffer_; bool is_device_closed_; }; // Reads and writes uint32 length encoded MessageType messages to a socket. // You should subclass this and implement the MessageArrived(MessageType) // method. template class AbstractMessageHandler : public _MessageHandlerBase { public: AbstractMessageHandler(QIODevice* device, QObject* parent); ~AbstractMessageHandler() { AbortAll(); } typedef MT MessageType; typedef MessageReply ReplyType; // Serialises the message and writes it to the socket. This version MUST be // called from the thread in which the AbstractMessageHandler was created. void SendMessage(const MessageType& message); // Serialises the message and writes it to the socket. This version may be // called from any thread. void SendMessageAsync(const MessageType& message); // Sends the request message inside and takes ownership of the MessageReply. // The MessageReply's Finished() signal will be emitted when a reply arrives // with the same ID. Must be called from my thread. void SendRequest(ReplyType* reply); // Sets the "id" field of reply to the same as the request, and sends the // reply on the socket. Used on the worker side. void SendReply(const MessageType& request, MessageType* reply); protected: // Called when a message is received from the socket. virtual void MessageArrived(const MessageType& message) {} // _MessageHandlerBase bool RawMessageArrived(const QByteArray& data); void AbortAll(); private: QMap pending_replies_; }; template AbstractMessageHandler::AbstractMessageHandler(QIODevice* device, QObject* parent) : _MessageHandlerBase(device, parent) {} template void AbstractMessageHandler::SendMessage(const MessageType& message) { Q_ASSERT(QThread::currentThread() == thread()); std::string data = message.SerializeAsString(); WriteMessage(QByteArray(data.data(), data.size())); } template void AbstractMessageHandler::SendMessageAsync(const MessageType& message) { std::string data = message.SerializeAsString(); metaObject()->invokeMethod( this, "WriteMessage", Qt::QueuedConnection, Q_ARG(QByteArray, QByteArray(data.data(), data.size()))); } template void AbstractMessageHandler::SendRequest(ReplyType* reply) { pending_replies_[reply->id()] = reply; SendMessage(reply->request_message()); } template void AbstractMessageHandler::SendReply(const MessageType& request, MessageType* reply) { reply->set_id(request.id()); SendMessage(*reply); } template bool AbstractMessageHandler::RawMessageArrived(const QByteArray& data) { MessageType message; if (!message.ParseFromArray(data.constData(), data.size())) { return false; } ReplyType* reply = pending_replies_.take(message.id()); if (reply) { // This is a reply to a message that we created earlier. reply->SetReply(message); } else { MessageArrived(message); } return true; } template void AbstractMessageHandler::AbortAll() { for (ReplyType* reply : pending_replies_) { reply->Abort(); } pending_replies_.clear(); } #endif // MESSAGEHANDLER_H clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-common/core/messagereply.cpp000066400000000000000000000023461260417502300304300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "messagereply.h" _MessageReplyBase::_MessageReplyBase(QObject* parent) : QObject(parent), finished_(false), success_(false) {} bool _MessageReplyBase::WaitForFinished() { qLog(Debug) << "Waiting on ID" << id(); semaphore_.acquire(); qLog(Debug) << "Acquired ID" << id(); return success_; } void _MessageReplyBase::Abort() { Q_ASSERT(!finished_); finished_ = true; success_ = false; emit Finished(success_); qLog(Debug) << "Releasing ID" << id() << "(aborted)"; semaphore_.release(); } clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-common/core/messagereply.h000066400000000000000000000054061260417502300300750ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MESSAGEREPLY_H #define MESSAGEREPLY_H #include #include #include "core/logging.h" // Base QObject for a reply future class that is returned immediately for // requests that will occur in the background. Similar to QNetworkReply. // Use MessageReply instead. class _MessageReplyBase : public QObject { Q_OBJECT public: _MessageReplyBase(QObject* parent = nullptr); virtual int id() const = 0; bool is_finished() const { return finished_; } bool is_successful() const { return success_; } // Waits for the reply to finish by waiting on a semaphore. Never call this // from the MessageHandler's thread or it will block forever. // Returns true if the call was successful. bool WaitForFinished(); void Abort(); signals: void Finished(bool success); protected: bool finished_; bool success_; QSemaphore semaphore_; }; // A reply future class that is returned immediately for requests that will // occur in the background. Similar to QNetworkReply. template class MessageReply : public _MessageReplyBase { public: MessageReply(const MessageType& request_message, QObject* parent = nullptr); int id() const { return request_message_.id(); } const MessageType& request_message() const { return request_message_; } const MessageType& message() const { return reply_message_; } void SetReply(const MessageType& message); private: MessageType request_message_; MessageType reply_message_; }; template MessageReply::MessageReply(const MessageType& request_message, QObject* parent) : _MessageReplyBase(parent) { request_message_.MergeFrom(request_message); } template void MessageReply::SetReply(const MessageType& message) { Q_ASSERT(!finished_); reply_message_.MergeFrom(message); finished_ = true; success_ = true; emit Finished(success_); qLog(Debug) << "Releasing ID" << id() << "(finished)"; semaphore_.release(); } #endif // MESSAGEREPLY_H clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-common/core/override.h000066400000000000000000000022171260417502300272110ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // Note: this file is licensed under the Apache License instead of GPL because // it is used by the Spotify blob which links against libspotify and is not GPL // compatible. #ifndef OVERRIDE_H #define OVERRIDE_H // Defines the OVERRIDE macro as C++11's override control keyword if // it is available. #ifndef __has_extension #define __has_extension(x) 0 #endif #if __has_extension(cxx_override_control) // Clang feature checking macro. #define OVERRIDE override #else #define OVERRIDE #endif #endif // OVERRIDE_H clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-common/core/scoped_nsautorelease_pool.h000066400000000000000000000022341260417502300326310ustar00rootroot00000000000000// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BASE_MAC_SCOPED_NSAUTORELEASE_POOL_H_ #define BASE_MAC_SCOPED_NSAUTORELEASE_POOL_H_ #include #if defined(__OBJC__) @class NSAutoreleasePool; #else // __OBJC__ class NSAutoreleasePool; #endif // __OBJC__ // ScopedNSAutoreleasePool allocates an NSAutoreleasePool when instantiated and // sends it a -drain message when destroyed. This allows an autorelease pool to // be maintained in ordinary C++ code without bringing in any direct Objective-C // dependency. class ScopedNSAutoreleasePool { public: ScopedNSAutoreleasePool(); ~ScopedNSAutoreleasePool(); // Clear out the pool in case its position on the stack causes it to be // alive for long periods of time (such as the entire length of the app). // Only use then when you're certain the items currently in the pool are // no longer needed. void Recycle(); private: NSAutoreleasePool* autorelease_pool_; private: Q_DISABLE_COPY(ScopedNSAutoreleasePool); }; #endif // BASE_MAC_SCOPED_NSAUTORELEASE_POOL_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-common/core/scoped_nsautorelease_pool.mm000066400000000000000000000013271260417502300330150ustar00rootroot00000000000000// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "scoped_nsautorelease_pool.h" #import ScopedNSAutoreleasePool::ScopedNSAutoreleasePool() : autorelease_pool_([[NSAutoreleasePool alloc] init]) { Q_ASSERT(autorelease_pool_); } ScopedNSAutoreleasePool::~ScopedNSAutoreleasePool() { [autorelease_pool_ drain]; } // Cycle the internal pool, allowing everything there to get cleaned up and // start anew. void ScopedNSAutoreleasePool::Recycle() { [autorelease_pool_ drain]; autorelease_pool_ = [[NSAutoreleasePool alloc] init]; Q_ASSERT(autorelease_pool_); } clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-common/core/waitforsignal.cpp000066400000000000000000000016461260417502300306030ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "waitforsignal.h" #include void WaitForSignal(QObject* sender, const char* signal) { QEventLoop loop; QObject::connect(sender, signal, &loop, SLOT(quit())); loop.exec(); } clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-common/core/waitforsignal.h000066400000000000000000000015621260417502300302450ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef WAITFORSIGNAL_H #define WAITFORSIGNAL_H class QObject; void WaitForSignal(QObject* sender, const char* signal); #endif // WAITFORSIGNAL_H clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-common/core/workerpool.cpp000066400000000000000000000014741260417502300301340ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "workerpool.h" _WorkerPoolBase::_WorkerPoolBase(QObject* parent) : QObject(parent) {} clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-common/core/workerpool.h000066400000000000000000000300241260417502300275720ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef WORKERPOOL_H #define WORKERPOOL_H #include #include #include #include #include #include #include #include #include #include #include "core/closure.h" #include "core/logging.h" // Base class containing signals and slots - required because moc doesn't do // templated objects. class _WorkerPoolBase : public QObject { Q_OBJECT public: _WorkerPoolBase(QObject* parent = nullptr); signals: // Emitted when a worker failed to start. This usually happens when the // worker wasn't found, or couldn't be executed. void WorkerFailedToStart(); protected slots: virtual void DoStart() {} virtual void NewConnection() {} virtual void ProcessError(QProcess::ProcessError) {} virtual void SendQueuedMessages() {} }; // Manages a pool of one or more external processes. A local socket server is // started for each process, and the address is passed to the process as // argv[1]. The process is expected to connect back to the socket server, and // when it does a HandlerType is created for it. // Instances of HandlerType are created in the WorkerPool's thread. template class WorkerPool : public _WorkerPoolBase { public: WorkerPool(QObject* parent = nullptr); ~WorkerPool(); typedef typename HandlerType::MessageType MessageType; typedef typename HandlerType::ReplyType ReplyType; // Sets the name of the worker executable. This is looked for first in the // current directory, and then in $PATH. You must call this before calling // Start(). void SetExecutableName(const QString& executable_name); // Sets the number of worker process to use. Defaults to // 1 <= (processors / 2) <= 2. void SetWorkerCount(int count); // Sets the prefix to use for the local server (on unix this is a named pipe // in /tmp). Defaults to QApplication::applicationName(). A random number // is appended to this name when creating each server. void SetLocalServerName(const QString& local_server_name); // Starts all workers. void Start(); // Fills in the message's "id" field and creates a reply future. The message // is queued and the WorkerPool's thread will send it to the next available // worker. Can be called from any thread. ReplyType* SendMessageWithReply(MessageType* message); protected: // These are all reimplemented slots, they are called on the WorkerPool's // thread. void DoStart(); void NewConnection(); void ProcessError(QProcess::ProcessError error); void SendQueuedMessages(); private: struct Worker { Worker() : local_server_(NULL), local_socket_(NULL), process_(NULL), handler_(NULL) {} QLocalServer* local_server_; QLocalSocket* local_socket_; QProcess* process_; HandlerType* handler_; }; // Must only ever be called on my thread. void StartOneWorker(Worker* worker); template Worker* FindWorker(T Worker::*member, T value) { for (typename QList::iterator it = workers_.begin(); it != workers_.end(); ++it) { if ((*it).*member == value) { return &(*it); } } return NULL; } template void DeleteQObjectPointerLater(T** p) { if (*p) { (*p)->deleteLater(); *p = NULL; } } // Creates a new reply future for the request with the next sequential ID, // and sets the request's ID to the ID of the reply. Can be called from any // thread ReplyType* NewReply(MessageType* message); // Returns the next handler, or NULL if there isn't one. Must be called from // my thread. HandlerType* NextHandler() const; private: QString local_server_name_; QString executable_name_; QString executable_path_; int worker_count_; mutable int next_worker_; QList workers_; QAtomicInt next_id_; QMutex message_queue_mutex_; QQueue message_queue_; }; template WorkerPool::WorkerPool(QObject* parent) : _WorkerPoolBase(parent), next_worker_(0), next_id_(0) { worker_count_ = qBound(1, QThread::idealThreadCount() / 2, 2); local_server_name_ = qApp->applicationName().toLower(); if (local_server_name_.isEmpty()) local_server_name_ = "workerpool"; } template WorkerPool::~WorkerPool() { for (const Worker& worker : workers_) { if (worker.local_socket_ && worker.process_) { disconnect(worker.process_, SIGNAL(error(QProcess::ProcessError)), this, SLOT(ProcessError(QProcess::ProcessError))); // The worker is connected. Close his socket and wait for him to exit. qLog(Debug) << "Closing worker socket"; worker.local_socket_->close(); worker.process_->waitForFinished(500); } if (worker.process_ && worker.process_->state() == QProcess::Running) { // The worker is still running - kill it. qLog(Debug) << "Killing worker process"; worker.process_->terminate(); if (!worker.process_->waitForFinished(500)) { worker.process_->kill(); } } } for (ReplyType* reply : message_queue_) { reply->Abort(); } } template void WorkerPool::SetWorkerCount(int count) { Q_ASSERT(workers_.isEmpty()); worker_count_ = count; } template void WorkerPool::SetLocalServerName( const QString& local_server_name) { Q_ASSERT(workers_.isEmpty()); local_server_name_ = local_server_name; } template void WorkerPool::SetExecutableName( const QString& executable_name) { Q_ASSERT(workers_.isEmpty()); executable_name_ = executable_name; } template void WorkerPool::Start() { metaObject()->invokeMethod(this, "DoStart"); } template void WorkerPool::DoStart() { Q_ASSERT(workers_.isEmpty()); Q_ASSERT(!executable_name_.isEmpty()); Q_ASSERT(QThread::currentThread() == thread()); // Find the executable if we can, default to searching $PATH executable_path_ = executable_name_; QStringList search_path; search_path << qApp->applicationDirPath(); #ifdef Q_OS_MAC search_path << qApp->applicationDirPath() + "/../PlugIns"; #endif for (const QString& path_prefix : search_path) { const QString executable_path = path_prefix + "/" + executable_name_; if (QFile::exists(executable_path)) { executable_path_ = executable_path; break; } } // Start all the workers for (int i = 0; i < worker_count_; ++i) { Worker worker; StartOneWorker(&worker); workers_ << worker; } } template void WorkerPool::StartOneWorker(Worker* worker) { Q_ASSERT(QThread::currentThread() == thread()); DeleteQObjectPointerLater(&worker->local_server_); DeleteQObjectPointerLater(&worker->local_socket_); DeleteQObjectPointerLater(&worker->process_); DeleteQObjectPointerLater(&worker->handler_); worker->local_server_ = new QLocalServer(this); worker->process_ = new QProcess(this); connect(worker->local_server_, SIGNAL(newConnection()), SLOT(NewConnection())); connect(worker->process_, SIGNAL(error(QProcess::ProcessError)), SLOT(ProcessError(QProcess::ProcessError))); // Create a server, find an unused name and start listening forever { const int unique_number = qrand() ^ ((int)(quint64(this) & 0xFFFFFFFF)); const QString name = QString("%1_%2").arg(local_server_name_).arg(unique_number); if (worker->local_server_->listen(name)) { break; } } qLog(Debug) << "Starting worker" << worker << executable_path_ << worker->local_server_->fullServerName(); // Start the process worker->process_->setProcessChannelMode(QProcess::ForwardedChannels); worker->process_->start(executable_path_, QStringList() << worker->local_server_->fullServerName()); } template void WorkerPool::NewConnection() { Q_ASSERT(QThread::currentThread() == thread()); QLocalServer* server = qobject_cast(sender()); // Find the worker with this server. Worker* worker = FindWorker(&Worker::local_server_, server); if (!worker) return; qLog(Debug) << "Worker" << worker << "connected to" << server->fullServerName(); // Accept the connection. worker->local_socket_ = server->nextPendingConnection(); // We only ever accept one connection per worker, so destroy the server now. worker->local_socket_->setParent(this); worker->local_server_->deleteLater(); worker->local_server_ = NULL; // Create the handler. worker->handler_ = new HandlerType(worker->local_socket_, this); SendQueuedMessages(); } template void WorkerPool::ProcessError(QProcess::ProcessError error) { Q_ASSERT(QThread::currentThread() == thread()); QProcess* process = qobject_cast(sender()); // Find the worker with this process. Worker* worker = FindWorker(&Worker::process_, process); if (!worker) return; switch (error) { case QProcess::FailedToStart: // Failed to start errors are bad - it usually means the worker isn't // installed. Don't restart the process, but tell our owner, who will // probably want to do something fatal. qLog(Error) << "Worker failed to start"; emit WorkerFailedToStart(); break; default: // On any other error we just restart the process. qLog(Debug) << "Worker" << worker << "failed with error" << error << "- restarting"; StartOneWorker(worker); break; } } template typename WorkerPool::ReplyType* WorkerPool::NewReply( MessageType* message) { const int id = next_id_.fetchAndAddOrdered(1); message->set_id(id); return new ReplyType(*message); } template typename WorkerPool::ReplyType* WorkerPool::SendMessageWithReply(MessageType* message) { ReplyType* reply = NewReply(message); // Add the pending reply to the queue { QMutexLocker l(&message_queue_mutex_); message_queue_.enqueue(reply); } // Wake up the main thread metaObject()->invokeMethod(this, "SendQueuedMessages", Qt::QueuedConnection); return reply; } template void WorkerPool::SendQueuedMessages() { QMutexLocker l(&message_queue_mutex_); while (!message_queue_.isEmpty()) { ReplyType* reply = message_queue_.dequeue(); // Find a worker for this message HandlerType* handler = NextHandler(); if (!handler) { // No available handlers - put the message on the front of the queue. message_queue_.prepend(reply); qLog(Debug) << "No available handlers to process request"; break; } handler->SendRequest(reply); } } template HandlerType* WorkerPool::NextHandler() const { for (int i = 0; i < workers_.count(); ++i) { const int worker_index = (next_worker_ + i) % workers_.count(); if (workers_[worker_index].handler_ && !workers_[worker_index].handler_->is_device_closed()) { next_worker_ = (worker_index + 1) % workers_.count(); return workers_[worker_index].handler_; } } return NULL; } #endif // WORKERPOOL_H clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-remote/000077500000000000000000000000001260417502300242725ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-remote/CMakeLists.txt000066400000000000000000000004401260417502300270300ustar00rootroot00000000000000include_directories(${PROTOBUF_INCLUDE_DIRS}) set(MESSAGES remotecontrolmessages.proto ) protobuf_generate_cpp(PROTO_SOURCES PROTO_HEADERS ${MESSAGES}) add_library(libclementine-remote STATIC ${PROTO_SOURCES} ) target_link_libraries(libclementine-remote libclementine-common ) clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-remote/remotecontrolmessages.proto000066400000000000000000000224051260417502300320060ustar00rootroot00000000000000package pb.remote; // The supported message types enum MsgType { UNKNOWN = 0; // Messages generally send from client to server CONNECT = 1; REQUEST_PLAYLISTS = 3; REQUEST_PLAYLIST_SONGS = 4; CHANGE_SONG = 5; SET_VOLUME = 6; SET_TRACK_POSITION = 7; INSERT_URLS = 8; REMOVE_SONGS = 9; OPEN_PLAYLIST = 10; CLOSE_PLAYLIST = 11; GET_LYRICS = 14; DOWNLOAD_SONGS = 15; SONG_OFFER_RESPONSE = 16; // Lastfm LOVE = 12; BAN = 13; STOP_AFTER = 17; GET_LIBRARY = 18; RATE_SONG = 19; GLOBAL_SEARCH = 100; // Messages send by both DISCONNECT = 2; PLAY = 20; PLAYPAUSE = 21; PAUSE = 22; STOP = 23; NEXT = 24; PREVIOUS = 25; SHUFFLE_PLAYLIST = 26; // Messages that contain the repeat or random mode // Either set by client or clementine REPEAT = 27; SHUFFLE = 28; // Messages send from server to client INFO = 40; CURRENT_METAINFO = 41; PLAYLISTS = 42; PLAYLIST_SONGS = 43; ENGINE_STATE_CHANGED = 44; KEEP_ALIVE = 45; UPDATE_TRACK_POSITION = 46; ACTIVE_PLAYLIST_CHANGED = 47; FIRST_DATA_SENT_COMPLETE = 48; LYRICS = 49; SONG_FILE_CHUNK = 50; DOWNLOAD_QUEUE_EMPTY = 51; LIBRARY_CHUNK = 52; DOWNLOAD_TOTAL_SIZE = 53; GLOBAL_SEARCH_RESULT = 54; TRANSCODING_FILES = 55; GLOBAL_SEARCH_STATUS = 56; } // Valid Engine states enum EngineState { Empty = 0; Idle = 1; Playing = 2; Paused = 3; } // Song Metadata message SongMetadata { enum Type { UNKNOWN = 0; ASF = 1; FLAC = 2; MP4 = 3; MPC = 4; MPEG = 5; OGGFLAC = 6; OGGSPEEX = 7; OGGVORBIS = 8; AIFF = 9; WAV = 10; TRUEAUDIO = 11; CDDA = 12; OGGOPUS = 13; STREAM = 99; } optional int32 id = 1; // unique id of the song optional int32 index = 2; // Index of the current row of the active playlist optional string title = 3; optional string album = 4; optional string artist = 5; optional string albumartist = 6; optional int32 track = 7; optional int32 disc = 8; optional string pretty_year = 9; optional string genre = 10; optional int32 playcount = 11; optional string pretty_length = 12; optional bytes art = 13; optional int32 length = 14; optional bool is_local = 15; optional string filename = 16; optional int32 file_size = 17; optional float rating = 18; // 0 (0 stars) to 1 (5 stars) optional string url = 19; optional string art_automatic = 20; optional string art_manual = 21; optional Type type = 22; } // Playlist informations message Playlist { optional int32 id = 1; optional string name = 2; optional int32 item_count = 3; optional bool active = 4; optional bool closed = 5; } // Valid Repeatmodes enum RepeatMode { Repeat_Off = 0; Repeat_Track = 1; Repeat_Album = 2; Repeat_Playlist = 3; Repeat_OneByOne = 4; Repeat_Intro = 5; } // Valid Shuffle modes enum ShuffleMode { Shuffle_Off = 0; Shuffle_All = 1; Shuffle_InsideAlbum = 2; Shuffle_Albums = 3; } message RequestPlaylists { optional bool include_closed = 1; } // A Client requests songs from a specific playlist message RequestPlaylistSongs { optional int32 id = 1; } // Client want to change track message RequestChangeSong { // In which playlist is the song? optional int32 playlist_id = 1; // And on which position? optional int32 song_index = 2; } // Set the volume message RequestSetVolume { optional int32 volume = 1; } // Repeat and Random messages message Repeat { optional RepeatMode repeat_mode = 1; } message Shuffle { optional ShuffleMode shuffle_mode = 1; } // Response from server // General info message ResponseClementineInfo { optional string version = 1; optional EngineState state = 2; } // The current song played message ResponseCurrentMetadata { optional SongMetadata song_metadata = 1; } // The playlists in clementine message ResponsePlaylists { repeated Playlist playlist = 1; } // A list of songs in a playlist message ResponsePlaylistSongs { optional Playlist requested_playlist = 1; // The songs that are in the playlist repeated SongMetadata songs = 2; } // The current state of the play engine message ResponseEngineStateChanged { optional EngineState state = 1; } // Sends the current position of the track message ResponseUpdateTrackPosition { optional int32 position = 1; } // The connect message containing the authentication code message RequestConnect { optional int32 auth_code = 1; optional bool send_playlist_songs = 2; optional bool downloader = 3; } // Respone, why the connection was closed enum ReasonDisconnect { Server_Shutdown = 1; Wrong_Auth_Code = 2; Not_Authenticated = 3; Download_Forbidden = 4; } message ResponseDisconnect { optional ReasonDisconnect reason_disconnect = 1; } message ResponseActiveChanged { optional int32 id = 1; } // A client requests a new track position // position in seconds! message RequestSetTrackPosition { optional int32 position = 1; } message RequestInsertUrls { // In which playlist should the urls be inserted? optional int32 playlist_id = 1; repeated string urls = 2; optional int32 position = 3 [default=-1]; optional bool play_now = 4 [default=false]; optional bool enqueue = 5 [default=false]; repeated SongMetadata songs = 6; } // Client want to change track message RequestRemoveSongs { // In which playlist is the songs? optional int32 playlist_id = 1; // And on which position? repeated int32 songs = 2; } // Messages for opening / closing playlists message RequestOpenPlaylist { optional int32 playlist_id = 1; } message RequestClosePlaylist { optional int32 playlist_id = 1; } // Message containing lyrics message ResponseLyrics { repeated Lyric lyrics = 1; } message Lyric { optional string id = 1; optional string title = 2; optional string content = 3; } // Message request for downloading songs enum DownloadItem { CurrentItem = 1; ItemAlbum = 2; APlaylist = 3; Urls = 4; } message RequestDownloadSongs { optional DownloadItem download_item = 1; optional int32 playlist_id = 2; repeated string urls = 3; } message ResponseSongFileChunk { optional int32 chunk_number = 1; optional int32 chunk_count = 2; optional int32 file_number = 3; optional int32 file_count = 4; optional SongMetadata song_metadata = 6; // only sent with first chunk! optional bytes data = 7; optional int32 size = 8; optional bytes file_hash = 9; } message ResponseLibraryChunk { optional int32 chunk_number = 1; optional int32 chunk_count = 2; optional bytes data = 3; optional int32 size = 4; optional bytes file_hash = 5; } message ResponseSongOffer { optional bool accepted = 1; // true = client wants to download item } message RequestRateSong { optional float rating = 1; // 0 to 1 } message ResponseDownloadTotalSize { optional int32 total_size = 1; optional int32 file_count = 2; } message RequestGlobalSearch { optional string query = 1; } message ResponseGlobalSearch { optional int32 id = 1; optional string query = 2; optional string search_provider = 3; repeated SongMetadata song_metadata = 4; optional bytes search_provider_icon = 5; } message ResponseTranscoderStatus { optional int32 processed = 1; optional int32 total = 2; } enum GlobalSearchStatus { GlobalSearchStarted = 1; GlobalSearchFinished = 2; } message ResponseGlobalSearchStatus { optional int32 id = 1; optional string query = 2; optional GlobalSearchStatus status = 3; } // The message itself message Message { optional int32 version = 1 [default=21]; optional MsgType type = 2 [default=UNKNOWN]; // What data is in the message? optional RequestConnect request_connect = 21; optional RequestPlaylists request_playlists = 27; optional RequestPlaylistSongs request_playlist_songs = 10; optional RequestChangeSong request_change_song = 11; optional RequestSetVolume request_set_volume = 12; optional RequestSetTrackPosition request_set_track_position = 23; optional RequestInsertUrls request_insert_urls = 25; optional RequestRemoveSongs request_remove_songs = 26; optional RequestOpenPlaylist request_open_playlist = 28; optional RequestClosePlaylist request_close_playlist = 29; optional RequestDownloadSongs request_download_songs = 31; optional RequestRateSong request_rate_song = 35; optional RequestGlobalSearch request_global_search = 37; optional Repeat repeat = 13; optional Shuffle shuffle = 14; optional ResponseClementineInfo response_clementine_info = 15; optional ResponseCurrentMetadata response_current_metadata = 16; optional ResponsePlaylists response_playlists = 17; optional ResponsePlaylistSongs response_playlist_songs = 18; optional ResponseEngineStateChanged response_engine_state_changed = 19; optional ResponseUpdateTrackPosition response_update_track_position = 20; optional ResponseDisconnect response_disconnect = 22; optional ResponseActiveChanged response_active_changed = 24; optional ResponseLyrics response_lyrics = 30; optional ResponseSongFileChunk response_song_file_chunk = 32; optional ResponseSongOffer response_song_offer = 33; optional ResponseLibraryChunk response_library_chunk = 34; optional ResponseDownloadTotalSize response_download_total_size = 36; optional ResponseGlobalSearch response_global_search = 38; optional ResponseTranscoderStatus response_transcoder_status = 39; optional ResponseGlobalSearchStatus response_global_search_status = 40; } clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-spotifyblob/000077500000000000000000000000001260417502300253335ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-spotifyblob/CMakeLists.txt000066400000000000000000000006461260417502300301010ustar00rootroot00000000000000include_directories(${PROTOBUF_INCLUDE_DIRS}) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/blobversion.h.in ${CMAKE_CURRENT_BINARY_DIR}/blobversion.h) set(MESSAGES spotifymessages.proto ) protobuf_generate_cpp(PROTO_SOURCES PROTO_HEADERS ${MESSAGES}) add_library(clementine-spotifyblob-messages STATIC ${PROTO_SOURCES} ) target_link_libraries(clementine-spotifyblob-messages libclementine-common ) clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-spotifyblob/blobversion.h.in000066400000000000000000000015701260417502300304400ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SPOTIFY_BLOBVERSION_H_IN #define SPOTIFY_BLOBVERSION_H_IN #define SPOTIFY_BLOB_VERSION ${SPOTIFY_BLOB_VERSION} #endif // SPOTIFY_BLOBVERSION_H_IN clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-spotifyblob/spotifymessages.proto000066400000000000000000000134221260417502300316470ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // Note: this file is licensed under the Apache License instead of GPL because // it is used by the Spotify blob which links against libspotify and is not GPL // compatible. package pb.spotify; message LoginRequest { required string username = 1; optional string password = 2; optional PlaybackSettings playback_settings = 3; } message LoginResponse { enum Error { BadUsernameOrPassword = 1; UserBanned = 2; UserNeedsPremium = 3; Other = 4; ReloginFailed = 5; } required bool success = 1; required string error = 2; optional Error error_code = 3 [default = Other]; } message Playlists { message Playlist { required int32 index = 1; required string name = 2; required int32 nb_tracks = 3; required bool is_mine = 4; required string owner= 5; required bool is_offline = 6; required string uri = 7; // Offline sync progress between 0-100. optional int32 download_progress = 8; } repeated Playlist playlist = 1; } message Track { required bool starred = 1; required string title = 2; repeated string artist = 3; required string album = 4; required int32 duration_msec = 5; required int32 popularity = 6; required int32 disc = 7; required int32 track = 8; required int32 year = 9; required string uri = 10; required string album_art_id = 11; } message Album { required Track metadata = 1; repeated Track track = 2; } enum PlaylistType { Starred = 1; Inbox = 2; UserPlaylist = 3; } message LoadPlaylistRequest { required PlaylistType type = 1; optional int32 user_playlist_index = 2; } message LoadPlaylistResponse { required LoadPlaylistRequest request = 1; repeated Track track = 2; } message SyncPlaylistRequest { required LoadPlaylistRequest request = 1; required bool offline_sync = 2; } message SyncPlaylistProgress { required LoadPlaylistRequest request = 1; required int32 sync_progress = 2; } message PlaybackRequest { required string track_uri = 1; required int32 media_port = 2; } message PlaybackError { required string error = 1; } message SearchRequest { required string query = 1; optional int32 limit = 2 [default = 250]; optional int32 limit_album = 3 [default = 0]; } message SearchResponse { required SearchRequest request = 1; repeated Track result = 2; optional int32 total_tracks = 3; optional string did_you_mean = 4; optional string error = 5; // field 6 is deprecated repeated Album album = 7; } message ImageRequest { required string id = 1; } message ImageResponse { required string id = 1; optional bytes data = 2; } message BrowseAlbumRequest { required string uri = 1; } message BrowseAlbumResponse { required string uri = 1; repeated Track track = 2; } message BrowseToplistRequest { enum ToplistType { Artists = 1; Albums = 2; Tracks = 3; }; enum Region { Everywhere = 1; User = 2; }; required ToplistType type = 1; optional Region region = 2 [default=Everywhere]; // Username to use if region is User. optional string username = 3; } message BrowseToplistResponse { required BrowseToplistRequest request = 1; repeated Track track = 2; repeated Album album = 3; } message SeekRequest { optional int64 offset_nsec = 1; } enum Bitrate { Bitrate96k = 1; Bitrate160k = 2; Bitrate320k = 3; } message PlaybackSettings { optional Bitrate bitrate = 1 [default = Bitrate320k]; optional bool volume_normalisation = 2 [default = false]; } message PauseRequest { optional bool paused = 1 [default = false]; } message AddTracksToPlaylistRequest { required PlaylistType playlist_type = 1; optional int64 playlist_index = 2; // Used if playlist_index == UserPlaylist repeated string track_uri = 3; } message RemoveTracksFromPlaylistRequest { required PlaylistType playlist_type = 1; optional int64 playlist_index = 2; // Used if playlist_index == UserPlaylist repeated int64 track_index = 3; } // NEXT_ID: 25 message Message { // Not currently used optional int32 id = 18; optional LoginRequest login_request = 1; optional LoginResponse login_response = 2; optional Playlists playlists_updated = 3; optional LoadPlaylistRequest load_playlist_request = 4; optional LoadPlaylistResponse load_playlist_response = 5; optional PlaybackRequest playback_request = 6; optional PlaybackError playback_error = 7; optional SearchRequest search_request = 8; optional SearchResponse search_response = 9; optional ImageRequest image_request = 10; optional ImageResponse image_response = 11; optional SyncPlaylistRequest sync_playlist_request = 12; optional SyncPlaylistProgress sync_playlist_progress = 13; optional BrowseAlbumRequest browse_album_request = 14; optional BrowseAlbumResponse browse_album_response = 15; optional SeekRequest seek_request = 16; optional PlaybackSettings set_playback_settings_request = 17; optional BrowseToplistRequest browse_toplist_request = 19; optional BrowseToplistResponse browse_toplist_response = 20; optional PauseRequest pause_request = 21; // ID 22 unused. optional AddTracksToPlaylistRequest add_tracks_to_playlist = 23; optional RemoveTracksFromPlaylistRequest remove_tracks_from_playlist = 24; } clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-tagreader/000077500000000000000000000000001260417502300247355ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-tagreader/CMakeLists.txt000066400000000000000000000015321260417502300274760ustar00rootroot00000000000000include_directories(${PROTOBUF_INCLUDE_DIRS}) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${CMAKE_CURRENT_BINARY_DIR}) include_directories(${CMAKE_SOURCE_DIR}/ext/libclementine-common) include_directories(${CMAKE_SOURCE_DIR}/src) include_directories(${CMAKE_BINARY_DIR}/src) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++0x") set(MESSAGES tagreadermessages.proto ) set(SOURCES fmpsparser.cpp tagreader.cpp ) set(HEADERS ) optional_source(HAVE_GOOGLE_DRIVE INCLUDE_DIRECTORIES ${SPARSEHASH_INCLUDE_DIRS} SOURCES cloudstream.cpp HEADERS cloudstream.h ) qt4_wrap_cpp(MOC ${HEADERS}) protobuf_generate_cpp(PROTO_SOURCES PROTO_HEADERS ${MESSAGES}) add_library(libclementine-tagreader STATIC ${PROTO_SOURCES} ${SOURCES} ${MOC} ) target_link_libraries(libclementine-tagreader libclementine-common ) clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-tagreader/cloudstream.cpp000066400000000000000000000127401260417502300277670ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "cloudstream.h" #include #include #include #include #include #include #include "core/logging.h" namespace { static const int kTaglibPrefixCacheBytes = 64 * 1024; // Should be enough. static const int kTaglibSuffixCacheBytes = 8 * 1024; } CloudStream::CloudStream(const QUrl& url, const QString& filename, const long length, const QString& auth, QNetworkAccessManager* network) : url_(url), filename_(filename), encoded_filename_(filename_.toUtf8()), length_(length), auth_(auth), cursor_(0), network_(network), cache_(length), num_requests_(0) {} TagLib::FileName CloudStream::name() const { return encoded_filename_.data(); } bool CloudStream::CheckCache(int start, int end) { for (int i = start; i <= end; ++i) { if (!cache_.test(i)) { return false; } } return true; } void CloudStream::FillCache(int start, TagLib::ByteVector data) { for (int i = 0; i < data.size(); ++i) { cache_.set(start + i, data[i]); } } TagLib::ByteVector CloudStream::GetCached(int start, int end) { const uint size = end - start + 1; TagLib::ByteVector ret(size); for (int i = 0; i < size; ++i) { ret[i] = cache_.get(start + i); } return ret; } void CloudStream::Precache() { // For reading the tags of an MP3, TagLib tends to request: // 1. The first 1024 bytes // 2. Somewhere between the first 2KB and first 60KB // 3. The last KB or two. // 4. Somewhere in the first 64KB again // // OGG Vorbis may read the last 4KB. // // So, if we precache the first 64KB and the last 8KB we should be sorted :-) // Ideally, we would use bytes=0-655364,-8096 but Google Drive does not seem // to support multipart byte ranges yet so we have to make do with two // requests. seek(0, TagLib::IOStream::Beginning); readBlock(kTaglibPrefixCacheBytes); seek(kTaglibSuffixCacheBytes, TagLib::IOStream::End); readBlock(kTaglibSuffixCacheBytes); clear(); } TagLib::ByteVector CloudStream::readBlock(ulong length) { const uint start = cursor_; const uint end = qMin(cursor_ + length - 1, length_ - 1); if (end < start) { return TagLib::ByteVector(); } if (CheckCache(start, end)) { TagLib::ByteVector cached = GetCached(start, end); cursor_ += cached.size(); return cached; } QNetworkRequest request = QNetworkRequest(url_); if (!auth_.isEmpty()) { request.setRawHeader("Authorization", auth_.toUtf8()); } request.setRawHeader("Range", QString("bytes=%1-%2").arg(start).arg(end).toUtf8()); request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork); QNetworkReply* reply = network_->get(request); connect(reply, SIGNAL(sslErrors(QList)), SLOT(SSLErrors(QList))); ++num_requests_; QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); reply->deleteLater(); int code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); if (code >= 400) { qLog(Debug) << "Error retrieving url to tag:" << url_; return TagLib::ByteVector(); } QByteArray data = reply->readAll(); TagLib::ByteVector bytes(data.data(), data.size()); cursor_ += data.size(); FillCache(start, bytes); return bytes; } void CloudStream::writeBlock(const TagLib::ByteVector&) { qLog(Debug) << Q_FUNC_INFO << "not implemented"; } void CloudStream::insert(const TagLib::ByteVector&, ulong, ulong) { qLog(Debug) << Q_FUNC_INFO << "not implemented"; } void CloudStream::removeBlock(ulong, ulong) { qLog(Debug) << Q_FUNC_INFO << "not implemented"; } bool CloudStream::readOnly() const { qLog(Debug) << Q_FUNC_INFO; return true; } bool CloudStream::isOpen() const { return true; } void CloudStream::seek(long offset, TagLib::IOStream::Position p) { switch (p) { case TagLib::IOStream::Beginning: cursor_ = offset; break; case TagLib::IOStream::Current: cursor_ = qMin(ulong(cursor_ + offset), length_); break; case TagLib::IOStream::End: // This should really not have qAbs(), but OGG reading needs it. cursor_ = qMax(0UL, length_ - qAbs(offset)); break; } } void CloudStream::clear() { cursor_ = 0; } long CloudStream::tell() const { return cursor_; } long CloudStream::length() { return length_; } void CloudStream::truncate(long) { qLog(Debug) << Q_FUNC_INFO << "not implemented"; } void CloudStream::SSLErrors(const QList& errors) { for (const QSslError& error : errors) { qLog(Debug) << error.error() << error.errorString(); qLog(Debug) << error.certificate(); } } clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-tagreader/cloudstream.h000066400000000000000000000046261260417502300274400ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef GOOGLEDRIVESTREAM_H #define GOOGLEDRIVESTREAM_H #include #include #include #include #include #include class QNetworkAccessManager; class CloudStream : public QObject, public TagLib::IOStream { Q_OBJECT public: CloudStream(const QUrl& url, const QString& filename, const long length, const QString& auth, QNetworkAccessManager* network); // Taglib::IOStream virtual TagLib::FileName name() const; virtual TagLib::ByteVector readBlock(ulong length); virtual void writeBlock(const TagLib::ByteVector&); virtual void insert(const TagLib::ByteVector&, ulong, ulong); virtual void removeBlock(ulong, ulong); virtual bool readOnly() const; virtual bool isOpen() const; virtual void seek(long offset, TagLib::IOStream::Position p); virtual void clear(); virtual long tell() const; virtual long length(); virtual void truncate(long); google::sparsetable::size_type cached_bytes() const { return cache_.num_nonempty(); } int num_requests() const { return num_requests_; } // Use educated guess to request the bytes that TagLib will probably want. void Precache(); private: bool CheckCache(int start, int end); void FillCache(int start, TagLib::ByteVector data); TagLib::ByteVector GetCached(int start, int end); private slots: void SSLErrors(const QList& errors); private: const QUrl url_; const QString filename_; const QByteArray encoded_filename_; const ulong length_; const QString auth_; int cursor_; QNetworkAccessManager* network_; google::sparsetable cache_; int num_requests_; }; #endif // GOOGLEDRIVESTREAM_H clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-tagreader/fmpsparser.cpp000066400000000000000000000104501260417502300276230ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "fmpsparser.h" #include #include #include using std::placeholders::_1; using std::placeholders::_2; FMPSParser::FMPSParser() : // The float regex ends with (?:$|(?=::|;;)) to ensure it matches all the // way // up to the end of the value. Without it, it would match a string that // starts with a number, like "123abc". float_re_("\\s*([+-]?\\d+(?:\\.\\d+)?)\\s*(?:$|(?=::|;;))"), // Matches any character except unescaped slashes, colons and semicolons. string_re_("((?:[^\\\\;:]|(?:\\\\[\\\\:;]))+)(?:$|(?=::|;;))"), // Used for replacing escaped characters. escape_re_("\\\\([\\\\:;])") {} // Parses a list of things (of type T) that are separated by two consecutive // Separator characters. Each individual thing is parsed by the F function. // For example, to parse this data: // foo::bar::baz // Use: // QVariantList ret; // ParseContainer<':'>(data, ParseValue, &ret); // ret will then contain "foo", "bar", and "baz". // Returns the number of characters that were consumed from data. // // You can parse lists of lists by using different separator characters: // ParseContainer<';'>(data, ParseContainer<':'>, &ret); template static int ParseContainer(const QStringRef& data, F f, QList* ret) { ret->clear(); T value; int pos = 0; while (pos < data.length()) { const int len = data.length() - pos; int matched_len = f(QStringRef(data.string(), data.position() + pos, len), &value); if (matched_len == -1 || matched_len > len) break; ret->append(value); pos += matched_len; // Expect two separators in a row if (pos + 2 <= data.length() && data.at(pos) == Separator && data.at(pos + 1) == Separator) { pos += 2; } else { break; } } return pos; } bool FMPSParser::Parse(const QString& data) { result_ = Result(); // Only return success if we matched the whole string return ParseListList(data, &result_) == data.length(); } int FMPSParser::ParseValueRef(const QStringRef& data, QVariant* ret) const { // Try to match a float int pos = float_re_.indexIn(*data.string(), data.position()); if (pos == data.position()) { *ret = float_re_.cap(1).toDouble(); return float_re_.matchedLength(); } // Otherwise try to match a string pos = string_re_.indexIn(*data.string(), data.position()); if (pos == data.position()) { // Replace escape sequences with their actual characters QString value = string_re_.cap(1); value.replace(escape_re_, "\\1"); *ret = value; return string_re_.matchedLength(); } return -1; } // Parses an inner list - a list of values int FMPSParser::ParseListRef(const QStringRef& data, QVariantList* ret) const { return ParseContainer<':'>( data, std::bind(&FMPSParser::ParseValueRef, this, _1, _2), ret); } // Parses an outer list - a list of lists int FMPSParser::ParseListListRef(const QStringRef& data, Result* ret) const { return ParseContainer<';'>( data, std::bind(&FMPSParser::ParseListRef, this, _1, _2), ret); } // Convenience functions that take QStrings instead of QStringRefs. Use the // QStringRef versions if possible, they're faster. int FMPSParser::ParseValue(const QString& data, QVariant* ret) const { return ParseValueRef(QStringRef(&data), ret); } int FMPSParser::ParseList(const QString& data, QVariantList* ret) const { return ParseListRef(QStringRef(&data), ret); } int FMPSParser::ParseListList(const QString& data, Result* ret) const { return ParseListListRef(QStringRef(&data), ret); } clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-tagreader/fmpsparser.h000066400000000000000000000035041260417502300272720ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef FMPSPARSER_H #define FMPSPARSER_H #include #include class FMPSParser { public: FMPSParser(); // A FMPS result is a list of lists of values (where a value is a string or // a float). typedef QList Result; // Parses a FMPS value and returns true on success. bool Parse(const QString& data); // Gets the result of the last successful Parse. Result result() const { return result_; } // Returns true if result() is empty. bool is_empty() const { return result().isEmpty() || result()[0].isEmpty(); } // Internal functions, public for unit tests int ParseValue(const QString& data, QVariant* ret) const; int ParseValueRef(const QStringRef& data, QVariant* ret) const; int ParseList(const QString& data, QVariantList* ret) const; int ParseListRef(const QStringRef& data, QVariantList* ret) const; int ParseListList(const QString& data, Result* ret) const; int ParseListListRef(const QStringRef& data, Result* ret) const; private: QRegExp float_re_; QRegExp string_re_; QRegExp escape_re_; Result result_; }; #endif // FMPSPARSER_H clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-tagreader/tagreader.cpp000066400000000000000000001245511260417502300274070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2013, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "tagreader.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef TAGLIB_HAS_OPUS #include #endif #include #include #include #include #include #include #include #include #include #include #include #include "fmpsparser.h" #include "core/logging.h" #include "core/messagehandler.h" #include "core/timeconstants.h" // Taglib added support for FLAC pictures in 1.7.0 #if (TAGLIB_MAJOR_VERSION > 1) || \ (TAGLIB_MAJOR_VERSION == 1 && TAGLIB_MINOR_VERSION >= 7) #define TAGLIB_HAS_FLAC_PICTURELIST #endif #ifdef HAVE_GOOGLE_DRIVE #include "cloudstream.h" #endif #define NumberToASFAttribute(x) \ TagLib::ASF::Attribute(QStringToTaglibString(QString::number(x))) class FileRefFactory { public: virtual ~FileRefFactory() {} virtual TagLib::FileRef* GetFileRef(const QString& filename) = 0; }; class TagLibFileRefFactory : public FileRefFactory { public: virtual TagLib::FileRef* GetFileRef(const QString& filename) { #ifdef Q_OS_WIN32 return new TagLib::FileRef(filename.toStdWString().c_str()); #else return new TagLib::FileRef(QFile::encodeName(filename).constData()); #endif } }; namespace { TagLib::String StdStringToTaglibString(const std::string& s) { return TagLib::String(s.c_str(), TagLib::String::UTF8); } TagLib::String QStringToTaglibString(const QString& s) { return TagLib::String(s.toUtf8().constData(), TagLib::String::UTF8); } } const char* TagReader::kMP4_FMPS_Rating_ID = "----:com.apple.iTunes:FMPS_Rating"; const char* TagReader::kMP4_FMPS_Playcount_ID = "----:com.apple.iTunes:FMPS_Playcount"; const char* TagReader::kMP4_FMPS_Score_ID = "----:com.apple.iTunes:FMPS_Rating_Amarok_Score"; namespace { // Tags containing the year the album was originally released (in contrast to // other tags that contain the release year of the current edition) const char* kMP4_OriginalYear_ID = "----:com.apple.iTunes:ORIGINAL YEAR"; const char* kASF_OriginalDate_ID = "WM/OriginalReleaseTime"; const char* kASF_OriginalYear_ID = "WM/OriginalReleaseYear"; } TagReader::TagReader() : factory_(new TagLibFileRefFactory), network_(new QNetworkAccessManager), kEmbeddedCover("(embedded)") {} void TagReader::ReadFile(const QString& filename, pb::tagreader::SongMetadata* song) const { const QByteArray url(QUrl::fromLocalFile(filename).toEncoded()); const QFileInfo info(filename); qLog(Debug) << "Reading tags from" << filename; song->set_basefilename(DataCommaSizeFromQString(info.fileName())); song->set_url(url.constData(), url.size()); song->set_filesize(info.size()); song->set_mtime(info.lastModified().toTime_t()); song->set_ctime(info.created().toTime_t()); std::unique_ptr fileref(factory_->GetFileRef(filename)); if (fileref->isNull()) { qLog(Info) << "TagLib hasn't been able to read " << filename << " file"; return; } TagLib::Tag* tag = fileref->tag(); if (tag) { Decode(tag->title(), nullptr, song->mutable_title()); Decode(tag->artist(), nullptr, song->mutable_artist()); // TPE1 Decode(tag->album(), nullptr, song->mutable_album()); Decode(tag->genre(), nullptr, song->mutable_genre()); song->set_year(tag->year()); song->set_track(tag->track()); song->set_valid(true); } QString disc; QString compilation; QString lyrics; // Handle all the files which have VorbisComments (Ogg, OPUS, ...) in the same // way; // apart, so we keep specific behavior for some formats by adding another // "else if" block below. if (TagLib::Ogg::XiphComment* tag = dynamic_cast(fileref->file()->tag())) { ParseOggTag(tag->fieldListMap(), nullptr, &disc, &compilation, song); } if (TagLib::MPEG::File* file = dynamic_cast(fileref->file())) { if (file->ID3v2Tag()) { const TagLib::ID3v2::FrameListMap& map = file->ID3v2Tag()->frameListMap(); if (!map["TPOS"].isEmpty()) disc = TStringToQString(map["TPOS"].front()->toString()).trimmed(); if (!map["TBPM"].isEmpty()) song->set_bpm(TStringToQString(map["TBPM"].front()->toString()) .trimmed() .toFloat()); if (!map["TCOM"].isEmpty()) Decode(map["TCOM"].front()->toString(), nullptr, song->mutable_composer()); if (!map["TIT1"].isEmpty()) // content group Decode(map["TIT1"].front()->toString(), nullptr, song->mutable_grouping()); if (!map["TOPE"].isEmpty()) // original artist/performer Decode(map["TOPE"].front()->toString(), nullptr, song->mutable_performer()); // Skip TPE1 (which is the artist) here because we already fetched it if (!map["TPE2"].isEmpty()) // non-standard: Apple, Microsoft Decode(map["TPE2"].front()->toString(), nullptr, song->mutable_albumartist()); if (!map["TCMP"].isEmpty()) compilation = TStringToQString(map["TCMP"].front()->toString()).trimmed(); if (!map["TDOR"].isEmpty()) { song->set_originalyear( map["TDOR"].front()->toString().substr(0, 4).toInt()); } else if (!map["TORY"].isEmpty()) { song->set_originalyear( map["TORY"].front()->toString().substr(0, 4).toInt()); } if (!map["USLT"].isEmpty()) { Decode(map["USLT"].front()->toString(), nullptr, song->mutable_lyrics()); } else if (!map["SYLT"].isEmpty()) { Decode(map["SYLT"].front()->toString(), nullptr, song->mutable_lyrics()); } if (!map["APIC"].isEmpty()) song->set_art_automatic(kEmbeddedCover); // Find a suitable comment tag. For now we ignore iTunNORM comments. for (int i = 0; i < map["COMM"].size(); ++i) { const TagLib::ID3v2::CommentsFrame* frame = dynamic_cast(map["COMM"][i]); if (frame && TStringToQString(frame->description()) != "iTunNORM") { Decode(frame->text(), nullptr, song->mutable_comment()); break; } } // Parse FMPS frames for (int i = 0; i < map["TXXX"].size(); ++i) { const TagLib::ID3v2::UserTextIdentificationFrame* frame = dynamic_cast( map["TXXX"][i]); if (frame && frame->description().startsWith("FMPS_")) { ParseFMPSFrame(TStringToQString(frame->description()), TStringToQString(frame->fieldList()[1]), song); } } // Check POPM tags // We do this after checking FMPS frames, so FMPS have precedence, as we // will consider POPM tags iff song has no rating/playcount already set. if (!map["POPM"].isEmpty()) { const TagLib::ID3v2::PopularimeterFrame* frame = dynamic_cast( map["POPM"].front()); if (frame) { // Take a user rating only if there's no rating already set if (song->rating() <= 0 && frame->rating() > 0) { song->set_rating(ConvertPOPMRating(frame->rating())); } if (song->playcount() <= 0 && frame->counter() > 0) { song->set_playcount(frame->counter()); } } } } } else if (TagLib::FLAC::File* file = dynamic_cast(fileref->file())) { if (file->xiphComment()) { ParseOggTag(file->xiphComment()->fieldListMap(), nullptr, &disc, &compilation, song); #ifdef TAGLIB_HAS_FLAC_PICTURELIST if (!file->pictureList().isEmpty()) { song->set_art_automatic(kEmbeddedCover); } #endif } Decode(tag->comment(), nullptr, song->mutable_comment()); } else if (TagLib::MP4::File* file = dynamic_cast(fileref->file())) { if (file->tag()) { TagLib::MP4::Tag* mp4_tag = file->tag(); const TagLib::MP4::ItemListMap& items = mp4_tag->itemListMap(); // Find album artists TagLib::MP4::ItemListMap::ConstIterator it = items.find("aART"); if (it != items.end()) { TagLib::StringList album_artists = it->second.toStringList(); if (!album_artists.isEmpty()) { Decode(album_artists.front(), nullptr, song->mutable_albumartist()); } } // Find album cover art if (items.find("covr") != items.end()) { song->set_art_automatic(kEmbeddedCover); } if (items.contains("disk")) { disc = TStringToQString( TagLib::String::number(items["disk"].toIntPair().first)); } if (items.contains(kMP4_FMPS_Rating_ID)) { float rating = TStringToQString(items[kMP4_FMPS_Rating_ID].toStringList().toString( '\n')).toFloat(); if (song->rating() <= 0 && rating > 0) { song->set_rating(rating); } } if (items.contains(kMP4_FMPS_Playcount_ID)) { int playcount = TStringToQString( items[kMP4_FMPS_Playcount_ID].toStringList().toString('\n')) .toFloat(); if (song->playcount() <= 0 && playcount > 0) { song->set_playcount(playcount); } } if (items.contains(kMP4_FMPS_Playcount_ID)) { int score = TStringToQString( items[kMP4_FMPS_Score_ID].toStringList().toString('\n')) .toFloat() * 100; if (song->score() <= 0 && score > 0) { song->set_score(score); } } if (items.contains("\251wrt")) { Decode(items["\251wrt"].toStringList().toString(", "), nullptr, song->mutable_composer()); } if (items.contains("\251grp")) { Decode(items["\251grp"].toStringList().toString(" "), nullptr, song->mutable_grouping()); } if (items.contains(kMP4_OriginalYear_ID)) { song->set_originalyear( TStringToQString( items[kMP4_OriginalYear_ID].toStringList().toString('\n')) .left(4) .toInt()); } Decode(mp4_tag->comment(), nullptr, song->mutable_comment()); } } #ifdef TAGLIB_WITH_ASF else if (TagLib::ASF::File* file = dynamic_cast(fileref->file())) { const TagLib::ASF::AttributeListMap& attributes_map = file->tag()->attributeListMap(); if (attributes_map.contains("FMPS/Rating")) { const TagLib::ASF::AttributeList& attributes = attributes_map["FMPS/Rating"]; if (!attributes.isEmpty()) { float rating = TStringToQString(attributes.front().toString()).toFloat(); if (song->rating() <= 0 && rating > 0) { song->set_rating(rating); } } } if (attributes_map.contains("FMPS/Playcount")) { const TagLib::ASF::AttributeList& attributes = attributes_map["FMPS/Playcount"]; if (!attributes.isEmpty()) { int playcount = TStringToQString(attributes.front().toString()).toInt(); if (song->playcount() <= 0 && playcount > 0) { song->set_playcount(playcount); } } } if (attributes_map.contains("FMPS/Rating_Amarok_Score")) { const TagLib::ASF::AttributeList& attributes = attributes_map["FMPS/Rating_Amarok_Score"]; if (!attributes.isEmpty()) { int score = TStringToQString(attributes.front().toString()).toFloat() * 100; if (song->score() <= 0 && score > 0) { song->set_score(score); } } } if (attributes_map.contains(kASF_OriginalDate_ID)) { const TagLib::ASF::AttributeList& attributes = attributes_map[kASF_OriginalDate_ID]; if (!attributes.isEmpty()) { song->set_originalyear( TStringToQString(attributes.front().toString()).left(4).toInt()); } } else if (attributes_map.contains(kASF_OriginalYear_ID)) { const TagLib::ASF::AttributeList& attributes = attributes_map[kASF_OriginalYear_ID]; if (!attributes.isEmpty()) { song->set_originalyear( TStringToQString(attributes.front().toString()).left(4).toInt()); } } } #endif else if (tag) { Decode(tag->comment(), nullptr, song->mutable_comment()); } if (!disc.isEmpty()) { const int i = disc.indexOf('/'); if (i != -1) { // disc.right( i ).toInt() is total number of discs, we don't use this at // the moment song->set_disc(disc.left(i).toInt()); } else { song->set_disc(disc.toInt()); } } if (compilation.isEmpty()) { // well, it wasn't set, but if the artist is VA assume it's a compilation if (QStringFromStdString(song->artist()).toLower() == "various artists") { song->set_compilation(true); } } else { song->set_compilation(compilation.toInt() == 1); } if (!lyrics.isEmpty()) song->set_lyrics(lyrics.toStdString()); if (fileref->audioProperties()) { song->set_bitrate(fileref->audioProperties()->bitrate()); song->set_samplerate(fileref->audioProperties()->sampleRate()); song->set_length_nanosec(fileref->audioProperties()->length() * kNsecPerSec); } // Get the filetype if we can song->set_type(GuessFileType(fileref.get())); // Set integer fields to -1 if they're not valid #define SetDefault(field) \ if (song->field() <= 0) { \ song->set_##field(-1); \ } SetDefault(track); SetDefault(disc); SetDefault(bpm); SetDefault(year); SetDefault(bitrate); SetDefault(samplerate); SetDefault(lastplayed); #undef SetDefault } void TagReader::Decode(const TagLib::String& tag, const QTextCodec* codec, std::string* output) { QString tmp; if (codec && tag.isLatin1()) { // Never override UTF-8. const std::string fixed = QString::fromUtf8(tag.toCString(true)).toStdString(); tmp = codec->toUnicode(fixed.c_str()).trimmed(); } else { tmp = TStringToQString(tag).trimmed(); } output->assign(DataCommaSizeFromQString(tmp)); } void TagReader::Decode(const QString& tag, const QTextCodec* codec, std::string* output) { if (!codec) { output->assign(DataCommaSizeFromQString(tag)); } else { const QString decoded(codec->toUnicode(tag.toUtf8())); output->assign(DataCommaSizeFromQString(decoded)); } } void TagReader::ParseFMPSFrame(const QString& name, const QString& value, pb::tagreader::SongMetadata* song) const { qLog(Debug) << "Parsing FMPSFrame" << name << ", " << value; FMPSParser parser; if (!parser.Parse(value) || parser.is_empty()) return; QVariant var; if (name == "FMPS_Rating") { var = parser.result()[0][0]; if (var.type() == QVariant::Double) { song->set_rating(var.toDouble()); } } else if (name == "FMPS_Rating_User") { // Take a user rating only if there's no rating already set if (song->rating() == -1 && parser.result()[0].count() >= 2) { var = parser.result()[0][1]; if (var.type() == QVariant::Double) { song->set_rating(var.toDouble()); } } } else if (name == "FMPS_PlayCount") { var = parser.result()[0][0]; if (var.type() == QVariant::Double) { song->set_playcount(var.toDouble()); } } else if (name == "FMPS_PlayCount_User") { // Take a user playcount only if there's no playcount already set if (song->playcount() == 0 && parser.result()[0].count() >= 2) { var = parser.result()[0][1]; if (var.type() == QVariant::Double) { song->set_playcount(var.toDouble()); } } } else if (name == "FMPS_Rating_Amarok_Score") { var = parser.result()[0][0]; if (var.type() == QVariant::Double) { song->set_score(var.toFloat() * 100); } } } void TagReader::ParseOggTag(const TagLib::Ogg::FieldListMap& map, const QTextCodec* codec, QString* disc, QString* compilation, pb::tagreader::SongMetadata* song) const { if (!map["COMPOSER"].isEmpty()) Decode(map["COMPOSER"].front(), codec, song->mutable_composer()); if (!map["PERFORMER"].isEmpty()) Decode(map["PERFORMER"].front(), codec, song->mutable_performer()); if (!map["CONTENT GROUP"].isEmpty()) Decode(map["CONTENT GROUP"].front(), codec, song->mutable_grouping()); if (!map["ALBUMARTIST"].isEmpty()) { Decode(map["ALBUMARTIST"].front(), codec, song->mutable_albumartist()); } else if (!map["ALBUM ARTIST"].isEmpty()) { Decode(map["ALBUM ARTIST"].front(), codec, song->mutable_albumartist()); } if (!map["ORIGINALDATE"].isEmpty()) song->set_originalyear( TStringToQString(map["ORIGINALDATE"].front()).left(4).toInt()); else if (!map["ORIGINALYEAR"].isEmpty()) song->set_originalyear( TStringToQString(map["ORIGINALYEAR"].front()).toInt()); if (!map["BPM"].isEmpty()) song->set_bpm(TStringToQString(map["BPM"].front()).trimmed().toFloat()); if (!map["DISCNUMBER"].isEmpty()) *disc = TStringToQString(map["DISCNUMBER"].front()).trimmed(); if (!map["COMPILATION"].isEmpty()) *compilation = TStringToQString(map["COMPILATION"].front()).trimmed(); if (!map["COVERART"].isEmpty()) song->set_art_automatic(kEmbeddedCover); if (!map["METADATA_BLOCK_PICTURE"].isEmpty()) song->set_art_automatic(kEmbeddedCover); if (!map["FMPS_RATING"].isEmpty() && song->rating() <= 0) song->set_rating( TStringToQString(map["FMPS_RATING"].front()).trimmed().toFloat()); if (!map["FMPS_PLAYCOUNT"].isEmpty() && song->playcount() <= 0) song->set_playcount( TStringToQString(map["FMPS_PLAYCOUNT"].front()).trimmed().toFloat()); if (!map["FMPS_RATING_AMAROK_SCORE"].isEmpty() && song->score() <= 0) song->set_score(TStringToQString(map["FMPS_RATING_AMAROK_SCORE"].front()) .trimmed() .toFloat() * 100); } void TagReader::SetVorbisComments( TagLib::Ogg::XiphComment* vorbis_comments, const pb::tagreader::SongMetadata& song) const { vorbis_comments->addField("COMPOSER", StdStringToTaglibString(song.composer()), true); vorbis_comments->addField("PERFORMER", StdStringToTaglibString(song.performer()), true); vorbis_comments->addField("CONTENT GROUP", StdStringToTaglibString(song.grouping()), true); vorbis_comments->addField( "BPM", QStringToTaglibString( song.bpm() <= 0 - 1 ? QString() : QString::number(song.bpm())), true); vorbis_comments->addField( "DISCNUMBER", QStringToTaglibString( song.disc() <= 0 - 1 ? QString() : QString::number(song.disc())), true); vorbis_comments->addField( "COMPILATION", StdStringToTaglibString(song.compilation() ? "1" : "0"), true); // Try to be coherent, the two forms are used but the first one is preferred vorbis_comments->addField("ALBUMARTIST", StdStringToTaglibString(song.albumartist()), true); vorbis_comments->removeField("ALBUM ARTIST"); } void TagReader::SetFMPSStatisticsVorbisComments( TagLib::Ogg::XiphComment* vorbis_comments, const pb::tagreader::SongMetadata& song) const { vorbis_comments->addField( "FMPS_PLAYCOUNT", QStringToTaglibString(QString::number(song.playcount()))); vorbis_comments->addField( "FMPS_RATING_AMAROK_SCORE", QStringToTaglibString(QString::number(song.score() / 100.0))); } void TagReader::SetFMPSRatingVorbisComments( TagLib::Ogg::XiphComment* vorbis_comments, const pb::tagreader::SongMetadata& song) const { vorbis_comments->addField( "FMPS_RATING", QStringToTaglibString(QString::number(song.rating()))); } pb::tagreader::SongMetadata_Type TagReader::GuessFileType( TagLib::FileRef* fileref) const { #ifdef TAGLIB_WITH_ASF if (dynamic_cast(fileref->file())) return pb::tagreader::SongMetadata_Type_ASF; #endif if (dynamic_cast(fileref->file())) return pb::tagreader::SongMetadata_Type_FLAC; #ifdef TAGLIB_WITH_MP4 if (dynamic_cast(fileref->file())) return pb::tagreader::SongMetadata_Type_MP4; #endif if (dynamic_cast(fileref->file())) return pb::tagreader::SongMetadata_Type_MPC; if (dynamic_cast(fileref->file())) return pb::tagreader::SongMetadata_Type_MPEG; if (dynamic_cast(fileref->file())) return pb::tagreader::SongMetadata_Type_OGGFLAC; if (dynamic_cast(fileref->file())) return pb::tagreader::SongMetadata_Type_OGGSPEEX; if (dynamic_cast(fileref->file())) return pb::tagreader::SongMetadata_Type_OGGVORBIS; #ifdef TAGLIB_HAS_OPUS if (dynamic_cast(fileref->file())) return pb::tagreader::SongMetadata_Type_OGGOPUS; #endif if (dynamic_cast(fileref->file())) return pb::tagreader::SongMetadata_Type_AIFF; if (dynamic_cast(fileref->file())) return pb::tagreader::SongMetadata_Type_WAV; if (dynamic_cast(fileref->file())) return pb::tagreader::SongMetadata_Type_TRUEAUDIO; return pb::tagreader::SongMetadata_Type_UNKNOWN; } bool TagReader::SaveFile(const QString& filename, const pb::tagreader::SongMetadata& song) const { if (filename.isNull()) return false; qLog(Debug) << "Saving tags to" << filename; std::unique_ptr fileref(factory_->GetFileRef(filename)); if (!fileref || fileref->isNull()) // The file probably doesn't exist return false; fileref->tag()->setTitle(StdStringToTaglibString(song.title())); fileref->tag()->setArtist(StdStringToTaglibString(song.artist())); // TPE1 fileref->tag()->setAlbum(StdStringToTaglibString(song.album())); fileref->tag()->setGenre(StdStringToTaglibString(song.genre())); fileref->tag()->setComment(StdStringToTaglibString(song.comment())); fileref->tag()->setYear(song.year()); fileref->tag()->setTrack(song.track()); if (TagLib::MPEG::File* file = dynamic_cast(fileref->file())) { TagLib::ID3v2::Tag* tag = file->ID3v2Tag(true); SetTextFrame( "TPOS", song.disc() <= 0 - 1 ? QString() : QString::number(song.disc()), tag); SetTextFrame("TBPM", song.bpm() <= 0 - 1 ? QString() : QString::number(song.bpm()), tag); SetTextFrame("TCOM", song.composer(), tag); SetTextFrame("TIT1", song.grouping(), tag); SetTextFrame("TOPE", song.performer(), tag); SetUnsyncLyricsFrame(song.lyrics(), tag); // Skip TPE1 (which is the artist) here because we already set it SetTextFrame("TPE2", song.albumartist(), tag); SetTextFrame("TCMP", std::string(song.compilation() ? "1" : "0"), tag); } else if (TagLib::FLAC::File* file = dynamic_cast(fileref->file())) { TagLib::Ogg::XiphComment* tag = file->xiphComment(); SetVorbisComments(tag, song); } else if (TagLib::MP4::File* file = dynamic_cast(fileref->file())) { TagLib::MP4::Tag* tag = file->tag(); tag->itemListMap()["disk"] = TagLib::MP4::Item(song.disc() <= 0 - 1 ? 0 : song.disc(), 0); tag->itemListMap()["tmpo"] = TagLib::StringList( song.bpm() <= 0 - 1 ? "0" : TagLib::String::number(song.bpm())); tag->itemListMap()["\251wrt"] = TagLib::StringList(song.composer()); tag->itemListMap()["\251grp"] = TagLib::StringList(song.grouping()); tag->itemListMap()["aART"] = TagLib::StringList(song.albumartist()); tag->itemListMap()["cpil"] = TagLib::StringList(song.compilation() ? "1" : "0"); } // Handle all the files which have VorbisComments (Ogg, OPUS, ...) in the same // way; // apart, so we keep specific behavior for some formats by adding another // "else if" block above. if (TagLib::Ogg::XiphComment* tag = dynamic_cast(fileref->file()->tag())) { SetVorbisComments(tag, song); } bool ret = fileref->save(); #ifdef Q_OS_LINUX if (ret) { // Linux: inotify doesn't seem to notice the change to the file unless we // change the timestamps as well. (this is what touch does) utimensat(0, QFile::encodeName(filename).constData(), nullptr, 0); } #endif // Q_OS_LINUX return ret; } bool TagReader::SaveSongStatisticsToFile( const QString& filename, const pb::tagreader::SongMetadata& song) const { if (filename.isNull()) return false; qLog(Debug) << "Saving song statistics tags to" << filename; std::unique_ptr fileref(factory_->GetFileRef(filename)); if (!fileref || fileref->isNull()) // The file probably doesn't exist return false; if (TagLib::MPEG::File* file = dynamic_cast(fileref->file())) { TagLib::ID3v2::Tag* tag = file->ID3v2Tag(true); // Save as FMPS SetUserTextFrame("FMPS_PlayCount", QString::number(song.playcount()), tag); SetUserTextFrame("FMPS_Rating_Amarok_Score", QString::number(song.score() / 100.0), tag); // Also save as POPM TagLib::ID3v2::PopularimeterFrame* frame = GetPOPMFrameFromTag(tag); frame->setCounter(song.playcount()); } else if (TagLib::FLAC::File* file = dynamic_cast(fileref->file())) { TagLib::Ogg::XiphComment* vorbis_comments = file->xiphComment(true); SetFMPSStatisticsVorbisComments(vorbis_comments, song); } else if (TagLib::Ogg::XiphComment* tag = dynamic_cast( fileref->file()->tag())) { SetFMPSStatisticsVorbisComments(tag, song); } #ifdef TAGLIB_WITH_ASF else if (TagLib::ASF::File* file = dynamic_cast(fileref->file())) { TagLib::ASF::Tag* tag = file->tag(); tag->addAttribute("FMPS/Playcount", NumberToASFAttribute(song.playcount())); tag->addAttribute("FMPS/Rating_Amarok_Score", NumberToASFAttribute(song.score() / 100.0)); } #endif else if (TagLib::MP4::File* file = dynamic_cast(fileref->file())) { TagLib::MP4::Tag* tag = file->tag(); tag->itemListMap()[kMP4_FMPS_Score_ID] = TagLib::StringList( QStringToTaglibString(QString::number(song.score() / 100.0))); tag->itemListMap()[kMP4_FMPS_Playcount_ID] = TagLib::StringList(TagLib::String::number(song.playcount())); } else { // Nothing to save: stop now return true; } bool ret = fileref->save(); #ifdef Q_OS_LINUX if (ret) { // Linux: inotify doesn't seem to notice the change to the file unless we // change the timestamps as well. (this is what touch does) utimensat(0, QFile::encodeName(filename).constData(), nullptr, 0); } #endif // Q_OS_LINUX return ret; } bool TagReader::SaveSongRatingToFile( const QString& filename, const pb::tagreader::SongMetadata& song) const { if (filename.isNull()) return false; qLog(Debug) << "Saving song rating tags to" << filename; if (song.rating() < 0) { // The FMPS spec says unrated == "tag not present". For us, no rating // results in rating being -1, so don't write anything in that case. // Actually, we should also remove tag set in this case, but in // Clementine it is not possible to unset rating i.e. make a song "unrated". qLog(Debug) << "Unrated: do nothing"; return true; } std::unique_ptr fileref(factory_->GetFileRef(filename)); if (!fileref || fileref->isNull()) // The file probably doesn't exist return false; if (TagLib::MPEG::File* file = dynamic_cast(fileref->file())) { TagLib::ID3v2::Tag* tag = file->ID3v2Tag(true); // Save as FMPS SetUserTextFrame("FMPS_Rating", QString::number(song.rating()), tag); // Also save as POPM TagLib::ID3v2::PopularimeterFrame* frame = GetPOPMFrameFromTag(tag); frame->setRating(ConvertToPOPMRating(song.rating())); } else if (TagLib::FLAC::File* file = dynamic_cast(fileref->file())) { TagLib::Ogg::XiphComment* vorbis_comments = file->xiphComment(true); SetFMPSRatingVorbisComments(vorbis_comments, song); } else if (TagLib::Ogg::XiphComment* tag = dynamic_cast( fileref->file()->tag())) { SetFMPSRatingVorbisComments(tag, song); } #ifdef TAGLIB_WITH_ASF else if (TagLib::ASF::File* file = dynamic_cast(fileref->file())) { TagLib::ASF::Tag* tag = file->tag(); tag->addAttribute("FMPS/Rating", NumberToASFAttribute(song.rating())); } #endif else if (TagLib::MP4::File* file = dynamic_cast(fileref->file())) { TagLib::MP4::Tag* tag = file->tag(); tag->itemListMap()[kMP4_FMPS_Rating_ID] = TagLib::StringList( QStringToTaglibString(QString::number(song.rating()))); } else { // Nothing to save: stop now return true; } bool ret = fileref->save(); #ifdef Q_OS_LINUX if (ret) { // Linux: inotify doesn't seem to notice the change to the file unless we // change the timestamps as well. (this is what touch does) utimensat(0, QFile::encodeName(filename).constData(), nullptr, 0); } #endif // Q_OS_LINUX return ret; } void TagReader::SetUserTextFrame(const QString& description, const QString& value, TagLib::ID3v2::Tag* tag) const { const QByteArray descr_utf8(description.toUtf8()); const QByteArray value_utf8(value.toUtf8()); qLog(Debug) << "Setting FMPSFrame:" << description << ", " << value; SetUserTextFrame(std::string(descr_utf8.constData(), descr_utf8.length()), std::string(value_utf8.constData(), value_utf8.length()), tag); } void TagReader::SetUserTextFrame(const std::string& description, const std::string& value, TagLib::ID3v2::Tag* tag) const { const TagLib::String t_description = StdStringToTaglibString(description); // Remove the frame if it already exists TagLib::ID3v2::UserTextIdentificationFrame* frame = TagLib::ID3v2::UserTextIdentificationFrame::find(tag, t_description); if (frame) { tag->removeFrame(frame); } // Create and add a new frame frame = new TagLib::ID3v2::UserTextIdentificationFrame(TagLib::String::UTF8); frame->setDescription(t_description); frame->setText(StdStringToTaglibString(value)); tag->addFrame(frame); } void TagReader::SetTextFrame(const char* id, const QString& value, TagLib::ID3v2::Tag* tag) const { const QByteArray utf8(value.toUtf8()); SetTextFrame(id, std::string(utf8.constData(), utf8.length()), tag); } void TagReader::SetTextFrame(const char* id, const std::string& value, TagLib::ID3v2::Tag* tag) const { TagLib::ByteVector id_vector(id); QVector frames_buffer; // Store and clear existing frames while (tag->frameListMap().contains(id_vector) && tag->frameListMap()[id_vector].size() != 0) { frames_buffer.push_back(tag->frameListMap()[id_vector].front()->render()); tag->removeFrame(tag->frameListMap()[id_vector].front()); } // If no frames stored create empty frame if (frames_buffer.isEmpty()) { TagLib::ID3v2::TextIdentificationFrame frame(id_vector, TagLib::String::UTF8); frames_buffer.push_back(frame.render()); } // Update and add the frames for (int lyrics_index = 0; lyrics_index < frames_buffer.size(); lyrics_index++) { TagLib::ID3v2::TextIdentificationFrame* frame = new TagLib::ID3v2::TextIdentificationFrame( frames_buffer.at(lyrics_index)); if (lyrics_index == 0) { frame->setText(StdStringToTaglibString(value)); } // add frame takes ownership and clears the memory tag->addFrame(frame); } } void TagReader::SetUnsyncLyricsFrame(const std::string& value, TagLib::ID3v2::Tag* tag) const { TagLib::ByteVector id_vector("USLT"); QVector frames_buffer; // Store and clear existing frames while (tag->frameListMap().contains(id_vector) && tag->frameListMap()[id_vector].size() != 0) { frames_buffer.push_back(tag->frameListMap()[id_vector].front()->render()); tag->removeFrame(tag->frameListMap()[id_vector].front()); } // If no frames stored create empty frame if (frames_buffer.isEmpty()) { TagLib::ID3v2::UnsynchronizedLyricsFrame frame(TagLib::String::UTF8); frame.setDescription("Clementine editor"); frames_buffer.push_back(frame.render()); } // Update and add the frames for (int lyrics_index = 0; lyrics_index < frames_buffer.size(); lyrics_index++) { TagLib::ID3v2::UnsynchronizedLyricsFrame* frame = new TagLib::ID3v2::UnsynchronizedLyricsFrame( frames_buffer.at(lyrics_index)); if (lyrics_index == 0) { frame->setText(StdStringToTaglibString(value)); } // add frame takes ownership and clears the memory tag->addFrame(frame); } } bool TagReader::IsMediaFile(const QString& filename) const { qLog(Debug) << "Checking for valid file" << filename; std::unique_ptr fileref(factory_->GetFileRef(filename)); return !fileref->isNull() && fileref->tag(); } QByteArray TagReader::LoadEmbeddedArt(const QString& filename) const { if (filename.isEmpty()) return QByteArray(); qLog(Debug) << "Loading art from" << filename; #ifdef Q_OS_WIN32 TagLib::FileRef ref(filename.toStdWString().c_str()); #else TagLib::FileRef ref(QFile::encodeName(filename).constData()); #endif if (ref.isNull() || !ref.file()) return QByteArray(); // MP3 TagLib::MPEG::File* file = dynamic_cast(ref.file()); if (file && file->ID3v2Tag()) { TagLib::ID3v2::FrameList apic_frames = file->ID3v2Tag()->frameListMap()["APIC"]; if (apic_frames.isEmpty()) return QByteArray(); TagLib::ID3v2::AttachedPictureFrame* pic = static_cast(apic_frames.front()); return QByteArray((const char*)pic->picture().data(), pic->picture().size()); } // Ogg vorbis/speex TagLib::Ogg::XiphComment* xiph_comment = dynamic_cast(ref.file()->tag()); if (xiph_comment) { TagLib::Ogg::FieldListMap map = xiph_comment->fieldListMap(); // Other than the below mentioned non-standard COVERART, // METADATA_BLOCK_PICTURE // is the proposed tag for cover pictures. // (see http://wiki.xiph.org/VorbisComment#METADATA_BLOCK_PICTURE) if (map.contains("METADATA_BLOCK_PICTURE")) { TagLib::StringList pict_list = map["METADATA_BLOCK_PICTURE"]; for (std::list::iterator it = pict_list.begin(); it != pict_list.end(); ++it) { QByteArray data(QByteArray::fromBase64(it->toCString())); TagLib::ByteVector tdata(data.data(), data.size()); TagLib::FLAC::Picture p(tdata); if (p.type() == TagLib::FLAC::Picture::FrontCover) return QByteArray(p.data().data(), p.data().size()); } // If there was no specific front cover, just take the first picture QByteArray data(QByteArray::fromBase64( map["METADATA_BLOCK_PICTURE"].front().toCString())); TagLib::ByteVector tdata(data.data(), data.size()); TagLib::FLAC::Picture p(tdata); return QByteArray(p.data().data(), p.data().size()); } // Ogg lacks a definitive standard for embedding cover art, but it seems // b64 encoding a field called COVERART is the general convention if (!map.contains("COVERART")) return QByteArray(); return QByteArray::fromBase64(map["COVERART"].toString().toCString()); } #ifdef TAGLIB_HAS_FLAC_PICTURELIST // Flac TagLib::FLAC::File* flac_file = dynamic_cast(ref.file()); if (flac_file && flac_file->xiphComment()) { TagLib::List pics = flac_file->pictureList(); if (!pics.isEmpty()) { // Use the first picture in the file - this could be made cleverer and // pick the front cover if it's present. std::list::iterator it = pics.begin(); TagLib::FLAC::Picture* picture = *it; return QByteArray(picture->data().data(), picture->data().size()); } } #endif // MP4/AAC TagLib::MP4::File* aac_file = dynamic_cast(ref.file()); if (aac_file) { TagLib::MP4::Tag* tag = aac_file->tag(); const TagLib::MP4::ItemListMap& items = tag->itemListMap(); TagLib::MP4::ItemListMap::ConstIterator it = items.find("covr"); if (it != items.end()) { const TagLib::MP4::CoverArtList& art_list = it->second.toCoverArtList(); if (!art_list.isEmpty()) { // Just take the first one for now const TagLib::MP4::CoverArt& art = art_list.front(); return QByteArray(art.data().data(), art.data().size()); } } } return QByteArray(); } #ifdef HAVE_GOOGLE_DRIVE bool TagReader::ReadCloudFile(const QUrl& download_url, const QString& title, int size, const QString& mime_type, const QString& authorisation_header, pb::tagreader::SongMetadata* song) const { qLog(Debug) << "Loading tags from" << title; std::unique_ptr stream(new CloudStream( download_url, title, size, authorisation_header, network_)); stream->Precache(); std::unique_ptr tag; if (mime_type == "audio/mpeg" && title.endsWith(".mp3")) { tag.reset(new TagLib::MPEG::File(stream.get(), TagLib::ID3v2::FrameFactory::instance(), TagLib::AudioProperties::Accurate)); } else if (mime_type == "audio/mp4" || (mime_type == "audio/mpeg" && title.endsWith(".m4a"))) { tag.reset(new TagLib::MP4::File(stream.get(), true, TagLib::AudioProperties::Accurate)); } #ifdef TAGLIB_HAS_OPUS else if ((mime_type == "application/opus" || mime_type == "audio/opus" || mime_type == "application/ogg" || mime_type == "audio/ogg") && title.endsWith(".opus")) { tag.reset(new TagLib::Ogg::Opus::File(stream.get(), true, TagLib::AudioProperties::Accurate)); } #endif else if (mime_type == "application/ogg" || mime_type == "audio/ogg") { tag.reset(new TagLib::Ogg::Vorbis::File(stream.get(), true, TagLib::AudioProperties::Accurate)); } else if (mime_type == "application/x-flac" || mime_type == "audio/flac" || mime_type == "audio/x-flac") { tag.reset(new TagLib::FLAC::File(stream.get(), TagLib::ID3v2::FrameFactory::instance(), true, TagLib::AudioProperties::Accurate)); } else if (mime_type == "audio/x-ms-wma") { tag.reset(new TagLib::ASF::File(stream.get(), true, TagLib::AudioProperties::Accurate)); } else { qLog(Debug) << "Unknown mime type for tagging:" << mime_type; return false; } if (stream->num_requests() > 2) { // Warn if pre-caching failed. qLog(Warning) << "Total requests for file:" << title << stream->num_requests() << stream->cached_bytes(); } if (tag->tag() && !tag->tag()->isEmpty()) { song->set_title(tag->tag()->title().toCString(true)); song->set_artist(tag->tag()->artist().toCString(true)); song->set_album(tag->tag()->album().toCString(true)); song->set_filesize(size); if (tag->tag()->track() != 0) { song->set_track(tag->tag()->track()); } if (tag->tag()->year() != 0) { song->set_year(tag->tag()->year()); } song->set_type(pb::tagreader::SongMetadata_Type_STREAM); if (tag->audioProperties()) { song->set_length_nanosec(tag->audioProperties()->length() * kNsecPerSec); } return true; } return false; } #endif // HAVE_GOOGLE_DRIVE TagLib::ID3v2::PopularimeterFrame* TagReader::GetPOPMFrameFromTag( TagLib::ID3v2::Tag* tag) { TagLib::ID3v2::PopularimeterFrame* frame = nullptr; const TagLib::ID3v2::FrameListMap& map = tag->frameListMap(); if (!map["POPM"].isEmpty()) { frame = dynamic_cast(map["POPM"].front()); } if (!frame) { frame = new TagLib::ID3v2::PopularimeterFrame(); tag->addFrame(frame); } return frame; } float TagReader::ConvertPOPMRating(const int POPM_rating) { if (POPM_rating < 0x01) { return 0.0; } else if (POPM_rating < 0x40) { return 0.20; // 1 star } else if (POPM_rating < 0x80) { return 0.40; // 2 stars } else if (POPM_rating < 0xC0) { return 0.60; // 3 stars } else if (POPM_rating < 0xFC) { // some players store 5 stars as 0xFC return 0.80; // 4 stars } return 1.0; // 5 stars } int TagReader::ConvertToPOPMRating(const float rating) { if (rating < 0.20) { return 0x00; } else if (rating < 0.40) { return 0x01; } else if (rating < 0.60) { return 0x40; } else if (rating < 0.80) { return 0x80; } else if (rating < 1.0) { return 0xC0; } return 0xFF; } clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-tagreader/tagreader.h000066400000000000000000000111411260417502300270420ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2013, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef TAGREADER_H #define TAGREADER_H #include #include #include "config.h" #include "tagreadermessages.pb.h" class QNetworkAccessManager; class QString; class QTextCodec; class QUrl; namespace TagLib { class FileRef; class String; namespace ID3v2 { class Tag; class PopularimeterFrame; } } class FileRefFactory; /** * This class holds all useful methods to read and write tags from/to files. * You should not use it directly in the main process but rather use a * TagReaderWorker process (using TagReaderClient) */ class TagReader { public: TagReader(); void ReadFile(const QString& filename, pb::tagreader::SongMetadata* song) const; bool SaveFile(const QString& filename, const pb::tagreader::SongMetadata& song) const; // Returns false if something went wrong; returns true otherwise (might // returns true if the file exists but nothing has been written inside because // statistics tag format is not supported for this kind of file) bool SaveSongStatisticsToFile(const QString& filename, const pb::tagreader::SongMetadata& song) const; bool SaveSongRatingToFile(const QString& filename, const pb::tagreader::SongMetadata& song) const; bool IsMediaFile(const QString& filename) const; QByteArray LoadEmbeddedArt(const QString& filename) const; #ifdef HAVE_GOOGLE_DRIVE bool ReadCloudFile(const QUrl& download_url, const QString& title, int size, const QString& mime_type, const QString& access_token, pb::tagreader::SongMetadata* song) const; #endif // HAVE_GOOGLE_DRIVE static void Decode(const TagLib::String& tag, const QTextCodec* codec, std::string* output); static void Decode(const QString& tag, const QTextCodec* codec, std::string* output); void ParseFMPSFrame(const QString& name, const QString& value, pb::tagreader::SongMetadata* song) const; void ParseOggTag(const TagLib::Ogg::FieldListMap& map, const QTextCodec* codec, QString* disc, QString* compilation, pb::tagreader::SongMetadata* song) const; void SetVorbisComments(TagLib::Ogg::XiphComment* vorbis_comments, const pb::tagreader::SongMetadata& song) const; void SetFMPSStatisticsVorbisComments( TagLib::Ogg::XiphComment* vorbis_comments, const pb::tagreader::SongMetadata& song) const; void SetFMPSRatingVorbisComments( TagLib::Ogg::XiphComment* vorbis_comments, const pb::tagreader::SongMetadata& song) const; pb::tagreader::SongMetadata_Type GuessFileType( TagLib::FileRef* fileref) const; void SetUserTextFrame(const QString& description, const QString& value, TagLib::ID3v2::Tag* tag) const; void SetUserTextFrame(const std::string& description, const std::string& value, TagLib::ID3v2::Tag* tag) const; void SetTextFrame(const char* id, const QString& value, TagLib::ID3v2::Tag* tag) const; void SetTextFrame(const char* id, const std::string& value, TagLib::ID3v2::Tag* tag) const; void SetUnsyncLyricsFrame(const std::string& value, TagLib::ID3v2::Tag* tag) const; private: static const char* kMP4_FMPS_Rating_ID; static const char* kMP4_FMPS_Playcount_ID; static const char* kMP4_FMPS_Score_ID; // Returns a float in [0.0..1.0] corresponding to the rating range we use in // Clementine static float ConvertPOPMRating(const int POPM_rating); // Reciprocal static int ConvertToPOPMRating(const float rating); static TagLib::ID3v2::PopularimeterFrame* GetPOPMFrameFromTag( TagLib::ID3v2::Tag* tag); FileRefFactory* factory_; QNetworkAccessManager* network_; const std::string kEmbeddedCover; }; #endif // TAGREADER_H clementine-1.2.3+git1354-gdaddbde+dfsg/ext/libclementine-tagreader/tagreadermessages.proto000066400000000000000000000067161260417502300315220ustar00rootroot00000000000000package pb.tagreader; message SongMetadata { enum Type { UNKNOWN = 0; ASF = 1; FLAC = 2; MP4 = 3; MPC = 4; MPEG = 5; OGGFLAC = 6; OGGSPEEX = 7; OGGVORBIS = 8; AIFF = 9; WAV = 10; TRUEAUDIO = 11; CDDA = 12; OGGOPUS = 13; STREAM = 99; } optional bool valid = 1; optional string title = 2; optional string album = 3; optional string artist = 4; optional string albumartist = 5; optional string composer = 6; optional int32 track = 7; optional int32 disc = 8; optional float bpm = 9; optional int32 year = 10; optional string genre = 11; optional string comment = 12; optional bool compilation = 13; optional float rating = 14; optional int32 playcount = 15; optional int32 skipcount = 16; optional int32 lastplayed = 17; optional int32 score = 18; optional uint64 length_nanosec = 19; optional int32 bitrate = 20; optional int32 samplerate = 21; optional string url = 22; optional string basefilename = 23; optional int32 mtime = 24; optional int32 ctime = 25; optional int32 filesize = 26; optional bool suspicious_tags = 27; optional string art_automatic = 28; optional Type type = 29; optional string etag = 30; optional string performer = 31; optional string grouping = 32; optional string lyrics = 33; optional int32 originalyear = 34; } message ReadFileRequest { optional string filename = 1; } message ReadFileResponse { optional SongMetadata metadata = 1; } message SaveFileRequest { optional string filename = 1; optional SongMetadata metadata = 2; } message SaveFileResponse { optional bool success = 1; } message IsMediaFileRequest { optional string filename = 1; } message IsMediaFileResponse { optional bool success = 1; } message LoadEmbeddedArtRequest { optional string filename = 1; } message LoadEmbeddedArtResponse { optional bytes data = 1; } message ReadCloudFileRequest { optional string download_url = 1; optional string title = 2; optional int32 size = 3; optional string authorisation_header = 4; optional string mime_type = 5; } message ReadCloudFileResponse { optional SongMetadata metadata = 1; } message SaveSongStatisticsToFileRequest { optional string filename = 1; optional SongMetadata metadata = 2; } message SaveSongStatisticsToFileResponse { optional bool success = 1; } message SaveSongRatingToFileRequest { optional string filename = 1; optional SongMetadata metadata = 2; } message SaveSongRatingToFileResponse { optional bool success = 1; } message Message { optional int32 id = 1; optional ReadFileRequest read_file_request = 2; optional ReadFileResponse read_file_response = 3; optional SaveFileRequest save_file_request = 4; optional SaveFileResponse save_file_response = 5; optional IsMediaFileRequest is_media_file_request = 6; optional IsMediaFileResponse is_media_file_response = 7; optional LoadEmbeddedArtRequest load_embedded_art_request = 8; optional LoadEmbeddedArtResponse load_embedded_art_response = 9; optional ReadCloudFileRequest read_cloud_file_request = 10; optional ReadCloudFileResponse read_cloud_file_response = 11; optional SaveSongStatisticsToFileRequest save_song_statistics_to_file_request = 12; optional SaveSongStatisticsToFileResponse save_song_statistics_to_file_response = 13; optional SaveSongRatingToFileRequest save_song_rating_to_file_request = 14; optional SaveSongRatingToFileResponse save_song_rating_to_file_response = 15; } clementine-1.2.3+git1354-gdaddbde+dfsg/gst/000077500000000000000000000000001260417502300201645ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/gst/moodbar/000077500000000000000000000000001260417502300216075ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/gst/moodbar/CMakeLists.txt000066400000000000000000000012321260417502300243450ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.6) set(CMAKE_C_FLAGS "-Wall") set(CMAKE_CXX_FLAGS "-Woverloaded-virtual -Wall --std=c++0x") include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${GLIB_INCLUDE_DIRS}) include_directories(${GOBJECT_INCLUDE_DIRS}) include_directories(${GSTREAMER_INCLUDE_DIRS}) include_directories(${FFTW3_INCLUDE_DIR}) set(SOURCES gstfastspectrum.cpp plugin.cpp ) add_library(gstmoodbar STATIC ${SOURCES} ) target_link_libraries(gstmoodbar ${GOBJECT_LIBRARIES} ${GLIB_LIBRARIES} ${GSTREAMER_LIBRARIES} ${GSTREAMER_AUDIO_LIBRARIES} ${GSTREAMER_BASE_LIBRARIES} ${FFTW3_FFTW_LIBRARY} ) clementine-1.2.3+git1354-gdaddbde+dfsg/gst/moodbar/gstfastspectrum.cpp000066400000000000000000000402271260417502300255560ustar00rootroot00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * <2006,2011> Stefan Kost * <2007-2009> Sebastian Dröge * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include "gstfastspectrum.h" GST_DEBUG_CATEGORY_STATIC (gst_fastspectrum_debug); #define GST_CAT_DEFAULT gst_fastspectrum_debug /* elementfactory information */ #if G_BYTE_ORDER == G_LITTLE_ENDIAN # define FORMATS "{ S16LE, S24LE, S32LE, F32LE, F64LE }" #else # define FORMATS "{ S16BE, S24BE, S32BE, F32BE, F64BE }" #endif #define ALLOWED_CAPS \ GST_AUDIO_CAPS_MAKE (FORMATS) ", " \ "layout = (string) interleaved, " \ "channels = 1" /* Spectrum properties */ #define DEFAULT_INTERVAL (GST_SECOND / 10) #define DEFAULT_BANDS 128 enum { PROP_0, PROP_INTERVAL, PROP_BANDS }; #define gst_fastspectrum_parent_class parent_class G_DEFINE_TYPE (GstFastSpectrum, gst_fastspectrum, GST_TYPE_AUDIO_FILTER); static void gst_fastspectrum_finalize (GObject * object); static void gst_fastspectrum_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_fastspectrum_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_fastspectrum_start (GstBaseTransform * trans); static gboolean gst_fastspectrum_stop (GstBaseTransform * trans); static GstFlowReturn gst_fastspectrum_transform_ip (GstBaseTransform * trans, GstBuffer * in); static gboolean gst_fastspectrum_setup (GstAudioFilter * base, const GstAudioInfo * info); static void gst_fastspectrum_class_init (GstFastSpectrumClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstBaseTransformClass *trans_class = GST_BASE_TRANSFORM_CLASS (klass); GstAudioFilterClass *filter_class = GST_AUDIO_FILTER_CLASS (klass); GstCaps *caps; gobject_class->set_property = gst_fastspectrum_set_property; gobject_class->get_property = gst_fastspectrum_get_property; gobject_class->finalize = gst_fastspectrum_finalize; trans_class->start = GST_DEBUG_FUNCPTR (gst_fastspectrum_start); trans_class->stop = GST_DEBUG_FUNCPTR (gst_fastspectrum_stop); trans_class->transform_ip = GST_DEBUG_FUNCPTR (gst_fastspectrum_transform_ip); trans_class->passthrough_on_same_caps = TRUE; filter_class->setup = GST_DEBUG_FUNCPTR (gst_fastspectrum_setup); g_object_class_install_property (gobject_class, PROP_INTERVAL, g_param_spec_uint64 ("interval", "Interval", "Interval of time between message posts (in nanoseconds)", 1, G_MAXUINT64, DEFAULT_INTERVAL, GParamFlags(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_BANDS, g_param_spec_uint ("bands", "Bands", "Number of frequency bands", 0, G_MAXUINT, DEFAULT_BANDS, GParamFlags(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); GST_DEBUG_CATEGORY_INIT (gst_fastspectrum_debug, "spectrum", 0, "audio spectrum analyser element"); gst_element_class_set_static_metadata (element_class, "Spectrum analyzer", "Filter/Analyzer/Audio", "Run an FFT on the audio signal, output spectrum data", "Erik Walthinsen , " "Stefan Kost , " "Sebastian Dröge "); caps = gst_caps_from_string (ALLOWED_CAPS); gst_audio_filter_class_add_pad_templates (filter_class, caps); gst_caps_unref (caps); klass->fftw_lock = new QMutex; } static void gst_fastspectrum_init (GstFastSpectrum * spectrum) { spectrum->interval = DEFAULT_INTERVAL; spectrum->bands = DEFAULT_BANDS; spectrum->channel_data_initialised = false; g_mutex_init (&spectrum->lock); } static void gst_fastspectrum_alloc_channel_data (GstFastSpectrum * spectrum) { guint bands = spectrum->bands; guint nfft = 2 * bands - 2; spectrum->input_ring_buffer = new double[nfft]; spectrum->fft_input = reinterpret_cast( fftw_malloc(sizeof(double) * nfft)); spectrum->fft_output =reinterpret_cast( fftw_malloc(sizeof(fftw_complex) * (nfft/2+1))); spectrum->spect_magnitude = new double[bands]{}; GstFastSpectrumClass* klass = reinterpret_cast( G_OBJECT_GET_CLASS(spectrum)); { QMutexLocker l(klass->fftw_lock); spectrum->plan = fftw_plan_dft_r2c_1d( nfft, spectrum->fft_input, spectrum->fft_output, FFTW_ESTIMATE); } spectrum->channel_data_initialised = true; } static void gst_fastspectrum_free_channel_data (GstFastSpectrum * spectrum) { GstFastSpectrumClass* klass = reinterpret_cast( G_OBJECT_GET_CLASS(spectrum)); if (spectrum->channel_data_initialised) { { QMutexLocker l(klass->fftw_lock); fftw_destroy_plan(spectrum->plan); } fftw_free(spectrum->fft_input); fftw_free(spectrum->fft_output); delete[] spectrum->input_ring_buffer; delete[] spectrum->spect_magnitude; spectrum->channel_data_initialised = false; } } static void gst_fastspectrum_flush (GstFastSpectrum * spectrum) { spectrum->num_frames = 0; spectrum->num_fft = 0; spectrum->accumulated_error = 0; } static void gst_fastspectrum_reset_state (GstFastSpectrum * spectrum) { GST_DEBUG_OBJECT (spectrum, "resetting state"); gst_fastspectrum_free_channel_data (spectrum); gst_fastspectrum_flush (spectrum); } static void gst_fastspectrum_finalize (GObject * object) { GstFastSpectrum *spectrum = GST_FASTSPECTRUM (object); gst_fastspectrum_reset_state (spectrum); g_mutex_clear (&spectrum->lock); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_fastspectrum_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstFastSpectrum *filter = GST_FASTSPECTRUM (object); switch (prop_id) { case PROP_INTERVAL:{ guint64 interval = g_value_get_uint64 (value); g_mutex_lock (&filter->lock); if (filter->interval != interval) { filter->interval = interval; gst_fastspectrum_reset_state (filter); } g_mutex_unlock (&filter->lock); break; } case PROP_BANDS:{ guint bands = g_value_get_uint (value); g_mutex_lock (&filter->lock); if (filter->bands != bands) { filter->bands = bands; gst_fastspectrum_reset_state (filter); } g_mutex_unlock (&filter->lock); break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_fastspectrum_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstFastSpectrum *filter = GST_FASTSPECTRUM (object); switch (prop_id) { case PROP_INTERVAL: g_value_set_uint64 (value, filter->interval); break; case PROP_BANDS: g_value_set_uint (value, filter->bands); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static gboolean gst_fastspectrum_start (GstBaseTransform * trans) { GstFastSpectrum *spectrum = GST_FASTSPECTRUM (trans); gst_fastspectrum_reset_state (spectrum); return TRUE; } static gboolean gst_fastspectrum_stop (GstBaseTransform * trans) { GstFastSpectrum *spectrum = GST_FASTSPECTRUM (trans); gst_fastspectrum_reset_state (spectrum); return TRUE; } /* mixing data readers */ static void input_data_mixed_float(const guint8* _in, double* out, guint len, double max_value, guint op, guint nfft) { guint j, ip = 0; gfloat *in = (gfloat *) _in; for (j = 0; j < len; j++) { out[op] = in[ip++]; op = (op + 1) % nfft; } } static void input_data_mixed_double (const guint8 * _in, double* out, guint len, double max_value, guint op, guint nfft) { guint j, ip = 0; gdouble *in = (gdouble *) _in; for (j = 0; j < len; j++) { out[op] = in[ip++]; op = (op + 1) % nfft; } } static void input_data_mixed_int32_max (const guint8 * _in, double* out, guint len, double max_value, guint op, guint nfft) { guint j, ip = 0; gint32 *in = (gint32 *) _in; for (j = 0; j < len; j++) { out[op] = in[ip++] / max_value; op = (op + 1) % nfft; } } static void input_data_mixed_int24_max (const guint8 * _in, double* out, guint len, double max_value, guint op, guint nfft) { guint j; for (j = 0; j < len; j++) { #if G_BYTE_ORDER == G_BIG_ENDIAN gint32 value = GST_READ_UINT24_BE (_in); #else gint32 value = GST_READ_UINT24_LE (_in); #endif if (value & 0x00800000) value |= 0xff000000; out[op] = value / max_value; op = (op + 1) % nfft; _in += 3; } } static void input_data_mixed_int16_max (const guint8 * _in, double * out, guint len, double max_value, guint op, guint nfft) { guint j, ip = 0; gint16 *in = (gint16 *) _in; for (j = 0; j < len; j++) { out[op] = in[ip++] / max_value; op = (op + 1) % nfft; } } static gboolean gst_fastspectrum_setup (GstAudioFilter * base, const GstAudioInfo * info) { GstFastSpectrum *spectrum = GST_FASTSPECTRUM (base); GstFastSpectrumInputData input_data = NULL; g_mutex_lock (&spectrum->lock); switch (GST_AUDIO_INFO_FORMAT (info)) { case GST_AUDIO_FORMAT_S16: input_data = input_data_mixed_int16_max; break; case GST_AUDIO_FORMAT_S24: input_data = input_data_mixed_int24_max; break; case GST_AUDIO_FORMAT_S32: input_data = input_data_mixed_int32_max; break; case GST_AUDIO_FORMAT_F32: input_data = input_data_mixed_float; break; case GST_AUDIO_FORMAT_F64: input_data = input_data_mixed_double; break; default: g_assert_not_reached (); break; } spectrum->input_data = input_data; gst_fastspectrum_reset_state (spectrum); g_mutex_unlock (&spectrum->lock); return TRUE; } static void gst_fastspectrum_run_fft (GstFastSpectrum * spectrum, guint input_pos) { guint i; guint bands = spectrum->bands; guint nfft = 2 * bands - 2; for (i = 0; i < nfft; i++) spectrum->fft_input[i] = spectrum->input_ring_buffer[(input_pos + i) % nfft]; // Should be safe to execute the same plan multiple times in parallel. fftw_execute(spectrum->plan); gdouble val; /* Calculate magnitude in db */ for (i = 0; i < bands; i++) { val = spectrum->fft_output[i][0] * spectrum->fft_output[i][0]; val += spectrum->fft_output[i][1] * spectrum->fft_output[i][1]; val /= nfft * nfft; spectrum->spect_magnitude[i] += val; } } static GstFlowReturn gst_fastspectrum_transform_ip (GstBaseTransform * trans, GstBuffer * buffer) { GstFastSpectrum *spectrum = GST_FASTSPECTRUM (trans); guint rate = GST_AUDIO_FILTER_RATE (spectrum); guint bps = GST_AUDIO_FILTER_BPS (spectrum); guint bpf = GST_AUDIO_FILTER_BPF (spectrum); double max_value = (1UL << ((bps << 3) - 1)) - 1; guint bands = spectrum->bands; guint nfft = 2 * bands - 2; guint input_pos; GstMapInfo map; const guint8 *data; gsize size; guint fft_todo, msg_todo, block_size; gboolean have_full_interval; GstFastSpectrumInputData input_data; g_mutex_lock (&spectrum->lock); gst_buffer_map (buffer, &map, GST_MAP_READ); data = map.data; size = map.size; GST_LOG_OBJECT (spectrum, "input size: %" G_GSIZE_FORMAT " bytes", size); if (GST_BUFFER_IS_DISCONT (buffer)) { GST_DEBUG_OBJECT (spectrum, "Discontinuity detected -- flushing"); gst_fastspectrum_flush (spectrum); } /* If we don't have a FFT context yet (or it was reset due to parameter * changes) get one and allocate memory for everything */ if (!spectrum->channel_data_initialised) { GST_DEBUG_OBJECT (spectrum, "allocating for bands %u", bands); gst_fastspectrum_alloc_channel_data (spectrum); /* number of sample frames we process before posting a message * interval is in ns */ spectrum->frames_per_interval = gst_util_uint64_scale (spectrum->interval, rate, GST_SECOND); spectrum->frames_todo = spectrum->frames_per_interval; /* rounding error for frames_per_interval in ns, * aggregated it in accumulated_error */ spectrum->error_per_interval = (spectrum->interval * rate) % GST_SECOND; if (spectrum->frames_per_interval == 0) spectrum->frames_per_interval = 1; GST_INFO_OBJECT (spectrum, "interval %" GST_TIME_FORMAT ", fpi %" G_GUINT64_FORMAT ", error %" GST_TIME_FORMAT, GST_TIME_ARGS (spectrum->interval), spectrum->frames_per_interval, GST_TIME_ARGS (spectrum->error_per_interval)); spectrum->input_pos = 0; gst_fastspectrum_flush (spectrum); } if (spectrum->num_frames == 0) spectrum->message_ts = GST_BUFFER_TIMESTAMP (buffer); input_pos = spectrum->input_pos; input_data = spectrum->input_data; while (size >= bpf) { /* run input_data for a chunk of data */ fft_todo = nfft - (spectrum->num_frames % nfft); msg_todo = spectrum->frames_todo - spectrum->num_frames; GST_LOG_OBJECT (spectrum, "message frames todo: %u, fft frames todo: %u, input frames %" G_GSIZE_FORMAT, msg_todo, fft_todo, (size / bpf)); block_size = msg_todo; if (block_size > (size / bpf)) block_size = (size / bpf); if (block_size > fft_todo) block_size = fft_todo; /* Move the current frames into our ringbuffers */ input_data(data, spectrum->input_ring_buffer, block_size, max_value, input_pos, nfft); data += block_size * bpf; size -= block_size * bpf; input_pos = (input_pos + block_size) % nfft; spectrum->num_frames += block_size; have_full_interval = (spectrum->num_frames == spectrum->frames_todo); GST_LOG_OBJECT (spectrum, "size: %" G_GSIZE_FORMAT ", do-fft = %d, do-message = %d", size, (spectrum->num_frames % nfft == 0), have_full_interval); /* If we have enough frames for an FFT or we have all frames required for * the interval and we haven't run a FFT, then run an FFT */ if ((spectrum->num_frames % nfft == 0) || (have_full_interval && !spectrum->num_fft)) { gst_fastspectrum_run_fft (spectrum, input_pos); spectrum->num_fft++; } /* Do we have the FFTs for one interval? */ if (have_full_interval) { GST_DEBUG_OBJECT (spectrum, "nfft: %u frames: %" G_GUINT64_FORMAT " fpi: %" G_GUINT64_FORMAT " error: %" GST_TIME_FORMAT, nfft, spectrum->num_frames, spectrum->frames_per_interval, GST_TIME_ARGS (spectrum->accumulated_error)); spectrum->frames_todo = spectrum->frames_per_interval; if (spectrum->accumulated_error >= GST_SECOND) { spectrum->accumulated_error -= GST_SECOND; spectrum->frames_todo++; } spectrum->accumulated_error += spectrum->error_per_interval; if (spectrum->output_callback) { // Calculate average for (guint i = 0; i < spectrum->bands; i++) { spectrum->spect_magnitude[i] /= spectrum->num_fft; } spectrum->output_callback(spectrum->spect_magnitude, spectrum->bands); // Reset spectrum accumulators memset(spectrum->spect_magnitude, 0, spectrum->bands * sizeof(double)); } if (GST_CLOCK_TIME_IS_VALID (spectrum->message_ts)) spectrum->message_ts += gst_util_uint64_scale (spectrum->num_frames, GST_SECOND, rate); spectrum->num_frames = 0; spectrum->num_fft = 0; } } spectrum->input_pos = input_pos; gst_buffer_unmap (buffer, &map); g_mutex_unlock (&spectrum->lock); g_assert (size == 0); return GST_FLOW_OK; } clementine-1.2.3+git1354-gdaddbde+dfsg/gst/moodbar/gstfastspectrum.h000066400000000000000000000065041260417502300252230ustar00rootroot00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2009> Sebastian Dröge * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. */ // Adapted from gstspectrum for Clementine with the following changes: // - Uses fftw instead of kiss fft (2x faster). // - Hardcoded to 1 channel (use an audioconvert element to do the work // instead, simplifies this code a lot). // - Send output via a callback instead of GST messages (less overhead). // - Removed all properties except interval and band. #ifndef GST_MOODBAR_FASTSPECTRUM_H_ #define GST_MOODBAR_FASTSPECTRUM_H_ #include #include #include #include G_BEGIN_DECLS #define GST_TYPE_FASTSPECTRUM (gst_fastspectrum_get_type()) #define GST_FASTSPECTRUM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_FASTSPECTRUM,GstFastSpectrum)) #define GST_IS_FASTSPECTRUM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_FASTSPECTRUM)) #define GST_FASTSPECTRUM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_FASTSPECTRUM,GstFastSpectrumClass)) #define GST_IS_FASTSPECTRUM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_FASTSPECTRUM)) class QMutex; typedef void (*GstFastSpectrumInputData)(const guint8* in, double* out, guint len, double max_value, guint op, guint nfft); typedef std::function OutputCallback; struct GstFastSpectrum { GstAudioFilter parent; /* properties */ guint64 interval; /* how many nanoseconds between emits */ guint64 frames_per_interval; /* how many frames per interval */ guint64 frames_todo; guint bands; /* number of spectrum bands */ gboolean multi_channel; /* send separate channel results */ guint64 num_frames; /* frame count (1 sample per channel) * since last emit */ guint64 num_fft; /* number of FFTs since last emit */ GstClockTime message_ts; /* starttime for next message */ /* */ bool channel_data_initialised; double* input_ring_buffer; double* fft_input; fftw_complex* fft_output; double* spect_magnitude; fftw_plan plan; guint input_pos; guint64 error_per_interval; guint64 accumulated_error; GMutex lock; GstFastSpectrumInputData input_data; OutputCallback output_callback; }; struct GstFastSpectrumClass { GstAudioFilterClass parent_class; // Static lock for creating & destroying FFTW plans. QMutex* fftw_lock; }; GType gst_fastspectrum_get_type (void); G_END_DECLS #endif // GST_MOODBAR_FASTSPECTRUM_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/gst/moodbar/plugin.cpp000066400000000000000000000025031260417502300236110ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include #include "gstfastspectrum.h" #include "plugin.h" namespace { static gboolean plugin_init(GstPlugin* plugin) { if (!gst_element_register(plugin, "fastspectrum", GST_RANK_NONE, GST_TYPE_FASTSPECTRUM)) { return FALSE; } return TRUE; } } // namespace int gstfastspectrum_register_static() { return gst_plugin_register_static( GST_VERSION_MAJOR, GST_VERSION_MINOR, "fastspectrum", "Fast spectrum analyzer for generating Moodbars", plugin_init, "0.1", "GPL", "FastSpectrum", "FastSpectrum", "https://www.clementine-player.org"); } clementine-1.2.3+git1354-gdaddbde+dfsg/gst/moodbar/plugin.h000066400000000000000000000015631260417502300232630ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef GST_MOODBAR_PLUGIN_H_ #define GST_MOODBAR_PLUGIN_H_ extern "C" { int gstfastspectrum_register_static(); } #endif // GST_MOODBAR_PLUGIN_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/000077500000000000000000000000001260417502300201565ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/CMakeLists.txt000066400000000000000000001311041260417502300227160ustar00rootroot00000000000000 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Woverloaded-virtual -Wall -Wno-sign-compare -Wno-deprecated-declarations -Wno-unused-local-typedefs -Wno-unused-private-field -Wno-unknown-warning-option --std=c++0x -U__STRICT_ANSI__") option(BUILD_WERROR "Build with -Werror" ON) if(BUILD_WERROR) if (LINUX) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror") endif (LINUX) endif(BUILD_WERROR) include_directories(${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) include_directories(../3rdparty/gmock/gtest/include) if(WIN32) include_directories(../3rdparty/qtwin) endif(WIN32) # Activate fast QString concatenation if (QT_VERSION_MINOR GREATER 5) if (QT_VERSION_MINOR GREATER 7) add_definitions(-DQT_USE_QSTRINGBUILDER) else(QT_VERSION_MINOR GREATER 7) add_definitions(-DQT_USE_FAST_CONCATENATION -DQT_USE_FAST_OPERATOR_PLUS) endif(QT_VERSION_MINOR GREATER 7) endif(QT_VERSION_MINOR GREATER 5) add_definitions(-DQT_NO_URL_CAST_FROM_STRING) add_definitions(-DBOOST_BIND_NO_PLACEHOLDERS) include_directories(${CMAKE_BINARY_DIR}) include_directories(${GLIB_INCLUDE_DIRS}) include_directories(${LIBXML_INCLUDE_DIRS}) include_directories(${GOBJECT_INCLUDE_DIRS}) include_directories(${LIBPROJECTM_INCLUDE_DIRS}) include_directories(${QTSINGLEAPPLICATION_INCLUDE_DIRS}) include_directories(${QTIOCOMPRESSOR_INCLUDE_DIRS}) include_directories(${QXT_INCLUDE_DIRS}) include_directories(${ECHONEST_INCLUDE_DIRS}) include_directories(${SHA2_INCLUDE_DIRS}) include_directories(${CHROMAPRINT_INCLUDE_DIRS}) include_directories(${MYGPOQT_INCLUDE_DIRS}) find_package(OpenGL) include_directories(${OPENGL_INCLUDE_DIR}) if(HAVE_LIBLASTFM) include_directories(${LASTFM_INCLUDE_DIRS}) endif(HAVE_LIBLASTFM) if(HAVE_BREAKPAD) include_directories(../3rdparty/google-breakpad) endif(HAVE_BREAKPAD) include_directories(${CMAKE_SOURCE_DIR}/ext/libclementine-common) include_directories(${CMAKE_SOURCE_DIR}/ext/libclementine-tagreader) include_directories(${CMAKE_BINARY_DIR}/ext/libclementine-tagreader) include_directories(${CMAKE_SOURCE_DIR}/ext/libclementine-remote) include_directories(${CMAKE_BINARY_DIR}/ext/libclementine-remote) include_directories(${CMAKE_SOURCE_DIR}/ext/libclementine-spotifyblob) include_directories(${CMAKE_BINARY_DIR}/ext/libclementine-spotifyblob) cmake_policy(SET CMP0011 NEW) include(../cmake/ParseArguments.cmake) include(../cmake/Translations.cmake) set(SOURCES analyzers/analyzerbase.cpp analyzers/analyzercontainer.cpp analyzers/baranalyzer.cpp analyzers/blockanalyzer.cpp analyzers/boomanalyzer.cpp analyzers/nyancatanalyzer.cpp analyzers/rainbowdashanalyzer.cpp analyzers/sonogram.cpp analyzers/turbine.cpp analyzers/fht.cpp core/appearance.cpp core/application.cpp core/backgroundstreams.cpp core/commandlineoptions.cpp core/crashreporting.cpp core/database.cpp core/deletefiles.cpp core/filesystemmusicstorage.cpp core/filesystemwatcherinterface.cpp core/globalshortcutbackend.cpp core/globalshortcuts.cpp core/gnomeglobalshortcutbackend.cpp core/mergedproxymodel.cpp core/metatypes.cpp core/multisortfilterproxy.cpp core/musicstorage.cpp core/network.cpp core/networkproxyfactory.cpp core/organise.cpp core/organiseformat.cpp core/player.cpp core/qtfslistener.cpp core/qxtglobalshortcutbackend.cpp core/scopedtransaction.cpp core/settingsprovider.cpp core/signalchecker.cpp core/song.cpp core/songloader.cpp core/stylesheetloader.cpp core/tagreaderclient.cpp core/taskmanager.cpp core/thread.cpp core/urlhandler.cpp core/utilities.cpp covers/albumcoverexporter.cpp covers/albumcoverfetcher.cpp covers/albumcoverfetchersearch.cpp covers/albumcoverloader.cpp covers/amazoncoverprovider.cpp covers/coverexportrunnable.cpp covers/coverprovider.cpp covers/coverproviders.cpp covers/coversearchstatistics.cpp covers/coversearchstatisticsdialog.cpp covers/currentartloader.cpp covers/kittenloader.cpp covers/musicbrainzcoverprovider.cpp devices/connecteddevice.cpp devices/devicedatabasebackend.cpp devices/devicelister.cpp devices/devicemanager.cpp devices/deviceproperties.cpp devices/devicestatefiltermodel.cpp devices/deviceview.cpp devices/deviceviewcontainer.cpp devices/filesystemdevice.cpp engines/devicefinder.cpp engines/enginebase.cpp engines/gstengine.cpp engines/gstenginepipeline.cpp engines/gstelementdeleter.cpp globalsearch/digitallyimportedsearchprovider.cpp globalsearch/globalsearch.cpp globalsearch/globalsearchitemdelegate.cpp globalsearch/globalsearchmodel.cpp globalsearch/globalsearchsettingspage.cpp globalsearch/globalsearchsortmodel.cpp globalsearch/globalsearchview.cpp globalsearch/icecastsearchprovider.cpp globalsearch/librarysearchprovider.cpp globalsearch/savedradiosearchprovider.cpp globalsearch/searchprovider.cpp globalsearch/searchproviderstatuswidget.cpp globalsearch/simplesearchprovider.cpp globalsearch/somafmsearchprovider.cpp globalsearch/soundcloudsearchprovider.cpp globalsearch/spotifysearchprovider.cpp globalsearch/suggestionwidget.cpp globalsearch/urlsearchprovider.cpp internet/core/cloudfilesearchprovider.cpp internet/core/cloudfileservice.cpp internet/digitally/digitallyimportedclient.cpp internet/digitally/digitallyimportedservicebase.cpp internet/digitally/digitallyimportedsettingspage.cpp internet/digitally/digitallyimportedurlhandler.cpp internet/core/geolocator.cpp internet/icecast/icecastbackend.cpp internet/icecast/icecastfilterwidget.cpp internet/icecast/icecastmodel.cpp internet/icecast/icecastservice.cpp internet/core/internetmodel.cpp internet/core/internetplaylistitem.cpp internet/core/internetservice.cpp internet/core/internetshowsettingspage.cpp internet/core/internetview.cpp internet/core/internetviewcontainer.cpp internet/jamendo/jamendodynamicplaylist.cpp internet/jamendo/jamendoplaylistitem.cpp internet/jamendo/jamendoservice.cpp internet/core/localredirectserver.cpp internet/magnatune/magnatunedownloaddialog.cpp internet/magnatune/magnatuneplaylistitem.cpp internet/magnatune/magnatuneservice.cpp internet/magnatune/magnatunesettingspage.cpp internet/magnatune/magnatuneurlhandler.cpp internet/core/oauthenticator.cpp internet/internetradio/savedradio.cpp internet/core/searchboxwidget.cpp internet/somafm/somafmservice.cpp internet/somafm/somafmurlhandler.cpp internet/soundcloud/soundcloudservice.cpp internet/soundcloud/soundcloudsettingspage.cpp internet/spotify/spotifyserver.cpp internet/spotify/spotifyservice.cpp internet/spotify/spotifysettingspage.cpp internet/subsonic/subsonicservice.cpp internet/subsonic/subsonicsettingspage.cpp internet/subsonic/subsonicurlhandler.cpp library/groupbydialog.cpp library/library.cpp library/librarybackend.cpp library/librarydirectorymodel.cpp library/libraryfilterwidget.cpp library/librarymodel.cpp library/libraryplaylistitem.cpp library/libraryquery.cpp library/librarysettingspage.cpp library/libraryview.cpp library/libraryviewcontainer.cpp library/librarywatcher.cpp library/sqlrow.cpp musicbrainz/acoustidclient.cpp musicbrainz/chromaprinter.cpp musicbrainz/musicbrainzclient.cpp musicbrainz/tagfetcher.cpp networkremote/incomingdataparser.cpp networkremote/networkremote.cpp networkremote/networkremotehelper.cpp networkremote/outgoingdatacreator.cpp networkremote/remoteclient.cpp networkremote/songsender.cpp networkremote/zeroconf.cpp playlist/dynamicplaylistcontrols.cpp playlist/playlist.cpp playlist/playlistbackend.cpp playlist/playlistcontainer.cpp playlist/playlistdelegates.cpp playlist/playlistfilterparser.cpp playlist/playlistfilter.cpp playlist/playlistheader.cpp playlist/playlistitem.cpp playlist/playlistlistcontainer.cpp playlist/playlistlistmodel.cpp playlist/playlistlistview.cpp playlist/playlistmanager.cpp playlist/playlistsaveoptionsdialog.cpp playlist/playlistsequence.cpp playlist/playlisttabbar.cpp playlist/playlistundocommands.cpp playlist/playlistview.cpp playlist/queue.cpp playlist/queuemanager.cpp playlist/songloaderinserter.cpp playlist/songplaylistitem.cpp playlistparsers/asxparser.cpp playlistparsers/asxiniparser.cpp playlistparsers/cueparser.cpp playlistparsers/m3uparser.cpp playlistparsers/parserbase.cpp playlistparsers/playlistparser.cpp playlistparsers/plsparser.cpp playlistparsers/wplparser.cpp playlistparsers/xmlparser.cpp playlistparsers/xspfparser.cpp internet/podcasts/addpodcastbyurl.cpp internet/podcasts/addpodcastdialog.cpp internet/podcasts/addpodcastpage.cpp internet/podcasts/fixedopmlpage.cpp internet/podcasts/gpoddersearchpage.cpp internet/podcasts/gpoddersync.cpp internet/podcasts/gpoddertoptagsmodel.cpp internet/podcasts/gpoddertoptagspage.cpp internet/podcasts/itunessearchpage.cpp internet/podcasts/podcast.cpp internet/podcasts/podcastbackend.cpp internet/podcasts/podcastdiscoverymodel.cpp internet/podcasts/podcastdeleter.cpp internet/podcasts/podcastdownloader.cpp internet/podcasts/podcastepisode.cpp internet/podcasts/podcastinfowidget.cpp internet/podcasts/podcastservice.cpp internet/podcasts/podcastservicemodel.cpp internet/podcasts/podcastsettingspage.cpp internet/podcasts/podcastparser.cpp internet/podcasts/podcastupdater.cpp internet/podcasts/podcasturlloader.cpp smartplaylists/generator.cpp smartplaylists/generatorinserter.cpp smartplaylists/querygenerator.cpp smartplaylists/querywizardplugin.cpp smartplaylists/search.cpp smartplaylists/searchpreview.cpp smartplaylists/searchterm.cpp smartplaylists/searchtermwidget.cpp smartplaylists/wizard.cpp smartplaylists/wizardplugin.cpp songinfo/artistinfoview.cpp songinfo/collapsibleinfoheader.cpp songinfo/collapsibleinfopane.cpp songinfo/echonestbiographies.cpp songinfo/echonestimages.cpp songinfo/songinfobase.cpp songinfo/songinfofetcher.cpp songinfo/songinfoprovider.cpp songinfo/songinfosettingspage.cpp songinfo/songinfotextview.cpp songinfo/songinfoview.cpp songinfo/songkickconcerts.cpp songinfo/songkickconcertwidget.cpp songinfo/songplaystats.cpp songinfo/taglyricsinfoprovider.cpp songinfo/ultimatelyricslyric.cpp songinfo/ultimatelyricsprovider.cpp songinfo/ultimatelyricsreader.cpp transcoder/transcodedialog.cpp transcoder/transcoder.cpp transcoder/transcoderoptionsaac.cpp transcoder/transcoderoptionsdialog.cpp transcoder/transcoderoptionsflac.cpp transcoder/transcoderoptionsmp3.cpp transcoder/transcoderoptionsopus.cpp transcoder/transcoderoptionsspeex.cpp transcoder/transcoderoptionsvorbis.cpp transcoder/transcoderoptionswma.cpp transcoder/transcodersettingspage.cpp ui/about.cpp ui/addstreamdialog.cpp ui/albumcoverchoicecontroller.cpp ui/albumcoverexport.cpp ui/albumcovermanager.cpp ui/albumcovermanagerlist.cpp ui/albumcoversearcher.cpp ui/appearancesettingspage.cpp ui/backgroundstreamssettingspage.cpp ui/behavioursettingspage.cpp ui/console.cpp ui/coverfromurldialog.cpp ui/edittagdialog.cpp ui/equalizer.cpp ui/flowlayout.cpp ui/globalshortcutgrabber.cpp ui/globalshortcutssettingspage.cpp ui/iconloader.cpp ui/mainwindow.cpp ui/networkproxysettingspage.cpp ui/networkremotesettingspage.cpp ui/notificationssettingspage.cpp ui/organisedialog.cpp ui/organiseerrordialog.cpp ui/playbacksettingspage.cpp ui/qtsystemtrayicon.cpp ui/screensaver.cpp ui/settingsdialog.cpp ui/settingspage.cpp ui/standarditemiconloader.cpp ui/systemtrayicon.cpp ui/trackselectiondialog.cpp ui/windows7thumbbar.cpp widgets/autoexpandingtreeview.cpp widgets/busyindicator.cpp widgets/clickablelabel.cpp widgets/didyoumean.cpp widgets/elidedlabel.cpp widgets/equalizerslider.cpp widgets/errordialog.cpp widgets/fancytabwidget.cpp widgets/favoritewidget.cpp widgets/fileview.cpp widgets/fileviewlist.cpp widgets/forcescrollperpixel.cpp widgets/freespacebar.cpp widgets/fullscreenhypnotoad.cpp widgets/groupediconview.cpp widgets/lineedit.cpp widgets/linetextedit.cpp widgets/loginstatewidget.cpp widgets/multiloadingindicator.cpp widgets/nowplayingwidget.cpp widgets/osd.cpp widgets/osdpretty.cpp widgets/prettyimage.cpp widgets/prettyimageview.cpp widgets/progressitemdelegate.cpp widgets/ratingwidget.cpp widgets/renametablineedit.cpp widgets/sliderwidget.cpp widgets/stickyslider.cpp widgets/stretchheaderview.cpp widgets/stylehelper.cpp widgets/trackslider.cpp widgets/tracksliderpopup.cpp widgets/tracksliderslider.cpp widgets/widgetfadehelper.cpp ) set(HEADERS analyzers/analyzerbase.h analyzers/analyzercontainer.h analyzers/baranalyzer.h analyzers/blockanalyzer.h analyzers/boomanalyzer.h analyzers/nyancatanalyzer.h analyzers/rainbowdashanalyzer.h analyzers/sonogram.h analyzers/turbine.h core/application.h core/backgroundstreams.h core/crashreporting.h core/database.h core/deletefiles.h core/filesystemwatcherinterface.h core/globalshortcuts.h core/globalshortcutbackend.h core/gnomeglobalshortcutbackend.h core/mergedproxymodel.h core/mimedata.h core/network.h core/organise.h core/player.h core/qtfslistener.h core/songloader.h core/tagreaderclient.h core/taskmanager.h core/urlhandler.h covers/albumcoverexporter.h covers/albumcoverfetcher.h covers/albumcoverfetchersearch.h covers/albumcoverloader.h covers/amazoncoverprovider.h covers/coverexportrunnable.h covers/coverprovider.h covers/coverproviders.h covers/coversearchstatisticsdialog.h covers/currentartloader.h covers/kittenloader.h covers/musicbrainzcoverprovider.h devices/connecteddevice.h devices/devicedatabasebackend.h devices/devicelister.h devices/devicemanager.h devices/deviceproperties.h devices/devicestatefiltermodel.h devices/deviceview.h devices/deviceviewcontainer.h devices/filesystemdevice.h engines/enginebase.h engines/gstengine.h engines/gstenginepipeline.h engines/gstelementdeleter.h globalsearch/globalsearch.h globalsearch/globalsearchmodel.h globalsearch/globalsearchsettingspage.h globalsearch/globalsearchview.h globalsearch/searchprovider.h globalsearch/simplesearchprovider.h globalsearch/soundcloudsearchprovider.h globalsearch/spotifysearchprovider.h globalsearch/suggestionwidget.h internet/core/cloudfileservice.h internet/digitally/digitallyimportedclient.h internet/digitally/digitallyimportedservicebase.h internet/digitally/digitallyimportedsettingspage.h internet/core/geolocator.h internet/icecast/icecastbackend.h internet/icecast/icecastfilterwidget.h internet/icecast/icecastmodel.h internet/icecast/icecastservice.h internet/core/internetmimedata.h internet/core/internetmodel.h internet/core/internetservice.h internet/core/internetshowsettingspage.h internet/core/internetsongmimedata.h internet/core/internetview.h internet/core/internetviewcontainer.h internet/jamendo/jamendodynamicplaylist.h internet/jamendo/jamendoservice.h internet/core/localredirectserver.h internet/magnatune/magnatunedownloaddialog.h internet/magnatune/magnatuneservice.h internet/magnatune/magnatunesettingspage.h internet/core/oauthenticator.h internet/internetradio/savedradio.h internet/core/scrobbler.h internet/core/searchboxwidget.h internet/somafm/somafmservice.h internet/somafm/somafmurlhandler.h internet/soundcloud/soundcloudservice.h internet/soundcloud/soundcloudsettingspage.h internet/spotify/spotifyserver.h internet/spotify/spotifyservice.h internet/spotify/spotifysettingspage.h internet/subsonic/subsonicservice.h internet/subsonic/subsonicsettingspage.h internet/subsonic/subsonicurlhandler.h library/groupbydialog.h library/library.h library/librarybackend.h library/librarydirectorymodel.h library/libraryfilterwidget.h library/librarymodel.h library/librarysettingspage.h library/libraryview.h library/libraryviewcontainer.h library/librarywatcher.h musicbrainz/acoustidclient.h musicbrainz/musicbrainzclient.h musicbrainz/tagfetcher.h networkremote/networkremotehelper.h networkremote/networkremote.h networkremote/incomingdataparser.h networkremote/outgoingdatacreator.h networkremote/remoteclient.h networkremote/songsender.h playlist/dynamicplaylistcontrols.h playlist/playlist.h playlist/playlistbackend.h playlist/playlistcontainer.h playlist/playlistdelegates.h playlist/playlistfilter.h playlist/playlistheader.h playlist/playlistitemmimedata.h playlist/playlistlistcontainer.h playlist/playlistlistmodel.h playlist/playlistlistview.h playlist/playlistmanager.h playlist/playlistsaveoptionsdialog.h playlist/playlistsequence.h playlist/playlisttabbar.h playlist/playlistview.h playlist/queue.h playlist/queuemanager.h playlist/songloaderinserter.h playlist/songmimedata.h playlistparsers/asxparser.h playlistparsers/asxiniparser.h playlistparsers/cueparser.h playlistparsers/m3uparser.h playlistparsers/parserbase.h playlistparsers/playlistparser.h playlistparsers/plsparser.h playlistparsers/xspfparser.h internet/podcasts/addpodcastbyurl.h internet/podcasts/addpodcastdialog.h internet/podcasts/addpodcastpage.h internet/podcasts/fixedopmlpage.h internet/podcasts/gpoddersearchpage.h internet/podcasts/gpoddersync.h internet/podcasts/gpoddertoptagsmodel.h internet/podcasts/gpoddertoptagspage.h internet/podcasts/itunessearchpage.h internet/podcasts/podcastbackend.h internet/podcasts/podcastdiscoverymodel.h internet/podcasts/podcastdeleter.h internet/podcasts/podcastdownloader.h internet/podcasts/podcastinfowidget.h internet/podcasts/podcastservice.h internet/podcasts/podcastservicemodel.h internet/podcasts/podcastsettingspage.h internet/podcasts/podcastupdater.h internet/podcasts/podcasturlloader.h smartplaylists/generator.h smartplaylists/generatorinserter.h smartplaylists/generatormimedata.h smartplaylists/querywizardplugin.h smartplaylists/searchpreview.h smartplaylists/searchtermwidget.h smartplaylists/wizard.h smartplaylists/wizardplugin.h songinfo/artistinfoview.h songinfo/collapsibleinfoheader.h songinfo/collapsibleinfopane.h songinfo/echonestbiographies.h songinfo/echonestimages.h songinfo/songinfobase.h songinfo/songinfofetcher.h songinfo/songinfoprovider.h songinfo/songinfosettingspage.h songinfo/songinfotextview.h songinfo/songinfoview.h songinfo/songkickconcerts.h songinfo/songkickconcertwidget.h songinfo/songplaystats.h songinfo/taglyricsinfoprovider.h songinfo/ultimatelyricslyric.h songinfo/ultimatelyricsprovider.h songinfo/ultimatelyricsreader.h transcoder/transcodedialog.h transcoder/transcoder.h transcoder/transcoderoptionsdialog.h transcoder/transcoderoptionsmp3.h transcoder/transcodersettingspage.h ui/about.h ui/addstreamdialog.h ui/albumcoverchoicecontroller.h ui/albumcoverexport.h ui/albumcovermanager.h ui/albumcovermanagerlist.h ui/albumcoversearcher.h ui/appearancesettingspage.h ui/backgroundstreamssettingspage.h ui/behavioursettingspage.h ui/console.h ui/coverfromurldialog.h ui/edittagdialog.h ui/equalizer.h ui/globalshortcutgrabber.h ui/globalshortcutssettingspage.h ui/mainwindow.h ui/networkproxysettingspage.h ui/networkremotesettingspage.h ui/notificationssettingspage.h ui/organisedialog.h ui/organiseerrordialog.h ui/playbacksettingspage.h ui/qtsystemtrayicon.h ui/settingsdialog.h ui/settingspage.h ui/standarditemiconloader.h ui/systemtrayicon.h ui/trackselectiondialog.h ui/windows7thumbbar.h widgets/autoexpandingtreeview.h widgets/busyindicator.h widgets/clickablelabel.h widgets/didyoumean.h widgets/elidedlabel.h widgets/equalizerslider.h widgets/errordialog.h widgets/fancytabwidget.h widgets/favoritewidget.h widgets/fileview.h widgets/fileviewlist.h widgets/freespacebar.h widgets/groupediconview.h widgets/lineedit.h widgets/linetextedit.h widgets/loginstatewidget.h widgets/multiloadingindicator.h widgets/nowplayingwidget.h widgets/osd.h widgets/osdpretty.h widgets/prettyimage.h widgets/prettyimageview.h widgets/progressitemdelegate.h widgets/ratingwidget.h widgets/renametablineedit.h widgets/sliderwidget.h widgets/stickyslider.h widgets/stretchheaderview.h widgets/trackslider.h widgets/tracksliderpopup.h widgets/tracksliderslider.h widgets/widgetfadehelper.h ) set(UI covers/coversearchstatisticsdialog.ui devices/deviceproperties.ui devices/deviceviewcontainer.ui globalsearch/globalsearchsettingspage.ui globalsearch/globalsearchview.ui globalsearch/searchproviderstatuswidget.ui globalsearch/suggestionwidget.ui internet/digitally/digitallyimportedsettingspage.ui internet/icecast/icecastfilterwidget.ui internet/core/internetshowsettingspage.ui internet/core/internetviewcontainer.ui internet/magnatune/magnatunedownloaddialog.ui internet/magnatune/magnatunesettingspage.ui internet/core/searchboxwidget.ui internet/soundcloud/soundcloudsettingspage.ui internet/spotify/spotifysettingspage.ui internet/subsonic/subsonicsettingspage.ui library/groupbydialog.ui library/libraryfilterwidget.ui library/librarysettingspage.ui library/libraryviewcontainer.ui playlist/dynamicplaylistcontrols.ui playlist/playlistcontainer.ui playlist/playlistsaveoptionsdialog.ui playlist/playlistlistcontainer.ui playlist/playlistsequence.ui playlist/queuemanager.ui internet/podcasts/addpodcastbyurl.ui internet/podcasts/addpodcastdialog.ui internet/podcasts/gpoddersearchpage.ui internet/podcasts/itunessearchpage.ui internet/podcasts/podcastinfowidget.ui internet/podcasts/podcastsettingspage.ui smartplaylists/querysearchpage.ui smartplaylists/querysortpage.ui smartplaylists/searchpreview.ui smartplaylists/searchtermwidget.ui smartplaylists/wizardfinishpage.ui songinfo/songkickconcertwidget.ui songinfo/songinfosettingspage.ui transcoder/transcodedialog.ui transcoder/transcodelogdialog.ui transcoder/transcoderoptionsaac.ui transcoder/transcoderoptionsdialog.ui transcoder/transcoderoptionsflac.ui transcoder/transcoderoptionsmp3.ui transcoder/transcoderoptionsopus.ui transcoder/transcoderoptionsspeex.ui transcoder/transcoderoptionsvorbis.ui transcoder/transcoderoptionswma.ui transcoder/transcodersettingspage.ui ui/about.ui ui/addstreamdialog.ui ui/albumcoverexport.ui ui/albumcovermanager.ui ui/albumcoversearcher.ui ui/appearancesettingspage.ui ui/backgroundstreamssettingspage.ui ui/behavioursettingspage.ui ui/console.ui ui/coverfromurldialog.ui ui/edittagdialog.ui ui/equalizer.ui ui/globalshortcutgrabber.ui ui/globalshortcutssettingspage.ui ui/mainwindow.ui ui/networkproxysettingspage.ui ui/networkremotesettingspage.ui ui/notificationssettingspage.ui ui/organisedialog.ui ui/organiseerrordialog.ui ui/playbacksettingspage.ui ui/settingsdialog.ui ui/trackselectiondialog.ui widgets/equalizerslider.ui widgets/errordialog.ui widgets/fileview.ui widgets/loginstatewidget.ui widgets/osdpretty.ui widgets/trackslider.ui wiimotedev/wiimotesettingspage.ui wiimotedev/wiimoteshortcutgrabber.ui ) set(RESOURCES ../data/data.qrc ) set(OTHER_SOURCES) set(LINGUAS "All" CACHE STRING "A space-seperated list of translations to compile in to Clementine, or \"None\".") if (LINGUAS STREQUAL "All") # build LANGUAGES from all existing .po files file(GLOB pofiles translations/*.po) foreach(pofile ${pofiles}) get_filename_component(lang ${pofile} NAME_WE) list(APPEND LANGUAGES ${lang}) endforeach(pofile) else (LINGUAS STREQUAL "All") if (NOT LINGUAS OR LINGUAS STREQUAL "None") set (LANGUAGES "") else (NOT LINGUAS OR LINGUAS STREQUAL "None") string(REGEX MATCHALL [a-zA-Z_@]+ LANGUAGES ${LINGUAS}) endif (NOT LINGUAS OR LINGUAS STREQUAL "None") endif (LINGUAS STREQUAL "All") option(USE_INSTALL_PREFIX "Look for data in CMAKE_INSTALL_PREFIX" ON) # Visualisations optional_source(ENABLE_VISUALISATIONS SOURCES visualisations/projectmpresetmodel.cpp visualisations/projectmvisualisation.cpp visualisations/visualisationcontainer.cpp visualisations/visualisationoverlay.cpp visualisations/visualisationselector.cpp HEADERS visualisations/projectmpresetmodel.h visualisations/projectmvisualisation.h visualisations/visualisationcontainer.h visualisations/visualisationoverlay.h visualisations/visualisationselector.h UI visualisations/visualisationoverlay.ui visualisations/visualisationselector.ui ) # Lastfm optional_source(HAVE_LIBLASTFM SOURCES covers/lastfmcoverprovider.cpp internet/lastfm/fixlastfm.cpp internet/lastfm/lastfmcompat.cpp internet/lastfm/lastfmservice.cpp internet/lastfm/lastfmsettingspage.cpp songinfo/echonestsimilarartists.cpp songinfo/echonesttags.cpp songinfo/lastfmtrackinfoprovider.cpp songinfo/tagwidget.cpp HEADERS covers/lastfmcoverprovider.h internet/lastfm/lastfmservice.h internet/lastfm/lastfmsettingspage.h songinfo/echonestsimilarartists.h songinfo/echonesttags.h songinfo/lastfmtrackinfoprovider.h songinfo/tagwidget.h UI internet/lastfm/lastfmsettingspage.ui ) optional_source(HAVE_SPOTIFY_DOWNLOADER SOURCES internet/spotify/spotifyblobdownloader.cpp HEADERS internet/spotify/spotifyblobdownloader.h INCLUDE_DIRECTORIES ${CRYPTOPP_INCLUDE_DIRS} ) # Platform specific - OS X optional_source(APPLE INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/google-breakpad/client/mac/build/Release/Breakpad.framework SOURCES core/macfslistener.mm core/macglobalshortcutbackend.mm core/mac_startup.mm devices/macdevicelister.mm engines/osxdevicefinder.cpp networkremote/bonjour.mm ui/globalshortcutgrabber.mm ui/macscreensaver.cpp ui/macsystemtrayicon.mm widgets/osd_mac.mm HEADERS core/macfslistener.h core/macglobalshortcutbackend.h devices/macdevicelister.h ui/macsystemtrayicon.h ) # Platform specific - Windows optional_source(WIN32 SOURCES engines/directsounddevicefinder.cpp networkremote/tinysvcmdns.cpp widgets/osd_win.cpp INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/3rdparty/tinysvcmdns ) # Platform specific - X11 optional_source(LINUX SOURCES widgets/osd_x11.cpp) # DBUS and MPRIS - Linux specific if(HAVE_DBUS) file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/dbus) # MPRIS DBUS interfaces qt4_add_dbus_adaptor(SOURCES dbus/org.freedesktop.MediaPlayer.player.xml core/mpris1.h mpris::Mpris1Player core/mpris_player MprisPlayer) qt4_add_dbus_adaptor(SOURCES dbus/org.freedesktop.MediaPlayer.root.xml core/mpris1.h mpris::Mpris1Root core/mpris_root MprisRoot) qt4_add_dbus_adaptor(SOURCES dbus/org.freedesktop.MediaPlayer.tracklist.xml core/mpris1.h mpris::Mpris1TrackList core/mpris_tracklist MprisTrackList) # MPRIS 2.0 DBUS interfaces qt4_add_dbus_adaptor(SOURCES dbus/org.mpris.MediaPlayer2.Player.xml core/mpris2.h mpris::Mpris2 core/mpris2_player Mpris2Player) qt4_add_dbus_adaptor(SOURCES dbus/org.mpris.MediaPlayer2.xml core/mpris2.h mpris::Mpris2 core/mpris2_root Mpris2Root) qt4_add_dbus_adaptor(SOURCES dbus/org.mpris.MediaPlayer2.TrackList.xml core/mpris2.h mpris::Mpris2 core/mpris2_tracklist Mpris2TrackList) # MPRIS 2.1 DBUS interfaces qt4_add_dbus_adaptor(SOURCES dbus/org.mpris.MediaPlayer2.Playlists.xml core/mpris2.h mpris::Mpris2 core/mpris2_playlists Mpris2Playlists) # org.freedesktop.Notifications DBUS interface qt4_add_dbus_interface(SOURCES dbus/org.freedesktop.Notifications.xml dbus/notification) # org.gnome.SettingsDaemon interface qt4_add_dbus_interface(SOURCES dbus/org.gnome.SettingsDaemon.MediaKeys.xml dbus/gnomesettingsdaemon) # org.freedesktop.Avahi.Server interface add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/dbus/avahiserver.cpp ${CMAKE_CURRENT_BINARY_DIR}/dbus/avahiserver.h COMMAND ${QT_DBUSXML2CPP_EXECUTABLE} dbus/org.freedesktop.Avahi.Server.xml -p ${CMAKE_CURRENT_BINARY_DIR}/dbus/avahiserver -i dbus/metatypes.h DEPENDS dbus/org.freedesktop.Avahi.Server.xml WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) list(APPEND HEADERS ${CMAKE_CURRENT_BINARY_DIR}/dbus/avahiserver.h) list(APPEND SOURCES ${CMAKE_CURRENT_BINARY_DIR}/dbus/avahiserver.cpp) # org.freedesktop.Avahi.EntryGroup interface add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/dbus/avahientrygroup.cpp ${CMAKE_CURRENT_BINARY_DIR}/dbus/avahientrygroup.h COMMAND ${QT_DBUSXML2CPP_EXECUTABLE} dbus/org.freedesktop.Avahi.EntryGroup.xml -p ${CMAKE_CURRENT_BINARY_DIR}/dbus/avahientrygroup -i dbus/metatypes.h DEPENDS dbus/org.freedesktop.Avahi.EntryGroup.xml WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) list(APPEND HEADERS ${CMAKE_CURRENT_BINARY_DIR}/dbus/avahientrygroup.h) list(APPEND SOURCES ${CMAKE_CURRENT_BINARY_DIR}/dbus/avahientrygroup.cpp) # DeviceKit DBUS interfaces if(HAVE_DEVICEKIT) set_source_files_properties(dbus/org.freedesktop.UDisks.xml PROPERTIES NO_NAMESPACE dbus/udisks) set_source_files_properties(dbus/org.freedesktop.UDisks.Device.xml PROPERTIES NO_NAMESPACE dbus/udisksdevice) qt4_add_dbus_interface(SOURCES dbus/org.freedesktop.UDisks.xml dbus/udisks) qt4_add_dbus_interface(SOURCES dbus/org.freedesktop.UDisks.Device.xml dbus/udisksdevice) endif(HAVE_DEVICEKIT) # Wiimotedev interface classes if(ENABLE_WIIMOTEDEV) qt4_add_dbus_interface(SOURCES dbus/org.wiimotedev.deviceEvents.xml dbus/wiimotedev) endif(ENABLE_WIIMOTEDEV) endif(HAVE_DBUS) optional_source(HAVE_DBUS SOURCES core/mpris.cpp core/mpris1.cpp core/mpris2.cpp networkremote/avahi.cpp ui/dbusscreensaver.cpp HEADERS core/mpris.h core/mpris1.h core/mpris2.h ) optional_source(HAVE_WIIMOTEDEV SOURCES wiimotedev/shortcuts.cpp wiimotedev/wiimotesettingspage.cpp wiimotedev/wiimoteshortcutgrabber.cpp HEADERS wiimotedev/shortcuts.h wiimotedev/wiimotesettingspage.h wiimotedev/wiimoteshortcutgrabber.h ) optional_source(HAVE_DEVICEKIT SOURCES devices/devicekitlister.cpp HEADERS devices/devicekitlister.h ) # Libgpod device backend optional_source(HAVE_LIBGPOD INCLUDE_DIRECTORIES ${LIBGPOD_INCLUDE_DIRS} SOURCES devices/gpoddevice.cpp devices/gpodloader.cpp HEADERS devices/gpoddevice.h devices/gpodloader.h ) # GIO device backend optional_source(HAVE_GIO INCLUDE_DIRECTORIES ${GIO_INCLUDE_DIRS} SOURCES devices/giolister.cpp HEADERS devices/giolister.h ) # CDIO backend and device optional_source(HAVE_AUDIOCD SOURCES devices/cddadevice.cpp devices/cddalister.cpp devices/cddasongloader.cpp ripper/ripcddialog.cpp ripper/ripper.cpp HEADERS devices/cddadevice.h devices/cddalister.h devices/cddasongloader.h ripper/ripcddialog.h ripper/ripper.h UI ripper/ripcddialog.ui ) # mtp device optional_source(HAVE_LIBMTP INCLUDE_DIRECTORIES ${LIBMTP_INCLUDE_DIRS} SOURCES devices/mtpconnection.cpp devices/mtpdevice.cpp devices/mtploader.cpp HEADERS devices/mtpdevice.h devices/mtploader.h ) # Moodbar support optional_source(HAVE_MOODBAR SOURCES moodbar/moodbarbuilder.cpp moodbar/moodbarcontroller.cpp moodbar/moodbaritemdelegate.cpp moodbar/moodbarloader.cpp moodbar/moodbarpipeline.cpp moodbar/moodbarproxystyle.cpp moodbar/moodbarrenderer.cpp HEADERS moodbar/moodbarcontroller.h moodbar/moodbaritemdelegate.h moodbar/moodbarloader.h moodbar/moodbarpipeline.h moodbar/moodbarproxystyle.h ) # Google Drive support optional_source(HAVE_GOOGLE_DRIVE SOURCES internet/googledrive/googledriveclient.cpp internet/googledrive/googledriveservice.cpp internet/googledrive/googledrivesettingspage.cpp internet/googledrive/googledriveurlhandler.cpp HEADERS internet/googledrive/googledriveclient.h internet/googledrive/googledriveservice.h internet/googledrive/googledrivesettingspage.h internet/googledrive/googledriveurlhandler.h UI internet/googledrive/googledrivesettingspage.ui ) # Dropbox support optional_source(HAVE_DROPBOX SOURCES internet/dropbox/dropboxservice.cpp internet/dropbox/dropboxsettingspage.cpp internet/dropbox/dropboxurlhandler.cpp HEADERS internet/dropbox/dropboxservice.h internet/dropbox/dropboxsettingspage.h internet/dropbox/dropboxurlhandler.h UI internet/dropbox/dropboxsettingspage.ui ) # Skydrive support optional_source(HAVE_SKYDRIVE SOURCES internet/skydrive/skydriveservice.cpp internet/skydrive/skydrivesettingspage.cpp internet/skydrive/skydriveurlhandler.cpp HEADERS internet/skydrive/skydriveservice.h internet/skydrive/skydrivesettingspage.h internet/skydrive/skydriveurlhandler.h UI internet/skydrive/skydrivesettingspage.ui ) # Box support optional_source(HAVE_BOX SOURCES internet/box/boxservice.cpp internet/box/boxsettingspage.cpp internet/box/boxurlhandler.cpp HEADERS internet/box/boxservice.h internet/box/boxsettingspage.h internet/box/boxurlhandler.h UI internet/box/boxsettingspage.ui ) # Vk.com support optional_source(HAVE_VK INCLUDE_DIRECTORIES ${VREEN_INCLUDE_DIRS} SOURCES globalsearch/vksearchprovider.cpp internet/vk/vkconnection.cpp internet/vk/vkmusiccache.cpp internet/vk/vksearchdialog.cpp internet/vk/vkservice.cpp internet/vk/vksettingspage.cpp internet/vk/vkurlhandler.cpp HEADERS globalsearch/vksearchprovider.h internet/vk/vkconnection.h internet/vk/vkmusiccache.h internet/vk/vksearchdialog.h internet/vk/vkservice.h internet/vk/vksettingspage.h internet/vk/vkurlhandler.h UI internet/vk/vksearchdialog.ui internet/vk/vksettingspage.ui ) # Seafile support optional_source(HAVE_SEAFILE SOURCES internet/seafile/seafileservice.cpp internet/seafile/seafilesettingspage.cpp internet/seafile/seafileurlhandler.cpp internet/seafile/seafiletree.cpp HEADERS internet/seafile/seafileservice.h internet/seafile/seafilesettingspage.h internet/seafile/seafileurlhandler.h internet/seafile/seafiletree.h UI internet/seafile/seafilesettingspage.ui ) # Amazon Cloud Drive support optional_source(HAVE_AMAZON_CLOUD_DRIVE SOURCES internet/amazon/amazonclouddrive.cpp internet/amazon/amazonsettingspage.cpp internet/amazon/amazonurlhandler.cpp HEADERS internet/amazon/amazonclouddrive.h internet/amazon/amazonsettingspage.h internet/amazon/amazonurlhandler.h UI internet/amazon/amazonsettingspage.ui ) # Pulse audio integration optional_source(HAVE_LIBPULSE INCLUDE_DIRECTORIES ${LIBPULSE_INCLUDE_DIRS} SOURCES engines/pulsedevicefinder.cpp ) # Hack to add Clementine to the Unity system tray whitelist optional_source(LINUX SOURCES core/ubuntuunityhack.cpp HEADERS core/ubuntuunityhack.h ) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/version.h) qt4_wrap_cpp(MOC ${HEADERS}) qt4_wrap_ui(UIC ${UI}) qt4_add_resources(QRC ${RESOURCES}) add_pot(POT ${CMAKE_CURRENT_SOURCE_DIR}/translations/header ${CMAKE_CURRENT_SOURCE_DIR}/translations/translations.pot ${SOURCES} ${MOC} ${UIC} ${OTHER_SOURCES} ../data/oauthsuccess.html ) add_po(PO clementine_ LANGUAGES ${LANGUAGES} DIRECTORY translations ) add_library(clementine_lib STATIC ${SOURCES} ${MOC} ${UIC} ${QRC} ${POT} ${PO} ${OTHER_UIC_SOURCES} ) add_dependencies(clementine_lib pot) target_link_libraries(clementine_lib clementine-spotifyblob-messages libclementine-common libclementine-tagreader libclementine-remote ${SHA2_LIBRARIES} ${TAGLIB_LIBRARIES} ${MYGPOQT_LIBRARIES} ${CHROMAPRINT_LIBRARIES} ${ECHONEST_LIBRARIES} ${GOBJECT_LIBRARIES} ${GLIB_LIBRARIES} ${GIO_LIBRARIES} ${QJSON_LIBRARIES} ${QT_LIBRARIES} ${GSTREAMER_BASE_LIBRARIES} ${GSTREAMER_LIBRARIES} ${GSTREAMER_APP_LIBRARIES} ${GSTREAMER_TAG_LIBRARIES} ${QTSINGLEAPPLICATION_LIBRARIES} ${QTSINGLECOREAPPLICATION_LIBRARIES} ${QTIOCOMPRESSOR_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${SQLITE_LIBRARIES} z Qocoa ) if(HAVE_VK) target_link_libraries(clementine_lib ${VREEN_LIBRARIES}) endif(HAVE_VK) if(ENABLE_VISUALISATIONS) target_link_libraries(clementine_lib ${LIBPROJECTM_LIBRARIES}) endif(ENABLE_VISUALISATIONS) if(HAVE_LIBLASTFM) target_link_libraries(clementine_lib ${LASTFM_LIBRARIES}) endif(HAVE_LIBLASTFM) if(HAVE_LIBGPOD) target_link_libraries(clementine_lib ${LIBGPOD_LIBRARIES}) endif(HAVE_LIBGPOD) if(HAVE_GIO) target_link_libraries(clementine_lib ${GIO_LIBRARIES}) endif(HAVE_GIO) if(HAVE_AUDIOCD) target_link_libraries(clementine_lib ${CDIO_LIBRARIES}) endif(HAVE_AUDIOCD) if(HAVE_MOODBAR) target_link_libraries(clementine_lib gstmoodbar) endif() if(HAVE_LIBMTP) target_link_libraries(clementine_lib ${LIBMTP_LIBRARIES}) endif(HAVE_LIBMTP) if(HAVE_BREAKPAD) if (LINUX) target_link_libraries(clementine_lib breakpad) elseif (APPLE) add_dependencies(clementine_lib breakpad) target_link_libraries(clementine_lib "-F${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/google-breakpad/client/mac/build/Release" "-framework Breakpad") endif (LINUX) endif(HAVE_BREAKPAD) if(HAVE_SPOTIFY_DOWNLOADER) target_link_libraries(clementine_lib ${CRYPTOPP_LIBRARIES} ) link_directories(${CRYPTOPP_LIBRARY_DIRS}) endif(HAVE_SPOTIFY_DOWNLOADER) if(HAVE_LIBPULSE) target_link_libraries(clementine_lib ${LIBPULSE_LIBRARIES}) endif() if (APPLE) target_link_libraries(clementine_lib /System/Library/Frameworks/AppKit.framework /System/Library/Frameworks/Carbon.framework /System/Library/Frameworks/CoreAudio.framework /System/Library/Frameworks/DiskArbitration.framework /System/Library/Frameworks/Foundation.framework /System/Library/Frameworks/IOKit.framework /System/Library/Frameworks/ScriptingBridge.framework ) target_link_libraries(clementine_lib ${SPMEDIAKEYTAP_LIBRARIES}) if (HAVE_SPARKLE) include_directories(${SPARKLE}/Headers) target_link_libraries(clementine_lib ${SPARKLE}) endif (HAVE_SPARKLE) else (APPLE) target_link_libraries(clementine_lib ${QXT_LIBRARIES}) endif (APPLE) set(3RDPARTY_SQLITE_LIBRARY qsqlite) target_link_libraries(clementine_lib qsqlite) if (WIN32) target_link_libraries(clementine_lib ${ZLIB_LIBRARIES} ${QTSPARKLE_LIBRARIES} tinysvcmdns qtwin dsound ) endif (WIN32) if (UNIX AND NOT APPLE) # Hack: the Gold linker pays attention to the order that libraries are # specified on the link line. -lX11 and -ldl are provided earlier in the link # command but they're actually used by libraries that appear after them, so # they end up getting ignored. This appends them to the very end of the link # line, ensuring they're always used. find_package(X11) if (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") target_link_libraries(clementine_lib ${X11_X11_LIB}) else () target_link_libraries(clementine_lib ${X11_X11_LIB} ${CMAKE_DL_LIBS}) endif () endif () add_dependencies(clementine_lib qtsingleapplication) ############################################################################### set(EXECUTABLE_OUTPUT_PATH ..) # Show the console window in debug mode on Windows if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug" AND NOT ENABLE_WIN32_CONSOLE) set(CLEMENTINE-WIN32-FLAG WIN32) endif (NOT CMAKE_BUILD_TYPE STREQUAL "Debug" AND NOT ENABLE_WIN32_CONSOLE) # resource file for windows if(WIN32) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../dist/windows/windres.rc.in ${CMAKE_CURRENT_BINARY_DIR}/windres.rc) set(CLEMENTINE-WIN32-RESOURCES windres.rc) endif(WIN32) add_executable(clementine MACOSX_BUNDLE ${CLEMENTINE-WIN32-FLAG} ${CLEMENTINE-WIN32-RESOURCES} main.cpp ) if (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") target_link_libraries(clementine execinfo) endif (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") target_link_libraries(clementine clementine_lib ) # macdeploy.py relies on the blob being built first. if(HAVE_SPOTIFY_BLOB) add_dependencies(clementine clementine-spotifyblob) endif(HAVE_SPOTIFY_BLOB) add_dependencies(clementine clementine-tagreader) set_target_properties(clementine PROPERTIES MACOSX_BUNDLE_INFO_PLIST "../dist/Info.plist" ) if (APPLE) install(FILES ../dist/clementine.icns DESTINATION "${CMAKE_BINARY_DIR}/clementine.app/Contents/Resources") install(FILES ../dist/qt.conf DESTINATION "${CMAKE_BINARY_DIR}/clementine.app/Contents/Resources") install(FILES ../dist/sparkle_pub.pem DESTINATION "${CMAKE_BINARY_DIR}/clementine.app/Contents/Resources") install(FILES ../dist/cacert.pem DESTINATION "${CMAKE_BINARY_DIR}/clementine.app/Contents/Resources") install(DIRECTORY "${QT_QTGUI_LIBRARY_RELEASE}/Versions/Current/Resources/" DESTINATION "${CMAKE_BINARY_DIR}/clementine.app/Contents/Resources") if (HAVE_SPARKLE) install(DIRECTORY "${SPARKLE}/Versions/Current/Resources" DESTINATION "${CMAKE_BINARY_DIR}/clementine.app/Contents/Frameworks/Sparkle.framework") endif (HAVE_SPARKLE) foreach (plist_destination Versions/4/Resources Resources) install(FILES "${QT_QTCORE_LIBRARY_RELEASE}/Contents/Info.plist" DESTINATION "${CMAKE_BINARY_DIR}/clementine.app/Contents/Frameworks/QtCore.framework/${plist_destination}") install(FILES "${QT_QTGUI_LIBRARY_RELEASE}/Contents/Info.plist" DESTINATION "${CMAKE_BINARY_DIR}/clementine.app/Contents/Frameworks/QtGui.framework/${plist_destination}") install(FILES "${QT_QTNETWORK_LIBRARY_RELEASE}/Contents/Info.plist" DESTINATION "${CMAKE_BINARY_DIR}/clementine.app/Contents/Frameworks/QtNetwork.framework/${plist_destination}") install(FILES "${QT_QTOPENGL_LIBRARY_RELEASE}/Contents/Info.plist" DESTINATION "${CMAKE_BINARY_DIR}/clementine.app/Contents/Frameworks/QtOpenGL.framework/${plist_destination}") install(FILES "${QT_QTSQL_LIBRARY_RELEASE}/Contents/Info.plist" DESTINATION "${CMAKE_BINARY_DIR}/clementine.app/Contents/Frameworks/QtSql.framework/${plist_destination}") install(FILES "${QT_QTSVG_LIBRARY_RELEASE}/Contents/Info.plist" DESTINATION "${CMAKE_BINARY_DIR}/clementine.app/Contents/Frameworks/QtSvg.framework/${plist_destination}") install(FILES "${QT_QTXML_LIBRARY_RELEASE}/Contents/Info.plist" DESTINATION "${CMAKE_BINARY_DIR}/clementine.app/Contents/Frameworks/QtXml.framework/${plist_destination}") endforeach() if (HAVE_BREAKPAD) install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/google-breakpad/client/mac/build/Release/Breakpad.framework DESTINATION "${CMAKE_BINARY_DIR}/clementine.app/Contents/Frameworks" PATTERN "*.h" EXCLUDE PATTERN "Inspector" PERMISSIONS OWNER_EXECUTE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_READ WORLD_EXECUTE PATTERN "crash_report_sender" PERMISSIONS OWNER_EXECUTE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_READ WORLD_EXECUTE) endif (HAVE_BREAKPAD) add_custom_command(TARGET clementine POST_BUILD COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/../dist/macdeploy.py ${PROJECT_BINARY_DIR}/clementine.app -f WORKING_DIRECTORY ${PROJECT_BINARY_DIR} ) add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/clementine.breakpad COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/google-breakpad/tools/mac/dump_syms/build/Release/dump_syms -a i386 ${PROJECT_BINARY_DIR}/clementine.app/Contents/MacOS/clementine > ${PROJECT_BINARY_DIR}/clementine.breakpad DEPENDS clementine) add_custom_target(clementine-breakpad DEPENDS ${PROJECT_BINARY_DIR}/clementine.breakpad) if (APPLE_DEVELOPER_ID) add_custom_target( sign COMMAND ${PROJECT_SOURCE_DIR}/dist/codesign.py ${APPLE_DEVELOPER_ID} ${PROJECT_BINARY_DIR}/clementine.app DEPENDS clementine VERBATIM ) endif() add_custom_command( OUTPUT ${PROJECT_BINARY_DIR}/clementine-${CLEMENTINE_VERSION_SPARKLE}.dmg ${CMAKE_COMMAND} -E remove -f ${PROJECT_BINARY_DIR}/clementine-${CLEMENTINE_VERSION_SPARKLE}.dmg COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/../dist/create-dmg.sh ${PROJECT_BINARY_DIR}/clementine.app COMMAND ${CMAKE_COMMAND} -E rename ${PROJECT_BINARY_DIR}/clementine.dmg ${PROJECT_BINARY_DIR}/clementine-${CLEMENTINE_VERSION_SPARKLE}.dmg DEPENDS clementine WORKING_DIRECTORY ${PROJECT_BINARY_DIR} ) add_custom_target(dmg DEPENDS ${PROJECT_BINARY_DIR}/clementine-${CLEMENTINE_VERSION_SPARKLE}.dmg) else (APPLE) install(TARGETS clementine RUNTIME DESTINATION bin ) endif (APPLE) clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/000077500000000000000000000000001260417502300221665ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/COPYING000066400000000000000000000431131260417502300232230ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Steet, Fifth Floor, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/analyzer.cpp000066400000000000000000000022531260417502300245210ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "analyzer.h" #include "engines/enginebase.h" AnalyzerBase::AnalyzerBase(QWidget* parent) : QGLWidget(parent), engine_(nullptr) {} void AnalyzerBase::set_engine(Engine::Base* engine) { disconnect(engine_); engine_ = engine; if (engine_) { connect(engine_, SIGNAL(SpectrumAvailable(const QVector&)), SLOT(SpectrumAvailable(const QVector&))); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/analyzerbase.cpp000066400000000000000000000174541260417502300253650ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2003, Max Howell Copyright 2009, 2011-2012, David Sansome Copyright 2010, 2012, 2014, John Maguire Copyright 2014-2015, Mark Furneaux Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ /* Original Author: Max Howell 2003 */ #include "analyzerbase.h" #include #include #include #include #include #include #include "engines/enginebase.h" #include "core/arraysize.h" // INSTRUCTIONS Base2D // 1. do anything that depends on height() in init(), Base2D will call it before // you are shown // 2. otherwise you can use the constructor to initialise things // 3. reimplement analyze(), and paint to canvas(), Base2D will update the // widget when you return control to it // 4. if you want to manipulate the scope, reimplement transform() // 5. for convenience are pre-included // TODO(David Sansome): make an INSTRUCTIONS file // can't mod scope in analyze you have to use transform // TODO(John Maguire): for 2D use setErasePixmap Qt function insetead of // m_background // make the linker happy only for gcc < 4.0 #if !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 0)) && \ !defined(Q_OS_WIN32) template class Analyzer::Base; #endif static const int sBarkBands[] = { 100, 200, 300, 400, 510, 630, 770, 920, 1080, 1270, 1480, 1720, 2000, 2320, 2700, 3150, 3700, 4400, 5300, 6400, 7700, 9500, 12000, 15500}; static const int sBarkBandCount = arraysize(sBarkBands); Analyzer::Base::Base(QWidget* parent, uint scopeSize) : QWidget(parent), timeout_(40) // msec , fht_(new FHT(scopeSize)), engine_(nullptr), lastScope_(512), new_frame_(false), is_playing_(false), barkband_table_(QList()), prev_color_index_(0), bands_(0), psychedelic_enabled_(false) {} void Analyzer::Base::hideEvent(QHideEvent*) { timer_.stop(); } void Analyzer::Base::showEvent(QShowEvent*) { timer_.start(timeout(), this); } void Analyzer::Base::transform(Scope& scope) { // this is a standard transformation that should give // an FFT scope that has bands for pretty analyzers // NOTE resizing here is redundant as FHT routines only calculate FHT::size() // values // scope.resize( fht_->size() ); float* front = static_cast(&scope.front()); float* f = new float[fht_->size()]; fht_->copy(&f[0], front); fht_->logSpectrum(front, &f[0]); fht_->scale(front, 1.0 / 20); scope.resize(fht_->size() / 2); // second half of values are rubbish delete[] f; } void Analyzer::Base::paintEvent(QPaintEvent* e) { QPainter p(this); p.fillRect(e->rect(), palette().color(QPalette::Window)); switch (engine_->state()) { case Engine::Playing: { const Engine::Scope& thescope = engine_->scope(timeout_); int i = 0; // convert to mono here - our built in analyzers need mono, but the // engines provide interleaved pcm for (uint x = 0; static_cast(x) < fht_->size(); ++x) { lastScope_[x] = static_cast(thescope[i] + thescope[i + 1]) / (2 * (1 << 15)); i += 2; } is_playing_ = true; transform(lastScope_); analyze(p, lastScope_, new_frame_); // scope.resize( fht_->size() ); break; } case Engine::Paused: is_playing_ = false; analyze(p, lastScope_, new_frame_); break; default: is_playing_ = false; demo(p); } new_frame_ = false; } int Analyzer::Base::resizeExponent(int exp) { if (exp < 3) exp = 3; else if (exp > 9) exp = 9; if (exp != fht_->sizeExp()) { delete fht_; fht_ = new FHT(exp); } return exp; } int Analyzer::Base::resizeForBands(int bands) { int exp; if (bands <= 8) exp = 4; else if (bands <= 16) exp = 5; else if (bands <= 32) exp = 6; else if (bands <= 64) exp = 7; else if (bands <= 128) exp = 8; else exp = 9; resizeExponent(exp); return fht_->size() / 2; } void Analyzer::Base::demo(QPainter& p) { static int t = 201; // FIXME make static to namespace perhaps if (t > 999) t = 1; // 0 = wasted calculations if (t < 201) { Scope s(32); const double dt = static_cast(t) / 200; for (uint i = 0; i < s.size(); ++i) s[i] = dt * (sin(M_PI + (i * M_PI) / s.size()) + 1.0); analyze(p, s, new_frame_); } else { analyze(p, Scope(32, 0), new_frame_); } ++t; } void Analyzer::Base::psychedelicModeChanged(bool enabled) { psychedelic_enabled_ = enabled; } int Analyzer::Base::BandFrequency(int band) const { return ((kSampleRate / 2) * band + kSampleRate / 4) / bands_; } void Analyzer::Base::updateBandSize(const int scopeSize) { // prevent possible dbz in BandFrequency if (scopeSize == 0) { return; } bands_ = scopeSize; barkband_table_.clear(); barkband_table_.reserve(bands_ + 1); int barkband = 0; for (int i = 0; i < bands_ + 1; ++i) { if (barkband < sBarkBandCount - 1 && BandFrequency(i) >= sBarkBands[barkband]) { barkband++; } barkband_table_.append(barkband); } } QColor Analyzer::Base::getPsychedelicColor(const Scope& scope, const int ampFactor, const int bias) { if (scope.size() > barkband_table_.length()) { return palette().color(QPalette::Highlight); } // Calculate total magnitudes for different bark bands. double bands[sBarkBandCount]{}; for (int i = 0; i < barkband_table_.size(); ++i) { bands[barkband_table_[i]] += scope[i]; } // Now divide the bark bands into thirds and compute their total amplitudes. double rgb[3]{}; for (int i = 0; i < sBarkBandCount - 1; ++i) { rgb[(i * 3) / sBarkBandCount] += bands[i] * bands[i]; } for (int i = 0; i < 3; ++i) { // bias colours for a threshold around normally amplified audio rgb[i] = (int)((sqrt(rgb[i]) * ampFactor) + bias); if (rgb[i] > 255) { rgb[i] = 255; } } return QColor::fromRgb(rgb[0], rgb[1], rgb[2]); } void Analyzer::Base::polishEvent() { init(); // virtual } void Analyzer::interpolate(const Scope& inVec, Scope& outVec) { double pos = 0.0; const double step = static_cast(inVec.size()) / outVec.size(); for (uint i = 0; i < outVec.size(); ++i, pos += step) { const double error = pos - std::floor(pos); const uint64_t offset = static_cast(pos); uint64_t indexLeft = offset + 0; if (indexLeft >= inVec.size()) indexLeft = inVec.size() - 1; uint64_t indexRight = offset + 1; if (indexRight >= inVec.size()) indexRight = inVec.size() - 1; outVec[i] = inVec[indexLeft] * (1.0 - error) + inVec[indexRight] * error; } } void Analyzer::initSin(Scope& v, const uint size) { double step = (M_PI * 2) / size; double radian = 0; for (uint i = 0; i < size; i++) { v.push_back(sin(radian)); radian += step; } } void Analyzer::Base::timerEvent(QTimerEvent* e) { QWidget::timerEvent(e); if (e->timerId() != timer_.timerId()) return; new_frame_ = true; update(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/analyzerbase.h000066400000000000000000000060641260417502300250250ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2004, Max Howell Copyright 2009-2010, David Sansome Copyright 2010, 2014, John Maguire Copyright 2011, Arnaud Bienner Copyright 2014-2015, Mark Furneaux Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ /* Original Author: Max Howell 2004 */ #ifndef ANALYZERS_ANALYZERBASE_H_ #define ANALYZERS_ANALYZERBASE_H_ #ifdef __FreeBSD__ #include #endif #include "fht.h" #include "engines/engine_fwd.h" #include #include #include #include #include #ifdef Q_WS_MACX #include #include #else #include #include #endif class QEvent; class QPaintEvent; class QResizeEvent; namespace Analyzer { typedef std::vector Scope; class Base : public QWidget { Q_OBJECT public: ~Base() { delete fht_; } uint timeout() const { return timeout_; } void set_engine(EngineBase* engine) { engine_ = engine; } void changeTimeout(uint newTimeout) { timeout_ = newTimeout; if (timer_.isActive()) { timer_.stop(); timer_.start(timeout_, this); } } virtual void framerateChanged() {} virtual void psychedelicModeChanged(bool); protected: explicit Base(QWidget*, uint scopeSize = 7); void hideEvent(QHideEvent*); void showEvent(QShowEvent*); void paintEvent(QPaintEvent*); void timerEvent(QTimerEvent*); void polishEvent(); int resizeExponent(int); int resizeForBands(int); int BandFrequency(int) const; void updateBandSize(const int); QColor getPsychedelicColor(const Scope&, const int, const int); virtual void init() {} virtual void transform(Scope&); virtual void analyze(QPainter& p, const Scope&, bool new_frame) = 0; virtual void demo(QPainter& p); protected: static const int kSampleRate = 44100; // we shouldn't need to care about ultrasonics QBasicTimer timer_; uint timeout_; FHT* fht_; EngineBase* engine_; Scope lastScope_; bool new_frame_; bool is_playing_; QList barkband_table_; double prev_colors_[10][3]; int prev_color_index_; int bands_; bool psychedelic_enabled_; }; void interpolate(const Scope&, Scope&); void initSin(Scope&, const uint = 6000); } // END namespace Analyzer #endif // ANALYZERS_ANALYZERBASE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/analyzercontainer.cpp000066400000000000000000000206301260417502300264230ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, David Sansome Copyright 2010, 2014, John Maguire Copyright 2011-2012, Arnaud Bienner Copyright 2013, Vasily Fomin Copyright 2014-2015, Mark Furneaux Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "analyzercontainer.h" #include "baranalyzer.h" #include "blockanalyzer.h" #include "boomanalyzer.h" #include "nyancatanalyzer.h" #include "rainbowdashanalyzer.h" #include "sonogram.h" #include "turbine.h" #include "core/logging.h" #include #include #include #include #include const char* AnalyzerContainer::kSettingsGroup = "Analyzer"; const char* AnalyzerContainer::kSettingsFramerate = "framerate"; // Framerates const int AnalyzerContainer::kLowFramerate = 20; const int AnalyzerContainer::kMediumFramerate = 25; const int AnalyzerContainer::kHighFramerate = 30; const int AnalyzerContainer::kSuperHighFramerate = 60; AnalyzerContainer::AnalyzerContainer(QWidget* parent) : QWidget(parent), current_framerate_(kMediumFramerate), context_menu_(new QMenu(this)), context_menu_framerate_(new QMenu(tr("Framerate"), this)), group_(new QActionGroup(this)), group_framerate_(new QActionGroup(this)), mapper_(new QSignalMapper(this)), mapper_framerate_(new QSignalMapper(this)), visualisation_action_(nullptr), double_click_timer_(new QTimer(this)), ignore_next_click_(false), psychedelic_colors_on_(false), current_analyzer_(nullptr), engine_(nullptr) { QHBoxLayout* layout = new QHBoxLayout(this); setLayout(layout); layout->setContentsMargins(0, 0, 0, 0); // Init framerate sub-menu AddFramerate(tr("Low (%1 fps)").arg(kLowFramerate), kLowFramerate); AddFramerate(tr("Medium (%1 fps)").arg(kMediumFramerate), kMediumFramerate); AddFramerate(tr("High (%1 fps)").arg(kHighFramerate), kHighFramerate); AddFramerate(tr("Super high (%1 fps)").arg(kSuperHighFramerate), kSuperHighFramerate); connect(mapper_framerate_, SIGNAL(mapped(int)), SLOT(ChangeFramerate(int))); context_menu_->addMenu(context_menu_framerate_); context_menu_->addSeparator(); AddAnalyzerType(); AddAnalyzerType(); AddAnalyzerType(); AddAnalyzerType(); AddAnalyzerType(); AddAnalyzerType(); AddAnalyzerType(); connect(mapper_, SIGNAL(mapped(int)), SLOT(ChangeAnalyzer(int))); disable_action_ = context_menu_->addAction(tr("No analyzer"), this, SLOT(DisableAnalyzer())); disable_action_->setCheckable(true); group_->addAction(disable_action_); context_menu_->addSeparator(); psychedelic_enable_ = context_menu_->addAction( tr("Use Psychedelic Colors"), this, SLOT(TogglePsychedelicColors())); psychedelic_enable_->setCheckable(true); context_menu_->addSeparator(); // Visualisation action gets added in SetActions double_click_timer_->setSingleShot(true); double_click_timer_->setInterval(250); connect(double_click_timer_, SIGNAL(timeout()), SLOT(ShowPopupMenu())); Load(); } void AnalyzerContainer::SetActions(QAction* visualisation) { visualisation_action_ = visualisation; context_menu_->addAction(visualisation_action_); } void AnalyzerContainer::mouseReleaseEvent(QMouseEvent* e) { if (e->button() == Qt::LeftButton) { if (ignore_next_click_) { ignore_next_click_ = false; } else { // Might be the first click in a double click, so wait a while before // actually doing anything double_click_timer_->start(); last_click_pos_ = e->globalPos(); } } else if (e->button() == Qt::RightButton) { context_menu_->popup(e->globalPos()); } } void AnalyzerContainer::ShowPopupMenu() { context_menu_->popup(last_click_pos_); } void AnalyzerContainer::mouseDoubleClickEvent(QMouseEvent*) { double_click_timer_->stop(); ignore_next_click_ = true; if (visualisation_action_) visualisation_action_->trigger(); } void AnalyzerContainer::wheelEvent(QWheelEvent* e) { emit WheelEvent(e->delta()); } void AnalyzerContainer::SetEngine(EngineBase* engine) { if (current_analyzer_) current_analyzer_->set_engine(engine); engine_ = engine; } void AnalyzerContainer::DisableAnalyzer() { delete current_analyzer_; current_analyzer_ = nullptr; Save(); } void AnalyzerContainer::TogglePsychedelicColors() { psychedelic_colors_on_ = !psychedelic_colors_on_; if (current_analyzer_) { current_analyzer_->psychedelicModeChanged(psychedelic_colors_on_); } SavePsychedelic(); } void AnalyzerContainer::ChangeAnalyzer(int id) { QObject* instance = analyzer_types_[id]->newInstance(Q_ARG(QWidget*, this)); if (!instance) { qLog(Warning) << "Couldn't intialise a new" << analyzer_types_[id]->className(); return; } delete current_analyzer_; current_analyzer_ = qobject_cast(instance); current_analyzer_->set_engine(engine_); // Even if it is not supposed to happen, I don't want to get a dbz error current_framerate_ = current_framerate_ == 0 ? kMediumFramerate : current_framerate_; current_analyzer_->changeTimeout(1000 / current_framerate_); current_analyzer_->psychedelicModeChanged(psychedelic_colors_on_); layout()->addWidget(current_analyzer_); Save(); } void AnalyzerContainer::ChangeFramerate(int new_framerate) { if (current_analyzer_) { // Even if it is not supposed to happen, I don't want to get a dbz error new_framerate = new_framerate == 0 ? kMediumFramerate : new_framerate; current_analyzer_->changeTimeout(1000 / new_framerate); // notify the current analyzer that the framerate has changed current_analyzer_->framerateChanged(); } SaveFramerate(new_framerate); } void AnalyzerContainer::Load() { QSettings s; s.beginGroup(kSettingsGroup); // Colours psychedelic_colors_on_ = s.value("psychedelic", false).toBool(); psychedelic_enable_->setChecked(psychedelic_colors_on_); // Analyzer QString type = s.value("type", "BlockAnalyzer").toString(); if (type.isEmpty()) { DisableAnalyzer(); disable_action_->setChecked(true); } else { for (int i = 0; i < analyzer_types_.count(); ++i) { if (type == analyzer_types_[i]->className()) { ChangeAnalyzer(i); actions_[i]->setChecked(true); break; } } } // Framerate current_framerate_ = s.value(kSettingsFramerate, kMediumFramerate).toInt(); for (int i = 0; i < framerate_list_.count(); ++i) { if (current_framerate_ == framerate_list_[i]) { ChangeFramerate(current_framerate_); group_framerate_->actions()[i]->setChecked(true); break; } } } void AnalyzerContainer::SaveFramerate(int framerate) { // For now, framerate is common for all analyzers. Maybe each analyzer should // have its own framerate? current_framerate_ = framerate; QSettings s; s.beginGroup(kSettingsGroup); s.setValue(kSettingsFramerate, current_framerate_); } void AnalyzerContainer::Save() { QSettings s; s.beginGroup(kSettingsGroup); s.setValue("type", current_analyzer_ ? current_analyzer_->metaObject()->className() : QVariant()); } void AnalyzerContainer::SavePsychedelic() { QSettings s; s.beginGroup(kSettingsGroup); s.setValue("psychedelic", psychedelic_colors_on_); } void AnalyzerContainer::AddFramerate(const QString& name, int framerate) { QAction* action = context_menu_framerate_->addAction(name, mapper_framerate_, SLOT(map())); mapper_framerate_->setMapping(action, framerate); group_framerate_->addAction(action); framerate_list_ << framerate; action->setCheckable(true); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/analyzercontainer.h000066400000000000000000000062031260417502300260700ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Copyright 2010, 2014, John Maguire Copyright 2011-2012, Arnaud Bienner Copyright 2013, Vasily Fomin Copyright 2014, Krzysztof Sobiecki Copyright 2015, Mark Furneaux Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ANALYZERS_ANALYZERCONTAINER_H_ #define ANALYZERS_ANALYZERCONTAINER_H_ #include #include #include #include "analyzerbase.h" #include "engines/engine_fwd.h" class AnalyzerContainer : public QWidget { Q_OBJECT public: explicit AnalyzerContainer(QWidget* parent); void SetEngine(EngineBase* engine); void SetActions(QAction* visualisation); static const char* kSettingsGroup; static const char* kSettingsFramerate; signals: void WheelEvent(int delta); protected: void mouseReleaseEvent(QMouseEvent*); void mouseDoubleClickEvent(QMouseEvent*); void wheelEvent(QWheelEvent* e); private slots: void ChangeAnalyzer(int id); void ChangeFramerate(int new_framerate); void DisableAnalyzer(); void ShowPopupMenu(); void TogglePsychedelicColors(); private: static const int kLowFramerate; static const int kMediumFramerate; static const int kHighFramerate; static const int kSuperHighFramerate; void Load(); void Save(); void SaveFramerate(int framerate); void SavePsychedelic(); template void AddAnalyzerType(); void AddFramerate(const QString& name, int framerate); private: int current_framerate_; // fps QMenu* context_menu_; QMenu* context_menu_framerate_; QActionGroup* group_; QActionGroup* group_framerate_; QSignalMapper* mapper_; QSignalMapper* mapper_framerate_; QList analyzer_types_; QList framerate_list_; QList actions_; QAction* disable_action_; QAction* psychedelic_enable_; QAction* visualisation_action_; QTimer* double_click_timer_; QPoint last_click_pos_; bool ignore_next_click_; bool psychedelic_colors_on_; Analyzer::Base* current_analyzer_; EngineBase* engine_; }; template void AnalyzerContainer::AddAnalyzerType() { int id = analyzer_types_.count(); analyzer_types_ << &T::staticMetaObject; QAction* action = context_menu_->addAction(tr(T::kName), mapper_, SLOT(map())); group_->addAction(action); mapper_->setMapping(action, id); action->setCheckable(true); actions_ << action; } #endif // ANALYZERS_ANALYZERCONTAINER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/baranalyzer.cpp000066400000000000000000000160521260417502300252100ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2003, Mark Kretschmann Copyright 2009-2010, David Sansome Copyright 2014, Alibek Omarov Copyright 2014-2015, Mark Furneaux Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ /* Original Author: Mark Kretschmann 2003 */ #include "baranalyzer.h" #include #include #include using Analyzer::Scope; const char* BarAnalyzer::kName = QT_TRANSLATE_NOOP("AnalyzerContainer", "Bar analyzer"); BarAnalyzer::BarAnalyzer(QWidget* parent) : Analyzer::Base(parent, 8) { // roof pixmaps don't depend on size() so we do in the ctor bg_ = parent->palette().color(QPalette::Background); QColor fg(parent->palette().color(QPalette::Highlight).lighter(150)); double dr = static_cast(bg_.red() - fg.red()) / (kNumRoofs - 1); // -1 because we start loop below at 0 double dg = static_cast(bg_.green() - fg.green()) / (kNumRoofs - 1); double db = static_cast(bg_.blue() - fg.blue()) / (kNumRoofs - 1); for (uint i = 0; i < kNumRoofs; ++i) { pixRoof_[i] = QPixmap(kColumnWidth, 1); pixRoof_[i].fill(QColor(fg.red() + static_cast(dr * i), fg.green() + static_cast(dg * i), fg.blue() + static_cast(db * i))); } } void BarAnalyzer::resizeEvent(QResizeEvent* e) { init(); } // METHODS ===================================================== void BarAnalyzer::init() { const double MAX_AMPLITUDE = 1.0; const double F = static_cast(height() - 2) / (log10(255) * MAX_AMPLITUDE); band_count_ = width() / 5; max_down_ = static_cast(0 - (qMax(1, height() / 50))); max_up_ = static_cast(qMax(1, height() / 25)); barVector_.resize(band_count_, 0); roofVector_.resize(band_count_, height() - 5); roofVelocityVector_.resize(band_count_, kRoofVelocityReductionFactor); roofMem_.resize(band_count_); scope_.resize(band_count_); // generate a list of values that express amplitudes in range 0-MAX_AMP as // ints from 0-height() on log scale for (uint x = 0; x < 256; ++x) { lvlMapper_[x] = static_cast(F * log10(x + 1)); } pixBarGradient_ = QPixmap(height() * kColumnWidth, height()); pixCompose_ = QPixmap(size()); canvas_ = QPixmap(size()); canvas_.fill(palette().color(QPalette::Background)); updateBandSize(band_count_); colorChanged(); setMinimumSize(QSize(band_count_ * kColumnWidth, 10)); } void BarAnalyzer::colorChanged() { if (pixBarGradient_.isNull()) { return; } QPainter p(&pixBarGradient_); QColor rgb; if (psychedelic_enabled_) { rgb = getPsychedelicColor(scope_, 50, 100); } else { rgb = palette().color(QPalette::Highlight); } for (int x = 0, r = rgb.red(), g = rgb.green(), b = rgb.blue(), r2 = 255 - r; x < height(); ++x) { for (int y = x; y > 0; --y) { const double fraction = static_cast(y) / height(); // p.setPen( QColor( r + (int)(r2 * fraction), g, b - (int)(255 * // fraction) ) ); p.setPen(QColor(r + static_cast(r2 * fraction), g, b)); p.drawLine(x * kColumnWidth, height() - y, (x + 1) * kColumnWidth, height() - y); } } } void BarAnalyzer::psychedelicModeChanged(bool enabled) { psychedelic_enabled_ = enabled; // reset colours back to normal colorChanged(); } void BarAnalyzer::analyze(QPainter& p, const Scope& s, bool new_frame) { if (!new_frame) { p.drawPixmap(0, 0, canvas_); return; } // Analyzer::interpolate( s, m_bands ); Analyzer::interpolate(s, scope_); QPainter canvas_painter(&canvas_); // update the graphics with the new colour if (psychedelic_enabled_) { colorChanged(); } canvas_.fill(palette().color(QPalette::Background)); for (uint i = 0, x = 0, y2; i < scope_.size(); ++i, x += kColumnWidth + 1) { // assign pre[log10]'d value y2 = static_cast( scope_[i] * 256); // 256 will be optimised to a bitshift //no, it's a float y2 = lvlMapper_[(y2 > 255) ? 255 : y2]; // lvlMapper is array of ints with // values 0 to height() int change = y2 - barVector_[i]; // using the best of Markey's, piggz and Max's ideas on the way to shift the // bars // we have the following: // 1. don't adjust shift when doing small up movements // 2. shift large upwards with a bias towards last value // 3. fall downwards at a constant pace /*if ( change > max_up_ ) //anything too much greater than 2 gives "jitter" //add some dynamics - makes the value slightly closer to what it was last time y2 = ( barVector_[i] + max_up_ ); //y2 = ( barVector_[i] * 2 + y2 ) / 3; else*/ if (change < max_down_) y2 = barVector_[i] + max_down_; if (static_cast(y2) > roofVector_[i]) { roofVector_[i] = static_cast(y2); roofVelocityVector_[i] = 1; } // remember where we are barVector_[i] = y2; if (roofMem_[i].size() > kNumRoofs) roofMem_[i].erase(roofMem_[i].begin()); // blt last n roofs, a.k.a motion blur for (uint c = 0; c < roofMem_[i].size(); ++c) // bitBlt( m_pComposePixmap, x, roofMem_[i]->at( c ), m_roofPixmaps[ c ] // ); // bitBlt( canvas(), x, roofMem_[i][c], &pixRoof_[ kNumRoofs - 1 - c ] // ); canvas_painter.drawPixmap(x, roofMem_[i][c], pixRoof_[kNumRoofs - 1 - c]); // blt the bar canvas_painter.drawPixmap(x, height() - y2, *gradient(), y2 * kColumnWidth, height() - y2, kColumnWidth, y2); /*bitBlt( canvas(), x, height() - y2, gradient(), y2 * kColumnWidth, height() - y2, kColumnWidth, y2, Qt::CopyROP );*/ roofMem_[i].push_back(height() - roofVector_[i] - 2); // set roof parameters for the NEXT draw if (roofVelocityVector_[i] != 0) { if (roofVelocityVector_[i] > 32) // no reason to do == 32 roofVector_[i] -= (roofVelocityVector_[i] - 32) / 20; // trivial calculation if (roofVector_[i] < 0) { roofVector_[i] = 0; // not strictly necessary roofVelocityVector_[i] = 0; } else { ++roofVelocityVector_[i]; } } } p.drawPixmap(0, 0, canvas_); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/baranalyzer.h000066400000000000000000000051501260417502300246520ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2003-2005, Max Howell Copyright 2005, Mark Kretschmann Copyright 2009-2010, David Sansome Copyright 2014-2015, Mark Furneaux Copyright 2014, Krzysztof A. Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ /* Original Author: Max Howell 2003-2005 * Original Author: Mark Kretschmann 2005 */ #ifndef ANALYZERS_BARANALYZER_H_ #define ANALYZERS_BARANALYZER_H_ #include "analyzerbase.h" typedef std::vector aroofMemVec; class BarAnalyzer : public Analyzer::Base { Q_OBJECT public: Q_INVOKABLE BarAnalyzer(QWidget*); void init(); virtual void analyze(QPainter& p, const Analyzer::Scope&, bool new_frame); virtual void psychedelicModeChanged(bool); /** * Resizes the widget to a new geometry according to @p e * @param e The resize-event */ void resizeEvent(QResizeEvent* e); void colorChanged(); uint band_count_; int max_down_; int max_up_; static const uint kRoofHoldTime = 48; static const int kRoofVelocityReductionFactor = 32; static const uint kNumRoofs = 16; static const uint kColumnWidth = 4; static const char* kName; protected: QPixmap pixRoof_[kNumRoofs]; // vector roofMem_[band_count_]; // Scope m_bands; //copy of the Scope to prevent creating/destroying a Scope // every iteration uint lvlMapper_[256]; std::vector roofMem_; std::vector barVector_; // positions of bars std::vector roofVector_; // positions of roofs std::vector roofVelocityVector_; // speed that roofs falls const QPixmap* gradient() const { return &pixBarGradient_; } private: QPixmap pixBarGradient_; QPixmap pixCompose_; QPixmap canvas_; Analyzer::Scope scope_; // so we don't create a vector every frame QColor bg_; }; #endif // ANALYZERS_BARANALYZER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/blockanalyzer.cpp000066400000000000000000000307711260417502300255420ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2003-2005, Max Howell Copyright 2005, Mark Kretschmann Copyright 2009-2010, David Sansome Copyright 2010, 2014, John Maguire Copyright 2014-2015, Mark Furneaux Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ /* Original Author: Max Howell 2003-2005 * Original Author: Mark Kretschmann 2005 */ #include "blockanalyzer.h" #include #include #include #include #include const uint BlockAnalyzer::kHeight = 2; const uint BlockAnalyzer::kWidth = 4; const uint BlockAnalyzer::kMinRows = 3; // arbituary const uint BlockAnalyzer::kMinColumns = 32; // arbituary const uint BlockAnalyzer::kMaxColumns = 256; // must be 2**n const uint BlockAnalyzer::kFadeSize = 90; const char* BlockAnalyzer::kName = QT_TRANSLATE_NOOP("AnalyzerContainer", "Block analyzer"); BlockAnalyzer::BlockAnalyzer(QWidget* parent) : Analyzer::Base(parent, 9), columns_(0), rows_(0), y_(0), barPixmap_(1, 1), topBarPixmap_(kWidth, kHeight), scope_(kMinColumns), store_(1 << 8, 0), fade_bars_(kFadeSize), fade_pos_(1 << 8, 50), fade_intensity_(1 << 8, 32) { setMinimumSize(kMinColumns * (kWidth + 1) - 1, kMinRows * (kHeight + 1) - 1); // -1 is padding, no drawing takes place there setMaximumWidth(kMaxColumns * (kWidth + 1) - 1); // mxcl says null pixmaps cause crashes, so let's play it safe for (uint i = 0; i < kFadeSize; ++i) fade_bars_[i] = QPixmap(1, 1); } BlockAnalyzer::~BlockAnalyzer() {} void BlockAnalyzer::resizeEvent(QResizeEvent* e) { QWidget::resizeEvent(e); background_ = QPixmap(size()); canvas_ = QPixmap(size()); const uint oldRows = rows_; // all is explained in analyze().. // +1 to counter -1 in maxSizes, trust me we need this! columns_ = qMin( static_cast(static_cast(width() + 1) / (kWidth + 1)) + 1, kMaxColumns); rows_ = static_cast(static_cast(height() + 1) / (kHeight + 1)); // this is the y-offset for drawing from the top of the widget y_ = (height() - (rows_ * (kHeight + 1)) + 2) / 2; scope_.resize(columns_); if (rows_ != oldRows) { barPixmap_ = QPixmap(kWidth, rows_ * (kHeight + 1)); for (uint i = 0; i < kFadeSize; ++i) fade_bars_[i] = QPixmap(kWidth, rows_ * (kHeight + 1)); yscale_.resize(rows_ + 1); const uint PRE = 1, PRO = 1; // PRE and PRO allow us to restrict the range somewhat for (uint z = 0; z < rows_; ++z) yscale_[z] = 1 - (log10(PRE + z) / log10(PRE + rows_ + PRO)); yscale_[rows_] = 0; determineStep(); paletteChange(palette()); } updateBandSize(columns_); drawBackground(); } void BlockAnalyzer::determineStep() { // falltime is dependent on rowcount due to our digital resolution (ie we have // boxes/blocks of pixels) // I calculated the value 30 based on some trial and error // the fall time of 30 is too slow on framerates above 50fps const double fallTime = timeout() < 20 ? 20 * rows_ : 30 * rows_; step_ = static_cast(rows_ * timeout()) / fallTime; } void BlockAnalyzer::framerateChanged() { // virtual determineStep(); } void BlockAnalyzer::transform(Analyzer::Scope& s) { for (uint x = 0; x < s.size(); ++x) s[x] *= 2; float* front = static_cast(&s.front()); fht_->spectrum(front); fht_->scale(front, 1.0 / 20); // the second half is pretty dull, so only show it if the user has a large // analyzer // by setting to scope_.size() if large we prevent interpolation of large // analyzers, this is good! s.resize(scope_.size() <= kMaxColumns / 2 ? kMaxColumns / 2 : scope_.size()); } void BlockAnalyzer::analyze(QPainter& p, const Analyzer::Scope& s, bool new_frame) { // y = 2 3 2 1 0 2 // . . . . # . // . . . # # . // # . # # # # // # # # # # # // // visual aid for how this analyzer works. // y represents the number of blanks // y starts from the top and increases in units of blocks // yscale_ looks similar to: { 0.7, 0.5, 0.25, 0.15, 0.1, 0 } // if it contains 6 elements there are 5 rows in the analyzer if (!new_frame) { p.drawPixmap(0, 0, canvas_); return; } QPainter canvas_painter(&canvas_); Analyzer::interpolate(s, scope_); // update the graphics with the new colour if (psychedelic_enabled_) { paletteChange(QPalette()); } // Paint the background canvas_painter.drawPixmap(0, 0, background_); for (uint y, x = 0; x < scope_.size(); ++x) { // determine y for (y = 0; scope_[x] < yscale_[y]; ++y) continue; // this is opposite to what you'd think, higher than y // means the bar is lower than y (physically) if (static_cast(y) > store_[x]) y = static_cast(store_[x] += step_); else store_[x] = y; // if y is lower than fade_pos_, then the bar has exceeded the kHeight of // the fadeout // if the fadeout is quite faded now, then display the new one if (y <= fade_pos_[x] /*|| fade_intensity_[x] < kFadeSize / 3*/) { fade_pos_[x] = y; fade_intensity_[x] = kFadeSize; } if (fade_intensity_[x] > 0) { const uint offset = --fade_intensity_[x]; const uint y = y_ + (fade_pos_[x] * (kHeight + 1)); canvas_painter.drawPixmap(x * (kWidth + 1), y, fade_bars_[offset], 0, 0, kWidth, height() - y); } if (fade_intensity_[x] == 0) fade_pos_[x] = rows_; // REMEMBER: y is a number from 0 to rows_, 0 means all blocks are glowing, // rows_ means none are canvas_painter.drawPixmap(x * (kWidth + 1), y * (kHeight + 1) + y_, *bar(), 0, y * (kHeight + 1), bar()->width(), bar()->height()); } for (uint x = 0; x < store_.size(); ++x) canvas_painter.drawPixmap(x * (kWidth + 1), static_cast(store_[x]) * (kHeight + 1) + y_, topBarPixmap_); p.drawPixmap(0, 0, canvas_); } static inline void adjustToLimits(int& b, int& f, uint& amount) { // with a range of 0-255 and maximum adjustment of amount, // maximise the difference between f and b if (b < f) { if (b > 255 - f) { amount -= f; f = 0; } else { amount -= (255 - f); f = 255; } } else { if (f > 255 - b) { amount -= f; f = 0; } else { amount -= (255 - f); f = 255; } } } void BlockAnalyzer::psychedelicModeChanged(bool enabled) { psychedelic_enabled_ = enabled; // reset colours back to normal paletteChange(QPalette()); } /** * Clever contrast function * * It will try to adjust the foreground color such that it contrasts well with *the background * It won't modify the hue of fg unless absolutely necessary * @return the adjusted form of fg */ QColor ensureContrast(const QColor& bg, const QColor& fg, uint _amount = 150) { class OutputOnExit { public: explicit OutputOnExit(const QColor& color) : c(color) {} ~OutputOnExit() { int h, s, v; c.getHsv(&h, &s, &v); } private: const QColor& c; }; OutputOnExit allocateOnTheStack(fg); int bh, bs, bv; int fh, fs, fv; bg.getHsv(&bh, &bs, &bv); fg.getHsv(&fh, &fs, &fv); int dv = abs(bv - fv); // value is the best measure of contrast // if there is enough difference in value already, return fg unchanged if (dv > static_cast(_amount)) return fg; int ds = abs(bs - fs); // saturation is good enough too. But not as good. TODO adapt this a little if (ds > static_cast(_amount)) return fg; int dh = abs(bh - fh); if (dh > 120) { // a third of the colour wheel automatically guarentees contrast // but only if the values are high enough and saturations significant enough // to allow the colours to be visible and not be shades of grey or black // check the saturation for the two colours is sufficient that hue alone can // provide sufficient contrast if (ds > static_cast(_amount) / 2 && (bs > 125 && fs > 125)) return fg; else if (dv > static_cast(_amount) / 2 && (bv > 125 && fv > 125)) return fg; } if (fs < 50 && ds < 40) { // low saturation on a low saturation is sad const int tmp = 50 - fs; fs = 50; if (static_cast(_amount) > tmp) _amount -= tmp; else _amount = 0; } // test that there is available value to honor our contrast requirement if (255 - dv < static_cast(_amount)) { // we have to modify the value and saturation of fg // adjustToLimits( bv, fv, amount ); // see if we need to adjust the saturation if (static_cast(_amount) > 0) adjustToLimits(bs, fs, _amount); // see if we need to adjust the hue if (static_cast(_amount) > 0) fh += static_cast(_amount); // cycles around; return QColor::fromHsv(fh, fs, fv); } if (fv > bv && bv > static_cast(_amount)) return QColor::fromHsv(fh, fs, bv - static_cast(_amount)); if (fv < bv && fv > static_cast(_amount)) return QColor::fromHsv(fh, fs, fv - static_cast(_amount)); if (fv > bv && (255 - fv > static_cast(_amount))) return QColor::fromHsv(fh, fs, fv + static_cast(_amount)); if (fv < bv && (255 - bv > static_cast(_amount))) return QColor::fromHsv(fh, fs, bv + static_cast(_amount)); return Qt::blue; } void BlockAnalyzer::paletteChange(const QPalette&) { const QColor bg = palette().color(QPalette::Background); QColor fg; if (psychedelic_enabled_) { fg = getPsychedelicColor(scope_, 10, 75); } else { fg = ensureContrast(bg, palette().color(QPalette::Highlight)); } topBarPixmap_.fill(fg); const double dr = 15 * static_cast(bg.red() - fg.red()) / (rows_ * 16); const double dg = 15 * static_cast(bg.green() - fg.green()) / (rows_ * 16); const double db = 15 * static_cast(bg.blue() - fg.blue()) / (rows_ * 16); const int r = fg.red(), g = fg.green(), b = fg.blue(); bar()->fill(bg); QPainter p(bar()); for (int y = 0; static_cast(y) < rows_; ++y) // graduate the fg color p.fillRect( 0, y * (kHeight + 1), kWidth, kHeight, QColor(r + static_cast(dr * y), g + static_cast(dg * y), b + static_cast(db * y))); { const QColor bg = palette().color(QPalette::Background).dark(112); // make a complimentary fadebar colour // TODO(John Maguire): dark is not always correct, dumbo! int h, s, v; palette().color(QPalette::Background).dark(150).getHsv(&h, &s, &v); const QColor fg(QColor::fromHsv(h + 120, s, v)); const double dr = fg.red() - bg.red(); const double dg = fg.green() - bg.green(); const double db = fg.blue() - bg.blue(); const int r = bg.red(), g = bg.green(), b = bg.blue(); // Precalculate all fade-bar pixmaps for (uint y = 0; y < kFadeSize; ++y) { fade_bars_[y].fill(palette().color(QPalette::Background)); QPainter f(&fade_bars_[y]); for (int z = 0; static_cast(z) < rows_; ++z) { const double Y = 1.0 - (log10(kFadeSize - y) / log10(kFadeSize)); f.fillRect( 0, z * (kHeight + 1), kWidth, kHeight, QColor(r + static_cast(dr * Y), g + static_cast(dg * Y), b + static_cast(db * Y))); } } } drawBackground(); } void BlockAnalyzer::drawBackground() { const QColor bg = palette().color(QPalette::Background); const QColor bgdark = bg.dark(112); background_.fill(bg); QPainter p(&background_); if (p.paintEngine() == 0) { return; } for (int x = 0; (uint)x < columns_; ++x) for (int y = 0; (uint)y < rows_; ++y) p.fillRect(x * (kWidth + 1), y * (kHeight + 1) + y_, kWidth, kHeight, bgdark); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/blockanalyzer.h000066400000000000000000000050331260417502300252000ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2003-2005, Max Howell Copyright 2009-2010, David Sansome Copyright 2010, 2014, John Maguire Copyright 2014-2015, Mark Furneaux Copyright 2014, Krzysztof A. Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ /* Original Author: Max Howell 2003-2005 */ #ifndef ANALYZERS_BLOCKANALYZER_H_ #define ANALYZERS_BLOCKANALYZER_H_ #include "analyzerbase.h" #include class QResizeEvent; class QMouseEvent; class QPalette; class BlockAnalyzer : public Analyzer::Base { Q_OBJECT public: Q_INVOKABLE BlockAnalyzer(QWidget*); ~BlockAnalyzer(); static const uint kHeight; static const uint kWidth; static const uint kMinRows; static const uint kMinColumns; static const uint kMaxColumns; static const uint kFadeSize; static const char* kName; protected: virtual void transform(Analyzer::Scope&); virtual void analyze(QPainter& p, const Analyzer::Scope&, bool new_frame); virtual void resizeEvent(QResizeEvent*); virtual void paletteChange(const QPalette&); virtual void framerateChanged(); virtual void psychedelicModeChanged(bool); void drawBackground(); void determineStep(); private: QPixmap* bar() { return &barPixmap_; } uint columns_, rows_; // number of rows and columns of blocks uint y_; // y-offset from top of widget QPixmap barPixmap_; QPixmap topBarPixmap_; QPixmap background_; QPixmap canvas_; Analyzer::Scope scope_; // so we don't create a vector every frame std::vector store_; // current bar kHeights std::vector yscale_; // FIXME why can't I namespace these? c++ issue? std::vector fade_bars_; std::vector fade_pos_; std::vector fade_intensity_; float step_; // rows to fall per frame }; #endif // ANALYZERS_BLOCKANALYZER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/boomanalyzer.cpp000066400000000000000000000126001260417502300253730ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2004, Max Howell Copyright 2009-2010, David Sansome Copyright 2010, 2014, John Maguire Copyright 2014-2015, Mark Furneaux Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ /* Original Author: Max Howell 2004 */ #include "boomanalyzer.h" #include #include using Analyzer::Scope; const uint BoomAnalyzer::kColumnWidth = 4; const uint BoomAnalyzer::kMaxBandCount = 256; const uint BoomAnalyzer::kMinBandCount = 32; const char* BoomAnalyzer::kName = QT_TRANSLATE_NOOP("AnalyzerContainer", "Boom analyzer"); BoomAnalyzer::BoomAnalyzer(QWidget* parent) : Analyzer::Base(parent, 9), bands_(0), scope_(kMinBandCount), fg_(palette().color(QPalette::Highlight)), K_barHeight_(1.271) // 1.471 , F_peakSpeed_(1.103) // 1.122 , F_(1.0), bar_height_(kMaxBandCount, 0), peak_height_(kMaxBandCount, 0), peak_speed_(kMaxBandCount, 0.01), barPixmap_(kColumnWidth, 50) { setMinimumWidth(kMinBandCount * (kColumnWidth + 1) - 1); setMaximumWidth(kMaxBandCount * (kColumnWidth + 1) - 1); } void BoomAnalyzer::changeK_barHeight(int newValue) { K_barHeight_ = static_cast(newValue) / 1000; } void BoomAnalyzer::changeF_peakSpeed(int newValue) { F_peakSpeed_ = static_cast(newValue) / 1000; } void BoomAnalyzer::resizeEvent(QResizeEvent* e) { QWidget::resizeEvent(e); const uint HEIGHT = height() - 2; const double h = 1.2 / HEIGHT; bands_ = qMin( static_cast(static_cast(width() + 1) / (kColumnWidth + 1)) + 1, kMaxBandCount); scope_.resize(bands_); F_ = static_cast(HEIGHT) / (log10(256) * 1.1 /*<- max. amplitude*/); barPixmap_ = QPixmap(kColumnWidth - 2, HEIGHT); canvas_ = QPixmap(size()); canvas_.fill(palette().color(QPalette::Background)); QPainter p(&barPixmap_); for (uint y = 0; y < HEIGHT; ++y) { const double F = static_cast(y) * h; p.setPen(QColor(qMax(0, 255 - static_cast(229.0 * F)), qMax(0, 255 - static_cast(229.0 * F)), qMax(0, 255 - static_cast(191.0 * F)))); p.drawLine(0, y, kColumnWidth - 2, y); } updateBandSize(bands_); } void BoomAnalyzer::transform(Scope& s) { float* front = static_cast(&s.front()); fht_->spectrum(front); fht_->scale(front, 1.0 / 50); s.resize(scope_.size() <= kMaxBandCount / 2 ? kMaxBandCount / 2 : scope_.size()); } void BoomAnalyzer::analyze(QPainter& p, const Scope& scope, bool new_frame) { if (!new_frame) { p.drawPixmap(0, 0, canvas_); return; } float h; const uint MAX_HEIGHT = height() - 1; QPainter canvas_painter(&canvas_); canvas_.fill(palette().color(QPalette::Background)); Analyzer::interpolate(scope, scope_); // update the graphics with the new colour if (psychedelic_enabled_) { paletteChange(QPalette()); } for (uint i = 0, x = 0, y; i < bands_; ++i, x += kColumnWidth + 1) { h = log10(scope_[i] * 256.0) * F_; if (h > MAX_HEIGHT) h = MAX_HEIGHT; if (h > bar_height_[i]) { bar_height_[i] = h; if (h > peak_height_[i]) { peak_height_[i] = h; peak_speed_[i] = 0.01; } else { goto peak_handling; } } else { if (bar_height_[i] > 0.0) { bar_height_[i] -= K_barHeight_; // 1.4 if (bar_height_[i] < 0.0) bar_height_[i] = 0.0; } peak_handling: if (peak_height_[i] > 0.0) { peak_height_[i] -= peak_speed_[i]; peak_speed_[i] *= F_peakSpeed_; // 1.12 if (peak_height_[i] < bar_height_[i]) peak_height_[i] = bar_height_[i]; if (peak_height_[i] < 0.0) peak_height_[i] = 0.0; } } y = height() - uint(bar_height_[i]); canvas_painter.drawPixmap(x + 1, y, barPixmap_, 0, y, -1, -1); canvas_painter.setPen(fg_); if (bar_height_[i] > 0) canvas_painter.drawRect(x, y, kColumnWidth - 1, height() - y - 1); y = height() - uint(peak_height_[i]); canvas_painter.setPen(palette().color(QPalette::Midlight)); canvas_painter.drawLine(x, y, x + kColumnWidth - 1, y); } p.drawPixmap(0, 0, canvas_); } void BoomAnalyzer::psychedelicModeChanged(bool enabled) { psychedelic_enabled_ = enabled; // reset colours back to normal paletteChange(QPalette()); } void BoomAnalyzer::paletteChange(const QPalette&) { if (psychedelic_enabled_) { fg_ = getPsychedelicColor(scope_, 50, 100); } else { // the highlight colour changes when the main window loses focus, // so we use save and use the focused colour fg_ = palette().color(QPalette::Highlight); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/boomanalyzer.h000066400000000000000000000037141260417502300250460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2004, Max Howell Copyright 2009-2010, David Sansome Copyright 2014-2015, Mark Furneaux Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ /* Original Author: Max Howell 2004 */ #ifndef ANALYZERS_BOOMANALYZER_H_ #define ANALYZERS_BOOMANALYZER_H_ #include "analyzerbase.h" class BoomAnalyzer : public Analyzer::Base { Q_OBJECT public: Q_INVOKABLE BoomAnalyzer(QWidget*); static const char* kName; virtual void transform(Analyzer::Scope& s); virtual void analyze(QPainter& p, const Analyzer::Scope&, bool new_frame); virtual void psychedelicModeChanged(bool); public slots: void changeK_barHeight(int); void changeF_peakSpeed(int); protected: void resizeEvent(QResizeEvent* e); void paletteChange(const QPalette&); static const uint kColumnWidth; static const uint kMaxBandCount; static const uint kMinBandCount; uint bands_; Analyzer::Scope scope_; QColor fg_; double K_barHeight_, F_peakSpeed_, F_; std::vector bar_height_; std::vector peak_height_; std::vector peak_speed_; QPixmap barPixmap_; QPixmap canvas_; }; #endif // ANALYZERS_BOOMANALYZER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/fht.cpp000066400000000000000000000112511260417502300234530ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2004, Melchior FRANZ Copyright 2010, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ /* Original Author: Melchior FRANZ 2004 */ #include #include #include "fht.h" FHT::FHT(int n) : buf_(0), tab_(0), log_(0) { if (n < 3) { num_ = 0; exp2_ = -1; return; } exp2_ = n; num_ = 1 << n; if (n > 3) { buf_ = new float[num_]; tab_ = new float[num_ * 2]; makeCasTable(); } } FHT::~FHT() { delete[] buf_; delete[] tab_; delete[] log_; } void FHT::makeCasTable(void) { float d, *costab, *sintab; int ul, ndiv2 = num_ / 2; for (costab = tab_, sintab = tab_ + num_ / 2 + 1, ul = 0; ul < num_; ul++) { d = M_PI * ul / ndiv2; *costab = *sintab = cos(d); costab += 2, sintab += 2; if (sintab > tab_ + num_ * 2) sintab = tab_ + 1; } } float* FHT::copy(float* d, float* s) { return static_cast(memcpy(d, s, num_ * sizeof(float))); } float* FHT::clear(float* d) { return static_cast(memset(d, 0, num_ * sizeof(float))); } void FHT::scale(float* p, float d) { for (int i = 0; i < (num_ / 2); i++) *p++ *= d; } void FHT::ewma(float* d, float* s, float w) { for (int i = 0; i < (num_ / 2); i++, d++, s++) *d = *d * w + *s * (1 - w); } void FHT::logSpectrum(float* out, float* p) { int n = num_ / 2, i, j, k, *r; if (!log_) { log_ = new int[n]; float f = n / log10(static_cast(n)); for (i = 0, r = log_; i < n; i++, r++) { j = static_cast(rint(log10(i + 1.0) * f)); *r = j >= n ? n - 1 : j; } } semiLogSpectrum(p); *out++ = *p = *p / 100; for (k = i = 1, r = log_; i < n; i++) { j = *r++; if (i == j) { *out++ = p[i]; } else { float base = p[k - 1]; float step = (p[j] - base) / (j - (k - 1)); for (float corr = 0; k <= j; k++, corr += step) *out++ = base + corr; } } } void FHT::semiLogSpectrum(float* p) { float e; power2(p); for (int i = 0; i < (num_ / 2); i++, p++) { e = 10.0 * log10(sqrt(*p * .5)); *p = e < 0 ? 0 : e; } } void FHT::spectrum(float* p) { power2(p); for (int i = 0; i < (num_ / 2); i++, p++) *p = static_cast(sqrt(*p * .5)); } void FHT::power(float* p) { power2(p); for (int i = 0; i < (num_ / 2); i++) *p++ *= .5; } void FHT::power2(float* p) { int i; float* q; _transform(p, num_, 0); *p = (*p * *p), *p += *p, p++; for (i = 1, q = p + num_ - 2; i < (num_ / 2); i++, --q) *p = (*p * *p) + (*q * *q), p++; } void FHT::transform(float* p) { if (num_ == 8) transform8(p); else _transform(p, num_, 0); } void FHT::transform8(float* p) { float a, b, c, d, e, f, g, h, b_f2, d_h2; float a_c_eg, a_ce_g, ac_e_g, aceg, b_df_h, bdfh; a = *p++, b = *p++, c = *p++, d = *p++; e = *p++, f = *p++, g = *p++, h = *p; b_f2 = (b - f) * M_SQRT2; d_h2 = (d - h) * M_SQRT2; a_c_eg = a - c - e + g; a_ce_g = a - c + e - g; ac_e_g = a + c - e - g; aceg = a + c + e + g; b_df_h = b - d + f - h; bdfh = b + d + f + h; *p = a_c_eg - d_h2; *--p = a_ce_g - b_df_h; *--p = ac_e_g - b_f2; *--p = aceg - bdfh; *--p = a_c_eg + d_h2; *--p = a_ce_g + b_df_h; *--p = ac_e_g + b_f2; *--p = aceg + bdfh; } void FHT::_transform(float* p, int n, int k) { if (n == 8) { transform8(p + k); return; } int i, j, ndiv2 = n / 2; float a, *t1, *t2, *t3, *t4, *ptab, *pp; for (i = 0, t1 = buf_, t2 = buf_ + ndiv2, pp = &p[k]; i < ndiv2; i++) *t1++ = *pp++, *t2++ = *pp++; memcpy(p + k, buf_, sizeof(float) * n); _transform(p, ndiv2, k); _transform(p, ndiv2, k + ndiv2); j = num_ / ndiv2 - 1; t1 = buf_; t2 = t1 + ndiv2; t3 = p + k + ndiv2; ptab = tab_; pp = p + k; a = *ptab++ * *t3++; a += *ptab * *pp; ptab += j; *t1++ = *pp + a; *t2++ = *pp++ - a; for (i = 1, t4 = p + k + n; i < ndiv2; i++, ptab += j) { a = *ptab++ * *t3++; a += *ptab * *--t4; *t1++ = *pp + a; *t2++ = *pp++ - a; } memcpy(p + k, buf_, sizeof(float) * n); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/fht.h000066400000000000000000000066761260417502300231370ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2004, Melchior FRANZ Copyright 2010, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ /* Original Author: Melchior FRANZ 2004 */ #ifndef ANALYZERS_FHT_H_ #define ANALYZERS_FHT_H_ /** * Implementation of the Hartley Transform after Bracewell's discrete * algorithm. The algorithm is subject to US patent No. 4,646,256 (1987) * but was put into public domain by the Board of Trustees of Stanford * University in 1994 and is now freely available[1]. * * [1] Computer in Physics, Vol. 9, No. 4, Jul/Aug 1995 pp 373-379 */ class FHT { int exp2_; int num_; float* buf_; float* tab_; int* log_; /** * Create a table of "cas" (cosine and sine) values. * Has only to be done in the constructor and saves from * calculating the same values over and over while transforming. */ void makeCasTable(); /** * Recursive in-place Hartley transform. For internal use only! */ void _transform(float*, int, int); public: /** * Prepare transform for data sets with @f$2^n@f$ numbers, whereby @f$n@f$ * should be at least 3. Values of more than 3 need a trigonometry table. * @see makeCasTable() */ explicit FHT(int); ~FHT(); inline int sizeExp() const { return exp2_; } inline int size() const { return num_; } float* copy(float*, float*); float* clear(float*); void scale(float*, float); /** * Exponentially Weighted Moving Average (EWMA) filter. * @param d is the filtered data. * @param s is fresh input. * @param w is the weighting factor. */ void ewma(float* d, float* s, float w); /** * Logarithmic audio spectrum. Maps semi-logarithmic spectrum * to logarithmic frequency scale, interpolates missing values. * A logarithmic index map is calculated at the first run only. * @param p is the input array. * @param out is the spectrum. */ void logSpectrum(float* out, float* p); /** * Semi-logarithmic audio spectrum. */ void semiLogSpectrum(float*); /** * Fourier spectrum. */ void spectrum(float*); /** * Calculates a mathematically correct FFT power spectrum. * If further scaling is applied later, use power2 instead * and factor the 0.5 in the final scaling factor. * @see FHT::power2() */ void power(float*); /** * Calculates an FFT power spectrum with doubled values as a * result. The values need to be multiplied by 0.5 to be exact. * Note that you only get @f$2^{n-1}@f$ power values for a data set * of @f$2^n@f$ input values. This is the fastest transform. * @see FHT::power() */ void power2(float*); /** * Discrete Hartley transform of data sets with 8 values. */ void transform8(float*); void transform(float*); }; #endif // ANALYZERS_FHT_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/glanalyzer.cpp000066400000000000000000000165571260417502300250600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2004, Adam Pigg Copyright 2009, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ /* Original Author: Adam Pigg 2004 */ #include #ifdef HAVE_QGLWIDGET #include #include "glanalyzer.h" #include GLAnalyzer::GLAnalyzer(QWidget* parent) : Analyzer::Base3D(parent, 15), m_oldy(32, -10.0f), m_peaks(32) {} GLAnalyzer::~GLAnalyzer() {} void GLAnalyzer::analyze(const Scope& s) { // kdDebug() << "Scope Size: " << s.size() << endl; /* Scope t(32); if (s.size() != 32) { Analyzer::interpolate(s, t); } else { t = s; }*/ uint offset = 0; static float peak; float mfactor = 0.0; static int drawcount; if (s.size() == 64) { offset = 8; } glRotatef(0.25f, 0.0f, 1.0f, 0.5f); // Rotate the scene drawFloor(); drawcount++; if (drawcount > 25) { drawcount = 0; peak = 0.0; } for (uint i = 0; i < 32; i++) { if (s[i] > peak) { peak = s[i]; } } mfactor = 20 / peak; for (uint i = 0; i < 32; i++) { // Calculate new horizontal position (x) depending on number of samples x = -16.0f + i; // Calculating new vertical position (y) depending on the data passed by // amarok y = static_cast(s[i + offset] * mfactor); // This make it kinda dynamically // resize depending on the data // Some basic bounds checking if (y > 30) y = 30; else if (y < 0) y = 0; if ((y - m_oldy[i]) < -0.6f) { y = m_oldy[i] - 0.7f; } if (y < 0.0f) { y = 0.0f; } m_oldy[i] = y; // Save value as last value // Peak Code if (m_oldy[i] > m_peaks[i].level) { m_peaks[i].level = m_oldy[i]; m_peaks[i].delay = 30; } if (m_peaks[i].delay > 0) { m_peaks[i].delay--; } if (m_peaks[i].level > 1.0f) { if (m_peaks[i].delay <= 0) { m_peaks[i].level -= 0.4f; } } // Draw the bar drawBar(x, y); drawPeak(x, m_peaks[i].level); } updateGL(); } void GLAnalyzer::initializeGL() { // Clear frame (next fading will be preferred to clearing) glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set clear color to black glClear(GL_COLOR_BUFFER_BIT); // Set the shading model glShadeModel(GL_SMOOTH); // Set the polygon mode to fill glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); // Enable depth testing for hidden line removal glEnable(GL_DEPTH_TEST); // Set blend parameters for 'composting alpha' glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } void GLAnalyzer::resizeGL(int w, int h) { glViewport(0, 0, (GLint)w, (GLint)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-16.0f, 16.0f, -10.0f, 10.0f, -50.0f, 100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void GLAnalyzer::paintGL() { glMatrixMode(GL_MODELVIEW); glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); glPushMatrix(); glLoadIdentity(); glBegin(GL_TRIANGLE_STRIP); glColor4f(0.0f, 0.0f, 0.1f, 0.08f); glVertex2f(20.0f, 10.0f); glVertex2f(-20.0f, 10.0f); glVertex2f(20.0f, -10.0f); glVertex2f(-20.0f, -10.0f); glEnd(); glPopMatrix(); glDisable(GL_BLEND); glEnable(GL_DEPTH_TEST); glClear(GL_DEPTH_BUFFER_BIT); #endif // swapBuffers(); glFlush(); } void GLAnalyzer::drawBar(float xPos, float height) { glPushMatrix(); // Sets color to blue // Set the colour depending on the height of the bar glColor3f((height / 40) + 0.5f, (height / 40) + 0.625f, 1.0f); glTranslatef(xPos, -10.0f, 0.0f); glScalef(1.0f, height, 3.0f); drawCube(); // Set colour to full blue // glColor3f(0.0f, 0.0f, 1.0f); // drawFrame(); glPopMatrix(); } void GLAnalyzer::drawFloor() { glPushMatrix(); // Sets color to amarok blue glColor3f(0.5f, 0.625f, 1.0f); glTranslatef(-16.0f, -11.0f, -4.0f); glScalef(32.0f, 1.0f, 10.0f); drawCube(); // Set colour to full blue glColor3f(0.0f, 0.0f, 1.0f); drawFrame(); glPopMatrix(); } void GLAnalyzer::drawPeak(float xPos, float ypos) { glPushMatrix(); // Set the colour to red glColor3f(1.0f, 0.0f, 0.0f); glTranslatef(xPos, ypos - 10.0f, 0.0f); glScalef(1.0f, 1.0f, 3.0f); drawCube(); glPopMatrix(); } void GLAnalyzer::drawCube() { glPushMatrix(); glBegin(GL_POLYGON); // This is the top face glVertex3f(0.0f, 1.0f, 0.0f); glVertex3f(1.0f, 1.0f, 0.0f); glVertex3f(1.0f, 1.0f, 1.0f); glVertex3f(0.0f, 1.0f, 1.0f); glVertex3f(0.0f, 1.0f, 0.0f); // This is the front face glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(1.0f, 0.0f, 0.0f); glVertex3f(1.0f, 1.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f); glVertex3f(0.0f, 0.0f, 0.0f); // This is the right face glVertex3f(1.0f, 0.0f, 0.0f); glVertex3f(1.0f, 0.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f); glVertex3f(1.0f, 1.0f, 0.0f); glVertex3f(1.0f, 0.0f, 0.0f); // This is the left face glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(0.0f, 0.0f, 1.0f); glVertex3f(0.0f, 1.0f, 1.0f); glVertex3f(0.0f, 1.0f, 0.0f); glVertex3f(0.0f, 0.0f, 0.0f); // This is the bottom face glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(1.0f, 0.0f, 0.0f); glVertex3f(1.0f, 0.0f, 1.0f); glVertex3f(0.0f, 0.0f, 1.0f); glVertex3f(0.0f, 0.0f, 0.0f); // This is the back face glVertex3f(0.0f, 0.0f, 1.0f); glVertex3f(1.0f, 0.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f); glVertex3f(0.0f, 1.0f, 1.0f); glVertex3f(0.0f, 0.0f, 1.0f); glEnd(); glPopMatrix(); } void GLAnalyzer::drawFrame() { glPushMatrix(); glBegin(GL_LINES); // This is the top face glVertex3f(0.0f, 1.0f, 0.0f); glVertex3f(1.0f, 1.0f, 0.0f); glVertex3f(1.0f, 1.0f, 1.0f); glVertex3f(0.0f, 1.0f, 1.0f); glVertex3f(0.0f, 1.0f, 0.0f); // This is the front face glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(1.0f, 0.0f, 0.0f); glVertex3f(1.0f, 1.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f); glVertex3f(0.0f, 0.0f, 0.0f); // This is the right face glVertex3f(1.0f, 0.0f, 0.0f); glVertex3f(1.0f, 0.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f); glVertex3f(1.0f, 1.0f, 0.0f); glVertex3f(1.0f, 0.0f, 0.0f); // This is the left face glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(0.0f, 0.0f, 1.0f); glVertex3f(0.0f, 1.0f, 1.0f); glVertex3f(0.0f, 1.0f, 0.0f); glVertex3f(0.0f, 0.0f, 0.0f); // This is the bottom face glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(1.0f, 0.0f, 0.0f); glVertex3f(1.0f, 0.0f, 1.0f); glVertex3f(0.0f, 0.0f, 1.0f); glVertex3f(0.0f, 0.0f, 0.0f); // This is the back face glVertex3f(0.0f, 0.0f, 1.0f); glVertex3f(1.0f, 0.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f); glVertex3f(0.0f, 1.0f, 1.0f); glVertex3f(0.0f, 0.0f, 1.0f); glEnd(); glPopMatrix(); } #endif clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/glanalyzer.h000066400000000000000000000031611260417502300245100ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2004, Adam Pigg Copyright 2009, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ /* Original Author: Adam Pigg 2004 */ #ifndef ANALYZERS_GLANALYZER_H_ #define ANALYZERS_GLANALYZER_H_ #include #ifdef HAVE_QGLWIDGET #include "analyzerbase.h" typedef struct { float level; uint delay; } peak_tx; class GLAnalyzer : public Analyzer::Base3D { private: std::vector m_oldy; std::vector m_peaks; void drawCube(); void drawFrame(); void drawBar(float xPos, float height); void drawPeak(float xPos, float ypos); void drawFloor(); GLfloat x, y; public: explicit GLAnalyzer(QWidget*); ~GLAnalyzer(); void analyze(const Scope&); protected: void initializeGL(); void resizeGL(int w, int h); void paintGL(); }; #endif #endif // ANALYZERS_GLANALYZER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/glanalyzer2.cpp000066400000000000000000000223261260417502300251310ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2004, Enrico Ros Copyright 2009, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ /* Original Author: Enrico Ros 2004 */ #include #ifdef HAVE_QGLWIDGET #include #include #include "glanalyzer2.h" #include #include #include #include GLAnalyzer2::GLAnalyzer2(QWidget* parent) : Analyzer::Base3D(parent, 15) { // initialize openGL context before managing GL calls makeCurrent(); loadTexture(locate("data", "amarok/data/dot.png"), dotTexture); loadTexture(locate("data", "amarok/data/wirl1.png"), w1Texture); loadTexture(locate("data", "amarok/data/wirl2.png"), w2Texture); show.paused = true; show.pauseTimer = 0.0; show.rotDegrees = 0.0; frame.rotDegrees = 0.0; } GLAnalyzer2::~GLAnalyzer2() { freeTexture(dotTexture); freeTexture(w1Texture); freeTexture(w2Texture); } void GLAnalyzer2::initializeGL() { // Set a smooth shade model glShadeModel(GL_SMOOTH); // Disable depth test (all is drawn on a 2d plane) glDisable(GL_DEPTH_TEST); // Set blend parameters for 'composting alpha' glBlendFunc(GL_SRC_ALPHA, GL_ONE); // superpose // glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); //fade glEnable(GL_BLEND); // Clear frame with a black background glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); } void GLAnalyzer2::resizeGL(int w, int h) { // Setup screen. We're going to manually do the perspective projection glViewport(0, 0, (GLint)w, (GLint)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-10.0f, 10.0f, -10.0f, 10.0f, -5.0f, 5.0f); // Get the aspect ratio of the screen to draw 'cicular' particles float ratio = static_cast(w) / static_cast(h), eqPixH = 60, eqPixW = 80; if (ratio >= (4.0 / 3.0)) { unitX = 10.0 / (eqPixH * ratio); unitY = 10.0 / eqPixH; } else { unitX = 10.0 / eqPixW; unitY = 10.0 / (eqPixW / ratio); } // Get current timestamp. timeval tv; gettimeofday(&tv, nullptr); show.timeStamp = static_cast(tv.tv_sec) + static_cast(tv.tv_usec) / 1000000.0; } void GLAnalyzer2::paused() { analyze(Scope()); } void GLAnalyzer2::analyze(const Scope& s) { bool haveNoData = s.empty(); // if we're going into pause mode, clear timers. if (!show.paused && haveNoData) show.pauseTimer = 0.0; // if we have got data, interpolate it (asking myself why I'm doing it here..) if (!(show.paused = haveNoData)) { int bands = s.size(), lowbands = bands / 4, hibands = bands / 3, midbands = bands - lowbands - hibands; Q_UNUSED(midbands); float currentEnergy = 0, currentMeanBand = 0, maxValue = 0; for (int i = 0; i < bands; i++) { float value = s[i]; currentEnergy += value; currentMeanBand += static_cast(i) * value; if (value > maxValue) maxValue = value; } frame.silence = currentEnergy < 0.001; if (!frame.silence) { frame.meanBand = 100.0 * currentMeanBand / (currentEnergy * bands); currentEnergy = 100.0 * currentEnergy / static_cast(bands); frame.dEnergy = currentEnergy - frame.energy; frame.energy = currentEnergy; // printf( "%d [%f :: %f ]\t%f \n", bands, frame.energy, // frame.meanBand, maxValue ); } else { frame.energy = 0.0; } } // update the frame updateGL(); } void GLAnalyzer2::paintGL() { // Compute the dT since the last call to paintGL and update timings timeval tv; gettimeofday(&tv, nullptr); double currentTime = static_cast(tv.tv_sec) + static_cast(tv.tv_usec) / 1000000.0; show.dT = currentTime - show.timeStamp; show.timeStamp = currentTime; // Clear frame glClear(GL_COLOR_BUFFER_BIT); // Shitch to MODEL matrix and reset it to default glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // Fade the previous drawings. /* glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); glBegin( GL_TRIANGLE_STRIP ); glColor4f( 0.0f, 0.0f, 0.0f, 0.2f ); glVertex2f( 10.0f, 10.0f ); glVertex2f( -10.0f, 10.0f ); glVertex2f( 10.0f, -10.0f ); glVertex2f( -10.0f, -10.0f ); glEnd();*/ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_TEXTURE_2D); float alphaN = show.paused ? 0.2 : (frame.energy / 10.0), alphaP = show.paused ? 1.0 : (1 - frame.energy / 20.0); if (alphaN > 1.0) alphaN = 1.0; if (alphaP < 0.1) alphaP = 0.1; glBindTexture(GL_TEXTURE_2D, w2Texture); setTextureMatrix(show.rotDegrees, 0.707 * alphaP); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); glBegin(GL_TRIANGLE_STRIP); glTexCoord2f(1.0, 1.0); glVertex2f(10.0f, 10.0f); glTexCoord2f(0.0, 1.0); glVertex2f(-10.0f, 10.0f); glTexCoord2f(1.0, 0.0); glVertex2f(10.0f, -10.0f); glTexCoord2f(0.0, 0.0); glVertex2f(-10.0f, -10.0f); glEnd(); glBindTexture(GL_TEXTURE_2D, w1Texture); setTextureMatrix(-show.rotDegrees * 2, 0.707); glColor4f(1.0f, 1.0f, 1.0f, alphaN); glBegin(GL_TRIANGLE_STRIP); glTexCoord2f(1.0, 1.0); glVertex2f(10.0f, 10.0f); glTexCoord2f(0.0, 1.0); glVertex2f(-10.0f, 10.0f); glTexCoord2f(1.0, 0.0); glVertex2f(10.0f, -10.0f); glTexCoord2f(0.0, 0.0); glVertex2f(-10.0f, -10.0f); glEnd(); setTextureMatrix(0.0, 0.0); glDisable(GL_TEXTURE_2D); glBlendFunc(GL_SRC_ALPHA, GL_ONE); // Here begins the real draw loop // some updates to the show show.rotDegrees += 40.0 * show.dT; frame.rotDegrees += 80.0 * show.dT; // handle the 'pause' status if (show.paused) { if (show.pauseTimer > 0.5) { if (show.pauseTimer > 0.6) show.pauseTimer -= 0.6; drawFullDot(0.0f, 0.4f, 0.8f, 1.0f); drawFullDot(0.0f, 0.4f, 0.8f, 1.0f); } show.pauseTimer += show.dT; return; } if (dotTexture) { glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, dotTexture); } else { glDisable(GL_TEXTURE_2D); } glLoadIdentity(); // glRotatef( -frame.rotDegrees, 0,0,1 ); glBegin(GL_QUADS); // Particle * particle = particleList.first(); // for (; particle; particle = particleList.next()) { glColor4f(0.0f, 1.0f, 0.0f, 1.0f); drawDot(0, 0, kMax(10.0, (10.0 * frame.energy))); glColor4f(1.0f, 0.0f, 0.0f, 1.0f); drawDot(6, 0, kMax(10.0, (5.0 * frame.energy))); glColor4f(0.0f, 0.4f, 1.0f, 1.0f); drawDot(-6, 0, kMax(10.0, (5.0 * frame.energy))); } glEnd(); } void GLAnalyzer2::drawDot(float x, float y, float size) { float sizeX = size * unitX, sizeY = size * unitY, pLeft = x - sizeX, pTop = y + sizeY, pRight = x + sizeX, pBottom = y - sizeY; glTexCoord2f(0, 0); // Bottom Left glVertex2f(pLeft, pBottom); glTexCoord2f(0, 1); // Top Left glVertex2f(pLeft, pTop); glTexCoord2f(1, 1); // Top Right glVertex2f(pRight, pTop); glTexCoord2f(1, 0); // Bottom Right glVertex2f(pRight, pBottom); } void GLAnalyzer2::drawFullDot(float r, float g, float b, float a) { glBindTexture(GL_TEXTURE_2D, dotTexture); glEnable(GL_TEXTURE_2D); glColor4f(r, g, b, a); glBegin(GL_TRIANGLE_STRIP); glTexCoord2f(1.0, 1.0); glVertex2f(10.0f, 10.0f); glTexCoord2f(0.0, 1.0); glVertex2f(-10.0f, 10.0f); glTexCoord2f(1.0, 0.0); glVertex2f(10.0f, -10.0f); glTexCoord2f(0.0, 0.0); glVertex2f(-10.0f, -10.0f); glEnd(); glDisable(GL_TEXTURE_2D); } void GLAnalyzer2::setTextureMatrix(float rot, float scale) { glMatrixMode(GL_TEXTURE); glLoadIdentity(); if (rot != 0.0 || scale != 0.0) { glTranslatef(0.5f, 0.5f, 0.0f); glRotatef(rot, 0.0f, 0.0f, 1.0f); glScalef(scale, scale, 1.0f); glTranslatef(-0.5f, -0.5f, 0.0f); } glMatrixMode(GL_MODELVIEW); } bool GLAnalyzer2::loadTexture(QString fileName, GLuint& textureID) { // reset texture ID to the default EMPTY value textureID = 0; // load image QImage tmp; if (!tmp.load(fileName)) return false; // convert it to suitable format (flipped RGBA) QImage texture = QGLWidget::convertToGLFormat(tmp); if (texture.isNull()) return false; // get texture number and bind loaded image to that texture glGenTextures(1, &textureID); glBindTexture(GL_TEXTURE_2D, textureID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, 4, texture.width(), texture.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, texture.bits()); return true; } void GLAnalyzer2::freeTexture(GLuint& textureID) { if (textureID > 0) glDeleteTextures(1, &textureID); textureID = 0; } #endif clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/glanalyzer2.h000066400000000000000000000037701260417502300246000ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2004, Enrico Ros Copyright 2009, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ /* Original Author: Enrico Ros 2004 */ #ifndef ANALYZERS_GLANALYZER2_H_ #define ANALYZERS_GLANALYZER2_H_ #include #ifdef HAVE_QGLWIDGET #include "analyzerbase.h" #include #include class GLAnalyzer2 : public Analyzer::Base3D { public: explicit GLAnalyzer2(QWidget*); ~GLAnalyzer2(); void analyze(const Scope&); void paused(); protected: void initializeGL(); void resizeGL(int w, int h); void paintGL(); private: struct ShowProperties { bool paused; double timeStamp; double dT; double pauseTimer; float rotDegrees; } show; struct FrameProperties { float energy; float dEnergy; float meanBand; float rotDegrees; bool silence; } frame; GLuint dotTexture; GLuint w1Texture; GLuint w2Texture; float unitX, unitY; void drawDot(float x, float y, float size); void drawFullDot(float r, float g, float b, float a); void setTextureMatrix(float rot, float scale); bool loadTexture(QString file, GLuint& textureID); void freeTexture(GLuint& textureID); }; #endif #endif // ANALYZERS_GLANALYZER2_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/glanalyzer3.cpp000066400000000000000000000317251260417502300251350ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2004, Enrico Ros Copyright 2009, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ /* Original Author: Enrico Ros 2004 */ #include #ifdef HAVE_QGLWIDGET #include #include #include "glanalyzer3.h" #include #include #include #include #ifndef HAVE_FABSF inline float fabsf(float f) { return f < 0.f ? -f : f; } #endif class Ball { public: Ball() : x(drand48() - drand48()), y(1 - 2.0 * drand48()), z(drand48()), vx(0.0), vy(0.0), vz(0.0), mass(0.01 + drand48() / 10.0), color((float[3]) { 0.0, drand48()*0.5, 0.7 + drand48() * 0.3 }) {} float x, y, z, vx, vy, vz, mass; float color[3]; void updatePhysics(float dT) { x += vx * dT; // position y += vy * dT; // position z += vz * dT; // position if (y < -0.8) vy = fabsf(vy); if (y > 0.8) vy = -fabsf(vy); if (z < 0.1) vz = fabsf(vz); if (z > 0.9) vz = -fabsf(vz); vx += ((x > 0) ? 4.94 : -4.94) * dT; // G-force vx *= (1 - 2.9 * dT); // air friction vy *= (1 - 2.9 * dT); // air friction vz *= (1 - 2.9 * dT); // air friction } }; class Paddle { public: explicit Paddle(float xPos) : onLeft(xPos < 0), mass(1.0), X(xPos), x(xPos), vx(0.0) {} void updatePhysics(float dT) { x += vx * dT; // posision vx += (1300 * (X - x) / mass) * dT; // elasticity vx *= (1 - 4.0 * dT); // air friction } void renderGL() { glBegin(GL_TRIANGLE_STRIP); glColor3f(0.0f, 0.1f, 0.3f); glVertex3f(x, -1.0f, 0.0); glVertex3f(x, 1.0f, 0.0); glColor3f(0.1f, 0.2f, 0.6f); glVertex3f(x, -1.0f, 1.0); glVertex3f(x, 1.0f, 1.0); glEnd(); } void bounce(Ball* ball) { if (onLeft && ball->x < x) { ball->vx = vx * mass / (mass + ball->mass) + fabsf(ball->vx); ball->vy = (drand48() - drand48()) * 1.8; ball->vz = (drand48() - drand48()) * 0.9; ball->x = x; } else if (!onLeft && ball->x > x) { ball->vx = vx * mass / (mass + ball->mass) - fabsf(ball->vx); ball->vy = (drand48() - drand48()) * 1.8; ball->vz = (drand48() - drand48()) * 0.9; ball->x = x; } } void impulse(float strength) { if ((onLeft && strength > vx) || (!onLeft && strength < vx)) vx += strength; } private: bool onLeft; float mass, X, x, vx; }; GLAnalyzer3::GLAnalyzer3(QWidget* parent) : Analyzer::Base3D(parent, 15) { // initialize openGL context before managing GL calls makeCurrent(); loadTexture(locate("data", "amarok/data/ball.png"), ballTexture); loadTexture(locate("data", "amarok/data/grid.png"), gridTexture); balls.setAutoDelete(true); leftPaddle = new Paddle(-1.0); rightPaddle = new Paddle(1.0); for (int i = 0; i < NUMBER_OF_BALLS; i++) balls.append(new Ball()); show.colorK = 0.0; show.gridScrollK = 0.0; show.gridEnergyK = 0.0; show.camRot = 0.0; show.camRoll = 0.0; show.peakEnergy = 1.0; frame.silence = true; frame.energy = 0.0; frame.dEnergy = 0.0; } GLAnalyzer3::~GLAnalyzer3() { freeTexture(ballTexture); freeTexture(gridTexture); delete leftPaddle; delete rightPaddle; balls.clear(); } void GLAnalyzer3::initializeGL() { // Set a smooth shade model glShadeModel(GL_SMOOTH); // Disable depth test (all is drawn 'z-sorted') glDisable(GL_DEPTH_TEST); // Set blending function (Alpha addition) glBlendFunc(GL_SRC_ALPHA, GL_ONE); // Clear frame with a black background glClearColor(0.0f, 0.0f, 0.0f, 1.0f); } void GLAnalyzer3::resizeGL(int w, int h) { // Setup screen. We're going to manually do the perspective projection glViewport(0, 0, (GLint)w, (GLint)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(-0.5f, 0.5f, -0.5f, 0.5f, 0.5f, 4.5f); // Get the aspect ratio of the screen to draw 'circular' particles float ratio = static_cast(w) / static_cast(h); if (ratio >= 1.0) { unitX = 0.34 / ratio; unitY = 0.34; } else { unitX = 0.34; unitY = 0.34 * ratio; } // Get current timestamp. timeval tv; gettimeofday(&tv, nullptr); show.timeStamp = static_cast(tv.tv_sec) + static_cast(tv.tv_usec) / 1000000.0; } void GLAnalyzer3::paused() { analyze(Scope()); } void GLAnalyzer3::analyze(const Scope& s) { // compute the dTime since the last call timeval tv; gettimeofday(&tv, nullptr); double currentTime = static_cast(tv.tv_sec) + static_cast(tv.tv_usec) / 1000000.0; show.dT = currentTime - show.timeStamp; show.timeStamp = currentTime; // compute energy integrating frame's spectrum if (!s.empty()) { int bands = s.size(); float currentEnergy = 0, maxValue = 0; // integrate spectrum -> energy for (int i = 0; i < bands; i++) { float value = s[i]; currentEnergy += value; if (value > maxValue) maxValue = value; } currentEnergy *= 100.0 / static_cast(bands); // emulate a peak detector: currentEnergy -> peakEnergy (3tau = 30 seconds) show.peakEnergy = 1.0 + (show.peakEnergy - 1.0) * exp(-show.dT / 10.0); if (currentEnergy > show.peakEnergy) show.peakEnergy = currentEnergy; // check for silence frame.silence = currentEnergy < 0.001; // normalize frame energy against peak energy and compute frame stats currentEnergy /= show.peakEnergy; frame.dEnergy = currentEnergy - frame.energy; frame.energy = currentEnergy; } else { frame.silence = true; } // update the frame updateGL(); } void GLAnalyzer3::paintGL() { // limit max dT to 0.05 and update color and scroll constants if (show.dT > 0.05) show.dT = 0.05; show.colorK += show.dT * 0.4; if (show.colorK > 3.0) show.colorK -= 3.0; show.gridScrollK += 0.2 * show.peakEnergy * show.dT; // Switch to MODEL matrix and clear screen glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT); // Draw scrolling grid if ((show.gridEnergyK > 0.05) || (!frame.silence && frame.dEnergy < -0.3)) { show.gridEnergyK *= exp(-show.dT / 0.1); if (-frame.dEnergy > show.gridEnergyK) show.gridEnergyK = -frame.dEnergy * 2.0; float gridColor[4] = {0.0, 1.0, 0.6, show.gridEnergyK}; drawScrollGrid(show.gridScrollK, gridColor); } // Roll camera up/down handling the beat show.camRot += show.camRoll * show.dT; // posision show.camRoll -= 400 * show.camRot * show.dT; // elasticity show.camRoll *= (1 - 2.0 * show.dT); // friction if (!frame.silence && frame.dEnergy > 0.4) show.camRoll += show.peakEnergy * 2.0; glRotatef(show.camRoll / 2.0, 1, 0, 0); // Translate the drawing plane glTranslatef(0.0f, 0.0f, -1.8f); // Draw upper/lower planes and paddles drawHFace(-1.0); drawHFace(1.0); leftPaddle->renderGL(); rightPaddle->renderGL(); // Draw Balls if (ballTexture) { glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, ballTexture); } else { glDisable(GL_TEXTURE_2D); } glEnable(GL_BLEND); Ball* ball = balls.first(); for (; ball; ball = balls.next()) { float color[3], angle = show.colorK; // Rotate the color based on 'angle' value [0,3) if (angle < 1.0) { color[0] = ball->color[0] * (1 - angle) + ball->color[1] * angle; color[1] = ball->color[1] * (1 - angle) + ball->color[2] * angle; color[2] = ball->color[2] * (1 - angle) + ball->color[0] * angle; } else if (angle < 2.0) { angle -= 1.0; color[0] = ball->color[1] * (1 - angle) + ball->color[2] * angle; color[1] = ball->color[2] * (1 - angle) + ball->color[0] * angle; color[2] = ball->color[0] * (1 - angle) + ball->color[1] * angle; } else { angle -= 2.0; color[0] = ball->color[2] * (1 - angle) + ball->color[0] * angle; color[1] = ball->color[0] * (1 - angle) + ball->color[1] * angle; color[2] = ball->color[1] * (1 - angle) + ball->color[2] * angle; } // Draw the dot and update its physics also checking at bounces glColor3fv(color); drawDot3s(ball->x, ball->y, ball->z, 1.0); ball->updatePhysics(show.dT); if (ball->x < 0) leftPaddle->bounce(ball); else rightPaddle->bounce(ball); } glDisable(GL_BLEND); glDisable(GL_TEXTURE_2D); // Update physics of paddles leftPaddle->updatePhysics(show.dT); rightPaddle->updatePhysics(show.dT); if (!frame.silence) { leftPaddle->impulse(frame.energy * 3.0 + frame.dEnergy * 6.0); rightPaddle->impulse(-frame.energy * 3.0 - frame.dEnergy * 6.0); } } void GLAnalyzer3::drawDot3s(float x, float y, float z, float size) { // Circular XY dot drawing functions float sizeX = size * unitX, sizeY = size * unitY, pXm = x - sizeX, pXM = x + sizeX, pYm = y - sizeY, pYM = y + sizeY; // Draw the Dot glBegin(GL_QUADS); glTexCoord2f(0, 0); // Bottom Left glVertex3f(pXm, pYm, z); glTexCoord2f(0, 1); // Top Left glVertex3f(pXm, pYM, z); glTexCoord2f(1, 1); // Top Right glVertex3f(pXM, pYM, z); glTexCoord2f(1, 0); // Bottom Right glVertex3f(pXM, pYm, z); glEnd(); // Shadow XZ drawing functions float sizeZ = size / 10.0, pZm = z - sizeZ, pZM = z + sizeZ, currentColor[4]; glGetFloatv(GL_CURRENT_COLOR, currentColor); float alpha = currentColor[3], topSide = (y + 1) / 4, bottomSide = (1 - y) / 4; // Draw the top shadow currentColor[3] = topSide * topSide * alpha; glColor4fv(currentColor); glBegin(GL_QUADS); glTexCoord2f(0, 0); // Bottom Left glVertex3f(pXm, 1, pZm); glTexCoord2f(0, 1); // Top Left glVertex3f(pXm, 1, pZM); glTexCoord2f(1, 1); // Top Right glVertex3f(pXM, 1, pZM); glTexCoord2f(1, 0); // Bottom Right glVertex3f(pXM, 1, pZm); glEnd(); // Draw the bottom shadow currentColor[3] = bottomSide * bottomSide * alpha; glColor4fv(currentColor); glBegin(GL_QUADS); glTexCoord2f(0, 0); // Bottom Left glVertex3f(pXm, -1, pZm); glTexCoord2f(0, 1); // Top Left glVertex3f(pXm, -1, pZM); glTexCoord2f(1, 1); // Top Right glVertex3f(pXM, -1, pZM); glTexCoord2f(1, 0); // Bottom Right glVertex3f(pXM, -1, pZm); glEnd(); } void GLAnalyzer3::drawHFace(float y) { glBegin(GL_TRIANGLE_STRIP); glColor3f(0.0f, 0.1f, 0.2f); glVertex3f(-1.0f, y, 0.0); glVertex3f(1.0f, y, 0.0); glColor3f(0.1f, 0.6f, 0.5f); glVertex3f(-1.0f, y, 2.0); glVertex3f(1.0f, y, 2.0); glEnd(); } void GLAnalyzer3::drawScrollGrid(float scroll, float color[4]) { if (!gridTexture) return; glMatrixMode(GL_TEXTURE); glLoadIdentity(); glTranslatef(0.0, -scroll, 0.0); glMatrixMode(GL_MODELVIEW); float backColor[4] = {1.0, 1.0, 1.0, 0.0}; for (int i = 0; i < 3; i++) backColor[i] = color[i]; glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, gridTexture); glEnable(GL_BLEND); glBegin(GL_TRIANGLE_STRIP); glColor4fv(color); // top face glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f); glColor4fv(backColor); // central points glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 0.0f, -3.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 0.0f, -3.0f); glColor4fv(color); // bottom face glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, -1.0f, -1.0f); glEnd(); glDisable(GL_BLEND); glDisable(GL_TEXTURE_2D); glMatrixMode(GL_TEXTURE); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); } bool GLAnalyzer3::loadTexture(QString fileName, GLuint& textureID) { // reset texture ID to the default EMPTY value textureID = 0; // load image QImage tmp; if (!tmp.load(fileName)) return false; // convert it to suitable format (flipped RGBA) QImage texture = QGLWidget::convertToGLFormat(tmp); if (texture.isNull()) return false; // get texture number and bind loaded image to that texture glGenTextures(1, &textureID); glBindTexture(GL_TEXTURE_2D, textureID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, 4, texture.width(), texture.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, texture.bits()); return true; } void GLAnalyzer3::freeTexture(GLuint& textureID) { if (textureID > 0) glDeleteTextures(1, &textureID); textureID = 0; } #endif clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/glanalyzer3.h000066400000000000000000000041741260417502300246000ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2004, Enrico Ros Copyright 2009, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ /* Original Author: Enrico Ros 2004 */ #include #ifdef HAVE_QGLWIDGET #ifndef ANALYZERS_GLANALYZER3_H_ #define ANALYZERS_GLANALYZER3_H_ #include "analyzerbase.h" #include #include class QWidget; class Ball; class Paddle; class GLAnalyzer3 : public Analyzer::Base3D { public: explicit GLAnalyzer3(QWidget*); ~GLAnalyzer3(); void analyze(const Scope&); void paused(); protected: void initializeGL(); void resizeGL(int w, int h); void paintGL(); private: struct ShowProperties { double timeStamp; double dT; float colorK; float gridScrollK; float gridEnergyK; float camRot; float camRoll; float peakEnergy; } show; struct FrameProperties { bool silence; float energy; float dEnergy; } frame; static const int NUMBER_OF_BALLS = 16; QPtrList balls; Paddle* leftPaddle, *rightPaddle; float unitX, unitY; GLuint ballTexture; GLuint gridTexture; void drawDot3s(float x, float y, float z, float size); void drawHFace(float y); void drawScrollGrid(float scroll, float color[4]); bool loadTexture(QString file, GLuint& textureID); void freeTexture(GLuint& textureID); }; #endif #endif // ANALYZERS_GLANALYZER3_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/nyancatanalyzer.cpp000066400000000000000000000147041260417502300261030ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, Tyler Rhodes Copyright 2011-2012, 2014, David Sansome Copyright 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "nyancatanalyzer.h" #include #include #include #include "core/arraysize.h" #include "core/logging.h" using Analyzer::Scope; const char* NyanCatAnalyzer::kName = "Nyanalyzer cat"; const float NyanCatAnalyzer::kPixelScale = 0.02f; NyanCatAnalyzer::NyanCatAnalyzer(QWidget* parent) : Analyzer::Base(parent, 9), cat_(":/nyancat.png"), timer_id_(startTimer(kFrameIntervalMs)), frame_(0), current_buffer_(0), available_rainbow_width_(0), px_per_frame_(0), x_offset_(0), background_brush_(QColor(0x0f, 0x43, 0x73)) { memset(history_, 0, sizeof(history_)); for (int i = 0; i < kRainbowBands; ++i) { colors_[i] = QPen(QColor::fromHsv(i * 255 / kRainbowBands, 255, 255), kCatHeight / kRainbowBands, Qt::SolidLine, Qt::FlatCap, Qt::RoundJoin); // pow constants computed so that // | band_scale(0) | ~= .5 and | band_scale(5) | ~= 32 band_scale_[i] = -std::cos(M_PI * i / (kRainbowBands - 1)) * 0.5 * std::pow(2.3, i); } } void NyanCatAnalyzer::transform(Scope& s) { fht_->spectrum(&s.front()); } void NyanCatAnalyzer::timerEvent(QTimerEvent* e) { if (e->timerId() == timer_id_) { frame_ = (frame_ + 1) % kCatFrameCount; } else { Analyzer::Base::timerEvent(e); } } void NyanCatAnalyzer::resizeEvent(QResizeEvent* e) { // Invalidate the buffer so it's recreated from scratch in the next paint // event. buffer_[0] = QPixmap(); buffer_[1] = QPixmap(); available_rainbow_width_ = width() - kCatWidth + kRainbowOverlap; px_per_frame_ = static_cast(available_rainbow_width_) / (kHistorySize - 1) + 1; x_offset_ = px_per_frame_ * (kHistorySize - 1) - available_rainbow_width_; } void NyanCatAnalyzer::analyze(QPainter& p, const Analyzer::Scope& s, bool new_frame) { // Discard the second half of the transform const int scope_size = s.size() / 2; if ((new_frame && is_playing_) || (buffer_[0].isNull() && buffer_[1].isNull())) { // Transform the music into rainbows! for (int band = 0; band < kRainbowBands; ++band) { float* band_start = history_ + band * kHistorySize; // Move the history of each band across by 1 frame. memmove(band_start, band_start + 1, (kHistorySize - 1) * sizeof(float)); } // Now accumulate the scope data into each band. Should maybe use a series // of band pass filters for this, so bands can leak into neighbouring bands, // but for now it's a series of separate square filters. const int samples_per_band = scope_size / kRainbowBands; int sample = 0; for (int band = 0; band < kRainbowBands; ++band) { float accumulator = 0.0; for (int i = 0; i < samples_per_band; ++i) { accumulator += s[sample++]; } history_[(band + 1) * kHistorySize - 1] = accumulator * band_scale_[band]; } // Create polylines for the rainbows. QPointF polyline[kRainbowBands * kHistorySize]; QPointF* dest = polyline; float* source = history_; const float top_of_cat = static_cast(height()) / 2 - static_cast(kCatHeight) / 2; for (int band = 0; band < kRainbowBands; ++band) { // Calculate the Y position of this band. const float y = static_cast(kCatHeight) / (kRainbowBands + 1) * (band + 0.5) + top_of_cat; // Add each point in the line. for (int x = 0; x < kHistorySize; ++x) { *dest = QPointF(px_per_frame_ * x, y + *source * kPixelScale); ++dest; ++source; } } // Do we have to draw the whole rainbow into the buffer? if (buffer_[0].isNull()) { for (int i = 0; i < 2; ++i) { buffer_[i] = QPixmap(QSize(width() + x_offset_, height())); buffer_[i].fill(background_brush_.color()); } current_buffer_ = 0; QPainter buffer_painter(&buffer_[0]); buffer_painter.setRenderHint(QPainter::Antialiasing); for (int band = kRainbowBands - 1; band >= 0; --band) { buffer_painter.setPen(colors_[band]); buffer_painter.drawPolyline(&polyline[band * kHistorySize], kHistorySize); buffer_painter.drawPolyline(&polyline[band * kHistorySize], kHistorySize); } } else { const int last_buffer = current_buffer_; current_buffer_ = (current_buffer_ + 1) % 2; // We can just shuffle the buffer along a bit and draw the new frame's // data. QPainter buffer_painter(&buffer_[current_buffer_]); buffer_painter.setRenderHint(QPainter::Antialiasing); buffer_painter.drawPixmap( 0, 0, buffer_[last_buffer], px_per_frame_, 0, x_offset_ + available_rainbow_width_ - px_per_frame_, 0); buffer_painter.fillRect( x_offset_ + available_rainbow_width_ - px_per_frame_, 0, kCatWidth - kRainbowOverlap + px_per_frame_, height(), background_brush_); for (int band = kRainbowBands - 1; band >= 0; --band) { buffer_painter.setPen(colors_[band]); buffer_painter.drawPolyline(&polyline[(band + 1) * kHistorySize - 3], 3); } } } // Draw the buffer on to the widget p.drawPixmap(0, 0, buffer_[current_buffer_], x_offset_, 0, 0, 0); // Draw nyan cat (he's been waiting for this for 75 lines). // Nyan nyan nyan nyan. if (!is_playing_) { // Ssshhh! p.drawPixmap(SleepingCatDestRect(), cat_, SleepingCatSourceRect()); } else { p.drawPixmap(CatDestRect(), cat_, CatSourceRect()); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/nyancatanalyzer.h000066400000000000000000000062251260417502300255470ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, Tyler Rhodes Copyright 2011-2012, David Sansome Copyright 2011, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ANALYZERS_NYANCATANALYZER_H_ #define ANALYZERS_NYANCATANALYZER_H_ #include "analyzerbase.h" #include class NyanCatAnalyzer : public Analyzer::Base { Q_OBJECT public: Q_INVOKABLE NyanCatAnalyzer(QWidget* parent); static const char* kName; protected: void transform(Analyzer::Scope&); void analyze(QPainter& p, const Analyzer::Scope&, bool new_frame); void timerEvent(QTimerEvent* e); void resizeEvent(QResizeEvent* e); private: static const int kCatHeight = 21; static const int kCatWidth = 34; static const int kCatFrameCount = 6; static const int kRainbowOverlap = 13; static const int kSleepingCatHeight = 24; static const int kHistorySize = 128; static const int kRainbowBands = 6; static const float kPixelScale; static const int kFrameIntervalMs = 150; private: inline QRect CatSourceRect() const { return QRect(0, kCatHeight * frame_, kCatWidth, kCatHeight); } inline QRect SleepingCatSourceRect() const { return QRect(0, kCatHeight * kCatFrameCount, kCatWidth, kSleepingCatHeight); } inline QRect CatDestRect() const { return QRect(width() - kCatWidth, (height() - kCatHeight) / 2, kCatWidth, kCatHeight); } inline QRect SleepingCatDestRect() const { return QRect(width() - kCatWidth, (height() - kSleepingCatHeight) / 2, kCatWidth, kSleepingCatHeight); } private: // "constants" that get initialised in the constructor float band_scale_[kRainbowBands]; QPen colors_[kRainbowBands]; // Nyan cat! QPixmap cat_; // For the nyan cat animation int timer_id_; int frame_; // The y positions of each point on the rainbow. float history_[kHistorySize * kRainbowBands]; // A cache of the last frame's rainbow, so it can be used in the next frame. QPixmap buffer_[2]; int current_buffer_; // Geometry information that's updated on resize: // The width of the widget minus the space for the cat int available_rainbow_width_; // X spacing between each point in the polyline. int px_per_frame_; // Amount the buffer_ is shifted to the left (off the edge of the widget) to // make the rainbow extend from 0 to available_rainbow_width_. int x_offset_; QBrush background_brush_; }; #endif // ANALYZERS_NYANCATANALYZER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/rainbowdashanalyzer.cpp000066400000000000000000000147221260417502300267470ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Alibek Omarov Copyright 2014-2015, Mark Furneaux Copyright 2014, Krzysztof Sobiecki Copyright 2014, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "rainbowdashanalyzer.h" #include #include #include #include "core/arraysize.h" #include "core/logging.h" using Analyzer::Scope; const char* RainbowDashAnalyzer::kName = "Rainbow Dash"; const float RainbowDashAnalyzer::kPixelScale = 0.02f; RainbowDashAnalyzer::RainbowDashAnalyzer(QWidget* parent) : Analyzer::Base(parent, 9), dash_(":/rainbowdash.png"), timer_id_(startTimer(kFrameIntervalMs)), frame_(0), current_buffer_(0), available_rainbow_width_(0), px_per_frame_(0), x_offset_(0), background_brush_(QColor(0x0f, 0x43, 0x73)) { memset(history_, 0, sizeof(history_)); for (int i = 0; i < kRainbowBands; ++i) { colors_[i] = QPen(QColor::fromHsv(i * 255 / kRainbowBands, 255, 255), kRainbowHeight / kRainbowBands, Qt::SolidLine, Qt::FlatCap, Qt::RoundJoin); // pow constants computed so that // | band_scale(0) | ~= .5 and | band_scale(5) | ~= 32 band_scale_[i] = -std::cos(M_PI * i / (kRainbowBands - 1)) * 0.5 * std::pow(2.3, i); } } void RainbowDashAnalyzer::transform(Scope& s) { fht_->spectrum(&s.front()); } void RainbowDashAnalyzer::timerEvent(QTimerEvent* e) { if (e->timerId() == timer_id_) { frame_ = (frame_ + 1) % kDashFrameCount; } else { Analyzer::Base::timerEvent(e); } } void RainbowDashAnalyzer::resizeEvent(QResizeEvent* e) { // Invalidate the buffer so it's recreated from scratch in the next paint // event. buffer_[0] = QPixmap(); buffer_[1] = QPixmap(); available_rainbow_width_ = width() - kDashWidth + kRainbowOverlap; px_per_frame_ = static_cast(available_rainbow_width_) / (kHistorySize - 1) + 1; x_offset_ = px_per_frame_ * (kHistorySize - 1) - available_rainbow_width_; } void RainbowDashAnalyzer::analyze(QPainter& p, const Analyzer::Scope& s, bool new_frame) { // Discard the second half of the transform const int scope_size = s.size() / 2; if ((new_frame && is_playing_) || (buffer_[0].isNull() && buffer_[1].isNull())) { // Transform the music into rainbows! for (int band = 0; band < kRainbowBands; ++band) { float* band_start = history_ + band * kHistorySize; // Move the history of each band across by 1 frame. memmove(band_start, band_start + 1, (kHistorySize - 1) * sizeof(float)); } // Now accumulate the scope data into each band. Should maybe use a series // of band pass filters for this, so bands can leak into neighbouring bands, // but for now it's a series of separate square filters. const int samples_per_band = scope_size / kRainbowBands; int sample = 0; for (int band = 0; band < kRainbowBands; ++band) { float accumulator = 0.0; for (int i = 0; i < samples_per_band; ++i) { accumulator += s[sample++]; } history_[(band + 1) * kHistorySize - 1] = accumulator * band_scale_[band]; } // Create polylines for the rainbows. QPointF polyline[kRainbowBands * kHistorySize]; QPointF* dest = polyline; float* source = history_; const float top_of_Dash = static_cast(height()) / 2 - static_cast(kRainbowHeight) / 2; for (int band = 0; band < kRainbowBands; ++band) { // Calculate the Y position of this band. const float y = static_cast(kRainbowHeight) / (kRainbowBands + 1) * (band + 0.5) + top_of_Dash; // Add each point in the line. for (int x = 0; x < kHistorySize; ++x) { *dest = QPointF(px_per_frame_ * x, y + *source * kPixelScale); ++dest; ++source; } } // Do we have to draw the whole rainbow into the buffer? if (buffer_[0].isNull()) { for (int i = 0; i < 2; ++i) { buffer_[i] = QPixmap(QSize(width() + x_offset_, height())); buffer_[i].fill(background_brush_.color()); } current_buffer_ = 0; QPainter buffer_painter(&buffer_[0]); buffer_painter.setRenderHint(QPainter::Antialiasing); for (int band = kRainbowBands - 1; band >= 0; --band) { buffer_painter.setPen(colors_[band]); buffer_painter.drawPolyline(&polyline[band * kHistorySize], kHistorySize); buffer_painter.drawPolyline(&polyline[band * kHistorySize], kHistorySize); } } else { const int last_buffer = current_buffer_; current_buffer_ = (current_buffer_ + 1) % 2; // We can just shuffle the buffer along a bit and draw the new frame's // data. QPainter buffer_painter(&buffer_[current_buffer_]); buffer_painter.setRenderHint(QPainter::Antialiasing); buffer_painter.drawPixmap( 0, 0, buffer_[last_buffer], px_per_frame_, 0, x_offset_ + available_rainbow_width_ - px_per_frame_, 0); buffer_painter.fillRect( x_offset_ + available_rainbow_width_ - px_per_frame_, 0, kDashWidth - kRainbowOverlap + px_per_frame_, height(), background_brush_); for (int band = kRainbowBands - 1; band >= 0; --band) { buffer_painter.setPen(colors_[band]); buffer_painter.drawPolyline(&polyline[(band + 1) * kHistorySize - 3], 3); } } } // Draw the buffer on to the widget p.drawPixmap(0, 0, buffer_[current_buffer_], x_offset_, 0, 0, 0); if (!is_playing_) { // Ssshhh! p.drawPixmap(SleepingDashDestRect(), dash_, SleepingDashSourceRect()); } else { p.drawPixmap(DashDestRect(), dash_, DashSourceRect()); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/rainbowdashanalyzer.h000066400000000000000000000062401260417502300264100ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Alibek Omarov Copyright 2014-2015, Mark Furneaux Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ANALYZERS_RAINBOWDASHANALYZER_H_ #define ANALYZERS_RAINBOWDASHANALYZER_H_ #include "analyzerbase.h" #include class RainbowDashAnalyzer : public Analyzer::Base { Q_OBJECT public: Q_INVOKABLE RainbowDashAnalyzer(QWidget* parent); static const char* kName; protected: void transform(Analyzer::Scope&); void analyze(QPainter& p, const Analyzer::Scope&, bool new_frame); void timerEvent(QTimerEvent* e); void resizeEvent(QResizeEvent* e); private: static const int kDashHeight = 33; static const int kDashWidth = 53; static const int kRainbowHeight = 16; static const int kDashFrameCount = 16; static const int kRainbowOverlap = 15; static const int kSleepingDashHeight = 33; static const int kHistorySize = 128; static const int kRainbowBands = 6; static const float kPixelScale; static const int kFrameIntervalMs = 150; private: inline QRect DashSourceRect() const { return QRect(0, kDashHeight * frame_, kDashWidth, kDashHeight); } inline QRect SleepingDashSourceRect() const { return QRect(0, kDashHeight * kDashFrameCount, kDashWidth, kSleepingDashHeight); } inline QRect DashDestRect() const { return QRect(width() - kDashWidth, (height() - kDashHeight) / 2, kDashWidth, kDashHeight); } inline QRect SleepingDashDestRect() const { return QRect(width() - kDashWidth, (height() - kSleepingDashHeight) / 2, kDashWidth, kSleepingDashHeight); } private: // "constants" that get initialised in the constructor float band_scale_[kRainbowBands]; QPen colors_[kRainbowBands]; QPixmap dash_; // For the animation int timer_id_; int frame_; // The y positions of each point on the rainbow. float history_[kHistorySize * kRainbowBands]; // A cache of the last frame's rainbow, so it can be used in the next frame. QPixmap buffer_[2]; int current_buffer_; // Geometry information that's updated on resize: // The width of the widget minus the space for the pony int available_rainbow_width_; // X spacing between each point in the polyline. int px_per_frame_; // Amount the buffer_ is shifted to the left (off the edge of the widget) to // make the rainbow extend from 0 to available_rainbow_width_. int x_offset_; QBrush background_brush_; }; #endif // ANALYZERS_RAINBOWDASHANALYZER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/sonogram.cpp000066400000000000000000000070211260417502300245170ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2004, Melchior FRANZ Copyright 2009-2010, David Sansome Copyright 2010, 2014, John Maguire Copyright 2014-2015, Mark Furneaux Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ /* Original Author: Melchior FRANZ 2004 */ #include "sonogram.h" #include using Analyzer::Scope; const char* Sonogram::kName = QT_TRANSLATE_NOOP("AnalyzerContainer", "Sonogram"); Sonogram::Sonogram(QWidget* parent) : Analyzer::Base(parent, 9), scope_size_(128) {} Sonogram::~Sonogram() {} void Sonogram::resizeEvent(QResizeEvent* e) { QWidget::resizeEvent(e); // only for gcc < 4.0 #if !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 0)) resizeForBands(height() < 128 ? 128 : height()); #endif canvas_ = QPixmap(size()); canvas_.fill(palette().color(QPalette::Background)); updateBandSize(scope_size_); } void Sonogram::psychedelicModeChanged(bool enabled) { psychedelic_enabled_ = enabled; updateBandSize(scope_size_); } void Sonogram::analyze(QPainter& p, const Scope& s, bool new_frame) { if (!new_frame || engine_->state() == Engine::Paused) { p.drawPixmap(0, 0, canvas_); return; } int x = width() - 1; QColor c; QPainter canvas_painter(&canvas_); canvas_painter.drawPixmap(0, 0, canvas_, 1, 0, x, -1); Scope::const_iterator it = s.begin(), end = s.end(); if (scope_size_ != s.size()) { scope_size_ = s.size(); updateBandSize(scope_size_); } if (psychedelic_enabled_) { c = getPsychedelicColor(s, 20, 100); for (int y = height() - 1; y;) { if (it >= end || *it < .005) { c = palette().color(QPalette::Background); } else if (*it < .05) { c.setHsv(c.hue(), c.saturation(), 255 - static_cast(*it * 4000.0)); } else if (*it < 1.0) { c.setHsv((c.hue() + static_cast(*it * 90.0)) % 255, 255, 255); } else { c = getPsychedelicColor(s, 10, 50); } canvas_painter.setPen(c); canvas_painter.drawPoint(x, y--); if (it < end) ++it; } } else { for (int y = height() - 1; y;) { if (it >= end || *it < .005) c = palette().color(QPalette::Background); else if (*it < .05) c.setHsv(95, 255, 255 - static_cast(*it * 4000.0)); else if (*it < 1.0) c.setHsv(95 - static_cast(*it * 90.0), 255, 255); else c = Qt::red; canvas_painter.setPen(c); canvas_painter.drawPoint(x, y--); if (it < end) ++it; } } canvas_painter.end(); p.drawPixmap(0, 0, canvas_); } void Sonogram::transform(Scope& scope) { float* front = static_cast(&scope.front()); fht_->power2(front); fht_->scale(front, 1.0 / 256); scope.resize(fht_->size() / 2); } void Sonogram::demo(QPainter& p) { analyze(p, Scope(fht_->size(), 0), new_frame_); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/sonogram.h000066400000000000000000000030451260417502300241660ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2004, Melchior FRANZ Copyright 2009-2010, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Copyright 2015, Mark Furneaux Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ /* Original Author: Melchior FRANZ 2004 */ #ifndef ANALYZERS_SONOGRAM_H_ #define ANALYZERS_SONOGRAM_H_ #include "analyzerbase.h" #include "engines/enginebase.h" class Sonogram : public Analyzer::Base { Q_OBJECT public: Q_INVOKABLE Sonogram(QWidget*); ~Sonogram(); static const char* kName; protected: void analyze(QPainter& p, const Analyzer::Scope&, bool new_frame); void transform(Analyzer::Scope&); void demo(QPainter& p); void resizeEvent(QResizeEvent*); void psychedelicModeChanged(bool); QPixmap canvas_; int scope_size_; }; #endif // ANALYZERS_SONOGRAM_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/turbine.cpp000066400000000000000000000064671260417502300243570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2003, Stanislav Karchebny Copyright 2003, Max Howell Copyright 2009-2010, David Sansome Copyright 2014-2015, Mark Furneaux Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ /* Original Author: Stanislav Karchebny 2003 * Original Author: Max Howell 2003 */ #include #include #include "turbine.h" using Analyzer::Scope; const char* TurbineAnalyzer::kName = QT_TRANSLATE_NOOP("AnalyzerContainer", "Turbine"); void TurbineAnalyzer::analyze(QPainter& p, const Scope& scope, bool new_frame) { if (!new_frame) { p.drawPixmap(0, 0, canvas_); return; } float h; const uint hd2 = height() / 2; const uint kMaxHeight = hd2 - 1; QPainter canvas_painter(&canvas_); canvas_.fill(palette().color(QPalette::Background)); Analyzer::interpolate(scope, scope_); // update the graphics with the new colour if (psychedelic_enabled_) { paletteChange(QPalette()); } for (uint i = 0, x = 0, y; i < bands_; ++i, x += kColumnWidth + 1) { h = log10(scope_[i] * 256.0) * F_ * 0.5; if (h > kMaxHeight) h = kMaxHeight; if (h > bar_height_[i]) { bar_height_[i] = h; if (h > peak_height_[i]) { peak_height_[i] = h; peak_speed_[i] = 0.01; } else { goto peak_handling; } } else { if (bar_height_[i] > 0.0) { bar_height_[i] -= K_barHeight_; // 1.4 if (bar_height_[i] < 0.0) bar_height_[i] = 0.0; } peak_handling: if (peak_height_[i] > 0.0) { peak_height_[i] -= peak_speed_[i]; peak_speed_[i] *= F_peakSpeed_; // 1.12 if (peak_height_[i] < bar_height_[i]) peak_height_[i] = bar_height_[i]; if (peak_height_[i] < 0.0) peak_height_[i] = 0.0; } } y = hd2 - static_cast(bar_height_[i]); canvas_painter.drawPixmap(x + 1, y, barPixmap_, 0, y, -1, -1); canvas_painter.drawPixmap(x + 1, hd2, barPixmap_, 0, static_cast(bar_height_[i]), -1, -1); canvas_painter.setPen(fg_); if (bar_height_[i] > 0) canvas_painter.drawRect(x, y, kColumnWidth - 1, static_cast(bar_height_[i]) * 2 - 1); const uint x2 = x + kColumnWidth - 1; canvas_painter.setPen(palette().color(QPalette::Midlight)); y = hd2 - uint(peak_height_[i]); canvas_painter.drawLine(x, y, x2, y); y = hd2 + uint(peak_height_[i]); canvas_painter.drawLine(x, y, x2, y); } p.drawPixmap(0, 0, canvas_); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/analyzers/turbine.h000066400000000000000000000025061260417502300240120ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2003, Stanislav Karchebny Copyright 2009-2010, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ /* Original Author: Stanislav Karchebny 2003 */ #ifndef ANALYZERS_TURBINE_H_ #define ANALYZERS_TURBINE_H_ #include "boomanalyzer.h" class TurbineAnalyzer : public BoomAnalyzer { Q_OBJECT public: Q_INVOKABLE TurbineAnalyzer(QWidget* parent) : BoomAnalyzer(parent) {} void analyze(QPainter& p, const Analyzer::Scope&, bool new_frame); static const char* kName; }; #endif // ANALYZERS_TURBINE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/config.h.in000066400000000000000000000031141260417502300222000ustar00rootroot00000000000000/* This file is part of Clementine. Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CONFIG_H_IN #define CONFIG_H_IN #define CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" #define CMAKE_EXECUTABLE_SUFFIX "${CMAKE_EXECUTABLE_SUFFIX}" #cmakedefine ENABLE_VISUALISATIONS #cmakedefine HAVE_AMAZON_CLOUD_DRIVE #cmakedefine HAVE_AUDIOCD #cmakedefine HAVE_BOX #cmakedefine HAVE_BREAKPAD #cmakedefine HAVE_CRYPTOPP #cmakedefine HAVE_DBUS #cmakedefine HAVE_DEVICEKIT #cmakedefine HAVE_DROPBOX #cmakedefine HAVE_GIO #cmakedefine HAVE_GOOGLE_DRIVE #cmakedefine HAVE_LIBGPOD #cmakedefine HAVE_LIBLASTFM #cmakedefine HAVE_LIBLASTFM1 #cmakedefine HAVE_LIBMTP #cmakedefine HAVE_LIBPULSE #cmakedefine HAVE_MOODBAR #cmakedefine HAVE_SEAFILE #cmakedefine HAVE_SKYDRIVE #cmakedefine HAVE_SPARKLE #cmakedefine HAVE_SPOTIFY_DOWNLOADER #cmakedefine HAVE_VK #cmakedefine HAVE_WIIMOTEDEV #cmakedefine TAGLIB_HAS_OPUS #cmakedefine USE_INSTALL_PREFIX #cmakedefine USE_SYSTEM_PROJECTM #cmakedefine USE_SYSTEM_SHA2 #endif // CONFIG_H_IN clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/000077500000000000000000000000001260417502300211065ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/appearance.cpp000066400000000000000000000051671260417502300237220ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, Arnaud Bienner Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "appearance.h" #include #include const char* Appearance::kSettingsGroup = "Appearance"; const char* Appearance::kUseCustomColorSet = "use-custom-set"; const char* Appearance::kForegroundColor = "foreground-color"; const char* Appearance::kBackgroundColor = "background-color"; const QPalette Appearance::kDefaultPalette = QPalette(); Appearance::Appearance(QObject* parent) : QObject(parent) { QSettings s; s.beginGroup(kSettingsGroup); QPalette p = QApplication::palette(); background_color_ = s.value(kBackgroundColor, p.color(QPalette::WindowText)).value(); foreground_color_ = s.value(kForegroundColor, p.color(QPalette::Window)).value(); } void Appearance::LoadUserTheme() { QSettings s; s.beginGroup(kSettingsGroup); bool use_a_custom_color_set = s.value(kUseCustomColorSet).toBool(); if (!use_a_custom_color_set) return; ChangeForegroundColor(foreground_color_); ChangeBackgroundColor(background_color_); } void Appearance::ResetToSystemDefaultTheme() { QApplication::setPalette(kDefaultPalette); } void Appearance::ChangeForegroundColor(const QColor& color) { // Get the application palette QPalette p = QApplication::palette(); // Modify the palette p.setColor(QPalette::WindowText, color); p.setColor(QPalette::Text, color); // Make the modified palette the new application's palette QApplication::setPalette(p); foreground_color_ = color; } void Appearance::ChangeBackgroundColor(const QColor& color) { // Get the application palette QPalette p = QApplication::palette(); // Modify the palette p.setColor(QPalette::Window, color); p.setColor(QPalette::Base, color); // Make the modified palette the new application's palette QApplication::setPalette(p); background_color_ = color; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/appearance.h000066400000000000000000000031331260417502300233560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, Arnaud Bienner Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_APPEARANCE_H_ #define CORE_APPEARANCE_H_ #include #include class Appearance : public QObject { public: explicit Appearance(QObject* parent = nullptr); // Load the user preferred theme, which could the default system theme or a // custom set of colors that user has chosen void LoadUserTheme(); void ResetToSystemDefaultTheme(); void ChangeForegroundColor(const QColor& color); void ChangeBackgroundColor(const QColor& color); static const char* kSettingsGroup; static const char* kUseCustomColorSet; static const char* kForegroundColor; static const char* kBackgroundColor; static const QPalette kDefaultPalette; private: QColor foreground_color_; QColor background_color_; }; #endif // CORE_APPEARANCE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/application.cpp000066400000000000000000000143341260417502300241220ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012-2013, Andreas Copyright 2012, David Sansome Copyright 2012, Marti Raudsepp Copyright 2012, 2014, John Maguire Copyright 2013, Arnaud Bienner Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "application.h" #include "appearance.h" #include "config.h" #include "database.h" #include "player.h" #include "tagreaderclient.h" #include "taskmanager.h" #include "covers/albumcoverloader.h" #include "covers/coverproviders.h" #include "covers/currentartloader.h" #include "devices/devicemanager.h" #include "internet/core/internetmodel.h" #include "globalsearch/globalsearch.h" #include "library/library.h" #include "library/librarybackend.h" #include "networkremote/networkremote.h" #include "networkremote/networkremotehelper.h" #include "playlist/playlistbackend.h" #include "playlist/playlistmanager.h" #include "internet/podcasts/gpoddersync.h" #include "internet/podcasts/podcastbackend.h" #include "internet/podcasts/podcastdeleter.h" #include "internet/podcasts/podcastdownloader.h" #include "internet/podcasts/podcastupdater.h" #ifdef HAVE_LIBLASTFM #include "internet/lastfm/lastfmservice.h" #endif // HAVE_LIBLASTFM #ifdef HAVE_MOODBAR #include "moodbar/moodbarcontroller.h" #include "moodbar/moodbarloader.h" #endif bool Application::kIsPortable = false; Application::Application(QObject* parent) : QObject(parent), tag_reader_client_(nullptr), database_(nullptr), album_cover_loader_(nullptr), playlist_backend_(nullptr), podcast_backend_(nullptr), appearance_(nullptr), cover_providers_(nullptr), task_manager_(nullptr), player_(nullptr), playlist_manager_(nullptr), current_art_loader_(nullptr), global_search_(nullptr), internet_model_(nullptr), library_(nullptr), device_manager_(nullptr), podcast_updater_(nullptr), podcast_deleter_(nullptr), podcast_downloader_(nullptr), gpodder_sync_(nullptr), moodbar_loader_(nullptr), moodbar_controller_(nullptr), network_remote_(nullptr), network_remote_helper_(nullptr), scrobbler_(nullptr) { tag_reader_client_ = new TagReaderClient(this); MoveToNewThread(tag_reader_client_); tag_reader_client_->Start(); database_ = new Database(this, this); MoveToNewThread(database_); album_cover_loader_ = new AlbumCoverLoader(this); MoveToNewThread(album_cover_loader_); playlist_backend_ = new PlaylistBackend(this, this); MoveToThread(playlist_backend_, database_->thread()); podcast_backend_ = new PodcastBackend(this, this); MoveToThread(podcast_backend_, database_->thread()); appearance_ = new Appearance(this); cover_providers_ = new CoverProviders(this); task_manager_ = new TaskManager(this); player_ = new Player(this, this); playlist_manager_ = new PlaylistManager(this, this); current_art_loader_ = new CurrentArtLoader(this, this); global_search_ = new GlobalSearch(this, this); internet_model_ = new InternetModel(this, this); library_ = new Library(this, this); device_manager_ = new DeviceManager(this, this); podcast_updater_ = new PodcastUpdater(this, this); podcast_deleter_ = new PodcastDeleter(this, this); MoveToNewThread(podcast_deleter_); podcast_downloader_ = new PodcastDownloader(this, this); gpodder_sync_ = new GPodderSync(this, this); #ifdef HAVE_MOODBAR moodbar_loader_ = new MoodbarLoader(this, this); moodbar_controller_ = new MoodbarController(this, this); #endif // Network Remote network_remote_ = new NetworkRemote(this); MoveToNewThread(network_remote_); // This must be before libraray_->Init(); // In the constructor the helper waits for the signal // PlaylistManagerInitialized // to start the remote. Without the playlist manager clementine can // crash when a client connects before the manager is initialized! network_remote_helper_ = new NetworkRemoteHelper(this); #ifdef HAVE_LIBLASTFM scrobbler_ = new LastFMService(this, this); #endif // HAVE_LIBLASTFM library_->Init(); DoInAMinuteOrSo(database_, SLOT(DoBackup())); } Application::~Application() { // It's important that the device manager is deleted before the database. // Deleting the database deletes all objects that have been created in its // thread, including some device library backends. delete device_manager_; device_manager_ = nullptr; for (QObject* object : objects_in_threads_) { object->deleteLater(); } for (QThread* thread : threads_) { thread->quit(); } for (QThread* thread : threads_) { thread->wait(); } } void Application::MoveToNewThread(QObject* object) { QThread* thread = new QThread(this); MoveToThread(object, thread); thread->start(); threads_ << thread; } void Application::MoveToThread(QObject* object, QThread* thread) { object->setParent(nullptr); object->moveToThread(thread); objects_in_threads_ << object; } void Application::AddError(const QString& message) { emit ErrorAdded(message); } QString Application::language_without_region() const { const int underscore = language_name_.indexOf('_'); if (underscore != -1) { return language_name_.left(underscore); } return language_name_; } LibraryBackend* Application::library_backend() const { return library()->backend(); } LibraryModel* Application::library_model() const { return library()->model(); } void Application::ReloadSettings() { emit SettingsChanged(); } void Application::OpenSettingsDialogAtPage(SettingsDialog::Page page) { emit SettingsDialogRequested(page); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/application.h000066400000000000000000000117531260417502300235710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012-2013, Andreas Copyright 2012-2013, David Sansome Copyright 2013, Arnaud Bienner Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_APPLICATION_H_ #define CORE_APPLICATION_H_ #include "ui/settingsdialog.h" #include class AlbumCoverLoader; class Appearance; class CoverProviders; class CurrentArtLoader; class Database; class DeviceManager; class GlobalSearch; class GPodderSync; class InternetModel; class Library; class LibraryBackend; class LibraryModel; class MoodbarController; class MoodbarLoader; class NetworkRemote; class NetworkRemoteHelper; class Player; class PlaylistBackend; class PodcastDeleter; class PodcastDownloader; class PlaylistManager; class PodcastBackend; class PodcastUpdater; class Scrobbler; class TagReaderClient; class TaskManager; class Application : public QObject { Q_OBJECT public: static bool kIsPortable; explicit Application(QObject* parent = nullptr); ~Application(); const QString& language_name() const { return language_name_; } // Same as language_name, but remove the region code at the end if there is // one QString language_without_region() const; void set_language_name(const QString& name) { language_name_ = name; } TagReaderClient* tag_reader_client() const { return tag_reader_client_; } Database* database() const { return database_; } AlbumCoverLoader* album_cover_loader() const { return album_cover_loader_; } PlaylistBackend* playlist_backend() const { return playlist_backend_; } PodcastBackend* podcast_backend() const { return podcast_backend_; } Appearance* appearance() const { return appearance_; } CoverProviders* cover_providers() const { return cover_providers_; } TaskManager* task_manager() const { return task_manager_; } Player* player() const { return player_; } PlaylistManager* playlist_manager() const { return playlist_manager_; } CurrentArtLoader* current_art_loader() const { return current_art_loader_; } GlobalSearch* global_search() const { return global_search_; } InternetModel* internet_model() const { return internet_model_; } Library* library() const { return library_; } DeviceManager* device_manager() const { return device_manager_; } PodcastUpdater* podcast_updater() const { return podcast_updater_; } PodcastDeleter* podcast_deleter() const { return podcast_deleter_; } PodcastDownloader* podcast_downloader() const { return podcast_downloader_; } GPodderSync* gpodder_sync() const { return gpodder_sync_; } MoodbarLoader* moodbar_loader() const { return moodbar_loader_; } MoodbarController* moodbar_controller() const { return moodbar_controller_; } NetworkRemote* network_remote() const { return network_remote_; } NetworkRemoteHelper* network_remote_helper() const { return network_remote_helper_; } Scrobbler* scrobbler() const { return scrobbler_; } LibraryBackend* library_backend() const; LibraryModel* library_model() const; void MoveToNewThread(QObject* object); void MoveToThread(QObject* object, QThread* thread); public slots: void AddError(const QString& message); void ReloadSettings(); void OpenSettingsDialogAtPage(SettingsDialog::Page page); signals: void ErrorAdded(const QString& message); void SettingsChanged(); void SettingsDialogRequested(SettingsDialog::Page page); private: QString language_name_; TagReaderClient* tag_reader_client_; Database* database_; AlbumCoverLoader* album_cover_loader_; PlaylistBackend* playlist_backend_; PodcastBackend* podcast_backend_; Appearance* appearance_; CoverProviders* cover_providers_; TaskManager* task_manager_; Player* player_; PlaylistManager* playlist_manager_; CurrentArtLoader* current_art_loader_; GlobalSearch* global_search_; InternetModel* internet_model_; Library* library_; DeviceManager* device_manager_; PodcastUpdater* podcast_updater_; PodcastDeleter* podcast_deleter_; PodcastDownloader* podcast_downloader_; GPodderSync* gpodder_sync_; MoodbarLoader* moodbar_loader_; MoodbarController* moodbar_controller_; NetworkRemote* network_remote_; NetworkRemoteHelper* network_remote_helper_; Scrobbler* scrobbler_; QList objects_in_threads_; QList threads_; }; #endif // CORE_APPLICATION_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/backgroundstreams.cpp000066400000000000000000000122701260417502300253320ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, 2013, David Sansome Copyright 2010, 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "backgroundstreams.h" #include #include #include #include "core/logging.h" #include "engines/enginebase.h" const char* BackgroundStreams::kSettingsGroup = "BackgroundStreams"; const char* BackgroundStreams::kHypnotoadUrl = "hypnotoad:///"; const char* BackgroundStreams::kRainUrl = "http://data.clementine-player.org/rainymood"; const char* BackgroundStreams::kEnterpriseUrl = "enterprise:///"; BackgroundStreams::BackgroundStreams(EngineBase* engine, QObject* parent) : QObject(parent), engine_(engine) {} BackgroundStreams::~BackgroundStreams() { SaveStreams(); } void BackgroundStreams::LoadStreams() { QSettings s; s.beginGroup(kSettingsGroup); int version = s.value("version", 0).toInt(); if (version < 1) { AddStream(QT_TR_NOOP("Hypnotoad"), QUrl(kHypnotoadUrl)); AddStream(QT_TR_NOOP("Rain"), QUrl(kRainUrl)); } if (version < kVersion) { s.setValue("version", kVersion); AddStream(QT_TR_NOOP("Make it so!"), QUrl(kEnterpriseUrl)); } int size = s.beginReadArray("streams"); for (int i = 0; i < size; ++i) { s.setArrayIndex(i); AddStream(s.value("name").toString(), s.value("url").toUrl(), s.value("volume").toInt()); } SaveStreams(); } void BackgroundStreams::SaveStreams() { QSettings s; s.beginGroup(kSettingsGroup); QList values = streams_.values(); s.beginWriteArray("streams"); for (int i = 0; i < values.size(); ++i) { s.setArrayIndex(i); Stream* stream = values[i]; s.setValue("name", stream->name); s.setValue("url", stream->url); s.setValue("volume", stream->volume); } s.endArray(); } void BackgroundStreams::AddStream(const QString& name, const QUrl& url, int volume) { if (streams_.contains(name)) { return; } Stream* s = new Stream; s->name = name; s->url = url; s->volume = volume; s->id = -1; streams_[name] = s; } void BackgroundStreams::EnableStream(const QString& name, bool enable) { if (!streams_.contains(name)) { qLog(Warning) << "Tried to toggle a stream" << name << "which didn't exist"; return; } Stream* stream = streams_[name]; if (enable == (stream->id != -1)) { return; } if (enable) { PlayStream(stream); } else { StopStream(stream); } SaveStreams(); } void BackgroundStreams::SetStreamVolume(const QString& name, int volume) { Stream* stream = streams_[name]; stream->volume = volume; if (stream->id != -1) { engine_->SetBackgroundStreamVolume(stream->id, stream->volume); } } void BackgroundStreams::PlayStream(Stream* stream) { stream->id = engine_->AddBackgroundStream(stream->url); engine_->SetBackgroundStreamVolume(stream->id, stream->volume); emit StreamStarted(stream->name); if (stream->action) { stream->action->setChecked(true); } } void BackgroundStreams::StopStream(Stream* stream) { engine_->StopBackgroundStream(stream->id); stream->id = -1; emit StreamStopped(stream->name); if (stream->action) { stream->action->setChecked(false); } } int BackgroundStreams::GetStreamVolume(const QString& name) const { return streams_[name]->volume; } bool BackgroundStreams::IsPlaying(const QString& name) const { return streams_[name]->id != -1; } void BackgroundStreams::AddAction(const QString& name, QAction* action) { if (!streams_.contains(name)) { qLog(Error) << "Tried to add action for stream" << name << "which doesn't exist"; return; } Stream* stream = streams_[name]; if (stream->action) { qLog(Error) << "Tried to add multiple actions for stream" << name; return; } stream->action = action; action->setChecked(IsPlaying(name)); connect(action, SIGNAL(toggled(bool)), SLOT(StreamActionToggled(bool))); connect(action, SIGNAL(destroyed()), SLOT(StreamActionDestroyed())); } void BackgroundStreams::StreamActionDestroyed() { QAction* action = static_cast(sender()); if (!action) { return; } for (Stream* stream : streams_.values()) { if (stream->action == action) { stream->action = nullptr; } } } void BackgroundStreams::StreamActionToggled(bool checked) { QAction* action = static_cast(sender()); if (!action) { return; } for (Stream* stream : streams_.values()) { if (stream->action == action) { EnableStream(stream->name, checked); } } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/backgroundstreams.h000066400000000000000000000045071260417502300250030ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, 2013, David Sansome Copyright 2010, 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_BACKGROUNDSTREAMS_H_ #define CORE_BACKGROUNDSTREAMS_H_ #include #include #include #include #include "engines/engine_fwd.h" class QAction; class BackgroundStreams : public QObject { Q_OBJECT public: explicit BackgroundStreams(EngineBase* engine, QObject* parent = nullptr); ~BackgroundStreams(); void LoadStreams(); void SaveStreams(); QStringList streams() const { return streams_.keys(); } void EnableStream(const QString& name, bool enable); void SetStreamVolume(const QString& name, int volume); int GetStreamVolume(const QString& name) const; bool IsPlaying(const QString& name) const; void AddAction(const QString& name, QAction* action); signals: void StreamStarted(const QString& name); void StreamStopped(const QString& name); private slots: void StreamActionToggled(bool checked); void StreamActionDestroyed(); private: struct Stream { Stream() : volume(0), id(0), action(nullptr) {} QString name; QUrl url; int volume; int id; QAction* action; }; void AddStream(const QString& name, const QUrl& url, int volume = 50); void PlayStream(Stream* stream); void StopStream(Stream* stream); EngineBase* engine_; QMap streams_; static const char* kSettingsGroup; static const int kVersion = 2; static const char* kHypnotoadUrl; static const char* kRainUrl; static const char* kEnterpriseUrl; }; #endif // CORE_BACKGROUNDSTREAMS_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/boundfuturewatcher.h000066400000000000000000000024271260417502300252040ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_BOUNDFUTUREWATCHER_H_ #define CORE_BOUNDFUTUREWATCHER_H_ #include #include template class BoundFutureWatcher : public QFutureWatcher, boost::noncopyable { public: explicit BoundFutureWatcher(const D& data, QObject* parent = nullptr) : QFutureWatcher(parent), data_(data) {} ~BoundFutureWatcher() {} const D& data() const { return data_; } private: D data_; }; #endif // CORE_BOUNDFUTUREWATCHER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/cachedlist.h000066400000000000000000000060211260417502300233610ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, 2013, David Sansome Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_CACHEDLIST_H_ #define CORE_CACHEDLIST_H_ #include #include template class CachedList { public: // Use a CachedList when you want to download and save a list of things from a // remote service, updating it only periodically. // T must be a registered metatype and must support being stored in // QSettings. This usually means you have to implement QDataStream streaming // operators, and use qRegisterMetaTypeStreamOperators. typedef QList ListType; CachedList(const QString& settings_group, const QString& name, int cache_duration_secs) : settings_group_(settings_group), name_(name), cache_duration_secs_(cache_duration_secs) {} void Load() { QSettings s; s.beginGroup(settings_group_); last_updated_ = s.value("last_refreshed_" + name_).toDateTime(); data_.clear(); const int count = s.beginReadArray(name_ + "_data"); for (int i = 0; i < count; ++i) { s.setArrayIndex(i); data_ << s.value("value").value(); } s.endArray(); } void Save() const { QSettings s; s.beginGroup(settings_group_); s.setValue("last_refreshed_" + name_, last_updated_); s.beginWriteArray(name_ + "_data", data_.size()); for (int i = 0; i < data_.size(); ++i) { s.setArrayIndex(i); s.setValue("value", QVariant::fromValue(data_[i])); } s.endArray(); } void Update(const ListType& data) { data_ = data; last_updated_ = QDateTime::currentDateTime(); Save(); } bool IsStale() const { return last_updated_.isNull() || last_updated_.secsTo(QDateTime::currentDateTime()) > cache_duration_secs_; } void Sort() { qSort(data_); } const ListType& Data() const { return data_; } operator ListType() const { return data_; } // Q_FOREACH support typedef typename ListType::const_iterator const_iterator; const_iterator begin() const { return data_.begin(); } const_iterator end() const { return data_.end(); } private: const QString settings_group_; const QString name_; const int cache_duration_secs_; QDateTime last_updated_; ListType data_; }; #endif // CORE_CACHEDLIST_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/commandlineoptions.cpp000066400000000000000000000253271260417502300255250ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, 2012, David Sansome Copyright 2010-2012, 2014, John Maguire Copyright 2012, Arnaud Bienner Copyright 2013, Kevin Cox Copyright 2013, Mateusz Kowalczyk Copyright 2014, Alexander Bikadorov Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "config.h" #include "commandlineoptions.h" #include "version.h" #include "core/logging.h" #include #include #include #include #include #include const char* CommandlineOptions::kHelpText = "%1: clementine [%2] [%3]\n" "\n" "%4:\n" " -p, --play %5\n" " -t, --play-pause %6\n" " -u, --pause %7\n" " -s, --stop %8\n" " -r, --previous %9\n" " -f, --next %10\n" " -v, --volume %11\n" " --volume-up %12\n" " --volume-down %13\n" " --volume-increase-by %14\n" " --volume-decrease-by %15\n" " --seek-to %16\n" " --seek-by %17\n" " --restart-or-previous %18\n" "\n" "%19:\n" " -a, --append %20\n" " -l, --load %21\n" " -k, --play-track %22\n" "\n" "%23:\n" " -o, --show-osd %24\n" " -y, --toggle-pretty-osd %25\n" " -g, --language %26\n" " --quiet %27\n" " --verbose %28\n" " --log-levels %29\n" " --version %30\n"; const char* CommandlineOptions::kVersionText = "Clementine %1"; CommandlineOptions::CommandlineOptions(int argc, char** argv) : argc_(argc), argv_(argv), url_list_action_(UrlList_None), player_action_(Player_None), set_volume_(-1), volume_modifier_(0), seek_to_(-1), seek_by_(0), play_track_at_(-1), show_osd_(false), toggle_pretty_osd_(false), log_levels_(logging::kDefaultLogLevels) { #ifdef Q_OS_DARWIN // Remove -psn_xxx option that Mac passes when opened from Finder. RemoveArg("-psn", 1); #endif // Remove the -session option that KDE passes RemoveArg("-session", 2); } void CommandlineOptions::RemoveArg(const QString& starts_with, int count) { for (int i = 0; i < argc_; ++i) { QString opt(argv_[i]); if (opt.startsWith(starts_with)) { for (int j = i; j < argc_ - count + 1; ++j) { argv_[j] = argv_[j + count]; } argc_ -= count; break; } } } bool CommandlineOptions::Parse() { static const struct option kOptions[] = { {"help", no_argument, 0, 'h'}, {"play", no_argument, 0, 'p'}, {"play-pause", no_argument, 0, 't'}, {"pause", no_argument, 0, 'u'}, {"stop", no_argument, 0, 's'}, {"previous", no_argument, 0, 'r'}, {"next", no_argument, 0, 'f'}, {"volume", required_argument, 0, 'v'}, {"volume-up", no_argument, 0, VolumeUp}, {"volume-down", no_argument, 0, VolumeDown}, {"volume-increase-by", required_argument, 0, VolumeIncreaseBy}, {"volume-decrease-by", required_argument, 0, VolumeDecreaseBy}, {"seek-to", required_argument, 0, SeekTo}, {"seek-by", required_argument, 0, SeekBy}, {"restart-or-previous", no_argument, 0, RestartOrPrevious}, {"append", no_argument, 0, 'a'}, {"load", no_argument, 0, 'l'}, {"play-track", required_argument, 0, 'k'}, {"show-osd", no_argument, 0, 'o'}, {"toggle-pretty-osd", no_argument, 0, 'y'}, {"language", required_argument, 0, 'g'}, {"quiet", no_argument, 0, Quiet}, {"verbose", no_argument, 0, Verbose}, {"log-levels", required_argument, 0, LogLevels}, {"version", no_argument, 0, Version}, {0, 0, 0, 0}}; // Parse the arguments bool ok = false; forever { int c = getopt_long(argc_, argv_, "hptusrfv:alk:oyg:", kOptions, nullptr); // End of the options if (c == -1) break; switch (c) { case 'h': { QString translated_help_text = QString(kHelpText) .arg(tr("Usage"), tr("options"), tr("URL(s)"), tr("Player options"), tr("Start the playlist currently playing"), tr("Play if stopped, pause if playing"), tr("Pause playback"), tr("Stop playback"), tr("Skip backwards in playlist")) .arg(tr("Skip forwards in playlist"), tr("Set the volume to percent"), tr("Increase the volume by 4%"), tr("Decrease the volume by 4%"), tr("Increase the volume by percent"), tr("Decrease the volume by percent")) .arg(tr("Seek the currently playing track to an absolute " "position"), tr("Seek the currently playing track by a relative " "amount"), tr("Restart the track, or play the previous track if " "within 8 seconds of start."), tr("Playlist options"), tr("Append files/URLs to the playlist"), tr("Loads files/URLs, replacing current playlist"), tr("Play the th track in the playlist")) .arg(tr("Other options"), tr("Display the on-screen-display"), tr("Toggle visibility for the pretty on-screen-display"), tr("Change the language"), tr("Equivalent to --log-levels *:1"), tr("Equivalent to --log-levels *:3"), tr("Comma separated list of class:level, level is 0-3")) .arg(tr("Print out version information")); std::cout << translated_help_text.toLocal8Bit().constData(); return false; } case 'p': player_action_ = Player_Play; break; case 't': player_action_ = Player_PlayPause; break; case 'u': player_action_ = Player_Pause; break; case 's': player_action_ = Player_Stop; break; case 'r': player_action_ = Player_Previous; break; case 'f': player_action_ = Player_Next; break; case 'a': url_list_action_ = UrlList_Append; break; case 'l': url_list_action_ = UrlList_Load; break; case 'o': show_osd_ = true; break; case 'y': toggle_pretty_osd_ = true; break; case 'g': language_ = QString(optarg); break; case VolumeUp: volume_modifier_ = +4; break; case VolumeDown: volume_modifier_ = -4; break; case Quiet: log_levels_ = "1"; break; case Verbose: log_levels_ = "3"; break; case LogLevels: log_levels_ = QString(optarg); break; case Version: { QString version_text = QString(kVersionText).arg(CLEMENTINE_VERSION_DISPLAY); std::cout << version_text.toLocal8Bit().constData() << std::endl; std::exit(0); } case 'v': set_volume_ = QString(optarg).toInt(&ok); if (!ok) set_volume_ = -1; break; case VolumeIncreaseBy: volume_modifier_ = QString(optarg).toInt(&ok); if (!ok) volume_modifier_ = 0; break; case VolumeDecreaseBy: volume_modifier_ = -QString(optarg).toInt(&ok); if (!ok) volume_modifier_ = 0; break; case SeekTo: seek_to_ = QString(optarg).toInt(&ok); if (!ok) seek_to_ = -1; break; case SeekBy: seek_by_ = QString(optarg).toInt(&ok); if (!ok) seek_by_ = 0; break; case RestartOrPrevious: player_action_ = Player_RestartOrPrevious; break; case 'k': play_track_at_ = QString(optarg).toInt(&ok); if (!ok) play_track_at_ = -1; break; case '?': default: return false; } } // Get any filenames or URLs following the arguments for (int i = optind; i < argc_; ++i) { QString value = QFile::decodeName(argv_[i]); QFileInfo file_info(value); if (file_info.exists()) urls_ << QUrl::fromLocalFile(file_info.canonicalFilePath()); else urls_ << QUrl::fromUserInput(value); } return true; } bool CommandlineOptions::is_empty() const { return player_action_ == Player_None && set_volume_ == -1 && volume_modifier_ == 0 && seek_to_ == -1 && seek_by_ == 0 && play_track_at_ == -1 && show_osd_ == false && toggle_pretty_osd_ == false && urls_.isEmpty(); } QByteArray CommandlineOptions::Serialize() const { QBuffer buf; buf.open(QIODevice::WriteOnly); QDataStream s(&buf); s << *this; buf.close(); return buf.data(); } void CommandlineOptions::Load(const QByteArray& serialized) { QByteArray copy(serialized); QBuffer buf(©); buf.open(QIODevice::ReadOnly); QDataStream s(&buf); s >> *this; } QString CommandlineOptions::tr(const char* source_text) { return QObject::tr(source_text); } QDataStream& operator<<(QDataStream& s, const CommandlineOptions& a) { s << qint32(a.player_action_) << qint32(a.url_list_action_) << a.set_volume_ << a.volume_modifier_ << a.seek_to_ << a.seek_by_ << a.play_track_at_ << a.show_osd_ << a.urls_ << a.log_levels_ << a.toggle_pretty_osd_; return s; } QDataStream& operator>>(QDataStream& s, CommandlineOptions& a) { quint32 player_action = 0; quint32 url_list_action = 0; s >> player_action >> url_list_action >> a.set_volume_ >> a.volume_modifier_ >> a.seek_to_ >> a.seek_by_ >> a.play_track_at_ >> a.show_osd_ >> a.urls_ >> a.log_levels_ >> a.toggle_pretty_osd_; a.player_action_ = CommandlineOptions::PlayerAction(player_action); a.url_list_action_ = CommandlineOptions::UrlListAction(url_list_action); return s; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/commandlineoptions.h000066400000000000000000000071731260417502300251710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, David Sansome Copyright 2011, John Maguire Copyright 2011, Andrea Decorte Copyright 2013, Kevin Cox Copyright 2013, Mateusz Kowalczyk Copyright 2014, Alexander Bikadorov Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_COMMANDLINEOPTIONS_H_ #define CORE_COMMANDLINEOPTIONS_H_ #include #include #include class CommandlineOptions { friend QDataStream& operator<<(QDataStream& s, const CommandlineOptions& a); friend QDataStream& operator>>(QDataStream& s, CommandlineOptions& a); public: explicit CommandlineOptions(int argc = 0, char* *argv = nullptr); static const char* kHelpText; static const char* kVersionText; // Don't change the values or order, these get serialised and sent to // possibly a different version of Clementine enum UrlListAction { UrlList_Append = 0, UrlList_Load = 1, UrlList_None = 2, }; enum PlayerAction { Player_None = 0, Player_Play = 1, Player_PlayPause = 2, Player_Pause = 3, Player_Stop = 4, Player_Previous = 5, Player_Next = 6, Player_RestartOrPrevious = 7, }; bool Parse(); bool is_empty() const; UrlListAction url_list_action() const { return url_list_action_; } PlayerAction player_action() const { return player_action_; } int set_volume() const { return set_volume_; } int volume_modifier() const { return volume_modifier_; } int seek_to() const { return seek_to_; } int seek_by() const { return seek_by_; } int play_track_at() const { return play_track_at_; } bool show_osd() const { return show_osd_; } bool toggle_pretty_osd() const { return toggle_pretty_osd_; } QList urls() const { return urls_; } QString language() const { return language_; } QString log_levels() const { return log_levels_; } QByteArray Serialize() const; void Load(const QByteArray& serialized); private: // These are "invalid" characters to pass to getopt_long for options that // shouldn't have a short (single character) option. enum LongOptions { VolumeUp = 256, VolumeDown, SeekTo, SeekBy, Quiet, Verbose, LogLevels, Version, VolumeIncreaseBy, VolumeDecreaseBy, RestartOrPrevious }; QString tr(const char* source_text); void RemoveArg(const QString& starts_with, int count); private: int argc_; char** argv_; UrlListAction url_list_action_; PlayerAction player_action_; // Don't change the type of these. int set_volume_; int volume_modifier_; int seek_to_; int seek_by_; int play_track_at_; bool show_osd_; bool toggle_pretty_osd_; QString language_; QString log_levels_; QList urls_; }; QDataStream& operator<<(QDataStream& s, const CommandlineOptions& a); QDataStream& operator>>(QDataStream& s, CommandlineOptions& a); #endif // CORE_COMMANDLINEOPTIONS_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/crashreporting.cpp000066400000000000000000000142011260417502300246420ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Copyright 2011, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "config.h" #include "crashreporting.h" #include "core/logging.h" #include #include #include #include #include #include #include #include #include #include #if defined(HAVE_BREAKPAD) and defined(Q_OS_LINUX) #include "client/linux/handler/exception_handler.h" #include "third_party/lss/linux_syscall_support.h" #endif const char* CrashSender::kUploadURL = "http://crashes.clementine-player.org/getuploadurl"; const char* CrashReporting::kSendCrashReportOption = "--send-crash-report"; char* CrashReporting::sPath = nullptr; #if defined(HAVE_BREAKPAD) and defined(Q_OS_LINUX) CrashReporting::CrashReporting() : handler_(new google_breakpad::ExceptionHandler( QDir::tempPath().toLocal8Bit().constData(), nullptr, CrashReporting::Handler, this, true)) {} CrashReporting::~CrashReporting() {} bool CrashReporting::SendCrashReport(int argc, char** argv) { if (argc != 4 || strcmp(argv[1], kSendCrashReportOption) != 0) { return false; } QApplication a(argc, argv); CrashSender sender(QString("%1/%2.dmp").arg(argv[2], argv[3])); if (sender.Start()) { a.exec(); } return true; } void CrashReporting::SetApplicationPath(const QString& path) { sPath = strdup(path.toLocal8Bit().constData()); } void CrashReporting::Print(const char* message) { if (message) { sys_write(1, message, strlen(message)); } } bool CrashReporting::Handler(const char* dump_path, const char* minidump_id, void* context, bool succeeded) { Print("Clementine has crashed! A crash report has been saved to:\n "); Print(dump_path); Print("/"); Print(minidump_id); Print( "\n\nPlease send this to the developers so they can fix the problem:\n" " http://code.google.com/p/clementine-player/issues/entry\n\n"); if (sPath) { // We know the path to clementine, so exec it again to prompt the user to // upload the report. const char* argv[] = {sPath, kSendCrashReportOption, dump_path, minidump_id, nullptr}; sys_execv(sPath, argv); } return true; } CrashSender::CrashSender(const QString& path) : network_(new QNetworkAccessManager(this)), path_(path), file_(new QFile(path_, this)), progress_(nullptr) {} bool CrashSender::Start() { if (!file_->open(QIODevice::ReadOnly)) { qLog(Warning) << "Failed to open crash report" << path_; return false; } // No tr() here. QMessageBox prompt(QMessageBox::Critical, "Clementine has crashed!", QString( "A crash report has been created and saved to '%1'. " "With your permission " "it can be automatically sent to our server so the " "developers can find " "out what happened.").arg(path_)); prompt.addButton("Don't send", QMessageBox::RejectRole); prompt.addButton("Send crash report", QMessageBox::AcceptRole); if (prompt.exec() == QDialog::Rejected) { return false; } progress_ = new QProgressDialog("Uploading crash report", "Cancel", 0, 0); progress_->show(); // We'll get a redirect first, so don't start POSTing data yet. QNetworkReply* reply = network_->get(QNetworkRequest(QUrl(kUploadURL))); connect(reply, SIGNAL(finished()), SLOT(RedirectFinished())); return true; } void CrashSender::RedirectFinished() { QNetworkReply* reply = qobject_cast(sender()); if (!reply) { progress_->close(); return; } reply->deleteLater(); QUrl url = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); if (!url.isValid()) { progress_->close(); return; } // Read the file's data QByteArray file_data = file_->readAll(); // Find a boundary that doesn't exist in the file QByteArray boundary; forever { boundary = "--------------" + QString::number(qrand(), 16).toAscii(); if (!file_data.contains(boundary)) { break; } } QNetworkRequest req(url); req.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data; boundary=" + boundary); // Construct the multipart/form-data QByteArray form_data; form_data.reserve(file_data.size() + 1024); form_data.append("--"); form_data.append(boundary); form_data.append( "\nContent-Disposition: form-data; name=\"data\"; " "filename=\"data.dmp\"\n"); form_data.append("Content-Type: application/octet-stream\n\n"); form_data.append(file_data); form_data.append("\n--"); form_data.append(boundary); form_data.append("--"); progress_->setMaximum(form_data.size()); // Upload the data reply = network_->post(req, form_data); connect(reply, SIGNAL(uploadProgress(qint64, qint64)), SLOT(UploadProgress(qint64))); connect(reply, SIGNAL(finished()), progress_, SLOT(close())); } void CrashSender::UploadProgress(qint64 bytes) { progress_->setValue(bytes); } #else // HAVE_BREAKPAD namespace google_breakpad { class ExceptionHandler {}; } CrashReporting::CrashReporting() {} CrashReporting::~CrashReporting() {} bool CrashReporting::SendCrashReport(int, char**) { return false; } void CrashReporting::SetApplicationPath(const QString&) {} #endif // HAVE_BREAKPAD clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/crashreporting.h000066400000000000000000000054151260417502300243160ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_CRASHREPORTING_H_ #define CORE_CRASHREPORTING_H_ #include #include class QFile; class QNetworkAccessManager; class QProgressDialog; namespace google_breakpad { class ExceptionHandler; } // Wraps google_breakpad::ExceptionHandler - while an instance of this class // is alive crashes will be handled. class CrashReporting { public: CrashReporting(); ~CrashReporting(); // If the commandline contains the --send-crash-report option, the user will // be prompted to send the crash report and the function will return true // (in which case the caller should exit the program). Otherwise the function // returns false. static bool SendCrashReport(int argc, char** argv); // If this is set then the application is exec'd again with // --send-crash-report when a crash happens. static void SetApplicationPath(const QString& path); private: // Prints the message to stdout without using libc. static void Print(const char* message); // Breakpad callback. static bool Handler(const char* dump_path, const char* minidump_id, void* context, bool succeeded); private: Q_DISABLE_COPY(CrashReporting); static const char* kSendCrashReportOption; static char* sPath; std::unique_ptr handler_; }; // Asks the user if he wants to send a crash report, and displays a progress // dialog while uploading it if he does. class CrashSender : public QObject { Q_OBJECT public: explicit CrashSender(const QString& path); // Returns false if the user doesn't want to send the crash report (caller // should exit), or true if he does (caller should start the Qt event loop). bool Start(); private slots: void RedirectFinished(); void UploadProgress(qint64 bytes); private: static const char* kUploadURL; QNetworkAccessManager* network_; QString path_; QFile* file_; QProgressDialog* progress_; }; #endif // CORE_CRASHREPORTING_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/database.cpp000066400000000000000000000527711260417502300233720ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2013, David Sansome Copyright 2010-2011, Paweł Bara Copyright 2010, 2012-2014, John Maguire Copyright 2012-2013, Arnaud Bienner Copyright 2012, Marti Raudsepp Copyright 2013, Andreas Copyright 2013, Uwe Klotz Copyright 2014, Krzysztof A. Sobiecki Copyright 2014, Chocobozzz Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "config.h" #include "database.h" #include "scopedtransaction.h" #include "utilities.h" #include "core/application.h" #include "core/logging.h" #include "core/taskmanager.h" #include #include #include #include #include #include #include #include #include #include #include #include const char* Database::kDatabaseFilename = "clementine.db"; const int Database::kSchemaVersion = 50; const char* Database::kMagicAllSongsTables = "%allsongstables"; int Database::sNextConnectionId = 1; QMutex Database::sNextConnectionIdMutex; Database::Token::Token(const QString& token, int start, int end) : token(token), start_offset(start), end_offset(end) {} struct sqlite3_tokenizer_module { int iVersion; int (*xCreate)(int argc, /* Size of argv array */ const char* const* argv, /* Tokenizer argument strings */ sqlite3_tokenizer** ppTokenizer); /* OUT: Created tokenizer */ int (*xDestroy)(sqlite3_tokenizer* pTokenizer); int (*xOpen)( sqlite3_tokenizer* pTokenizer, /* Tokenizer object */ const char* pInput, int nBytes, /* Input buffer */ sqlite3_tokenizer_cursor** ppCursor); /* OUT: Created tokenizer cursor */ int (*xClose)(sqlite3_tokenizer_cursor* pCursor); int (*xNext)( sqlite3_tokenizer_cursor* pCursor, /* Tokenizer cursor */ const char** ppToken, int* pnBytes, /* OUT: Normalized text for token */ int* piStartOffset, /* OUT: Byte offset of token in input buffer */ int* piEndOffset, /* OUT: Byte offset of end of token in input buffer */ int* piPosition); /* OUT: Number of tokens returned before this one */ }; struct sqlite3_tokenizer { const sqlite3_tokenizer_module* pModule; /* The module for this tokenizer */ /* Tokenizer implementations will typically add additional fields */ }; struct sqlite3_tokenizer_cursor { sqlite3_tokenizer* pTokenizer; /* Tokenizer for this cursor. */ /* Tokenizer implementations will typically add additional fields */ }; sqlite3_tokenizer_module* Database::sFTSTokenizer = nullptr; int Database::FTSCreate(int argc, const char* const* argv, sqlite3_tokenizer** tokenizer) { *tokenizer = reinterpret_cast(new UnicodeTokenizer); return SQLITE_OK; } int Database::FTSDestroy(sqlite3_tokenizer* tokenizer) { UnicodeTokenizer* real_tokenizer = reinterpret_cast(tokenizer); delete real_tokenizer; return SQLITE_OK; } int Database::FTSOpen(sqlite3_tokenizer* pTokenizer, const char* input, int bytes, sqlite3_tokenizer_cursor** cursor) { UnicodeTokenizerCursor* new_cursor = new UnicodeTokenizerCursor; new_cursor->pTokenizer = pTokenizer; new_cursor->position = 0; QString str = QString::fromUtf8(input, bytes).toLower(); QChar* data = str.data(); // Decompose and strip punctuation. QList tokens; QString token; int start_offset = 0; int offset = 0; for (int i = 0; i < str.length(); ++i) { QChar c = data[i]; ushort unicode = c.unicode(); if (unicode <= 0x007f) { offset += 1; } else if (unicode >= 0x0080 && unicode <= 0x07ff) { offset += 2; } else if (unicode >= 0x0800) { offset += 3; } // Unicode astral planes unsupported in Qt? /*else if (unicode >= 0x010000 && unicode <= 0x10ffff) { offset += 4; }*/ if (!data[i].isLetterOrNumber()) { // Token finished. if (token.length() != 0) { tokens << Token(token, start_offset, offset - 1); start_offset = offset; token.clear(); } else { ++start_offset; } } else { if (data[i].decompositionTag() != QChar::NoDecomposition) { token.push_back(data[i].decomposition()[0]); } else { token.push_back(data[i]); } } if (i == str.length() - 1) { if (token.length() != 0) { tokens << Token(token, start_offset, offset); token.clear(); } } } new_cursor->tokens = tokens; *cursor = reinterpret_cast(new_cursor); return SQLITE_OK; } int Database::FTSClose(sqlite3_tokenizer_cursor* cursor) { UnicodeTokenizerCursor* real_cursor = reinterpret_cast(cursor); delete real_cursor; return SQLITE_OK; } int Database::FTSNext(sqlite3_tokenizer_cursor* cursor, const char** token, int* bytes, int* start_offset, int* end_offset, int* position) { UnicodeTokenizerCursor* real_cursor = reinterpret_cast(cursor); QList tokens = real_cursor->tokens; if (real_cursor->position >= tokens.size()) { return SQLITE_DONE; } Token t = tokens[real_cursor->position]; QByteArray utf8 = t.token.toUtf8(); *token = utf8.constData(); *bytes = utf8.size(); *start_offset = t.start_offset; *end_offset = t.end_offset; *position = real_cursor->position++; real_cursor->current_utf8 = utf8; return SQLITE_OK; } void Database::StaticInit() { sFTSTokenizer = new sqlite3_tokenizer_module; sFTSTokenizer->iVersion = 0; sFTSTokenizer->xCreate = &Database::FTSCreate; sFTSTokenizer->xDestroy = &Database::FTSDestroy; sFTSTokenizer->xOpen = &Database::FTSOpen; sFTSTokenizer->xNext = &Database::FTSNext; sFTSTokenizer->xClose = &Database::FTSClose; return; } Database::Database(Application* app, QObject* parent, const QString& database_name) : QObject(parent), app_(app), mutex_(QMutex::Recursive), injected_database_name_(database_name), query_hash_(0), startup_schema_version_(-1) { { QMutexLocker l(&sNextConnectionIdMutex); connection_id_ = sNextConnectionId++; } directory_ = QDir::toNativeSeparators(Utilities::GetConfigPath(Utilities::Path_Root)); attached_databases_["jamendo"] = AttachedDatabase( directory_ + "/jamendo.db", ":/schema/jamendo.sql", false); QMutexLocker l(&mutex_); Connect(); } QSqlDatabase Database::Connect() { QMutexLocker l(&connect_mutex_); // Create the directory if it doesn't exist if (!QFile::exists(directory_)) { QDir dir; if (!dir.mkpath(directory_)) { } } const QString connection_id = QString("%1_thread_%2").arg(connection_id_).arg( reinterpret_cast(QThread::currentThread())); // Try to find an existing connection for this thread QSqlDatabase db = QSqlDatabase::database(connection_id); if (db.isOpen()) { return db; } db = QSqlDatabase::addDatabase("QSQLITE", connection_id); if (!injected_database_name_.isNull()) db.setDatabaseName(injected_database_name_); else db.setDatabaseName(directory_ + "/" + kDatabaseFilename); if (!db.open()) { app_->AddError("Database: " + db.lastError().text()); return db; } // Find Sqlite3 functions in the Qt plugin. StaticInit(); { QSqlQuery set_fts_tokenizer("SELECT fts3_tokenizer(:name, :pointer)", db); set_fts_tokenizer.bindValue(":name", "unicode"); set_fts_tokenizer.bindValue( ":pointer", QByteArray(reinterpret_cast(&sFTSTokenizer), sizeof(&sFTSTokenizer))); if (!set_fts_tokenizer.exec()) { qLog(Warning) << "Couldn't register FTS3 tokenizer"; } // Implicit invocation of ~QSqlQuery() when leaving the scope // to release any remaining database locks! } if (db.tables().count() == 0) { // Set up initial schema qLog(Info) << "Creating initial database schema"; UpdateDatabaseSchema(0, db); } // Attach external databases for (const QString& key : attached_databases_.keys()) { QString filename = attached_databases_[key].filename_; if (!injected_database_name_.isNull()) filename = injected_database_name_; // Attach the db QSqlQuery q("ATTACH DATABASE :filename AS :alias", db); q.bindValue(":filename", filename); q.bindValue(":alias", key); if (!q.exec()) { qFatal("Couldn't attach external database '%s'", key.toAscii().constData()); } } if (startup_schema_version_ == -1) { UpdateMainSchema(&db); } // We might have to initialise the schema in some attached databases now, if // they were deleted and don't match up with the main schema version. for (const QString& key : attached_databases_.keys()) { if (attached_databases_[key].is_temporary_ && attached_databases_[key].schema_.isEmpty()) continue; // Find out if there are any tables in this database QSqlQuery q(QString( "SELECT ROWID FROM %1.sqlite_master" " WHERE type='table'").arg(key), db); if (!q.exec() || !q.next()) { q.finish(); ExecSchemaCommandsFromFile(db, attached_databases_[key].schema_, 0); } } return db; } void Database::UpdateMainSchema(QSqlDatabase* db) { // Get the database's schema version int schema_version = 0; { QSqlQuery q("SELECT version FROM schema_version", *db); if (q.next()) schema_version = q.value(0).toInt(); // Implicit invocation of ~QSqlQuery() when leaving the scope // to release any remaining database locks! } startup_schema_version_ = schema_version; if (schema_version > kSchemaVersion) { qLog(Warning) << "The database schema (version" << schema_version << ") is newer than I was expecting"; return; } if (schema_version < kSchemaVersion) { // Update the schema for (int v = schema_version + 1; v <= kSchemaVersion; ++v) { UpdateDatabaseSchema(v, *db); } } } void Database::RecreateAttachedDb(const QString& database_name) { if (!attached_databases_.contains(database_name)) { qLog(Warning) << "Attached database does not exist:" << database_name; return; } const QString filename = attached_databases_[database_name].filename_; QMutexLocker l(&mutex_); { QSqlDatabase db(Connect()); QSqlQuery q("DETACH DATABASE :alias", db); q.bindValue(":alias", database_name); if (!q.exec()) { qLog(Warning) << "Failed to detach database" << database_name; return; } if (!QFile::remove(filename)) { qLog(Warning) << "Failed to remove file" << filename; } } // We can't just re-attach the database now because it needs to be done for // each thread. Close all the database connections, so each thread will // re-attach it when they next connect. for (const QString& name : QSqlDatabase::connectionNames()) { QSqlDatabase::removeDatabase(name); } } void Database::AttachDatabase(const QString& database_name, const AttachedDatabase& database) { attached_databases_[database_name] = database; } void Database::AttachDatabaseOnDbConnection(const QString& database_name, const AttachedDatabase& database, QSqlDatabase& db) { AttachDatabase(database_name, database); // Attach the db QSqlQuery q("ATTACH DATABASE :filename AS :alias", db); q.bindValue(":filename", database.filename_); q.bindValue(":alias", database_name); if (!q.exec()) { qFatal("Couldn't attach external database '%s'", database_name.toAscii().constData()); } } void Database::DetachDatabase(const QString& database_name) { QMutexLocker l(&mutex_); { QSqlDatabase db(Connect()); QSqlQuery q("DETACH DATABASE :alias", db); q.bindValue(":alias", database_name); if (!q.exec()) { qLog(Warning) << "Failed to detach database" << database_name; return; } } attached_databases_.remove(database_name); } void Database::UpdateDatabaseSchema(int version, QSqlDatabase& db) { QString filename; if (version == 0) filename = ":/schema/schema.sql"; else filename = QString(":/schema/schema-%1.sql").arg(version); if (version == 31) { // This version used to do a bad job of converting filenames in the songs // table to file:// URLs. Now we do it properly here instead. ScopedTransaction t(&db); UrlEncodeFilenameColumn("songs", db); UrlEncodeFilenameColumn("playlist_items", db); for (const QString& table : db.tables()) { if (table.startsWith("device_") && table.endsWith("_songs")) { UrlEncodeFilenameColumn(table, db); } } qLog(Debug) << "Applying database schema update" << version << "from" << filename; ExecSchemaCommandsFromFile(db, filename, version - 1, true); t.Commit(); } else { qLog(Debug) << "Applying database schema update" << version << "from" << filename; ExecSchemaCommandsFromFile(db, filename, version - 1); } } void Database::UrlEncodeFilenameColumn(const QString& table, QSqlDatabase& db) { QSqlQuery select(QString("SELECT ROWID, filename FROM %1").arg(table), db); QSqlQuery update( QString("UPDATE %1 SET filename=:filename WHERE ROWID=:id").arg(table), db); select.exec(); if (CheckErrors(select)) return; while (select.next()) { const int rowid = select.value(0).toInt(); const QString filename = select.value(1).toString(); if (filename.isEmpty() || filename.contains("://")) { continue; } const QUrl url = QUrl::fromLocalFile(filename); update.bindValue(":filename", url.toEncoded()); update.bindValue(":id", rowid); update.exec(); CheckErrors(update); } } void Database::ExecSchemaCommandsFromFile(QSqlDatabase& db, const QString& filename, int schema_version, bool in_transaction) { // Open and read the database schema QFile schema_file(filename); if (!schema_file.open(QIODevice::ReadOnly)) qFatal("Couldn't open schema file %s", filename.toUtf8().constData()); ExecSchemaCommands(db, QString::fromUtf8(schema_file.readAll()), schema_version, in_transaction); } void Database::ExecSchemaCommands(QSqlDatabase& db, const QString& schema, int schema_version, bool in_transaction) { // Run each command const QStringList commands(schema.split(QRegExp("; *\n\n"))); // We don't want this list to reflect possible DB schema changes // so we initialize it before executing any statements. // If no outer transaction is provided the song tables need to // be queried before beginning an inner transaction! Otherwise // DROP TABLE commands on song tables may fail due to database // locks. const QStringList song_tables(SongsTables(db, schema_version)); if (!in_transaction) { ScopedTransaction inner_transaction(&db); ExecSongTablesCommands(db, song_tables, commands); inner_transaction.Commit(); } else { ExecSongTablesCommands(db, song_tables, commands); } } void Database::ExecSongTablesCommands(QSqlDatabase& db, const QStringList& song_tables, const QStringList& commands) { for (const QString& command : commands) { // There are now lots of "songs" tables that need to have the same schema: // songs, magnatune_songs, and device_*_songs. We allow a magic value // in the schema files to update all songs tables at once. if (command.contains(kMagicAllSongsTables)) { for (const QString& table : song_tables) { // Another horrible hack: device songs tables don't have matching _fts // tables, so if this command tries to touch one, ignore it. if (table.startsWith("device_") && command.contains(QString(kMagicAllSongsTables) + "_fts")) { continue; } qLog(Info) << "Updating" << table << "for" << kMagicAllSongsTables; QString new_command(command); new_command.replace(kMagicAllSongsTables, table); QSqlQuery query(db.exec(new_command)); if (CheckErrors(query)) qFatal("Unable to update music library database"); } } else { QSqlQuery query(db.exec(command)); if (CheckErrors(query)) qFatal("Unable to update music library database"); } } } QStringList Database::SongsTables(QSqlDatabase& db, int schema_version) const { QStringList ret; // look for the tables in the main db for (const QString& table : db.tables()) { if (table == "songs" || table.endsWith("_songs")) ret << table; } // look for the tables in attached dbs for (const QString& key : attached_databases_.keys()) { QSqlQuery q( QString( "SELECT NAME FROM %1.sqlite_master" " WHERE type='table' AND name='songs' OR name LIKE '%songs'") .arg(key), db); if (q.exec()) { while (q.next()) { QString tab_name = key + "." + q.value(0).toString(); ret << tab_name; } } } if (schema_version > 29) { // The playlist_items table became a songs table in version 29. ret << "playlist_items"; } return ret; } bool Database::CheckErrors(const QSqlQuery& query) { QSqlError last_error = query.lastError(); if (last_error.isValid()) { qLog(Error) << "db error: " << last_error; qLog(Error) << "faulty query: " << query.lastQuery(); qLog(Error) << "bound values: " << query.boundValues(); return true; } return false; } bool Database::IntegrityCheck(QSqlDatabase db) { qLog(Debug) << "Starting database integrity check"; int task_id = app_->task_manager()->StartTask(tr("Integrity check")); bool ok = false; bool error_reported = false; // Ask for 10 error messages at most. QSqlQuery q(QString("PRAGMA integrity_check(10)"), db); while (q.next()) { QString message = q.value(0).toString(); // If no errors are found, a single row with the value "ok" is returned if (message == "ok") { ok = true; break; } else { if (!error_reported) { app_->AddError( tr("Database corruption detected. Please read " "https://code.google.com/p/clementine-player/wiki/" "DatabaseCorruption " "for instructions on how to recover your database")); } app_->AddError("Database: " + message); error_reported = true; } } app_->task_manager()->SetTaskFinished(task_id); return ok; } void Database::DoBackup() { QSqlDatabase db(this->Connect()); // Before we overwrite anything, make sure the database is not corrupt QMutexLocker l(&mutex_); const bool ok = IntegrityCheck(db); if (ok) { BackupFile(db.databaseName()); } } bool Database::OpenDatabase(const QString& filename, sqlite3** connection) const { int ret = sqlite3_open(filename.toUtf8(), connection); if (ret != 0) { if (*connection) { const char* error_message = sqlite3_errmsg(*connection); qLog(Error) << "Failed to open database for backup:" << filename << error_message; } else { qLog(Error) << "Failed to open database for backup:" << filename; } return false; } return true; } void Database::BackupFile(const QString& filename) { qLog(Debug) << "Starting database backup"; QString dest_filename = QString("%1.bak").arg(filename); const int task_id = app_->task_manager()->StartTask(tr("Backing up database")); sqlite3* source_connection = nullptr; sqlite3* dest_connection = nullptr; BOOST_SCOPE_EXIT((source_connection)(dest_connection)(task_id)(app_)) { // Harmless to call sqlite3_close() with a nullptr pointer. sqlite3_close(source_connection); sqlite3_close(dest_connection); app_->task_manager()->SetTaskFinished(task_id); } BOOST_SCOPE_EXIT_END bool success = OpenDatabase(filename, &source_connection); if (!success) { return; } success = OpenDatabase(dest_filename, &dest_connection); if (!success) { return; } sqlite3_backup* backup = sqlite3_backup_init(dest_connection, "main", source_connection, "main"); if (!backup) { const char* error_message = sqlite3_errmsg(dest_connection); qLog(Error) << "Failed to start database backup:" << error_message; return; } int ret = SQLITE_OK; do { ret = sqlite3_backup_step(backup, 16); const int page_count = sqlite3_backup_pagecount(backup); app_->task_manager()->SetTaskProgress( task_id, page_count - sqlite3_backup_remaining(backup), page_count); } while (ret == SQLITE_OK); if (ret != SQLITE_DONE) { qLog(Error) << "Database backup failed"; } sqlite3_backup_finish(backup); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/database.h000066400000000000000000000142671260417502300230350ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, 2012-2013, David Sansome Copyright 2010, 2012, 2014, John Maguire Copyright 2011, Paweł Bara Copyright 2012, Marti Raudsepp Copyright 2013, Andreas Copyright 2013, Uwe Klotz Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_DATABASE_H_ #define CORE_DATABASE_H_ #include #include #include #include #include #include #include #include "gtest/gtest_prod.h" extern "C" { struct sqlite3_tokenizer; struct sqlite3_tokenizer_cursor; struct sqlite3_tokenizer_module; } class Application; class Database : public QObject { Q_OBJECT public: Database(Application* app, QObject* parent = nullptr, const QString& database_name = QString()); struct AttachedDatabase { AttachedDatabase() {} AttachedDatabase(const QString& filename, const QString& schema, bool is_temporary) : filename_(filename), schema_(schema), is_temporary_(is_temporary) {} QString filename_; QString schema_; bool is_temporary_; }; static const int kSchemaVersion; static const char* kDatabaseFilename; static const char* kMagicAllSongsTables; QSqlDatabase Connect(); bool CheckErrors(const QSqlQuery& query); QMutex* Mutex() { return &mutex_; } void RecreateAttachedDb(const QString& database_name); void ExecSchemaCommands(QSqlDatabase& db, const QString& schema, int schema_version, bool in_transaction = false); int startup_schema_version() const { return startup_schema_version_; } int current_schema_version() const { return kSchemaVersion; } void AttachDatabase(const QString& database_name, const AttachedDatabase& database); void AttachDatabaseOnDbConnection(const QString& database_name, const AttachedDatabase& database, QSqlDatabase& db); void DetachDatabase(const QString& database_name); signals: void Error(const QString& message); public slots: void DoBackup(); private: void UpdateMainSchema(QSqlDatabase* db); void ExecSchemaCommandsFromFile(QSqlDatabase& db, const QString& filename, int schema_version, bool in_transaction = false); void ExecSongTablesCommands(QSqlDatabase& db, const QStringList& song_tables, const QStringList& commands); void UpdateDatabaseSchema(int version, QSqlDatabase& db); void UrlEncodeFilenameColumn(const QString& table, QSqlDatabase& db); QStringList SongsTables(QSqlDatabase& db, int schema_version) const; bool IntegrityCheck(QSqlDatabase db); void BackupFile(const QString& filename); bool OpenDatabase(const QString& filename, sqlite3** connection) const; Application* app_; // Alias -> filename QMap attached_databases_; QString directory_; QMutex connect_mutex_; QMutex mutex_; // This ID makes the QSqlDatabase name unique to the object as well as the // thread int connection_id_; static QMutex sNextConnectionIdMutex; static int sNextConnectionId; // Used by tests QString injected_database_name_; uint query_hash_; QStringList query_cache_; // This is the schema version of Clementine's DB from the app's last run. int startup_schema_version_; FRIEND_TEST(DatabaseTest, FTSOpenParsesSimpleInput); FRIEND_TEST(DatabaseTest, FTSOpenParsesUTF8Input); FRIEND_TEST(DatabaseTest, FTSOpenParsesMultipleTokens); FRIEND_TEST(DatabaseTest, FTSCursorWorks); FRIEND_TEST(DatabaseTest, FTSOpenLeavesCyrillicQueries); // Do static initialisation like loading sqlite functions. static void StaticInit(); typedef int (*Sqlite3CreateFunc)(sqlite3*, const char*, int, int, void*, void (*)(sqlite3_context*, int, sqlite3_value**), void (*)(sqlite3_context*, int, sqlite3_value**), void (*)(sqlite3_context*)); static sqlite3_tokenizer_module* sFTSTokenizer; static int FTSCreate(int argc, const char* const* argv, sqlite3_tokenizer** tokenizer); static int FTSDestroy(sqlite3_tokenizer* tokenizer); static int FTSOpen(sqlite3_tokenizer* tokenizer, const char* input, int bytes, sqlite3_tokenizer_cursor** cursor); static int FTSClose(sqlite3_tokenizer_cursor* cursor); static int FTSNext(sqlite3_tokenizer_cursor* cursor, const char** token, int* bytes, int* start_offset, int* end_offset, int* position); struct Token { Token(const QString& token, int start, int end); QString token; int start_offset; int end_offset; }; // Based on sqlite3_tokenizer. struct UnicodeTokenizer { const sqlite3_tokenizer_module* pModule; }; struct UnicodeTokenizerCursor { const sqlite3_tokenizer* pTokenizer; QList tokens; int position; QByteArray current_utf8; }; }; class MemoryDatabase : public Database { public: explicit MemoryDatabase(Application* app, QObject* parent = nullptr) : Database(app, parent, ":memory:") {} ~MemoryDatabase() { // Make sure Qt doesn't reuse the same database QSqlDatabase::removeDatabase(Connect().connectionName()); } }; #endif // CORE_DATABASE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/deletefiles.cpp000066400000000000000000000057651260417502300241140ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "deletefiles.h" #include #include #include #include #include "musicstorage.h" #include "taskmanager.h" const int DeleteFiles::kBatchSize = 50; DeleteFiles::DeleteFiles(TaskManager* task_manager, std::shared_ptr storage) : thread_(nullptr), task_manager_(task_manager), storage_(storage), started_(false), task_id_(0), progress_(0) { original_thread_ = thread(); } DeleteFiles::~DeleteFiles() {} void DeleteFiles::Start(const SongList& songs) { if (thread_) return; songs_ = songs; task_id_ = task_manager_->StartTask(tr("Deleting files")); task_manager_->SetTaskBlocksLibraryScans(true); thread_ = new QThread; connect(thread_, SIGNAL(started()), SLOT(ProcessSomeFiles())); moveToThread(thread_); thread_->start(); } void DeleteFiles::Start(const QStringList& filenames) { SongList songs; for (const QString& filename : filenames) { Song song; song.set_url(QUrl::fromLocalFile(filename)); songs << song; } Start(songs); } void DeleteFiles::ProcessSomeFiles() { if (!started_) { storage_->StartDelete(); started_ = true; } // None left? if (progress_ >= songs_.count()) { task_manager_->SetTaskProgress(task_id_, progress_, songs_.count()); storage_->FinishCopy(songs_with_errors_.isEmpty()); task_manager_->SetTaskFinished(task_id_); emit Finished(songs_with_errors_); // Move back to the original thread so deleteLater() can get called in // the main thread's event loop moveToThread(original_thread_); deleteLater(); // Stop this thread thread_->quit(); return; } // We process files in batches so we can be cancelled part-way through. const int n = qMin(songs_.count(), progress_ + kBatchSize); for (; progress_ < n; ++progress_) { task_manager_->SetTaskProgress(task_id_, progress_, songs_.count()); const Song& song = songs_[progress_]; MusicStorage::DeleteJob job; job.metadata_ = song; if (!storage_->DeleteFromStorage(job)) { songs_with_errors_ << song; } } QTimer::singleShot(0, this, SLOT(ProcessSomeFiles())); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/deletefiles.h000066400000000000000000000031651260417502300235510ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_DELETEFILES_H_ #define CORE_DELETEFILES_H_ #include #include #include "song.h" class MusicStorage; class TaskManager; class DeleteFiles : public QObject { Q_OBJECT public: DeleteFiles(TaskManager* task_manager, std::shared_ptr storage); ~DeleteFiles(); static const int kBatchSize; void Start(const SongList& songs); void Start(const QStringList& filenames); signals: void Finished(const SongList& songs_with_errors); private slots: void ProcessSomeFiles(); private: QThread* thread_; QThread* original_thread_; TaskManager* task_manager_; std::shared_ptr storage_; SongList songs_; bool started_; int task_id_; int progress_; SongList songs_with_errors_; }; #endif // CORE_DELETEFILES_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/filesystemmusicstorage.cpp000066400000000000000000000044421260417502300264300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, David Sansome Copyright 2011, Jonathan Anderson Copyright 2011, Angus Gratton Copyright 2014, vkrishtal Copyright 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "filesystemmusicstorage.h" #include "core/logging.h" #include "core/utilities.h" #include #include #include FilesystemMusicStorage::FilesystemMusicStorage(const QString& root) : root_(root) {} bool FilesystemMusicStorage::CopyToStorage(const CopyJob& job) { const QFileInfo src = QFileInfo(job.source_); const QFileInfo dest = QFileInfo(root_ + "/" + job.destination_); // Don't do anything if the destination is the same as the source if (src == dest) return true; // Create directories as required QDir dir; if (!dir.mkpath(dest.absolutePath())) { qLog(Warning) << "Failed to create directory" << dest.dir().absolutePath(); return false; } // Remove the destination file if it exists and we want to overwrite if (job.overwrite_ && dest.exists()) QFile::remove(dest.absoluteFilePath()); // Copy or move if (job.remove_original_) return QFile::rename(src.absoluteFilePath(), dest.absoluteFilePath()); else return QFile::copy(src.absoluteFilePath(), dest.absoluteFilePath()); } bool FilesystemMusicStorage::DeleteFromStorage(const DeleteJob& job) { QString path = job.metadata_.url().toLocalFile(); QFileInfo fileInfo(path); if (fileInfo.isDir()) return Utilities::RemoveRecursive(path); else return QFile::remove(path); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/filesystemmusicstorage.h000066400000000000000000000024621260417502300260750ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Copyright 2010, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_FILESYSTEMMUSICSTORAGE_H_ #define CORE_FILESYSTEMMUSICSTORAGE_H_ #include "musicstorage.h" class FilesystemMusicStorage : public virtual MusicStorage { public: explicit FilesystemMusicStorage(const QString& root); ~FilesystemMusicStorage() {} QString LocalPath() const { return root_; } bool CopyToStorage(const CopyJob& job); bool DeleteFromStorage(const DeleteJob& job); private: QString root_; }; #endif // CORE_FILESYSTEMMUSICSTORAGE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/filesystemwatcherinterface.cpp000066400000000000000000000023701260417502300272370ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "filesystemwatcherinterface.h" #include "qtfslistener.h" #ifdef Q_OS_DARWIN #include "macfslistener.h" #endif FileSystemWatcherInterface::FileSystemWatcherInterface(QObject* parent) : QObject(parent) {} FileSystemWatcherInterface* FileSystemWatcherInterface::Create( QObject* parent) { FileSystemWatcherInterface* ret; #ifdef Q_OS_DARWIN ret = new MacFSListener(parent); #else ret = new QtFSListener(parent); #endif ret->Init(); return ret; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/filesystemwatcherinterface.h000066400000000000000000000026221260417502300267040ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_FILESYSTEMWATCHERINTERFACE_H_ #define CORE_FILESYSTEMWATCHERINTERFACE_H_ #include class FileSystemWatcherInterface : public QObject { Q_OBJECT public: explicit FileSystemWatcherInterface(QObject* parent = nullptr); virtual void Init() {} virtual void AddPath(const QString& path) = 0; virtual void RemovePath(const QString& path) = 0; virtual void Clear() = 0; static FileSystemWatcherInterface* Create(QObject* parent = nullptr); signals: void PathChanged(const QString& path); }; #endif // CORE_FILESYSTEMWATCHERINTERFACE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/globalshortcutbackend.cpp000066400000000000000000000023421260417502300261570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, David Sansome Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "globalshortcutbackend.h" #include "globalshortcuts.h" GlobalShortcutBackend::GlobalShortcutBackend(GlobalShortcuts* parent) : QObject(parent), manager_(parent), active_(false) {} bool GlobalShortcutBackend::Register() { bool ret = DoRegister(); if (ret) active_ = true; return ret; } void GlobalShortcutBackend::Unregister() { DoUnregister(); active_ = false; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/globalshortcutbackend.h000066400000000000000000000026631260417502300256320ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_GLOBALSHORTCUTBACKEND_H_ #define CORE_GLOBALSHORTCUTBACKEND_H_ #include class GlobalShortcuts; class GlobalShortcutBackend : public QObject { Q_OBJECT public: explicit GlobalShortcutBackend(GlobalShortcuts* parent = nullptr); virtual ~GlobalShortcutBackend() {} bool is_active() const { return active_; } bool Register(); void Unregister(); signals: void RegisterFinished(bool success); protected: virtual bool DoRegister() = 0; virtual void DoUnregister() = 0; GlobalShortcuts* manager_; bool active_; }; #endif // CORE_GLOBALSHORTCUTBACKEND_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/globalshortcuts.cpp000066400000000000000000000160001260417502300250260ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, Paweł Bara Copyright 2010-2011, David Sansome Copyright 2010, 2014, John Maguire Copyright 2013, Alexander Bikadorov Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "globalshortcuts.h" #include "gnomeglobalshortcutbackend.h" #include "macglobalshortcutbackend.h" #include "qxtglobalshortcutbackend.h" #include "mac_startup.h" #include #include #include #include #ifdef QT_DBUS_LIB #include #endif const char* GlobalShortcuts::kSettingsGroup = "Shortcuts"; GlobalShortcuts::GlobalShortcuts(QWidget* parent) : QWidget(parent), gnome_backend_(nullptr), system_backend_(nullptr), use_gnome_(false), rating_signals_mapper_(new QSignalMapper(this)) { settings_.beginGroup(kSettingsGroup); // Create actions AddShortcut("play", tr("Play"), SIGNAL(Play())); AddShortcut("pause", tr("Pause"), SIGNAL(Pause())); AddShortcut("play_pause", tr("Play/Pause"), SIGNAL(PlayPause()), QKeySequence(Qt::Key_MediaPlay)); AddShortcut("stop", tr("Stop"), SIGNAL(Stop()), QKeySequence(Qt::Key_MediaStop)); AddShortcut("stop_after", tr("Stop playing after current track"), SIGNAL(StopAfter())); AddShortcut("next_track", tr("Next track"), SIGNAL(Next()), QKeySequence(Qt::Key_MediaNext)); AddShortcut("prev_track", tr("Previous track"), SIGNAL(Previous()), QKeySequence(Qt::Key_MediaPrevious)); AddShortcut("inc_volume", tr("Increase volume"), SIGNAL(IncVolume())); AddShortcut("dec_volume", tr("Decrease volume"), SIGNAL(DecVolume())); AddShortcut("mute", tr("Mute"), SIGNAL(Mute())); AddShortcut("seek_forward", tr("Seek forward"), SIGNAL(SeekForward())); AddShortcut("seek_backward", tr("Seek backward"), SIGNAL(SeekBackward())); AddShortcut("show_hide", tr("Show/Hide"), SIGNAL(ShowHide())); AddShortcut("show_osd", tr("Show OSD"), SIGNAL(ShowOSD())); AddShortcut( "toggle_pretty_osd", tr("Toggle Pretty OSD"), SIGNAL(TogglePrettyOSD())); // Toggling possible only for pretty OSD AddShortcut("shuffle_mode", tr("Change shuffle mode"), SIGNAL(CycleShuffleMode())); AddShortcut("repeat_mode", tr("Change repeat mode"), SIGNAL(CycleRepeatMode())); AddShortcut("toggle_last_fm_scrobbling", tr("Enable/disable Last.fm scrobbling"), SIGNAL(ToggleScrobbling())); AddShortcut("love_last_fm_scrobbling", tr("Love (Last.fm scrobbling)"), SIGNAL(Love())); AddShortcut("ban_last_fm_scrobbling", tr("Ban (Last.fm scrobbling)"), SIGNAL(Ban())); AddRatingShortcut("rate_zero_star", tr("Rate the current song 0 stars"), rating_signals_mapper_, 0); AddRatingShortcut("rate_one_star", tr("Rate the current song 1 star"), rating_signals_mapper_, 1); AddRatingShortcut("rate_two_star", tr("Rate the current song 2 stars"), rating_signals_mapper_, 2); AddRatingShortcut("rate_three_star", tr("Rate the current song 3 stars"), rating_signals_mapper_, 3); AddRatingShortcut("rate_four_star", tr("Rate the current song 4 stars"), rating_signals_mapper_, 4); AddRatingShortcut("rate_five_star", tr("Rate the current song 5 stars"), rating_signals_mapper_, 5); connect(rating_signals_mapper_, SIGNAL(mapped(int)), SIGNAL(RateCurrentSong(int))); // Create backends - these do the actual shortcut registration gnome_backend_ = new GnomeGlobalShortcutBackend(this); #ifndef Q_OS_DARWIN system_backend_ = new QxtGlobalShortcutBackend(this); #else system_backend_ = new MacGlobalShortcutBackend(this); #endif ReloadSettings(); } void GlobalShortcuts::AddShortcut(const QString& id, const QString& name, const char* signal, const QKeySequence& default_key) { Shortcut shortcut = AddShortcut(id, name, default_key); connect(shortcut.action, SIGNAL(triggered()), this, signal); } void GlobalShortcuts::AddRatingShortcut(const QString& id, const QString& name, QSignalMapper* mapper, int rating, const QKeySequence& default_key) { Shortcut shortcut = AddShortcut(id, name, default_key); connect(shortcut.action, SIGNAL(triggered()), mapper, SLOT(map())); mapper->setMapping(shortcut.action, rating); } GlobalShortcuts::Shortcut GlobalShortcuts::AddShortcut( const QString& id, const QString& name, const QKeySequence& default_key) { Shortcut shortcut; shortcut.action = new QAction(name, this); QKeySequence key_sequence = QKeySequence::fromString( settings_.value(id, default_key.toString()).toString()); shortcut.action->setShortcut(key_sequence); shortcut.id = id; shortcut.default_key = default_key; // Create application wide QShortcut to hide keyevents mapped to global // shortcuts from widgets. shortcut.shortcut = new QShortcut(key_sequence, this); shortcut.shortcut->setContext(Qt::ApplicationShortcut); shortcuts_[id] = shortcut; return shortcut; } bool GlobalShortcuts::IsGsdAvailable() const { #ifdef QT_DBUS_LIB return QDBusConnection::sessionBus().interface()->isServiceRegistered( GnomeGlobalShortcutBackend::kGsdService); #else // QT_DBUS_LIB return false; #endif } void GlobalShortcuts::ReloadSettings() { // The actual shortcuts have been set in our actions for us by the config // dialog already - we just need to reread the gnome settings. use_gnome_ = settings_.value("use_gnome", true).toBool(); Unregister(); Register(); } void GlobalShortcuts::Unregister() { if (gnome_backend_->is_active()) gnome_backend_->Unregister(); if (system_backend_->is_active()) system_backend_->Unregister(); } void GlobalShortcuts::Register() { if (use_gnome_ && gnome_backend_->Register()) return; system_backend_->Register(); } bool GlobalShortcuts::IsMacAccessibilityEnabled() const { #ifdef Q_OS_MAC return static_cast(system_backend_) ->IsAccessibilityEnabled(); #else return true; #endif } void GlobalShortcuts::ShowMacAccessibilityDialog() { #ifdef Q_OS_MAC static_cast(system_backend_) ->ShowAccessibilityDialog(); #endif } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/globalshortcuts.h000066400000000000000000000056171260417502300245070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Copyright 2010, 2014, John Maguire Copyright 2010, Paweł Bara Copyright 2011, Andrea Decorte Copyright 2013, Alexander Bikadorov Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_GLOBALSHORTCUTS_H_ #define CORE_GLOBALSHORTCUTS_H_ #include #include #include #include class QAction; class QShortcut; class GlobalShortcutBackend; class QSignalMapper; class GlobalShortcuts : public QWidget { Q_OBJECT public: explicit GlobalShortcuts(QWidget* parent = nullptr); static const char* kSettingsGroup; struct Shortcut { QString id; QKeySequence default_key; QAction* action; QShortcut* shortcut; }; QMap shortcuts() const { return shortcuts_; } bool IsGsdAvailable() const; bool IsMacAccessibilityEnabled() const; public slots: void ReloadSettings(); void ShowMacAccessibilityDialog(); void Unregister(); void Register(); signals: void Play(); void Pause(); void PlayPause(); void Stop(); void StopAfter(); void Next(); void Previous(); void IncVolume(); void DecVolume(); void Mute(); void SeekForward(); void SeekBackward(); void ShowHide(); void ShowOSD(); void TogglePrettyOSD(); void RateCurrentSong(int); void CycleShuffleMode(); void CycleRepeatMode(); void ToggleScrobbling(); void Love(); void Ban(); private: void AddShortcut(const QString& id, const QString& name, const char* signal, const QKeySequence& default_key = QKeySequence(0)); void AddRatingShortcut(const QString& id, const QString& name, QSignalMapper* mapper, int rating, const QKeySequence& default_key = QKeySequence(0)); Shortcut AddShortcut(const QString& id, const QString& name, const QKeySequence& default_key); private: GlobalShortcutBackend* gnome_backend_; GlobalShortcutBackend* system_backend_; QMap shortcuts_; QSettings settings_; bool use_gnome_; QSignalMapper* rating_signals_mapper_; }; #endif // CORE_GLOBALSHORTCUTS_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/gnomeglobalshortcutbackend.cpp000066400000000000000000000101441260417502300272040ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "gnomeglobalshortcutbackend.h" #include "globalshortcuts.h" #include "core/closure.h" #include "core/logging.h" #ifdef QT_DBUS_LIB #include "dbus/gnomesettingsdaemon.h" #endif #include #include #include #include #ifdef QT_DBUS_LIB #include #endif const char* GnomeGlobalShortcutBackend::kGsdService = "org.gnome.SettingsDaemon"; const char* GnomeGlobalShortcutBackend::kGsdPath = "/org/gnome/SettingsDaemon/MediaKeys"; const char* GnomeGlobalShortcutBackend::kGsdInterface = "org.gnome.SettingsDaemon.MediaKeys"; GnomeGlobalShortcutBackend::GnomeGlobalShortcutBackend(GlobalShortcuts* parent) : GlobalShortcutBackend(parent), interface_(nullptr), is_connected_(false) {} bool GnomeGlobalShortcutBackend::DoRegister() { #ifdef QT_DBUS_LIB qLog(Debug) << "registering"; // Check if the GSD service is available if (!QDBusConnection::sessionBus().interface()->isServiceRegistered( kGsdService)) { qLog(Warning) << "gnome settings daemon not registered"; return false; } if (!interface_) { interface_ = new OrgGnomeSettingsDaemonMediaKeysInterface( kGsdService, kGsdPath, QDBusConnection::sessionBus(), this); } QDBusPendingReply<> reply = interface_->GrabMediaPlayerKeys(QCoreApplication::applicationName(), QDateTime::currentDateTime().toTime_t()); QDBusPendingCallWatcher* watcher = new QDBusPendingCallWatcher(reply, this); NewClosure(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(RegisterFinished(QDBusPendingCallWatcher*)), watcher); return true; #else // QT_DBUS_LIB qLog(Warning) << "dbus not available"; return false; #endif } void GnomeGlobalShortcutBackend::RegisterFinished( QDBusPendingCallWatcher* watcher) { #ifdef QT_DBUS_LIB QDBusMessage reply = watcher->reply(); watcher->deleteLater(); if (reply.type() == QDBusMessage::ErrorMessage) { qLog(Warning) << "Failed to grab media keys" << reply.errorName() << reply.errorMessage(); return; } connect(interface_, SIGNAL(MediaPlayerKeyPressed(QString, QString)), this, SLOT(GnomeMediaKeyPressed(QString, QString))); is_connected_ = true; qLog(Debug) << "registered"; #endif // QT_DBUS_LIB } void GnomeGlobalShortcutBackend::DoUnregister() { qLog(Debug) << "unregister"; #ifdef QT_DBUS_LIB // Check if the GSD service is available if (!QDBusConnection::sessionBus().interface()->isServiceRegistered( kGsdService)) return; if (!interface_ || !is_connected_) return; is_connected_ = false; interface_->ReleaseMediaPlayerKeys(QCoreApplication::applicationName()); disconnect(interface_, SIGNAL(MediaPlayerKeyPressed(QString, QString)), this, SLOT(GnomeMediaKeyPressed(QString, QString))); #endif } void GnomeGlobalShortcutBackend::GnomeMediaKeyPressed(const QString&, const QString& key) { if (key == "Play") manager_->shortcuts()["play_pause"].action->trigger(); if (key == "Stop") manager_->shortcuts()["stop"].action->trigger(); if (key == "Next") manager_->shortcuts()["next_track"].action->trigger(); if (key == "Previous") manager_->shortcuts()["prev_track"].action->trigger(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/gnomeglobalshortcutbackend.h000066400000000000000000000032561260417502300266570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_GNOMEGLOBALSHORTCUTBACKEND_H_ #define CORE_GNOMEGLOBALSHORTCUTBACKEND_H_ #include "globalshortcutbackend.h" class OrgGnomeSettingsDaemonMediaKeysInterface; class QDBusPendingCallWatcher; class GnomeGlobalShortcutBackend : public GlobalShortcutBackend { Q_OBJECT public: explicit GnomeGlobalShortcutBackend(GlobalShortcuts* parent); static const char* kGsdService; static const char* kGsdPath; static const char* kGsdInterface; protected: bool RegisterInNewThread() const { return true; } bool DoRegister(); void DoUnregister(); private slots: void RegisterFinished(QDBusPendingCallWatcher* watcher); void GnomeMediaKeyPressed(const QString& application, const QString& key); private: OrgGnomeSettingsDaemonMediaKeysInterface* interface_; bool is_connected_; }; #endif // CORE_GNOMEGLOBALSHORTCUTBACKEND_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/mac_delegate.h000066400000000000000000000041031260417502300236470ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Copyright 2011-2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #import #include "config.h" #include "macglobalshortcutbackend.h" #ifdef HAVE_BREAKPAD #import #endif class PlatformInterface; @class SPMediaKeyTap; @interface AppDelegate : NSObject { PlatformInterface* application_handler_; NSMenu* dock_menu_; MacGlobalShortcutBackend* shortcut_handler_; SPMediaKeyTap* key_tap_; #ifdef HAVE_BREAKPAD BreakpadRef breakpad_; #endif } - (id)initWithHandler:(PlatformInterface*)handler; // NSApplicationDelegate - (BOOL)applicationShouldHandleReopen:(NSApplication*)app hasVisibleWindows:(BOOL)flag; - (NSMenu*)applicationDockMenu:(NSApplication*)sender; - (void)applicationDidFinishLaunching:(NSNotification*)aNotification; - (NSApplicationTerminateReply)applicationShouldTerminate: (NSApplication*)sender; // NSUserNotificationCenterDelegate - (BOOL)userNotificationCenter:(id)center shouldPresentNotification:(id)notification; - (void)setDockMenu:(NSMenu*)menu; - (MacGlobalShortcutBackend*)shortcut_handler; - (void)setShortcutHandler:(MacGlobalShortcutBackend*)backend; - (void)mediaKeyTap:(SPMediaKeyTap*)keyTap receivedMediaKeyEvent:(NSEvent*)event; @end clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/mac_startup.h000066400000000000000000000027671260417502300236150ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2012, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MAC_STARTUP_H #define MAC_STARTUP_H #include class MacGlobalShortcutBackend; class QObject; class QWidget; class PlatformInterface { public: // Called when the application should show itself. virtual void Activate() = 0; virtual bool LoadUrl(const QString& url) = 0; virtual ~PlatformInterface() {} }; namespace mac { void MacMain(); void SetShortcutHandler(MacGlobalShortcutBackend* handler); void SetApplicationHandler(PlatformInterface* handler); void CheckForUpdates(); QString GetBundlePath(); QString GetResourcesPath(); QString GetApplicationSupportPath(); QString GetMusicDirectory(); void EnableFullScreen(const QWidget& main_window); } // namespace mac #endif // MAC_STARTUP_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/mac_startup.mm000066400000000000000000000335171260417502300237740ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, David Sansome Copyright 2010-2012, 2014, John Maguire Copyright 2011, Tyler Rhodes Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import "3rdparty/SPMediaKeyTap/SPMediaKeyTap.h" #include "config.h" #include "globalshortcuts.h" #include "mac_delegate.h" #include "mac_startup.h" #include "mac_utilities.h" #include "macglobalshortcutbackend.h" #include "utilities.h" #include "core/logging.h" #include "core/scoped_cftyperef.h" #include "core/scoped_nsautorelease_pool.h" #ifdef HAVE_SPARKLE #import #endif #include #include #include #include #include #include #include #include QDebug operator<<(QDebug dbg, NSObject* object) { QString ns_format = [[NSString stringWithFormat:@"%@", object] UTF8String]; dbg.nospace() << ns_format; return dbg.space(); } // Capture global media keys on Mac (Cocoa only!) // See: // http://www.rogueamoeba.com/utm/2007/09/29/apple-keyboard-media-key-event-handling/ @interface MacApplication : NSApplication { PlatformInterface* application_handler_; AppDelegate* delegate_; // shortcut_handler_ only used to temporarily save it // AppDelegate does all the heavy-shortcut-lifting MacGlobalShortcutBackend* shortcut_handler_; } - (MacGlobalShortcutBackend*)shortcut_handler; - (void)SetShortcutHandler:(MacGlobalShortcutBackend*)handler; - (PlatformInterface*)application_handler; - (void)SetApplicationHandler:(PlatformInterface*)handler; @end #ifdef HAVE_BREAKPAD static bool BreakpadCallback(int, int, mach_port_t, void*) { return true; } static BreakpadRef InitBreakpad() { ScopedNSAutoreleasePool pool; BreakpadRef breakpad = nil; NSDictionary* plist = [[NSBundle mainBundle] infoDictionary]; if (plist) { breakpad = BreakpadCreate(plist); BreakpadSetFilterCallback(breakpad, &BreakpadCallback, nullptr); } [pool release]; return breakpad; } #endif // HAVE_BREAKPAD @implementation AppDelegate - (id)init { if ((self = [super init])) { application_handler_ = nil; shortcut_handler_ = nil; dock_menu_ = nil; } return self; } - (id)initWithHandler:(PlatformInterface*)handler { application_handler_ = handler; #ifdef HAVE_BREAKPAD breakpad_ = InitBreakpad(); #endif // Register defaults for the whitelist of apps that want to use media keys [[NSUserDefaults standardUserDefaults] registerDefaults: [NSDictionary dictionaryWithObjectsAndKeys: [SPMediaKeyTap defaultMediaKeyUserBundleIdentifiers], kMediaKeyUsingBundleIdentifiersDefaultsKey, nil]]; return self; } - (BOOL)applicationShouldHandleReopen:(NSApplication*)app hasVisibleWindows:(BOOL)flag { if (application_handler_) { application_handler_->Activate(); } return YES; } - (void)setDockMenu:(NSMenu*)menu { dock_menu_ = menu; } - (NSMenu*)applicationDockMenu:(NSApplication*)sender { return dock_menu_; } - (void)setShortcutHandler:(MacGlobalShortcutBackend*)backend { shortcut_handler_ = backend; } - (MacGlobalShortcutBackend*)shortcut_handler { return shortcut_handler_; } - (void)applicationDidFinishLaunching:(NSNotification*)aNotification { key_tap_ = [[SPMediaKeyTap alloc] initWithDelegate:self]; if ([SPMediaKeyTap usesGlobalMediaKeyTap]) [key_tap_ startWatchingMediaKeys]; else qLog(Warning) << "Media key monitoring disabled"; } - (BOOL)application:(NSApplication*)app openFile:(NSString*)filename { qLog(Debug) << "Wants to open:" << [filename UTF8String]; if (application_handler_->LoadUrl(QString::fromUtf8([filename UTF8String]))) { return YES; } return NO; } - (void)application:(NSApplication*)app openFiles:(NSArray*)filenames { qLog(Debug) << "Wants to open:" << filenames; [filenames enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL* stop) { [self application:app openFile:(NSString*)object]; }]; } - (void)mediaKeyTap:(SPMediaKeyTap*)keyTap receivedMediaKeyEvent:(NSEvent*)event { NSAssert([event type] == NSSystemDefined && [event subtype] == SPSystemDefinedEventMediaKeys, @"Unexpected NSEvent in mediaKeyTap:receivedMediaKeyEvent:"); int key_code = (([event data1] & 0xFFFF0000) >> 16); int key_flags = ([event data1] & 0x0000FFFF); BOOL key_is_released = (((key_flags & 0xFF00) >> 8)) == 0xB; // not used. keep just in case // int key_repeat = (key_flags & 0x1); if (!shortcut_handler_) { return; } if (key_is_released) { shortcut_handler_->MacMediaKeyPressed(key_code); } } - (NSApplicationTerminateReply)applicationShouldTerminate: (NSApplication*)sender { #ifdef HAVE_BREAKPAD BreakpadRelease(breakpad_); #endif return NSTerminateNow; } - (BOOL)userNotificationCenter:(id)center shouldPresentNotification:(id)notification { // Always show notifications, even if Clementine is in the foreground. return YES; } @end @implementation MacApplication - (id)init { if ((self = [super init])) { [self SetShortcutHandler:nil]; } return self; } - (MacGlobalShortcutBackend*)shortcut_handler { // should be the same as delegate_'s shortcut handler return shortcut_handler_; } - (void)SetShortcutHandler:(MacGlobalShortcutBackend*)handler { shortcut_handler_ = handler; if (delegate_) [delegate_ setShortcutHandler:handler]; } - (PlatformInterface*)application_handler { return application_handler_; } - (void)SetApplicationHandler:(PlatformInterface*)handler { delegate_ = [[AppDelegate alloc] initWithHandler:handler]; // App-shortcut-handler set before delegate is set. // this makes sure the delegate's shortcut_handler is set [delegate_ setShortcutHandler:shortcut_handler_]; [self setDelegate:delegate_]; [[NSUserNotificationCenter defaultUserNotificationCenter] setDelegate:delegate_]; } - (void)sendEvent:(NSEvent*)event { // If event tap is not installed, handle events that reach the app instead BOOL shouldHandleMediaKeyEventLocally = ![SPMediaKeyTap usesGlobalMediaKeyTap]; if (shouldHandleMediaKeyEventLocally && [event type] == NSSystemDefined && [event subtype] == SPSystemDefinedEventMediaKeys) { [(id)[self delegate] mediaKeyTap:nil receivedMediaKeyEvent:event]; } [super sendEvent:event]; } @end namespace mac { void MacMain() { ScopedNSAutoreleasePool pool; // Creates and sets the magic global variable so QApplication will find it. [MacApplication sharedApplication]; #ifdef HAVE_SPARKLE // Creates and sets the magic global variable for Sparkle. [[SUUpdater sharedUpdater] setDelegate:NSApp]; #endif } void SetShortcutHandler(MacGlobalShortcutBackend* handler) { [NSApp SetShortcutHandler:handler]; } void SetApplicationHandler(PlatformInterface* handler) { [NSApp SetApplicationHandler:handler]; } void CheckForUpdates() { #ifdef HAVE_SPARKLE [[SUUpdater sharedUpdater] checkForUpdates:NSApp]; #endif } QString GetBundlePath() { ScopedCFTypeRef app_url( CFBundleCopyBundleURL(CFBundleGetMainBundle())); ScopedCFTypeRef mac_path( CFURLCopyFileSystemPath(app_url.get(), kCFURLPOSIXPathStyle)); const char* path = CFStringGetCStringPtr(mac_path.get(), CFStringGetSystemEncoding()); QString bundle_path = QString::fromUtf8(path); return bundle_path; } QString GetResourcesPath() { QString bundle_path = GetBundlePath(); return bundle_path + "/Contents/Resources"; } QString GetApplicationSupportPath() { ScopedNSAutoreleasePool pool; NSArray* paths = NSSearchPathForDirectoriesInDomains( NSApplicationSupportDirectory, NSUserDomainMask, YES); QString ret; if ([paths count] > 0) { NSString* user_path = [paths objectAtIndex:0]; ret = QString::fromUtf8([user_path UTF8String]); } else { ret = "~/Library/Application Support"; } return ret; } QString GetMusicDirectory() { ScopedNSAutoreleasePool pool; NSArray* paths = NSSearchPathForDirectoriesInDomains(NSMusicDirectory, NSUserDomainMask, YES); QString ret; if ([paths count] > 0) { NSString* user_path = [paths objectAtIndex:0]; ret = QString::fromUtf8([user_path UTF8String]); } else { ret = "~/Music"; } return ret; } static int MapFunctionKey(int keycode) { switch (keycode) { // Function keys case NSInsertFunctionKey: return Qt::Key_Insert; case NSDeleteFunctionKey: return Qt::Key_Delete; case NSPauseFunctionKey: return Qt::Key_Pause; case NSPrintFunctionKey: return Qt::Key_Print; case NSSysReqFunctionKey: return Qt::Key_SysReq; case NSHomeFunctionKey: return Qt::Key_Home; case NSEndFunctionKey: return Qt::Key_End; case NSLeftArrowFunctionKey: return Qt::Key_Left; case NSUpArrowFunctionKey: return Qt::Key_Up; case NSRightArrowFunctionKey: return Qt::Key_Right; case NSDownArrowFunctionKey: return Qt::Key_Down; case NSPageUpFunctionKey: return Qt::Key_PageUp; case NSPageDownFunctionKey: return Qt::Key_PageDown; case NSScrollLockFunctionKey: return Qt::Key_ScrollLock; case NSF1FunctionKey: return Qt::Key_F1; case NSF2FunctionKey: return Qt::Key_F2; case NSF3FunctionKey: return Qt::Key_F3; case NSF4FunctionKey: return Qt::Key_F4; case NSF5FunctionKey: return Qt::Key_F5; case NSF6FunctionKey: return Qt::Key_F6; case NSF7FunctionKey: return Qt::Key_F7; case NSF8FunctionKey: return Qt::Key_F8; case NSF9FunctionKey: return Qt::Key_F9; case NSF10FunctionKey: return Qt::Key_F10; case NSF11FunctionKey: return Qt::Key_F11; case NSF12FunctionKey: return Qt::Key_F12; case NSF13FunctionKey: return Qt::Key_F13; case NSF14FunctionKey: return Qt::Key_F14; case NSF15FunctionKey: return Qt::Key_F15; case NSF16FunctionKey: return Qt::Key_F16; case NSF17FunctionKey: return Qt::Key_F17; case NSF18FunctionKey: return Qt::Key_F18; case NSF19FunctionKey: return Qt::Key_F19; case NSF20FunctionKey: return Qt::Key_F20; case NSF21FunctionKey: return Qt::Key_F21; case NSF22FunctionKey: return Qt::Key_F22; case NSF23FunctionKey: return Qt::Key_F23; case NSF24FunctionKey: return Qt::Key_F24; case NSF25FunctionKey: return Qt::Key_F25; case NSF26FunctionKey: return Qt::Key_F26; case NSF27FunctionKey: return Qt::Key_F27; case NSF28FunctionKey: return Qt::Key_F28; case NSF29FunctionKey: return Qt::Key_F29; case NSF30FunctionKey: return Qt::Key_F30; case NSF31FunctionKey: return Qt::Key_F31; case NSF32FunctionKey: return Qt::Key_F32; case NSF33FunctionKey: return Qt::Key_F33; case NSF34FunctionKey: return Qt::Key_F34; case NSF35FunctionKey: return Qt::Key_F35; case NSMenuFunctionKey: return Qt::Key_Menu; case NSHelpFunctionKey: return Qt::Key_Help; } return 0; } QKeySequence KeySequenceFromNSEvent(NSEvent* event) { NSString* str = [event charactersIgnoringModifiers]; NSString* upper = [str uppercaseString]; const char* chars = [upper UTF8String]; NSUInteger modifiers = [event modifierFlags]; int key = 0; unsigned char c = chars[0]; switch (c) { case 0x1b: key = Qt::Key_Escape; break; case 0x09: key = Qt::Key_Tab; break; case 0x0d: key = Qt::Key_Return; break; case 0x08: key = Qt::Key_Backspace; break; case 0x03: key = Qt::Key_Enter; break; } if (key == 0) { if (c >= 0x20 && c <= 0x7e) { // ASCII from space to ~ key = c; } else { key = MapFunctionKey([event keyCode]); if (key == 0) { return QKeySequence(); } } } if (modifiers & NSShiftKeyMask) { key += Qt::SHIFT; } if (modifiers & NSControlKeyMask) { key += Qt::META; } if (modifiers & NSAlternateKeyMask) { key += Qt::ALT; } if (modifiers & NSCommandKeyMask) { key += Qt::CTRL; } return QKeySequence(key); } void DumpDictionary(CFDictionaryRef dict) { NSDictionary* d = (NSDictionary*)dict; NSLog(@"%@", d); } // NSWindowCollectionBehaviorFullScreenPrimary static const NSUInteger kFullScreenPrimary = 1 << 7; void EnableFullScreen(const QWidget& main_window) { NSView* view = reinterpret_cast(main_window.winId()); NSWindow* window = [view window]; [window setCollectionBehavior:kFullScreenPrimary]; } float GetDevicePixelRatio(QWidget* widget) { NSView* view = reinterpret_cast(widget->winId()); return [[view window] backingScaleFactor]; } } // namespace mac clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/mac_utilities.h000066400000000000000000000021011260417502300241040ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011-2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include #include #ifdef __OBJC__ @class NSEvent; #else class NSEvent; #endif namespace mac { QKeySequence KeySequenceFromNSEvent(NSEvent* event); void DumpDictionary(CFDictionaryRef dict); float GetDevicePixelRatio(QWidget* widget); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/macfslistener.h000066400000000000000000000035141260417502300241210ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_MACFSLISTENER_H_ #define CORE_MACFSLISTENER_H_ #include #include #include #include #include "filesystemwatcherinterface.h" class MacFSListener : public FileSystemWatcherInterface { Q_OBJECT public: explicit MacFSListener(QObject* parent = nullptr); void Init(); void AddPath(const QString& path); void RemovePath(const QString& path); void Clear(); signals: void PathChanged(const QString& path); private slots: void UpdateStream(); private: void UpdateStreamAsync(); static void EventStreamCallback(ConstFSEventStreamRef stream, void* user_data, size_t num_events, void* event_paths, const FSEventStreamEventFlags event_flags[], const FSEventStreamEventId event_ids[]); CFRunLoopRef run_loop_; FSEventStreamRef stream_; QSet paths_; QTimer update_timer_; }; #endif // CORE_MACFSLISTENER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/macfslistener.mm000066400000000000000000000064011260417502300243010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2012, 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "macfslistener.h" #include #include #include #include "core/logging.h" #include "core/scoped_nsobject.h" MacFSListener::MacFSListener(QObject* parent) : FileSystemWatcherInterface(parent), run_loop_(nullptr), stream_(nullptr) { update_timer_.setSingleShot(true); update_timer_.setInterval(2000); connect(&update_timer_, SIGNAL(timeout()), SLOT(UpdateStream())); } void MacFSListener::Init() { run_loop_ = CFRunLoopGetCurrent(); } void MacFSListener::EventStreamCallback( ConstFSEventStreamRef stream, void* user_data, size_t num_events, void* event_paths, const FSEventStreamEventFlags event_flags[], const FSEventStreamEventId event_ids[]) { MacFSListener* me = reinterpret_cast(user_data); char** paths = reinterpret_cast(event_paths); for (int i = 0; i < num_events; ++i) { QString path = QString::fromUtf8(paths[i]); qLog(Debug) << "Something changed at:" << path; while (path.endsWith('/')) { path.chop(1); } emit me->PathChanged(path); } } void MacFSListener::AddPath(const QString& path) { Q_ASSERT(run_loop_); paths_.insert(path); UpdateStreamAsync(); } void MacFSListener::RemovePath(const QString& path) { Q_ASSERT(run_loop_); paths_.remove(path); UpdateStreamAsync(); } void MacFSListener::Clear() { paths_.clear(); UpdateStreamAsync(); } void MacFSListener::UpdateStreamAsync() { update_timer_.start(); } void MacFSListener::UpdateStream() { if (stream_) { FSEventStreamStop(stream_); FSEventStreamInvalidate(stream_); FSEventStreamRelease(stream_); stream_ = nullptr; } if (paths_.empty()) { return; } scoped_nsobject array([[NSMutableArray alloc] init]); for (const QString& path : paths_) { scoped_nsobject string( [[NSString alloc] initWithUTF8String:path.toUtf8().constData()]); [array addObject:string.get()]; } FSEventStreamContext context; memset(&context, 0, sizeof(context)); context.info = this; CFAbsoluteTime latency = 1.0; stream_ = FSEventStreamCreate(nullptr, &EventStreamCallback, &context, // Copied reinterpret_cast(array.get()), kFSEventStreamEventIdSinceNow, latency, kFSEventStreamCreateFlagNone); FSEventStreamScheduleWithRunLoop(stream_, run_loop_, kCFRunLoopDefaultMode); FSEventStreamStart(stream_); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/macglobalshortcutbackend.h000066400000000000000000000032431260417502300263060ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Copyright 2010, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_MACGLOBALSHORTCUTBACKEND_H_ #define CORE_MACGLOBALSHORTCUTBACKEND_H_ #include #include "globalshortcutbackend.h" #include #include class MacGlobalShortcutBackendPrivate; class QAction; class MacGlobalShortcutBackend : public GlobalShortcutBackend { Q_OBJECT public: explicit MacGlobalShortcutBackend(GlobalShortcuts* parent); virtual ~MacGlobalShortcutBackend(); bool IsAccessibilityEnabled() const; void ShowAccessibilityDialog(); void MacMediaKeyPressed(int key); protected: bool DoRegister(); void DoUnregister(); private: bool KeyPressed(const QKeySequence& sequence); QMap shortcuts_; friend class MacGlobalShortcutBackendPrivate; std::unique_ptr p_; }; #endif // CORE_MACGLOBALSHORTCUTBACKEND_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/macglobalshortcutbackend.mm000066400000000000000000000116421260417502300264720ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Copyright 2010-2011, 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "macglobalshortcutbackend.h" #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "core/globalshortcuts.h" #include "core/logging.h" #include "core/mac_startup.h" #include "core/utilities.h" #import "core/mac_utilities.h" #import "mac/SBSystemPreferences.h" class MacGlobalShortcutBackendPrivate : boost::noncopyable { public: explicit MacGlobalShortcutBackendPrivate(MacGlobalShortcutBackend* backend) : global_monitor_(nil), local_monitor_(nil), backend_(backend) {} bool Register() { global_monitor_ = [NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask handler:^(NSEvent* event) { HandleKeyEvent(event); }]; local_monitor_ = [NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask handler:^(NSEvent* event) { // Filter event if we handle // it as a global shortcut. return HandleKeyEvent(event) ? nil : event; }]; return true; } void Unregister() { [NSEvent removeMonitor:global_monitor_]; [NSEvent removeMonitor:local_monitor_]; } private: bool HandleKeyEvent(NSEvent* event) { QKeySequence sequence = mac::KeySequenceFromNSEvent(event); return backend_->KeyPressed(sequence); } id global_monitor_; id local_monitor_; MacGlobalShortcutBackend* backend_; }; MacGlobalShortcutBackend::MacGlobalShortcutBackend(GlobalShortcuts* parent) : GlobalShortcutBackend(parent), p_(new MacGlobalShortcutBackendPrivate(this)) {} MacGlobalShortcutBackend::~MacGlobalShortcutBackend() {} bool MacGlobalShortcutBackend::DoRegister() { // Always enable media keys. mac::SetShortcutHandler(this); for (const GlobalShortcuts::Shortcut& shortcut : manager_->shortcuts().values()) { shortcuts_[shortcut.action->shortcut()] = shortcut.action; } return p_->Register(); } void MacGlobalShortcutBackend::DoUnregister() { p_->Unregister(); shortcuts_.clear(); } void MacGlobalShortcutBackend::MacMediaKeyPressed(int key) { switch (key) { case NX_KEYTYPE_PLAY: KeyPressed(Qt::Key_MediaPlay); break; case NX_KEYTYPE_FAST: KeyPressed(Qt::Key_MediaNext); break; case NX_KEYTYPE_REWIND: KeyPressed(Qt::Key_MediaPrevious); break; } } bool MacGlobalShortcutBackend::KeyPressed(const QKeySequence& sequence) { if (sequence.isEmpty()) { return false; } QAction* action = shortcuts_[sequence]; if (action) { action->trigger(); return true; } return false; } bool MacGlobalShortcutBackend::IsAccessibilityEnabled() const { return AXAPIEnabled(); } void MacGlobalShortcutBackend::ShowAccessibilityDialog() { NSArray* paths = NSSearchPathForDirectoriesInDomains( NSPreferencePanesDirectory, NSSystemDomainMask, YES); if ([paths count] == 1) { SBSystemPreferencesApplication* system_prefs = [SBApplication applicationWithBundleIdentifier:@"com.apple.systempreferences"]; [system_prefs activate]; SBElementArray* panes = [system_prefs panes]; SBSystemPreferencesPane* security_pane = nil; for (SBSystemPreferencesPane* pane : panes) { if ([[pane id] isEqualToString:@"com.apple.preference.security"]) { security_pane = pane; break; } } [system_prefs setCurrentPane:security_pane]; SBElementArray* anchors = [security_pane anchors]; for (SBSystemPreferencesAnchor* anchor : anchors) { if ([[anchor name] isEqualToString:@"Privacy_Accessibility"]) { [anchor reveal]; } } } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/mergedproxymodel.cpp000066400000000000000000000436551260417502300252150ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2012, David Sansome Copyright 2011, Arnaud Bienner Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "mergedproxymodel.h" #include "core/logging.h" #include #include // boost::multi_index still relies on these being in the global namespace. using std::placeholders::_1; using std::placeholders::_2; #include #include #include #include using boost::multi_index::hashed_unique; using boost::multi_index::identity; using boost::multi_index::indexed_by; using boost::multi_index::member; using boost::multi_index::multi_index_container; using boost::multi_index::ordered_unique; using boost::multi_index::tag; std::size_t hash_value(const QModelIndex& index) { return qHash(index); } namespace { struct Mapping { explicit Mapping(const QModelIndex& _source_index) : source_index(_source_index) {} QModelIndex source_index; }; struct tag_by_source {}; struct tag_by_pointer {}; } // namespace class MergedProxyModelPrivate { private: typedef multi_index_container< Mapping*, indexed_by< hashed_unique, member >, ordered_unique, identity > > > MappingContainer; public: MappingContainer mappings_; }; MergedProxyModel::MergedProxyModel(QObject* parent) : QAbstractProxyModel(parent), resetting_model_(nullptr), p_(new MergedProxyModelPrivate) {} MergedProxyModel::~MergedProxyModel() { DeleteAllMappings(); } void MergedProxyModel::DeleteAllMappings() { const auto& begin = p_->mappings_.get().begin(); const auto& end = p_->mappings_.get().end(); qDeleteAll(begin, end); } void MergedProxyModel::AddSubModel(const QModelIndex& source_parent, QAbstractItemModel* submodel) { connect(submodel, SIGNAL(modelReset()), this, SLOT(SubModelReset())); connect(submodel, SIGNAL(rowsAboutToBeInserted(QModelIndex, int, int)), this, SLOT(RowsAboutToBeInserted(QModelIndex, int, int))); connect(submodel, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), this, SLOT(RowsAboutToBeRemoved(QModelIndex, int, int))); connect(submodel, SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(RowsInserted(QModelIndex, int, int))); connect(submodel, SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(RowsRemoved(QModelIndex, int, int))); connect(submodel, SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SLOT(DataChanged(QModelIndex, QModelIndex))); QModelIndex proxy_parent = mapFromSource(source_parent); const int rows = submodel->rowCount(); if (rows) beginInsertRows(proxy_parent, 0, rows - 1); merge_points_.insert(submodel, source_parent); if (rows) endInsertRows(); } void MergedProxyModel::RemoveSubModel(const QModelIndex& source_parent) { // Find the submodel that the parent corresponded to QAbstractItemModel* submodel = merge_points_.key(source_parent); merge_points_.remove(submodel); // The submodel might have been deleted already so we must be careful not // to dereference it. // Remove all the children of the item that got deleted QModelIndex proxy_parent = mapFromSource(source_parent); // We can't know how many children it had, since we can't dereference it resetting_model_ = submodel; beginRemoveRows(proxy_parent, 0, std::numeric_limits::max() - 1); endRemoveRows(); resetting_model_ = nullptr; // Delete all the mappings that reference the submodel auto it = p_->mappings_.get().begin(); auto end = p_->mappings_.get().end(); while (it != end) { if ((*it)->source_index.model() == submodel) { delete *it; it = p_->mappings_.get().erase(it); } else { ++it; } } } void MergedProxyModel::setSourceModel(QAbstractItemModel* source_model) { if (sourceModel()) { disconnect(sourceModel(), SIGNAL(modelReset()), this, SLOT(SourceModelReset())); disconnect(sourceModel(), SIGNAL(rowsAboutToBeInserted(QModelIndex, int, int)), this, SLOT(RowsAboutToBeInserted(QModelIndex, int, int))); disconnect(sourceModel(), SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), this, SLOT(RowsAboutToBeRemoved(QModelIndex, int, int))); disconnect(sourceModel(), SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(RowsInserted(QModelIndex, int, int))); disconnect(sourceModel(), SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(RowsRemoved(QModelIndex, int, int))); disconnect(sourceModel(), SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SLOT(DataChanged(QModelIndex, QModelIndex))); disconnect(sourceModel(), SIGNAL(layoutAboutToBeChanged()), this, SLOT(LayoutAboutToBeChanged())); disconnect(sourceModel(), SIGNAL(layoutChanged()), this, SLOT(LayoutChanged())); } QAbstractProxyModel::setSourceModel(source_model); connect(sourceModel(), SIGNAL(modelReset()), this, SLOT(SourceModelReset())); connect(sourceModel(), SIGNAL(rowsAboutToBeInserted(QModelIndex, int, int)), this, SLOT(RowsAboutToBeInserted(QModelIndex, int, int))); connect(sourceModel(), SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), this, SLOT(RowsAboutToBeRemoved(QModelIndex, int, int))); connect(sourceModel(), SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(RowsInserted(QModelIndex, int, int))); connect(sourceModel(), SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(RowsRemoved(QModelIndex, int, int))); connect(sourceModel(), SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SLOT(DataChanged(QModelIndex, QModelIndex))); connect(sourceModel(), SIGNAL(layoutAboutToBeChanged()), this, SLOT(LayoutAboutToBeChanged())); connect(sourceModel(), SIGNAL(layoutChanged()), this, SLOT(LayoutChanged())); } void MergedProxyModel::SourceModelReset() { // Delete all mappings DeleteAllMappings(); // Clear the containers p_->mappings_.clear(); merge_points_.clear(); // Reset the proxy reset(); } void MergedProxyModel::SubModelReset() { QAbstractItemModel* submodel = static_cast(sender()); // TODO(David Sansome): When we require Qt 4.6, use beginResetModel() and // endResetModel() in LibraryModel and catch those here - that will let // us do away with this std::numeric_limits::max() hack. // Remove all the children of the item that got deleted QModelIndex source_parent = merge_points_.value(submodel); QModelIndex proxy_parent = mapFromSource(source_parent); // We can't know how many children it had, since it's already disappeared... resetting_model_ = submodel; beginRemoveRows(proxy_parent, 0, std::numeric_limits::max() - 1); endRemoveRows(); resetting_model_ = nullptr; // Delete all the mappings that reference the submodel auto it = p_->mappings_.get().begin(); auto end = p_->mappings_.get().end(); while (it != end) { if ((*it)->source_index.model() == submodel) { delete *it; it = p_->mappings_.get().erase(it); } else { ++it; } } // "Insert" items from the newly reset submodel int count = submodel->rowCount(); if (count) { beginInsertRows(proxy_parent, 0, count - 1); endInsertRows(); } emit SubModelReset(proxy_parent, submodel); } QModelIndex MergedProxyModel::GetActualSourceParent( const QModelIndex& source_parent, QAbstractItemModel* model) const { if (!source_parent.isValid() && model != sourceModel()) return merge_points_.value(model); return source_parent; } void MergedProxyModel::RowsAboutToBeInserted(const QModelIndex& source_parent, int start, int end) { beginInsertRows( mapFromSource(GetActualSourceParent( source_parent, static_cast(sender()))), start, end); } void MergedProxyModel::RowsInserted(const QModelIndex&, int, int) { endInsertRows(); } void MergedProxyModel::RowsAboutToBeRemoved(const QModelIndex& source_parent, int start, int end) { beginRemoveRows( mapFromSource(GetActualSourceParent( source_parent, static_cast(sender()))), start, end); } void MergedProxyModel::RowsRemoved(const QModelIndex&, int, int) { endRemoveRows(); } QModelIndex MergedProxyModel::mapToSource(const QModelIndex& proxy_index) const { if (!proxy_index.isValid()) return QModelIndex(); Mapping* mapping = static_cast(proxy_index.internalPointer()); if (p_->mappings_.get().find(mapping) == p_->mappings_.get().end()) return QModelIndex(); if (mapping->source_index.model() == resetting_model_) return QModelIndex(); return mapping->source_index; } QModelIndex MergedProxyModel::mapFromSource(const QModelIndex& source_index) const { if (!source_index.isValid()) return QModelIndex(); if (source_index.model() == resetting_model_) return QModelIndex(); // Add a mapping if we don't have one already const auto& it = p_->mappings_.get().find(source_index); Mapping* mapping; if (it != p_->mappings_.get().end()) { mapping = *it; } else { mapping = new Mapping(source_index); const_cast(this)->p_->mappings_.insert(mapping); } return createIndex(source_index.row(), source_index.column(), mapping); } QModelIndex MergedProxyModel::index(int row, int column, const QModelIndex& parent) const { QModelIndex source_index; if (!parent.isValid()) { source_index = sourceModel()->index(row, column, QModelIndex()); } else { QModelIndex source_parent = mapToSource(parent); const QAbstractItemModel* child_model = merge_points_.key(source_parent); if (child_model) source_index = child_model->index(row, column, QModelIndex()); else source_index = source_parent.model()->index(row, column, source_parent); } return mapFromSource(source_index); } QModelIndex MergedProxyModel::parent(const QModelIndex& child) const { QModelIndex source_child = mapToSource(child); if (source_child.model() == sourceModel()) return mapFromSource(source_child.parent()); if (!IsKnownModel(source_child.model())) return QModelIndex(); if (!source_child.parent().isValid()) return mapFromSource(merge_points_.value(GetModel(source_child))); return mapFromSource(source_child.parent()); } int MergedProxyModel::rowCount(const QModelIndex& parent) const { if (!parent.isValid()) return sourceModel()->rowCount(QModelIndex()); QModelIndex source_parent = mapToSource(parent); if (!IsKnownModel(source_parent.model())) return 0; const QAbstractItemModel* child_model = merge_points_.key(source_parent); if (child_model) { // Query the source model but disregard what it says, so it gets a chance // to lazy load source_parent.model()->rowCount(source_parent); return child_model->rowCount(QModelIndex()); } return source_parent.model()->rowCount(source_parent); } int MergedProxyModel::columnCount(const QModelIndex& parent) const { if (!parent.isValid()) return sourceModel()->columnCount(QModelIndex()); QModelIndex source_parent = mapToSource(parent); if (!IsKnownModel(source_parent.model())) return 0; const QAbstractItemModel* child_model = merge_points_.key(source_parent); if (child_model) return child_model->columnCount(QModelIndex()); return source_parent.model()->columnCount(source_parent); } bool MergedProxyModel::hasChildren(const QModelIndex& parent) const { if (!parent.isValid()) return sourceModel()->hasChildren(QModelIndex()); QModelIndex source_parent = mapToSource(parent); if (!IsKnownModel(source_parent.model())) return false; const QAbstractItemModel* child_model = merge_points_.key(source_parent); if (child_model) return child_model->hasChildren(QModelIndex()) || source_parent.model()->hasChildren(source_parent); return source_parent.model()->hasChildren(source_parent); } QVariant MergedProxyModel::data(const QModelIndex& proxyIndex, int role) const { QModelIndex source_index = mapToSource(proxyIndex); if (!IsKnownModel(source_index.model())) return QVariant(); return source_index.model()->data(source_index, role); } QMap MergedProxyModel::itemData(const QModelIndex& proxy_index) const { QModelIndex source_index = mapToSource(proxy_index); if (!source_index.isValid()) return sourceModel()->itemData(QModelIndex()); return source_index.model()->itemData(source_index); } Qt::ItemFlags MergedProxyModel::flags(const QModelIndex& index) const { QModelIndex source_index = mapToSource(index); if (!source_index.isValid()) return sourceModel()->flags(QModelIndex()); return source_index.model()->flags(source_index); } bool MergedProxyModel::setData(const QModelIndex& index, const QVariant& value, int role) { QModelIndex source_index = mapToSource(index); if (!source_index.isValid()) return sourceModel()->setData(index, value, role); return GetModel(index)->setData(index, value, role); } QStringList MergedProxyModel::mimeTypes() const { QStringList ret; ret << sourceModel()->mimeTypes(); for (const QAbstractItemModel* model : merge_points_.keys()) { ret << model->mimeTypes(); } return ret; } QMimeData* MergedProxyModel::mimeData(const QModelIndexList& indexes) const { if (indexes.isEmpty()) return 0; // Only ask the first index's model const QAbstractItemModel* model = mapToSource(indexes[0]).model(); if (!model) { return 0; } // Only ask about the indexes that are actually in that model QModelIndexList indexes_in_model; for (const QModelIndex& proxy_index : indexes) { QModelIndex source_index = mapToSource(proxy_index); if (source_index.model() != model) continue; indexes_in_model << source_index; } return model->mimeData(indexes_in_model); } bool MergedProxyModel::dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent) { if (!parent.isValid()) { return false; } return sourceModel()->dropMimeData(data, action, row, column, parent); } QModelIndex MergedProxyModel::FindSourceParent(const QModelIndex& proxy_index) const { if (!proxy_index.isValid()) return QModelIndex(); QModelIndex source_index = mapToSource(proxy_index); if (source_index.model() == sourceModel()) return source_index; return merge_points_.value(GetModel(source_index)); } bool MergedProxyModel::canFetchMore(const QModelIndex& parent) const { QModelIndex source_index = mapToSource(parent); if (!source_index.isValid()) return sourceModel()->canFetchMore(QModelIndex()); return source_index.model()->canFetchMore(source_index); } void MergedProxyModel::fetchMore(const QModelIndex& parent) { QModelIndex source_index = mapToSource(parent); if (!source_index.isValid()) sourceModel()->fetchMore(QModelIndex()); else GetModel(source_index)->fetchMore(source_index); } QAbstractItemModel* MergedProxyModel::GetModel(const QModelIndex& source_index) const { // This is essentially const_cast(source_index.model()), // but without the const_cast const QAbstractItemModel* const_model = source_index.model(); if (const_model == sourceModel()) return sourceModel(); for (QAbstractItemModel* submodel : merge_points_.keys()) { if (submodel == const_model) return submodel; } return nullptr; } void MergedProxyModel::DataChanged(const QModelIndex& top_left, const QModelIndex& bottom_right) { emit dataChanged(mapFromSource(top_left), mapFromSource(bottom_right)); } void MergedProxyModel::LayoutAboutToBeChanged() { old_merge_points_.clear(); for (QAbstractItemModel* key : merge_points_.keys()) { old_merge_points_[key] = merge_points_.value(key); } } void MergedProxyModel::LayoutChanged() { for (QAbstractItemModel* key : merge_points_.keys()) { if (!old_merge_points_.contains(key)) continue; const int old_row = old_merge_points_[key].row(); const int new_row = merge_points_[key].row(); if (old_row != new_row) { reset(); return; } } } bool MergedProxyModel::IsKnownModel(const QAbstractItemModel* model) const { if (model == this || model == sourceModel() || merge_points_.contains(const_cast(model))) return true; return false; } QModelIndexList MergedProxyModel::mapFromSource( const QModelIndexList& source_indexes) const { QModelIndexList ret; for (const QModelIndex& index : source_indexes) { ret << mapFromSource(index); } return ret; } QModelIndexList MergedProxyModel::mapToSource( const QModelIndexList& proxy_indexes) const { QModelIndexList ret; for (const QModelIndex& index : proxy_indexes) { ret << mapToSource(index); } return ret; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/mergedproxymodel.h000066400000000000000000000106501260417502300246470ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_MERGEDPROXYMODEL_H_ #define CORE_MERGEDPROXYMODEL_H_ #include #include std::size_t hash_value(const QModelIndex& index); class MergedProxyModelPrivate; class MergedProxyModel : public QAbstractProxyModel { Q_OBJECT public: explicit MergedProxyModel(QObject* parent = nullptr); ~MergedProxyModel(); // Make another model appear as a child of the given item in the source model. void AddSubModel(const QModelIndex& source_parent, QAbstractItemModel* submodel); void RemoveSubModel(const QModelIndex& source_parent); // Find the item in the source model that is the parent of the model // containing proxy_index. If proxy_index is in the source model, then // this just returns mapToSource(proxy_index). QModelIndex FindSourceParent(const QModelIndex& proxy_index) const; // QAbstractItemModel QModelIndex index(int row, int column, const QModelIndex& parent) const; QModelIndex parent(const QModelIndex& child) const; int rowCount(const QModelIndex& parent) const; int columnCount(const QModelIndex& parent) const; QVariant data(const QModelIndex& proxyIndex, int role = Qt::DisplayRole) const; bool hasChildren(const QModelIndex& parent) const; QMap itemData(const QModelIndex& proxyIndex) const; Qt::ItemFlags flags(const QModelIndex& index) const; bool setData(const QModelIndex& index, const QVariant& value, int role); QStringList mimeTypes() const; QMimeData* mimeData(const QModelIndexList& indexes) const; bool dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent); bool canFetchMore(const QModelIndex& parent) const; void fetchMore(const QModelIndex& parent); // QAbstractProxyModel // Note that these implementations of map{To,From}Source will not always // give you an index in sourceModel(), you might get an index in one of the // child models instead. QModelIndex mapFromSource(const QModelIndex& sourceIndex) const; QModelIndex mapToSource(const QModelIndex& proxyIndex) const; void setSourceModel(QAbstractItemModel* sourceModel); // Convenience functions that call map{To,From}Source multiple times. QModelIndexList mapFromSource(const QModelIndexList& source_indexes) const; QModelIndexList mapToSource(const QModelIndexList& proxy_indexes) const; signals: void SubModelReset(const QModelIndex& root, QAbstractItemModel* model); private slots: void SourceModelReset(); void SubModelReset(); void RowsAboutToBeInserted(const QModelIndex& source_parent, int start, int end); void RowsInserted(const QModelIndex& source_parent, int start, int end); void RowsAboutToBeRemoved(const QModelIndex& source_parent, int start, int end); void RowsRemoved(const QModelIndex& source_parent, int start, int end); void DataChanged(const QModelIndex& top_left, const QModelIndex& bottom_right); void LayoutAboutToBeChanged(); void LayoutChanged(); private: QModelIndex GetActualSourceParent(const QModelIndex& source_parent, QAbstractItemModel* model) const; QAbstractItemModel* GetModel(const QModelIndex& source_index) const; void DeleteAllMappings(); bool IsKnownModel(const QAbstractItemModel* model) const; QMap merge_points_; QAbstractItemModel* resetting_model_; QMap old_merge_points_; std::unique_ptr p_; }; #endif // CORE_MERGEDPROXYMODEL_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/metatypes.cpp000066400000000000000000000122151260417502300236260ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, 2014, John Maguire Copyright 2013, Andreas Copyright 2013, pie.or.paj Copyright 2014, David Sansome Copyright 2014, Maltsev Vlad Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "metatypes.h" #include #include #include "config.h" #include "covers/albumcoverfetcher.h" #include "engines/enginebase.h" #include "engines/gstengine.h" #include "globalsearch/searchprovider.h" #include "internet/digitally/digitallyimportedclient.h" #include "internet/core/geolocator.h" #include "internet/podcasts/podcastepisode.h" #include "internet/podcasts/podcast.h" #include "internet/somafm/somafmservice.h" #include "library/directory.h" #include "playlist/playlist.h" #include "songinfo/collapsibleinfopane.h" #include "ui/equalizer.h" #ifdef HAVE_VK #include "internet/vk/vkservice.h" #endif #ifdef HAVE_DBUS #include #include "core/mpris2.h" #include "dbus/metatypes.h" #endif class GstEnginePipeline; class QNetworkReply; void RegisterMetaTypes() { qRegisterMetaType("CollapsibleInfoPane::Data"); qRegisterMetaType("ColumnAlignmentMap"); qRegisterMetaType("const char*"); qRegisterMetaType("CoverSearchResult"); qRegisterMetaType("CoverSearchResults"); qRegisterMetaType( "DigitallyImportedClient::Channel"); qRegisterMetaType("Directory"); qRegisterMetaType("DirectoryList"); qRegisterMetaType("Engine::SimpleMetaBundle"); qRegisterMetaType("Engine::State"); qRegisterMetaType("Engine::TrackChangeFlags"); qRegisterMetaType("Equalizer::Params"); qRegisterMetaType("Geolocator::LatLng"); qRegisterMetaType("GstBuffer*"); qRegisterMetaType("GstElement*"); qRegisterMetaType("GstEngine::OutputDetails"); qRegisterMetaType("GstEnginePipeline*"); qRegisterMetaType("PlaylistItemList"); qRegisterMetaType("PlaylistItemPtr"); qRegisterMetaType("PodcastEpisodeList"); qRegisterMetaType("PodcastList"); qRegisterMetaType>("QList"); qRegisterMetaType>("QList"); qRegisterMetaType>("QList"); qRegisterMetaType( "PlaylistSequence::RepeatMode"); qRegisterMetaType( "PlaylistSequence::ShuffleMode"); qRegisterMetaType>("QList"); qRegisterMetaType>("QList"); qRegisterMetaType>("QList"); qRegisterMetaType>("QList"); qRegisterMetaType("QNetworkCookie"); qRegisterMetaType("QNetworkReply*"); qRegisterMetaType("QNetworkReply**"); qRegisterMetaType("SearchProvider::ResultList"); qRegisterMetaType("SearchProvider::Result"); qRegisterMetaType( "smart_playlists::GeneratorPtr"); qRegisterMetaType("SomaFMService::Stream"); qRegisterMetaType("SongList"); qRegisterMetaType("Song"); qRegisterMetaTypeStreamOperators( "DigitallyImportedClient::Channel"); qRegisterMetaTypeStreamOperators("Equalizer::Params"); qRegisterMetaTypeStreamOperators>("ColumnAlignmentMap"); qRegisterMetaTypeStreamOperators( "SomaFMService::Stream"); qRegisterMetaType("SubdirectoryList"); qRegisterMetaType("Subdirectory"); qRegisterMetaType>("QList"); #ifdef HAVE_VK qRegisterMetaType("MusicOwner"); qRegisterMetaTypeStreamOperators("MusicOwner"); #endif #ifdef HAVE_DBUS qDBusRegisterMetaType(); qDBusRegisterMetaType(); qDBusRegisterMetaType(); qDBusRegisterMetaType>(); qDBusRegisterMetaType(); qDBusRegisterMetaType(); qDBusRegisterMetaType(); #endif } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/metatypes.h000066400000000000000000000016041260417502300232730ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_METATYPES_H_ #define CORE_METATYPES_H_ void RegisterMetaTypes(); #endif // CORE_METATYPES_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/mimedata.h000066400000000000000000000055271260417502300230510ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, Paweł Bara Copyright 2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_MIMEDATA_H_ #define CORE_MIMEDATA_H_ #include class MimeData : public QMimeData { Q_OBJECT public: MimeData(bool clear = false, bool play_now = false, bool enqueue = false, bool open_in_new_playlist = false) : override_user_settings_(false), clear_first_(clear), play_now_(play_now), enqueue_now_(enqueue), open_in_new_playlist_(open_in_new_playlist), name_for_new_playlist_(QString()), from_doubleclick_(false) {} // If this is set then MainWindow will not touch any of the other flags. bool override_user_settings_; // If this is set then the playlist will be cleared before these songs // are inserted. bool clear_first_; // If this is set then the first item that is inserted will start playing // immediately. Note: this is always overridden with the user's preference // if the MimeData goes via MainWindow, unless you set // override_user_settings_. bool play_now_; // If this is set then the items are added to the queue after being inserted. bool enqueue_now_; // If this is set then the items are inserted into a newly created playlist. bool open_in_new_playlist_; // This serves as a name for the new playlist in 'open_in_new_playlist_' mode. QString name_for_new_playlist_; // This can be set if this MimeData goes via MainWindow (ie. it is created // manually in a double-click). The MainWindow will set the above flags to // the defaults set by the user. bool from_doubleclick_; // Returns a pretty name for a playlist containing songs described by this // MimeData // object. By pretty name we mean the value of 'name_for_new_playlist_' or // generic // "Playlist" string if the 'name_for_new_playlist_' attribute is empty. QString get_name_for_new_playlist() { return name_for_new_playlist_.isEmpty() ? tr("Playlist") : name_for_new_playlist_; } }; #endif // CORE_MIMEDATA_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/modelfuturewatcher.h000066400000000000000000000024561260417502300251770ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_MODELFUTUREWATCHER_H_ #define CORE_MODELFUTUREWATCHER_H_ #include #include template class ModelFutureWatcher : public QFutureWatcher { public: explicit ModelFutureWatcher(const QModelIndex& index, QObject* parent = nullptr) : QFutureWatcher(parent), index_(index) {} ~ModelFutureWatcher() {} const QPersistentModelIndex& index() const { return index_; } private: QPersistentModelIndex index_; }; #endif // CORE_MODELFUTUREWATCHER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/mpris.cpp000066400000000000000000000022661260417502300227520ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2012, David Sansome Copyright 2010, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "mpris.h" #include "mpris1.h" #include "mpris2.h" namespace mpris { Mpris::Mpris(Application* app, QObject* parent) : QObject(parent), mpris1_(new mpris::Mpris1(app, this)), mpris2_(new mpris::Mpris2(app, mpris1_, this)) { connect(mpris2_, SIGNAL(RaiseMainWindow()), SIGNAL(RaiseMainWindow())); } } // namespace mpris clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/mpris.h000066400000000000000000000023331260417502300224120ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2012, David Sansome Copyright 2010, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_MPRIS_H_ #define CORE_MPRIS_H_ #include class Application; namespace mpris { class Mpris1; class Mpris2; class Mpris : public QObject { Q_OBJECT public: explicit Mpris(Application* app, QObject* parent = nullptr); signals: void RaiseMainWindow(); private: Mpris1* mpris1_; Mpris2* mpris2_; }; } // namespace mpris #endif // CORE_MPRIS_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/mpris1.cpp000066400000000000000000000272461260417502300230400ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, Paweł Bara Copyright 2011-2012, David Sansome Copyright 2013, Uwe Klotz Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "mpris1.h" #include "mpris_common.h" #include "core/application.h" #include "core/logging.h" #include "covers/currentartloader.h" #include #include #include "core/mpris_player.h" #include "core/mpris_root.h" #include "core/mpris_tracklist.h" #include "core/timeconstants.h" #include "engines/enginebase.h" #include "playlist/playlist.h" #include "playlist/playlistmanager.h" #include "playlist/playlistsequence.h" namespace mpris { const char* Mpris1::kDefaultDbusServiceName = "org.mpris.clementine"; Mpris1::Mpris1(Application* app, QObject* parent, const QString& dbus_service_name) : QObject(parent), dbus_service_name_(dbus_service_name), root_(nullptr), player_(nullptr), tracklist_(nullptr) { qDBusRegisterMetaType(); qDBusRegisterMetaType(); if (dbus_service_name_.isEmpty()) { dbus_service_name_ = kDefaultDbusServiceName; } if (!QDBusConnection::sessionBus().registerService(dbus_service_name_)) { qLog(Warning) << "Failed to register" << dbus_service_name_ << "on the session bus"; return; } root_ = new Mpris1Root(app, this); player_ = new Mpris1Player(app, this); tracklist_ = new Mpris1TrackList(app, this); connect(app->current_art_loader(), SIGNAL(ArtLoaded(const Song&, const QString&, const QImage&)), player_, SLOT(CurrentSongChanged(const Song&, const QString&, const QImage&))); } Mpris1::~Mpris1() { QDBusConnection::sessionBus().unregisterService(dbus_service_name_); } Mpris1Root::Mpris1Root(Application* app, QObject* parent) : QObject(parent), app_(app) { new MprisRoot(this); QDBusConnection::sessionBus().registerObject("/", this); } Mpris1Player::Mpris1Player(Application* app, QObject* parent) : QObject(parent), app_(app) { new MprisPlayer(this); QDBusConnection::sessionBus().registerObject("/Player", this); connect(app_->player()->engine(), SIGNAL(StateChanged(Engine::State)), SLOT(EngineStateChanged(Engine::State))); connect(app_->playlist_manager(), SIGNAL(PlaylistManagerInitialized()), SLOT(PlaylistManagerInitialized())); } // when PlaylistManager gets it ready, we connect PlaylistSequence with this void Mpris1Player::PlaylistManagerInitialized() { connect(app_->playlist_manager()->sequence(), SIGNAL(ShuffleModeChanged(PlaylistSequence::ShuffleMode)), SLOT(ShuffleModeChanged())); connect(app_->playlist_manager()->sequence(), SIGNAL(RepeatModeChanged(PlaylistSequence::RepeatMode)), SLOT(RepeatModeChanged())); } Mpris1TrackList::Mpris1TrackList(Application* app, QObject* parent) : QObject(parent), app_(app) { new MprisTrackList(this); QDBusConnection::sessionBus().registerObject("/TrackList", this); connect(app_->playlist_manager(), SIGNAL(PlaylistChanged(Playlist*)), SLOT(PlaylistChanged(Playlist*))); } void Mpris1TrackList::PlaylistChanged(Playlist* playlist) { emit TrackListChange(playlist->rowCount()); } // we use the state from event and don't try to obtain it from Player // later because only the event's version is really the current one void Mpris1Player::EngineStateChanged(Engine::State state) { emit StatusChange(GetStatus(state)); emit CapsChange(GetCaps(state)); } void Mpris1Player::CurrentSongChanged(const Song& song, const QString& art_uri, const QImage&) { last_metadata_ = Mpris1::GetMetadata(song); if (!art_uri.isEmpty()) { AddMetadata("arturl", art_uri, &last_metadata_); } emit TrackChange(last_metadata_); emit StatusChange(GetStatus()); emit CapsChange(GetCaps()); } QString Mpris1Root::Identity() { return QString("%1 %2").arg(QCoreApplication::applicationName(), QCoreApplication::applicationVersion()); } Version Mpris1Root::MprisVersion() { Version version; version.major = 1; version.minor = 0; return version; } void Mpris1Root::Quit() { qApp->quit(); } void Mpris1Player::Pause() { app_->player()->PlayPause(); } void Mpris1Player::Stop() { app_->player()->Stop(); } void Mpris1Player::Prev() { app_->player()->Previous(); } void Mpris1Player::Play() { app_->player()->Play(); } void Mpris1Player::Next() { app_->player()->Next(); } void Mpris1Player::Repeat(bool repeat) { app_->playlist_manager()->sequence()->SetRepeatMode( repeat ? PlaylistSequence::Repeat_Track : PlaylistSequence::Repeat_Off); } void Mpris1Player::ShuffleModeChanged() { emit StatusChange(GetStatus()); } void Mpris1Player::RepeatModeChanged() { emit StatusChange(GetStatus()); } DBusStatus Mpris1Player::GetStatus() const { return GetStatus(app_->player()->GetState()); } DBusStatus Mpris1Player::GetStatus(Engine::State state) const { DBusStatus status; switch (state) { case Engine::Playing: status.play = DBusStatus::Mpris_Playing; break; case Engine::Paused: status.play = DBusStatus::Mpris_Paused; break; case Engine::Empty: case Engine::Idle: default: status.play = DBusStatus::Mpris_Stopped; break; } if (app_->playlist_manager()->sequence()) { PlaylistManagerInterface* playlists_ = app_->playlist_manager(); PlaylistSequence::RepeatMode repeat_mode = playlists_->sequence()->repeat_mode(); status.random = playlists_->sequence()->shuffle_mode() == PlaylistSequence::Shuffle_Off ? 0 : 1; status.repeat = repeat_mode == PlaylistSequence::Repeat_Track ? 1 : 0; status.repeat_playlist = (repeat_mode == PlaylistSequence::Repeat_Album || repeat_mode == PlaylistSequence::Repeat_Playlist || repeat_mode == PlaylistSequence::Repeat_Track) ? 1 : 0; } return status; } void Mpris1Player::VolumeSet(int volume) { app_->player()->SetVolume(volume); } int Mpris1Player::VolumeGet() const { return app_->player()->GetVolume(); } void Mpris1Player::PositionSet(int pos_msec) { app_->player()->SeekTo(pos_msec / kMsecPerSec); } int Mpris1Player::PositionGet() const { return app_->player()->engine()->position_nanosec() / kNsecPerMsec; } QVariantMap Mpris1Player::GetMetadata() const { return last_metadata_; } int Mpris1Player::GetCaps() const { return GetCaps(app_->player()->GetState()); } int Mpris1Player::GetCaps(Engine::State state) const { int caps = CAN_HAS_TRACKLIST; PlaylistItemPtr current_item = app_->player()->GetCurrentItem(); PlaylistManagerInterface* playlists = app_->playlist_manager(); if (playlists->active()) { // play is disabled when playlist is empty or when last.fm stream is already // playing if (playlists->active() && playlists->active()->rowCount() != 0 && !(state == Engine::Playing && (app_->player()->GetCurrentItem()->options() & PlaylistItem::LastFMControls))) { caps |= CAN_PLAY; } if (playlists->active()->next_row() != -1) { caps |= CAN_GO_NEXT; } if (playlists->active()->previous_row() != -1 || app_->player()->PreviousWouldRestartTrack()) { caps |= CAN_GO_PREV; } } if (current_item) { caps |= CAN_PROVIDE_METADATA; if (state == Engine::Playing && !(current_item->options() & PlaylistItem::PauseDisabled)) { caps |= CAN_PAUSE; } if (state != Engine::Empty && !current_item->Metadata().is_stream()) { caps |= CAN_SEEK; } } return caps; } void Mpris1Player::VolumeUp(int change) { VolumeSet(VolumeGet() + change); } void Mpris1Player::VolumeDown(int change) { VolumeSet(VolumeGet() - change); } void Mpris1Player::Mute() { app_->player()->Mute(); } void Mpris1Player::ShowOSD() { app_->player()->ShowOSD(); } int Mpris1TrackList::AddTrack(const QString& track, bool play) { app_->playlist_manager()->active()->InsertUrls(QList() << QUrl(track), -1, play); return 0; } void Mpris1TrackList::DelTrack(int index) { app_->playlist_manager()->active()->removeRows(index, 1); } int Mpris1TrackList::GetCurrentTrack() const { return app_->playlist_manager()->active()->current_row(); } int Mpris1TrackList::GetLength() const { return app_->playlist_manager()->active()->rowCount(); } QVariantMap Mpris1TrackList::GetMetadata(int pos) const { PlaylistItemPtr item = app_->player()->GetItemAt(pos); if (!item) return QVariantMap(); return Mpris1::GetMetadata(item->Metadata()); } void Mpris1TrackList::SetLoop(bool enable) { app_->playlist_manager()->active()->sequence()->SetRepeatMode( enable ? PlaylistSequence::Repeat_Playlist : PlaylistSequence::Repeat_Off); } void Mpris1TrackList::SetRandom(bool enable) { app_->playlist_manager()->active()->sequence()->SetShuffleMode( enable ? PlaylistSequence::Shuffle_All : PlaylistSequence::Shuffle_Off); } void Mpris1TrackList::PlayTrack(int index) { app_->player()->PlayAt(index, Engine::Manual, true); } QVariantMap Mpris1::GetMetadata(const Song& song) { QVariantMap ret; AddMetadata("location", song.url().toString(), &ret); AddMetadata("title", song.PrettyTitle(), &ret); AddMetadata("artist", song.artist(), &ret); AddMetadata("album", song.album(), &ret); AddMetadata("time", song.length_nanosec() / kNsecPerSec, &ret); AddMetadata("mtime", song.length_nanosec() / kNsecPerMsec, &ret); AddMetadata("tracknumber", song.track(), &ret); AddMetadata("year", song.year(), &ret); AddMetadata("genre", song.genre(), &ret); AddMetadata("disc", song.disc(), &ret); AddMetadata("comment", song.comment(), &ret); AddMetadata("audio-bitrate", song.bitrate(), &ret); AddMetadata("audio-samplerate", song.samplerate(), &ret); AddMetadata("bpm", song.bpm(), &ret); AddMetadata("composer", song.composer(), &ret); AddMetadata("performer", song.performer(), &ret); AddMetadata("grouping", song.grouping(), &ret); AddMetadata("lyrics", song.lyrics(), &ret); if (song.rating() != -1.0) { AddMetadata("rating", song.rating() * 5, &ret); } return ret; } } // namespace mpris QDBusArgument& operator<<(QDBusArgument& arg, const Version& version) { arg.beginStructure(); arg << version.major << version.minor; arg.endStructure(); return arg; } const QDBusArgument& operator>>(const QDBusArgument& arg, Version& version) { arg.beginStructure(); arg >> version.major >> version.minor; arg.endStructure(); return arg; } QDBusArgument& operator<<(QDBusArgument& arg, const DBusStatus& status) { arg.beginStructure(); arg << status.play; arg << status.random; arg << status.repeat; arg << status.repeat_playlist; arg.endStructure(); return arg; } const QDBusArgument& operator>>(const QDBusArgument& arg, DBusStatus& status) { arg.beginStructure(); arg >> status.play; arg >> status.random; arg >> status.repeat; arg >> status.repeat_playlist; arg.endStructure(); return arg; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/mpris1.h000066400000000000000000000114451260417502300224770ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011-2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_MPRIS1_H_ #define CORE_MPRIS1_H_ #include "core/player.h" #include #include #include class Application; class Playlist; struct DBusStatus { // From Amarok. DBusStatus() : play(Mpris_Stopped), random(0), repeat(0), repeat_playlist(0) {} int play; // Playing = 0, Paused = 1, Stopped = 2 int random; // Linearly = 0, Randomly = 1 int repeat; // Go_To_Next = 0, Repeat_Current = 1 int repeat_playlist; // Stop_When_Finished = 0, Never_Give_Up_Playing = 1, // Never_Let_You_Down = 42 enum MprisPlayState { Mpris_Playing = 0, Mpris_Paused = 1, Mpris_Stopped = 2, }; }; Q_DECLARE_METATYPE(DBusStatus); QDBusArgument& operator<<(QDBusArgument& arg, const DBusStatus& status); const QDBusArgument& operator>>(const QDBusArgument& arg, DBusStatus& status); struct Version { quint16 minor; quint16 major; }; Q_DECLARE_METATYPE(Version); QDBusArgument& operator<<(QDBusArgument& arg, const Version& version); const QDBusArgument& operator>>(const QDBusArgument& arg, Version& version); namespace mpris { enum DBusCaps { NONE = 0, CAN_GO_NEXT = 1 << 0, CAN_GO_PREV = 1 << 1, CAN_PAUSE = 1 << 2, CAN_PLAY = 1 << 3, CAN_SEEK = 1 << 4, CAN_PROVIDE_METADATA = 1 << 5, CAN_HAS_TRACKLIST = 1 << 6, }; class Mpris1Root; class Mpris1Player; class Mpris1TrackList; class Mpris1 : public QObject { Q_OBJECT public: Mpris1(Application* app, QObject* parent = nullptr, const QString& dbus_service_name = QString()); ~Mpris1(); static QVariantMap GetMetadata(const Song& song); Mpris1Root* root() const { return root_; } Mpris1Player* player() const { return player_; } Mpris1TrackList* tracklist() const { return tracklist_; } private: static const char* kDefaultDbusServiceName; QString dbus_service_name_; Mpris1Root* root_; Mpris1Player* player_; Mpris1TrackList* tracklist_; }; class Mpris1Root : public QObject { Q_OBJECT public: explicit Mpris1Root(Application* app, QObject* parent = nullptr); QString Identity(); void Quit(); Version MprisVersion(); private: Application* app_; }; class Mpris1Player : public QObject { Q_OBJECT public: explicit Mpris1Player(Application* app, QObject* parent = nullptr); void Pause(); void Stop(); void Prev(); void Play(); void Next(); void Repeat(bool); // those methods will use engine's state obtained with player->GetState() // method DBusStatus GetStatus() const; int GetCaps() const; // those methods will use engine's state provided as an argument DBusStatus GetStatus(Engine::State state) const; int GetCaps(Engine::State state) const; void VolumeSet(int volume); int VolumeGet() const; void PositionSet(int pos_msec); int PositionGet() const; QVariantMap GetMetadata() const; // Amarok extensions void VolumeUp(int vol); void VolumeDown(int vol); void Mute(); void ShowOSD(); public slots: void CurrentSongChanged(const Song& song, const QString& art_uri, const QImage&); signals: void CapsChange(int); void TrackChange(const QVariantMap&); void StatusChange(DBusStatus); private slots: void PlaylistManagerInitialized(); void EngineStateChanged(Engine::State state); void ShuffleModeChanged(); void RepeatModeChanged(); private: Application* app_; QVariantMap last_metadata_; }; class Mpris1TrackList : public QObject { Q_OBJECT public: explicit Mpris1TrackList(Application* app, QObject* parent = nullptr); int AddTrack(const QString&, bool); void DelTrack(int index); int GetCurrentTrack() const; int GetLength() const; QVariantMap GetMetadata(int) const; void SetLoop(bool enable); void SetRandom(bool enable); // Amarok extension void PlayTrack(int index); signals: void TrackListChange(int i); private slots: void PlaylistChanged(Playlist* playlist); private: Application* app_; }; } // namespace mpris #endif // CORE_MPRIS1_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/mpris2.cpp000066400000000000000000000414721260417502300230360ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2012, David Sansome Copyright 2010-2011, Paweł Bara Copyright 2012, 2014, John Maguire Copyright 2013, Arnaud Bienner Copyright 2013, TTSDA Copyright 2013, Aggelos Biboudis Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "mpris2.h" #include #include "config.h" #include "mpris_common.h" #include "mpris1.h" #include "core/application.h" #include "core/logging.h" #include "core/mpris2_player.h" #include "core/mpris2_playlists.h" #include "core/mpris2_root.h" #include "core/mpris2_tracklist.h" #include "core/player.h" #include "core/timeconstants.h" #include "covers/currentartloader.h" #include "engines/enginebase.h" #include "playlist/playlist.h" #include "playlist/playlistmanager.h" #include "playlist/playlistsequence.h" #include "ui/mainwindow.h" #include #include #include QDBusArgument& operator<<(QDBusArgument& arg, const MprisPlaylist& playlist) { arg.beginStructure(); arg << playlist.id << playlist.name << playlist.icon; arg.endStructure(); return arg; } const QDBusArgument& operator>>(const QDBusArgument& arg, MprisPlaylist& playlist) { arg.beginStructure(); arg >> playlist.id >> playlist.name >> playlist.icon; arg.endStructure(); return arg; } QDBusArgument& operator<<(QDBusArgument& arg, const MaybePlaylist& playlist) { arg.beginStructure(); arg << playlist.valid; arg << playlist.playlist; arg.endStructure(); return arg; } const QDBusArgument& operator>>(const QDBusArgument& arg, MaybePlaylist& playlist) { arg.beginStructure(); arg >> playlist.valid >> playlist.playlist; arg.endStructure(); return arg; } namespace mpris { const char* Mpris2::kMprisObjectPath = "/org/mpris/MediaPlayer2"; const char* Mpris2::kServiceName = "org.mpris.MediaPlayer2.clementine"; const char* Mpris2::kFreedesktopPath = "org.freedesktop.DBus.Properties"; Mpris2::Mpris2(Application* app, Mpris1* mpris1, QObject* parent) : QObject(parent), app_(app), mpris1_(mpris1) { new Mpris2Root(this); new Mpris2TrackList(this); new Mpris2Player(this); new Mpris2Playlists(this); if (!QDBusConnection::sessionBus().registerService(kServiceName)) { qLog(Warning) << "Failed to register" << QString(kServiceName) << "on the session bus"; return; } QDBusConnection::sessionBus().registerObject(kMprisObjectPath, this); connect(app_->current_art_loader(), SIGNAL(ArtLoaded(Song, QString, QImage)), SLOT(ArtLoaded(Song, QString))); connect(app_->player()->engine(), SIGNAL(StateChanged(Engine::State)), SLOT(EngineStateChanged(Engine::State))); connect(app_->player(), SIGNAL(VolumeChanged(int)), SLOT(VolumeChanged())); connect(app_->player(), SIGNAL(Seeked(qlonglong)), SIGNAL(Seeked(qlonglong))); connect(app_->playlist_manager(), SIGNAL(PlaylistManagerInitialized()), SLOT(PlaylistManagerInitialized())); connect(app_->playlist_manager(), SIGNAL(CurrentSongChanged(Song)), SLOT(CurrentSongChanged(Song))); connect(app_->playlist_manager(), SIGNAL(PlaylistChanged(Playlist*)), SLOT(PlaylistChanged(Playlist*))); connect(app_->playlist_manager(), SIGNAL(CurrentChanged(Playlist*)), SLOT(PlaylistCollectionChanged(Playlist*))); } // when PlaylistManager gets it ready, we connect PlaylistSequence with this void Mpris2::PlaylistManagerInitialized() { connect(app_->playlist_manager()->sequence(), SIGNAL(ShuffleModeChanged(PlaylistSequence::ShuffleMode)), SLOT(ShuffleModeChanged())); connect(app_->playlist_manager()->sequence(), SIGNAL(RepeatModeChanged(PlaylistSequence::RepeatMode)), SLOT(RepeatModeChanged())); } void Mpris2::EngineStateChanged(Engine::State newState) { if (newState != Engine::Playing && newState != Engine::Paused) { last_metadata_ = QVariantMap(); EmitNotification("Metadata"); } EmitNotification("PlaybackStatus", PlaybackStatus(newState)); } void Mpris2::VolumeChanged() { EmitNotification("Volume"); } void Mpris2::ShuffleModeChanged() { EmitNotification("Shuffle"); } void Mpris2::RepeatModeChanged() { EmitNotification("LoopStatus"); } void Mpris2::EmitNotification(const QString& name, const QVariant& val) { EmitNotification(name, val, "org.mpris.MediaPlayer2.Player"); } void Mpris2::EmitNotification(const QString& name, const QVariant& val, const QString& mprisEntity) { QDBusMessage msg = QDBusMessage::createSignal( kMprisObjectPath, kFreedesktopPath, "PropertiesChanged"); QVariantMap map; map.insert(name, val); QVariantList args = QVariantList() << mprisEntity << map << QStringList(); msg.setArguments(args); QDBusConnection::sessionBus().send(msg); } void Mpris2::EmitNotification(const QString& name) { QVariant value; if (name == "PlaybackStatus") value = PlaybackStatus(); else if (name == "LoopStatus") value = LoopStatus(); else if (name == "Shuffle") value = Shuffle(); else if (name == "Metadata") value = Metadata(); else if (name == "Volume") value = Volume(); else if (name == "Position") value = Position(); if (value.isValid()) EmitNotification(name, value); } // ------------------Root Interface--------------- // bool Mpris2::CanQuit() const { return true; } bool Mpris2::CanRaise() const { return true; } bool Mpris2::HasTrackList() const { return true; } QString Mpris2::Identity() const { return QCoreApplication::applicationName(); } QString Mpris2::DesktopEntryAbsolutePath() const { QStringList xdg_data_dirs = QString(getenv("XDG_DATA_DIRS")).split(":"); xdg_data_dirs.append("/usr/local/share/"); xdg_data_dirs.append("/usr/share/"); for (const QString& directory : xdg_data_dirs) { QString path = QString("%1/applications/%2.desktop").arg( directory, QApplication::applicationName().toLower()); if (QFile::exists(path)) return path; } return QString(); } QString Mpris2::DesktopEntry() const { return QApplication::applicationName().toLower(); } QStringList Mpris2::SupportedUriSchemes() const { static QStringList res = QStringList() << "file" << "http" << "cdda" << "smb" << "sftp"; return res; } QStringList Mpris2::SupportedMimeTypes() const { static QStringList res = QStringList() << "application/ogg" << "application/x-ogg" << "application/x-ogm-audio" << "audio/aac" << "audio/mp4" << "audio/mpeg" << "audio/mpegurl" << "audio/ogg" << "audio/vnd.rn-realaudio" << "audio/vorbis" << "audio/x-flac" << "audio/x-mp3" << "audio/x-mpeg" << "audio/x-mpegurl" << "audio/x-ms-wma" << "audio/x-musepack" << "audio/x-oggflac" << "audio/x-pn-realaudio" << "audio/x-scpls" << "audio/x-speex" << "audio/x-vorbis" << "audio/x-vorbis+ogg" << "audio/x-wav" << "video/x-ms-asf" << "x-content/audio-player"; return res; } void Mpris2::Raise() { emit RaiseMainWindow(); } void Mpris2::Quit() { qApp->quit(); } QString Mpris2::PlaybackStatus() const { return PlaybackStatus(app_->player()->GetState()); } QString Mpris2::PlaybackStatus(Engine::State state) const { switch (state) { case Engine::Playing: return "Playing"; case Engine::Paused: return "Paused"; default: return "Stopped"; } } QString Mpris2::LoopStatus() const { if (!app_->playlist_manager()->sequence()) { return "None"; } switch (app_->playlist_manager()->sequence()->repeat_mode()) { case PlaylistSequence::Repeat_Album: case PlaylistSequence::Repeat_Playlist: return "Playlist"; case PlaylistSequence::Repeat_Track: return "Track"; default: return "None"; } } void Mpris2::SetLoopStatus(const QString& value) { PlaylistSequence::RepeatMode mode = PlaylistSequence::Repeat_Off; if (value == "None") { mode = PlaylistSequence::Repeat_Off; } else if (value == "Track") { mode = PlaylistSequence::Repeat_Track; } else if (value == "Playlist") { mode = PlaylistSequence::Repeat_Playlist; } app_->playlist_manager()->active()->sequence()->SetRepeatMode(mode); } double Mpris2::Rate() const { return 1.0; } void Mpris2::SetRate(double rate) { if (rate == 0) { if (mpris1_->player()) { mpris1_->player()->Pause(); } } } bool Mpris2::Shuffle() const { if (mpris1_->player()) { return mpris1_->player()->GetStatus().random; } else { return false; } } void Mpris2::SetShuffle(bool value) { if (mpris1_->tracklist()) { mpris1_->tracklist()->SetRandom(value); } } QVariantMap Mpris2::Metadata() const { return last_metadata_; } QString Mpris2::current_track_id() const { if (!mpris1_->tracklist()) { return QString(); } return QString("/org/mpris/MediaPlayer2/Track/%1") .arg(QString::number(mpris1_->tracklist()->GetCurrentTrack())); } // We send Metadata change notification as soon as the process of // changing song starts... void Mpris2::CurrentSongChanged(const Song& song) { ArtLoaded(song, ""); } // ... and we add the cover information later, when it's available. void Mpris2::ArtLoaded(const Song& song, const QString& art_uri) { last_metadata_ = QVariantMap(); song.ToXesam(&last_metadata_); using mpris::AddMetadata; AddMetadata("mpris:trackid", current_track_id(), &last_metadata_); if (song.rating() != -1.0) { AddMetadata("rating", song.rating() * 5, &last_metadata_); } if (!art_uri.isEmpty()) { AddMetadata("mpris:artUrl", art_uri, &last_metadata_); } AddMetadata("year", song.year(), &last_metadata_); AddMetadata("bitrate", song.bitrate(), &last_metadata_); EmitNotification("Metadata", last_metadata_); } double Mpris2::Volume() const { if (mpris1_->player()) { return static_cast(mpris1_->player()->VolumeGet()) / 100; } else { return 0.0; } } void Mpris2::SetVolume(double value) { app_->player()->SetVolume(value * 100); } qlonglong Mpris2::Position() const { return app_->player()->engine()->position_nanosec() / kNsecPerUsec; } double Mpris2::MaximumRate() const { return 1.0; } double Mpris2::MinimumRate() const { return 1.0; } bool Mpris2::CanGoNext() const { if (mpris1_->player()) { return mpris1_->player()->GetCaps() & CAN_GO_NEXT; } else { return true; } } bool Mpris2::CanGoPrevious() const { if (mpris1_->player()) { return mpris1_->player()->GetCaps() & CAN_GO_PREV; } else { return true; } } bool Mpris2::CanPlay() const { return mpris1_->player()->GetCaps() & CAN_PLAY; } // This one's a bit different than MPRIS 1 - we want this to be true even when // the song is already paused or stopped. bool Mpris2::CanPause() const { if (mpris1_->player()) { return mpris1_->player()->GetCaps() & CAN_PAUSE || PlaybackStatus() == "Paused" || PlaybackStatus() == "Stopped"; } else { return true; } } bool Mpris2::CanSeek() const { if (mpris1_->player()) { return mpris1_->player()->GetCaps() & CAN_SEEK; } else { return true; } } bool Mpris2::CanControl() const { return true; } void Mpris2::Next() { if (CanGoNext()) { app_->player()->Next(); } } void Mpris2::Previous() { if (CanGoPrevious()) { app_->player()->Previous(); } } void Mpris2::Pause() { if (CanPause() && app_->player()->GetState() != Engine::Paused) { app_->player()->Pause(); } } void Mpris2::PlayPause() { if (CanPause()) { app_->player()->PlayPause(); } } void Mpris2::Stop() { app_->player()->Stop(); } void Mpris2::Play() { if (CanPlay()) { app_->player()->Play(); } } void Mpris2::Seek(qlonglong offset) { if (CanSeek()) { app_->player()->SeekTo(app_->player()->engine()->position_nanosec() / kNsecPerSec + offset / kUsecPerSec); } } void Mpris2::SetPosition(const QDBusObjectPath& trackId, qlonglong offset) { if (CanSeek() && trackId.path() == current_track_id() && offset >= 0) { offset *= kNsecPerUsec; if (offset < app_->player()->GetCurrentItem()->Metadata().length_nanosec()) { app_->player()->SeekTo(offset / kNsecPerSec); } } } void Mpris2::OpenUri(const QString& uri) { if (mpris1_->tracklist()) { mpris1_->tracklist()->AddTrack(uri, true); } } TrackIds Mpris2::Tracks() const { // TODO(John Maguire): ? return TrackIds(); } bool Mpris2::CanEditTracks() const { return false; } TrackMetadata Mpris2::GetTracksMetadata(const TrackIds& tracks) const { // TODO(John Maguire): ? return TrackMetadata(); } void Mpris2::AddTrack(const QString& uri, const QDBusObjectPath& afterTrack, bool setAsCurrent) { // TODO(John Maguire): ? } void Mpris2::RemoveTrack(const QDBusObjectPath& trackId) { // TODO(John Maguire): ? } void Mpris2::GoTo(const QDBusObjectPath& trackId) { // TODO(John Maguire): ? } quint32 Mpris2::PlaylistCount() const { return app_->playlist_manager()->GetAllPlaylists().size(); } QStringList Mpris2::Orderings() const { return QStringList() << "User"; } namespace { QDBusObjectPath MakePlaylistPath(int id) { return QDBusObjectPath( QString("/org/mpris/MediaPlayer2/Playlists/%1").arg(id)); } } MaybePlaylist Mpris2::ActivePlaylist() const { MaybePlaylist maybe_playlist; Playlist* current_playlist = app_->playlist_manager()->current(); maybe_playlist.valid = current_playlist; if (!current_playlist) { return maybe_playlist; } maybe_playlist.playlist.id = MakePlaylistPath(current_playlist->id()); maybe_playlist.playlist.name = app_->playlist_manager()->GetPlaylistName(current_playlist->id()); return maybe_playlist; } void Mpris2::ActivatePlaylist(const QDBusObjectPath& playlist_id) { QStringList split_path = playlist_id.path().split('/'); qLog(Debug) << Q_FUNC_INFO << playlist_id.path() << split_path; if (split_path.isEmpty()) { return; } bool ok = false; int p = split_path.last().toInt(&ok); if (!ok) { return; } if (!app_->playlist_manager()->IsPlaylistOpen(p)) { qLog(Error) << "Playlist isn't opened!"; return; } app_->playlist_manager()->SetActivePlaylist(p); app_->player()->Next(); } // TODO(John Maguire): Support sort orders. MprisPlaylistList Mpris2::GetPlaylists(quint32 index, quint32 max_count, const QString& order, bool reverse_order) { MprisPlaylistList ret; for (Playlist* p : app_->playlist_manager()->GetAllPlaylists()) { MprisPlaylist mpris_playlist; mpris_playlist.id = MakePlaylistPath(p->id()); mpris_playlist.name = app_->playlist_manager()->GetPlaylistName(p->id()); ret << mpris_playlist; } if (reverse_order) { std::reverse(ret.begin(), ret.end()); } return ret.mid(index, max_count); } void Mpris2::PlaylistChanged(Playlist* playlist) { MprisPlaylist mpris_playlist; mpris_playlist.id = MakePlaylistPath(playlist->id()); mpris_playlist.name = app_->playlist_manager()->GetPlaylistName(playlist->id()); emit PlaylistChanged(mpris_playlist); } void Mpris2::PlaylistCollectionChanged(Playlist* playlist) { EmitNotification("PlaylistCount", "", "org.mpris.MediaPlayer2.Playlists"); } } // namespace mpris clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/mpris2.h000066400000000000000000000165021260417502300224770ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, Paweł Bara Copyright 2010-2012, David Sansome Copyright 2011-2012, 2014, John Maguire Copyright 2013, Aggelos Biboudis Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_MPRIS2_H_ #define CORE_MPRIS2_H_ #include "playlist/playlistitem.h" #include #include #include class Application; class MainWindow; class Playlist; typedef QList TrackMetadata; typedef QList TrackIds; Q_DECLARE_METATYPE(TrackMetadata) struct MprisPlaylist { QDBusObjectPath id; QString name; QString icon; // Uri }; typedef QList MprisPlaylistList; Q_DECLARE_METATYPE(MprisPlaylist); Q_DECLARE_METATYPE(MprisPlaylistList); struct MaybePlaylist { bool valid; MprisPlaylist playlist; }; Q_DECLARE_METATYPE(MaybePlaylist); QDBusArgument& operator<<(QDBusArgument& arg, const MprisPlaylist& playlist); const QDBusArgument& operator>>(const QDBusArgument& arg, MprisPlaylist& playlist); QDBusArgument& operator<<(QDBusArgument& arg, const MaybePlaylist& playlist); const QDBusArgument& operator>>(const QDBusArgument& arg, MaybePlaylist& playlist); namespace mpris { class Mpris1; class Mpris2 : public QObject { Q_OBJECT public: // org.mpris.MediaPlayer2 MPRIS 2.0 Root interface Q_PROPERTY(bool CanQuit READ CanQuit) Q_PROPERTY(bool CanRaise READ CanRaise) Q_PROPERTY(bool HasTrackList READ HasTrackList) Q_PROPERTY(QString Identity READ Identity) Q_PROPERTY(QString DesktopEntry READ DesktopEntry) Q_PROPERTY(QStringList SupportedUriSchemes READ SupportedUriSchemes) Q_PROPERTY(QStringList SupportedMimeTypes READ SupportedMimeTypes) // org.mpris.MediaPlayer2 MPRIS 2.2 Root interface Q_PROPERTY(bool CanSetFullscreen READ CanSetFullscreen) Q_PROPERTY(bool Fullscreen READ Fullscreen WRITE SetFullscreen) // org.mpris.MediaPlayer2.Player MPRIS 2.0 Player interface Q_PROPERTY(QString PlaybackStatus READ PlaybackStatus) Q_PROPERTY(QString LoopStatus READ LoopStatus WRITE SetLoopStatus) Q_PROPERTY(double Rate READ Rate WRITE SetRate) Q_PROPERTY(bool Shuffle READ Shuffle WRITE SetShuffle) Q_PROPERTY(QVariantMap Metadata READ Metadata) Q_PROPERTY(double Volume READ Volume WRITE SetVolume) Q_PROPERTY(qlonglong Position READ Position) Q_PROPERTY(double MinimumRate READ MinimumRate) Q_PROPERTY(double MaximumRate READ MaximumRate) Q_PROPERTY(bool CanGoNext READ CanGoNext) Q_PROPERTY(bool CanGoPrevious READ CanGoPrevious) Q_PROPERTY(bool CanPlay READ CanPlay) Q_PROPERTY(bool CanPause READ CanPause) Q_PROPERTY(bool CanSeek READ CanSeek) Q_PROPERTY(bool CanControl READ CanControl) // org.mpris.MediaPlayer2.TrackList MPRIS 2.0 Player interface Q_PROPERTY(TrackIds Tracks READ Tracks) Q_PROPERTY(bool CanEditTracks READ CanEditTracks) // org.mpris.MediaPlayer2.Playlists MPRIS 2.1 Playlists interface Q_PROPERTY(quint32 PlaylistCount READ PlaylistCount) Q_PROPERTY(QStringList Orderings READ Orderings) Q_PROPERTY(MaybePlaylist ActivePlaylist READ ActivePlaylist) Mpris2(Application* app, Mpris1* mpris1, QObject* parent = nullptr); // Root Properties bool CanQuit() const; bool CanRaise() const; bool HasTrackList() const; QString Identity() const; QString DesktopEntry() const; QStringList SupportedUriSchemes() const; QStringList SupportedMimeTypes() const; // Root Properties added in MPRIS 2.2 bool CanSetFullscreen() const { return false; } bool Fullscreen() const { return false; } void SetFullscreen(bool) {} // Methods void Raise(); void Quit(); // Player Properties QString PlaybackStatus() const; QString LoopStatus() const; void SetLoopStatus(const QString& value); double Rate() const; void SetRate(double value); bool Shuffle() const; void SetShuffle(bool value); QVariantMap Metadata() const; double Volume() const; void SetVolume(double value); qlonglong Position() const; double MaximumRate() const; double MinimumRate() const; bool CanGoNext() const; bool CanGoPrevious() const; bool CanPlay() const; bool CanPause() const; bool CanSeek() const; bool CanControl() const; // Methods void Next(); void Previous(); void Pause(); void PlayPause(); void Stop(); void Play(); void Seek(qlonglong offset); void SetPosition(const QDBusObjectPath& trackId, qlonglong offset); void OpenUri(const QString& uri); // TrackList Properties TrackIds Tracks() const; bool CanEditTracks() const; // Methods TrackMetadata GetTracksMetadata(const TrackIds& tracks) const; void AddTrack(const QString& uri, const QDBusObjectPath& afterTrack, bool setAsCurrent); void RemoveTrack(const QDBusObjectPath& trackId); void GoTo(const QDBusObjectPath& trackId); // Playlist Properties quint32 PlaylistCount() const; QStringList Orderings() const; MaybePlaylist ActivePlaylist() const; // Methods void ActivatePlaylist(const QDBusObjectPath& playlist_id); QList GetPlaylists(quint32 index, quint32 max_count, const QString& order, bool reverse_order); signals: // Player void Seeked(qlonglong position); // TrackList void TrackListReplaced(const TrackIds& Tracks, QDBusObjectPath CurrentTrack); void TrackAdded(const TrackMetadata& Metadata, QDBusObjectPath AfterTrack); void TrackRemoved(const QDBusObjectPath& trackId); void TrackMetadataChanged(const QDBusObjectPath& trackId, const TrackMetadata& metadata); void RaiseMainWindow(); // Playlist void PlaylistChanged(const MprisPlaylist& playlist); private slots: void ArtLoaded(const Song& song, const QString& art_uri); void EngineStateChanged(Engine::State newState); void VolumeChanged(); void PlaylistManagerInitialized(); void CurrentSongChanged(const Song& song); void ShuffleModeChanged(); void RepeatModeChanged(); void PlaylistChanged(Playlist* playlist); void PlaylistCollectionChanged(Playlist* playlist); private: void EmitNotification(const QString& name); void EmitNotification(const QString& name, const QVariant& val); void EmitNotification(const QString& name, const QVariant& val, const QString& mprisEntity); QString PlaybackStatus(Engine::State state) const; QString current_track_id() const; QString DesktopEntryAbsolutePath() const; private: static const char* kMprisObjectPath; static const char* kServiceName; static const char* kFreedesktopPath; QVariantMap last_metadata_; Application* app_; Mpris1* mpris1_; }; } // namespace mpris #endif // CORE_MPRIS2_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/mpris_common.h000066400000000000000000000041761260417502300237710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, Paweł Bara Copyright 2010-2011, David Sansome Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_MPRIS_COMMON_H_ #define CORE_MPRIS_COMMON_H_ #include #include #include #include namespace mpris { inline void AddMetadata(const QString& key, const QString& metadata, QVariantMap* map) { if (!metadata.isEmpty()) (*map)[key] = metadata; } inline void AddMetadataAsList(const QString& key, const QString& metadata, QVariantMap* map) { if (!metadata.isEmpty()) (*map)[key] = QStringList() << metadata; } inline void AddMetadata(const QString& key, int metadata, QVariantMap* map) { if (metadata > 0) (*map)[key] = metadata; } inline void AddMetadata(const QString& key, qint64 metadata, QVariantMap* map) { if (metadata > 0) (*map)[key] = metadata; } inline void AddMetadata(const QString& key, double metadata, QVariantMap* map) { if (metadata != 0.0) (*map)[key] = metadata; } inline void AddMetadata(const QString& key, const QDateTime& metadata, QVariantMap* map) { if (metadata.isValid()) (*map)[key] = metadata; } inline QString AsMPRISDateTimeType(uint time) { return time != -1 ? QDateTime::fromTime_t(time).toString(Qt::ISODate) : ""; } } // namespace mpris #endif // CORE_MPRIS_COMMON_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/multisortfilterproxy.cpp000066400000000000000000000062261260417502300261720ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011-2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "multisortfilterproxy.h" #include "core/logging.h" #include #include #include MultiSortFilterProxy::MultiSortFilterProxy(QObject* parent) : QSortFilterProxyModel(parent) {} void MultiSortFilterProxy::AddSortSpec(int role, Qt::SortOrder order) { sorting_ << SortSpec(role, order); } bool MultiSortFilterProxy::lessThan(const QModelIndex& left, const QModelIndex& right) const { for (const SortSpec& spec : sorting_) { const int ret = Compare(left.data(spec.first), right.data(spec.first)); if (ret < 0) { return spec.second == Qt::AscendingOrder; } else if (ret > 0) { return spec.second != Qt::AscendingOrder; } } return left.row() < right.row(); } template static inline int DoCompare(T left, T right) { if (left < right) return -1; if (left > right) return 1; return 0; } int MultiSortFilterProxy::Compare(const QVariant& left, const QVariant& right) const { // Copied from the QSortFilterProxyModel::lessThan implementation, but returns // -1, 0 or 1 instead of true or false. switch (left.userType()) { case QVariant::Invalid: return (right.type() != QVariant::Invalid) ? -1 : 0; case QVariant::Int: return DoCompare(left.toInt(), right.toInt()); case QVariant::UInt: return DoCompare(left.toUInt(), right.toUInt()); case QVariant::LongLong: return DoCompare(left.toLongLong(), right.toLongLong()); case QVariant::ULongLong: return DoCompare(left.toULongLong(), right.toULongLong()); case QMetaType::Float: return DoCompare(left.toFloat(), right.toFloat()); case QVariant::Double: return DoCompare(left.toDouble(), right.toDouble()); case QVariant::Char: return DoCompare(left.toChar(), right.toChar()); case QVariant::Date: return DoCompare(left.toDate(), right.toDate()); case QVariant::Time: return DoCompare(left.toTime(), right.toTime()); case QVariant::DateTime: return DoCompare(left.toDateTime(), right.toDateTime()); case QVariant::String: default: if (isSortLocaleAware()) return left.toString().localeAwareCompare(right.toString()); else return left.toString().compare(right.toString(), sortCaseSensitivity()); } return 0; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/multisortfilterproxy.h000066400000000000000000000026401260417502300256330ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_MULTISORTFILTERPROXY_H_ #define CORE_MULTISORTFILTERPROXY_H_ #include class MultiSortFilterProxy : public QSortFilterProxyModel { public: explicit MultiSortFilterProxy(QObject* parent = nullptr); void AddSortSpec(int role, Qt::SortOrder order = Qt::AscendingOrder); protected: bool lessThan(const QModelIndex& left, const QModelIndex& right) const; private: int Compare(const QVariant& left, const QVariant& right) const; typedef QPair SortSpec; QList sorting_; }; #endif // CORE_MULTISORTFILTERPROXY_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/musicstorage.cpp000066400000000000000000000016141260417502300243210ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "musicstorage.h" MusicStorage::MusicStorage() {} clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/musicstorage.h000066400000000000000000000046331260417502300237720ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_MUSICSTORAGE_H_ #define CORE_MUSICSTORAGE_H_ #include "song.h" #include #include #include class MusicStorage { public: MusicStorage(); virtual ~MusicStorage() {} enum Role { Role_Storage = Qt::UserRole + 100, Role_StorageForceConnect, Role_Capacity, Role_FreeSpace, }; // Values are saved in the database - don't change enum TranscodeMode { Transcode_Always = 1, Transcode_Never = 2, Transcode_Unsupported = 3, }; typedef std::function ProgressFunction; struct CopyJob { QString source_; QString destination_; Song metadata_; bool overwrite_; bool mark_as_listened_; bool remove_original_; ProgressFunction progress_; }; struct DeleteJob { Song metadata_; }; virtual QString LocalPath() const { return QString(); } virtual TranscodeMode GetTranscodeMode() const { return Transcode_Never; } virtual Song::FileType GetTranscodeFormat() const { return Song::Type_Unknown; } virtual bool GetSupportedFiletypes(QList* ret) { return true; } virtual bool StartCopy(QList* supported_types) { return true; } virtual bool CopyToStorage(const CopyJob& job) = 0; virtual void FinishCopy(bool success) {} virtual void StartDelete() {} virtual bool DeleteFromStorage(const DeleteJob& job) = 0; virtual void FinishDelete(bool success) {} virtual void Eject() {} }; Q_DECLARE_METATYPE(MusicStorage*); Q_DECLARE_METATYPE(std::shared_ptr); #endif // CORE_MUSICSTORAGE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/network.cpp000066400000000000000000000154221260417502300233070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2013, David Sansome Copyright 2010-2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "network.h" #include #include #include #include #include #include "core/closure.h" #include "utilities.h" QMutex ThreadSafeNetworkDiskCache::sMutex; QNetworkDiskCache* ThreadSafeNetworkDiskCache::sCache = nullptr; ThreadSafeNetworkDiskCache::ThreadSafeNetworkDiskCache(QObject* parent) { QMutexLocker l(&sMutex); if (!sCache) { sCache = new QNetworkDiskCache; sCache->setCacheDirectory( Utilities::GetConfigPath(Utilities::Path_NetworkCache)); } } qint64 ThreadSafeNetworkDiskCache::cacheSize() const { QMutexLocker l(&sMutex); return sCache->cacheSize(); } QIODevice* ThreadSafeNetworkDiskCache::data(const QUrl& url) { QMutexLocker l(&sMutex); return sCache->data(url); } void ThreadSafeNetworkDiskCache::insert(QIODevice* device) { QMutexLocker l(&sMutex); sCache->insert(device); } QNetworkCacheMetaData ThreadSafeNetworkDiskCache::metaData(const QUrl& url) { QMutexLocker l(&sMutex); return sCache->metaData(url); } QIODevice* ThreadSafeNetworkDiskCache::prepare( const QNetworkCacheMetaData& metaData) { QMutexLocker l(&sMutex); return sCache->prepare(metaData); } bool ThreadSafeNetworkDiskCache::remove(const QUrl& url) { QMutexLocker l(&sMutex); return sCache->remove(url); } void ThreadSafeNetworkDiskCache::updateMetaData( const QNetworkCacheMetaData& metaData) { QMutexLocker l(&sMutex); sCache->updateMetaData(metaData); } void ThreadSafeNetworkDiskCache::clear() { QMutexLocker l(&sMutex); sCache->clear(); } NetworkAccessManager::NetworkAccessManager(QObject* parent) : QNetworkAccessManager(parent) { setCache(new ThreadSafeNetworkDiskCache(this)); } QNetworkReply* NetworkAccessManager::createRequest( Operation op, const QNetworkRequest& request, QIODevice* outgoingData) { QByteArray user_agent = QString("%1 %2") .arg(QCoreApplication::applicationName(), QCoreApplication::applicationVersion()) .toUtf8(); if (request.hasRawHeader("User-Agent")) { // Append the existing user-agent set by a client library (such as // libmygpo-qt). user_agent += " " + request.rawHeader("User-Agent"); } QNetworkRequest new_request(request); new_request.setRawHeader("User-Agent", user_agent); if (op == QNetworkAccessManager::PostOperation && !new_request.header(QNetworkRequest::ContentTypeHeader).isValid()) { new_request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); } // Prefer the cache unless the caller has changed the setting already if (request.attribute(QNetworkRequest::CacheLoadControlAttribute).toInt() == QNetworkRequest::PreferNetwork) { new_request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); } return QNetworkAccessManager::createRequest(op, new_request, outgoingData); } NetworkTimeouts::NetworkTimeouts(int timeout_msec, QObject* parent) : timeout_msec_(timeout_msec) {} void NetworkTimeouts::AddReply(QNetworkReply* reply) { if (timers_.contains(reply)) return; connect(reply, SIGNAL(destroyed()), SLOT(ReplyFinished())); connect(reply, SIGNAL(finished()), SLOT(ReplyFinished())); timers_[reply] = startTimer(timeout_msec_); } void NetworkTimeouts::AddReply(RedirectFollower* reply) { if (redirect_timers_.contains(reply)) { return; } NewClosure(reply, SIGNAL(destroyed()), this, SLOT(RedirectFinished(RedirectFollower*)), reply); NewClosure(reply, SIGNAL(finished()), this, SLOT(RedirectFinished(RedirectFollower*)), reply); redirect_timers_[reply] = startTimer(timeout_msec_); } void NetworkTimeouts::ReplyFinished() { QNetworkReply* reply = reinterpret_cast(sender()); if (timers_.contains(reply)) { killTimer(timers_.take(reply)); } } void NetworkTimeouts::RedirectFinished(RedirectFollower* reply) { if (redirect_timers_.contains(reply)) { killTimer(redirect_timers_.take(reply)); } } void NetworkTimeouts::timerEvent(QTimerEvent* e) { QNetworkReply* reply = timers_.key(e->timerId()); if (reply) { reply->abort(); } RedirectFollower* redirect = redirect_timers_.key(e->timerId()); if (redirect) { redirect->abort(); } } RedirectFollower::RedirectFollower(QNetworkReply* first_reply, int max_redirects) : QObject(nullptr), current_reply_(first_reply), redirects_remaining_(max_redirects) { ConnectReply(first_reply); } void RedirectFollower::ConnectReply(QNetworkReply* reply) { connect(reply, SIGNAL(readyRead()), SLOT(ReadyRead())); connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), SIGNAL(error(QNetworkReply::NetworkError))); connect(reply, SIGNAL(downloadProgress(qint64, qint64)), SIGNAL(downloadProgress(qint64, qint64))); connect(reply, SIGNAL(uploadProgress(qint64, qint64)), SIGNAL(uploadProgress(qint64, qint64))); connect(reply, SIGNAL(finished()), SLOT(ReplyFinished())); } void RedirectFollower::ReadyRead() { // Don't re-emit this signal for redirect replies. if (current_reply_->attribute(QNetworkRequest::RedirectionTargetAttribute) .isValid()) { return; } emit readyRead(); } void RedirectFollower::ReplyFinished() { current_reply_->deleteLater(); if (current_reply_->attribute(QNetworkRequest::RedirectionTargetAttribute) .isValid()) { if (redirects_remaining_-- == 0) { emit finished(); return; } const QUrl next_url = current_reply_->url().resolved( current_reply_->attribute(QNetworkRequest::RedirectionTargetAttribute) .toUrl()); QNetworkRequest req(current_reply_->request()); req.setUrl(next_url); current_reply_ = current_reply_->manager()->get(req); ConnectReply(current_reply_); return; } emit finished(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/network.h000066400000000000000000000075661260417502300227660ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, 2012, David Sansome Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_NETWORK_H_ #define CORE_NETWORK_H_ #include #include #include #include class QNetworkDiskCache; class ThreadSafeNetworkDiskCache : public QAbstractNetworkCache { public: explicit ThreadSafeNetworkDiskCache(QObject* parent); qint64 cacheSize() const; QIODevice* data(const QUrl& url); void insert(QIODevice* device); QNetworkCacheMetaData metaData(const QUrl& url); QIODevice* prepare(const QNetworkCacheMetaData& metaData); bool remove(const QUrl& url); void updateMetaData(const QNetworkCacheMetaData& metaData); void clear(); private: static QMutex sMutex; static QNetworkDiskCache* sCache; }; class NetworkAccessManager : public QNetworkAccessManager { Q_OBJECT public: explicit NetworkAccessManager(QObject* parent = nullptr); protected: QNetworkReply* createRequest(Operation op, const QNetworkRequest& request, QIODevice* outgoingData); }; class RedirectFollower : public QObject { Q_OBJECT public: explicit RedirectFollower(QNetworkReply* first_reply, int max_redirects = 5); bool hit_redirect_limit() const { return redirects_remaining_ < 0; } QNetworkReply* reply() const { return current_reply_; } // These are all forwarded to the current reply. QNetworkReply::NetworkError error() const { return current_reply_->error(); } QString errorString() const { return current_reply_->errorString(); } QVariant attribute(QNetworkRequest::Attribute code) const { return current_reply_->attribute(code); } QVariant header(QNetworkRequest::KnownHeaders header) const { return current_reply_->header(header); } qint64 bytesAvailable() const { return current_reply_->bytesAvailable(); } QUrl url() const { return current_reply_->url(); } QByteArray readAll() { return current_reply_->readAll(); } void abort() { current_reply_->abort(); } signals: // These are all forwarded from the current reply. void readyRead(); void error(QNetworkReply::NetworkError); void uploadProgress(qint64 bytesSent, qint64 bytesTotal); void downloadProgress(qint64 bytesReceived, qint64 bytesTotal); // This is NOT emitted when a request that has a redirect finishes. void finished(); private slots: void ReadyRead(); void ReplyFinished(); private: void ConnectReply(QNetworkReply* reply); private: QNetworkReply* current_reply_; int redirects_remaining_; }; class NetworkTimeouts : public QObject { Q_OBJECT public: explicit NetworkTimeouts(int timeout_msec, QObject* parent = nullptr); // TODO(John Maguire): Template this to avoid code duplication. void AddReply(QNetworkReply* reply); void AddReply(RedirectFollower* reply); void SetTimeout(int msec) { timeout_msec_ = msec; } protected: void timerEvent(QTimerEvent* e); private slots: void ReplyFinished(); void RedirectFinished(RedirectFollower* redirect); private: int timeout_msec_; QMap timers_; QMap redirect_timers_; }; #endif // CORE_NETWORK_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/networkproxyfactory.cpp000066400000000000000000000072171260417502300260040ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "networkproxyfactory.h" #include "core/logging.h" #include #include #include #include #include NetworkProxyFactory* NetworkProxyFactory::sInstance = nullptr; const char* NetworkProxyFactory::kSettingsGroup = "Proxy"; NetworkProxyFactory::NetworkProxyFactory() : mode_(Mode_System), type_(QNetworkProxy::HttpProxy), port_(8080), use_authentication_(false) { #ifdef Q_OS_LINUX // Linux uses environment variables to pass proxy configuration information, // which systemProxyForQuery doesn't support for some reason. QStringList urls; urls << QString::fromLocal8Bit(getenv("HTTP_PROXY")); urls << QString::fromLocal8Bit(getenv("http_proxy")); urls << QString::fromLocal8Bit(getenv("ALL_PROXY")); urls << QString::fromLocal8Bit(getenv("all_proxy")); qLog(Debug) << "Detected system proxy URLs:" << urls; for (const QString& url_str : urls) { if (url_str.isEmpty()) continue; env_url_ = QUrl(url_str); break; } #endif ReloadSettings(); } NetworkProxyFactory* NetworkProxyFactory::Instance() { if (!sInstance) { sInstance = new NetworkProxyFactory; } return sInstance; } void NetworkProxyFactory::ReloadSettings() { QMutexLocker l(&mutex_); QSettings s; s.beginGroup(kSettingsGroup); mode_ = Mode(s.value("mode", Mode_System).toInt()); type_ = QNetworkProxy::ProxyType( s.value("type", QNetworkProxy::HttpProxy).toInt()); hostname_ = s.value("hostname").toString(); port_ = s.value("port", 8080).toInt(); use_authentication_ = s.value("use_authentication", false).toBool(); username_ = s.value("username").toString(); password_ = s.value("password").toString(); } QList NetworkProxyFactory::queryProxy( const QNetworkProxyQuery& query) { QMutexLocker l(&mutex_); QNetworkProxy ret; switch (mode_) { case Mode_System: #ifdef Q_OS_LINUX Q_UNUSED(query); if (env_url_.isEmpty()) { ret.setType(QNetworkProxy::NoProxy); } else { ret.setHostName(env_url_.host()); ret.setPort(env_url_.port()); ret.setUser(env_url_.userName()); ret.setPassword(env_url_.password()); if (env_url_.scheme().startsWith("http")) ret.setType(QNetworkProxy::HttpProxy); else ret.setType(QNetworkProxy::Socks5Proxy); qLog(Debug) << "Using proxy URL:" << env_url_; } break; #else return systemProxyForQuery(query); #endif case Mode_Direct: ret.setType(QNetworkProxy::NoProxy); break; case Mode_Manual: ret.setType(type_); ret.setHostName(hostname_); ret.setPort(port_); if (use_authentication_) { ret.setUser(username_); ret.setPassword(password_); } break; } return QList() << ret; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/networkproxyfactory.h000066400000000000000000000032441260417502300254450ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_NETWORKPROXYFACTORY_H_ #define CORE_NETWORKPROXYFACTORY_H_ #include #include #include class NetworkProxyFactory : public QNetworkProxyFactory { public: // These values are persisted enum Mode { Mode_System = 0, Mode_Direct = 1, Mode_Manual = 2, }; static NetworkProxyFactory* Instance(); static const char* kSettingsGroup; // These methods are thread-safe void ReloadSettings(); QList queryProxy(const QNetworkProxyQuery& query); private: NetworkProxyFactory(); static NetworkProxyFactory* sInstance; QMutex mutex_; Mode mode_; QNetworkProxy::ProxyType type_; QString hostname_; int port_; bool use_authentication_; QString username_; QString password_; #ifdef Q_OS_LINUX QUrl env_url_; #endif }; #endif // CORE_NETWORKPROXYFACTORY_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/organise.cpp000066400000000000000000000235511260417502300234270ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, David Sansome Copyright 2014, Arnaud Bienner Copyright 2014, Andreas Copyright 2014, Krzysztof A. Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "organise.h" #include #include #include #include #include #include #include "musicstorage.h" #include "taskmanager.h" #include "core/logging.h" #include "core/tagreaderclient.h" #include "core/utilities.h" using std::placeholders::_1; const int Organise::kBatchSize = 10; const int Organise::kTranscodeProgressInterval = 500; Organise::Organise(TaskManager* task_manager, std::shared_ptr destination, const OrganiseFormat& format, bool copy, bool overwrite, bool mark_as_listened, const NewSongInfoList& songs_info, bool eject_after) : thread_(nullptr), task_manager_(task_manager), transcoder_(new Transcoder(this)), destination_(destination), format_(format), copy_(copy), overwrite_(overwrite), mark_as_listened_(mark_as_listened), eject_after_(eject_after), task_count_(songs_info.count()), transcode_suffix_(1), tasks_complete_(0), started_(false), task_id_(0), current_copy_progress_(0) { original_thread_ = thread(); for (const NewSongInfo& song_info : songs_info) { tasks_pending_ << Task(song_info); } } void Organise::Start() { if (thread_) return; task_id_ = task_manager_->StartTask(tr("Organising files")); task_manager_->SetTaskBlocksLibraryScans(true); thread_ = new QThread; connect(thread_, SIGNAL(started()), SLOT(ProcessSomeFiles())); connect(transcoder_, SIGNAL(JobComplete(QString, QString, bool)), SLOT(FileTranscoded(QString, QString, bool))); moveToThread(thread_); thread_->start(); } void Organise::ProcessSomeFiles() { if (!started_) { transcode_temp_name_.open(); if (!destination_->StartCopy(&supported_filetypes_)) { // Failed to start - mark everything as failed :( for (const Task& task : tasks_pending_) files_with_errors_ << task.song_info_.song_.url().toLocalFile(); tasks_pending_.clear(); } started_ = true; } // None left? if (tasks_pending_.isEmpty()) { if (!tasks_transcoding_.isEmpty()) { // Just wait - FileTranscoded will start us off again in a little while qLog(Debug) << "Waiting for transcoding jobs"; transcode_progress_timer_.start(kTranscodeProgressInterval, this); return; } UpdateProgress(); destination_->FinishCopy(files_with_errors_.isEmpty()); if (eject_after_) destination_->Eject(); task_manager_->SetTaskFinished(task_id_); emit Finished(files_with_errors_); // Move back to the original thread so deleteLater() can get called in // the main thread's event loop moveToThread(original_thread_); deleteLater(); // Stop this thread thread_->quit(); return; } // We process files in batches so we can be cancelled part-way through. for (int i = 0; i < kBatchSize; ++i) { SetSongProgress(0); if (tasks_pending_.isEmpty()) break; Task task = tasks_pending_.takeFirst(); qLog(Info) << "Processing" << task.song_info_.song_.url().toLocalFile(); // Use a Song instead of a tag reader Song song = task.song_info_.song_; if (!song.is_valid()) continue; // Maybe this file is one that's been transcoded already? if (!task.transcoded_filename_.isEmpty()) { qLog(Debug) << "This file has already been transcoded"; // Set the new filetype on the song so the formatter gets it right song.set_filetype(task.new_filetype_); // Fiddle the filename extension as well to match the new type song.set_url(QUrl::fromLocalFile(Utilities::FiddleFileExtension( song.basefilename(), task.new_extension_))); song.set_basefilename(Utilities::FiddleFileExtension( song.basefilename(), task.new_extension_)); // Have to set this to the size of the new file or else funny stuff // happens song.set_filesize(QFileInfo(task.transcoded_filename_).size()); } else { // Figure out if we need to transcode it Song::FileType dest_type = CheckTranscode(song.filetype()); if (dest_type != Song::Type_Unknown) { // Get the preset TranscoderPreset preset = Transcoder::PresetForFileType(dest_type); qLog(Debug) << "Transcoding with" << preset.name_; // Get a temporary name for the transcoded file task.transcoded_filename_ = transcode_temp_name_.fileName() + "-" + QString::number(transcode_suffix_++); task.new_extension_ = preset.extension_; task.new_filetype_ = dest_type; tasks_transcoding_[task.song_info_.song_.url().toLocalFile()] = task; qLog(Debug) << "Transcoding to" << task.transcoded_filename_; // Start the transcoding - this will happen in the background and // FileTranscoded() will get called when it's done. At that point the // task will get re-added to the pending queue with the new filename. transcoder_->AddJob(task.song_info_.song_.url().toLocalFile(), preset, task.transcoded_filename_); transcoder_->Start(); continue; } } MusicStorage::CopyJob job; job.source_ = task.transcoded_filename_.isEmpty() ? task.song_info_.song_.url().toLocalFile() : task.transcoded_filename_; job.destination_ = task.song_info_.new_filename_; job.metadata_ = song; job.overwrite_ = overwrite_; job.mark_as_listened_ = mark_as_listened_; job.remove_original_ = !copy_; job.progress_ = std::bind(&Organise::SetSongProgress, this, _1, !task.transcoded_filename_.isEmpty()); if (!destination_->CopyToStorage(job)) { files_with_errors_ << task.song_info_.song_.basefilename(); } else { if (job.mark_as_listened_) { emit FileCopied(job.metadata_.id()); } } // Clean up the temporary transcoded file if (!task.transcoded_filename_.isEmpty()) QFile::remove(task.transcoded_filename_); tasks_complete_++; } SetSongProgress(0); QTimer::singleShot(0, this, SLOT(ProcessSomeFiles())); } Song::FileType Organise::CheckTranscode(Song::FileType original_type) const { if (original_type == Song::Type_Stream) return Song::Type_Unknown; const MusicStorage::TranscodeMode mode = destination_->GetTranscodeMode(); const Song::FileType format = destination_->GetTranscodeFormat(); switch (mode) { case MusicStorage::Transcode_Never: return Song::Type_Unknown; case MusicStorage::Transcode_Always: if (original_type == format) return Song::Type_Unknown; return format; case MusicStorage::Transcode_Unsupported: if (supported_filetypes_.isEmpty() || supported_filetypes_.contains(original_type)) return Song::Type_Unknown; if (format != Song::Type_Unknown) return format; // The user hasn't visited the device properties page yet to set a // preferred format for the device, so we have to pick the best // available one. return Transcoder::PickBestFormat(supported_filetypes_); } return Song::Type_Unknown; } void Organise::SetSongProgress(float progress, bool transcoded) { const int max = transcoded ? 50 : 100; current_copy_progress_ = (transcoded ? 50 : 0) + qBound(0, static_cast(progress * max), max - 1); UpdateProgress(); } void Organise::UpdateProgress() { const int total = task_count_ * 100; // Update transcoding progress QMap transcode_progress = transcoder_->GetProgress(); for (const QString& filename : transcode_progress.keys()) { if (!tasks_transcoding_.contains(filename)) continue; tasks_transcoding_[filename].transcode_progress_ = transcode_progress[filename]; } // Count the progress of all tasks that are in the queue. Files that need // transcoding total 50 for the transcode and 50 for the copy, files that // only need to be copied total 100. int progress = tasks_complete_ * 100; for (const Task& task : tasks_pending_) { progress += qBound(0, static_cast(task.transcode_progress_ * 50), 50); } for (const Task& task : tasks_transcoding_.values()) { progress += qBound(0, static_cast(task.transcode_progress_ * 50), 50); } // Add the progress of the track that's currently copying progress += current_copy_progress_; task_manager_->SetTaskProgress(task_id_, progress, total); } void Organise::FileTranscoded(const QString& input, const QString& output, bool success) { qLog(Info) << "File finished" << input << success; transcode_progress_timer_.stop(); Task task = tasks_transcoding_.take(input); if (!success) { files_with_errors_ << input; } else { tasks_pending_ << task; } QTimer::singleShot(0, this, SLOT(ProcessSomeFiles())); } void Organise::timerEvent(QTimerEvent* e) { QObject::timerEvent(e); if (e->timerId() == transcode_progress_timer_.timerId()) { UpdateProgress(); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/organise.h000066400000000000000000000063631260417502300230760ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Copyright 2014, Arnaud Bienner Copyright 2014, Andreas Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_ORGANISE_H_ #define CORE_ORGANISE_H_ #include #include #include #include #include "organiseformat.h" #include "transcoder/transcoder.h" class MusicStorage; class TaskManager; class Organise : public QObject { Q_OBJECT public: struct NewSongInfo { NewSongInfo(const Song& song = Song(), const QString& new_filename = QString()) : song_(song), new_filename_(new_filename) {} Song song_; QString new_filename_; }; typedef QList NewSongInfoList; Organise(TaskManager* task_manager, std::shared_ptr destination, const OrganiseFormat& format, bool copy, bool overwrite, bool mark_as_listened, const NewSongInfoList& songs, bool eject_after); static const int kBatchSize; static const int kTranscodeProgressInterval; void Start(); signals: void Finished(const QStringList& files_with_errors); void FileCopied(int database_id); protected: void timerEvent(QTimerEvent* e); private slots: void ProcessSomeFiles(); void FileTranscoded(const QString& input, const QString& output, bool success); private: void SetSongProgress(float progress, bool transcoded = false); void UpdateProgress(); Song::FileType CheckTranscode(Song::FileType original_type) const; private: struct Task { explicit Task(const NewSongInfo& song_info = NewSongInfo()) : song_info_(song_info), transcode_progress_(0.0) {} NewSongInfo song_info_; float transcode_progress_; QString transcoded_filename_; QString new_extension_; Song::FileType new_filetype_; }; QThread* thread_; QThread* original_thread_; TaskManager* task_manager_; Transcoder* transcoder_; std::shared_ptr destination_; QList supported_filetypes_; const OrganiseFormat format_; const bool copy_; const bool overwrite_; const bool mark_as_listened_; const bool eject_after_; int task_count_; QBasicTimer transcode_progress_timer_; QTemporaryFile transcode_temp_name_; int transcode_suffix_; QList tasks_pending_; QMap tasks_transcoding_; int tasks_complete_; bool started_; int task_id_; int current_copy_progress_; QStringList files_with_errors_; }; #endif // CORE_ORGANISE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/organiseformat.cpp000066400000000000000000000260551260417502300246420ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, 2014, David Sansome Copyright 2011, Angus Gratton Copyright 2012, Mateusz Kowalczyk Copyright 2013-2014, John Maguire Copyright 2014, Arnaud Bienner Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "core/organiseformat.h" #include #include #include #include #include "core/arraysize.h" #include "core/timeconstants.h" #include "core/utilities.h" const char* OrganiseFormat::kTagPattern = "\\%([a-zA-Z]*)"; const char* OrganiseFormat::kBlockPattern = "\\{([^{}]+)\\}"; const QStringList OrganiseFormat::kKnownTags = QStringList() << "title" << "album" << "artist" << "artistinitial" << "albumartist" << "composer" << "track" << "disc" << "bpm" << "year" << "genre" << "comment" << "length" << "bitrate" << "samplerate" << "extension" << "performer" << "grouping" << "lyrics" << "originalyear"; // From http://en.wikipedia.org/wiki/8.3_filename#Directory_table const char OrganiseFormat::kInvalidFatCharacters[] = "\"*/\\:<>?|"; const int OrganiseFormat::kInvalidFatCharactersCount = arraysize(OrganiseFormat::kInvalidFatCharacters) - 1; const char OrganiseFormat::kInvalidPrefixCharacters[] = "."; const int OrganiseFormat::kInvalidPrefixCharactersCount = arraysize(OrganiseFormat::kInvalidPrefixCharacters) - 1; const QRgb OrganiseFormat::SyntaxHighlighter::kValidTagColorLight = qRgb(64, 64, 255); const QRgb OrganiseFormat::SyntaxHighlighter::kInvalidTagColorLight = qRgb(255, 64, 64); const QRgb OrganiseFormat::SyntaxHighlighter::kBlockColorLight = qRgb(230, 230, 230); const QRgb OrganiseFormat::SyntaxHighlighter::kValidTagColorDark = qRgb(128, 128, 255); const QRgb OrganiseFormat::SyntaxHighlighter::kInvalidTagColorDark = qRgb(255, 128, 128); const QRgb OrganiseFormat::SyntaxHighlighter::kBlockColorDark = qRgb(64, 64, 64); OrganiseFormat::OrganiseFormat(const QString& format) : format_(format), replace_non_ascii_(false), replace_spaces_(false), replace_the_(false) {} void OrganiseFormat::set_format(const QString& v) { format_ = v; format_.replace('\\', '/'); } bool OrganiseFormat::IsValid() const { int pos = 0; QString format_copy(format_); Validator v; return v.validate(format_copy, pos) == QValidator::Acceptable; } QString OrganiseFormat::GetFilenameForSong(const Song& song) const { QString filename = ParseBlock(format_, song); if (QFileInfo(filename).completeBaseName().isEmpty()) { // Avoid having empty filenames, or filenames with extension only: in this // case, keep the original filename. // We remove the extension from "filename" if it exists, as // song.basefilename() // also contains the extension. filename = Utilities::PathWithoutFilenameExtension(filename) + song.basefilename(); } if (replace_spaces_) filename.replace(QRegExp("\\s"), "_"); if (replace_non_ascii_) { QString stripped; for (int i = 0; i < filename.length(); ++i) { const QCharRef c = filename[i]; if (c < 128) { stripped.append(c); } else { const QString decomposition = c.decomposition(); if (!decomposition.isEmpty() && decomposition[0] < 128) stripped.append(decomposition[0]); else stripped.append("_"); } } filename = stripped; } // Fix any parts of the path that start with dots. QStringList parts = filename.split("/"); for (int i = 0; i < parts.count(); ++i) { QString* part = &parts[i]; for (int j = 0; j < kInvalidPrefixCharactersCount; ++j) { if (part->startsWith(kInvalidPrefixCharacters[j])) { part->replace(0, 1, '_'); break; } } } return parts.join("/"); } QString OrganiseFormat::ParseBlock(QString block, const Song& song, bool* any_empty) const { QRegExp tag_regexp(kTagPattern); QRegExp block_regexp(kBlockPattern); // Find any blocks first int pos = 0; while ((pos = block_regexp.indexIn(block, pos)) != -1) { // Recursively parse the block bool empty = false; QString value = ParseBlock(block_regexp.cap(1), song, &empty); if (empty) value = ""; // Replace the block's value block.replace(pos, block_regexp.matchedLength(), value); pos += value.length(); } // Now look for tags bool empty = false; pos = 0; while ((pos = tag_regexp.indexIn(block, pos)) != -1) { QString value = TagValue(tag_regexp.cap(1), song); if (value.isEmpty()) empty = true; block.replace(pos, tag_regexp.matchedLength(), value); pos += value.length(); } if (any_empty) *any_empty = empty; return block; } QString OrganiseFormat::TagValue(const QString& tag, const Song& song) const { QString value; // TODO(sobkas): What about nice switch statement? if (tag == "title") value = song.title(); else if (tag == "album") value = song.album(); else if (tag == "artist") value = song.artist(); else if (tag == "composer") value = song.composer(); else if (tag == "performer") value = song.performer(); else if (tag == "grouping") value = song.grouping(); else if (tag == "lyrics") value = song.lyrics(); else if (tag == "genre") value = song.genre(); else if (tag == "comment") value = song.comment(); else if (tag == "year") value = QString::number(song.year()); else if (tag == "originalyear") value = QString::number(song.effective_originalyear()); else if (tag == "track") value = QString::number(song.track()); else if (tag == "disc") value = QString::number(song.disc()); else if (tag == "bpm") value = QString::number(song.bpm()); else if (tag == "length") value = QString::number(song.length_nanosec() / kNsecPerSec); else if (tag == "bitrate") value = QString::number(song.bitrate()); else if (tag == "samplerate") value = QString::number(song.samplerate()); else if (tag == "extension") value = QFileInfo(song.url().toLocalFile()).suffix(); else if (tag == "artistinitial") { value = song.effective_albumartist().trimmed(); if (replace_the_ && !value.isEmpty()) value.replace(QRegExp("^the\\s+", Qt::CaseInsensitive), ""); if (!value.isEmpty()) value = value[0].toUpper(); } else if (tag == "albumartist") { value = song.is_compilation() ? "Various Artists" : song.effective_albumartist(); } if (replace_the_ && (tag == "artist" || tag == "albumartist")) value.replace(QRegExp("^the\\s+", Qt::CaseInsensitive), ""); if (value == "0" || value == "-1") value = ""; // Prepend a 0 to single-digit track numbers if (tag == "track" && value.length() == 1) value.prepend('0'); // Replace characters that really shouldn't be in paths for (int i = 0; i < kInvalidFatCharactersCount; ++i) { value.replace(kInvalidFatCharacters[i], '_'); } return value; } OrganiseFormat::Validator::Validator(QObject* parent) : QValidator(parent) {} QValidator::State OrganiseFormat::Validator::validate(QString& input, int&) const { QRegExp tag_regexp(kTagPattern); // Make sure all the blocks match up int block_level = 0; for (int i = 0; i < input.length(); ++i) { if (input[i] == '{') block_level++; else if (input[i] == '}') block_level--; if (block_level < 0 || block_level > 1) return QValidator::Invalid; } if (block_level != 0) return QValidator::Invalid; // Make sure the tags are valid int pos = 0; while ((pos = tag_regexp.indexIn(input, pos)) != -1) { if (!OrganiseFormat::kKnownTags.contains(tag_regexp.cap(1))) return QValidator::Invalid; pos += tag_regexp.matchedLength(); } return QValidator::Acceptable; } OrganiseFormat::SyntaxHighlighter::SyntaxHighlighter(QObject* parent) : QSyntaxHighlighter(parent) {} OrganiseFormat::SyntaxHighlighter::SyntaxHighlighter(QTextEdit* parent) : QSyntaxHighlighter(parent) {} OrganiseFormat::SyntaxHighlighter::SyntaxHighlighter(QTextDocument* parent) : QSyntaxHighlighter(parent) {} void OrganiseFormat::SyntaxHighlighter::highlightBlock(const QString& text) { const bool light = QApplication::palette().color(QPalette::Base).value() > 128; const QRgb block_color = light ? kBlockColorLight : kBlockColorDark; const QRgb valid_tag_color = light ? kValidTagColorLight : kValidTagColorDark; const QRgb invalid_tag_color = light ? kInvalidTagColorLight : kInvalidTagColorDark; QRegExp tag_regexp(kTagPattern); QRegExp block_regexp(kBlockPattern); QTextCharFormat block_format; block_format.setBackground(QColor(block_color)); // Reset formatting setFormat(0, text.length(), QTextCharFormat()); // Blocks int pos = 0; while ((pos = block_regexp.indexIn(text, pos)) != -1) { setFormat(pos, block_regexp.matchedLength(), block_format); pos += block_regexp.matchedLength(); } // Tags pos = 0; while ((pos = tag_regexp.indexIn(text, pos)) != -1) { QTextCharFormat f = format(pos); f.setForeground( QColor(OrganiseFormat::kKnownTags.contains(tag_regexp.cap(1)) ? valid_tag_color : invalid_tag_color)); setFormat(pos, tag_regexp.matchedLength(), f); pos += tag_regexp.matchedLength(); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/organiseformat.h000066400000000000000000000055641260417502300243110ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, 2014, David Sansome Copyright 2013-2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_ORGANISEFORMAT_H_ #define CORE_ORGANISEFORMAT_H_ #include #include #include "core/song.h" class OrganiseFormat { public: explicit OrganiseFormat(const QString& format = QString()); static const char* kTagPattern; static const char* kBlockPattern; static const QStringList kKnownTags; static const char kInvalidFatCharacters[]; static const int kInvalidFatCharactersCount; static const char kInvalidPrefixCharacters[]; static const int kInvalidPrefixCharactersCount; QString format() const { return format_; } bool replace_non_ascii() const { return replace_non_ascii_; } bool replace_spaces() const { return replace_spaces_; } bool replace_the() const { return replace_the_; } void set_format(const QString& v); void set_replace_non_ascii(bool v) { replace_non_ascii_ = v; } void set_replace_spaces(bool v) { replace_spaces_ = v; } void set_replace_the(bool v) { replace_the_ = v; } bool IsValid() const; QString GetFilenameForSong(const Song& song) const; class Validator : public QValidator { public: explicit Validator(QObject* parent = nullptr); QValidator::State validate(QString& format, int& pos) const; }; class SyntaxHighlighter : public QSyntaxHighlighter { public: static const QRgb kValidTagColorLight; static const QRgb kInvalidTagColorLight; static const QRgb kBlockColorLight; static const QRgb kValidTagColorDark; static const QRgb kInvalidTagColorDark; static const QRgb kBlockColorDark; explicit SyntaxHighlighter(QObject* parent = nullptr); explicit SyntaxHighlighter(QTextEdit* parent); explicit SyntaxHighlighter(QTextDocument* parent); void highlightBlock(const QString& format); }; private: QString ParseBlock(QString block, const Song& song, bool* any_empty = nullptr) const; QString TagValue(const QString& tag, const Song& song) const; QString format_; bool replace_non_ascii_; bool replace_spaces_; bool replace_the_; }; #endif // CORE_ORGANISEFORMAT_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/player.cpp000066400000000000000000000512611260417502300231130ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2009-2012, David Sansome Copyright 2010-2011, 2014, Arnaud Bienner Copyright 2010-2012, 2014, John Maguire Copyright 2011, Paweł Bara Copyright 2011, Andrea Decorte Copyright 2012, Anand Copyright 2012, Arash Abedinzadeh Copyright 2013, Andreas Copyright 2013, Kevin Cox Copyright 2014, Mark Furneaux Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "player.h" #include #include #include #include #include #include "config.h" #include "core/application.h" #include "core/logging.h" #include "core/urlhandler.h" #include "engines/enginebase.h" #include "engines/gstengine.h" #include "library/librarybackend.h" #include "playlist/playlist.h" #include "playlist/playlistitem.h" #include "playlist/playlistmanager.h" #ifdef HAVE_LIBLASTFM #include "internet/lastfm/lastfmservice.h" #endif using std::shared_ptr; const char* Player::kSettingsGroup = "Player"; Player::Player(Application* app, QObject* parent) : PlayerInterface(parent), app_(app), lastfm_(nullptr), engine_(new GstEngine(app_->task_manager())), stream_change_type_(Engine::First), last_state_(Engine::Empty), nb_errors_received_(0), volume_before_mute_(50), last_pressed_previous_(QDateTime::currentDateTime()), menu_previousmode_(PreviousBehaviour_DontRestart), seek_step_sec_(10) { settings_.beginGroup("Player"); SetVolume(settings_.value("volume", 50).toInt()); connect(engine_.get(), SIGNAL(Error(QString)), SIGNAL(Error(QString))); connect(engine_.get(), SIGNAL(ValidSongRequested(QUrl)), SLOT(ValidSongRequested(QUrl))); connect(engine_.get(), SIGNAL(InvalidSongRequested(QUrl)), SLOT(InvalidSongRequested(QUrl))); } Player::~Player() {} void Player::Init() { if (!engine_->Init()) qFatal("Error initialising audio engine"); connect(engine_.get(), SIGNAL(StateChanged(Engine::State)), SLOT(EngineStateChanged(Engine::State))); connect(engine_.get(), SIGNAL(TrackAboutToEnd()), SLOT(TrackAboutToEnd())); connect(engine_.get(), SIGNAL(TrackEnded()), SLOT(TrackEnded())); connect(engine_.get(), SIGNAL(MetaData(Engine::SimpleMetaBundle)), SLOT(EngineMetadataReceived(Engine::SimpleMetaBundle))); engine_->SetVolume(settings_.value("volume", 50).toInt()); ReloadSettings(); #ifdef HAVE_LIBLASTFM lastfm_ = app_->scrobbler(); #endif } void Player::ReloadSettings() { QSettings s; s.beginGroup(kSettingsGroup); menu_previousmode_ = PreviousBehaviour( s.value("menu_previousmode", PreviousBehaviour_DontRestart).toInt()); seek_step_sec_ = s.value("seek_step_sec", 10).toInt(); s.endGroup(); engine_->ReloadSettings(); } void Player::HandleLoadResult(const UrlHandler::LoadResult& result) { // Might've been an async load, so check we're still on the same item shared_ptr item = app_->playlist_manager()->active()->current_item(); if (!item) { loading_async_ = QUrl(); return; } if (item->Url() != result.original_url_) return; switch (result.type_) { case UrlHandler::LoadResult::NoMoreTracks: qLog(Debug) << "URL handler for" << result.original_url_ << "said no more tracks"; loading_async_ = QUrl(); NextItem(stream_change_type_); break; case UrlHandler::LoadResult::TrackAvailable: { qLog(Debug) << "URL handler for" << result.original_url_ << "returned" << result.media_url_; // If there was no length info in song's metadata, use the one provided by // URL handler, if there is one if (item->Metadata().length_nanosec() <= 0 && result.length_nanosec_ != -1) { Song song = item->Metadata(); song.set_length_nanosec(result.length_nanosec_); item->SetTemporaryMetadata(song); app_->playlist_manager()->active()->InformOfCurrentSongChange(); } engine_->Play( result.media_url_, stream_change_type_, item->Metadata().has_cue(), item->Metadata().beginning_nanosec(), item->Metadata().end_nanosec()); current_item_ = item; loading_async_ = QUrl(); break; } case UrlHandler::LoadResult::WillLoadAsynchronously: qLog(Debug) << "URL handler for" << result.original_url_ << "is loading asynchronously"; // We'll get called again later with either NoMoreTracks or TrackAvailable loading_async_ = result.original_url_; break; } } void Player::Next() { NextInternal(Engine::Manual); } void Player::NextInternal(Engine::TrackChangeFlags change) { if (HandleStopAfter()) return; if (app_->playlist_manager()->active()->current_item()) { const QUrl url = app_->playlist_manager()->active()->current_item()->Url(); if (url_handlers_.contains(url.scheme())) { // The next track is already being loaded if (url == loading_async_) return; stream_change_type_ = change; HandleLoadResult(url_handlers_[url.scheme()]->LoadNext(url)); return; } } NextItem(change); } void Player::NextItem(Engine::TrackChangeFlags change) { Playlist* active_playlist = app_->playlist_manager()->active(); // If we received too many errors in auto change, with repeat enabled, we stop if (change == Engine::Auto) { const PlaylistSequence::RepeatMode repeat_mode = active_playlist->sequence()->repeat_mode(); if (repeat_mode != PlaylistSequence::Repeat_Off) { if ((repeat_mode == PlaylistSequence::Repeat_Track && nb_errors_received_ >= 3) || (nb_errors_received_ >= app_->playlist_manager()->active()->proxy()->rowCount())) { // We received too many "Error" state changes: probably looping over a // playlist which contains only unavailable elements: stop now. nb_errors_received_ = 0; Stop(); return; } } } // Manual track changes override "Repeat track" const bool ignore_repeat_track = change & Engine::Manual; int i = active_playlist->next_row(ignore_repeat_track); if (i == -1) { app_->playlist_manager()->active()->set_current_row(i); emit PlaylistFinished(); Stop(); return; } PlayAt(i, change, false); } bool Player::HandleStopAfter() { if (app_->playlist_manager()->active()->stop_after_current()) { // Find what the next track would've been, and mark that one as current // so it plays next time the user presses Play. const int next_row = app_->playlist_manager()->active()->next_row(); if (next_row != -1) { app_->playlist_manager()->active()->set_current_row(next_row, true); } app_->playlist_manager()->active()->StopAfter(-1); Stop(true); return true; } return false; } void Player::TrackEnded() { if (HandleStopAfter()) return; if (current_item_ && current_item_->IsLocalLibraryItem() && current_item_->Metadata().id() != -1 && !app_->playlist_manager()->active()->have_incremented_playcount() && app_->playlist_manager()->active()->get_lastfm_status() != Playlist::LastFM_Seeked) { // The track finished before its scrobble point (30 seconds), so increment // the play count now. app_->playlist_manager()->library_backend()->IncrementPlayCountAsync( current_item_->Metadata().id()); } NextInternal(Engine::Auto); } void Player::PlayPause() { switch (engine_->state()) { case Engine::Paused: engine_->Unpause(); break; case Engine::Playing: { // We really shouldn't pause last.fm streams // Stopping seems like a reasonable thing to do (especially on mac where // there // is no media key for stop). if (current_item_->options() & PlaylistItem::PauseDisabled) { Stop(); } else { engine_->Pause(); } break; } case Engine::Empty: case Engine::Error: case Engine::Idle: { app_->playlist_manager()->SetActivePlaylist( app_->playlist_manager()->current_id()); if (app_->playlist_manager()->active()->rowCount() == 0) break; int i = app_->playlist_manager()->active()->current_row(); if (i == -1) i = app_->playlist_manager()->active()->last_played_row(); if (i == -1) i = 0; PlayAt(i, Engine::First, true); break; } } } void Player::RestartOrPrevious() { if (engine_->position_nanosec() < 8 * kNsecPerSec) return Previous(); SeekTo(0); } void Player::Stop(bool stop_after) { engine_->Stop(stop_after); app_->playlist_manager()->active()->set_current_row(-1); current_item_.reset(); } void Player::StopAfterCurrent() { app_->playlist_manager()->active()->StopAfter( app_->playlist_manager()->active()->current_row()); } bool Player::PreviousWouldRestartTrack() const { // Check if it has been over two seconds since previous button was pressed return menu_previousmode_ == PreviousBehaviour_Restart && last_pressed_previous_.isValid() && last_pressed_previous_.secsTo(QDateTime::currentDateTime()) >= 2; } void Player::Previous() { PreviousItem(Engine::Manual); } void Player::PreviousItem(Engine::TrackChangeFlags change) { const bool ignore_repeat_track = change & Engine::Manual; if (menu_previousmode_ == PreviousBehaviour_Restart) { // Check if it has been over two seconds since previous button was pressed QDateTime now = QDateTime::currentDateTime(); if (last_pressed_previous_.isValid() && last_pressed_previous_.secsTo(now) >= 2) { last_pressed_previous_ = now; PlayAt(app_->playlist_manager()->active()->current_row(), change, false); return; } last_pressed_previous_ = now; } int i = app_->playlist_manager()->active()->previous_row(ignore_repeat_track); app_->playlist_manager()->active()->set_current_row(i); if (i == -1) { Stop(); return; } PlayAt(i, change, false); } void Player::EngineStateChanged(Engine::State state) { if (Engine::Error == state) { nb_errors_received_++; } else { nb_errors_received_ = 0; } switch (state) { case Engine::Paused: emit Paused(); break; case Engine::Playing: emit Playing(); break; case Engine::Error: case Engine::Empty: case Engine::Idle: emit Stopped(); break; } last_state_ = state; } void Player::SetVolume(int value) { int old_volume = engine_->volume(); int volume = qBound(0, value, 100); settings_.setValue("volume", volume); engine_->SetVolume(volume); if (volume != old_volume) { emit VolumeChanged(volume); } } int Player::GetVolume() const { return engine_->volume(); } void Player::PlayAt(int index, Engine::TrackChangeFlags change, bool reshuffle) { if (change == Engine::Manual && engine_->position_nanosec() != engine_->length_nanosec()) { emit TrackSkipped(current_item_); const QUrl& url = current_item_->Url(); if (url_handlers_.contains(url.scheme())) { url_handlers_[url.scheme()]->TrackSkipped(); } } if (current_item_ && app_->playlist_manager()->active()->has_item_at(index) && current_item_->Metadata().IsOnSameAlbum( app_->playlist_manager()->active()->item_at(index)->Metadata())) { change |= Engine::SameAlbum; } if (reshuffle) app_->playlist_manager()->active()->ReshuffleIndices(); app_->playlist_manager()->active()->set_current_row(index); if (app_->playlist_manager()->active()->current_row() == -1) { // Maybe index didn't exist in the playlist. return; } current_item_ = app_->playlist_manager()->active()->current_item(); const QUrl url = current_item_->Url(); if (url_handlers_.contains(url.scheme())) { // It's already loading if (url == loading_async_) return; stream_change_type_ = change; HandleLoadResult(url_handlers_[url.scheme()]->StartLoading(url)); } else { loading_async_ = QUrl(); engine_->Play(current_item_->Url(), change, current_item_->Metadata().has_cue(), current_item_->Metadata().beginning_nanosec(), current_item_->Metadata().end_nanosec()); #ifdef HAVE_LIBLASTFM if (lastfm_->IsScrobblingEnabled()) lastfm_->NowPlaying(current_item_->Metadata()); #endif } } void Player::CurrentMetadataChanged(const Song& metadata) { // those things might have changed (especially when a previously invalid // song was reloaded) so we push the latest version into Engine engine_->RefreshMarkers(metadata.beginning_nanosec(), metadata.end_nanosec()); #ifdef HAVE_LIBLASTFM lastfm_->NowPlaying(metadata); #endif } void Player::SeekTo(int seconds) { const qint64 length_nanosec = engine_->length_nanosec(); // If the length is 0 then either there is no song playing, or the song isn't // seekable. if (length_nanosec <= 0) { return; } const qint64 nanosec = qBound(0ll, qint64(seconds) * kNsecPerSec, length_nanosec); engine_->Seek(nanosec); // If we seek the track we need to move the scrobble point qLog(Info) << "Track seeked to" << nanosec << "ns - updating scrobble point"; app_->playlist_manager()->active()->UpdateScrobblePoint(nanosec); emit Seeked(nanosec / 1000); } void Player::SeekForward() { SeekTo(engine()->position_nanosec() / kNsecPerSec + seek_step_sec_); } void Player::SeekBackward() { SeekTo(engine()->position_nanosec() / kNsecPerSec - seek_step_sec_); } void Player::EngineMetadataReceived(const Engine::SimpleMetaBundle& bundle) { PlaylistItemPtr item = app_->playlist_manager()->active()->current_item(); if (!item) return; Engine::SimpleMetaBundle bundle_copy = bundle; // Maybe the metadata is from icycast and has "Artist - Title" shoved // together in the title field. const int dash_pos = bundle_copy.title.indexOf('-'); if (dash_pos != -1 && bundle_copy.artist.isEmpty()) { // Split on " - " if it exists, otherwise split on "-". const int space_dash_pos = bundle_copy.title.indexOf(" - "); if (space_dash_pos != -1) { bundle_copy.artist = bundle_copy.title.left(space_dash_pos).trimmed(); bundle_copy.title = bundle_copy.title.mid(space_dash_pos + 3).trimmed(); } else { bundle_copy.artist = bundle_copy.title.left(dash_pos).trimmed(); bundle_copy.title = bundle_copy.title.mid(dash_pos + 1).trimmed(); } } Song song = item->Metadata(); song.MergeFromSimpleMetaBundle(bundle_copy); // Ignore useless metadata if (song.title().isEmpty() && song.artist().isEmpty()) return; app_->playlist_manager()->active()->SetStreamMetadata(item->Url(), song); } PlaylistItemPtr Player::GetItemAt(int pos) const { if (pos < 0 || pos >= app_->playlist_manager()->active()->rowCount()) return PlaylistItemPtr(); return app_->playlist_manager()->active()->item_at(pos); } void Player::Mute() { const int current_volume = engine_->volume(); if (current_volume == 0) { SetVolume(volume_before_mute_); } else { volume_before_mute_ = current_volume; SetVolume(0); } } void Player::Pause() { engine_->Pause(); } void Player::Play() { switch (GetState()) { case Engine::Playing: SeekTo(0); break; case Engine::Paused: engine_->Unpause(); break; default: PlayPause(); break; } } void Player::ShowOSD() { if (current_item_) emit ForceShowOSD(current_item_->Metadata(), false); } void Player::TogglePrettyOSD() { if (current_item_) emit ForceShowOSD(current_item_->Metadata(), true); } void Player::TrackAboutToEnd() { // If the current track was from a URL handler then it might have special // behaviour to queue up a subsequent track. We don't want to preload (and // scrobble) the next item in the playlist if it's just going to be stopped // again immediately after. if (app_->playlist_manager()->active()->current_item()) { const QUrl url = app_->playlist_manager()->active()->current_item()->Url(); if (url_handlers_.contains(url.scheme())) { url_handlers_[url.scheme()]->TrackAboutToEnd(); return; } } const bool has_next_row = app_->playlist_manager()->active()->next_row() != -1; PlaylistItemPtr next_item; if (has_next_row) { next_item = app_->playlist_manager()->active()->item_at( app_->playlist_manager()->active()->next_row()); } if (engine_->is_autocrossfade_enabled()) { // Crossfade is on, so just start playing the next track. The current one // will fade out, and the new one will fade in // But, if there's no next track and we don't want to fade out, then do // nothing and just let the track finish to completion. if (!engine_->is_fadeout_enabled() && !has_next_row) return; // If the next track is on the same album (or same cue file), and the // user doesn't want to crossfade between tracks on the same album, then // don't do this automatic crossfading. if (engine_->crossfade_same_album() || !has_next_row || !next_item || !current_item_->Metadata().IsOnSameAlbum(next_item->Metadata())) { TrackEnded(); return; } } // Crossfade is off, so start preloading the next track so we don't get a // gap between songs. if (!has_next_row || !next_item) return; QUrl url = next_item->Url(); // Get the actual track URL rather than the stream URL. if (url_handlers_.contains(url.scheme())) { UrlHandler::LoadResult result = url_handlers_[url.scheme()]->LoadNext(url); switch (result.type_) { case UrlHandler::LoadResult::NoMoreTracks: return; case UrlHandler::LoadResult::WillLoadAsynchronously: loading_async_ = url; return; case UrlHandler::LoadResult::TrackAvailable: url = result.media_url_; break; } } engine_->StartPreloading(url, next_item->Metadata().has_cue(), next_item->Metadata().beginning_nanosec(), next_item->Metadata().end_nanosec()); } void Player::IntroPointReached() { NextInternal(Engine::Intro); } void Player::ValidSongRequested(const QUrl& url) { emit SongChangeRequestProcessed(url, true); } void Player::InvalidSongRequested(const QUrl& url) { // first send the notification to others... emit SongChangeRequestProcessed(url, false); // ... and now when our listeners have completed their processing of the // current item we can change the current item by skipping to the next song NextItem(Engine::Auto); } void Player::RegisterUrlHandler(UrlHandler* handler) { const QString scheme = handler->scheme(); if (url_handlers_.contains(scheme)) { qLog(Warning) << "Tried to register a URL handler for" << scheme << "but one was already registered"; return; } qLog(Info) << "Registered URL handler for" << scheme; url_handlers_.insert(scheme, handler); connect(handler, SIGNAL(destroyed(QObject*)), SLOT(UrlHandlerDestroyed(QObject*))); connect(handler, SIGNAL(AsyncLoadComplete(UrlHandler::LoadResult)), SLOT(HandleLoadResult(UrlHandler::LoadResult))); } void Player::UnregisterUrlHandler(UrlHandler* handler) { const QString scheme = url_handlers_.key(handler); if (scheme.isEmpty()) { qLog(Warning) << "Tried to unregister a URL handler for" << handler->scheme() << "that wasn't registered"; return; } qLog(Info) << "Unregistered URL handler for" << scheme; url_handlers_.remove(scheme); disconnect(handler, SIGNAL(destroyed(QObject*)), this, SLOT(UrlHandlerDestroyed(QObject*))); disconnect(handler, SIGNAL(AsyncLoadComplete(UrlHandler::LoadResult)), this, SLOT(HandleLoadResult(UrlHandler::LoadResult))); } const UrlHandler* Player::HandlerForUrl(const QUrl& url) const { QMap::const_iterator it = url_handlers_.constFind(url.scheme()); if (it == url_handlers_.constEnd()) { return nullptr; } return *it; } void Player::UrlHandlerDestroyed(QObject* object) { UrlHandler* handler = static_cast(object); const QString scheme = url_handlers_.key(handler); if (!scheme.isEmpty()) { url_handlers_.remove(scheme); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/player.h000066400000000000000000000146561260417502300225670ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2009-2012, David Sansome Copyright 2010, 2012, 2014, John Maguire Copyright 2011, Paweł Bara Copyright 2011, Andrea Decorte Copyright 2012, Anand Copyright 2013, Andreas Copyright 2013, Kevin Cox Copyright 2014, Arnaud Bienner Copyright 2014, Mark Furneaux Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_PLAYER_H_ #define CORE_PLAYER_H_ #include #include #include #include #include "config.h" #include "core/song.h" #include "core/urlhandler.h" #include "covers/albumcoverloader.h" #include "engines/engine_fwd.h" #include "playlist/playlistitem.h" class Application; class Scrobbler; class PlayerInterface : public QObject { Q_OBJECT public: explicit PlayerInterface(QObject* parent = nullptr) : QObject(parent) {} virtual EngineBase* engine() const = 0; virtual Engine::State GetState() const = 0; virtual int GetVolume() const = 0; virtual PlaylistItemPtr GetCurrentItem() const = 0; virtual PlaylistItemPtr GetItemAt(int pos) const = 0; virtual void RegisterUrlHandler(UrlHandler* handler) = 0; virtual void UnregisterUrlHandler(UrlHandler* handler) = 0; public slots: virtual void ReloadSettings() = 0; // Manual track change to the specified track virtual void PlayAt(int i, Engine::TrackChangeFlags change, bool reshuffle) = 0; // If there's currently a song playing, pause it, otherwise play the track // that was playing last, or the first one on the playlist virtual void PlayPause() = 0; virtual void RestartOrPrevious() = 0; // Skips this track. Might load more of the current radio station. virtual void Next() = 0; virtual void Previous() = 0; virtual void SetVolume(int value) = 0; virtual void VolumeUp() = 0; virtual void VolumeDown() = 0; virtual void SeekTo(int seconds) = 0; // Moves the position of the currently playing song five seconds forward. virtual void SeekForward() = 0; // Moves the position of the currently playing song five seconds backwards. virtual void SeekBackward() = 0; virtual void CurrentMetadataChanged(const Song& metadata) = 0; virtual void Mute() = 0; virtual void Pause() = 0; virtual void Stop(bool stop_after = false) = 0; virtual void Play() = 0; virtual void ShowOSD() = 0; signals: void Playing(); void Paused(); void Stopped(); void PlaylistFinished(); void VolumeChanged(int volume); void Error(const QString& message); void TrackSkipped(PlaylistItemPtr old_track); // Emitted when there's a manual change to the current's track position. void Seeked(qlonglong microseconds); // Emitted when Player has processed a request to play another song. This // contains // the URL of the song and a flag saying whether it was able to play the song. void SongChangeRequestProcessed(const QUrl& url, bool valid); // The toggle parameter is true when user requests to toggle visibility for // Pretty OSD void ForceShowOSD(Song, bool toogle); }; class Player : public PlayerInterface { Q_OBJECT public: explicit Player(Application* app, QObject* parent = nullptr); ~Player(); static const char* kSettingsGroup; // Don't change the values: they are saved in preferences enum PreviousBehaviour { PreviousBehaviour_DontRestart = 1, PreviousBehaviour_Restart = 2 }; void Init(); EngineBase* engine() const { return engine_.get(); } Engine::State GetState() const { return last_state_; } int GetVolume() const; PlaylistItemPtr GetCurrentItem() const { return current_item_; } PlaylistItemPtr GetItemAt(int pos) const; void RegisterUrlHandler(UrlHandler* handler); void UnregisterUrlHandler(UrlHandler* handler); const UrlHandler* HandlerForUrl(const QUrl& url) const; bool PreviousWouldRestartTrack() const; public slots: void ReloadSettings(); void PlayAt(int i, Engine::TrackChangeFlags change, bool reshuffle); void PlayPause(); void RestartOrPrevious(); void Next(); void Previous(); void SetVolume(int value); void VolumeUp() { SetVolume(GetVolume() + 5); } void VolumeDown() { SetVolume(GetVolume() - 5); } void SeekTo(int seconds); void SeekForward(); void SeekBackward(); void CurrentMetadataChanged(const Song& metadata); void Mute(); void Pause(); void Stop(bool stop_after = false); void StopAfterCurrent(); void IntroPointReached(); void Play(); void ShowOSD(); void TogglePrettyOSD(); private slots: void EngineStateChanged(Engine::State); void EngineMetadataReceived(const Engine::SimpleMetaBundle& bundle); void TrackAboutToEnd(); void TrackEnded(); // Play the next item on the playlist - disregarding radio stations like // last.fm that might have more tracks. void NextItem(Engine::TrackChangeFlags change); void PreviousItem(Engine::TrackChangeFlags change); void NextInternal(Engine::TrackChangeFlags); void ValidSongRequested(const QUrl&); void InvalidSongRequested(const QUrl&); void UrlHandlerDestroyed(QObject* object); void HandleLoadResult(const UrlHandler::LoadResult& result); private: // Returns true if we were supposed to stop after this track. bool HandleStopAfter(); private: Application* app_; Scrobbler* lastfm_; QSettings settings_; PlaylistItemPtr current_item_; std::unique_ptr engine_; Engine::TrackChangeFlags stream_change_type_; Engine::State last_state_; int nb_errors_received_; QMap url_handlers_; QUrl loading_async_; int volume_before_mute_; QDateTime last_pressed_previous_; PreviousBehaviour menu_previousmode_; int seek_step_sec_; }; #endif // CORE_PLAYER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/potranslator.h000066400000000000000000000027461260417502300240200ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_POTRANSLATOR_H_ #define CORE_POTRANSLATOR_H_ #include // We convert from .po files to .qm files, which loses context information. // This translator tries loading strings with an empty context if it can't // find any others. class PoTranslator : public QTranslator { public: QString translate(const char* context, const char* source_text, const char* disambiguation = 0) const { QString ret = QTranslator::translate(context, source_text, disambiguation); if (!ret.isEmpty()) return ret; return QTranslator::translate(nullptr, source_text, disambiguation); } }; #endif // CORE_POTRANSLATOR_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/qhash_qurl.h000066400000000000000000000020341260417502300234250ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_QHASH_QURL_H_ #define CORE_QHASH_QURL_H_ #include #if QT_VERSION < 0x040700 inline uint qHash(const QUrl& url) { return qHash(url.toEncoded()); } #endif #endif // CORE_QHASH_QURL_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/qtfslistener.cpp000066400000000000000000000025731260417502300243440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "qtfslistener.h" #include QtFSListener::QtFSListener(QObject* parent) : FileSystemWatcherInterface(parent), watcher_(this) { connect(&watcher_, SIGNAL(directoryChanged(const QString&)), SIGNAL(PathChanged(const QString&))); } void QtFSListener::AddPath(const QString& path) { watcher_.addPath(path); } void QtFSListener::RemovePath(const QString& path) { watcher_.removePath(path); } void QtFSListener::Clear() { watcher_.removePaths(watcher_.directories()); watcher_.removePaths(watcher_.files()); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/qtfslistener.h000066400000000000000000000024131260417502300240020ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, John Maguire Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_QTFSLISTENER_H_ #define CORE_QTFSLISTENER_H_ #include "filesystemwatcherinterface.h" #include class QtFSListener : public FileSystemWatcherInterface { Q_OBJECT public: explicit QtFSListener(QObject* parent); virtual void AddPath(const QString& path); virtual void RemovePath(const QString& path); virtual void Clear(); private: QFileSystemWatcher watcher_; }; #endif // CORE_QTFSLISTENER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/qxtglobalshortcutbackend.cpp000066400000000000000000000033611260417502300267160ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "globalshortcuts.h" #include "qxtglobalshortcutbackend.h" #include "qxtglobalshortcut.h" #include "core/logging.h" #include #include QxtGlobalShortcutBackend::QxtGlobalShortcutBackend(GlobalShortcuts* parent) : GlobalShortcutBackend(parent) {} bool QxtGlobalShortcutBackend::DoRegister() { qLog(Debug) << "registering"; for (const GlobalShortcuts::Shortcut& shortcut : manager_->shortcuts().values()) { AddShortcut(shortcut.action); } return true; } void QxtGlobalShortcutBackend::AddShortcut(QAction* action) { if (action->shortcut().isEmpty()) return; QxtGlobalShortcut* shortcut = new QxtGlobalShortcut(action->shortcut(), this); connect(shortcut, SIGNAL(activated()), action, SLOT(trigger())); shortcuts_ << shortcut; } void QxtGlobalShortcutBackend::DoUnregister() { qLog(Debug) << "unregistering"; qDeleteAll(shortcuts_); shortcuts_.clear(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/qxtglobalshortcutbackend.h000066400000000000000000000024641260417502300263660ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_QXTGLOBALSHORTCUTBACKEND_H_ #define CORE_QXTGLOBALSHORTCUTBACKEND_H_ #include "globalshortcutbackend.h" class QxtGlobalShortcut; class QxtGlobalShortcutBackend : public GlobalShortcutBackend { public: explicit QxtGlobalShortcutBackend(GlobalShortcuts* parent = nullptr); protected: bool DoRegister(); void DoUnregister(); private: void AddShortcut(QAction* action); QList shortcuts_; }; #endif // CORE_QXTGLOBALSHORTCUTBACKEND_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/scoped_cftyperef.h000066400000000000000000000036741260417502300246150ustar00rootroot00000000000000// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BASE_MAC_SCOPED_CFTYPEREF_H_ #define BASE_MAC_SCOPED_CFTYPEREF_H_ #include // ScopedCFTypeRef<> is patterned after scoped_ptr<>, but maintains ownership // of a CoreFoundation object: any object that can be represented as a // CFTypeRef. Style deviations here are solely for compatibility with // scoped_ptr<>'s interface, with which everyone is already familiar. // // When ScopedCFTypeRef<> takes ownership of an object (in the constructor or // in reset()), it takes over the caller's existing ownership claim. The // caller must own the object it gives to ScopedCFTypeRef<>, and relinquishes // an ownership claim to that object. ScopedCFTypeRef<> does not call // CFRetain(). template class ScopedCFTypeRef { public: typedef CFT element_type; explicit ScopedCFTypeRef(CFT object = nullptr) : object_(object) {} ~ScopedCFTypeRef() { if (object_) CFRelease(object_); } void reset(CFT object = nullptr) { if (object_) CFRelease(object_); object_ = object; } bool operator==(CFT that) const { return object_ == that; } bool operator!=(CFT that) const { return object_ != that; } operator CFT() const { return object_; } CFT get() const { return object_; } void swap(ScopedCFTypeRef& that) { CFT temp = that.object_; that.object_ = object_; object_ = temp; } // ScopedCFTypeRef<>::release() is like scoped_ptr<>::release. It is NOT // a wrapper for CFRelease(). To force a ScopedCFTypeRef<> object to call // CFRelease(), use ScopedCFTypeRef<>::reset(). CFT release() __attribute__((warn_unused_result)) { CFT temp = object_; object_ = nullptr; return temp; } private: CFT object_; Q_DISABLE_COPY(ScopedCFTypeRef); }; #endif // BASE_MAC_SCOPED_CFTYPEREF_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/scoped_nsobject.h000066400000000000000000000106001260417502300244200ustar00rootroot00000000000000// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BASE_MEMORY_SCOPED_NSOBJECT_H_ #define BASE_MEMORY_SCOPED_NSOBJECT_H_ #import // scoped_nsobject<> is patterned after scoped_ptr<>, but maintains ownership // of an NSObject subclass object. Style deviations here are solely for // compatibility with scoped_ptr<>'s interface, with which everyone is already // familiar. // // When scoped_nsobject<> takes ownership of an object (in the constructor or // in reset()), it takes over the caller's existing ownership claim. The // caller must own the object it gives to scoped_nsobject<>, and relinquishes // an ownership claim to that object. scoped_nsobject<> does not call // -retain. // // scoped_nsobject<> is not to be used for NSAutoreleasePools. For // NSAutoreleasePools use ScopedNSAutoreleasePool from // scoped_nsautorelease_pool.h instead. // We check for bad uses of scoped_nsobject and NSAutoreleasePool at compile // time with a template specialization (see below). template class scoped_nsobject { public: explicit scoped_nsobject(NST* object = nil) : object_(object) {} ~scoped_nsobject() { [object_ release]; } void reset(NST* object = nil) { // We intentionally do not check that object != object_ as the caller must // already have an ownership claim over whatever it gives to // scoped_nsobject and ScopedCFTypeRef, whether it's in the constructor or // in a call to reset(). In either case, it relinquishes that claim and // the scoper assumes it. [object_ release]; object_ = object; } bool operator==(NST* that) const { return object_ == that; } bool operator!=(NST* that) const { return object_ != that; } operator NST*() const { return object_; } NST* get() const { return object_; } void swap(scoped_nsobject& that) { NST* temp = that.object_; that.object_ = object_; object_ = temp; } // scoped_nsobject<>::release() is like scoped_ptr<>::release. It is NOT // a wrapper for [object_ release]. To force a scoped_nsobject<> object to // call [object_ release], use scoped_nsobject<>::reset(). NST* release() __attribute__((warn_unused_result)) { NST* temp = object_; object_ = nil; return temp; } private: NST* object_; Q_DISABLE_COPY(scoped_nsobject); }; // Free functions template void swap(scoped_nsobject& p1, scoped_nsobject& p2) { p1.swap(p2); } template bool operator==(C* p1, const scoped_nsobject& p2) { return p1 == p2.get(); } template bool operator!=(C* p1, const scoped_nsobject& p2) { return p1 != p2.get(); } // Specialization to make scoped_nsobject work. template <> class scoped_nsobject { public: explicit scoped_nsobject(id object = nil) : object_(object) {} ~scoped_nsobject() { [object_ release]; } void reset(id object = nil) { // We intentionally do not check that object != object_ as the caller must // already have an ownership claim over whatever it gives to // scoped_nsobject and ScopedCFTypeRef, whether it's in the constructor or // in a call to reset(). In either case, it relinquishes that claim and // the scoper assumes it. [object_ release]; object_ = object; } bool operator==(id that) const { return object_ == that; } bool operator!=(id that) const { return object_ != that; } operator id() const { return object_; } id get() const { return object_; } void swap(scoped_nsobject& that) { id temp = that.object_; that.object_ = object_; object_ = temp; } // scoped_nsobject<>::release() is like scoped_ptr<>::release. It is NOT // a wrapper for [object_ release]. To force a scoped_nsobject<> object to // call [object_ release], use scoped_nsobject<>::reset(). id release() __attribute__((warn_unused_result)) { id temp = object_; object_ = nil; return temp; } private: id object_; Q_DISABLE_COPY(scoped_nsobject); }; // Do not use scoped_nsobject for NSAutoreleasePools, use // ScopedNSAutoreleasePool instead. This is a compile time check. See details // at top of header. template <> class scoped_nsobject { private: explicit scoped_nsobject(NSAutoreleasePool* object = nil); Q_DISABLE_COPY(scoped_nsobject); }; #endif // BASE_MEMORY_SCOPED_NSOBJECT_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/scopedgobject.h000066400000000000000000000034661260417502300241030ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SCOPEDGOBJECT_H #define SCOPEDGOBJECT_H #include #include template class ScopedGObject { public: ScopedGObject() : object_(nullptr) {} explicit ScopedGObject(const ScopedGObject& other) : object_(nullptr) { reset(other.object_); } ~ScopedGObject() { reset(); } ScopedGObject& operator=(const ScopedGObject& other) { reset(other.object_); return *this; } void reset(T* new_object = nullptr) { if (new_object) g_object_ref(new_object); reset_without_add(new_object); } void reset_without_add(T* new_object = nullptr) { if (object_) g_object_unref(object_); object_ = new_object; } T* get() const { return object_; } operator T*() const { return get(); } T* operator*() const { return get(); } operator bool() const { return get(); } bool operator==(const ScopedGObject& other) const { return object_ == other.object_; } private: T* object_; }; #endif // SCOPEDGOBJECT_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/scopedtransaction.cpp000066400000000000000000000025441260417502300253420ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "scopedtransaction.h" #include "core/logging.h" #include #include ScopedTransaction::ScopedTransaction(QSqlDatabase* db) : db_(db), pending_(true) { db->transaction(); } ScopedTransaction::~ScopedTransaction() { if (pending_) { qLog(Warning) << "Rolling back transaction"; db_->rollback(); } } void ScopedTransaction::Commit() { if (!pending_) { qLog(Warning) << "Tried to commit a ScopedTransaction twice"; return; } db_->commit(); pending_ = false; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/scopedtransaction.h000066400000000000000000000024401260417502300250020ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SCOPEDTRANSACTION_H #define SCOPEDTRANSACTION_H #include class QSqlDatabase; // Opens a transaction on a database. // Rolls back the transaction if the object goes out of scope before Commit() // is called. class ScopedTransaction : boost::noncopyable { public: ScopedTransaction(QSqlDatabase* db); ~ScopedTransaction(); void Commit(); private: QSqlDatabase* db_; bool pending_; }; #endif // SCOPEDTRANSACTION_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/settingsprovider.cpp000066400000000000000000000035131260417502300252270ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "settingsprovider.h" SettingsProvider::SettingsProvider() {} DefaultSettingsProvider::DefaultSettingsProvider() {} void DefaultSettingsProvider::set_group(const char* group) { while (!backend_.group().isEmpty()) backend_.endGroup(); backend_.beginGroup(group); } QVariant DefaultSettingsProvider::value(const QString& key, const QVariant& default_value) const { return backend_.value(key, default_value); } void DefaultSettingsProvider::setValue(const QString& key, const QVariant& value) { backend_.setValue(key, value); } int DefaultSettingsProvider::beginReadArray(const QString& prefix) { return backend_.beginReadArray(prefix); } void DefaultSettingsProvider::beginWriteArray(const QString& prefix, int size) { backend_.beginWriteArray(prefix, size); } void DefaultSettingsProvider::setArrayIndex(int i) { backend_.setArrayIndex(i); } void DefaultSettingsProvider::endArray() { backend_.endArray(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/settingsprovider.h000066400000000000000000000036651260417502300247040ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_SETTINGSPROVIDER_H_ #define CORE_SETTINGSPROVIDER_H_ #include #include class SettingsProvider { public: SettingsProvider(); virtual ~SettingsProvider() {} virtual void set_group(const char* group) = 0; virtual QVariant value(const QString& key, const QVariant& default_value = QVariant()) const = 0; virtual void setValue(const QString& key, const QVariant& value) = 0; virtual int beginReadArray(const QString& prefix) = 0; virtual void beginWriteArray(const QString& prefix, int size = -1) = 0; virtual void setArrayIndex(int i) = 0; virtual void endArray() = 0; }; class DefaultSettingsProvider : public SettingsProvider { public: DefaultSettingsProvider(); void set_group(const char* group); QVariant value(const QString& key, const QVariant& default_value = QVariant()) const; void setValue(const QString& key, const QVariant& value); int beginReadArray(const QString& prefix); void beginWriteArray(const QString& prefix, int size = -1); void setArrayIndex(int i); void endArray(); private: QSettings backend_; }; #endif // CORE_SETTINGSPROVIDER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/signalchecker.cpp000066400000000000000000000033231260417502300244150ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "signalchecker.h" #include "core/logging.h" bool CheckedGConnect(gpointer source, const char* signal, GCallback callback, gpointer data, const int callback_param_count) { guint signal_id = 0; GQuark detail = 0; if (!g_signal_parse_name(signal, G_OBJECT_TYPE(source), &signal_id, &detail, false)) { qFatal("Connecting to invalid signal: %s", signal); return false; } GSignalQuery query; g_signal_query(signal_id, &query); // The signature for a signal callback is always: // return_type callback(gpointer data1, params..., gpointer data2); int signal_params = query.n_params + 2; if (signal_params != callback_param_count) { qFatal("Connecting callback to signal with different parameters counts"); return false; } g_signal_connect(source, signal, G_CALLBACK(callback), data); return true; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/signalchecker.h000066400000000000000000000027251260417502300240670ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_SIGNALCHECKER_H_ #define CORE_SIGNALCHECKER_H_ #include #include #include // Do not call this directly, use CHECKED_GCONNECT instead. bool CheckedGConnect(gpointer source, const char* signal, GCallback callback, gpointer data, const int callback_param_count); #define FUNCTION_ARITY(callback) \ boost::function_types::function_arity::value #define CHECKED_GCONNECT(source, signal, callback, data) \ CheckedGConnect(source, signal, G_CALLBACK(callback), data, \ FUNCTION_ARITY(callback)); #endif // CORE_SIGNALCHECKER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/simpletreeitem.h000066400000000000000000000102161260417502300243070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2009-2010, David Sansome Copyright 2010, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_SIMPLETREEITEM_H_ #define CORE_SIMPLETREEITEM_H_ #include "simpletreemodel.h" #include #include template class SimpleTreeItem { public: SimpleTreeItem(int _type, SimpleTreeModel* _model); // For the root item SimpleTreeItem(int _type, const QString& _key, T* _parent = nullptr); explicit SimpleTreeItem(int _type, T* _parent = nullptr); virtual ~SimpleTreeItem(); void InsertNotify(T* _parent); void DeleteNotify(int child_row); void ClearNotify(); void ChangedNotify(); void Delete(int child_row); T* ChildByKey(const QString& key) const; QString DisplayText() const { return display_text.isNull() ? key : display_text; } QString SortText() const { return sort_text.isNull() ? key : sort_text; } int type; QString key; QString sort_text; QString display_text; int row; bool lazy_loaded; T* parent; QList children; QAbstractItemModel* child_model; SimpleTreeModel* model; }; template SimpleTreeItem::SimpleTreeItem(int _type, SimpleTreeModel* _model) : type(_type), row(0), lazy_loaded(true), parent(nullptr), child_model(nullptr), model(_model) {} template SimpleTreeItem::SimpleTreeItem(int _type, const QString& _key, T* _parent) : type(_type), key(_key), lazy_loaded(false), parent(_parent), child_model(nullptr), model(_parent ? _parent->model : nullptr) { if (parent) { row = parent->children.count(); parent->children << static_cast(this); } } template SimpleTreeItem::SimpleTreeItem(int _type, T* _parent) : type(_type), lazy_loaded(false), parent(_parent), child_model(nullptr), model(_parent ? _parent->model : nullptr) { if (parent) { row = parent->children.count(); parent->children << static_cast(this); } } template void SimpleTreeItem::InsertNotify(T* _parent) { parent = _parent; model = parent->model; row = parent->children.count(); model->BeginInsert(parent, row); parent->children << static_cast(this); model->EndInsert(); } template void SimpleTreeItem::DeleteNotify(int child_row) { model->BeginDelete(static_cast(this), child_row); delete children.takeAt(child_row); // Adjust row numbers of those below it :( for (int i = child_row; i < children.count(); ++i) children[i]->row--; model->EndDelete(); } template void SimpleTreeItem::ClearNotify() { if (children.count()) { model->BeginDelete(static_cast(this), 0, children.count() - 1); qDeleteAll(children); children.clear(); model->EndDelete(); } } template void SimpleTreeItem::ChangedNotify() { model->EmitDataChanged(static_cast(this)); } template SimpleTreeItem::~SimpleTreeItem() { qDeleteAll(children); } template void SimpleTreeItem::Delete(int child_row) { delete children.takeAt(child_row); // Adjust row numbers of those below it :( for (int i = child_row; i < children.count(); ++i) children[i]->row--; } template T* SimpleTreeItem::ChildByKey(const QString& key) const { for (T* child : children) { if (child->key == key) return child; } return nullptr; } #endif // CORE_SIMPLETREEITEM_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/simpletreemodel.h000066400000000000000000000106101260417502300244470ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2009-2010, David Sansome Copyright 2010, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_SIMPLETREEMODEL_H_ #define CORE_SIMPLETREEMODEL_H_ #include class QModelIndex; template class SimpleTreeModel : public QAbstractItemModel { public: explicit SimpleTreeModel(T* root = 0, QObject* parent = nullptr); virtual ~SimpleTreeModel() {} // QAbstractItemModel int columnCount(const QModelIndex& parent) const; QModelIndex index(int row, int, const QModelIndex& parent = QModelIndex()) const; QModelIndex parent(const QModelIndex& index) const; int rowCount(const QModelIndex& parent) const; bool hasChildren(const QModelIndex& parent) const; bool canFetchMore(const QModelIndex& parent) const; void fetchMore(const QModelIndex& parent); T* IndexToItem(const QModelIndex& index) const; QModelIndex ItemToIndex(T* item) const; // Called by items void BeginInsert(T* parent, int start, int end = -1); void EndInsert(); void BeginDelete(T* parent, int start, int end = -1); void EndDelete(); void EmitDataChanged(T* item); protected: virtual void LazyPopulate(T* item) = 0; protected: T* root_; }; template SimpleTreeModel::SimpleTreeModel(T* root, QObject* parent) : QAbstractItemModel(parent), root_(root) {} template T* SimpleTreeModel::IndexToItem(const QModelIndex& index) const { if (!index.isValid()) return root_; return reinterpret_cast(index.internalPointer()); } template QModelIndex SimpleTreeModel::ItemToIndex(T* item) const { if (!item || !item->parent) return QModelIndex(); return createIndex(item->row, 0, item); } template int SimpleTreeModel::columnCount(const QModelIndex&) const { return 1; } template QModelIndex SimpleTreeModel::index(int row, int, const QModelIndex& parent) const { T* parent_item = IndexToItem(parent); if (!parent_item || row < 0 || parent_item->children.count() <= row) return QModelIndex(); return ItemToIndex(parent_item->children[row]); } template QModelIndex SimpleTreeModel::parent(const QModelIndex& index) const { return ItemToIndex(IndexToItem(index)->parent); } template int SimpleTreeModel::rowCount(const QModelIndex& parent) const { T* item = IndexToItem(parent); return item->children.count(); } template bool SimpleTreeModel::hasChildren(const QModelIndex& parent) const { T* item = IndexToItem(parent); if (item->lazy_loaded) return !item->children.isEmpty(); else return true; } template bool SimpleTreeModel::canFetchMore(const QModelIndex& parent) const { T* item = IndexToItem(parent); return !item->lazy_loaded; } template void SimpleTreeModel::fetchMore(const QModelIndex& parent) { T* item = IndexToItem(parent); if (!item->lazy_loaded) { LazyPopulate(item); } } template void SimpleTreeModel::BeginInsert(T* parent, int start, int end) { if (end == -1) end = start; beginInsertRows(ItemToIndex(parent), start, end); } template void SimpleTreeModel::EndInsert() { endInsertRows(); } template void SimpleTreeModel::BeginDelete(T* parent, int start, int end) { if (end == -1) end = start; beginRemoveRows(ItemToIndex(parent), start, end); } template void SimpleTreeModel::EndDelete() { endRemoveRows(); } template void SimpleTreeModel::EmitDataChanged(T* item) { QModelIndex index(ItemToIndex(item)); emit dataChanged(index, index); } #endif // CORE_SIMPLETREEMODEL_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/song.cpp000066400000000000000000001207151260417502300225660ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2009-2012, 2014, David Sansome Copyright 2010-2011, Paweł Bara Copyright 2010, 2012, 2014, John Maguire Copyright 2011-2012, 2014, Arnaud Bienner Copyright 2011, Angus Gratton Copyright 2012, Kacper "mattrick" Banasik Copyright 2013, Martin Brodbeck Copyright 2013-2014, Andreas Copyright 2013, Joel Bradshaw Copyright 2013, Uwe Klotz Copyright 2013, Mateusz Kowalczyk Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "song.h" #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_LIBLASTFM #include "internet/lastfm/fixlastfm.h" #ifdef HAVE_LIBLASTFM1 #include #else #include #endif #endif #include #ifdef HAVE_LIBGPOD #include #endif #ifdef HAVE_LIBMTP #include #endif #include "core/application.h" #include "core/logging.h" #include "core/messagehandler.h" #include "core/mpris_common.h" #include "core/timeconstants.h" #include "core/utilities.h" #include "covers/albumcoverloader.h" #include "engines/enginebase.h" #include "library/sqlrow.h" #include "tagreadermessages.pb.h" #include "widgets/trackslider.h" const QStringList Song::kColumns = QStringList() << "title" << "album" << "artist" << "albumartist" << "composer" << "track" << "disc" << "bpm" << "year" << "genre" << "comment" << "compilation" << "bitrate" << "samplerate" << "directory" << "filename" << "mtime" << "ctime" << "filesize" << "sampler" << "art_automatic" << "art_manual" << "filetype" << "playcount" << "lastplayed" << "rating" << "forced_compilation_on" << "forced_compilation_off" << "effective_compilation" << "skipcount" << "score" << "beginning" << "length" << "cue_path" << "unavailable" << "effective_albumartist" << "etag" << "performer" << "grouping" << "lyrics" << "originalyear" << "effective_originalyear"; const QString Song::kColumnSpec = Song::kColumns.join(", "); const QString Song::kBindSpec = Utilities::Prepend(":", Song::kColumns).join(", "); const QString Song::kUpdateSpec = Utilities::Updateify(Song::kColumns).join(", "); const QStringList Song::kFtsColumns = QStringList() << "ftstitle" << "ftsalbum" << "ftsartist" << "ftsalbumartist" << "ftscomposer" << "ftsperformer" << "ftsgrouping" << "ftsgenre" << "ftscomment"; const QString Song::kFtsColumnSpec = Song::kFtsColumns.join(", "); const QString Song::kFtsBindSpec = Utilities::Prepend(":", Song::kFtsColumns).join(", "); const QString Song::kFtsUpdateSpec = Utilities::Updateify(Song::kFtsColumns).join(", "); const QString Song::kManuallyUnsetCover = "(unset)"; const QString Song::kEmbeddedCover = "(embedded)"; struct Song::Private : public QSharedData { Private(); bool valid_; int id_; QString title_; QString album_; QString artist_; QString albumartist_; QString composer_; QString performer_; QString grouping_; QString lyrics_; int track_; int disc_; float bpm_; int year_; int originalyear_; QString genre_; QString comment_; bool compilation_; // From the file tag bool sampler_; // From the library scanner bool forced_compilation_on_; // Set by the user bool forced_compilation_off_; // Set by the user // A unique album ID // Used to distinguish between albums from providers that have multiple // versions of a given album with the same title (e.g. Spotify). // This is never persisted, it is only stored temporarily for global search // results. int album_id_; float rating_; int playcount_; int skipcount_; int lastplayed_; int score_; // The beginning of the song in seconds. In case of single-part media // streams, this will equal to 0. In case of multi-part streams on the // other hand, this will mark the beginning of a section represented by // this Song object. This is always greater than 0. qint64 beginning_; // The end of the song in seconds. In case of single-part media // streams, this will equal to the song's length. In case of multi-part // streams on the other hand, this will mark the end of a section // represented by this Song object. // This may be negative indicating that the length of this song is // unknown. qint64 end_; int bitrate_; int samplerate_; int directory_id_; QUrl url_; QString basefilename_; int mtime_; int ctime_; int filesize_; FileType filetype_; // If the song has a CUE, this contains it's path. QString cue_path_; // Filenames to album art for this song. QString art_automatic_; // Guessed by LibraryWatcher QString art_manual_; // Set by the user - should take priority QImage image_; // Whether this song was loaded from a file using taglib. bool init_from_file_; // Whether our encoding guesser thinks these tags might be incorrectly // encoded. bool suspicious_tags_; // Whether the song does not exist on the file system anymore, but is still // stored in the database so as to remember the user's metadata. bool unavailable_; QString etag_; }; Song::Private::Private() : valid_(false), id_(-1), track_(-1), disc_(-1), bpm_(-1), year_(-1), originalyear_(-1), compilation_(false), sampler_(false), forced_compilation_on_(false), forced_compilation_off_(false), album_id_(-1), rating_(-1.0), playcount_(0), skipcount_(0), lastplayed_(-1), score_(0), beginning_(0), end_(-1), bitrate_(-1), samplerate_(-1), directory_id_(-1), mtime_(-1), ctime_(-1), filesize_(-1), filetype_(Type_Unknown), init_from_file_(false), suspicious_tags_(false), unavailable_(false) {} Song::Song() : d(new Private) {} Song::Song(const Song& other) : d(other.d) {} Song::~Song() {} Song& Song::operator=(const Song& other) { d = other.d; return *this; } bool Song::is_valid() const { return d->valid_; } bool Song::is_unavailable() const { return d->unavailable_; } int Song::id() const { return d->id_; } const QString& Song::title() const { return d->title_; } const QString& Song::album() const { return d->album_; } const QString& Song::artist() const { return d->artist_; } const QString& Song::albumartist() const { return d->albumartist_; } const QString& Song::effective_albumartist() const { return d->albumartist_.isEmpty() ? d->artist_ : d->albumartist_; } const QString& Song::playlist_albumartist() const { return is_compilation() ? d->albumartist_ : effective_albumartist(); } const QString& Song::composer() const { return d->composer_; } const QString& Song::performer() const { return d->performer_; } const QString& Song::grouping() const { return d->grouping_; } const QString& Song::lyrics() const { return d->lyrics_; } int Song::track() const { return d->track_; } int Song::disc() const { return d->disc_; } float Song::bpm() const { return d->bpm_; } int Song::year() const { return d->year_; } int Song::originalyear() const { return d->originalyear_; } int Song::effective_originalyear() const { return d->originalyear_ < 0 ? d->year_ : d->originalyear_; } const QString& Song::genre() const { return d->genre_; } const QString& Song::comment() const { return d->comment_; } bool Song::is_compilation() const { return (d->compilation_ || d->sampler_ || d->forced_compilation_on_) && !d->forced_compilation_off_; } float Song::rating() const { return d->rating_; } int Song::playcount() const { return d->playcount_; } int Song::skipcount() const { return d->skipcount_; } int Song::lastplayed() const { return d->lastplayed_; } int Song::score() const { return d->score_; } const QString& Song::cue_path() const { return d->cue_path_; } bool Song::has_cue() const { return !d->cue_path_.isEmpty(); } int Song::album_id() const { return d->album_id_; } qint64 Song::beginning_nanosec() const { return d->beginning_; } qint64 Song::end_nanosec() const { return d->end_; } qint64 Song::length_nanosec() const { return d->end_ - d->beginning_; } int Song::bitrate() const { return d->bitrate_; } int Song::samplerate() const { return d->samplerate_; } int Song::directory_id() const { return d->directory_id_; } const QUrl& Song::url() const { return d->url_; } const QString& Song::basefilename() const { return d->basefilename_; } uint Song::mtime() const { return d->mtime_; } uint Song::ctime() const { return d->ctime_; } int Song::filesize() const { return d->filesize_; } Song::FileType Song::filetype() const { return d->filetype_; } bool Song::is_stream() const { return d->filetype_ == Type_Stream; } bool Song::is_cdda() const { return d->filetype_ == Type_Cdda; } bool Song::is_library_song() const { return !is_cdda() && !is_stream() && id() != -1; } const QString& Song::art_automatic() const { return d->art_automatic_; } const QString& Song::art_manual() const { return d->art_manual_; } const QString& Song::etag() const { return d->etag_; } bool Song::has_manually_unset_cover() const { return d->art_manual_ == kManuallyUnsetCover; } void Song::manually_unset_cover() { d->art_manual_ = kManuallyUnsetCover; } bool Song::has_embedded_cover() const { return d->art_automatic_ == kEmbeddedCover; } void Song::set_embedded_cover() { d->art_automatic_ = kEmbeddedCover; } const QImage& Song::image() const { return d->image_; } void Song::set_id(int id) { d->id_ = id; } void Song::set_valid(bool v) { d->valid_ = v; } void Song::set_title(const QString& v) { d->title_ = v; } void Song::set_album(const QString& v) { d->album_ = v; } void Song::set_artist(const QString& v) { d->artist_ = v; } void Song::set_albumartist(const QString& v) { d->albumartist_ = v; } void Song::set_composer(const QString& v) { d->composer_ = v; } void Song::set_performer(const QString& v) { d->performer_ = v; } void Song::set_grouping(const QString& v) { d->grouping_ = v; } void Song::set_lyrics(const QString& v) { d->lyrics_ = v; } void Song::set_track(int v) { d->track_ = v; } void Song::set_disc(int v) { d->disc_ = v; } void Song::set_bpm(float v) { d->bpm_ = v; } void Song::set_year(int v) { d->year_ = v; } void Song::set_originalyear(int v) { d->originalyear_ = v; } void Song::set_genre(const QString& v) { d->genre_ = v; } void Song::set_comment(const QString& v) { d->comment_ = v; } void Song::set_compilation(bool v) { d->compilation_ = v; } void Song::set_sampler(bool v) { d->sampler_ = v; } void Song::set_album_id(int v) { d->album_id_ = v; } void Song::set_beginning_nanosec(qint64 v) { d->beginning_ = qMax(0ll, v); } void Song::set_end_nanosec(qint64 v) { d->end_ = v; } void Song::set_length_nanosec(qint64 v) { d->end_ = d->beginning_ + v; } void Song::set_bitrate(int v) { d->bitrate_ = v; } void Song::set_samplerate(int v) { d->samplerate_ = v; } void Song::set_mtime(int v) { d->mtime_ = v; } void Song::set_ctime(int v) { d->ctime_ = v; } void Song::set_filesize(int v) { d->filesize_ = v; } void Song::set_filetype(FileType v) { d->filetype_ = v; } void Song::set_art_automatic(const QString& v) { d->art_automatic_ = v; } void Song::set_art_manual(const QString& v) { d->art_manual_ = v; } void Song::set_image(const QImage& i) { d->image_ = i; } void Song::set_forced_compilation_on(bool v) { d->forced_compilation_on_ = v; } void Song::set_forced_compilation_off(bool v) { d->forced_compilation_off_ = v; } void Song::set_rating(float v) { d->rating_ = v; } void Song::set_playcount(int v) { d->playcount_ = v; } void Song::set_skipcount(int v) { d->skipcount_ = v; } void Song::set_lastplayed(int v) { d->lastplayed_ = v; } void Song::set_score(int v) { d->score_ = qBound(0, v, 100); } void Song::set_cue_path(const QString& v) { d->cue_path_ = v; } void Song::set_unavailable(bool v) { d->unavailable_ = v; } void Song::set_etag(const QString& etag) { d->etag_ = etag; } void Song::set_url(const QUrl& v) { if (Application::kIsPortable) { QUrl base = QUrl::fromLocalFile(QCoreApplication::applicationDirPath() + "/"); d->url_ = base.resolved(v); } else { d->url_ = v; } } void Song::set_basefilename(const QString& v) { d->basefilename_ = v; } void Song::set_directory_id(int v) { d->directory_id_ = v; } QString Song::JoinSpec(const QString& table) { return Utilities::Prepend(table + ".", kColumns).join(", "); } QString Song::TextForFiletype(FileType type) { switch (type) { case Song::Type_Asf: return QObject::tr("Windows Media audio"); case Song::Type_Flac: return QObject::tr("Flac"); case Song::Type_Mp4: return QObject::tr("MP4 AAC"); case Song::Type_Mpc: return QObject::tr("MPC"); case Song::Type_Mpeg: return QObject::tr("MP3"); // Not technically correct case Song::Type_OggFlac: return QObject::tr("Ogg Flac"); case Song::Type_OggSpeex: return QObject::tr("Ogg Speex"); case Song::Type_OggVorbis: return QObject::tr("Ogg Vorbis"); case Song::Type_OggOpus: return QObject::tr("Ogg Opus"); case Song::Type_Aiff: return QObject::tr("AIFF"); case Song::Type_Wav: return QObject::tr("Wav"); case Song::Type_TrueAudio: return QObject::tr("TrueAudio"); case Song::Type_Cdda: return QObject::tr("CDDA"); case Song::Type_Stream: return QObject::tr("Stream"); case Song::Type_Unknown: default: return QObject::tr("Unknown"); } } bool Song::IsFileLossless() const { switch (filetype()) { case Song::Type_Aiff: case Song::Type_Flac: case Song::Type_OggFlac: case Song::Type_Wav: return true; default: return false; } } int CompareSongsName(const Song& song1, const Song& song2) { return song1.PrettyTitleWithArtist().localeAwareCompare( song2.PrettyTitleWithArtist()) < 0; } void Song::SortSongsListAlphabetically(SongList* songs) { Q_ASSERT(songs); qSort(songs->begin(), songs->end(), CompareSongsName); } void Song::Init(const QString& title, const QString& artist, const QString& album, qint64 length_nanosec) { d->valid_ = true; d->title_ = title; d->artist_ = artist; d->album_ = album; set_length_nanosec(length_nanosec); } void Song::Init(const QString& title, const QString& artist, const QString& album, qint64 beginning, qint64 end) { d->valid_ = true; d->title_ = title; d->artist_ = artist; d->album_ = album; d->beginning_ = beginning; d->end_ = end; } void Song::set_genre_id3(int id) { set_genre(TStringToQString(TagLib::ID3v1::genre(id))); } QString Song::Decode(const QString& tag, const QTextCodec* codec) { if (!codec) { return tag; } return codec->toUnicode(tag.toUtf8()); } void Song::InitFromProtobuf(const pb::tagreader::SongMetadata& pb) { d->init_from_file_ = true; d->valid_ = pb.valid(); d->title_ = QStringFromStdString(pb.title()); d->album_ = QStringFromStdString(pb.album()); d->artist_ = QStringFromStdString(pb.artist()); d->albumartist_ = QStringFromStdString(pb.albumartist()); d->composer_ = QStringFromStdString(pb.composer()); d->performer_ = QStringFromStdString(pb.performer()); d->grouping_ = QStringFromStdString(pb.grouping()); d->lyrics_ = QStringFromStdString(pb.lyrics()); d->track_ = pb.track(); d->disc_ = pb.disc(); d->bpm_ = pb.bpm(); d->year_ = pb.year(); d->originalyear_ = pb.originalyear(); d->genre_ = QStringFromStdString(pb.genre()); d->comment_ = QStringFromStdString(pb.comment()); d->compilation_ = pb.compilation(); d->playcount_ = pb.playcount(); d->skipcount_ = pb.skipcount(); d->lastplayed_ = pb.lastplayed(); d->score_ = pb.score(); set_length_nanosec(pb.length_nanosec()); d->bitrate_ = pb.bitrate(); d->samplerate_ = pb.samplerate(); set_url(QUrl::fromEncoded(QByteArray(pb.url().data(), pb.url().size()))); d->basefilename_ = QStringFromStdString(pb.basefilename()); d->mtime_ = pb.mtime(); d->ctime_ = pb.ctime(); d->filesize_ = pb.filesize(); d->suspicious_tags_ = pb.suspicious_tags(); d->filetype_ = static_cast(pb.type()); d->etag_ = QStringFromStdString(pb.etag()); if (pb.has_art_automatic()) { d->art_automatic_ = QStringFromStdString(pb.art_automatic()); } if (pb.has_rating()) { d->rating_ = pb.rating(); } InitArtManual(); } void Song::ToProtobuf(pb::tagreader::SongMetadata* pb) const { const QByteArray url(d->url_.toEncoded()); pb->set_valid(d->valid_); pb->set_title(DataCommaSizeFromQString(d->title_)); pb->set_album(DataCommaSizeFromQString(d->album_)); pb->set_artist(DataCommaSizeFromQString(d->artist_)); pb->set_albumartist(DataCommaSizeFromQString(d->albumartist_)); pb->set_composer(DataCommaSizeFromQString(d->composer_)); pb->set_performer(DataCommaSizeFromQString(d->performer_)); pb->set_grouping(DataCommaSizeFromQString(d->grouping_)); pb->set_lyrics(DataCommaSizeFromQString(d->lyrics_)); pb->set_track(d->track_); pb->set_disc(d->disc_); pb->set_bpm(d->bpm_); pb->set_year(d->year_); pb->set_originalyear(d->originalyear_); pb->set_genre(DataCommaSizeFromQString(d->genre_)); pb->set_comment(DataCommaSizeFromQString(d->comment_)); pb->set_compilation(d->compilation_); pb->set_rating(d->rating_); pb->set_playcount(d->playcount_); pb->set_skipcount(d->skipcount_); pb->set_lastplayed(d->lastplayed_); pb->set_score(d->score_); pb->set_length_nanosec(length_nanosec()); pb->set_bitrate(d->bitrate_); pb->set_samplerate(d->samplerate_); pb->set_url(url.constData(), url.size()); pb->set_basefilename(DataCommaSizeFromQString(d->basefilename_)); pb->set_mtime(d->mtime_); pb->set_ctime(d->ctime_); pb->set_filesize(d->filesize_); pb->set_suspicious_tags(d->suspicious_tags_); pb->set_art_automatic(DataCommaSizeFromQString(d->art_automatic_)); pb->set_type(static_cast< ::pb::tagreader::SongMetadata_Type>(d->filetype_)); } void Song::InitFromQuery(const SqlRow& q, bool reliable_metadata, int col) { d->valid_ = true; d->init_from_file_ = reliable_metadata; #define tostr(n) (q.value(n).isNull() ? QString::null : q.value(n).toString()) #define toint(n) (q.value(n).isNull() ? -1 : q.value(n).toInt()) #define tolonglong(n) (q.value(n).isNull() ? -1 : q.value(n).toLongLong()) #define tofloat(n) (q.value(n).isNull() ? -1 : q.value(n).toDouble()) d->id_ = toint(col + 0); d->title_ = tostr(col + 1); d->album_ = tostr(col + 2); d->artist_ = tostr(col + 3); d->albumartist_ = tostr(col + 4); d->composer_ = tostr(col + 5); d->track_ = toint(col + 6); d->disc_ = toint(col + 7); d->bpm_ = tofloat(col + 8); d->year_ = toint(col + 9); d->originalyear_ = toint(col + 41); d->genre_ = tostr(col + 10); d->comment_ = tostr(col + 11); d->compilation_ = q.value(col + 12).toBool(); d->bitrate_ = toint(col + 13); d->samplerate_ = toint(col + 14); d->directory_id_ = toint(col + 15); set_url(QUrl::fromEncoded(tostr(col + 16).toUtf8())); d->basefilename_ = QFileInfo(d->url_.toLocalFile()).fileName(); d->mtime_ = toint(col + 17); d->ctime_ = toint(col + 18); d->filesize_ = toint(col + 19); d->sampler_ = q.value(col + 20).toBool(); d->art_automatic_ = q.value(col + 21).toString(); d->art_manual_ = q.value(col + 22).toString(); d->filetype_ = FileType(q.value(col + 23).toInt()); d->playcount_ = q.value(col + 24).isNull() ? 0 : q.value(col + 24).toInt(); d->lastplayed_ = toint(col + 25); d->rating_ = tofloat(col + 26); d->forced_compilation_on_ = q.value(col + 27).toBool(); d->forced_compilation_off_ = q.value(col + 28).toBool(); // effective_compilation = 29 d->skipcount_ = q.value(col + 30).isNull() ? 0 : q.value(col + 30).toInt(); d->score_ = q.value(col + 31).isNull() ? 0 : q.value(col + 31).toInt(); // do not move those statements - beginning must be initialized before // length is! d->beginning_ = q.value(col + 32).isNull() ? 0 : q.value(col + 32).toLongLong(); set_length_nanosec(tolonglong(col + 33)); d->cue_path_ = tostr(col + 34); d->unavailable_ = q.value(col + 35).toBool(); // effective_albumartist = 36 // etag = 37 d->performer_ = tostr(col + 38); d->grouping_ = tostr(col + 39); d->lyrics_ = tostr(col + 40); InitArtManual(); #undef tostr #undef toint #undef tolonglong #undef tofloat } void Song::InitFromFilePartial(const QString& filename) { set_url(QUrl::fromLocalFile(filename)); // We currently rely on filename suffix to know if it's a music file or not. // TODO(Arnaud Bienner): I know this is not satisfying, but currently, // we rely on TagLib which seems to have the behavior (filename checks). // Someday, it would be nice to perform some magic tests everywhere. QFileInfo info(filename); d->basefilename_ = info.fileName(); QString suffix = info.suffix().toLower(); if (suffix == "mp3" || suffix == "ogg" || suffix == "flac" || suffix == "mpc" || suffix == "m4a" || suffix == "aac" || suffix == "wma" || suffix == "mp4" || suffix == "spx" || suffix == "wav" || suffix == "opus" || suffix == "m4b") { d->valid_ = true; } else { d->valid_ = false; } } void Song::InitArtManual() { // If we don't have an art, check if we have one in the cache if (d->art_manual_.isEmpty() && d->art_automatic_.isEmpty()) { QString filename(Utilities::Sha1CoverHash(d->artist_, d->album_).toHex() + ".jpg"); QString path(AlbumCoverLoader::ImageCacheDir() + "/" + filename); if (QFile::exists(path)) { d->art_manual_ = path; } } } #ifdef HAVE_LIBLASTFM void Song::InitFromLastFM(const lastfm::Track& track) { d->valid_ = true; d->filetype_ = Type_Stream; d->title_ = track.title(); d->album_ = track.album(); d->artist_ = track.artist(); d->track_ = track.trackNumber(); set_length_nanosec(track.duration() * kNsecPerSec); } #endif // HAVE_LIBLASTFM #ifdef HAVE_LIBGPOD void Song::InitFromItdb(const Itdb_Track* track, const QString& prefix) { d->valid_ = true; d->title_ = QString::fromUtf8(track->title); d->album_ = QString::fromUtf8(track->album); d->artist_ = QString::fromUtf8(track->artist); d->albumartist_ = QString::fromUtf8(track->albumartist); d->composer_ = QString::fromUtf8(track->composer); d->grouping_ = QString::fromUtf8(track->grouping); d->track_ = track->track_nr; d->disc_ = track->cd_nr; d->bpm_ = track->BPM; d->year_ = track->year; d->genre_ = QString::fromUtf8(track->genre); d->comment_ = QString::fromUtf8(track->comment); d->compilation_ = track->compilation; set_length_nanosec(track->tracklen * kNsecPerMsec); d->bitrate_ = track->bitrate; d->samplerate_ = track->samplerate; d->mtime_ = track->time_modified; d->ctime_ = track->time_added; d->filesize_ = track->size; d->filetype_ = track->type2 ? Type_Mpeg : Type_Mp4; d->rating_ = static_cast(track->rating) / 100; // 100 = 20 * 5 stars d->playcount_ = track->playcount; d->skipcount_ = track->skipcount; d->lastplayed_ = track->time_played; QString filename = QString::fromLocal8Bit(track->ipod_path); filename.replace(':', '/'); if (prefix.contains("://")) { set_url(QUrl(prefix + filename)); } else { set_url(QUrl::fromLocalFile(prefix + filename)); } d->basefilename_ = QFileInfo(filename).fileName(); } void Song::ToItdb(Itdb_Track* track) const { track->title = strdup(d->title_.toUtf8().constData()); track->album = strdup(d->album_.toUtf8().constData()); track->artist = strdup(d->artist_.toUtf8().constData()); track->albumartist = strdup(d->albumartist_.toUtf8().constData()); track->composer = strdup(d->composer_.toUtf8().constData()); track->grouping = strdup(d->grouping_.toUtf8().constData()); track->track_nr = d->track_; track->cd_nr = d->disc_; track->BPM = d->bpm_; track->year = d->year_; track->genre = strdup(d->genre_.toUtf8().constData()); track->comment = strdup(d->comment_.toUtf8().constData()); track->compilation = d->compilation_; track->tracklen = length_nanosec() / kNsecPerMsec; track->bitrate = d->bitrate_; track->samplerate = d->samplerate_; track->time_modified = d->mtime_; track->time_added = d->ctime_; track->size = d->filesize_; track->type1 = 0; track->type2 = d->filetype_ == Type_Mp4 ? 0 : 1; track->mediatype = 1; // Audio track->rating = d->rating_ * 100; // 100 = 20 * 5 stars track->playcount = d->playcount_; track->skipcount = d->skipcount_; track->time_played = d->lastplayed_; } #endif #ifdef HAVE_LIBMTP void Song::InitFromMTP(const LIBMTP_track_t* track, const QString& host) { d->valid_ = true; d->title_ = QString::fromUtf8(track->title); d->artist_ = QString::fromUtf8(track->artist); d->album_ = QString::fromUtf8(track->album); d->composer_ = QString::fromUtf8(track->composer); d->genre_ = QString::fromUtf8(track->genre); d->url_ = QUrl(QString("mtp://%1/%2").arg(host, track->item_id)); d->basefilename_ = QString::number(track->item_id); d->track_ = track->tracknumber; set_length_nanosec(track->duration * kNsecPerMsec); d->samplerate_ = track->samplerate; d->bitrate_ = track->bitrate; d->filesize_ = track->filesize; d->mtime_ = track->modificationdate; d->ctime_ = track->modificationdate; d->rating_ = static_cast(track->rating) / 100; d->playcount_ = track->usecount; switch (track->filetype) { case LIBMTP_FILETYPE_WAV: d->filetype_ = Type_Wav; break; case LIBMTP_FILETYPE_MP3: d->filetype_ = Type_Mpeg; break; case LIBMTP_FILETYPE_WMA: d->filetype_ = Type_Asf; break; case LIBMTP_FILETYPE_OGG: d->filetype_ = Type_OggVorbis; break; case LIBMTP_FILETYPE_MP4: d->filetype_ = Type_Mp4; break; case LIBMTP_FILETYPE_AAC: d->filetype_ = Type_Mp4; break; case LIBMTP_FILETYPE_FLAC: d->filetype_ = Type_OggFlac; break; case LIBMTP_FILETYPE_MP2: d->filetype_ = Type_Mpeg; break; case LIBMTP_FILETYPE_M4A: d->filetype_ = Type_Mp4; break; default: d->filetype_ = Type_Unknown; break; } } void Song::ToMTP(LIBMTP_track_t* track) const { track->item_id = 0; track->parent_id = 0; track->storage_id = 0; track->title = strdup(d->title_.toUtf8().constData()); track->artist = strdup(d->artist_.toUtf8().constData()); track->album = strdup(d->album_.toUtf8().constData()); track->composer = strdup(d->composer_.toUtf8().constData()); track->genre = strdup(d->genre_.toUtf8().constData()); track->title = strdup(d->title_.toUtf8().constData()); track->date = nullptr; track->filename = strdup(d->basefilename_.toUtf8().constData()); track->tracknumber = d->track_; track->duration = length_nanosec() / kNsecPerMsec; track->samplerate = d->samplerate_; track->nochannels = 0; track->wavecodec = 0; track->bitrate = d->bitrate_; track->bitratetype = 0; track->rating = d->rating_ * 100; track->usecount = d->playcount_; track->filesize = d->filesize_; track->modificationdate = d->mtime_; switch (d->filetype_) { case Type_Asf: track->filetype = LIBMTP_FILETYPE_ASF; break; case Type_Mp4: track->filetype = LIBMTP_FILETYPE_MP4; break; case Type_Mpeg: track->filetype = LIBMTP_FILETYPE_MP3; break; case Type_Flac: case Type_OggFlac: track->filetype = LIBMTP_FILETYPE_FLAC; break; case Type_OggSpeex: case Type_OggVorbis: track->filetype = LIBMTP_FILETYPE_OGG; break; case Type_Wav: track->filetype = LIBMTP_FILETYPE_WAV; break; default: track->filetype = LIBMTP_FILETYPE_UNDEF_AUDIO; break; } } #endif void Song::MergeFromSimpleMetaBundle(const Engine::SimpleMetaBundle& bundle) { if (d->init_from_file_ || d->url_.scheme() == "file") { // This Song was already loaded using taglib. Our tags are probably better // than the engine's. Note: init_from_file_ is used for non-file:// URLs // when the metadata is known to be good, like from Jamendo. return; } d->valid_ = true; if (!bundle.title.isEmpty()) d->title_ = bundle.title; if (!bundle.artist.isEmpty()) d->artist_ = bundle.artist; if (!bundle.album.isEmpty()) d->album_ = bundle.album; if (!bundle.comment.isEmpty()) d->comment_ = bundle.comment; if (!bundle.genre.isEmpty()) d->genre_ = bundle.genre; if (!bundle.bitrate.isEmpty()) d->bitrate_ = bundle.bitrate.toInt(); if (!bundle.samplerate.isEmpty()) d->samplerate_ = bundle.samplerate.toInt(); if (!bundle.length.isEmpty()) set_length_nanosec(bundle.length.toLongLong()); if (!bundle.year.isEmpty()) d->year_ = bundle.year.toInt(); if (!bundle.tracknr.isEmpty()) d->track_ = bundle.tracknr.toInt(); } void Song::BindToQuery(QSqlQuery* query) const { #define strval(x) (x.isNull() ? "" : x) #define intval(x) (x <= 0 ? -1 : x) #define notnullintval(x) (x == -1 ? QVariant() : x) // Remember to bind these in the same order as kBindSpec query->bindValue(":title", strval(d->title_)); query->bindValue(":album", strval(d->album_)); query->bindValue(":artist", strval(d->artist_)); query->bindValue(":albumartist", strval(d->albumartist_)); query->bindValue(":composer", strval(d->composer_)); query->bindValue(":track", intval(d->track_)); query->bindValue(":disc", intval(d->disc_)); query->bindValue(":bpm", intval(d->bpm_)); query->bindValue(":year", intval(d->year_)); query->bindValue(":genre", strval(d->genre_)); query->bindValue(":comment", strval(d->comment_)); query->bindValue(":compilation", d->compilation_ ? 1 : 0); query->bindValue(":bitrate", intval(d->bitrate_)); query->bindValue(":samplerate", intval(d->samplerate_)); query->bindValue(":directory", notnullintval(d->directory_id_)); if (Application::kIsPortable && Utilities::UrlOnSameDriveAsClementine(d->url_)) { query->bindValue(":filename", Utilities::GetRelativePathToClementineBin( d->url_).toEncoded()); } else { query->bindValue(":filename", d->url_.toEncoded()); } query->bindValue(":mtime", notnullintval(d->mtime_)); query->bindValue(":ctime", notnullintval(d->ctime_)); query->bindValue(":filesize", notnullintval(d->filesize_)); query->bindValue(":sampler", d->sampler_ ? 1 : 0); query->bindValue(":art_automatic", d->art_automatic_); query->bindValue(":art_manual", d->art_manual_); query->bindValue(":filetype", d->filetype_); query->bindValue(":playcount", d->playcount_); query->bindValue(":lastplayed", intval(d->lastplayed_)); query->bindValue(":rating", intval(d->rating_)); query->bindValue(":forced_compilation_on", d->forced_compilation_on_ ? 1 : 0); query->bindValue(":forced_compilation_off", d->forced_compilation_off_ ? 1 : 0); query->bindValue(":effective_compilation", is_compilation() ? 1 : 0); query->bindValue(":skipcount", d->skipcount_); query->bindValue(":score", d->score_); query->bindValue(":beginning", d->beginning_); query->bindValue(":length", intval(length_nanosec())); query->bindValue(":cue_path", d->cue_path_); query->bindValue(":unavailable", d->unavailable_ ? 1 : 0); query->bindValue(":effective_albumartist", this->effective_albumartist()); query->bindValue(":etag", strval(d->etag_)); query->bindValue(":performer", strval(d->performer_)); query->bindValue(":grouping", strval(d->grouping_)); query->bindValue(":lyrics", strval(d->lyrics_)); query->bindValue(":originalyear", intval(d->originalyear_)); query->bindValue(":effective_originalyear", intval(this->effective_originalyear())); #undef intval #undef notnullintval #undef strval } void Song::BindToFtsQuery(QSqlQuery* query) const { query->bindValue(":ftstitle", d->title_); query->bindValue(":ftsalbum", d->album_); query->bindValue(":ftsartist", d->artist_); query->bindValue(":ftsalbumartist", d->albumartist_); query->bindValue(":ftscomposer", d->composer_); query->bindValue(":ftsperformer", d->performer_); query->bindValue(":ftsgrouping", d->grouping_); query->bindValue(":ftsgenre", d->genre_); query->bindValue(":ftscomment", d->comment_); } #ifdef HAVE_LIBLASTFM void Song::ToLastFM(lastfm::Track* track, bool prefer_album_artist) const { lastfm::MutableTrack mtrack(*track); if (prefer_album_artist && !d->albumartist_.isEmpty()) { mtrack.setArtist(d->albumartist_); } else { mtrack.setArtist(d->artist_); } #if LASTFM_MAJOR_VERSION >= 1 mtrack.setAlbumArtist(d->albumartist_); #endif mtrack.setAlbum(d->album_); mtrack.setTitle(d->title_); mtrack.setDuration(length_nanosec() / kNsecPerSec); mtrack.setTrackNumber(d->track_); if (d->filetype_ == Type_Stream && d->end_ == -1) { mtrack.setSource(lastfm::Track::NonPersonalisedBroadcast); } else { mtrack.setSource(lastfm::Track::Player); } } #endif // HAVE_LIBLASTFM QString Song::PrettyRating() const { float rating = d->rating_; if (rating == -1.0f) return "0"; return QString::number(static_cast(rating * 100)); } QString Song::PrettyTitle() const { QString title(d->title_); if (title.isEmpty()) title = d->basefilename_; if (title.isEmpty()) title = d->url_.toString(); return title; } QString Song::PrettyTitleWithArtist() const { QString title(d->title_); if (title.isEmpty()) title = d->basefilename_; if (!d->artist_.isEmpty()) title = d->artist_ + " - " + title; return title; } QString Song::PrettyLength() const { if (length_nanosec() == -1) return QString::null; return Utilities::PrettyTimeNanosec(length_nanosec()); } QString Song::PrettyYear() const { if (d->year_ == -1) return QString::null; return QString::number(d->year_); } QString Song::TitleWithCompilationArtist() const { QString title(d->title_); if (title.isEmpty()) title = d->basefilename_; if (is_compilation() && !d->artist_.isEmpty() && !d->artist_.toLower().contains("various")) title = d->artist_ + " - " + title; return title; } bool Song::IsMetadataEqual(const Song& other) const { return d->title_ == other.d->title_ && d->album_ == other.d->album_ && d->artist_ == other.d->artist_ && d->albumartist_ == other.d->albumartist_ && d->composer_ == other.d->composer_ && d->performer_ == other.d->performer_ && d->grouping_ == other.d->grouping_ && d->track_ == other.d->track_ && d->disc_ == other.d->disc_ && qFuzzyCompare(d->bpm_, other.d->bpm_) && d->year_ == other.d->year_ && d->originalyear_ == other.d->originalyear_ && d->genre_ == other.d->genre_ && d->comment_ == other.d->comment_ && d->compilation_ == other.d->compilation_ && d->beginning_ == other.d->beginning_ && length_nanosec() == other.length_nanosec() && d->bitrate_ == other.d->bitrate_ && d->samplerate_ == other.d->samplerate_ && d->art_automatic_ == other.d->art_automatic_ && d->art_manual_ == other.d->art_manual_ && d->rating_ == other.d->rating_ && d->cue_path_ == other.d->cue_path_ && d->lyrics_ == other.d->lyrics_; } bool Song::IsEditable() const { return d->valid_ && !d->url_.isEmpty() && !is_stream() && d->filetype_ != Type_Unknown && !has_cue(); } bool Song::operator==(const Song& other) const { // TODO(Paweł Bara): this isn't working for radios return url() == other.url() && beginning_nanosec() == other.beginning_nanosec(); } uint qHash(const Song& song) { // Should compare the same fields as operator== return qHash(song.url().toString()) ^ qHash(song.beginning_nanosec()); } bool Song::IsSimilar(const Song& other) const { return title().compare(other.title(), Qt::CaseInsensitive) == 0 && artist().compare(other.artist(), Qt::CaseInsensitive) == 0; } uint HashSimilar(const Song& song) { // Should compare the same fields as function IsSimilar return qHash(song.title().toLower()) ^ qHash(song.artist().toLower()); } bool Song::IsOnSameAlbum(const Song& other) const { if (is_compilation() != other.is_compilation()) return false; if (has_cue() && other.has_cue() && cue_path() == other.cue_path()) return true; if (is_compilation() && album() == other.album()) return true; return album() == other.album() && artist() == other.artist(); } QString Song::AlbumKey() const { return QString("%1|%2|%3").arg(is_compilation() ? "_compilation" : artist(), has_cue() ? cue_path() : "", album()); } void Song::ToXesam(QVariantMap* map) const { using mpris::AddMetadata; using mpris::AddMetadataAsList; using mpris::AsMPRISDateTimeType; AddMetadata("xesam:url", url().toString(), map); AddMetadata("xesam:title", PrettyTitle(), map); AddMetadataAsList("xesam:artist", artist(), map); AddMetadata("xesam:album", album(), map); AddMetadataAsList("xesam:albumArtist", albumartist(), map); AddMetadata("mpris:length", length_nanosec() / kNsecPerUsec, map); AddMetadata("xesam:trackNumber", track(), map); AddMetadataAsList("xesam:genre", genre(), map); AddMetadata("xesam:discNumber", disc(), map); AddMetadataAsList("xesam:comment", comment(), map); AddMetadata("xesam:contentCreated", AsMPRISDateTimeType(ctime()), map); AddMetadata("xesam:lastUsed", AsMPRISDateTimeType(lastplayed()), map); AddMetadata("xesam:audioBPM", static_cast(bpm()), map); AddMetadataAsList("xesam:composer", composer(), map); AddMetadata("xesam:useCount", playcount(), map); AddMetadata("xesam:autoRating", score(), map); if (rating() != -1.0) { AddMetadata("xesam:userRating", rating(), map); } } void Song::MergeUserSetData(const Song& other) { set_playcount(other.playcount()); set_skipcount(other.skipcount()); set_lastplayed(other.lastplayed()); set_score(other.score()); set_art_manual(other.art_manual()); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/song.h000066400000000000000000000227721260417502300222370ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2009-2012, David Sansome Copyright 2010-2011, Paweł Bara Copyright 2010, 2012, 2014, John Maguire Copyright 2011-2012, 2014, Arnaud Bienner Copyright 2011, Angus Gratton Copyright 2012, Kacper "mattrick" Banasik Copyright 2013, Martin Brodbeck Copyright 2013, Joel Bradshaw Copyright 2013, Uwe Klotz Copyright 2013, Mateusz Kowalczyk Copyright 2014, Andreas Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_SONG_H_ #define CORE_SONG_H_ #include #include #include #include #include #include "config.h" #include "engines/engine_fwd.h" namespace pb { namespace tagreader { class SongMetadata; } // namespace tagreader } // namespace pb class QSqlQuery; class QUrl; #ifdef HAVE_LIBGPOD struct _Itdb_Track; #endif #ifdef HAVE_LIBMTP struct LIBMTP_track_struct; #endif #ifdef HAVE_LIBLASTFM namespace lastfm { class Track; } #endif class SqlRow; class Song { public: Song(); Song(const Song& other); ~Song(); static const QStringList kColumns; static const QString kColumnSpec; static const QString kBindSpec; static const QString kUpdateSpec; static const QStringList kFtsColumns; static const QString kFtsColumnSpec; static const QString kFtsBindSpec; static const QString kFtsUpdateSpec; static const QString kManuallyUnsetCover; static const QString kEmbeddedCover; static QString JoinSpec(const QString& table); // Don't change these values - they're stored in the database, and defined // in the tag reader protobuf. // If a new lossless file is added, also add it to IsFileLossless(). enum FileType { Type_Unknown = 0, Type_Asf = 1, Type_Flac = 2, Type_Mp4 = 3, Type_Mpc = 4, Type_Mpeg = 5, Type_OggFlac = 6, Type_OggSpeex = 7, Type_OggVorbis = 8, Type_Aiff = 9, Type_Wav = 10, Type_TrueAudio = 11, Type_Cdda = 12, Type_OggOpus = 13, Type_Stream = 99, }; static QString TextForFiletype(FileType type); QString TextForFiletype() const { return TextForFiletype(filetype()); } bool IsFileLossless() const; // Sort songs alphabetically using their pretty title static void SortSongsListAlphabetically(QList* songs); // Constructors void Init(const QString& title, const QString& artist, const QString& album, qint64 length_nanosec); void Init(const QString& title, const QString& artist, const QString& album, qint64 beginning, qint64 end); void InitFromProtobuf(const pb::tagreader::SongMetadata& pb); void InitFromQuery(const SqlRow& query, bool reliable_metadata, int col = 0); void InitFromFilePartial( const QString& filename); // Just store the filename: incomplete but fast void InitArtManual(); // Check if there is already a art in the cache and // store the filename in art_manual #ifdef HAVE_LIBLASTFM void InitFromLastFM(const lastfm::Track& track); #endif void MergeFromSimpleMetaBundle(const Engine::SimpleMetaBundle& bundle); #ifdef HAVE_LIBGPOD void InitFromItdb(const _Itdb_Track* track, const QString& prefix); void ToItdb(_Itdb_Track* track) const; #endif #ifdef HAVE_LIBMTP void InitFromMTP(const LIBMTP_track_struct* track, const QString& host); void ToMTP(LIBMTP_track_struct* track) const; #endif // Copies important statistics from the other song to this one, overwriting // any data that already exists. Useful when you want updated tags from disk // but you want to keep user stats. void MergeUserSetData(const Song& other); static QString Decode(const QString& tag, const QTextCodec* codec = nullptr); // Save void BindToQuery(QSqlQuery* query) const; void BindToFtsQuery(QSqlQuery* query) const; #ifdef HAVE_LIBLASTFM void ToLastFM(lastfm::Track* track, bool prefer_album_artist) const; #endif void ToXesam(QVariantMap* map) const; void ToProtobuf(pb::tagreader::SongMetadata* pb) const; // Simple accessors bool is_valid() const; bool is_unavailable() const; int id() const; const QString& title() const; const QString& album() const; const QString& artist() const; const QString& albumartist() const; const QString& effective_albumartist() const; // Playlist views are special because you don't want to fill in album artists // automatically for // compilations, but you do for normal albums: const QString& playlist_albumartist() const; const QString& composer() const; const QString& performer() const; const QString& grouping() const; const QString& lyrics() const; int track() const; int disc() const; float bpm() const; int year() const; int originalyear() const; int effective_originalyear() const; const QString& genre() const; const QString& comment() const; bool is_compilation() const; float rating() const; int playcount() const; int skipcount() const; int lastplayed() const; int score() const; int album_id() const; const QString& cue_path() const; bool has_cue() const; qint64 beginning_nanosec() const; qint64 end_nanosec() const; qint64 length_nanosec() const; int bitrate() const; int samplerate() const; int directory_id() const; const QUrl& url() const; const QString& basefilename() const; uint mtime() const; uint ctime() const; int filesize() const; FileType filetype() const; bool is_stream() const; bool is_cdda() const; // Guess if it is a library song using fields set. Might not be 100% reliable. bool is_library_song() const; const QString& art_automatic() const; const QString& art_manual() const; const QString& etag() const; // Returns true if this Song had it's cover manually unset by user. bool has_manually_unset_cover() const; // This method represents an explicit request to unset this song's // cover. void manually_unset_cover(); // Returns true if this song (it's media file) has an embedded cover. bool has_embedded_cover() const; // Sets a flag saying that this song (it's media file) has an embedded // cover. void set_embedded_cover(); const QImage& image() const; // Pretty accessors QString PrettyRating() const; QString PrettyTitle() const; QString PrettyTitleWithArtist() const; QString PrettyLength() const; QString PrettyYear() const; QString TitleWithCompilationArtist() const; // Setters bool IsEditable() const; void set_id(int id); void set_valid(bool v); void set_title(const QString& v); void set_album(const QString& v); void set_artist(const QString& v); void set_albumartist(const QString& v); void set_composer(const QString& v); void set_performer(const QString& v); void set_grouping(const QString& v); void set_lyrics(const QString& v); void set_track(int v); void set_disc(int v); void set_bpm(float v); void set_year(int v); void set_originalyear(int v); void set_genre(const QString& v); void set_genre_id3(int id); void set_comment(const QString& v); void set_compilation(bool v); void set_sampler(bool v); void set_album_id(int v); void set_beginning_nanosec(qint64 v); void set_end_nanosec(qint64 v); void set_length_nanosec(qint64 v); void set_bitrate(int v); void set_samplerate(int v); void set_mtime(int v); void set_ctime(int v); void set_filesize(int v); void set_filetype(FileType v); void set_art_automatic(const QString& v); void set_art_manual(const QString& v); void set_image(const QImage& i); void set_forced_compilation_on(bool v); void set_forced_compilation_off(bool v); void set_rating(float v); void set_playcount(int v); void set_skipcount(int v); void set_lastplayed(int v); void set_score(int v); void set_cue_path(const QString& v); void set_unavailable(bool v); void set_etag(const QString& etag); // Setters that should only be used by tests void set_url(const QUrl& v); void set_basefilename(const QString& v); void set_directory_id(int v); // Comparison functions bool IsMetadataEqual(const Song& other) const; bool IsOnSameAlbum(const Song& other) const; bool IsSimilar(const Song& other) const; bool operator==(const Song& other) const; // Two songs that are on the same album will have the same AlbumKey. It is // more efficient to use IsOnSameAlbum, but this function can be used when // you need to hash the key to do fast lookups. QString AlbumKey() const; Song& operator=(const Song& other); private: struct Private; QSharedDataPointer d; }; Q_DECLARE_METATYPE(Song); typedef QList SongList; Q_DECLARE_METATYPE(QList); uint qHash(const Song& song); // Hash function using field checked in IsSimilar function uint HashSimilar(const Song& song); #endif // CORE_SONG_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/songloader.cpp000066400000000000000000000441231260417502300237530ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2014, David Sansome Copyright 2010-2014, John Maguire Copyright 2011-2012, 2014, Arnaud Bienner Copyright 2011, Paweł Bara Copyright 2014, Alexander Bikadorov Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "songloader.h" #include #include #include #include #include #include #include #include "config.h" #include "core/logging.h" #include "core/player.h" #include "core/signalchecker.h" #include "core/song.h" #include "core/tagreaderclient.h" #include "core/timeconstants.h" #include "internet/lastfm/fixlastfm.h" #include "internet/core/internetmodel.h" #include "library/librarybackend.h" #include "library/sqlrow.h" #include "playlistparsers/cueparser.h" #include "playlistparsers/parserbase.h" #include "playlistparsers/playlistparser.h" #include "internet/podcasts/podcastparser.h" #include "internet/podcasts/podcastservice.h" #include "internet/podcasts/podcasturlloader.h" #ifdef HAVE_AUDIOCD #include #include "devices/cddasongloader.h" #endif using std::placeholders::_1; QSet SongLoader::sRawUriSchemes; const int SongLoader::kDefaultTimeout = 5000; SongLoader::SongLoader(LibraryBackendInterface* library, const Player* player, QObject* parent) : QObject(parent), timeout_timer_(new QTimer(this)), playlist_parser_(new PlaylistParser(library, this)), podcast_parser_(new PodcastParser), cue_parser_(new CueParser(library, this)), timeout_(kDefaultTimeout), state_(WaitingForType), success_(false), parser_(nullptr), is_podcast_(false), library_(library), player_(player) { if (sRawUriSchemes.isEmpty()) { sRawUriSchemes << "udp" << "mms" << "mmsh" << "mmst" << "mmsu" << "rtsp" << "rtspu" << "rtspt" << "rtsph" << "spotify"; } timeout_timer_->setSingleShot(true); connect(timeout_timer_, SIGNAL(timeout()), SLOT(Timeout())); } SongLoader::~SongLoader() { if (pipeline_) { state_ = Finished; gst_element_set_state(pipeline_.get(), GST_STATE_NULL); } delete podcast_parser_; } SongLoader::Result SongLoader::Load(const QUrl& url) { url_ = url; if (url_.scheme() == "file") { return LoadLocal(url_.toLocalFile()); } if (sRawUriSchemes.contains(url_.scheme()) || player_->HandlerForUrl(url) != nullptr) { // The URI scheme indicates that it can't possibly be a playlist, or we have // a custom handler for the URL, so add it as a raw stream. AddAsRawStream(); return Success; } url_ = PodcastUrlLoader::FixPodcastUrl(url_); preload_func_ = std::bind(&SongLoader::LoadRemote, this); return BlockingLoadRequired; } void SongLoader::LoadFilenamesBlocking() { if (preload_func_) { preload_func_(); } } SongLoader::Result SongLoader::LoadLocalPartial(const QString& filename) { qLog(Debug) << "Fast Loading local file" << filename; // First check to see if it's a directory - if so we can load all the songs // inside right away. if (QFileInfo(filename).isDir()) { LoadLocalDirectory(filename); return Success; } Song song; song.InitFromFilePartial(filename); if (song.is_valid()) songs_ << song; return Success; } SongLoader::Result SongLoader::LoadAudioCD() { #ifdef HAVE_AUDIOCD CddaSongLoader* cdda_song_loader = new CddaSongLoader; connect(cdda_song_loader, SIGNAL(SongsDurationLoaded(SongList)), this, SLOT(AudioCDTracksLoadedSlot(SongList))); connect(cdda_song_loader, SIGNAL(SongsMetadataLoaded(SongList)), this, SLOT(AudioCDTracksTagsLoaded(SongList))); cdda_song_loader->LoadSongs(); return Success; #else // HAVE_AUDIOCD return Error; #endif } #ifdef HAVE_AUDIOCD void SongLoader::AudioCDTracksLoadedSlot(const SongList& songs) { songs_ = songs; emit AudioCDTracksLoaded(); } void SongLoader::AudioCDTracksTagsLoaded(const SongList& songs) { CddaSongLoader* cdda_song_loader = qobject_cast(sender()); cdda_song_loader->deleteLater(); songs_ = songs; emit LoadAudioCDFinished(true); } #endif // HAVE_AUDIOCD SongLoader::Result SongLoader::LoadLocal(const QString& filename) { qLog(Debug) << "Loading local file" << filename; // Search in the database. QUrl url = QUrl::fromLocalFile(filename); LibraryQuery query; query.SetColumnSpec("%songs_table.ROWID, " + Song::kColumnSpec); query.AddWhere("filename", url.toEncoded()); if (library_->ExecQuery(&query) && query.Next()) { // we may have many results when the file has many sections do { Song song; song.InitFromQuery(query, true); if (song.is_valid()) { songs_ << song; } } while (query.Next()); return Success; } // It's not in the database, load it asynchronously. preload_func_ = std::bind(&SongLoader::LoadLocalAsync, this, filename); return BlockingLoadRequired; } void SongLoader::LoadLocalAsync(const QString& filename) { // First check to see if it's a directory - if so we will load all the songs // inside right away. if (QFileInfo(filename).isDir()) { LoadLocalDirectory(filename); return; } // It's a local file, so check if it looks like a playlist. // Read the first few bytes. QFile file(filename); if (!file.open(QIODevice::ReadOnly)) return; QByteArray data(file.read(PlaylistParser::kMagicSize)); ParserBase* parser = playlist_parser_->ParserForMagic(data); if (!parser) { // Check the file extension as well, maybe the magic failed, or it was a // basic M3U file which is just a plain list of filenames. parser = playlist_parser_-> ParserForExtension(QFileInfo(filename).suffix().toLower()); } if (parser) { qLog(Debug) << "Parsing using" << parser->name(); // It's a playlist! LoadPlaylist(parser, filename); return; } // Check if it's a cue file QString matching_cue = filename.section('.', 0, -2) + ".cue"; if (QFile::exists(matching_cue)) { // it's a cue - create virtual tracks QFile cue(matching_cue); cue.open(QIODevice::ReadOnly); SongList song_list = cue_parser_->Load(&cue, matching_cue, QDir(filename.section('/', 0, -2))); for (Song song : song_list) { if (song.is_valid()) songs_ << song; } return; } // Assume it's just a normal file Song song; song.InitFromFilePartial(filename); if (song.is_valid()) { songs_ << song; } } void SongLoader::LoadMetadataBlocking() { for (int i = 0; i < songs_.size(); i++) { EffectiveSongLoad(&songs_[i]); } } void SongLoader::EffectiveSongLoad(Song* song) { if (!song) return; if (song->filetype() != Song::Type_Unknown) { // Maybe we loaded the metadata already, for example from a cuesheet. return; } // First, try to get the song from the library Song library_song = library_->GetSongByUrl(song->url()); if (library_song.is_valid()) { *song = library_song; } else { // it's a normal media file QString filename = song->url().toLocalFile(); TagReaderClient::Instance()->ReadFileBlocking(filename, song); } } void SongLoader::LoadPlaylist(ParserBase* parser, const QString& filename) { QFile file(filename); file.open(QIODevice::ReadOnly); songs_ = parser->Load(&file, filename, QFileInfo(filename).path()); } static bool CompareSongs(const Song& left, const Song& right) { // Order by artist, album, disc, track if (left.artist() < right.artist()) return true; if (left.artist() > right.artist()) return false; if (left.album() < right.album()) return true; if (left.album() > right.album()) return false; if (left.disc() < right.disc()) return true; if (left.disc() > right.disc()) return false; if (left.track() < right.track()) return true; if (left.track() > right.track()) return false; return left.url() < right.url(); } void SongLoader::LoadLocalDirectory(const QString& filename) { QDirIterator it(filename, QDir::Files | QDir::NoDotAndDotDot | QDir::Readable, QDirIterator::Subdirectories); while (it.hasNext()) { LoadLocalPartial(it.next()); } qStableSort(songs_.begin(), songs_.end(), CompareSongs); // Load the first song: all songs will be loaded async, but we want the first // one in our list to be fully loaded, so if the user has the "Start playing // when adding to playlist" preference behaviour set, it can enjoy the first // song being played (seek it, have moodbar, etc.) if (!songs_.isEmpty()) EffectiveSongLoad(&(*songs_.begin())); } void SongLoader::AddAsRawStream() { Song song; song.set_valid(true); song.set_filetype(Song::Type_Stream); song.set_url(url_); song.set_title(url_.toString()); songs_ << song; } void SongLoader::Timeout() { state_ = Finished; success_ = false; StopTypefind(); } void SongLoader::StopTypefind() { // Destroy the pipeline if (pipeline_) { gst_element_set_state(pipeline_.get(), GST_STATE_NULL); pipeline_.reset(); } timeout_timer_->stop(); if (success_ && parser_) { qLog(Debug) << "Parsing" << url_ << "with" << parser_->name(); // Parse the playlist QBuffer buf(&buffer_); buf.open(QIODevice::ReadOnly); songs_ = parser_->Load(&buf); } else if (success_ && is_podcast_) { qLog(Debug) << "Parsing" << url_ << "as a podcast"; QBuffer buf(&buffer_); buf.open(QIODevice::ReadOnly); QVariant result = podcast_parser_->Load(&buf, url_); if (result.isNull()) { qLog(Warning) << "Failed to parse podcast"; } else { InternetModel::Service()->SubscribeAndShow(result); } } else if (success_) { qLog(Debug) << "Loading" << url_ << "as raw stream"; // It wasn't a playlist - just put the URL in as a stream AddAsRawStream(); } emit LoadRemoteFinished(); } void SongLoader::LoadRemote() { qLog(Debug) << "Loading remote file" << url_; // It's not a local file so we have to fetch it to see what it is. We use // gstreamer to do this since it handles funky URLs for us (http://, ssh://, // etc) and also has typefinder plugins. // First we wait for typefinder to tell us what it is. If it's not text/plain // or text/uri-list assume it's a song and return success. // Otherwise wait to get 512 bytes of data and do magic on it - if the magic // fails then we don't know what it is so return failure. // If the magic succeeds then we know for sure it's a playlist - so read the // rest of the file, parse the playlist and return success. timeout_timer_->start(timeout_); // Create the pipeline - it gets unreffed if it goes out of scope std::shared_ptr pipeline(gst_pipeline_new(nullptr), std::bind(&gst_object_unref, _1)); // Create the source element automatically based on the URL GstElement* source = gst_element_make_from_uri( GST_URI_SRC, url_.toEncoded().constData(), nullptr, nullptr); if (!source) { qLog(Warning) << "Couldn't create gstreamer source element for" << url_.toString(); return; } // Create the other elements and link them up GstElement* typefind = gst_element_factory_make("typefind", nullptr); GstElement* fakesink = gst_element_factory_make("fakesink", nullptr); gst_bin_add_many(GST_BIN(pipeline.get()), source, typefind, fakesink, nullptr); gst_element_link_many(source, typefind, fakesink, nullptr); // Connect callbacks GstBus* bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline.get())); CHECKED_GCONNECT(typefind, "have-type", &TypeFound, this); gst_bus_set_sync_handler(bus, BusCallbackSync, this, NULL); gst_bus_add_watch(bus, BusCallback, this); // Add a probe to the sink so we can capture the data if it's a playlist GstPad* pad = gst_element_get_static_pad(fakesink, "sink"); gst_pad_add_probe( pad, GST_PAD_PROBE_TYPE_BUFFER, &DataReady, this, NULL); gst_object_unref(pad); QEventLoop loop; loop.connect(this, SIGNAL(LoadRemoteFinished()), SLOT(quit())); // Start "playing" gst_element_set_state(pipeline.get(), GST_STATE_PLAYING); pipeline_ = pipeline; // Wait until loading is finished loop.exec(); } void SongLoader::TypeFound(GstElement*, uint, GstCaps* caps, void* self) { SongLoader* instance = static_cast(self); if (instance->state_ != WaitingForType) return; // Check the mimetype instance->mime_type_ = gst_structure_get_name(gst_caps_get_structure(caps, 0)); qLog(Debug) << "Mime type is" << instance->mime_type_; if (instance->mime_type_ == "text/plain" || instance->mime_type_ == "text/uri-list" || instance->podcast_parser_->supported_mime_types().contains( instance->mime_type_)) { // Yeah it might be a playlist, let's get some data and have a better look instance->state_ = WaitingForMagic; return; } // Nope, not a playlist - we're done instance->StopTypefindAsync(true); } GstPadProbeReturn SongLoader::DataReady( GstPad*, GstPadProbeInfo* info, gpointer self) { SongLoader* instance = reinterpret_cast(self); if (instance->state_ == Finished) return GST_PAD_PROBE_OK; GstBuffer* buffer = gst_pad_probe_info_get_buffer(info); GstMapInfo map; gst_buffer_map(buffer, &map, GST_MAP_READ); // Append the data to the buffer instance->buffer_.append(reinterpret_cast(map.data), map.size); qLog(Debug) << "Received total" << instance->buffer_.size() << "bytes"; gst_buffer_unmap(buffer, &map); if (instance->state_ == WaitingForMagic && (instance->buffer_.size() >= PlaylistParser::kMagicSize || !instance->IsPipelinePlaying())) { // Got enough that we can test the magic instance->MagicReady(); } return GST_PAD_PROBE_OK; } gboolean SongLoader::BusCallback(GstBus*, GstMessage* msg, gpointer self) { SongLoader* instance = reinterpret_cast(self); switch (GST_MESSAGE_TYPE(msg)) { case GST_MESSAGE_ERROR: instance->ErrorMessageReceived(msg); break; default: break; } return TRUE; } GstBusSyncReply SongLoader::BusCallbackSync(GstBus*, GstMessage* msg, gpointer self) { SongLoader* instance = reinterpret_cast(self); switch (GST_MESSAGE_TYPE(msg)) { case GST_MESSAGE_EOS: instance->EndOfStreamReached(); break; case GST_MESSAGE_ERROR: instance->ErrorMessageReceived(msg); break; default: break; } return GST_BUS_PASS; } void SongLoader::ErrorMessageReceived(GstMessage* msg) { if (state_ == Finished) return; GError* error; gchar* debugs; gst_message_parse_error(msg, &error, &debugs); qLog(Error) << error->message; qLog(Error) << debugs; QString message_str = error->message; g_error_free(error); free(debugs); if (state_ == WaitingForType && message_str == gst_error_get_message(GST_STREAM_ERROR, GST_STREAM_ERROR_TYPE_NOT_FOUND)) { // Don't give up - assume it's a playlist and see if one of our parsers can // read it. state_ = WaitingForMagic; return; } StopTypefindAsync(false); } void SongLoader::EndOfStreamReached() { qLog(Debug) << Q_FUNC_INFO << state_; switch (state_) { case Finished: break; case WaitingForMagic: // Do the magic on the data we have already MagicReady(); if (state_ == Finished) break; // It looks like a playlist, so parse it // fallthrough case WaitingForData: // It's a playlist and we've got all the data - finish and parse it StopTypefindAsync(true); break; case WaitingForType: StopTypefindAsync(false); break; } } void SongLoader::MagicReady() { qLog(Debug) << Q_FUNC_INFO; parser_ = playlist_parser_->ParserForMagic(buffer_, mime_type_); is_podcast_ = false; if (!parser_) { // Maybe it's a podcast? if (podcast_parser_->TryMagic(buffer_)) { is_podcast_ = true; qLog(Debug) << "Looks like a podcast"; } else { qLog(Warning) << url_.toString() << "is text, but not a recognised playlist"; // It doesn't look like a playlist, so just finish StopTypefindAsync(false); return; } } // We'll get more data and parse the whole thing in EndOfStreamReached if (!is_podcast_) { qLog(Debug) << "Magic says" << parser_->name(); if (parser_->name() == "ASX/INI" && url_.scheme() == "http") { // This is actually a weird MS-WMSP stream. Changing the protocol to MMS // from // HTTP makes it playable. parser_ = nullptr; url_.setScheme("mms"); StopTypefindAsync(true); } } state_ = WaitingForData; if (!IsPipelinePlaying()) { EndOfStreamReached(); } } bool SongLoader::IsPipelinePlaying() { GstState state = GST_STATE_NULL; GstState pending_state = GST_STATE_NULL; GstStateChangeReturn ret = gst_element_get_state(pipeline_.get(), &state, &pending_state, GST_SECOND); if (ret == GST_STATE_CHANGE_ASYNC && pending_state == GST_STATE_PLAYING) { // We're still on the way to playing return true; } return state == GST_STATE_PLAYING; } void SongLoader::StopTypefindAsync(bool success) { state_ = Finished; success_ = success; metaObject()->invokeMethod(this, "StopTypefind", Qt::QueuedConnection); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/songloader.h000066400000000000000000000106651260417502300234240ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, 2012-2014, David Sansome Copyright 2010-2011, 2014, John Maguire Copyright 2011-2012, 2014, Arnaud Bienner Copyright 2011, Paweł Bara Copyright 2014, Alexander Bikadorov Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_SONGLOADER_H_ #define CORE_SONGLOADER_H_ #include #include #include #include #include #include #include "song.h" #include "core/tagreaderclient.h" #include "musicbrainz/musicbrainzclient.h" class CueParser; class LibraryBackendInterface; class ParserBase; class Player; class PlaylistParser; class PodcastParser; class CddaSongLoader; class SongLoader : public QObject { Q_OBJECT public: SongLoader(LibraryBackendInterface* library, const Player* player, QObject* parent = nullptr); ~SongLoader(); enum Result { Success, Error, BlockingLoadRequired, }; static const int kDefaultTimeout; const QUrl& url() const { return url_; } const SongList& songs() const { return songs_; } int timeout() const { return timeout_; } void set_timeout(int msec) { timeout_ = msec; } // If Success is returned the songs are fully loaded. If BlockingLoadRequired // is returned LoadFilenamesBlocking() needs to be called next. Result Load(const QUrl& url); // Loads the files with only filenames. When finished, songs() contains a // complete list of all Song objects, but without metadata. This method is // blocking, do not call it from the UI thread. void LoadFilenamesBlocking(); // Completely load songs previously loaded with LoadFilenamesBlocking(). When // finished, the Song objects in songs() contain metadata now. This method is // blocking, do not call it from the UI thread. void LoadMetadataBlocking(); Result LoadAudioCD(); signals: void AudioCDTracksLoaded(); void LoadAudioCDFinished(bool success); void LoadRemoteFinished(); private slots: void Timeout(); void StopTypefind(); #ifdef HAVE_AUDIOCD void AudioCDTracksLoadedSlot(const SongList& songs); void AudioCDTracksTagsLoaded(const SongList& songs); #endif // HAVE_AUDIOCD private: enum State { WaitingForType, WaitingForMagic, WaitingForData, Finished, }; Result LoadLocal(const QString& filename); void LoadLocalAsync(const QString& filename); void EffectiveSongLoad(Song* song); Result LoadLocalPartial(const QString& filename); void LoadLocalDirectory(const QString& filename); void LoadPlaylist(ParserBase* parser, const QString& filename); void AddAsRawStream(); void LoadRemote(); // GStreamer callbacks static void TypeFound(GstElement* typefind, uint probability, GstCaps* caps, void* self); static GstPadProbeReturn DataReady(GstPad*, GstPadProbeInfo* buf, gpointer self); static GstBusSyncReply BusCallbackSync(GstBus*, GstMessage*, gpointer); static gboolean BusCallback(GstBus*, GstMessage*, gpointer); void StopTypefindAsync(bool success); void ErrorMessageReceived(GstMessage* msg); void EndOfStreamReached(); void MagicReady(); bool IsPipelinePlaying(); private: static QSet sRawUriSchemes; QUrl url_; SongList songs_; QTimer* timeout_timer_; PlaylistParser* playlist_parser_; PodcastParser* podcast_parser_; CueParser* cue_parser_; // For async loads std::function preload_func_; int timeout_; State state_; bool success_; ParserBase* parser_; QString mime_type_; bool is_podcast_; QByteArray buffer_; LibraryBackendInterface* library_; const Player* player_; std::shared_ptr pipeline_; QThreadPool thread_pool_; }; #endif // CORE_SONGLOADER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/stylesheetloader.cpp000066400000000000000000000102111260417502300251650ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, David Sansome Copyright 2010, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "stylesheetloader.h" #include "core/logging.h" #include #include StyleSheetLoader::StyleSheetLoader(QObject* parent) : QObject(parent) {} void StyleSheetLoader::SetStyleSheet(QWidget* widget, const QString& filename) { filenames_[widget] = filename; widget->installEventFilter(this); UpdateStyleSheet(widget); } void StyleSheetLoader::UpdateStyleSheet(QWidget* widget) { QString filename(filenames_[widget]); // Load the file QFile file(filename); if (!file.open(QIODevice::ReadOnly)) { qLog(Warning) << "error opening" << filename; return; } QString contents(file.readAll()); // Replace %palette-role with actual colours QPalette p(widget->palette()); QColor alt = p.color(QPalette::AlternateBase); alt.setAlpha(50); contents.replace("%palette-alternate-base", QString("rgba(%1,%2,%3,%4%)") .arg(alt.red()) .arg(alt.green()) .arg(alt.blue()) .arg(alt.alpha())); ReplaceColor(&contents, "Window", p, QPalette::Window); ReplaceColor(&contents, "Background", p, QPalette::Background); ReplaceColor(&contents, "WindowText", p, QPalette::WindowText); ReplaceColor(&contents, "Foreground", p, QPalette::Foreground); ReplaceColor(&contents, "Base", p, QPalette::Base); ReplaceColor(&contents, "AlternateBase", p, QPalette::AlternateBase); ReplaceColor(&contents, "ToolTipBase", p, QPalette::ToolTipBase); ReplaceColor(&contents, "ToolTipText", p, QPalette::ToolTipText); ReplaceColor(&contents, "Text", p, QPalette::Text); ReplaceColor(&contents, "Button", p, QPalette::Button); ReplaceColor(&contents, "ButtonText", p, QPalette::ButtonText); ReplaceColor(&contents, "BrightText", p, QPalette::BrightText); ReplaceColor(&contents, "Light", p, QPalette::Light); ReplaceColor(&contents, "Midlight", p, QPalette::Midlight); ReplaceColor(&contents, "Dark", p, QPalette::Dark); ReplaceColor(&contents, "Mid", p, QPalette::Mid); ReplaceColor(&contents, "Shadow", p, QPalette::Shadow); ReplaceColor(&contents, "Highlight", p, QPalette::Highlight); ReplaceColor(&contents, "HighlightedText", p, QPalette::HighlightedText); ReplaceColor(&contents, "Link", p, QPalette::Link); ReplaceColor(&contents, "LinkVisited", p, QPalette::LinkVisited); #ifdef Q_OS_DARWIN contents.replace("darwin", "*"); #endif widget->setStyleSheet(contents); } void StyleSheetLoader::ReplaceColor(QString* css, const QString& name, const QPalette& palette, QPalette::ColorRole role) const { css->replace("%palette-" + name + "-lighter", palette.color(role).lighter().name(), Qt::CaseInsensitive); css->replace("%palette-" + name + "-darker", palette.color(role).darker().name(), Qt::CaseInsensitive); css->replace("%palette-" + name, palette.color(role).name(), Qt::CaseInsensitive); } bool StyleSheetLoader::eventFilter(QObject* obj, QEvent* event) { if (event->type() != QEvent::PaletteChange) return false; QWidget* widget = qobject_cast(obj); if (!widget || !filenames_.contains(widget)) return false; UpdateStyleSheet(widget); return false; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/stylesheetloader.h000066400000000000000000000032151260417502300246400ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_STYLESHEETLOADER_H_ #define CORE_STYLESHEETLOADER_H_ #include #include #include #include class StyleSheetLoader : public QObject { public: explicit StyleSheetLoader(QObject* parent = nullptr); // Sets the given stylesheet on the given widget. // If the stylesheet contains strings like %palette-[role], these get replaced // with actual palette colours. // The stylesheet is reloaded when the widget's palette changes. void SetStyleSheet(QWidget* widget, const QString& filename); protected: bool eventFilter(QObject* obj, QEvent* event); private: void UpdateStyleSheet(QWidget* widget); void ReplaceColor(QString* css, const QString& name, const QPalette& palette, QPalette::ColorRole role) const; private: QMap filenames_; }; #endif // CORE_STYLESHEETLOADER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/tagreaderclient.cpp000066400000000000000000000163711260417502300247570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2012, 2014, John Maguire Copyright 2013, Arnaud Bienner Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "tagreaderclient.h" #include #include #include #include #include #include const char* TagReaderClient::kWorkerExecutableName = "clementine-tagreader"; TagReaderClient* TagReaderClient::sInstance = nullptr; TagReaderClient::TagReaderClient(QObject* parent) : QObject(parent), worker_pool_(new WorkerPool(this)) { sInstance = this; worker_pool_->SetExecutableName(kWorkerExecutableName); worker_pool_->SetWorkerCount(QThread::idealThreadCount()); connect(worker_pool_, SIGNAL(WorkerFailedToStart()), SLOT(WorkerFailedToStart())); } void TagReaderClient::Start() { worker_pool_->Start(); } void TagReaderClient::WorkerFailedToStart() { qLog(Error) << "The" << kWorkerExecutableName << "executable was not found" << "in the current directory or on the PATH. Clementine will" << "not be able to read music file tags without it."; } TagReaderReply* TagReaderClient::ReadFile(const QString& filename) { pb::tagreader::Message message; pb::tagreader::ReadFileRequest* req = message.mutable_read_file_request(); req->set_filename(DataCommaSizeFromQString(filename)); return worker_pool_->SendMessageWithReply(&message); } TagReaderReply* TagReaderClient::SaveFile(const QString& filename, const Song& metadata) { pb::tagreader::Message message; pb::tagreader::SaveFileRequest* req = message.mutable_save_file_request(); req->set_filename(DataCommaSizeFromQString(filename)); metadata.ToProtobuf(req->mutable_metadata()); return worker_pool_->SendMessageWithReply(&message); } TagReaderReply* TagReaderClient::UpdateSongStatistics(const Song& metadata) { pb::tagreader::Message message; pb::tagreader::SaveSongStatisticsToFileRequest* req = message.mutable_save_song_statistics_to_file_request(); req->set_filename(DataCommaSizeFromQString(metadata.url().toLocalFile())); metadata.ToProtobuf(req->mutable_metadata()); return worker_pool_->SendMessageWithReply(&message); } void TagReaderClient::UpdateSongsStatistics(const SongList& songs) { for (const Song& song : songs) { TagReaderReply* reply = UpdateSongStatistics(song); connect(reply, SIGNAL(Finished(bool)), reply, SLOT(deleteLater())); } } TagReaderReply* TagReaderClient::UpdateSongRating(const Song& metadata) { pb::tagreader::Message message; pb::tagreader::SaveSongRatingToFileRequest* req = message.mutable_save_song_rating_to_file_request(); req->set_filename(DataCommaSizeFromQString(metadata.url().toLocalFile())); metadata.ToProtobuf(req->mutable_metadata()); return worker_pool_->SendMessageWithReply(&message); } void TagReaderClient::UpdateSongsRating(const SongList& songs) { for (const Song& song : songs) { TagReaderReply* reply = UpdateSongRating(song); connect(reply, SIGNAL(Finished(bool)), reply, SLOT(deleteLater())); } } TagReaderReply* TagReaderClient::IsMediaFile(const QString& filename) { pb::tagreader::Message message; pb::tagreader::IsMediaFileRequest* req = message.mutable_is_media_file_request(); req->set_filename(DataCommaSizeFromQString(filename)); return worker_pool_->SendMessageWithReply(&message); } TagReaderReply* TagReaderClient::LoadEmbeddedArt(const QString& filename) { pb::tagreader::Message message; pb::tagreader::LoadEmbeddedArtRequest* req = message.mutable_load_embedded_art_request(); req->set_filename(DataCommaSizeFromQString(filename)); return worker_pool_->SendMessageWithReply(&message); } TagReaderReply* TagReaderClient::ReadCloudFile( const QUrl& download_url, const QString& title, int size, const QString& mime_type, const QString& authorisation_header) { pb::tagreader::Message message; pb::tagreader::ReadCloudFileRequest* req = message.mutable_read_cloud_file_request(); const QString url_string = download_url.toEncoded(); req->set_download_url(DataCommaSizeFromQString(url_string)); req->set_title(DataCommaSizeFromQString(title)); req->set_size(size); req->set_mime_type(DataCommaSizeFromQString(mime_type)); req->set_authorisation_header(DataCommaSizeFromQString(authorisation_header)); return worker_pool_->SendMessageWithReply(&message); } void TagReaderClient::ReadFileBlocking(const QString& filename, Song* song) { Q_ASSERT(QThread::currentThread() != thread()); TagReaderReply* reply = ReadFile(filename); if (reply->WaitForFinished()) { song->InitFromProtobuf(reply->message().read_file_response().metadata()); } reply->deleteLater(); } bool TagReaderClient::SaveFileBlocking(const QString& filename, const Song& metadata) { Q_ASSERT(QThread::currentThread() != thread()); bool ret = false; TagReaderReply* reply = SaveFile(filename, metadata); if (reply->WaitForFinished()) { ret = reply->message().save_file_response().success(); } reply->deleteLater(); return ret; } bool TagReaderClient::UpdateSongStatisticsBlocking(const Song& metadata) { Q_ASSERT(QThread::currentThread() != thread()); bool ret = false; TagReaderReply* reply = UpdateSongStatistics(metadata); if (reply->WaitForFinished()) { ret = reply->message().save_song_statistics_to_file_response().success(); } reply->deleteLater(); return ret; } bool TagReaderClient::UpdateSongRatingBlocking(const Song& metadata) { Q_ASSERT(QThread::currentThread() != thread()); bool ret = false; TagReaderReply* reply = UpdateSongRating(metadata); if (reply->WaitForFinished()) { ret = reply->message().save_song_rating_to_file_response().success(); } reply->deleteLater(); return ret; } bool TagReaderClient::IsMediaFileBlocking(const QString& filename) { Q_ASSERT(QThread::currentThread() != thread()); bool ret = false; TagReaderReply* reply = IsMediaFile(filename); if (reply->WaitForFinished()) { ret = reply->message().is_media_file_response().success(); } reply->deleteLater(); return ret; } QImage TagReaderClient::LoadEmbeddedArtBlocking(const QString& filename) { Q_ASSERT(QThread::currentThread() != thread()); QImage ret; TagReaderReply* reply = LoadEmbeddedArt(filename); if (reply->WaitForFinished()) { const std::string& data_str = reply->message().load_embedded_art_response().data(); ret.loadFromData(QByteArray(data_str.data(), data_str.size())); } reply->deleteLater(); return ret; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/tagreaderclient.h000066400000000000000000000057551260417502300244300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2012, 2014, John Maguire Copyright 2013, Arnaud Bienner Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_TAGREADERCLIENT_H_ #define CORE_TAGREADERCLIENT_H_ #include "song.h" #include "tagreadermessages.pb.h" #include "core/messagehandler.h" #include "core/workerpool.h" #include class QLocalServer; class QProcess; class TagReaderClient : public QObject { Q_OBJECT public: explicit TagReaderClient(QObject* parent = nullptr); typedef AbstractMessageHandler HandlerType; typedef HandlerType::ReplyType ReplyType; static const char* kWorkerExecutableName; void Start(); ReplyType* ReadFile(const QString& filename); ReplyType* SaveFile(const QString& filename, const Song& metadata); ReplyType* UpdateSongStatistics(const Song& metadata); ReplyType* UpdateSongRating(const Song& metadata); ReplyType* IsMediaFile(const QString& filename); ReplyType* LoadEmbeddedArt(const QString& filename); ReplyType* ReadCloudFile(const QUrl& download_url, const QString& title, int size, const QString& mime_type, const QString& authorisation_header); // Convenience functions that call the above functions and wait for a // response. These block the calling thread with a semaphore, and must NOT // be called from the TagReaderClient's thread. void ReadFileBlocking(const QString& filename, Song* song); bool SaveFileBlocking(const QString& filename, const Song& metadata); bool UpdateSongStatisticsBlocking(const Song& metadata); bool UpdateSongRatingBlocking(const Song& metadata); bool IsMediaFileBlocking(const QString& filename); QImage LoadEmbeddedArtBlocking(const QString& filename); // TODO(David Sansome): Make this not a singleton static TagReaderClient* Instance() { return sInstance; } public slots: void UpdateSongsStatistics(const SongList& songs); void UpdateSongsRating(const SongList& songs); private slots: void WorkerFailedToStart(); private: static TagReaderClient* sInstance; WorkerPool* worker_pool_; QList message_queue_; }; typedef TagReaderClient::ReplyType TagReaderReply; #endif // CORE_TAGREADERCLIENT_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/taskmanager.cpp000066400000000000000000000055711260417502300241170ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, David Sansome Copyright 2011, Arnaud Bienner Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "taskmanager.h" TaskManager::TaskManager(QObject* parent) : QObject(parent), next_task_id_(1) {} int TaskManager::StartTask(const QString& name) { Task t; t.name = name; t.progress = 0; t.progress_max = 0; t.blocks_library_scans = false; { QMutexLocker l(&mutex_); t.id = next_task_id_++; tasks_[t.id] = t; } emit TasksChanged(); return t.id; } QList TaskManager::GetTasks() { QList ret; { QMutexLocker l(&mutex_); ret = tasks_.values(); } return ret; } void TaskManager::SetTaskBlocksLibraryScans(int id) { { QMutexLocker l(&mutex_); if (!tasks_.contains(id)) return; Task& t = tasks_[id]; t.blocks_library_scans = true; } emit TasksChanged(); emit PauseLibraryWatchers(); } void TaskManager::SetTaskProgress(int id, int progress, int max) { { QMutexLocker l(&mutex_); if (!tasks_.contains(id)) return; Task& t = tasks_[id]; t.progress = progress; if (max) t.progress_max = max; } emit TasksChanged(); } void TaskManager::IncreaseTaskProgress(int id, int progress, int max) { { QMutexLocker l(&mutex_); if (!tasks_.contains(id)) return; Task& t = tasks_[id]; t.progress += progress; if (max) t.progress_max = max; } emit TasksChanged(); } void TaskManager::SetTaskFinished(int id) { bool resume_library_watchers = false; { QMutexLocker l(&mutex_); if (!tasks_.contains(id)) return; if (tasks_[id].blocks_library_scans) { resume_library_watchers = true; for (const Task& task : tasks_.values()) { if (task.id != id && task.blocks_library_scans) { resume_library_watchers = false; break; } } } tasks_.remove(id); } emit TasksChanged(); if (resume_library_watchers) emit ResumeLibraryWatchers(); } int TaskManager::GetTaskProgress(int id) { { QMutexLocker l(&mutex_); if (!tasks_.contains(id)) return 0; return tasks_[id].progress; } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/taskmanager.h000066400000000000000000000041551260417502300235610ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, David Sansome Copyright 2011, Arnaud Bienner Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_TASKMANAGER_H_ #define CORE_TASKMANAGER_H_ #include #include #include class TaskManager : public QObject { Q_OBJECT public: explicit TaskManager(QObject* parent = nullptr); struct Task { int id; QString name; int progress; int progress_max; bool blocks_library_scans; }; class ScopedTask { public: ScopedTask(const int task_id, TaskManager* task_manager) : task_id_(task_id), task_manager_(task_manager) {} ~ScopedTask() { task_manager_->SetTaskFinished(task_id_); } private: const int task_id_; TaskManager* task_manager_; Q_DISABLE_COPY(ScopedTask); }; // Everything here is thread safe QList GetTasks(); int StartTask(const QString& name); void SetTaskBlocksLibraryScans(int id); void SetTaskProgress(int id, int progress, int max = 0); void IncreaseTaskProgress(int id, int progress, int max = 0); void SetTaskFinished(int id); int GetTaskProgress(int id); signals: void TasksChanged(); void PauseLibraryWatchers(); void ResumeLibraryWatchers(); private: QMutex mutex_; QMap tasks_; int next_task_id_; Q_DISABLE_COPY(TaskManager); }; #endif // CORE_TASKMANAGER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/thread.cpp000066400000000000000000000015121260417502300230600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2015, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "thread.h" void Thread::run() { Utilities::SetThreadIOPriority(io_priority_); QThread::run(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/thread.h000066400000000000000000000023141260417502300225260ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2015, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_THREAD_H_ #define CORE_THREAD_H_ #include #include "core/utilities.h" // Improve QThread by adding a SetIoPriority function class Thread : public QThread { public: Thread(QObject* parent = nullptr) : QThread(parent), io_priority_(Utilities::IOPRIO_CLASS_NONE) {} void SetIoPriority(Utilities::IoPriority priority) { io_priority_ = priority; } virtual void run() override; private: Utilities::IoPriority io_priority_; }; #endif // CORE_THREAD_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/timeconstants.h000066400000000000000000000025271260417502300241600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011-2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // Note: this file is licensed under the Apache License instead of GPL because // it is used by the Spotify blob which links against libspotify and is not GPL // compatible. #ifndef CORE_TIMECONSTANTS_H_ #define CORE_TIMECONSTANTS_H_ #include // Use these to convert between time units const qint64 kMsecPerSec = 1000ll; const qint64 kUsecPerMsec = 1000ll; const qint64 kUsecPerSec = 1000000ll; const qint64 kNsecPerUsec = 1000ll; const qint64 kNsecPerMsec = 1000000ll; const qint64 kNsecPerSec = 1000000000ll; const qint64 kSecsPerDay = 24 * 60 * 60; #endif // CORE_TIMECONSTANTS_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/ubuntuunityhack.cpp000066400000000000000000000062451260417502300250630ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "ubuntuunityhack.h" #include "core/logging.h" #include #include const char* UbuntuUnityHack::kGSettingsFileName = "gsettings"; const char* UbuntuUnityHack::kUnityPanel = "com.canonical.Unity.Panel"; const char* UbuntuUnityHack::kUnitySystrayWhitelist = "systray-whitelist"; UbuntuUnityHack::UbuntuUnityHack(QObject* parent) : QObject(parent) { // Check if we're on Ubuntu first. QFile lsb_release("/etc/lsb-release"); if (lsb_release.open(QIODevice::ReadOnly)) { QByteArray data = lsb_release.readAll(); if (!data.contains("DISTRIB_ID=Ubuntu")) { // It's not Ubuntu - don't do anything. return; } } // Get the systray whitelist from gsettings. If this fails we're probably // not running on a system with unity QProcess* get = new QProcess(this); connect(get, SIGNAL(finished(int)), SLOT(GetFinished(int))); connect(get, SIGNAL(error(QProcess::ProcessError)), SLOT(GetError())); get->start(kGSettingsFileName, QStringList() << "get" << kUnityPanel << kUnitySystrayWhitelist); } void UbuntuUnityHack::GetError() { QProcess* get = qobject_cast(sender()); if (!get) { return; } get->deleteLater(); } void UbuntuUnityHack::GetFinished(int exit_code) { QProcess* get = qobject_cast(sender()); if (!get) { return; } get->deleteLater(); if (exit_code != 0) { // Probably not running in Unity. return; } QByteArray whitelist = get->readAllStandardOutput(); qLog(Debug) << "Unity whitelist is" << whitelist; int index = whitelist.lastIndexOf(']'); if (index == -1 || whitelist.contains("'clementine'")) { return; } whitelist = whitelist.left(index) + QString(", 'clementine'").toUtf8() + whitelist.mid(index); qLog(Debug) << "Setting unity whitelist to" << whitelist; QProcess* set = new QProcess(this); connect(set, SIGNAL(finished(int)), set, SLOT(deleteLater())); set->start(kGSettingsFileName, QStringList() << "set" << kUnityPanel << kUnitySystrayWhitelist << whitelist); qLog(Info) << "Clementine has added itself to the Unity system tray" << "whitelist, but this won't take effect until the next time" << "you log out and log back in."; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/ubuntuunityhack.h000066400000000000000000000024341260417502300245240ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_UBUNTUUNITYHACK_H_ #define CORE_UBUNTUUNITYHACK_H_ #include class QProcess; class UbuntuUnityHack : public QObject { Q_OBJECT public: explicit UbuntuUnityHack(QObject* parent = nullptr); private slots: void GetFinished(int exit_code); void GetError(); private: static const char* kGSettingsFileName; static const char* kUnityPanel; static const char* kUnitySystrayWhitelist; }; #endif // CORE_UBUNTUUNITYHACK_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/urlhandler.cpp000066400000000000000000000023671260417502300237620ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "urlhandler.h" UrlHandler::LoadResult::LoadResult(const QUrl& original_url, Type type, const QUrl& media_url, qint64 length_nanosec) : original_url_(original_url), type_(type), media_url_(media_url), length_nanosec_(length_nanosec) {} UrlHandler::UrlHandler(QObject* parent) : QObject(parent) {} QIcon UrlHandler::icon() const { return QIcon(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/urlhandler.h000066400000000000000000000056771260417502300234360ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, Arnaud Bienner Copyright 2011, David Sansome Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_URLHANDLER_H_ #define CORE_URLHANDLER_H_ #include #include #include class UrlHandler : public QObject { Q_OBJECT public: explicit UrlHandler(QObject* parent = nullptr); // The URL scheme that this handler handles. virtual QString scheme() const = 0; virtual QIcon icon() const; // Returned by StartLoading() and LoadNext(), indicates what the player // should do when it wants to load a URL. struct LoadResult { enum Type { // There wasn't a track available, and the player should move on to the // next playlist item. NoMoreTracks, // There might be another track available but the handler needs to do some // work (eg. fetching a remote playlist) to find out. AsyncLoadComplete // will be emitted later with the same original_url. WillLoadAsynchronously, // There was a track available. Its url is in media_url. TrackAvailable, }; LoadResult(const QUrl& original_url, Type type = NoMoreTracks, const QUrl& media_url = QUrl(), qint64 length_nanosec_ = -1); // The url that the playlist item has in Url(). // Might be something unplayable like lastfm://... QUrl original_url_; Type type_; // The actual url to something that gstreamer can play. QUrl media_url_; // Track length, if we are able to get it only now qint64 length_nanosec_; }; // Called by the Player when a song starts loading - gives the handler // a chance to do something clever to get a playable track. virtual LoadResult StartLoading(const QUrl& url) { return LoadResult(url); } // Called by the player when a song finishes - gives the handler a chance to // get another track to play. virtual LoadResult LoadNext(const QUrl& url) { return LoadResult(url); } // Functions to be warned when something happen to a track handled by // UrlHandler. virtual void TrackAboutToEnd() {} virtual void TrackSkipped() {} signals: void AsyncLoadComplete(const UrlHandler::LoadResult& result); }; #endif // CORE_URLHANDLER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/utilities.cpp000066400000000000000000000511341260417502300236310ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2014, David Sansome Copyright 2010-2012, 2014, John Maguire Copyright 2011, 2014, Arnaud Bienner Copyright 2012, Alan Briolat Copyright 2012, Veniamin Gvozdikov Copyright 2013-2014, Andreas Copyright 2013, Glad Olus Copyright 2013, graehl Copyright 2014, vkrishtal Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "utilities.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "core/application.h" #include "core/logging.h" #include "config.h" #include "timeconstants.h" #include "sha2.h" #if defined(Q_OS_UNIX) #include #elif defined(Q_OS_WIN32) #include #endif #ifdef Q_OS_LINUX #include #include #endif #ifdef Q_OS_DARWIN #include #endif #ifdef Q_OS_DARWIN #include "core/mac_startup.h" #include "core/mac_utilities.h" #include "core/scoped_cftyperef.h" #include "CoreServices/CoreServices.h" #include "IOKit/ps/IOPowerSources.h" #include "IOKit/ps/IOPSKeys.h" #endif namespace Utilities { static QString tr(const char* str) { return QCoreApplication::translate("", str); } QString PrettyTimeDelta(int seconds) { return (seconds >= 0 ? "+" : "-") + PrettyTime(seconds); } QString PrettyTime(int seconds) { // last.fm sometimes gets the track length wrong, so you end up with // negative times. seconds = qAbs(seconds); int hours = seconds / (60 * 60); int minutes = (seconds / 60) % 60; seconds %= 60; QString ret; if (hours) ret.sprintf("%d:%02d:%02d", hours, minutes, seconds); // NOLINT(runtime/printf) else ret.sprintf("%d:%02d", minutes, seconds); // NOLINT(runtime/printf) return ret; } QString PrettyTimeNanosec(qint64 nanoseconds) { return PrettyTime(nanoseconds / kNsecPerSec); } QString WordyTime(quint64 seconds) { quint64 days = seconds / (60 * 60 * 24); // TODO(David Sansome): Make the plural rules translatable QStringList parts; if (days) parts << (days == 1 ? tr("1 day") : tr("%1 days").arg(days)); parts << PrettyTime(seconds - days * 60 * 60 * 24); return parts.join(" "); } QString WordyTimeNanosec(qint64 nanoseconds) { return WordyTime(nanoseconds / kNsecPerSec); } QString Ago(int seconds_since_epoch, const QLocale& locale) { const QDateTime now = QDateTime::currentDateTime(); const QDateTime then = QDateTime::fromTime_t(seconds_since_epoch); const int days_ago = then.date().daysTo(now.date()); const QString time = then.time().toString(locale.timeFormat(QLocale::ShortFormat)); if (days_ago == 0) return tr("Today") + " " + time; if (days_ago == 1) return tr("Yesterday") + " " + time; if (days_ago <= 7) return tr("%1 days ago").arg(days_ago); return then.date().toString(locale.dateFormat(QLocale::ShortFormat)); } QString PrettyFutureDate(const QDate& date) { const QDate now = QDate::currentDate(); const int delta_days = now.daysTo(date); if (delta_days < 0) return QString(); if (delta_days == 0) return tr("Today"); if (delta_days == 1) return tr("Tomorrow"); if (delta_days <= 7) return tr("In %1 days").arg(delta_days); if (delta_days <= 14) return tr("Next week"); return tr("In %1 weeks").arg(delta_days / 7); } QString PrettySize(quint64 bytes) { QString ret; if (bytes > 0) { if (bytes <= 1000) ret = QString::number(bytes) + " bytes"; else if (bytes <= 1000 * 1000) ret.sprintf("%.1f KB", static_cast(bytes) / 1000); // NOLINT(runtime/printf) else if (bytes <= 1000 * 1000 * 1000) ret.sprintf("%.1f MB", static_cast(bytes) / (1000 * 1000)); // NOLINT(runtime/printf) else ret.sprintf("%.1f GB", static_cast(bytes) / (1000 * 1000 * 1000)); // NOLINT(runtime/printf) } return ret; } quint64 FileSystemCapacity(const QString& path) { #if defined(Q_OS_UNIX) struct statvfs fs_info; if (statvfs(path.toLocal8Bit().constData(), &fs_info) == 0) return quint64(fs_info.f_blocks) * quint64(fs_info.f_bsize); #elif defined(Q_OS_WIN32) _ULARGE_INTEGER ret; if (GetDiskFreeSpaceEx( QDir::toNativeSeparators(path).toLocal8Bit().constData(), nullptr, &ret, nullptr) != 0) return ret.QuadPart; #endif return 0; } quint64 FileSystemFreeSpace(const QString& path) { #if defined(Q_OS_UNIX) struct statvfs fs_info; if (statvfs(path.toLocal8Bit().constData(), &fs_info) == 0) return quint64(fs_info.f_bavail) * quint64(fs_info.f_bsize); #elif defined(Q_OS_WIN32) _ULARGE_INTEGER ret; if (GetDiskFreeSpaceEx( QDir::toNativeSeparators(path).toLocal8Bit().constData(), &ret, nullptr, nullptr) != 0) return ret.QuadPart; #endif return 0; } QString MakeTempDir(const QString template_name) { QString path; { QTemporaryFile tempfile; if (!template_name.isEmpty()) tempfile.setFileTemplate(template_name); tempfile.open(); path = tempfile.fileName(); } QDir d; d.mkdir(path); return path; } QString GetTemporaryFileName() { QString file; { QTemporaryFile tempfile; // Do not delete the file, we want to do something with it tempfile.setAutoRemove(false); tempfile.open(); file = tempfile.fileName(); } return file; } bool RemoveRecursive(const QString& path) { QDir dir(path); for (const QString& child : dir.entryList(QDir::NoDotAndDotDot | QDir::Dirs | QDir::Hidden)) { if (!RemoveRecursive(path + "/" + child)) return false; } for (const QString& child : dir.entryList(QDir::NoDotAndDotDot | QDir::Files | QDir::Hidden)) { if (!QFile::remove(path + "/" + child)) return false; } if (!dir.rmdir(path)) return false; return true; } bool CopyRecursive(const QString& source, const QString& destination) { // Make the destination directory QString dir_name = source.section('/', -1, -1); QString dest_path = destination + "/" + dir_name; QDir().mkpath(dest_path); QDir dir(source); for (const QString& child : dir.entryList(QDir::NoDotAndDotDot | QDir::Dirs)) { if (!CopyRecursive(source + "/" + child, dest_path)) { qLog(Warning) << "Failed to copy dir" << source + "/" + child << "to" << dest_path; return false; } } for (const QString& child : dir.entryList(QDir::NoDotAndDotDot | QDir::Files)) { if (!QFile::copy(source + "/" + child, dest_path + "/" + child)) { qLog(Warning) << "Failed to copy file" << source + "/" + child << "to" << dest_path; return false; } } return true; } bool Copy(QIODevice* source, QIODevice* destination) { if (!source->open(QIODevice::ReadOnly)) return false; if (!destination->open(QIODevice::WriteOnly)) return false; const qint64 bytes = source->size(); std::unique_ptr data(new char[bytes]); qint64 pos = 0; qint64 bytes_read; do { bytes_read = source->read(data.get() + pos, bytes - pos); if (bytes_read == -1) return false; pos += bytes_read; } while (bytes_read > 0 && pos != bytes); pos = 0; qint64 bytes_written; do { bytes_written = destination->write(data.get() + pos, bytes - pos); if (bytes_written == -1) return false; pos += bytes_written; } while (bytes_written > 0 && pos != bytes); return true; } QString ColorToRgba(const QColor& c) { return QString("rgba(%1, %2, %3, %4)") .arg(c.red()) .arg(c.green()) .arg(c.blue()) .arg(c.alpha()); } QString GetConfigPath(ConfigPath config) { switch (config) { case Path_Root: { if (Application::kIsPortable) { return QString("%1/data").arg(QCoreApplication::applicationDirPath()); } #ifdef Q_OS_DARWIN return mac::GetApplicationSupportPath() + "/" + QCoreApplication::organizationName(); #else return QString("%1/.config/%2") .arg(QDir::homePath(), QCoreApplication::organizationName()); #endif } break; case Path_CacheRoot: { if (Application::kIsPortable) { return GetConfigPath(Path_Root) + "/cache"; } #if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN) char* xdg = getenv("XDG_CACHE_HOME"); if (!xdg || !*xdg) { return QString("%1/.cache/%2") .arg(QDir::homePath(), QCoreApplication::organizationName()); } else { return QString("%1/%2").arg(xdg, QCoreApplication::organizationName()); } #else return GetConfigPath(Path_Root); #endif } break; case Path_AlbumCovers: return GetConfigPath(Path_Root) + "/albumcovers"; case Path_NetworkCache: return GetConfigPath(Path_CacheRoot) + "/networkcache"; case Path_MoodbarCache: return GetConfigPath(Path_CacheRoot) + "/moodbarcache"; case Path_GstreamerRegistry: return GetConfigPath(Path_Root) + QString("/gst-registry-%1-bin") .arg(QCoreApplication::applicationVersion()); case Path_DefaultMusicLibrary: #ifdef Q_OS_DARWIN return mac::GetMusicDirectory(); #else return QDir::homePath(); #endif case Path_LocalSpotifyBlob: return GetConfigPath(Path_Root) + "/spotifyblob"; default: qFatal("%s", Q_FUNC_INFO); return QString::null; } } #ifdef Q_OS_DARWIN // Better than openUrl(dirname(path)) - also highlights file at path void RevealFileInFinder(QString const& path) { QProcess::execute("/usr/bin/open", QStringList() << "-R" << path); } #endif // Q_OS_DARWIN #ifdef Q_OS_WIN void ShowFileInExplorer(QString const& path) { QProcess::execute("explorer.exe", QStringList() << "/select," << QDir::toNativeSeparators(path)); } #endif void OpenInFileBrowser(const QList& urls) { QSet dirs; for (const QUrl& url : urls) { if (url.scheme() != "file") { continue; } QString path = url.toLocalFile(); if (!QFile::exists(path)) continue; const QString directory = QFileInfo(path).dir().path(); if (dirs.contains(directory)) continue; dirs.insert(directory); qLog(Debug) << path; #ifdef Q_OS_DARWIN // revealing multiple files in the finder only opens one window, // so it also makes sense to reveal at most one per directory RevealFileInFinder(path); #elif defined(Q_OS_WIN32) ShowFileInExplorer(path); #else QStringList args; args << directory; QProcess::startDetached("xdg-open", args); #endif } } QByteArray Hmac(const QByteArray& key, const QByteArray& data, HashFunction method) { const int kBlockSize = 64; // bytes Q_ASSERT(key.length() <= kBlockSize); QByteArray inner_padding(kBlockSize, static_cast(0x36)); QByteArray outer_padding(kBlockSize, static_cast(0x5c)); for (int i = 0; i < key.length(); ++i) { inner_padding[i] = inner_padding[i] ^ key[i]; outer_padding[i] = outer_padding[i] ^ key[i]; } if (Md5_Algo == method) { return QCryptographicHash::hash( outer_padding + QCryptographicHash::hash(inner_padding + data, QCryptographicHash::Md5), QCryptographicHash::Md5); } else if (Sha1_Algo == method) { return QCryptographicHash::hash( outer_padding + QCryptographicHash::hash(inner_padding + data, QCryptographicHash::Sha1), QCryptographicHash::Sha1); } else { // Sha256_Algo, currently default return Sha256(outer_padding + Sha256(inner_padding + data)); } } QByteArray HmacSha256(const QByteArray& key, const QByteArray& data) { return Hmac(key, data, Sha256_Algo); } QByteArray HmacMd5(const QByteArray& key, const QByteArray& data) { return Hmac(key, data, Md5_Algo); } QByteArray HmacSha1(const QByteArray& key, const QByteArray& data) { return Hmac(key, data, Sha1_Algo); } QByteArray Sha256(const QByteArray& data) { #ifndef USE_SYSTEM_SHA2 using clementine_sha2::SHA256_CTX; using clementine_sha2::SHA256_Init; using clementine_sha2::SHA256_Update; using clementine_sha2::SHA256_Final; using clementine_sha2::SHA256_DIGEST_LENGTH; #endif SHA256_CTX context; SHA256_Init(&context); SHA256_Update(&context, reinterpret_cast(data.constData()), data.length()); QByteArray ret(SHA256_DIGEST_LENGTH, '\0'); SHA256_Final(reinterpret_cast(ret.data()), &context); return ret; } // File must not be open and will be closed afterwards! QByteArray Sha1File(QFile& file) { file.open(QIODevice::ReadOnly); QCryptographicHash hash(QCryptographicHash::Sha1); QByteArray data; while (!file.atEnd()) { data = file.read(1000000); // 1 mib hash.addData(data.data(), data.length()); data.clear(); } file.close(); return hash.result(); } QByteArray Sha1CoverHash(const QString& artist, const QString& album) { QCryptographicHash hash(QCryptographicHash::Sha1); hash.addData(artist.toLower().toUtf8().constData()); hash.addData(album.toLower().toUtf8().constData()); return hash.result(); } QString PrettySize(const QSize& size) { return QString::number(size.width()) + "x" + QString::number(size.height()); } void ForwardMouseEvent(const QMouseEvent* e, QWidget* target) { QMouseEvent c(e->type(), target->mapFromGlobal(e->globalPos()), e->globalPos(), e->button(), e->buttons(), e->modifiers()); QApplication::sendEvent(target, &c); } bool IsMouseEventInWidget(const QMouseEvent* e, const QWidget* widget) { return widget->rect().contains(widget->mapFromGlobal(e->globalPos())); } quint16 PickUnusedPort() { forever { const quint16 port = 49152 + qrand() % 16384; QTcpServer server; if (server.listen(QHostAddress::Any, port)) { return port; } } } void ConsumeCurrentElement(QXmlStreamReader* reader) { int level = 1; while (level != 0 && !reader->atEnd()) { switch (reader->readNext()) { case QXmlStreamReader::StartElement: ++level; break; case QXmlStreamReader::EndElement: --level; break; default: break; } } } bool ParseUntilElement(QXmlStreamReader* reader, const QString& name) { while (!reader->atEnd()) { QXmlStreamReader::TokenType type = reader->readNext(); switch (type) { case QXmlStreamReader::StartElement: if (reader->name() == name) { return true; } break; default: break; } } return false; } QDateTime ParseRFC822DateTime(const QString& text) { QRegExp regexp("(\\d{1,2}) (\\w{3,12}) (\\d+) (\\d{1,2}):(\\d{1,2}):(\\d{1,2})"); if (regexp.indexIn(text) == -1) { return QDateTime(); } enum class MatchNames { DAYS = 1, MONTHS, YEARS, HOURS, MINUTES, SECONDS }; QMap monthmap; monthmap["Jan"] = 1; monthmap["Feb"] = 2; monthmap["Mar"] = 3; monthmap["Apr"] = 4; monthmap["May"] = 5; monthmap["Jun"] = 6; monthmap["Jul"] = 7; monthmap["Aug"] = 8; monthmap["Sep"] = 9; monthmap["Oct"] = 10; monthmap["Nov"] = 11; monthmap["Dec"] = 12; monthmap["January"] = 1; monthmap["February"] = 2; monthmap["March"] = 3; monthmap["April"] = 4; monthmap["May"] = 5; monthmap["June"] = 6; monthmap["July"] = 7; monthmap["August"] = 8; monthmap["September"] = 9; monthmap["October"] = 10; monthmap["November"] = 11; monthmap["December"] = 12; const QDate date(regexp.cap(static_cast(MatchNames::YEARS)).toInt(), monthmap[regexp.cap(static_cast(MatchNames::MONTHS))], regexp.cap(static_cast(MatchNames::DAYS)).toInt()); const QTime time(regexp.cap(static_cast(MatchNames::HOURS)).toInt(), regexp.cap(static_cast(MatchNames::MINUTES)).toInt(), regexp.cap(static_cast(MatchNames::SECONDS)).toInt()); return QDateTime (date, time); } const char* EnumToString(const QMetaObject& meta, const char* name, int value) { int index = meta.indexOfEnumerator(name); if (index == -1) return "[UnknownEnum]"; QMetaEnum metaenum = meta.enumerator(index); const char* result = metaenum.valueToKey(value); if (result == 0) return "[UnknownEnumValue]"; return result; } QStringList Prepend(const QString& text, const QStringList& list) { QStringList ret(list); for (int i = 0; i < ret.count(); ++i) ret[i].prepend(text); return ret; } QStringList Updateify(const QStringList& list) { QStringList ret(list); for (int i = 0; i < ret.count(); ++i) ret[i].prepend(ret[i] + " = :"); return ret; } QString DecodeHtmlEntities(const QString& text) { QString copy(text); copy.replace("&", "&"); copy.replace(""", "\""); copy.replace("'", "'"); copy.replace("<", "<"); copy.replace(">", ">"); return copy; } int SetThreadIOPriority(IoPriority priority) { #ifdef Q_OS_LINUX return syscall(SYS_ioprio_set, IOPRIO_WHO_PROCESS, GetThreadId(), 4 | priority << IOPRIO_CLASS_SHIFT); #elif defined(Q_OS_DARWIN) return setpriority(PRIO_DARWIN_THREAD, 0, priority == IOPRIO_CLASS_IDLE ? PRIO_DARWIN_BG : 0); #else return 0; #endif } int GetThreadId() { #ifdef Q_OS_LINUX return syscall(SYS_gettid); #else return 0; #endif } bool IsLaptop() { #ifdef Q_OS_WIN SYSTEM_POWER_STATUS status; if (!GetSystemPowerStatus(&status)) { return false; } return !(status.BatteryFlag & 128); // 128 = no system battery #elif defined(Q_OS_LINUX) return !QDir("/proc/acpi/battery") .entryList(QDir::Dirs | QDir::NoDotAndDotDot) .isEmpty(); #elif defined(Q_OS_MAC) ScopedCFTypeRef power_sources(IOPSCopyPowerSourcesInfo()); ScopedCFTypeRef power_source_list( IOPSCopyPowerSourcesList(power_sources.get())); for (CFIndex i = 0; i < CFArrayGetCount(power_source_list.get()); ++i) { CFTypeRef ps = CFArrayGetValueAtIndex(power_source_list.get(), i); CFDictionaryRef description = IOPSGetPowerSourceDescription(power_sources.get(), ps); if (CFDictionaryContainsKey(description, CFSTR(kIOPSBatteryHealthKey))) { return true; } } return false; #else return false; #endif } QString SystemLanguageName() { #if QT_VERSION >= 0x040800 QString system_language = QLocale::system().uiLanguages().empty() ? QLocale::system().name() : QLocale::system().uiLanguages().first(); // uiLanguages returns strings with "-" as separators for language/region; // however QTranslator needs "_" separators system_language.replace("-", "_"); #else QString system_language = QLocale::system().name(); #endif return system_language; } bool UrlOnSameDriveAsClementine(const QUrl& url) { if (url.scheme() != "file") return false; #ifdef Q_OS_WIN QUrl appUrl = QUrl::fromLocalFile(QCoreApplication::applicationDirPath()); if (url.toLocalFile().left(1) == appUrl.toLocalFile().left(1)) return true; else return false; #else // Non windows systems have always a / in the path return true; #endif } QUrl GetRelativePathToClementineBin(const QUrl& url) { QDir appPath(QCoreApplication::applicationDirPath()); return QUrl::fromLocalFile(appPath.relativeFilePath(url.toLocalFile())); } QString PathWithoutFilenameExtension(const QString& filename) { if (filename.section('/', -1, -1).contains('.')) return filename.section('.', 0, -2); return filename; } QString FiddleFileExtension(const QString& filename, const QString& new_extension) { return PathWithoutFilenameExtension(filename) + "." + new_extension; } } // namespace Utilities ScopedWCharArray::ScopedWCharArray(const QString& str) : chars_(str.length()), data_(new wchar_t[chars_ + 1]) { str.toWCharArray(data_.get()); data_[chars_] = '\0'; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/core/utilities.h000066400000000000000000000133321260417502300232740ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2012, David Sansome Copyright 2011, Arnaud Bienner Copyright 2011-2012, 2014, John Maguire Copyright 2013, Andreas Copyright 2014, vkrishtal Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CORE_UTILITIES_H_ #define CORE_UTILITIES_H_ #include #include #include #include #include #include #include #include class QIODevice; class QMouseEvent; class QXmlStreamReader; struct QMetaObject; namespace Utilities { QString PrettyTime(int seconds); QString PrettyTimeDelta(int seconds); QString PrettyTimeNanosec(qint64 nanoseconds); QString PrettySize(quint64 bytes); QString PrettySize(const QSize& size); QString WordyTime(quint64 seconds); QString WordyTimeNanosec(qint64 nanoseconds); QString Ago(int seconds_since_epoch, const QLocale& locale); QString PrettyFutureDate(const QDate& date); QString ColorToRgba(const QColor& color); quint64 FileSystemCapacity(const QString& path); quint64 FileSystemFreeSpace(const QString& path); QString MakeTempDir(const QString template_name = QString()); QString GetTemporaryFileName(); bool RemoveRecursive(const QString& path); bool CopyRecursive(const QString& source, const QString& destination); bool Copy(QIODevice* source, QIODevice* destination); void OpenInFileBrowser(const QList& filenames); enum HashFunction { Md5_Algo, Sha256_Algo, Sha1_Algo, }; QByteArray Hmac(const QByteArray& key, const QByteArray& data, HashFunction algo); QByteArray HmacMd5(const QByteArray& key, const QByteArray& data); QByteArray HmacSha256(const QByteArray& key, const QByteArray& data); QByteArray HmacSha1(const QByteArray& key, const QByteArray& data); QByteArray Sha256(const QByteArray& data); QByteArray Sha1File(QFile& file); QByteArray Sha1CoverHash(const QString& artist, const QString& album); // Picks an unused ephemeral port number. Doesn't hold the port open so // there's the obvious race condition quint16 PickUnusedPort(); // Forwards a mouse event to a different widget, remapping the event's widget // coordinates relative to those of the target widget. void ForwardMouseEvent(const QMouseEvent* e, QWidget* target); // Checks if the mouse event was inside the widget's rectangle. bool IsMouseEventInWidget(const QMouseEvent* e, const QWidget* widget); // Reads all children of the current element, and returns with the stream // reader either on the EndElement for the current element, or the end of the // file - whichever came first. void ConsumeCurrentElement(QXmlStreamReader* reader); // Advances the stream reader until it finds an element with the given name. // Returns false if the end of the document was reached before finding a // matching element. bool ParseUntilElement(QXmlStreamReader* reader, const QString& name); // Parses a string containing an RFC822 time and date. QDateTime ParseRFC822DateTime(const QString& text); // Replaces some HTML entities with their normal characters. QString DecodeHtmlEntities(const QString& text); // Shortcut for getting a Qt-aware enum value as a string. // Pass in the QMetaObject of the class that owns the enum, the string name of // the enum and a valid value from that enum. const char* EnumToString(const QMetaObject& meta, const char* name, int value); QStringList Prepend(const QString& text, const QStringList& list); QStringList Updateify(const QStringList& list); // Check if two urls are on the same drive (mainly for windows) bool UrlOnSameDriveAsClementine(const QUrl& url); // Get relative path to clementine binary QUrl GetRelativePathToClementineBin(const QUrl& url); // Get the path without the filename extension QString PathWithoutFilenameExtension(const QString& filename); QString FiddleFileExtension(const QString& filename, const QString& new_extension); enum ConfigPath { Path_Root, Path_AlbumCovers, Path_NetworkCache, Path_GstreamerRegistry, Path_DefaultMusicLibrary, Path_LocalSpotifyBlob, Path_MoodbarCache, Path_CacheRoot, }; QString GetConfigPath(ConfigPath config); // Borrowed from schedutils enum IoPriority { IOPRIO_CLASS_NONE = 0, IOPRIO_CLASS_RT, IOPRIO_CLASS_BE, IOPRIO_CLASS_IDLE, }; enum { IOPRIO_WHO_PROCESS = 1, IOPRIO_WHO_PGRP, IOPRIO_WHO_USER, }; static const int IOPRIO_CLASS_SHIFT = 13; int SetThreadIOPriority(IoPriority priority); int GetThreadId(); // Returns true if this machine has a battery. bool IsLaptop(); QString SystemLanguageName(); } // namespace Utilities class ScopedWCharArray { public: explicit ScopedWCharArray(const QString& str); QString ToString() const { return QString::fromWCharArray(data_.get()); } wchar_t* get() const { return data_.get(); } operator wchar_t*() const { return get(); } int characters() const { return chars_; } int bytes() const { return (chars_ + 1) * sizeof(wchar_t); } private: Q_DISABLE_COPY(ScopedWCharArray); int chars_; std::unique_ptr data_; }; #endif // CORE_UTILITIES_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/000077500000000000000000000000001260417502300214575ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/albumcoverexporter.cpp000066400000000000000000000045221260417502300261160ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2013, Andreas Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "albumcoverexporter.h" #include #include #include "coverexportrunnable.h" #include "core/song.h" const int AlbumCoverExporter::kMaxConcurrentRequests = 3; AlbumCoverExporter::AlbumCoverExporter(QObject* parent) : QObject(parent), thread_pool_(new QThreadPool(this)), exported_(0), skipped_(0), all_(0) { thread_pool_->setMaxThreadCount(kMaxConcurrentRequests); } void AlbumCoverExporter::SetDialogResult( const AlbumCoverExport::DialogResult& dialog_result) { dialog_result_ = dialog_result; } void AlbumCoverExporter::AddExportRequest(Song song) { requests_.append(new CoverExportRunnable(dialog_result_, song)); all_ = requests_.count(); } void AlbumCoverExporter::Cancel() { requests_.clear(); } void AlbumCoverExporter::StartExporting() { exported_ = 0; skipped_ = 0; AddJobsToPool(); } void AlbumCoverExporter::AddJobsToPool() { while (!requests_.isEmpty() && thread_pool_->activeThreadCount() < thread_pool_->maxThreadCount()) { CoverExportRunnable* runnable = requests_.dequeue(); connect(runnable, SIGNAL(CoverExported()), SLOT(CoverExported())); connect(runnable, SIGNAL(CoverSkipped()), SLOT(CoverSkipped())); thread_pool_->start(runnable); } } void AlbumCoverExporter::CoverExported() { exported_++; emit AlbumCoversExportUpdate(exported_, skipped_, all_); AddJobsToPool(); } void AlbumCoverExporter::CoverSkipped() { skipped_++; emit AlbumCoversExportUpdate(exported_, skipped_, all_); AddJobsToPool(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/albumcoverexporter.h000066400000000000000000000034351260417502300255650ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2013, Andreas Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef COVERS_ALBUMCOVEREXPORTER_H_ #define COVERS_ALBUMCOVEREXPORTER_H_ #include "coverexportrunnable.h" #include "core/song.h" #include "ui/albumcoverexport.h" #include #include #include class QThreadPool; class AlbumCoverExporter : public QObject { Q_OBJECT public: explicit AlbumCoverExporter(QObject* parent = nullptr); virtual ~AlbumCoverExporter() {} static const int kMaxConcurrentRequests; void SetDialogResult(const AlbumCoverExport::DialogResult& dialog_result); void AddExportRequest(Song song); void StartExporting(); void Cancel(); int request_count() { return requests_.size(); } signals: void AlbumCoversExportUpdate(int exported, int skipped, int all); private slots: void CoverExported(); void CoverSkipped(); private: void AddJobsToPool(); AlbumCoverExport::DialogResult dialog_result_; QQueue requests_; QThreadPool* thread_pool_; int exported_; int skipped_; int all_; }; #endif // COVERS_ALBUMCOVEREXPORTER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/albumcoverfetcher.cpp000066400000000000000000000101241260417502300256610ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, Paweł Bara Copyright 2011-2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "albumcoverfetcher.h" #include #include "albumcoverfetchersearch.h" #include "core/network.h" const int AlbumCoverFetcher::kMaxConcurrentRequests = 5; AlbumCoverFetcher::AlbumCoverFetcher(CoverProviders* cover_providers, QObject* parent, QNetworkAccessManager* network) : QObject(parent), cover_providers_(cover_providers), network_(network ? network : new NetworkAccessManager(this)), next_id_(0), request_starter_(new QTimer(this)) { request_starter_->setInterval(1000); connect(request_starter_, SIGNAL(timeout()), SLOT(StartRequests())); } quint64 AlbumCoverFetcher::FetchAlbumCover(const QString& artist, const QString& album) { CoverSearchRequest request; request.artist = artist; request.album = album; request.search = false; request.id = next_id_++; AddRequest(request); return request.id; } quint64 AlbumCoverFetcher::SearchForCovers(const QString& artist, const QString& album) { CoverSearchRequest request; request.artist = artist; request.album = album; request.search = true; request.id = next_id_++; AddRequest(request); return request.id; } void AlbumCoverFetcher::AddRequest(const CoverSearchRequest& req) { queued_requests_.enqueue(req); if (!request_starter_->isActive()) request_starter_->start(); if (active_requests_.size() < kMaxConcurrentRequests) StartRequests(); } void AlbumCoverFetcher::Clear() { queued_requests_.clear(); for (AlbumCoverFetcherSearch* search : active_requests_.values()) { search->Cancel(); search->deleteLater(); } active_requests_.clear(); } void AlbumCoverFetcher::StartRequests() { if (queued_requests_.isEmpty()) { request_starter_->stop(); return; } while (!queued_requests_.isEmpty() && active_requests_.size() < kMaxConcurrentRequests) { CoverSearchRequest request = queued_requests_.dequeue(); // search objects are this fetcher's children so worst case scenario - they // get // deleted with it AlbumCoverFetcherSearch* search = new AlbumCoverFetcherSearch(request, network_, this); active_requests_.insert(request.id, search); connect(search, SIGNAL(SearchFinished(quint64, CoverSearchResults)), SLOT(SingleSearchFinished(quint64, CoverSearchResults))); connect(search, SIGNAL(AlbumCoverFetched(quint64, const QImage&)), SLOT(SingleCoverFetched(quint64, const QImage&))); search->Start(cover_providers_); } } void AlbumCoverFetcher::SingleSearchFinished(quint64 request_id, CoverSearchResults results) { AlbumCoverFetcherSearch* search = active_requests_.take(request_id); if (!search) return; search->deleteLater(); emit SearchFinished(request_id, results, search->statistics()); } void AlbumCoverFetcher::SingleCoverFetched(quint64 request_id, const QImage& image) { AlbumCoverFetcherSearch* search = active_requests_.take(request_id); if (!search) return; search->deleteLater(); emit AlbumCoverFetched(request_id, image, search->statistics()); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/albumcoverfetcher.h000066400000000000000000000073201260417502300253320ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, David Sansome Copyright 2010, 2012, 2014, John Maguire Copyright 2011, Paweł Bara Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef COVERS_ALBUMCOVERFETCHER_H_ #define COVERS_ALBUMCOVERFETCHER_H_ #include "coversearchstatistics.h" #include #include #include #include #include #include #include #include class QNetworkReply; class QString; class AlbumCoverFetcherSearch; class CoverProviders; // This class represents a single search-for-cover request. It identifies // and describes the request. struct CoverSearchRequest { // an unique (for one AlbumCoverFetcher) request identifier quint64 id; // a search query QString artist; QString album; // is this only a search request or should we also fetch the first // cover that's found? bool search; }; // This structure represents a single result of some album's cover search // request. // It contains an URL that leads to a found cover plus its description (usually // the "artist - album" string). struct CoverSearchResult { // used for grouping in the user interface. This is set automatically - don't // set it manually in your cover provider. QString provider; // description of this result (we suggest using the "artist - album" format) QString description; // an URL of a cover image described by this CoverSearchResult QUrl image_url; }; Q_DECLARE_METATYPE(CoverSearchResult); // This is a complete result of a single search request (a list of results, each // describing one image, actually). typedef QList CoverSearchResults; Q_DECLARE_METATYPE(QList); // This class searches for album covers for a given query or artist/album and // returns URLs. It's NOT thread-safe. class AlbumCoverFetcher : public QObject { Q_OBJECT public: AlbumCoverFetcher(CoverProviders* cover_providers, QObject* parent = nullptr, QNetworkAccessManager* network = 0); virtual ~AlbumCoverFetcher() {} static const int kMaxConcurrentRequests; quint64 SearchForCovers(const QString& artist, const QString& album); quint64 FetchAlbumCover(const QString& artist, const QString& album); void Clear(); signals: void AlbumCoverFetched(quint64, const QImage& cover, const CoverSearchStatistics& statistics); void SearchFinished(quint64, const CoverSearchResults& results, const CoverSearchStatistics& statistics); private slots: void SingleSearchFinished(quint64, CoverSearchResults results); void SingleCoverFetched(quint64, const QImage& cover); void StartRequests(); private: void AddRequest(const CoverSearchRequest& req); CoverProviders* cover_providers_; QNetworkAccessManager* network_; quint64 next_id_; QQueue queued_requests_; QHash active_requests_; QTimer* request_starter_; }; #endif // COVERS_ALBUMCOVERFETCHER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/albumcoverfetchersearch.cpp000066400000000000000000000175731260417502300270660ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, Paweł Bara Copyright 2011, David Sansome Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "albumcoverfetchersearch.h" #include #include #include #include #include #include "albumcoverfetcher.h" #include "coverprovider.h" #include "coverproviders.h" #include "core/closure.h" #include "core/logging.h" #include "core/network.h" const int AlbumCoverFetcherSearch::kSearchTimeoutMs = 10000; const int AlbumCoverFetcherSearch::kImageLoadTimeoutMs = 2500; const int AlbumCoverFetcherSearch::kTargetSize = 500; const float AlbumCoverFetcherSearch::kGoodScore = 1.85; AlbumCoverFetcherSearch::AlbumCoverFetcherSearch( const CoverSearchRequest& request, QNetworkAccessManager* network, QObject* parent) : QObject(parent), request_(request), image_load_timeout_(new NetworkTimeouts(kImageLoadTimeoutMs, this)), network_(network), cancel_requested_(false) { // we will terminate the search after kSearchTimeoutMs miliseconds if we are // not // able to find all of the results before that point in time QTimer::singleShot(kSearchTimeoutMs, this, SLOT(TerminateSearch())); } void AlbumCoverFetcherSearch::TerminateSearch() { for (int id : pending_requests_.keys()) { pending_requests_.take(id)->CancelSearch(id); } AllProvidersFinished(); } void AlbumCoverFetcherSearch::Start(CoverProviders* cover_providers) { for (CoverProvider* provider : cover_providers->List()) { connect(provider, SIGNAL(SearchFinished(int, QList)), SLOT(ProviderSearchFinished(int, QList))); const int id = cover_providers->NextId(); const bool success = provider->StartSearch(request_.artist, request_.album, id); if (success) { pending_requests_[id] = provider; statistics_.network_requests_made_++; } } // end this search before it even began if there are no providers... if (pending_requests_.isEmpty()) { TerminateSearch(); } } static bool CompareProviders(const CoverSearchResult& a, const CoverSearchResult& b) { return a.provider < b.provider; } void AlbumCoverFetcherSearch::ProviderSearchFinished( int id, const QList& results) { if (!pending_requests_.contains(id)) return; CoverProvider* provider = pending_requests_.take(id); CoverSearchResults results_copy(results); // Set categories on the results for (int i = 0; i < results_copy.count(); ++i) { results_copy[i].provider = provider->name(); } // Add results from the current provider to our pool results_.append(results_copy); statistics_.total_images_by_provider_[provider->name()]++; // do we have more providers left? if (!pending_requests_.isEmpty()) { return; } AllProvidersFinished(); } void AlbumCoverFetcherSearch::AllProvidersFinished() { if (cancel_requested_) { return; } // if we only wanted to do the search then we're done if (request_.search) { emit SearchFinished(request_.id, results_); return; } // no results? if (results_.isEmpty()) { statistics_.missing_images_++; emit AlbumCoverFetched(request_.id, QImage()); return; } // Now we have to load some images and figure out which one is the best. // We'll sort the list of results by category, then load the first few images // from each category and use some heuristics to score them. If no images // are good enough we'll keep loading more images until we find one that is // or we run out of results. qStableSort(results_.begin(), results_.end(), CompareProviders); FetchMoreImages(); } void AlbumCoverFetcherSearch::FetchMoreImages() { // Try the first one in each category. QString last_provider; for (int i = 0; i < results_.count(); ++i) { if (results_[i].provider == last_provider) { continue; } CoverSearchResult result = results_.takeAt(i--); last_provider = result.provider; qLog(Debug) << "Loading" << result.image_url << "from" << result.provider; RedirectFollower* image_reply = new RedirectFollower(network_->get(QNetworkRequest(result.image_url))); NewClosure(image_reply, SIGNAL(finished()), this, SLOT(ProviderCoverFetchFinished(RedirectFollower*)), image_reply); pending_image_loads_[image_reply] = result.provider; image_load_timeout_->AddReply(image_reply); statistics_.network_requests_made_++; } if (pending_image_loads_.isEmpty()) { // There were no more results? Time to give up. SendBestImage(); } } void AlbumCoverFetcherSearch::ProviderCoverFetchFinished( RedirectFollower* reply) { reply->deleteLater(); const QString provider = pending_image_loads_.take(reply); statistics_.bytes_transferred_ += reply->bytesAvailable(); if (cancel_requested_) { return; } if (reply->error() != QNetworkReply::NoError) { qLog(Info) << "Error requesting" << reply->url() << reply->errorString(); } else { QImage image; if (!image.loadFromData(reply->readAll())) { qLog(Info) << "Error decoding image data from" << reply->url(); } else { const float score = ScoreImage(image); candidate_images_.insertMulti(score, CandidateImage(provider, image)); qLog(Debug) << reply->url() << "scored" << score; } } if (pending_image_loads_.isEmpty()) { // We've fetched everything we wanted to fetch for now, check if we have an // image that's good enough. float best_score = 0.0; if (!candidate_images_.isEmpty()) { best_score = candidate_images_.keys().last(); } qLog(Debug) << "Best image so far has a score of" << best_score; if (best_score >= kGoodScore) { SendBestImage(); } else { FetchMoreImages(); } } } float AlbumCoverFetcherSearch::ScoreImage(const QImage& image) const { // Invalid images score nothing if (image.isNull()) { return 0.0; } // A 500x500px image scores 1.0, bigger scores higher const float size_score = std::sqrt(static_cast(image.width() * image.height())) / kTargetSize; // A 1:1 image scores 1.0, anything else scores less const float aspect_score = 1.0 - static_cast(image.height() - image.width()) / std::max(image.height(), image.width()); return size_score + aspect_score; } void AlbumCoverFetcherSearch::SendBestImage() { QImage image; if (!candidate_images_.isEmpty()) { const CandidateImage best_image = candidate_images_.values().back(); image = best_image.second; statistics_.chosen_images_by_provider_[best_image.first]++; statistics_.chosen_images_++; statistics_.chosen_width_ += image.width(); statistics_.chosen_height_ += image.height(); } else { statistics_.missing_images_++; } emit AlbumCoverFetched(request_.id, image); } void AlbumCoverFetcherSearch::Cancel() { cancel_requested_ = true; if (!pending_requests_.isEmpty()) { TerminateSearch(); } else if (!pending_image_loads_.isEmpty()) { for (RedirectFollower* reply : pending_image_loads_.keys()) { reply->abort(); } pending_image_loads_.clear(); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/albumcoverfetchersearch.h000066400000000000000000000064261260417502300265260ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, Paweł Bara Copyright 2011, David Sansome Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef COVERS_ALBUMCOVERFETCHERSEARCH_H_ #define COVERS_ALBUMCOVERFETCHERSEARCH_H_ #include "albumcoverfetcher.h" #include #include class CoverProvider; class CoverProviders; class NetworkTimeouts; class NetworkAccessManager; class RedirectFollower; // This class encapsulates a single search for covers initiated by an // AlbumCoverFetcher. The search engages all of the known cover providers. // AlbumCoverFetcherSearch signals search results to an interested // AlbumCoverFetcher when all of the providers have done their part. class AlbumCoverFetcherSearch : public QObject { Q_OBJECT public: AlbumCoverFetcherSearch(const CoverSearchRequest& request, QNetworkAccessManager* network, QObject* parent); void Start(CoverProviders* cover_providers); // Cancels all pending requests. No Finished signals will be emitted, and it // is the caller's responsibility to delete the AlbumCoverFetcherSearch. void Cancel(); CoverSearchStatistics statistics() const { return statistics_; } signals: // It's the end of search (when there was no fetch-me-a-cover request). void SearchFinished(quint64, const CoverSearchResults& results); // It's the end of search and we've fetched a cover. void AlbumCoverFetched(quint64, const QImage& cover); private slots: void ProviderSearchFinished(int id, const QList& results); void ProviderCoverFetchFinished(RedirectFollower* reply); void TerminateSearch(); private: void AllProvidersFinished(); void FetchMoreImages(); float ScoreImage(const QImage& image) const; void SendBestImage(); private: static const int kSearchTimeoutMs; static const int kImageLoadTimeoutMs; static const int kTargetSize; static const float kGoodScore; CoverSearchStatistics statistics_; // Search request encapsulated by this AlbumCoverFetcherSearch. CoverSearchRequest request_; // Complete results (from all of the available providers). CoverSearchResults results_; QMap pending_requests_; QMap pending_image_loads_; NetworkTimeouts* image_load_timeout_; // QMap is sorted by key (score). Values are (provider_name, image) typedef QPair CandidateImage; QMap candidate_images_; QNetworkAccessManager* network_; bool cancel_requested_; }; #endif // COVERS_ALBUMCOVERFETCHERSEARCH_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/albumcoverloader.cpp000066400000000000000000000223551260417502300255200ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2013, David Sansome Copyright 2010-2012, 2014, John Maguire Copyright 2011, Paweł Bara Copyright 2014, Andreas Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "albumcoverloader.h" #include #include #include #include #include #include "config.h" #include "core/closure.h" #include "core/logging.h" #include "core/network.h" #include "core/tagreaderclient.h" #include "core/utilities.h" #include "internet/core/internetmodel.h" #include "internet/spotify/spotifyservice.h" AlbumCoverLoader::AlbumCoverLoader(QObject* parent) : QObject(parent), stop_requested_(false), next_id_(1), network_(new NetworkAccessManager(this)), connected_spotify_(false) {} QString AlbumCoverLoader::ImageCacheDir() { return Utilities::GetConfigPath(Utilities::Path_AlbumCovers); } void AlbumCoverLoader::CancelTask(quint64 id) { QMutexLocker l(&mutex_); for (QQueue::iterator it = tasks_.begin(); it != tasks_.end(); ++it) { if (it->id == id) { tasks_.erase(it); break; } } } void AlbumCoverLoader::CancelTasks(const QSet& ids) { QMutexLocker l(&mutex_); for (QQueue::iterator it = tasks_.begin(); it != tasks_.end();) { if (ids.contains(it->id)) { it = tasks_.erase(it); } else { ++it; } } } quint64 AlbumCoverLoader::LoadImageAsync(const AlbumCoverLoaderOptions& options, const QString& art_automatic, const QString& art_manual, const QString& song_filename, const QImage& embedded_image) { Task task; task.options = options; task.art_automatic = art_automatic; task.art_manual = art_manual; task.song_filename = song_filename; task.embedded_image = embedded_image; task.state = State_TryingManual; { QMutexLocker l(&mutex_); task.id = next_id_++; tasks_.enqueue(task); } metaObject()->invokeMethod(this, "ProcessTasks", Qt::QueuedConnection); return task.id; } void AlbumCoverLoader::ProcessTasks() { while (!stop_requested_) { // Get the next task Task task; { QMutexLocker l(&mutex_); if (tasks_.isEmpty()) return; task = tasks_.dequeue(); } ProcessTask(&task); } } void AlbumCoverLoader::ProcessTask(Task* task) { TryLoadResult result = TryLoadImage(*task); if (result.started_async) { // The image is being loaded from a remote URL, we'll carry on later // when it's done return; } if (result.loaded_success) { QImage scaled = ScaleAndPad(task->options, result.image); emit ImageLoaded(task->id, scaled); emit ImageLoaded(task->id, scaled, result.image); return; } NextState(task); } void AlbumCoverLoader::NextState(Task* task) { if (task->state == State_TryingManual) { // Try the automatic one next task->state = State_TryingAuto; ProcessTask(task); } else { // Give up emit ImageLoaded(task->id, task->options.default_output_image_); emit ImageLoaded(task->id, task->options.default_output_image_, task->options.default_output_image_); } } AlbumCoverLoader::TryLoadResult AlbumCoverLoader::TryLoadImage( const Task& task) { // An image embedded in the song itself takes priority if (!task.embedded_image.isNull()) return TryLoadResult(false, true, ScaleAndPad(task.options, task.embedded_image)); QString filename; switch (task.state) { case State_TryingAuto: filename = task.art_automatic; break; case State_TryingManual: filename = task.art_manual; break; } if (filename == Song::kManuallyUnsetCover) return TryLoadResult(false, true, task.options.default_output_image_); if (filename == Song::kEmbeddedCover && !task.song_filename.isEmpty()) { const QImage taglib_image = TagReaderClient::Instance()->LoadEmbeddedArtBlocking( task.song_filename); if (!taglib_image.isNull()) return TryLoadResult(false, true, ScaleAndPad(task.options, taglib_image)); } if (filename.toLower().startsWith("http://") || filename.toLower().startsWith("https://")) { QUrl url(filename); QNetworkReply* reply = network_->get(QNetworkRequest(url)); NewClosure(reply, SIGNAL(finished()), this, SLOT(RemoteFetchFinished(QNetworkReply*)), reply); remote_tasks_.insert(reply, task); return TryLoadResult(true, false, QImage()); } else if (filename.toLower().startsWith("spotify://image/")) { // HACK: we should add generic image URL handlers SpotifyService* spotify = InternetModel::Service(); if (!connected_spotify_) { connect(spotify, SIGNAL(ImageLoaded(QString, QImage)), SLOT(SpotifyImageLoaded(QString, QImage))); connected_spotify_ = true; } QString id = QUrl(filename).path(); if (id.startsWith('/')) { id.remove(0, 1); } remote_spotify_tasks_.insert(id, task); // Need to schedule this in the spotify service's thread QMetaObject::invokeMethod(spotify, "LoadImage", Qt::QueuedConnection, Q_ARG(QString, id)); return TryLoadResult(true, false, QImage()); } QImage image(filename); return TryLoadResult( false, !image.isNull(), image.isNull() ? task.options.default_output_image_ : image); } void AlbumCoverLoader::SpotifyImageLoaded(const QString& id, const QImage& image) { if (!remote_spotify_tasks_.contains(id)) return; Task task = remote_spotify_tasks_.take(id); QImage scaled = ScaleAndPad(task.options, image); emit ImageLoaded(task.id, scaled); emit ImageLoaded(task.id, scaled, image); } void AlbumCoverLoader::RemoteFetchFinished(QNetworkReply* reply) { reply->deleteLater(); Task task = remote_tasks_.take(reply); // Handle redirects. QVariant redirect = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); if (redirect.isValid()) { if (++task.redirects > kMaxRedirects) { return; // Give up. } QNetworkRequest request = reply->request(); request.setUrl(redirect.toUrl()); QNetworkReply* redirected_reply = network_->get(request); NewClosure(redirected_reply, SIGNAL(finished()), this, SLOT(RemoteFetchFinished(QNetworkReply*)), redirected_reply); remote_tasks_.insert(redirected_reply, task); return; } if (reply->error() == QNetworkReply::NoError) { // Try to load the image QImage image; if (image.load(reply, 0)) { QImage scaled = ScaleAndPad(task.options, image); emit ImageLoaded(task.id, scaled); emit ImageLoaded(task.id, scaled, image); return; } } NextState(&task); } QImage AlbumCoverLoader::ScaleAndPad(const AlbumCoverLoaderOptions& options, const QImage& image) { if (image.isNull()) return image; // Scale the image down QImage copy; if (options.scale_output_image_) { copy = image.scaled(QSize(options.desired_height_, options.desired_height_), Qt::KeepAspectRatio, Qt::SmoothTransformation); } else { copy = image; } if (!options.pad_output_image_) return copy; // Pad the image to height_ x height_ QImage padded_image(options.desired_height_, options.desired_height_, QImage::Format_ARGB32); padded_image.fill(0); QPainter p(&padded_image); p.drawImage((options.desired_height_ - copy.width()) / 2, (options.desired_height_ - copy.height()) / 2, copy); p.end(); return padded_image; } QPixmap AlbumCoverLoader::TryLoadPixmap(const QString& automatic, const QString& manual, const QString& filename) { QPixmap ret; if (manual == Song::kManuallyUnsetCover) return ret; if (!manual.isEmpty()) ret.load(manual); if (ret.isNull()) { if (automatic == Song::kEmbeddedCover && !filename.isNull()) ret = QPixmap::fromImage( TagReaderClient::Instance()->LoadEmbeddedArtBlocking(filename)); else if (!automatic.isEmpty()) ret.load(automatic); } return ret; } quint64 AlbumCoverLoader::LoadImageAsync(const AlbumCoverLoaderOptions& options, const Song& song) { return LoadImageAsync(options, song.art_automatic(), song.art_manual(), song.url().toLocalFile(), song.image()); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/albumcoverloader.h000066400000000000000000000066071260417502300251670ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2012, David Sansome Copyright 2010-2012, 2014, John Maguire Copyright 2011, Paweł Bara Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef COVERS_ALBUMCOVERLOADER_H_ #define COVERS_ALBUMCOVERLOADER_H_ #include "albumcoverloaderoptions.h" #include "core/song.h" #include #include #include #include #include class NetworkAccessManager; class QNetworkReply; class AlbumCoverLoader : public QObject { Q_OBJECT public: explicit AlbumCoverLoader(QObject* parent = nullptr); void Stop() { stop_requested_ = true; } static QString ImageCacheDir(); quint64 LoadImageAsync(const AlbumCoverLoaderOptions& options, const Song& song); virtual quint64 LoadImageAsync(const AlbumCoverLoaderOptions& options, const QString& art_automatic, const QString& art_manual, const QString& song_filename = QString(), const QImage& embedded_image = QImage()); void CancelTask(quint64 id); void CancelTasks(const QSet& ids); static QPixmap TryLoadPixmap(const QString& automatic, const QString& manual, const QString& filename = QString()); static QImage ScaleAndPad(const AlbumCoverLoaderOptions& options, const QImage& image); signals: void ImageLoaded(quint64 id, const QImage& image); void ImageLoaded(quint64 id, const QImage& scaled, const QImage& original); protected slots: void ProcessTasks(); void RemoteFetchFinished(QNetworkReply* reply); void SpotifyImageLoaded(const QString& url, const QImage& image); protected: enum State { State_TryingManual, State_TryingAuto, }; struct Task { Task() : redirects(0) {} AlbumCoverLoaderOptions options; quint64 id; QString art_automatic; QString art_manual; QString song_filename; QImage embedded_image; State state; int redirects; }; struct TryLoadResult { TryLoadResult(bool async, bool success, const QImage& i) : started_async(async), loaded_success(success), image(i) {} bool started_async; bool loaded_success; QImage image; }; void ProcessTask(Task* task); void NextState(Task* task); TryLoadResult TryLoadImage(const Task& task); bool stop_requested_; QMutex mutex_; QQueue tasks_; QMap remote_tasks_; QMap remote_spotify_tasks_; quint64 next_id_; NetworkAccessManager* network_; bool connected_spotify_; static const int kMaxRedirects = 3; }; #endif // COVERS_ALBUMCOVERLOADER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/albumcoverloaderoptions.cpp000066400000000000000000000015631260417502300271320ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "albumcoverloaderoptions.h" clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/albumcoverloaderoptions.h000066400000000000000000000023661260417502300266010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef COVERS_ALBUMCOVERLOADEROPTIONS_H_ #define COVERS_ALBUMCOVERLOADEROPTIONS_H_ #include struct AlbumCoverLoaderOptions { AlbumCoverLoaderOptions() : desired_height_(120), scale_output_image_(true), pad_output_image_(true) {} int desired_height_; bool scale_output_image_; bool pad_output_image_; QImage default_output_image_; }; #endif // COVERS_ALBUMCOVERLOADEROPTIONS_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/amazoncoverprovider.cpp000066400000000000000000000122371260417502300262670ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011-2012, David Sansome Copyright 2011, 2014, John Maguire Copyright 2012, Arnaud Bienner Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "amazoncoverprovider.h" #include #include #include #include #include "core/closure.h" #include "core/logging.h" #include "core/network.h" #include "core/utilities.h" // Amazon has a web crawler that looks for access keys in public source code, // so we apply some sophisticated encryption to these keys. const char* AmazonCoverProvider::kAccessKeyB64 = "QUtJQUlRSDI2UlZNNlVaNFdBNlE="; const char* AmazonCoverProvider::kSecretAccessKeyB64 = "ZTQ2UGczM0JRNytDajd4MWR6eFNvODVFd2tpdi9FbGVCcUZjMkVmMQ=="; const char* AmazonCoverProvider::kUrl = "http://ecs.amazonaws.com/onca/xml"; const char* AmazonCoverProvider::kAssociateTag = "clemmusiplay-20"; AmazonCoverProvider::AmazonCoverProvider(QObject* parent) : CoverProvider("Amazon", parent), network_(new NetworkAccessManager(this)) {} bool AmazonCoverProvider::StartSearch(const QString& artist, const QString& album, int id) { typedef QPair Arg; typedef QList ArgList; typedef QPair EncodedArg; typedef QList EncodedArgList; // Must be sorted by parameter name ArgList args = ArgList() << Arg("AWSAccessKeyId", QByteArray::fromBase64(kAccessKeyB64)) << Arg("AssociateTag", kAssociateTag) << Arg("Keywords", artist + " " + album) << Arg("Operation", "ItemSearch") << Arg("ResponseGroup", "Images") << Arg("SearchIndex", "All") << Arg("Service", "AWSECommerceService") << Arg("Timestamp", QDateTime::currentDateTime().toString( "yyyy-MM-ddThh:mm:ss.zzzZ")) << Arg("Version", "2009-11-01"); EncodedArgList encoded_args; QStringList query_items; // Encode the arguments for (const Arg& arg : args) { EncodedArg encoded_arg(QUrl::toPercentEncoding(arg.first), QUrl::toPercentEncoding(arg.second)); encoded_args << encoded_arg; query_items << QString(encoded_arg.first + "=" + encoded_arg.second); } // Sign the request QUrl url(kUrl); const QByteArray data_to_sign = QString("GET\n%1\n%2\n%3") .arg(url.host(), url.path(), query_items.join("&")) .toAscii(); const QByteArray signature(Utilities::HmacSha256( QByteArray::fromBase64(kSecretAccessKeyB64), data_to_sign)); // Add the signature to the request encoded_args << EncodedArg("Signature", QUrl::toPercentEncoding(signature.toBase64())); url.setEncodedQueryItems(encoded_args); QNetworkReply* reply = network_->get(QNetworkRequest(url)); NewClosure(reply, SIGNAL(finished()), this, SLOT(QueryFinished(QNetworkReply*, int)), reply, id); return true; } void AmazonCoverProvider::QueryFinished(QNetworkReply* reply, int id) { reply->deleteLater(); CoverSearchResults results; QXmlStreamReader reader(reply); while (!reader.atEnd()) { reader.readNext(); if (reader.tokenType() == QXmlStreamReader::StartElement && reader.name() == "Item") { ReadItem(&reader, &results); } } emit SearchFinished(id, results); } void AmazonCoverProvider::ReadItem(QXmlStreamReader* reader, CoverSearchResults* results) { while (!reader->atEnd()) { switch (reader->readNext()) { case QXmlStreamReader::StartElement: if (reader->name() == "LargeImage") { ReadLargeImage(reader, results); } else { reader->skipCurrentElement(); } break; case QXmlStreamReader::EndElement: return; default: break; } } } void AmazonCoverProvider::ReadLargeImage(QXmlStreamReader* reader, CoverSearchResults* results) { while (!reader->atEnd()) { switch (reader->readNext()) { case QXmlStreamReader::StartElement: if (reader->name() == "URL") { CoverSearchResult result; result.image_url = QUrl(reader->readElementText()); results->append(result); } else { reader->skipCurrentElement(); } break; case QXmlStreamReader::EndElement: return; default: break; } } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/amazoncoverprovider.h000066400000000000000000000032311260417502300257260ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011-2012, David Sansome Copyright 2011, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef COVERS_AMAZONCOVERPROVIDER_H_ #define COVERS_AMAZONCOVERPROVIDER_H_ #include "coverprovider.h" #include class QNetworkAccessManager; class AmazonCoverProvider : public CoverProvider { Q_OBJECT public: explicit AmazonCoverProvider(QObject* parent = nullptr); static const char* kAccessKeyB64; static const char* kSecretAccessKeyB64; static const char* kUrl; static const char* kAssociateTag; bool StartSearch(const QString& artist, const QString& album, int id); private slots: void QueryFinished(QNetworkReply* reply, int id); private: void ReadItem(QXmlStreamReader* reader, CoverSearchResults* results); void ReadLargeImage(QXmlStreamReader* reader, CoverSearchResults* results); private: QNetworkAccessManager* network_; }; #endif // COVERS_AMAZONCOVERPROVIDER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/coverexportrunnable.cpp000066400000000000000000000137451260417502300263040ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2013, Andreas Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "coverexportrunnable.h" #include #include #include "albumcoverexporter.h" #include "core/song.h" #include "core/tagreaderclient.h" CoverExportRunnable::CoverExportRunnable( const AlbumCoverExport::DialogResult& dialog_result, const Song& song) : dialog_result_(dialog_result), song_(song) {} void CoverExportRunnable::run() { QString cover_path = GetCoverPath(); // manually unset? if (cover_path.isEmpty()) { EmitCoverSkipped(); } else { if (dialog_result_.RequiresCoverProcessing()) { ProcessAndExportCover(); } else { ExportCover(); } } } QString CoverExportRunnable::GetCoverPath() { if (song_.has_manually_unset_cover()) { return QString(); // Export downloaded covers? } else if (!song_.art_manual().isEmpty() && dialog_result_.export_downloaded_) { return song_.art_manual(); // Export embedded covers? } else if (!song_.art_automatic().isEmpty() && song_.art_automatic() == Song::kEmbeddedCover && dialog_result_.export_embedded_) { return song_.art_automatic(); } else { return QString(); } } // Exports a single album cover using a "save QImage to file" approach. // For performance reasons this method will be invoked only if loading // and in memory processing of images is necessary for current settings // which means that: // - either the force size flag is being used // - or the "overwrite smaller" mode is used // In all other cases, the faster ExportCover() method will be used. void CoverExportRunnable::ProcessAndExportCover() { QString cover_path = GetCoverPath(); // either embedded or disk - the one we'll export for the current album QImage cover; QImage embedded_cover; QImage disk_cover; // load embedded cover if any if (song_.has_embedded_cover()) { embedded_cover = TagReaderClient::Instance()->LoadEmbeddedArtBlocking( song_.url().toLocalFile()); if (embedded_cover.isNull()) { EmitCoverSkipped(); return; } cover = embedded_cover; } // load a file cover which iss mandatory if there's no embedded cover disk_cover.load(cover_path); if (embedded_cover.isNull()) { if (disk_cover.isNull()) { EmitCoverSkipped(); return; } cover = disk_cover; } // rescale if necessary if (dialog_result_.IsSizeForced()) { cover = cover.scaled(QSize(dialog_result_.width_, dialog_result_.height_), Qt::IgnoreAspectRatio); } QString dir = song_.url().toLocalFile().section('/', 0, -2); QString extension = cover_path.section('.', -1); QString new_file = dir + '/' + dialog_result_.fileName_ + '.' + (cover_path == Song::kEmbeddedCover ? "jpg" : extension); // If the file exists, do not override! if (dialog_result_.overwrite_ == AlbumCoverExport::OverwriteMode_None && QFile::exists(new_file)) { EmitCoverSkipped(); return; } // we're handling overwrite as remove + copy so we need to delete the old file // first if (QFile::exists(new_file) && dialog_result_.overwrite_ != AlbumCoverExport::OverwriteMode_None) { // if the mode is "overwrite smaller" then skip the cover if a bigger one // is already available in the folder if (dialog_result_.overwrite_ == AlbumCoverExport::OverwriteMode_Smaller) { QImage existing; existing.load(new_file); if (existing.isNull() || existing.size().height() >= cover.size().height() || existing.size().width() >= cover.size().width()) { EmitCoverSkipped(); return; } } if (!QFile::remove(new_file)) { EmitCoverSkipped(); return; } } if (cover.save(new_file)) { EmitCoverExported(); } else { EmitCoverSkipped(); } } // Exports a single album cover using a "copy file" approach. void CoverExportRunnable::ExportCover() { QString cover_path = GetCoverPath(); QString dir = song_.url().toLocalFile().section('/', 0, -2); QString extension = cover_path.section('.', -1); QString new_file = dir + '/' + dialog_result_.fileName_ + '.' + (cover_path == Song::kEmbeddedCover ? "jpg" : extension); // If the file exists, do not override! if (dialog_result_.overwrite_ == AlbumCoverExport::OverwriteMode_None && QFile::exists(new_file)) { EmitCoverSkipped(); return; } // we're handling overwrite as remove + copy so we need to delete the old file // first if (dialog_result_.overwrite_ != AlbumCoverExport::OverwriteMode_None && QFile::exists(new_file)) { if (!QFile::remove(new_file)) { EmitCoverSkipped(); return; } } if (cover_path == Song::kEmbeddedCover) { // an embedded cover QImage embedded = TagReaderClient::Instance()->LoadEmbeddedArtBlocking( song_.url().toLocalFile()); if (!embedded.save(new_file)) { EmitCoverSkipped(); return; } } else { // automatic or manual cover, available in an image file if (!QFile::copy(cover_path, new_file)) { EmitCoverSkipped(); return; } } EmitCoverExported(); } void CoverExportRunnable::EmitCoverExported() { emit CoverExported(); } void CoverExportRunnable::EmitCoverSkipped() { emit CoverSkipped(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/coverexportrunnable.h000066400000000000000000000031621260417502300257410ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2013, Andreas Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef COVERS_COVEREXPORTRUNNABLE_H_ #define COVERS_COVEREXPORTRUNNABLE_H_ #include "core/song.h" #include "ui/albumcoverexport.h" #include #include class AlbumCoverExporter; class CoverExportRunnable : public QObject, public QRunnable { Q_OBJECT public: CoverExportRunnable(const AlbumCoverExport::DialogResult& dialog_result, const Song& song); virtual ~CoverExportRunnable() {} void run(); signals: void CoverExported(); void CoverSkipped(); private: void EmitCoverExported(); void EmitCoverSkipped(); void ProcessAndExportCover(); void ExportCover(); QString GetCoverPath(); AlbumCoverExport::DialogResult dialog_result_; Song song_; AlbumCoverExporter* album_cover_exporter_; }; #endif // COVERS_COVEREXPORTRUNNABLE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/coverprovider.cpp000066400000000000000000000017211260417502300250550ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, Paweł Bara Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "coverprovider.h" CoverProvider::CoverProvider(const QString& name, QObject* parent) : QObject(parent), name_(name) {} clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/coverprovider.h000066400000000000000000000037701260417502300245300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, Paweł Bara Copyright 2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef COVERS_COVERPROVIDER_H_ #define COVERS_COVERPROVIDER_H_ #include "albumcoverfetcher.h" #include "coverproviders.h" #include class QNetworkReply; // Each implementation of this interface downloads covers from one online // service. There are no limitations on what this service might be - last.fm, // Amazon, Google Images - you name it. class CoverProvider : public QObject { Q_OBJECT public: explicit CoverProvider(const QString& name, QObject* parent); // A name (very short description) of this provider, like "last.fm". QString name() const { return name_; } // Starts searching for covers matching the given query text. Returns true // if the query has been started, or false if an error occurred. The provider // should remember the ID and emit it along with the result when it finishes. virtual bool StartSearch(const QString& artist, const QString& album, int id) = 0; virtual void CancelSearch(int id) {} signals: void SearchFinished(int id, const QList& results); private: QString name_; }; #endif // COVERS_COVERPROVIDER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/coverproviders.cpp000066400000000000000000000040171260417502300252410ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, Paweł Bara Copyright 2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "coverproviders.h" #include "config.h" #include "coverprovider.h" #include "core/logging.h" CoverProviders::CoverProviders(QObject* parent) : QObject(parent) {} void CoverProviders::AddProvider(CoverProvider* provider) { { QMutexLocker locker(&mutex_); cover_providers_.insert(provider, provider->name()); connect(provider, SIGNAL(destroyed()), SLOT(ProviderDestroyed())); } qLog(Debug) << "Registered cover provider" << provider->name(); } void CoverProviders::RemoveProvider(CoverProvider* provider) { if (!provider) return; // It's not safe to dereference provider at this pointbecause it might have // already been destroyed. QString name; { QMutexLocker locker(&mutex_); name = cover_providers_.take(provider); } if (name.isNull()) { qLog(Debug) << "Tried to remove a cover provider that was not registered"; } else { qLog(Debug) << "Unregistered cover provider" << name; } } void CoverProviders::ProviderDestroyed() { CoverProvider* provider = static_cast(sender()); RemoveProvider(provider); } int CoverProviders::NextId() { return next_id_.fetchAndAddRelaxed(1); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/coverproviders.h000066400000000000000000000037251260417502300247130ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, Paweł Bara Copyright 2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef COVERS_COVERPROVIDERS_H_ #define COVERS_COVERPROVIDERS_H_ #include #include #include class AlbumCoverFetcherSearch; class CoverProvider; // This is a repository for cover providers. // Providers are automatically unregistered from the repository when they are // deleted. The class is thread safe. class CoverProviders : public QObject { Q_OBJECT public: explicit CoverProviders(QObject* parent = nullptr); // Lets a cover provider register itself in the repository. void AddProvider(CoverProvider* provider); void RemoveProvider(CoverProvider* provider); // Returns a list of cover providers QList List() const { return cover_providers_.keys(); } // Returns true if this repository has at least one registered provider. bool HasAnyProviders() const { return !cover_providers_.isEmpty(); } int NextId(); private slots: void ProviderDestroyed(); private: Q_DISABLE_COPY(CoverProviders); QMap cover_providers_; QMutex mutex_; QAtomicInt next_id_; }; #endif // COVERS_COVERPROVIDERS_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/coversearchstatistics.cpp000066400000000000000000000037641260417502300266140ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "coversearchstatistics.h" CoverSearchStatistics::CoverSearchStatistics() : network_requests_made_(0), bytes_transferred_(0), chosen_images_(0), missing_images_(0), chosen_width_(0), chosen_height_(0) {} CoverSearchStatistics& CoverSearchStatistics::operator+=( const CoverSearchStatistics& other) { network_requests_made_ += other.network_requests_made_; bytes_transferred_ += other.bytes_transferred_; for (const QString& key : other.chosen_images_by_provider_.keys()) { chosen_images_by_provider_[key] += other.chosen_images_by_provider_[key]; } for (const QString& key : other.total_images_by_provider_.keys()) { total_images_by_provider_[key] += other.total_images_by_provider_[key]; } chosen_images_ += other.chosen_images_; missing_images_ += other.missing_images_; chosen_width_ += other.chosen_width_; chosen_height_ += other.chosen_height_; return *this; } QString CoverSearchStatistics::AverageDimensions() const { if (chosen_images_ == 0) { return "0x0"; } return QString::number(chosen_width_ / chosen_images_) + "x" + QString::number(chosen_height_ / chosen_images_); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/coversearchstatistics.h000066400000000000000000000026631260417502300262560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef COVERS_COVERSEARCHSTATISTICS_H_ #define COVERS_COVERSEARCHSTATISTICS_H_ #include #include struct CoverSearchStatistics { CoverSearchStatistics(); CoverSearchStatistics& operator+=(const CoverSearchStatistics& other); quint64 network_requests_made_; quint64 bytes_transferred_; QMap total_images_by_provider_; QMap chosen_images_by_provider_; quint64 chosen_images_; quint64 missing_images_; quint64 chosen_width_; quint64 chosen_height_; QString AverageDimensions() const; }; #endif // COVERS_COVERSEARCHSTATISTICS_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/coversearchstatisticsdialog.cpp000066400000000000000000000062261260417502300277700ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "coversearchstatisticsdialog.h" #include "ui_coversearchstatisticsdialog.h" #include "core/utilities.h" CoverSearchStatisticsDialog::CoverSearchStatisticsDialog(QWidget* parent) : QDialog(parent), ui_(new Ui_CoverSearchStatisticsDialog) { ui_->setupUi(this); details_layout_ = new QVBoxLayout(ui_->details); details_layout_->setSpacing(0); setStyleSheet( "#details {" " background-color: palette(base);" "}" "#details QLabel[type=\"label\"] {" " border: 2px solid transparent;" " border-right: 2px solid palette(midlight);" " margin-right: 10px;" "}" "#details QLabel[type=\"value\"] {" " font-weight: bold;" " max-width: 100px;" "}"); } CoverSearchStatisticsDialog::~CoverSearchStatisticsDialog() { delete ui_; } void CoverSearchStatisticsDialog::Show( const CoverSearchStatistics& statistics) { QStringList providers(statistics.total_images_by_provider_.keys()); qSort(providers); ui_->summary->setText( tr("Got %1 covers out of %2 (%3 failed)") .arg(statistics.chosen_images_) .arg(statistics.chosen_images_ + statistics.missing_images_) .arg(statistics.missing_images_)); for (const QString& provider : providers) { AddLine(tr("Covers from %1").arg(provider), QString::number(statistics.chosen_images_by_provider_[provider])); } if (!providers.isEmpty()) { AddSpacer(); } AddLine(tr("Total network requests made"), QString::number(statistics.network_requests_made_)); AddLine(tr("Average image size"), statistics.AverageDimensions()); AddLine(tr("Total bytes transferred"), statistics.bytes_transferred_ ? Utilities::PrettySize(statistics.bytes_transferred_) : "0 bytes"); details_layout_->addStretch(); show(); } void CoverSearchStatisticsDialog::AddLine(const QString& label, const QString& value) { QLabel* label1 = new QLabel(label); QLabel* label2 = new QLabel(value); label1->setProperty("type", "label"); label2->setProperty("type", "value"); QHBoxLayout* layout = new QHBoxLayout; layout->addWidget(label1); layout->addWidget(label2); details_layout_->addLayout(layout); } void CoverSearchStatisticsDialog::AddSpacer() { details_layout_->addSpacing(20); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/coversearchstatisticsdialog.h000066400000000000000000000027511260417502300274340ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef COVERS_COVERSEARCHSTATISTICSDIALOG_H_ #define COVERS_COVERSEARCHSTATISTICSDIALOG_H_ #include #include "coversearchstatistics.h" class Ui_CoverSearchStatisticsDialog; class QVBoxLayout; class CoverSearchStatisticsDialog : public QDialog { Q_OBJECT public: explicit CoverSearchStatisticsDialog(QWidget* parent = nullptr); ~CoverSearchStatisticsDialog(); void Show(const CoverSearchStatistics& statistics); private: void AddLine(const QString& label, const QString& value); void AddSpacer(); private: Ui_CoverSearchStatisticsDialog* ui_; QVBoxLayout* details_layout_; }; #endif // COVERS_COVERSEARCHSTATISTICSDIALOG_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/coversearchstatisticsdialog.ui000066400000000000000000000040771260417502300276250ustar00rootroot00000000000000 CoverSearchStatisticsDialog 0 0 425 214 Fetch completed Got %1 covers out of %2 (%3 failed) 0 0 QFrame::StyledPanel QFrame::Sunken Qt::Horizontal QDialogButtonBox::Close buttonBox accepted() CoverSearchStatisticsDialog accept() 248 254 157 274 buttonBox rejected() CoverSearchStatisticsDialog reject() 316 260 286 274 clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/currentartloader.cpp000066400000000000000000000054051260417502300255470ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2012, 2014, David Sansome Copyright 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "currentartloader.h" #include #include #include #include "core/application.h" #include "covers/albumcoverloader.h" #include "playlist/playlistmanager.h" CurrentArtLoader::CurrentArtLoader(Application* app, QObject* parent) : QObject(parent), app_(app), temp_file_pattern_(QDir::tempPath() + "/clementine-art-XXXXXX.jpg"), id_(0) { options_.scale_output_image_ = false; options_.pad_output_image_ = false; options_.default_output_image_ = QImage(":nocover.png"); connect(app_->album_cover_loader(), SIGNAL(ImageLoaded(quint64, QImage)), SLOT(TempArtLoaded(quint64, QImage))); connect(app_->playlist_manager(), SIGNAL(CurrentSongChanged(Song)), SLOT(LoadArt(Song))); } CurrentArtLoader::~CurrentArtLoader() {} void CurrentArtLoader::LoadArt(const Song& song) { last_song_ = song; id_ = app_->album_cover_loader()->LoadImageAsync(options_, last_song_); } void CurrentArtLoader::TempArtLoaded(quint64 id, const QImage& image) { if (id != id_) return; id_ = 0; QString uri; QString thumbnail_uri; QImage thumbnail; if (!image.isNull()) { temp_art_.reset(new QTemporaryFile(temp_file_pattern_)); temp_art_->setAutoRemove(true); temp_art_->open(); image.save(temp_art_->fileName(), "JPEG"); // Scale the image down to make a thumbnail. It's a bit crap doing it here // since it's the GUI thread, but the alternative is hard. temp_art_thumbnail_.reset(new QTemporaryFile(temp_file_pattern_)); temp_art_thumbnail_->open(); temp_art_thumbnail_->setAutoRemove(true); thumbnail = image.scaledToHeight(120, Qt::SmoothTransformation); thumbnail.save(temp_art_thumbnail_->fileName(), "JPEG"); uri = "file://" + temp_art_->fileName(); thumbnail_uri = "file://" + temp_art_thumbnail_->fileName(); } emit ArtLoaded(last_song_, uri, image); emit ThumbnailLoaded(last_song_, thumbnail_uri, thumbnail); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/currentartloader.h000066400000000000000000000036551260417502300252210ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011-2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef COVERS_CURRENTARTLOADER_H_ #define COVERS_CURRENTARTLOADER_H_ #include #include #include "core/song.h" #include "covers/albumcoverloaderoptions.h" class Application; class QImage; class QTemporaryFile; class CurrentArtLoader : public QObject { Q_OBJECT public: explicit CurrentArtLoader(Application* app, QObject* parent = nullptr); ~CurrentArtLoader(); const AlbumCoverLoaderOptions& options() const { return options_; } const Song& last_song() const { return last_song_; } public slots: void LoadArt(const Song& song); signals: void ArtLoaded(const Song& song, const QString& uri, const QImage& image); void ThumbnailLoaded(const Song& song, const QString& uri, const QImage& image); private slots: void TempArtLoaded(quint64 id, const QImage& image); private: Application* app_; AlbumCoverLoaderOptions options_; QString temp_file_pattern_; std::unique_ptr temp_art_; std::unique_ptr temp_art_thumbnail_; quint64 id_; Song last_song_; }; #endif // COVERS_CURRENTARTLOADER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/kittenloader.cpp000066400000000000000000000070011260417502300246460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2012, 2014, John Maguire Copyright 2012, David Sansome Copyright 2013, Arnaud Bienner Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "kittenloader.h" #include #include #include #include "core/closure.h" #include "core/network.h" const char* KittenLoader::kFlickrKittenUrl = "https://api.flickr.com/services/rest/" "?method=flickr.photos.search" "&api_key=808b52887b3cc7fe098abd62f6ed1745" "&tags=kitten" "&sort=random" "&safe_search=1" "&content_type=1"; const char* KittenLoader::kFlickrPhotoUrl = "https://farm%1.static.flickr.com/%2/%3_%4_m.jpg"; KittenLoader::KittenLoader(QObject* parent) : AlbumCoverLoader(parent) {} quint64 KittenLoader::LoadKitten(const AlbumCoverLoaderOptions& options) { if (!kitten_urls_.isEmpty()) { QUrl url = kitten_urls_.dequeue(); return AlbumCoverLoader::LoadImageAsync( options, QString::null, url.toString(), QString::null, QImage()); } Task task; task.options = options; { QMutexLocker l(&mutex_); task.id = next_id_++; pending_kittens_.enqueue(task); } metaObject()->invokeMethod(this, "FetchMoreKittens", Qt::QueuedConnection); return task.id; } void KittenLoader::FetchMoreKittens() { QNetworkRequest req = QNetworkRequest(QUrl(kFlickrKittenUrl)); QNetworkReply* reply = network_->get(req); NewClosure(reply, SIGNAL(finished()), this, SLOT(KittensRetrieved(QNetworkReply*)), reply); } void KittenLoader::KittensRetrieved(QNetworkReply* reply) { reply->deleteLater(); QXmlStreamReader reader(reply); while (!reader.atEnd()) { reader.readNext(); if (reader.tokenType() == QXmlStreamReader::StartElement) { if (reader.name() == "photo") { QXmlStreamAttributes attrs = reader.attributes(); QStringRef farm_id = attrs.value("farm"); QStringRef photo_id = attrs.value("id"); QStringRef secret = attrs.value("secret"); QStringRef server = attrs.value("server"); QString photo_url = QString(kFlickrPhotoUrl) .arg(farm_id.toString()) .arg(server.toString()) .arg(photo_id.toString()) .arg(secret.toString()); kitten_urls_ << QUrl(photo_url); } } } QMutexLocker l(&mutex_); while (!kitten_urls_.isEmpty() && !pending_kittens_.isEmpty()) { Task task = pending_kittens_.dequeue(); QUrl kitten_url = kitten_urls_.dequeue(); task.art_manual = kitten_url.toString(); task.state = State_TryingManual; tasks_.enqueue(task); } if (kitten_urls_.isEmpty()) { FetchMoreKittens(); } metaObject()->invokeMethod(this, "ProcessTasks", Qt::QueuedConnection); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/kittenloader.h000066400000000000000000000027011260417502300243150ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, 2012, John Maguire Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef COVERS_KITTENLOADER_H_ #define COVERS_KITTENLOADER_H_ #include "albumcoverloader.h" #include #include class QNetworkReply; class KittenLoader : public AlbumCoverLoader { Q_OBJECT public: explicit KittenLoader(QObject* parent = nullptr); virtual quint64 LoadKitten(const AlbumCoverLoaderOptions& options); private slots: void KittensRetrieved(QNetworkReply* reply); void FetchMoreKittens(); private: static const char* kFlickrKittenUrl; static const char* kFlickrPhotoUrl; QQueue pending_kittens_; QQueue kitten_urls_; }; #endif // COVERS_KITTENLOADER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/lastfmcoverprovider.cpp000066400000000000000000000046331260417502300262710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, Paweł Bara Copyright 2011-2012, David Sansome Copyright 2012, Harald Sitter Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "lastfmcoverprovider.h" #include #include "albumcoverfetcher.h" #include "coverprovider.h" #include "core/closure.h" #include "internet/lastfm/lastfmcompat.h" LastFmCoverProvider::LastFmCoverProvider(QObject* parent) : CoverProvider("last.fm", parent) {} bool LastFmCoverProvider::StartSearch(const QString& artist, const QString& album, int id) { QMap params; params["method"] = "album.search"; params["album"] = album + " " + artist; QNetworkReply* reply = lastfm::ws::post(params); NewClosure(reply, SIGNAL(finished()), this, SLOT(QueryFinished(QNetworkReply*, int)), reply, id); return true; } void LastFmCoverProvider::QueryFinished(QNetworkReply* reply, int id) { reply->deleteLater(); CoverSearchResults results; lastfm::XmlQuery query(lastfm::compat::EmptyXmlQuery()); if (lastfm::compat::ParseQuery(reply->readAll(), &query)) { // parse the list of search results QList elements = query["results"]["albummatches"].children("album"); for (const lastfm::XmlQuery& element : elements) { CoverSearchResult result; result.description = element["artist"].text() + " - " + element["name"].text(); result.image_url = QUrl(element["image size=extralarge"].text()); results << result; } } else { // Drop through and emit an empty list of results. } emit SearchFinished(id, results); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/lastfmcoverprovider.h000066400000000000000000000030011260417502300257220ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, Paweł Bara Copyright 2011, David Sansome Copyright 2011-2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef COVERS_LASTFMCOVERPROVIDER_H_ #define COVERS_LASTFMCOVERPROVIDER_H_ #include "albumcoverfetcher.h" #include "coverprovider.h" #include #include class QNetworkReply; // A built-in cover provider which fetches covers from last.fm. class LastFmCoverProvider : public CoverProvider { Q_OBJECT public: explicit LastFmCoverProvider(QObject* parent); bool StartSearch(const QString& artist, const QString& album, int id); private slots: void QueryFinished(QNetworkReply* reply, int id); private: QMap pending_queries_; }; #endif // COVERS_LASTFMCOVERPROVIDER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/musicbrainzcoverprovider.cpp000066400000000000000000000076401260417502300273320ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "musicbrainzcoverprovider.h" #include #include #include #include "core/closure.h" #include "core/network.h" using std::mem_fun; namespace { static const char* kReleaseSearchUrl = "https://musicbrainz.org/ws/2/release/"; static const char* kAlbumCoverUrl = "https://coverartarchive.org/release/%1/front"; } // namespace MusicbrainzCoverProvider::MusicbrainzCoverProvider(QObject* parent) : CoverProvider("MusicBrainz", parent), network_(new NetworkAccessManager(this)) {} bool MusicbrainzCoverProvider::StartSearch(const QString& artist, const QString& album, int id) { // Find release information. QUrl url(kReleaseSearchUrl); QString query = QString("release:\"%1\" AND artist:\"%2\"") .arg(album.trimmed().replace('"', "\\\"")) .arg(artist.trimmed().replace('"', "\\\"")); url.addQueryItem("query", query); url.addQueryItem("limit", "5"); QNetworkRequest request(url); QNetworkReply* reply = network_->get(request); NewClosure(reply, SIGNAL(finished()), this, SLOT(ReleaseSearchFinished(QNetworkReply*, int)), reply, id); cover_names_[id] = QString("%1 - %2").arg(artist, album); return true; } void MusicbrainzCoverProvider::ReleaseSearchFinished(QNetworkReply* reply, int id) { reply->deleteLater(); QList releases; QXmlStreamReader reader(reply); while (!reader.atEnd()) { QXmlStreamReader::TokenType type = reader.readNext(); if (type == QXmlStreamReader::StartElement && reader.name() == "release") { QStringRef release_id = reader.attributes().value("id"); if (!release_id.isEmpty()) { releases.append(release_id.toString()); } } } for (const QString& release_id : releases) { QUrl url(QString(kAlbumCoverUrl).arg(release_id)); QNetworkReply* reply = network_->head(QNetworkRequest(url)); image_checks_.insert(id, reply); NewClosure(reply, SIGNAL(finished()), this, SLOT(ImageCheckFinished(int)), id); } } void MusicbrainzCoverProvider::ImageCheckFinished(int id) { QList replies = image_checks_.values(id); int finished_count = std::count_if(replies.constBegin(), replies.constEnd(), mem_fun(&QNetworkReply::isFinished)); if (finished_count == replies.size()) { QString cover_name = cover_names_.take(id); QList results; for (QNetworkReply* reply : replies) { reply->deleteLater(); if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() < 400) { CoverSearchResult result; result.description = cover_name; result.image_url = reply->url(); results.append(result); } } image_checks_.remove(id); emit SearchFinished(id, results); } } void MusicbrainzCoverProvider::CancelSearch(int id) { QList replies = image_checks_.values(id); for (QNetworkReply* reply : replies) { reply->abort(); reply->deleteLater(); } image_checks_.remove(id); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/covers/musicbrainzcoverprovider.h000066400000000000000000000030141260417502300267660ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef COVERS_MUSICBRAINZCOVERPROVIDER_H_ #define COVERS_MUSICBRAINZCOVERPROVIDER_H_ #include "coverprovider.h" #include class QNetworkAccessManager; class QNetworkReply; class MusicbrainzCoverProvider : public CoverProvider { Q_OBJECT public: explicit MusicbrainzCoverProvider(QObject* parent = nullptr); // CoverProvider virtual bool StartSearch(const QString& artist, const QString& album, int id); virtual void CancelSearch(int id); private slots: void ReleaseSearchFinished(QNetworkReply* reply, int id); void ImageCheckFinished(int id); private: QNetworkAccessManager* network_; QMultiMap image_checks_; QMap cover_names_; }; #endif // COVERS_MUSICBRAINZCOVERPROVIDER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/dbus/000077500000000000000000000000001260417502300211135ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/dbus/metatypes.h000066400000000000000000000015561260417502300233060ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef DBUS_METATYPES_H_ #define DBUS_METATYPES_H_ #include Q_DECLARE_METATYPE(QList); #endif // DBUS_METATYPES_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/dbus/org.freedesktop.Avahi.EntryGroup.xml000066400000000000000000000070701260417502300301060ustar00rootroot00000000000000 clementine-1.2.3+git1354-gdaddbde+dfsg/src/dbus/org.freedesktop.Avahi.Server.xml000066400000000000000000000170451260417502300272410ustar00rootroot00000000000000 clementine-1.2.3+git1354-gdaddbde+dfsg/src/dbus/org.freedesktop.MediaPlayer.player.xml000066400000000000000000000036751260417502300304370ustar00rootroot00000000000000 clementine-1.2.3+git1354-gdaddbde+dfsg/src/dbus/org.freedesktop.MediaPlayer.root.xml000066400000000000000000000010731260417502300301140ustar00rootroot00000000000000 clementine-1.2.3+git1354-gdaddbde+dfsg/src/dbus/org.freedesktop.MediaPlayer.tracklist.xml000066400000000000000000000022561260417502300311350ustar00rootroot00000000000000 clementine-1.2.3+git1354-gdaddbde+dfsg/src/dbus/org.freedesktop.Notifications.xml000066400000000000000000000024431260417502300275510ustar00rootroot00000000000000 clementine-1.2.3+git1354-gdaddbde+dfsg/src/dbus/org.freedesktop.UDisks.Device.xml000066400000000000000000004056571260417502300273560ustar00rootroot00000000000000 This interface provides information about a block device on a UNIX-like system. In addition to just providing information, methods can be invoked to perform operations on the block device. Objects implementing this interface have object paths prefixed with /devices/ followed by a sanitized representation of the base name of their native path. As the D-Bus specification greatly limits what characters can be used in object paths, this doesn't necessarily map one to one with the native basename; for example the native path /sys/devices/virtual/block/dm-0 will be represented as /devices/dm_0. Most methods on this interface take an array of strings for options that can affect what the method does. Some of these options are literal strings (such as noatime) while some are encoded in the form of a key/value pair (such as label=). A general note about properties: the set of values returned can be expected to grow in the future as both hardware and operating system capabilities evolve. Care has been taken to namespace values so applications can properly fall back (see e.g. DriveMediaCompatibility) and export both general and specific properties (such as IdUsage vs. IdType). In general an empty string in a property means not set. Since the empty string is not a valid object path we use the "/" to mean "not set" for object paths. Cancels a job in progress. The caller will need one of the following PolicyKit authorizations: org.freedesktop.udisks.cancel-job-others To cancel a job initiated by another user if the caller lacks the appropriate PolicyKit authorization if the operation failed The scheme of the partition table to create. No options are currently supported. Creates a new partition table. The following partition table schemes are supported: none To zero out existing partition tables signatures. mbr Use the Master Boot Record partitioning scheme. gpt Use the GUID Partition Table scheme. apm Use the Apple Partition Map partitioning scheme. The caller will need one of the following PolicyKit authorizations: org.freedesktop.udisks.change If the operation is on a non-system-internal device org.freedesktop.udisks.change-system-internal If the operation is on a system-internal device if the caller lacks the appropriate PolicyKit authorization if the device or a partition on it are busy if the operation failed if the job was cancelled No options are currently supported. Deletes a partition, removing it from the enclosing partition table. The caller will need one of the following PolicyKit authorizations: org.freedesktop.udisks.change If the operation is on a non-system-internal device org.freedesktop.udisks.change-system-internal If the operation is on a system-internal device if the caller lacks the appropriate PolicyKit authorization if the device is busy if the operation failed if the job was cancelled Where on the device to create the partition. Size of the partitition to create. The type of the partition to create. Valid types depends on the partitioning scheme used: mbr For the Master Boot Record partitioning scheme, the given type must be a string representation of an integer (both decimal and hexadecimal encodings are accepted) between 0 and 255 both inclusive. gpt Any valid GUID string. apm Any valid type for Apple Partition Map for example Apple_Unix_SVR2. The label to use for the partition. Leave blank if the partition table scheme is mbr. Flags to use for the partition. Valid flags depends on the partitioning scheme used: mbr Only the flag boot is valid. gpt Only the flag required is valid. apm The flags allocated, in_use, boot, allow_read, allow_write, boot_code_is_pic are valid. Currently unused. The file system to create in new partition. Leave blank to skip creating a file system. See the FilesystemCreate() method for details. Options to use for file system creation. See the FilesystemCreate() method for details. The object path of the newly added partition. Create a new partition and, optionally, create a file system on it. The partition won't necessarily be created at the exact location requested due to disk geometry constraints. The caller will need one of the following PolicyKit authorizations: org.freedesktop.udisks.change If the operation is on a non-system-internal device org.freedesktop.udisks.change-system-internal If the operation is on a system-internal device if the caller lacks the appropriate PolicyKit authorization if the device is busy if the operation failed if the job was cancelled The type of the partition to create. See the type parameter of the PartitionCreate() method for details on valid types. The label to use for the partition. See the label parameter of the PartitionCreate() method for details on valid labels. Flags to use for the partition. See the flags parameter of the PartitionCreate() method for details on valid flags Modifies meta data for a partition, such as type, label and flags. TODO: Consider allowing changing offset and size. Or maybe that should be a separate method. The caller will need one of the following PolicyKit authorizations: org.freedesktop.udisks.change If the operation is on a non-system-internal device org.freedesktop.udisks.change-system-internal If the operation is on a system-internal device if the caller lacks the appropriate PolicyKit authorization if the enclosing partition table device is busy if the operation failed if the job was cancelled The type of file system to create. Pass empty to not create a file system and just clear the areas of the device known to host file system signatures. Use @TODO@ to get a list of file systems that can be created. To set the label on the file system use the label=NAME option. Labels may not be supported for all file systems and the allowed length of a label may vary (see @TODO@). To create the file system on an LUKS encrypted block device, pass the luks_encrypt= option with the value set to the passphrase to use. For file systems with the concept of owners (e.g. ext3), the options take_ownership_uid= and take_ownership_gid= are supported and can be used to set the initial owner of the created file system. Create a file system on a device. If the luks_encrypt= option is passed then an LUKS encrypted block device will be created, then unlocked and the file system will be created on the corresponding cleartext device. The caller will need one of the following PolicyKit authorizations: org.freedesktop.udisks.change If the operation is on a non-system-internal device org.freedesktop.udisks.change-system-internal If the operation is on a system-internal device if the caller lacks the appropriate PolicyKit authorization if the device is busy if the operation failed if the job was cancelled if mkfs for this type is not available New label for file system. Changes the file system label. See the options parameter of FilesystemCreate() method for details of what valid labels are valid. The caller will need one of the following PolicyKit authorizations: org.freedesktop.udisks.change If the operation is on a non-system-internal device org.freedesktop.udisks.change-system-internal If the operation is on a system-internal device if the caller lacks the appropriate PolicyKit authorization if the device is busy and changing the label requires an unmounted file system if the operation failed if the job was cancelled if the label changing tool for this file system type is not available File system type to use. Mount Options. Valid mount options include mount options accepted by the native mount program. The option auth_no_user_interaction can be used to avoid user interaction (e.g. authentication dialogs) when checking whether the caller is authorized. Where the device was mounted. Mount the device. If the device is referenced in the system-wide /etc/fstab file, the given parameters are all ignored and the device will be attempted to be mounted as the calling user. The caller will need one of the following PolicyKit authorizations: org.freedesktop.udisks.filesystem-mount If the operation is on a non-system-internal device org.freedesktop.udisks.filesystem-mount-system-internal If the operation is on a system-internal device if the caller lacks the appropriate PolicyKit authorization if the device is busy if the operation failed if the job was cancelled if an invalid or malformed mount option was given if the kernel driver for this file system type is not available Unmount options. Valid options currently include only 'force'. Unmount the device. If the device is referenced in the system-wide /etc/fstab file (both at mount time and when this method is invoked), the device will be attempted to be unmounted as the calling user. The caller will need one of the following PolicyKit authorizations: org.freedesktop.udisks.filesystem-unmount-others To unmount a device mounted by another user if the caller lacks the appropriate PolicyKit authorization if the device is busy if the operation failed if the job was cancelled if an invalid or malformed unmount option was given Currently unused. Returns TRUE if the file system is clean, FALSE if there are errors on the file system. Perform a non-interactive file system check. The caller will need one of the following PolicyKit authorizations: org.freedesktop.udisks.filesystem-check To check a file system on a non-system-internal device. org.freedesktop.udisks.filesystem-check-system-internal To check a file system on a system-internal device. if the caller lacks the appropriate PolicyKit authorization if the device is mounted and the file system doesn't support online file system checking. See TODO for how to determine if a file system supports online fsck if the operation failed if the job was cancelled An array of triples (pid, uid, command line for the process image) for processes currently having open files on the given mounted file system. Note that this operation is not run as a job. List open files on a mounted file system. The caller will need one of the following PolicyKit authorizations: org.freedesktop.udisks.filesystem-lsof To check a file system on a non-system-internal device. org.freedesktop.udisks.filesystem-lsof-system-internal To check a file system on a system-internal device. if the caller lacks the appropriate PolicyKit authorization if the device is mounted and the file system doesn't support online file system checking. See TODO for how to determine if a file system supports online fsck if the operation failed Passphrase for unlocking the cleartext data. Currently unused. The cleartext device created. Sets up a cleartext device using the given device as backing store. The caller will need one of the following PolicyKit authorizations: org.freedesktop.udisks.luks-unlock To unlock LUKS encrypted devices if the caller lacks the appropriate PolicyKit authorization if the device is busy if the operation failed if the job was cancelled Currently unused. Tears down the cleartext device set up using e.g. the LuksUnlock() method. The caller will need one of the following PolicyKit authorizations: org.freedesktop.udisks.luks-lock-others To lock an encrypted LUKS device unlocked by another user if the caller lacks the appropriate PolicyKit authorization if the device is busy if the operation failed if the job was cancelled The current passphrase. The new passphrase. Change the passphrase used to unlock a LUKS encrypted device. The caller will need one of the following PolicyKit authorizations: org.freedesktop.udisks.change If the operation is on a non-system-internal device org.freedesktop.udisks.change-system-internal If the operation is on a system-internal device if the caller lacks the appropriate PolicyKit authorization if the device is busy if the operation failed if the job was cancelled Object path of the component to add Currently unused. Adds a component to a Linux md RAID array. Existing data on the given component will be erased. The caller will need the following PolicyKit authorization: org.freedesktop.udisks.linux-md Needed to configured Linux md Software RAID devices. if the caller lacks the appropriate PolicyKit authorization component to add is busy if the operation failed if the job was cancelled Object paths of the components to use for growing the array Currently unused. Grows the Linux md RAID array with the given components. The caller will need the following PolicyKit authorization: org.freedesktop.udisks.linux-md Needed to configured Linux md Software RAID devices. if the caller lacks the appropriate PolicyKit authorization component to add is busy if the operation failed if the job was cancelled The component to remove from the array. No options are currently supported. Removes a component from a Linux md RAID array. The component will be removed and then the signatures on the component will be scrubbed. The caller will need the following PolicyKit authorization: org.freedesktop.udisks.linux-md Needed to configured Linux md Software RAID devices. if the caller lacks the appropriate PolicyKit authorization component to add is busy if the operation failed if the job was cancelled Currently unused. Stops a Linux md RAID array. The caller will need the following PolicyKit authorization: org.freedesktop.udisks.linux-md Needed to configured Linux md Software RAID devices. if the caller lacks the appropriate PolicyKit authorization if the operation failed if the job was cancelled Currently unused. Stops a Linux LVM2 Logical Volume. The caller will need the following PolicyKit authorization: org.freedesktop.udisks.linux-lvm2 Needed to configured Linux LVM2. if the caller lacks the appropriate PolicyKit authorization if the operation failed if the job was cancelled Use the repair option to fix any problems encountered. Number of mismatched sectors/pages found (or fixed if the repair option is used). Checks a Linux md RAID array and returns the number of sectors/page with errors found/fixed. This can only be done if the property LinuxMdSyncAction is idle. The caller will need the following PolicyKit authorization: org.freedesktop.udisks.linux-md Needed to configured Linux md Software RAID devices. if the caller lacks the appropriate PolicyKit authorization if the operation failed if the job was cancelled Inhibit options. Currently no options are recognized. A cookie that can be used in the DriveUninhibitPolling() method to stop inhibiting polling of the device. Inhibits the daemon from polling the device for media changes. The caller will need one of the following PolicyKit authorizations: org.freedesktop.udisks.inhibit-polling To inhibit polling if the caller lacks the appropriate PolicyKit authorization if the operation failed A cookie obtained from the DriveInhibitPolling() method. Uninhibits daemon from polling the device for media changes. if the given cookie is malformed Polls the drive for media. This is typically only useful when the DeviceIsMediaChangeDetected property is FALSE. The caller will need one of the following PolicyKit authorizations: org.freedesktop.udisks.inhibit-polling To inhibit polling if the operation failed Eject options. Currently no options are recognized. Ejects media from the device. The caller will need one of the following PolicyKit authorizations: org.freedesktop.udisks.drive-eject To eject media from a device if the caller lacks the appropriate PolicyKit authorization if the device or a dependent device (e.g. partition or cleartext luks device) is busy (e.g. mounted) if the operation failed if the job was cancelled if an invalid or malformed option was given Detach options. Currently no options are recognized. Detachs the device by e.g. powering down the physical port it is connected to. Note that not all devices or ports are capable of this. Check the DriveCanDetach property before attempting to invoke this method. Note that the physical port a drive belongs to may be located inside the physical casing - for example, some netbooks provide a SD card drive connect through USB. As such, users of this method should be careful – don't automatically invoke this method if the user presses e.g. an Eject button in the UI. Instead, provide e.g. a "Safely Remove Drive" option. The caller will need one of the following PolicyKit authorizations: org.freedesktop.udisks.drive-detach To detach a device if the caller lacks the appropriate PolicyKit authorization if the device or a dependent device (e.g. partition or cleartext luks device) is busy (e.g. mounted) if the operation failed if the job was cancelled if an invalid or malformed option was given Number of seconds before the drive should be spun down. Options related to setting spindown timeout. Currently no options are recognized. A cookie that can be used in the DriveUnsetSpindownTimeout() method to unset the spindown timeout of the device. Configures spindown timeout for the drive. Check the DriveCanSpindown property before attempting to invoke this method. Caution should be exercised when using this method, see the SPINNING DOWN DISKS section in the udisks(1) man page before using it. The caller will need one of the following PolicyKit authorizations: org.freedesktop.udisks.drive-set-spindown To set spindown timeouts if the caller lacks the appropriate PolicyKit authorization if the operation failed if an invalid or malformed option was given A cookie obtained from the DriveSetSpindownTimeout() method. Unsets spindown timeout for the drive. The caller will need one of the following PolicyKit authorizations: org.freedesktop.udisks.drive-set-spindown To set spindown timeouts if the caller lacks the appropriate PolicyKit authorization if the operation failed The option nowakeup can be passed to avoid spinning up the disk if it's in a low-power mode. The option simulate= can be used to pass a path to a blob with libatasmart data to use instead of reading it from the disk. The simulate= option can only be used by the super user. Refreshes the ATA SMART data for the given drive. Note that this operation is not run as a job. The caller will need one of the following PolicyKit authorizations: org.freedesktop.udisks.drive-ata-smart-refresh Needed to refresh ATA SMART data if the caller lacks the appropriate PolicyKit authorization If the disk is sleeping and the nowakeup option was passed if the operation failed The name of the test to run; supported values are 'short' (usually less than ten minutes), 'extended' (usually tens of minutes) and 'conveyance' (usually a few minutes). Currently unused. Runs a ATA SMART self test on the drive. The caller will need one of the following PolicyKit authorizations: org.freedesktop.udisks.drive-ata-smart-selftest Needed to run ATA SMART self tests if the caller lacks the appropriate PolicyKit authorization if the operation failed if the job was cancelled If TRUE, write performance will be benchmarked in addition to read performance. Note that benchmarking write performance will scribble zeros in various parts of the drive and can only be used on a drive where the contents are completely unrecognized (e.g. no partition table and device). Use this option with caution. Currently unused. An array of pairs where the first element is the offset and the second element is the measured read transfer rate (in bytes/sec) at the given offset. An array of pairs where the first element is the offset and the second element is the measured read transfer rate (in bytes/sec) at the given offset. This is an empty array unless write benchmarking has been requested. An array of pairs where the first element is the offset and the second element the amount of time (in seconds) it took to seek to the position. Benchmarks the drive. The caller will need one of the following PolicyKit authorizations: org.freedesktop.udisks.change Needed to run benchmarks if the caller lacks the appropriate PolicyKit authorization if the operation failed if the job was cancelled Something on the device changed. Changes in job state wont trigger this signal; see the JobChanged() signal. Whether a job is currently in progress. Whether the job is cancellable. The identifier of the job. The UNIX user id of the user who initiated the job. Percentage completed of the job (between 0 and 100, negative if unknown). Emitted when a job on a device changes. Clients should listen to this signal to avoid polling the daemon for job state. OS specific native path of the device. On Linux this is the sysfs path, for example /sys/devices/pci0000:00/0000:00:1f.2/host2/target2:0:1/2:0:1:0/block/sda. The point in time (seconds since the Epoch Jan 1, 1970 0:00 UTC) when the device was detected by the daemon. The point in time (seconds since the Epoch Jan 1, 1970 0:00 UTC) when the media currently in the device was detected by the daemon or 0 if the device has no media. Major for the device or -1 if not set. Major for the device or -1 if not set. UNIX special device file for device. Example: /dev/sda. Either the value of the DeviceFile property, otherwise the preferred device file (typically a symlink to the value of the DeviceFile property) to present in user interface. Example: /dev/mapper/mpathb or /dev/vg_phobos/lv_root. Symlinks to UNIX special device file that are stable and uniquely identifies the device. Example: /dev/disk/by-id/scsi-SATA_ST910021AS_3MH05AVA, /dev/disk/by-id/ata-ST910021AS_3MH05AVA. Symlinks to UNIX special device file that uniquely identifies the port/partition the device is plugged into. Example: /dev/disk/by-path/pci-0000:00:1f.2-scsi-0:0:1:0 TRUE if the device is considered system internal. Typically, system internal devices include non-removable internal hard disks and other drives that are not easily added/removed by a local console user. The heuristic typically used is that only devices on removable media and devices connected via Firewire, USB, eSATA and SDIO are considered external. TRUE if the device is a partition. See the properties starting with partition- for details. TRUE if the device contains a partition table. See partition- properties for details. TRUE if the device contains removable media. TRUE if media is available in the device. TRUE if media changes are detected. TRUE if media changes are detected through the host polling the device, e.g. waking up every two seconds to revalidate the media. This typically keeps the device in a high power state and uses cycles on the CPU. As an example, SATA AN capable optical drives does not need polling. TRUE if it is possible to inhibit media detection on the device (to avoid keeping the device in a high power state and waking up the host). TRUE if media detection is inhibited (to avoid keeping the device in a high power state and waking up the host). TRUE if the device read-only. TRUE if the device is a drive. See the drive- properties for details. TRUE if the device is an optical drive and an optical disc is inserted. See the optical-disc- properties for details. TRUE if the device is mounted. A list of paths in the root namespace where the root of the device is mounted. This property is only valid if DeviceIsMounted is TRUE. The UNIX user id of the user who mounted the device. Set to 0 if not mounted by udisks. This property is only valid if DeviceIsMounted is TRUE. TRUE if device is an LUKS encrypted device. See Lucks properties for details. TRUE if device is a cleartext device backed by a LUKS encrypted device. See LucksCleartext properties for details. TRUE if the device is a Linux md RAID component. See LinuxMdComponent properties for details. TRUE if the device is a Linux md RAID array. See LinuxMd properties for details. TRUE if the device is a Linux LVM2 logical volume. See LinuxLvm2LV properties for details. TRUE if the device is a Linux LVM2 physical. See LinuxLvm2PV properties for details. TRUE if the device is a component (e.g. active path) of a Linux dm-multipath device. TRUE if the device is a Linux dm-multipath device. TRUE if the device is a Linux loop device. The size of the device in bytes. The block size of the device in bytes. A hint if the device should be hidden from the user interface. A hint if the device (or e.g. the multi-disk device that the device is part of) shouldn't be automatically mounted / assembled. The name to use when presenting the device to an end user. The icon to use when presenting the device to an end user. If set, must be a name following the freedesktop.org icon theme specification. The job properties specify if a job initiated via the udisks daemon is currently in progress. This property is used to identify the job and maps 1-1 with the names of the method calls on this interface, e.g. 'FilesystemCreate' and so on. The UNIX user id of the user who initiated the job. Whether the job can be cancelled using JobCancel() method. Percentage completed of the job (between 0 and 100, negative if unknown). A result of probing for signatures on the block device; known values are: filesystem A mountable file system was detected crypto Encrypted data (e.g. LUKS) was detected partitiontable A partition table was detected raid Used for RAID and LVM components other A non-standard signature was detected If blank, no known signature was detected. This doesn't necessarily mean the device contains no structured data; it only means that no signature known to the probing code was detected. This property contains more information about the result of probing the block device. It's value depends of the value the IdUsage property: filesystem The mountable file system that was detected (e.g. ext3, vfat) crypto Known values include crypto_LUKS partitiontable Known values include mbr (for the Master Boot Record scheme), gpt (for the GUID Partition Table scheme), apm (for the Apple Partition Map scheme). raid Known values include LVM1_member (for Linux LVM1 components), LVM2_member (for Linux LVM2 components), linux_raid_member (for Linux md (Software RAID) components) other Known values include swap (for swap space), suspend (data used when resuming from STD) The version of the detected file system (or other identified data structure) identified by the IdUsage and IdType properties. The UUID (universally unique identifier) of the detected file system (or other identified data structure) identified by the IdUsage and IdType properties. The user-visible label of the detected file system (or other identified data structure) identified by the IdUsage and IdType properties. The cleartext device that is using the LUKS device. This property is only valid if DeviceIsLuks is TRUE. The encrypted LUKS device backing a crypto cleartext device. This property is only valid if DeviceIsLuksCleartext is TRUE. The UNIX user id of the user who unlocked the LUKS device. Set to 0 if not unlocked by udisks. This property is only valid if DeviceIsLuksCleartext is TRUE. The object path of the partition table the partition is part of. This property is only valid if DeviceIsPartition is TRUE. The scheme of the partition table this partition is part of. See the scheme parameter of the PartitionTableCreate() method for details on known partitioning schemes. This property is only valid if DeviceIsPartition is TRUE. The type of the partition. See the type parameter of the PartitionCreate() method for details on known partitioning types. This property is only valid if DeviceIsPartition is TRUE. The label of the partition. See the label parameter of the PartitionCreate() method for details on partition labels. This property is only valid if DeviceIsPartition is TRUE. The UUID of the partition. See the uuid parameter of the PartitionCreate() method for details on partition UUID's. This property is only valid if DeviceIsPartition is TRUE. Partition flags. See the flags parameter of the PartitionCreate() method for details on partition flags. This property is only valid if DeviceIsPartition is TRUE. Number of the partition. Typically partition numbers start at 1 and are identical to the numbers used by the kernel. Note that partitions may not be sequentially numbered. This property is only valid if DeviceIsPartition is TRUE. Offset in bytes where the partition is located on the enclosing partition table device (see PartitionSlave). This property is only valid if DeviceIsPartition is TRUE. Size of the partition in bytes. This property is only valid if DeviceIsPartition is TRUE. The amount of bytes the beginning of the partition is offset from the disk's natural alignment. This property is only valid if DeviceIsPartition is TRUE. The scheme of the partition table. See the scheme parameter of the PartitionTableCreate() method for details on known partitioning schemes. This property is only valid if DeviceIsPartitionTable is TRUE. Number of partitions in the partition table. This property is only valid if DeviceIsPartitionTable is TRUE. Name of the vendor of the drive, for example MATSHITA or BELKIN. This property is only valid if DeviceIsDrive is TRUE. Name of the model of the drive, for example ST910021AS or USB 2 HS-CF. This property is only valid if DeviceIsDrive is TRUE. Revision of the drive, for example 3.07 or 1.95. This property is only valid if DeviceIsDrive is TRUE. The serial number of the drive or blank if unknown. Examples: 3MH05AVA, A0000001B900. This property is only valid if DeviceIsDrive is TRUE. The World Wide Name in hex (without a leading "0x") or blank if the drive has no WWN. Example: 50014ee0016eb572. This property is only valid if DeviceIsDrive is TRUE. The rotational rate of the disk (e.g. 4200, 5400, 5900, 7200, 10000, 15000) in rounds per minute or 0 if unknown. This property is only valid if DeviceIsDrive is TRUE and DriveIsRotational is TRUE. Whether the write cache is enabled, known values include "enabled" and "disabled" and the blank string if unknown. This property is only valid if DeviceIsDrive is TRUE. The interface through which the drive is connected. Known values include: virtual Device is a composite device e.g. Software RAID or similar ata Connected via ATA ata_serial Connected via Serial ATA ata_serial_esata Connected via eSATA ata_parallel Connected via Parallel ATA scsi Connected via SCSI usb Connected via the Universal Serial Bus firewire Connected via Firewire sdio Connected via SDIO platform Part of the platform, e.g. PC floppy drive This property is only valid if DeviceIsDrive is TRUE. The nominal speed of the connection interface in bits per second. If unknown this property is set to 0. This property is only valid if DeviceIsDrive is TRUE. An array of media types that can be used in the drive. This property is sometimes set using quirk files if the hardware isn't capable of precisely reporting it. Known values include: flash Flash Card flash_cf CompactFlash flash_ms MemoryStick flash_sm SmartMedia flash_sd Secure Digital flash_sdhc Secure Digital High-Capacity flash_mmc MultiMediaCard floppy Floppy Disk floppy_zip Zip Disk floppy_jaz Jaz Disk optical Optical Disc optical_cd Compact Disc optical_cd_r Compact Disc Recordable optical_cd_rw Compact Disc Rewritable optical_dvd Digital Versatile Disc optical_dvd_r DVD-R optical_dvd_rw DVD-RW optical_dvd_ram DVD-RAM optical_dvd_plus_r DVD+R optical_dvd_plus_rw DVD+RW optical_dvd_plus_r_dl DVD+R Dual Layer optical_dvd_plus_rw_dl DVD+RW Dual Layer optical_bd Bluray Disc optical_bd_r BluRay Recordable optical_bd_re BluRay Rewritable optical_hddvd HD DVD optical_hddvd_r HD DVD Recordable optical_hddvd_rw HD DVD Rewritable optical_mo Magneto Optical optical_mrw Can read Mount Rainer media optical_mrw_w Can write Mount Rainer media This property is only valid if DeviceIsDrive is TRUE. The type of media currently in the drive (blank if no media is available). Known values include the ones listed for the DriveMediaCompatibility property. This property is only valid if DeviceIsDrive is TRUE. TRUE only if the media can be physically ejected by issuing a command from the host to the drive (e.g. optical and Zip drives). This property is only valid if DeviceIsDrive is TRUE. TRUE only if the drive is capable of being detached by e.g. powering down the port it is connected to. This property is only valid if DeviceIsDrive is TRUE. TRUE only if the drive is capable of being put into a standby mode (typically powering down the spindle motor). This property is only valid if DeviceIsDrive is TRUE. TRUE if the disk uses rotational media, such as a hard disk. This property is only valid if DeviceIsDrive is TRUE. The object of the storage adapter for the drive or "/" if no adapter exists. This property is only valid if DeviceIsDrive is TRUE. The object paths of the ports for the drive or empty if no ports exist. This property is only valid if DeviceIsDrive is TRUE. An array of object paths for devices with similar serial number and/or WWN. Typically all drives with similar serial number and/or WWN are configured as a multipath device (for example via the Linux device-mapper target cf. DeviceIsLinuxDmmp and DeviceIsLinuxDmmpComponent) but in some cases the OS needs manual configuration. Presentation-level software can (and should) display a warning when this property is non-empty and the device isn't a multipath component or multipath device e.g. when both DeviceIsLinuxDmmpComponent) and DeviceIsLinuxDmmp) is FALSE. This property is only valid if DeviceIsDrive is TRUE. TRUE only if the disc is appendable. This property is only valid if DeviceIsOpticalDisc is TRUE. TRUE only if the disc is appendable. This property is only valid if DeviceIsOpticalDisc is TRUE. TRUE only if the disc is appendable. This property is only valid if DeviceIsOpticalDisc is TRUE. Number of tracks on the disc. This property is only valid if DeviceIsOpticalDisc is TRUE. Number of audio tracks on the disc. This property is only valid if DeviceIsOpticalDisc is TRUE. Number of sessions on the disc. This property is only valid if DeviceIsOpticalDisc is TRUE. TRUE if the disk is capable of reporting SMART data, FALSE otherwise. The point in time (seconds since the Epoch Jan 1, 1970 0:00 UTC) when ATA SMART data was collected. This property is only valid if DriveAtaSmartTimeCollected is greater than zero. The overall assessment for the disk. Is one of the following strings GOOD, BAD_ATTRIBUTES_IN_THE_PAST (At least one pre-fail attribute is exceeded its threshold in the past), BAD_SECTOR (At least one bad sector), BAD_ATTRIBUTE_NOW (At least one pre-fail attribute is exceeding its threshold now), BAD_SECTOR_MANY (Many bad sectors)), BAD_STATUS (Smart Self Assessment negative) or empty if some error occured trying to determine the result. This property is only valid if DriveAtaSmartTimeCollected is greater than zero. A blob containing the ATA SMART data. This blob can be used with libatasmart to get more information. This property is only valid if DriveAtaSmartTimeCollected is greater than zero. The RAID level of the array the component is part of. Known values include linear The array is Just A Bunch of Disks raid0 RAID-0 raid1 RAID-1 raid4 RAID-4 raid5 RAID-5 raid6 RAID-6 raid10 RAID-10 This property is only valid if DeviceIsLinuxMdComponent is TRUE. The zero-based position of the component or -1 if not part of a running array. This property is only valid if DeviceIsLinuxMdComponent is TRUE. The number of component devices in the array the component is part of. This property is only valid if DeviceIsLinuxMdComponent is TRUE. The UUID of the array the component is part of. This property is only valid if DeviceIsLinuxMdComponent is TRUE. The name of the array the component is part of. Blank if the array doesn't have a name (e.g. pre-1.0 meta data). This property is only valid if DeviceIsLinuxMdComponent is TRUE. The home host of the array the component is part of, e.g. where it was created. Blank if the array has pre-1.0 meta data. This property is only valid if DeviceIsLinuxMdComponent is TRUE. The version of superblock of the component. This property is only valid if DeviceIsLinuxMdComponent is TRUE. The holder of the component or "/" if the component isn't claimed by any array. This property is only valid if DeviceIsLinuxMdComponent is TRUE. The state of the component (contents of md/dev-XXX/state file). This property is only valid if DeviceIsLinuxMdComponent is TRUE and DeviceIsLinuxMdComponentHolder is non-empty. The state of the array (contents of the md/array_state file). This property is only valid if DeviceIsLinuxMd is TRUE. The RAID level of the array. For known values see the LinuxMdComponentLevel property. This property is only valid if DeviceIsLinuxMd is TRUE. The UUID of the array. This property is only valid if DeviceIsLinuxMd is TRUE. The home host of the array, e.g. where if was created. Blank if the array has pre-1.0 meta data. DeviceIsLinuxMd is TRUE. The name of the array. Blank if the array doesn't have a name (e.g. pre-1.0 meta data). DeviceIsLinuxMd is TRUE. Number of component devices in the array. This property is only valid if DeviceIsLinuxMd is TRUE. Metadata version used in the components. This property is only valid if DeviceIsLinuxMd is TRUE. An array of object paths for components currently part of the array. This property is only valid if DeviceIsLinuxMd is TRUE. TRUE only if the array is running in degraded mode. This property is only valid if DeviceIsLinuxMd is TRUE. The operation currently pending on the array. Known values include idle No operation is pending reshape A reshape is in progress resync Redudancy is being calculated repair A repair operation is in progress recover A hot spare is being built to replace a failed/missing device This property is only valid if DeviceIsLinuxMd is TRUE. The progress of the current sync operation. This property is only valid if DeviceIsLinuxMd is TRUE and the value of the property LinuxMdSyncAction is not idle. The speed of the sync operation in bytes per second. This property is only valid if DeviceIsLinuxMd is TRUE and the value of the property LinuxMdSyncAction is not idle. The UUID of the PV. This property is only valid if DeviceIsLinuxLvm2PV is TRUE. The number of metadata areas on the PV. This property is only valid if DeviceIsLinuxLvm2PV is TRUE. The name of the volume group (that this physical volume belongs to). This property is only valid if DeviceIsLinuxLvm2PV is TRUE. The UUID of the volume group (that this physical volume belongs to). This property is only valid if DeviceIsLinuxLvm2PV is TRUE. The size of the volume group (that this physical volume belongs to) in bytes. This property is only valid if DeviceIsLinuxLvm2PV is TRUE. The unallocated size of the volume group (that this physical volume belongs to) in bytes. This property is only valid if DeviceIsLinuxLvm2PV is TRUE. The sequence number for the volume group (that this physical volume belongs to). This property is only valid if DeviceIsLinuxLvm2PV is TRUE. The extent size for the volume group (that this physical volume belongs to) in bytes. This property is only valid if DeviceIsLinuxLvm2PV is TRUE. The physical volumes that belongs to the volume group (that this physical volume belongs to). Each element is a semicolon separated list of key/value pairs. The only known key/value type as this point is uuid for the UUID of the physical volume. This property is only valid if DeviceIsLinuxLvm2PV is TRUE. The logical volumes that belongs to the volume group (that this physical volume belongs to). Each element is a semicolon separated list of key/value pairs. The only known key/value types as this point are uuid (for the UUID of the logical volume), name (for the name of the logical volume), size (for the size of the logical volume) and active (whether the logical volume is active). This property is only valid if DeviceIsLinuxLvm2PV is TRUE. The name of the logical volume. This property is only valid if DeviceIsLinuxLvm2LV is TRUE. The UUID of the logical volume. This property is only valid if DeviceIsLinuxLvm2LV is TRUE. The name of volume group the logical volume belongs to. This property is only valid if DeviceIsLinuxLvm2LV is TRUE. The UUID of the volume group the logical volume belongs to. This property is only valid if DeviceIsLinuxLvm2LV is TRUE. The object path of the multi-path device the component is currently part of. This property is only valid if DeviceIsLinuxDmmpComponent is TRUE. The symbolic name for the multipath device, e.g. mpathb. This property is only valid if DeviceIsLinuxDmmp is TRUE. The object paths of currently active component devices, e.g. paths. This property is only valid if DeviceIsLinuxDmmp is TRUE. The parameters/configuration for the multipath device. This property is only valid if DeviceIsLinuxDmmp is TRUE. The file backing the loop device. This property is only valid if DeviceIsLinuxLoop is TRUE. clementine-1.2.3+git1354-gdaddbde+dfsg/src/dbus/org.freedesktop.UDisks.xml000066400000000000000000001314301260417502300261410ustar00rootroot00000000000000 An array of object paths for storage adapters. Enumerate all storage adapters on the system. An array of object paths for storage expanders. Enumerate all storage expanders on the system. An array of object paths for ports. Enumerate all storage ports on the system. An array of object paths for devices. Enumerate all disk devices on the system. An array device file names. Enumerate all device files (including symlinks) for disk devices on the system. UNIX special device file Object path of device Finds a device by device path. Device major Device minor Object path of device Finds a device by major:minor. Inhibit options. Currently no options are recognized. A cookie that can be used in the DriveUninhibitAllPolling() method to stop inhibiting polling of all devices. Inhibits the daemon from polling devices for media changes. The caller will need one of the following PolicyKit authorizations: org.freedesktop.udisks.inhibit-polling To inhibit polling if the caller lacks the appropriate PolicyKit authorization if the operation failed A cookie obtained from the DriveInhibitAllPolling() method. Uninhibits daemon from polling devices for media changes. if the given cookie is malformed Number of seconds before drives should be spun down. Options related to setting spindown timeouts. Currently no options are recognized. A cookie that can be used in the DriveUnsetAllSpindownTimeouts() method to unset the spindown timeout for drives. Configures spindown timeout for all drives capable of being spun down. Caution should be exercised when using this method, see the SPINNING DOWN DISKS section in the udisks(1) man page before using it. The caller will need one of the following PolicyKit authorizations: org.freedesktop.udisks.drive-set-spindown To set spindown timeouts if the caller lacks the appropriate PolicyKit authorization if the operation failed if an invalid or malformed option was given A cookie obtained from the DriveSetSpindownTimeout() method. Unsets spindown timeout for the drive. The caller will need one of the following PolicyKit authorizations: org.freedesktop.udisks.drive-set-spindown To set spindown timeouts if the caller lacks the appropriate PolicyKit authorization if the operation failed The UUID of the volume group to start. Options for starting the VG. Currently no options are supported. Starts all logical volumes in Linux LVM2 Volume Group. The caller will need the following PolicyKit authorization: org.freedesktop.udisks.linux-lvm2 Needed to configured Linux LVM2 devices. if the caller lacks the appropriate PolicyKit authorization if one of the given components are busy if the operation failed if the job was cancelled The UUID of the volume group to stop. Options for stopping the VG. Currently no options are supported. Stops all logical volumes in Linux LVM2 Volume Group. The caller will need the following PolicyKit authorization: org.freedesktop.udisks.linux-lvm2 Needed to configured Linux LVM2 devices. if the caller lacks the appropriate PolicyKit authorization if one of the given components are busy if the operation failed if the job was cancelled The UUID of the volume group to set the name for. The new name for the volume group. Sets the name for a volume group. The caller will need the following PolicyKit authorization: org.freedesktop.udisks.linux-lvm2 Needed to configured Linux LVM2 devices. if the caller lacks the appropriate PolicyKit authorization if one of the given components are busy if the operation failed if the job was cancelled The UUID of the volume group to add a physical volume to. The objcet path of the device to use as a physical volume. Currently unused. Adds a Physical volume to a Linux LVM2 Volume Group. Existing data on the given device to use for a physical volume will be erased. The caller will need the following PolicyKit authorization: org.freedesktop.udisks.linux-lvm2 Needed to configured Linux LVM2 devices. if the caller lacks the appropriate PolicyKit authorization if one of the given components are busy if the operation failed if the job was cancelled The UUID of the volume group to remove the physical volume from. The UUID of the physical volume to remove from the VG. Currently unused. Removes a Physical volume from a Linux LVM2 Volume Group. The caller will need the following PolicyKit authorization: org.freedesktop.udisks.linux-lvm2 Needed to configured Linux LVM2 devices. if the caller lacks the appropriate PolicyKit authorization if one of the given components are busy if the operation failed if the job was cancelled The UUID of the volume group for the logical volume. The UUID of the logical volume to set the name for. The new name for the logical volume. Sets the name for a logical volume. The caller will need the following PolicyKit authorization: org.freedesktop.udisks.linux-lvm2 Needed to configured Linux LVM2 devices. if the caller lacks the appropriate PolicyKit authorization if one of the given components are busy if the operation failed if the job was cancelled The UUID of the volume group of the logical volume to start belongs to. The UUID of the logical volume to start. Options for starting the logical volume. Currently no options are supported. Starts a LVM2 logical volume. The caller will need the following PolicyKit authorization: org.freedesktop.udisks.linux-lvm2 Needed to configured Linux LVM2 devices. if the caller lacks the appropriate PolicyKit authorization if one of the given components are busy if the operation failed if the job was cancelled The UUID of the volume group of the logical volume to start belongs to. The UUID of the logical volume to remove. Options used for the removal of the logical volume. Currently no options are supported. Removes a LVM2 logical volume. The caller will need the following PolicyKit authorization: org.freedesktop.udisks.linux-lvm2 Needed to configured Linux LVM2 devices. if the caller lacks the appropriate PolicyKit authorization if one of the given components are busy if the operation failed if the job was cancelled The UUID of the volume group to create a logical volume in. The name for the logical volume. The size of the logical volume, in bytes. Number of stripes to use. The stripe size to use or 0 if @num_stripes is 0. This must be a power of two. Number of mirrors to use. Options used when creating the logical volume. Currently no options are supported. The file system to create in new logical filesystem. Leave blank to skip creating a file system. See the Device.FilesystemCreate() method for details. Options to use for file system creation. See the Device.FilesystemCreate() method for details. The object path of the newly added logical volume. Creates a new LVM2 logical volume. The caller will need the following PolicyKit authorization: org.freedesktop.udisks.linux-lvm2 Needed to configured Linux LVM2 devices. if the caller lacks the appropriate PolicyKit authorization if one of the given components are busy if the operation failed if the job was cancelled The object paths of the components of the array to start. Options for starting the array. Currently no options are supported. The object path of the assembled array device. Starts an Linux md RAID array. The array will be assembled and started in degraded mode if an insufficient number of components are given. The caller will need the following PolicyKit authorization: org.freedesktop.udisks.linux-md Needed to configured Linux md Software RAID devices. if the caller lacks the appropriate PolicyKit authorization if one of the given components are busy if the operation failed if the job was cancelled The object paths of the components to use for the array. RAID level. Stripe Size in bytes, or 0 to use the default stripe size. Name of the array. Options for creating the array. Currently no options are supported. The object path of the created array device. Creates a Linux md RAID array. The array will be created and assembled. The caller will need the following PolicyKit authorization: org.freedesktop.udisks.linux-md Needed to configured Linux md Software RAID devices. if the caller lacks the appropriate PolicyKit authorization if one of the given components are busy if the operation failed if the job was cancelled A cookie that can be used in the Uninhibit() method. to stop inhibiting the daemon. Inhibits clients from invoking methods on the daemon of the daemon that require authorization (all methods will return the org.freedesktop.PolicyKit.Error.Inhibited error) if the caller is not the super user. This is typically used by OS installers and other programs that expects full control of the system, specifically to avoid automounting devices. Only the super user can invoke this method. if the caller is not the super user A cookie obtained from the Inhibit() method. Uninhibits other clients from using the daemon. if the given cookie is malformed Object path of device that was added. Emitted when a device is added. Object path of device that was removed. Emitted when a device is removed. Object path of device that was changed. Emitted when a device changed. The object path of the device. Whether a job is currently in progress. Whether the job is cancellable. The identifier of the job. Number of tasks in the job. Current task number (zero-based offset). Task identifier for current task. Percentage completed of current task (between 0 and 100, negative if unknown). Emitted when a job on a device changes. Object path of adapter that was added. Emitted when an adapter is added. Object path of adapter that was removed. Emitted when an adapter is removed. Object path of adapter that was changed. Emitted when an adapter changed. Object path of expander that was added. Emitted when an expander is added. Object path of expander that was removed. Emitted when an expander is removed. Object path of expander that was changed. Emitted when an expander changed. Object path of port that was added. Emitted when a port is added. Object path of port that was removed. Emitted when a port is removed. Object path of port that was changed. Emitted when a port changed. The version of the running daemon. TRUE only if the daemon is inhibited. TRUE only if the daemon can create encrypted LUKS block devices, see the LuksUnlock() and LuksLock() methods for details. An array of file systems known to the daemon and what features are supported. Each element in the array contains the following members: id The name / identifier of the file system (such as ext3 or vfat), similar to the contents of the Device:IdType property. name A human readable name for the file system such as "Linux Ext3". supports_unix_owners Whether the file system supports the UNIX owners model (e.g. ext3 does, but vfat doesn't). can_mount Whether the file system can be mounted. can_create Whether the file system can be created on a device. max_label_len The maximum amount of bytes that the file system label can hold. Set to zero if the file system doesn't support labels. supports_label_rename Whether the label of the file system can be changed. supports_online_label_rename Whether the label can be changed while the file system is mounted. supports_fsck Whether the file system can be checked. supports_online_fsck Whether the file system can be checked while mounted. supports_resize_enlarge Whether the file system can be enlarged. supports_online_resize_enlarge Whether the file system can be enlarged while mounted. supports_resize_shrink Whether the file system can be shrunk. supports_online_resize_shrink Whether the file system can be shrunk while mounted. clementine-1.2.3+git1354-gdaddbde+dfsg/src/dbus/org.gnome.SettingsDaemon.MediaKeys.xml000066400000000000000000000011331260417502300303230ustar00rootroot00000000000000 " clementine-1.2.3+git1354-gdaddbde+dfsg/src/dbus/org.mpris.MediaPlayer2.Player.xml000066400000000000000000000032151260417502300272660ustar00rootroot00000000000000 clementine-1.2.3+git1354-gdaddbde+dfsg/src/dbus/org.mpris.MediaPlayer2.Playlists.xml000066400000000000000000000023231260417502300300150ustar00rootroot00000000000000 clementine-1.2.3+git1354-gdaddbde+dfsg/src/dbus/org.mpris.MediaPlayer2.TrackList.xml000066400000000000000000000030451260417502300277330ustar00rootroot00000000000000 clementine-1.2.3+git1354-gdaddbde+dfsg/src/dbus/org.mpris.MediaPlayer2.xml000066400000000000000000000014231260417502300260320ustar00rootroot00000000000000 clementine-1.2.3+git1354-gdaddbde+dfsg/src/dbus/org.wiimotedev.deviceEvents.xml000066400000000000000000000013271260417502300272250ustar00rootroot00000000000000 clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/000077500000000000000000000000001260417502300216005ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/cddadevice.cpp000066400000000000000000000037501260417502300243640ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include #include "library/librarybackend.h" #include "library/librarymodel.h" #include "cddadevice.h" CddaDevice::CddaDevice(const QUrl& url, DeviceLister* lister, const QString& unique_id, DeviceManager* manager, Application* app, int database_id, bool first_time) : ConnectedDevice(url, lister, unique_id, manager, app, database_id, first_time), cdda_song_loader_(url) { connect(&cdda_song_loader_, SIGNAL(SongsLoaded(SongList)), this, SLOT(SongsLoaded(SongList))); connect(&cdda_song_loader_, SIGNAL(SongsDurationLoaded(SongList)), this, SLOT(SongsLoaded(SongList))); connect(&cdda_song_loader_, SIGNAL(SongsMetadataLoaded(SongList)), this, SLOT(SongsLoaded(SongList))); connect(this, SIGNAL(SongsDiscovered(SongList)), model_, SLOT(SongsDiscovered(SongList))); } CddaDevice::~CddaDevice() {} void CddaDevice::Init() { song_count_ = 0; // Reset song count, in case it was already set cdda_song_loader_.LoadSongs(); } void CddaDevice::Refresh() { if (!cdda_song_loader_.HasChanged()) { return; } Init(); } void CddaDevice::SongsLoaded(const SongList& songs) { model_->Reset(); emit SongsDiscovered(songs); song_count_ = songs.size(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/cddadevice.h000066400000000000000000000033311260417502300240240ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CDDADEVICE_H #define CDDADEVICE_H #include // These must come after Qt includes (issue 3247) #include #include #include "cddasongloader.h" #include "connecteddevice.h" #include "core/song.h" #include "musicbrainz/musicbrainzclient.h" class CddaDevice : public ConnectedDevice { Q_OBJECT public: Q_INVOKABLE CddaDevice(const QUrl& url, DeviceLister* lister, const QString& unique_id, DeviceManager* manager, Application* app, int database_id, bool first_time); ~CddaDevice(); void Init(); void Refresh(); bool CopyToStorage(const MusicStorage::CopyJob&) { return false; } bool DeleteFromStorage(const MusicStorage::DeleteJob&) { return false; } static QStringList url_schemes() { return QStringList() << "cdda"; } signals: void SongsDiscovered(const SongList& songs); private slots: void SongsLoaded(const SongList& songs); private: CddaSongLoader cdda_song_loader_; }; #endif clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/cddalister.cpp000066400000000000000000000065521260417502300244320ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include #include #include #include // This must come after Qt includes #include #include "cddalister.h" #include "core/logging.h" #include "core/song.h" QStringList CddaLister::DeviceUniqueIDs() { return devices_list_; } QVariantList CddaLister::DeviceIcons(const QString&) { QVariantList icons; icons << QString("media-optical"); return icons; } QString CddaLister::DeviceManufacturer(const QString& id) { CdIo_t* cdio = cdio_open(id.toLocal8Bit().constData(), DRIVER_DEVICE); cdio_hwinfo_t cd_info; if (cdio_get_hwinfo(cdio, &cd_info)) { cdio_destroy(cdio); return QString(cd_info.psz_vendor); } cdio_destroy(cdio); return QString(); } QString CddaLister::DeviceModel(const QString& id) { CdIo_t* cdio = cdio_open(id.toLocal8Bit().constData(), DRIVER_DEVICE); cdio_hwinfo_t cd_info; if (cdio_get_hwinfo(cdio, &cd_info)) { cdio_destroy(cdio); return QString(cd_info.psz_model); } cdio_destroy(cdio); return QString(); } quint64 CddaLister::DeviceCapacity(const QString&) { return 0; } quint64 CddaLister::DeviceFreeSpace(const QString&) { return 0; } QVariantMap CddaLister::DeviceHardwareInfo(const QString&) { return QVariantMap(); } QString CddaLister::MakeFriendlyName(const QString& id) { CdIo_t* cdio = cdio_open(id.toLocal8Bit().constData(), DRIVER_DEVICE); cdio_hwinfo_t cd_info; if (cdio_get_hwinfo(cdio, &cd_info)) { cdio_destroy(cdio); return QString(cd_info.psz_model); } cdio_destroy(cdio); return QString("CD (") + id + ")"; } QList CddaLister::MakeDeviceUrls(const QString& id) { return QList() << QUrl("cdda://" + id); } void CddaLister::UnmountDevice(const QString& id) { cdio_eject_media_drive(id.toLocal8Bit().constData()); } void CddaLister::UpdateDeviceFreeSpace(const QString&) {} void CddaLister::Init() { cdio_init(); #ifdef Q_OS_DARWIN if (!cdio_have_driver(DRIVER_OSX)) { qLog(Error) << "libcdio was compiled without support for OS X!"; } #endif char** devices = cdio_get_devices(DRIVER_DEVICE); if (!devices) { qLog(Debug) << "No CD devices found"; return; } for (; *devices != nullptr; ++devices) { QString device(*devices); QFileInfo device_info(device); if (device_info.isSymLink()) { device = device_info.symLinkTarget(); } #ifdef Q_OS_DARWIN // Every track is detected as a separate device on Darwin. The raw disk // looks // like /dev/rdisk1 if (!device.contains(QRegExp("^/dev/rdisk[0-9]$"))) { continue; } #endif if (!devices_list_.contains(device)) { devices_list_ << device; emit DeviceAdded(device); } } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/cddalister.h000066400000000000000000000030001260417502300240600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CDDALISTER_H #define CDDALISTER_H #include #include "devicelister.h" class CddaLister : public DeviceLister { Q_OBJECT public: CddaLister() {} QStringList DeviceUniqueIDs(); QVariantList DeviceIcons(const QString& id); QString DeviceManufacturer(const QString& id); QString DeviceModel(const QString& id); quint64 DeviceCapacity(const QString& id); quint64 DeviceFreeSpace(const QString& id); QVariantMap DeviceHardwareInfo(const QString& id); bool AskForScan(const QString&) const { return false; } QString MakeFriendlyName(const QString&); QList MakeDeviceUrls(const QString&); void UnmountDevice(const QString&); void UpdateDeviceFreeSpace(const QString&); void Init(); private: QStringList devices_list_; }; #endif // CDDALISTER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/cddasongloader.cpp000066400000000000000000000157531260417502300252700ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include #include #include "core/logging.h" #include "core/timeconstants.h" #include "cddasongloader.h" CddaSongLoader::CddaSongLoader(const QUrl& url, QObject* parent) : QObject(parent), url_(url), cdda_(nullptr), cdio_(nullptr) {} CddaSongLoader::~CddaSongLoader() { if (cdio_) cdio_destroy(cdio_); } QUrl CddaSongLoader::GetUrlFromTrack(int track_number) const { if (url_.isEmpty()) { return QUrl(QString("cdda://%1").arg(track_number)); } else { return QUrl(QString("cdda://%1/%2").arg(url_.path()).arg(track_number)); } } void CddaSongLoader::LoadSongs() { QMutexLocker locker(&mutex_load_); cdio_ = cdio_open(url_.path().toLocal8Bit().constData(), DRIVER_DEVICE); if (cdio_ == nullptr) { return; } // Create gstreamer cdda element GError* error = nullptr; cdda_ = gst_element_make_from_uri(GST_URI_SRC, "cdda://", nullptr, &error); if (error) { qLog(Error) << error->code << error->message; } if (cdda_ == nullptr) { return; } if (!url_.isEmpty()) { g_object_set(cdda_, "device", g_strdup(url_.path().toLocal8Bit().constData()), nullptr); } if (g_object_class_find_property (G_OBJECT_GET_CLASS (cdda_), "paranoia-mode")) { g_object_set (cdda_, "paranoia-mode", 0, NULL); } // Change the element's state to ready and paused, to be able to query it if (gst_element_set_state(cdda_, GST_STATE_READY) == GST_STATE_CHANGE_FAILURE || gst_element_set_state(cdda_, GST_STATE_PAUSED) == GST_STATE_CHANGE_FAILURE) { gst_element_set_state(cdda_, GST_STATE_NULL); gst_object_unref(GST_OBJECT(cdda_)); return; } // Get number of tracks GstFormat fmt = gst_format_get_by_nick("track"); GstFormat out_fmt = fmt; gint64 num_tracks = 0; if (!gst_element_query_duration(cdda_, out_fmt, &num_tracks) || out_fmt != fmt) { qLog(Error) << "Error while querying cdda GstElement"; gst_object_unref(GST_OBJECT(cdda_)); return; } SongList songs; for (int track_number = 1; track_number <= num_tracks; track_number++) { // Init song Song song; song.set_id(track_number); song.set_valid(true); song.set_filetype(Song::Type_Cdda); song.set_url( GetUrlFromTrack(track_number)); song.set_title(QString("Track %1").arg(track_number)); song.set_track(track_number); songs << song; } emit SongsLoaded(songs); gst_tag_register_musicbrainz_tags(); GstElement* pipeline = gst_pipeline_new("pipeline"); GstElement* sink = gst_element_factory_make ("fakesink", NULL); gst_bin_add_many (GST_BIN (pipeline), cdda_, sink, NULL); gst_element_link (cdda_, sink); gst_element_set_state(pipeline, GST_STATE_READY); gst_element_set_state(pipeline, GST_STATE_PAUSED); // Get TOC and TAG messages GstMessage* msg = nullptr; GstMessage* msg_toc = nullptr; GstMessage* msg_tag = nullptr; while ((msg = gst_bus_timed_pop_filtered(GST_ELEMENT_BUS(pipeline), GST_SECOND, (GstMessageType)(GST_MESSAGE_TOC | GST_MESSAGE_TAG)))) { if (GST_MESSAGE_TYPE(msg) == GST_MESSAGE_TOC) { if (msg_toc) gst_message_unref(msg_toc); // Shouldn't happen, but just in case msg_toc = msg; } else if (GST_MESSAGE_TYPE(msg) == GST_MESSAGE_TAG) { if (msg_tag) gst_message_unref(msg_tag); msg_tag = msg; } } // Handle TOC message: get tracks duration if (msg_toc) { GstToc* toc; gst_message_parse_toc (msg_toc, &toc, nullptr); if (toc) { GList* entries = gst_toc_get_entries(toc); if (entries && songs.size() <= g_list_length (entries)) { int i = 0; for (GList* node = entries; node != nullptr; node = node->next) { GstTocEntry *entry = static_cast(node->data); quint64 duration = 0; gint64 start, stop; if (gst_toc_entry_get_start_stop_times (entry, &start, &stop)) duration = stop - start; songs[i++].set_length_nanosec(duration); } } } gst_message_unref(msg_toc); } emit SongsDurationLoaded(songs); // Handle TAG message: generate MusicBrainz DiscId if (msg_tag) { GstTagList* tags = nullptr; gst_message_parse_tag(msg_tag, &tags); char* string_mb = nullptr; if (gst_tag_list_get_string(tags, GST_TAG_CDDA_MUSICBRAINZ_DISCID, &string_mb)) { QString musicbrainz_discid(string_mb); qLog(Info) << "MusicBrainz discid: " << musicbrainz_discid; MusicBrainzClient* musicbrainz_client = new MusicBrainzClient; connect(musicbrainz_client, SIGNAL(Finished(const QString&, const QString&, MusicBrainzClient::ResultList)), SLOT(AudioCDTagsLoaded(const QString&, const QString&, MusicBrainzClient::ResultList))); musicbrainz_client->StartDiscIdRequest(musicbrainz_discid); g_free(string_mb); gst_message_unref(msg_tag); gst_tag_list_free(tags); } } gst_element_set_state(pipeline, GST_STATE_NULL); // This will also cause cdda_ to be unref'd. gst_object_unref(pipeline); } void CddaSongLoader::AudioCDTagsLoaded( const QString& artist, const QString& album, const MusicBrainzClient::ResultList& results) { MusicBrainzClient* musicbrainz_client = qobject_cast(sender()); musicbrainz_client->deleteLater(); SongList songs; if (results.size() == 0) return; int track_number = 1; for (const MusicBrainzClient::Result& ret : results) { Song song; song.set_artist(artist); song.set_album(album); song.set_title(ret.title_); song.set_length_nanosec(ret.duration_msec_ * kNsecPerMsec); song.set_track(track_number); song.set_year(ret.year_); song.set_id(track_number); song.set_filetype(Song::Type_Cdda); song.set_valid(true); // We need to set url: that's how playlist will find the correct item to // update song.set_url(GetUrlFromTrack(track_number++)); songs << song; } emit SongsMetadataLoaded(songs); } bool CddaSongLoader::HasChanged() { if ((cdio_ && cdda_) && cdio_get_media_changed(cdio_) != 1) { return false; } // Check if mutex is already token (i.e. init is already taking place) if (!mutex_load_.tryLock()) { return false; } mutex_load_.unlock(); return true; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/cddasongloader.h000066400000000000000000000036501260417502300247260ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CDDASONGLOADER_H #define CDDASONGLOADER_H #include #include #include // These must come after Qt includes (issue 3247) #include #include #include "core/song.h" #include "musicbrainz/musicbrainzclient.h" // This class provides a (hopefully) nice, high level interface to get CD // information and load tracks class CddaSongLoader : public QObject { Q_OBJECT public: CddaSongLoader( // Url of the CD device. Will use the default device if empty const QUrl& url = QUrl(), QObject* parent = nullptr); ~CddaSongLoader(); // Load songs. // Signals declared below will be emitted anytime new information will be available. void LoadSongs(); bool HasChanged(); signals: void SongsLoaded(const SongList& songs); void SongsDurationLoaded(const SongList& songs); void SongsMetadataLoaded(const SongList& songs); private slots: void AudioCDTagsLoaded(const QString& artist, const QString& album, const MusicBrainzClient::ResultList& results); private: QUrl GetUrlFromTrack(int track_number) const; QUrl url_; GstElement* cdda_; CdIo_t* cdio_; QMutex mutex_load_; }; #endif // CDDASONGLOADER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/connecteddevice.cpp000066400000000000000000000102011260417502300254200ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "connecteddevice.h" #include "devicelister.h" #include "devicemanager.h" #include "core/application.h" #include "core/database.h" #include "core/logging.h" #include "library/library.h" #include "library/librarybackend.h" #include "library/librarymodel.h" #include ConnectedDevice::ConnectedDevice(const QUrl& url, DeviceLister* lister, const QString& unique_id, DeviceManager* manager, Application* app, int database_id, bool first_time) : QObject(manager), app_(app), url_(url), first_time_(first_time), lister_(lister), unique_id_(unique_id), database_id_(database_id), manager_(manager), backend_(nullptr), model_(nullptr), song_count_(0) { qLog(Info) << "connected" << url << unique_id << first_time; // Create the backend in the database thread. backend_ = new LibraryBackend(); backend_->moveToThread(app_->database()->thread()); connect(backend_, SIGNAL(TotalSongCountUpdated(int)), SLOT(BackendTotalSongCountUpdated(int))); backend_->Init(app_->database(), QString("device_%1_songs").arg(database_id), QString("device_%1_directories").arg(database_id), QString("device_%1_subdirectories").arg(database_id), QString("device_%1_fts").arg(database_id)); // Create the model model_ = new LibraryModel(backend_, app_, this); } ConnectedDevice::~ConnectedDevice() { backend_->deleteLater(); } void ConnectedDevice::InitBackendDirectory(const QString& mount_point, bool first_time, bool rewrite_path) { if (first_time || backend_->GetAllDirectories().isEmpty()) { backend_->AddDirectory(mount_point); } else { if (rewrite_path) { // This is a bit of a hack. The device might not be mounted at the same // path each time, so if it's different we have to munge all the paths in // the database to fix it. This can be done entirely in sqlite so it's // relatively fast... // Get the directory it was mounted at last time. Devices only have one // directory (the root). Directory dir = backend_->GetAllDirectories()[0]; if (dir.path != mount_point) { // The directory is different, commence the munging. qLog(Info) << "Changing path from" << dir.path << "to" << mount_point; backend_->ChangeDirPath(dir.id, dir.path, mount_point); } } // Load the directory properly now backend_->LoadDirectoriesAsync(); } } void ConnectedDevice::Eject() { manager_->UnmountAsync(manager_->FindDeviceById(unique_id_)); } void ConnectedDevice::FinishCopy(bool) { lister_->UpdateDeviceFreeSpace(unique_id_); } void ConnectedDevice::FinishDelete(bool) { lister_->UpdateDeviceFreeSpace(unique_id_); } MusicStorage::TranscodeMode ConnectedDevice::GetTranscodeMode() const { int index = manager_->FindDeviceById(unique_id_); return MusicStorage::TranscodeMode( manager_->index(index).data(DeviceManager::Role_TranscodeMode).toInt()); } Song::FileType ConnectedDevice::GetTranscodeFormat() const { int index = manager_->FindDeviceById(unique_id_); return Song::FileType( manager_->index(index).data(DeviceManager::Role_TranscodeFormat).toInt()); } void ConnectedDevice::BackendTotalSongCountUpdated(int count) { song_count_ = count; emit SongCountUpdated(count); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/connecteddevice.h000066400000000000000000000051441260417502300250770ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CONNECTEDDEVICE_H #define CONNECTEDDEVICE_H #include #include #include #include #include "core/musicstorage.h" #include "core/song.h" class Application; class Database; class DeviceLister; class DeviceManager; class LibraryBackend; class LibraryModel; class ConnectedDevice : public QObject, public virtual MusicStorage, public std::enable_shared_from_this { Q_OBJECT public: ConnectedDevice(const QUrl& url, DeviceLister* lister, const QString& unique_id, DeviceManager* manager, Application* app, int database_id, bool first_time); ~ConnectedDevice(); virtual void Init() = 0; // For some devices (e.g. CD devices) we don't have callbacks to be notified // when something change: we can call this method to refresh device's state virtual void Refresh() {} virtual TranscodeMode GetTranscodeMode() const; virtual Song::FileType GetTranscodeFormat() const; DeviceLister* lister() const { return lister_; } QString unique_id() const { return unique_id_; } LibraryModel* model() const { return model_; } QUrl url() const { return url_; } int song_count() const { return song_count_; } virtual void FinishCopy(bool success); virtual void FinishDelete(bool success); virtual void Eject(); signals: void TaskStarted(int id); void SongCountUpdated(int count); protected: void InitBackendDirectory(const QString& mount_point, bool first_time, bool rewrite_path = true); protected: Application* app_; QUrl url_; bool first_time_; DeviceLister* lister_; QString unique_id_; int database_id_; DeviceManager* manager_; LibraryBackend* backend_; LibraryModel* model_; int song_count_; private slots: void BackendTotalSongCountUpdated(int count); }; #endif // CONNECTEDDEVICE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/devicedatabasebackend.cpp000066400000000000000000000111441260417502300265410ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "devicedatabasebackend.h" #include "core/database.h" #include "core/scopedtransaction.h" #include #include #include const int DeviceDatabaseBackend::kDeviceSchemaVersion = 0; DeviceDatabaseBackend::DeviceDatabaseBackend(QObject* parent) : QObject(parent) {} void DeviceDatabaseBackend::Init(Database* db) { db_ = db; } DeviceDatabaseBackend::DeviceList DeviceDatabaseBackend::GetAllDevices() { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); DeviceList ret; QSqlQuery q( "SELECT ROWID, unique_id, friendly_name, size, icon," " transcode_mode, transcode_format" " FROM devices", db); q.exec(); if (db_->CheckErrors(q)) return ret; while (q.next()) { Device dev; dev.id_ = q.value(0).toInt(); dev.unique_id_ = q.value(1).toString(); dev.friendly_name_ = q.value(2).toString(); dev.size_ = q.value(3).toLongLong(); dev.icon_name_ = q.value(4).toString(); dev.transcode_mode_ = MusicStorage::TranscodeMode(q.value(5).toInt()); dev.transcode_format_ = Song::FileType(q.value(6).toInt()); ret << dev; } return ret; } int DeviceDatabaseBackend::AddDevice(const Device& device) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); ScopedTransaction t(&db); // Insert the device into the devices table QSqlQuery q( "INSERT INTO devices (" " unique_id, friendly_name, size, icon," " transcode_mode, transcode_format)" " VALUES (:unique_id, :friendly_name, :size, :icon," " :transcode_mode, :transcode_format)", db); q.bindValue(":unique_id", device.unique_id_); q.bindValue(":friendly_name", device.friendly_name_); q.bindValue(":size", device.size_); q.bindValue(":icon", device.icon_name_); q.bindValue(":transcode_mode", device.transcode_mode_); q.bindValue(":transcode_format", device.transcode_format_); q.exec(); if (db_->CheckErrors(q)) return -1; int id = q.lastInsertId().toInt(); // Create the songs tables for the device QString filename(":schema/device-schema.sql"); QFile schema_file(filename); if (!schema_file.open(QIODevice::ReadOnly)) qFatal("Couldn't open schema file %s", filename.toUtf8().constData()); QString schema = QString::fromUtf8(schema_file.readAll()); schema.replace("%deviceid", QString::number(id)); db_->ExecSchemaCommands(db, schema, 0, true); t.Commit(); return id; } void DeviceDatabaseBackend::RemoveDevice(int id) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); ScopedTransaction t(&db); // Remove the device from the devices table QSqlQuery q("DELETE FROM devices WHERE ROWID=:id", db); q.bindValue(":id", id); q.exec(); if (db_->CheckErrors(q)) return; // Remove the songs tables for the device db.exec(QString("DROP TABLE device_%1_songs").arg(id)); db.exec(QString("DROP TABLE device_%1_fts").arg(id)); db.exec(QString("DROP TABLE device_%1_directories").arg(id)); db.exec(QString("DROP TABLE device_%1_subdirectories").arg(id)); t.Commit(); } void DeviceDatabaseBackend::SetDeviceOptions(int id, const QString& friendly_name, const QString& icon_name, MusicStorage::TranscodeMode mode, Song::FileType format) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery q( "UPDATE devices" " SET friendly_name=:friendly_name," " icon=:icon_name," " transcode_mode=:transcode_mode," " transcode_format=:transcode_format" " WHERE ROWID=:id", db); q.bindValue(":friendly_name", friendly_name); q.bindValue(":icon_name", icon_name); q.bindValue(":transcode_mode", mode); q.bindValue(":transcode_format", format); q.bindValue(":id", id); q.exec(); db_->CheckErrors(q); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/devicedatabasebackend.h000066400000000000000000000034061260417502300262100ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef DEVICEDATABASEBACKEND_H #define DEVICEDATABASEBACKEND_H #include #include "core/musicstorage.h" #include "core/song.h" class Database; class DeviceDatabaseBackend : public QObject { Q_OBJECT public: Q_INVOKABLE DeviceDatabaseBackend(QObject* parent = nullptr); struct Device { Device() : id_(-1) {} int id_; QString unique_id_; QString friendly_name_; quint64 size_; QString icon_name_; MusicStorage::TranscodeMode transcode_mode_; Song::FileType transcode_format_; }; typedef QList DeviceList; static const int kDeviceSchemaVersion; void Init(Database* db); Database* db() const { return db_; } DeviceList GetAllDevices(); int AddDevice(const Device& device); void RemoveDevice(int id); void SetDeviceOptions(int id, const QString& friendly_name, const QString& icon_name, MusicStorage::TranscodeMode mode, Song::FileType format); private: Database* db_; }; #endif // DEVICEDATABASEBACKEND_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/devicekitlister.cpp000066400000000000000000000213131260417502300254760ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "config.h" #include "devicekitlister.h" #include "filesystemdevice.h" #include "core/logging.h" #include "core/utilities.h" #include "dbus/udisks.h" #include "dbus/udisksdevice.h" #ifdef HAVE_LIBGPOD #include "gpoddevice.h" #endif #include #include DeviceKitLister::DeviceKitLister() {} DeviceKitLister::~DeviceKitLister() { qLog(Debug) << __PRETTY_FUNCTION__; } QString DeviceKitLister::DeviceData::unique_id() const { return QString("DeviceKit/%1/%2/%3/%4") .arg(drive_serial, drive_vendor, drive_model) .arg(device_size); } void DeviceKitLister::Init() { interface_.reset(new OrgFreedesktopUDisksInterface( OrgFreedesktopUDisksInterface::staticInterfaceName(), "/org/freedesktop/UDisks", QDBusConnection::systemBus())); // Get all the devices currently attached QDBusPendingReply > reply = interface_->EnumerateDevices(); reply.waitForFinished(); if (!reply.isValid()) { qLog(Warning) << "Error enumerating DeviceKit-disks devices:" << reply.error().name() << reply.error().message(); interface_.reset(); return; } // Listen for changes connect(interface_.get(), SIGNAL(DeviceAdded(QDBusObjectPath)), SLOT(DBusDeviceAdded(QDBusObjectPath))); connect(interface_.get(), SIGNAL(DeviceRemoved(QDBusObjectPath)), SLOT(DBusDeviceRemoved(QDBusObjectPath))); connect(interface_.get(), SIGNAL(DeviceChanged(QDBusObjectPath)), SLOT(DBusDeviceChanged(QDBusObjectPath))); // Get information about each one QMap device_data; for (const QDBusObjectPath& path : reply.value()) { DeviceData data = ReadDeviceData(path); if (data.suitable) device_data[data.unique_id()] = data; } // Update the internal cache { QMutexLocker l(&mutex_); device_data_ = device_data; } // Notify about the changes for (const QString& id : device_data.keys()) { emit DeviceAdded(id); } } QStringList DeviceKitLister::DeviceUniqueIDs() { QMutexLocker l(&mutex_); return device_data_.keys(); } QVariantList DeviceKitLister::DeviceIcons(const QString& id) { QString path = LockAndGetDeviceInfo(id, &DeviceData::device_mount_paths)[0]; return QVariantList() << GuessIconForPath(path) << GuessIconForModel(DeviceManufacturer(id), DeviceModel(id)) << LockAndGetDeviceInfo( id, &DeviceData::device_presentation_icon_name); } QString DeviceKitLister::DeviceManufacturer(const QString& id) { return LockAndGetDeviceInfo(id, &DeviceData::drive_vendor); } QString DeviceKitLister::DeviceModel(const QString& id) { return LockAndGetDeviceInfo(id, &DeviceData::drive_model); } quint64 DeviceKitLister::DeviceCapacity(const QString& id) { return LockAndGetDeviceInfo(id, &DeviceData::device_size); } quint64 DeviceKitLister::DeviceFreeSpace(const QString& id) { return LockAndGetDeviceInfo(id, &DeviceData::free_space); } QVariantMap DeviceKitLister::DeviceHardwareInfo(const QString& id) { QVariantMap ret; QMutexLocker l(&mutex_); if (!device_data_.contains(id)) return ret; const DeviceData& data = device_data_[id]; ret[QT_TR_NOOP("DBus path")] = data.dbus_path; ret[QT_TR_NOOP("Serial number")] = data.drive_serial; ret[QT_TR_NOOP("Mount points")] = data.device_mount_paths.join(", "); ret[QT_TR_NOOP("Device")] = data.device_file; return ret; } QString DeviceKitLister::MakeFriendlyName(const QString& id) { QMutexLocker l(&mutex_); if (!device_data_.contains(id)) return QString(); const DeviceData& data = device_data_[id]; if (!data.device_presentation_name.isEmpty()) return data.device_presentation_name; if (!data.drive_model.isEmpty() && !data.drive_vendor.isEmpty()) return data.drive_vendor + " " + data.drive_model; if (!data.drive_model.isEmpty()) return data.drive_model; return data.drive_serial; } DeviceKitLister::DeviceData DeviceKitLister::ReadDeviceData( const QDBusObjectPath& path) const { DeviceData ret; OrgFreedesktopUDisksDeviceInterface device( OrgFreedesktopUDisksInterface::staticInterfaceName(), path.path(), QDBusConnection::systemBus()); if (!device.isValid()) { qLog(Warning) << "Error connecting to the device interface on" << path.path(); return ret; } // Don't do anything with internal drives, hidden drives, or partition tables if (device.deviceIsSystemInternal() || device.devicePresentationHide() || device.deviceMountPaths().isEmpty() || device.deviceIsPartitionTable()) { return ret; } ret.suitable = true; ret.dbus_path = path.path(); ret.drive_serial = device.driveSerial(); ret.drive_model = device.driveModel(); ret.drive_vendor = device.driveVendor(); ret.device_file = device.deviceFile(); ret.device_presentation_name = device.devicePresentationName(); ret.device_presentation_icon_name = device.devicePresentationIconName(); ret.device_size = device.deviceSize(); ret.device_mount_paths = device.deviceMountPaths(); // Get free space info if (!ret.device_mount_paths.isEmpty()) ret.free_space = Utilities::FileSystemFreeSpace(ret.device_mount_paths[0]); return ret; } void DeviceKitLister::DBusDeviceAdded(const QDBusObjectPath& path) { DeviceData data = ReadDeviceData(path); if (!data.suitable) return; { QMutexLocker l(&mutex_); device_data_[data.unique_id()] = data; } emit DeviceAdded(data.unique_id()); } void DeviceKitLister::DBusDeviceRemoved(const QDBusObjectPath& path) { QString id; { QMutexLocker l(&mutex_); id = FindUniqueIdByPath(path); if (id.isNull()) return; device_data_.remove(id); } emit DeviceRemoved(id); } void DeviceKitLister::DBusDeviceChanged(const QDBusObjectPath& path) { bool already_known = false; { QMutexLocker l(&mutex_); already_known = !FindUniqueIdByPath(path).isNull(); } DeviceData data = ReadDeviceData(path); if (already_known && !data.suitable) DBusDeviceRemoved(path); else if (!already_known && data.suitable) DBusDeviceAdded(path); else if (already_known && data.suitable) { { QMutexLocker l(&mutex_); device_data_[data.unique_id()] = data; } emit DeviceChanged(data.unique_id()); } } QString DeviceKitLister::FindUniqueIdByPath(const QDBusObjectPath& path) const { for (const DeviceData& data : device_data_) { if (data.dbus_path == path.path()) return data.unique_id(); } return QString(); } QList DeviceKitLister::MakeDeviceUrls(const QString& id) { QString mount_point = LockAndGetDeviceInfo(id, &DeviceData::device_mount_paths)[0]; return QList() << MakeUrlFromLocalPath(mount_point); } void DeviceKitLister::UnmountDevice(const QString& id) { QString path = LockAndGetDeviceInfo(id, &DeviceData::dbus_path); OrgFreedesktopUDisksDeviceInterface device( OrgFreedesktopUDisksInterface::staticInterfaceName(), path, QDBusConnection::systemBus()); if (!device.isValid()) { qLog(Warning) << "Error connecting to the device interface on" << path; return; } // Get the device's parent drive QString drive_path = device.partitionSlave().path(); OrgFreedesktopUDisksDeviceInterface drive( OrgFreedesktopUDisksInterface::staticInterfaceName(), drive_path, QDBusConnection::systemBus()); if (!drive.isValid()) { qLog(Warning) << "Error connecting to the drive interface on" << drive_path; return; } // Unmount the filesystem QDBusPendingReply<> reply = device.FilesystemUnmount(QStringList()); reply.waitForFinished(); // Eject the drive drive.DriveEject(QStringList()); // Don't bother waiting for the eject to finish } void DeviceKitLister::UpdateDeviceFreeSpace(const QString& id) { { QMutexLocker l(&mutex_); if (!device_data_.contains(id)) return; DeviceData& data = device_data_[id]; if (!data.device_mount_paths.isEmpty()) data.free_space = Utilities::FileSystemFreeSpace(data.device_mount_paths[0]); } emit DeviceChanged(id); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/devicekitlister.h000066400000000000000000000055541260417502300251540ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef DEVICEKITLISTER_H #define DEVICEKITLISTER_H #include #include #include #include "devicelister.h" class OrgFreedesktopUDisksInterface; class QDBusObjectPath; class DeviceKitLister : public DeviceLister { Q_OBJECT public: DeviceKitLister(); ~DeviceKitLister(); QStringList DeviceUniqueIDs(); QVariantList DeviceIcons(const QString& id); QString DeviceManufacturer(const QString& id); QString DeviceModel(const QString& id); quint64 DeviceCapacity(const QString& id); quint64 DeviceFreeSpace(const QString& id); QVariantMap DeviceHardwareInfo(const QString& id); QString MakeFriendlyName(const QString& id); QList MakeDeviceUrls(const QString& id); void UnmountDevice(const QString& id); public slots: void UpdateDeviceFreeSpace(const QString& id); protected: void Init(); private slots: void DBusDeviceAdded(const QDBusObjectPath& path); void DBusDeviceRemoved(const QDBusObjectPath& path); void DBusDeviceChanged(const QDBusObjectPath& path); private: struct DeviceData { DeviceData() : suitable(false), device_size(0), free_space(0) {} QString unique_id() const; bool suitable; QString dbus_path; QString drive_serial; QString drive_model; QString drive_vendor; QString device_file; QString device_presentation_name; QString device_presentation_icon_name; QStringList device_mount_paths; quint64 device_size; quint64 free_space; }; DeviceData ReadDeviceData(const QDBusObjectPath& path) const; // You MUST hold the mutex while calling this function QString FindUniqueIdByPath(const QDBusObjectPath& path) const; template T LockAndGetDeviceInfo(const QString& id, T DeviceData::*field); private: std::unique_ptr interface_; QMutex mutex_; QMap device_data_; }; template T DeviceKitLister::LockAndGetDeviceInfo(const QString& id, T DeviceData::*field) { QMutexLocker l(&mutex_); if (!device_data_.contains(id)) return T(); return device_data_[id].*field; } #endif // DEVICEKITLISTER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/devicelister.cpp000066400000000000000000000125721260417502300247750ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "config.h" #include "devicelister.h" #include #include #include #include #include #ifdef HAVE_LIBGPOD #include #endif DeviceLister::DeviceLister() : thread_(nullptr) {} DeviceLister::~DeviceLister() { if (thread_) { thread_->quit(); thread_->wait(1000); } } void DeviceLister::Start() { thread_ = new QThread; connect(thread_, SIGNAL(started()), SLOT(ThreadStarted())); moveToThread(thread_); thread_->start(); } void DeviceLister::ThreadStarted() { Init(); } namespace { #ifdef HAVE_LIBGPOD QString GetIpodColour(Itdb_IpodModel model) { switch (model) { case ITDB_IPOD_MODEL_MINI_GREEN: case ITDB_IPOD_MODEL_NANO_GREEN: case ITDB_IPOD_MODEL_SHUFFLE_GREEN: return "green"; case ITDB_IPOD_MODEL_MINI_BLUE: case ITDB_IPOD_MODEL_NANO_BLUE: case ITDB_IPOD_MODEL_SHUFFLE_BLUE: return "blue"; case ITDB_IPOD_MODEL_MINI_PINK: case ITDB_IPOD_MODEL_NANO_PINK: case ITDB_IPOD_MODEL_SHUFFLE_PINK: return "pink"; case ITDB_IPOD_MODEL_MINI_GOLD: return "gold"; case ITDB_IPOD_MODEL_NANO_WHITE: case ITDB_IPOD_MODEL_VIDEO_WHITE: return "white"; case ITDB_IPOD_MODEL_NANO_SILVER: case ITDB_IPOD_MODEL_CLASSIC_SILVER: return "silver"; case ITDB_IPOD_MODEL_NANO_RED: case ITDB_IPOD_MODEL_SHUFFLE_RED: return "red"; case ITDB_IPOD_MODEL_NANO_YELLOW: return "yellow"; case ITDB_IPOD_MODEL_NANO_PURPLE: case ITDB_IPOD_MODEL_SHUFFLE_PURPLE: return "purple"; case ITDB_IPOD_MODEL_NANO_ORANGE: case ITDB_IPOD_MODEL_SHUFFLE_ORANGE: return "orange"; case ITDB_IPOD_MODEL_NANO_BLACK: case ITDB_IPOD_MODEL_VIDEO_BLACK: case ITDB_IPOD_MODEL_CLASSIC_BLACK: return "black"; default: return QString(); } } QString GetIpodModel(Itdb_IpodModel model) { switch (model) { case ITDB_IPOD_MODEL_MINI: case ITDB_IPOD_MODEL_MINI_BLUE: case ITDB_IPOD_MODEL_MINI_PINK: case ITDB_IPOD_MODEL_MINI_GREEN: case ITDB_IPOD_MODEL_MINI_GOLD: return "mini"; case ITDB_IPOD_MODEL_NANO_WHITE: case ITDB_IPOD_MODEL_NANO_BLACK: case ITDB_IPOD_MODEL_NANO_SILVER: case ITDB_IPOD_MODEL_NANO_BLUE: case ITDB_IPOD_MODEL_NANO_GREEN: case ITDB_IPOD_MODEL_NANO_PINK: case ITDB_IPOD_MODEL_NANO_RED: case ITDB_IPOD_MODEL_NANO_YELLOW: case ITDB_IPOD_MODEL_NANO_PURPLE: case ITDB_IPOD_MODEL_NANO_ORANGE: return "nano"; case ITDB_IPOD_MODEL_SHUFFLE: case ITDB_IPOD_MODEL_SHUFFLE_SILVER: case ITDB_IPOD_MODEL_SHUFFLE_PINK: case ITDB_IPOD_MODEL_SHUFFLE_BLUE: case ITDB_IPOD_MODEL_SHUFFLE_GREEN: case ITDB_IPOD_MODEL_SHUFFLE_ORANGE: case ITDB_IPOD_MODEL_SHUFFLE_RED: return "shuffle"; case ITDB_IPOD_MODEL_COLOR: case ITDB_IPOD_MODEL_REGULAR: case ITDB_IPOD_MODEL_CLASSIC_SILVER: case ITDB_IPOD_MODEL_CLASSIC_BLACK: return "standard"; case ITDB_IPOD_MODEL_COLOR_U2: case ITDB_IPOD_MODEL_REGULAR_U2: return "U2"; default: return QString(); } } #endif } QUrl DeviceLister::MakeUrlFromLocalPath(const QString& path) const { if (IsIpod(path)) { QUrl ret; ret.setScheme("ipod"); ret.setPath(QDir::fromNativeSeparators(path)); return ret; } return QUrl::fromLocalFile(path); } bool DeviceLister::IsIpod(const QString& path) const { return QFile::exists(path + "/iTunes_Control") || QFile::exists(path + "/iPod_Control") || QFile::exists(path + "/iTunes/iTunes_Control"); } QStringList DeviceLister::GuessIconForPath(const QString& path) { QStringList ret; #ifdef HAVE_LIBGPOD if (IsIpod(path)) { Itdb_Device* device = itdb_device_new(); itdb_device_set_mountpoint(device, path.toLocal8Bit().constData()); const Itdb_IpodInfo* info = itdb_device_get_ipod_info(device); QString colour = GetIpodColour(info->ipod_model); QString model = GetIpodModel(info->ipod_model); itdb_device_free(device); if (!colour.isEmpty()) { QString colour_icon = "multimedia-player-ipod-%1-%2"; ret << colour_icon.arg(model, colour); } if (!model.isEmpty()) { QString model_icon = "multimedia-player-ipod-%1"; ret << model_icon.arg(model); } } #endif return ret; } QStringList DeviceLister::GuessIconForModel(const QString& vendor, const QString& model) { QStringList ret; if (vendor.startsWith("Google") && model.contains("Nexus")) { ret << "phone-google-nexus-one"; } return ret; } int DeviceLister::MountDevice(const QString& id) { const int ret = next_mount_request_id_++; emit DeviceMounted(id, ret, true); return ret; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/devicelister.h000066400000000000000000000060741260417502300244420ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef DEVICELISTER_H #define DEVICELISTER_H #include #include class ConnectedDevice; class DeviceManager; class DeviceLister : public QObject { Q_OBJECT public: DeviceLister(); virtual ~DeviceLister(); // Tries to start the thread and initialise the engine. This object will be // moved to the new thread. void Start(); // If two listers know about the same device, then the metadata will get // taken from the one with the highest priority. virtual int priority() const { return 100; } // Query information about the devices that are available. Must be // thread-safe. virtual QStringList DeviceUniqueIDs() = 0; virtual QVariantList DeviceIcons(const QString& id) = 0; virtual QString DeviceManufacturer(const QString& id) = 0; virtual QString DeviceModel(const QString& id) = 0; virtual quint64 DeviceCapacity(const QString& id) = 0; virtual quint64 DeviceFreeSpace(const QString& id) = 0; virtual QVariantMap DeviceHardwareInfo(const QString& id) = 0; virtual bool DeviceNeedsMount(const QString& id) { return false; } // When connecting to a device for the first time, do we want an user's // confirmation for scanning it? (by default yes) virtual bool AskForScan(const QString&) const { return true; } virtual QString MakeFriendlyName(const QString& id) = 0; virtual QList MakeDeviceUrls(const QString& id) = 0; // Ensure the device is mounted. This should run asynchronously and emit // DeviceMounted when it's done. virtual int MountDevice(const QString& id); // Do whatever needs to be done to safely remove the device. virtual void UnmountDevice(const QString& id) = 0; public slots: virtual void UpdateDeviceFreeSpace(const QString& id) = 0; virtual void ShutDown() {} signals: void DeviceAdded(const QString& id); void DeviceRemoved(const QString& id); void DeviceChanged(const QString& id); void DeviceMounted(const QString& id, int request_id, bool success); protected: virtual void Init() = 0; QUrl MakeUrlFromLocalPath(const QString& path) const; bool IsIpod(const QString& path) const; QStringList GuessIconForPath(const QString& path); QStringList GuessIconForModel(const QString& vendor, const QString& model); protected: QThread* thread_; int next_mount_request_id_; private slots: void ThreadStarted(); }; #endif // DEVICELISTER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/devicemanager.cpp000066400000000000000000000551311260417502300251030ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "devicemanager.h" #include #include #include #include #include #include #include #include #include #include "config.h" #include "devicedatabasebackend.h" #include "devicekitlister.h" #include "devicestatefiltermodel.h" #include "filesystemdevice.h" #include "core/application.h" #include "core/concurrentrun.h" #include "core/database.h" #include "core/logging.h" #include "core/musicstorage.h" #include "core/taskmanager.h" #include "core/utilities.h" #include "ui/iconloader.h" #ifdef HAVE_AUDIOCD #include "cddalister.h" #include "cddadevice.h" #endif #ifdef Q_OS_DARWIN #include "macdevicelister.h" #endif #ifdef HAVE_LIBGPOD #include "gpoddevice.h" #endif #ifdef HAVE_GIO #include "giolister.h" #endif #ifdef HAVE_LIBMTP #include "mtpdevice.h" #endif using std::bind; const int DeviceManager::kDeviceIconSize = 32; const int DeviceManager::kDeviceIconOverlaySize = 16; DeviceManager::DeviceInfo::DeviceInfo() : database_id_(-1), transcode_mode_(MusicStorage::Transcode_Unsupported), transcode_format_(Song::Type_Unknown), task_percentage_(-1) {} DeviceDatabaseBackend::Device DeviceManager::DeviceInfo::SaveToDb() const { DeviceDatabaseBackend::Device ret; ret.friendly_name_ = friendly_name_; ret.size_ = size_; ret.id_ = database_id_; ret.icon_name_ = icon_name_; ret.transcode_mode_ = transcode_mode_; ret.transcode_format_ = transcode_format_; QStringList unique_ids; for (const Backend& backend : backends_) { unique_ids << backend.unique_id_; } ret.unique_id_ = unique_ids.join(","); return ret; } void DeviceManager::DeviceInfo::InitFromDb( const DeviceDatabaseBackend::Device& dev) { database_id_ = dev.id_; friendly_name_ = dev.friendly_name_; size_ = dev.size_; transcode_mode_ = dev.transcode_mode_; transcode_format_ = dev.transcode_format_; QStringList icon_names = dev.icon_name_.split(','); QVariantList icons; for (const QString& icon_name : icon_names) { icons << icon_name; } LoadIcon(icons, friendly_name_); QStringList unique_ids = dev.unique_id_.split(','); for (const QString& id : unique_ids) { backends_ << Backend(nullptr, id); } } void DeviceManager::DeviceInfo::LoadIcon(const QVariantList& icons, const QString& name_hint) { if (icons.isEmpty()) { icon_name_ = "drive-removable-media-usb-pendrive"; icon_ = IconLoader::Load(icon_name_); return; } // Try to load the icon with that exact name first for (const QVariant& icon : icons) { if (!icon.value().isNull()) { icon_ = QIcon(icon.value()); return; } else { icon_ = IconLoader::Load(icon.toString()); if (!icon_.isNull()) { icon_name_ = icon.toString(); return; } } } QString hint = QString(icons.first().toString() + name_hint).toLower(); // If that failed than try to guess if it's a phone or ipod. Fall back on // a usb memory stick icon. if (hint.contains("phone")) icon_name_ = "phone"; else if (hint.contains("ipod") || hint.contains("apple")) icon_name_ = "multimedia-player-ipod-standard-monochrome"; else icon_name_ = "drive-removable-media-usb-pendrive"; icon_ = IconLoader::Load(icon_name_); } const DeviceManager::DeviceInfo::Backend* DeviceManager::DeviceInfo::BestBackend() const { int best_priority = -1; const Backend* ret = nullptr; for (int i = 0; i < backends_.count(); ++i) { if (backends_[i].lister_ && backends_[i].lister_->priority() > best_priority) { best_priority = backends_[i].lister_->priority(); ret = &(backends_[i]); } } if (!ret && !backends_.isEmpty()) return &(backends_[0]); return ret; } DeviceManager::DeviceManager(Application* app, QObject* parent) : QAbstractListModel(parent), app_(app), not_connected_overlay_(IconLoader::Load("edit-delete")) { thread_pool_.setMaxThreadCount(1); connect(app_->task_manager(), SIGNAL(TasksChanged()), SLOT(TasksChanged())); // Create the backend in the database thread backend_ = new DeviceDatabaseBackend; backend_->moveToThread(app_->database()->thread()); backend_->Init(app_->database()); // This reads from the database and contends on the database mutex, which can // be very slow on startup. ConcurrentRun::Run(&thread_pool_, bind(&DeviceManager::LoadAllDevices, this)); // This proxy model only shows connected devices connected_devices_model_ = new DeviceStateFilterModel(this); connected_devices_model_->setSourceModel(this); // CD devices are detected via the DiskArbitration framework instead on Darwin. #if defined(HAVE_AUDIOCD) && !defined(Q_OS_DARWIN) AddLister(new CddaLister); #endif #ifdef HAVE_DEVICEKIT AddLister(new DeviceKitLister); #endif #ifdef HAVE_GIO AddLister(new GioLister); #endif #ifdef Q_OS_DARWIN AddLister(new MacDeviceLister); #endif AddDeviceClass(); #ifdef HAVE_AUDIOCD AddDeviceClass(); #endif #ifdef HAVE_LIBGPOD AddDeviceClass(); #endif #ifdef HAVE_LIBMTP AddDeviceClass(); #endif } DeviceManager::~DeviceManager() { for (DeviceLister* lister : listers_) { lister->ShutDown(); delete lister; } backend_->deleteLater(); } void DeviceManager::LoadAllDevices() { Q_ASSERT(QThread::currentThread() != qApp->thread()); DeviceDatabaseBackend::DeviceList devices = backend_->GetAllDevices(); for (const DeviceDatabaseBackend::Device& device : devices) { DeviceInfo info; info.InitFromDb(device); devices_ << info; } } int DeviceManager::rowCount(const QModelIndex&) const { return devices_.count(); } QVariant DeviceManager::data(const QModelIndex& index, int role) const { if (!index.isValid() || index.column() != 0) return QVariant(); const DeviceInfo& info = devices_[index.row()]; switch (role) { case Qt::DisplayRole: { QString text; if (!info.friendly_name_.isEmpty()) text = info.friendly_name_; else text = info.BestBackend()->unique_id_; if (info.size_) text = text + QString(" (%1)").arg(Utilities::PrettySize(info.size_)); if (info.device_.get()) info.device_->Refresh(); return text; } case Qt::DecorationRole: { QPixmap pixmap = info.icon_.pixmap(kDeviceIconSize); if (info.backends_.isEmpty() || !info.BestBackend()->lister_) { // Disconnected but remembered QPainter p(&pixmap); p.drawPixmap(kDeviceIconSize - kDeviceIconOverlaySize, kDeviceIconSize - kDeviceIconOverlaySize, not_connected_overlay_.pixmap(kDeviceIconOverlaySize)); } return pixmap; } case Role_FriendlyName: return info.friendly_name_; case Role_UniqueId: return info.BestBackend()->unique_id_; case Role_IconName: return info.icon_name_; case Role_Capacity: case MusicStorage::Role_Capacity: return info.size_; case Role_FreeSpace: case MusicStorage::Role_FreeSpace: return info.BestBackend()->lister_ ? info.BestBackend()->lister_->DeviceFreeSpace( info.BestBackend()->unique_id_) : QVariant(); case Role_State: if (info.device_) return State_Connected; if (info.BestBackend()->lister_) { if (info.BestBackend()->lister_->DeviceNeedsMount( info.BestBackend()->unique_id_)) return State_NotMounted; return State_NotConnected; } return State_Remembered; case Role_UpdatingPercentage: if (info.task_percentage_ == -1) return QVariant(); return info.task_percentage_; case MusicStorage::Role_Storage: if (!info.device_ && info.database_id_ != -1) const_cast(this)->Connect(index.row()); if (!info.device_) return QVariant(); return QVariant::fromValue>(info.device_); case MusicStorage::Role_StorageForceConnect: if (!info.device_) { if (info.database_id_ == -1 && !info.BestBackend()->lister_->DeviceNeedsMount( info.BestBackend()->unique_id_)) { if (info.BestBackend()->lister_->AskForScan( info.BestBackend()->unique_id_)) { std::unique_ptr dialog(new QMessageBox( QMessageBox::Information, tr("Connect device"), tr("This is the first time you have connected this device. " "Clementine will now scan the device to find music files - " "this may take some time."), QMessageBox::Cancel)); QPushButton* connect = dialog->addButton(tr("Connect device"), QMessageBox::AcceptRole); dialog->exec(); if (dialog->clickedButton() != connect) return QVariant(); } } const_cast(this)->Connect(index.row()); } if (!info.device_) return QVariant(); return QVariant::fromValue>(info.device_); case Role_MountPath: { if (!info.device_) return QVariant(); QString ret = info.device_->url().path(); #ifdef Q_OS_WIN32 if (ret.startsWith('/')) ret.remove(0, 1); #endif return QDir::toNativeSeparators(ret); } case Role_TranscodeMode: return info.transcode_mode_; case Role_TranscodeFormat: return info.transcode_format_; case Role_SongCount: if (!info.device_) return QVariant(); return info.device_->song_count(); default: return QVariant(); } } void DeviceManager::AddLister(DeviceLister* lister) { listers_ << lister; connect(lister, SIGNAL(DeviceAdded(QString)), SLOT(PhysicalDeviceAdded(QString))); connect(lister, SIGNAL(DeviceRemoved(QString)), SLOT(PhysicalDeviceRemoved(QString))); connect(lister, SIGNAL(DeviceChanged(QString)), SLOT(PhysicalDeviceChanged(QString))); lister->Start(); } int DeviceManager::FindDeviceById(const QString& id) const { for (int i = 0; i < devices_.count(); ++i) { for (const DeviceInfo::Backend& backend : devices_[i].backends_) { if (backend.unique_id_ == id) return i; } } return -1; } int DeviceManager::FindDeviceByUrl(const QList& urls) const { if (urls.isEmpty()) return -1; for (int i = 0; i < devices_.count(); ++i) { for (const DeviceInfo::Backend& backend : devices_[i].backends_) { if (!backend.lister_) continue; QList device_urls = backend.lister_->MakeDeviceUrls(backend.unique_id_); for (const QUrl& url : device_urls) { if (urls.contains(url)) return i; } } } return -1; } void DeviceManager::PhysicalDeviceAdded(const QString& id) { DeviceLister* lister = qobject_cast(sender()); qLog(Info) << "Device added:" << id; // Do we have this device already? int i = FindDeviceById(id); if (i != -1) { DeviceInfo& info = devices_[i]; for (int backend_index = 0; backend_index < info.backends_.count(); ++backend_index) { if (info.backends_[backend_index].unique_id_ == id) { info.backends_[backend_index].lister_ = lister; break; } } emit dataChanged(index(i, 0), index(i, 0)); } else { // Check if we have another device with the same URL i = FindDeviceByUrl(lister->MakeDeviceUrls(id)); if (i != -1) { // Add this device's lister to the existing device DeviceInfo& info = devices_[i]; info.backends_ << DeviceInfo::Backend(lister, id); // If the user hasn't saved the device in the DB yet then overwrite the // device's name and icon etc. if (info.database_id_ == -1 && info.BestBackend()->lister_ == lister) { info.friendly_name_ = lister->MakeFriendlyName(id); info.size_ = lister->DeviceCapacity(id); info.LoadIcon(lister->DeviceIcons(id), info.friendly_name_); } emit dataChanged(index(i, 0), index(i, 0)); } else { // It's a completely new device DeviceInfo info; info.backends_ << DeviceInfo::Backend(lister, id); info.friendly_name_ = lister->MakeFriendlyName(id); info.size_ = lister->DeviceCapacity(id); info.LoadIcon(lister->DeviceIcons(id), info.friendly_name_); beginInsertRows(QModelIndex(), devices_.count(), devices_.count()); devices_ << info; endInsertRows(); } } } void DeviceManager::PhysicalDeviceRemoved(const QString& id) { DeviceLister* lister = qobject_cast(sender()); qLog(Info) << "Device removed:" << id; int i = FindDeviceById(id); if (i == -1) { // Shouldn't happen return; } DeviceInfo& info = devices_[i]; if (info.database_id_ != -1) { // Keep the structure around, but just "disconnect" it for (int backend_index = 0; backend_index < info.backends_.count(); ++backend_index) { if (info.backends_[backend_index].unique_id_ == id) { info.backends_[backend_index].lister_ = nullptr; break; } } if (info.device_ && info.device_->lister() == lister) info.device_.reset(); if (!info.device_) emit DeviceDisconnected(i); emit dataChanged(index(i, 0), index(i, 0)); } else { // If this was the last lister for the device then remove it from the model for (int backend_index = 0; backend_index < info.backends_.count(); ++backend_index) { if (info.backends_[backend_index].unique_id_ == id) { info.backends_.removeAt(backend_index); break; } } if (info.backends_.isEmpty()) { beginRemoveRows(QModelIndex(), i, i); devices_.removeAt(i); for (const QModelIndex& idx : persistentIndexList()) { if (idx.row() == i) changePersistentIndex(idx, QModelIndex()); else if (idx.row() > i) changePersistentIndex(idx, index(idx.row() - 1, idx.column())); } endRemoveRows(); } } } void DeviceManager::PhysicalDeviceChanged(const QString& id) { DeviceLister* lister = qobject_cast(sender()); Q_UNUSED(lister); int i = FindDeviceById(id); if (i == -1) { // Shouldn't happen return; } // TODO } std::shared_ptr DeviceManager::Connect(int row) { DeviceInfo& info = devices_[row]; if (info.device_) // Already connected return info.device_; std::shared_ptr ret; if (!info.BestBackend()->lister_) // Not physically connected return ret; if (info.BestBackend()->lister_->DeviceNeedsMount( info.BestBackend()->unique_id_)) { // Mount the device info.BestBackend()->lister_->MountDevice(info.BestBackend()->unique_id_); return ret; } bool first_time = (info.database_id_ == -1); if (first_time) { // We haven't stored this device in the database before info.database_id_ = backend_->AddDevice(info.SaveToDb()); } // Get the device URLs QList urls = info.BestBackend()->lister_->MakeDeviceUrls( info.BestBackend()->unique_id_); if (urls.isEmpty()) return ret; // Take the first URL that we have a handler for QUrl device_url; for (const QUrl& url : urls) { qLog(Info) << "Connecting" << url; // Find a device class for this URL's scheme if (device_classes_.contains(url.scheme())) { device_url = url; break; } // If we get here it means that this URL scheme wasn't supported. If it // was "ipod" or "mtp" then the user compiled out support and the device // won't work properly. if (url.scheme() == "mtp" || url.scheme() == "gphoto2") { if (QMessageBox::critical( nullptr, tr("This device will not work properly"), tr("This is an MTP device, but you compiled Clementine without " "libmtp support.") + " " + tr("If you continue, this device will work slowly and " "songs copied to it may not work."), QMessageBox::Abort, QMessageBox::Ignore) == QMessageBox::Abort) return ret; } if (url.scheme() == "ipod") { if (QMessageBox::critical( nullptr, tr("This device will not work properly"), tr("This is an iPod, but you compiled Clementine without libgpod " "support.") + " " + tr("If you continue, this device will work slowly and " "songs copied to it may not work."), QMessageBox::Abort, QMessageBox::Ignore) == QMessageBox::Abort) return ret; } } if (device_url.isEmpty()) { // Munge the URL list into a string list QStringList url_strings; for (const QUrl& url : urls) { url_strings << url.toString(); } app_->AddError(tr("This type of device is not supported: %1") .arg(url_strings.join(", "))); return ret; } QMetaObject meta_object = device_classes_.value(device_url.scheme()); QObject* instance = meta_object.newInstance( Q_ARG(QUrl, device_url), Q_ARG(DeviceLister*, info.BestBackend()->lister_), Q_ARG(QString, info.BestBackend()->unique_id_), Q_ARG(DeviceManager*, this), Q_ARG(Application*, app_), Q_ARG(int, info.database_id_), Q_ARG(bool, first_time)); ret.reset(static_cast(instance)); if (!ret) { qLog(Warning) << "Could not create device for" << device_url.toString(); } else { ret->Init(); info.device_ = ret; emit dataChanged(index(row), index(row)); connect(info.device_.get(), SIGNAL(TaskStarted(int)), SLOT(DeviceTaskStarted(int))); connect(info.device_.get(), SIGNAL(SongCountUpdated(int)), SLOT(DeviceSongCountUpdated(int))); } emit DeviceConnected(row); return ret; } std::shared_ptr DeviceManager::GetConnectedDevice(int row) const { return devices_[row].device_; } int DeviceManager::GetDatabaseId(int row) const { return devices_[row].database_id_; } DeviceLister* DeviceManager::GetLister(int row) const { return devices_[row].BestBackend()->lister_; } void DeviceManager::Disconnect(int row) { DeviceInfo& info = devices_[row]; if (!info.device_) // Already disconnected return; info.device_.reset(); emit DeviceDisconnected(row); emit dataChanged(index(row), index(row)); } void DeviceManager::Forget(int row) { DeviceInfo& info = devices_[row]; if (info.database_id_ == -1) return; if (info.device_) Disconnect(row); backend_->RemoveDevice(info.database_id_); info.database_id_ = -1; if (!info.BestBackend()->lister_) { // It's not attached any more so remove it from the list beginRemoveRows(QModelIndex(), row, row); devices_.removeAt(row); for (const QModelIndex& idx : persistentIndexList()) { if (idx.row() == row) changePersistentIndex(idx, QModelIndex()); else if (idx.row() > row) changePersistentIndex(idx, index(idx.row() - 1, idx.column())); } endRemoveRows(); } else { // It's still attached, set the name and icon back to what they were // originally const QString id = info.BestBackend()->unique_id_; info.friendly_name_ = info.BestBackend()->lister_->MakeFriendlyName(id); info.LoadIcon(info.BestBackend()->lister_->DeviceIcons(id), info.friendly_name_); dataChanged(index(row, 0), index(row, 0)); } } void DeviceManager::SetDeviceOptions(int row, const QString& friendly_name, const QString& icon_name, MusicStorage::TranscodeMode mode, Song::FileType format) { DeviceInfo& info = devices_[row]; info.friendly_name_ = friendly_name; info.LoadIcon(QVariantList() << icon_name, friendly_name); info.transcode_mode_ = mode; info.transcode_format_ = format; emit dataChanged(index(row, 0), index(row, 0)); if (info.database_id_ != -1) backend_->SetDeviceOptions(info.database_id_, friendly_name, icon_name, mode, format); } void DeviceManager::DeviceTaskStarted(int id) { ConnectedDevice* device = qobject_cast(sender()); if (!device) return; for (int i = 0; i < devices_.count(); ++i) { DeviceInfo& info = devices_[i]; if (info.device_.get() == device) { active_tasks_[id] = index(i); info.task_percentage_ = 0; emit dataChanged(index(i), index(i)); return; } } } void DeviceManager::TasksChanged() { QList tasks = app_->task_manager()->GetTasks(); QList finished_tasks = active_tasks_.values(); for (const TaskManager::Task& task : tasks) { if (!active_tasks_.contains(task.id)) continue; QPersistentModelIndex index = active_tasks_[task.id]; if (!index.isValid()) continue; DeviceInfo& info = devices_[index.row()]; if (task.progress_max) info.task_percentage_ = float(task.progress) / task.progress_max * 100; else info.task_percentage_ = 0; emit dataChanged(index, index); finished_tasks.removeAll(index); } for (const QPersistentModelIndex& index : finished_tasks) { if (!index.isValid()) continue; DeviceInfo& info = devices_[index.row()]; info.task_percentage_ = -1; emit dataChanged(index, index); active_tasks_.remove(active_tasks_.key(index)); } } void DeviceManager::UnmountAsync(int row) { Q_ASSERT(QMetaObject::invokeMethod(this, "Unmount", Q_ARG(int, row))); } void DeviceManager::Unmount(int row) { DeviceInfo& info = devices_[row]; if (info.database_id_ != -1 && !info.device_) return; if (info.device_) Disconnect(row); if (info.BestBackend()->lister_) info.BestBackend()->lister_->UnmountDevice(info.BestBackend()->unique_id_); } void DeviceManager::DeviceSongCountUpdated(int count) { ConnectedDevice* device = qobject_cast(sender()); if (!device) return; int row = FindDeviceById(device->unique_id()); if (row == -1) return; emit dataChanged(index(row), index(row)); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/devicemanager.h000066400000000000000000000130171260417502300245450ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef DEVICEMANAGER_H #define DEVICEMANAGER_H #include "devicedatabasebackend.h" #include #include #include #include #include "library/librarymodel.h" class Application; class ConnectedDevice; class Database; class DeviceLister; class DeviceStateFilterModel; class TaskManager; class DeviceManager : public QAbstractListModel { Q_OBJECT public: DeviceManager(Application* app, QObject* parent = nullptr); ~DeviceManager(); enum Role { Role_State = LibraryModel::LastRole, Role_UniqueId, Role_FriendlyName, Role_Capacity, Role_FreeSpace, Role_IconName, Role_UpdatingPercentage, Role_MountPath, Role_TranscodeMode, Role_TranscodeFormat, Role_SongCount, LastRole, }; enum State { State_Remembered, State_NotMounted, State_NotConnected, State_Connected, }; static const int kDeviceIconSize; static const int kDeviceIconOverlaySize; DeviceStateFilterModel* connected_devices_model() const { return connected_devices_model_; } // Get info about devices int GetDatabaseId(int row) const; DeviceLister* GetLister(int row) const; std::shared_ptr GetConnectedDevice(int row) const; int FindDeviceById(const QString& id) const; int FindDeviceByUrl(const QList& url) const; // Actions on devices std::shared_ptr Connect(int row); void Disconnect(int row); void Forget(int row); void UnmountAsync(int row); void SetDeviceOptions(int row, const QString& friendly_name, const QString& icon_name, MusicStorage::TranscodeMode mode, Song::FileType format); // QAbstractListModel int rowCount(const QModelIndex& parent) const; QVariant data(const QModelIndex& index, int role) const; public slots: void Unmount(int row); signals: void DeviceConnected(int row); void DeviceDisconnected(int row); private slots: void PhysicalDeviceAdded(const QString& id); void PhysicalDeviceRemoved(const QString& id); void PhysicalDeviceChanged(const QString& id); void DeviceTaskStarted(int id); void TasksChanged(); void DeviceSongCountUpdated(int count); void LoadAllDevices(); private: // Devices can be in three different states: // 1) Remembered in the database but not physically connected at the moment. // database_id valid, lister null, device null // 2) Physically connected but the user hasn't "connected" it to Clementine // yet. // database_id == -1, lister valid, device null // 3) Physically connected and connected to Clementine // database_id valid, lister valid, device valid // Devices in all states will have a unique_id. struct DeviceInfo { DeviceInfo(); // A device can be discovered in different ways (devicekit, gio, etc.) // Sometimes the same device is discovered more than once. In this case // the device will have multiple "backends". struct Backend { Backend(DeviceLister* lister = nullptr, const QString& id = QString()) : lister_(lister), unique_id_(id) {} DeviceLister* lister_; // nullptr if not physically connected QString unique_id_; }; // Serialising to the database void InitFromDb(const DeviceDatabaseBackend::Device& dev); DeviceDatabaseBackend::Device SaveToDb() const; // Tries to load a good icon for the device. Sets icon_name_ and icon_. void LoadIcon(const QVariantList& icons, const QString& name_hint); // Gets the best backend available (the one with the highest priority) const Backend* BestBackend() const; int database_id_; // -1 if not remembered in the database std::shared_ptr device_; // nullptr if not connected to clementine QList backends_; QString friendly_name_; quint64 size_; QString icon_name_; QIcon icon_; MusicStorage::TranscodeMode transcode_mode_; Song::FileType transcode_format_; int task_percentage_; }; void AddLister(DeviceLister* lister); template void AddDeviceClass(); DeviceDatabaseBackend::Device InfoToDatabaseDevice(const DeviceInfo& info) const; private: Application* app_; DeviceDatabaseBackend* backend_; DeviceStateFilterModel* connected_devices_model_; QIcon not_connected_overlay_; QList listers_; QList devices_; QMultiMap device_classes_; // Map of task ID to device index QMap active_tasks_; QThreadPool thread_pool_; }; template void DeviceManager::AddDeviceClass() { QStringList schemes = T::url_schemes(); QMetaObject obj = T::staticMetaObject; for (const QString& scheme : schemes) { device_classes_.insert(scheme, obj); } } #endif // DEVICEMANAGER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/deviceproperties.cpp000066400000000000000000000247361260417502300256740ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "deviceproperties.h" #include #include #include #include #include #include "connecteddevice.h" #include "devicelister.h" #include "devicemanager.h" #include "ui_deviceproperties.h" #include "core/utilities.h" #include "transcoder/transcoder.h" #include "ui/iconloader.h" DeviceProperties::DeviceProperties(QWidget* parent) : QDialog(parent), ui_(new Ui_DeviceProperties), manager_(nullptr), updating_formats_(false) { ui_->setupUi(this); connect(ui_->open_device, SIGNAL(clicked()), SLOT(OpenDevice())); // Maximum height of the icon widget ui_->icon->setMaximumHeight( ui_->icon->iconSize().height() + ui_->icon->horizontalScrollBar()->sizeHint().height() + ui_->icon->spacing() * 2 + 5); } DeviceProperties::~DeviceProperties() { delete ui_; } void DeviceProperties::SetDeviceManager(DeviceManager* manager) { manager_ = manager; connect(manager_, SIGNAL(dataChanged(QModelIndex, QModelIndex)), SLOT(ModelChanged())); connect(manager_, SIGNAL(rowsInserted(QModelIndex, int, int)), SLOT(ModelChanged())); connect(manager_, SIGNAL(rowsRemoved(QModelIndex, int, int)), SLOT(ModelChanged())); } void DeviceProperties::ShowDevice(int row) { if (ui_->icon->count() == 0) { // Only load the icons the first time the dialog is shown QStringList icon_names = QStringList() << "drive-removable-media-usb-pendrive" << "multimedia-player-ipod-mini-blue" << "multimedia-player-ipod-mini-gold" << "multimedia-player-ipod-mini-green" << "multimedia-player-ipod-mini-pink" << "multimedia-player-ipod-mini-silver" << "multimedia-player-ipod-nano-black" << "multimedia-player-ipod-nano-white" << "multimedia-player-ipod-nano-green" << "multimedia-player-ipod-shuffle" << "multimedia-player-ipod-standard-color" << "multimedia-player-ipod-standard-monochrome" << "multimedia-player-ipod-U2-color" << "multimedia-player-ipod-U2-monochrome" << "ipodtouchicon" << "phone" << "phone-google-nexus-one" << "phone-htc-g1-white" << "phone-nokia-n900" << "phone-palm-pre"; for (const QString& icon_name : icon_names) { QListWidgetItem* item = new QListWidgetItem(IconLoader::Load(icon_name), QString(), ui_->icon); item->setData(Qt::UserRole, icon_name); } // Load the transcode formats the first time the dialog is shown for (const TranscoderPreset& preset : Transcoder::GetAllPresets()) { ui_->transcode_format->addItem(preset.name_, preset.type_); } ui_->transcode_format->model()->sort(0); } index_ = manager_->index(row); // Basic information ui_->name->setText(index_.data(DeviceManager::Role_FriendlyName).toString()); // Find the right icon QString icon_name = index_.data(DeviceManager::Role_IconName).toString(); for (int i = 0; i < ui_->icon->count(); ++i) { if (ui_->icon->item(i)->data(Qt::UserRole).toString() == icon_name) { ui_->icon->setCurrentRow(i); break; } } UpdateHardwareInfo(); UpdateFormats(); show(); } void DeviceProperties::AddHardwareInfo(int row, const QString& key, const QString& value) { ui_->hardware_info->setItem(row, 0, new QTableWidgetItem(key)); ui_->hardware_info->setItem(row, 1, new QTableWidgetItem(value)); } void DeviceProperties::ModelChanged() { if (!isVisible()) return; if (!index_.isValid()) reject(); // Device went away else { UpdateHardwareInfo(); UpdateFormats(); } } void DeviceProperties::UpdateHardwareInfo() { // Hardware information QString id = index_.data(DeviceManager::Role_UniqueId).toString(); if (DeviceLister* lister = manager_->GetLister(index_.row())) { QVariantMap info = lister->DeviceHardwareInfo(id); // Remove empty items for (const QString& key : info.keys()) { if (info[key].isNull() || info[key].toString().isEmpty()) info.remove(key); } ui_->hardware_info_stack->setCurrentWidget(ui_->hardware_info_page); ui_->hardware_info->clear(); ui_->hardware_info->setRowCount(2 + info.count()); int row = 0; AddHardwareInfo(row++, tr("Model"), lister->DeviceModel(id)); AddHardwareInfo(row++, tr("Manufacturer"), lister->DeviceManufacturer(id)); for (const QString& key : info.keys()) { AddHardwareInfo(row++, tr(key.toAscii()), info[key].toString()); } ui_->hardware_info->sortItems(0); } else { ui_->hardware_info_stack->setCurrentWidget( ui_->hardware_info_not_connected_page); } // Size quint64 total = index_.data(DeviceManager::Role_Capacity).toLongLong(); QVariant free_var = index_.data(DeviceManager::Role_FreeSpace); if (free_var.isValid()) { quint64 free = free_var.toLongLong(); ui_->free_space_bar->set_total_bytes(total); ui_->free_space_bar->set_free_bytes(free); ui_->free_space_bar->show(); } else { ui_->free_space_bar->hide(); } } void DeviceProperties::UpdateFormats() { QString id = index_.data(DeviceManager::Role_UniqueId).toString(); DeviceLister* lister = manager_->GetLister(index_.row()); std::shared_ptr device = manager_->GetConnectedDevice(index_.row()); // Transcode mode MusicStorage::TranscodeMode mode = MusicStorage::TranscodeMode( index_.data(DeviceManager::Role_TranscodeMode).toInt()); switch (mode) { case MusicStorage::Transcode_Always: ui_->transcode_all->setChecked(true); break; case MusicStorage::Transcode_Never: ui_->transcode_off->setChecked(true); break; case MusicStorage::Transcode_Unsupported: default: ui_->transcode_unsupported->setChecked(true); break; } // If there's no lister then the device is physically disconnected if (!lister) { ui_->formats_stack->setCurrentWidget(ui_->formats_page_not_connected); ui_->open_device->setEnabled(false); return; } // If there's a lister but no device then the user just needs to open the // device. This will cause a rescan so we don't do it automatically. if (!device) { ui_->formats_stack->setCurrentWidget(ui_->formats_page_not_connected); ui_->open_device->setEnabled(true); return; } if (!updating_formats_) { // Get the device's supported formats list. This takes a long time and it // blocks, so do it in the background. supported_formats_.clear(); QFuture future = QtConcurrent::run(std::bind( &ConnectedDevice::GetSupportedFiletypes, device, &supported_formats_)); QFutureWatcher* watcher = new QFutureWatcher(this); watcher->setFuture(future); connect(watcher, SIGNAL(finished()), SLOT(UpdateFormatsFinished())); ui_->formats_stack->setCurrentWidget(ui_->formats_page_loading); updating_formats_ = true; } } void DeviceProperties::accept() { QDialog::accept(); // Transcode mode MusicStorage::TranscodeMode mode = MusicStorage::Transcode_Unsupported; if (ui_->transcode_all->isChecked()) mode = MusicStorage::Transcode_Always; else if (ui_->transcode_off->isChecked()) mode = MusicStorage::Transcode_Never; else if (ui_->transcode_unsupported->isChecked()) mode = MusicStorage::Transcode_Unsupported; // Transcode format Song::FileType format = Song::FileType( ui_->transcode_format->itemData(ui_->transcode_format->currentIndex()) .toInt()); // By default no icon is selected and thus no current item is selected QString icon_name; if (ui_->icon->currentItem() != nullptr) { icon_name = ui_->icon->currentItem()->data(Qt::UserRole).toString(); } manager_->SetDeviceOptions(index_.row(), ui_->name->text(), icon_name, mode, format); } void DeviceProperties::OpenDevice() { manager_->Connect(index_.row()); } void DeviceProperties::UpdateFormatsFinished() { QFutureWatcher* watcher = static_cast*>(sender()); watcher->deleteLater(); updating_formats_ = false; if (!watcher->future().result()) { supported_formats_.clear(); } // Hide widgets if there are no supported types ui_->supported_formats_container->setVisible(!supported_formats_.isEmpty()); ui_->transcode_unsupported->setEnabled(!supported_formats_.isEmpty()); if (ui_->transcode_unsupported->isChecked() && supported_formats_.isEmpty()) { ui_->transcode_off->setChecked(true); } // Populate supported types list ui_->supported_formats->clear(); for (Song::FileType type : supported_formats_) { QListWidgetItem* item = new QListWidgetItem(Song::TextForFiletype(type)); ui_->supported_formats->addItem(item); } ui_->supported_formats->sortItems(); // Set the format combobox item TranscoderPreset preset = Transcoder::PresetForFileType( Song::FileType(index_.data(DeviceManager::Role_TranscodeFormat).toInt())); if (preset.type_ == Song::Type_Unknown) { // The user hasn't chosen a format for this device yet, so work our way down // a list of some preferred formats, picking the first one that is supported preset = Transcoder::PresetForFileType( Transcoder::PickBestFormat(supported_formats_)); } ui_->transcode_format->setCurrentIndex( ui_->transcode_format->findText(preset.name_)); ui_->formats_stack->setCurrentWidget(ui_->formats_page); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/deviceproperties.h000066400000000000000000000030711260417502300253260ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef DEVICEPROPERTIES_H #define DEVICEPROPERTIES_H #include #include #include "core/song.h" class DeviceManager; class Ui_DeviceProperties; class DeviceProperties : public QDialog { Q_OBJECT public: DeviceProperties(QWidget* parent = nullptr); ~DeviceProperties(); void SetDeviceManager(DeviceManager* manager); void ShowDevice(int row); public slots: void accept(); private: void UpdateHardwareInfo(); void AddHardwareInfo(int row, const QString& key, const QString& value); void UpdateFormats(); private slots: void ModelChanged(); void OpenDevice(); void UpdateFormatsFinished(); private: Ui_DeviceProperties* ui_; DeviceManager* manager_; QPersistentModelIndex index_; bool updating_formats_; QList supported_formats_; }; #endif // DEVICEPROPERTIES_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/deviceproperties.ui000066400000000000000000000343501260417502300255200ustar00rootroot00000000000000 DeviceProperties 0 0 514 488 Device Properties :/icon.png:/icon.png 0 Information QFormLayout::AllNonFixedFieldsGrow Name Icon Qt::ScrollBarAlwaysOff 48 48 QListView::Static QListView::LeftToRight false 5 QListView::IconMode true Hardware information 1 0 0 Hardware information is only available while the device is connected. Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true 0 0 QAbstractItemView::NoEditTriggers QAbstractItemView::NoSelection false 2 false true false File formats 0 0 Supported formats This device supports the following file formats: QAbstractItemView::NoSelection Clementine can automatically convert the music you copy to this device into a format that it can play. true Do not convert any music Convert any music that the device can't play true Convert all music Preferred format 0 0 Qt::Vertical 20 183 0 This device must be connected and opened before Clementine can see what file formats it supports. true Open device Qt::Horizontal 40 20 Qt::Vertical 20 309 0 0 0 Querying device... Qt::Vertical 20 358 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok FreeSpaceBar QWidget

widgets/freespacebar.h
1 BusyIndicator QWidget
widgets/busyindicator.h
name icon hardware_info tabWidget supported_formats transcode_format buttonBox buttonBox accepted() DeviceProperties accept() 248 254 157 274 buttonBox rejected() DeviceProperties reject() 316 260 286 274 clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/devicestatefiltermodel.cpp000066400000000000000000000033721260417502300270400ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "devicestatefiltermodel.h" DeviceStateFilterModel::DeviceStateFilterModel(QObject* parent, DeviceManager::State state) : QSortFilterProxyModel(parent), state_(state) { connect(this, SIGNAL(rowsInserted(QModelIndex, int, int)), SLOT(ProxyRowCountChanged())); connect(this, SIGNAL(rowsRemoved(QModelIndex, int, int)), SLOT(ProxyRowCountChanged())); connect(this, SIGNAL(modelReset()), SLOT(ProxyRowCountChanged())); } bool DeviceStateFilterModel::filterAcceptsRow(int row, const QModelIndex&) const { return sourceModel()->index(row, 0).data(DeviceManager::Role_State).toInt() != state_; } void DeviceStateFilterModel::ProxyRowCountChanged() { emit IsEmptyChanged(rowCount() == 0); } void DeviceStateFilterModel::setSourceModel(QAbstractItemModel* sourceModel) { QSortFilterProxyModel::setSourceModel(sourceModel); setDynamicSortFilter(true); setSortCaseSensitivity(Qt::CaseInsensitive); sort(0); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/devicestatefiltermodel.h000066400000000000000000000026021260417502300265000ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef DEVICESTATEFILTERMODEL_H #define DEVICESTATEFILTERMODEL_H #include #include "devicemanager.h" class DeviceStateFilterModel : public QSortFilterProxyModel { Q_OBJECT public: DeviceStateFilterModel(QObject* parent, DeviceManager::State state = DeviceManager::State_Remembered); void setSourceModel(QAbstractItemModel* sourceModel); signals: void IsEmptyChanged(bool is_empty); protected: bool filterAcceptsRow(int row, const QModelIndex& parent) const; private slots: void ProxyRowCountChanged(); private: DeviceManager::State state_; }; #endif // DEVICESTATEFILTERMODEL_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/deviceview.cpp000066400000000000000000000361101260417502300244370ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "deviceview.h" #include #include #include #include #include #include #include #include #include "connecteddevice.h" #include "devicelister.h" #include "devicemanager.h" #include "deviceproperties.h" #include "core/application.h" #include "core/deletefiles.h" #include "core/mergedproxymodel.h" #include "core/mimedata.h" #include "library/librarydirectorymodel.h" #include "library/librarymodel.h" #include "library/libraryview.h" #include "ui/iconloader.h" #include "ui/organisedialog.h" #include "ui/organiseerrordialog.h" const int DeviceItemDelegate::kIconPadding = 6; DeviceItemDelegate::DeviceItemDelegate(QObject* parent) : LibraryItemDelegate(parent) {} void DeviceItemDelegate::paint(QPainter* p, const QStyleOptionViewItem& opt, const QModelIndex& index) const { // Is it a device or a library item? if (index.data(DeviceManager::Role_State).isNull()) { LibraryItemDelegate::paint(p, opt, index); return; } // Draw the background const QStyleOptionViewItemV3* vopt = qstyleoption_cast(&opt); const QWidget* widget = vopt->widget; QStyle* style = widget->style() ? widget->style() : QApplication::style(); style->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, p, widget); p->save(); // Font for the status line QFont status_font(opt.font); #ifdef Q_OS_WIN32 status_font.setPointSize(status_font.pointSize() - 1); #else status_font.setPointSize(status_font.pointSize() - 2); #endif const int text_height = QFontMetrics(opt.font).height() + QFontMetrics(status_font).height(); QRect line1(opt.rect); QRect line2(opt.rect); line1.setTop(line1.top() + (opt.rect.height() - text_height) / 2); line2.setTop(line1.top() + QFontMetrics(opt.font).height()); line1.setLeft(line1.left() + DeviceManager::kDeviceIconSize + kIconPadding); line2.setLeft(line2.left() + DeviceManager::kDeviceIconSize + kIconPadding); // Change the color for selected items if (opt.state & QStyle::State_Selected) { p->setPen(opt.palette.color(QPalette::HighlightedText)); } // Draw the icon p->drawPixmap(opt.rect.topLeft(), index.data(Qt::DecorationRole).value()); // Draw the first line (device name) p->drawText(line1, Qt::AlignLeft | Qt::AlignTop, index.data().toString()); // Draw the second line (status) DeviceManager::State state = static_cast( index.data(DeviceManager::Role_State).toInt()); QVariant progress = index.data(DeviceManager::Role_UpdatingPercentage); QString status_text; if (progress.isValid()) { status_text = tr("Updating %1%...").arg(progress.toInt()); } else { switch (state) { case DeviceManager::State_Remembered: status_text = tr("Not connected"); break; case DeviceManager::State_NotMounted: status_text = tr("Not mounted - double click to mount"); break; case DeviceManager::State_NotConnected: status_text = tr("Double click to open"); break; case DeviceManager::State_Connected: { QVariant song_count = index.data(DeviceManager::Role_SongCount); if (song_count.isValid()) { int count = song_count.toInt(); if (count == 1) // TODO: Fix this properly status_text = tr("%1 song").arg(count); else status_text = tr("%1 songs").arg(count); } else { status_text = index.data(DeviceManager::Role_MountPath).toString(); } break; } } } if (opt.state & QStyle::State_Selected) p->setPen(opt.palette.color(QPalette::HighlightedText)); else p->setPen(opt.palette.color(QPalette::Dark)); p->setFont(status_font); p->drawText(line2, Qt::AlignLeft | Qt::AlignTop, status_text); p->restore(); } DeviceView::DeviceView(QWidget* parent) : AutoExpandingTreeView(parent), app_(nullptr), merged_model_(nullptr), sort_model_(nullptr), properties_dialog_(new DeviceProperties), device_menu_(nullptr), library_menu_(nullptr) { setItemDelegate(new DeviceItemDelegate(this)); SetExpandOnReset(false); setAttribute(Qt::WA_MacShowFocusRect, false); setHeaderHidden(true); setAllColumnsShowFocus(true); setDragEnabled(true); setDragDropMode(QAbstractItemView::DragOnly); setSelectionMode(QAbstractItemView::ExtendedSelection); } DeviceView::~DeviceView() {} void DeviceView::SetApplication(Application* app) { Q_ASSERT(app_ == nullptr); app_ = app; connect(app_->device_manager(), SIGNAL(DeviceConnected(int)), SLOT(DeviceConnected(int))); connect(app_->device_manager(), SIGNAL(DeviceDisconnected(int)), SLOT(DeviceDisconnected(int))); sort_model_ = new QSortFilterProxyModel(this); sort_model_->setSourceModel(app_->device_manager()); sort_model_->setDynamicSortFilter(true); sort_model_->setSortCaseSensitivity(Qt::CaseInsensitive); sort_model_->sort(0); merged_model_ = new MergedProxyModel(this); merged_model_->setSourceModel(sort_model_); connect(merged_model_, SIGNAL(SubModelReset(QModelIndex, QAbstractItemModel*)), SLOT(RecursivelyExpand(QModelIndex))); setModel(merged_model_); properties_dialog_->SetDeviceManager(app_->device_manager()); organise_dialog_.reset(new OrganiseDialog(app_->task_manager())); organise_dialog_->SetDestinationModel( app_->library_model()->directory_model()); } void DeviceView::contextMenuEvent(QContextMenuEvent* e) { if (!device_menu_) { device_menu_ = new QMenu(this); library_menu_ = new QMenu(this); // Device menu eject_action_ = device_menu_->addAction(IconLoader::Load("media-eject"), tr("Safely remove device"), this, SLOT(Unmount())); forget_action_ = device_menu_->addAction(IconLoader::Load("list-remove"), tr("Forget device"), this, SLOT(Forget())); device_menu_->addSeparator(); properties_action_ = device_menu_->addAction(IconLoader::Load("configure"), tr("Device properties..."), this, SLOT(Properties())); // Library menu add_to_playlist_action_ = library_menu_->addAction( IconLoader::Load("media-playback-start"), tr("Append to current playlist"), this, SLOT(AddToPlaylist())); load_action_ = library_menu_->addAction( IconLoader::Load("media-playback-start"), tr("Replace current playlist"), this, SLOT(Load())); open_in_new_playlist_ = library_menu_->addAction( IconLoader::Load("document-new"), tr("Open in new playlist"), this, SLOT(OpenInNewPlaylist())); library_menu_->addSeparator(); organise_action_ = library_menu_->addAction(IconLoader::Load("edit-copy"), tr("Copy to library..."), this, SLOT(Organise())); delete_action_ = library_menu_->addAction(IconLoader::Load("edit-delete"), tr("Delete from device..."), this, SLOT(Delete())); } menu_index_ = currentIndex(); const QModelIndex device_index = MapToDevice(menu_index_); const QModelIndex library_index = MapToLibrary(menu_index_); if (device_index.isValid()) { const bool is_plugged_in = app_->device_manager()->GetLister(device_index.row()); const bool is_remembered = app_->device_manager()->GetDatabaseId(device_index.row()) != -1; forget_action_->setEnabled(is_remembered); eject_action_->setEnabled(is_plugged_in); device_menu_->popup(e->globalPos()); } else if (library_index.isValid()) { const QModelIndex parent_device_index = FindParentDevice(menu_index_); bool is_filesystem_device = false; if (parent_device_index.isValid()) { std::shared_ptr device = app_->device_manager()->GetConnectedDevice(parent_device_index.row()); if (device && !device->LocalPath().isEmpty()) is_filesystem_device = true; } organise_action_->setEnabled(is_filesystem_device); library_menu_->popup(e->globalPos()); } } QModelIndex DeviceView::MapToDevice(const QModelIndex& merged_model_index) const { QModelIndex sort_model_index = merged_model_->mapToSource(merged_model_index); if (sort_model_index.model() != sort_model_) return QModelIndex(); return sort_model_->mapToSource(sort_model_index); } QModelIndex DeviceView::FindParentDevice(const QModelIndex& merged_model_index) const { QModelIndex index = merged_model_->FindSourceParent(merged_model_index); if (index.model() != sort_model_) return QModelIndex(); return sort_model_->mapToSource(index); } QModelIndex DeviceView::MapToLibrary(const QModelIndex& merged_model_index) const { QModelIndex sort_model_index = merged_model_->mapToSource(merged_model_index); if (const QSortFilterProxyModel* sort_model = qobject_cast( sort_model_index.model())) { return sort_model->mapToSource(sort_model_index); } return QModelIndex(); } void DeviceView::Connect() { QModelIndex device_idx = MapToDevice(menu_index_); app_->device_manager()->data(device_idx, MusicStorage::Role_StorageForceConnect); } void DeviceView::DeviceConnected(int row) { std::shared_ptr device = app_->device_manager()->GetConnectedDevice(row); if (!device) return; QModelIndex sort_idx = sort_model_->mapFromSource(app_->device_manager()->index(row)); QSortFilterProxyModel* sort_model = new QSortFilterProxyModel(device->model()); sort_model->setSourceModel(device->model()); sort_model->setSortRole(LibraryModel::Role_SortText); sort_model->setDynamicSortFilter(true); sort_model->sort(0); merged_model_->AddSubModel(sort_idx, sort_model); expand(menu_index_); } void DeviceView::DeviceDisconnected(int row) { merged_model_->RemoveSubModel( sort_model_->mapFromSource(app_->device_manager()->index(row))); } void DeviceView::Forget() { QModelIndex device_idx = MapToDevice(menu_index_); QString unique_id = app_->device_manager() ->data(device_idx, DeviceManager::Role_UniqueId) .toString(); if (app_->device_manager()->GetLister(device_idx.row()) && app_->device_manager()->GetLister(device_idx.row())->AskForScan( unique_id)) { std::unique_ptr dialog(new QMessageBox( QMessageBox::Question, tr("Forget device"), tr("Forgetting a device will remove it from this list and Clementine " "will have to rescan all the songs again next time you connect it."), QMessageBox::Cancel, this)); QPushButton* forget = dialog->addButton(tr("Forget device"), QMessageBox::DestructiveRole); dialog->exec(); if (dialog->clickedButton() != forget) return; } app_->device_manager()->Forget(device_idx.row()); } void DeviceView::Properties() { properties_dialog_->ShowDevice(MapToDevice(menu_index_).row()); } void DeviceView::mouseDoubleClickEvent(QMouseEvent* event) { AutoExpandingTreeView::mouseDoubleClickEvent(event); QModelIndex merged_index = indexAt(event->pos()); QModelIndex device_index = MapToDevice(merged_index); if (device_index.isValid()) { if (!app_->device_manager()->GetConnectedDevice(device_index.row())) { menu_index_ = merged_index; Connect(); } } } SongList DeviceView::GetSelectedSongs() const { QModelIndexList selected_merged_indexes = selectionModel()->selectedRows(); SongList songs; for (const QModelIndex& merged_index : selected_merged_indexes) { QModelIndex library_index = MapToLibrary(merged_index); if (!library_index.isValid()) continue; const LibraryModel* library = qobject_cast(library_index.model()); if (!library) continue; songs << library->GetChildSongs(library_index); } return songs; } void DeviceView::Load() { QMimeData* data = model()->mimeData(selectedIndexes()); if (MimeData* mime_data = qobject_cast(data)) { mime_data->clear_first_ = true; } emit AddToPlaylistSignal(data); } void DeviceView::AddToPlaylist() { emit AddToPlaylistSignal(model()->mimeData(selectedIndexes())); } void DeviceView::OpenInNewPlaylist() { QMimeData* data = model()->mimeData(selectedIndexes()); if (MimeData* mime_data = qobject_cast(data)) { mime_data->open_in_new_playlist_ = true; } emit AddToPlaylistSignal(data); } void DeviceView::Delete() { if (selectedIndexes().isEmpty()) return; // Take the device of the first selected item QModelIndex device_index = FindParentDevice(selectedIndexes()[0]); if (!device_index.isValid()) return; if (QMessageBox::question(this, tr("Delete files"), tr("These files will be deleted from the device, " "are you sure you want to continue?"), QMessageBox::Yes, QMessageBox::Cancel) != QMessageBox::Yes) return; std::shared_ptr storage = device_index.data(MusicStorage::Role_Storage) .value>(); DeleteFiles* delete_files = new DeleteFiles(app_->task_manager(), storage); connect(delete_files, SIGNAL(Finished(SongList)), SLOT(DeleteFinished(SongList))); delete_files->Start(GetSelectedSongs()); } void DeviceView::Organise() { SongList songs = GetSelectedSongs(); QStringList filenames; for (const Song& song : songs) { filenames << song.url().toLocalFile(); } organise_dialog_->SetCopy(true); organise_dialog_->SetFilenames(filenames); organise_dialog_->show(); } void DeviceView::Unmount() { QModelIndex device_idx = MapToDevice(menu_index_); app_->device_manager()->Unmount(device_idx.row()); } void DeviceView::DeleteFinished(const SongList& songs_with_errors) { if (songs_with_errors.isEmpty()) return; OrganiseErrorDialog* dialog = new OrganiseErrorDialog(this); dialog->Show(OrganiseErrorDialog::Type_Delete, songs_with_errors); // It deletes itself when the user closes it } bool DeviceView::CanRecursivelyExpand(const QModelIndex& index) const { // Never expand devices return index.parent().isValid(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/deviceview.h000066400000000000000000000055051260417502300241100ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef DEVICEVIEW_H #define DEVICEVIEW_H #include #include "core/song.h" #include "library/libraryview.h" #include "widgets/autoexpandingtreeview.h" class QAction; class QMenu; class QSortFilterProxyModel; class Application; class DeviceManager; class DeviceProperties; class LibraryModel; class MergedProxyModel; class DeviceItemDelegate : public LibraryItemDelegate { public: DeviceItemDelegate(QObject* parent); static const int kIconPadding; void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; }; class DeviceView : public AutoExpandingTreeView { Q_OBJECT public: DeviceView(QWidget* parent = nullptr); ~DeviceView(); void SetApplication(Application* app); protected: void contextMenuEvent(QContextMenuEvent*); void mouseDoubleClickEvent(QMouseEvent* event); private slots: // Device menu actions void Connect(); void Unmount(); void Forget(); void Properties(); // Library menu actions void Load(); void AddToPlaylist(); void OpenInNewPlaylist(); void Organise(); void Delete(); void DeviceConnected(int row); void DeviceDisconnected(int row); void DeleteFinished(const SongList& songs_with_errors); // AutoExpandingTreeView bool CanRecursivelyExpand(const QModelIndex& index) const; private: QModelIndex MapToDevice(const QModelIndex& merged_model_index) const; QModelIndex MapToLibrary(const QModelIndex& merged_model_index) const; QModelIndex FindParentDevice(const QModelIndex& merged_model_index) const; SongList GetSelectedSongs() const; private: Application* app_; MergedProxyModel* merged_model_; QSortFilterProxyModel* sort_model_; std::unique_ptr properties_dialog_; std::unique_ptr organise_dialog_; QMenu* device_menu_; QAction* eject_action_; QAction* forget_action_; QAction* properties_action_; QMenu* library_menu_; QAction* load_action_; QAction* add_to_playlist_action_; QAction* open_in_new_playlist_; QAction* organise_action_; QAction* delete_action_; QModelIndex menu_index_; }; #endif // DEVICEVIEW_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/deviceviewcontainer.cpp000066400000000000000000000032441260417502300263440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "deviceviewcontainer.h" #include "ui_deviceviewcontainer.h" #include "ui/iconloader.h" DeviceViewContainer::DeviceViewContainer(QWidget* parent) : QWidget(parent), ui_(new Ui::DeviceViewContainer), loaded_icons_(false) { ui_->setupUi(this); QPalette palette(ui_->windows_is_broken_frame->palette()); palette.setColor(QPalette::Background, QColor(255, 255, 222)); ui_->windows_is_broken_frame->setPalette(palette); #ifdef Q_OS_WIN ui_->windows_is_broken_frame->show(); #else ui_->windows_is_broken_frame->hide(); #endif } DeviceViewContainer::~DeviceViewContainer() { delete ui_; } void DeviceViewContainer::showEvent(QShowEvent* e) { if (!loaded_icons_) { loaded_icons_ = true; ui_->close_frame_button->setIcon(IconLoader::Load("edit-delete")); ui_->warning_icon->setPixmap(IconLoader::Load("dialog-warning").pixmap(22)); } QWidget::showEvent(e); } DeviceView* DeviceViewContainer::view() const { return ui_->view; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/deviceviewcontainer.h000066400000000000000000000022631260417502300260110ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef DEVICEVIEWCONTAINER_H #define DEVICEVIEWCONTAINER_H #include namespace Ui { class DeviceViewContainer; } class DeviceView; class DeviceViewContainer : public QWidget { Q_OBJECT public: explicit DeviceViewContainer(QWidget* parent = nullptr); ~DeviceViewContainer(); DeviceView* view() const; protected: void showEvent(QShowEvent*); private: Ui::DeviceViewContainer* ui_; bool loaded_icons_; }; #endif // DEVICEVIEWCONTAINER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/deviceviewcontainer.ui000066400000000000000000000050231260417502300261740ustar00rootroot00000000000000 DeviceViewContainer 0 0 391 396 Form 0 0 true QFrame::StyledPanel QFrame::Raised 0 0 iPods and USB devices currently don't work on Windows. Sorry! true 0 0 DeviceView QWidget
devices/deviceview.h
1
close_frame_button clicked() windows_is_broken_frame hide() 362 31 369 40
clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/filesystemdevice.cpp000066400000000000000000000060571260417502300256600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "devicelister.h" #include "devicemanager.h" #include "filesystemdevice.h" #include "core/application.h" #include "library/librarybackend.h" #include "library/librarymodel.h" #include "library/librarywatcher.h" #include #include FilesystemDevice::FilesystemDevice(const QUrl& url, DeviceLister* lister, const QString& unique_id, DeviceManager* manager, Application* app, int database_id, bool first_time) : FilesystemMusicStorage(url.toLocalFile()), ConnectedDevice(url, lister, unique_id, manager, app, database_id, first_time), watcher_(new LibraryWatcher), watcher_thread_(new QThread(this)) { watcher_->moveToThread(watcher_thread_); watcher_thread_->start(QThread::IdlePriority); watcher_->set_device_name( manager->data(manager->index(manager->FindDeviceById(unique_id)), DeviceManager::Role_FriendlyName).toString()); watcher_->set_backend(backend_); watcher_->set_task_manager(app_->task_manager()); connect(backend_, SIGNAL(DirectoryDiscovered(Directory, SubdirectoryList)), watcher_, SLOT(AddDirectory(Directory, SubdirectoryList))); connect(backend_, SIGNAL(DirectoryDeleted(Directory)), watcher_, SLOT(RemoveDirectory(Directory))); connect(watcher_, SIGNAL(NewOrUpdatedSongs(SongList)), backend_, SLOT(AddOrUpdateSongs(SongList))); connect(watcher_, SIGNAL(SongsMTimeUpdated(SongList)), backend_, SLOT(UpdateMTimesOnly(SongList))); connect(watcher_, SIGNAL(SongsDeleted(SongList)), backend_, SLOT(DeleteSongs(SongList))); connect(watcher_, SIGNAL(SubdirsDiscovered(SubdirectoryList)), backend_, SLOT(AddOrUpdateSubdirs(SubdirectoryList))); connect(watcher_, SIGNAL(SubdirsMTimeUpdated(SubdirectoryList)), backend_, SLOT(AddOrUpdateSubdirs(SubdirectoryList))); connect(watcher_, SIGNAL(CompilationsNeedUpdating()), backend_, SLOT(UpdateCompilations())); connect(watcher_, SIGNAL(ScanStarted(int)), SIGNAL(TaskStarted(int))); } void FilesystemDevice::Init() { InitBackendDirectory(url_.toLocalFile(), first_time_); model_->Init(); } FilesystemDevice::~FilesystemDevice() { watcher_->deleteLater(); watcher_thread_->exit(); watcher_thread_->wait(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/filesystemdevice.h000066400000000000000000000027531260417502300253240ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef FILESYSTEMDEVICE_H #define FILESYSTEMDEVICE_H #include "connecteddevice.h" #include "core/filesystemmusicstorage.h" class DeviceManager; class LibraryWatcher; class FilesystemDevice : public ConnectedDevice, public virtual FilesystemMusicStorage { Q_OBJECT public: Q_INVOKABLE FilesystemDevice(const QUrl& url, DeviceLister* lister, const QString& unique_id, DeviceManager* manager, Application* app, int database_id, bool first_time); ~FilesystemDevice(); void Init(); static QStringList url_schemes() { return QStringList() << "file"; } private: LibraryWatcher* watcher_; QThread* watcher_thread_; }; #endif // FILESYSTEMDEVICE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/giolister.cpp000066400000000000000000000367221260417502300243170ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "config.h" #include #include #include #include #include "giolister.h" #include "core/logging.h" #include "core/signalchecker.h" using std::placeholders::_1; using std::placeholders::_2; using std::placeholders::_3; QString GioLister::DeviceInfo::unique_id() const { if (mount) return QString("Gio/%1/%2/%3").arg(mount_uuid, filesystem_type).arg( filesystem_size); return QString("Gio/unmounted/%1").arg((qulonglong)volume.get()); } bool GioLister::DeviceInfo::is_suitable() const { if (!volume) return false; // This excludes smb or ssh mounts if (drive && !drive_removable) return false; // This excludes internal drives if (filesystem_type.isEmpty()) return true; return filesystem_type != "udf" && filesystem_type != "smb" && filesystem_type != "cifs" && filesystem_type != "ssh" && filesystem_type != "isofs"; } template void OperationFinished(F f, GObject* object, GAsyncResult* result) { T* obj = reinterpret_cast(object); GError* error = nullptr; f(obj, result, &error); if (error) { qLog(Error) << "Mount/unmount error:" << error->message; g_error_free(error); } } void GioLister::VolumeMountFinished(GObject* object, GAsyncResult* result, gpointer) { OperationFinished(std::bind(g_volume_mount_finish, _1, _2, _3), object, result); } void GioLister::Init() { monitor_.reset_without_add(g_volume_monitor_get()); // Get existing volumes GList* const volumes = g_volume_monitor_get_volumes(monitor_); for (GList* p = volumes; p; p = p->next) { GVolume* volume = static_cast(p->data); VolumeAdded(volume); g_object_unref(volume); } g_list_free(volumes); // Get existing mounts GList* const mounts = g_volume_monitor_get_mounts(monitor_); for (GList* p = mounts; p; p = p->next) { GMount* mount = static_cast(p->data); MountAdded(mount); g_object_unref(mount); } g_list_free(mounts); // Connect signals from the monitor CHECKED_GCONNECT(monitor_, "volume-added", &VolumeAddedCallback, this); CHECKED_GCONNECT(monitor_, "volume-removed", &VolumeRemovedCallback, this); CHECKED_GCONNECT(monitor_, "mount-added", &MountAddedCallback, this); CHECKED_GCONNECT(monitor_, "mount-changed", &MountChangedCallback, this); CHECKED_GCONNECT(monitor_, "mount-removed", &MountRemovedCallback, this); } QStringList GioLister::DeviceUniqueIDs() { QMutexLocker l(&mutex_); return devices_.keys(); } QVariantList GioLister::DeviceIcons(const QString& id) { QVariantList ret; QMutexLocker l(&mutex_); if (!devices_.contains(id)) return ret; const DeviceInfo& info = devices_[id]; if (info.mount) { ret << DeviceLister::GuessIconForPath(info.mount_path); ret << info.mount_icon_names; } ret << DeviceLister::GuessIconForModel(QString(), info.mount_name); return ret; } QString GioLister::DeviceManufacturer(const QString& id) { return QString(); } QString GioLister::DeviceModel(const QString& id) { QMutexLocker l(&mutex_); if (!devices_.contains(id)) return QString(); const DeviceInfo& info = devices_[id]; return info.drive_name.isEmpty() ? info.volume_name : info.drive_name; } quint64 GioLister::DeviceCapacity(const QString& id) { return LockAndGetDeviceInfo(id, &DeviceInfo::filesystem_size); } quint64 GioLister::DeviceFreeSpace(const QString& id) { return LockAndGetDeviceInfo(id, &DeviceInfo::filesystem_free); } QString GioLister::MakeFriendlyName(const QString& id) { return DeviceModel(id); } QVariantMap GioLister::DeviceHardwareInfo(const QString& id) { QVariantMap ret; QMutexLocker l(&mutex_); if (!devices_.contains(id)) return ret; const DeviceInfo& info = devices_[id]; ret[QT_TR_NOOP("Mount point")] = info.mount_path; ret[QT_TR_NOOP("Device")] = info.volume_unix_device; ret[QT_TR_NOOP("URI")] = info.mount_uri; return ret; } QList GioLister::MakeDeviceUrls(const QString& id) { QString mount_point; QString uri; { QMutexLocker l(&mutex_); mount_point = devices_[id].mount_path; uri = devices_[id].mount_uri; } // gphoto2 gives invalid hostnames with []:, characters in uri.replace(QRegExp("//\\[usb:(\\d+),(\\d+)\\]"), "//usb-\\1-\\2"); QUrl url(uri); QList ret; // Special case for file:// GIO URIs - we have to check whether they point // to an ipod. if (url.isValid() && url.scheme() == "file") { ret << MakeUrlFromLocalPath(url.path()); } else { ret << url; } ret << MakeUrlFromLocalPath(mount_point); return ret; } void GioLister::VolumeAddedCallback(GVolumeMonitor*, GVolume* v, gpointer d) { static_cast(d)->VolumeAdded(v); } void GioLister::VolumeRemovedCallback(GVolumeMonitor*, GVolume* v, gpointer d) { static_cast(d)->VolumeRemoved(v); } void GioLister::MountAddedCallback(GVolumeMonitor*, GMount* m, gpointer d) { static_cast(d)->MountAdded(m); } void GioLister::MountChangedCallback(GVolumeMonitor*, GMount* m, gpointer d) { static_cast(d)->MountChanged(m); } void GioLister::MountRemovedCallback(GVolumeMonitor*, GMount* m, gpointer d) { static_cast(d)->MountRemoved(m); } void GioLister::VolumeAdded(GVolume* volume) { g_object_ref(volume); DeviceInfo info; info.ReadVolumeInfo(volume); #ifdef HAVE_AUDIOCD if (info.volume_root_uri.startsWith("cdda")) // Audio CD devices are already handled by CDDA lister return; #endif info.ReadDriveInfo(g_volume_get_drive(volume)); info.ReadMountInfo(g_volume_get_mount(volume)); if (!info.is_suitable()) return; { QMutexLocker l(&mutex_); devices_[info.unique_id()] = info; } emit DeviceAdded(info.unique_id()); } void GioLister::VolumeRemoved(GVolume* volume) { QString id; { QMutexLocker l(&mutex_); id = FindUniqueIdByVolume(volume); if (id.isNull()) return; devices_.remove(id); } emit DeviceRemoved(id); } void GioLister::MountAdded(GMount* mount) { g_object_ref(mount); DeviceInfo info; info.ReadVolumeInfo(g_mount_get_volume(mount)); #ifdef HAVE_AUDIOCD if (info.volume_root_uri.startsWith("cdda")) // Audio CD devices are already handled by CDDA lister return; #endif info.ReadMountInfo(mount); info.ReadDriveInfo(g_mount_get_drive(mount)); if (!info.is_suitable()) return; QString old_id; { QMutexLocker l(&mutex_); // The volume might already exist - either mounted or unmounted. for (const QString& id : devices_.keys()) { if (devices_[id].volume == info.volume) { old_id = id; break; } } if (!old_id.isEmpty() && old_id != info.unique_id()) { // If the ID has changed (for example, after it's been mounted), we need // to remove the old device. devices_.remove(old_id); emit DeviceRemoved(old_id); old_id = QString(); } devices_[info.unique_id()] = info; } if (!old_id.isEmpty()) emit DeviceChanged(old_id); else { emit DeviceAdded(info.unique_id()); } } void GioLister::MountChanged(GMount* mount) { QString id; { QMutexLocker l(&mutex_); id = FindUniqueIdByMount(mount); if (id.isNull()) return; g_object_ref(mount); DeviceInfo new_info; new_info.ReadMountInfo(mount); new_info.ReadVolumeInfo(g_mount_get_volume(mount)); new_info.ReadDriveInfo(g_mount_get_drive(mount)); // Ignore the change if the new info is useless if (new_info.invalid_enclosing_mount || (devices_[id].filesystem_size != 0 && new_info.filesystem_size == 0) || (!devices_[id].filesystem_type.isEmpty() && new_info.filesystem_type.isEmpty())) return; devices_[id] = new_info; } emit DeviceChanged(id); } void GioLister::MountRemoved(GMount* mount) { QString id; { QMutexLocker l(&mutex_); id = FindUniqueIdByMount(mount); if (id.isNull()) return; devices_.remove(id); } emit DeviceRemoved(id); } QString GioLister::DeviceInfo::ConvertAndFree(char* str) { QString ret = QString::fromUtf8(str); g_free(str); return ret; } void GioLister::DeviceInfo::ReadMountInfo(GMount* mount) { // Get basic information this->mount.reset_without_add(mount); if (!mount) return; mount_name = ConvertAndFree(g_mount_get_name(mount)); // Get the icon name(s) mount_icon_names.clear(); GIcon* icon = g_mount_get_icon(mount); if (G_IS_THEMED_ICON(icon)) { const char* const* icons = g_themed_icon_get_names(G_THEMED_ICON(icon)); for (const char* const* p = icons; *p; ++p) { mount_icon_names << QString::fromUtf8(*p); } } g_object_unref(icon); GFile* root = g_mount_get_root(mount); // Get the mount path mount_path = ConvertAndFree(g_file_get_path(root)); mount_uri = ConvertAndFree(g_file_get_uri(root)); // Do a sanity check to make sure the root is actually this mount - when a // device is unmounted GIO sends a changed signal before the removed signal, // and we end up reading information about the / filesystem by mistake. GError* error = nullptr; GMount* actual_mount = g_file_find_enclosing_mount(root, nullptr, &error); if (error || !actual_mount) { g_error_free(error); invalid_enclosing_mount = true; } else if (actual_mount) { g_object_unref(actual_mount); } // Query the filesystem info for size, free space, and type error = nullptr; GFileInfo* info = g_file_query_filesystem_info( root, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE "," G_FILE_ATTRIBUTE_FILESYSTEM_FREE "," G_FILE_ATTRIBUTE_FILESYSTEM_TYPE, nullptr, &error); if (error) { qLog(Warning) << error->message; g_error_free(error); } else { filesystem_size = g_file_info_get_attribute_uint64( info, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE); filesystem_free = g_file_info_get_attribute_uint64( info, G_FILE_ATTRIBUTE_FILESYSTEM_FREE); filesystem_type = QString::fromUtf8(g_file_info_get_attribute_string( info, G_FILE_ATTRIBUTE_FILESYSTEM_TYPE)); g_object_unref(info); } // Query the file's info for a filesystem ID // Only afc devices (that I know of) give reliably unique IDs if (filesystem_type == "afc") { error = nullptr; info = g_file_query_info(root, G_FILE_ATTRIBUTE_ID_FILESYSTEM, G_FILE_QUERY_INFO_NONE, nullptr, &error); if (error) { qLog(Warning) << error->message; g_error_free(error); } else { mount_uuid = QString::fromUtf8(g_file_info_get_attribute_string( info, G_FILE_ATTRIBUTE_ID_FILESYSTEM)); g_object_unref(info); } } g_object_unref(root); } void GioLister::DeviceInfo::ReadVolumeInfo(GVolume* volume) { this->volume.reset_without_add(volume); if (!volume) return; volume_name = ConvertAndFree(g_volume_get_name(volume)); volume_uuid = ConvertAndFree(g_volume_get_uuid(volume)); volume_unix_device = ConvertAndFree( g_volume_get_identifier(volume, G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE)); GFile* root = g_volume_get_activation_root(volume); if (root) { volume_root_uri = g_file_get_uri(root); g_object_unref(root); } } void GioLister::DeviceInfo::ReadDriveInfo(GDrive* drive) { this->drive.reset_without_add(drive); if (!drive) return; drive_name = ConvertAndFree(g_drive_get_name(drive)); drive_removable = g_drive_is_media_removable(drive); } QString GioLister::FindUniqueIdByMount(GMount* mount) const { for (const DeviceInfo& info : devices_) { if (info.mount == mount) return info.unique_id(); } return QString(); } QString GioLister::FindUniqueIdByVolume(GVolume* volume) const { for (const DeviceInfo& info : devices_) { if (info.volume == volume) return info.unique_id(); } return QString(); } void GioLister::VolumeEjectFinished(GObject* object, GAsyncResult* result, gpointer) { OperationFinished( std::bind(g_volume_eject_with_operation_finish, _1, _2, _3), object, result); } void GioLister::MountEjectFinished(GObject* object, GAsyncResult* result, gpointer) { OperationFinished( std::bind(g_mount_eject_with_operation_finish, _1, _2, _3), object, result); } void GioLister::MountUnmountFinished(GObject* object, GAsyncResult* result, gpointer) { OperationFinished( std::bind(g_mount_unmount_with_operation_finish, _1, _2, _3), object, result); } void GioLister::UnmountDevice(const QString& id) { QMutexLocker l(&mutex_); if (!devices_.contains(id)) return; const DeviceInfo& info = devices_[id]; if (!info.mount) return; if (info.volume) { if (g_volume_can_eject(info.volume)) { g_volume_eject_with_operation( info.volume, G_MOUNT_UNMOUNT_NONE, nullptr, nullptr, (GAsyncReadyCallback)VolumeEjectFinished, nullptr); g_object_unref(info.volume); return; } } if (g_mount_can_eject(info.mount)) { g_mount_eject_with_operation( info.mount, G_MOUNT_UNMOUNT_NONE, nullptr, nullptr, (GAsyncReadyCallback)MountEjectFinished, nullptr); } else if (g_mount_can_unmount(info.mount)) { g_mount_unmount_with_operation( info.mount, G_MOUNT_UNMOUNT_NONE, nullptr, nullptr, (GAsyncReadyCallback)MountUnmountFinished, nullptr); } } void GioLister::UpdateDeviceFreeSpace(const QString& id) { { QMutexLocker l(&mutex_); if (!devices_.contains(id)) return; DeviceInfo& device_info = devices_[id]; GFile* root = g_mount_get_root(device_info.mount); GError* error = nullptr; GFileInfo* info = g_file_query_filesystem_info( root, G_FILE_ATTRIBUTE_FILESYSTEM_FREE, nullptr, &error); if (error) { qLog(Warning) << error->message; g_error_free(error); } else { device_info.filesystem_free = g_file_info_get_attribute_uint64( info, G_FILE_ATTRIBUTE_FILESYSTEM_FREE); g_object_unref(info); } g_object_unref(root); } emit DeviceChanged(id); } bool GioLister::DeviceNeedsMount(const QString& id) { QMutexLocker l(&mutex_); return devices_.contains(id) && !devices_[id].mount; } int GioLister::MountDevice(const QString& id) { const int request_id = next_mount_request_id_++; metaObject()->invokeMethod(this, "DoMountDevice", Qt::QueuedConnection, Q_ARG(QString, id), Q_ARG(int, request_id)); return request_id; } void GioLister::DoMountDevice(const QString& id, int request_id) { QMutexLocker l(&mutex_); if (!devices_.contains(id)) { emit DeviceMounted(id, request_id, false); return; } const DeviceInfo& info = devices_[id]; if (info.mount) { // Already mounted emit DeviceMounted(id, request_id, true); return; } g_volume_mount(info.volume, G_MOUNT_MOUNT_NONE, nullptr, nullptr, VolumeMountFinished, nullptr); emit DeviceMounted(id, request_id, true); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/giolister.h000066400000000000000000000106061260417502300237550ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef GIOLISTER_H #define GIOLISTER_H #include "devicelister.h" #include "core/scopedgobject.h" // Work around compile issue with glib >= 2.25 #ifdef signals #undef signals #endif #include #include #include class GioLister : public DeviceLister { Q_OBJECT public: GioLister() {} int priority() const { return 50; } QStringList DeviceUniqueIDs(); QVariantList DeviceIcons(const QString& id); QString DeviceManufacturer(const QString& id); QString DeviceModel(const QString& id); quint64 DeviceCapacity(const QString& id); quint64 DeviceFreeSpace(const QString& id); QVariantMap DeviceHardwareInfo(const QString& id); bool DeviceNeedsMount(const QString& id); QString MakeFriendlyName(const QString& id); QList MakeDeviceUrls(const QString& id); int MountDevice(const QString& id); void UnmountDevice(const QString& id); public slots: void UpdateDeviceFreeSpace(const QString& id); protected: void Init(); private: struct DeviceInfo { DeviceInfo() : drive_removable(false), filesystem_size(0), filesystem_free(0), invalid_enclosing_mount(false) {} QString unique_id() const; bool is_suitable() const; static QString ConvertAndFree(char* str); void ReadDriveInfo(GDrive* drive); void ReadVolumeInfo(GVolume* volume); void ReadMountInfo(GMount* mount); // Only available if it's a physical drive ScopedGObject volume; QString volume_name; QString volume_unix_device; QString volume_root_uri; QString volume_uuid; // Only available if it's a physical drive ScopedGObject drive; QString drive_name; bool drive_removable; // Only available if it's mounted ScopedGObject mount; QString mount_path; QString mount_uri; QString mount_name; QStringList mount_icon_names; QString mount_uuid; quint64 filesystem_size; quint64 filesystem_free; QString filesystem_type; bool invalid_enclosing_mount; }; void VolumeAdded(GVolume* volume); void VolumeRemoved(GVolume* volume); void MountAdded(GMount* mount); void MountChanged(GMount* mount); void MountRemoved(GMount* mount); static void VolumeAddedCallback(GVolumeMonitor*, GVolume*, gpointer); static void VolumeRemovedCallback(GVolumeMonitor*, GVolume*, gpointer); static void MountAddedCallback(GVolumeMonitor*, GMount*, gpointer); static void MountChangedCallback(GVolumeMonitor*, GMount*, gpointer); static void MountRemovedCallback(GVolumeMonitor*, GMount*, gpointer); static void VolumeMountFinished(GObject* object, GAsyncResult* result, gpointer); static void VolumeEjectFinished(GObject* object, GAsyncResult* result, gpointer); static void MountEjectFinished(GObject* object, GAsyncResult* result, gpointer); static void MountUnmountFinished(GObject* object, GAsyncResult* result, gpointer); // You MUST hold the mutex while calling this function QString FindUniqueIdByMount(GMount* mount) const; QString FindUniqueIdByVolume(GVolume* volume) const; template T LockAndGetDeviceInfo(const QString& id, T DeviceInfo::*field); private slots: void DoMountDevice(const QString& id, int request_id); private: ScopedGObject monitor_; QMutex mutex_; QMap devices_; }; template T GioLister::LockAndGetDeviceInfo(const QString& id, T DeviceInfo::*field) { QMutexLocker l(&mutex_); if (!devices_.contains(id)) return T(); return devices_[id].*field; } #endif // GIOLISTER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/gpoddevice.cpp000066400000000000000000000150271260417502300244220ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "devicemanager.h" #include "gpoddevice.h" #include "gpodloader.h" #include "core/logging.h" #include "core/application.h" #include "library/librarybackend.h" #include "library/librarymodel.h" #include #include #include #include #include GPodDevice::GPodDevice(const QUrl& url, DeviceLister* lister, const QString& unique_id, DeviceManager* manager, Application* app, int database_id, bool first_time) : ConnectedDevice(url, lister, unique_id, manager, app, database_id, first_time), loader_thread_(new QThread(this)), loader_(nullptr), db_(nullptr) {} void GPodDevice::Init() { InitBackendDirectory(url_.path(), first_time_); model_->Init(); loader_ = new GPodLoader(url_.path(), app_->task_manager(), backend_, shared_from_this()); loader_->moveToThread(loader_thread_); connect(loader_, SIGNAL(Error(QString)), SIGNAL(Error(QString))); connect(loader_, SIGNAL(TaskStarted(int)), SIGNAL(TaskStarted(int))); connect(loader_, SIGNAL(LoadFinished(Itdb_iTunesDB*)), SLOT(LoadFinished(Itdb_iTunesDB*))); connect(loader_thread_, SIGNAL(started()), loader_, SLOT(LoadDatabase())); loader_thread_->start(); } GPodDevice::~GPodDevice() {} void GPodDevice::LoadFinished(Itdb_iTunesDB* db) { QMutexLocker l(&db_mutex_); db_ = db; db_wait_cond_.wakeAll(); loader_->deleteLater(); loader_ = nullptr; } bool GPodDevice::StartCopy(QList* supported_filetypes) { { // Wait for the database to be loaded QMutexLocker l(&db_mutex_); if (!db_) db_wait_cond_.wait(&db_mutex_); } // Ensure only one "organise files" can be active at any one time db_busy_.lock(); if (supported_filetypes) GetSupportedFiletypes(supported_filetypes); return true; } Itdb_Track* GPodDevice::AddTrackToITunesDb(const Song& metadata) { // Create the track Itdb_Track* track = itdb_track_new(); metadata.ToItdb(track); // Add it to the DB and the master playlist // The DB takes ownership of the track itdb_track_add(db_, track, -1); Itdb_Playlist* mpl = itdb_playlist_mpl(db_); itdb_playlist_add_track(mpl, track, -1); return track; } void GPodDevice::AddTrackToModel(Itdb_Track* track, const QString& prefix) { // Add it to our LibraryModel Song metadata_on_device; metadata_on_device.InitFromItdb(track, prefix); metadata_on_device.set_directory_id(1); songs_to_add_ << metadata_on_device; } bool GPodDevice::CopyToStorage(const CopyJob& job) { Q_ASSERT(db_); Itdb_Track* track = AddTrackToITunesDb(job.metadata_); // Copy the file GError* error = nullptr; itdb_cp_track_to_ipod( track, QDir::toNativeSeparators(job.source_).toLocal8Bit().constData(), &error); if (error) { qLog(Error) << "copying failed:" << error->message; app_->AddError(QString::fromUtf8(error->message)); g_error_free(error); // Need to remove the track from the db again itdb_track_remove(track); return false; } AddTrackToModel(track, url_.path()); // Remove the original if it was requested if (job.remove_original_) { QFile::remove(job.source_); } return true; } void GPodDevice::WriteDatabase(bool success) { if (success) { // Write the itunes database GError* error = nullptr; itdb_write(db_, &error); if (error) { qLog(Error) << "writing database failed:" << error->message; app_->AddError(QString::fromUtf8(error->message)); g_error_free(error); } else { FinaliseDatabase(); // Update the library model if (!songs_to_add_.isEmpty()) backend_->AddOrUpdateSongs(songs_to_add_); if (!songs_to_remove_.isEmpty()) backend_->DeleteSongs(songs_to_remove_); } } songs_to_add_.clear(); songs_to_remove_.clear(); db_busy_.unlock(); } void GPodDevice::FinishCopy(bool success) { WriteDatabase(success); ConnectedDevice::FinishCopy(success); } void GPodDevice::StartDelete() { StartCopy(nullptr); } bool GPodDevice::RemoveTrackFromITunesDb(const QString& path, const QString& relative_to) { QString ipod_filename = path; if (!relative_to.isEmpty() && path.startsWith(relative_to)) ipod_filename.remove( 0, relative_to.length() + (relative_to.endsWith('/') ? -1 : 0)); ipod_filename.replace('/', ':'); // Find the track in the itdb, identify it by its filename Itdb_Track* track = nullptr; for (GList* tracks = db_->tracks; tracks != nullptr; tracks = tracks->next) { Itdb_Track* t = static_cast(tracks->data); if (t->ipod_path == ipod_filename) { track = t; break; } } if (track == nullptr) { qLog(Warning) << "Couldn't find song" << path << "in iTunesDB"; return false; } // Remove the track from all playlists for (GList* playlists = db_->playlists; playlists != nullptr; playlists = playlists->next) { Itdb_Playlist* playlist = static_cast(playlists->data); if (itdb_playlist_contains_track(playlist, track)) { itdb_playlist_remove_track(playlist, track); } } // Remove the track from the database, this frees the struct too itdb_track_remove(track); return true; } bool GPodDevice::DeleteFromStorage(const DeleteJob& job) { Q_ASSERT(db_); if (!RemoveTrackFromITunesDb(job.metadata_.url().toLocalFile(), url_.path())) return false; // Remove the file if (!QFile::remove(job.metadata_.url().toLocalFile())) return false; // Remove it from our library model songs_to_remove_ << job.metadata_; return true; } void GPodDevice::FinishDelete(bool success) { WriteDatabase(success); ConnectedDevice::FinishDelete(success); } bool GPodDevice::GetSupportedFiletypes(QList* ret) { *ret << Song::Type_Mp4; *ret << Song::Type_Mpeg; return true; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/gpoddevice.h000066400000000000000000000043521260417502300240660ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef GPODDEVICE_H #define GPODDEVICE_H #include "connecteddevice.h" #include "core/musicstorage.h" #include #include #include class GPodLoader; class GPodDevice : public ConnectedDevice, public virtual MusicStorage { Q_OBJECT public: Q_INVOKABLE GPodDevice(const QUrl& url, DeviceLister* lister, const QString& unique_id, DeviceManager* manager, Application* app, int database_id, bool first_time); ~GPodDevice(); void Init(); static QStringList url_schemes() { return QStringList() << "ipod"; } bool GetSupportedFiletypes(QList* ret); bool StartCopy(QList* supported_types); bool CopyToStorage(const CopyJob& job); void FinishCopy(bool success); void StartDelete(); bool DeleteFromStorage(const DeleteJob& job); void FinishDelete(bool success); protected slots: void LoadFinished(Itdb_iTunesDB* db); protected: Itdb_Track* AddTrackToITunesDb(const Song& metadata); void AddTrackToModel(Itdb_Track* track, const QString& prefix); bool RemoveTrackFromITunesDb(const QString& path, const QString& relative_to = QString()); virtual void FinaliseDatabase() {} private: void WriteDatabase(bool success); protected: QThread* loader_thread_; GPodLoader* loader_; QWaitCondition db_wait_cond_; QMutex db_mutex_; Itdb_iTunesDB* db_; QMutex db_busy_; SongList songs_to_add_; SongList songs_to_remove_; }; #endif // GPODDEVICE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/gpodloader.cpp000066400000000000000000000055341260417502300244330ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "connecteddevice.h" #include "gpodloader.h" #include "core/logging.h" #include "core/song.h" #include "core/taskmanager.h" #include "library/librarybackend.h" #include #include #include GPodLoader::GPodLoader(const QString& mount_point, TaskManager* task_manager, LibraryBackend* backend, std::shared_ptr device) : QObject(nullptr), device_(device), mount_point_(mount_point), type_(Song::Type_Unknown), task_manager_(task_manager), backend_(backend) { original_thread_ = thread(); } GPodLoader::~GPodLoader() {} void GPodLoader::LoadDatabase() { int task_id = task_manager_->StartTask(tr("Loading iPod database")); emit TaskStarted(task_id); // Load the iTunes database GError* error = nullptr; Itdb_iTunesDB* db = itdb_parse(QDir::toNativeSeparators(mount_point_).toLocal8Bit(), &error); // Check for errors if (!db) { if (error) { qLog(Error) << "loading database failed:" << error->message; emit Error(QString::fromUtf8(error->message)); g_error_free(error); } else { emit Error(tr("An error occurred loading the iTunes database")); } task_manager_->SetTaskFinished(task_id); return; } // Convert all the tracks from libgpod structs into Song classes const QString prefix = path_prefix_.isEmpty() ? QDir::fromNativeSeparators(mount_point_) : path_prefix_; SongList songs; for (GList* tracks = db->tracks; tracks != nullptr; tracks = tracks->next) { Itdb_Track* track = static_cast(tracks->data); Song song; song.InitFromItdb(track, prefix); song.set_directory_id(1); if (type_ != Song::Type_Unknown) song.set_filetype(type_); songs << song; } // Need to remove all the existing songs in the database first backend_->DeleteSongs(backend_->FindSongsInDirectory(1)); // Add the songs we've just loaded backend_->AddOrUpdateSongs(songs); moveToThread(original_thread_); task_manager_->SetTaskFinished(task_id); emit LoadFinished(db); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/gpodloader.h000066400000000000000000000032341260417502300240730ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef GPODLOADER_H #define GPODLOADER_H #include #include #include #include "core/song.h" class ConnectedDevice; class LibraryBackend; class TaskManager; class GPodLoader : public QObject { Q_OBJECT public: GPodLoader(const QString& mount_point, TaskManager* task_manager, LibraryBackend* backend, std::shared_ptr device); ~GPodLoader(); void set_music_path_prefix(const QString& prefix) { path_prefix_ = prefix; } void set_song_type(Song::FileType type) { type_ = type; } public slots: void LoadDatabase(); signals: void Error(const QString& message); void TaskStarted(int task_id); void LoadFinished(Itdb_iTunesDB* db); private: std::shared_ptr device_; QThread* original_thread_; QString mount_point_; QString path_prefix_; Song::FileType type_; TaskManager* task_manager_; LibraryBackend* backend_; }; #endif // GPODLOADER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/macdevicelister.h000066400000000000000000000046621260417502300251240ustar00rootroot00000000000000#ifndef MACDEVICELISTER_H #define MACDEVICELISTER_H #include "devicelister.h" #include #include #include #include #include #include class MacDeviceLister : public DeviceLister { Q_OBJECT public: MacDeviceLister(); ~MacDeviceLister(); virtual QStringList DeviceUniqueIDs(); virtual QVariantList DeviceIcons(const QString& id); virtual QString DeviceManufacturer(const QString& id); virtual QString DeviceModel(const QString& id); virtual quint64 DeviceCapacity(const QString& id); virtual quint64 DeviceFreeSpace(const QString& id); virtual QVariantMap DeviceHardwareInfo(const QString& id); virtual bool AskForScan(const QString& serial) const; virtual QString MakeFriendlyName(const QString& id); virtual QList MakeDeviceUrls(const QString& id); virtual void UnmountDevice(const QString& id); virtual void UpdateDeviceFreeSpace(const QString& id); struct MTPDevice { MTPDevice() : capacity(0), free_space(0) {} QString vendor; QString product; quint16 vendor_id; quint16 product_id; int quirks; int bus; int address; quint64 capacity; quint64 free_space; }; public slots: virtual void ShutDown(); private: virtual void Init(); static void DiskAddedCallback(DADiskRef disk, void* context); static void DiskRemovedCallback(DADiskRef disk, void* context); static void USBDeviceAddedCallback(void* refcon, io_iterator_t it); static void USBDeviceRemovedCallback(void* refcon, io_iterator_t it); static void DiskUnmountCallback(DADiskRef disk, DADissenterRef dissenter, void* context); void FoundMTPDevice(const MTPDevice& device, const QString& serial); void RemovedMTPDevice(const QString& serial); quint64 GetFreeSpace(const QUrl& url); quint64 GetCapacity(const QUrl& url); bool IsCDDevice(const QString& serial) const; DASessionRef loop_session_; CFRunLoopRef run_loop_; QMap current_devices_; QMap mtp_devices_; QSet cd_devices_; QMutex libmtp_mutex_; static QSet sMTPDeviceList; }; uint qHash(const MacDeviceLister::MTPDevice& device); inline bool operator==(const MacDeviceLister::MTPDevice& a, const MacDeviceLister::MTPDevice& b) { return (a.vendor_id == b.vendor_id) && (a.product_id == b.product_id); } #endif clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/macdevicelister.mm000066400000000000000000000705071260417502300253070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "config.h" #include "macdevicelister.h" #include "mtpconnection.h" #include "core/logging.h" #include "core/scoped_cftyperef.h" #include "core/scoped_nsautorelease_pool.h" #include "core/scoped_nsobject.h" #include #include #include #include #include #include #include #import #import #import #import #import #import #include #include #include #include #include #include #ifndef kUSBSerialNumberString #define kUSBSerialNumberString "USB Serial Number" #endif #ifndef kUSBVendorString #define kUSBVendorString "USB Vendor Name" #endif #ifndef kUSBProductString #define kUSBProductString "USB Product Name" #endif // io_object_t, io_service_t, io_iterator_t etc. are all typedef'd to unsigned // int, // hence the lack of templating here. class ScopedIOObject { public: explicit ScopedIOObject(io_object_t object = 0) : object_(object) {} ~ScopedIOObject() { if (object_) IOObjectRelease(object_); } io_object_t get() const { return object_; } private: io_object_t object_; Q_DISABLE_COPY(ScopedIOObject); }; // Helpful MTP & USB links: // Apple USB device interface guide: // http://developer.apple.com/mac/library/documentation/DeviceDrivers/Conceptual/USBBook/USBDeviceInterfaces/USBDevInterfaces.html // Example Apple code for requesting a USB device descriptor: // http://www.opensource.apple.com/source/IOUSBFamily/IOUSBFamily-208.4.5/USBProber/BusProbeClass.m // Libmtp's detection code: // http://libmtp.cvs.sourceforge.net/viewvc/libmtp/libmtp/src/libusb-glue.c?view=markup // Libusb's Mac code: // http://www.libusb.org/browser/libusb/libusb/os/darwin_usb.c // Microsoft OS Descriptors: // http://www.microsoft.com/whdc/connect/usb/os_desc.mspx // Symbian docs for implementing the device side: // http://developer.symbian.org/main/documentation/reference/s3/pdk/GUID-3FF0F248-EDF0-5348-BC43-869CE1B5B415.html // Libgphoto2 MTP detection code: // http://www.sfr-fresh.com/unix/privat/libgphoto2-2.4.10.1.tar.gz:a/libgphoto2-2.4.10.1/libgphoto2_port/usb/check-mtp-device.c QSet MacDeviceLister::sMTPDeviceList; uint qHash(const MacDeviceLister::MTPDevice& d) { return qHash(d.vendor_id) ^ qHash(d.product_id); } MacDeviceLister::MacDeviceLister() {} MacDeviceLister::~MacDeviceLister() { CFRelease(loop_session_); } void MacDeviceLister::Init() { ScopedNSAutoreleasePool pool; // Populate MTP Device list. if (sMTPDeviceList.empty()) { LIBMTP_device_entry_t* devices = nullptr; int num = 0; if (LIBMTP_Get_Supported_Devices_List(&devices, &num) != 0) { qLog(Warning) << "Failed to get MTP device list"; } else { for (int i = 0; i < num; ++i) { LIBMTP_device_entry_t device = devices[i]; MTPDevice d; d.vendor = QString::fromAscii(device.vendor); d.vendor_id = device.vendor_id; d.product = QString::fromAscii(device.product); d.product_id = device.product_id; d.quirks = device.device_flags; sMTPDeviceList << d; } } MTPDevice d; d.vendor = "SanDisk"; d.vendor_id = 0x781; d.product = "Sansa Clip+"; d.product_id = 0x74d0; d.quirks = 0x2 | 0x4 | 0x40 | 0x4000; sMTPDeviceList << d; } run_loop_ = CFRunLoopGetCurrent(); // Register for disk mounts/unmounts. loop_session_ = DASessionCreate(kCFAllocatorDefault); DARegisterDiskAppearedCallback( loop_session_, kDADiskDescriptionMatchVolumeMountable, &DiskAddedCallback, reinterpret_cast(this)); DARegisterDiskDisappearedCallback(loop_session_, nullptr, &DiskRemovedCallback, reinterpret_cast(this)); DASessionScheduleWithRunLoop(loop_session_, run_loop_, kCFRunLoopDefaultMode); // Register for USB device connection/disconnection. IONotificationPortRef notification_port = IONotificationPortCreate(kIOMasterPortDefault); CFMutableDictionaryRef matching_dict = IOServiceMatching(kIOUSBDeviceClassName); // IOServiceAddMatchingNotification decreases reference count. CFRetain(matching_dict); io_iterator_t it; kern_return_t err = IOServiceAddMatchingNotification( notification_port, kIOFirstMatchNotification, matching_dict, &USBDeviceAddedCallback, reinterpret_cast(this), &it); if (err == KERN_SUCCESS) { USBDeviceAddedCallback(this, it); } else { qLog(Warning) << "Could not add notification on USB device connection"; } err = IOServiceAddMatchingNotification( notification_port, kIOTerminatedNotification, matching_dict, &USBDeviceRemovedCallback, reinterpret_cast(this), &it); if (err == KERN_SUCCESS) { USBDeviceRemovedCallback(this, it); } else { qLog(Warning) << "Could not add notification USB device removal"; } CFRunLoopSourceRef io_source = IONotificationPortGetRunLoopSource(notification_port); CFRunLoopAddSource(run_loop_, io_source, kCFRunLoopDefaultMode); CFRunLoopRun(); } void MacDeviceLister::ShutDown() { CFRunLoopStop(run_loop_); } // IOKit helpers. namespace { // Caller is responsible for calling CFRelease(). CFTypeRef GetUSBRegistryEntry(io_object_t device, CFStringRef key) { io_iterator_t it; if (IORegistryEntryGetParentIterator(device, kIOServicePlane, &it) == KERN_SUCCESS) { io_object_t next; while ((next = IOIteratorNext(it))) { CFTypeRef registry_entry = (CFStringRef)IORegistryEntryCreateCFProperty( next, key, kCFAllocatorDefault, 0); if (registry_entry) { IOObjectRelease(next); IOObjectRelease(it); return registry_entry; } CFTypeRef ret = GetUSBRegistryEntry(next, key); if (ret) { IOObjectRelease(next); IOObjectRelease(it); return ret; } IOObjectRelease(next); } } IOObjectRelease(it); return nullptr; } QString GetUSBRegistryEntryString(io_object_t device, CFStringRef key) { ScopedCFTypeRef registry_string( (CFStringRef)GetUSBRegistryEntry(device, key)); if (registry_string) { return QString::fromUtf8([(NSString*)registry_string.get() UTF8String]); } return QString(); } NSObject* GetPropertyForDevice(io_object_t device, CFStringRef key) { CFMutableDictionaryRef properties; kern_return_t ret = IORegistryEntryCreateCFProperties(device, &properties, kCFAllocatorDefault, 0); if (ret != KERN_SUCCESS) { return nil; } scoped_nsobject dict( (NSDictionary*)properties); // Takes ownership. NSObject* prop = [dict objectForKey:(NSString*)key]; if (prop) { // The dictionary goes out of scope so we should retain this object. [prop retain]; return prop; } io_object_t parent; ret = IORegistryEntryGetParentEntry(device, kIOServicePlane, &parent); if (ret == KERN_SUCCESS) { return GetPropertyForDevice(parent, key); } return nil; } int GetUSBDeviceClass(io_object_t device) { ScopedCFTypeRef interface_class(IORegistryEntrySearchCFProperty( device, kIOServicePlane, CFSTR(kUSBInterfaceClass), kCFAllocatorDefault, kIORegistryIterateRecursively)); NSNumber* number = (NSNumber*)interface_class.get(); if (number) { int ret = [number unsignedShortValue]; return ret; } return 0; } QString GetIconForDevice(io_object_t device) { scoped_nsobject media_icon( (NSDictionary*)GetPropertyForDevice(device, CFSTR("IOMediaIcon"))); if (media_icon) { NSString* bundle = (NSString*)[media_icon objectForKey:@"CFBundleIdentifier"]; NSString* file = (NSString*)[media_icon objectForKey:@"IOBundleResourceFile"]; scoped_nsobject bundle_url( (NSURL*)KextManagerCreateURLForBundleIdentifier(kCFAllocatorDefault, (CFStringRef)bundle)); QString path = QString::fromUtf8([[bundle_url path] UTF8String]); path += "/Contents/Resources/"; path += QString::fromUtf8([file UTF8String]); return path; } return QString(); } QString GetSerialForDevice(io_object_t device) { QString serial = GetUSBRegistryEntryString(device, CFSTR(kUSBSerialNumberString)); if (!serial.isEmpty()) { return "USB/" + serial; } return QString(); } QString GetSerialForMTPDevice(io_object_t device) { scoped_nsobject serial( (NSString*)GetPropertyForDevice(device, CFSTR(kUSBSerialNumberString))); return QString(QString("MTP/") + QString::fromUtf8([serial UTF8String])); } QString FindDeviceProperty(const QString& bsd_name, CFStringRef property) { ScopedCFTypeRef session(DASessionCreate(kCFAllocatorDefault)); ScopedCFTypeRef disk(DADiskCreateFromBSDName( kCFAllocatorDefault, session.get(), bsd_name.toAscii().constData())); ScopedIOObject device(DADiskCopyIOMedia(disk.get())); QString ret = GetUSBRegistryEntryString(device.get(), property); return ret; } } quint64 MacDeviceLister::GetFreeSpace(const QUrl& url) { QMutexLocker l(&libmtp_mutex_); MtpConnection connection(url); if (!connection.is_valid()) { qLog(Warning) << "Error connecting to MTP device, couldn't get device free space"; return -1; } LIBMTP_devicestorage_t* storage = connection.device()->storage; quint64 free_bytes = 0; while (storage) { free_bytes += storage->FreeSpaceInBytes; storage = storage->next; } return free_bytes; } quint64 MacDeviceLister::GetCapacity(const QUrl& url) { QMutexLocker l(&libmtp_mutex_); MtpConnection connection(url); if (!connection.is_valid()) { qLog(Warning) << "Error connecting to MTP device, couldn't get device capacity"; return -1; } LIBMTP_devicestorage_t* storage = connection.device()->storage; quint64 capacity_bytes = 0; while (storage) { capacity_bytes += storage->MaxCapacity; storage = storage->next; } return capacity_bytes; } void MacDeviceLister::DiskAddedCallback(DADiskRef disk, void* context) { MacDeviceLister* me = reinterpret_cast(context); scoped_nsobject properties( (NSDictionary*)DADiskCopyDescription(disk)); NSString* kind = [properties objectForKey:(NSString*)kDADiskDescriptionMediaKindKey]; #ifdef HAVE_AUDIOCD if (kind && strcmp([kind UTF8String], kIOCDMediaClass) == 0) { // CD inserted. QString bsd_name = QString::fromAscii(DADiskGetBSDName(disk)); me->cd_devices_ << bsd_name; emit me->DeviceAdded(bsd_name); return; } #endif NSURL* volume_path = [[properties objectForKey:(NSString*)kDADiskDescriptionVolumePathKey] copy]; if (volume_path) { ScopedIOObject device(DADiskCopyIOMedia(disk)); ScopedCFTypeRef class_name(IOObjectCopyClass(device.get())); if (class_name && CFStringCompare(class_name.get(), CFSTR(kIOMediaClass), 0) == kCFCompareEqualTo) { QString vendor = GetUSBRegistryEntryString(device.get(), CFSTR(kUSBVendorString)); QString product = GetUSBRegistryEntryString(device.get(), CFSTR(kUSBProductString)); CFMutableDictionaryRef cf_properties; kern_return_t ret = IORegistryEntryCreateCFProperties( device.get(), &cf_properties, kCFAllocatorDefault, 0); if (ret == KERN_SUCCESS) { scoped_nsobject dict( (NSDictionary*)cf_properties); // Takes ownership. if ([[dict objectForKey:@"Removable"] intValue] == 1) { QString serial = GetSerialForDevice(device.get()); if (!serial.isEmpty()) { me->current_devices_[serial] = QString(DADiskGetBSDName(disk)); emit me->DeviceAdded(serial); } } } } } } void MacDeviceLister::DiskRemovedCallback(DADiskRef disk, void* context) { MacDeviceLister* me = reinterpret_cast(context); // We cannot access the USB tree when the disk is removed but we still get // the BSD disk name. QString bsd_name = QString::fromAscii(DADiskGetBSDName(disk)); if (me->cd_devices_.remove(bsd_name)) { emit me->DeviceRemoved(bsd_name); return; } for (QMap::iterator it = me->current_devices_.begin(); it != me->current_devices_.end(); ++it) { if (it.value() == bsd_name) { emit me->DeviceRemoved(it.key()); me->current_devices_.erase(it); break; } } } bool DeviceRequest(IOUSBDeviceInterface** dev, quint8 direction, quint8 type, quint8 recipient, quint8 request_code, quint16 value, quint16 index, quint16 length, QByteArray* data) { IOUSBDevRequest req; req.bmRequestType = USBmakebmRequestType(direction, type, recipient); req.bRequest = request_code; req.wValue = value; req.wIndex = index; req.wLength = length; data->resize(256); req.pData = data->data(); kern_return_t err = (*dev)->DeviceRequest(dev, &req); if (err != kIOReturnSuccess) { return false; } data->resize(req.wLenDone); return true; } int GetBusNumber(io_object_t o) { io_iterator_t it; kern_return_t err = IORegistryEntryGetParentIterator(o, kIOServicePlane, &it); if (err != KERN_SUCCESS) { return -1; } while ((o = IOIteratorNext(it))) { NSObject* bus = GetPropertyForDevice(o, CFSTR("USBBusNumber")); if (bus) { NSNumber* bus_num = (NSNumber*)bus; return [bus_num intValue]; } } return -1; } void MacDeviceLister::USBDeviceAddedCallback(void* refcon, io_iterator_t it) { MacDeviceLister* me = reinterpret_cast(refcon); io_object_t object; while ((object = IOIteratorNext(it))) { ScopedCFTypeRef class_name(IOObjectCopyClass(object)); BOOST_SCOPE_EXIT((object)) { IOObjectRelease(object); } BOOST_SCOPE_EXIT_END if (CFStringCompare(class_name.get(), CFSTR(kIOUSBDeviceClassName), 0) == kCFCompareEqualTo) { NSString* vendor = (NSString*)GetPropertyForDevice(object, CFSTR(kUSBVendorString)); NSString* product = (NSString*)GetPropertyForDevice(object, CFSTR(kUSBProductString)); NSNumber* vendor_id = (NSNumber*)GetPropertyForDevice(object, CFSTR(kUSBVendorID)); NSNumber* product_id = (NSNumber*)GetPropertyForDevice(object, CFSTR(kUSBProductID)); int interface_class = GetUSBDeviceClass(object); qLog(Debug) << "Interface class:" << interface_class; QString serial = GetSerialForMTPDevice(object); MTPDevice device; device.vendor = QString::fromUtf8([vendor UTF8String]); device.product = QString::fromUtf8([product UTF8String]); device.vendor_id = [vendor_id unsignedShortValue]; device.product_id = [product_id unsignedShortValue]; device.quirks = 0; device.bus = -1; device.address = -1; if (device.vendor_id == kAppleVendorID || // I think we can safely skip Apple products. // Blacklist ilok2 as this probe may be breaking it. (device.vendor_id == 0x088e && device.product_id == 0x5036) || // Blacklist eLicenser (device.vendor_id == 0x0819 && device.product_id == 0x0101) || // Skip HID devices, printers and hubs. interface_class == kUSBHIDInterfaceClass || interface_class == kUSBPrintingInterfaceClass || interface_class == kUSBHubClass) { continue; } NSNumber* addr = (NSNumber*)GetPropertyForDevice(object, CFSTR("USB Address")); int bus = GetBusNumber(object); if (!addr || bus == -1) { // Failed to get bus or address number. continue; } device.bus = bus; device.address = [addr intValue]; // First check the libmtp device list. QSet::const_iterator it = sMTPDeviceList.find(device); if (it != sMTPDeviceList.end()) { // Fill in quirks flags from libmtp. device.quirks = it->quirks; me->FoundMTPDevice(device, GetSerialForMTPDevice(object)); continue; } IOCFPlugInInterface** plugin_interface = nullptr; SInt32 score; kern_return_t err = IOCreatePlugInInterfaceForService( object, kIOUSBDeviceUserClientTypeID, kIOCFPlugInInterfaceID, &plugin_interface, &score); if (err != KERN_SUCCESS) { continue; } IOUSBDeviceInterface** dev = nullptr; HRESULT result = (*plugin_interface)->QueryInterface( plugin_interface, CFUUIDGetUUIDBytes(kIOUSBDeviceInterfaceID), (LPVOID*)&dev); (*plugin_interface)->Release(plugin_interface); if (result || !dev) { continue; } err = (*dev)->USBDeviceOpen(dev); if (err != kIOReturnSuccess) { continue; } // Automatically close & release usb device at scope exit. BOOST_SCOPE_EXIT((dev)) { (*dev)->USBDeviceClose(dev); (*dev)->Release(dev); } BOOST_SCOPE_EXIT_END // Request the string descriptor at 0xee. // This is a magic string that indicates whether this device supports MTP. QByteArray data; bool ret = DeviceRequest(dev, kUSBIn, kUSBStandard, kUSBDevice, kUSBRqGetDescriptor, (kUSBStringDesc << 8) | 0xee, 0x0409, 2, &data); if (!ret) continue; UInt8 string_len = data[0]; ret = DeviceRequest(dev, kUSBIn, kUSBStandard, kUSBDevice, kUSBRqGetDescriptor, (kUSBStringDesc << 8) | 0xee, 0x0409, string_len, &data); if (!ret) continue; // The device actually returned something. That's a good sign. // Because this was designed by MS, the characters are in UTF-16 (LE?). QString str = QString::fromUtf16( reinterpret_cast(data.data() + 2), (data.size() / 2) - 2); if (str.startsWith("MSFT100")) { // We got the OS descriptor! char vendor_code = data[16]; ret = DeviceRequest(dev, kUSBIn, kUSBVendor, kUSBDevice, vendor_code, 0, 4, 256, &data); if (!ret || data.at(0) != 0x28) continue; if (QString::fromAscii(data.data() + 0x12, 3) != "MTP") { // Not quite. continue; } ret = DeviceRequest(dev, kUSBIn, kUSBVendor, kUSBDevice, vendor_code, 0, 5, 256, &data); if (!ret || data.at(0) != 0x28) { continue; } if (QString::fromAscii(data.data() + 0x12, 3) != "MTP") { // Not quite. continue; } // Hurray! We made it! me->FoundMTPDevice(device, serial); } } } } void MacDeviceLister::USBDeviceRemovedCallback(void* refcon, io_iterator_t it) { MacDeviceLister* me = reinterpret_cast(refcon); io_object_t object; while ((object = IOIteratorNext(it))) { ScopedCFTypeRef class_name(IOObjectCopyClass(object)); BOOST_SCOPE_EXIT((object)) { IOObjectRelease(object); } BOOST_SCOPE_EXIT_END if (CFStringCompare(class_name.get(), CFSTR(kIOUSBDeviceClassName), 0) == kCFCompareEqualTo) { NSString* vendor = (NSString*)GetPropertyForDevice(object, CFSTR(kUSBVendorString)); NSString* product = (NSString*)GetPropertyForDevice(object, CFSTR(kUSBProductString)); NSNumber* vendor_id = (NSNumber*)GetPropertyForDevice(object, CFSTR(kUSBVendorID)); NSNumber* product_id = (NSNumber*)GetPropertyForDevice(object, CFSTR(kUSBProductID)); QString serial = GetSerialForMTPDevice(object); MTPDevice device; device.vendor = QString::fromUtf8([vendor UTF8String]); device.product = QString::fromUtf8([product UTF8String]); device.vendor_id = [vendor_id unsignedShortValue]; device.product_id = [product_id unsignedShortValue]; me->RemovedMTPDevice(serial); } } } void MacDeviceLister::RemovedMTPDevice(const QString& serial) { int count = mtp_devices_.remove(serial); if (count) { qLog(Debug) << "MTP device removed:" << serial; emit DeviceRemoved(serial); } } void MacDeviceLister::FoundMTPDevice(const MTPDevice& device, const QString& serial) { qLog(Debug) << "New MTP device detected!" << device.bus << device.address; mtp_devices_[serial] = device; QList urls = MakeDeviceUrls(serial); MTPDevice* d = &mtp_devices_[serial]; d->capacity = GetCapacity(urls[0]); d->free_space = GetFreeSpace(urls[0]); emit DeviceAdded(serial); } bool IsMTPSerial(const QString& serial) { return serial.startsWith("MTP"); } bool MacDeviceLister::IsCDDevice(const QString& serial) const { return cd_devices_.contains(serial); } QString MacDeviceLister::MakeFriendlyName(const QString& serial) { if (IsMTPSerial(serial)) { const MTPDevice& device = mtp_devices_[serial]; if (device.vendor.isEmpty()) { return device.product; } else { return device.vendor + " " + device.product; } } QString bsd_name = IsCDDevice(serial) ? *cd_devices_.find(serial) : current_devices_[serial]; ScopedCFTypeRef session(DASessionCreate(kCFAllocatorDefault)); ScopedCFTypeRef disk(DADiskCreateFromBSDName( kCFAllocatorDefault, session.get(), bsd_name.toAscii().constData())); if (IsCDDevice(serial)) { scoped_nsobject properties( (NSDictionary*)DADiskCopyDescription(disk.get())); NSString* device_name = (NSString*)[properties.get() objectForKey:(NSString*)kDADiskDescriptionMediaNameKey]; return QString::fromUtf8([device_name UTF8String]); } ScopedIOObject device(DADiskCopyIOMedia(disk)); QString vendor = GetUSBRegistryEntryString(device.get(), CFSTR(kUSBVendorString)); QString product = GetUSBRegistryEntryString(device.get(), CFSTR(kUSBProductString)); if (vendor.isEmpty()) { return product; } return vendor + " " + product; } QList MacDeviceLister::MakeDeviceUrls(const QString& serial) { if (IsMTPSerial(serial)) { const MTPDevice& device = mtp_devices_[serial]; QString str; str.sprintf("gphoto2://usb-%d-%d/", device.bus, device.address); QUrl url(str); url.addQueryItem("vendor", device.vendor); url.addQueryItem("vendor_id", QString::number(device.vendor_id)); url.addQueryItem("product", device.product); url.addQueryItem("product_id", QString::number(device.product_id)); url.addQueryItem("quirks", QString::number(device.quirks)); return QList() << url; } if (IsCDDevice(serial)) { return QList() << QUrl(QString("cdda:///dev/r" + serial)); } QString bsd_name = current_devices_[serial]; ScopedCFTypeRef session(DASessionCreate(kCFAllocatorDefault)); ScopedCFTypeRef disk(DADiskCreateFromBSDName( kCFAllocatorDefault, session.get(), bsd_name.toAscii().constData())); scoped_nsobject properties( (NSDictionary*)DADiskCopyDescription(disk.get())); scoped_nsobject volume_path([[properties objectForKey:(NSString*)kDADiskDescriptionVolumePathKey] copy]); QString path = QString::fromUtf8([[volume_path path] UTF8String]); QUrl ret = MakeUrlFromLocalPath(path); return QList() << ret; } QStringList MacDeviceLister::DeviceUniqueIDs() { return current_devices_.keys() + mtp_devices_.keys(); } QVariantList MacDeviceLister::DeviceIcons(const QString& serial) { if (IsMTPSerial(serial)) { return QVariantList(); } if (IsCDDevice(serial)) { return QVariantList() << "media-optical"; } QString bsd_name = current_devices_[serial]; ScopedCFTypeRef session(DASessionCreate(kCFAllocatorDefault)); ScopedCFTypeRef disk(DADiskCreateFromBSDName( kCFAllocatorDefault, session.get(), bsd_name.toAscii().constData())); ScopedIOObject device(DADiskCopyIOMedia(disk.get())); QString icon = GetIconForDevice(device.get()); scoped_nsobject properties( (NSDictionary*)DADiskCopyDescription(disk)); scoped_nsobject volume_path([[properties objectForKey:(NSString*)kDADiskDescriptionVolumePathKey] copy]); QString path = QString::fromUtf8([[volume_path path] UTF8String]); QVariantList ret; ret << GuessIconForPath(path); ret << GuessIconForModel(DeviceManufacturer(serial), DeviceModel(serial)); if (!icon.isEmpty()) { ret << icon; } return ret; } QString MacDeviceLister::DeviceManufacturer(const QString& serial) { if (IsMTPSerial(serial)) { return mtp_devices_[serial].vendor; } return FindDeviceProperty(current_devices_[serial], CFSTR(kUSBVendorString)); } QString MacDeviceLister::DeviceModel(const QString& serial) { if (IsMTPSerial(serial)) { return mtp_devices_[serial].product; } return FindDeviceProperty(current_devices_[serial], CFSTR(kUSBProductString)); } quint64 MacDeviceLister::DeviceCapacity(const QString& serial) { if (IsMTPSerial(serial)) { QList urls = MakeDeviceUrls(serial); return mtp_devices_[serial].capacity; } QString bsd_name = current_devices_[serial]; ScopedCFTypeRef session(DASessionCreate(kCFAllocatorDefault)); ScopedCFTypeRef disk(DADiskCreateFromBSDName( kCFAllocatorDefault, session.get(), bsd_name.toAscii().constData())); io_object_t device = DADiskCopyIOMedia(disk); NSNumber* capacity = (NSNumber*)GetPropertyForDevice(device, CFSTR("Size")); quint64 ret = [capacity unsignedLongLongValue]; IOObjectRelease(device); return ret; } quint64 MacDeviceLister::DeviceFreeSpace(const QString& serial) { if (IsMTPSerial(serial)) { QList urls = MakeDeviceUrls(serial); return mtp_devices_[serial].free_space; } QString bsd_name = current_devices_[serial]; ScopedCFTypeRef session(DASessionCreate(kCFAllocatorDefault)); ScopedCFTypeRef disk(DADiskCreateFromBSDName( kCFAllocatorDefault, session.get(), bsd_name.toAscii().constData())); scoped_nsobject properties( (NSDictionary*)DADiskCopyDescription(disk)); scoped_nsobject volume_path([[properties objectForKey:(NSString*)kDADiskDescriptionVolumePathKey] copy]); NSNumber* value = nil; NSError* error = nil; if ([volume_path getResourceValue:&value forKey:NSURLVolumeAvailableCapacityKey error:&error] && value) { return [value unsignedLongLongValue]; } return 0; } QVariantMap MacDeviceLister::DeviceHardwareInfo(const QString& serial) { return QVariantMap(); } bool MacDeviceLister::AskForScan(const QString& serial) const { return !IsCDDevice(serial); } void MacDeviceLister::UnmountDevice(const QString& serial) { if (IsMTPSerial(serial)) return; QString bsd_name = current_devices_[serial]; ScopedCFTypeRef disk(DADiskCreateFromBSDName( kCFAllocatorDefault, loop_session_, bsd_name.toAscii().constData())); DADiskUnmount(disk, kDADiskUnmountOptionDefault, &DiskUnmountCallback, this); } void MacDeviceLister::DiskUnmountCallback(DADiskRef disk, DADissenterRef dissenter, void* context) { if (dissenter) { qLog(Warning) << "Another app blocked the unmount"; } else { DiskRemovedCallback(disk, context); } } void MacDeviceLister::UpdateDeviceFreeSpace(const QString& serial) { if (IsMTPSerial(serial)) { if (mtp_devices_.contains(serial)) { QList urls = MakeDeviceUrls(serial); MTPDevice* d = &mtp_devices_[serial]; d->free_space = GetFreeSpace(urls[0]); } } emit DeviceChanged(serial); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/mtpconnection.cpp000066400000000000000000000054021260417502300251650ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "mtpconnection.h" #include "core/logging.h" #include #include MtpConnection::MtpConnection(const QUrl& url) : device_(nullptr) { QString hostname = url.host(); // Parse the URL QRegExp host_re("^usb-(\\d+)-(\\d+)$"); if (host_re.indexIn(hostname) == -1) { qLog(Warning) << "Invalid MTP device:" << hostname; return; } const unsigned int bus_location = host_re.cap(1).toInt(); const unsigned int device_num = host_re.cap(2).toInt(); if (url.hasQueryItem("vendor")) { LIBMTP_raw_device_t* raw_device = (LIBMTP_raw_device_t*)malloc(sizeof(LIBMTP_raw_device_t)); raw_device->device_entry.vendor = url.queryItemValue("vendor").toAscii().data(); raw_device->device_entry.product = url.queryItemValue("product").toAscii().data(); raw_device->device_entry.vendor_id = url.queryItemValue("vendor_id").toUShort(); raw_device->device_entry.product_id = url.queryItemValue("product_id").toUShort(); raw_device->device_entry.device_flags = url.queryItemValue("quirks").toUInt(); raw_device->bus_location = bus_location; raw_device->devnum = device_num; device_ = LIBMTP_Open_Raw_Device(raw_device); return; } // Get a list of devices from libmtp and figure out which one is ours int count = 0; LIBMTP_raw_device_t* raw_devices = nullptr; LIBMTP_error_number_t err = LIBMTP_Detect_Raw_Devices(&raw_devices, &count); if (err != LIBMTP_ERROR_NONE) { qLog(Warning) << "MTP error:" << err; return; } LIBMTP_raw_device_t* raw_device = nullptr; for (int i = 0; i < count; ++i) { if (raw_devices[i].bus_location == bus_location && raw_devices[i].devnum == device_num) { raw_device = &raw_devices[i]; break; } } if (!raw_device) { qLog(Warning) << "MTP device not found"; free(raw_devices); return; } // Connect to the device device_ = LIBMTP_Open_Raw_Device(raw_device); free(raw_devices); } MtpConnection::~MtpConnection() { if (device_) LIBMTP_Release_Device(device_); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/mtpconnection.h000066400000000000000000000021311260417502300246260ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MTPCONNECTION_H #define MTPCONNECTION_H #include #include class MtpConnection { public: MtpConnection(const QUrl& url); ~MtpConnection(); bool is_valid() const { return device_; } LIBMTP_mtpdevice_t* device() const { return device_; } private: Q_DISABLE_COPY(MtpConnection); LIBMTP_mtpdevice_t* device_; }; #endif // MTPCONNECTION_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/mtpdevice.cpp000066400000000000000000000142761260417502300242760ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "devicemanager.h" #include "mtpconnection.h" #include "mtpdevice.h" #include "mtploader.h" #include "core/application.h" #include "core/logging.h" #include "library/librarybackend.h" #include "library/librarymodel.h" #include #include #include bool MtpDevice::sInitialisedLibMTP = false; MtpDevice::MtpDevice(const QUrl& url, DeviceLister* lister, const QString& unique_id, DeviceManager* manager, Application* app, int database_id, bool first_time) : ConnectedDevice(url, lister, unique_id, manager, app, database_id, first_time), loader_thread_(new QThread(this)), loader_(nullptr) { if (!sInitialisedLibMTP) { LIBMTP_Init(); sInitialisedLibMTP = true; } } MtpDevice::~MtpDevice() {} void MtpDevice::Init() { InitBackendDirectory("/", first_time_, false); model_->Init(); loader_ = new MtpLoader(url_, app_->task_manager(), backend_, shared_from_this()); loader_->moveToThread(loader_thread_); connect(loader_, SIGNAL(Error(QString)), SIGNAL(Error(QString))); connect(loader_, SIGNAL(TaskStarted(int)), SIGNAL(TaskStarted(int))); connect(loader_, SIGNAL(LoadFinished()), SLOT(LoadFinished())); connect(loader_thread_, SIGNAL(started()), loader_, SLOT(LoadDatabase())); db_busy_.lock(); loader_thread_->start(); } void MtpDevice::LoadFinished() { loader_->deleteLater(); loader_ = nullptr; db_busy_.unlock(); } bool MtpDevice::StartCopy(QList* supported_types) { // Ensure only one "organise files" can be active at any one time db_busy_.lock(); // Connect to the device connection_.reset(new MtpConnection(url_)); // Did the caller want a list of supported types? if (supported_types) { if (!GetSupportedFiletypes(supported_types, connection_->device())) { FinishCopy(false); return false; } } return true; } static int ProgressCallback(uint64_t const sent, uint64_t const total, void const* const data) { const MusicStorage::CopyJob* job = reinterpret_cast(data); job->progress_(float(sent) / total); return 0; } bool MtpDevice::CopyToStorage(const CopyJob& job) { if (!connection_->is_valid()) return false; // Convert metadata LIBMTP_track_t track; job.metadata_.ToMTP(&track); // Send the file int ret = LIBMTP_Send_Track_From_File(connection_->device(), job.source_.toUtf8().constData(), &track, ProgressCallback, &job); if (ret != 0) return false; // Add it to our LibraryModel Song metadata_on_device; metadata_on_device.InitFromMTP(&track, url_.host()); metadata_on_device.set_directory_id(1); songs_to_add_ << metadata_on_device; // Remove the original if requested if (job.remove_original_) { if (!QFile::remove(job.source_)) return false; } return true; } void MtpDevice::FinishCopy(bool success) { if (success) { if (!songs_to_add_.isEmpty()) backend_->AddOrUpdateSongs(songs_to_add_); if (!songs_to_remove_.isEmpty()) backend_->DeleteSongs(songs_to_remove_); } songs_to_add_.clear(); songs_to_remove_.clear(); connection_.reset(); db_busy_.unlock(); ConnectedDevice::FinishCopy(success); } void MtpDevice::StartDelete() { StartCopy(nullptr); } bool MtpDevice::DeleteFromStorage(const DeleteJob& job) { // Extract the ID from the song's URL QString filename = job.metadata_.url().path(); filename.remove('/'); bool ok = false; uint32_t id = filename.toUInt(&ok); if (!ok) return false; // Remove the file int ret = LIBMTP_Delete_Object(connection_->device(), id); if (ret != 0) return false; // Remove it from our library model songs_to_remove_ << job.metadata_; return true; } void MtpDevice::FinishDelete(bool success) { FinishCopy(success); } bool MtpDevice::GetSupportedFiletypes(QList* ret) { QMutexLocker l(&db_busy_); MtpConnection connection(url_); if (!connection.is_valid()) { qLog(Warning) << "Error connecting to MTP device, couldn't get list of " "supported filetypes"; return false; } return GetSupportedFiletypes(ret, connection.device()); } bool MtpDevice::GetSupportedFiletypes(QList* ret, LIBMTP_mtpdevice_t* device) { uint16_t* list = nullptr; uint16_t length = 0; if (LIBMTP_Get_Supported_Filetypes(device, &list, &length) || !list || !length) return false; for (int i = 0; i < length; ++i) { switch (LIBMTP_filetype_t(list[i])) { case LIBMTP_FILETYPE_WAV: *ret << Song::Type_Wav; break; case LIBMTP_FILETYPE_MP2: case LIBMTP_FILETYPE_MP3: *ret << Song::Type_Mpeg; break; case LIBMTP_FILETYPE_WMA: *ret << Song::Type_Asf; break; case LIBMTP_FILETYPE_MP4: case LIBMTP_FILETYPE_M4A: case LIBMTP_FILETYPE_AAC: *ret << Song::Type_Mp4; break; case LIBMTP_FILETYPE_FLAC: *ret << Song::Type_Flac; *ret << Song::Type_OggFlac; break; case LIBMTP_FILETYPE_OGG: *ret << Song::Type_OggVorbis; *ret << Song::Type_OggSpeex; *ret << Song::Type_OggFlac; break; default: qLog(Error) << "Unknown MTP file format" << LIBMTP_Get_Filetype_Description( LIBMTP_filetype_t(list[i])); break; } } free(list); return true; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/mtpdevice.h000066400000000000000000000042621260417502300237350ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MTPDEVICE_H #define MTPDEVICE_H #include #include #include #include "connecteddevice.h" struct LIBMTP_mtpdevice_struct; class MtpConnection; class MtpLoader; class MtpDevice : public ConnectedDevice { Q_OBJECT public: Q_INVOKABLE MtpDevice(const QUrl& url, DeviceLister* lister, const QString& unique_id, DeviceManager* manager, Application* app, int database_id, bool first_time); ~MtpDevice(); static QStringList url_schemes() { return QStringList() << "mtp" << "gphoto2"; } void Init(); bool GetSupportedFiletypes(QList* ret); int GetFreeSpace(); int GetCapacity(); bool StartCopy(QList* supported_types); bool CopyToStorage(const CopyJob& job); void FinishCopy(bool success); void StartDelete(); bool DeleteFromStorage(const DeleteJob& job); void FinishDelete(bool success); private slots: void LoadFinished(); private: bool GetSupportedFiletypes(QList* ret, LIBMTP_mtpdevice_struct* device); int GetFreeSpace(LIBMTP_mtpdevice_struct* device); int GetCapacity(LIBMTP_mtpdevice_struct* device); private: static bool sInitialisedLibMTP; QThread* loader_thread_; MtpLoader* loader_; QMutex db_busy_; SongList songs_to_add_; SongList songs_to_remove_; std::unique_ptr connection_; }; #endif // MTPDEVICE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/mtploader.cpp000066400000000000000000000043721260417502300243010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "mtploader.h" #include #include "connecteddevice.h" #include "mtpconnection.h" #include "core/song.h" #include "core/taskmanager.h" #include "library/librarybackend.h" MtpLoader::MtpLoader(const QUrl& url, TaskManager* task_manager, LibraryBackend* backend, std::shared_ptr device) : QObject(nullptr), device_(device), url_(url), task_manager_(task_manager), backend_(backend) { original_thread_ = thread(); } MtpLoader::~MtpLoader() {} void MtpLoader::LoadDatabase() { int task_id = task_manager_->StartTask(tr("Loading MTP device")); emit TaskStarted(task_id); TryLoad(); moveToThread(original_thread_); task_manager_->SetTaskFinished(task_id); emit LoadFinished(); } bool MtpLoader::TryLoad() { MtpConnection dev(url_); if (!dev.is_valid()) { emit Error(tr("Error connecting MTP device")); return false; } // Load the list of songs on the device SongList songs; LIBMTP_track_t* tracks = LIBMTP_Get_Tracklisting_With_Callback(dev.device(), nullptr, nullptr); while (tracks) { LIBMTP_track_t* track = tracks; Song song; song.InitFromMTP(track, url_.host()); song.set_directory_id(1); songs << song; tracks = tracks->next; LIBMTP_destroy_track_t(track); } // Need to remove all the existing songs in the database first backend_->DeleteSongs(backend_->FindSongsInDirectory(1)); // Add the songs we've just loaded backend_->AddOrUpdateSongs(songs); return true; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/devices/mtploader.h000066400000000000000000000026571260417502300237520ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MTPLOADER_H #define MTPLOADER_H #include #include #include class ConnectedDevice; class LibraryBackend; class TaskManager; class MtpLoader : public QObject { Q_OBJECT public: MtpLoader(const QUrl& url, TaskManager* task_manager, LibraryBackend* backend, std::shared_ptr device); ~MtpLoader(); public slots: void LoadDatabase(); signals: void Error(const QString& message); void TaskStarted(int task_id); void LoadFinished(); private: bool TryLoad(); private: std::shared_ptr device_; QThread* original_thread_; QUrl url_; TaskManager* task_manager_; LibraryBackend* backend_; }; #endif // MTPLOADER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/engines/000077500000000000000000000000001260417502300216065ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/engines/bufferconsumer.h000066400000000000000000000022171260417502300250060ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef BUFFERCONSUMER_H #define BUFFERCONSUMER_H #include class GstEnginePipeline; class BufferConsumer { public: virtual ~BufferConsumer() {} // This is called in some unspecified GStreamer thread. // Ownership of the buffer is transferred to the BufferConsumer and it should // gst_buffer_unref it. virtual void ConsumeBuffer(GstBuffer* buffer, int pipeline_id) = 0; }; #endif // BUFFERCONSUMER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/engines/devicefinder.cpp000066400000000000000000000022321260417502300247400ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "devicefinder.h" DeviceFinder::DeviceFinder(const QString& gstreamer_sink) : gstreamer_sink_(gstreamer_sink) { } QString DeviceFinder::GuessIconName(const QString& description) { QString description_lower = description.toLower(); if (description_lower.contains("headset")) { return "audio-headset"; } if (description_lower.contains("headphone")) { return "audio-headphones"; } return "audio-card"; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/engines/devicefinder.h000066400000000000000000000033751260417502300244160ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef DEVICEFINDER_H #define DEVICEFINDER_H #include #include // Finds audio output devices that can be used with a given gstreamer sink. class DeviceFinder { public: struct Device { // The value to set as the "device" gstreamer property. QVariant device_property_value; // A human readable description of the device. QString description; // An icon to use in the UI. QString icon_name; }; virtual ~DeviceFinder() {} // The name of the gstreamer sink element that devices found by this class // can be used with. QString gstreamer_sink() const { return gstreamer_sink_; } // Does any necessary setup, returning false if this DeviceFinder cannot // be used. virtual bool Initialise() = 0; // Returns a list of available devices. virtual QList ListDevices() = 0; protected: explicit DeviceFinder(const QString& gstreamer_sink); static QString GuessIconName(const QString& description); private: QString gstreamer_sink_; }; #endif // DEVICEFINDER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/engines/directsounddevicefinder.cpp000066400000000000000000000032611260417502300272070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifdef INTERFACE #undef INTERFACE #endif #include #include #include "directsounddevicefinder.h" DirectSoundDeviceFinder::DirectSoundDeviceFinder() : DeviceFinder("directsoundsink") { } QList DirectSoundDeviceFinder::ListDevices() { State state; DirectSoundEnumerateA(&DirectSoundDeviceFinder::EnumerateCallback, &state); return state.devices; } BOOL DirectSoundDeviceFinder::EnumerateCallback(LPGUID guid, LPCSTR description, LPCSTR module, LPVOID state_voidptr) { State* state = reinterpret_cast(state_voidptr); if (guid) { Device dev; dev.description = QString::fromUtf8(description); dev.device_property_value = QUuid(*guid).toByteArray(); dev.icon_name = GuessIconName(dev.description); state->devices.append(dev); } return 1; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/engines/directsounddevicefinder.h000066400000000000000000000025251260417502300266560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef DIRECTSOUNDDEVICEFINDER_H #define DIRECTSOUNDDEVICEFINDER_H #include #include "engines/devicefinder.h" class DirectSoundDeviceFinder : public DeviceFinder { public: DirectSoundDeviceFinder(); virtual bool Initialise() { return true; } virtual QList ListDevices(); private: struct State { QList devices; }; static BOOL EnumerateCallback(LPGUID guid, LPCSTR description, LPCSTR module, LPVOID state_voidptr) __attribute__((stdcall)); }; #endif // DIRECTSOUNDDEVICEFINDER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/engines/engine_fwd.h000066400000000000000000000014611260417502300240660ustar00rootroot00000000000000#ifndef ENGINE_FWD_H #define ENGINE_FWD_H #include /// Used by eg engineobserver.h, and thus we reduce header dependencies on /// enginebase.h namespace Engine { struct SimpleMetaBundle; class Base; /** * You should return: * Playing when playing, * Paused when paused * Idle when you still have a URL loaded (ie you have not been told to stop()) * Empty when you have been told to stop(), * Error when an error occurred and you stopped yourself * * It is vital to be Idle just after the track has ended! */ enum State { Empty, Idle, Playing, Paused, Error }; enum TrackChangeType { // One of: First = 0x01, Manual = 0x02, Auto = 0x04, Intro = 0x08, // Any of: SameAlbum = 0x10, }; Q_DECLARE_FLAGS(TrackChangeFlags, TrackChangeType); } typedef Engine::Base EngineBase; #endif clementine-1.2.3+git1354-gdaddbde+dfsg/src/engines/enginebase.cpp000066400000000000000000000063251260417502300244200ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ // Copyright: (C) 2003 Mark Kretschmann // (C) 2004,2005 Max Howell, // License: See COPYING #include "enginebase.h" #include "core/timeconstants.h" #include #include const char* Engine::Base::kSettingsGroup = "Player"; Engine::Base::Base() : volume_(50), beginning_nanosec_(0), end_nanosec_(0), scope_(kScopeSize), fadeout_enabled_(true), fadeout_duration_nanosec_(2 * kNsecPerSec), // 2s crossfade_enabled_(true), autocrossfade_enabled_(false), crossfade_same_album_(false), next_background_stream_id_(0), about_to_end_emitted_(false) {} Engine::Base::~Base() {} bool Engine::Base::Load(const QUrl& url, TrackChangeFlags, bool force_stop_at_end, quint64 beginning_nanosec, qint64 end_nanosec) { Q_UNUSED(force_stop_at_end); url_ = url; beginning_nanosec_ = beginning_nanosec; end_nanosec_ = end_nanosec; about_to_end_emitted_ = false; return true; } void Engine::Base::SetVolume(uint value) { volume_ = value; SetVolumeSW(MakeVolumeLogarithmic(value)); } uint Engine::Base::MakeVolumeLogarithmic(uint volume) { // We're using a logarithmic function to make the volume ramp more natural. return static_cast(100 - 100.0 * std::log10((100 - volume) * 0.09 + 1.0)); } void Engine::Base::ReloadSettings() { QSettings s; s.beginGroup(kSettingsGroup); fadeout_enabled_ = s.value("FadeoutEnabled", true).toBool(); fadeout_duration_nanosec_ = s.value("FadeoutDuration", 2000).toLongLong() * kNsecPerMsec; crossfade_enabled_ = s.value("CrossfadeEnabled", true).toBool(); autocrossfade_enabled_ = s.value("AutoCrossfadeEnabled", false).toBool(); crossfade_same_album_ = !s.value("NoCrossfadeSameAlbum", true).toBool(); fadeout_pause_enabled_ = s.value("FadeoutPauseEnabled", false).toBool(); fadeout_pause_duration_nanosec_ = s.value("FadeoutPauseDuration", 250).toLongLong() * kNsecPerMsec; } void Engine::Base::EmitAboutToEnd() { if (about_to_end_emitted_) return; about_to_end_emitted_ = true; emit TrackAboutToEnd(); } int Engine::Base::AddBackgroundStream(const QUrl& url) { return -1; } bool Engine::Base::Play(const QUrl& u, TrackChangeFlags c, bool force_stop_at_end, quint64 beginning_nanosec, qint64 end_nanosec) { if (!Load(u, c, force_stop_at_end, beginning_nanosec, end_nanosec)) return false; return Play(0); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/engines/enginebase.h000066400000000000000000000121011260417502300240520ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ // Copyright: (C) 2003 Mark Kretschmann // (C) 2004 Max Howell, // License: See COPYING #ifndef AMAROK_ENGINEBASE_H #define AMAROK_ENGINEBASE_H #include #include #include #include #include #include #include "engine_fwd.h" namespace Engine { typedef std::vector Scope; class Base : public QObject { Q_OBJECT public: virtual ~Base(); virtual bool Init() = 0; virtual void StartPreloading(const QUrl&, bool, qint64, qint64) {} virtual bool Play(quint64 offset_nanosec) = 0; virtual void Stop(bool stop_after = false) = 0; virtual void Pause() = 0; virtual void Unpause() = 0; virtual void Seek(quint64 offset_nanosec) = 0; virtual int AddBackgroundStream(const QUrl& url); virtual void StopBackgroundStream(int id) {} virtual void SetBackgroundStreamVolume(int id, int volume) {} virtual State state() const = 0; virtual qint64 position_nanosec() const = 0; virtual qint64 length_nanosec() const = 0; // Subclasses should respect given markers (beginning and end) which are // in miliseconds. virtual bool Load(const QUrl& url, TrackChangeFlags change, bool force_stop_at_end, quint64 beginning_nanosec, qint64 end_nanosec); // Sets new values for the beginning and end markers of the currently playing // song. // This doesn't change the state of engine or the stream's current position. virtual void RefreshMarkers(quint64 beginning_nanosec, qint64 end_nanosec) { beginning_nanosec_ = beginning_nanosec; end_nanosec_ = end_nanosec; } // Plays a media stream represented with the URL 'u' from the given // 'beginning' // to the given 'end' (usually from 0 to a song's length). Both markers // should be passed in nanoseconds. 'end' can be negative, indicating that the // real length of 'u' stream is unknown. bool Play(const QUrl& u, TrackChangeFlags c, bool force_stop_at_end, quint64 beginning_nanosec, qint64 end_nanosec); void SetVolume(uint value); // Simple accessors inline uint volume() const { return volume_; } virtual const Scope& scope(int chunk_length) { return scope_; } bool is_fadeout_enabled() const { return fadeout_enabled_; } bool is_crossfade_enabled() const { return crossfade_enabled_; } bool is_autocrossfade_enabled() const { return autocrossfade_enabled_; } bool crossfade_same_album() const { return crossfade_same_album_; } static const char* kSettingsGroup; static const int kScopeSize = 1024; public slots: virtual void ReloadSettings(); virtual void SetEqualizerEnabled(bool) {} virtual void SetEqualizerParameters(int preamp, const QList& bandGains) { } virtual void SetStereoBalance(float value) {} signals: // Emitted when crossfading is enabled and the track is crossfade_duration_ // away from finishing void TrackAboutToEnd(); void TrackEnded(); void FadeoutFinishedSignal(); void StatusText(const QString&); void Error(const QString&); // Emitted when Engine was unable to play a song with the given QUrl. void InvalidSongRequested(const QUrl&); // Emitted when Engine successfully started playing a song with the // given QUrl. void ValidSongRequested(const QUrl&); void MetaData(const Engine::SimpleMetaBundle&); // Signals that the engine's state has changed (a stream was stopped for // example). // Always use the state from event, because it's not guaranteed that immediate // subsequent call to state() won't return a stale value. void StateChanged(Engine::State); protected: Base(); virtual void SetVolumeSW(uint percent) = 0; static uint MakeVolumeLogarithmic(uint volume); void EmitAboutToEnd(); protected: uint volume_; quint64 beginning_nanosec_; qint64 end_nanosec_; QUrl url_; Scope scope_; bool fadeout_enabled_; qint64 fadeout_duration_nanosec_; bool crossfade_enabled_; bool autocrossfade_enabled_; bool crossfade_same_album_; int next_background_stream_id_; bool fadeout_pause_enabled_; qint64 fadeout_pause_duration_nanosec_; private: bool about_to_end_emitted_; Q_DISABLE_COPY(Base); }; struct SimpleMetaBundle { QString title; QString artist; QString album; QString comment; QString genre; QString bitrate; QString samplerate; QString length; QString year; QString tracknr; }; } // namespace #endif clementine-1.2.3+git1354-gdaddbde+dfsg/src/engines/gstelementdeleter.cpp000066400000000000000000000022271260417502300260310ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "gstelementdeleter.h" #include GstElementDeleter::GstElementDeleter(QObject* parent) : QObject(parent) {} void GstElementDeleter::DeleteElementLater(GstElement* element) { metaObject()->invokeMethod(this, "DeleteElement", Qt::QueuedConnection, Q_ARG(GstElement*, element)); } void GstElementDeleter::DeleteElement(GstElement* element) { gst_element_set_state(element, GST_STATE_NULL); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/engines/gstelementdeleter.h000066400000000000000000000026441260417502300255010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef GSTBINDELETER_H #define GSTBINDELETER_H #include #include class GstElementDeleter : public QObject { Q_OBJECT public: GstElementDeleter(QObject* parent = nullptr); // If you call this function with any gstreamer element, the element will get // deleted in the main thread. This is useful if you need to delete an // element from its own callback. // It's in a separate object so *your* object (GstEnginePipeline) can be // destroyed, and the element that you scheduled for deletion is still // deleted later regardless. void DeleteElementLater(GstElement* element); private slots: void DeleteElement(GstElement* element); }; #endif // GSTBINDELETER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/engines/gstengine.cpp000066400000000000000000000717431260417502300243110ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2003-2005 by Mark Kretschmann * * Copyright (C) 2005 by Jakub Stachowski * * Copyright (C) 2006 Paul Cifarelli * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Steet, Fifth Floor, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "gstengine.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "devicefinder.h" #include "gstenginepipeline.h" #include "core/logging.h" #include "core/taskmanager.h" #include "core/timeconstants.h" #include "core/utilities.h" #ifdef HAVE_MOODBAR #include "gst/moodbar/plugin.h" #endif #ifdef HAVE_LIBPULSE #include "engines/pulsedevicefinder.h" #endif #ifdef Q_OS_DARWIN #include "engines/osxdevicefinder.h" #endif #ifdef Q_OS_WIN32 #include "engines/directsounddevicefinder.h" #endif #ifdef Q_OS_DARWIN #include "core/mac_startup.h" #endif #ifdef Q_OS_DARWIN #undef signals #include #endif using std::shared_ptr; using std::vector; const char* GstEngine::kSettingsGroup = "GstEngine"; const char* GstEngine::kAutoSink = "autoaudiosink"; const char* GstEngine::kHypnotoadPipeline = "audiotestsrc wave=6 ! " "audioecho intensity=1 delay=50000000 ! " "audioecho intensity=1 delay=25000000 ! " "equalizer-10bands " "band0=-24 band1=-3 band2=7.5 band3=12 band4=8 " "band5=6 band6=5 band7=6 band8=0 band9=-24"; const char* GstEngine::kEnterprisePipeline = "audiotestsrc wave=5 ! " "audiocheblimit mode=0 cutoff=120"; GstEngine::GstEngine(TaskManager* task_manager) : Engine::Base(), task_manager_(task_manager), buffering_task_id_(-1), latest_buffer_(nullptr), equalizer_enabled_(false), stereo_balance_(0.0f), rg_enabled_(false), rg_mode_(0), rg_preamp_(0.0), rg_compression_(true), buffer_duration_nanosec_(1 * kNsecPerSec), // 1s buffer_min_fill_(33), mono_playback_(false), sample_rate_(kAutoSampleRate), seek_timer_(new QTimer(this)), timer_id_(-1), next_element_id_(0), is_fading_out_to_pause_(false), has_faded_out_(false), scope_chunk_(0), have_new_buffer_(false) { seek_timer_->setSingleShot(true); seek_timer_->setInterval(kSeekDelayNanosec / kNsecPerMsec); connect(seek_timer_, SIGNAL(timeout()), SLOT(SeekNow())); ReloadSettings(); #ifdef Q_OS_DARWIN QDir resources_dir(mac::GetResourcesPath()); QString ca_cert_path = resources_dir.filePath("cacert.pem"); GError* error = nullptr; tls_database_ = g_tls_file_database_new(ca_cert_path.toUtf8().data(), &error); #endif } GstEngine::~GstEngine() { EnsureInitialised(); current_pipeline_.reset(); qDeleteAll(device_finders_); #ifdef Q_OS_DARWIN g_object_unref(tls_database_); #endif } bool GstEngine::Init() { initialising_ = QtConcurrent::run(this, &GstEngine::InitialiseGstreamer); return true; } void GstEngine::InitialiseGstreamer() { gst_init(nullptr, nullptr); #ifdef HAVE_MOODBAR gstfastspectrum_register_static(); #endif QSet plugin_names; for (const PluginDetails& plugin : GetPluginList("Sink/Audio")) { plugin_names.insert(plugin.name); } QList device_finders; #ifdef HAVE_LIBPULSE device_finders.append(new PulseDeviceFinder); #endif #ifdef Q_OS_DARWIN device_finders.append(new OsxDeviceFinder); #endif #ifdef Q_OS_WIN32 device_finders.append(new DirectSoundDeviceFinder); #endif for (DeviceFinder* finder : device_finders) { if (!plugin_names.contains(finder->gstreamer_sink())) { qLog(Info) << "Skipping DeviceFinder for" << finder->gstreamer_sink() << "known plugins:" << plugin_names; delete finder; continue; } if (!finder->Initialise()) { qLog(Warning) << "Failed to initialise DeviceFinder for" << finder->gstreamer_sink(); delete finder; continue; } device_finders_.append(finder); } } void GstEngine::ReloadSettings() { Engine::Base::ReloadSettings(); QSettings s; s.beginGroup(kSettingsGroup); sink_ = s.value("sink", kAutoSink).toString(); device_ = s.value("device"); if (sink_.isEmpty()) sink_ = kAutoSink; rg_enabled_ = s.value("rgenabled", false).toBool(); rg_mode_ = s.value("rgmode", 0).toInt(); rg_preamp_ = s.value("rgpreamp", 0.0).toDouble(); rg_compression_ = s.value("rgcompression", true).toBool(); buffer_duration_nanosec_ = s.value("bufferduration", 4000).toLongLong() * kNsecPerMsec; buffer_min_fill_ = s.value("bufferminfill", 33).toInt(); mono_playback_ = s.value("monoplayback", false).toBool(); sample_rate_ = s.value("samplerate", kAutoSampleRate).toInt(); } qint64 GstEngine::position_nanosec() const { if (!current_pipeline_) return 0; const qint64 result = current_pipeline_->position() - beginning_nanosec_; return qint64(qMax(0ll, result)); } qint64 GstEngine::length_nanosec() const { if (!current_pipeline_) return 0; const qint64 result = end_nanosec_ - beginning_nanosec_; if (result > 0) { return result; } else { // Get the length from the pipeline if we don't know. return current_pipeline_->length(); } } Engine::State GstEngine::state() const { if (!current_pipeline_) return url_.isEmpty() ? Engine::Empty : Engine::Idle; switch (current_pipeline_->state()) { case GST_STATE_NULL: return Engine::Empty; case GST_STATE_READY: return Engine::Idle; case GST_STATE_PLAYING: return Engine::Playing; case GST_STATE_PAUSED: return Engine::Paused; default: return Engine::Empty; } } void GstEngine::ConsumeBuffer(GstBuffer* buffer, int pipeline_id) { // Schedule this to run in the GUI thread. The buffer gets added to the // queue and unreffed by UpdateScope. if (!QMetaObject::invokeMethod(this, "AddBufferToScope", Q_ARG(GstBuffer*, buffer), Q_ARG(int, pipeline_id))) { qLog(Warning) << "Failed to invoke AddBufferToScope on GstEngine"; } } void GstEngine::AddBufferToScope(GstBuffer* buf, int pipeline_id) { if (!current_pipeline_ || current_pipeline_->id() != pipeline_id) { gst_buffer_unref(buf); return; } if (latest_buffer_ != nullptr) { gst_buffer_unref(latest_buffer_); } latest_buffer_ = buf; have_new_buffer_ = true; } const Engine::Scope& GstEngine::scope(int chunk_length) { // the new buffer could have a different size if (have_new_buffer_) { if (latest_buffer_ != nullptr) { scope_chunks_ = ceil(((double)GST_BUFFER_DURATION(latest_buffer_) / (double)(chunk_length * kNsecPerMsec))); } // if the buffer is shorter than the chunk length if (scope_chunks_ <= 0) { scope_chunks_ = 1; } scope_chunk_ = 0; have_new_buffer_ = false; } if (latest_buffer_ != nullptr) { UpdateScope(chunk_length); } return scope_; } void GstEngine::UpdateScope(int chunk_length) { typedef Engine::Scope::value_type sample_type; // prevent dbz or invalid chunk size if (!GST_CLOCK_TIME_IS_VALID(GST_BUFFER_DURATION(latest_buffer_))) return; if (GST_BUFFER_DURATION(latest_buffer_) == 0) return; GstMapInfo map; gst_buffer_map(latest_buffer_, &map, GST_MAP_READ); // determine where to split the buffer int chunk_density = (map.size * kNsecPerMsec) / GST_BUFFER_DURATION(latest_buffer_); int chunk_size = chunk_length * chunk_density; // in case a buffer doesn't arrive in time if (scope_chunk_ >= scope_chunks_) { scope_chunk_ = 0; return; } const sample_type* source = reinterpret_cast(map.data); sample_type* dest = scope_.data(); source += (chunk_size / sizeof(sample_type)) * scope_chunk_; int bytes = 0; // make sure we don't go beyond the end of the buffer if (scope_chunk_ == scope_chunks_ - 1) { bytes = qMin(static_cast( map.size - (chunk_size * scope_chunk_)), scope_.size() * sizeof(sample_type)); } else { bytes = qMin(static_cast(chunk_size), scope_.size() * sizeof(sample_type)); } scope_chunk_++; memcpy(dest, source, bytes); gst_buffer_unmap(latest_buffer_, &map); if (scope_chunk_ == scope_chunks_) { gst_buffer_unref(latest_buffer_); latest_buffer_ = nullptr; } } void GstEngine::StartPreloading(const QUrl& url, bool force_stop_at_end, qint64 beginning_nanosec, qint64 end_nanosec) { EnsureInitialised(); QUrl gst_url = FixupUrl(url); // No crossfading, so we can just queue the new URL in the existing // pipeline and get gapless playback (hopefully) if (current_pipeline_) current_pipeline_->SetNextUrl(gst_url, beginning_nanosec, force_stop_at_end ? end_nanosec : 0); } QUrl GstEngine::FixupUrl(const QUrl& url) { QUrl copy = url; // It's a file:// url with a hostname set. QUrl::fromLocalFile does this // when given a \\host\share\file path on Windows. Munge it back into a // path that gstreamer will recognise. if (url.scheme() == "file" && !url.host().isEmpty()) { copy.setPath("//" + copy.host() + copy.path()); copy.setHost(QString()); } return copy; } bool GstEngine::Load(const QUrl& url, Engine::TrackChangeFlags change, bool force_stop_at_end, quint64 beginning_nanosec, qint64 end_nanosec) { EnsureInitialised(); Engine::Base::Load(url, change, force_stop_at_end, beginning_nanosec, end_nanosec); QUrl gst_url = FixupUrl(url); bool crossfade = current_pipeline_ && ((crossfade_enabled_ && change & Engine::Manual) || (autocrossfade_enabled_ && change & Engine::Auto) || ((crossfade_enabled_ || autocrossfade_enabled_) && change & Engine::Intro)); if (change & Engine::Auto && change & Engine::SameAlbum && !crossfade_same_album_) crossfade = false; if (!crossfade && current_pipeline_ && current_pipeline_->url() == gst_url && change & Engine::Auto) { // We're not crossfading, and the pipeline is already playing the URI we // want, so just do nothing. return true; } shared_ptr pipeline = CreatePipeline(gst_url, force_stop_at_end ? end_nanosec : 0); if (!pipeline) return false; if (crossfade) StartFadeout(); BufferingFinished(); current_pipeline_ = pipeline; SetVolume(volume_); SetEqualizerEnabled(equalizer_enabled_); SetEqualizerParameters(equalizer_preamp_, equalizer_gains_); SetStereoBalance(stereo_balance_); // Maybe fade in this track if (crossfade) current_pipeline_->StartFader(fadeout_duration_nanosec_, QTimeLine::Forward); return true; } void GstEngine::StartFadeout() { if (is_fading_out_to_pause_) return; fadeout_pipeline_ = current_pipeline_; disconnect(fadeout_pipeline_.get(), 0, 0, 0); fadeout_pipeline_->RemoveAllBufferConsumers(); fadeout_pipeline_->StartFader(fadeout_duration_nanosec_, QTimeLine::Backward); connect(fadeout_pipeline_.get(), SIGNAL(FaderFinished()), SLOT(FadeoutFinished())); } void GstEngine::StartFadeoutPause() { fadeout_pause_pipeline_ = current_pipeline_; disconnect(fadeout_pause_pipeline_.get(), SIGNAL(FaderFinished()), 0, 0); fadeout_pause_pipeline_->StartFader(fadeout_pause_duration_nanosec_, QTimeLine::Backward, QTimeLine::EaseInOutCurve, false); if (fadeout_pipeline_ && fadeout_pipeline_->state() == GST_STATE_PLAYING) { fadeout_pipeline_->StartFader(fadeout_pause_duration_nanosec_, QTimeLine::Backward, QTimeLine::LinearCurve, false); } connect(fadeout_pause_pipeline_.get(), SIGNAL(FaderFinished()), SLOT(FadeoutPauseFinished())); is_fading_out_to_pause_ = true; } bool GstEngine::Play(quint64 offset_nanosec) { EnsureInitialised(); if (!current_pipeline_ || current_pipeline_->is_buffering()) return false; QFuture future = current_pipeline_->SetState(GST_STATE_PLAYING); PlayFutureWatcher* watcher = new PlayFutureWatcher( PlayFutureWatcherArg(offset_nanosec, current_pipeline_->id()), this); watcher->setFuture(future); connect(watcher, SIGNAL(finished()), SLOT(PlayDone())); if (is_fading_out_to_pause_) { current_pipeline_->SetState(GST_STATE_PAUSED); } return true; } void GstEngine::PlayDone() { PlayFutureWatcher* watcher = static_cast(sender()); watcher->deleteLater(); GstStateChangeReturn ret = watcher->result(); quint64 offset_nanosec = watcher->data().first; if (!current_pipeline_ || watcher->data().second != current_pipeline_->id()) { return; } if (ret == GST_STATE_CHANGE_FAILURE) { // Failure, but we got a redirection URL - try loading that instead QUrl redirect_url = current_pipeline_->redirect_url(); if (!redirect_url.isEmpty() && redirect_url != current_pipeline_->url()) { qLog(Info) << "Redirecting to" << redirect_url; current_pipeline_ = CreatePipeline(redirect_url, end_nanosec_); Play(offset_nanosec); return; } // Failure - give up qLog(Warning) << "Could not set thread to PLAYING."; current_pipeline_.reset(); BufferingFinished(); return; } StartTimers(); // initial offset if (offset_nanosec != 0 || beginning_nanosec_ != 0) { Seek(offset_nanosec); } emit StateChanged(Engine::Playing); // we've successfully started playing a media stream with this url emit ValidSongRequested(url_); } void GstEngine::Stop(bool stop_after) { StopTimers(); url_ = QUrl(); // To ensure we return Empty from state() beginning_nanosec_ = end_nanosec_ = 0; // Check if we started a fade out. If it isn't finished yet and the user // pressed stop, we cancel the fader and just stop the playback. if (is_fading_out_to_pause_) { disconnect(current_pipeline_.get(), SIGNAL(FaderFinished()), 0, 0); is_fading_out_to_pause_ = false; has_faded_out_ = true; fadeout_pause_pipeline_.reset(); fadeout_pipeline_.reset(); } if (fadeout_enabled_ && current_pipeline_ && !stop_after) StartFadeout(); current_pipeline_.reset(); BufferingFinished(); emit StateChanged(Engine::Empty); } void GstEngine::FadeoutFinished() { fadeout_pipeline_.reset(); emit FadeoutFinishedSignal(); } void GstEngine::FadeoutPauseFinished() { fadeout_pause_pipeline_->SetState(GST_STATE_PAUSED); current_pipeline_->SetState(GST_STATE_PAUSED); emit StateChanged(Engine::Paused); StopTimers(); is_fading_out_to_pause_ = false; has_faded_out_ = true; fadeout_pause_pipeline_.reset(); fadeout_pipeline_.reset(); emit FadeoutFinishedSignal(); } void GstEngine::Pause() { if (!current_pipeline_ || current_pipeline_->is_buffering()) return; // Check if we started a fade out. If it isn't finished yet and the user // pressed play, we inverse the fader and resume the playback. if (is_fading_out_to_pause_) { disconnect(current_pipeline_.get(), SIGNAL(FaderFinished()), 0, 0); current_pipeline_->StartFader(fadeout_pause_duration_nanosec_, QTimeLine::Forward, QTimeLine::EaseInOutCurve, false); is_fading_out_to_pause_ = false; has_faded_out_ = false; emit StateChanged(Engine::Playing); return; } if (current_pipeline_->state() == GST_STATE_PLAYING) { if (fadeout_pause_enabled_) { StartFadeoutPause(); } else { current_pipeline_->SetState(GST_STATE_PAUSED); emit StateChanged(Engine::Paused); StopTimers(); } } } void GstEngine::Unpause() { if (!current_pipeline_ || current_pipeline_->is_buffering()) return; if (current_pipeline_->state() == GST_STATE_PAUSED) { current_pipeline_->SetState(GST_STATE_PLAYING); // Check if we faded out last time. If yes, fade in no matter what the // settings say. If we pause with fadeout, deactivate fadeout and resume // playback, the player would be muted if not faded in. if (has_faded_out_) { disconnect(current_pipeline_.get(), SIGNAL(FaderFinished()), 0, 0); current_pipeline_->StartFader(fadeout_pause_duration_nanosec_, QTimeLine::Forward, QTimeLine::EaseInOutCurve, false); has_faded_out_ = false; } emit StateChanged(Engine::Playing); StartTimers(); } } void GstEngine::Seek(quint64 offset_nanosec) { if (!current_pipeline_) return; seek_pos_ = beginning_nanosec_ + offset_nanosec; waiting_to_seek_ = true; if (!seek_timer_->isActive()) { SeekNow(); seek_timer_->start(); // Stop us from seeking again for a little while } } void GstEngine::SeekNow() { if (!waiting_to_seek_) return; waiting_to_seek_ = false; if (!current_pipeline_) return; if (!current_pipeline_->Seek(seek_pos_)) { qLog(Warning) << "Seek failed"; } } void GstEngine::SetEqualizerEnabled(bool enabled) { equalizer_enabled_ = enabled; if (current_pipeline_) current_pipeline_->SetEqualizerEnabled(enabled); } void GstEngine::SetEqualizerParameters(int preamp, const QList& band_gains) { equalizer_preamp_ = preamp; equalizer_gains_ = band_gains; if (current_pipeline_) current_pipeline_->SetEqualizerParams(preamp, band_gains); } void GstEngine::SetStereoBalance(float value) { stereo_balance_ = value; if (current_pipeline_) current_pipeline_->SetStereoBalance(value); } void GstEngine::SetVolumeSW(uint percent) { if (current_pipeline_) current_pipeline_->SetVolume(percent); } void GstEngine::StartTimers() { StopTimers(); timer_id_ = startTimer(kTimerIntervalNanosec / kNsecPerMsec); } void GstEngine::StopTimers() { if (timer_id_ != -1) { killTimer(timer_id_); timer_id_ = -1; } } void GstEngine::timerEvent(QTimerEvent* e) { if (e->timerId() != timer_id_) return; if (current_pipeline_) { const qint64 current_position = position_nanosec(); const qint64 current_length = length_nanosec(); const qint64 remaining = current_length - current_position; const qint64 fudge = kTimerIntervalNanosec + 100 * kNsecPerMsec; // Mmm fudge const qint64 gap = buffer_duration_nanosec_ + (autocrossfade_enabled_ ? fadeout_duration_nanosec_ : kPreloadGapNanosec); // only if we know the length of the current stream... if (current_length > 0) { // emit TrackAboutToEnd when we're a few seconds away from finishing if (remaining < gap + fudge) { EmitAboutToEnd(); } } } } void GstEngine::HandlePipelineError(int pipeline_id, const QString& message, int domain, int error_code) { if (!current_pipeline_.get() || current_pipeline_->id() != pipeline_id) return; qLog(Warning) << "Gstreamer error:" << message; current_pipeline_.reset(); BufferingFinished(); emit StateChanged(Engine::Error); // unable to play media stream with this url emit InvalidSongRequested(url_); // TODO: the types of errors listed below won't be shown to user - they will // get logged and the current song will be skipped; instead of maintaining // the list we should probably: // - don't report any engine's errors to user (always just log and skip) // - come up with a less intrusive error box (not a dialog but a notification // popup of some kind) and then report all errors if (!(domain == GST_RESOURCE_ERROR && error_code == GST_RESOURCE_ERROR_NOT_FOUND) && !(domain == GST_STREAM_ERROR && error_code == GST_STREAM_ERROR_TYPE_NOT_FOUND) && !(domain == GST_RESOURCE_ERROR && error_code == GST_RESOURCE_ERROR_OPEN_READ)) { emit Error(message); } } void GstEngine::EndOfStreamReached(int pipeline_id, bool has_next_track) { if (!current_pipeline_.get() || current_pipeline_->id() != pipeline_id) return; if (!has_next_track) { current_pipeline_.reset(); BufferingFinished(); } emit TrackEnded(); } void GstEngine::NewMetaData(int pipeline_id, const Engine::SimpleMetaBundle& bundle) { if (!current_pipeline_.get() || current_pipeline_->id() != pipeline_id) return; emit MetaData(bundle); } GstElement* GstEngine::CreateElement(const QString& factoryName, GstElement* bin) { // Make a unique name QString name = factoryName + "-" + QString::number(next_element_id_++); GstElement* element = gst_element_factory_make( factoryName.toAscii().constData(), name.toAscii().constData()); if (!element) { emit Error(QString( "GStreamer could not create the element: %1. " "Please make sure that you have installed all necessary " "GStreamer plugins (e.g. OGG and MP3)").arg(factoryName)); gst_object_unref(GST_OBJECT(bin)); return nullptr; } if (bin) gst_bin_add(GST_BIN(bin), element); return element; } GstEngine::PluginDetailsList GstEngine::GetPluginList( const QString& classname) const { PluginDetailsList ret; GstRegistry* registry = gst_registry_get(); GList* const features = gst_registry_get_feature_list(registry, GST_TYPE_ELEMENT_FACTORY); GList* p = features; while (p) { GstElementFactory* factory = GST_ELEMENT_FACTORY(p->data); if (QString(gst_element_factory_get_klass(factory)).contains(classname)) { PluginDetails details; details.name = QString::fromUtf8(gst_plugin_feature_get_name(p->data)); details.description = QString::fromUtf8(gst_element_factory_get_metadata( factory, GST_ELEMENT_METADATA_DESCRIPTION)); ret << details; } p = g_list_next(p); } gst_plugin_feature_list_free(features); return ret; } shared_ptr GstEngine::CreatePipeline() { EnsureInitialised(); shared_ptr ret(new GstEnginePipeline(this)); ret->set_output_device(sink_, device_); ret->set_replaygain(rg_enabled_, rg_mode_, rg_preamp_, rg_compression_); ret->set_buffer_duration_nanosec(buffer_duration_nanosec_); ret->set_buffer_min_fill(buffer_min_fill_); ret->set_mono_playback(mono_playback_); ret->set_sample_rate(sample_rate_); ret->AddBufferConsumer(this); for (BufferConsumer* consumer : buffer_consumers_) { ret->AddBufferConsumer(consumer); } connect(ret.get(), SIGNAL(EndOfStreamReached(int, bool)), SLOT(EndOfStreamReached(int, bool))); connect(ret.get(), SIGNAL(Error(int, QString, int, int)), SLOT(HandlePipelineError(int, QString, int, int))); connect(ret.get(), SIGNAL(MetadataFound(int, Engine::SimpleMetaBundle)), SLOT(NewMetaData(int, Engine::SimpleMetaBundle))); connect(ret.get(), SIGNAL(BufferingStarted()), SLOT(BufferingStarted())); connect(ret.get(), SIGNAL(BufferingProgress(int)), SLOT(BufferingProgress(int))); connect(ret.get(), SIGNAL(BufferingFinished()), SLOT(BufferingFinished())); return ret; } shared_ptr GstEngine::CreatePipeline(const QUrl& url, qint64 end_nanosec) { shared_ptr ret = CreatePipeline(); if (url.scheme() == "hypnotoad") { ret->InitFromString(kHypnotoadPipeline); return ret; } if (url.scheme() == "enterprise") { ret->InitFromString(kEnterprisePipeline); return ret; } if (!ret->InitFromUrl(url, end_nanosec)) ret.reset(); return ret; } void GstEngine::AddBufferConsumer(BufferConsumer* consumer) { buffer_consumers_ << consumer; if (current_pipeline_) current_pipeline_->AddBufferConsumer(consumer); } void GstEngine::RemoveBufferConsumer(BufferConsumer* consumer) { buffer_consumers_.removeAll(consumer); if (current_pipeline_) current_pipeline_->RemoveBufferConsumer(consumer); } int GstEngine::AddBackgroundStream(shared_ptr pipeline) { // We don't want to get metadata messages or end notifications. disconnect(pipeline.get(), SIGNAL(MetadataFound(int, Engine::SimpleMetaBundle)), this, 0); disconnect(pipeline.get(), SIGNAL(EndOfStreamReached(int, bool)), this, 0); connect(pipeline.get(), SIGNAL(EndOfStreamReached(int, bool)), SLOT(BackgroundStreamFinished())); const int stream_id = next_background_stream_id_++; background_streams_[stream_id] = pipeline; QFuture future = pipeline->SetState(GST_STATE_PLAYING); BoundFutureWatcher* watcher = new BoundFutureWatcher(stream_id, this); watcher->setFuture(future); connect(watcher, SIGNAL(finished()), SLOT(BackgroundStreamPlayDone())); return stream_id; } void GstEngine::BackgroundStreamPlayDone() { BoundFutureWatcher* watcher = static_cast*>(sender()); watcher->deleteLater(); const int stream_id = watcher->data(); GstStateChangeReturn ret = watcher->result(); if (ret == GST_STATE_CHANGE_FAILURE) { qLog(Warning) << "Could not set thread to PLAYING."; background_streams_.remove(stream_id); } } int GstEngine::AddBackgroundStream(const QUrl& url) { shared_ptr pipeline = CreatePipeline(url, 0); if (!pipeline) { return -1; } pipeline->SetVolume(30); pipeline->SetNextUrl(url, 0, 0); return AddBackgroundStream(pipeline); } void GstEngine::StopBackgroundStream(int id) { background_streams_.remove(id); // Removes last shared_ptr reference. } void GstEngine::BackgroundStreamFinished() { GstEnginePipeline* pipeline = qobject_cast(sender()); pipeline->SetNextUrl(pipeline->url(), 0, 0); } void GstEngine::SetBackgroundStreamVolume(int id, int volume) { shared_ptr pipeline = background_streams_[id]; Q_ASSERT(pipeline); pipeline->SetVolume(volume); } void GstEngine::BufferingStarted() { if (buffering_task_id_ != -1) { task_manager_->SetTaskFinished(buffering_task_id_); } buffering_task_id_ = task_manager_->StartTask(tr("Buffering")); task_manager_->SetTaskProgress(buffering_task_id_, 0, 100); } void GstEngine::BufferingProgress(int percent) { task_manager_->SetTaskProgress(buffering_task_id_, percent, 100); } void GstEngine::BufferingFinished() { if (buffering_task_id_ != -1) { task_manager_->SetTaskFinished(buffering_task_id_); buffering_task_id_ = -1; } } GstEngine::OutputDetailsList GstEngine::GetOutputsList() const { const_cast(this)->EnsureInitialised(); OutputDetailsList ret; OutputDetails default_output; default_output.description = tr("Choose automatically"); default_output.gstreamer_plugin_name = kAutoSink; ret.append(default_output); for (DeviceFinder* finder : device_finders_) { for (const DeviceFinder::Device& device : finder->ListDevices()) { OutputDetails output; output.description = device.description; output.icon_name = device.icon_name; output.gstreamer_plugin_name = finder->gstreamer_sink(); output.device_property_value = device.device_property_value; ret.append(output); } } PluginDetailsList plugins = GetPluginList("Sink/Audio"); // If there are only 2 plugins (autoaudiosink and the OS' default), don't add // any, since the OS' default would be redundant. if (plugins.count() > 2) { for (const PluginDetails& plugin : plugins) { if (plugin.name == kAutoSink) { continue; } OutputDetails output; output.description = tr("Default device on %1").arg(plugin.description); output.gstreamer_plugin_name = plugin.name; ret.append(output); } } return ret; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/engines/gstengine.h000066400000000000000000000162201260417502300237430ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2003-2005 by Mark Kretschmann * * Copyright (C) 2005 by Jakub Stachowski * * Portions Copyright (C) 2006 Paul Cifarelli * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Steet, Fifth Floor, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef AMAROK_GSTENGINE_H #define AMAROK_GSTENGINE_H #include #include #include #include #include #include #include #include #include "bufferconsumer.h" #include "enginebase.h" #include "core/boundfuturewatcher.h" #include "core/timeconstants.h" class QTimer; class QTimerEvent; class DeviceFinder; class GstEnginePipeline; class TaskManager; #ifdef Q_OS_DARWIN struct _GTlsDatabase; typedef struct _GTlsDatabase GTlsDatabase; #endif /** * @class GstEngine * @short GStreamer engine plugin * @author Mark Kretschmann */ class GstEngine : public Engine::Base, public BufferConsumer { Q_OBJECT public: GstEngine(TaskManager* task_manager); ~GstEngine(); struct OutputDetails { QString description; QString icon_name; QString gstreamer_plugin_name; QVariant device_property_value; }; typedef QList OutputDetailsList; static const int kAutoSampleRate = -1; static const char* kSettingsGroup; static const char* kAutoSink; bool Init(); void EnsureInitialised() { initialising_.waitForFinished(); } void InitialiseGstreamer(); int AddBackgroundStream(const QUrl& url); void StopBackgroundStream(int id); void SetBackgroundStreamVolume(int id, int volume); qint64 position_nanosec() const; qint64 length_nanosec() const; Engine::State state() const; const Engine::Scope& scope(int chunk_length); OutputDetailsList GetOutputsList() const; GstElement* CreateElement(const QString& factoryName, GstElement* bin = 0); // BufferConsumer void ConsumeBuffer(GstBuffer* buffer, int pipeline_id); public slots: void StartPreloading(const QUrl& url, bool force_stop_at_end, qint64 beginning_nanosec, qint64 end_nanosec); bool Load(const QUrl&, Engine::TrackChangeFlags change, bool force_stop_at_end, quint64 beginning_nanosec, qint64 end_nanosec); bool Play(quint64 offset_nanosec); void Stop(bool stop_after = false); void Pause(); void Unpause(); void Seek(quint64 offset_nanosec); /** Set whether equalizer is enabled */ void SetEqualizerEnabled(bool); /** Set equalizer preamp and gains, range -100..100. Gains are 10 values. */ void SetEqualizerParameters(int preamp, const QList& bandGains); /** Set Stereo balance, range -1.0f..1.0f */ void SetStereoBalance(float value); void ReloadSettings(); void AddBufferConsumer(BufferConsumer* consumer); void RemoveBufferConsumer(BufferConsumer* consumer); #ifdef Q_OS_DARWIN GTlsDatabase* tls_database() const { return tls_database_; } #endif protected: void SetVolumeSW(uint percent); void timerEvent(QTimerEvent*); private slots: void EndOfStreamReached(int pipeline_id, bool has_next_track); void HandlePipelineError(int pipeline_id, const QString& message, int domain, int error_code); void NewMetaData(int pipeline_id, const Engine::SimpleMetaBundle& bundle); void AddBufferToScope(GstBuffer* buf, int pipeline_id); void FadeoutFinished(); void FadeoutPauseFinished(); void SeekNow(); void BackgroundStreamFinished(); void BackgroundStreamPlayDone(); void PlayDone(); void BufferingStarted(); void BufferingProgress(int percent); void BufferingFinished(); private: typedef QPair PlayFutureWatcherArg; typedef BoundFutureWatcher PlayFutureWatcher; struct PluginDetails { QString name; QString description; }; typedef QList PluginDetailsList; PluginDetailsList GetPluginList(const QString& classname) const; void StartFadeout(); void StartFadeoutPause(); void StartTimers(); void StopTimers(); std::shared_ptr CreatePipeline(); std::shared_ptr CreatePipeline(const QUrl& url, qint64 end_nanosec); void UpdateScope(int chunk_length); int AddBackgroundStream(std::shared_ptr pipeline); static QUrl FixupUrl(const QUrl& url); private: static const qint64 kTimerIntervalNanosec = 1000 * kNsecPerMsec; // 1s static const qint64 kPreloadGapNanosec = 2000 * kNsecPerMsec; // 2s static const qint64 kSeekDelayNanosec = 100 * kNsecPerMsec; // 100msec static const char* kHypnotoadPipeline; static const char* kEnterprisePipeline; TaskManager* task_manager_; int buffering_task_id_; QFuture initialising_; QString sink_; QVariant device_; std::shared_ptr current_pipeline_; std::shared_ptr fadeout_pipeline_; std::shared_ptr fadeout_pause_pipeline_; QUrl preloaded_url_; QList buffer_consumers_; GstBuffer* latest_buffer_; bool equalizer_enabled_; int equalizer_preamp_; QList equalizer_gains_; float stereo_balance_; bool rg_enabled_; int rg_mode_; float rg_preamp_; bool rg_compression_; qint64 buffer_duration_nanosec_; int buffer_min_fill_; bool mono_playback_; int sample_rate_; mutable bool can_decode_success_; mutable bool can_decode_last_; // Hack to stop seeks happening too often QTimer* seek_timer_; bool waiting_to_seek_; quint64 seek_pos_; int timer_id_; int next_element_id_; QHash> background_streams_; bool is_fading_out_to_pause_; bool has_faded_out_; int scope_chunk_; bool have_new_buffer_; int scope_chunks_; QList device_finders_; #ifdef Q_OS_DARWIN GTlsDatabase* tls_database_; #endif }; Q_DECLARE_METATYPE(GstEngine::OutputDetails) #endif /*AMAROK_GSTENGINE_H*/ clementine-1.2.3+git1354-gdaddbde+dfsg/src/engines/gstenginepipeline.cpp000066400000000000000000001203271260417502300260300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include #include #include #include #include #include #include "bufferconsumer.h" #include "config.h" #include "gstelementdeleter.h" #include "gstengine.h" #include "gstenginepipeline.h" #include "core/concurrentrun.h" #include "core/logging.h" #include "core/mac_startup.h" #include "core/signalchecker.h" #include "core/utilities.h" #include "internet/core/internetmodel.h" #include "internet/spotify/spotifyserver.h" #include "internet/spotify/spotifyservice.h" const int GstEnginePipeline::kGstStateTimeoutNanosecs = 10000000; const int GstEnginePipeline::kFaderFudgeMsec = 2000; const int GstEnginePipeline::kEqBandCount = 10; const int GstEnginePipeline::kEqBandFrequencies[] = { 60, 170, 310, 600, 1000, 3000, 6000, 12000, 14000, 16000}; int GstEnginePipeline::sId = 1; GstElementDeleter* GstEnginePipeline::sElementDeleter = nullptr; GstEnginePipeline::GstEnginePipeline(GstEngine* engine) : QObject(nullptr), engine_(engine), id_(sId++), valid_(false), sink_(GstEngine::kAutoSink), segment_start_(0), segment_start_received_(false), emit_track_ended_on_stream_start_(false), emit_track_ended_on_time_discontinuity_(false), last_buffer_offset_(0), eq_enabled_(false), eq_preamp_(0), stereo_balance_(0.0f), rg_enabled_(false), rg_mode_(0), rg_preamp_(0.0), rg_compression_(true), buffer_duration_nanosec_(1 * kNsecPerSec), buffer_min_fill_(33), buffering_(false), mono_playback_(false), sample_rate_(GstEngine::kAutoSampleRate), end_offset_nanosec_(-1), next_beginning_offset_nanosec_(-1), next_end_offset_nanosec_(-1), ignore_next_seek_(false), ignore_tags_(false), pipeline_is_initialised_(false), pipeline_is_connected_(false), pending_seek_nanosec_(-1), last_known_position_ns_(0), volume_percent_(100), volume_modifier_(1.0), pipeline_(nullptr), uridecodebin_(nullptr), audiobin_(nullptr), queue_(nullptr), audioconvert_(nullptr), rgvolume_(nullptr), rglimiter_(nullptr), audioconvert2_(nullptr), equalizer_(nullptr), stereo_panorama_(nullptr), volume_(nullptr), audioscale_(nullptr), audiosink_(nullptr) { if (!sElementDeleter) { sElementDeleter = new GstElementDeleter; } for (int i = 0; i < kEqBandCount; ++i) eq_band_gains_ << 0; } void GstEnginePipeline::set_output_device(const QString& sink, const QVariant& device) { sink_ = sink; device_ = device; } void GstEnginePipeline::set_replaygain(bool enabled, int mode, float preamp, bool compression) { rg_enabled_ = enabled; rg_mode_ = mode; rg_preamp_ = preamp; rg_compression_ = compression; } void GstEnginePipeline::set_buffer_duration_nanosec( qint64 buffer_duration_nanosec) { buffer_duration_nanosec_ = buffer_duration_nanosec; } void GstEnginePipeline::set_buffer_min_fill(int percent) { buffer_min_fill_ = percent; } void GstEnginePipeline::set_mono_playback(bool enabled) { mono_playback_ = enabled; } void GstEnginePipeline::set_sample_rate(int rate) { sample_rate_ = rate; } bool GstEnginePipeline::ReplaceDecodeBin(GstElement* new_bin) { if (!new_bin) return false; // Destroy the old elements if they are set // Note that the caller to this function MUST schedule the old uridecodebin_ // for deletion in the main thread. if (uridecodebin_) { gst_bin_remove(GST_BIN(pipeline_), uridecodebin_); } uridecodebin_ = new_bin; segment_start_ = 0; segment_start_received_ = false; pipeline_is_connected_ = false; gst_bin_add(GST_BIN(pipeline_), uridecodebin_); return true; } bool GstEnginePipeline::ReplaceDecodeBin(const QUrl& url) { GstElement* new_bin = nullptr; if (url.scheme() == "spotify") { new_bin = gst_bin_new("spotify_bin"); // Create elements GstElement* src = engine_->CreateElement("tcpserversrc", new_bin); GstElement* gdp = engine_->CreateElement("gdpdepay", new_bin); if (!src || !gdp) return false; // Pick a port number const int port = Utilities::PickUnusedPort(); g_object_set(G_OBJECT(src), "host", "127.0.0.1", nullptr); g_object_set(G_OBJECT(src), "port", port, nullptr); // Link the elements gst_element_link(src, gdp); // Add a ghost pad GstPad* pad = gst_element_get_static_pad(gdp, "src"); gst_element_add_pad(GST_ELEMENT(new_bin), gst_ghost_pad_new("src", pad)); gst_object_unref(GST_OBJECT(pad)); // Tell spotify to start sending data to us. InternetModel::Service()->server()->StartPlaybackLater( url.toString(), port); } else { new_bin = engine_->CreateElement("uridecodebin"); g_object_set(G_OBJECT(new_bin), "uri", url.toEncoded().constData(), nullptr); CHECKED_GCONNECT(G_OBJECT(new_bin), "drained", &SourceDrainedCallback, this); CHECKED_GCONNECT(G_OBJECT(new_bin), "pad-added", &NewPadCallback, this); CHECKED_GCONNECT(G_OBJECT(new_bin), "notify::source", &SourceSetupCallback, this); } return ReplaceDecodeBin(new_bin); } GstElement* GstEnginePipeline::CreateDecodeBinFromString(const char* pipeline) { GError* error = nullptr; GstElement* bin = gst_parse_bin_from_description(pipeline, TRUE, &error); if (error) { QString message = QString::fromLocal8Bit(error->message); int domain = error->domain; int code = error->code; g_error_free(error); qLog(Warning) << message; emit Error(id(), message, domain, code); return nullptr; } else { return bin; } } bool GstEnginePipeline::Init() { // Here we create all the parts of the gstreamer pipeline - from the source // to the sink. The parts of the pipeline are split up into bins: // uri decode bin -> audio bin // The uri decode bin is a gstreamer builtin that automatically picks the // right type of source and decoder for the URI. // The audio bin gets created here and contains: // queue ! audioconvert ! // ! ( rgvolume ! rglimiter ! audioconvert2 ) ! tee // rgvolume and rglimiter are only created when replaygain is enabled. // After the tee the pipeline splits. One split is converted to 16-bit int // samples for the scope, the other is kept as float32 and sent to the // speaker. // tee1 ! probe_queue ! probe_converter ! ! probe_sink // tee2 ! audio_queue ! equalizer_preamp ! equalizer ! volume ! audioscale // ! convert ! audiosink gst_segment_init(&last_decodebin_segment_, GST_FORMAT_TIME); // Audio bin audiobin_ = gst_bin_new("audiobin"); gst_bin_add(GST_BIN(pipeline_), audiobin_); // Create the sink if (!(audiosink_ = engine_->CreateElement(sink_, audiobin_))) return false; if (g_object_class_find_property(G_OBJECT_GET_CLASS(audiosink_), "device") && !device_.toString().isEmpty()) { switch (device_.type()) { case QVariant::Int: g_object_set(G_OBJECT(audiosink_), "device", device_.toInt(), nullptr); break; case QVariant::String: g_object_set(G_OBJECT(audiosink_), "device", device_.toString().toUtf8().constData(), nullptr); break; #ifdef Q_OS_WIN32 case QVariant::ByteArray: { GUID guid = QUuid(device_.toByteArray()); g_object_set(G_OBJECT(audiosink_), "device", &guid, nullptr); break; } #endif // Q_OS_WIN32 default: qLog(Warning) << "Unknown device type" << device_; break; } } // Create all the other elements GstElement* tee, *probe_queue, *probe_converter, *probe_sink, *audio_queue, *convert; queue_ = engine_->CreateElement("queue2", audiobin_); audioconvert_ = engine_->CreateElement("audioconvert", audiobin_); tee = engine_->CreateElement("tee", audiobin_); probe_queue = engine_->CreateElement("queue", audiobin_); probe_converter = engine_->CreateElement("audioconvert", audiobin_); probe_sink = engine_->CreateElement("fakesink", audiobin_); audio_queue = engine_->CreateElement("queue", audiobin_); equalizer_preamp_ = engine_->CreateElement("volume", audiobin_); equalizer_ = engine_->CreateElement("equalizer-nbands", audiobin_); stereo_panorama_ = engine_->CreateElement("audiopanorama", audiobin_); volume_ = engine_->CreateElement("volume", audiobin_); audioscale_ = engine_->CreateElement("audioresample", audiobin_); convert = engine_->CreateElement("audioconvert", audiobin_); if (!queue_ || !audioconvert_ || !tee || !probe_queue || !probe_converter || !probe_sink || !audio_queue || !equalizer_preamp_ || !equalizer_ || !stereo_panorama_ || !volume_ || !audioscale_ || !convert) { return false; } // Create the replaygain elements if it's enabled. event_probe is the // audioconvert element we attach the probe to, which will change depending // on whether replaygain is enabled. convert_sink is the element after the // first audioconvert, which again will change. GstElement* event_probe = audioconvert_; GstElement* convert_sink = tee; if (rg_enabled_) { rgvolume_ = engine_->CreateElement("rgvolume", audiobin_); rglimiter_ = engine_->CreateElement("rglimiter", audiobin_); audioconvert2_ = engine_->CreateElement("audioconvert", audiobin_); event_probe = audioconvert2_; convert_sink = rgvolume_; if (!rgvolume_ || !rglimiter_ || !audioconvert2_) { return false; } // Set replaygain settings g_object_set(G_OBJECT(rgvolume_), "album-mode", rg_mode_, nullptr); g_object_set(G_OBJECT(rgvolume_), "pre-amp", double(rg_preamp_), nullptr); g_object_set(G_OBJECT(rglimiter_), "enabled", int(rg_compression_), nullptr); } // Create a pad on the outside of the audiobin and connect it to the pad of // the first element. GstPad* pad = gst_element_get_static_pad(queue_, "sink"); gst_element_add_pad(audiobin_, gst_ghost_pad_new("sink", pad)); gst_object_unref(pad); // Add a data probe on the src pad of the audioconvert element for our scope. // We do it here because we want pre-equalized and pre-volume samples // so that our visualization are not be affected by them. pad = gst_element_get_static_pad(event_probe, "src"); gst_pad_add_probe(pad, GST_PAD_PROBE_TYPE_EVENT_UPSTREAM, &EventHandoffCallback, this, NULL); gst_object_unref(pad); // Configure the fakesink properly g_object_set(G_OBJECT(probe_sink), "sync", TRUE, nullptr); // Set the equalizer bands g_object_set(G_OBJECT(equalizer_), "num-bands", 10, nullptr); int last_band_frequency = 0; for (int i = 0; i < kEqBandCount; ++i) { GstObject* band = GST_OBJECT( gst_child_proxy_get_child_by_index(GST_CHILD_PROXY(equalizer_), i)); const float frequency = kEqBandFrequencies[i]; const float bandwidth = frequency - last_band_frequency; last_band_frequency = frequency; g_object_set(G_OBJECT(band), "freq", frequency, "bandwidth", bandwidth, "gain", 0.0f, nullptr); g_object_unref(G_OBJECT(band)); } // Set the stereo balance. g_object_set(G_OBJECT(stereo_panorama_), "panorama", stereo_balance_, nullptr); // Set the buffer duration. We set this on this queue instead of the // decode bin (in ReplaceDecodeBin()) because setting it on the decode bin // only affects network sources. // Disable the default buffer and byte limits, so we only buffer based on // time. g_object_set(G_OBJECT(queue_), "max-size-buffers", 0, nullptr); g_object_set(G_OBJECT(queue_), "max-size-bytes", 0, nullptr); g_object_set(G_OBJECT(queue_), "max-size-time", buffer_duration_nanosec_, nullptr); g_object_set(G_OBJECT(queue_), "low-percent", buffer_min_fill_, nullptr); if (buffer_duration_nanosec_ > 0) { g_object_set(G_OBJECT(queue_), "use-buffering", true, nullptr); } gst_element_link_many(queue_, audioconvert_, convert_sink, nullptr); // Link the elements with special caps // The scope path through the tee gets 16-bit ints. GstCaps* caps16 = gst_caps_new_simple("audio/x-raw", "format", G_TYPE_STRING, "S16LE", NULL); gst_element_link_filtered(probe_converter, probe_sink, caps16); gst_caps_unref(caps16); // Link the outputs of tee to the queues on each path. gst_pad_link(gst_element_get_request_pad(tee, "src_%u"), gst_element_get_static_pad(probe_queue, "sink")); gst_pad_link(gst_element_get_request_pad(tee, "src_%u"), gst_element_get_static_pad(audio_queue, "sink")); // Link replaygain elements if enabled. if (rg_enabled_) { gst_element_link_many(rgvolume_, rglimiter_, audioconvert2_, tee, nullptr); } // Link everything else. gst_element_link(probe_queue, probe_converter); gst_element_link_many(audio_queue, equalizer_preamp_, equalizer_, stereo_panorama_, volume_, audioscale_, convert, nullptr); // add caps for fixed sample rate and mono, but only if requested if (sample_rate_ != GstEngine::kAutoSampleRate && sample_rate_ > 0) { GstCaps* caps = gst_caps_new_simple("audio/x-raw", "rate", G_TYPE_INT, sample_rate_, nullptr); if (mono_playback_) { gst_caps_set_simple(caps, "channels", G_TYPE_INT, 1, nullptr); } gst_element_link_filtered(convert, audiosink_, caps); gst_caps_unref(caps); } else if (mono_playback_) { GstCaps* capsmono = gst_caps_new_simple("audio/x-raw", "channels", G_TYPE_INT, 1, nullptr); gst_element_link_filtered(convert, audiosink_, capsmono); gst_caps_unref(capsmono); } else { gst_element_link(convert, audiosink_); } // Add probes and handlers. gst_pad_add_probe(gst_element_get_static_pad(probe_converter, "src"), GST_PAD_PROBE_TYPE_BUFFER, HandoffCallback, this, nullptr); gst_bus_set_sync_handler(gst_pipeline_get_bus(GST_PIPELINE(pipeline_)), BusCallbackSync, this, nullptr); bus_cb_id_ = gst_bus_add_watch(gst_pipeline_get_bus(GST_PIPELINE(pipeline_)), BusCallback, this); MaybeLinkDecodeToAudio(); return true; } void GstEnginePipeline::MaybeLinkDecodeToAudio() { if (!uridecodebin_ || !audiobin_) return; GstPad* pad = gst_element_get_static_pad(uridecodebin_, "src"); if (!pad) return; gst_object_unref(pad); gst_element_link(uridecodebin_, audiobin_); } bool GstEnginePipeline::InitFromString(const QString& pipeline) { pipeline_ = gst_pipeline_new("pipeline"); GstElement* new_bin = CreateDecodeBinFromString(pipeline.toAscii().constData()); if (!new_bin) { return false; } if (!ReplaceDecodeBin(new_bin)) return false; if (!Init()) return false; return gst_element_link(new_bin, audiobin_); } bool GstEnginePipeline::InitFromUrl(const QUrl& url, qint64 end_nanosec) { pipeline_ = gst_pipeline_new("pipeline"); if (url.scheme() == "cdda" && !url.path().isEmpty()) { // Currently, Gstreamer can't handle input CD devices inside cdda URL. So // we handle them ourselve: we extract the track number and re-create an // URL with only cdda:// + the track number (which can be handled by // Gstreamer). We keep the device in mind, and we will set it later using // SourceSetupCallback QStringList path = url.path().split('/'); url_ = QUrl(QString("cdda://%1").arg(path.takeLast())); source_device_ = path.join("/"); } else { url_ = url; } end_offset_nanosec_ = end_nanosec; // Decode bin if (!ReplaceDecodeBin(url_)) return false; return Init(); } GstEnginePipeline::~GstEnginePipeline() { if (pipeline_) { gst_bus_set_sync_handler(gst_pipeline_get_bus(GST_PIPELINE(pipeline_)), nullptr, nullptr, nullptr); g_source_remove(bus_cb_id_); gst_element_set_state(pipeline_, GST_STATE_NULL); gst_object_unref(GST_OBJECT(pipeline_)); } } gboolean GstEnginePipeline::BusCallback(GstBus*, GstMessage* msg, gpointer self) { GstEnginePipeline* instance = reinterpret_cast(self); qLog(Debug) << instance->id() << "bus message" << GST_MESSAGE_TYPE_NAME(msg); switch (GST_MESSAGE_TYPE(msg)) { case GST_MESSAGE_ERROR: instance->ErrorMessageReceived(msg); break; case GST_MESSAGE_TAG: instance->TagMessageReceived(msg); break; case GST_MESSAGE_STATE_CHANGED: instance->StateChangedMessageReceived(msg); break; default: break; } return FALSE; } GstBusSyncReply GstEnginePipeline::BusCallbackSync(GstBus*, GstMessage* msg, gpointer self) { GstEnginePipeline* instance = reinterpret_cast(self); qLog(Debug) << instance->id() << "sync bus message" << GST_MESSAGE_TYPE_NAME(msg); switch (GST_MESSAGE_TYPE(msg)) { case GST_MESSAGE_EOS: emit instance->EndOfStreamReached(instance->id(), false); break; case GST_MESSAGE_TAG: instance->TagMessageReceived(msg); break; case GST_MESSAGE_ERROR: instance->ErrorMessageReceived(msg); break; case GST_MESSAGE_ELEMENT: instance->ElementMessageReceived(msg); break; case GST_MESSAGE_STATE_CHANGED: instance->StateChangedMessageReceived(msg); break; case GST_MESSAGE_BUFFERING: instance->BufferingMessageReceived(msg); break; case GST_MESSAGE_STREAM_STATUS: instance->StreamStatusMessageReceived(msg); break; case GST_MESSAGE_STREAM_START: if (instance->emit_track_ended_on_stream_start_) { qLog(Debug) << "New segment started, EOS will signal on next buffer " "discontinuity"; instance->emit_track_ended_on_stream_start_ = false; instance->emit_track_ended_on_time_discontinuity_ = true; } break; default: break; } return GST_BUS_PASS; } void GstEnginePipeline::StreamStatusMessageReceived(GstMessage* msg) { GstStreamStatusType type; GstElement* owner; gst_message_parse_stream_status(msg, &type, &owner); if (type == GST_STREAM_STATUS_TYPE_CREATE) { const GValue* val = gst_message_get_stream_status_object(msg); if (G_VALUE_TYPE(val) == GST_TYPE_TASK) { GstTask* task = static_cast(g_value_get_object(val)); gst_task_set_enter_callback(task, &TaskEnterCallback, this, NULL); } } } void GstEnginePipeline::TaskEnterCallback(GstTask*, GThread*, gpointer) { // Bump the priority of the thread only on OS X #ifdef Q_OS_DARWIN sched_param param; memset(¶m, 0, sizeof(param)); param.sched_priority = 99; pthread_setschedparam(pthread_self(), SCHED_RR, ¶m); #endif } void GstEnginePipeline::ElementMessageReceived(GstMessage* msg) { const GstStructure* structure = gst_message_get_structure(msg); if (gst_structure_has_name(structure, "redirect")) { const char* uri = gst_structure_get_string(structure, "new-location"); // Set the redirect URL. In mmssrc redirect messages come during the // initial state change to PLAYING, so callers can pick up this URL after // the state change has failed. redirect_url_ = QUrl::fromEncoded(uri); } } void GstEnginePipeline::ErrorMessageReceived(GstMessage* msg) { GError* error; gchar* debugs; gst_message_parse_error(msg, &error, &debugs); QString message = QString::fromLocal8Bit(error->message); QString debugstr = QString::fromLocal8Bit(debugs); int domain = error->domain; int code = error->code; g_error_free(error); free(debugs); if (!redirect_url_.isEmpty() && debugstr.contains( "A redirect message was posted on the bus and should have been " "handled by the application.")) { // mmssrc posts a message on the bus *and* makes an error message when it // wants to do a redirect. We handle the message, but now we have to // ignore the error too. return; } qLog(Error) << id() << debugstr; emit Error(id(), message, domain, code); } namespace { /* * Streams served by Akamai tend to have a weird tag format embedded. * * Example: * All Things Dance - text="Evolution" song_spot="T" MediaBaseId="0" * itunesTrackId="0" amgTrackId="0" amgArtistId="0" TAID="0" TPID="0" * cartcutId="0" */ QPair ParseAkamaiTag(const QString& tag) { QRegExp re("(.*) - text=\"([^\"]+)"); re.indexIn(tag); if (re.capturedTexts().length() >= 3) { return qMakePair(re.cap(1), re.cap(2)); } return qMakePair(tag, QString()); } bool IsAkamaiTag(const QString& tag) { return tag.contains("- text=\""); } } void GstEnginePipeline::TagMessageReceived(GstMessage* msg) { GstTagList* taglist = nullptr; gst_message_parse_tag(msg, &taglist); Engine::SimpleMetaBundle bundle; bundle.title = ParseTag(taglist, GST_TAG_TITLE); if (IsAkamaiTag(bundle.title)) { QPair artistTitlePair = ParseAkamaiTag(bundle.title); bundle.artist = artistTitlePair.first; bundle.title = artistTitlePair.second; } else { bundle.artist = ParseTag(taglist, GST_TAG_ARTIST); bundle.comment = ParseTag(taglist, GST_TAG_COMMENT); bundle.album = ParseTag(taglist, GST_TAG_ALBUM); } gst_tag_list_free(taglist); if (ignore_tags_) return; if (!bundle.title.isEmpty() || !bundle.artist.isEmpty() || !bundle.comment.isEmpty() || !bundle.album.isEmpty()) emit MetadataFound(id(), bundle); } QString GstEnginePipeline::ParseTag(GstTagList* list, const char* tag) const { gchar* data = nullptr; bool success = gst_tag_list_get_string(list, tag, &data); QString ret; if (success && data) { ret = QString::fromUtf8(data); g_free(data); } return ret.trimmed(); } void GstEnginePipeline::StateChangedMessageReceived(GstMessage* msg) { if (msg->src != GST_OBJECT(pipeline_)) { // We only care about state changes of the whole pipeline. return; } GstState old_state, new_state, pending; gst_message_parse_state_changed(msg, &old_state, &new_state, &pending); if (!pipeline_is_initialised_ && (new_state == GST_STATE_PAUSED || new_state == GST_STATE_PLAYING)) { pipeline_is_initialised_ = true; if (pending_seek_nanosec_ != -1 && pipeline_is_connected_) { QMetaObject::invokeMethod(this, "Seek", Qt::QueuedConnection, Q_ARG(qint64, pending_seek_nanosec_)); } } if (pipeline_is_initialised_ && new_state != GST_STATE_PAUSED && new_state != GST_STATE_PLAYING) { pipeline_is_initialised_ = false; } } void GstEnginePipeline::BufferingMessageReceived(GstMessage* msg) { // Only handle buffering messages from the queue2 element in audiobin - not // the one that's created automatically by uridecodebin. if (GST_ELEMENT(GST_MESSAGE_SRC(msg)) != queue_) { return; } // If we are loading new next track, we don't have to pause the playback. // The buffering is for the next track and not the current one. if (emit_track_ended_on_stream_start_) { qLog(Debug) << "Buffering next track"; return; } int percent = 0; gst_message_parse_buffering(msg, &percent); const GstState current_state = state(); if (percent == 0 && current_state == GST_STATE_PLAYING && !buffering_) { buffering_ = true; emit BufferingStarted(); SetState(GST_STATE_PAUSED); } else if (percent == 100 && buffering_) { buffering_ = false; emit BufferingFinished(); SetState(GST_STATE_PLAYING); } else if (buffering_) { emit BufferingProgress(percent); } } void GstEnginePipeline::NewPadCallback(GstElement*, GstPad* pad, gpointer self) { GstEnginePipeline* instance = reinterpret_cast(self); GstPad* const audiopad = gst_element_get_static_pad(instance->audiobin_, "sink"); // Link decodebin's sink pad to audiobin's src pad. if (GST_PAD_IS_LINKED(audiopad)) { qLog(Warning) << instance->id() << "audiopad is already linked, unlinking old pad"; gst_pad_unlink(audiopad, GST_PAD_PEER(audiopad)); } gst_pad_link(pad, audiopad); gst_object_unref(audiopad); // Offset the timestamps on all the buffers coming out of the decodebin so // they line up exactly with the end of the last buffer from the old // decodebin. // "Running time" is the time since the last flushing seek. GstClockTime running_time = gst_segment_to_running_time( &instance->last_decodebin_segment_, GST_FORMAT_TIME, instance->last_decodebin_segment_.position); gst_pad_set_offset(pad, running_time); // Add a probe to the pad so we can update last_decodebin_segment_. gst_pad_add_probe( pad, static_cast(GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM | GST_PAD_PROBE_TYPE_EVENT_FLUSH), DecodebinProbe, instance, nullptr); instance->pipeline_is_connected_ = true; if (instance->pending_seek_nanosec_ != -1 && instance->pipeline_is_initialised_) { QMetaObject::invokeMethod(instance, "Seek", Qt::QueuedConnection, Q_ARG(qint64, instance->pending_seek_nanosec_)); } } GstPadProbeReturn GstEnginePipeline::DecodebinProbe(GstPad* pad, GstPadProbeInfo* info, gpointer data) { GstEnginePipeline* instance = reinterpret_cast(data); const GstPadProbeType info_type = GST_PAD_PROBE_INFO_TYPE(info); if (info_type & GST_PAD_PROBE_TYPE_BUFFER) { // The decodebin produced a buffer. Record its end time, so we can offset // the buffers produced by the next decodebin when transitioning to the next // song. GstBuffer* buffer = GST_PAD_PROBE_INFO_BUFFER(info); GstClockTime timestamp = GST_BUFFER_TIMESTAMP(buffer); GstClockTime duration = GST_BUFFER_DURATION(buffer); if (timestamp == GST_CLOCK_TIME_NONE) { timestamp = instance->last_decodebin_segment_.position; } if (duration != GST_CLOCK_TIME_NONE) { timestamp += duration; } instance->last_decodebin_segment_.position = timestamp; } else if (info_type & GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM) { GstEvent* event = GST_PAD_PROBE_INFO_EVENT(info); GstEventType event_type = GST_EVENT_TYPE(event); if (event_type == GST_EVENT_SEGMENT) { // A new segment started, we need to save this to calculate running time // offsets later. gst_event_copy_segment(event, &instance->last_decodebin_segment_); } else if (event_type == GST_EVENT_FLUSH_START) { // A flushing seek resets the running time to 0, so remove any offset // we set on this pad before. gst_pad_set_offset(pad, 0); } } return GST_PAD_PROBE_OK; } GstPadProbeReturn GstEnginePipeline::HandoffCallback(GstPad*, GstPadProbeInfo* info, gpointer self) { GstEnginePipeline* instance = reinterpret_cast(self); GstBuffer* buf = gst_pad_probe_info_get_buffer(info); QList consumers; { QMutexLocker l(&instance->buffer_consumers_mutex_); consumers = instance->buffer_consumers_; } for (BufferConsumer* consumer : consumers) { gst_buffer_ref(buf); consumer->ConsumeBuffer(buf, instance->id()); } // Calculate the end time of this buffer so we can stop playback if it's // after the end time of this song. if (instance->end_offset_nanosec_ > 0) { quint64 start_time = GST_BUFFER_TIMESTAMP(buf) - instance->segment_start_; quint64 duration = GST_BUFFER_DURATION(buf); quint64 end_time = start_time + duration; if (end_time > instance->end_offset_nanosec_) { if (instance->has_next_valid_url()) { if (instance->next_url_ == instance->url_ && instance->next_beginning_offset_nanosec_ == instance->end_offset_nanosec_) { // The "next" song is actually the next segment of this file - so // cheat and keep on playing, but just tell the Engine we've moved on. instance->end_offset_nanosec_ = instance->next_end_offset_nanosec_; instance->next_url_ = QUrl(); instance->next_beginning_offset_nanosec_ = 0; instance->next_end_offset_nanosec_ = 0; // GstEngine will try to seek to the start of the new section, but // we're already there so ignore it. instance->ignore_next_seek_ = true; emit instance->EndOfStreamReached(instance->id(), true); } else { // We have a next song but we can't cheat, so move to it normally. instance->TransitionToNext(); } } else { // There's no next song emit instance->EndOfStreamReached(instance->id(), false); } } } if (instance->emit_track_ended_on_time_discontinuity_) { if (GST_BUFFER_FLAG_IS_SET(buf, GST_BUFFER_FLAG_DISCONT) || GST_BUFFER_OFFSET(buf) < instance->last_buffer_offset_) { qLog(Debug) << "Buffer discontinuity - emitting EOS"; instance->emit_track_ended_on_time_discontinuity_ = false; emit instance->EndOfStreamReached(instance->id(), true); } } instance->last_buffer_offset_ = GST_BUFFER_OFFSET(buf); return GST_PAD_PROBE_OK; } GstPadProbeReturn GstEnginePipeline::EventHandoffCallback(GstPad*, GstPadProbeInfo* info, gpointer self) { GstEnginePipeline* instance = reinterpret_cast(self); GstEvent* e = gst_pad_probe_info_get_event(info); qLog(Debug) << instance->id() << "event" << GST_EVENT_TYPE_NAME(e); switch (GST_EVENT_TYPE(e)) { case GST_EVENT_SEGMENT: if (!instance->segment_start_received_) { // The segment start time is used to calculate the proper offset of data // buffers from the start of the stream const GstSegment* segment = nullptr; gst_event_parse_segment(e, &segment); instance->segment_start_ = segment->start; instance->segment_start_received_ = true; } break; default: break; } return GST_PAD_PROBE_OK; } void GstEnginePipeline::SourceDrainedCallback(GstURIDecodeBin* bin, gpointer self) { GstEnginePipeline* instance = reinterpret_cast(self); if (instance->has_next_valid_url()) { instance->TransitionToNext(); } } void GstEnginePipeline::SourceSetupCallback(GstURIDecodeBin* bin, GParamSpec* pspec, gpointer self) { GstEnginePipeline* instance = reinterpret_cast(self); GstElement* element; g_object_get(bin, "source", &element, nullptr); if (!element) { return; } if (g_object_class_find_property(G_OBJECT_GET_CLASS(element), "device") && !instance->source_device().isEmpty()) { // Gstreamer is not able to handle device in URL (refering to Gstreamer // documentation, this might be added in the future). Despite that, for now // we include device inside URL: we decompose it during Init and set device // here, when this callback is called. g_object_set(element, "device", instance->source_device().toLocal8Bit().constData(), nullptr); } if (g_object_class_find_property(G_OBJECT_GET_CLASS(element), "extra-headers") && instance->url().host().contains("amazonaws.com")) { GstStructure* headers = gst_structure_new("extra-headers", "Authorization", G_TYPE_STRING, instance->url().fragment().toAscii().data(), nullptr); g_object_set(element, "extra-headers", headers, nullptr); gst_structure_free(headers); } if (g_object_class_find_property(G_OBJECT_GET_CLASS(element), "user-agent")) { QString user_agent = QString("%1 %2").arg(QCoreApplication::applicationName(), QCoreApplication::applicationVersion()); g_object_set(element, "user-agent", user_agent.toUtf8().constData(), nullptr); #ifdef Q_OS_DARWIN g_object_set(element, "tls-database", instance->engine_->tls_database(), nullptr); g_object_set(element, "ssl-use-system-ca-file", false, nullptr); g_object_set(element, "ssl-strict", TRUE, nullptr); #endif } } void GstEnginePipeline::TransitionToNext() { GstElement* old_decode_bin = uridecodebin_; ignore_tags_ = true; ReplaceDecodeBin(next_url_); gst_element_set_state(uridecodebin_, GST_STATE_PLAYING); MaybeLinkDecodeToAudio(); url_ = next_url_; end_offset_nanosec_ = next_end_offset_nanosec_; next_url_ = QUrl(); next_beginning_offset_nanosec_ = 0; next_end_offset_nanosec_ = 0; // This function gets called when the source has been drained, even if the // song hasn't finished playing yet. We'll get a new stream when it really // does finish, so emit TrackEnded then. emit_track_ended_on_stream_start_ = true; // This has to happen *after* the gst_element_set_state on the new bin to // fix an occasional race condition deadlock. sElementDeleter->DeleteElementLater(old_decode_bin); ignore_tags_ = false; } qint64 GstEnginePipeline::position() const { if (pipeline_is_initialised_) gst_element_query_position(pipeline_, GST_FORMAT_TIME, &last_known_position_ns_); return last_known_position_ns_; } qint64 GstEnginePipeline::length() const { gint64 value = 0; gst_element_query_duration(pipeline_, GST_FORMAT_TIME, &value); return value; } GstState GstEnginePipeline::state() const { GstState s, sp; if (gst_element_get_state(pipeline_, &s, &sp, kGstStateTimeoutNanosecs) == GST_STATE_CHANGE_FAILURE) return GST_STATE_NULL; return s; } QFuture GstEnginePipeline::SetState(GstState state) { if (url_.scheme() == "spotify" && !buffering_) { const GstState current_state = this->state(); if (state == GST_STATE_PAUSED && current_state == GST_STATE_PLAYING) { SpotifyService* spotify = InternetModel::Service(); // Need to schedule this in the spotify service's thread QMetaObject::invokeMethod(spotify, "SetPaused", Qt::QueuedConnection, Q_ARG(bool, true)); } else if (state == GST_STATE_PLAYING && current_state == GST_STATE_PAUSED) { SpotifyService* spotify = InternetModel::Service(); // Need to schedule this in the spotify service's thread QMetaObject::invokeMethod(spotify, "SetPaused", Qt::QueuedConnection, Q_ARG(bool, false)); } } return ConcurrentRun::Run( &set_state_threadpool_, &gst_element_set_state, pipeline_, state); } bool GstEnginePipeline::Seek(qint64 nanosec) { if (ignore_next_seek_) { ignore_next_seek_ = false; return true; } if (!pipeline_is_connected_ || !pipeline_is_initialised_) { pending_seek_nanosec_ = nanosec; return true; } pending_seek_nanosec_ = -1; last_known_position_ns_ = nanosec; return gst_element_seek_simple(pipeline_, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, nanosec); } void GstEnginePipeline::SetEqualizerEnabled(bool enabled) { eq_enabled_ = enabled; UpdateEqualizer(); } void GstEnginePipeline::SetEqualizerParams(int preamp, const QList& band_gains) { eq_preamp_ = preamp; eq_band_gains_ = band_gains; UpdateEqualizer(); } void GstEnginePipeline::SetStereoBalance(float value) { stereo_balance_ = value; UpdateStereoBalance(); } void GstEnginePipeline::UpdateEqualizer() { // Update band gains for (int i = 0; i < kEqBandCount; ++i) { float gain = eq_enabled_ ? eq_band_gains_[i] : 0.0; if (gain < 0) gain *= 0.24; else gain *= 0.12; GstObject* band = GST_OBJECT( gst_child_proxy_get_child_by_index(GST_CHILD_PROXY(equalizer_), i)); g_object_set(G_OBJECT(band), "gain", gain, nullptr); g_object_unref(G_OBJECT(band)); } // Update preamp float preamp = 1.0; if (eq_enabled_) preamp = float(eq_preamp_ + 100) * 0.01; // To scale from 0.0 to 2.0 g_object_set(G_OBJECT(equalizer_preamp_), "volume", preamp, nullptr); } void GstEnginePipeline::UpdateStereoBalance() { if (stereo_panorama_) { g_object_set(G_OBJECT(stereo_panorama_), "panorama", stereo_balance_, nullptr); } } void GstEnginePipeline::SetVolume(int percent) { volume_percent_ = percent; UpdateVolume(); } void GstEnginePipeline::SetVolumeModifier(qreal mod) { volume_modifier_ = mod; UpdateVolume(); } void GstEnginePipeline::UpdateVolume() { float vol = double(volume_percent_) * 0.01 * volume_modifier_; g_object_set(G_OBJECT(volume_), "volume", vol, nullptr); } void GstEnginePipeline::StartFader(qint64 duration_nanosec, QTimeLine::Direction direction, QTimeLine::CurveShape shape, bool use_fudge_timer) { const int duration_msec = duration_nanosec / kNsecPerMsec; // If there's already another fader running then start from the same time // that one was already at. int start_time = direction == QTimeLine::Forward ? 0 : duration_msec; if (fader_ && fader_->state() == QTimeLine::Running) { if (duration_msec == fader_->duration()) { start_time = fader_->currentTime(); } else { // Calculate the position in the new fader with the same value from // the old fader, so no volume jumps appear qreal time = qreal(duration_msec) * (qreal(fader_->currentTime()) / qreal(fader_->duration())); start_time = qRound(time); } } fader_.reset(new QTimeLine(duration_msec, this)); connect(fader_.get(), SIGNAL(valueChanged(qreal)), SLOT(SetVolumeModifier(qreal))); connect(fader_.get(), SIGNAL(finished()), SLOT(FaderTimelineFinished())); fader_->setDirection(direction); fader_->setCurveShape(shape); fader_->setCurrentTime(start_time); fader_->resume(); fader_fudge_timer_.stop(); use_fudge_timer_ = use_fudge_timer; SetVolumeModifier(fader_->currentValue()); } void GstEnginePipeline::FaderTimelineFinished() { fader_.reset(); // Wait a little while longer before emitting the finished signal (and // probably distroying the pipeline) to account for delays in the audio // server/driver. if (use_fudge_timer_) { fader_fudge_timer_.start(kFaderFudgeMsec, this); } else { // Even here we cannot emit the signal directly, as it result in a // stutter when resuming playback. So use a quest small time, so you // won't notice the difference when resuming playback // (You get here when the pause fading is active) fader_fudge_timer_.start(250, this); } } void GstEnginePipeline::timerEvent(QTimerEvent* e) { if (e->timerId() == fader_fudge_timer_.timerId()) { fader_fudge_timer_.stop(); emit FaderFinished(); return; } QObject::timerEvent(e); } void GstEnginePipeline::AddBufferConsumer(BufferConsumer* consumer) { QMutexLocker l(&buffer_consumers_mutex_); buffer_consumers_ << consumer; } void GstEnginePipeline::RemoveBufferConsumer(BufferConsumer* consumer) { QMutexLocker l(&buffer_consumers_mutex_); buffer_consumers_.removeAll(consumer); } void GstEnginePipeline::RemoveAllBufferConsumers() { QMutexLocker l(&buffer_consumers_mutex_); buffer_consumers_.clear(); } void GstEnginePipeline::SetNextUrl(const QUrl& url, qint64 beginning_nanosec, qint64 end_nanosec) { next_url_ = url; next_beginning_offset_nanosec_ = beginning_nanosec; next_end_offset_nanosec_ = end_nanosec; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/engines/gstenginepipeline.h000066400000000000000000000233731260417502300255000ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef GSTENGINEPIPELINE_H #define GSTENGINEPIPELINE_H #include #include #include #include #include #include #include #include #include #include "engine_fwd.h" class GstElementDeleter; class GstEngine; class BufferConsumer; struct GstQueue; struct GstURIDecodeBin; class GstEnginePipeline : public QObject { Q_OBJECT public: GstEnginePipeline(GstEngine* engine); ~GstEnginePipeline(); // Globally unique across all pipelines. int id() const { return id_; } // Call these setters before Init void set_output_device(const QString& sink, const QVariant& device); void set_replaygain(bool enabled, int mode, float preamp, bool compression); void set_buffer_duration_nanosec(qint64 duration_nanosec); void set_buffer_min_fill(int percent); void set_mono_playback(bool enabled); void set_sample_rate(int rate); // Creates the pipeline, returns false on error bool InitFromUrl(const QUrl& url, qint64 end_nanosec); bool InitFromString(const QString& pipeline); // BufferConsumers get fed audio data. Thread-safe. void AddBufferConsumer(BufferConsumer* consumer); void RemoveBufferConsumer(BufferConsumer* consumer); void RemoveAllBufferConsumers(); // Control the music playback QFuture SetState(GstState state); Q_INVOKABLE bool Seek(qint64 nanosec); void SetEqualizerEnabled(bool enabled); void SetEqualizerParams(int preamp, const QList& band_gains); void SetVolume(int percent); void SetStereoBalance(float value); void StartFader(qint64 duration_nanosec, QTimeLine::Direction direction = QTimeLine::Forward, QTimeLine::CurveShape shape = QTimeLine::LinearCurve, bool use_fudge_timer = true); // If this is set then it will be loaded automatically when playback finishes // for gapless playback void SetNextUrl(const QUrl& url, qint64 beginning_nanosec, qint64 end_nanosec); bool has_next_valid_url() const { return next_url_.isValid(); } // Get information about the music playback QUrl url() const { return url_; } bool is_valid() const { return valid_; } // Please note that this method (unlike GstEngine's.position()) is // multiple-section media unaware. qint64 position() const; // Please note that this method (unlike GstEngine's.length()) is // multiple-section media unaware. qint64 length() const; // Returns this pipeline's state. May return GST_STATE_NULL if the state check // timed out. The timeout value is a reasonable default. GstState state() const; qint64 segment_start() const { return segment_start_; } // Don't allow the user to change the playback state (playing/paused) while // the pipeline is buffering. bool is_buffering() const { return buffering_; } QUrl redirect_url() const { return redirect_url_; } QString source_device() const { return source_device_; } public slots: void SetVolumeModifier(qreal mod); signals: void EndOfStreamReached(int pipeline_id, bool has_next_track); void MetadataFound(int pipeline_id, const Engine::SimpleMetaBundle& bundle); // This indicates an error, delegated from GStreamer, in the pipeline. // The message, domain and error_code are related to GStreamer's GError. void Error(int pipeline_id, const QString& message, int domain, int error_code); void FaderFinished(); void BufferingStarted(); void BufferingProgress(int percent); void BufferingFinished(); protected: void timerEvent(QTimerEvent*); private: // Static callbacks. The GstEnginePipeline instance is passed in the last // argument. static GstBusSyncReply BusCallbackSync(GstBus*, GstMessage*, gpointer); static gboolean BusCallback(GstBus*, GstMessage*, gpointer); static void NewPadCallback(GstElement*, GstPad*, gpointer); static GstPadProbeReturn HandoffCallback(GstPad*, GstPadProbeInfo*, gpointer); static GstPadProbeReturn EventHandoffCallback(GstPad*, GstPadProbeInfo*, gpointer); static GstPadProbeReturn DecodebinProbe(GstPad*, GstPadProbeInfo*, gpointer); static void SourceDrainedCallback(GstURIDecodeBin*, gpointer); static void SourceSetupCallback(GstURIDecodeBin*, GParamSpec* pspec, gpointer); static void TaskEnterCallback(GstTask*, GThread*, gpointer); void TagMessageReceived(GstMessage*); void ErrorMessageReceived(GstMessage*); void ElementMessageReceived(GstMessage*); void StateChangedMessageReceived(GstMessage*); void BufferingMessageReceived(GstMessage*); void StreamStatusMessageReceived(GstMessage*); QString ParseTag(GstTagList* list, const char* tag) const; bool Init(); GstElement* CreateDecodeBinFromString(const char* pipeline); void UpdateVolume(); void UpdateEqualizer(); void UpdateStereoBalance(); bool ReplaceDecodeBin(GstElement* new_bin); bool ReplaceDecodeBin(const QUrl& url); void TransitionToNext(); // If the decodebin is special (ie. not really a uridecodebin) then it'll have // a src pad immediately and we can link it after everything's created. void MaybeLinkDecodeToAudio(); private slots: void FaderTimelineFinished(); private: static const int kGstStateTimeoutNanosecs; static const int kFaderFudgeMsec; static const int kEqBandCount; static const int kEqBandFrequencies[]; static GstElementDeleter* sElementDeleter; GstEngine* engine_; // Using == to compare two pipelines is a bad idea, because new ones often // get created in the same address as old ones. This ID will be unique for // each pipeline. // Threading warning: access to the static ID field isn't protected by a // mutex because all pipeline creation is currently done in the main thread. static int sId; int id_; // General settings for the pipeline bool valid_; QString sink_; QVariant device_; // These get called when there is a new audio buffer available QList buffer_consumers_; QMutex buffer_consumers_mutex_; qint64 segment_start_; bool segment_start_received_; bool emit_track_ended_on_stream_start_; bool emit_track_ended_on_time_discontinuity_; qint64 last_buffer_offset_; // Equalizer bool eq_enabled_; int eq_preamp_; QList eq_band_gains_; // Stereo balance. // From -1.0 - 1.0 // -1.0 is left, 1.0 is right. float stereo_balance_; // ReplayGain bool rg_enabled_; int rg_mode_; float rg_preamp_; bool rg_compression_; // Buffering quint64 buffer_duration_nanosec_; int buffer_min_fill_; bool buffering_; bool mono_playback_; int sample_rate_; // The URL that is currently playing, and the URL that is to be preloaded // when the current track is close to finishing. QUrl url_; QUrl next_url_; // If this is > 0 then the pipeline will be forced to stop when playback goes // past this position. qint64 end_offset_nanosec_; // We store the beginning and end for the preloading song too, so we can just // carry on without reloading the file if the sections carry on from each // other. qint64 next_beginning_offset_nanosec_; qint64 next_end_offset_nanosec_; // Set temporarily when moving to the next contiguous section in a multi-part // file. bool ignore_next_seek_; // Set temporarily when switching out the decode bin, so metadata doesn't // get sent while the Player still thinks it's playing the last song bool ignore_tags_; // When the gstreamer source requests a redirect we store the URL here and // callers can pick it up after the state change to PLAYING fails. QUrl redirect_url_; // When we need to specify the device to use as source (for CD device) QString source_device_; // Seeking while the pipeline is in the READY state doesn't work, so we have // to wait until it goes to PAUSED or PLAYING. // Also we have to wait for the decodebin to be connected. bool pipeline_is_initialised_; bool pipeline_is_connected_; qint64 pending_seek_nanosec_; // We can only use gst_element_query_position() when the pipeline is in // PAUSED nor PLAYING state. Whenever we get a new position (e.g. after a // correct call to gst_element_query_position() or after a seek), we store // it here so that we can use it when using gst_element_query_position() is // not possible. mutable gint64 last_known_position_ns_; int volume_percent_; qreal volume_modifier_; std::unique_ptr fader_; QBasicTimer fader_fudge_timer_; bool use_fudge_timer_; GstElement* pipeline_; // Bins // uridecodebin ! audiobin GstElement* uridecodebin_; GstElement* audiobin_; // Elements in the audiobin. See comments in Init()'s definition. GstElement* queue_; GstElement* audioconvert_; GstElement* rgvolume_; GstElement* rglimiter_; GstElement* audioconvert2_; GstElement* equalizer_preamp_; GstElement* equalizer_; GstElement* stereo_panorama_; GstElement* volume_; GstElement* audioscale_; GstElement* audiosink_; uint bus_cb_id_; QThreadPool set_state_threadpool_; GstSegment last_decodebin_segment_; }; #endif // GSTENGINEPIPELINE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/engines/osxdevicefinder.cpp000066400000000000000000000071531260417502300255010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include #include #include "osxdevicefinder.h" #include "core/logging.h" #include "core/scoped_cftyperef.h" namespace { template std::unique_ptr GetProperty(const AudioDeviceID& device_id, const AudioObjectPropertyAddress& address, UInt32* size_bytes_out = nullptr) { UInt32 size_bytes = 0; OSStatus status = AudioObjectGetPropertyDataSize( device_id, &address, 0, NULL, &size_bytes); if (status != kAudioHardwareNoError) { qLog(Warning) << "AudioObjectGetPropertyDataSize failed:" << status; return std::unique_ptr(); } std::unique_ptr ret(reinterpret_cast(malloc(size_bytes))); status = AudioObjectGetPropertyData(device_id, &address, 0, NULL, &size_bytes, ret.get()); if (status != kAudioHardwareNoError) { qLog(Warning) << "AudioObjectGetPropertyData failed:" << status; return std::unique_ptr(); } if (size_bytes_out) { *size_bytes_out = size_bytes; } return ret; } } // namespace OsxDeviceFinder::OsxDeviceFinder() : DeviceFinder("osxaudiosink") { } QList OsxDeviceFinder::ListDevices() { QList ret; AudioObjectPropertyAddress address = { kAudioHardwarePropertyDevices, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; UInt32 device_size_bytes = 0; std::unique_ptr devices = GetProperty( kAudioObjectSystemObject, address, &device_size_bytes); if (!devices.get()) { return ret; } const int device_count = device_size_bytes / sizeof(AudioDeviceID); address.mScope = kAudioDevicePropertyScopeOutput; for (UInt32 i = 0; i < device_count; ++i) { const AudioDeviceID id = devices.get()[i]; // Query device name address.mSelector = kAudioDevicePropertyDeviceNameCFString; std::unique_ptr device_name = GetProperty(id, address); ScopedCFTypeRef scoped_device_name(*device_name.get()); if (!device_name.get()) { continue; } // Determine if the device is an output device (it is an output device if // it has output channels) address.mSelector = kAudioDevicePropertyStreamConfiguration; std::unique_ptr buffer_list = GetProperty(id, address); if (!buffer_list.get() || buffer_list->mNumberBuffers == 0) { continue; } Device dev; dev.description = QString::fromUtf8( CFStringGetCStringPtr(*device_name, CFStringGetSystemEncoding())); dev.device_property_value = id; dev.icon_name = GuessIconName(dev.description); ret.append(dev); } return ret; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/engines/osxdevicefinder.h000066400000000000000000000017761260417502300251530ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef OSXDEVICEFINDER_H #define OSXDEVICEFINDER_H #include "engines/devicefinder.h" class OsxDeviceFinder : public DeviceFinder { public: OsxDeviceFinder(); virtual bool Initialise() { return true; } virtual QList ListDevices(); }; #endif // OSXDEVICEFINDER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/engines/pulsedevicefinder.cpp000066400000000000000000000071151260417502300260160ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "core/logging.h" #include "engines/pulsedevicefinder.h" PulseDeviceFinder::PulseDeviceFinder() : DeviceFinder("pulsesink"), mainloop_(nullptr), context_(nullptr) { } bool PulseDeviceFinder::Initialise() { mainloop_ = pa_mainloop_new(); if (!mainloop_) { qLog(Warning) << "Failed to create pulseaudio mainloop"; return false; } return Reconnect(); } bool PulseDeviceFinder::Reconnect() { if (context_) { pa_context_disconnect(context_); pa_context_unref(context_); } context_ = pa_context_new(pa_mainloop_get_api(mainloop_), "Clementine device finder"); if (!context_) { qLog(Warning) << "Failed to create pulseaudio context"; return false; } if (pa_context_connect(context_, nullptr, PA_CONTEXT_NOFLAGS, nullptr) < 0) { qLog(Warning) << "Failed to connect pulseaudio context"; return false; } // Wait for the context to be connected. forever { const pa_context_state state = pa_context_get_state(context_); if (state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) { qLog(Warning) << "Connection to pulseaudio failed"; return false; } if (state == PA_CONTEXT_READY) { return true; } pa_mainloop_iterate(mainloop_, true, nullptr); } } QList PulseDeviceFinder::ListDevices() { if (!context_ || pa_context_get_state(context_) != PA_CONTEXT_READY) { return QList(); } retry: ListDevicesState state; pa_context_get_sink_info_list( context_, &PulseDeviceFinder::GetSinkInfoCallback, &state); forever { if (state.finished) { return state.devices; } switch (pa_context_get_state(context_)) { case PA_CONTEXT_READY: break; case PA_CONTEXT_FAILED: case PA_CONTEXT_TERMINATED: // Maybe pulseaudio died. Try reconnecting. if (Reconnect()) { goto retry; } return state.devices; default: return state.devices; } pa_mainloop_iterate(mainloop_, true, nullptr); } } void PulseDeviceFinder::GetSinkInfoCallback(pa_context* c, const pa_sink_info* info, int eol, void* state_voidptr) { ListDevicesState* state = reinterpret_cast(state_voidptr); if (info) { Device dev; dev.device_property_value = QString::fromUtf8(info->name); dev.description = QString::fromUtf8(info->description); dev.icon_name = QString::fromUtf8( pa_proplist_gets(info->proplist, "device.icon_name")); state->devices.append(dev); } if (eol) { state->finished = true; } } PulseDeviceFinder::~PulseDeviceFinder() { if (context_) { pa_context_disconnect(context_); pa_context_unref(context_); } if (mainloop_) { pa_mainloop_free(mainloop_); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/engines/pulsedevicefinder.h000066400000000000000000000030311260417502300254540ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PULSEDEVICEFINDER_H #define PULSEDEVICEFINDER_H #include #include #include #include #include "engines/devicefinder.h" class PulseDeviceFinder : public DeviceFinder { public: PulseDeviceFinder(); ~PulseDeviceFinder(); virtual bool Initialise(); virtual QList ListDevices(); private: struct ListDevicesState { ListDevicesState() : finished(false) {} bool finished; QList devices; }; bool Reconnect(); static void GetSinkInfoCallback(pa_context* c, const pa_sink_info* info, int eol, void* state_voidptr); pa_mainloop* mainloop_; pa_context* context_; }; #endif // PULSEDEVICEFINDER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/000077500000000000000000000000001260417502300226045ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/digitallyimportedsearchprovider.cpp000066400000000000000000000037601260417502300320050ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "digitallyimportedsearchprovider.h" #include "core/logging.h" DigitallyImportedSearchProvider::DigitallyImportedSearchProvider( DigitallyImportedServiceBase* service, Application* app, QObject* parent) : SimpleSearchProvider(app, parent), service_(service) { Init(service_->name(), service->api_service_name(), service_->icon(), ArtIsInSongMetadata | CanGiveSuggestions | CanShowConfig); set_safe_words(QStringList() << "radiotunes" << "di.fm" << "difm" << "digitallyimported"); set_max_suggestion_count(5); connect(service_, SIGNAL(StreamsChanged()), SLOT(MaybeRecreateItems())); // Load the channel list on startup only if it doesn't involve going to update // info from the server. if (!service_->IsChannelListStale()) RecreateItems(); } void DigitallyImportedSearchProvider::RecreateItems() { QList items; DigitallyImportedClient::ChannelList channels = service_->Channels(); for (const DigitallyImportedClient::Channel& channel : channels) { Song song; service_->SongFromChannel(channel, &song); items << Item(song); } SetItems(items); } void DigitallyImportedSearchProvider::ShowConfig() { service_->ShowSettingsDialog(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/digitallyimportedsearchprovider.h000066400000000000000000000025611260417502300314500ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef DIGITALLYIMPORTEDSEARCHPROVIDER_H #define DIGITALLYIMPORTEDSEARCHPROVIDER_H #include "simplesearchprovider.h" #include "internet/digitally/digitallyimportedservicebase.h" class DigitallyImportedSearchProvider : public SimpleSearchProvider { public: DigitallyImportedSearchProvider(DigitallyImportedServiceBase* service, Application* app, QObject* parent); // SearchProvider void ShowConfig() override; InternetService* internet_service() override { return service_; } protected: void RecreateItems(); private: DigitallyImportedServiceBase* service_; }; #endif // DIGITALLYIMPORTEDSEARCHPROVIDER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/globalsearch.cpp000066400000000000000000000264311260417502300257440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "librarysearchprovider.h" #include "globalsearch.h" #include "urlsearchprovider.h" #include "core/application.h" #include "core/logging.h" #include "covers/albumcoverloader.h" #include #include #include #include #include const int GlobalSearch::kDelayedSearchTimeoutMs = 200; const char* GlobalSearch::kSettingsGroup = "GlobalSearch"; const int GlobalSearch::kMaxResultsPerEmission = 500; GlobalSearch::GlobalSearch(Application* app, QObject* parent) : QObject(parent), app_(app), next_id_(1), url_provider_(new UrlSearchProvider(app, this)) { cover_loader_options_.desired_height_ = SearchProvider::kArtHeight; cover_loader_options_.pad_output_image_ = true; cover_loader_options_.scale_output_image_ = true; connect(app_->album_cover_loader(), SIGNAL(ImageLoaded(quint64, QImage)), SLOT(AlbumArtLoaded(quint64, QImage))); ConnectProvider(url_provider_); } void GlobalSearch::ConnectProvider(SearchProvider* provider) { connect(provider, SIGNAL(ResultsAvailable(int, SearchProvider::ResultList)), SLOT(ResultsAvailableSlot(int, SearchProvider::ResultList))); connect(provider, SIGNAL(SearchFinished(int)), SLOT(SearchFinishedSlot(int))); connect(provider, SIGNAL(ArtLoaded(int, QImage)), SLOT(ArtLoadedSlot(int, QImage))); connect(provider, SIGNAL(destroyed(QObject*)), SLOT(ProviderDestroyedSlot(QObject*))); } void GlobalSearch::AddProvider(SearchProvider* provider) { Q_ASSERT(!provider->name().isEmpty()); bool enabled = provider->is_enabled_by_default(); // Check if there is saved enabled/disabled state for this provider. QSettings s; s.beginGroup(kSettingsGroup); QVariant enabled_variant = s.value("enabled_" + provider->id()); if (enabled_variant.isValid()) { enabled = enabled_variant.toBool(); } // Add data ProviderData data; data.enabled_ = enabled; providers_[provider] = data; ConnectProvider(provider); emit ProviderAdded(provider); } int GlobalSearch::SearchAsync(const QString& query) { const int id = next_id_++; pending_search_providers_[id] = 0; int timer_id = -1; if (url_provider_->LooksLikeUrl(query)) { url_provider_->SearchAsync(id, query); } else { for (SearchProvider* provider : providers_.keys()) { if (!is_provider_usable(provider)) continue; pending_search_providers_[id]++; if (provider->wants_delayed_queries()) { if (timer_id == -1) { timer_id = startTimer(kDelayedSearchTimeoutMs); delayed_searches_[timer_id].id_ = id; delayed_searches_[timer_id].query_ = query; } delayed_searches_[timer_id].providers_ << provider; } else { provider->SearchAsync(id, query); } } } return id; } void GlobalSearch::CancelSearch(int id) { QMap::iterator it; for (it = delayed_searches_.begin(); it != delayed_searches_.end(); ++it) { if (it.value().id_ == id) { killTimer(it.key()); delayed_searches_.erase(it); return; } } } void GlobalSearch::timerEvent(QTimerEvent* e) { QMap::iterator it = delayed_searches_.find(e->timerId()); if (it != delayed_searches_.end()) { for (SearchProvider* provider : it.value().providers_) { provider->SearchAsync(it.value().id_, it.value().query_); } delayed_searches_.erase(it); return; } QObject::timerEvent(e); } QString GlobalSearch::PixmapCacheKey(const SearchProvider::Result& result) const { return "globalsearch:" % QString::number(qulonglong(result.provider_)) % "," % result.metadata_.url().toString(); } void GlobalSearch::ResultsAvailableSlot(int id, SearchProvider::ResultList results) { if (results.isEmpty()) return; // Limit the number of results that are used from each emission. // Just a sanity check to stop some providers (Jamendo) returning thousands // of results. if (results.count() > kMaxResultsPerEmission) { SearchProvider::ResultList::iterator begin = results.begin(); std::advance(begin, kMaxResultsPerEmission); results.erase(begin, results.end()); } // Load cached pixmaps into the results for (SearchProvider::ResultList::iterator it = results.begin(); it != results.end(); ++it) { it->pixmap_cache_key_ = PixmapCacheKey(*it); } emit ResultsAvailable(id, results); } void GlobalSearch::SearchFinishedSlot(int id) { if (!pending_search_providers_.contains(id)) return; SearchProvider* provider = static_cast(sender()); const int remaining = --pending_search_providers_[id]; emit ProviderSearchFinished(id, provider); if (remaining == 0) { emit SearchFinished(id); pending_search_providers_.remove(id); } } void GlobalSearch::ProviderDestroyedSlot(QObject* object) { SearchProvider* provider = static_cast(object); if (!providers_.contains(provider)) return; providers_.remove(provider); emit ProviderRemoved(provider); // We have to abort any pending searches since we can't tell whether they // were on this provider. for (int id : pending_search_providers_.keys()) { emit SearchFinished(id); } pending_search_providers_.clear(); } QList GlobalSearch::providers() const { return providers_.keys(); } int GlobalSearch::LoadArtAsync(const SearchProvider::Result& result) { const int id = next_id_++; pending_art_searches_[id] = result.pixmap_cache_key_; if (providers_.contains(result.provider_) && !is_provider_usable(result.provider_)) { emit ArtLoaded(id, QPixmap()); return id; } if (result.provider_->art_is_in_song_metadata()) { quint64 loader_id = app_->album_cover_loader()->LoadImageAsync( cover_loader_options_, result.metadata_); cover_loader_tasks_[loader_id] = id; } else if (providers_.contains(result.provider_) && result.provider_->wants_serialised_art()) { QueuedArt request; request.id_ = id; request.result_ = result; QList* queued_art = &providers_[result.provider_].queued_art_; queued_art->append(request); if (queued_art->count() == 1) { TakeNextQueuedArt(result.provider_); } } else { result.provider_->LoadArtAsync(id, result); } return id; } void GlobalSearch::TakeNextQueuedArt(SearchProvider* provider) { if (!providers_.contains(provider) || providers_[provider].queued_art_.isEmpty()) return; const QueuedArt& data = providers_[provider].queued_art_.first(); provider->LoadArtAsync(data.id_, data.result_); } void GlobalSearch::ArtLoadedSlot(int id, const QImage& image) { SearchProvider* provider = static_cast(sender()); HandleLoadedArt(id, image, provider); } void GlobalSearch::AlbumArtLoaded(quint64 id, const QImage& image) { if (!cover_loader_tasks_.contains(id)) return; int orig_id = cover_loader_tasks_.take(id); HandleLoadedArt(orig_id, image, nullptr); } void GlobalSearch::HandleLoadedArt(int id, const QImage& image, SearchProvider* provider) { const QString key = pending_art_searches_.take(id); QPixmap pixmap = QPixmap::fromImage(image); pixmap_cache_.insert(key, pixmap); emit ArtLoaded(id, pixmap); if (provider && providers_.contains(provider) && !providers_[provider].queued_art_.isEmpty()) { providers_[provider].queued_art_.removeFirst(); TakeNextQueuedArt(provider); } } bool GlobalSearch::FindCachedPixmap(const SearchProvider::Result& result, QPixmap* pixmap) const { return pixmap_cache_.find(result.pixmap_cache_key_, pixmap); } MimeData* GlobalSearch::LoadTracks(const SearchProvider::ResultList& results) { // Different providers might create MimeData in different ways, so it's not // possible to combine different providers. Just take the results from a // single provider. if (results.isEmpty()) { return nullptr; } SearchProvider* first_provider = results[0].provider_; SearchProvider::ResultList results_copy; for (const SearchProvider::Result& result : results) { if (result.provider_ == first_provider) { results_copy << result; } } return first_provider->LoadTracks(results); } bool GlobalSearch::SetProviderEnabled(const SearchProvider* const_provider, bool enabled) { SearchProvider* provider = const_cast(const_provider); if (!providers_.contains(provider)) return true; if (providers_[provider].enabled_ != enabled) { // If we try to enable this provider but it is not logged in, don't change // state, and show configuration menu, if any if (enabled && !provider->IsLoggedIn()) { provider->ShowConfig(); return false; } else { providers_[provider].enabled_ = enabled; emit ProviderToggled(provider, enabled); SaveProvidersSettings(); return true; } } return true; } bool GlobalSearch::is_provider_enabled(const SearchProvider* const_provider) const { SearchProvider* provider = const_cast(const_provider); if (!providers_.contains(provider)) return false; return providers_[provider].enabled_; } bool GlobalSearch::is_provider_usable(SearchProvider* provider) const { return is_provider_enabled(provider) && provider->IsLoggedIn(); } void GlobalSearch::ReloadSettings() { QSettings s; s.beginGroup(kSettingsGroup); for (SearchProvider* provider : providers_.keys()) { QVariant value = s.value("enabled_" + provider->id()); if (!value.isValid()) continue; const bool enabled = value.toBool(); if (enabled != providers_[provider].enabled_) { providers_[provider].enabled_ = enabled; emit ProviderToggled(provider, enabled); } } } void GlobalSearch::SaveProvidersSettings() { QSettings s; s.beginGroup(kSettingsGroup); for (SearchProvider* provider : providers_.keys()) { s.setValue("enabled_" + provider->id(), providers_[provider].enabled_); } } QStringList GlobalSearch::GetSuggestions(int count) { QStringList ret; // Get count suggestions from each provider for (SearchProvider* provider : providers_.keys()) { if (is_provider_enabled(provider) && provider->can_give_suggestions()) { for (QString suggestion : provider->GetSuggestions(count)) { suggestion = suggestion.trimmed().toLower(); if (!suggestion.isEmpty()) { ret << suggestion; } } } } // Randomize the suggestions std::random_shuffle(ret.begin(), ret.end()); // Only return the first count while (ret.length() > count) { ret.removeLast(); } return ret; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/globalsearch.h000066400000000000000000000077161260417502300254160ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef GLOBALSEARCH_H #define GLOBALSEARCH_H #include #include #include "searchprovider.h" #include "covers/albumcoverloaderoptions.h" class AlbumCoverLoader; class Application; class UrlSearchProvider; class GlobalSearch : public QObject { Q_OBJECT public: GlobalSearch(Application* app, QObject* parent = nullptr); static const int kDelayedSearchTimeoutMs; static const char* kSettingsGroup; static const int kMaxResultsPerEmission; Application* application() const { return app_; } void AddProvider(SearchProvider* provider); // Try to change provider state. Returns false if we can't (e.g. we can't // enable a provider because it requires the user to be logged-in) bool SetProviderEnabled(const SearchProvider* provider, bool enabled); int SearchAsync(const QString& query); int LoadArtAsync(const SearchProvider::Result& result); MimeData* LoadTracks(const SearchProvider::ResultList& results); QStringList GetSuggestions(int count); void CancelSearch(int id); void CancelArt(int id); bool FindCachedPixmap(const SearchProvider::Result& result, QPixmap* pixmap) const; // "enabled" is the user preference. "usable" is enabled AND logged in. QList providers() const; bool is_provider_enabled(const SearchProvider* provider) const; bool is_provider_usable(SearchProvider* provider) const; public slots: void ReloadSettings(); signals: void ResultsAvailable(int id, const SearchProvider::ResultList& results); void ProviderSearchFinished(int id, const SearchProvider* provider); void SearchFinished(int id); void ArtLoaded(int id, const QPixmap& pixmap); void ProviderAdded(const SearchProvider* provider); void ProviderRemoved(const SearchProvider* provider); void ProviderToggled(const SearchProvider* provider, bool enabled); protected: void timerEvent(QTimerEvent* e); private slots: void ResultsAvailableSlot(int id, SearchProvider::ResultList results); void SearchFinishedSlot(int id); void ArtLoadedSlot(int id, const QImage& image); void AlbumArtLoaded(quint64 id, const QImage& image); void ProviderDestroyedSlot(QObject* object); private: void ConnectProvider(SearchProvider* provider); void HandleLoadedArt(int id, const QImage& image, SearchProvider* provider); void TakeNextQueuedArt(SearchProvider* provider); QString PixmapCacheKey(const SearchProvider::Result& result) const; void SaveProvidersSettings(); private: struct DelayedSearch { int id_; QString query_; QList providers_; }; struct QueuedArt { int id_; SearchProvider::Result result_; }; struct ProviderData { QList queued_art_; bool enabled_; }; Application* app_; QMap providers_; QMap delayed_searches_; int next_id_; QMap pending_search_providers_; QPixmapCache pixmap_cache_; QMap pending_art_searches_; // Used for providers with ArtIsInSongMetadata set. AlbumCoverLoaderOptions cover_loader_options_; QMap cover_loader_tasks_; // Special search provider that's used for queries that look like URLs UrlSearchProvider* url_provider_; }; #endif // GLOBALSEARCH_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/globalsearchitemdelegate.cpp000066400000000000000000000024401260417502300303100ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "globalsearchitemdelegate.h" #include "globalsearchview.h" GlobalSearchItemDelegate::GlobalSearchItemDelegate(GlobalSearchView* view) : LibraryItemDelegate(view), view_(view) {} void GlobalSearchItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { // Tell the view we painted this item so it can lazy load some art. const_cast(view_)->LazyLoadArt(index); LibraryItemDelegate::paint(painter, option, index); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/globalsearchitemdelegate.h000066400000000000000000000022341260417502300277560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef GLOBALSEARCHITEMDELEGATE_H #define GLOBALSEARCHITEMDELEGATE_H #include "library/libraryview.h" class GlobalSearchView; class GlobalSearchItemDelegate : public LibraryItemDelegate { public: GlobalSearchItemDelegate(GlobalSearchView* view); void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; private: GlobalSearchView* view_; }; #endif // GLOBALSEARCHITEMDELEGATE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/globalsearchmodel.cpp000066400000000000000000000246361260417502300267720ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "globalsearch.h" #include "globalsearchmodel.h" #include "core/mimedata.h" #include GlobalSearchModel::GlobalSearchModel(GlobalSearch* engine, QObject* parent) : QStandardItemModel(parent), engine_(engine), proxy_(nullptr), use_pretty_covers_(true), artist_icon_(":/icons/22x22/x-clementine-artist.png"), album_icon_(":/icons/22x22/x-clementine-album.png") { group_by_[0] = LibraryModel::GroupBy_Artist; group_by_[1] = LibraryModel::GroupBy_Album; group_by_[2] = LibraryModel::GroupBy_None; no_cover_icon_ = QPixmap(":nocover.png").scaled( LibraryModel::kPrettyCoverSize, LibraryModel::kPrettyCoverSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); } void GlobalSearchModel::AddResults(const SearchProvider::ResultList& results) { int sort_index = 0; // Create a divider for this provider if we haven't seen it before. SearchProvider* provider = results.first().provider_; if (!provider_sort_indices_.contains(provider)) { // Use the user's preferred order if one was set int configured_index = provider_order_.indexOf(provider->id()); if (configured_index != -1) { sort_index = configured_index; } else { sort_index = next_provider_sort_index_++; } QStandardItem* divider = new QStandardItem(provider->icon(), provider->name()); divider->setData(true, LibraryModel::Role_IsDivider); divider->setData(sort_index, Role_ProviderIndex); divider->setFlags(Qt::ItemIsEnabled); appendRow(divider); provider_sort_indices_[provider] = sort_index; } else { sort_index = provider_sort_indices_[provider]; } for (const SearchProvider::Result& result : results) { QStandardItem* parent = invisibleRootItem(); // Find (or create) the container nodes for this result if we can. if (result.group_automatically_) { ContainerKey key; key.provider_index_ = sort_index; parent = BuildContainers(result.metadata_, parent, &key); } // Create the item QStandardItem* item = new QStandardItem; item->setText(result.metadata_.TitleWithCompilationArtist()); item->setData(QVariant::fromValue(result), Role_Result); item->setData(sort_index, Role_ProviderIndex); parent->appendRow(item); } } QStandardItem* GlobalSearchModel::BuildContainers(const Song& s, QStandardItem* parent, ContainerKey* key, int level) { if (level >= 3) { return parent; } bool has_artist_icon = false; bool has_album_icon = false; QString display_text; QString sort_text; int unique_tag = -1; int year = 0; switch (group_by_[level]) { case LibraryModel::GroupBy_Artist: if (s.is_compilation()) { display_text = tr("Various artists"); sort_text = "aaaaaa"; } else { display_text = LibraryModel::TextOrUnknown(s.artist()); sort_text = LibraryModel::SortTextForArtist(s.artist()); } has_artist_icon = true; break; case LibraryModel::GroupBy_YearAlbum: year = qMax(0, s.year()); display_text = LibraryModel::PrettyYearAlbum(year, s.album()); sort_text = LibraryModel::SortTextForNumber(year) + s.album(); unique_tag = s.album_id(); has_album_icon = true; break; case LibraryModel::GroupBy_OriginalYearAlbum: year = qMax(0, s.effective_originalyear()); display_text = LibraryModel::PrettyYearAlbum(year, s.album()); sort_text = LibraryModel::SortTextForNumber(year) + s.album(); unique_tag = s.album_id(); has_album_icon = true; break; case LibraryModel::GroupBy_Year: year = qMax(0, s.year()); display_text = QString::number(year); sort_text = LibraryModel::SortTextForNumber(year) + " "; break; case LibraryModel::GroupBy_OriginalYear: year = qMax(0, s.effective_originalyear()); display_text = QString::number(year); sort_text = LibraryModel::SortTextForNumber(year) + " "; break; case LibraryModel::GroupBy_Composer: display_text = s.composer(); case LibraryModel::GroupBy_Performer: display_text = s.performer(); case LibraryModel::GroupBy_Disc: display_text = s.disc(); case LibraryModel::GroupBy_Grouping: display_text = s.grouping(); case LibraryModel::GroupBy_Genre: if (display_text.isNull()) display_text = s.genre(); case LibraryModel::GroupBy_Album: unique_tag = s.album_id(); if (display_text.isNull()) { display_text = s.album(); } // fallthrough case LibraryModel::GroupBy_AlbumArtist: if (display_text.isNull()) display_text = s.effective_albumartist(); display_text = LibraryModel::TextOrUnknown(display_text); sort_text = LibraryModel::SortTextForArtist(display_text); has_album_icon = true; break; case LibraryModel::GroupBy_FileType: display_text = s.TextForFiletype(); sort_text = display_text; break; case LibraryModel::GroupBy_Bitrate: display_text = QString(s.bitrate(), 1); sort_text = display_text; break; case LibraryModel::GroupBy_None: return parent; } // Find a container for this level key->group_[level] = display_text + QString::number(unique_tag); QStandardItem* container = containers_[*key]; if (!container) { container = new QStandardItem(display_text); container->setData(key->provider_index_, Role_ProviderIndex); container->setData(sort_text, LibraryModel::Role_SortText); container->setData(group_by_[level], LibraryModel::Role_ContainerType); if (has_artist_icon) { container->setIcon(artist_icon_); } else if (has_album_icon) { if (use_pretty_covers_) { container->setData(no_cover_icon_, Qt::DecorationRole); } else { container->setIcon(album_icon_); } } parent->appendRow(container); containers_[*key] = container; } // Create the container for the next level. return BuildContainers(s, container, key, level + 1); } void GlobalSearchModel::Clear() { provider_sort_indices_.clear(); containers_.clear(); next_provider_sort_index_ = 1000; clear(); } SearchProvider::ResultList GlobalSearchModel::GetChildResults( const QModelIndexList& indexes) const { QList items; for (const QModelIndex& index : indexes) { items << itemFromIndex(index); } return GetChildResults(items); } SearchProvider::ResultList GlobalSearchModel::GetChildResults( const QList& items) const { SearchProvider::ResultList results; QSet visited; for (QStandardItem* item : items) { GetChildResults(item, &results, &visited); } return results; } void GlobalSearchModel::GetChildResults( const QStandardItem* item, SearchProvider::ResultList* results, QSet* visited) const { if (visited->contains(item)) { return; } visited->insert(item); // Does this item have children? if (item->rowCount()) { const QModelIndex parent_proxy_index = proxy_->mapFromSource(item->index()); // Yes - visit all the children, but do so through the proxy so we get them // in the right order. for (int i = 0; i < item->rowCount(); ++i) { const QModelIndex proxy_index = parent_proxy_index.child(i, 0); const QModelIndex index = proxy_->mapToSource(proxy_index); GetChildResults(itemFromIndex(index), results, visited); } } else { // No - maybe it's a song, add its result if valid QVariant result = item->data(Role_Result); if (result.isValid()) { results->append(result.value()); } else { // Maybe it's a provider then? bool is_provider; const int sort_index = item->data(Role_ProviderIndex).toInt(&is_provider); if (is_provider) { // Go through all the items (through the proxy to keep them ordered) and // add the ones belonging to this provider to our list for (int i = 0; i < proxy_->rowCount(invisibleRootItem()->index()); ++i) { QModelIndex child_index = proxy_->index(i, 0, invisibleRootItem()->index()); const QStandardItem* child_item = itemFromIndex(proxy_->mapToSource(child_index)); if (child_item->data(Role_ProviderIndex).toInt() == sort_index) { GetChildResults(child_item, results, visited); } } } } } } QMimeData* GlobalSearchModel::mimeData(const QModelIndexList& indexes) const { return engine_->LoadTracks(GetChildResults(indexes)); } namespace { void GatherResults(const QStandardItem* parent, QMap* results) { QVariant result_variant = parent->data(GlobalSearchModel::Role_Result); if (result_variant.isValid()) { SearchProvider::Result result = result_variant.value(); (*results)[result.provider_].append(result); } for (int i = 0; i < parent->rowCount(); ++i) { GatherResults(parent->child(i), results); } } } void GlobalSearchModel::SetGroupBy(const LibraryModel::Grouping& grouping, bool regroup_now) { const LibraryModel::Grouping old_group_by = group_by_; group_by_ = grouping; if (regroup_now && group_by_ != old_group_by) { // Walk the tree gathering the results we have already QMap results; GatherResults(invisibleRootItem(), &results); // Reset the model and re-add all the results using the new grouping. Clear(); for (const SearchProvider::ResultList& result_list : results) { AddResults(result_list); } } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/globalsearchmodel.h000066400000000000000000000063201260417502300264250ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef GLOBALSEARCHMODEL_H #define GLOBALSEARCHMODEL_H #include "searchprovider.h" #include "library/librarymodel.h" #include class GlobalSearch; class QSortFilterProxyModel; class GlobalSearchModel : public QStandardItemModel { Q_OBJECT public: GlobalSearchModel(GlobalSearch* engine, QObject* parent = nullptr); enum Role { Role_Result = LibraryModel::LastRole, Role_LazyLoadingArt, Role_ProviderIndex, LastRole }; struct ContainerKey { int provider_index_; QString group_[3]; }; void set_proxy(QSortFilterProxyModel* proxy) { proxy_ = proxy; } void set_use_pretty_covers(bool pretty) { use_pretty_covers_ = pretty; } void set_provider_order(const QStringList& provider_order) { provider_order_ = provider_order; } void SetGroupBy(const LibraryModel::Grouping& grouping, bool regroup_now); void Clear(); SearchProvider::ResultList GetChildResults(const QModelIndexList& indexes) const; SearchProvider::ResultList GetChildResults(const QList& items) const; // QAbstractItemModel QMimeData* mimeData(const QModelIndexList& indexes) const; public slots: void AddResults(const SearchProvider::ResultList& results); private: QStandardItem* BuildContainers(const Song& metadata, QStandardItem* parent, ContainerKey* key, int level = 0); void GetChildResults(const QStandardItem* item, SearchProvider::ResultList* results, QSet* visited) const; private: GlobalSearch* engine_; QSortFilterProxyModel* proxy_; LibraryModel::Grouping group_by_; QMap provider_sort_indices_; int next_provider_sort_index_; QMap containers_; QStringList provider_order_; bool use_pretty_covers_; QIcon artist_icon_; QIcon album_icon_; QPixmap no_cover_icon_; }; inline uint qHash(const GlobalSearchModel::ContainerKey& key) { return qHash(key.provider_index_) ^ qHash(key.group_[0]) ^ qHash(key.group_[1]) ^ qHash(key.group_[2]); } inline bool operator<(const GlobalSearchModel::ContainerKey& left, const GlobalSearchModel::ContainerKey& right) { #define CMP(field) \ if (left.field < right.field) return true; \ if (left.field > right.field) return false CMP(provider_index_); CMP(group_[0]); CMP(group_[1]); CMP(group_[2]); return false; #undef CMP } #endif // GLOBALSEARCHMODEL_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/globalsearchsettingspage.cpp000066400000000000000000000153501260417502300303600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "globalsearch.h" #include "globalsearchsettingspage.h" #include "core/logging.h" #include "ui/iconloader.h" #include "ui/settingsdialog.h" #include "ui_globalsearchsettingspage.h" #include GlobalSearchSettingsPage::GlobalSearchSettingsPage(SettingsDialog* dialog) : SettingsPage(dialog), ui_(new Ui::GlobalSearchSettingsPage) { ui_->setupUi(this); ui_->sources->header()->setResizeMode(0, QHeaderView::Stretch); ui_->sources->header()->setResizeMode(1, QHeaderView::ResizeToContents); warning_icon_ = IconLoader::Load("dialog-warning"); connect(ui_->up, SIGNAL(clicked()), SLOT(MoveUp())); connect(ui_->down, SIGNAL(clicked()), SLOT(MoveDown())); connect(ui_->configure, SIGNAL(clicked()), SLOT(ConfigureProvider())); connect(ui_->sources, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), SLOT(CurrentProviderChanged(QTreeWidgetItem*))); } GlobalSearchSettingsPage::~GlobalSearchSettingsPage() {} static bool CompareProviderId(SearchProvider* left, SearchProvider* right) { return left->id() < right->id(); } void GlobalSearchSettingsPage::Load() { QSettings s; s.beginGroup(GlobalSearch::kSettingsGroup); GlobalSearch* engine = dialog()->global_search(); QList providers = engine->providers(); // Sort the list of providers alphabetically (by id) initially, so any that // aren't in the provider_order list will take this order. qSort(providers.begin(), providers.end(), CompareProviderId); // Add the ones in the configured list first ui_->sources->clear(); for (const QString& id : s.value("provider_order", QStringList() << "library").toStringList()) { // Find a matching provider for this id for (QList::iterator it = providers.begin(); it != providers.end(); ++it) { if ((*it)->id() == id) { AddProviderItem(engine, *it); providers.erase(it); break; } } } // Now add any others that are remaining for (SearchProvider* provider : providers) { AddProviderItem(engine, provider); } ui_->show_providers->setChecked(s.value("show_providers", true).toBool()); ui_->show_suggestions->setChecked(s.value("show_suggestions", true).toBool()); } void GlobalSearchSettingsPage::AddProviderItem(GlobalSearch* engine, SearchProvider* provider) { QTreeWidgetItem* item = new QTreeWidgetItem; item->setText(0, provider->name()); item->setIcon(0, provider->icon()); item->setData(0, Qt::UserRole, QVariant::fromValue(provider)); UpdateLoggedInState(engine, item, true); ui_->sources->invisibleRootItem()->addChild(item); } void GlobalSearchSettingsPage::UpdateLoggedInState(GlobalSearch* engine, QTreeWidgetItem* item, bool set_checked_state) { SearchProvider* provider = item->data(0, Qt::UserRole).value(); const bool enabled = engine->is_provider_enabled(provider); const bool logged_in = provider->IsLoggedIn(); Qt::CheckState check_state = logged_in && enabled ? Qt::Checked : Qt::Unchecked; Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable; if (logged_in) flags |= Qt::ItemIsUserCheckable; if (set_checked_state) item->setData(0, Qt::CheckStateRole, check_state); item->setFlags(flags); if (logged_in) { item->setIcon(1, QIcon()); item->setText(1, QString()); } else { item->setIcon(1, warning_icon_); item->setText(1, tr("Not logged in") + " "); } } void GlobalSearchSettingsPage::Save() { QSettings s; s.beginGroup(GlobalSearch::kSettingsGroup); QStringList provider_order; for (int i = 0; i < ui_->sources->invisibleRootItem()->childCount(); ++i) { const QTreeWidgetItem* item = ui_->sources->invisibleRootItem()->child(i); const SearchProvider* provider = item->data(0, Qt::UserRole).value(); provider_order << provider->id(); // Only save the enabled state for this provider if it's logged in. if (item->flags() & Qt::ItemIsUserCheckable) { s.setValue("enabled_" + provider->id(), item->data(0, Qt::CheckStateRole).toInt() == Qt::Checked); } } s.setValue("provider_order", provider_order); s.setValue("show_providers", ui_->show_providers->isChecked()); s.setValue("show_suggestions", ui_->show_suggestions->isChecked()); } void GlobalSearchSettingsPage::MoveUp() { MoveCurrentItem(-1); } void GlobalSearchSettingsPage::MoveDown() { MoveCurrentItem(+1); } void GlobalSearchSettingsPage::MoveCurrentItem(int d) { QTreeWidgetItem* item = ui_->sources->currentItem(); if (!item) return; QTreeWidgetItem* root = ui_->sources->invisibleRootItem(); const int row = root->indexOfChild(item); const int new_row = qBound(0, row + d, root->childCount()); if (row == new_row) return; root->removeChild(item); root->insertChild(new_row, item); ui_->sources->setCurrentItem(item); } void GlobalSearchSettingsPage::ConfigureProvider() { QTreeWidgetItem* item = ui_->sources->currentItem(); if (!item) return; SearchProvider* provider = item->data(0, Qt::UserRole).value(); provider->ShowConfig(); } void GlobalSearchSettingsPage::CurrentProviderChanged(QTreeWidgetItem* item) { if (!item) return; QTreeWidgetItem* root = ui_->sources->invisibleRootItem(); SearchProvider* provider = item->data(0, Qt::UserRole).value(); const int row = root->indexOfChild(item); ui_->up->setEnabled(row != 0); ui_->down->setEnabled(row != root->childCount() - 1); ui_->configure->setEnabled(provider->can_show_config()); } void GlobalSearchSettingsPage::showEvent(QShowEvent* e) { QWidget::showEvent(e); // Update the logged-in state of each item when we come back to this page in // the dialog. for (int i = 0; i < ui_->sources->invisibleRootItem()->childCount(); ++i) { UpdateLoggedInState(dialog()->global_search(), ui_->sources->invisibleRootItem()->child(i), false); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/globalsearchsettingspage.h000066400000000000000000000032651260417502300300270ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef GLOBALSEARCHSETTINGSPAGE_H #define GLOBALSEARCHSETTINGSPAGE_H #include "ui/settingspage.h" #include #include class GlobalSearch; class SearchProvider; class Ui_GlobalSearchSettingsPage; class QTreeWidgetItem; class GlobalSearchSettingsPage : public SettingsPage { Q_OBJECT public: GlobalSearchSettingsPage(SettingsDialog* dialog); ~GlobalSearchSettingsPage(); void Load(); void Save(); protected: void showEvent(QShowEvent* e); private slots: void MoveUp(); void MoveDown(); void ConfigureProvider(); void CurrentProviderChanged(QTreeWidgetItem* item); private: void AddProviderItem(GlobalSearch* engine, SearchProvider* provider); void UpdateLoggedInState(GlobalSearch* engine, QTreeWidgetItem* item, bool set_checked_state); void MoveCurrentItem(int d); private: QScopedPointer ui_; QIcon warning_icon_; }; #endif // GLOBALSEARCHSETTINGSPAGE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/globalsearchsettingspage.ui000066400000000000000000000104001260417502300302020ustar00rootroot00000000000000 GlobalSearchSettingsPage 0 0 654 506 Search :/icons/32x32/search.png:/icons/32x32/search.png Sources Enable sources below to include them in search results. Results will be displayed in this order. true Qt::ScrollBarAlwaysOff false 2 false false 1 2 Move up Move down Configure... Qt::Vertical 20 40 When the list is empty... Show which sources are enabled and disabled Show search suggestions sources up down configure show_providers show_suggestions clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/globalsearchsortmodel.cpp000066400000000000000000000062501260417502300276720ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "globalsearchmodel.h" #include "globalsearchsortmodel.h" #include "searchprovider.h" #include "core/logging.h" GlobalSearchSortModel::GlobalSearchSortModel(QObject* parent) : QSortFilterProxyModel(parent) {} bool GlobalSearchSortModel::lessThan(const QModelIndex& left, const QModelIndex& right) const { // Compare the provider sort index first. const int index_left = left.data(GlobalSearchModel::Role_ProviderIndex).toInt(); const int index_right = right.data(GlobalSearchModel::Role_ProviderIndex).toInt(); if (index_left < index_right) return true; if (index_left > index_right) return false; // Dividers always go first if (left.data(LibraryModel::Role_IsDivider).toBool()) return true; if (right.data(LibraryModel::Role_IsDivider).toBool()) return false; // Containers go before songs if they're at the same level const bool left_is_container = left.data(LibraryModel::Role_ContainerType).isValid(); const bool right_is_container = right.data(LibraryModel::Role_ContainerType).isValid(); if (left_is_container && !right_is_container) return true; if (right_is_container && !left_is_container) return false; // Containers get sorted on their sort text. if (left_is_container) { return QString::localeAwareCompare( left.data(LibraryModel::Role_SortText).toString(), right.data(LibraryModel::Role_SortText).toString()) < 0; } // Otherwise we're comparing songs. Sort by disc, track, then title. const SearchProvider::Result r1 = left.data(GlobalSearchModel::Role_Result).value(); const SearchProvider::Result r2 = right.data(GlobalSearchModel::Role_Result) .value(); #define CompareInt(field) \ if (r1.metadata_.field() < r2.metadata_.field()) return true; \ if (r1.metadata_.field() > r2.metadata_.field()) return false int ret = 0; #define CompareString(field) \ ret = \ QString::localeAwareCompare(r1.metadata_.field(), r2.metadata_.field()); \ if (ret < 0) return true; \ if (ret > 0) return false CompareInt(disc); CompareInt(track); CompareString(title); return false; #undef CompareInt #undef CompareString } clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/globalsearchsortmodel.h000066400000000000000000000020671260417502300273410ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef GLOBALSEARCHSORTMODEL_H #define GLOBALSEARCHSORTMODEL_H #include class GlobalSearchSortModel : public QSortFilterProxyModel { public: GlobalSearchSortModel(QObject* parent = nullptr); protected: bool lessThan(const QModelIndex& left, const QModelIndex& right) const; }; #endif // GLOBALSEARCHSORTMODEL_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/globalsearchview.cpp000066400000000000000000000455441260417502300266450ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "globalsearchview.h" #include #include #include #include #include #include "globalsearch.h" #include "globalsearchitemdelegate.h" #include "globalsearchmodel.h" #include "globalsearchsortmodel.h" #include "searchprovider.h" #include "searchproviderstatuswidget.h" #include "suggestionwidget.h" #include "ui_globalsearchview.h" #include "core/application.h" #include "core/logging.h" #include "core/mimedata.h" #include "core/timeconstants.h" #include "library/libraryfilterwidget.h" #include "library/librarymodel.h" #include "library/groupbydialog.h" using std::placeholders::_1; using std::placeholders::_2; const int GlobalSearchView::kSwapModelsTimeoutMsec = 250; const int GlobalSearchView::kMaxSuggestions = 10; const int GlobalSearchView::kUpdateSuggestionsTimeoutMsec = 60 * kMsecPerSec; GlobalSearchView::GlobalSearchView(Application* app, QWidget* parent) : QWidget(parent), app_(app), engine_(app_->global_search()), ui_(new Ui_GlobalSearchView), context_menu_(nullptr), last_search_id_(0), front_model_(new GlobalSearchModel(engine_, this)), back_model_(new GlobalSearchModel(engine_, this)), current_model_(front_model_), front_proxy_(new GlobalSearchSortModel(this)), back_proxy_(new GlobalSearchSortModel(this)), current_proxy_(front_proxy_), swap_models_timer_(new QTimer(this)), update_suggestions_timer_(new QTimer(this)), search_icon_(IconLoader::Load("search")), warning_icon_(IconLoader::Load("dialog-warning")), show_providers_(true), show_suggestions_(true) { ui_->setupUi(this); front_model_->set_proxy(front_proxy_); back_model_->set_proxy(back_proxy_); ui_->search->installEventFilter(this); ui_->results_stack->installEventFilter(this); ui_->settings->setIcon(IconLoader::Load("configure")); // Must be a queued connection to ensure the GlobalSearch handles it first. connect(app_, SIGNAL(SettingsChanged()), SLOT(ReloadSettings()), Qt::QueuedConnection); connect(ui_->search, SIGNAL(textChanged(QString)), SLOT(TextEdited(QString))); connect(ui_->results, SIGNAL(AddToPlaylistSignal(QMimeData*)), SIGNAL(AddToPlaylist(QMimeData*))); connect(ui_->results, SIGNAL(FocusOnFilterSignal(QKeyEvent*)), SLOT(FocusOnFilter(QKeyEvent*))); // Set the appearance of the results list ui_->results->setItemDelegate(new GlobalSearchItemDelegate(this)); ui_->results->setAttribute(Qt::WA_MacShowFocusRect, false); ui_->results->setStyleSheet("QTreeView::item{padding-top:1px;}"); // Show the help page initially ui_->results_stack->setCurrentWidget(ui_->help_page); ui_->help_frame->setBackgroundRole(QPalette::Base); QVBoxLayout* enabled_layout = new QVBoxLayout(ui_->enabled_list); QVBoxLayout* disabled_layout = new QVBoxLayout(ui_->disabled_list); QVBoxLayout* suggestions_layout = new QVBoxLayout(ui_->suggestions_list); enabled_layout->setContentsMargins(16, 0, 16, 6); disabled_layout->setContentsMargins(16, 0, 16, 32); suggestions_layout->setContentsMargins(16, 0, 16, 6); // Set the colour of the help text to the disabled window text colour QPalette help_palette = ui_->help_text->palette(); const QColor help_color = help_palette.color(QPalette::Disabled, QPalette::WindowText); help_palette.setColor(QPalette::Normal, QPalette::WindowText, help_color); help_palette.setColor(QPalette::Inactive, QPalette::WindowText, help_color); ui_->help_text->setPalette(help_palette); // Create suggestion widgets for (int i = 0; i < kMaxSuggestions; ++i) { SuggestionWidget* widget = new SuggestionWidget(search_icon_); connect(widget, SIGNAL(SuggestionClicked(QString)), SLOT(StartSearch(QString))); suggestions_layout->addWidget(widget); suggestion_widgets_ << widget; } // Make it bold QFont help_font = ui_->help_text->font(); help_font.setBold(true); ui_->help_text->setFont(help_font); // Set up the sorting proxy model front_proxy_->setSourceModel(front_model_); front_proxy_->setDynamicSortFilter(true); front_proxy_->sort(0); back_proxy_->setSourceModel(back_model_); back_proxy_->setDynamicSortFilter(true); back_proxy_->sort(0); swap_models_timer_->setSingleShot(true); swap_models_timer_->setInterval(kSwapModelsTimeoutMsec); connect(swap_models_timer_, SIGNAL(timeout()), SLOT(SwapModels())); update_suggestions_timer_->setInterval(kUpdateSuggestionsTimeoutMsec); connect(update_suggestions_timer_, SIGNAL(timeout()), SLOT(UpdateSuggestions())); // Add actions to the settings menu group_by_actions_ = LibraryFilterWidget::CreateGroupByActions(this); QMenu* settings_menu = new QMenu(this); settings_menu->addActions(group_by_actions_->actions()); settings_menu->addSeparator(); settings_menu->addAction(IconLoader::Load("configure"), tr("Configure global search..."), this, SLOT(OpenSettingsDialog())); ui_->settings->setMenu(settings_menu); connect(group_by_actions_, SIGNAL(triggered(QAction*)), SLOT(GroupByClicked(QAction*))); // These have to be queued connections because they may get emitted before // our call to Search() (or whatever) returns and we add the ID to the map. connect(engine_, SIGNAL(ResultsAvailable(int, SearchProvider::ResultList)), SLOT(AddResults(int, SearchProvider::ResultList)), Qt::QueuedConnection); connect(engine_, SIGNAL(ArtLoaded(int, QPixmap)), SLOT(ArtLoaded(int, QPixmap)), Qt::QueuedConnection); } GlobalSearchView::~GlobalSearchView() { delete ui_; } namespace { bool CompareProvider(const QStringList& provider_order, SearchProvider* left, SearchProvider* right) { const int left_index = provider_order.indexOf(left->id()); const int right_index = provider_order.indexOf(right->id()); if (left_index == -1 && right_index == -1) { // None are in our provider list: compare name instead return left->name() < right->name(); } else if (left_index == -1) { // Left provider not in provider list return false; } else if (right_index == -1) { // Right provider not in provider list return true; } return left_index < right_index; } } void GlobalSearchView::ReloadSettings() { const bool old_show_suggestions = show_suggestions_; QSettings s; // Library settings s.beginGroup(LibraryView::kSettingsGroup); const bool pretty = s.value("pretty_covers", true).toBool(); front_model_->set_use_pretty_covers(pretty); back_model_->set_use_pretty_covers(pretty); s.endGroup(); // Global search settings s.beginGroup(GlobalSearch::kSettingsGroup); const QStringList provider_order = s.value("provider_order", QStringList() << "library").toStringList(); front_model_->set_provider_order(provider_order); back_model_->set_provider_order(provider_order); show_providers_ = s.value("show_providers", true).toBool(); show_suggestions_ = s.value("show_suggestions", true).toBool(); SetGroupBy(LibraryModel::Grouping( LibraryModel::GroupBy( s.value("group_by1", int(LibraryModel::GroupBy_Artist)).toInt()), LibraryModel::GroupBy( s.value("group_by2", int(LibraryModel::GroupBy_Album)).toInt()), LibraryModel::GroupBy( s.value("group_by3", int(LibraryModel::GroupBy_None)).toInt()))); s.endGroup(); // Delete any old status widgets qDeleteAll(provider_status_widgets_); provider_status_widgets_.clear(); // Toggle visibility of the providers group ui_->providers_group->setVisible(show_providers_); if (show_providers_) { // Sort the list of providers QList providers = engine_->providers(); qSort(providers.begin(), providers.end(), std::bind(&CompareProvider, std::cref(provider_order), _1, _2)); bool any_disabled = false; for (SearchProvider* provider : providers) { QWidget* parent = ui_->enabled_list; if (!engine_->is_provider_usable(provider)) { parent = ui_->disabled_list; any_disabled = true; } SearchProviderStatusWidget* widget = new SearchProviderStatusWidget(warning_icon_, engine_, provider); parent->layout()->addWidget(widget); provider_status_widgets_ << widget; } ui_->disabled_label->setVisible(any_disabled); } ui_->suggestions_group->setVisible(show_suggestions_); if (!show_suggestions_) { update_suggestions_timer_->stop(); } if (!old_show_suggestions && show_suggestions_) { UpdateSuggestions(); } } void GlobalSearchView::UpdateSuggestions() { const QStringList suggestions = engine_->GetSuggestions(kMaxSuggestions); for (int i = 0; i < suggestions.count(); ++i) { suggestion_widgets_[i]->SetText(suggestions[i]); suggestion_widgets_[i]->show(); } for (int i = suggestions.count(); i < kMaxSuggestions; ++i) { suggestion_widgets_[i]->hide(); } } void GlobalSearchView::StartSearch(const QString& query) { ui_->search->setText(query); TextEdited(query); // Swap models immediately swap_models_timer_->stop(); SwapModels(); } void GlobalSearchView::TextEdited(const QString& text) { const QString trimmed(text.trimmed()); // Add results to the back model, switch models after some delay. back_model_->Clear(); current_model_ = back_model_; current_proxy_ = back_proxy_; swap_models_timer_->start(); // Cancel the last search (if any) and start the new one. engine_->CancelSearch(last_search_id_); // If text query is empty, don't start a new search if (trimmed.isEmpty()) { last_search_id_ = -1; } else { last_search_id_ = engine_->SearchAsync(trimmed); } } void GlobalSearchView::AddResults(int id, const SearchProvider::ResultList& results) { if (id != last_search_id_ || results.isEmpty()) return; current_model_->AddResults(results); } void GlobalSearchView::SwapModels() { art_requests_.clear(); qSwap(front_model_, back_model_); qSwap(front_proxy_, back_proxy_); ui_->results->setModel(front_proxy_); if (ui_->search->text().trimmed().isEmpty()) { ui_->results_stack->setCurrentWidget(ui_->help_page); } else { ui_->results_stack->setCurrentWidget(ui_->results_page); } } void GlobalSearchView::LazyLoadArt(const QModelIndex& proxy_index) { if (!proxy_index.isValid() || proxy_index.model() != front_proxy_) { return; } // Already loading art for this item? if (proxy_index.data(GlobalSearchModel::Role_LazyLoadingArt).isValid()) { return; } // Should we even load art at all? if (!app_->library_model()->use_pretty_covers()) { return; } // Is this an album? const LibraryModel::GroupBy container_type = LibraryModel::GroupBy( proxy_index.data(LibraryModel::Role_ContainerType).toInt()); if (container_type != LibraryModel::GroupBy_Album && container_type != LibraryModel::GroupBy_AlbumArtist && container_type != LibraryModel::GroupBy_YearAlbum && container_type != LibraryModel::GroupBy_OriginalYearAlbum) { return; } // Mark the item as loading art const QModelIndex source_index = front_proxy_->mapToSource(proxy_index); QStandardItem* item = front_model_->itemFromIndex(source_index); item->setData(true, GlobalSearchModel::Role_LazyLoadingArt); // Walk down the item's children until we find a track while (item->rowCount()) { item = item->child(0); } // Get the track's Result const SearchProvider::Result result = item->data(GlobalSearchModel::Role_Result) .value(); // Load the art. int id = engine_->LoadArtAsync(result); art_requests_[id] = source_index; } void GlobalSearchView::ArtLoaded(int id, const QPixmap& pixmap) { if (!art_requests_.contains(id)) return; QModelIndex index = art_requests_.take(id); if (!pixmap.isNull()) { front_model_->itemFromIndex(index)->setData(pixmap, Qt::DecorationRole); } } MimeData* GlobalSearchView::SelectedMimeData() { if (!ui_->results->selectionModel()) return nullptr; // Get all selected model indexes QModelIndexList indexes = ui_->results->selectionModel()->selectedRows(); if (indexes.isEmpty()) { // There's nothing selected - take the first thing in the model that isn't // a divider. for (int i = 0; i < front_proxy_->rowCount(); ++i) { QModelIndex index = front_proxy_->index(i, 0); if (!index.data(LibraryModel::Role_IsDivider).toBool()) { indexes << index; ui_->results->setCurrentIndex(index); break; } } } // Still got nothing? Give up. if (indexes.isEmpty()) { return nullptr; } // Get items for these indexes QList items; for (const QModelIndex& index : indexes) { items << (front_model_->itemFromIndex(front_proxy_->mapToSource(index))); } // Get a MimeData for these items return engine_->LoadTracks(front_model_->GetChildResults(items)); } bool GlobalSearchView::eventFilter(QObject* object, QEvent* event) { if (object == ui_->search && event->type() == QEvent::KeyRelease) { if (SearchKeyEvent(static_cast(event))) { return true; } } else if (object == ui_->results_stack && event->type() == QEvent::ContextMenu) { if (ResultsContextMenuEvent(static_cast(event))) { return true; } } return QWidget::eventFilter(object, event); } bool GlobalSearchView::SearchKeyEvent(QKeyEvent* event) { switch (event->key()) { case Qt::Key_Up: ui_->results->UpAndFocus(); break; case Qt::Key_Down: ui_->results->DownAndFocus(); break; case Qt::Key_Escape: ui_->search->clear(); break; case Qt::Key_Return: AddSelectedToPlaylist(); break; default: return false; } event->accept(); return true; } bool GlobalSearchView::ResultsContextMenuEvent(QContextMenuEvent* event) { if (!context_menu_) { context_menu_ = new QMenu(this); context_actions_ << context_menu_->addAction( IconLoader::Load("media-playback-start"), tr("Append to current playlist"), this, SLOT(AddSelectedToPlaylist())); context_actions_ << context_menu_->addAction( IconLoader::Load("media-playback-start"), tr("Replace current playlist"), this, SLOT(LoadSelected())); context_actions_ << context_menu_->addAction( IconLoader::Load("document-new"), tr("Open in new playlist"), this, SLOT(OpenSelectedInNewPlaylist())); context_menu_->addSeparator(); context_actions_ << context_menu_->addAction( IconLoader::Load("go-next"), tr("Queue track"), this, SLOT(AddSelectedToPlaylistEnqueue())); context_menu_->addSeparator(); context_menu_->addMenu(tr("Group by")) ->addActions(group_by_actions_->actions()); context_menu_->addAction(IconLoader::Load("configure"), tr("Configure global search..."), this, SLOT(OpenSettingsDialog())); } const bool enable_context_actions = ui_->results->selectionModel() && ui_->results->selectionModel()->hasSelection(); for (QAction* action : context_actions_) { action->setEnabled(enable_context_actions); } context_menu_->popup(event->globalPos()); return true; } void GlobalSearchView::AddSelectedToPlaylist() { emit AddToPlaylist(SelectedMimeData()); } void GlobalSearchView::LoadSelected() { MimeData* data = SelectedMimeData(); if (!data) return; data->clear_first_ = true; emit AddToPlaylist(data); } void GlobalSearchView::AddSelectedToPlaylistEnqueue() { MimeData* data = SelectedMimeData(); if (!data) return; data->enqueue_now_ = true; emit AddToPlaylist(data); } void GlobalSearchView::OpenSelectedInNewPlaylist() { MimeData* data = SelectedMimeData(); if (!data) return; data->open_in_new_playlist_ = true; emit AddToPlaylist(data); } void GlobalSearchView::showEvent(QShowEvent* e) { if (show_suggestions_) { UpdateSuggestions(); update_suggestions_timer_->start(); } QWidget::showEvent(e); FocusSearchField(); } void GlobalSearchView::FocusSearchField() { ui_->search->setFocus(); ui_->search->selectAll(); } void GlobalSearchView::hideEvent(QHideEvent* e) { update_suggestions_timer_->stop(); QWidget::hideEvent(e); } void GlobalSearchView::FocusOnFilter(QKeyEvent* event) { ui_->search->setFocus(); QApplication::sendEvent(ui_->search, event); } void GlobalSearchView::OpenSettingsDialog() { app_->OpenSettingsDialogAtPage(SettingsDialog::Page_GlobalSearch); } void GlobalSearchView::GroupByClicked(QAction* action) { if (action->property("group_by").isNull()) { if (!group_by_dialog_) { group_by_dialog_.reset(new GroupByDialog); connect(group_by_dialog_.data(), SIGNAL(Accepted(LibraryModel::Grouping)), SLOT(SetGroupBy(LibraryModel::Grouping))); } group_by_dialog_->show(); return; } SetGroupBy(action->property("group_by").value()); } void GlobalSearchView::SetGroupBy(const LibraryModel::Grouping& g) { // Clear requests: changing "group by" on the models will cause all the items to be removed/added // again, so all the QModelIndex here will become invalid. New requests will be created for those // songs when they will be displayed again anyway (when GlobalSearchItemDelegate::paint will call // LazyLoadArt) art_requests_.clear(); // Update the models front_model_->SetGroupBy(g, true); back_model_->SetGroupBy(g, false); // Save the setting QSettings s; s.beginGroup(GlobalSearch::kSettingsGroup); s.setValue("group_by1", int(g.first)); s.setValue("group_by2", int(g.second)); s.setValue("group_by3", int(g.third)); // Make sure the correct action is checked. for (QAction* action : group_by_actions_->actions()) { if (action->property("group_by").isNull()) continue; if (g == action->property("group_by").value()) { action->setChecked(true); return; } } // Check the advanced action group_by_actions_->actions().last()->setChecked(true); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/globalsearchview.h000066400000000000000000000070361260417502300263040ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef GLOBALSEARCHVIEW_H #define GLOBALSEARCHVIEW_H #include "searchprovider.h" #include "library/librarymodel.h" #include "ui/settingsdialog.h" #include class Application; class GlobalSearchModel; class GroupByDialog; class SearchProviderStatusWidget; class SuggestionWidget; class Ui_GlobalSearchView; class QActionGroup; class QMimeData; class QSortFilterProxyModel; class QStandardItem; class QStandardItemModel; class GlobalSearchView : public QWidget { Q_OBJECT public: GlobalSearchView(Application* app, QWidget* parent = nullptr); ~GlobalSearchView(); static const int kSwapModelsTimeoutMsec; static const int kMaxSuggestions; static const int kUpdateSuggestionsTimeoutMsec; // Called by the delegate void LazyLoadArt(const QModelIndex& index); // QWidget void showEvent(QShowEvent* e); void hideEvent(QHideEvent* e); // QObject bool eventFilter(QObject* object, QEvent* event); public slots: void ReloadSettings(); void StartSearch(const QString& query); void FocusSearchField(); void OpenSettingsDialog(); signals: void AddToPlaylist(QMimeData* data); private slots: void UpdateSuggestions(); void SwapModels(); void TextEdited(const QString& text); void AddResults(int id, const SearchProvider::ResultList& results); void ArtLoaded(int id, const QPixmap& pixmap); void FocusOnFilter(QKeyEvent* event); void AddSelectedToPlaylist(); void LoadSelected(); void OpenSelectedInNewPlaylist(); void AddSelectedToPlaylistEnqueue(); void GroupByClicked(QAction* action); void SetGroupBy(const LibraryModel::Grouping& grouping); private: MimeData* SelectedMimeData(); bool SearchKeyEvent(QKeyEvent* event); bool ResultsContextMenuEvent(QContextMenuEvent* event); private: Application* app_; GlobalSearch* engine_; Ui_GlobalSearchView* ui_; QScopedPointer group_by_dialog_; QMenu* context_menu_; QList context_actions_; QActionGroup* group_by_actions_; int last_search_id_; // Like graphics APIs have a front buffer and a back buffer, there's a front // model and a back model - the front model is the one that's shown in the // UI and the back model is the one that lies in wait. current_model_ will // point to either the front or the back model. GlobalSearchModel* front_model_; GlobalSearchModel* back_model_; GlobalSearchModel* current_model_; QSortFilterProxyModel* front_proxy_; QSortFilterProxyModel* back_proxy_; QSortFilterProxyModel* current_proxy_; QMap art_requests_; QTimer* swap_models_timer_; QTimer* update_suggestions_timer_; QList provider_status_widgets_; QList suggestion_widgets_; QIcon search_icon_; QIcon warning_icon_; bool show_providers_; bool show_suggestions_; }; #endif // GLOBALSEARCHVIEW_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/globalsearchview.ui000066400000000000000000000155701260417502300264740ustar00rootroot00000000000000 GlobalSearchView 0 0 437 633 0 0 0 Search for anything QToolButton::InstantPopup true 1 0 0 QAbstractItemView::NoEditTriggers true QAbstractItemView::DragOnly QAbstractItemView::ExtendedSelection true false 0 Qt::ScrollBarAlwaysOff true 0 0 435 605 32 16 32 64 Enter search terms above to find music on your computer and on the internet Qt::AlignCenter true 0 Clementine will find music in: true But these sources are disabled: 0 Why not try... Qt::Vertical 20 40 QSearchField QWidget
3rdparty/qocoa/qsearchfield.h
AutoExpandingTreeView QTreeView
widgets/autoexpandingtreeview.h
clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/icecastsearchprovider.cpp000066400000000000000000000030731260417502300276670ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "icecastsearchprovider.h" #include "internet/icecast/icecastbackend.h" IcecastSearchProvider::IcecastSearchProvider(IcecastBackend* backend, Application* app, QObject* parent) : BlockingSearchProvider(app, parent), backend_(backend) { Init("Icecast", "icecast", QIcon(":last.fm/icon_radio.png"), DisabledByDefault); } SearchProvider::ResultList IcecastSearchProvider::Search(int id, const QString& query) { IcecastBackend::StationList stations = backend_->GetStations(query); ResultList ret; for (const IcecastBackend::Station& station : stations) { if (ret.count() > 3) break; Result result(this); result.group_automatically_ = false; result.metadata_ = station.ToSong(); ret << result; } return ret; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/icecastsearchprovider.h000066400000000000000000000022071260417502300273320ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ICECASTSEARCHPROVIDER_H #define ICECASTSEARCHPROVIDER_H #include "searchprovider.h" class IcecastBackend; class IcecastSearchProvider : public BlockingSearchProvider { public: IcecastSearchProvider(IcecastBackend* backend, Application* app, QObject* parent); ResultList Search(int id, const QString& query); private: IcecastBackend* backend_; }; #endif // ICECASTSEARCHPROVIDER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/librarysearchprovider.cpp000066400000000000000000000067461260417502300277320ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "librarysearchprovider.h" #include "core/logging.h" #include "covers/albumcoverloader.h" #include "library/librarybackend.h" #include "library/libraryquery.h" #include "library/sqlrow.h" #include "playlist/songmimedata.h" #include LibrarySearchProvider::LibrarySearchProvider(LibraryBackendInterface* backend, const QString& name, const QString& id, const QIcon& icon, bool enabled_by_default, Application* app, QObject* parent) : BlockingSearchProvider(app, parent), backend_(backend) { Hints hints = WantsSerialisedArtQueries | ArtIsInSongMetadata | CanGiveSuggestions; if (!enabled_by_default) { hints |= DisabledByDefault; } Init(name, id, icon, hints); } SearchProvider::ResultList LibrarySearchProvider::Search(int id, const QString& query) { QueryOptions options; options.set_filter(query); LibraryQuery q(options); q.SetColumnSpec("%songs_table.ROWID, " + Song::kColumnSpec); if (!backend_->ExecQuery(&q)) { return ResultList(); } // Build the result list ResultList ret; while (q.Next()) { Result result(this); result.metadata_.InitFromQuery(q, true); ret << result; } return ret; } MimeData* LibrarySearchProvider::LoadTracks(const ResultList& results) { MimeData* ret = SearchProvider::LoadTracks(results); static_cast(ret)->backend = backend_; return ret; } QStringList LibrarySearchProvider::GetSuggestions(int count) { // We'd like to use order by random(), but that's O(n) in sqlite, so instead // get the largest ROWID and pick a couple of random numbers within that // range. LibraryQuery q; q.SetColumnSpec("ROWID"); q.SetOrderBy("ROWID DESC"); q.SetIncludeUnavailable(true); q.SetLimit(1); QStringList ret; if (!backend_->ExecQuery(&q) || !q.Next()) { return ret; } const int largest_rowid = q.Value(0).toInt(); for (int attempt = 0; attempt < count * 5; ++attempt) { if (ret.count() >= count) { break; } LibraryQuery q; q.SetColumnSpec("artist, album"); q.SetIncludeUnavailable(true); q.AddWhere("ROWID", qrand() % largest_rowid); q.SetLimit(1); if (!backend_->ExecQuery(&q) || !q.Next()) { continue; } const QString artist = q.Value(0).toString(); const QString album = q.Value(1).toString(); if (!artist.isEmpty() && !album.isEmpty()) ret << ((qrand() % 2 == 0) ? artist : album); else if (!artist.isEmpty()) ret << artist; else if (!album.isEmpty()) ret << album; } return ret; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/librarysearchprovider.h000066400000000000000000000026141260417502300273650ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef LIBRARYSEARCHPROVIDER_H #define LIBRARYSEARCHPROVIDER_H #include "searchprovider.h" class LibraryBackendInterface; class LibrarySearchProvider : public BlockingSearchProvider { public: LibrarySearchProvider(LibraryBackendInterface* backend, const QString& name, const QString& id, const QIcon& icon, bool enabled_by_default, Application* app, QObject* parent = nullptr); ResultList Search(int id, const QString& query); MimeData* LoadTracks(const ResultList& results); QStringList GetSuggestions(int count); private: LibraryBackendInterface* backend_; }; #endif // LIBRARYSEARCHPROVIDER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/savedradiosearchprovider.cpp000066400000000000000000000032001260417502300303650ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "savedradiosearchprovider.h" #include "core/mimedata.h" #include "ui/iconloader.h" SavedRadioSearchProvider::SavedRadioSearchProvider(SavedRadio* service, Application* app, QObject* parent) : SimpleSearchProvider(app, parent), service_(service) { Init(tr("Your radio streams"), "savedradio", IconLoader::Load("document-open-remote"), MimeDataContainsUrlsOnly); set_max_suggestion_count(3); connect(service_, SIGNAL(StreamsChanged()), SLOT(MaybeRecreateItems())); RecreateItems(); } void SavedRadioSearchProvider::RecreateItems() { QList items; for (const SavedRadio::Stream& stream : service_->Streams()) { Item item; item.metadata_.set_title(stream.name_); item.metadata_.set_url(stream.url_); item.keyword_ = stream.name_; items << item; } SetItems(items); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/savedradiosearchprovider.h000066400000000000000000000023671260417502300300470ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SAVEDRADIOSEARCHPROVIDER_H #define SAVEDRADIOSEARCHPROVIDER_H #include "simplesearchprovider.h" #include "internet/internetradio/savedradio.h" class SavedRadioSearchProvider : public SimpleSearchProvider { public: SavedRadioSearchProvider(SavedRadio* service, Application* app, QObject* parent); // SearchProvider InternetService* internet_service() override { return service_; } protected: void RecreateItems(); private: SavedRadio* service_; }; #endif // SAVEDRADIOSEARCHPROVIDER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/searchprovider.cpp000066400000000000000000000107321260417502300263330ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "searchprovider.h" #include "core/boundfuturewatcher.h" #include "internet/core/internetsongmimedata.h" #include "playlist/songmimedata.h" #include #include #include const int SearchProvider::kArtHeight = 32; SearchProvider::SearchProvider(Application* app, QObject* parent) : QObject(parent), app_(app), hints_(0) {} void SearchProvider::Init(const QString& name, const QString& id, const QIcon& icon, Hints hints) { name_ = name; id_ = id; icon_ = icon; hints_ = hints; icon_as_image_ = QImage(icon.pixmap(48, 48).toImage()); } void SearchProvider::SetHint(Hint hint, bool set) { if (set) { hints_ |= hint; } else { hints_ &= ~hint; } } QStringList SearchProvider::TokenizeQuery(const QString& query) { QStringList tokens(query.split(QRegExp("\\s+"))); for (QStringList::iterator it = tokens.begin(); it != tokens.end(); ++it) { (*it).remove('('); (*it).remove(')'); (*it).remove('"'); const int colon = (*it).indexOf(":"); if (colon != -1) { (*it).remove(0, colon + 1); } } return tokens; } bool SearchProvider::Matches(const QStringList& tokens, const QString& string) { for (const QString& token : tokens) { if (!string.contains(token, Qt::CaseInsensitive)) { return false; } } return true; } BlockingSearchProvider::BlockingSearchProvider(Application* app, QObject* parent) : SearchProvider(app, parent) {} void BlockingSearchProvider::SearchAsync(int id, const QString& query) { QFuture future = QtConcurrent::run(this, &BlockingSearchProvider::Search, id, query); BoundFutureWatcher* watcher = new BoundFutureWatcher(id); watcher->setFuture(future); connect(watcher, SIGNAL(finished()), SLOT(BlockingSearchFinished())); } void BlockingSearchProvider::BlockingSearchFinished() { BoundFutureWatcher* watcher = static_cast*>(sender()); const int id = watcher->data(); emit ResultsAvailable(id, watcher->result()); emit SearchFinished(id); watcher->deleteLater(); } QImage SearchProvider::ScaleAndPad(const QImage& image) { if (image.isNull()) return QImage(); const QSize target_size = QSize(kArtHeight, kArtHeight); if (image.size() == target_size) return image; // Scale the image down QImage copy; copy = image.scaled(target_size, Qt::KeepAspectRatio, Qt::SmoothTransformation); // Pad the image to kHeight x kHeight if (copy.size() == target_size) return copy; QImage padded_image(kArtHeight, kArtHeight, QImage::Format_ARGB32); padded_image.fill(0); QPainter p(&padded_image); p.drawImage((kArtHeight - copy.width()) / 2, (kArtHeight - copy.height()) / 2, copy); p.end(); return padded_image; } void SearchProvider::LoadArtAsync(int id, const Result& result) { emit ArtLoaded(id, QImage()); } MimeData* SearchProvider::LoadTracks(const ResultList& results) { MimeData* mime_data = nullptr; if (mime_data_contains_urls_only()) { mime_data = new MimeData; } else { SongList songs; for (const Result& result : results) { songs << result.metadata_; } if (internet_service()) { InternetSongMimeData* internet_song_mime_data = new InternetSongMimeData(internet_service()); internet_song_mime_data->songs = songs; mime_data = internet_song_mime_data; } else { SongMimeData* song_mime_data = new SongMimeData; song_mime_data->songs = songs; mime_data = song_mime_data; } } QList urls; for (const Result& result : results) { urls << result.metadata_.url(); } mime_data->setUrls(urls); return mime_data; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/searchprovider.h000066400000000000000000000171241260417502300260020ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SEARCHPROVIDER_H #define SEARCHPROVIDER_H #include #include #include #include "core/song.h" class Application; class InternetService; class MimeData; class SearchProvider : public QObject { Q_OBJECT public: SearchProvider(Application* app, QObject* parent = nullptr); static const int kArtHeight; struct Result { Result(SearchProvider* provider = 0) : provider_(provider), group_automatically_(true) {} // This must be set by the provider using the constructor. SearchProvider* provider_; // If this is set to true, the view will group this result into // artist/album categories as appropriate. bool group_automatically_; // Must be set by the provider. Song metadata_; // This is set and used by the GlobalSearch engine itself. QString pixmap_cache_key_; }; typedef QList ResultList; enum Hint { NoHints = 0x00, // Indicates that queries to this provider mean making requests to a third // party. To be polite, queries should be buffered by a few milliseconds // instead of executing them each time the user types a character. WantsDelayedQueries = 0x01, // Indicates that this provider wants to be given art queries one after the // other (serially), instead of all at once (in parallel). WantsSerialisedArtQueries = 0x02, // Indicates that album cover art is probably going to be loaded remotely. // If a third-party application is making art requests over dbus and has // to get all the art it can before showing results to the user, it might // not load art from this provider. ArtIsProbablyRemote = 0x04, // Indicates the art URL (or filename) for each result is stored in the // normal place in the song metadata. LoadArtAsync will never be called and // WantsSerialisedArtQueries and ArtIsProbablyRemote will be ignored if // they are set as well. The GlobalSearch engine will load the art itself. ArtIsInSongMetadata = 0x08, // Indicates this provider has a config dialog that can be shown by calling // ShowConfig. If this is not set then the button will be greyed out // in the GUI. CanShowConfig = 0x10, // This provider can provide some example search strings to display in the // UI. CanGiveSuggestions = 0x20, // Normally providers get enabled unless the user chooses otherwise. // Setting this flag indicates that this provider is disabled by default // instead. DisabledByDefault = 0x40, // The default implementation of LoadTracksAsync normally creates a // SongMimeData containing the entire metadata for each result being loaded. // Setting this flag will cause a plain MimeData to be created containing // only the URLs of the results. MimeDataContainsUrlsOnly = 0x80 }; Q_DECLARE_FLAGS(Hints, Hint) const QString& name() const { return name_; } const QString& id() const { return id_; } const QIcon& icon() const { return icon_; } const QImage& icon_as_image() const { return icon_as_image_; } Hints hints() const { return hints_; } bool wants_delayed_queries() const { return hints() & WantsDelayedQueries; } bool wants_serialised_art() const { return hints() & WantsSerialisedArtQueries; } bool art_is_probably_remote() const { return hints() & ArtIsProbablyRemote; } bool art_is_in_song_metadata() const { return hints() & ArtIsInSongMetadata; } bool can_show_config() const { return hints() & CanShowConfig; } bool can_give_suggestions() const { return hints() & CanGiveSuggestions; } bool is_disabled_by_default() const { return hints() & DisabledByDefault; } bool is_enabled_by_default() const { return !is_disabled_by_default(); } bool mime_data_contains_urls_only() const { return hints() & MimeDataContainsUrlsOnly; } // Starts a search. Must emit ResultsAvailable zero or more times and then // SearchFinished exactly once, using this ID. virtual void SearchAsync(int id, const QString& query) = 0; // Starts loading an icon for a result that was previously emitted by // ResultsAvailable. Must emit ArtLoaded exactly once with this ID. virtual void LoadArtAsync(int id, const Result& result); // Loads tracks for results that were previously emitted by ResultsAvailable. // The default implementation creates a SongMimeData with one Song for each // Result, unless the MimeDataContainsUrlsOnly flag is set. virtual MimeData* LoadTracks(const ResultList& results); // Returns some example search strings to display in the UI. The provider // should pick some of its items at random and return between 0 and count // strings. Remember to set the CanGiveSuggestions hint. virtual QStringList GetSuggestions(int count) { return QStringList(); } // If provider needs user login to search and play songs, this method should // be reimplemented virtual bool IsLoggedIn() { return true; } virtual void ShowConfig() {} // Remember to set the CanShowConfig hint // Returns the Internet service in charge of this provider, or nullptr if there // is none virtual InternetService* internet_service() { return nullptr; } static QImage ScaleAndPad(const QImage& image); signals: void ResultsAvailable(int id, const SearchProvider::ResultList& results); void SearchFinished(int id); void ArtLoaded(int id, const QImage& image); protected: // These functions treat queries in the same way as LibraryQuery. They're // useful for figuring out whether you got a result because it matched in // the song title or the artist/album name. static QStringList TokenizeQuery(const QString& query); static bool Matches(const QStringList& tokens, const QString& string); // Subclasses must call this from their constructors. void Init(const QString& name, const QString& id, const QIcon& icon, Hints hints = NoHints); void SetHint(Hint hint, bool set = true); struct PendingState { PendingState() : orig_id_(-1) {} PendingState(int orig_id, QStringList tokens) : orig_id_(orig_id), tokens_(tokens) {} int orig_id_; QStringList tokens_; bool operator<(const PendingState& b) const { return orig_id_ < b.orig_id_; } bool operator==(const PendingState& b) const { return orig_id_ == b.orig_id_; } }; protected: Application* app_; private: QString name_; QString id_; QIcon icon_; Hints hints_; QImage icon_as_image_; }; Q_DECLARE_METATYPE(SearchProvider::Result) Q_DECLARE_METATYPE(SearchProvider::ResultList) Q_DECLARE_OPERATORS_FOR_FLAGS(SearchProvider::Hints) class BlockingSearchProvider : public SearchProvider { Q_OBJECT public: BlockingSearchProvider(Application* app, QObject* parent = nullptr); void SearchAsync(int id, const QString& query); virtual ResultList Search(int id, const QString& query) = 0; private slots: void BlockingSearchFinished(); }; Q_DECLARE_METATYPE(SearchProvider*) #endif // SEARCHPROVIDER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/searchproviderstatuswidget.cpp000066400000000000000000000061571260417502300310110ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "globalsearch.h" #include "searchprovider.h" #include "searchproviderstatuswidget.h" #include "ui_searchproviderstatuswidget.h" #include "core/application.h" #include "ui/iconloader.h" #include SearchProviderStatusWidget::SearchProviderStatusWidget( const QIcon& warning_icon, GlobalSearch* engine, SearchProvider* provider, QWidget* parent) : QWidget(parent), ui_(new Ui_SearchProviderStatusWidget), engine_(engine), provider_(provider) { ui_->setupUi(this); ui_->icon->setPixmap(provider->icon().pixmap(16)); ui_->name->setText(provider->name()); const bool enabled = engine->is_provider_enabled(provider); const bool logged_in = provider->IsLoggedIn(); if (enabled && logged_in) { ui_->disabled_group->hide(); } else { const QString disabled_text = tr("Disabled", "Refers to search provider's status."); const QString not_logged_in_text = tr("Not logged in"); const int disabled_width = fontMetrics().width(" ") + qMax(fontMetrics().width(disabled_text), fontMetrics().width(not_logged_in_text)); ui_->disabled_reason->setMinimumWidth(disabled_width); ui_->disabled_reason->setText(logged_in ? disabled_text : not_logged_in_text); ui_->disabled_icon->setPixmap(warning_icon.pixmap(16)); ui_->disabled_reason->installEventFilter(this); } } SearchProviderStatusWidget::~SearchProviderStatusWidget() { delete ui_; } bool SearchProviderStatusWidget::eventFilter(QObject* object, QEvent* event) { if (object != ui_->disabled_reason) { return QWidget::eventFilter(object, event); } QFont font(ui_->disabled_reason->font()); switch (event->type()) { case QEvent::Enter: font.setUnderline(true); ui_->disabled_reason->setFont(font); break; case QEvent::Leave: font.setUnderline(false); ui_->disabled_reason->setFont(font); break; case QEvent::MouseButtonRelease: { QMouseEvent* e = static_cast(event); if (e->button() == Qt::LeftButton) { if (!provider_->IsLoggedIn()) { provider_->ShowConfig(); } else { engine_->application()->OpenSettingsDialogAtPage( SettingsDialog::Page_GlobalSearch); } } break; } default: return false; } return true; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/searchproviderstatuswidget.h000066400000000000000000000025231260417502300304470ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SEARCHPROVIDERSTATUSWIDGET_H #define SEARCHPROVIDERSTATUSWIDGET_H #include class GlobalSearch; class SearchProvider; class Ui_SearchProviderStatusWidget; class SearchProviderStatusWidget : public QWidget { public: SearchProviderStatusWidget(const QIcon& warning_icon, GlobalSearch* engine, SearchProvider* provider, QWidget* parent = nullptr); ~SearchProviderStatusWidget(); bool eventFilter(QObject* object, QEvent* event); private: Ui_SearchProviderStatusWidget* ui_; GlobalSearch* engine_; SearchProvider* provider_; }; #endif // SEARCHPROVIDERSTATUSWIDGET_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/searchproviderstatuswidget.ui000066400000000000000000000040301260417502300306300ustar00rootroot00000000000000 SearchProviderStatusWidget 0 0 464 110 Form 0 0 0 0 0 0 0 0 0 0 PointingHandCursor clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/simplesearchprovider.cpp000066400000000000000000000064671260417502300275570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "simplesearchprovider.h" #include "core/logging.h" #include "playlist/songmimedata.h" const int SimpleSearchProvider::kDefaultResultLimit = 6; SimpleSearchProvider::Item::Item(const QString& title, const QUrl& url, const QString& keyword) : keyword_(keyword) { metadata_.set_title(title); metadata_.set_url(url); } SimpleSearchProvider::Item::Item(const Song& song, const QString& keyword) : keyword_(keyword), metadata_(song) {} SimpleSearchProvider::SimpleSearchProvider(Application* app, QObject* parent) : BlockingSearchProvider(app, parent), result_limit_(kDefaultResultLimit), max_suggestion_count_(-1), items_dirty_(true), has_searched_before_(false) {} void SimpleSearchProvider::MaybeRecreateItems() { if (has_searched_before_) { RecreateItems(); } else { items_dirty_ = true; } } SearchProvider::ResultList SimpleSearchProvider::Search(int id, const QString& query) { Q_UNUSED(id) if (items_dirty_) { RecreateItems(); items_dirty_ = false; } has_searched_before_ = true; ResultList ret; const QStringList tokens = TokenizeQuery(query); QMutexLocker l(&items_mutex_); for (const Item& item : items_) { bool matched = true; for (const QString& token : tokens) { if (!item.keyword_.contains(token, Qt::CaseInsensitive) && !item.metadata_.title().contains(token, Qt::CaseInsensitive) && !safe_words_.contains(token, Qt::CaseInsensitive)) { matched = false; break; } } if (matched) { Result result(this); result.group_automatically_ = false; result.metadata_ = item.metadata_; ret << result; } if (ret.count() >= result_limit_) break; } return ret; } void SimpleSearchProvider::SetItems(const ItemList& items) { QMutexLocker l(&items_mutex_); items_ = items; for (ItemList::iterator it = items_.begin(); it != items_.end(); ++it) { it->metadata_.set_filetype(Song::Type_Stream); } } QStringList SimpleSearchProvider::GetSuggestions(int count) { if (max_suggestion_count_ != -1) { count = qMin(max_suggestion_count_, count); } QStringList ret; QMutexLocker l(&items_mutex_); if (items_.isEmpty()) return ret; for (int attempt = 0; attempt < count * 5; ++attempt) { if (ret.count() >= count) { break; } const Item& item = items_[qrand() % items_.count()]; if (!item.keyword_.isEmpty()) ret << item.keyword_; if (!item.metadata_.title().isEmpty()) ret << item.metadata_.title(); } return ret; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/simplesearchprovider.h000066400000000000000000000046111260417502300272110ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SIMPLESEARCHPROVIDER_H #define SIMPLESEARCHPROVIDER_H #include "searchprovider.h" class SimpleSearchProvider : public BlockingSearchProvider { Q_OBJECT public: SimpleSearchProvider(Application* app, QObject* parent); static const int kDefaultResultLimit; // BlockingSearchProvider ResultList Search(int id, const QString& query); // SearchProvider QStringList GetSuggestions(int count); protected slots: // Calls RecreateItems now if the user has done a global search with this // provider at least once before. Otherwise will schedule RecreateItems the // next time the user does a search. void MaybeRecreateItems(); protected: struct Item { Item() {} Item(const QString& title, const QUrl& url, const QString& keyword = QString()); Item(const Song& song, const QString& keyword = QString()); QString keyword_; Song metadata_; }; typedef QList ItemList; int result_limit() const { return result_limit_; } void set_result_limit(int result_limit) { result_limit_ = result_limit; } void set_max_suggestion_count(int count) { max_suggestion_count_ = count; } QStringList safe_words() const { return safe_words_; } void set_safe_words(const QStringList& safe_words) { safe_words_ = safe_words; } void SetItems(const ItemList& items); // Subclasses should fetch the list of items they want to show in results and // call SetItems with the new list. virtual void RecreateItems() = 0; private: int result_limit_; QStringList safe_words_; int max_suggestion_count_; QMutex items_mutex_; ItemList items_; bool items_dirty_; bool has_searched_before_; }; #endif // SIMPLESEARCHPROVIDER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/somafmsearchprovider.cpp000066400000000000000000000034751260417502300275440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "somafmsearchprovider.h" SomaFMSearchProvider::SomaFMSearchProvider(SomaFMServiceBase* service, Application* app, QObject* parent) : SimpleSearchProvider(app, parent), service_(service) { Init(service->name(), service->url_scheme(), service->icon(), CanGiveSuggestions); set_result_limit(3); set_max_suggestion_count(3); icon_ = ScaleAndPad( service->icon().pixmap(service->icon().availableSizes()[0]).toImage()); connect(service, SIGNAL(StreamsChanged()), SLOT(MaybeRecreateItems())); // Load the stream list on startup only if it doesn't involve going to update // info from the server. if (!service_->IsStreamListStale()) RecreateItems(); } void SomaFMSearchProvider::LoadArtAsync(int id, const Result& result) { emit ArtLoaded(id, icon_); } void SomaFMSearchProvider::RecreateItems() { QList items; for (const SomaFMService::Stream& stream : service_->Streams()) { Item item; item.metadata_ = stream.ToSong(service_->name()); item.keyword_ = stream.title_; items << item; } SetItems(items); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/somafmsearchprovider.h000066400000000000000000000024541260417502300272050ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SOMAFMSEARCHPROVIDER_H #define SOMAFMSEARCHPROVIDER_H #include "simplesearchprovider.h" #include "internet/somafm/somafmservice.h" class SomaFMSearchProvider : public SimpleSearchProvider { public: SomaFMSearchProvider(SomaFMServiceBase* service, Application* app, QObject* parent); // SearchProvider InternetService* internet_service() override { return service_; } void LoadArtAsync(int id, const Result& result); protected: void RecreateItems(); private: SomaFMServiceBase* service_; QImage icon_; }; #endif // SOMAFMSEARCHPROVIDER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/soundcloudsearchprovider.cpp000066400000000000000000000057601260417502300304400ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "soundcloudsearchprovider.h" #include #include "core/application.h" #include "core/logging.h" #include "covers/albumcoverloader.h" #include "internet/soundcloud/soundcloudservice.h" SoundCloudSearchProvider::SoundCloudSearchProvider(Application* app, QObject* parent) : SearchProvider(app, parent), service_(nullptr) {} void SoundCloudSearchProvider::Init(SoundCloudService* service) { service_ = service; SearchProvider::Init( "SoundCloud", "soundcloud", QIcon(":providers/soundcloud.png"), WantsDelayedQueries | ArtIsProbablyRemote | CanShowConfig); connect(service_, SIGNAL(SimpleSearchResults(int, SongList)), SLOT(SearchDone(int, SongList))); cover_loader_options_.desired_height_ = kArtHeight; cover_loader_options_.pad_output_image_ = true; cover_loader_options_.scale_output_image_ = true; connect(app_->album_cover_loader(), SIGNAL(ImageLoaded(quint64, QImage)), SLOT(AlbumArtLoaded(quint64, QImage))); } void SoundCloudSearchProvider::SearchAsync(int id, const QString& query) { const int service_id = service_->SimpleSearch(query); pending_searches_[service_id] = PendingState(id, TokenizeQuery(query)); ; } void SoundCloudSearchProvider::SearchDone(int id, const SongList& songs) { // Map back to the original id. const PendingState state = pending_searches_.take(id); const int global_search_id = state.orig_id_; ResultList ret; for (const Song& song : songs) { Result result(this); result.metadata_ = song; ret << result; } emit ResultsAvailable(global_search_id, ret); MaybeSearchFinished(global_search_id); } void SoundCloudSearchProvider::MaybeSearchFinished(int id) { if (pending_searches_.keys(PendingState(id, QStringList())).isEmpty()) { emit SearchFinished(id); } } void SoundCloudSearchProvider::LoadArtAsync(int id, const Result& result) { quint64 loader_id = app_->album_cover_loader()->LoadImageAsync( cover_loader_options_, result.metadata_); cover_loader_tasks_[loader_id] = id; } void SoundCloudSearchProvider::AlbumArtLoaded(quint64 id, const QImage& image) { if (!cover_loader_tasks_.contains(id)) { return; } int original_id = cover_loader_tasks_.take(id); emit ArtLoaded(original_id, image); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/soundcloudsearchprovider.h000066400000000000000000000032241260417502300300760ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SOUNDCLOUDSEARCHPROVIDER_H #define SOUNDCLOUDSEARCHPROVIDER_H #include "searchprovider.h" #include "covers/albumcoverloaderoptions.h" #include "internet/soundcloud/soundcloudservice.h" class AlbumCoverLoader; class SoundCloudSearchProvider : public SearchProvider { Q_OBJECT public: explicit SoundCloudSearchProvider(Application* app, QObject* parent = nullptr); void Init(SoundCloudService* service); // SearchProvider void SearchAsync(int id, const QString& query); void LoadArtAsync(int id, const Result& result); InternetService* internet_service() { return service_; } private slots: void AlbumArtLoaded(quint64 id, const QImage& image); void SearchDone(int id, const SongList& songs); private: void MaybeSearchFinished(int id); SoundCloudService* service_; QMap pending_searches_; AlbumCoverLoaderOptions cover_loader_options_; QMap cover_loader_tasks_; }; #endif clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/spotifysearchprovider.cpp000066400000000000000000000207021260417502300277470ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "spotifysearchprovider.h" #include #include #include "core/logging.h" #include "internet/core/internetmodel.h" #include "internet/spotify/spotifyserver.h" #include "playlist/songmimedata.h" namespace { const int kSearchSongLimit = 5; const int kSearchAlbumLimit = 20; } SpotifySearchProvider::SpotifySearchProvider(Application* app, QObject* parent) : SearchProvider(app, parent), server_(nullptr), service_(nullptr) { Init("Spotify", "spotify", QIcon(":icons/32x32/spotify.png"), WantsDelayedQueries | WantsSerialisedArtQueries | ArtIsProbablyRemote | CanShowConfig | CanGiveSuggestions); } SpotifyServer* SpotifySearchProvider::server() { if (server_) return server_; if (!service_) service_ = InternetModel::Service(); if (service_->login_state() != SpotifyService::LoginState_LoggedIn) return nullptr; if (!service_->IsBlobInstalled()) return nullptr; server_ = service_->server(); connect(server_, SIGNAL(SearchResults(pb::spotify::SearchResponse)), SLOT(SearchFinishedSlot(pb::spotify::SearchResponse))); connect(server_, SIGNAL(ImageLoaded(QString, QImage)), SLOT(ArtLoadedSlot(QString, QImage))); connect(server_, SIGNAL(destroyed()), SLOT(ServerDestroyed())); connect(server_, SIGNAL(StarredLoaded(pb::spotify::LoadPlaylistResponse)), SLOT(SuggestionsLoaded(pb::spotify::LoadPlaylistResponse))); connect(server_, SIGNAL(ToplistBrowseResults(pb::spotify::BrowseToplistResponse)), SLOT(SuggestionsLoaded(pb::spotify::BrowseToplistResponse))); return server_; } void SpotifySearchProvider::ServerDestroyed() { server_ = nullptr; } void SpotifySearchProvider::SearchAsync(int id, const QString& query) { SpotifyServer* s = server(); if (!s) { emit SearchFinished(id); return; } PendingState state; state.orig_id_ = id; state.tokens_ = TokenizeQuery(query); const QString query_string = state.tokens_.join(" "); s->Search(query_string, kSearchSongLimit, kSearchAlbumLimit); queries_[query_string] = state; } void SpotifySearchProvider::SearchFinishedSlot( const pb::spotify::SearchResponse& response) { QString query_string = QString::fromUtf8(response.request().query().c_str()); QMap::iterator it = queries_.find(query_string); if (it == queries_.end()) return; PendingState state = it.value(); queries_.erase(it); /* Here we clean up Spotify's results for our purposes * * Since Spotify doesn't give us an album artist, * we pick one, so there's a single album artist * per album to use for sorting. * * We also drop any of the single tracks returned * if they are already represented in an album * * This eliminates frequent duplicates from the * "Top Tracks" results that Spotify sometimes * returns */ QMap album_dedup; ResultList ret; for (int i = 0; i < response.album_size(); ++i) { const pb::spotify::Album& album = response.album(i); QHash artist_count; QString majority_artist; int majority_count = 0; /* We go through and find the artist that is * represented most frequently in the artist * * For most albums this will just be one artist, * but this ensures we have a consistent album artist for * soundtracks, compilations, contributing artists, etc */ for (int j = 0; j < album.track_size(); ++j) { // Each track can have multiple artists attributed, check them all for (int k = 0; k < album.track(j).artist_size(); ++k) { QString artist = QStringFromStdString(album.track(j).artist(k)); if (artist_count.contains(artist)) { artist_count[artist]++; } else { artist_count[artist] = 1; } if (artist_count[artist] > majority_count) { majority_count = artist_count[artist]; majority_artist = artist; } } } for (int j = 0; j < album.track_size(); ++j) { // Insert the album/track title into the dedup map // so we can check tracks against it below album_dedup.insertMulti(album.track(j).album(), album.track(j).title()); Result result(this); SpotifyService::SongFromProtobuf(album.track(j), &result.metadata_); // Just use the album index as an id. result.metadata_.set_album_id(i); result.metadata_.set_albumartist(majority_artist); ret << result; } } for (int i = 0; i < response.result_size(); ++i) { const pb::spotify::Track& track = response.result(i); // Check this track/album against tracks we've already seen // in the album results, and skip if it's a duplicate if (album_dedup.contains(track.album()) && album_dedup.values(track.album()).contains(track.title())) { continue; } Result result(this); SpotifyService::SongFromProtobuf(track, &result.metadata_); ret << result; } emit ResultsAvailable(state.orig_id_, ret); emit SearchFinished(state.orig_id_); } void SpotifySearchProvider::LoadArtAsync(int id, const Result& result) { SpotifyServer* s = server(); if (!s) { emit ArtLoaded(id, QImage()); return; } QString image_id = QUrl(result.metadata_.art_automatic()).path(); if (image_id.startsWith('/')) image_id.remove(0, 1); pending_art_[image_id] = id; s->LoadImage(image_id); } void SpotifySearchProvider::ArtLoadedSlot(const QString& id, const QImage& image) { QMap::iterator it = pending_art_.find(id); if (it == pending_art_.end()) return; const int orig_id = it.value(); pending_art_.erase(it); emit ArtLoaded(orig_id, ScaleAndPad(image)); } bool SpotifySearchProvider::IsLoggedIn() { if (server()) { return service_->IsLoggedIn(); } return false; } void SpotifySearchProvider::ShowConfig() { if (service_) { return service_->ShowConfig(); } } void SpotifySearchProvider::AddSuggestionFromTrack( const pb::spotify::Track& track) { if (!track.title().empty()) { suggestions_.insert(QString::fromUtf8(track.title().c_str())); } for (int j = 0; j < track.artist_size(); ++j) { if (!track.artist(j).empty()) { suggestions_.insert(QString::fromUtf8(track.artist(j).c_str())); } } if (!track.album().empty()) { suggestions_.insert(QString::fromUtf8(track.album().c_str())); } } void SpotifySearchProvider::AddSuggestionFromAlbum( const pb::spotify::Album& album) { AddSuggestionFromTrack(album.metadata()); for (int i = 0; i < album.track_size(); ++i) { AddSuggestionFromTrack(album.track(i)); } } void SpotifySearchProvider::SuggestionsLoaded( const pb::spotify::LoadPlaylistResponse& playlist) { for (int i = 0; i < playlist.track_size(); ++i) { AddSuggestionFromTrack(playlist.track(i)); } } void SpotifySearchProvider::SuggestionsLoaded( const pb::spotify::BrowseToplistResponse& response) { for (int i = 0; i < response.track_size(); ++i) { AddSuggestionFromTrack(response.track(i)); } for (int i = 0; i < response.album_size(); ++i) { AddSuggestionFromAlbum(response.album(i)); } } void SpotifySearchProvider::LoadSuggestions() { if (!server()) { return; } server()->LoadStarred(); server()->LoadToplist(); } QStringList SpotifySearchProvider::GetSuggestions(int count) { if (suggestions_.empty()) { LoadSuggestions(); return QStringList(); } QStringList all_suggestions = suggestions_.toList(); std::mt19937 gen(std::time(0)); std::uniform_int_distribution<> random(0, all_suggestions.size() - 1); QSet candidates; const int max = qMin(count, all_suggestions.size()); while (candidates.size() < max) { const int index = random(gen); candidates.insert(all_suggestions[index]); } return candidates.toList(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/spotifysearchprovider.h000066400000000000000000000041301260417502300274110ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SPOTIFYSEARCHPROVIDER_H #define SPOTIFYSEARCHPROVIDER_H #include "searchprovider.h" #include "spotifymessages.pb.h" #include "internet/spotify/spotifyservice.h" class SpotifyServer; class SpotifySearchProvider : public SearchProvider { Q_OBJECT public: SpotifySearchProvider(Application* app, QObject* parent = nullptr); void SearchAsync(int id, const QString& query); void LoadArtAsync(int id, const Result& result); QStringList GetSuggestions(int count); // SearchProvider bool IsLoggedIn() override; void ShowConfig() override; InternetService* internet_service() override { return service_; } private slots: void ServerDestroyed(); void SearchFinishedSlot(const pb::spotify::SearchResponse& response); void ArtLoadedSlot(const QString& id, const QImage& image); void SuggestionsLoaded(const pb::spotify::LoadPlaylistResponse& response); void SuggestionsLoaded(const pb::spotify::BrowseToplistResponse& response); private: SpotifyServer* server(); void LoadSuggestions(); void AddSuggestionFromTrack(const pb::spotify::Track& track); void AddSuggestionFromAlbum(const pb::spotify::Album& album); private: SpotifyServer* server_; SpotifyService* service_; QMap queries_; QMap pending_art_; QMap pending_tracks_; QSet suggestions_; }; #endif // SPOTIFYSEARCHPROVIDER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/suggestionwidget.cpp000066400000000000000000000037261260417502300267130ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "suggestionwidget.h" #include "ui_suggestionwidget.h" #include "ui/iconloader.h" #include SuggestionWidget::SuggestionWidget(const QIcon& search_icon, QWidget* parent) : QWidget(parent), ui_(new Ui_SuggestionWidget) { ui_->setupUi(this); ui_->icon->setPixmap(search_icon.pixmap(16)); ui_->name->installEventFilter(this); } SuggestionWidget::~SuggestionWidget() { delete ui_; } void SuggestionWidget::SetText(const QString& text) { ui_->name->setText(text); } bool SuggestionWidget::eventFilter(QObject* object, QEvent* event) { if (object != ui_->name) { return QWidget::eventFilter(object, event); } QFont font(ui_->name->font()); switch (event->type()) { case QEvent::Enter: font.setUnderline(true); ui_->name->setFont(font); break; case QEvent::Leave: font.setUnderline(false); ui_->name->setFont(font); break; case QEvent::MouseButtonRelease: { QMouseEvent* e = static_cast(event); if (e->button() == Qt::LeftButton) { QString text = ui_->name->text(); text.replace(QRegExp("\\W"), " "); emit SuggestionClicked(text.simplified()); } break; } default: return false; } return true; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/suggestionwidget.h000066400000000000000000000023171260417502300263530ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SUGGESTIONWIDGET_H #define SUGGESTIONWIDGET_H #include class Ui_SuggestionWidget; class SuggestionWidget : public QWidget { Q_OBJECT public: SuggestionWidget(const QIcon& search_icon, QWidget* parent = nullptr); ~SuggestionWidget(); bool eventFilter(QObject* object, QEvent* event); public slots: void SetText(const QString& text); signals: void SuggestionClicked(const QString& query); private: Ui_SuggestionWidget* ui_; }; #endif // SUGGESTIONWIDGET_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/suggestionwidget.ui000066400000000000000000000025211260417502300265360ustar00rootroot00000000000000 SuggestionWidget 0 0 464 110 Form 0 0 0 Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop 0 0 PointingHandCursor true clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/urlsearchprovider.cpp000066400000000000000000000034221260417502300270540ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "urlsearchprovider.h" #include "core/mimedata.h" #include "ui/iconloader.h" #include #include const char* UrlSearchProvider::kUrlRegex = "^[a-zA-Z][a-zA-Z0-9+-.]*://"; UrlSearchProvider::UrlSearchProvider(Application* app, QObject* parent) : SearchProvider(app, parent), url_regex_(kUrlRegex) { QIcon icon = IconLoader::Load("applications-internet"); image_ = ScaleAndPad(icon.pixmap(kArtHeight, kArtHeight).toImage()); Init("URL", "url", icon, MimeDataContainsUrlsOnly); } void UrlSearchProvider::SearchAsync(int id, const QString& query) { Result result(this); result.group_automatically_ = false; result.metadata_.set_url(QUrl::fromUserInput(query)); result.metadata_.set_title(result.metadata_.url().toString()); result.metadata_.set_filetype(Song::Type_Stream); emit ResultsAvailable(id, ResultList() << result); } void UrlSearchProvider::LoadArtAsync(int id, const Result&) { emit ArtLoaded(id, image_); } bool UrlSearchProvider::LooksLikeUrl(const QString& query) const { return url_regex_.indexIn(query) == 0; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/urlsearchprovider.h000066400000000000000000000023071260417502300265220ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef URLSEARCHPROVIDER_H #define URLSEARCHPROVIDER_H #include "searchprovider.h" #include class UrlSearchProvider : public SearchProvider { public: UrlSearchProvider(Application* app, QObject* parent); bool LooksLikeUrl(const QString& query) const; void SearchAsync(int id, const QString& query); void LoadArtAsync(int id, const Result& result); private: static const char* kUrlRegex; QRegExp url_regex_; QImage image_; }; #endif // URLSEARCHPROVIDER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/vksearchprovider.cpp000066400000000000000000000101171260417502300266710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2013, Vlad Maltsev Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "vksearchprovider.h" #include #include "core/logging.h" #include "core/song.h" VkSearchProvider::VkSearchProvider(Application* app, QObject* parent) : SearchProvider(app, parent), service_(NULL) {} void VkSearchProvider::Init(VkService* service) { service_ = service; SearchProvider::Init("Vk.com", "vk.com", QIcon(":providers/vk.png"), WantsDelayedQueries | CanShowConfig); connect(service_, SIGNAL(SongSearchResult(SearchID, SongList)), this, SLOT(SongSearchResult(SearchID, SongList))); connect(service_, SIGNAL(GroupSearchResult(SearchID, MusicOwnerList)), this, SLOT(GroupSearchResult(SearchID, MusicOwnerList))); } void VkSearchProvider::SearchAsync(int id, const QString& query) { int count = service_->maxGlobalSearch(); SearchID rid(SearchID::GlobalSearch); songs_recived = false; groups_recived = false; pending_searches_[rid.id()] = PendingState(id, TokenizeQuery(query)); service_->SongSearch(rid, query, count, 0); if (service_->isGroupsInGlobalSearch()) { service_->GroupSearch(rid, query); } } bool VkSearchProvider::IsLoggedIn() { return (service_ && service_->HasAccount()); } void VkSearchProvider::ShowConfig() { service_->ShowConfig(); } void VkSearchProvider::SongSearchResult(const SearchID& id, SongList songs) { if (id.type() == SearchID::GlobalSearch) { ClearSimilarSongs(songs); ResultList ret; for (const Song& song : songs) { Result result(this); result.metadata_ = song; ret << result; } qLog(Info) << "Found" << songs.count() << "songs."; songs_recived = true; const PendingState state = pending_searches_[id.id()]; emit ResultsAvailable(state.orig_id_, ret); MaybeSearchFinished(id.id()); } } void VkSearchProvider::GroupSearchResult(const SearchID& rid, const MusicOwnerList& groups) { if (rid.type() == SearchID::GlobalSearch) { ResultList ret; for (const MusicOwner& group : groups) { Result result(this); result.metadata_ = group.toOwnerRadio(); ret << result; } qLog(Info) << "Found" << groups.count() << "groups."; groups_recived = true; const PendingState state = pending_searches_[rid.id()]; emit ResultsAvailable(state.orig_id_, ret); MaybeSearchFinished(rid.id()); } } void VkSearchProvider::MaybeSearchFinished(int id) { if (pending_searches_.keys(PendingState(id, QStringList())).isEmpty() && songs_recived && groups_recived) { const PendingState state = pending_searches_.take(id); emit SearchFinished(state.orig_id_); } } void VkSearchProvider::ClearSimilarSongs(SongList& list) { // Search result sorted by relevance, and better quality songs usualy come // first. // Stable sort don't mix similar song, so std::unique will remove bad quality // copies. qStableSort(list.begin(), list.end(), [](const Song& a, const Song& b) { return (a.artist().localeAwareCompare(b.artist()) > 0) || (a.title().localeAwareCompare(b.title()) > 0); }); int old = list.count(); auto end = std::unique(list.begin(), list.end(), [](const Song& a, const Song& b) { return (a.artist().localeAwareCompare(b.artist()) == 0) && (a.title().localeAwareCompare(b.title()) == 0); }); list.erase(end, list.end()); qDebug() << "Cleared" << old - list.count() << "items"; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/globalsearch/vksearchprovider.h000066400000000000000000000030201260417502300263310ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2013, Vlad Maltsev Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef VKSEARCHPROVIDER_H #define VKSEARCHPROVIDER_H #include "internet/vk/vkservice.h" #include "searchprovider.h" class VkSearchProvider : public SearchProvider { Q_OBJECT public: VkSearchProvider(Application* app, QObject* parent = 0); void Init(VkService* service); void SearchAsync(int id, const QString& query); bool IsLoggedIn(); void ShowConfig(); InternetService* internet_service() { return service_; } public slots: void SongSearchResult(const SearchID& id, SongList songs); void GroupSearchResult(const SearchID& rid, const MusicOwnerList& groups); private: bool songs_recived; bool groups_recived; void MaybeSearchFinished(int id); void ClearSimilarSongs(SongList& list); VkService* service_; QMap pending_searches_; }; #endif // VKSEARCHPROVIDER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/000077500000000000000000000000001260417502300220065ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/amazon/000077500000000000000000000000001260417502300232735ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/amazon/amazonclouddrive.cpp000066400000000000000000000234201260417502300273460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2015, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "internet/amazon/amazonclouddrive.h" #include #include #include #include #include #include #include "core/application.h" #include "core/closure.h" #include "core/logging.h" #include "core/network.h" #include "core/player.h" #include "core/timeconstants.h" #include "core/waitforsignal.h" #include "internet/core/oauthenticator.h" #include "internet/amazon/amazonurlhandler.h" #include "library/librarybackend.h" #include "ui/settingsdialog.h" using std::chrono::seconds; using std::placeholders::_1; const char* AmazonCloudDrive::kServiceName = "Amazon Cloud Drive"; const char* AmazonCloudDrive::kSettingsGroup = "AmazonCloudDrive"; namespace { static const char* kServiceId = "amazon_cloud_drive"; static const char* kClientId = "amzn1.application-oa2-client.2b1157a7dadc45c3888567882b3a9f05"; static const char* kClientSecret = "acfbf95340cc4c381dd43fb75b5e111882d7fd1b02a02f3013ab124baf8d1655"; static const char* kOAuthScope = "clouddrive:read"; static const char* kOAuthEndpoint = "https://www.amazon.com/ap/oa"; static const char* kOAuthTokenEndpoint = "https://api.amazon.com/auth/o2/token"; static const char* kEndpointEndpoint = "https://drive.amazonaws.com/drive/v1/account/endpoint"; static const char* kChangesEndpoint = "%1/changes"; static const char* kDownloadEndpoint = "%1/nodes/%2/content"; } // namespace AmazonCloudDrive::AmazonCloudDrive(Application* app, InternetModel* parent) : CloudFileService(app, parent, kServiceName, kServiceId, QIcon(":/providers/amazonclouddrive.png"), SettingsDialog::Page_AmazonCloudDrive), network_(new NetworkAccessManager(this)) { app->player()->RegisterUrlHandler(new AmazonUrlHandler(this, this)); } bool AmazonCloudDrive::has_credentials() const { QSettings s; s.beginGroup(kSettingsGroup); return !s.value("refresh_token").toString().isEmpty(); } QUrl AmazonCloudDrive::GetStreamingUrlFromSongId(const QUrl& url) { EnsureConnected(); // Access token must be up to date. QUrl download_url( QString(kDownloadEndpoint).arg(content_url_).arg(url.path())); download_url.setFragment(QString("Bearer %1").arg(access_token_)); return download_url; } void AmazonCloudDrive::Connect() { OAuthenticator* oauth = new OAuthenticator( kClientId, kClientSecret, // Amazon forbids arbitrary query parameters so REMOTE_WITH_STATE is // required. OAuthenticator::RedirectStyle::REMOTE_WITH_STATE, this); QSettings s; s.beginGroup(kSettingsGroup); QString refresh_token = s.value("refresh_token").toString(); if (refresh_token.isEmpty()) { oauth->StartAuthorisation(kOAuthEndpoint, kOAuthTokenEndpoint, kOAuthScope); } else { oauth->RefreshAuthorisation(kOAuthTokenEndpoint, refresh_token); } NewClosure(oauth, SIGNAL(Finished()), this, SLOT(ConnectFinished(OAuthenticator*)), oauth); } void AmazonCloudDrive::EnsureConnected() { if (access_token_.isEmpty() || QDateTime::currentDateTime().secsTo(expiry_time_) < 60) { Connect(); WaitForSignal(this, SIGNAL(Connected())); } } void AmazonCloudDrive::ForgetCredentials() { QSettings s; s.beginGroup(kSettingsGroup); s.remove(""); access_token_ = QString(); expiry_time_ = QDateTime(); } void AmazonCloudDrive::ConnectFinished(OAuthenticator* oauth) { oauth->deleteLater(); QSettings s; s.beginGroup(kSettingsGroup); s.setValue("refresh_token", oauth->refresh_token()); access_token_ = oauth->access_token(); expiry_time_ = oauth->expiry_time(); FetchEndpoint(); } void AmazonCloudDrive::FetchEndpoint() { QUrl url(kEndpointEndpoint); QNetworkRequest request(url); Get(request, std::bind(&AmazonCloudDrive::FetchEndpointFinished, this, _1)); } void AmazonCloudDrive::FetchEndpointFinished(QNetworkReply* reply) { reply->deleteLater(); QJson::Parser parser; QVariantMap response = parser.parse(reply).toMap(); content_url_ = response["contentUrl"].toString(); metadata_url_ = response["metadataUrl"].toString(); if (content_url_.isEmpty() || metadata_url_.isEmpty()) { qLog(Debug) << "Couldn't fetch Amazon endpoint"; return; } QSettings s; s.beginGroup(kSettingsGroup); QString checkpoint = s.value("checkpoint", "").toString(); RequestChanges(checkpoint); // We wait until we know the endpoint URLs before emitting Connected(); emit Connected(); } void AmazonCloudDrive::RequestChanges(const QString& checkpoint) { EnsureConnected(); QUrl url(QString(kChangesEndpoint).arg(metadata_url_)); QVariantMap data; data["includePurged"] = "true"; if (!checkpoint.isEmpty()) { data["checkpoint"] = checkpoint; } QJson::Serializer serializer; QByteArray json = serializer.serialize(data); QNetworkRequest request(url); Post(request, json, std::bind(&AmazonCloudDrive::RequestChangesFinished, this, _1)); } void AmazonCloudDrive::Get(QNetworkRequest request, std::function done, int retries) { AddAuthorizationHeader(&request); MonitorReply(network_->get(request), done, QByteArray(), retries); } void AmazonCloudDrive::Post(QNetworkRequest request, const QByteArray& data, std::function done, int retries) { AddAuthorizationHeader(&request); MonitorReply(network_->post(request, data), done, data, retries); } void AmazonCloudDrive::MonitorReply(QNetworkReply* reply, std::function done, const QByteArray& post_data, int retries) { NewClosure(reply, SIGNAL(finished()), [=]() { if (reply->error() == QNetworkReply::NoError) { done(reply); } else { int code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); if (code >= 500) { // Retry with exponential backoff. int max_delay_s = std::pow(std::min(retries + 1, 8), 2); seconds delay(qrand() % max_delay_s); qLog(Debug) << "Request failed with code:" << code << "- retrying after" << delay << "seconds"; DoAfter([=]() { if (post_data.isEmpty()) { Get(reply->request(), done, retries + 1); } else { Post(reply->request(), post_data, done, retries + 1); } }, delay); } else { // Request failed permanently. done(reply); } } }); } void AmazonCloudDrive::RequestChangesFinished(QNetworkReply* reply) { reply->deleteLater(); QByteArray data = reply->readAll(); QBuffer buffer(&data); buffer.open(QIODevice::ReadOnly); QJson::Parser parser; QVariantMap response = parser.parse(&buffer).toMap(); QString checkpoint = response["checkpoint"].toString(); QSettings settings; settings.beginGroup(kSettingsGroup); settings.setValue("checkpoint", checkpoint); QVariantList nodes = response["nodes"].toList(); for (const QVariant& n : nodes) { QVariantMap node = n.toMap(); if (node["kind"].toString() == "FOLDER") { // Skip directories. continue; } QUrl url; url.setScheme("amazonclouddrive"); url.setPath(node["id"].toString()); QString status = node["status"].toString(); if (status == "PURGED") { // Remove no longer available files. Song song = library_backend_->GetSongByUrl(url); if (song.is_valid()) { library_backend_->DeleteSongs(SongList() << song); } continue; } if (status != "AVAILABLE") { // Ignore any other statuses. continue; } QVariantMap content_properties = node["contentProperties"].toMap(); QString mime_type = content_properties["contentType"].toString(); if (ShouldIndexFile(url, mime_type)) { QString node_id = node["id"].toString(); QUrl content_url( QString(kDownloadEndpoint).arg(content_url_).arg(node_id)); QString md5 = content_properties["md5"].toString(); Song song; song.set_url(url); song.set_etag(md5); song.set_mtime(node["modifiedDate"].toDateTime().toTime_t()); song.set_ctime(node["createdDate"].toDateTime().toTime_t()); song.set_title(node["name"].toString()); song.set_filesize(content_properties["size"].toInt()); MaybeAddFileToDatabase(song, mime_type, content_url, QString("Bearer %1").arg(access_token_)); } } // The API potentially returns a second JSON dictionary appended with a // newline at the end of the response with {"end": true} indicating that our // client is up to date with the latest changes. const int last_newline_index = data.lastIndexOf('\n'); QByteArray last_line = data.mid(last_newline_index); QVariantMap end_json = parser.parse(last_line).toMap(); if (end_json.contains("end") && end_json["end"].toBool()) { return; } else { RequestChanges(checkpoint); } } void AmazonCloudDrive::AddAuthorizationHeader(QNetworkRequest* request) { request->setRawHeader("Authorization", QString("Bearer %1").arg(access_token_).toUtf8()); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/amazon/amazonclouddrive.h000066400000000000000000000044601260417502300270160ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2015, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_AMAZON_AMAZON_CLOUD_DRIVE_H_ #define INTERNET_AMAZON_AMAZON_CLOUD_DRIVE_H_ #include "internet/core/cloudfileservice.h" #include #include #include class NetworkAccessManager; class OAuthenticator; class QNetworkReply; class QNetworkRequest; class AmazonCloudDrive : public CloudFileService { Q_OBJECT public: AmazonCloudDrive(Application* app, InternetModel* parent); static const char* kServiceName; static const char* kSettingsGroup; virtual bool has_credentials() const; QUrl GetStreamingUrlFromSongId(const QUrl& url); void ForgetCredentials(); signals: void Connected(); public slots: void Connect(); private: void FetchEndpoint(); void RequestChanges(const QString& checkpoint); void AddAuthorizationHeader(QNetworkRequest* request); void EnsureConnected(); void Get(QNetworkRequest, std::function, int retries = 0); void Post(QNetworkRequest, const QByteArray& data, std::function, int retries = 0); void MonitorReply(QNetworkReply* reply, std::function done, const QByteArray& post_data = QByteArray(), int retries = 0); private slots: void ConnectFinished(OAuthenticator*); void FetchEndpointFinished(QNetworkReply*); void RequestChangesFinished(QNetworkReply*); private: NetworkAccessManager* network_; QString access_token_; QDateTime expiry_time_; QString content_url_; QString metadata_url_; }; #endif // INTERNET_AMAZON_AMAZON_CLOUD_DRIVE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/amazon/amazonsettingspage.cpp000066400000000000000000000050331260417502300277030ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2015, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "amazonsettingspage.h" #include "ui_amazonsettingspage.h" #include "core/application.h" #include "internet/amazon/amazonclouddrive.h" #include "internet/core/internetmodel.h" #include "ui/settingsdialog.h" AmazonSettingsPage::AmazonSettingsPage(SettingsDialog* parent) : SettingsPage(parent), ui_(new Ui::AmazonSettingsPage), service_(dialog()->app()->internet_model()->Service()) { ui_->setupUi(this); ui_->login_state->AddCredentialGroup(ui_->login_container); connect(ui_->login_button, SIGNAL(clicked()), SLOT(LoginClicked())); connect(ui_->login_state, SIGNAL(LogoutClicked()), SLOT(LogoutClicked())); connect(service_, SIGNAL(Connected()), SLOT(Connected())); dialog()->installEventFilter(this); } AmazonSettingsPage::~AmazonSettingsPage() { delete ui_; } void AmazonSettingsPage::Load() { QSettings s; s.beginGroup(AmazonCloudDrive::kSettingsGroup); const QString token = s.value("refresh_token").toString(); if (!token.isEmpty()) { ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedIn); } } void AmazonSettingsPage::Save() { QSettings s; s.beginGroup(AmazonCloudDrive::kSettingsGroup); } void AmazonSettingsPage::LoginClicked() { service_->Connect(); ui_->login_button->setEnabled(false); ui_->login_state->SetLoggedIn(LoginStateWidget::LoginInProgress); } bool AmazonSettingsPage::eventFilter(QObject* object, QEvent* event) { if (object == dialog() && event->type() == QEvent::Enter) { ui_->login_button->setEnabled(true); return false; } return SettingsPage::eventFilter(object, event); } void AmazonSettingsPage::LogoutClicked() { service_->ForgetCredentials(); ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedOut); } void AmazonSettingsPage::Connected() { ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedIn); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/amazon/amazonsettingspage.h000066400000000000000000000026141260417502300273520ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2015, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_AMAZON_AMAZONSETTINGSPAGE_H_ #define INTERNET_AMAZON_AMAZONSETTINGSPAGE_H_ #include "ui/settingspage.h" #include #include class AmazonCloudDrive; class Ui_AmazonSettingsPage; class AmazonSettingsPage : public SettingsPage { Q_OBJECT public: explicit AmazonSettingsPage(SettingsDialog* parent = nullptr); ~AmazonSettingsPage(); void Load(); void Save(); // QObject bool eventFilter(QObject* object, QEvent* event); private slots: void LoginClicked(); void LogoutClicked(); void Connected(); private: Ui_AmazonSettingsPage* ui_; AmazonCloudDrive* service_; }; #endif // INTERNET_AMAZON_AMAZONSETTINGSPAGE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/amazon/amazonsettingspage.ui000066400000000000000000000057501260417502300275440ustar00rootroot00000000000000 AmazonSettingsPage 0 0 569 491 Amazon Cloud Drive :/providers/amazonclouddrive.png:/providers/amazonclouddrive.png Clementine can play music that you have uploaded to Amazon Cloud Drive true 28 0 0 Login Qt::Horizontal 40 20 Clicking the Login button will open a web browser. You should return to Clementine after you have logged in. true Qt::Vertical 20 357 LoginStateWidget QWidget
widgets/loginstatewidget.h
1
clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/amazon/amazonurlhandler.cpp000066400000000000000000000021721260417502300273470ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2015, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "internet/amazon/amazonurlhandler.h" #include "internet/amazon/amazonclouddrive.h" AmazonUrlHandler::AmazonUrlHandler(AmazonCloudDrive* service, QObject* parent) : UrlHandler(parent), service_(service) {} UrlHandler::LoadResult AmazonUrlHandler::StartLoading(const QUrl& url) { return LoadResult(url, LoadResult::TrackAvailable, service_->GetStreamingUrlFromSongId(url)); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/amazon/amazonurlhandler.h000066400000000000000000000024241260417502300270140ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2015, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_AMAZON_AMAZONURLHANDLER_H_ #define INTERNET_AMAZON_AMAZONURLHANDLER_H_ #include "core/urlhandler.h" class AmazonCloudDrive; class AmazonUrlHandler : public UrlHandler { Q_OBJECT public: explicit AmazonUrlHandler( AmazonCloudDrive* service, QObject* parent = nullptr); QString scheme() const { return "amazonclouddrive"; } QIcon icon() const { return QIcon(":providers/amazonclouddrive.png"); } LoadResult StartLoading(const QUrl& url); private: AmazonCloudDrive* service_; }; #endif // INTERNET_AMAZON_AMAZONURLHANDLER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/box/000077500000000000000000000000001260417502300225765ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/box/boxservice.cpp000066400000000000000000000240461260417502300254610ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2013-2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "boxservice.h" #include #include "core/application.h" #include "core/player.h" #include "core/waitforsignal.h" #include "internet/box/boxurlhandler.h" #include "internet/core/oauthenticator.h" #include "library/librarybackend.h" const char* BoxService::kServiceName = "Box"; const char* BoxService::kSettingsGroup = "Box"; namespace { static const char* kClientId = "gbswb9wp7gjyldc3qrw68h2rk68jaf4h"; static const char* kClientSecret = "pZ6cUCQz5X0xaWoPVbCDg6GpmfTtz73s"; static const char* kOAuthEndpoint = "https://api.box.com/oauth2/authorize"; static const char* kOAuthTokenEndpoint = "https://api.box.com/oauth2/token"; static const char* kUserInfo = "https://api.box.com/2.0/users/me"; static const char* kFolderItems = "https://api.box.com/2.0/folders/%1/items"; static const int kRootFolderId = 0; static const char* kFileContent = "https://api.box.com/2.0/files/%1/content"; static const char* kEvents = "https://api.box.com/2.0/events"; } // namespace BoxService::BoxService(Application* app, InternetModel* parent) : CloudFileService(app, parent, kServiceName, kSettingsGroup, QIcon(":/providers/box.png"), SettingsDialog::Page_Box) { app->player()->RegisterUrlHandler(new BoxUrlHandler(this, this)); } bool BoxService::has_credentials() const { return !refresh_token().isEmpty(); } QString BoxService::refresh_token() const { QSettings s; s.beginGroup(kSettingsGroup); return s.value("refresh_token").toString(); } bool BoxService::is_authenticated() const { return !access_token_.isEmpty() && QDateTime::currentDateTime().secsTo(expiry_time_) > 0; } void BoxService::EnsureConnected() { if (is_authenticated()) { return; } Connect(); WaitForSignal(this, SIGNAL(Connected())); } void BoxService::Connect() { OAuthenticator* oauth = new OAuthenticator( kClientId, kClientSecret, OAuthenticator::RedirectStyle::REMOTE, this); if (!refresh_token().isEmpty()) { oauth->RefreshAuthorisation(kOAuthTokenEndpoint, refresh_token()); } else { oauth->StartAuthorisation(kOAuthEndpoint, kOAuthTokenEndpoint, QString::null); } NewClosure(oauth, SIGNAL(Finished()), this, SLOT(ConnectFinished(OAuthenticator*)), oauth); } void BoxService::ConnectFinished(OAuthenticator* oauth) { oauth->deleteLater(); QSettings s; s.beginGroup(kSettingsGroup); s.setValue("refresh_token", oauth->refresh_token()); access_token_ = oauth->access_token(); expiry_time_ = oauth->expiry_time(); if (s.value("name").toString().isEmpty()) { QUrl url(kUserInfo); QNetworkRequest request(url); AddAuthorizationHeader(&request); QNetworkReply* reply = network_->get(request); NewClosure(reply, SIGNAL(finished()), this, SLOT(FetchUserInfoFinished(QNetworkReply*)), reply); } else { emit Connected(); } UpdateFiles(); } void BoxService::AddAuthorizationHeader(QNetworkRequest* request) const { request->setRawHeader("Authorization", QString("Bearer %1").arg(access_token_).toUtf8()); } void BoxService::FetchUserInfoFinished(QNetworkReply* reply) { reply->deleteLater(); QJson::Parser parser; QVariantMap response = parser.parse(reply).toMap(); QString name = response["name"].toString(); if (!name.isEmpty()) { QSettings s; s.beginGroup(kSettingsGroup); s.setValue("name", name); } emit Connected(); } void BoxService::ForgetCredentials() { QSettings s; s.beginGroup(kSettingsGroup); s.remove("refresh_token"); s.remove("name"); } void BoxService::UpdateFiles() { QSettings s; s.beginGroup(kSettingsGroup); if (!s.value("cursor").toString().isEmpty()) { // Use events API to fetch changes. UpdateFilesFromCursor(s.value("cursor").toString()); return; } // First run we scan as events may not cover everything. FetchRecursiveFolderItems(kRootFolderId); InitialiseEventsCursor(); } void BoxService::InitialiseEventsCursor() { QUrl url(kEvents); url.addQueryItem("stream_position", "now"); QNetworkRequest request(url); AddAuthorizationHeader(&request); QNetworkReply* reply = network_->get(request); NewClosure(reply, SIGNAL(finished()), this, SLOT(InitialiseEventsFinished(QNetworkReply*)), reply); } void BoxService::InitialiseEventsFinished(QNetworkReply* reply) { reply->deleteLater(); QJson::Parser parser; QVariantMap response = parser.parse(reply).toMap(); if (response.contains("next_stream_position")) { QSettings s; s.beginGroup(kSettingsGroup); s.setValue("cursor", response["next_stream_position"]); } } void BoxService::FetchRecursiveFolderItems(const int folder_id, const int offset) { QUrl url(QString(kFolderItems).arg(folder_id)); QStringList fields; fields << "etag" << "size" << "created_at" << "modified_at" << "name"; QString fields_list = fields.join(","); url.addQueryItem("fields", fields_list); url.addQueryItem("limit", "1000"); // Maximum according to API docs. url.addQueryItem("offset", QString::number(offset)); QNetworkRequest request(url); AddAuthorizationHeader(&request); QNetworkReply* reply = network_->get(request); NewClosure(reply, SIGNAL(finished()), this, SLOT(FetchFolderItemsFinished(QNetworkReply*, int)), reply, folder_id); } void BoxService::FetchFolderItemsFinished(QNetworkReply* reply, const int folder_id) { reply->deleteLater(); QByteArray data = reply->readAll(); QJson::Parser parser; QVariantMap response = parser.parse(data).toMap(); QVariantList entries = response["entries"].toList(); const int total_entries = response["total_count"].toInt(); const int offset = response["offset"].toInt(); if (entries.size() + offset < total_entries) { // Fetch the next page if necessary. FetchRecursiveFolderItems(folder_id, offset + entries.size()); } for (const QVariant& e : entries) { QVariantMap entry = e.toMap(); if (entry["type"].toString() == "folder") { FetchRecursiveFolderItems(entry["id"].toInt()); } else { MaybeAddFileEntry(entry); } } } void BoxService::MaybeAddFileEntry(const QVariantMap& entry) { QString mime_type = GuessMimeTypeForFile(entry["name"].toString()); QUrl url; url.setScheme("box"); url.setPath(entry["id"].toString()); Song song; song.set_url(url); song.set_ctime(entry["created_at"].toDateTime().toTime_t()); song.set_mtime(entry["modified_at"].toDateTime().toTime_t()); song.set_filesize(entry["size"].toInt()); song.set_title(entry["name"].toString()); // This is actually a redirect. Follow it now. QNetworkReply* reply = FetchContentUrlForFile(entry["id"].toString()); NewClosure(reply, SIGNAL(finished()), this, SLOT(RedirectFollowed(QNetworkReply*, Song, QString)), reply, song, mime_type); } QNetworkReply* BoxService::FetchContentUrlForFile(const QString& file_id) { QUrl content_url(QString(kFileContent).arg(file_id)); QNetworkRequest request(content_url); AddAuthorizationHeader(&request); QNetworkReply* reply = network_->get(request); return reply; } void BoxService::RedirectFollowed(QNetworkReply* reply, const Song& song, const QString& mime_type) { reply->deleteLater(); QVariant redirect = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); if (!redirect.isValid()) { return; } QUrl real_url = redirect.toUrl(); MaybeAddFileToDatabase(song, mime_type, real_url, QString("Bearer %1").arg(access_token_)); } void BoxService::UpdateFilesFromCursor(const QString& cursor) { QUrl url(kEvents); url.addQueryItem("stream_position", cursor); url.addQueryItem("limit", "5000"); QNetworkRequest request(url); AddAuthorizationHeader(&request); QNetworkReply* reply = network_->get(request); NewClosure(reply, SIGNAL(finished()), this, SLOT(FetchEventsFinished(QNetworkReply*)), reply); } void BoxService::FetchEventsFinished(QNetworkReply* reply) { // TODO(John Maguire): Page through events. reply->deleteLater(); QJson::Parser parser; QVariantMap response = parser.parse(reply).toMap(); QSettings s; s.beginGroup(kSettingsGroup); s.setValue("cursor", response["next_stream_position"]); QVariantList entries = response["entries"].toList(); for (const QVariant& e : entries) { QVariantMap event = e.toMap(); QString type = event["event_type"].toString(); QVariantMap source = event["source"].toMap(); if (source["type"] == "file") { if (type == "ITEM_UPLOAD") { // Add file. MaybeAddFileEntry(source); } else if (type == "ITEM_TRASH") { // Delete file. QUrl url; url.setScheme("box"); url.setPath(source["id"].toString()); Song song = library_backend_->GetSongByUrl(url); if (song.is_valid()) { library_backend_->DeleteSongs(SongList() << song); } } } } } QUrl BoxService::GetStreamingUrlFromSongId(const QString& id) { EnsureConnected(); QNetworkReply* reply = FetchContentUrlForFile(id); WaitForSignal(reply, SIGNAL(finished())); reply->deleteLater(); QUrl real_url = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); return real_url; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/box/boxservice.h000066400000000000000000000044641260417502300251300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2013-2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_BOX_BOXSERVICE_H_ #define INTERNET_BOX_BOXSERVICE_H_ #include "internet/core/cloudfileservice.h" #include class OAuthenticator; class QNetworkReply; class QNetworkRequest; class BoxService : public CloudFileService { Q_OBJECT public: BoxService(Application* app, InternetModel* parent); static const char* kServiceName; static const char* kSettingsGroup; virtual bool has_credentials() const; QUrl GetStreamingUrlFromSongId(const QString& id); public slots: void Connect(); void ForgetCredentials(); signals: void Connected(); private slots: void ConnectFinished(OAuthenticator* oauth); void FetchUserInfoFinished(QNetworkReply* reply); void FetchFolderItemsFinished(QNetworkReply* reply, const int folder_id); void RedirectFollowed(QNetworkReply* reply, const Song& song, const QString& mime_type); void InitialiseEventsFinished(QNetworkReply* reply); void FetchEventsFinished(QNetworkReply* reply); private: QString refresh_token() const; bool is_authenticated() const; void AddAuthorizationHeader(QNetworkRequest* request) const; void UpdateFiles(); void FetchRecursiveFolderItems(const int folder_id, const int offset = 0); void UpdateFilesFromCursor(const QString& cursor); QNetworkReply* FetchContentUrlForFile(const QString& file_id); void InitialiseEventsCursor(); void MaybeAddFileEntry(const QVariantMap& entry); void EnsureConnected(); QString access_token_; QDateTime expiry_time_; }; #endif // INTERNET_BOX_BOXSERVICE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/box/boxsettingspage.cpp000066400000000000000000000051461260417502300265160ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2013-2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "boxsettingspage.h" #include #include "ui_boxsettingspage.h" #include "core/application.h" #include "internet/box/boxservice.h" #include "internet/core/internetmodel.h" #include "ui/settingsdialog.h" BoxSettingsPage::BoxSettingsPage(SettingsDialog* parent) : SettingsPage(parent), ui_(new Ui::BoxSettingsPage), service_(dialog()->app()->internet_model()->Service()) { ui_->setupUi(this); ui_->login_state->AddCredentialGroup(ui_->login_container); connect(ui_->login_button, SIGNAL(clicked()), SLOT(LoginClicked())); connect(ui_->login_state, SIGNAL(LogoutClicked()), SLOT(LogoutClicked())); connect(service_, SIGNAL(Connected()), SLOT(Connected())); dialog()->installEventFilter(this); } BoxSettingsPage::~BoxSettingsPage() { delete ui_; } void BoxSettingsPage::Load() { QSettings s; s.beginGroup(BoxService::kSettingsGroup); const QString name = s.value("name").toString(); if (!name.isEmpty()) { ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedIn, name); } } void BoxSettingsPage::Save() { QSettings s; s.beginGroup(BoxService::kSettingsGroup); } void BoxSettingsPage::LoginClicked() { service_->Connect(); ui_->login_button->setEnabled(false); } bool BoxSettingsPage::eventFilter(QObject* object, QEvent* event) { if (object == dialog() && event->type() == QEvent::Enter) { ui_->login_button->setEnabled(true); return false; } return SettingsPage::eventFilter(object, event); } void BoxSettingsPage::LogoutClicked() { service_->ForgetCredentials(); ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedOut); } void BoxSettingsPage::Connected() { QSettings s; s.beginGroup(BoxService::kSettingsGroup); const QString name = s.value("name").toString(); ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedIn, name); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/box/boxsettingspage.h000066400000000000000000000026351260417502300261630ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2013-2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_BOX_BOXSETTINGSPAGE_H_ #define INTERNET_BOX_BOXSETTINGSPAGE_H_ #include "ui/settingspage.h" #include #include class BoxService; class Ui_BoxSettingsPage; class BoxSettingsPage : public SettingsPage { Q_OBJECT public: explicit BoxSettingsPage(SettingsDialog* parent = nullptr); ~BoxSettingsPage(); void Load(); void Save(); // QObject bool eventFilter(QObject* object, QEvent* event); private slots: void LoginClicked(); void LogoutClicked(); void Connected(); private: Ui_BoxSettingsPage* ui_; BoxService* service_; }; #endif // INTERNET_BOX_BOXSETTINGSPAGE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/box/boxsettingspage.ui000066400000000000000000000056521260417502300263530ustar00rootroot00000000000000 BoxSettingsPage 0 0 569 491 Box :/providers/box.png:/providers/box.png Clementine can play music that you have uploaded to Box true 28 0 0 Login Qt::Horizontal 40 20 Clicking the Login button will open a web browser. You should return to Clementine after you have logged in. true Qt::Vertical 20 357 LoginStateWidget QWidget
widgets/loginstatewidget.h
1
clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/box/boxurlhandler.cpp000066400000000000000000000022541260417502300261560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2013-2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "boxurlhandler.h" #include "boxservice.h" BoxUrlHandler::BoxUrlHandler(BoxService* service, QObject* parent) : UrlHandler(parent), service_(service) {} UrlHandler::LoadResult BoxUrlHandler::StartLoading(const QUrl& url) { QString file_id = url.path(); QUrl real_url = service_->GetStreamingUrlFromSongId(file_id); return LoadResult(url, LoadResult::TrackAvailable, real_url); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/box/boxurlhandler.h000066400000000000000000000024041260417502300256200ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2013, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_BOX_BOXURLHANDLER_H_ #define INTERNET_BOX_BOXURLHANDLER_H_ #include "core/urlhandler.h" class BoxService; class BoxUrlHandler : public UrlHandler { Q_OBJECT public: explicit BoxUrlHandler(BoxService* service, QObject* parent = nullptr); QString scheme() const { return "box"; } QIcon icon() const { return QIcon(":/providers/box.png"); } LoadResult StartLoading(const QUrl& url); private: BoxService* service_; }; #endif // INTERNET_BOX_BOXURLHANDLER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/000077500000000000000000000000001260417502300227365ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/cloudfilesearchprovider.cpp000066400000000000000000000027611260417502300303570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Krzysztof Sobiecki Copyright 2014, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "internet/core/cloudfilesearchprovider.h" #include "internet/core/cloudfileservice.h" #include "internet/core/internetmodel.h" CloudFileSearchProvider::CloudFileSearchProvider( LibraryBackendInterface* backend, const QString& id, const QIcon& icon, CloudFileService* service) : LibrarySearchProvider(backend, service->name(), id, icon, true, service->model()->app(), service), service_(service) { SetHint(CanShowConfig); } bool CloudFileSearchProvider::IsLoggedIn() { return service_->has_credentials(); } void CloudFileSearchProvider::ShowConfig() { service_->ShowSettingsDialog(); } InternetService* CloudFileSearchProvider::internet_service() { return service_; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/cloudfilesearchprovider.h000066400000000000000000000025551260417502300300250ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Krzysztof Sobiecki Copyright 2014, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_CORE_CLOUDFILESEARCHPROVIDER_H_ #define INTERNET_CORE_CLOUDFILESEARCHPROVIDER_H_ #include "globalsearch/librarysearchprovider.h" class CloudFileService; class CloudFileSearchProvider : public LibrarySearchProvider { public: CloudFileSearchProvider(LibraryBackendInterface* backend, const QString& id, const QIcon& icon, CloudFileService* service); virtual bool IsLoggedIn(); virtual void ShowConfig(); virtual InternetService* internet_service(); private: CloudFileService* service_; }; #endif // INTERNET_CORE_CLOUDFILESEARCHPROVIDER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/cloudfileservice.cpp000066400000000000000000000205411260417502300267730ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, 2014, John Maguire Copyright 2013, Martin Brodbeck Copyright 2013-2014, David Sansome Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "internet/core/cloudfileservice.h" #include #include #include "core/application.h" #include "core/database.h" #include "core/mergedproxymodel.h" #include "core/network.h" #include "core/player.h" #include "core/taskmanager.h" #include "globalsearch/globalsearch.h" #include "internet/core/cloudfilesearchprovider.h" #include "internet/core/internetmodel.h" #include "library/librarybackend.h" #include "library/librarymodel.h" #include "playlist/playlist.h" #include "ui/iconloader.h" CloudFileService::CloudFileService(Application* app, InternetModel* parent, const QString& service_name, const QString& service_id, const QIcon& icon, SettingsDialog::Page settings_page) : InternetService(service_name, app, parent, parent), root_(nullptr), network_(new NetworkAccessManager(this)), library_sort_model_(new QSortFilterProxyModel(this)), playlist_manager_(app->playlist_manager()), task_manager_(app->task_manager()), icon_(icon), settings_page_(settings_page), indexing_task_id_(-1), indexing_task_progress_(0), indexing_task_max_(0) { library_backend_ = new LibraryBackend; library_backend_->moveToThread(app_->database()->thread()); QString songs_table = service_id + "_songs"; QString songs_fts_table = service_id + "_songs_fts"; library_backend_->Init(app->database(), songs_table, QString::null, QString::null, songs_fts_table); library_model_ = new LibraryModel(library_backend_, app_, this); library_sort_model_->setSourceModel(library_model_); library_sort_model_->setSortRole(LibraryModel::Role_SortText); library_sort_model_->setDynamicSortFilter(true); library_sort_model_->setSortLocaleAware(true); library_sort_model_->sort(0); app->global_search()->AddProvider( new CloudFileSearchProvider(library_backend_, service_id, icon_, this)); } QStandardItem* CloudFileService::CreateRootItem() { root_ = new QStandardItem(icon_, name()); root_->setData(true, InternetModel::Role_CanLazyLoad); return root_; } void CloudFileService::LazyPopulate(QStandardItem* item) { switch (item->data(InternetModel::Role_Type).toInt()) { case InternetModel::Type_Service: if (!has_credentials()) { ShowSettingsDialog(); } else { Connect(); } library_model_->Init(); model()->merged_model()->AddSubModel(item->index(), library_sort_model_); break; default: break; } } void CloudFileService::ShowContextMenu(const QPoint& global_pos) { if (!context_menu_) { context_menu_.reset(new QMenu); context_menu_->addActions(GetPlaylistActions()); context_menu_->addAction(IconLoader::Load("download"), tr("Cover Manager"), this, SLOT(ShowCoverManager())); context_menu_->addSeparator(); context_menu_->addAction(IconLoader::Load("configure"), tr("Configure..."), this, SLOT(ShowSettingsDialog())); } context_menu_->popup(global_pos); } void CloudFileService::ShowCoverManager() { if (!cover_manager_) { cover_manager_.reset(new AlbumCoverManager(app_, library_backend_)); cover_manager_->Init(); connect(cover_manager_.get(), SIGNAL(AddToPlaylist(QMimeData*)), SLOT(AddToPlaylist(QMimeData*))); } cover_manager_->show(); } void CloudFileService::AddToPlaylist(QMimeData* mime) { playlist_manager_->current()->dropMimeData(mime, Qt::CopyAction, -1, 0, QModelIndex()); } void CloudFileService::ShowSettingsDialog() { app_->OpenSettingsDialogAtPage(settings_page_); } bool CloudFileService::ShouldIndexFile(const QUrl& url, const QString& mime_type) const { if (!IsSupportedMimeType(mime_type)) { return false; } Song library_song = library_backend_->GetSongByUrl(url); if (library_song.is_valid()) { qLog(Debug) << "Already have:" << url; return false; } return true; } void CloudFileService::MaybeAddFileToDatabase(const Song& metadata, const QString& mime_type, const QUrl& download_url, const QString& authorisation) { if (!ShouldIndexFile(metadata.url(), mime_type)) { return; } if (indexing_task_id_ == -1) { indexing_task_id_ = task_manager_->StartTask(tr("Indexing %1").arg(name())); indexing_task_progress_ = 0; indexing_task_max_ = 0; } indexing_task_max_++; task_manager_->SetTaskProgress(indexing_task_id_, indexing_task_progress_, indexing_task_max_); TagReaderClient::ReplyType* reply = app_->tag_reader_client()->ReadCloudFile( download_url, metadata.title(), metadata.filesize(), mime_type, authorisation); pending_tagreader_replies_.append(reply); NewClosure(reply, SIGNAL(Finished(bool)), this, SLOT(ReadTagsFinished(TagReaderClient::ReplyType*, Song)), reply, metadata); } void CloudFileService::ReadTagsFinished(TagReaderClient::ReplyType* reply, const Song& metadata) { int index_reply; reply->deleteLater(); if ((index_reply = pending_tagreader_replies_.indexOf(reply)) == -1) { qLog(Debug) << "Ignore the reply"; return; } pending_tagreader_replies_.removeAt(index_reply); indexing_task_progress_++; if (indexing_task_progress_ == indexing_task_max_) { task_manager_->SetTaskFinished(indexing_task_id_); indexing_task_id_ = -1; emit AllIndexingTasksFinished(); } else { task_manager_->SetTaskProgress(indexing_task_id_, indexing_task_progress_, indexing_task_max_); } const pb::tagreader::ReadCloudFileResponse& message = reply->message().read_cloud_file_response(); if (!message.has_metadata() || !message.metadata().filesize()) { qLog(Debug) << "Failed to tag:" << metadata.url(); return; } pb::tagreader::SongMetadata metadata_pb; metadata.ToProtobuf(&metadata_pb); metadata_pb.MergeFrom(message.metadata()); Song song; song.InitFromProtobuf(metadata_pb); song.set_directory_id(0); qLog(Debug) << "Adding song to db:" << song.title(); library_backend_->AddOrUpdateSongs(SongList() << song); } bool CloudFileService::IsSupportedMimeType(const QString& mime_type) const { return mime_type == "audio/ogg" || mime_type == "audio/mpeg" || mime_type == "audio/mp4" || mime_type == "audio/flac" || mime_type == "audio/x-flac" || mime_type == "application/ogg" || mime_type == "application/x-flac" || mime_type == "audio/x-ms-wma"; } QString CloudFileService::GuessMimeTypeForFile(const QString& filename) const { if (filename.endsWith(".mp3")) { return "audio/mpeg"; } else if (filename.endsWith(".m4a") || filename.endsWith(".m4b")) { return "audio/mpeg"; } else if (filename.endsWith(".ogg") || filename.endsWith(".opus")) { return "application/ogg"; } else if (filename.endsWith(".flac")) { return "application/x-flac"; } else if (filename.endsWith(".wma")) { return "audio/x-ms-wma"; } return QString::null; } void CloudFileService::AbortReadTagsReplies() { qLog(Debug) << "Aborting the read tags replies"; pending_tagreader_replies_.clear(); task_manager_->SetTaskFinished(indexing_task_id_); indexing_task_id_ = -1; emit AllIndexingTasksFinished(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/cloudfileservice.h000066400000000000000000000062231260417502300264410ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Copyright 2014, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_CORE_CLOUDFILESERVICE_H_ #define INTERNET_CORE_CLOUDFILESERVICE_H_ #include "internet/core/internetservice.h" #include #include #include "core/tagreaderclient.h" #include "ui/albumcovermanager.h" class UrlHandler; class QSortFilterProxyModel; class LibraryBackend; class LibraryModel; class NetworkAccessManager; class PlaylistManager; class CloudFileService : public InternetService { Q_OBJECT public: CloudFileService(Application* app, InternetModel* parent, const QString& service_name, const QString& service_id, const QIcon& icon, SettingsDialog::Page settings_page); // InternetService virtual QStandardItem* CreateRootItem(); virtual void LazyPopulate(QStandardItem* item); virtual void ShowContextMenu(const QPoint& point); virtual bool has_credentials() const = 0; bool is_indexing() const { return indexing_task_id_ != -1; } signals: void AllIndexingTasksFinished(); public slots: void ShowSettingsDialog(); protected: virtual void Connect() = 0; virtual bool ShouldIndexFile(const QUrl& url, const QString& mime_type) const; virtual void MaybeAddFileToDatabase(const Song& metadata, const QString& mime_type, const QUrl& download_url, const QString& authorisation); virtual bool IsSupportedMimeType(const QString& mime_type) const; QString GuessMimeTypeForFile(const QString& filename) const; void AbortReadTagsReplies(); protected slots: void ShowCoverManager(); void AddToPlaylist(QMimeData* mime); void ReadTagsFinished(TagReaderClient::ReplyType* reply, const Song& metadata); protected: QStandardItem* root_; NetworkAccessManager* network_; LibraryBackend* library_backend_; LibraryModel* library_model_; QSortFilterProxyModel* library_sort_model_; std::unique_ptr context_menu_; std::unique_ptr cover_manager_; PlaylistManager* playlist_manager_; TaskManager* task_manager_; QList pending_tagreader_replies_; private: QIcon icon_; SettingsDialog::Page settings_page_; int indexing_task_id_; int indexing_task_progress_; int indexing_task_max_; }; #endif // INTERNET_CORE_CLOUDFILESERVICE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/geolocator.cpp000066400000000000000000000070751260417502300256110ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "geolocator.h" #include #include #include #include #include "core/closure.h" #include "core/logging.h" const char* Geolocator::kUrl = "http://data.clementine-player.org/geolocate"; using std::numeric_limits; Geolocator::LatLng::LatLng() : lat_e6_(numeric_limits::min()), lng_e6_(numeric_limits::min()) {} Geolocator::LatLng::LatLng(int lat_e6, int lng_e6) : lat_e6_(lat_e6), lng_e6_(lng_e6) {} Geolocator::LatLng::LatLng(const QString& latlng) : lat_e6_(numeric_limits::min()), lng_e6_(numeric_limits::min()) { QStringList split = latlng.split(","); if (split.length() != 2) { return; } const double lat = split[0].toDouble(); const double lng = split[1].toDouble(); lat_e6_ = static_cast(lat * 1e6); lng_e6_ = static_cast(lng * 1e6); } Geolocator::LatLng::LatLng(const QString& lat, const QString& lng) { lat_e6_ = static_cast(lat.toDouble() * 1e6); lng_e6_ = static_cast(lng.toDouble() * 1e6); } int Geolocator::LatLng::Distance(const Geolocator::LatLng& other) const { static const int kEarthRadiusMetres = 6372800; double lat_a = lat_e6() / 1000000.0 * (M_PI / 180.0); double lng_a = lng_e6() / 1000000.0 * (M_PI / 180.0); double lat_b = other.lat_e6() / 1000000.0 * (M_PI / 180.0); double lng_b = other.lng_e6() / 1000000.0 * (M_PI / 180.0); double delta_longitude = lng_b - lng_a; double sines = sin(lat_a) * sin(lat_b); double cosines = cos(lat_a) * cos(lat_b) * cos(delta_longitude); double central_angle = acos(sines + cosines); double distance_metres = kEarthRadiusMetres * central_angle; return static_cast(distance_metres); } bool Geolocator::LatLng::IsValid() const { return lat_e6_ != numeric_limits::min() && lng_e6_ != numeric_limits::min(); } Geolocator::Geolocator(QObject* parent) : QObject(parent) {} void Geolocator::Geolocate() { QNetworkRequest req = QNetworkRequest(QUrl(kUrl)); QNetworkReply* reply = network_.get(req); NewClosure(reply, SIGNAL(finished()), this, SLOT(RequestFinished(QNetworkReply*)), reply); } void Geolocator::RequestFinished(QNetworkReply* reply) { reply->deleteLater(); if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute) != 200) { emit Finished(LatLng()); return; } QJson::Parser parser; bool ok = false; QVariant result = parser.parse(reply, &ok); if (!ok) { emit Finished(LatLng()); return; } QVariantMap map = result.toMap(); QString latlng = map["latlng"].toString(); LatLng ll(latlng); emit Finished(ll); } QDebug operator<<(QDebug dbg, const Geolocator::LatLng& ll) { dbg.nospace() << "(" << ll.lat_e6() << "," << ll.lng_e6() << ")"; return dbg.space(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/geolocator.h000066400000000000000000000034351260417502300252520ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_CORE_GEOLOCATOR_H_ #define INTERNET_CORE_GEOLOCATOR_H_ #include #include "core/network.h" class Geolocator : public QObject { Q_OBJECT public: explicit Geolocator(QObject* parent = nullptr); void Geolocate(); class LatLng { public: LatLng(); LatLng(int lat_e6, int lng_e6); explicit LatLng(const QString& latlng); LatLng(const QString& lat, const QString& lng); int lat_e6() const { return lat_e6_; } int lng_e6() const { return lng_e6_; } bool IsValid() const; int Distance(const LatLng& other) const; private: int lat_e6_; int lng_e6_; }; signals: void Finished(Geolocator::LatLng latlng); private slots: void RequestFinished(QNetworkReply* reply); private: NetworkAccessManager network_; static const char* kUrl; }; QDebug operator<<(QDebug dbg, const Geolocator::LatLng& ll); Q_DECLARE_METATYPE(Geolocator::LatLng); #endif // INTERNET_CORE_GEOLOCATOR_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/internetmimedata.h000066400000000000000000000025001260417502300264360ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2009-2011, David Sansome Copyright 2011, Tyler Rhodes Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_CORE_INTERNETMIMEDATA_H_ #define INTERNET_CORE_INTERNETMIMEDATA_H_ #include "core/mimedata.h" #include #include class InternetModel; class InternetMimeData : public MimeData { Q_OBJECT public: explicit InternetMimeData(const InternetModel* _model) : model(_model) {} const InternetModel* model; QModelIndexList indexes; }; #endif // INTERNET_CORE_INTERNETMIMEDATA_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/internetmodel.cpp000066400000000000000000000313271260417502300263210ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2009-2014, David Sansome Copyright 2011-2012, 2014, Arnaud Bienner Copyright 2011, Tyler Rhodes Copyright 2011, Paweł Bara Copyright 2012-2013, Alan Briolat Copyright 2012-2014, John Maguire Copyright 2014, Maltsev Vlad Copyright 2014, Chocobozzz Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "internet/core/internetmodel.h" #include #include #include "internet/digitally/digitallyimportedservicebase.h" #include "internet/icecast/icecastservice.h" #include "internet/core/internetmimedata.h" #include "internet/core/internetservice.h" #include "internet/jamendo/jamendoservice.h" #include "internet/magnatune/magnatuneservice.h" #include "internet/internetradio/savedradio.h" #include "internet/somafm/somafmservice.h" #include "internet/soundcloud/soundcloudservice.h" #include "internet/spotify/spotifyservice.h" #include "internet/subsonic/subsonicservice.h" #include "core/closure.h" #include "core/logging.h" #include "core/mergedproxymodel.h" #include "internet/podcasts/podcastservice.h" #include "smartplaylists/generatormimedata.h" #ifdef HAVE_GOOGLE_DRIVE #include "internet/googledrive/googledriveservice.h" #endif #ifdef HAVE_DROPBOX #include "internet/dropbox/dropboxservice.h" #endif #ifdef HAVE_SKYDRIVE #include "internet/skydrive/skydriveservice.h" #endif #ifdef HAVE_BOX #include "internet/box/boxservice.h" #endif #ifdef HAVE_VK #include "internet/vk/vkservice.h" #endif #ifdef HAVE_SEAFILE #include "internet/seafile/seafileservice.h" #endif #ifdef HAVE_AMAZON_CLOUD_DRIVE #include "internet/amazon/amazonclouddrive.h" #endif using smart_playlists::Generator; using smart_playlists::GeneratorMimeData; using smart_playlists::GeneratorPtr; QMap* InternetModel::sServices = nullptr; const char* InternetModel::kSettingsGroup = "InternetModel"; InternetModel::InternetModel(Application* app, QObject* parent) : QStandardItemModel(parent), app_(app), merged_model_(new MergedProxyModel(this)) { if (!sServices) { sServices = new QMap; } Q_ASSERT(sServices->isEmpty()); merged_model_->setSourceModel(this); AddService(new DigitallyImportedService(app, this)); AddService(new IcecastService(app, this)); AddService(new JamendoService(app, this)); AddService(new JazzRadioService(app, this)); AddService(new MagnatuneService(app, this)); AddService(new PodcastService(app, this)); AddService(new RockRadioService(app, this)); AddService(new SavedRadio(app, this)); AddService(new RadioTunesService(app, this)); AddService(new SomaFMService(app, this)); AddService(new SoundCloudService(app, this)); AddService(new SpotifyService(app, this)); AddService(new SubsonicService(app, this)); #ifdef HAVE_BOX AddService(new BoxService(app, this)); #endif #ifdef HAVE_DROPBOX AddService(new DropboxService(app, this)); #endif #ifdef HAVE_GOOGLE_DRIVE AddService(new GoogleDriveService(app, this)); #endif #ifdef HAVE_SEAFILE AddService(new SeafileService(app, this)); #endif #ifdef HAVE_SKYDRIVE AddService(new SkydriveService(app, this)); #endif #ifdef HAVE_VK AddService(new VkService(app, this)); #endif #ifdef HAVE_AMAZON_CLOUD_DRIVE AddService(new AmazonCloudDrive(app, this)); #endif invisibleRootItem()->sortChildren(0, Qt::AscendingOrder); UpdateServices(); } void InternetModel::AddService(InternetService* service) { QStandardItem* root = service->CreateRootItem(); if (!root) { qLog(Warning) << "Internet service" << service->name() << "did not return a root item"; return; } root->setData(Type_Service, Role_Type); root->setData(QVariant::fromValue(service), Role_Service); invisibleRootItem()->appendRow(root); qLog(Debug) << "Adding internet service:" << service->name(); sServices->insert(service->name(), service); ServiceItem service_item; service_item.item = root; service_item.shown = true; shown_services_.insert(service, service_item); connect(service, SIGNAL(StreamError(QString)), SIGNAL(StreamError(QString))); connect(service, SIGNAL(StreamMetadataFound(QUrl, Song)), SIGNAL(StreamMetadataFound(QUrl, Song))); connect(service, SIGNAL(AddToPlaylistSignal(QMimeData*)), SIGNAL(AddToPlaylist(QMimeData*))); connect(service, SIGNAL(ScrollToIndex(QModelIndex)), SIGNAL(ScrollToIndex(QModelIndex))); connect(service, SIGNAL(destroyed()), SLOT(ServiceDeleted())); if (service->has_initial_load_settings()) { service->InitialLoadSettings(); } else { service->ReloadSettings(); } } void InternetModel::RemoveService(InternetService* service) { if (!sServices->contains(service->name())) return; // Find and remove the root item that this service created for (int i = 0; i < invisibleRootItem()->rowCount(); ++i) { QStandardItem* item = invisibleRootItem()->child(i); if (!item || item->data(Role_Service).value() == service) { invisibleRootItem()->removeRow(i); break; } } // Remove the service from the list sServices->remove(service->name()); // Don't forget to delete from shown_services too shown_services_.remove(service); // Disconnect the service disconnect(service, 0, this, 0); } void InternetModel::ServiceDeleted() { InternetService* service = qobject_cast(sender()); if (service) RemoveService(service); } InternetService* InternetModel::ServiceByName(const QString& name) { if (sServices->contains(name)) return sServices->value(name); return nullptr; } InternetService* InternetModel::ServiceForItem( const QStandardItem* item) const { return ServiceForIndex(indexFromItem(item)); } InternetService* InternetModel::ServiceForIndex( const QModelIndex& index) const { QModelIndex current_index = index; while (current_index.isValid()) { InternetService* service = current_index.data(Role_Service).value(); if (service) { return service; } current_index = current_index.parent(); } return nullptr; } Qt::ItemFlags InternetModel::flags(const QModelIndex& index) const { Qt::ItemFlags flags = Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDropEnabled; if (IsPlayable(index)) { flags |= Qt::ItemIsDragEnabled; } return flags; } bool InternetModel::hasChildren(const QModelIndex& parent) const { if (parent.data(Role_CanLazyLoad).toBool()) return true; return QStandardItemModel::hasChildren(parent); } int InternetModel::rowCount(const QModelIndex& parent) const { if (parent.data(Role_CanLazyLoad).toBool()) { QStandardItem* item = itemFromIndex(parent); InternetService* service = ServiceForItem(item); if (service) { item->setData(false, Role_CanLazyLoad); service->LazyPopulate(item); } } return QStandardItemModel::rowCount(parent); } bool InternetModel::IsPlayable(const QModelIndex& index) const { QVariant behaviour = index.data(Role_PlayBehaviour); if (!behaviour.isValid()) return false; PlayBehaviour pb = PlayBehaviour(behaviour.toInt()); return (pb == PlayBehaviour_MultipleItems || pb == PlayBehaviour_SingleItem || pb == PlayBehaviour_UseSongLoader); } QStringList InternetModel::mimeTypes() const { return QStringList() << "text/uri-list"; } QMimeData* InternetModel::mimeData(const QModelIndexList& indexes) const { // Special case for when the user double clicked on a special item. if (indexes.count() == 1 && indexes[0].data(Role_PlayBehaviour).toInt() == PlayBehaviour_DoubleClickAction) { InternetModel::ServiceForIndex(indexes[0]) ->ItemDoubleClicked(itemFromIndex(indexes[0])); return nullptr; } if (indexes.count() == 1 && indexes[0].data(Role_Type).toInt() == Type_SmartPlaylist) { GeneratorPtr generator = InternetModel::ServiceForIndex(indexes[0]) ->CreateGenerator(itemFromIndex(indexes[0])); if (!generator) return nullptr; GeneratorMimeData* data = new GeneratorMimeData(generator); data->setData(LibraryModel::kSmartPlaylistsMimeType, QByteArray()); data->name_for_new_playlist_ = this->data(indexes.first()).toString(); return data; } QList urls; QModelIndexList new_indexes; QModelIndex last_valid_index; for (const QModelIndex& index : indexes) { if (!IsPlayable(index)) continue; last_valid_index = index; if (index.data(Role_PlayBehaviour).toInt() == PlayBehaviour_MultipleItems) { // Get children int row = 0; int column = 0; QModelIndex child = index.child(row, column); while (child.isValid()) { new_indexes << child; urls << child.data(Role_Url).toUrl(); child = index.child(++row, column); } } else { new_indexes = indexes; urls << index.data(Role_Url).toUrl(); } } if (urls.isEmpty()) return nullptr; InternetMimeData* data = new InternetMimeData(this); data->setUrls(urls); data->indexes = new_indexes; data->name_for_new_playlist_ = InternetModel::ServiceForIndex(last_valid_index)->name(); return data; } bool InternetModel::dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent) { if (action == Qt::IgnoreAction) { return false; } if (parent.data(Role_CanBeModified).toBool() || parent.parent().data(Role_CanBeModified).toBool()) { InternetModel::ServiceForIndex(parent)->DropMimeData(data, parent); } return true; } void InternetModel::ShowContextMenu( const QModelIndexList& selected_merged_model_indexes, const QModelIndex& current_merged_model_index, const QPoint& global_pos) { current_index_ = merged_model_->mapToSource(current_merged_model_index); selected_indexes_.clear(); for (const QModelIndex& index : selected_merged_model_indexes) { selected_indexes_ << merged_model_->mapToSource(index); } InternetService* service = ServiceForIndex(current_merged_model_index); if (service) service->ShowContextMenu(global_pos); } void InternetModel::ReloadSettings() { for (InternetService* service : sServices->values()) { service->ReloadSettings(); } } void InternetModel::UpdateServices() { QSettings s; s.beginGroup(kSettingsGroup); QStringList keys = s.childKeys(); for (const QString& service_name : keys) { InternetService* internet_service = ServiceByName(service_name); if (internet_service == nullptr) { continue; } bool setting_val = s.value(service_name).toBool(); // Only update if values are different if (setting_val == true && shown_services_[internet_service].shown == false) { ShowService(internet_service); } else if (setting_val == false && shown_services_[internet_service].shown == true) { HideService(internet_service); } } s.endGroup(); } int InternetModel::FindItemPosition(const QString& text) { int a = 0; int b = invisibleRootItem()->rowCount() - 1; while (a <= b) { int mid = a + (b - a) / 2; if (invisibleRootItem()->child(mid, 0)->text() < text) { a = mid + 1; } else { b = mid - 1; } } return a; } void InternetModel::ShowService(InternetService* service) { if (shown_services_[service].shown != true) { QStandardItem* item = shown_services_[service].item; int pos = FindItemPosition(item->text()); invisibleRootItem()->insertRow(pos, item); shown_services_[service].shown = true; } } void InternetModel::HideService(InternetService* service) { // Find and remove the root item that this service created for (int i = 0; i < invisibleRootItem()->rowCount(); ++i) { QStandardItem* item = invisibleRootItem()->child(i); if (!item || item->data(Role_Service).value() == service) { // Don't remove the standarditem behind the row invisibleRootItem()->takeRow(i); break; } } shown_services_[service].shown = false; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/internetmodel.h000066400000000000000000000163271260417502300257710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2009-2012, David Sansome Copyright 2010, 2014, John Maguire Copyright 2011-2012, Arnaud Bienner Copyright 2011, Tyler Rhodes Copyright 2014, Chocobozzz Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_CORE_INTERNETMODEL_H_ #define INTERNET_CORE_INTERNETMODEL_H_ #include "core/song.h" #include "library/librarymodel.h" #include "playlist/playlistitem.h" #include "ui/settingsdialog.h" #include "widgets/multiloadingindicator.h" class Application; class CoverProviders; class Database; class GlobalSearch; class MergedProxyModel; class PlayerInterface; class InternetService; class SettingsDialog; class TaskManager; #ifdef HAVE_LIBLASTFM class LastFMService; #endif class InternetModel : public QStandardItemModel { Q_OBJECT public: explicit InternetModel(Application* app, QObject* parent = nullptr); enum Role { // Services can use this role to distinguish between different types of // items that they add. The root item's type is automatically set to // Type_Service, but apart from that Services are free to define their own // values for this field (starting from TypeCount). Role_Type = Qt::UserRole + 1000, // If this is not set the item is not playable (ie. it can't be dragged to // the playlist). Otherwise it describes how this item is converted to // playlist items. See the PlayBehaviour enum for more details. Role_PlayBehaviour, // The URL of the media for this item. This is required if the // PlayBehaviour is set to PlayBehaviour_UseSongLoader. Role_Url, // The metadata used in the item that is added to the playlist if the // PlayBehaviour is set to PlayBehaviour_SingleItem. Ignored otherwise. Role_SongMetadata, // If this is set to true then the model will call the service's // LazyPopulate method when this item is expanded. Use this if your item's // children have to be downloaded or fetched remotely. Role_CanLazyLoad, // This is automatically set on the root item for a service. It contains // a pointer to an InternetService. Services should not set this field // themselves. Role_Service, // Setting this to true means that the item can be changed by user action // (e.g. changing remote playlists) Role_CanBeModified, RoleCount, Role_IsDivider = LibraryModel::Role_IsDivider, }; enum Type { Type_Service = 1, Type_Track, Type_UserPlaylist, Type_SmartPlaylist, TypeCount }; enum PlayBehaviour { // The item can't be played. This is the default. PlayBehaviour_None = 0, // This item's URL is passed through the normal song loader. This supports // loading remote playlists, remote files and local files. This is probably // the most sensible behaviour to use if you're just returning normal radio // stations. PlayBehaviour_UseSongLoader, // This item's URL, Title and Artist are used in the playlist. No special // behaviour occurs - the URL is just passed straight to gstreamer when // the user starts playing. PlayBehaviour_SingleItem, // This item's children have PlayBehaviour_SingleItem set. // This is used when dragging a playlist item for instance, to have all the // playlit's items info loaded in the mime data. PlayBehaviour_MultipleItems, // This item might not represent a song - the service's ItemDoubleClicked() // slot will get called instead to do some custom action. PlayBehaviour_DoubleClickAction, }; struct ServiceItem { QStandardItem* item; bool shown; }; // Needs to be static for InternetPlaylistItem::restore static InternetService* ServiceByName(const QString& name); static const char* kSettingsGroup; template static T* Service() { return static_cast(ServiceByName(T::kServiceName)); } // Add and remove services. Ownership is not transferred and the service // is not reparented. If the service is deleted it will be automatically // removed from the model. void AddService(InternetService* service); void RemoveService(InternetService* service); void HideService(InternetService* service); void ShowService(InternetService* service); // Add or remove the services according to the setting file void UpdateServices(); // Find the position where to insert this item. The list of services is // supposed to be alphabetically sorted. int FindItemPosition(const QString& text); // Returns the service that is a parent of this item. Works by walking up // the tree until it finds an item with Role_Service set. InternetService* ServiceForItem(const QStandardItem* item) const; InternetService* ServiceForIndex(const QModelIndex& index) const; // Returns true if the given item has a PlayBehaviour other than None. bool IsPlayable(const QModelIndex& index) const; // QAbstractItemModel Qt::ItemFlags flags(const QModelIndex& index) const; QStringList mimeTypes() const; QMimeData* mimeData(const QModelIndexList& indexes) const; bool dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent); bool hasChildren(const QModelIndex& parent) const; int rowCount(const QModelIndex& parent) const; void ShowContextMenu(const QModelIndexList& selected_merged_model_indexes, const QModelIndex& current_merged_model_index, const QPoint& global_pos); void ReloadSettings(); Application* app() const { return app_; } MergedProxyModel* merged_model() const { return merged_model_; } const QModelIndex& current_index() const { return current_index_; } const QModelIndexList& selected_indexes() const { return selected_indexes_; } const QMap shown_services() const { return shown_services_; } signals: void StreamError(const QString& message); void StreamMetadataFound(const QUrl& original_url, const Song& song); void AddToPlaylist(QMimeData* data); void ScrollToIndex(const QModelIndex& index); private slots: void ServiceDeleted(); private: QMap shown_services_; static QMap* sServices; Application* app_; MergedProxyModel* merged_model_; // Set when a context menu is requested, can be accessed by context menu // actions to do things to the current item. QModelIndexList selected_indexes_; QModelIndex current_index_; }; #endif // INTERNET_CORE_INTERNETMODEL_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/internetplaylistitem.cpp000066400000000000000000000067071260417502300277450ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2009-2011, David Sansome Copyright 2010, 2014, John Maguire Copyright 2011, Tyler Rhodes Copyright 2011, Arnaud Bienner Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "internet/core/internetplaylistitem.h" #include #include #include #include "internet/core/internetservice.h" #include "internet/core/internetmodel.h" #include "core/settingsprovider.h" #include "library/sqlrow.h" #include "playlist/playlistbackend.h" InternetPlaylistItem::InternetPlaylistItem(const QString& type) : PlaylistItem(type), set_service_icon_(false) {} InternetPlaylistItem::InternetPlaylistItem(InternetService* service, const Song& metadata) : PlaylistItem("Internet"), service_name_(service->name()), set_service_icon_(false), metadata_(metadata) { InitMetadata(); } bool InternetPlaylistItem::InitFromQuery(const SqlRow& query) { // The song tables gets joined first, plus one each for the song ROWIDs const int row = (Song::kColumns.count() + 1) * PlaylistBackend::kSongTableJoins; service_name_ = query.value(row + 1).toString(); metadata_.InitFromQuery(query, false, (Song::kColumns.count() + 1) * 3); InitMetadata(); return true; } InternetService* InternetPlaylistItem::service() const { InternetService* ret = InternetModel::ServiceByName(service_name_); if (ret && !set_service_icon_) { const_cast(this)->set_service_icon_ = true; QString icon = ret->Icon(); if (!icon.isEmpty()) { const_cast(this)->metadata_.set_art_manual(icon); } } return ret; } QVariant InternetPlaylistItem::DatabaseValue(DatabaseColumn column) const { switch (column) { case Column_InternetService: return service_name_; default: return PlaylistItem::DatabaseValue(column); } } void InternetPlaylistItem::InitMetadata() { if (metadata_.title().isEmpty()) metadata_.set_title(metadata_.url().toString()); metadata_.set_filetype(Song::Type_Stream); metadata_.set_valid(true); } Song InternetPlaylistItem::Metadata() const { if (!set_service_icon_) { // Get the icon if we don't have it already service(); } if (HasTemporaryMetadata()) return temp_metadata_; return metadata_; } QUrl InternetPlaylistItem::Url() const { return metadata_.url(); } PlaylistItem::Options InternetPlaylistItem::options() const { InternetService* s = service(); if (!s) return Default; return s->playlistitem_options(); } QList InternetPlaylistItem::actions() { InternetService* s = service(); if (!s) return QList(); return s->playlistitem_actions(metadata_); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/internetplaylistitem.h000066400000000000000000000034411260417502300274020ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2009-2011, David Sansome Copyright 2010, John Maguire Copyright 2011, Tyler Rhodes Copyright 2011, Arnaud Bienner Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_CORE_INTERNETPLAYLISTITEM_H_ #define INTERNET_CORE_INTERNETPLAYLISTITEM_H_ #include "core/song.h" #include "playlist/playlistitem.h" #include class InternetService; class InternetPlaylistItem : public PlaylistItem { public: explicit InternetPlaylistItem(const QString& type); InternetPlaylistItem(InternetService* service, const Song& metadata); Options options() const; QList actions(); bool InitFromQuery(const SqlRow& query); Song Metadata() const; QUrl Url() const; protected: QVariant DatabaseValue(DatabaseColumn) const; Song DatabaseSongMetadata() const { return metadata_; } private: void InitMetadata(); InternetService* service() const; private: QString service_name_; bool set_service_icon_; Song metadata_; }; #endif // INTERNET_CORE_INTERNETPLAYLISTITEM_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/internetservice.cpp000066400000000000000000000121101260417502300266460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2012, David Sansome Copyright 2011, Tyler Rhodes Copyright 2011, Paweł Bara Copyright 2012, Arnaud Bienner Copyright 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "internet/core/internetservice.h" #include #include #include #include #include #include #include #include "internet/core/internetmodel.h" #include "core/logging.h" #include "core/mergedproxymodel.h" #include "core/mimedata.h" #include "ui/iconloader.h" InternetService::InternetService(const QString& name, Application* app, InternetModel* model, QObject* parent) : QObject(parent), app_(app), model_(model), name_(name), append_to_playlist_(nullptr), replace_playlist_(nullptr), open_in_new_playlist_(nullptr), separator_(nullptr) {} void InternetService::ShowUrlBox(const QString& title, const QString& url) { QMessageBox url_box; url_box.setWindowTitle(title); url_box.setWindowIcon(QIcon(":/icon.png")); url_box.setText(url); url_box.setStandardButtons(QMessageBox::Ok); QPushButton* copy_to_clipboard_button = url_box.addButton(tr("Copy to clipboard"), QMessageBox::ActionRole); url_box.exec(); if (url_box.clickedButton() == copy_to_clipboard_button) { QApplication::clipboard()->setText(url); } } QList InternetService::GetPlaylistActions() { if (!separator_) { separator_ = new QAction(this); separator_->setSeparator(true); } return QList() << GetAppendToPlaylistAction() << GetReplacePlaylistAction() << GetOpenInNewPlaylistAction() << separator_; } QAction* InternetService::GetAppendToPlaylistAction() { if (!append_to_playlist_) { append_to_playlist_ = new QAction(IconLoader::Load("media-playback-start"), tr("Append to current playlist"), this); connect(append_to_playlist_, SIGNAL(triggered()), this, SLOT(AppendToPlaylist())); } return append_to_playlist_; } QAction* InternetService::GetReplacePlaylistAction() { if (!replace_playlist_) { replace_playlist_ = new QAction(IconLoader::Load("media-playback-start"), tr("Replace current playlist"), this); connect(replace_playlist_, SIGNAL(triggered()), this, SLOT(ReplacePlaylist())); } return replace_playlist_; } QAction* InternetService::GetOpenInNewPlaylistAction() { if (!open_in_new_playlist_) { open_in_new_playlist_ = new QAction(IconLoader::Load("document-new"), tr("Open in new playlist"), this); connect(open_in_new_playlist_, SIGNAL(triggered()), this, SLOT(OpenInNewPlaylist())); } return open_in_new_playlist_; } void InternetService::AddItemToPlaylist(const QModelIndex& index, AddMode add_mode) { AddItemsToPlaylist(QModelIndexList() << index, add_mode); } void InternetService::AddItemsToPlaylist(const QModelIndexList& indexes, AddMode add_mode) { QMimeData* data = model()->merged_model()->mimeData( model()->merged_model()->mapFromSource(indexes)); if (MimeData* mime_data = qobject_cast(data)) { mime_data->clear_first_ = add_mode == AddMode_Replace; mime_data->open_in_new_playlist_ = add_mode == AddMode_OpenInNew; } emit AddToPlaylistSignal(data); } void InternetService::AppendToPlaylist() { AddItemsToPlaylist(model()->selected_indexes(), AddMode_Append); } void InternetService::ReplacePlaylist() { AddItemsToPlaylist(model()->selected_indexes(), AddMode_Replace); } void InternetService::OpenInNewPlaylist() { AddItemsToPlaylist(model()->selected_indexes(), AddMode_OpenInNew); } QStandardItem* InternetService::CreateSongItem(const Song& song) { QStandardItem* item = new QStandardItem(song.PrettyTitleWithArtist()); item->setData(InternetModel::Type_Track, InternetModel::Role_Type); item->setData(QVariant::fromValue(song), InternetModel::Role_SongMetadata); item->setData(InternetModel::PlayBehaviour_SingleItem, InternetModel::Role_PlayBehaviour); item->setData(song.url(), InternetModel::Role_Url); return item; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/internetservice.h000066400000000000000000000115611260417502300263240ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2009-2012, David Sansome Copyright 2010, 2014, John Maguire Copyright 2011-2012, Arnaud Bienner Copyright 2011, Tyler Rhodes Copyright 2011, Paweł Bara Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_CORE_INTERNETSERVICE_H_ #define INTERNET_CORE_INTERNETSERVICE_H_ #include #include #include #include "core/song.h" #include "playlist/playlistitem.h" #include "smartplaylists/generator.h" #include "ui/settingsdialog.h" #include "widgets/multiloadingindicator.h" class Application; class InternetModel; class LibraryFilterWidget; class QStandardItem; class InternetService : public QObject { Q_OBJECT public: // Constructs a new internet service with the given name and model. The name // should be user-friendly (like 'DigitallyImported' or 'Last.fm'). InternetService(const QString& name, Application* app, InternetModel* model, QObject* parent = nullptr); virtual ~InternetService() {} // Convenient method that shows URL in a QMessageBox. Used by several Internet // services static void ShowUrlBox(const QString& title, const QString& url); QString name() const { return name_; } InternetModel* model() const { return model_; } virtual QStandardItem* CreateRootItem() = 0; virtual void LazyPopulate(QStandardItem* parent) = 0; virtual bool has_initial_load_settings() const { return false; } virtual void InitialLoadSettings() {} virtual void ShowContextMenu(const QPoint& global_pos) {} virtual void ItemDoubleClicked(QStandardItem* item) {} // Create a generator for smart playlists virtual smart_playlists::GeneratorPtr CreateGenerator(QStandardItem* item) { return smart_playlists::GeneratorPtr(); } // Give the service a chance to do a custom action when data is dropped on it virtual void DropMimeData(const QMimeData* data, const QModelIndex& index) {} virtual PlaylistItem::Options playlistitem_options() const { return PlaylistItem::Default; } // Redefine this function to add service' specific actions to the playlist // item virtual QList playlistitem_actions(const Song& song) { return QList(); } virtual QWidget* HeaderWidget() const { return nullptr; } virtual void ReloadSettings() {} virtual QString Icon() { return QString(); } signals: void StreamError(const QString& message); void StreamMetadataFound(const QUrl& original_url, const Song& song); void AddToPlaylistSignal(QMimeData* data); void ScrollToIndex(const QModelIndex& index); public slots: virtual void ShowConfig() {} private slots: void AppendToPlaylist(); void ReplacePlaylist(); void OpenInNewPlaylist(); protected: // Returns all the playlist insertion related QActions (see below). QList GetPlaylistActions(); // Returns the 'append to playlist' QAction. QAction* GetAppendToPlaylistAction(); // Returns the 'replace playlist' QAction. QAction* GetReplacePlaylistAction(); // Returns the 'open in new playlist' QAction. QAction* GetOpenInNewPlaylistAction(); // Describes how songs should be added to playlist. enum AddMode { // appends songs to the current playlist AddMode_Append, // clears the current playlist and then appends all songs to it AddMode_Replace, // creates a new, empty playlist and then adds all songs to it AddMode_OpenInNew }; // Adds the 'index' element to playlist using the 'add_mode' mode. void AddItemToPlaylist(const QModelIndex& index, AddMode add_mode); // Adds the 'indexes' elements to playlist using the 'add_mode' mode. void AddItemsToPlaylist(const QModelIndexList& indexes, AddMode add_mode); // Convenient function for creating a item representing a song. // Set some common properties (type=track, url, etc.) QStandardItem* CreateSongItem(const Song& song); protected: Application* app_; private: InternetModel* model_; QString name_; QAction* append_to_playlist_; QAction* replace_playlist_; QAction* open_in_new_playlist_; QAction* separator_; }; Q_DECLARE_METATYPE(InternetService*); #endif // INTERNET_CORE_INTERNETSERVICE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/internetshowsettingspage.cpp000066400000000000000000000052341260417502300306150ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Chocobozzz Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "internetshowsettingspage.h" #include "core/application.h" #include "ui/settingsdialog.h" #include "internet/core/internetservice.h" #include "internet/core/internetmodel.h" #include InternetShowSettingsPage::InternetShowSettingsPage(SettingsDialog* parent) : SettingsPage(parent), ui_(new Ui::InternetShowSettingsPage) { ui_->setupUi(this); ui_->sources->header()->setResizeMode(0, QHeaderView::Stretch); ui_->sources->header()->setResizeMode(1, QHeaderView::ResizeToContents); } void InternetShowSettingsPage::Load() { QMap shown_services = dialog()->app()->internet_model()->shown_services(); ui_->sources->clear(); for (auto service_it = shown_services.constBegin(); service_it != shown_services.constEnd(); service_it++) { QTreeWidgetItem* item = new QTreeWidgetItem; // Get the same text and the same icon as the service tree item->setText(0, service_it.value().item->text()); item->setIcon(0, service_it.value().item->icon()); Qt::CheckState check_state = service_it.value().shown == true ? Qt::Checked : Qt::Unchecked; item->setData(0, Qt::CheckStateRole, check_state); /* We have to store the constant name of the service */ item->setData(1, Qt::UserRole, service_it.key()->name()); ui_->sources->invisibleRootItem()->addChild(item); } ui_->sources->invisibleRootItem()->sortChildren(0, Qt::AscendingOrder); } void InternetShowSettingsPage::Save() { QSettings s; s.beginGroup(InternetModel::kSettingsGroup); for (int i = 0; i < ui_->sources->invisibleRootItem()->childCount(); ++i) { QTreeWidgetItem* item = ui_->sources->invisibleRootItem()->child(i); s.setValue(item->data(1, Qt::UserRole).toString(), (item->data(0, Qt::CheckStateRole).toBool())); } s.endGroup(); dialog()->app()->internet_model()->UpdateServices(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/internetshowsettingspage.h000066400000000000000000000024601260417502300302600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Chocobozzz Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_CORE_INTERNETSHOWSETTINGSPAGE_H_ #define INTERNET_CORE_INTERNETSHOWSETTINGSPAGE_H_ #include "ui/settingspage.h" #include "ui_internetshowsettingspage.h" #include class QTreeWidgetItem; class Ui_InternetShowSettingsPage; class InternetShowSettingsPage : public SettingsPage { Q_OBJECT public: explicit InternetShowSettingsPage(SettingsDialog* dialog); void Load(); void Save(); private: std::unique_ptr ui_; }; #endif // INTERNET_CORE_INTERNETSHOWSETTINGSPAGE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/internetshowsettingspage.ui000066400000000000000000000045121260417502300304460ustar00rootroot00000000000000 InternetShowSettingsPage 0 0 654 506 Internet services :/icons/32x32/internet-services.png:/icons/32x32/internet-services.png Sources Choose the internet services you want to show. true Qt::ScrollBarAlwaysOff false 2 false false 1 2 sources clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/internetsongmimedata.h000066400000000000000000000023661260417502300273370ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, Arnaud Bienner Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_CORE_INTERNETSONGMIMEDATA_H_ #define INTERNET_CORE_INTERNETSONGMIMEDATA_H_ #include "core/mimedata.h" #include "core/song.h" class InternetService; class InternetSongMimeData : public MimeData { Q_OBJECT public: explicit InternetSongMimeData(InternetService* _service) : service(_service) {} InternetService* service; SongList songs; }; #endif // INTERNET_CORE_INTERNETSONGMIMEDATA_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/internetview.cpp000066400000000000000000000044471260417502300261760ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2009-2010, 2012, David Sansome Copyright 2010, 2014, John Maguire Copyright 2011, Tyler Rhodes Copyright 2011, Arnaud Bienner Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "internetview.h" #include #include "internet/core/internetmodel.h" #include "core/mergedproxymodel.h" #include "library/libraryview.h" InternetView::InternetView(QWidget* parent) : AutoExpandingTreeView(parent) { setItemDelegate(new LibraryItemDelegate(this)); SetExpandOnReset(false); setAttribute(Qt::WA_MacShowFocusRect, false); setSelectionMode(QAbstractItemView::ExtendedSelection); } void InternetView::contextMenuEvent(QContextMenuEvent* e) { QModelIndex index = indexAt(e->pos()); if (!index.isValid()) return; MergedProxyModel* merged_model = static_cast(model()); InternetModel* internet_model = static_cast(merged_model->sourceModel()); internet_model->ShowContextMenu(selectionModel()->selectedRows(), index, e->globalPos()); } void InternetView::currentChanged(const QModelIndex& current, const QModelIndex&) { emit CurrentIndexChanged(current); } void InternetView::setModel(QAbstractItemModel* model) { AutoExpandingTreeView::setModel(model); if (MergedProxyModel* merged_model = qobject_cast(model)) { connect(merged_model, SIGNAL(SubModelReset(QModelIndex, QAbstractItemModel*)), SLOT(RecursivelyExpand(QModelIndex))); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/internetview.h000066400000000000000000000026761260417502300256450ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2009-2010, David Sansome Copyright 2011, Tyler Rhodes Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_CORE_INTERNETVIEW_H_ #define INTERNET_CORE_INTERNETVIEW_H_ #include "widgets/autoexpandingtreeview.h" class InternetView : public AutoExpandingTreeView { Q_OBJECT public: explicit InternetView(QWidget* parent = nullptr); // QWidget void contextMenuEvent(QContextMenuEvent* e); // QTreeView void currentChanged(const QModelIndex& current, const QModelIndex& previous); void setModel(QAbstractItemModel* model); signals: void CurrentIndexChanged(const QModelIndex& index); }; #endif // INTERNET_CORE_INTERNETVIEW_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/internetviewcontainer.cpp000066400000000000000000000116061260417502300300740ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2012, David Sansome Copyright 2011, Tyler Rhodes Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "internetviewcontainer.h" #include "ui_internetviewcontainer.h" #include #include #include #include "internet/core/internetmodel.h" #include "internet/core/internetservice.h" #include "core/application.h" #include "core/mergedproxymodel.h" #include "globalsearch/globalsearch.h" const int InternetViewContainer::kAnimationDuration = 500; InternetViewContainer::InternetViewContainer(QWidget* parent) : QWidget(parent), ui_(new Ui_InternetViewContainer), app_(nullptr), current_service_(nullptr), current_header_(nullptr) { ui_->setupUi(this); connect(ui_->tree, SIGNAL(collapsed(QModelIndex)), SLOT(Collapsed(QModelIndex))); connect(ui_->tree, SIGNAL(expanded(QModelIndex)), SLOT(Expanded(QModelIndex))); connect(ui_->tree, SIGNAL(FocusOnFilterSignal(QKeyEvent*)), SLOT(FocusOnFilter(QKeyEvent*))); } InternetViewContainer::~InternetViewContainer() { delete ui_; } InternetView* InternetViewContainer::tree() const { return ui_->tree; } void InternetViewContainer::SetApplication(Application* app) { app_ = app; ui_->tree->setModel(app_->internet_model()->merged_model()); connect(ui_->tree->selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex)), SLOT(CurrentIndexChanged(QModelIndex))); } void InternetViewContainer::ServiceChanged(const QModelIndex& index) { InternetService* service = index.data(InternetModel::Role_Service).value(); if (!service || service == current_service_) return; current_service_ = service; QWidget* header = service->HeaderWidget(); if (header && !headers_.contains(header)) { header->setParent(ui_->header_container); header->setMaximumHeight(0); ui_->header_container->layout()->addWidget(header); header->show(); HeaderData d; d.visible_ = false; d.animation_ = new QTimeLine(kAnimationDuration, this); d.animation_->setFrameRange(0, header->sizeHint().height()); connect(d.animation_, SIGNAL(frameChanged(int)), SLOT(SetHeaderHeight(int))); headers_.insert(header, d); } SetHeaderVisible(current_header_, false); current_header_ = header; SetHeaderVisible(current_header_, true); } void InternetViewContainer::CurrentIndexChanged(const QModelIndex& index) { ServiceChanged(index); } void InternetViewContainer::Collapsed(const QModelIndex& index) { if (app_->internet_model()->merged_model()->mapToSource(index).model() == app_->internet_model() && index.data(InternetModel::Role_Type) == InternetModel::Type_Service) { SetHeaderVisible(current_header_, false); current_service_ = nullptr; current_header_ = nullptr; } } void InternetViewContainer::Expanded(const QModelIndex& index) { ServiceChanged(index); } void InternetViewContainer::SetHeaderVisible(QWidget* header, bool visible) { if (!header) return; HeaderData& d = headers_[header]; if (d.visible_ == visible) return; d.visible_ = visible; d.animation_->setDirection(visible ? QTimeLine::Forward : QTimeLine::Backward); d.animation_->start(); } void InternetViewContainer::FocusOnFilter(QKeyEvent* event) { // Beware: magic if (current_header_) { int slot = current_header_->metaObject()->indexOfSlot( QMetaObject::normalizedSignature("FocusOnFilter(QKeyEvent*)")); if (slot != -1) { current_header_->metaObject()->method(slot).invoke( current_header_, Q_ARG(QKeyEvent*, event)); } } } void InternetViewContainer::SetHeaderHeight(int height) { QTimeLine* animation = qobject_cast(sender()); QWidget* header = nullptr; for (QWidget* h : headers_.keys()) { if (headers_[h].animation_ == animation) { header = h; break; } } if (header) header->setMaximumHeight(height); } void InternetViewContainer::ScrollToIndex(const QModelIndex& index) { tree()->scrollTo(index, QTreeView::PositionAtCenter); tree()->setCurrentIndex(index); tree()->expand(index); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/internetviewcontainer.h000066400000000000000000000041161260417502300275370ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2012, David Sansome Copyright 2011, Tyler Rhodes Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_CORE_INTERNETVIEWCONTAINER_H_ #define INTERNET_CORE_INTERNETVIEWCONTAINER_H_ #include #include class Application; class InternetService; class InternetView; class LibraryFilterWidget; class Ui_InternetViewContainer; class QTimeLine; class QModelIndex; class InternetViewContainer : public QWidget { Q_OBJECT public: explicit InternetViewContainer(QWidget* parent = nullptr); ~InternetViewContainer(); static const int kAnimationDuration; void SetApplication(Application* app); InternetView* tree() const; public slots: void ScrollToIndex(const QModelIndex& index); private slots: void Collapsed(const QModelIndex& index); void Expanded(const QModelIndex& index); void CurrentIndexChanged(const QModelIndex& index); void SetHeaderHeight(int height); void FocusOnFilter(QKeyEvent* event); private: void ServiceChanged(const QModelIndex& index); void SetHeaderVisible(QWidget* header, bool visible); private: Ui_InternetViewContainer* ui_; Application* app_; InternetService* current_service_; QWidget* current_header_; struct HeaderData { bool visible_; QTimeLine* animation_; }; QMap headers_; }; #endif // INTERNET_CORE_INTERNETVIEWCONTAINER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/internetviewcontainer.ui000066400000000000000000000036001260417502300277220ustar00rootroot00000000000000 InternetViewContainer 0 0 424 395 Form 0 0 0 0 false true QAbstractItemView::DragDrop true 16 16 true true true InternetView QTreeView
internet/core/internetview.h
clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/localredirectserver.cpp000066400000000000000000000067301260417502300275130ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "localredirectserver.h" #include #include #include #include #include #include #include #include "core/closure.h" LocalRedirectServer::LocalRedirectServer(QObject* parent) : QObject(parent), server_(new QTcpServer(this)) {} void LocalRedirectServer::Listen() { server_->listen(QHostAddress::LocalHost); // We have to calculate this and store it now as the server port is cleared // once we close the socket. url_.setScheme("http"); url_.setHost("localhost"); url_.setPort(server_->serverPort()); url_.setPath("/"); connect(server_, SIGNAL(newConnection()), SLOT(NewConnection())); } void LocalRedirectServer::NewConnection() { QTcpSocket* socket = server_->nextPendingConnection(); server_->close(); QByteArray buffer; NewClosure(socket, SIGNAL(readyRead()), this, SLOT(ReadyRead(QTcpSocket*, QByteArray)), socket, buffer); } void LocalRedirectServer::ReadyRead(QTcpSocket* socket, QByteArray buffer) { buffer.append(socket->readAll()); if (socket->atEnd() || buffer.endsWith("\r\n\r\n")) { WriteTemplate(socket); socket->deleteLater(); request_url_ = ParseUrlFromRequest(buffer); emit Finished(); } else { NewClosure(socket, SIGNAL(readyRead()), this, SLOT(ReadyReady(QTcpSocket*, QByteArray)), socket, buffer); } } void LocalRedirectServer::WriteTemplate(QTcpSocket* socket) const { QFile page_file(":oauthsuccess.html"); page_file.open(QIODevice::ReadOnly); QString page_data = QString::fromUtf8(page_file.readAll()); QRegExp tr_regexp("tr\\(\"([^\"]+)\"\\)"); int offset = 0; forever { offset = tr_regexp.indexIn(page_data, offset); if (offset == -1) { break; } page_data.replace(offset, tr_regexp.matchedLength(), tr(tr_regexp.cap(1).toUtf8())); offset += tr_regexp.matchedLength(); } QBuffer image_buffer; image_buffer.open(QIODevice::ReadWrite); QApplication::style() ->standardIcon(QStyle::SP_DialogOkButton) .pixmap(16) .toImage() .save(&image_buffer, "PNG"); page_data.replace("@IMAGE_DATA@", image_buffer.data().toBase64()); socket->write("HTTP/1.0 200 OK\r\n"); socket->write("Content-type: text/html;charset=UTF-8\r\n"); socket->write("\r\n\r\n"); socket->write(page_data.toUtf8()); socket->flush(); } QUrl LocalRedirectServer::ParseUrlFromRequest(const QByteArray& request) const { QList lines = request.split('\r'); const QByteArray& request_line = lines[0]; QByteArray path = request_line.split(' ')[1]; QUrl base_url = url(); QUrl request_url(base_url.toString() + path.mid(1), QUrl::StrictMode); return request_url; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/localredirectserver.h000066400000000000000000000033141260417502300271530ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_CORE_LOCALREDIRECTSERVER_H_ #define INTERNET_CORE_LOCALREDIRECTSERVER_H_ #include #include #include class QTcpServer; class QTcpSocket; class LocalRedirectServer : public QObject { Q_OBJECT public: explicit LocalRedirectServer(QObject* parent = nullptr); // Causes the server to listen for _one_ request. void Listen(); // Returns the HTTP URL of this server. const QUrl& url() const { return url_; } // Returns the URL requested by the OAuth redirect. const QUrl& request_url() const { return request_url_; } signals: void Finished(); private slots: void NewConnection(); void ReadyRead(QTcpSocket* socket, QByteArray buffer); private: void WriteTemplate(QTcpSocket* socket) const; QUrl ParseUrlFromRequest(const QByteArray& request) const; private: QTcpServer* server_; QUrl url_; QUrl request_url_; }; #endif // INTERNET_CORE_LOCALREDIRECTSERVER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/oauthenticator.cpp000066400000000000000000000156521260417502300265040ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012-2014, John Maguire Copyright 2012, 2014, David Sansome Copyright 2014, Arnaud Bienner Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "internet/core/oauthenticator.h" #include #include #include #include #include #include "core/closure.h" #include "core/logging.h" #include "internet/core/localredirectserver.h" const char* OAuthenticator::kRemoteURL = "https://clementine-data.appspot.com/skydrive"; OAuthenticator::OAuthenticator(const QString& client_id, const QString& client_secret, RedirectStyle redirect, QObject* parent) : QObject(parent), client_id_(client_id), client_secret_(client_secret), redirect_style_(redirect) {} void OAuthenticator::StartAuthorisation(const QString& oauth_endpoint, const QString& token_endpoint, const QString& scope) { token_endpoint_ = QUrl(token_endpoint); LocalRedirectServer* server = new LocalRedirectServer(this); server->Listen(); QUrl url = QUrl(oauth_endpoint); url.addQueryItem("response_type", "code"); url.addQueryItem("client_id", client_id_); QUrl redirect_url; const QString port = QString::number(server->url().port()); if (redirect_style_ == RedirectStyle::REMOTE) { redirect_url = QUrl(kRemoteURL); redirect_url.addQueryItem("port", port); } else if (redirect_style_ == RedirectStyle::REMOTE_WITH_STATE) { redirect_url = QUrl(kRemoteURL); url.addQueryItem("state", port); } else { redirect_url = server->url(); } url.addQueryItem("redirect_uri", redirect_url.toString()); if (!scope.isEmpty()) { // Empty scope is valid for Dropbox. url.addQueryItem("scope", scope); } NewClosure(server, SIGNAL(Finished()), this, &OAuthenticator::RedirectArrived, server, redirect_url); QDesktopServices::openUrl(url); } void OAuthenticator::RedirectArrived(LocalRedirectServer* server, QUrl url) { server->deleteLater(); QUrl request_url = server->request_url(); qLog(Debug) << Q_FUNC_INFO << request_url; RequestAccessToken(request_url.queryItemValue("code").toUtf8(), url); } QByteArray OAuthenticator::ParseHttpRequest(const QByteArray& request) const { QList split = request.split('\r'); const QByteArray& request_line = split[0]; QByteArray path = request_line.split(' ')[1]; QByteArray code = path.split('=')[1]; return code; } void OAuthenticator::RequestAccessToken(const QByteArray& code, const QUrl& url) { typedef QPair Param; QList parameters; parameters << Param("code", code) << Param("client_id", client_id_) << Param("client_secret", client_secret_) << Param("grant_type", "authorization_code") // Even though we don't use this URI anymore, it must match the // original one. << Param("redirect_uri", url.toString()); QStringList params; for (const Param& p : parameters) { params.append(QString("%1=%2").arg( p.first, QString(QUrl::toPercentEncoding(p.second)))); } QString post_data = params.join("&"); qLog(Debug) << post_data; QNetworkRequest request = QNetworkRequest(QUrl(token_endpoint_)); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); QNetworkReply* reply = network_.post(request, post_data.toUtf8()); connect(reply, SIGNAL(sslErrors(QList)), SLOT(SslErrors(QList))); NewClosure(reply, SIGNAL(finished()), this, SLOT(FetchAccessTokenFinished(QNetworkReply*)), reply); } void OAuthenticator::FetchAccessTokenFinished(QNetworkReply* reply) { reply->deleteLater(); if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute) != 200) { qLog(Error) << "Failed to get access token" << reply->readAll(); return; } QJson::Parser parser; bool ok = false; QVariantMap result = parser.parse(reply, &ok).toMap(); if (!ok) { qLog(Error) << "Failed to parse oauth reply"; return; } qLog(Debug) << result; access_token_ = result["access_token"].toString(); refresh_token_ = result["refresh_token"].toString(); SetExpiryTime(result["expires_in"].toInt()); emit Finished(); } void OAuthenticator::RefreshAuthorisation(const QString& token_endpoint, const QString& refresh_token) { refresh_token_ = refresh_token; QUrl url(token_endpoint); typedef QPair Param; QList parameters; parameters << Param("client_id", client_id_) << Param("client_secret", client_secret_) << Param("grant_type", "refresh_token") << Param("refresh_token", refresh_token); QStringList params; for (const Param& p : parameters) { params.append(QString("%1=%2").arg( p.first, QString(QUrl::toPercentEncoding(p.second)))); } QString post_data = params.join("&"); QNetworkRequest request(url); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); QNetworkReply* reply = network_.post(request, post_data.toUtf8()); NewClosure(reply, SIGNAL(finished()), this, SLOT(RefreshAccessTokenFinished(QNetworkReply*)), reply); } void OAuthenticator::SetExpiryTime(int expires_in_seconds) { // Set the expiry time with two minutes' grace. expiry_time_ = QDateTime::currentDateTime().addSecs(expires_in_seconds - 120); qLog(Debug) << "Current oauth access token expires at:" << expiry_time_; } void OAuthenticator::RefreshAccessTokenFinished(QNetworkReply* reply) { reply->deleteLater(); QJson::Parser parser; bool ok = false; QVariantMap result = parser.parse(reply, &ok).toMap(); access_token_ = result["access_token"].toString(); if (result.contains("refresh_token")) { refresh_token_ = result["refresh_token"].toString(); } SetExpiryTime(result["expires_in"].toInt()); emit Finished(); } void OAuthenticator::SslErrors(const QList& errors) { for (const QSslError& error : errors) { qLog(Debug) << error.errorString(); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/oauthenticator.h000066400000000000000000000061101260417502300261360ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2012, 2014, John Maguire Copyright 2014, Arnaud Bienner Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_CORE_OAUTHENTICATOR_H_ #define INTERNET_CORE_OAUTHENTICATOR_H_ #include #include #include "core/network.h" class LocalRedirectServer; class QTcpSocket; class OAuthenticator : public QObject { Q_OBJECT public: enum class RedirectStyle { // Redirect to localhost immediately. LOCALHOST = 0, // Redirect via data.clementine-player.org for when localhost is // unsupported (eg. Skydrive). REMOTE = 1, // Same as REMOTE, but pass the 'port' parameter of the redirect URL as // 'state' parameter of the URL, for services which allow only redirect URL // without parameters (e.g. SoundCloud). "state" parameter will be added to // the redirect URL by the service itself. REMOTE_WITH_STATE = 2 }; OAuthenticator(const QString& client_id, const QString& client_secret, RedirectStyle redirect, QObject* parent = nullptr); void StartAuthorisation(const QString& oauth_endpoint, const QString& token_endpoint, const QString& scope); void RefreshAuthorisation(const QString& token_endpoint, const QString& refresh_token); // Token to use now. const QString& access_token() const { return access_token_; } // Token to use to get a new access token when it expires. const QString& refresh_token() const { return refresh_token_; } const QDateTime& expiry_time() const { return expiry_time_; } signals: void Finished(); private slots: void RedirectArrived(LocalRedirectServer* server, QUrl url); void FetchAccessTokenFinished(QNetworkReply* reply); void RefreshAccessTokenFinished(QNetworkReply* reply); void SslErrors(const QList& errors); private: static const char* kRemoteURL; QByteArray ParseHttpRequest(const QByteArray& request) const; void RequestAccessToken(const QByteArray& code, const QUrl& url); void SetExpiryTime(int expires_in_seconds); NetworkAccessManager network_; QString access_token_; QString refresh_token_; QDateTime expiry_time_; const QString client_id_; const QString client_secret_; QUrl token_endpoint_; RedirectStyle redirect_style_; }; #endif // INTERNET_CORE_OAUTHENTICATOR_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/scrobbler.h000066400000000000000000000033441260417502300250700ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_CORE_SCROBBLER_H_ #define INTERNET_CORE_SCROBBLER_H_ #include class Song; class Scrobbler : public QObject { Q_OBJECT public: explicit Scrobbler(QObject* parent = nullptr) {} virtual bool IsAuthenticated() const = 0; virtual bool IsScrobblingEnabled() const = 0; virtual bool AreButtonsVisible() const = 0; virtual bool IsScrobbleButtonVisible() const = 0; virtual bool PreferAlbumArtist() const = 0; public slots: virtual void NowPlaying(const Song& song) = 0; virtual void Scrobble() = 0; virtual void Love() = 0; virtual void ToggleScrobbling() = 0; virtual void ShowConfig() = 0; signals: void AuthenticationComplete(bool success, const QString& error_message); void ScrobblingEnabledChanged(bool value); void ButtonVisibilityChanged(bool value); void ScrobbleButtonVisibilityChanged(bool value); void ScrobbleSubmitted(); void ScrobbleError(int value); }; #endif // INTERNET_CORE_SCROBBLER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/searchboxwidget.cpp000066400000000000000000000046611260417502300266330ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, Arnaud Bienner Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Copyright 2014, Maltsev Vlad Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "internet/core/searchboxwidget.h" #include "ui_searchboxwidget.h" #include #include #include "internet/core/internetservice.h" #include "ui/iconloader.h" #include "widgets/didyoumean.h" SearchBoxWidget::SearchBoxWidget(InternetService* service) : service_(service), ui_(new Ui_SearchBoxWidget), menu_(new QMenu(tr("Display options"), this)) { ui_->setupUi(this); // Icons ui_->options->setIcon(IconLoader::Load("configure")); // Options menu menu_->setIcon(ui_->options->icon()); ui_->options->setMenu(menu_); menu_->addAction(IconLoader::Load("configure"), tr("Configure %1...").arg(service_->name()), service_, SLOT(ShowConfig())); ui_->filter->setPlaceholderText( QString("Search on %1").arg(service_->name())); connect(ui_->filter, SIGNAL(textChanged(QString)), SIGNAL(TextChanged(QString))); did_you_mean_ = new DidYouMean(ui_->filter, this); connect(did_you_mean_, SIGNAL(Accepted(QString)), ui_->filter, SLOT(setText(QString))); } SearchBoxWidget::~SearchBoxWidget() { delete ui_; } void SearchBoxWidget::FocusOnFilter(QKeyEvent* event) { ui_->filter->setFocus(Qt::OtherFocusReason); QApplication::sendEvent(ui_->filter, event); } void SearchBoxWidget::SetText(const QString& text) { ui_->filter->setText(text); } void SearchBoxWidget::keyReleaseEvent(QKeyEvent* e) { switch (e->key()) { case Qt::Key_Escape: ui_->filter->clear(); e->accept(); break; } QWidget::keyReleaseEvent(e); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/searchboxwidget.h000066400000000000000000000031711260417502300262730ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, Arnaud Bienner Copyright 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Copyright 2014, Maltsev Vlad Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_CORE_SEARCHBOXWIDGET_H_ #define INTERNET_CORE_SEARCHBOXWIDGET_H_ #include class InternetService; class DidYouMean; class Ui_SearchBoxWidget; class QActionGroup; class QMenu; class SearchBoxWidget : public QWidget { Q_OBJECT public: explicit SearchBoxWidget(InternetService* service); ~SearchBoxWidget(); DidYouMean* did_you_mean() { return did_you_mean_; } signals: void TextChanged(const QString& text); public slots: void FocusOnFilter(QKeyEvent* e); void SetText(const QString& text); protected: void keyReleaseEvent(QKeyEvent* e); private: InternetService* service_; Ui_SearchBoxWidget* ui_; QMenu* menu_; DidYouMean* did_you_mean_; }; #endif // INTERNET_CORE_SEARCHBOXWIDGET_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/core/searchboxwidget.ui000066400000000000000000000023111260417502300264540ustar00rootroot00000000000000 SearchBoxWidget 0 0 513 27 Form 0 0 16 16 QToolButton::InstantPopup true QSearchField QWidget
3rdparty/qocoa/qsearchfield.h
clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/digitally/000077500000000000000000000000001260417502300237705ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/digitally/digitallyimportedclient.cpp000066400000000000000000000135351260417502300314300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011-2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "digitallyimportedclient.h" #include #include #include #include "core/logging.h" #include "core/network.h" // The API used here is undocumented - it was reverse engineered by watching // calls made by the sky.fm (now RadioTunes) android app: // https://market.android.com/details?id=com.audioaddict.sky const char* DigitallyImportedClient::kApiUsername = "ephemeron"; const char* DigitallyImportedClient::kApiPassword = "dayeiph0ne@pp"; const char* DigitallyImportedClient::kAuthUrl = "http://api.audioaddict.com/v1/%1/members/authenticate"; const char* DigitallyImportedClient::kChannelListUrl = "http://api.v2.audioaddict.com/v1/%1/mobile/" "batch_update?asset_group_key=mobile_icons&stream_set_key="; DigitallyImportedClient::DigitallyImportedClient(const QString& service_name, QObject* parent) : QObject(parent), network_(new NetworkAccessManager(this)), service_name_(service_name) {} void DigitallyImportedClient::SetAuthorisationHeader( QNetworkRequest* req) const { req->setRawHeader("Authorization", "Basic " + QString("%1:%2") .arg(kApiUsername, kApiPassword) .toAscii() .toBase64()); } QNetworkReply* DigitallyImportedClient::Auth(const QString& username, const QString& password) { QNetworkRequest req(QUrl(QString(kAuthUrl).arg(service_name_))); SetAuthorisationHeader(&req); QByteArray postdata = "username=" + QUrl::toPercentEncoding(username) + "&password=" + QUrl::toPercentEncoding(password); return network_->post(req, postdata); } DigitallyImportedClient::AuthReply DigitallyImportedClient::ParseAuthReply( QNetworkReply* reply) const { AuthReply ret; ret.success_ = false; ret.error_reason_ = tr("Unknown error"); const int http_status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); if (http_status == 403) { ret.error_reason_ = reply->readAll(); return ret; } else if (http_status != 200) { return ret; } QJson::Parser parser; QVariantMap data = parser.parse(reply).toMap(); if (!data.contains("subscriptions")) { return ret; } QVariantList subscriptions = data.value("subscriptions", QVariantList()).toList(); if (subscriptions.isEmpty() || subscriptions[0].toMap().value("status").toString() != "active") { ret.error_reason_ = tr("You do not have an active subscription"); return ret; } if (!data.contains("first_name") || !data.contains("last_name") || !subscriptions[0].toMap().contains("expires_on") || !data.contains("listen_key")) return ret; ret.success_ = true; ret.first_name_ = data["first_name"].toString(); ret.last_name_ = data["last_name"].toString(); ret.expires_ = QDateTime::fromString( subscriptions[0].toMap()["expires_on"].toString(), Qt::ISODate); ret.listen_hash_ = data["listen_key"].toString(); return ret; } QNetworkReply* DigitallyImportedClient::GetChannelList() { // QNetworkRequest req(QUrl(QString(kChannelListUrl))); QNetworkRequest req(QUrl(QString(kChannelListUrl).arg(service_name_))); SetAuthorisationHeader(&req); return network_->get(req); } DigitallyImportedClient::ChannelList DigitallyImportedClient::ParseChannelList( QNetworkReply* reply) const { ChannelList ret; QJson::Parser parser; QVariantMap data = parser.parse(reply).toMap(); if (!data.contains("channel_filters")) return ret; QVariantList filters = data["channel_filters"].toList(); for (const QVariant& filter : filters) { // Find the filter called "All" QVariantMap filter_map = filter.toMap(); if (filter_map.value("name", QString()).toString() != "All") continue; // Add all its stations to the result QVariantList channels = filter_map.value("channels", QVariantList()).toList(); for (const QVariant& channel_var : channels) { QVariantMap channel_map = channel_var.toMap(); Channel channel; channel.art_url_ = QUrl(channel_map.value("asset_url").toString()); channel.description_ = channel_map.value("description").toString(); channel.director_ = channel_map.value("channel_director").toString(); channel.key_ = channel_map.value("key").toString(); channel.name_ = channel_map.value("name").toString(); ret << channel; } break; } return ret; } QDataStream& operator<<(QDataStream& out, const DigitallyImportedClient::Channel& channel) { out << channel.art_url_ << channel.director_ << channel.description_ << channel.name_ << channel.key_; return out; } QDataStream& operator>>(QDataStream& in, DigitallyImportedClient::Channel& channel) { in >> channel.art_url_ >> channel.director_ >> channel.description_ >> channel.name_ >> channel.key_; return in; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/digitally/digitallyimportedclient.h000066400000000000000000000050531260417502300310710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_DIGITALLY_DIGITALLYIMPORTEDCLIENT_H_ #define INTERNET_DIGITALLY_DIGITALLYIMPORTEDCLIENT_H_ #include #include #include #include class QNetworkAccessManager; class QNetworkReply; class QNetworkRequest; class DigitallyImportedClient : public QObject { Q_OBJECT public: explicit DigitallyImportedClient(const QString& service_name, QObject* parent = nullptr); static const char* kApiUsername; static const char* kApiPassword; static const char* kAuthUrl; static const char* kChannelListUrl; struct AuthReply { bool success_; // Set if success_ == false QString error_reason_; // Set if success_ == true QString first_name_; QString last_name_; QDateTime expires_; QString listen_hash_; }; struct Channel { QUrl art_url_; QString director_; QString description_; QString name_; QString key_; bool operator<(const Channel& other) const { return name_ < other.name_; } }; typedef QList ChannelList; QNetworkReply* Auth(const QString& username, const QString& password); AuthReply ParseAuthReply(QNetworkReply* reply) const; QNetworkReply* GetChannelList(); ChannelList ParseChannelList(QNetworkReply* reply) const; private: void SetAuthorisationHeader(QNetworkRequest* req) const; private: QNetworkAccessManager* network_; QString service_name_; }; QDataStream& operator<<(QDataStream& out, const DigitallyImportedClient::Channel& channel); QDataStream& operator>>(QDataStream& in, DigitallyImportedClient::Channel& channel); Q_DECLARE_METATYPE(DigitallyImportedClient::Channel) #endif // INTERNET_DIGITALLY_DIGITALLYIMPORTEDCLIENT_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/digitally/digitallyimportedservicebase.cpp000066400000000000000000000237731260417502300324520ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011-2012, David Sansome Copyright 2011-2012, 2014, John Maguire Copyright 2014, Arnaud Bienner Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "digitallyimportedservicebase.h" #include #include #include #include #include "digitallyimportedclient.h" #include "digitallyimportedurlhandler.h" #include "internet/core/internetmodel.h" #include "core/application.h" #include "core/closure.h" #include "core/logging.h" #include "core/network.h" #include "core/player.h" #include "core/taskmanager.h" #include "globalsearch/digitallyimportedsearchprovider.h" #include "globalsearch/globalsearch.h" #include "ui/iconloader.h" const char* DigitallyImportedServiceBase::kSettingsGroup = "digitally_imported"; const int DigitallyImportedServiceBase::kStreamsCacheDurationSecs = 60 * 60 * 24 * 14; // 2 weeks DigitallyImportedServiceBase::DigitallyImportedServiceBase( const QString& name, const QString& description, const QUrl& homepage_url, const QIcon& icon, const QString& api_service_name, Application* app, InternetModel* model, bool has_premium, QObject* parent) : InternetService(name, app, model, parent), homepage_url_(homepage_url), icon_(icon), service_description_(description), api_service_name_(api_service_name), network_(new NetworkAccessManager(this)), url_handler_(new DigitallyImportedUrlHandler(app, this)), basic_audio_type_(1), premium_audio_type_(2), has_premium_(has_premium), root_(nullptr), saved_channels_(kSettingsGroup, api_service_name, kStreamsCacheDurationSecs), api_client_(new DigitallyImportedClient(api_service_name, this)) { ReloadSettings(); model->app()->player()->RegisterUrlHandler(url_handler_); model->app()->global_search()->AddProvider( new DigitallyImportedSearchProvider(this, app_, this)); basic_playlists_ << "http://%1/public3/%2.pls" << "http://%1/public1/%2.pls" << "http://%1/public5/%2.asx"; premium_playlists_ << "http://%1/premium_high/%2.pls?hash=%3" << "http://%1/premium_medium/%2.pls?hash=%3" << "http://%1/premium/%2.pls?hash=%3" << "http://%1/premium_wma_low/%2.asx?hash=%3" << "http://%1/premium_wma/%2.asx?hash=%3"; } DigitallyImportedServiceBase::~DigitallyImportedServiceBase() {} QStandardItem* DigitallyImportedServiceBase::CreateRootItem() { root_ = new QStandardItem(icon_, service_description_); root_->setData(true, InternetModel::Role_CanLazyLoad); return root_; } void DigitallyImportedServiceBase::LazyPopulate(QStandardItem* parent) { if (parent == root_) { RefreshStreams(); } } void DigitallyImportedServiceBase::RefreshStreams() { if (IsChannelListStale()) { ForceRefreshStreams(); return; } PopulateStreams(); } void DigitallyImportedServiceBase::ForceRefreshStreams() { // Start a task to tell the user we're busy int task_id = app_->task_manager()->StartTask(tr("Getting streams")); QNetworkReply* reply = api_client_->GetChannelList(); NewClosure(reply, SIGNAL(finished()), this, SLOT(RefreshStreamsFinished(QNetworkReply*, int)), reply, task_id); } void DigitallyImportedServiceBase::RefreshStreamsFinished(QNetworkReply* reply, int task_id) { app_->task_manager()->SetTaskFinished(task_id); reply->deleteLater(); // Parse the list and sort by name DigitallyImportedClient::ChannelList channels = api_client_->ParseChannelList(reply); qSort(channels); saved_channels_.Update(channels); // Only update the item's children if it's already been populated if (!root_->data(InternetModel::Role_CanLazyLoad).toBool()) PopulateStreams(); emit StreamsChanged(); } void DigitallyImportedServiceBase::PopulateStreams() { if (root_->hasChildren()) root_->removeRows(0, root_->rowCount()); // Add each stream to the model for (const DigitallyImportedClient::Channel& channel : saved_channels_) { Song song; SongFromChannel(channel, &song); QStandardItem* item = new QStandardItem(QIcon(":/last.fm/icon_radio.png"), song.title()); item->setData(channel.description_, Qt::ToolTipRole); item->setData(InternetModel::PlayBehaviour_SingleItem, InternetModel::Role_PlayBehaviour); item->setData(QVariant::fromValue(song), InternetModel::Role_SongMetadata); root_->appendRow(item); } } void DigitallyImportedServiceBase::SongFromChannel( const DigitallyImportedClient::Channel& channel, Song* song) const { song->set_title(channel.name_); song->set_artist(service_description_ + " - " + channel.director_); song->set_url(QUrl(api_service_name_ + "://" + channel.key_)); song->set_art_automatic(channel.art_url_.toString()); } void DigitallyImportedServiceBase::Homepage() { QDesktopServices::openUrl(homepage_url_); } void DigitallyImportedServiceBase::ReloadSettings() { QSettings s; s.beginGroup(kSettingsGroup); basic_audio_type_ = s.value("basic_audio_type", 1).toInt(); premium_audio_type_ = s.value("premium_audio_type", 2).toInt(); username_ = s.value("username").toString(); listen_hash_ = s.value("listen_hash").toString(); saved_channels_.Load(); } void DigitallyImportedServiceBase::ShowContextMenu(const QPoint& global_pos) { if (!context_menu_) { context_menu_.reset(new QMenu); context_menu_->addActions(GetPlaylistActions()); context_menu_->addAction(IconLoader::Load("download"), tr("Open %1 in browser").arg(homepage_url_.host()), this, SLOT(Homepage())); context_menu_->addAction(IconLoader::Load("view-refresh"), tr("Refresh streams"), this, SLOT(ForceRefreshStreams())); context_menu_->addSeparator(); context_menu_->addAction(IconLoader::Load("configure"), tr("Configure..."), this, SLOT(ShowSettingsDialog())); } context_menu_->popup(global_pos); } bool DigitallyImportedServiceBase::is_premium_account() const { return has_premium_ && !listen_hash_.isEmpty(); } void DigitallyImportedServiceBase::LoadPlaylistFinished(QNetworkReply* reply) { reply->deleteLater(); if (reply->header(QNetworkRequest::ContentTypeHeader).toString() == "text/html") { url_handler_->CancelTask(); emit StreamError(tr("Error loading di.fm playlist")); } else { url_handler_->LoadPlaylistFinished(reply); } } void DigitallyImportedServiceBase::ShowSettingsDialog() { app_->OpenSettingsDialogAtPage(SettingsDialog::Page_DigitallyImported); } DigitallyImportedClient::ChannelList DigitallyImportedServiceBase::Channels() { if (IsChannelListStale()) { metaObject()->invokeMethod(this, "ForceRefreshStreams", Qt::QueuedConnection); } return saved_channels_; } void DigitallyImportedServiceBase::LoadStation(const QString& key) { QUrl playlist_url; // Replace "www." with "listen." in the hostname. const QString host = "listen." + homepage_url_.host().remove("www."); if (is_premium_account()) { playlist_url = QUrl( premium_playlists_[premium_audio_type_].arg(host, key, listen_hash_)); } else { playlist_url = QUrl(basic_playlists_[basic_audio_type_].arg(host, key)); } qLog(Debug) << "Getting playlist URL" << playlist_url; QNetworkReply* reply = network_->get(QNetworkRequest(playlist_url)); NewClosure(reply, SIGNAL(finished()), this, SLOT(LoadPlaylistFinished(QNetworkReply*)), reply); } DigitallyImportedService::DigitallyImportedService(Application* app, InternetModel* model, QObject* parent) : DigitallyImportedServiceBase("DigitallyImported", "Digitally Imported", QUrl("http://www.di.fm"), QIcon(":/providers/digitallyimported.png"), "di", app, model, true, parent) {} RadioTunesService::RadioTunesService(Application* app, InternetModel* model, QObject* parent) : DigitallyImportedServiceBase("RadioTunes", "RadioTunes.com", QUrl("http://www.radiotunes.com/"), QIcon(":/providers/radiotunes.png"), "radiotunes", app, model, true, parent) {} JazzRadioService::JazzRadioService(Application* app, InternetModel* model, QObject* parent) : DigitallyImportedServiceBase("JazzRadio", "JAZZRADIO.com", QUrl("http://www.jazzradio.com"), QIcon(":/providers/jazzradio.png"), "jazzradio", app, model, true, parent) {} RockRadioService::RockRadioService(Application* app, InternetModel* model, QObject* parent) : DigitallyImportedServiceBase("RockRadio", "ROCKRADIO.com", QUrl("http://www.rockradio.com"), QIcon(":/providers/rockradio.png"), "rockradio", app, model, false, parent) {} clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/digitally/digitallyimportedservicebase.h000066400000000000000000000104111260417502300321000ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011-2012, David Sansome Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_DIGITALLY_DIGITALLYIMPORTEDSERVICEBASE_H_ #define INTERNET_DIGITALLY_DIGITALLYIMPORTEDSERVICEBASE_H_ #include #include "digitallyimportedclient.h" #include "internet/core/internetservice.h" #include "core/cachedlist.h" class DigitallyImportedClient; class DigitallyImportedUrlHandler; class QNetworkAccessManager; class DigitallyImportedServiceBase : public InternetService { Q_OBJECT friend class DigitallyImportedUrlHandler; public: DigitallyImportedServiceBase(const QString& name, const QString& description, const QUrl& homepage_url, const QIcon& icon, const QString& api_service_name, Application* app, InternetModel* model, bool has_premium, QObject* parent = nullptr); ~DigitallyImportedServiceBase(); static const char* kSettingsGroup; static const int kStreamsCacheDurationSecs; QStandardItem* CreateRootItem(); void LazyPopulate(QStandardItem* parent); void ShowContextMenu(const QPoint& global_pos); void ReloadSettings(); bool is_premium_account() const; const QUrl& homepage_url() const { return homepage_url_; } const QIcon& icon() const { return icon_; } const QString& service_description() const { return service_description_; } const QString& api_service_name() const { return api_service_name_; } bool IsChannelListStale() const { return saved_channels_.IsStale(); } DigitallyImportedClient::ChannelList Channels(); void SongFromChannel(const DigitallyImportedClient::Channel& channel, Song* song) const; public slots: void ShowSettingsDialog(); signals: void StreamsChanged(); private slots: void LoadPlaylistFinished(QNetworkReply* reply); void Homepage(); void ForceRefreshStreams(); void RefreshStreams(); void RefreshStreamsFinished(QNetworkReply* reply, int task_id); private: void PopulateStreams(); void LoadStation(const QString& key); private: // Set by subclasses through the constructor QUrl homepage_url_; QIcon icon_; QString service_description_; QString api_service_name_; QStringList basic_playlists_; QStringList premium_playlists_; QNetworkAccessManager* network_; DigitallyImportedUrlHandler* url_handler_; int basic_audio_type_; int premium_audio_type_; QString username_; QString listen_hash_; bool has_premium_; // Does the service has premium features? QStandardItem* root_; std::unique_ptr context_menu_; QStandardItem* context_item_; CachedList saved_channels_; DigitallyImportedClient* api_client_; }; class DigitallyImportedService : public DigitallyImportedServiceBase { public: DigitallyImportedService(Application* app, InternetModel* model, QObject* parent = nullptr); }; class RadioTunesService : public DigitallyImportedServiceBase { public: RadioTunesService(Application* app, InternetModel* model, QObject* parent = nullptr); }; class JazzRadioService : public DigitallyImportedServiceBase { public: JazzRadioService(Application* app, InternetModel* model, QObject* parent = nullptr); }; class RockRadioService : public DigitallyImportedServiceBase { public: RockRadioService(Application* app, InternetModel* model, QObject* parent = nullptr); }; #endif // INTERNET_DIGITALLY_DIGITALLYIMPORTEDSERVICEBASE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/digitally/digitallyimportedsettingspage.cpp000066400000000000000000000120161260417502300326400ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "digitallyimportedsettingspage.h" #include "ui_digitallyimportedsettingspage.h" #include #include #include #include "digitallyimportedclient.h" #include "digitallyimportedservicebase.h" #include "core/closure.h" DigitallyImportedSettingsPage::DigitallyImportedSettingsPage( SettingsDialog* dialog) : SettingsPage(dialog), ui_(new Ui_DigitallyImportedSettingsPage), client_(new DigitallyImportedClient("di", this)) { ui_->setupUi(this); setWindowIcon(QIcon(":/providers/digitallyimported-32.png")); connect(ui_->login_state, SIGNAL(LogoutClicked()), SLOT(Logout())); connect(ui_->login_state, SIGNAL(LoginClicked()), SLOT(Login())); connect(ui_->login, SIGNAL(clicked()), SLOT(Login())); ui_->login_state->AddCredentialField(ui_->username); ui_->login_state->AddCredentialField(ui_->password); ui_->login_state->AddCredentialGroup(ui_->credential_group); ui_->login_state->SetAccountTypeText( tr("You can listen for free without an account, but Premium members can " "listen to higher quality streams without advertisements.")); ui_->login_state->SetAccountTypeVisible(true); } DigitallyImportedSettingsPage::~DigitallyImportedSettingsPage() { delete ui_; } void DigitallyImportedSettingsPage::Login() { ui_->login_state->SetLoggedIn(LoginStateWidget::LoginInProgress); QNetworkReply* reply = client_->Auth(ui_->username->text(), ui_->password->text()); NewClosure(reply, SIGNAL(finished()), this, SLOT(LoginFinished(QNetworkReply*)), reply); } void DigitallyImportedSettingsPage::LoginFinished(QNetworkReply* reply) { reply->deleteLater(); DigitallyImportedClient::AuthReply result = client_->ParseAuthReply(reply); QString name = QString("%1 %2").arg(result.first_name_, result.last_name_); UpdateLoginState(result.listen_hash_, name, result.expires_); if (result.success_) { // Clear the password field just to be sure ui_->password->clear(); // Save the listen key and account information QSettings s; s.beginGroup(DigitallyImportedServiceBase::kSettingsGroup); s.setValue("listen_hash", result.listen_hash_); s.setValue("full_name", name); s.setValue("expires", result.expires_); } else { QMessageBox::warning(this, tr("Authentication failed"), result.error_reason_); } } void DigitallyImportedSettingsPage::UpdateLoginState(const QString& listen_hash, const QString& name, const QDateTime& expires) { if (listen_hash.isEmpty()) { ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedOut); ui_->login_state->SetExpires(QDate()); ui_->login_state->SetAccountTypeVisible(true); } else { ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedIn, name); ui_->login_state->SetExpires(expires.date()); ui_->login_state->SetAccountTypeVisible(false); } ui_->premium_audio_type->setEnabled(!listen_hash.isEmpty()); ui_->premium_audio_label->setEnabled(!listen_hash.isEmpty()); } void DigitallyImportedSettingsPage::Logout() { QSettings s; s.beginGroup(DigitallyImportedServiceBase::kSettingsGroup); s.setValue("listen_hash", QString()); s.setValue("full_name", QString()); s.setValue("expires", QDateTime()); UpdateLoginState(QString(), QString(), QDateTime()); } void DigitallyImportedSettingsPage::Load() { QSettings s; s.beginGroup(DigitallyImportedServiceBase::kSettingsGroup); ui_->basic_audio_type->setCurrentIndex( s.value("basic_audio_type", 1).toInt()); ui_->premium_audio_type->setCurrentIndex( s.value("premium_audio_type", 2).toInt()); ui_->username->setText(s.value("username").toString()); UpdateLoginState(s.value("listen_hash").toString(), s.value("full_name").toString(), s.value("expires").toDateTime()); } void DigitallyImportedSettingsPage::Save() { QSettings s; s.beginGroup(DigitallyImportedServiceBase::kSettingsGroup); s.setValue("basic_audio_type", ui_->basic_audio_type->currentIndex()); s.setValue("premium_audio_type", ui_->premium_audio_type->currentIndex()); s.setValue("username", ui_->username->text()); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/digitally/digitallyimportedsettingspage.h000066400000000000000000000032401260417502300323040ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011-2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_DIGITALLY_DIGITALLYIMPORTEDSETTINGSPAGE_H_ #define INTERNET_DIGITALLY_DIGITALLYIMPORTEDSETTINGSPAGE_H_ #include "ui/settingspage.h" class DigitallyImportedClient; class Ui_DigitallyImportedSettingsPage; class QNetworkReply; class DigitallyImportedSettingsPage : public SettingsPage { Q_OBJECT public: explicit DigitallyImportedSettingsPage(SettingsDialog* dialog); ~DigitallyImportedSettingsPage(); void Load(); void Save(); private slots: void Login(); void Logout(); void LoginFinished(QNetworkReply* reply); private: void UpdateLoginState(const QString& listen_hash, const QString& name, const QDateTime& expires); private: Ui_DigitallyImportedSettingsPage* ui_; DigitallyImportedClient* client_; }; #endif // INTERNET_DIGITALLY_DIGITALLYIMPORTEDSETTINGSPAGE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/digitally/digitallyimportedsettingspage.ui000066400000000000000000000123401260417502300324730ustar00rootroot00000000000000 DigitallyImportedSettingsPage 0 0 715 425 Digitally Imported 0 0 Account details (Premium) Digitally Imported username Login Digitally Imported password QLineEdit::Password <a href="http://www.di.fm/premium/">Upgrade to Premium now</a> true Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse 0 0 Preferences Basic audio type MP3 96k AAC 32k Windows Media 40k Premium audio type MP3 256k AAC 64k AAC 128k Windows Media 64k Windows Media 128k Qt::Vertical 20 166 LoginStateWidget QWidget
widgets/loginstatewidget.h
1
username password login basic_audio_type
clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/digitally/digitallyimportedurlhandler.cpp000066400000000000000000000062461260417502300323130ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011-2012, David Sansome Copyright 2012, Arnaud Bienner Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "digitallyimportedurlhandler.h" #include "digitallyimportedservicebase.h" #include "internet/core/internetmodel.h" #include "core/application.h" #include "core/logging.h" #include "core/taskmanager.h" #include "playlistparsers/playlistparser.h" DigitallyImportedUrlHandler::DigitallyImportedUrlHandler( Application* app, DigitallyImportedServiceBase* service) : UrlHandler(service), app_(app), service_(service), task_id_(-1) {} QString DigitallyImportedUrlHandler::scheme() const { return service_->api_service_name(); } QIcon DigitallyImportedUrlHandler::icon() const { if (scheme() == "di") { return QIcon(":providers/digitallyimported.png"); } else if (scheme() == "radiotunes") { return QIcon(":providers/radiotunes.png"); } else if (scheme() == "jazzradio") { return QIcon(":providers/jazzradio.png"); } else if (scheme() == "rockradio") { return QIcon(":providers/rockradio.png"); } return QIcon(); } UrlHandler::LoadResult DigitallyImportedUrlHandler::StartLoading( const QUrl& url) { LoadResult ret(url); if (task_id_ != -1) { return ret; } // Start loading the station const QString key = url.host(); qLog(Info) << "Loading station" << key; service_->LoadStation(key); // Save the URL so we can emit it in the finished signal later last_original_url_ = url; // Tell the user what's happening task_id_ = app_->task_manager()->StartTask(tr("Loading stream")); ret.type_ = LoadResult::WillLoadAsynchronously; return ret; } void DigitallyImportedUrlHandler::LoadPlaylistFinished(QIODevice* device) { if (task_id_ == -1) { return; } // Stop the spinner in the status bar CancelTask(); // Try to parse the playlist PlaylistParser parser(nullptr); QList songs = parser.LoadFromDevice(device); qLog(Info) << "Loading station finished, got" << songs.count() << "songs"; // Failed to get playlist? if (songs.count() == 0) { service_->StreamError(tr("Error loading di.fm playlist")); emit AsyncLoadComplete(LoadResult(last_original_url_)); return; } emit AsyncLoadComplete(LoadResult( last_original_url_, LoadResult::TrackAvailable, songs[0].url())); } void DigitallyImportedUrlHandler::CancelTask() { app_->task_manager()->SetTaskFinished(task_id_); task_id_ = -1; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/digitally/digitallyimportedurlhandler.h000066400000000000000000000030651260417502300317540ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011-2012, David Sansome Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_DIGITALLY_DIGITALLYIMPORTEDURLHANDLER_H_ #define INTERNET_DIGITALLY_DIGITALLYIMPORTEDURLHANDLER_H_ #include "core/urlhandler.h" class Application; class DigitallyImportedServiceBase; class DigitallyImportedUrlHandler : public UrlHandler { public: DigitallyImportedUrlHandler(Application* app, DigitallyImportedServiceBase* service); QString scheme() const; QIcon icon() const; LoadResult StartLoading(const QUrl& url); void CancelTask(); void LoadPlaylistFinished(QIODevice* device); private: Application* app_; DigitallyImportedServiceBase* service_; int task_id_; QUrl last_original_url_; }; #endif // INTERNET_DIGITALLY_DIGITALLYIMPORTEDURLHANDLER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/dropbox/000077500000000000000000000000001260417502300234635ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/dropbox/dropboxservice.cpp000066400000000000000000000174301260417502300272320ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012-2014, John Maguire Copyright 2013, Martin Brodbeck Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "dropboxservice.h" #include #include #include #include "core/application.h" #include "core/logging.h" #include "core/network.h" #include "core/player.h" #include "core/utilities.h" #include "core/waitforsignal.h" #include "internet/core/oauthenticator.h" #include "internet/dropbox/dropboxurlhandler.h" #include "library/librarybackend.h" using Utilities::ParseRFC822DateTime; const char* DropboxService::kServiceName = "Dropbox"; const char* DropboxService::kSettingsGroup = "Dropbox"; namespace { static const char* kServiceId = "dropbox"; static const char* kMediaEndpoint = "https://api.dropbox.com/1/media/dropbox/"; static const char* kDeltaEndpoint = "https://api.dropbox.com/1/delta"; static const char* kLongPollEndpoint = "https://api-notify.dropbox.com/1/longpoll_delta"; } // namespace DropboxService::DropboxService(Application* app, InternetModel* parent) : CloudFileService(app, parent, kServiceName, kServiceId, QIcon(":/providers/dropbox.png"), SettingsDialog::Page_Dropbox), network_(new NetworkAccessManager(this)) { QSettings settings; settings.beginGroup(kSettingsGroup); // OAuth2 version of dropbox auth token. access_token_ = settings.value("access_token2").toString(); app->player()->RegisterUrlHandler(new DropboxUrlHandler(this, this)); } bool DropboxService::has_credentials() const { return !access_token_.isEmpty(); } void DropboxService::Connect() { if (has_credentials()) { RequestFileList(); } else { ShowSettingsDialog(); } } void DropboxService::AuthenticationFinished(OAuthenticator* authenticator) { authenticator->deleteLater(); access_token_ = authenticator->access_token(); QSettings settings; settings.beginGroup(kSettingsGroup); settings.setValue("access_token2", access_token_); emit Connected(); RequestFileList(); } QByteArray DropboxService::GenerateAuthorisationHeader() { return QString("Bearer %1").arg(access_token_).toUtf8(); } void DropboxService::RequestFileList() { QSettings s; s.beginGroup(kSettingsGroup); QUrl url = QUrl(QString(kDeltaEndpoint)); if (s.contains("cursor")) { url.addQueryItem("cursor", s.value("cursor").toString()); } QNetworkRequest request(url); request.setRawHeader("Authorization", GenerateAuthorisationHeader()); QNetworkReply* reply = network_->post(request, QByteArray()); NewClosure(reply, SIGNAL(finished()), this, SLOT(RequestFileListFinished(QNetworkReply*)), reply); } void DropboxService::RequestFileListFinished(QNetworkReply* reply) { reply->deleteLater(); QJson::Parser parser; QVariantMap response = parser.parse(reply).toMap(); if (response.contains("reset") && response["reset"].toBool()) { qLog(Debug) << "Resetting Dropbox DB"; library_backend_->DeleteAll(); } QSettings settings; settings.beginGroup(kSettingsGroup); settings.setValue("cursor", response["cursor"].toString()); QVariantList contents = response["entries"].toList(); qLog(Debug) << "Delta found:" << contents.size(); for (const QVariant& c : contents) { QVariantList item = c.toList(); QString path = item[0].toString(); QUrl url; url.setScheme("dropbox"); url.setPath(path); if (item[1].isNull()) { // Null metadata indicates path deleted. qLog(Debug) << "Deleting:" << url; Song song = library_backend_->GetSongByUrl(url); if (song.is_valid()) { library_backend_->DeleteSongs(SongList() << song); } continue; } QVariantMap metadata = item[1].toMap(); if (metadata["is_dir"].toBool()) { continue; } // Workaround: Since Dropbox doesn't recognize Opus files and thus treats // them // as application/octet-stream, we overwrite the mime type here if (metadata["mime_type"].toString() == "application/octet-stream" && url.toString().endsWith(".opus")) metadata["mime_type"] = GuessMimeTypeForFile(url.toString()); if (ShouldIndexFile(url, metadata["mime_type"].toString())) { QNetworkReply* reply = FetchContentUrl(url); NewClosure(reply, SIGNAL(finished()), this, SLOT(FetchContentUrlFinished(QNetworkReply*, QVariantMap)), reply, metadata); } } if (response.contains("has_more") && response["has_more"].toBool()) { RequestFileList(); } else { // Long-poll wait for changes. LongPollDelta(); } } void DropboxService::LongPollDelta() { if (!has_credentials()) { // Might have been signed out by the user. return; } QSettings s; s.beginGroup(kSettingsGroup); QUrl request_url = QUrl(QString(kLongPollEndpoint)); if (s.contains("cursor")) { request_url.addQueryItem("cursor", s.value("cursor").toString()); } QNetworkRequest request(request_url); request.setRawHeader("Authorization", GenerateAuthorisationHeader()); QNetworkReply* reply = network_->get(request); NewClosure(reply, SIGNAL(finished()), this, SLOT(LongPollFinished(QNetworkReply*)), reply); } void DropboxService::LongPollFinished(QNetworkReply* reply) { reply->deleteLater(); QJson::Parser parser; QVariantMap response = parser.parse(reply).toMap(); if (response["changes"].toBool()) { // New changes, we should request deltas again. qLog(Debug) << "Detected new dropbox changes; fetching..."; RequestFileList(); } else { bool ok = false; int backoff_secs = response["backoff"].toInt(&ok); backoff_secs = ok ? backoff_secs : 0; QTimer::singleShot(backoff_secs * 1000, this, SLOT(LongPollDelta())); } } QNetworkReply* DropboxService::FetchContentUrl(const QUrl& url) { QUrl request_url = QUrl((QString(kMediaEndpoint))); request_url.setPath(request_url.path() + url.path().mid(1)); QNetworkRequest request(request_url); request.setRawHeader("Authorization", GenerateAuthorisationHeader()); return network_->post(request, QByteArray()); } void DropboxService::FetchContentUrlFinished(QNetworkReply* reply, const QVariantMap& data) { reply->deleteLater(); QJson::Parser parser; QVariantMap response = parser.parse(reply).toMap(); QFileInfo info(data["path"].toString()); QUrl url; url.setScheme("dropbox"); url.setPath(data["path"].toString()); Song song; song.set_url(url); song.set_etag(data["rev"].toString()); song.set_mtime(ParseRFC822DateTime(data["modified"].toString()).toTime_t()); song.set_title(info.fileName()); song.set_filesize(data["bytes"].toInt()); song.set_ctime(0); MaybeAddFileToDatabase(song, data["mime_type"].toString(), QUrl::fromEncoded(response["url"].toByteArray()), QString::null); } QUrl DropboxService::GetStreamingUrlFromSongId(const QUrl& url) { QNetworkReply* reply = FetchContentUrl(url); WaitForSignal(reply, SIGNAL(finished())); QJson::Parser parser; QVariantMap response = parser.parse(reply).toMap(); return QUrl::fromEncoded(response["url"].toByteArray()); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/dropbox/dropboxservice.h000066400000000000000000000036121260417502300266740ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012-2013, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_DROPBOX_DROPBOXSERVICE_H_ #define INTERNET_DROPBOX_DROPBOXSERVICE_H_ #include "internet/core/cloudfileservice.h" #include "core/tagreaderclient.h" class NetworkAccessManager; class OAuthenticator; class QNetworkReply; class DropboxService : public CloudFileService { Q_OBJECT public: DropboxService(Application* app, InternetModel* parent); static const char* kServiceName; static const char* kSettingsGroup; virtual bool has_credentials() const; QUrl GetStreamingUrlFromSongId(const QUrl& url); signals: void Connected(); public slots: void Connect(); void AuthenticationFinished(OAuthenticator* authenticator); private slots: void RequestFileListFinished(QNetworkReply* reply); void FetchContentUrlFinished(QNetworkReply* reply, const QVariantMap& file); void LongPollFinished(QNetworkReply* reply); void LongPollDelta(); private: void RequestFileList(); QByteArray GenerateAuthorisationHeader(); QNetworkReply* FetchContentUrl(const QUrl& url); private: QString access_token_; NetworkAccessManager* network_; }; #endif // INTERNET_DROPBOX_DROPBOXSERVICE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/dropbox/dropboxsettingspage.cpp000066400000000000000000000065771260417502300303010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "dropboxsettingspage.h" #include "ui_dropboxsettingspage.h" #include "core/application.h" #include "internet/core/oauthenticator.h" #include "internet/dropbox/dropboxservice.h" #include "internet/core/internetmodel.h" #include "ui/settingsdialog.h" namespace { static const char* kOAuthEndpoint = "https://www.dropbox.com/1/oauth2/authorize"; static const char* kOAuthClientId = "qh6ca27eclt9p2k"; static const char* kOAuthClientSecret = "pg7y68h5efap8r6"; static const char* kOAuthTokenEndpoint = "https://api.dropboxapi.com/1/oauth2/token"; static const char* kOAuthScope = ""; } DropboxSettingsPage::DropboxSettingsPage(SettingsDialog* parent) : SettingsPage(parent), ui_(new Ui::DropboxSettingsPage), service_(dialog()->app()->internet_model()->Service()) { ui_->setupUi(this); ui_->login_state->AddCredentialGroup(ui_->login_container); connect(ui_->login_button, SIGNAL(clicked()), SLOT(LoginClicked())); connect(ui_->login_state, SIGNAL(LogoutClicked()), SLOT(LogoutClicked())); dialog()->installEventFilter(this); } DropboxSettingsPage::~DropboxSettingsPage() { delete ui_; } void DropboxSettingsPage::Load() { QSettings s; s.beginGroup(DropboxService::kSettingsGroup); const QString access_token = s.value("access_token2").toString(); if (!access_token.isEmpty()) { ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedIn); } } void DropboxSettingsPage::Save() { QSettings s; s.beginGroup(DropboxService::kSettingsGroup); } void DropboxSettingsPage::LoginClicked() { OAuthenticator* authenticator = new OAuthenticator(kOAuthClientId, kOAuthClientSecret, OAuthenticator::RedirectStyle::REMOTE_WITH_STATE); connect(authenticator, SIGNAL(Finished()), SLOT(Connected())); NewClosure(authenticator, SIGNAL(Finished()), service_, SLOT(AuthenticationFinished(OAuthenticator*)), authenticator); authenticator->StartAuthorisation(kOAuthEndpoint, kOAuthTokenEndpoint, kOAuthScope); ui_->login_button->setEnabled(false); } bool DropboxSettingsPage::eventFilter(QObject* object, QEvent* event) { if (object == dialog() && event->type() == QEvent::Enter) { ui_->login_button->setEnabled(true); return false; } return SettingsPage::eventFilter(object, event); } void DropboxSettingsPage::LogoutClicked() { ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedOut); QSettings s; s.beginGroup(DropboxService::kSettingsGroup); s.remove("access_token2"); } void DropboxSettingsPage::Connected() { ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedIn); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/dropbox/dropboxsettingspage.h000066400000000000000000000027331260417502300277340ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_DROPBOX_DROPBOXSETTINGSPAGE_H_ #define INTERNET_DROPBOX_DROPBOXSETTINGSPAGE_H_ #include "ui/settingspage.h" #include #include class DropboxService; class Ui_DropboxSettingsPage; class DropboxSettingsPage : public SettingsPage { Q_OBJECT public: explicit DropboxSettingsPage(SettingsDialog* parent = nullptr); ~DropboxSettingsPage(); void Load(); void Save(); // QObject bool eventFilter(QObject* object, QEvent* event) override; private slots: void LoginClicked(); void LogoutClicked(); void Connected(); private: Ui_DropboxSettingsPage* ui_; DropboxService* service_; }; #endif // INTERNET_DROPBOX_DROPBOXSETTINGSPAGE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/dropbox/dropboxsettingspage.ui000066400000000000000000000057021260417502300301210ustar00rootroot00000000000000 DropboxSettingsPage 0 0 569 491 Dropbox :/providers/dropbox.png:/providers/dropbox.png Clementine can play music that you have uploaded to Dropbox true 28 0 0 Login Qt::Horizontal 40 20 Clicking the Login button will open a web browser. You should return to Clementine after you have logged in. true Qt::Vertical 20 357 LoginStateWidget QWidget
widgets/loginstatewidget.h
1
clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/dropbox/dropboxurlhandler.cpp000066400000000000000000000022521260417502300277260ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "dropboxurlhandler.h" #include "internet/dropbox/dropboxservice.h" DropboxUrlHandler::DropboxUrlHandler(DropboxService* service, QObject* parent) : UrlHandler(parent), service_(service) {} UrlHandler::LoadResult DropboxUrlHandler::StartLoading(const QUrl& url) { return LoadResult(url, LoadResult::TrackAvailable, service_->GetStreamingUrlFromSongId(url)); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/dropbox/dropboxurlhandler.h000066400000000000000000000024661260417502300274020ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_DROPBOX_DROPBOXURLHANDLER_H_ #define INTERNET_DROPBOX_DROPBOXURLHANDLER_H_ #include "core/urlhandler.h" class DropboxService; class DropboxUrlHandler : public UrlHandler { Q_OBJECT public: explicit DropboxUrlHandler(DropboxService* service, QObject* parent = nullptr); QString scheme() const { return "dropbox"; } QIcon icon() const { return QIcon(":providers/dropbox.png"); } LoadResult StartLoading(const QUrl& url); private: DropboxService* service_; }; #endif // INTERNET_DROPBOX_DROPBOXURLHANDLER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/googledrive/000077500000000000000000000000001260417502300243145ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/googledrive/googledriveclient.cpp000066400000000000000000000200671260417502300305320ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, 2014, John Maguire Copyright 2012, 2014, David Sansome Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "googledriveclient.h" #include #include "internet/core/oauthenticator.h" #include "core/closure.h" #include "core/logging.h" #include "core/network.h" using namespace google_drive; const char* File::kFolderMimeType = "application/vnd.google-apps.folder"; namespace { static const char* kGoogleDriveFile = "https://www.googleapis.com/drive/v2/files/%1"; static const char* kGoogleDriveChanges = "https://www.googleapis.com/drive/v2/changes"; static const char* kGoogleOAuthUserInfoEndpoint = "https://www.googleapis.com/oauth2/v1/userinfo"; static const char* kOAuthEndpoint = "https://accounts.google.com/o/oauth2/auth"; static const char* kOAuthTokenEndpoint = "https://accounts.google.com/o/oauth2/token"; static const char* kOAuthScope = "https://www.googleapis.com/auth/drive.readonly " "https://www.googleapis.com/auth/userinfo.email"; static const char* kClientId = "679260893280.apps.googleusercontent.com"; static const char* kClientSecret = "l3cWb8efUZsrBI4wmY3uKl6i"; } // namespace QStringList File::parent_ids() const { QStringList ret; for (const QVariant& var : data_["parents"].toList()) { QVariantMap map(var.toMap()); if (map["isRoot"].toBool()) { ret << QString(); } else { ret << map["id"].toString(); } } return ret; } ConnectResponse::ConnectResponse(QObject* parent) : QObject(parent) {} GetFileResponse::GetFileResponse(const QString& file_id, QObject* parent) : QObject(parent), file_id_(file_id) {} ListChangesResponse::ListChangesResponse(const QString& cursor, QObject* parent) : QObject(parent), cursor_(cursor) {} Client::Client(QObject* parent) : QObject(parent), network_(new NetworkAccessManager(this)) {} ConnectResponse* Client::Connect(const QString& refresh_token) { ConnectResponse* ret = new ConnectResponse(this); OAuthenticator* oauth = new OAuthenticator( kClientId, kClientSecret, OAuthenticator::RedirectStyle::LOCALHOST, this); if (refresh_token.isEmpty()) { oauth->StartAuthorisation(kOAuthEndpoint, kOAuthTokenEndpoint, kOAuthScope); } else { oauth->RefreshAuthorisation(kOAuthTokenEndpoint, refresh_token); } NewClosure(oauth, SIGNAL(Finished()), this, SLOT(ConnectFinished(ConnectResponse*, OAuthenticator*)), ret, oauth); return ret; } void Client::ConnectFinished(ConnectResponse* response, OAuthenticator* oauth) { oauth->deleteLater(); access_token_ = oauth->access_token(); expiry_time_ = oauth->expiry_time(); response->refresh_token_ = oauth->refresh_token(); // Fetch user email. QUrl url(kGoogleOAuthUserInfoEndpoint); QNetworkRequest request(url); AddAuthorizationHeader(&request); QNetworkReply* reply = network_->get(request); NewClosure(reply, SIGNAL(finished()), this, SLOT(FetchUserInfoFinished(ConnectResponse*, QNetworkReply*)), response, reply); } void Client::FetchUserInfoFinished(ConnectResponse* response, QNetworkReply* reply) { reply->deleteLater(); if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute) != 200) { qLog(Warning) << "Failed to get user info" << reply->readAll(); } else { QJson::Parser parser; bool ok = false; QVariantMap result = parser.parse(reply, &ok).toMap(); if (!ok) { qLog(Error) << "Failed to parse user info reply"; return; } qLog(Debug) << result; response->user_email_ = result["email"].toString(); qLog(Debug) << response->user_email_; } emit response->Finished(); emit Authenticated(); } void Client::AddAuthorizationHeader(QNetworkRequest* request) const { request->setRawHeader("Authorization", QString("Bearer %1").arg(access_token_).toUtf8()); } GetFileResponse* Client::GetFile(const QString& file_id) { GetFileResponse* ret = new GetFileResponse(file_id, this); QUrl url(QString(kGoogleDriveFile).arg(file_id)); QNetworkRequest request = QNetworkRequest(url); AddAuthorizationHeader(&request); // Never cache these requests as we will get out of date download URLs. request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork); QNetworkReply* reply = network_->get(request); NewClosure(reply, SIGNAL(finished()), this, SLOT(GetFileFinished(GetFileResponse*, QNetworkReply*)), ret, reply); return ret; } void Client::GetFileFinished(GetFileResponse* response, QNetworkReply* reply) { reply->deleteLater(); QJson::Parser parser; bool ok = false; QVariantMap result = parser.parse(reply, &ok).toMap(); if (!ok) { qLog(Error) << "Failed to fetch file with ID" << response->file_id_; emit response->Finished(); return; } response->file_ = File(result); emit response->Finished(); } ListChangesResponse* Client::ListChanges(const QString& cursor) { ListChangesResponse* ret = new ListChangesResponse(cursor, this); MakeListChangesRequest(ret); return ret; } void Client::MakeListChangesRequest(ListChangesResponse* response, const QString& page_token) { QUrl url(kGoogleDriveChanges); if (!response->cursor().isEmpty()) { url.addQueryItem("startChangeId", response->cursor()); } if (!page_token.isEmpty()) { url.addQueryItem("pageToken", page_token); } qLog(Debug) << "Requesting changes at:" << response->cursor() << page_token; QNetworkRequest request(url); AddAuthorizationHeader(&request); QNetworkReply* reply = network_->get(request); NewClosure(reply, SIGNAL(finished()), this, SLOT(ListChangesFinished(ListChangesResponse*, QNetworkReply*)), response, reply); } void Client::ListChangesFinished(ListChangesResponse* response, QNetworkReply* reply) { reply->deleteLater(); QJson::Parser parser; bool ok = false; // TODO(John Maguire): Put this on a separate thread as the response could be large. QVariantMap result = parser.parse(reply, &ok).toMap(); if (!ok) { qLog(Error) << "Failed to fetch changes" << response->cursor(); emit response->Finished(); return; } if (result.contains("largestChangeId")) { response->next_cursor_ = result["largestChangeId"].toString(); } // Emit the FilesFound signal for the files in the response. FileList files; QList files_deleted; for (const QVariant& v : result["items"].toList()) { QVariantMap change = v.toMap(); if (change["deleted"].toBool() || change["file"].toMap()["labels"].toMap()["trashed"].toBool()) { QUrl url; url.setScheme("googledrive"); url.setPath(change["fileId"].toString()); files_deleted << url; } else { files << File(change["file"].toMap()); } } emit response->FilesFound(files); emit response->FilesDeleted(files_deleted); // Get the next page of results if there is one. if (result.contains("nextPageToken")) { MakeListChangesRequest(response, result["nextPageToken"].toString()); } else { emit response->Finished(); } } bool Client::is_authenticated() const { return !access_token_.isEmpty() && QDateTime::currentDateTime().secsTo(expiry_time_) > 0; } void Client::ForgetCredentials() { access_token_ = QString(); expiry_time_ = QDateTime(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/googledrive/googledriveclient.h000066400000000000000000000116361260417502300302010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_GOOGLEDRIVE_GOOGLEDRIVECLIENT_H_ #define INTERNET_GOOGLEDRIVE_GOOGLEDRIVECLIENT_H_ #include #include #include #include #include #include class OAuthenticator; class QNetworkAccessManager; class QNetworkReply; class QNetworkRequest; namespace google_drive { class Client; // Holds the metadata for a file on Google Drive. class File { public: explicit File(const QVariantMap& data = QVariantMap()) : data_(data) {} static const char* kFolderMimeType; QString id() const { return data_["id"].toString(); } QString etag() const { return data_["etag"].toString(); } QString title() const { return data_["title"].toString(); } QString mime_type() const { return data_["mimeType"].toString(); } QString description() const { return data_["description"].toString(); } qint64 size() const { return data_["fileSize"].toUInt(); } QUrl download_url() const { return data_["downloadUrl"].toUrl(); } QUrl alternate_link() const { return data_["alternateLink"].toUrl(); } QDateTime modified_date() const { return QDateTime::fromString(data_["modifiedDate"].toString(), Qt::ISODate); } QDateTime created_date() const { return QDateTime::fromString(data_["createdDate"].toString(), Qt::ISODate); } bool is_folder() const { return mime_type() == kFolderMimeType; } QStringList parent_ids() const; bool has_label(const QString& name) const { return data_["labels"].toMap()[name].toBool(); } bool is_starred() const { return has_label("starred"); } bool is_hidden() const { return has_label("hidden"); } bool is_trashed() const { return has_label("trashed"); } bool is_restricted() const { return has_label("restricted"); } bool is_viewed() const { return has_label("viewed"); } private: QVariantMap data_; }; typedef QList FileList; class ConnectResponse : public QObject { Q_OBJECT friend class Client; public: const QString& refresh_token() const { return refresh_token_; } const QString& user_email() const { return user_email_; } signals: void Finished(); private: explicit ConnectResponse(QObject* parent); QString refresh_token_; QString user_email_; }; class GetFileResponse : public QObject { Q_OBJECT friend class Client; public: const QString& file_id() const { return file_id_; } const File& file() const { return file_; } signals: void Finished(); private: GetFileResponse(const QString& file_id, QObject* parent); QString file_id_; File file_; }; class ListChangesResponse : public QObject { Q_OBJECT friend class Client; public: const QString& cursor() const { return cursor_; } const QString& next_cursor() const { return next_cursor_; } signals: void FilesFound(const QList& files); void FilesDeleted(const QList& files); void Finished(); private: ListChangesResponse(const QString& cursor, QObject* parent); QString cursor_; QString next_cursor_; }; class Client : public QObject { Q_OBJECT public: explicit Client(QObject* parent = nullptr); bool is_authenticated() const; const QString& access_token() const { return access_token_; } void ForgetCredentials(); ConnectResponse* Connect(const QString& refresh_token = QString()); GetFileResponse* GetFile(const QString& file_id); ListChangesResponse* ListChanges(const QString& cursor); signals: void Authenticated(); private slots: void ConnectFinished(ConnectResponse* response, OAuthenticator* oauth); void FetchUserInfoFinished(ConnectResponse* response, QNetworkReply* reply); void GetFileFinished(GetFileResponse* response, QNetworkReply* reply); void ListChangesFinished(ListChangesResponse* response, QNetworkReply* reply); private: void AddAuthorizationHeader(QNetworkRequest* request) const; void MakeListChangesRequest(ListChangesResponse* response, const QString& page_token = QString()); private: QNetworkAccessManager* network_; QString access_token_; QDateTime expiry_time_; }; } // namespace google_drive #endif // INTERNET_GOOGLEDRIVE_GOOGLEDRIVECLIENT_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/googledrive/googledriveservice.cpp000066400000000000000000000232571260417502300307200ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, 2014, John Maguire Copyright 2012, 2014, David Sansome Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "googledriveservice.h" #include #include #include #include #include #include #include #include "core/application.h" #include "core/closure.h" #include "core/database.h" #include "core/mergedproxymodel.h" #include "core/player.h" #include "core/timeconstants.h" #include "ui/albumcovermanager.h" #include "globalsearch/globalsearch.h" #include "globalsearch/librarysearchprovider.h" #include "library/librarybackend.h" #include "library/librarymodel.h" #include "playlist/playlist.h" #include "ui/iconloader.h" #include "googledriveclient.h" #include "googledriveurlhandler.h" #include "internet/core/internetmodel.h" const char* GoogleDriveService::kServiceName = "Google Drive"; const char* GoogleDriveService::kSettingsGroup = "GoogleDrive"; namespace { static const char* kDriveEditFileUrl = "https://docs.google.com/file/d/%1/edit"; static const char* kServiceId = "google_drive"; } GoogleDriveService::GoogleDriveService(Application* app, InternetModel* parent) : CloudFileService(app, parent, kServiceName, kServiceId, QIcon(":/providers/googledrive.png"), SettingsDialog::Page_GoogleDrive), client_(new google_drive::Client(this)), open_in_drive_action_(nullptr), update_action_(nullptr), full_rescan_action_(nullptr) { app->player()->RegisterUrlHandler(new GoogleDriveUrlHandler(this, this)); } bool GoogleDriveService::has_credentials() const { return !refresh_token().isEmpty(); } QString GoogleDriveService::refresh_token() const { QSettings s; s.beginGroup(kSettingsGroup); return s.value("refresh_token").toString(); } void GoogleDriveService::Connect() { google_drive::ConnectResponse* response = client_->Connect(refresh_token()); NewClosure(response, SIGNAL(Finished()), this, SLOT(ConnectFinished(google_drive::ConnectResponse*)), response); } void GoogleDriveService::ForgetCredentials() { client_->ForgetCredentials(); QSettings s; s.beginGroup(kSettingsGroup); s.remove("refresh_token"); s.remove("user_email"); } void GoogleDriveService::ListChanges(const QString& cursor) { google_drive::ListChangesResponse* changes_response = client_->ListChanges(cursor); connect(changes_response, SIGNAL(FilesFound(QList)), SLOT(FilesFound(QList))); connect(changes_response, SIGNAL(FilesDeleted(QList)), SLOT(FilesDeleted(QList))); NewClosure(changes_response, SIGNAL(Finished()), this, SLOT(ListChangesFinished(google_drive::ListChangesResponse*)), changes_response); } void GoogleDriveService::ListChangesFinished( google_drive::ListChangesResponse* changes_response) { changes_response->deleteLater(); const QString cursor = changes_response->next_cursor(); if (is_indexing()) { // Only save the cursor after all the songs have been indexed - that way if // Clementine is closed it'll resume next time. NewClosure(this, SIGNAL(AllIndexingTasksFinished()), this, SLOT(SaveCursor(QString)), cursor); } else { SaveCursor(cursor); } } void GoogleDriveService::SaveCursor(const QString& cursor) { QSettings s; s.beginGroup(kSettingsGroup); s.setValue("cursor", cursor); } void GoogleDriveService::ConnectFinished( google_drive::ConnectResponse* response) { response->deleteLater(); // Save the refresh token QSettings s; s.beginGroup(kSettingsGroup); s.setValue("refresh_token", response->refresh_token()); if (!response->user_email().isEmpty()) { // We only fetch the user's email address the first time we authenticate. s.setValue("user_email", response->user_email()); } emit Connected(); // Find all the changes since the last check. CheckForUpdates(); } void GoogleDriveService::EnsureConnected() { if (client_->is_authenticated()) { return; } QEventLoop loop; connect(client_, SIGNAL(Authenticated()), &loop, SLOT(quit())); Connect(); loop.exec(); } void GoogleDriveService::FilesFound(const QList& files) { for (const google_drive::File& file : files) { if (!IsSupportedMimeType(file.mime_type())) { continue; } QUrl url; url.setScheme("googledrive"); url.setPath(file.id()); Song song; // Add some extra tags from the Google Drive metadata. song.set_etag(file.etag().remove('"')); song.set_mtime(file.modified_date().toTime_t()); song.set_ctime(file.created_date().toTime_t()); song.set_comment(file.description()); song.set_directory_id(0); song.set_url(QUrl(url)); song.set_filesize(file.size()); // Use the Google Drive title if we couldn't read tags from the file. if (song.title().isEmpty()) { song.set_title(file.title()); } MaybeAddFileToDatabase(song, file.mime_type(), file.download_url(), QString("Bearer %1").arg(client_->access_token())); } } void GoogleDriveService::FilesDeleted(const QList& files) { for (const QUrl& url : files) { Song song = library_backend_->GetSongByUrl(url); qLog(Debug) << "Deleting:" << url << song.title(); if (song.is_valid()) { library_backend_->DeleteSongs(SongList() << song); } } } QUrl GoogleDriveService::GetStreamingUrlFromSongId(const QString& id) { EnsureConnected(); QScopedPointer response(client_->GetFile(id)); QEventLoop loop; connect(response.data(), SIGNAL(Finished()), &loop, SLOT(quit())); loop.exec(); QUrl url(response->file().download_url()); url.addQueryItem("access_token", client_->access_token()); return url; } void GoogleDriveService::ShowContextMenu(const QPoint& global_pos) { if (!context_menu_) { context_menu_.reset(new QMenu); context_menu_->addActions(GetPlaylistActions()); open_in_drive_action_ = context_menu_->addAction( QIcon(":/providers/googledrive.png"), tr("Open in Google Drive"), this, SLOT(OpenWithDrive())); context_menu_->addSeparator(); update_action_ = context_menu_->addAction(IconLoader::Load("view-refresh"), tr("Check for updates"), this, SLOT(CheckForUpdates())); full_rescan_action_ = context_menu_->addAction( IconLoader::Load("view-refresh"), tr("Do a full rescan..."), this, SLOT(ConfirmFullRescan())); context_menu_->addSeparator(); context_menu_->addAction(IconLoader::Load("download"), tr("Cover Manager"), this, SLOT(ShowCoverManager())); context_menu_->addAction(IconLoader::Load("configure"), tr("Configure..."), this, SLOT(ShowSettingsDialog())); } // Only show some actions if there are real songs selected bool songs_selected = false; for (const QModelIndex& index : model()->selected_indexes()) { const int type = index.data(LibraryModel::Role_Type).toInt(); if (type == LibraryItem::Type_Song || type == LibraryItem::Type_Container) { songs_selected = true; break; } } open_in_drive_action_->setEnabled(songs_selected); update_action_->setEnabled(!is_indexing()); full_rescan_action_->setEnabled(!is_indexing()); context_menu_->popup(global_pos); } void GoogleDriveService::OpenWithDrive() { // Map indexes to the actual library model. QModelIndexList library_indexes; for (const QModelIndex& index : model()->selected_indexes()) { if (index.model() == library_sort_model_) { library_indexes << library_sort_model_->mapToSource(index); } } // Ask the library for the songs for these indexes. for (const Song& song : library_model_->GetChildSongs(library_indexes)) { QDesktopServices::openUrl( QUrl(QString(kDriveEditFileUrl).arg(song.url().path()))); } } void GoogleDriveService::ConfirmFullRescan() { QMessageBox* message_box = new QMessageBox( QMessageBox::Warning, tr("Do a full rescan"), tr("Doing a full rescan will lose any metadata you've saved in " "Clementine such as cover art, play counts and ratings. Clementine " "will rescan all your music in Google Drive which may take some " "time."), QMessageBox::NoButton); QPushButton* button = message_box->addButton(tr("Do a full rescan"), QMessageBox::DestructiveRole); connect(button, SIGNAL(clicked()), SLOT(DoFullRescan())); message_box->addButton(QMessageBox::Cancel); message_box->setAttribute(Qt::WA_DeleteOnClose); message_box->show(); } void GoogleDriveService::DoFullRescan() { QSettings s; s.beginGroup(kSettingsGroup); s.remove("cursor"); library_backend_->DeleteAll(); ListChanges(QString()); } void GoogleDriveService::CheckForUpdates() { QSettings s; s.beginGroup(kSettingsGroup); ListChanges(s.value("cursor").toString()); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/googledrive/googledriveservice.h000066400000000000000000000045631260417502300303640ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, 2014, John Maguire Copyright 2012, 2014, David Sansome Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_GOOGLEDRIVE_GOOGLEDRIVESERVICE_H_ #define INTERNET_GOOGLEDRIVE_GOOGLEDRIVESERVICE_H_ #include "internet/core/cloudfileservice.h" namespace google_drive { class Client; class ConnectResponse; class File; class ListFilesResponse; class ListChangesResponse; } class GoogleDriveService : public CloudFileService { Q_OBJECT public: GoogleDriveService(Application* app, InternetModel* parent); static const char* kServiceName; static const char* kSettingsGroup; virtual bool has_credentials() const; virtual void ShowContextMenu(const QPoint& global_pos); google_drive::Client* client() const { return client_; } QString refresh_token() const; QUrl GetStreamingUrlFromSongId(const QString& file_id); public slots: void Connect(); void ForgetCredentials(); signals: void Connected(); private slots: void ConnectFinished(google_drive::ConnectResponse* response); void FilesFound(const QList& files); void FilesDeleted(const QList& files); void ListChangesFinished(google_drive::ListChangesResponse* response); void SaveCursor(const QString& cursor); void OpenWithDrive(); void ConfirmFullRescan(); void DoFullRescan(); void CheckForUpdates(); private: void EnsureConnected(); void RefreshAuthorisation(const QString& refresh_token); void ListChanges(const QString& cursor); google_drive::Client* client_; QAction* open_in_drive_action_; QAction* update_action_; QAction* full_rescan_action_; }; #endif // INTERNET_GOOGLEDRIVE_GOOGLEDRIVESERVICE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/googledrive/googledrivesettingspage.cpp000066400000000000000000000057251260417502300317550ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2013-2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "googledrivesettingspage.h" #include "ui_googledrivesettingspage.h" #include #include "googledriveclient.h" #include "googledriveservice.h" #include "core/application.h" #include "internet/core/internetmodel.h" #include "ui/settingsdialog.h" GoogleDriveSettingsPage::GoogleDriveSettingsPage(SettingsDialog* parent) : SettingsPage(parent), ui_(new Ui::GoogleDriveSettingsPage), service_( dialog()->app()->internet_model()->Service()) { ui_->setupUi(this); ui_->login_state->AddCredentialGroup(ui_->login_container); connect(ui_->login_button, SIGNAL(clicked()), SLOT(LoginClicked())); connect(ui_->login_state, SIGNAL(LogoutClicked()), SLOT(LogoutClicked())); connect(service_, SIGNAL(Connected()), SLOT(Connected())); dialog()->installEventFilter(this); } GoogleDriveSettingsPage::~GoogleDriveSettingsPage() { delete ui_; } void GoogleDriveSettingsPage::Load() { QSettings s; s.beginGroup(GoogleDriveService::kSettingsGroup); const QString user_email = s.value("user_email").toString(); const QString refresh_token = s.value("refresh_token").toString(); if (!user_email.isEmpty() && !refresh_token.isEmpty()) { ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedIn, user_email); } } void GoogleDriveSettingsPage::Save() { QSettings s; s.beginGroup(GoogleDriveService::kSettingsGroup); } void GoogleDriveSettingsPage::LoginClicked() { service_->Connect(); ui_->login_button->setEnabled(false); } bool GoogleDriveSettingsPage::eventFilter(QObject* object, QEvent* event) { if (object == dialog() && event->type() == QEvent::Enter) { ui_->login_button->setEnabled(true); return false; } return SettingsPage::eventFilter(object, event); } void GoogleDriveSettingsPage::LogoutClicked() { service_->ForgetCredentials(); ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedOut); } void GoogleDriveSettingsPage::Connected() { QSettings s; s.beginGroup(GoogleDriveService::kSettingsGroup); const QString user_email = s.value("user_email").toString(); ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedIn, user_email); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/googledrive/googledrivesettingspage.h000066400000000000000000000030751260417502300314160ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_GOOGLEDRIVE_GOOGLEDRIVESETTINGSPAGE_H_ #define INTERNET_GOOGLEDRIVE_GOOGLEDRIVESETTINGSPAGE_H_ #include "ui/settingspage.h" #include #include class GoogleDriveService; class Ui_GoogleDriveSettingsPage; class GoogleDriveSettingsPage : public SettingsPage { Q_OBJECT public: explicit GoogleDriveSettingsPage(SettingsDialog* parent = nullptr); ~GoogleDriveSettingsPage(); void Load(); void Save(); // QObject bool eventFilter(QObject* object, QEvent* event); private slots: void LoginClicked(); void LogoutClicked(); void Connected(); private: Ui_GoogleDriveSettingsPage* ui_; GoogleDriveService* service_; }; #endif // INTERNET_GOOGLEDRIVE_GOOGLEDRIVESETTINGSPAGE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/googledrive/googledrivesettingspage.ui000066400000000000000000000057341260417502300316100ustar00rootroot00000000000000 GoogleDriveSettingsPage 0 0 569 491 Google Drive :/providers/googledrive.png:/providers/googledrive.png Clementine can play music that you have uploaded to Google Drive true 28 0 0 Login Qt::Horizontal 40 20 Clicking the Login button will open a web browser. You should return to Clementine after you have logged in. true Qt::Vertical 20 357 LoginStateWidget QWidget
widgets/loginstatewidget.h
1
clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/googledrive/googledriveurlhandler.cpp000066400000000000000000000024121260417502300314060ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "googledriveurlhandler.h" #include "googledriveservice.h" GoogleDriveUrlHandler::GoogleDriveUrlHandler(GoogleDriveService* service, QObject* parent) : UrlHandler(parent), service_(service) {} UrlHandler::LoadResult GoogleDriveUrlHandler::StartLoading(const QUrl& url) { QString file_id = url.path(); QUrl real_url = service_->GetStreamingUrlFromSongId(file_id); return LoadResult(url, LoadResult::TrackAvailable, real_url); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/googledrive/googledriveurlhandler.h000066400000000000000000000025531260417502300310610ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_GOOGLEDRIVE_GOOGLEDRIVEURLHANDLER_H_ #define INTERNET_GOOGLEDRIVE_GOOGLEDRIVEURLHANDLER_H_ #include "core/urlhandler.h" class GoogleDriveService; class GoogleDriveUrlHandler : public UrlHandler { Q_OBJECT public: explicit GoogleDriveUrlHandler(GoogleDriveService* service, QObject* parent = nullptr); QString scheme() const { return "googledrive"; } QIcon icon() const { return QIcon(":providers/googledrive.png"); } LoadResult StartLoading(const QUrl& url); private: GoogleDriveService* service_; }; #endif // INTERNET_GOOGLEDRIVE_GOOGLEDRIVEURLHANDLER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/icecast/000077500000000000000000000000001260417502300234215ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/icecast/icecastbackend.cpp000066400000000000000000000126351260417502300270570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, David Sansome Copyright 2011, Paweł Bara Copyright 2012, Arnaud Bienner Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "icecastbackend.h" #include #include #include "core/database.h" #include "core/scopedtransaction.h" const char* IcecastBackend::kTableName = "icecast_stations"; IcecastBackend::IcecastBackend(QObject* parent) : QObject(parent) {} void IcecastBackend::Init(Database* db) { db_ = db; } QStringList IcecastBackend::GetGenresAlphabetical(const QString& filter) { QStringList ret; QMutexLocker l(db_->Mutex()); QSqlDatabase db = db_->Connect(); QString where = filter.isEmpty() ? "" : "WHERE name LIKE :filter"; QString sql = QString("SELECT DISTINCT genre FROM %1 %2 ORDER BY genre") .arg(kTableName, where); QSqlQuery q(sql, db); if (!filter.isEmpty()) { q.bindValue(":filter", QString("%" + filter + "%")); } q.exec(); if (db_->CheckErrors(q)) return ret; while (q.next()) { ret << q.value(0).toString(); } return ret; } QStringList IcecastBackend::GetGenresByPopularity(const QString& filter) { QStringList ret; QMutexLocker l(db_->Mutex()); QSqlDatabase db = db_->Connect(); QString where = filter.isEmpty() ? "" : "WHERE name LIKE :filter"; QString sql = QString( "SELECT genre, COUNT(*) AS count FROM %1 " " %2" " GROUP BY genre" " ORDER BY count DESC").arg(kTableName, where); QSqlQuery q(sql, db); if (!filter.isEmpty()) { q.bindValue(":filter", QString("%" + filter + "%")); } q.exec(); if (db_->CheckErrors(q)) return ret; while (q.next()) { ret << q.value(0).toString(); } return ret; } IcecastBackend::StationList IcecastBackend::GetStations(const QString& filter, const QString& genre) { StationList ret; QMutexLocker l(db_->Mutex()); QSqlDatabase db = db_->Connect(); QStringList where_clauses; QStringList bound_items; if (!genre.isEmpty()) { where_clauses << "genre = :genre"; bound_items << genre; } if (!filter.isEmpty()) { where_clauses << "name LIKE :filter"; bound_items << "%" + filter + "%"; } QString sql = QString( "SELECT name, url, mime_type, bitrate, channels," " samplerate, genre" " FROM %1").arg(kTableName); if (!where_clauses.isEmpty()) { sql += " WHERE " + where_clauses.join(" AND "); } QSqlQuery q(sql, db); for (const QString& value : bound_items) { q.addBindValue(value); } q.exec(); if (db_->CheckErrors(q)) return ret; while (q.next()) { Station station; station.name = q.value(0).toString(); station.url = QUrl(q.value(1).toString()); station.mime_type = q.value(2).toString(); station.bitrate = q.value(3).toInt(); station.channels = q.value(4).toInt(); station.samplerate = q.value(5).toInt(); station.genre = q.value(6).toString(); ret << station; } return ret; } bool IcecastBackend::IsEmpty() { QMutexLocker l(db_->Mutex()); QSqlDatabase db = db_->Connect(); QSqlQuery q(QString("SELECT ROWID FROM %1 LIMIT 1").arg(kTableName), db); q.exec(); return !q.next(); } void IcecastBackend::ClearAndAddStations(const StationList& stations) { { QMutexLocker l(db_->Mutex()); QSqlDatabase db = db_->Connect(); ScopedTransaction t(&db); // Remove all existing items QSqlQuery q(QString("DELETE FROM %1").arg(kTableName), db); q.exec(); if (db_->CheckErrors(q)) return; q = QSqlQuery( QString( "INSERT INTO %1 (name, url, mime_type, bitrate," " channels, samplerate, genre)" " VALUES (:name, :url, :mime_type, :bitrate," " :channels, :samplerate, :genre)").arg(kTableName), db); // Add these ones for (const Station& station : stations) { q.bindValue(":name", station.name); q.bindValue(":url", station.url); q.bindValue(":mime_type", station.mime_type); q.bindValue(":bitrate", station.bitrate); q.bindValue(":channels", station.channels); q.bindValue(":samplerate", station.samplerate); q.bindValue(":genre", station.genre); q.exec(); if (db_->CheckErrors(q)) return; } t.Commit(); } emit DatabaseReset(); } Song IcecastBackend::Station::ToSong() const { Song ret; ret.set_valid(true); ret.set_title(name); ret.set_url(url); ret.set_bitrate(bitrate); ret.set_samplerate(samplerate); ret.set_genre(genre); ret.set_filetype(Song::Type_Stream); return ret; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/icecast/icecastbackend.h000066400000000000000000000036061260417502300265220ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_ICECAST_ICECASTBACKEND_H_ #define INTERNET_ICECAST_ICECASTBACKEND_H_ #include "core/song.h" #include #include class Database; class IcecastBackend : public QObject { Q_OBJECT public: explicit IcecastBackend(QObject* parent = nullptr); void Init(Database* db); static const char* kTableName; struct Station { Station() : bitrate(0), channels(0), samplerate(0) {} QString name; QUrl url; QString mime_type; int bitrate; int channels; int samplerate; QString genre; Song ToSong() const; }; typedef QList StationList; QStringList GetGenresAlphabetical(const QString& filter = QString()); QStringList GetGenresByPopularity(const QString& filter = QString()); StationList GetStations(const QString& filter = QString(), const QString& genre = QString()); void ClearAndAddStations(const StationList& stations); bool IsEmpty(); signals: void DatabaseReset(); private: Database* db_; }; #endif // INTERNET_ICECAST_ICECASTBACKEND_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/icecast/icecastfilterwidget.cpp000066400000000000000000000065611260417502300301620ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, David Sansome Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "icecastfilterwidget.h" #include #include #include #include #include "icecastmodel.h" #include "ui_icecastfilterwidget.h" #include "ui/iconloader.h" const char* IcecastFilterWidget::kSettingsGroup = "Icecast"; IcecastFilterWidget::IcecastFilterWidget(QWidget* parent) : QWidget(parent), ui_(new Ui_IcecastFilterWidget), menu_(new QMenu(tr("Display options"), this)), sort_mode_mapper_(new QSignalMapper(this)) { ui_->setupUi(this); // Icons ui_->options->setIcon(IconLoader::Load("configure")); // Options actions QActionGroup* group = new QActionGroup(this); AddAction(group, ui_->action_sort_genre_popularity, IcecastModel::SortMode_GenreByPopularity); AddAction(group, ui_->action_sort_genre_alphabetically, IcecastModel::SortMode_GenreAlphabetical); AddAction(group, ui_->action_sort_station, IcecastModel::SortMode_StationAlphabetical); // Options menu menu_->setIcon(ui_->options->icon()); menu_->addActions(group->actions()); ui_->options->setMenu(menu_); connect(sort_mode_mapper_, SIGNAL(mapped(int)), SLOT(SortModeChanged(int))); } void IcecastFilterWidget::AddAction(QActionGroup* group, QAction* action, IcecastModel::SortMode mode) { group->addAction(action); sort_mode_mapper_->setMapping(action, mode); connect(action, SIGNAL(triggered()), sort_mode_mapper_, SLOT(map())); } IcecastFilterWidget::~IcecastFilterWidget() { delete ui_; } void IcecastFilterWidget::FocusOnFilter(QKeyEvent* event) { ui_->filter->setFocus(Qt::OtherFocusReason); QApplication::sendEvent(ui_->filter, event); } void IcecastFilterWidget::SetIcecastModel(IcecastModel* model) { model_ = model; connect(ui_->filter, SIGNAL(textChanged(QString)), model_, SLOT(SetFilterText(QString))); // Load settings QSettings s; s.beginGroup(kSettingsGroup); switch ( s.value("sort_by", IcecastModel::SortMode_GenreByPopularity).toInt()) { case IcecastModel::SortMode_GenreByPopularity: ui_->action_sort_genre_popularity->trigger(); break; case IcecastModel::SortMode_GenreAlphabetical: ui_->action_sort_genre_alphabetically->trigger(); break; case IcecastModel::SortMode_StationAlphabetical: ui_->action_sort_station->trigger(); break; } } void IcecastFilterWidget::SortModeChanged(int mode) { model_->SetSortMode(IcecastModel::SortMode(mode)); QSettings s; s.beginGroup(kSettingsGroup); s.setValue("sort_by", mode); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/icecast/icecastfilterwidget.h000066400000000000000000000033541260417502300276240ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_ICECAST_ICECASTFILTERWIDGET_H_ #define INTERNET_ICECAST_ICECASTFILTERWIDGET_H_ #include "icecastmodel.h" #include class LineEditInterface; class Ui_IcecastFilterWidget; class QActionGroup; class QMenu; class QSignalMapper; class IcecastFilterWidget : public QWidget { Q_OBJECT public: explicit IcecastFilterWidget(QWidget* parent = nullptr); ~IcecastFilterWidget(); static const char* kSettingsGroup; void SetIcecastModel(IcecastModel* model); QMenu* menu() const { return menu_; } public slots: void FocusOnFilter(QKeyEvent* e); private slots: void SortModeChanged(int mode); private: void AddAction(QActionGroup* group, QAction* action, IcecastModel::SortMode mode); private: Ui_IcecastFilterWidget* ui_; IcecastModel* model_; QMenu* menu_; QSignalMapper* sort_mode_mapper_; }; #endif // INTERNET_ICECAST_ICECASTFILTERWIDGET_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/icecast/icecastfilterwidget.ui000066400000000000000000000037241260417502300300130ustar00rootroot00000000000000 IcecastFilterWidget 0 0 513 27 Form 0 0 Search Icecast stations 16 16 QToolButton::InstantPopup true true Sort by genre (alphabetically) true Sort by genre (by popularity) true Sort by station name QSearchField QWidget
3rdparty/qocoa/qsearchfield.h
clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/icecast/icecastitem.h000066400000000000000000000026631260417502300260730ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_ICECAST_ICECASTITEM_H_ #define INTERNET_ICECAST_ICECASTITEM_H_ #include "icecastbackend.h" #include "core/simpletreeitem.h" class IcecastItem : public SimpleTreeItem { public: enum Type { Type_Root, Type_Genre, Type_Station, Type_Divider, }; explicit IcecastItem(SimpleTreeModel* model) : SimpleTreeItem(Type_Root, model) {} explicit IcecastItem(Type type, IcecastItem* parent = nullptr) : SimpleTreeItem(type, parent) {} IcecastBackend::Station station; }; #endif // INTERNET_ICECAST_ICECASTITEM_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/icecast/icecastmodel.cpp000066400000000000000000000144001260417502300265600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Copyright 2011, Paweł Bara Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "icecastbackend.h" #include "icecastmodel.h" #include "playlist/songmimedata.h" IcecastModel::IcecastModel(IcecastBackend* backend, QObject* parent) : SimpleTreeModel(new IcecastItem(this), parent), backend_(backend), sort_mode_(SortMode_GenreByPopularity), genre_icon_(":last.fm/icon_tag.png"), station_icon_(":last.fm/icon_radio.png") { root_->lazy_loaded = true; } IcecastModel::~IcecastModel() { delete root_; } void IcecastModel::Init() { connect(backend_, SIGNAL(DatabaseReset()), SLOT(Reset())); Reset(); } void IcecastModel::Reset() { delete root_; root_ = new IcecastItem(this); root_->lazy_loaded = false; LazyPopulate(root_); reset(); } void IcecastModel::LazyPopulate(IcecastItem* parent) { if (parent->lazy_loaded) return; parent->lazy_loaded = true; switch (parent->type) { case IcecastItem::Type_Station: return; case IcecastItem::Type_Genre: PopulateGenre(parent, parent->key, false); break; case IcecastItem::Type_Root: switch (sort_mode_) { case SortMode_GenreAlphabetical: AddGenres(backend_->GetGenresAlphabetical(filter_), true); break; case SortMode_GenreByPopularity: AddGenres(backend_->GetGenresByPopularity(filter_), false); break; case SortMode_StationAlphabetical: PopulateGenre(parent, QString(), true); break; } break; } } void IcecastModel::PopulateGenre(IcecastItem* parent, const QString& genre, bool create_dividers) { QChar last_divider; IcecastBackend::StationList stations = backend_->GetStations(filter_, genre); for (const IcecastBackend::Station& station : stations) { QChar divider_char = DividerKey(station.name); if (create_dividers && !divider_char.isNull() && divider_char != last_divider) { last_divider = divider_char; IcecastItem* divider = new IcecastItem(IcecastItem::Type_Divider, parent); divider->display_text = DividerDisplayText(divider_char); divider->lazy_loaded = true; } IcecastItem* item = new IcecastItem(IcecastItem::Type_Station, parent); item->station = station; item->display_text = station.name; item->sort_text = station.name; item->key = station.url.toString(); item->lazy_loaded = true; } } void IcecastModel::AddGenres(const QStringList& genres, bool create_dividers) { QChar last_divider; for (const QString& genre : genres) { QChar divider_char = DividerKey(genre); if (create_dividers && divider_char != last_divider) { last_divider = divider_char; IcecastItem* divider = new IcecastItem(IcecastItem::Type_Divider, root_); divider->display_text = DividerDisplayText(divider_char); divider->lazy_loaded = true; } IcecastItem* item = new IcecastItem(IcecastItem::Type_Genre, root_); item->key = genre; } } QChar IcecastModel::DividerKey(const QString& text) { if (text.isEmpty()) return QChar(); QChar c; c = text[0]; if (c.isDigit()) return '0'; if (c.isPunct() || c.isSymbol()) return QChar(); if (c.decompositionTag() != QChar::NoDecomposition) return QChar(c.decomposition()[0]); return c.toUpper(); } QString IcecastModel::DividerDisplayText(const QChar& key) { if (key == '0') return "0-9"; return key; } QVariant IcecastModel::data(const QModelIndex& index, int role) const { const IcecastItem* item = IndexToItem(index); return data(item, role); } QVariant IcecastModel::data(const IcecastItem* item, int role) const { switch (role) { case Qt::DisplayRole: case Qt::ToolTipRole: return item->DisplayText(); case Qt::DecorationRole: switch (item->type) { case IcecastItem::Type_Genre: return genre_icon_; case IcecastItem::Type_Station: return station_icon_; } break; case Role_IsDivider: return item->type == IcecastItem::Type_Divider; } return QVariant(); } void IcecastModel::SetFilterText(const QString& filter) { filter_ = filter; Reset(); } void IcecastModel::SetSortMode(SortMode mode) { sort_mode_ = mode; Reset(); } Qt::ItemFlags IcecastModel::flags(const QModelIndex& index) const { switch (IndexToItem(index)->type) { case IcecastItem::Type_Station: return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled; case IcecastItem::Type_Genre: case IcecastItem::Type_Root: case IcecastItem::Type_Divider: default: return Qt::ItemIsSelectable | Qt::ItemIsEnabled; } } QStringList IcecastModel::mimeTypes() const { return QStringList() << "text/uri-list"; } QMimeData* IcecastModel::mimeData(const QModelIndexList& indexes) const { if (indexes.isEmpty()) return nullptr; SongMimeData* data = new SongMimeData; QList urls; for (const QModelIndex& index : indexes) { IcecastItem* item = IndexToItem(index); if (!item || item->type != IcecastItem::Type_Station) continue; data->songs << item->station.ToSong(); urls << item->station.url; } if (data->songs.isEmpty()) { delete data; return nullptr; } data->setUrls(urls); data->name_for_new_playlist_ = "Icecast"; return data; } Song IcecastModel::GetSong(const QModelIndex& index) const { IcecastItem* item = IndexToItem(index); if (!item || item->type != IcecastItem::Type_Station) return Song(); return item->station.ToSong(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/icecast/icecastmodel.h000066400000000000000000000050131260417502300262250ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_ICECAST_ICECASTMODEL_H_ #define INTERNET_ICECAST_ICECASTMODEL_H_ #include "icecastitem.h" #include "core/simpletreemodel.h" #include "library/librarymodel.h" #include class IcecastBackend; class IcecastModel : public SimpleTreeModel { Q_OBJECT public: explicit IcecastModel(IcecastBackend* backend, QObject* parent = nullptr); ~IcecastModel(); // These values get saved in QSettings - don't change them enum SortMode { SortMode_GenreByPopularity = 0, SortMode_GenreAlphabetical = 1, SortMode_StationAlphabetical = 2, }; enum Role { Role_IsDivider = LibraryModel::Role_IsDivider, }; IcecastBackend* backend() const { return backend_; } Song GetSong(const QModelIndex& index) const; // QAbstractItemModel QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; Qt::ItemFlags flags(const QModelIndex& index) const; QStringList mimeTypes() const; QMimeData* mimeData(const QModelIndexList& indexes) const; public slots: void Init(); void Reset(); void SetFilterText(const QString& filter); void SetSortMode(SortMode mode); protected: void LazyPopulate(IcecastItem* parent); private: QVariant data(const IcecastItem* item, int role) const; void PopulateGenre(IcecastItem* parent, const QString& genre, bool create_dividers); void AddGenres(const QStringList& genres, bool create_dividers); static QChar DividerKey(const QString& text); static QString DividerDisplayText(const QChar& key); private: IcecastBackend* backend_; QString filter_; SortMode sort_mode_; QIcon genre_icon_; QIcon station_icon_; }; #endif // INTERNET_ICECAST_ICECASTMODEL_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/icecast/icecastservice.cpp000066400000000000000000000234461260417502300271320ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2012, David Sansome Copyright 2010, 2012, 2014, John Maguire Copyright 2011, Tyler Rhodes Copyright 2011, Paweł Bara Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "internet/icecast/icecastservice.h" #include #include #include #include #include #include #include #include #include "core/application.h" #include "core/closure.h" #include "core/database.h" #include "core/mergedproxymodel.h" #include "core/network.h" #include "core/taskmanager.h" #include "globalsearch/globalsearch.h" #include "globalsearch/icecastsearchprovider.h" #include "internet/core/internetmodel.h" #include "internet/icecast/icecastbackend.h" #include "internet/icecast/icecastfilterwidget.h" #include "internet/icecast/icecastmodel.h" #include "playlist/songplaylistitem.h" #include "ui/iconloader.h" using std::sort; using std::unique; const char* IcecastService::kServiceName = "Icecast"; const char* IcecastService::kDirectoryUrl = "http://data.clementine-player.org/icecast-directory"; const char* IcecastService::kHomepage = "http://dir.xiph.org/"; IcecastService::IcecastService(Application* app, InternetModel* parent) : InternetService(kServiceName, app, parent, parent), network_(new NetworkAccessManager(this)), context_menu_(nullptr), backend_(nullptr), model_(nullptr), filter_(new IcecastFilterWidget(0)) { backend_ = new IcecastBackend; backend_->moveToThread(app_->database()->thread()); backend_->Init(app_->database()); model_ = new IcecastModel(backend_, this); filter_->SetIcecastModel(model_); app_->global_search()->AddProvider( new IcecastSearchProvider(backend_, app_, this)); } IcecastService::~IcecastService() {} QStandardItem* IcecastService::CreateRootItem() { root_ = new QStandardItem(QIcon(":last.fm/icon_radio.png"), kServiceName); root_->setData(true, InternetModel::Role_CanLazyLoad); return root_; } void IcecastService::LazyPopulate(QStandardItem* item) { switch (item->data(InternetModel::Role_Type).toInt()) { case InternetModel::Type_Service: model_->Init(); model()->merged_model()->AddSubModel(model()->indexFromItem(item), model_); if (backend_->IsEmpty()) { LoadDirectory(); } break; default: break; } } void IcecastService::LoadDirectory() { int task_id = app_->task_manager()->StartTask(tr("Downloading Icecast directory")); RequestDirectory(QUrl(kDirectoryUrl), task_id); } void IcecastService::RequestDirectory(const QUrl& url, int task_id) { QNetworkRequest req = QNetworkRequest(url); req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork); QNetworkReply* reply = network_->get(req); NewClosure(reply, SIGNAL(finished()), this, SLOT(DownloadDirectoryFinished(QNetworkReply*, int)), reply, task_id); } void IcecastService::DownloadDirectoryFinished(QNetworkReply* reply, int task_id) { if (reply->attribute(QNetworkRequest::RedirectionTargetAttribute).isValid()) { // Discard the old reply and follow the redirect reply->deleteLater(); RequestDirectory( reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(), task_id); return; } QFuture future = QtConcurrent::run(this, &IcecastService::ParseDirectory, reply); QFutureWatcher* watcher = new QFutureWatcher(this); watcher->setFuture(future); NewClosure( watcher, SIGNAL(finished()), this, SLOT(ParseDirectoryFinished(QFuture, int)), future, task_id); connect(watcher, SIGNAL(finished()), watcher, SLOT(deleteLater())); } namespace { template struct GenreSorter { explicit GenreSorter(const QMultiHash& genres) : genres_(genres) {} bool operator()(const QString& a, const QString& b) const { return genres_.count(a) > genres_.count(b); } private: const QMultiHash& genres_; }; template struct StationSorter { bool operator()(const T& a, const T& b) const { return a.name.compare(b.name, Qt::CaseInsensitive) < 0; } }; template struct StationSorter { bool operator()(const T* a, const T* b) const { return a->name.compare(b->name, Qt::CaseInsensitive) < 0; } }; template struct StationEquality { bool operator()(T a, T b) const { return a.name == b.name; } }; QStringList FilterGenres(const QStringList& genres) { QStringList ret; for (const QString& genre : genres) { if (genre.length() < 2) continue; if (genre.contains("ÃÂ")) continue; // Broken unicode. if (genre.contains(QRegExp("^#x[0-9a-f][0-9a-f]"))) continue; // Broken XML entities. // Convert 80 -> 80s. if (genre.contains(QRegExp("^[0-9]0$"))) { ret << genre + 's'; } else { ret << genre; } } if (ret.empty()) { ret << "other"; } return ret; } } // namespace void IcecastService::ParseDirectoryFinished( QFuture future, int task_id) { IcecastBackend::StationList all_stations = future.result(); sort(all_stations.begin(), all_stations.end(), StationSorter()); // Remove duplicates by name. These tend to be multiple URLs for the same // station. IcecastBackend::StationList::iterator it = unique(all_stations.begin(), all_stations.end(), StationEquality()); all_stations.erase(it, all_stations.end()); // Cluster stations by genre. QMultiHash genres; // Add stations. for (int i = 0; i < all_stations.count(); ++i) { IcecastBackend::Station& s = all_stations[i]; genres.insert(s.genre, &s); } QSet genre_set = genres.keys().toSet(); // Merge genres with only 1 or 2 stations into "Other". for (const QString& genre : genre_set) { if (genres.count(genre) < 3) { const QList& small_genre = genres.values(genre); for (IcecastBackend::Station* s : small_genre) { s->genre = "Other"; } } } backend_->ClearAndAddStations(all_stations); app_->task_manager()->SetTaskFinished(task_id); } IcecastBackend::StationList IcecastService::ParseDirectory( QIODevice* device) const { QXmlStreamReader reader(device); IcecastBackend::StationList stations; while (!reader.atEnd()) { reader.readNext(); if (reader.tokenType() == QXmlStreamReader::StartElement && reader.name() == "entry") { stations << ReadStation(&reader); } } device->deleteLater(); return stations; } IcecastBackend::Station IcecastService::ReadStation( QXmlStreamReader* reader) const { IcecastBackend::Station station; while (!reader->atEnd()) { reader->readNext(); if (reader->tokenType() == QXmlStreamReader::EndElement) break; if (reader->tokenType() == QXmlStreamReader::StartElement) { QStringRef name = reader->name(); QString value = reader->readElementText(QXmlStreamReader::SkipChildElements); if (name == "server_name") station.name = value; if (name == "listen_url") station.url = QUrl(value); if (name == "server_type") station.mime_type = value; if (name == "bitrate") station.bitrate = value.toInt(); if (name == "channels") station.channels = value.toInt(); if (name == "samplerate") station.samplerate = value.toInt(); if (name == "genre") station.genre = FilterGenres(value.split(' ', QString::SkipEmptyParts))[0]; } } // Title case the genre if (!station.genre.isEmpty()) { station.genre[0] = station.genre[0].toUpper(); } return station; } QWidget* IcecastService::HeaderWidget() const { return filter_; } void IcecastService::ShowContextMenu(const QPoint& global_pos) { EnsureMenuCreated(); const bool can_play = model()->current_index().isValid() && model()->current_index().model() == model_ && model_->GetSong(model()->current_index()).is_valid(); GetAppendToPlaylistAction()->setEnabled(can_play); GetReplacePlaylistAction()->setEnabled(can_play); GetOpenInNewPlaylistAction()->setEnabled(can_play); context_menu_->popup(global_pos); } void IcecastService::EnsureMenuCreated() { if (context_menu_) return; context_menu_ = new QMenu; context_menu_->addActions(GetPlaylistActions()); context_menu_->addAction(IconLoader::Load("download"), tr("Open %1 in browser").arg("dir.xiph.org"), this, SLOT(Homepage())); context_menu_->addAction(IconLoader::Load("view-refresh"), tr("Refresh station list"), this, SLOT(LoadDirectory())); context_menu_->addSeparator(); context_menu_->addMenu(filter_->menu()); } void IcecastService::Homepage() { QDesktopServices::openUrl(QUrl(kHomepage)); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/icecast/icecastservice.h000066400000000000000000000045631260417502300265760ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2012, David Sansome Copyright 2010, 2012, 2014, John Maguire Copyright 2011, Tyler Rhodes Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_ICECAST_ICECASTSERVICE_H_ #define INTERNET_ICECAST_ICECASTSERVICE_H_ #include "internet/core/internetservice.h" #include #include "icecastbackend.h" class IcecastFilterWidget; class IcecastModel; class NetworkAccessManager; class QAction; class QMenu; class QNetworkReply; class IcecastService : public InternetService { Q_OBJECT public: IcecastService(Application* app, InternetModel* parent); ~IcecastService(); static const char* kServiceName; static const char* kDirectoryUrl; static const char* kHomepage; enum ItemType { Type_Stream = 3000, Type_Genre, }; QStandardItem* CreateRootItem(); void LazyPopulate(QStandardItem* item); void ShowContextMenu(const QPoint& global_pos); QWidget* HeaderWidget() const; private slots: void LoadDirectory(); void Homepage(); void DownloadDirectoryFinished(QNetworkReply* reply, int task_id); void ParseDirectoryFinished(QFuture future, int task_id); private: void RequestDirectory(const QUrl& url, int task_id); void EnsureMenuCreated(); IcecastBackend::StationList ParseDirectory(QIODevice* device) const; IcecastBackend::Station ReadStation(QXmlStreamReader* reader) const; QStandardItem* root_; NetworkAccessManager* network_; QMenu* context_menu_; IcecastBackend* backend_; IcecastModel* model_; IcecastFilterWidget* filter_; }; #endif // INTERNET_ICECAST_ICECASTSERVICE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/internetradio/000077500000000000000000000000001260417502300246555ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/internetradio/savedradio.cpp000066400000000000000000000132361260417502300275070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2012, David Sansome Copyright 2011, Tyler Rhodes Copyright 2011, Paweł Bara Copyright 2014, Arnaud Bienner Copyright 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "savedradio.h" #include #include #include "internet/core/internetmodel.h" #include "core/application.h" #include "core/mimedata.h" #include "globalsearch/globalsearch.h" #include "globalsearch/savedradiosearchprovider.h" #include "ui/addstreamdialog.h" #include "ui/iconloader.h" const char* SavedRadio::kServiceName = "SavedRadio"; const char* SavedRadio::kSettingsGroup = "SavedRadio"; SavedRadio::SavedRadio(Application* app, InternetModel* parent) : InternetService(kServiceName, app, parent, parent), context_menu_(nullptr), root_(nullptr) { LoadStreams(); app_->global_search()->AddProvider( new SavedRadioSearchProvider(this, app_, this)); } SavedRadio::~SavedRadio() { delete context_menu_; } QStandardItem* SavedRadio::CreateRootItem() { root_ = new QStandardItem(IconLoader::Load("document-open-remote"), tr("Your radio streams")); root_->setData(true, InternetModel::Role_CanLazyLoad); return root_; } void SavedRadio::LazyPopulate(QStandardItem* item) { switch (item->data(InternetModel::Role_Type).toInt()) { case InternetModel::Type_Service: for (const Stream& stream : streams_) { AddStreamToList(stream, root_); } break; default: break; } } void SavedRadio::LoadStreams() { // Load saved streams QSettings s; s.beginGroup(kSettingsGroup); int count = s.beginReadArray("streams"); for (int i = 0; i < count; ++i) { s.setArrayIndex(i); streams_ << Stream(QUrl(s.value("url").toString()), s.value("name").toString()); } s.endArray(); } void SavedRadio::SaveStreams() { QSettings s; s.beginGroup(kSettingsGroup); int count = streams_.size(); s.beginWriteArray("streams", count); for (int i = 0; i < count; ++i) { s.setArrayIndex(i); s.setValue("url", streams_[i].url_); s.setValue("name", streams_[i].name_); } s.endArray(); emit StreamsChanged(); } void SavedRadio::ShowContextMenu(const QPoint& global_pos) { if (!context_menu_) { context_menu_ = new QMenu; context_menu_->addActions(GetPlaylistActions()); remove_action_ = context_menu_->addAction( IconLoader::Load("list-remove"), tr("Remove"), this, SLOT(Remove())); edit_action_ = context_menu_->addAction(IconLoader::Load("edit-rename"), tr("Edit..."), this, SLOT(Edit())); context_menu_->addSeparator(); context_menu_->addAction(IconLoader::Load("document-open-remote"), tr("Add another stream..."), this, SIGNAL(ShowAddStreamDialog())); } const bool is_root = model()->current_index().data(InternetModel::Role_Type).toInt() == InternetModel::Type_Service; GetAppendToPlaylistAction()->setEnabled(!is_root); GetReplacePlaylistAction()->setEnabled(!is_root); GetOpenInNewPlaylistAction()->setEnabled(!is_root); remove_action_->setEnabled(!is_root); edit_action_->setEnabled(!is_root); context_menu_->popup(global_pos); } void SavedRadio::Remove() { QStandardItem* context_item = model()->itemFromIndex(model()->current_index()); streams_.removeAll( Stream(QUrl(context_item->data(InternetModel::Role_Url).toUrl()))); context_item->parent()->removeRow(context_item->row()); SaveStreams(); } void SavedRadio::Edit() { QStandardItem* context_item = model()->itemFromIndex(model()->current_index()); if (!edit_dialog_) { edit_dialog_.reset(new AddStreamDialog); edit_dialog_->set_save_visible(false); } edit_dialog_->set_name(context_item->text()); edit_dialog_->set_url(context_item->data(InternetModel::Role_Url).toUrl()); if (edit_dialog_->exec() == QDialog::Rejected) return; int i = streams_.indexOf( Stream(QUrl(context_item->data(InternetModel::Role_Url).toUrl()))); Stream* stream = &streams_[i]; stream->name_ = edit_dialog_->name(); stream->url_ = edit_dialog_->url(); context_item->setText(stream->name_); context_item->setData(stream->url_, InternetModel::Role_Url); SaveStreams(); } void SavedRadio::AddStreamToList(const Stream& stream, QStandardItem* parent) { QStandardItem* s = new QStandardItem(QIcon(":last.fm/icon_radio.png"), stream.name_); s->setData(stream.url_, InternetModel::Role_Url); s->setData(InternetModel::PlayBehaviour_UseSongLoader, InternetModel::Role_PlayBehaviour); parent->appendRow(s); } void SavedRadio::Add(const QUrl& url, const QString& name) { if (streams_.contains(Stream(url))) return; Stream stream(url, name); streams_ << stream; if (!root_->data(InternetModel::Role_CanLazyLoad).toBool()) { AddStreamToList(stream, root_); } SaveStreams(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/internetradio/savedradio.h000066400000000000000000000045211260417502300271510ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2012, David Sansome Copyright 2011, Tyler Rhodes Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_INTERNETRADIO_SAVEDRADIO_H_ #define INTERNET_INTERNETRADIO_SAVEDRADIO_H_ #include #include "internet/core/internetservice.h" class QMenu; class AddStreamDialog; class SavedRadio : public InternetService { Q_OBJECT public: SavedRadio(Application* app, InternetModel* parent); ~SavedRadio(); enum ItemType { Type_Stream = 2000, }; struct Stream { explicit Stream(const QUrl& url, const QString& name = QString()) : url_(url), name_(name) {} // For QList::contains bool operator==(const Stream& other) const { return url_ == other.url_; } QUrl url_; QString name_; }; typedef QList StreamList; static const char* kServiceName; static const char* kSettingsGroup; QStandardItem* CreateRootItem(); void LazyPopulate(QStandardItem* item); void ShowContextMenu(const QPoint& global_pos); void Add(const QUrl& url, const QString& name = QString()); StreamList Streams() const { return streams_; } signals: void ShowAddStreamDialog(); void StreamsChanged(); private slots: void Remove(); void Edit(); private: void LoadStreams(); void SaveStreams(); void AddStreamToList(const Stream& stream, QStandardItem* parent); private: QMenu* context_menu_; QStandardItem* root_; QAction* remove_action_; QAction* edit_action_; StreamList streams_; std::unique_ptr edit_dialog_; }; #endif // INTERNET_INTERNETRADIO_SAVEDRADIO_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/jamendo/000077500000000000000000000000001260417502300234235ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/jamendo/jamendodynamicplaylist.cpp000066400000000000000000000121421260417502300306730ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, David Sansome Copyright 2010, 2014, John Maguire Copyright 2011, Arnaud Bienner Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "jamendodynamicplaylist.h" #include #include #include #include #include "core/logging.h" #include "core/network.h" #include "jamendoplaylistitem.h" #include "jamendoservice.h" #include "library/librarybackend.h" const char* JamendoDynamicPlaylist::kUrl = "http://api.jamendo.com/get2/id/track/plain/"; JamendoDynamicPlaylist::JamendoDynamicPlaylist() : order_by_(OrderBy_Rating), order_direction_(Order_Descending), current_page_(0), current_index_(0) {} JamendoDynamicPlaylist::JamendoDynamicPlaylist(const QString& name, OrderBy order_by) : order_by_(order_by), order_direction_(Order_Descending), current_page_(0), current_index_(0) { set_name(name); } void JamendoDynamicPlaylist::Load(const QByteArray& data) { QDataStream s(data); s >> *this; } void JamendoDynamicPlaylist::Load(OrderBy order_by, OrderDirection order_direction) { order_by_ = order_by; order_direction_ = order_direction; } QByteArray JamendoDynamicPlaylist::Save() const { QByteArray ret; QDataStream s(&ret, QIODevice::WriteOnly); s << *this; return ret; } PlaylistItemList JamendoDynamicPlaylist::Generate() { return GenerateMore(20); } PlaylistItemList JamendoDynamicPlaylist::GenerateMore(int count) { int tries = 0; PlaylistItemList items; while (items.size() < count && tries++ < kApiRetryLimit) { // Add items from current list. if (current_index_ < current_items_.size()) { PlaylistItemList more_items = current_items_.mid(current_index_, count); items << more_items; current_index_ += more_items.size(); } else { // We need more songs! Fetch(); } } return items; } QString JamendoDynamicPlaylist::OrderSpec(OrderBy by, OrderDirection dir) { QString ret; switch (by) { case OrderBy_Listened: ret += "listened"; break; case OrderBy_Rating: ret += "rating"; break; case OrderBy_RatingMonth: ret += "ratingmonth"; break; case OrderBy_RatingWeek: ret += "ratingweek"; break; } switch (dir) { case Order_Ascending: ret += "_asc"; break; case Order_Descending: ret += "_desc"; break; } return ret; } void JamendoDynamicPlaylist::Fetch() { QUrl url(kUrl); url.addQueryItem("pn", QString::number(current_page_++)); url.addQueryItem("n", QString::number(kPageSize)); url.addQueryItem("order", OrderSpec(order_by_, order_direction_)); // We have to use QHttp here because there's no way to disable Keep-Alive // with QNetworkManager. QHttpRequestHeader header( "GET", QString(url.encodedPath() + "?" + url.encodedQuery())); header.setValue("Host", url.encodedHost()); QHttp http(url.host()); http.request(header); // Wait for the reply { QEventLoop event_loop; connect(&http, SIGNAL(requestFinished(int, bool)), &event_loop, SLOT(quit())); event_loop.exec(); } if (http.error() != QHttp::NoError) { qLog(Warning) << "HTTP error returned from Jamendo:" << http.errorString() << ", url:" << url.toString(); return; } // The reply will contain one track ID per line QStringList lines = QString::fromAscii(http.readAll()).split('\n'); // Get the songs from the database SongList songs = backend_->GetSongsByForeignId( lines, JamendoService::kTrackIdsTable, JamendoService::kTrackIdsColumn); if (songs.empty()) { qLog(Warning) << "No songs returned from Jamendo:" << url.toString(); return; } current_items_.clear(); for (const Song& song : songs) { if (song.is_valid()) current_items_ << PlaylistItemPtr(new JamendoPlaylistItem(song)); } current_index_ = 0; } QDataStream& operator<<(QDataStream& s, const JamendoDynamicPlaylist& p) { s << quint8(p.order_by_) << quint8(p.order_direction_); return s; } QDataStream& operator>>(QDataStream& s, JamendoDynamicPlaylist& p) { quint8 order_by, order_direction; s >> order_by >> order_direction; p.order_by_ = JamendoDynamicPlaylist::OrderBy(order_by); p.order_direction_ = JamendoDynamicPlaylist::OrderDirection(order_direction); return s; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/jamendo/jamendodynamicplaylist.h000066400000000000000000000050651260417502300303460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Copyright 2010, 2014, John Maguire Copyright 2011, Arnaud Bienner Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_JAMENDO_JAMENDODYNAMICPLAYLIST_H_ #define INTERNET_JAMENDO_JAMENDODYNAMICPLAYLIST_H_ #include "smartplaylists/generator.h" class JamendoDynamicPlaylist : public smart_playlists::Generator { Q_OBJECT friend QDataStream& operator<<(QDataStream& s, const JamendoDynamicPlaylist& p); friend QDataStream& operator>>(QDataStream& s, JamendoDynamicPlaylist& p); public: // These values are persisted - only add to the end enum OrderBy { OrderBy_Rating = 0, OrderBy_RatingWeek = 1, OrderBy_RatingMonth = 2, OrderBy_Listened = 3, }; // These values are persisted - only add to the end enum OrderDirection { Order_Ascending = 0, Order_Descending = 1, }; JamendoDynamicPlaylist(); JamendoDynamicPlaylist(const QString& name, OrderBy order_by); QString type() const { return "Jamendo"; } void Load(const QByteArray& data); void Load(OrderBy order_by, OrderDirection order_direction = Order_Descending); QByteArray Save() const; PlaylistItemList Generate(); bool is_dynamic() const { return true; } PlaylistItemList GenerateMore(int count); private: void Fetch(); static QString OrderSpec(OrderBy by, OrderDirection dir); private: OrderBy order_by_; OrderDirection order_direction_; int current_page_; PlaylistItemList current_items_; int current_index_; static const int kPageSize = 100; static const int kApiRetryLimit = 5; static const char* kUrl; }; QDataStream& operator<<(QDataStream& s, const JamendoDynamicPlaylist& p); QDataStream& operator>>(QDataStream& s, JamendoDynamicPlaylist& p); #endif // INTERNET_JAMENDO_JAMENDODYNAMICPLAYLIST_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/jamendo/jamendoplaylistitem.cpp000066400000000000000000000025341260417502300302110ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "jamendoplaylistitem.h" JamendoPlaylistItem::JamendoPlaylistItem(const QString& type) : LibraryPlaylistItem(type) {} JamendoPlaylistItem::JamendoPlaylistItem(const Song& song) : LibraryPlaylistItem("Jamendo") { song_ = song; } bool JamendoPlaylistItem::InitFromQuery(const SqlRow& query) { // Rows from the songs tables come first song_.InitFromQuery(query, true, (Song::kColumns.count() + 1) * 2); return song_.is_valid(); } QUrl JamendoPlaylistItem::Url() const { return song_.url(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/jamendo/jamendoplaylistitem.h000066400000000000000000000023751260417502300276610ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_JAMENDO_JAMENDOPLAYLISTITEM_H_ #define INTERNET_JAMENDO_JAMENDOPLAYLISTITEM_H_ #include "library/libraryplaylistitem.h" class JamendoPlaylistItem : public LibraryPlaylistItem { public: explicit JamendoPlaylistItem(const QString& type); explicit JamendoPlaylistItem(const Song& song); bool InitFromQuery(const SqlRow& query); QUrl Url() const; }; #endif // INTERNET_JAMENDO_JAMENDOPLAYLISTITEM_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/jamendo/jamendoservice.cpp000066400000000000000000000443171260417502300271360ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2013, David Sansome Copyright 2010, 2014, John Maguire Copyright 2011, Tyler Rhodes Copyright 2011, Paweł Bara Copyright 2011, Andrea Decorte Copyright 2014, Chocobozzz Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "jamendoservice.h" #include #include #include #include #include #include #include #include #include "qtiocompressor.h" #include "jamendodynamicplaylist.h" #include "jamendoplaylistitem.h" #include "internet/core/internetmodel.h" #include "core/application.h" #include "core/database.h" #include "core/logging.h" #include "core/mergedproxymodel.h" #include "core/network.h" #include "core/scopedtransaction.h" #include "core/taskmanager.h" #include "core/timeconstants.h" #include "globalsearch/globalsearch.h" #include "globalsearch/librarysearchprovider.h" #include "library/librarybackend.h" #include "library/libraryfilterwidget.h" #include "library/librarymodel.h" #include "smartplaylists/generator.h" #include "smartplaylists/querygenerator.h" #include "ui/iconloader.h" const char* JamendoService::kServiceName = "Jamendo"; const char* JamendoService::kDirectoryUrl = "https://imgjam.com/data/dbdump_artistalbumtrack.xml.gz"; const char* JamendoService::kMp3StreamUrl = "http://api.jamendo.com/get2/stream/track/redirect/" "?id=%1&streamencoding=mp31"; const char* JamendoService::kOggStreamUrl = "http://api.jamendo.com/get2/stream/track/redirect/" "?id=%1&streamencoding=ogg2"; const char* JamendoService::kAlbumCoverUrl = "http://api.jamendo.com/get2/image/album/redirect/?id=%1&imagesize=300"; const char* JamendoService::kHomepage = "http://www.jamendo.com/"; const char* JamendoService::kAlbumInfoUrl = "http://www.jamendo.com/album/%1"; const char* JamendoService::kDownloadAlbumUrl = "http://www.jamendo.com/download/album/%1"; const char* JamendoService::kSongsTable = "jamendo.songs"; const char* JamendoService::kFtsTable = "jamendo.songs_fts"; const char* JamendoService::kTrackIdsTable = "jamendo.track_ids"; const char* JamendoService::kTrackIdsColumn = "track_id"; const char* JamendoService::kSettingsGroup = "Jamendo"; const int JamendoService::kBatchSize = 10000; const int JamendoService::kApproxDatabaseSize = 450000; JamendoService::JamendoService(Application* app, InternetModel* parent) : InternetService(kServiceName, app, parent, parent), network_(new NetworkAccessManager(this)), context_menu_(nullptr), library_backend_(nullptr), library_filter_(nullptr), library_model_(nullptr), library_sort_model_(new QSortFilterProxyModel(this)), search_provider_(nullptr), load_database_task_id_(0), total_song_count_(0), accepted_download_(false) { library_backend_ = new LibraryBackend; library_backend_->moveToThread(app_->database()->thread()); library_backend_->Init(app_->database(), kSongsTable, QString::null, QString::null, kFtsTable); connect(library_backend_, SIGNAL(TotalSongCountUpdated(int)), SLOT(UpdateTotalSongCount(int))); using smart_playlists::Generator; using smart_playlists::GeneratorPtr; using smart_playlists::QueryGenerator; using smart_playlists::Search; using smart_playlists::SearchTerm; library_model_ = new LibraryModel(library_backend_, app_, this); library_model_->set_show_various_artists(false); library_model_->set_show_smart_playlists(false); library_model_->set_default_smart_playlists( LibraryModel::DefaultGenerators() << (LibraryModel::GeneratorList() << GeneratorPtr(new JamendoDynamicPlaylist( tr("Jamendo Top Tracks of the Month"), JamendoDynamicPlaylist::OrderBy_RatingMonth)) << GeneratorPtr(new JamendoDynamicPlaylist( tr("Jamendo Top Tracks of the Week"), JamendoDynamicPlaylist::OrderBy_RatingWeek)) << GeneratorPtr(new JamendoDynamicPlaylist( tr("Jamendo Top Tracks"), JamendoDynamicPlaylist::OrderBy_Rating)) << GeneratorPtr(new JamendoDynamicPlaylist( tr("Jamendo Most Listened Tracks"), JamendoDynamicPlaylist::OrderBy_Listened))) << (LibraryModel::GeneratorList() << GeneratorPtr(new QueryGenerator( tr("Dynamic random mix"), Search(Search::Type_All, Search::TermList(), Search::Sort_Random, SearchTerm::Field_Title), true)))); library_sort_model_->setSourceModel(library_model_); library_sort_model_->setSortRole(LibraryModel::Role_SortText); library_sort_model_->setDynamicSortFilter(true); library_sort_model_->setSortLocaleAware(true); library_sort_model_->sort(0); search_provider_ = new LibrarySearchProvider( library_backend_, tr("Jamendo"), "jamendo", QIcon(":/providers/jamendo.png"), false, app_, this); app_->global_search()->AddProvider(search_provider_); connect(app_->global_search(), SIGNAL(ProviderToggled(const SearchProvider*, bool)), SLOT(SearchProviderToggled(const SearchProvider*, bool))); } JamendoService::~JamendoService() {} QStandardItem* JamendoService::CreateRootItem() { QStandardItem* item = new QStandardItem(QIcon(":providers/jamendo.png"), kServiceName); item->setData(true, InternetModel::Role_CanLazyLoad); return item; } void JamendoService::LazyPopulate(QStandardItem* item) { switch (item->data(InternetModel::Role_Type).toInt()) { case InternetModel::Type_Service: { if (total_song_count_ == 0 && !load_database_task_id_) { DownloadDirectory(); } model()->merged_model()->AddSubModel(item->index(), library_sort_model_); break; } default: break; } } void JamendoService::UpdateTotalSongCount(int count) { total_song_count_ = count; if (total_song_count_ > 0) { library_model_->set_show_smart_playlists(true); accepted_download_ = true; // the user has previously accepted } } void JamendoService::DownloadDirectory() { // don't ask if we're refreshing the database if (total_song_count_ == 0) { if (QMessageBox::question(context_menu_, tr("Jamendo database"), tr("This action will create a database which " "could be as big as 150 MB.\n" "Do you want to continue anyway?"), QMessageBox::Ok | QMessageBox::Cancel) != QMessageBox::Ok) return; } accepted_download_ = true; QNetworkRequest req = QNetworkRequest(QUrl(kDirectoryUrl)); req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork); QNetworkReply* reply = network_->get(req); connect(reply, SIGNAL(finished()), SLOT(DownloadDirectoryFinished())); connect(reply, SIGNAL(downloadProgress(qint64, qint64)), SLOT(DownloadDirectoryProgress(qint64, qint64))); if (!load_database_task_id_) { load_database_task_id_ = app_->task_manager()->StartTask(tr("Downloading Jamendo catalogue")); } } void JamendoService::DownloadDirectoryProgress(qint64 received, qint64 total) { float progress = static_cast(received) / total; app_->task_manager()->SetTaskProgress(load_database_task_id_, static_cast(progress * 100), 100); } void JamendoService::DownloadDirectoryFinished() { QNetworkReply* reply = qobject_cast(sender()); Q_ASSERT(reply); app_->task_manager()->SetTaskFinished(load_database_task_id_); load_database_task_id_ = 0; // TODO(John Maguire): Not leak reply. QtIOCompressor* gzip = new QtIOCompressor(reply); gzip->setStreamFormat(QtIOCompressor::GzipFormat); if (!gzip->open(QIODevice::ReadOnly)) { qLog(Warning) << "Jamendo library not in gzip format"; delete gzip; return; } load_database_task_id_ = app_->task_manager()->StartTask(tr("Parsing Jamendo catalogue")); QFuture future = QtConcurrent::run(this, &JamendoService::ParseDirectory, gzip); QFutureWatcher* watcher = new QFutureWatcher(); watcher->setFuture(future); connect(watcher, SIGNAL(finished()), SLOT(ParseDirectoryFinished())); } void JamendoService::ParseDirectory(QIODevice* device) const { int total_count = 0; // Bit of a hack: don't update the model while we're parsing the xml disconnect(library_backend_, SIGNAL(SongsDiscovered(SongList)), library_model_, SLOT(SongsDiscovered(SongList))); disconnect(library_backend_, SIGNAL(TotalSongCountUpdated(int)), this, SLOT(UpdateTotalSongCount(int))); // Delete the database and recreate it. This is faster than dropping tables // or removing rows. library_backend_->db()->RecreateAttachedDb("jamendo"); TrackIdList track_ids; SongList songs; QXmlStreamReader reader(device); while (!reader.atEnd()) { reader.readNext(); if (reader.tokenType() == QXmlStreamReader::StartElement && reader.name() == "artist") { songs << ReadArtist(&reader, &track_ids); } if (songs.count() >= kBatchSize) { // Add the songs to the database in batches library_backend_->AddOrUpdateSongs(songs); InsertTrackIds(track_ids); total_count += songs.count(); songs.clear(); track_ids.clear(); // Update progress info app_->task_manager()->SetTaskProgress(load_database_task_id_, total_count, kApproxDatabaseSize); } } library_backend_->AddOrUpdateSongs(songs); InsertTrackIds(track_ids); connect(library_backend_, SIGNAL(SongsDiscovered(SongList)), library_model_, SLOT(SongsDiscovered(SongList))); connect(library_backend_, SIGNAL(TotalSongCountUpdated(int)), SLOT(UpdateTotalSongCount(int))); library_backend_->UpdateTotalSongCount(); } void JamendoService::InsertTrackIds(const TrackIdList& ids) const { QMutexLocker l(library_backend_->db()->Mutex()); QSqlDatabase db(library_backend_->db()->Connect()); ScopedTransaction t(&db); QSqlQuery insert(QString("INSERT INTO %1 (%2) VALUES (:id)") .arg(kTrackIdsTable, kTrackIdsColumn), db); for (int id : ids) { insert.bindValue(":id", id); if (!insert.exec()) { qLog(Warning) << "Query failed" << insert.lastQuery(); } } t.Commit(); } SongList JamendoService::ReadArtist(QXmlStreamReader* reader, TrackIdList* track_ids) const { SongList ret; QString current_artist; while (!reader->atEnd()) { reader->readNext(); if (reader->tokenType() == QXmlStreamReader::StartElement) { QStringRef name = reader->name(); if (name == "name") { current_artist = reader->readElementText().trimmed(); } else if (name == "album") { ret << ReadAlbum(current_artist, reader, track_ids); } } else if (reader->isEndElement() && reader->name() == "artist") { break; } } return ret; } SongList JamendoService::ReadAlbum(const QString& artist, QXmlStreamReader* reader, TrackIdList* track_ids) const { SongList ret; QString current_album; QString cover; int current_album_id = 0; while (!reader->atEnd()) { reader->readNext(); if (reader->tokenType() == QXmlStreamReader::StartElement) { if (reader->name() == "name") { current_album = reader->readElementText().trimmed(); } else if (reader->name() == "id") { QString id = reader->readElementText(); cover = QString(kAlbumCoverUrl).arg(id); current_album_id = id.toInt(); } else if (reader->name() == "track") { ret << ReadTrack(artist, current_album, cover, current_album_id, reader, track_ids); } } else if (reader->isEndElement() && reader->name() == "album") { break; } } return ret; } Song JamendoService::ReadTrack(const QString& artist, const QString& album, const QString& album_cover, int album_id, QXmlStreamReader* reader, TrackIdList* track_ids) const { Song song; song.set_artist(artist); song.set_album(album); song.set_filetype(Song::Type_Stream); song.set_directory_id(0); song.set_mtime(0); song.set_ctime(0); song.set_filesize(0); // Shoehorn the album ID into the comment field song.set_comment(QString::number(album_id)); while (!reader->atEnd()) { reader->readNext(); if (reader->isStartElement()) { QStringRef name = reader->name(); if (name == "name") { song.set_title(reader->readElementText().trimmed()); } else if (name == "duration") { const int length = reader->readElementText().toFloat(); song.set_length_nanosec(length * kNsecPerSec); } else if (name == "id3genre") { int genre_id = reader->readElementText().toInt(); // In theory, genre 0 is "blues"; in practice it's invalid. if (genre_id != 0) { song.set_genre_id3(genre_id); } } else if (name == "id") { QString id_text = reader->readElementText(); int id = id_text.toInt(); if (id == 0) continue; QString mp3_url = QString(kMp3StreamUrl).arg(id_text); song.set_url(QUrl(mp3_url)); song.set_art_automatic(album_cover); song.set_valid(true); // Rely on songs getting added in this exact order track_ids->append(id); } } else if (reader->isEndElement() && reader->name() == "track") { break; } } return song; } void JamendoService::ParseDirectoryFinished() { QFutureWatcher* watcher = static_cast*>(sender()); delete watcher; // show smart playlists library_model_->set_show_smart_playlists(true); library_model_->Reset(); app_->task_manager()->SetTaskFinished(load_database_task_id_); load_database_task_id_ = 0; } void JamendoService::EnsureMenuCreated() { if (library_filter_) return; context_menu_ = new QMenu; context_menu_->addActions(GetPlaylistActions()); album_info_ = context_menu_->addAction(IconLoader::Load("view-media-lyrics"), tr("Album info on jamendo.com..."), this, SLOT(AlbumInfo())); download_album_ = context_menu_->addAction(IconLoader::Load("download"), tr("Download this album..."), this, SLOT(DownloadAlbum())); context_menu_->addSeparator(); context_menu_->addAction(IconLoader::Load("download"), tr("Open %1 in browser").arg("jamendo.com"), this, SLOT(Homepage())); context_menu_->addAction(IconLoader::Load("view-refresh"), tr("Refresh catalogue"), this, SLOT(DownloadDirectory())); if (accepted_download_) { library_filter_ = new LibraryFilterWidget(0); library_filter_->SetSettingsGroup(kSettingsGroup); library_filter_->SetLibraryModel(library_model_); library_filter_->SetFilterHint(tr("Search Jamendo")); library_filter_->SetAgeFilterEnabled(false); context_menu_->addSeparator(); context_menu_->addMenu(library_filter_->menu()); } } void JamendoService::ShowContextMenu(const QPoint& global_pos) { EnsureMenuCreated(); const bool enabled = accepted_download_ && model()->current_index().model() == library_sort_model_; // make menu items visible and enabled only when needed GetAppendToPlaylistAction()->setVisible(accepted_download_); GetAppendToPlaylistAction()->setEnabled(enabled); GetReplacePlaylistAction()->setVisible(accepted_download_); GetReplacePlaylistAction()->setEnabled(enabled); GetOpenInNewPlaylistAction()->setEnabled(enabled); GetOpenInNewPlaylistAction()->setVisible(accepted_download_); album_info_->setEnabled(enabled); album_info_->setVisible(accepted_download_); download_album_->setEnabled(enabled); download_album_->setVisible(accepted_download_); context_menu_->popup(global_pos); } QWidget* JamendoService::HeaderWidget() const { const_cast(this)->EnsureMenuCreated(); return library_filter_; } void JamendoService::AlbumInfo() { SongList songs(library_model_->GetChildSongs( library_sort_model_->mapToSource(model()->current_index()))); if (songs.isEmpty()) return; // We put the album ID into the comment field int id = songs.first().comment().toInt(); if (!id) return; QDesktopServices::openUrl(QUrl(QString(kAlbumInfoUrl).arg(id))); } void JamendoService::DownloadAlbum() { SongList songs(library_model_->GetChildSongs( library_sort_model_->mapToSource(model()->current_index()))); if (songs.isEmpty()) return; // We put the album ID into the comment field int id = songs.first().comment().toInt(); if (!id) return; QDesktopServices::openUrl(QUrl(QString(kDownloadAlbumUrl).arg(id))); } void JamendoService::Homepage() { QDesktopServices::openUrl(QUrl(kHomepage)); } void JamendoService::SearchProviderToggled(const SearchProvider* provider, bool enabled) { // If the use enabled our provider and he hasn't downloaded the directory yet, // prompt him to do so now. if (provider == search_provider_ && enabled && total_song_count_ == 0) { DownloadDirectory(); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/jamendo/jamendoservice.h000066400000000000000000000071361260417502300266010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2012, David Sansome Copyright 2010, 2014, John Maguire Copyright 2011, Tyler Rhodes Copyright 2011, Andrea Decorte Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_JAMENDO_JAMENDOSERVICE_H_ #define INTERNET_JAMENDO_JAMENDOSERVICE_H_ #include "internet/core/internetservice.h" #include #include "core/song.h" class LibraryBackend; class LibraryFilterWidget; class LibraryModel; class LibrarySearchProvider; class NetworkAccessManager; class SearchProvider; class QIODevice; class QMenu; class QSortFilterProxyModel; class JamendoService : public InternetService { Q_OBJECT public: JamendoService(Application* app, InternetModel* parent); ~JamendoService(); QStandardItem* CreateRootItem(); void LazyPopulate(QStandardItem* item); void ShowContextMenu(const QPoint& global_pos); QWidget* HeaderWidget() const; LibraryBackend* library_backend() const { return library_backend_; } static const char* kServiceName; static const char* kDirectoryUrl; static const char* kMp3StreamUrl; static const char* kOggStreamUrl; static const char* kAlbumCoverUrl; static const char* kAlbumInfoUrl; static const char* kDownloadAlbumUrl; static const char* kHomepage; static const char* kSongsTable; static const char* kFtsTable; static const char* kTrackIdsTable; static const char* kTrackIdsColumn; static const char* kSettingsGroup; static const int kBatchSize; static const int kApproxDatabaseSize; private: void ParseDirectory(QIODevice* device) const; typedef QList TrackIdList; SongList ReadArtist(QXmlStreamReader* reader, TrackIdList* track_ids) const; SongList ReadAlbum(const QString& artist, QXmlStreamReader* reader, TrackIdList* track_ids) const; Song ReadTrack(const QString& artist, const QString& album, const QString& album_cover, int album_id, QXmlStreamReader* reader, TrackIdList* track_ids) const; void InsertTrackIds(const TrackIdList& ids) const; void EnsureMenuCreated(); private slots: void DownloadDirectory(); void DownloadDirectoryProgress(qint64 received, qint64 total); void DownloadDirectoryFinished(); void ParseDirectoryFinished(); void UpdateTotalSongCount(int count); void AlbumInfo(); void DownloadAlbum(); void Homepage(); void SearchProviderToggled(const SearchProvider* provider, bool enabled); private: NetworkAccessManager* network_; QMenu* context_menu_; QAction* album_info_; QAction* download_album_; LibraryBackend* library_backend_; LibraryFilterWidget* library_filter_; LibraryModel* library_model_; QSortFilterProxyModel* library_sort_model_; LibrarySearchProvider* search_provider_; int load_database_task_id_; int total_song_count_; bool accepted_download_; }; #endif // INTERNET_JAMENDO_JAMENDOSERVICE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/lastfm/000077500000000000000000000000001260417502300232745ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/lastfm/fixlastfm.cpp000066400000000000000000000017031260417502300257760ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "fixlastfm.h" #ifdef QT_NO_DEBUG_OUTPUT QDebug& operator<<(QDebug& d, const QUrl&) { return d; } #endif clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/lastfm/fixlastfm.h000066400000000000000000000022611260417502300254430ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_LASTFM_FIXLASTFM_H_ #define INTERNET_LASTFM_FIXLASTFM_H_ // Include this before to fix a compile error in release mode #ifdef QT_NO_DEBUG_OUTPUT #include #include // Stub this out so lastfm/Track still compiles QDebug& operator<<(QDebug&, const QUrl&); #endif #endif // INTERNET_LASTFM_FIXLASTFM_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/lastfm/lastfmcompat.cpp000066400000000000000000000056631260417502300265040ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012-2013, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "lastfmcompat.h" #include "core/logging.h" namespace lastfm { namespace compat { #ifdef HAVE_LIBLASTFM1 XmlQuery EmptyXmlQuery() { return XmlQuery(); } bool ParseQuery(const QByteArray& data, XmlQuery* query, bool* connection_problems) { const bool ret = query->parse(data); if (connection_problems) { *connection_problems = !ret && query->parseError().enumValue() == lastfm::ws::MalformedResponse; } return ret; } bool ParseUserList(QNetworkReply* reply, QList* users) { lastfm::XmlQuery lfm; if (!lfm.parse(reply->readAll())) { return false; } *users = lastfm::UserList(lfm).users(); return true; } uint ScrobbleTimeMin() { return lastfm::ScrobblePoint::scrobbleTimeMin(); } #else // HAVE_LIBLASTFM1 XmlQuery EmptyXmlQuery() { QByteArray dummy; return XmlQuery(dummy); } bool ParseQuery(const QByteArray& data, XmlQuery* query, bool* connection_problems) { try { *query = lastfm::XmlQuery(data); #ifdef Q_OS_WIN32 if (lastfm::ws::last_parse_error != lastfm::ws::NoError) { return false; } #endif // Q_OS_WIN32 } catch (lastfm::ws::ParseError e) { qLog(Error) << "Last.fm parse error: " << e.enumValue(); if (connection_problems) { *connection_problems = e.enumValue() == lastfm::ws::MalformedResponse; } return false; } catch (std::runtime_error& e) { qLog(Error) << e.what(); return false; } if (connection_problems) { *connection_problems = false; } // Check for app errors. if (QDomElement(*query).attribute("status") == "failed") { return false; } return true; } bool ParseUserList(QNetworkReply* reply, QList* users) { try { *users = lastfm::User::list(reply); #ifdef Q_OS_WIN32 if (lastfm::ws::last_parse_error != lastfm::ws::NoError) { return false; } #endif // Q_OS_WIN32 } catch (std::runtime_error& e) { qLog(Error) << e.what(); return false; } return true; } uint ScrobbleTimeMin() { return ScrobblePoint::kScrobbleMinLength; } #endif // HAVE_LIBLASTFM1 } // namespace compat } // namespace lastfm clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/lastfm/lastfmcompat.h000066400000000000000000000037211260417502300261420ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_LASTFM_LASTFMCOMPAT_H_ #define INTERNET_LASTFM_LASTFMCOMPAT_H_ #include "config.h" #include "fixlastfm.h" #ifdef HAVE_LIBLASTFM1 #include #include #include #include #include #include #include #else #include #include #include #include #include #include #include #endif namespace lastfm { namespace compat { lastfm::XmlQuery EmptyXmlQuery(); bool ParseQuery(const QByteArray& data, lastfm::XmlQuery* query, bool* connection_problems = nullptr); bool ParseUserList(QNetworkReply* reply, QList* users); uint ScrobbleTimeMin(); #ifdef HAVE_LIBLASTFM1 typedef lastfm::ScrobbleCache ScrobbleCache; typedef lastfm::User AuthenticatedUser; #else typedef ::ScrobbleCache ScrobbleCache; typedef lastfm::AuthenticatedUser AuthenticatedUser; #endif } // namespace compat } // namespace lastfm #endif // INTERNET_LASTFM_LASTFMCOMPAT_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/lastfm/lastfmservice.cpp000066400000000000000000000314261260417502300266550ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2009-2013, David Sansome Copyright 2010-2012, 2014, John Maguire Copyright 2011, Andrea Decorte Copyright 2012, Arnaud Bienner Copyright 2012, Kacper "mattrick" Banasik Copyright 2012, Harald Sitter Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ // StringBuilder is activated to speed-up QString concatenation. As explained // here: // http://labs.qt.nokia.com/2011/06/13/string-concatenation-with-qstringbuilder/ // this cause some compilation errors in some cases. As Lasfm library inlines // some functions in their includes files, which aren't compatible with // QStringBuilder, we undef it here #include #if QT_VERSION >= 0x040600 #if QT_VERSION >= 0x040800 #undef QT_USE_QSTRINGBUILDER #else #undef QT_USE_FAST_CONCATENATION #undef QT_USE_FAST_OPERATOR_PLUS #endif // QT_VERSION >= 0x040800 #endif // QT_VERSION >= 0x040600 #include "lastfmservice.h" #include #include #ifdef HAVE_LIBLASTFM1 #include #else #include #endif #include "lastfmcompat.h" #include "internet/core/internetmodel.h" #include "internet/core/internetplaylistitem.h" #include "core/application.h" #include "core/closure.h" #include "core/logging.h" #include "core/player.h" #include "core/song.h" #include "core/taskmanager.h" #include "covers/coverproviders.h" #include "covers/lastfmcoverprovider.h" #include "ui/iconloader.h" #include "ui/settingsdialog.h" using lastfm::XmlQuery; uint qHash(const lastfm::Track& track) { return qHash(track.title()) ^ qHash(track.artist().name()) ^ qHash(track.album().title()); } const char* LastFMService::kServiceName = "Last.fm"; const char* LastFMService::kSettingsGroup = "Last.fm"; const char* LastFMService::kAudioscrobblerClientId = "tng"; const char* LastFMService::kApiKey = "75d20fb472be99275392aefa2760ea09"; const char* LastFMService::kSecret = "d3072b60ae626be12be69448f5c46e70"; LastFMService::LastFMService(Application* app, QObject* parent) : Scrobbler(parent), scrobbler_(nullptr), already_scrobbled_(false), scrobbling_enabled_(false), connection_problems_(false), app_(app) { ReloadSettings(); // we emit the signal the first time to be sure the buttons are in the right // state emit ScrobblingEnabledChanged(scrobbling_enabled_); app_->cover_providers()->AddProvider(new LastFmCoverProvider(this)); } LastFMService::~LastFMService() {} void LastFMService::ReloadSettings() { bool scrobbling_enabled_old = scrobbling_enabled_; QSettings settings; settings.beginGroup(kSettingsGroup); lastfm::ws::Username = settings.value("Username").toString(); lastfm::ws::SessionKey = settings.value("Session").toString(); scrobbling_enabled_ = settings.value("ScrobblingEnabled", true).toBool(); buttons_visible_ = settings.value("ShowLoveBanButtons", true).toBool(); scrobble_button_visible_ = settings.value("ShowScrobbleButton", true).toBool(); prefer_albumartist_ = settings.value("PreferAlbumArtist", false).toBool(); // avoid emitting signal if it's not changed if (scrobbling_enabled_old != scrobbling_enabled_) emit ScrobblingEnabledChanged(scrobbling_enabled_); emit ButtonVisibilityChanged(buttons_visible_); emit ScrobbleButtonVisibilityChanged(scrobble_button_visible_); emit PreferAlbumArtistChanged(prefer_albumartist_); } void LastFMService::ShowConfig() { app_->OpenSettingsDialogAtPage(SettingsDialog::Page_Lastfm); } bool LastFMService::IsAuthenticated() const { return !lastfm::ws::SessionKey.isEmpty(); } bool LastFMService::IsSubscriber() const { QSettings settings; settings.beginGroup(kSettingsGroup); return settings.value("Subscriber", false).toBool(); } void LastFMService::Authenticate(const QString& username, const QString& password) { QMap params; params["method"] = "auth.getMobileSession"; params["username"] = username; params["authToken"] = lastfm::md5((username + lastfm::md5(password.toUtf8())).toUtf8()); QNetworkReply* reply = lastfm::ws::post(params); NewClosure(reply, SIGNAL(finished()), this, SLOT(AuthenticateReplyFinished(QNetworkReply*)), reply); // If we need more detailed error reporting, handle error(NetworkError) signal } void LastFMService::SignOut() { lastfm::ws::Username.clear(); lastfm::ws::SessionKey.clear(); QSettings settings; settings.beginGroup(kSettingsGroup); settings.setValue("Username", QString()); settings.setValue("Session", QString()); } void LastFMService::AuthenticateReplyFinished(QNetworkReply* reply) { reply->deleteLater(); // Parse the reply lastfm::XmlQuery lfm(lastfm::compat::EmptyXmlQuery()); if (lastfm::compat::ParseQuery(reply->readAll(), &lfm)) { lastfm::ws::Username = lfm["session"]["name"].text(); lastfm::ws::SessionKey = lfm["session"]["key"].text(); QString subscribed = lfm["session"]["subscriber"].text(); const bool is_subscriber = (subscribed.toInt() == 1); // Save the session key QSettings settings; settings.beginGroup(kSettingsGroup); settings.setValue("Username", lastfm::ws::Username); settings.setValue("Session", lastfm::ws::SessionKey); settings.setValue("Subscriber", is_subscriber); } else { emit AuthenticationComplete(false, lfm["error"].text().trimmed()); return; } // Invalidate the scrobbler - it will get recreated later delete scrobbler_; scrobbler_ = nullptr; emit AuthenticationComplete(true, QString()); } void LastFMService::UpdateSubscriberStatus() { QMap params; params["method"] = "user.getInfo"; params["user"] = lastfm::ws::Username; QNetworkReply* reply = lastfm::ws::post(params); NewClosure(reply, SIGNAL(finished()), this, SLOT(UpdateSubscriberStatusFinished(QNetworkReply*)), reply); } void LastFMService::UpdateSubscriberStatusFinished(QNetworkReply* reply) { reply->deleteLater(); bool is_subscriber = false; lastfm::XmlQuery lfm(lastfm::compat::EmptyXmlQuery()); if (lastfm::compat::ParseQuery(reply->readAll(), &lfm, &connection_problems_)) { QString subscriber = lfm["user"]["subscriber"].text(); is_subscriber = (subscriber.toInt() == 1); QSettings settings; settings.beginGroup(kSettingsGroup); settings.setValue("Subscriber", is_subscriber); qLog(Info) << lastfm::ws::Username << "Subscriber status:" << is_subscriber; } emit UpdatedSubscriberStatus(is_subscriber); } QUrl LastFMService::FixupUrl(const QUrl& url) { QUrl ret; ret.setEncodedUrl(url.toEncoded().replace( "USERNAME", QUrl::toPercentEncoding(lastfm::ws::Username))); return ret; } QString LastFMService::ErrorString(lastfm::ws::Error error) const { switch (error) { case lastfm::ws::InvalidService: return tr("Invalid service"); case lastfm::ws::InvalidMethod: return tr("Invalid method"); case lastfm::ws::AuthenticationFailed: return tr("Authentication failed"); case lastfm::ws::InvalidFormat: return tr("Invalid format"); case lastfm::ws::InvalidParameters: return tr("Invalid parameters"); case lastfm::ws::InvalidResourceSpecified: return tr("Invalid resource specified"); case lastfm::ws::OperationFailed: return tr("Operation failed"); case lastfm::ws::InvalidSessionKey: return tr("Invalid session key"); case lastfm::ws::InvalidApiKey: return tr("Invalid API key"); case lastfm::ws::ServiceOffline: return tr("Service offline"); case lastfm::ws::SubscribersOnly: return tr("This stream is for paid subscribers only"); case lastfm::ws::TryAgainLater: return tr("Last.fm is currently busy, please try again in a few minutes"); case lastfm::ws::NotEnoughContent: return tr("Not enough content"); case lastfm::ws::NotEnoughMembers: return tr("Not enough members"); case lastfm::ws::NotEnoughFans: return tr("Not enough fans"); case lastfm::ws::NotEnoughNeighbours: return tr("Not enough neighbors"); case lastfm::ws::MalformedResponse: return tr("Malformed response"); case lastfm::ws::UnknownError: default: return tr("Unknown error"); } } bool LastFMService::InitScrobbler() { if (!IsAuthenticated() || !IsScrobblingEnabled()) return false; if (!scrobbler_) scrobbler_ = new lastfm::Audioscrobbler(kAudioscrobblerClientId); // reemit the signal since the sender is private #ifdef HAVE_LIBLASTFM1 connect(scrobbler_, SIGNAL(scrobblesSubmitted(QList)), SIGNAL(ScrobbleSubmitted())); connect(scrobbler_, SIGNAL(nowPlayingError(int, QString)), SIGNAL(ScrobbleError(int))); #else connect(scrobbler_, SIGNAL(status(int)), SLOT(ScrobblerStatus(int))); #endif return true; } void LastFMService::ScrobblerStatus(int value) { switch (value) { case 2: case 3: emit ScrobbleSubmitted(); break; default: emit ScrobbleError(value); break; } } lastfm::Track LastFMService::TrackFromSong(const Song& song) const { if (song.title() == last_track_.title() && song.artist() == last_track_.artist() && song.album() == last_track_.album()) return last_track_; lastfm::Track ret; song.ToLastFM(&ret, PreferAlbumArtist()); return ret; } void LastFMService::NowPlaying(const Song& song) { if (!InitScrobbler()) return; // Scrobbling streams is difficult if we don't have length of each individual // part. In Song::ToLastFm we set the Track's source to // NonPersonalisedBroadcast if it's such a stream, so we have to scrobble it // when we change to a different track, but only if enough time has elapsed // since it started playing. if (!last_track_.isNull() && last_track_.source() == lastfm::Track::NonPersonalisedBroadcast) { const int duration_secs = last_track_.timestamp().secsTo(QDateTime::currentDateTime()); if (duration_secs >= lastfm::compat::ScrobbleTimeMin()) { lastfm::MutableTrack mtrack(last_track_); mtrack.setDuration(duration_secs); qLog(Info) << "Scrobbling stream track" << mtrack.title() << "length" << duration_secs; scrobbler_->cache(mtrack); scrobbler_->submit(); emit ScrobbledRadioStream(); } } lastfm::MutableTrack mtrack(TrackFromSong(song)); mtrack.stamp(); already_scrobbled_ = false; last_track_ = mtrack; #ifndef HAVE_LIBLASTFM1 // Check immediately if the song is valid Scrobble::Invalidity invalidity; if (!lastfm::Scrobble(last_track_).isValid(&invalidity)) { // for now just notify this, we can also see the cause emit ScrobbleError(-1); return; } #else // TODO(John Maguire): validity was removed from liblastfm1 but might reappear, // it should have // no impact as we get a different error when actually trying to scrobble. #endif scrobbler_->nowPlaying(mtrack); } void LastFMService::Scrobble() { if (!InitScrobbler()) return; lastfm::compat::ScrobbleCache cache(lastfm::ws::Username); qLog(Debug) << "There are" << cache.tracks().count() << "tracks in the last.fm cache."; scrobbler_->cache(last_track_); // Let's mark a track as cached, useful when the connection is down emit ScrobbleError(30); scrobbler_->submit(); already_scrobbled_ = true; } void LastFMService::Love() { if (!IsAuthenticated()) ShowConfig(); lastfm::MutableTrack mtrack(last_track_); mtrack.love(); last_track_ = mtrack; if (already_scrobbled_) { // The love only takes effect when the song is scrobbled, but we've already // scrobbled this one so we have to do it again. Scrobble(); } } void LastFMService::Ban() { if (!IsAuthenticated()) ShowConfig(); lastfm::MutableTrack mtrack(last_track_); mtrack.ban(); last_track_ = mtrack; Scrobble(); app_->player()->Next(); } void LastFMService::ToggleScrobbling() { // toggle status scrobbling_enabled_ = !scrobbling_enabled_; // save to the settings QSettings s; s.beginGroup(kSettingsGroup); s.setValue("ScrobblingEnabled", scrobbling_enabled_); s.endGroup(); emit ScrobblingEnabledChanged(scrobbling_enabled_); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/lastfm/lastfmservice.h000066400000000000000000000073251260417502300263230ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2009-2013, David Sansome Copyright 2010-2012, 2014, John Maguire Copyright 2011, Andrea Decorte Copyright 2012, Kacper "mattrick" Banasik Copyright 2012, Harald Sitter Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_LASTFM_LASTFMSERVICE_H_ #define INTERNET_LASTFM_LASTFMSERVICE_H_ #include namespace lastfm { class Track; } #include uint qHash(const lastfm::Track& track); #include "lastfmcompat.h" #include "internet/core/scrobbler.h" class Application; class LastFMUrlHandler; class QAction; class QNetworkAccessManager; class Song; class LastFMService : public Scrobbler { Q_OBJECT public: explicit LastFMService(Application* app, QObject* parent = nullptr); ~LastFMService(); static const char* kServiceName; static const char* kSettingsGroup; static const char* kAudioscrobblerClientId; static const char* kApiKey; static const char* kSecret; void ReloadSettings(); virtual QString Icon() { return ":last.fm/lastfm.png"; } // Last.fm specific stuff bool IsAuthenticated() const; bool IsSubscriber() const; bool IsScrobblingEnabled() const { return scrobbling_enabled_; } bool AreButtonsVisible() const { return buttons_visible_; } bool IsScrobbleButtonVisible() const { return scrobble_button_visible_; } bool PreferAlbumArtist() const { return prefer_albumartist_; } bool HasConnectionProblems() const { return connection_problems_; } void Authenticate(const QString& username, const QString& password); void SignOut(); void UpdateSubscriberStatus(); public slots: void NowPlaying(const Song& song); void Scrobble(); void Love(); void Ban(); void ShowConfig(); void ToggleScrobbling(); signals: void AuthenticationComplete(bool success, const QString& error_message); void ScrobblingEnabledChanged(bool value); void ButtonVisibilityChanged(bool value); void ScrobbleButtonVisibilityChanged(bool value); void PreferAlbumArtistChanged(bool value); void ScrobbleSubmitted(); void ScrobbleError(int value); void UpdatedSubscriberStatus(bool is_subscriber); void ScrobbledRadioStream(); void SavedItemsChanged(); private slots: void AuthenticateReplyFinished(QNetworkReply* reply); void UpdateSubscriberStatusFinished(QNetworkReply* reply); void ScrobblerStatus(int value); private: QString ErrorString(lastfm::ws::Error error) const; bool InitScrobbler(); lastfm::Track TrackFromSong(const Song& song) const; static QUrl FixupUrl(const QUrl& url); private: lastfm::Audioscrobbler* scrobbler_; lastfm::Track last_track_; lastfm::Track next_metadata_; bool already_scrobbled_; QUrl last_url_; bool scrobbling_enabled_; bool buttons_visible_; bool scrobble_button_visible_; bool prefer_albumartist_; QHash art_urls_; // Useful to inform the user that we can't scrobble right now bool connection_problems_; Application* app_; }; #endif // INTERNET_LASTFM_LASTFMSERVICE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/lastfm/lastfmsettingspage.cpp000066400000000000000000000100671260417502300277100ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2009-2011, 2013, David Sansome Copyright 2011, Andrea Decorte Copyright 2011, 2014, John Maguire Copyright 2012, Kacper "mattrick" Banasik Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "lastfmsettingspage.h" #include "ui_lastfmsettingspage.h" #include #include #include #include "lastfmservice.h" #include "internet/core/internetmodel.h" #include "core/application.h" #include "ui/iconloader.h" LastFMSettingsPage::LastFMSettingsPage(SettingsDialog* dialog) : SettingsPage(dialog), service_(static_cast(dialog->app()->scrobbler())), ui_(new Ui_LastFMSettingsPage), waiting_for_auth_(false) { ui_->setupUi(this); // Icons setWindowIcon(QIcon(":/last.fm/as.png")); connect(service_, SIGNAL(AuthenticationComplete(bool, QString)), SLOT(AuthenticationComplete(bool, QString))); connect(ui_->login_state, SIGNAL(LogoutClicked()), SLOT(Logout())); connect(ui_->login_state, SIGNAL(LoginClicked()), SLOT(Login())); connect(ui_->login, SIGNAL(clicked()), SLOT(Login())); ui_->login_state->AddCredentialField(ui_->username); ui_->login_state->AddCredentialField(ui_->password); ui_->login_state->AddCredentialGroup(ui_->groupBox); ui_->username->setMinimumWidth(QFontMetrics(QFont()).width("WWWWWWWWWWWW")); resize(sizeHint()); } LastFMSettingsPage::~LastFMSettingsPage() { delete ui_; } void LastFMSettingsPage::Login() { waiting_for_auth_ = true; ui_->login_state->SetLoggedIn(LoginStateWidget::LoginInProgress); service_->Authenticate(ui_->username->text(), ui_->password->text()); } void LastFMSettingsPage::AuthenticationComplete(bool success, const QString& message) { if (!waiting_for_auth_) return; // Wasn't us that was waiting for auth waiting_for_auth_ = false; if (success) { // Clear password just to be sure ui_->password->clear(); // Save settings Save(); } else { QString dialog_text = tr("Your Last.fm credentials were incorrect"); if (!message.isEmpty()) { dialog_text = message; } QMessageBox::warning(this, tr("Authentication failed"), dialog_text); } RefreshControls(success); } void LastFMSettingsPage::Load() { ui_->scrobble->setChecked(service_->IsScrobblingEnabled()); ui_->love_ban_->setChecked(service_->AreButtonsVisible()); ui_->scrobble_button->setChecked(service_->IsScrobbleButtonVisible()); ui_->prefer_albumartist->setChecked(service_->PreferAlbumArtist()); RefreshControls(service_->IsAuthenticated()); } void LastFMSettingsPage::Save() { QSettings s; s.beginGroup(LastFMService::kSettingsGroup); s.setValue("ScrobblingEnabled", ui_->scrobble->isChecked()); s.setValue("ShowLoveBanButtons", ui_->love_ban_->isChecked()); s.setValue("ShowScrobbleButton", ui_->scrobble_button->isChecked()); s.setValue("PreferAlbumArtist", ui_->prefer_albumartist->isChecked()); s.endGroup(); service_->ReloadSettings(); } void LastFMSettingsPage::Logout() { ui_->username->clear(); ui_->password->clear(); RefreshControls(false); service_->SignOut(); } void LastFMSettingsPage::RefreshControls(bool authenticated) { ui_->login_state->SetLoggedIn( authenticated ? LoginStateWidget::LoggedIn : LoginStateWidget::LoggedOut, lastfm::ws::Username); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/lastfm/lastfmsettingspage.h000066400000000000000000000030611260417502300273510ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2009-2011, 2013, David Sansome Copyright 2011, Andrea Decorte Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_LASTFM_LASTFMSETTINGSPAGE_H_ #define INTERNET_LASTFM_LASTFMSETTINGSPAGE_H_ #include "ui/settingspage.h" class LastFMService; class Ui_LastFMSettingsPage; class LastFMSettingsPage : public SettingsPage { Q_OBJECT public: explicit LastFMSettingsPage(SettingsDialog* dialog); ~LastFMSettingsPage(); void Load(); void Save(); private slots: void Login(); void AuthenticationComplete(bool success, const QString& error_message); void Logout(); private: LastFMService* service_; Ui_LastFMSettingsPage* ui_; bool waiting_for_auth_; void RefreshControls(bool authenticated); }; #endif // INTERNET_LASTFM_LASTFMSETTINGSPAGE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/lastfm/lastfmsettingspage.ui000066400000000000000000000074571260417502300275540ustar00rootroot00000000000000 LastFMSettingsPage 0 0 769 551 Last.fm Account details QFormLayout::AllNonFixedFieldsGrow Last.fm username Login Last.fm password QLineEdit::Password Preferences Scrobble tracks that I listen to true Show the "love" button true Show the scrobble button in the main window Use Album Artist tag when available Qt::Vertical 20 40 LoginStateWidget QWidget
widgets/loginstatewidget.h
1
username password login scrobble love_ban_ scrobble_button
clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/lastfm/lastfmurlhandler.h000066400000000000000000000026751260417502300270260ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_LASTFM_LASTFMURLHANDLER_H_ #define INTERNET_LASTFM_LASTFMURLHANDLER_H_ #include "core/urlhandler.h" class LastFMService; class LastFMUrlHandler : public UrlHandler { friend class LastFMService; public: LastFMUrlHandler(LastFMService* service, QObject* parent); QString scheme() const { return "lastfm"; } QIcon icon() const { return QIcon(":last.fm/as.png"); } LoadResult StartLoading(const QUrl& url); LoadResult LoadNext(const QUrl& url); void TunerTrackAvailable(); void TunerError(); private: LastFMService* service_; }; #endif // INTERNET_LASTFM_LASTFMURLHANDLER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/magnatune/000077500000000000000000000000001260417502300237655ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/magnatune/magnatunedownloaddialog.cpp000066400000000000000000000233131260417502300313620ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, 2012, David Sansome Copyright 2011-2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "magnatunedownloaddialog.h" #include #include #include #include #include #include #include #include #include #include #include #include "magnatuneservice.h" #include "internet/core/internetmodel.h" #include "ui_magnatunedownloaddialog.h" #include "core/logging.h" #include "core/network.h" #include "core/utilities.h" #include "widgets/progressitemdelegate.h" MagnatuneDownloadDialog::MagnatuneDownloadDialog(MagnatuneService* service, QWidget* parent) : QDialog(parent), ui_(new Ui_MagnatuneDownloadDialog), service_(service), network_(new NetworkAccessManager(this)), current_reply_(nullptr), next_row_(0) { ui_->setupUi(this); ui_->albums->header()->setResizeMode(QHeaderView::ResizeToContents); ui_->albums->header()->setResizeMode(1, QHeaderView::Fixed); ui_->albums->header()->resizeSection(1, 150); ui_->albums->setItemDelegateForColumn(1, new ProgressItemDelegate(this)); ui_->button_box->button(QDialogButtonBox::Cancel)->hide(); connect(ui_->browse, SIGNAL(clicked()), SLOT(Browse())); QSettings s; s.beginGroup(MagnatuneService::kSettingsGroup); ui_->directory->setText(s.value("download_dir", QDir::homePath()).toString()); } MagnatuneDownloadDialog::~MagnatuneDownloadDialog() { delete ui_; delete current_reply_; } void MagnatuneDownloadDialog::Show(const SongList& songs) { ui_->albums->clear(); QSet sku_codes; for (const Song& song : songs) { if (!sku_codes.contains(song.comment())) { sku_codes.insert(song.comment()); QTreeWidgetItem* item = new QTreeWidgetItem(ui_->albums); item->setText(0, song.artist() + " - " + song.album()); item->setData(0, Qt::UserRole, song.comment()); } } ui_->button_box->button(QDialogButtonBox::Ok)->show(); ui_->format->setCurrentIndex(service_->preferred_format()); show(); } void MagnatuneDownloadDialog::accept() { QFileInfo dir(ui_->directory->text()); if (!dir.exists() || !dir.isDir() || !dir.isWritable()) { ShowError(tr("The directory %1 is not valid").arg(ui_->directory->text())); ui_->directory->setFocus(); return; } ui_->button_box->button(QDialogButtonBox::Ok)->hide(); ui_->button_box->button(QDialogButtonBox::Close)->hide(); ui_->button_box->button(QDialogButtonBox::Cancel)->show(); ui_->options->setEnabled(false); // Reset all the progress bars for (int i = 0; i < ui_->albums->topLevelItemCount(); ++i) { ui_->albums->topLevelItem(i)->setData(1, Qt::DisplayRole, QVariant()); } next_row_ = 0; DownloadNext(); } void MagnatuneDownloadDialog::DownloadNext() { // We have to download an XML file first that gives us the URLs of the actual // zipped album. if (next_row_ >= ui_->albums->topLevelItemCount()) { AllFinished(false); return; } QTreeWidgetItem* item = ui_->albums->topLevelItem(next_row_); QString sku = item->data(0, Qt::UserRole).toString(); item->setData(1, Qt::DisplayRole, tr("Starting...")); QUrl url(MagnatuneService::kDownloadUrl); url.setUserName(service_->username()); url.setPassword(service_->password()); url.addQueryItem("id", MagnatuneService::kPartnerId); url.addQueryItem("sku", sku); current_reply_ = network_->get(QNetworkRequest(url)); connect(current_reply_, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(Error(QNetworkReply::NetworkError))); connect(current_reply_, SIGNAL(finished()), SLOT(MetadataFinished())); } void MagnatuneDownloadDialog::Error(QNetworkReply::NetworkError e) { QNetworkReply* reply = qobject_cast(sender()); reply->deleteLater(); QUrl url = reply->url(); url.setPassword(QString()); QMetaEnum error_enum = QNetworkReply::staticMetaObject.enumerator( QNetworkReply::staticMetaObject.indexOfEnumerator("NetworkError")); QString message = tr("Unable to download %1 (%2)").arg(url.toString()).arg( error_enum.valueToKey(e)); ShowError(message); } void MagnatuneDownloadDialog::MetadataFinished() { QNetworkReply* reply = qobject_cast(sender()); reply->deleteLater(); // The reply isn't valid XML so we can't use QtXML to parse it :( QString data = QString::fromUtf8(reply->readAll()); // Check for errors if (data.contains("")) { ShowError(tr("There was a problem fetching the metadata from Magnatune")); return; } // Work out what format we want QString type; switch (ui_->format->currentIndex()) { case MagnatuneService::Format_Ogg: type = "URL_OGGZIP"; break; case MagnatuneService::Format_Flac: type = "URL_FLACZIP"; break; case MagnatuneService::Format_Wav: type = "URL_WAVZIP"; break; case MagnatuneService::Format_MP3_VBR: type = "URL_VBRZIP"; break; case MagnatuneService::Format_MP3_128: type = "URL_128KMP3ZIP"; break; } // Parse the XML (lol) to find the URL QRegExp re(QString("<%1>([^<]+)").arg(type, type)); if (re.indexIn(data) == -1) { ShowError(tr("This album is not available in the requested format")); return; } // Munge the URL a bit QString url_text = Utilities::DecodeHtmlEntities(re.cap(1)); QUrl url = QUrl(url_text); url.setUserName(service_->username()); url.setPassword(service_->password()); qLog(Debug) << "Downloading" << url; // Start the actual download current_reply_ = network_->get(QNetworkRequest(url)); connect(current_reply_, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(Error(QNetworkReply::NetworkError))); connect(current_reply_, SIGNAL(finished()), SLOT(DownloadFinished())); connect(current_reply_, SIGNAL(downloadProgress(qint64, qint64)), SLOT(DownloadProgress(qint64, qint64))); connect(current_reply_, SIGNAL(readyRead()), SLOT(DownloadReadyRead())); // Close any open file download_file_.reset(); // Open the output file QString output_filename = GetOutputFilename(); download_file_.reset(new QFile(output_filename)); if (!download_file_->open(QIODevice::WriteOnly)) { ShowError(tr("Couldn't open output file %1").arg(output_filename)); } } void MagnatuneDownloadDialog::DownloadFinished() { current_reply_->deleteLater(); next_row_++; DownloadNext(); } void MagnatuneDownloadDialog::DownloadProgress(qint64 received, qint64 total) { int percent = static_cast(received) / total * 100; ui_->albums->topLevelItem(next_row_)->setData(1, Qt::DisplayRole, percent); } void MagnatuneDownloadDialog::DownloadReadyRead() { QNetworkReply* reply = qobject_cast(sender()); download_file_->write(reply->readAll()); } void MagnatuneDownloadDialog::ShowError(const QString& message) { QMessageBox::critical(this, tr("Error"), message, QMessageBox::Close); AllFinished(true); } void MagnatuneDownloadDialog::AllFinished(bool error) { current_reply_ = nullptr; if (error) ui_->button_box->button(QDialogButtonBox::Ok)->show(); ui_->button_box->button(QDialogButtonBox::Close)->show(); ui_->button_box->button(QDialogButtonBox::Cancel)->hide(); ui_->options->setEnabled(true); // Make the taskbar flash QApplication::alert(this); if (!error) { QStringList albums; for (int i = 0; i < ui_->albums->topLevelItemCount(); ++i) { albums << ui_->albums->topLevelItem(i)->text(0); } emit Finished(albums); } } void MagnatuneDownloadDialog::Browse() { QString dir = QFileDialog::getExistingDirectory( this, tr("Download directory"), ui_->directory->text()); QSettings s; s.beginGroup(MagnatuneService::kSettingsGroup); s.setValue("download_dir", dir); ui_->directory->setText(dir); } QString MagnatuneDownloadDialog::GetOutputFilename() { QString album = ui_->albums->topLevelItem(next_row_)->text(0); QString extension; switch (MagnatuneService::PreferredFormat(ui_->format->currentIndex())) { case MagnatuneService::Format_Ogg: extension = "ogg"; break; case MagnatuneService::Format_Flac: extension = "flac"; break; case MagnatuneService::Format_Wav: extension = "wav"; break; case MagnatuneService::Format_MP3_VBR: extension = "vbr"; break; case MagnatuneService::Format_MP3_128: extension = "mp3"; break; } return QString("%1/%2-%3.zip").arg(ui_->directory->text(), album, extension); } void MagnatuneDownloadDialog::closeEvent(QCloseEvent* e) { if (current_reply_ && current_reply_->isRunning()) { std::unique_ptr message_box( new QMessageBox(QMessageBox::Question, tr("Really cancel?"), tr("Closing this window will cancel the download."), QMessageBox::Abort, this)); message_box->addButton(tr("Don't stop!"), QMessageBox::AcceptRole); if (message_box->exec() != QMessageBox::Abort) { e->ignore(); } } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/magnatune/magnatunedownloaddialog.h000066400000000000000000000041461260417502300310320ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_MAGNATUNE_MAGNATUNEDOWNLOADDIALOG_H_ #define INTERNET_MAGNATUNE_MAGNATUNEDOWNLOADDIALOG_H_ #include #include #include #include #include "core/song.h" class MagnatuneService; class Ui_MagnatuneDownloadDialog; class QFile; class QXmlStreamReader; class MagnatuneDownloadDialog : public QDialog { Q_OBJECT public: explicit MagnatuneDownloadDialog(MagnatuneService* service, QWidget* parent = nullptr); ~MagnatuneDownloadDialog(); void Show(const SongList& songs); signals: void Finished(const QStringList& albums); public slots: void accept(); protected: void closeEvent(QCloseEvent* e); private slots: void Browse(); void DownloadNext(); void Error(QNetworkReply::NetworkError); void MetadataFinished(); void DownloadProgress(qint64 received, qint64 total); void DownloadReadyRead(); void DownloadFinished(); void ShowError(const QString& message); void AllFinished(bool error); private: QString GetOutputFilename(); private: Ui_MagnatuneDownloadDialog* ui_; MagnatuneService* service_; QNetworkAccessManager* network_; QNetworkReply* current_reply_; std::unique_ptr download_file_; int next_row_; }; #endif // INTERNET_MAGNATUNE_MAGNATUNEDOWNLOADDIALOG_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/magnatune/magnatunedownloaddialog.ui000066400000000000000000000106641260417502300312220ustar00rootroot00000000000000 MagnatuneDownloadDialog 0 0 502 330 Magnatune Download :/providers/magnatune.png:/providers/magnatune.png You are about to download the following albums QAbstractItemView::NoSelection false true false Name Progress 0 Format Ogg Vorbis FLAC WAV VBR MP3 128k MP3 Directory Browse... Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Close|QDialogButtonBox::Ok albums format directory browse button_box button_box accepted() MagnatuneDownloadDialog accept() 248 254 157 274 button_box rejected() MagnatuneDownloadDialog reject() 316 260 286 274 clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/magnatune/magnatuneplaylistitem.cpp000066400000000000000000000026251260417502300311160ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, David Sansome Copyright 2010, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "magnatuneplaylistitem.h" #include "internet/core/internetmodel.h" MagnatunePlaylistItem::MagnatunePlaylistItem(const QString& type) : LibraryPlaylistItem(type) {} MagnatunePlaylistItem::MagnatunePlaylistItem(const Song& song) : LibraryPlaylistItem("Magnatune") { song_ = song; } bool MagnatunePlaylistItem::InitFromQuery(const SqlRow& query) { // Rows from the songs tables come first song_.InitFromQuery(query, true, Song::kColumns.count() + 1); return song_.is_valid(); } QUrl MagnatunePlaylistItem::Url() const { return song_.url(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/magnatune/magnatuneplaylistitem.h000066400000000000000000000024171260417502300305620ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, John Maguire Copyright 2010, David Sansome Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_MAGNATUNE_MAGNATUNEPLAYLISTITEM_H_ #define INTERNET_MAGNATUNE_MAGNATUNEPLAYLISTITEM_H_ #include "library/libraryplaylistitem.h" class MagnatunePlaylistItem : public LibraryPlaylistItem { public: explicit MagnatunePlaylistItem(const QString& type); explicit MagnatunePlaylistItem(const Song& song); bool InitFromQuery(const SqlRow& query); QUrl Url() const; }; #endif // INTERNET_MAGNATUNE_MAGNATUNEPLAYLISTITEM_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/magnatune/magnatuneservice.cpp000066400000000000000000000275441260417502300300450ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2013, David Sansome Copyright 2011, Arnaud Bienner Copyright 2011, Tyler Rhodes Copyright 2011, Paweł Bara Copyright 2012, 2014, John Maguire Copyright 2013, Alan Briolat Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "magnatuneservice.h" #include #include #include #include #include #include #include #include #include #include #include "qtiocompressor.h" #include "magnatunedownloaddialog.h" #include "magnatuneplaylistitem.h" #include "magnatuneurlhandler.h" #include "internet/core/internetmodel.h" #include "core/application.h" #include "core/database.h" #include "core/logging.h" #include "core/mergedproxymodel.h" #include "core/network.h" #include "core/player.h" #include "core/song.h" #include "core/taskmanager.h" #include "core/timeconstants.h" #include "globalsearch/globalsearch.h" #include "globalsearch/librarysearchprovider.h" #include "library/librarymodel.h" #include "library/librarybackend.h" #include "library/libraryfilterwidget.h" #include "ui/iconloader.h" #include "ui/settingsdialog.h" const char* MagnatuneService::kServiceName = "Magnatune"; const char* MagnatuneService::kSettingsGroup = "Magnatune"; const char* MagnatuneService::kSongsTable = "magnatune_songs"; const char* MagnatuneService::kFtsTable = "magnatune_songs_fts"; const char* MagnatuneService::kHomepage = "http://magnatune.com"; const char* MagnatuneService::kDatabaseUrl = "http://magnatune.com/info/song_info_xml.gz"; const char* MagnatuneService::kStreamingHostname = "streaming.magnatune.com"; const char* MagnatuneService::kDownloadHostname = "download.magnatune.com"; const char* MagnatuneService::kPartnerId = "clementine"; const char* MagnatuneService::kDownloadUrl = "http://download.magnatune.com/buy/membership_free_dl_xml"; MagnatuneService::MagnatuneService(Application* app, InternetModel* parent) : InternetService(kServiceName, app, parent, parent), url_handler_(new MagnatuneUrlHandler(this, this)), context_menu_(nullptr), root_(nullptr), library_backend_(nullptr), library_model_(nullptr), library_filter_(nullptr), library_sort_model_(new QSortFilterProxyModel(this)), load_database_task_id_(0), membership_(Membership_None), format_(Format_Ogg), total_song_count_(0), network_(new NetworkAccessManager(this)) { // Create the library backend in the database thread library_backend_ = new LibraryBackend; library_backend_->moveToThread(app_->database()->thread()); library_backend_->Init(app_->database(), kSongsTable, QString::null, QString::null, kFtsTable); library_model_ = new LibraryModel(library_backend_, app_, this); connect(library_backend_, SIGNAL(TotalSongCountUpdated(int)), SLOT(UpdateTotalSongCount(int))); library_sort_model_->setSourceModel(library_model_); library_sort_model_->setSortRole(LibraryModel::Role_SortText); library_sort_model_->setDynamicSortFilter(true); library_sort_model_->setSortLocaleAware(true); library_sort_model_->sort(0); app_->player()->RegisterUrlHandler(url_handler_); app_->global_search()->AddProvider(new LibrarySearchProvider( library_backend_, tr("Magnatune"), "magnatune", QIcon(":/providers/magnatune.png"), true, app_, this)); } MagnatuneService::~MagnatuneService() { delete context_menu_; } void MagnatuneService::ReloadSettings() { QSettings s; s.beginGroup(kSettingsGroup); membership_ = MembershipType(s.value("membership", Membership_None).toInt()); username_ = s.value("username").toString(); password_ = s.value("password").toString(); format_ = PreferredFormat(s.value("format", Format_Ogg).toInt()); } QStandardItem* MagnatuneService::CreateRootItem() { root_ = new QStandardItem(QIcon(":/providers/magnatune.png"), kServiceName); root_->setData(true, InternetModel::Role_CanLazyLoad); return root_; } void MagnatuneService::LazyPopulate(QStandardItem* item) { switch (item->data(InternetModel::Role_Type).toInt()) { case InternetModel::Type_Service: library_model_->Init(); if (total_song_count_ == 0 && !load_database_task_id_) { ReloadDatabase(); } model()->merged_model()->AddSubModel(item->index(), library_sort_model_); break; default: break; } } void MagnatuneService::UpdateTotalSongCount(int count) { total_song_count_ = count; } void MagnatuneService::ReloadDatabase() { QNetworkRequest request = QNetworkRequest(QUrl(kDatabaseUrl)); request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork); QNetworkReply* reply = network_->get(request); connect(reply, SIGNAL(finished()), SLOT(ReloadDatabaseFinished())); if (!load_database_task_id_) load_database_task_id_ = app_->task_manager()->StartTask(tr("Downloading Magnatune catalogue")); } void MagnatuneService::ReloadDatabaseFinished() { QNetworkReply* reply = qobject_cast(sender()); app_->task_manager()->SetTaskFinished(load_database_task_id_); load_database_task_id_ = 0; if (reply->error() != QNetworkReply::NoError) { // TODO(David Sansome): Error handling qLog(Error) << reply->errorString(); return; } if (root_->hasChildren()) root_->removeRows(0, root_->rowCount()); // The XML file is compressed QtIOCompressor gzip(reply); gzip.setStreamFormat(QtIOCompressor::GzipFormat); if (!gzip.open(QIODevice::ReadOnly)) { qLog(Warning) << "Error opening gzip stream"; return; } // Remove all existing songs in the database library_backend_->DeleteAll(); // Parse the XML we got from Magnatune QXmlStreamReader reader(&gzip); SongList songs; while (!reader.atEnd()) { reader.readNext(); if (reader.tokenType() == QXmlStreamReader::StartElement && reader.name() == "Track") { songs << ReadTrack(reader); } } // Add the songs to the database library_backend_->AddOrUpdateSongs(songs); library_model_->Reset(); } Song MagnatuneService::ReadTrack(QXmlStreamReader& reader) { Song song; while (!reader.atEnd()) { reader.readNext(); if (reader.tokenType() == QXmlStreamReader::EndElement) break; if (reader.tokenType() == QXmlStreamReader::StartElement) { QStringRef name = reader.name(); QString value = ReadElementText(reader); if (name == "artist") song.set_artist(value); if (name == "albumname") song.set_album(value); if (name == "trackname") song.set_title(value); if (name == "tracknum") song.set_track(value.toInt()); if (name == "year") song.set_year(value.toInt()); if (name == "magnatunegenres") song.set_genre(value.section(',', 0, 0)); if (name == "seconds") song.set_length_nanosec(value.toInt() * kNsecPerSec); if (name == "cover_small") song.set_art_automatic(value); if (name == "albumsku") song.set_comment(value); if (name == "url") { QUrl url; // Magnatune's URLs are already encoded url.setEncodedUrl(value.toLocal8Bit()); url.setScheme("magnatune"); song.set_url(url); } } } song.set_valid(true); song.set_filetype(Song::Type_Stream); // We need to set these to satisfy the database constraints song.set_directory_id(0); song.set_mtime(0); song.set_ctime(0); song.set_filesize(0); return song; } // TODO(David Sansome): Replace with readElementText(SkipChildElements) in Qt 4.6 QString MagnatuneService::ReadElementText(QXmlStreamReader& reader) { int level = 1; QString ret; while (!reader.atEnd()) { switch (reader.readNext()) { case QXmlStreamReader::StartElement: level++; break; case QXmlStreamReader::EndElement: level--; break; case QXmlStreamReader::Characters: ret += reader.text().toString().trimmed(); break; default: break; } if (level == 0) break; } return ret; } void MagnatuneService::EnsureMenuCreated() { if (context_menu_) return; context_menu_ = new QMenu; context_menu_->addActions(GetPlaylistActions()); download_ = context_menu_->addAction(IconLoader::Load("download"), tr("Download this album"), this, SLOT(Download())); context_menu_->addSeparator(); context_menu_->addAction(IconLoader::Load("download"), tr("Open %1 in browser").arg("magnatune.com"), this, SLOT(Homepage())); context_menu_->addAction(IconLoader::Load("view-refresh"), tr("Refresh catalogue"), this, SLOT(ReloadDatabase())); QAction* config_action = context_menu_->addAction( IconLoader::Load("configure"), tr("Configure Magnatune..."), this, SLOT(ShowConfig())); library_filter_ = new LibraryFilterWidget(0); library_filter_->SetSettingsGroup(kSettingsGroup); library_filter_->SetLibraryModel(library_model_); library_filter_->SetFilterHint(tr("Search Magnatune")); library_filter_->SetAgeFilterEnabled(false); library_filter_->AddMenuAction(config_action); context_menu_->addSeparator(); context_menu_->addMenu(library_filter_->menu()); } void MagnatuneService::ShowContextMenu(const QPoint& global_pos) { EnsureMenuCreated(); const bool is_valid = model()->current_index().model() == library_sort_model_; GetAppendToPlaylistAction()->setEnabled(is_valid); GetReplacePlaylistAction()->setEnabled(is_valid); GetOpenInNewPlaylistAction()->setEnabled(is_valid); download_->setEnabled(is_valid && membership_ == Membership_Download); context_menu_->popup(global_pos); } void MagnatuneService::Homepage() { QDesktopServices::openUrl(QUrl(kHomepage)); } QUrl MagnatuneService::ModifyUrl(const QUrl& url) const { QUrl ret(url); ret.setScheme("http"); switch (membership_) { case Membership_None: return ret; // Use the URL as-is // Otherwise add the hostname case Membership_Streaming: ret.setHost(kStreamingHostname); break; case Membership_Download: ret.setHost(kDownloadHostname); break; } // Add the credentials ret.setUserName(username_); ret.setPassword(password_); // And remove the commercial QString path = ret.path(); path.insert(path.lastIndexOf('.'), "_nospeech"); ret.setPath(path); return ret; } void MagnatuneService::ShowConfig() { app_->OpenSettingsDialogAtPage(SettingsDialog::Page_Magnatune); } void MagnatuneService::Download() { QModelIndex index = library_sort_model_->mapToSource(model()->current_index()); SongList songs = library_model_->GetChildSongs(index); MagnatuneDownloadDialog* dialog = new MagnatuneDownloadDialog(this, 0); dialog->setAttribute(Qt::WA_DeleteOnClose); dialog->Show(songs); connect(dialog, SIGNAL(Finished(QStringList)), SIGNAL(DownloadFinished(QStringList))); } QWidget* MagnatuneService::HeaderWidget() const { const_cast(this)->EnsureMenuCreated(); return library_filter_; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/magnatune/magnatuneservice.h000066400000000000000000000067721260417502300275120ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2012, David Sansome Copyright 2011, Tyler Rhodes Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_MAGNATUNE_MAGNATUNESERVICE_H_ #define INTERNET_MAGNATUNE_MAGNATUNESERVICE_H_ #include #include "internet/core/internetservice.h" class QNetworkAccessManager; class QSortFilterProxyModel; class QMenu; class LibraryBackend; class LibraryModel; class MagnatuneUrlHandler; class MagnatuneService : public InternetService { Q_OBJECT public: MagnatuneService(Application* app, InternetModel* parent); ~MagnatuneService(); // Values are saved in QSettings and are indices into the combo box in // MagnatuneConfig enum MembershipType { Membership_None = 0, Membership_Streaming = 1, Membership_Download = 2, }; // Values are saved in QSettings and are indices into the combo box in // MagnatuneConfig enum PreferredFormat { Format_Ogg = 0, Format_Flac = 1, Format_Wav = 2, Format_MP3_VBR = 3, Format_MP3_128 = 4, }; static const char* kServiceName; static const char* kSettingsGroup; static const char* kDatabaseUrl; static const char* kSongsTable; static const char* kFtsTable; static const char* kHomepage; static const char* kStreamingHostname; static const char* kDownloadHostname; static const char* kPartnerId; static const char* kDownloadUrl; static QString ReadElementText(QXmlStreamReader& reader); QStandardItem* CreateRootItem(); void LazyPopulate(QStandardItem* item); void ShowContextMenu(const QPoint& global_pos); QWidget* HeaderWidget() const; void ReloadSettings(); // Magnatune specific stuff MembershipType membership_type() const { return membership_; } PreferredFormat preferred_format() const { return format_; } QString username() const { return username_; } QString password() const { return password_; } LibraryBackend* library_backend() const { return library_backend_; } QUrl ModifyUrl(const QUrl& url) const; signals: void DownloadFinished(const QStringList& albums); private slots: void UpdateTotalSongCount(int count); void ReloadDatabase(); void ReloadDatabaseFinished(); void Download(); void Homepage(); void ShowConfig(); private: void EnsureMenuCreated(); Song ReadTrack(QXmlStreamReader& reader); private: MagnatuneUrlHandler* url_handler_; QMenu* context_menu_; QStandardItem* root_; QAction* download_; LibraryBackend* library_backend_; LibraryModel* library_model_; LibraryFilterWidget* library_filter_; QSortFilterProxyModel* library_sort_model_; int load_database_task_id_; MembershipType membership_; QString username_; QString password_; PreferredFormat format_; int total_song_count_; QNetworkAccessManager* network_; }; #endif // INTERNET_MAGNATUNE_MAGNATUNESERVICE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/magnatune/magnatunesettingspage.cpp000066400000000000000000000136141260417502300310730ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, David Sansome Copyright 2011, Tyler Rhodes Copyright 2011, Andrea Decorte Copyright 2011, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "magnatunesettingspage.h" #include #include #include #include #include #include "core/network.h" #include "magnatuneservice.h" #include "internet/core/internetmodel.h" #include "ui_magnatunesettingspage.h" MagnatuneSettingsPage::MagnatuneSettingsPage(SettingsDialog* dialog) : SettingsPage(dialog), network_(new NetworkAccessManager(this)), ui_(new Ui_MagnatuneSettingsPage), logged_in_(false) { ui_->setupUi(this); setWindowIcon(QIcon(":/providers/magnatune.png")); connect(ui_->membership, SIGNAL(currentIndexChanged(int)), SLOT(MembershipChanged(int))); connect(network_, SIGNAL(authenticationRequired(QNetworkReply*, QAuthenticator*)), SLOT(AuthenticationRequired(QNetworkReply*, QAuthenticator*))); connect(ui_->login, SIGNAL(clicked()), SLOT(Login())); connect(ui_->login_state, SIGNAL(LoginClicked()), SLOT(Login())); connect(ui_->login_state, SIGNAL(LogoutClicked()), SLOT(Logout())); ui_->login_state->AddCredentialField(ui_->username); ui_->login_state->AddCredentialField(ui_->password); ui_->login_state->AddCredentialGroup(ui_->login_container); ui_->login_state->SetAccountTypeText( tr("You can listen to Magnatune songs for free without an account. " "Purchasing a membership removes the messages at the end of each " "track.")); } MagnatuneSettingsPage::~MagnatuneSettingsPage() { delete ui_; } const char* kMagnatuneDownloadValidateUrl = "http://download.magnatune.com/"; const char* kMagnatuneStreamingValidateUrl = "http://streaming.magnatune.com/"; void MagnatuneSettingsPage::UpdateLoginState() { ui_->login_state->SetLoggedIn( logged_in_ ? LoginStateWidget::LoggedIn : LoginStateWidget::LoggedOut, ui_->username->text()); ui_->login_state->SetAccountTypeVisible(!logged_in_); } void MagnatuneSettingsPage::Login() { MagnatuneService::MembershipType type = MagnatuneService::MembershipType(ui_->membership->currentIndex()); QUrl url(type == MagnatuneService::Membership_Streaming ? kMagnatuneStreamingValidateUrl : kMagnatuneDownloadValidateUrl, QUrl::StrictMode); url.setUserName(ui_->username->text()); // NOTE: Magnatune actually only checks the first 8 characters. url.setPassword(ui_->password->text()); QNetworkRequest req(url); // Disable keep-alives and gzip compression as it's broken on magnatune. req.setRawHeader("Connection", "Close"); req.setRawHeader("Accept-Encoding", "identity"); // Disable caching. req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork); ui_->login_state->SetLoggedIn(LoginStateWidget::LoginInProgress); QNetworkReply* reply = network_->head(req); connect(reply, SIGNAL(finished()), SLOT(LoginFinished())); } void MagnatuneSettingsPage::Logout() { logged_in_ = false; UpdateLoginState(); } void MagnatuneSettingsPage::LoginFinished() { QNetworkReply* reply = qobject_cast(sender()); Q_ASSERT(reply); reply->deleteLater(); logged_in_ = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 200; if (!logged_in_) { QMessageBox::warning(this, tr("Authentication failed"), tr("Your Magnatune credentials were incorrect")); } else { Save(); } UpdateLoginState(); } void MagnatuneSettingsPage::AuthenticationRequired(QNetworkReply* reply, QAuthenticator*) { // We send the authentication with the first request so this means we got // a 401 Authentication Required, ie. the credentials are incorrect. reply->abort(); } void MagnatuneSettingsPage::Load() { QSettings s; s.beginGroup(MagnatuneService::kSettingsGroup); ui_->membership->setCurrentIndex( s.value("membership", MagnatuneService::Membership_None).toInt()); ui_->username->setText(s.value("username").toString()); ui_->password->setText(s.value("password").toString()); ui_->format->setCurrentIndex( s.value("format", MagnatuneService::Format_Ogg).toInt()); logged_in_ = s.value("logged_in", !ui_->username->text().isEmpty() && !ui_->password->text().isEmpty()).toBool(); UpdateLoginState(); } void MagnatuneSettingsPage::Save() { QSettings s; s.beginGroup(MagnatuneService::kSettingsGroup); s.setValue("membership", ui_->membership->currentIndex()); s.setValue("username", ui_->username->text()); s.setValue("password", ui_->password->text()); s.setValue("format", ui_->format->currentIndex()); s.setValue("logged_in", logged_in_); InternetModel::Service()->ReloadSettings(); } void MagnatuneSettingsPage::MembershipChanged(int value) { bool enabled = MagnatuneService::MembershipType(value) != MagnatuneService::Membership_None; ui_->login_container->setEnabled(enabled); ui_->preferences_group->setEnabled(enabled); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/magnatune/magnatunesettingspage.h000066400000000000000000000032031260417502300305310ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2011, David Sansome Copyright 2011, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_MAGNATUNE_MAGNATUNESETTINGSPAGE_H_ #define INTERNET_MAGNATUNE_MAGNATUNESETTINGSPAGE_H_ #include "ui/settingspage.h" class QAuthenticator; class QNetworkReply; class NetworkAccessManager; class Ui_MagnatuneSettingsPage; class MagnatuneSettingsPage : public SettingsPage { Q_OBJECT public: explicit MagnatuneSettingsPage(SettingsDialog* dialog); ~MagnatuneSettingsPage(); void Load(); void Save(); private slots: void Login(); void Logout(); void MembershipChanged(int value); void LoginFinished(); void AuthenticationRequired(QNetworkReply* reply, QAuthenticator* auth); private: void UpdateLoginState(); private: NetworkAccessManager* network_; Ui_MagnatuneSettingsPage* ui_; bool logged_in_; }; #endif // INTERNET_MAGNATUNE_MAGNATUNESETTINGSPAGE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/magnatune/magnatunesettingspage.ui000066400000000000000000000117061260417502300307260ustar00rootroot00000000000000 MagnatuneSettingsPage 0 0 444 306 Magnatune Account details QFormLayout::AllNonFixedFieldsGrow Membership type I don't have a Magnatune account Streaming membership Download membership false 0 Username Login Password QLineEdit::Password false Preferences QFormLayout::ExpandingFieldsGrow Preferred audio format Ogg Vorbis FLAC WAV VBR MP3 128k MP3 Qt::Vertical 20 30 LoginStateWidget QWidget
widgets/loginstatewidget.h
1
membership username password login format
clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/magnatune/magnatuneurlhandler.cpp000066400000000000000000000023321260417502300305310ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "magnatuneservice.h" #include "magnatuneurlhandler.h" MagnatuneUrlHandler::MagnatuneUrlHandler(MagnatuneService* service, QObject* parent) : UrlHandler(parent), service_(service) {} UrlHandler::LoadResult MagnatuneUrlHandler::StartLoading(const QUrl& url) { return LoadResult(url, LoadResult::TrackAvailable, service_->ModifyUrl(url)); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/magnatune/magnatuneurlhandler.h000066400000000000000000000025571260417502300302070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_MAGNATUNE_MAGNATUNEURLHANDLER_H_ #define INTERNET_MAGNATUNE_MAGNATUNEURLHANDLER_H_ #include "core/urlhandler.h" class MagnatuneService; class MagnatuneUrlHandler : public UrlHandler { public: MagnatuneUrlHandler(MagnatuneService* service, QObject* parent); QString scheme() const { return "magnatune"; } QIcon icon() const { return QIcon(":providers/magnatune.png"); } LoadResult StartLoading(const QUrl& url); private: MagnatuneService* service_; }; #endif // INTERNET_MAGNATUNE_MAGNATUNEURLHANDLER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/000077500000000000000000000000001260417502300236265ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/addpodcastbyurl.cpp000066400000000000000000000060451260417502300275230ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "addpodcastbyurl.h" #include #include #include #include "podcastdiscoverymodel.h" #include "podcasturlloader.h" #include "ui_addpodcastbyurl.h" #include "core/closure.h" AddPodcastByUrl::AddPodcastByUrl(Application* app, QWidget* parent) : AddPodcastPage(app, parent), ui_(new Ui_AddPodcastByUrl), loader_(new PodcastUrlLoader(this)) { ui_->setupUi(this); connect(ui_->go, SIGNAL(clicked()), SLOT(GoClicked())); } AddPodcastByUrl::~AddPodcastByUrl() { delete ui_; } void AddPodcastByUrl::SetUrlAndGo(const QUrl& url) { ui_->url->setText(url.toString()); GoClicked(); } void AddPodcastByUrl::SetOpml(const OpmlContainer& opml) { ui_->url->setText(opml.url.toString()); model()->clear(); model()->CreateOpmlContainerItems(opml, model()->invisibleRootItem()); } void AddPodcastByUrl::GoClicked() { emit Busy(true); model()->clear(); PodcastUrlLoaderReply* reply = loader_->Load(ui_->url->text()); ui_->url->setText(reply->url().toString()); NewClosure(reply, SIGNAL(Finished(bool)), this, SLOT(RequestFinished(PodcastUrlLoaderReply*)), reply); } void AddPodcastByUrl::RequestFinished(PodcastUrlLoaderReply* reply) { reply->deleteLater(); emit Busy(false); if (!reply->is_success()) { QMessageBox::warning(this, tr("Failed to load podcast"), reply->error_text(), QMessageBox::Close); return; } switch (reply->result_type()) { case PodcastUrlLoaderReply::Type_Podcast: for (const Podcast& podcast : reply->podcast_results()) { model()->appendRow(model()->CreatePodcastItem(podcast)); } break; case PodcastUrlLoaderReply::Type_Opml: model()->CreateOpmlContainerItems(reply->opml_results(), model()->invisibleRootItem()); break; } } void AddPodcastByUrl::Show() { ui_->url->setFocus(); const QClipboard* clipboard = QApplication::clipboard(); QStringList contents; contents << clipboard->text(QClipboard::Selection) << clipboard->text(QClipboard::Clipboard); for (const QString& content : contents) { if (content.contains("://")) { ui_->url->setText(content); return; } } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/addpodcastbyurl.h000066400000000000000000000030451260417502300271650ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_PODCASTS_ADDPODCASTBYURL_H_ #define INTERNET_PODCASTS_ADDPODCASTBYURL_H_ #include "addpodcastpage.h" class AddPodcastPage; class OpmlContainer; class PodcastUrlLoader; class PodcastUrlLoaderReply; class Ui_AddPodcastByUrl; class QUrl; class AddPodcastByUrl : public AddPodcastPage { Q_OBJECT public: explicit AddPodcastByUrl(Application* app, QWidget* parent = nullptr); ~AddPodcastByUrl(); void Show(); void SetOpml(const OpmlContainer& opml); void SetUrlAndGo(const QUrl& url); private slots: void GoClicked(); void RequestFinished(PodcastUrlLoaderReply* reply); private: Ui_AddPodcastByUrl* ui_; PodcastUrlLoader* loader_; }; #endif // INTERNET_PODCASTS_ADDPODCASTBYURL_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/addpodcastbyurl.ui000066400000000000000000000031351260417502300273530ustar00rootroot00000000000000 AddPodcastByUrl 0 0 431 51 Enter a URL :/providers/podcast32.png:/providers/podcast32.png 0 If you know the URL of a podcast, enter it below and press Go. Go url returnPressed() go click() 109 24 429 49 clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/addpodcastdialog.cpp000066400000000000000000000201221260417502300276150ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "addpodcastdialog.h" #include #include #include #include "addpodcastbyurl.h" #include "fixedopmlpage.h" #include "gpoddersearchpage.h" #include "gpoddertoptagspage.h" #include "itunessearchpage.h" #include "podcastbackend.h" #include "podcastdiscoverymodel.h" #include "ui_addpodcastdialog.h" #include "core/application.h" #include "ui/iconloader.h" #include "widgets/widgetfadehelper.h" const char* AddPodcastDialog::kBbcOpmlUrl = "http://www.bbc.co.uk/podcasts.opml"; AddPodcastDialog::AddPodcastDialog(Application* app, QWidget* parent) : QDialog(parent), app_(app), ui_(new Ui_AddPodcastDialog), last_opml_path_(QDir::homePath()) { ui_->setupUi(this); ui_->details->SetApplication(app); ui_->results->SetExpandOnReset(false); ui_->results->SetAddOnDoubleClick(false); ui_->results_stack->setCurrentWidget(ui_->results_page); fader_ = new WidgetFadeHelper(ui_->details_scroll_area); connect(ui_->provider_list, SIGNAL(currentRowChanged(int)), SLOT(ChangePage(int))); connect(ui_->details, SIGNAL(LoadingFinished()), fader_, SLOT(StartFade())); connect(ui_->results, SIGNAL(doubleClicked(QModelIndex)), SLOT(PodcastDoubleClicked(QModelIndex))); // Create Add and Remove Podcast buttons add_button_ = new QPushButton(IconLoader::Load("list-add"), tr("Add Podcast"), this); add_button_->setEnabled(false); connect(add_button_, SIGNAL(clicked()), SLOT(AddPodcast())); ui_->button_box->addButton(add_button_, QDialogButtonBox::ActionRole); remove_button_ = new QPushButton(IconLoader::Load("list-remove"), tr("Unsubscribe"), this); remove_button_->setEnabled(false); connect(remove_button_, SIGNAL(clicked()), SLOT(RemovePodcast())); ui_->button_box->addButton(remove_button_, QDialogButtonBox::ActionRole); QPushButton* settings_button = new QPushButton( IconLoader::Load("configure"), tr("Configure podcasts..."), this); connect(settings_button, SIGNAL(clicked()), SLOT(OpenSettingsPage())); ui_->button_box->addButton(settings_button, QDialogButtonBox::ResetRole); // Create an Open OPML file button QPushButton* open_opml_button = new QPushButton( IconLoader::Load("document-open"), tr("Open OPML file..."), this); connect(open_opml_button, SIGNAL(clicked()), this, SLOT(OpenOPMLFile())); ui_->button_box->addButton(open_opml_button, QDialogButtonBox::ResetRole); // Add providers by_url_page_ = new AddPodcastByUrl(app, this); AddPage(by_url_page_); AddPage(new FixedOpmlPage(QUrl(kBbcOpmlUrl), tr("BBC Podcasts"), QIcon(":providers/bbc.png"), app, this)); AddPage(new GPodderTopTagsPage(app, this)); AddPage(new GPodderSearchPage(app, this)); AddPage(new ITunesSearchPage(app, this)); ui_->provider_list->setCurrentRow(0); } AddPodcastDialog::~AddPodcastDialog() { delete ui_; } void AddPodcastDialog::ShowWithUrl(const QUrl& url) { by_url_page_->SetUrlAndGo(url); ui_->provider_list->setCurrentRow(0); show(); } void AddPodcastDialog::ShowWithOpml(const OpmlContainer& opml) { by_url_page_->SetOpml(opml); ui_->provider_list->setCurrentRow(0); show(); } void AddPodcastDialog::AddPage(AddPodcastPage* page) { pages_.append(page); page_is_busy_.append(false); ui_->stack->addWidget(page); new QListWidgetItem(page->windowIcon(), page->windowTitle(), ui_->provider_list); connect(page, SIGNAL(Busy(bool)), SLOT(PageBusyChanged(bool))); } void AddPodcastDialog::ChangePage(int index) { AddPodcastPage* page = pages_[index]; ui_->stack->setCurrentIndex(index); ui_->stack->setVisible(page->has_visible_widget()); ui_->results->setModel(page->model()); ui_->results_stack->setCurrentWidget( page_is_busy_[index] ? ui_->busy_page : ui_->results_page); connect(ui_->results->selectionModel(), SIGNAL(currentRowChanged(QModelIndex, QModelIndex)), SLOT(ChangePodcast(QModelIndex))); ChangePodcast(QModelIndex()); CurrentPageBusyChanged(page_is_busy_[index]); page->Show(); } void AddPodcastDialog::ChangePodcast(const QModelIndex& current) { QVariant podcast_variant = current.data(PodcastDiscoveryModel::Role_Podcast); // If the selected item is invalid or not a podcast, hide the details pane. if (podcast_variant.isNull()) { ui_->details_scroll_area->hide(); add_button_->setEnabled(false); remove_button_->setEnabled(false); return; } current_podcast_ = podcast_variant.value(); // Start the blur+fade if there's already a podcast in the details pane. if (ui_->details_scroll_area->isVisible()) { fader_->StartBlur(); } else { ui_->details_scroll_area->show(); } // Update the details pane ui_->details->SetPodcast(current_podcast_); // Is the user already subscribed to this podcast? Podcast subscribed_podcast = app_->podcast_backend()->GetSubscriptionByUrl(current_podcast_.url()); const bool is_subscribed = subscribed_podcast.url().isValid(); if (is_subscribed) { // Use the one from the database which will contain the ID. current_podcast_ = subscribed_podcast; } add_button_->setEnabled(!is_subscribed); remove_button_->setEnabled(is_subscribed); } void AddPodcastDialog::PageBusyChanged(bool busy) { const int index = pages_.indexOf(qobject_cast(sender())); if (index == -1) return; page_is_busy_[index] = busy; if (index == ui_->provider_list->currentRow()) { CurrentPageBusyChanged(busy); } } void AddPodcastDialog::CurrentPageBusyChanged(bool busy) { ui_->results_stack->setCurrentWidget(busy ? ui_->busy_page : ui_->results_page); ui_->stack->setDisabled(busy); QTimer::singleShot(0, this, SLOT(SelectFirstPodcast())); } void AddPodcastDialog::SelectFirstPodcast() { // Select the first item if there was one. const PodcastDiscoveryModel* model = pages_[ui_->provider_list->currentRow()]->model(); if (model->rowCount() > 0) { ui_->results->selectionModel()->setCurrentIndex( model->index(0, 0), QItemSelectionModel::ClearAndSelect); } } void AddPodcastDialog::AddPodcast() { app_->podcast_backend()->Subscribe(¤t_podcast_); add_button_->setEnabled(false); remove_button_->setEnabled(true); } void AddPodcastDialog::PodcastDoubleClicked(const QModelIndex& index) { QVariant podcast_variant = index.data(PodcastDiscoveryModel::Role_Podcast); if (podcast_variant.isNull()) { return; } current_podcast_ = podcast_variant.value(); app_->podcast_backend()->Subscribe(¤t_podcast_); add_button_->setEnabled(false); remove_button_->setEnabled(true); } void AddPodcastDialog::RemovePodcast() { app_->podcast_backend()->Unsubscribe(current_podcast_); current_podcast_.set_database_id(-1); add_button_->setEnabled(true); remove_button_->setEnabled(false); } void AddPodcastDialog::OpenSettingsPage() { app_->OpenSettingsDialogAtPage(SettingsDialog::Page_Podcasts); } void AddPodcastDialog::OpenOPMLFile() { const QString filename = QFileDialog::getOpenFileName( this, tr("Open OPML file"), last_opml_path_, "OPML files (*.opml)"); if (filename.isEmpty()) { return; } last_opml_path_ = filename; by_url_page_->SetUrlAndGo(QUrl::fromLocalFile(last_opml_path_)); ChangePage(ui_->stack->indexOf(by_url_page_)); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/addpodcastdialog.h000066400000000000000000000044521260417502300272720ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_PODCASTS_ADDPODCASTDIALOG_H_ #define INTERNET_PODCASTS_ADDPODCASTDIALOG_H_ #include "podcast.h" #include class AddPodcastByUrl; class AddPodcastPage; class Application; class OpmlContainer; class WidgetFadeHelper; class Ui_AddPodcastDialog; class QModelIndex; class AddPodcastDialog : public QDialog { Q_OBJECT public: explicit AddPodcastDialog(Application* app, QWidget* parent = nullptr); ~AddPodcastDialog(); static const char* kBbcOpmlUrl; // Convenience methods that open the dialog at the Add By Url page and fill // it with either a URL (which is then fetched), or a pre-fetched OPML // container. void ShowWithUrl(const QUrl& url); void ShowWithOpml(const OpmlContainer& opml); private slots: void OpenSettingsPage(); void AddPodcast(); void PodcastDoubleClicked(const QModelIndex& index); void RemovePodcast(); void ChangePage(int index); void ChangePodcast(const QModelIndex& current); void PageBusyChanged(bool busy); void CurrentPageBusyChanged(bool busy); void SelectFirstPodcast(); void OpenOPMLFile(); private: void AddPage(AddPodcastPage* page); private: Application* app_; Ui_AddPodcastDialog* ui_; QPushButton* add_button_; QPushButton* remove_button_; QList pages_; QList page_is_busy_; AddPodcastByUrl* by_url_page_; WidgetFadeHelper* fader_; Podcast current_podcast_; QString last_opml_path_; }; #endif // INTERNET_PODCASTS_ADDPODCASTDIALOG_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/addpodcastdialog.ui000066400000000000000000000162071260417502300274610ustar00rootroot00000000000000 AddPodcastDialog 0 0 941 473 Add podcast 200 16777215 Qt::ScrollBarAlwaysOff 32 32 true 0 0 0 0 0 QAbstractItemView::NoEditTriggers true false 0 0 Qt::Vertical 0 192 Qt::Horizontal 40 20 Loading... Qt::Horizontal 40 20 Qt::Vertical 0 0 250 0 250 16777215 Qt::ScrollBarAlwaysOff true 0 0 248 418 Qt::Horizontal QDialogButtonBox::Close BusyIndicator QWidget
widgets/busyindicator.h
1
PodcastInfoWidget QWidget
internet/podcasts/podcastinfowidget.h
1
AutoExpandingTreeView QTreeView
widgets/autoexpandingtreeview.h
button_box accepted() AddPodcastDialog accept() 836 463 157 274 button_box rejected() AddPodcastDialog reject() 885 463 286 274
clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/addpodcastpage.cpp000066400000000000000000000021731260417502300273000ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "addpodcastpage.h" #include "podcastdiscoverymodel.h" AddPodcastPage::AddPodcastPage(Application* app, QWidget* parent) : QWidget(parent), model_(new PodcastDiscoveryModel(app, this)) {} void AddPodcastPage::SetModel(PodcastDiscoveryModel* model) { delete model_; model_ = model; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/addpodcastpage.h000066400000000000000000000026771260417502300267560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_PODCASTS_ADDPODCASTPAGE_H_ #define INTERNET_PODCASTS_ADDPODCASTPAGE_H_ #include class Application; class PodcastDiscoveryModel; class AddPodcastPage : public QWidget { Q_OBJECT public: explicit AddPodcastPage(Application* app, QWidget* parent = nullptr); PodcastDiscoveryModel* model() const { return model_; } virtual bool has_visible_widget() const { return true; } virtual void Show() {} signals: void Busy(bool busy); protected: void SetModel(PodcastDiscoveryModel* model); private: PodcastDiscoveryModel* model_; }; #endif // INTERNET_PODCASTS_ADDPODCASTPAGE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/fixedopmlpage.cpp000066400000000000000000000045071260417502300271640ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "fixedopmlpage.h" #include #include "podcastdiscoverymodel.h" #include "podcasturlloader.h" #include "core/closure.h" FixedOpmlPage::FixedOpmlPage(const QUrl& opml_url, const QString& title, const QIcon& icon, Application* app, QWidget* parent) : AddPodcastPage(app, parent), loader_(new PodcastUrlLoader(this)), opml_url_(opml_url), done_initial_load_(false) { setWindowTitle(title); setWindowIcon(icon); } void FixedOpmlPage::Show() { if (!done_initial_load_) { emit Busy(true); done_initial_load_ = true; PodcastUrlLoaderReply* reply = loader_->Load(opml_url_); NewClosure(reply, SIGNAL(Finished(bool)), this, SLOT(LoadFinished(PodcastUrlLoaderReply*)), reply); } } void FixedOpmlPage::LoadFinished(PodcastUrlLoaderReply* reply) { reply->deleteLater(); emit Busy(false); if (!reply->is_success()) { QMessageBox::warning(this, tr("Failed to load podcast"), reply->error_text(), QMessageBox::Close); return; } switch (reply->result_type()) { case PodcastUrlLoaderReply::Type_Podcast: for (const Podcast& podcast : reply->podcast_results()) { model()->appendRow(model()->CreatePodcastItem(podcast)); } break; case PodcastUrlLoaderReply::Type_Opml: model()->CreateOpmlContainerItems(reply->opml_results(), model()->invisibleRootItem()); break; } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/fixedopmlpage.h000066400000000000000000000027511260417502300266300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_PODCASTS_FIXEDOPMLPAGE_H_ #define INTERNET_PODCASTS_FIXEDOPMLPAGE_H_ #include "addpodcastpage.h" #include class PodcastUrlLoader; class PodcastUrlLoaderReply; class FixedOpmlPage : public AddPodcastPage { Q_OBJECT public: FixedOpmlPage(const QUrl& opml_url, const QString& title, const QIcon& icon, Application* app, QWidget* parent = nullptr); bool has_visible_widget() const { return false; } void Show(); private slots: void LoadFinished(PodcastUrlLoaderReply* reply); private: PodcastUrlLoader* loader_; QUrl opml_url_; bool done_initial_load_; }; #endif // INTERNET_PODCASTS_FIXEDOPMLPAGE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/gpoddersearchpage.cpp000066400000000000000000000052521260417502300300050ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "gpoddersearchpage.h" #include #include "podcast.h" #include "podcastdiscoverymodel.h" #include "ui_gpoddersearchpage.h" #include "core/closure.h" #include "core/network.h" GPodderSearchPage::GPodderSearchPage(Application* app, QWidget* parent) : AddPodcastPage(app, parent), ui_(new Ui_GPodderSearchPage), network_(new NetworkAccessManager(this)), api_(new mygpo::ApiRequest(network_)) { ui_->setupUi(this); connect(ui_->search, SIGNAL(clicked()), SLOT(SearchClicked())); } GPodderSearchPage::~GPodderSearchPage() { delete ui_; delete api_; } void GPodderSearchPage::SearchClicked() { emit Busy(true); mygpo::PodcastListPtr list(api_->search(ui_->query->text())); NewClosure(list, SIGNAL(finished()), this, SLOT(SearchFinished(mygpo::PodcastListPtr)), list); NewClosure(list, SIGNAL(parseError()), this, SLOT(SearchFailed(mygpo::PodcastListPtr)), list); NewClosure(list, SIGNAL(requestError(QNetworkReply::NetworkError)), this, SLOT(SearchFailed(mygpo::PodcastListPtr)), list); } void GPodderSearchPage::SearchFinished(mygpo::PodcastListPtr list) { emit Busy(false); model()->clear(); for (mygpo::PodcastPtr gpo_podcast : list->list()) { Podcast podcast; podcast.InitFromGpo(gpo_podcast.data()); model()->appendRow(model()->CreatePodcastItem(podcast)); } } void GPodderSearchPage::SearchFailed(mygpo::PodcastListPtr list) { emit Busy(false); model()->clear(); if (QMessageBox::warning( nullptr, tr("Failed to fetch podcasts"), tr("There was a problem communicating with gpodder.net"), QMessageBox::Retry | QMessageBox::Close, QMessageBox::Retry) != QMessageBox::Retry) { return; } // Try doing the search again. SearchClicked(); } void GPodderSearchPage::Show() { ui_->query->setFocus(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/gpoddersearchpage.h000066400000000000000000000030021260417502300274410ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_PODCASTS_GPODDERSEARCHPAGE_H_ #define INTERNET_PODCASTS_GPODDERSEARCHPAGE_H_ #include "addpodcastpage.h" #include class QNetworkAccessManager; class Ui_GPodderSearchPage; class GPodderSearchPage : public AddPodcastPage { Q_OBJECT public: explicit GPodderSearchPage(Application* app, QWidget* parent = nullptr); ~GPodderSearchPage(); void Show(); private slots: void SearchClicked(); void SearchFinished(mygpo::PodcastListPtr list); void SearchFailed(mygpo::PodcastListPtr list); private: Ui_GPodderSearchPage* ui_; QNetworkAccessManager* network_; mygpo::ApiRequest* api_; }; #endif // INTERNET_PODCASTS_GPODDERSEARCHPAGE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/gpoddersearchpage.ui000066400000000000000000000031561260417502300276410ustar00rootroot00000000000000 GPodderSearchPage 0 0 538 69 Search gpodder.net :/providers/mygpo32.png:/providers/mygpo32.png 0 Enter search terms below to find podcasts on gpodder.net Search query returnPressed() search click() 130 45 198 46 clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/gpoddersync.cpp000066400000000000000000000300471260417502300266570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "gpoddersync.h" #include #include #include #include #include #include "podcastbackend.h" #include "podcasturlloader.h" #include "core/application.h" #include "core/closure.h" #include "core/logging.h" #include "core/network.h" #include "core/qhash_qurl.h" #include "core/timeconstants.h" #include "core/utilities.h" const char* GPodderSync::kSettingsGroup = "Podcasts"; const int GPodderSync::kFlushUpdateQueueDelay = 30 * kMsecPerSec; // 30 seconds const int GPodderSync::kGetUpdatesInterval = 30 * 60 * kMsecPerSec; // 30 minutes GPodderSync::GPodderSync(Application* app, QObject* parent) : QObject(parent), app_(app), network_(new NetworkAccessManager(this)), backend_(app_->podcast_backend()), loader_(new PodcastUrlLoader(this)), get_updates_timer_(new QTimer(this)), flush_queue_timer_(new QTimer(this)), flushing_queue_(false) { ReloadSettings(); LoadQueue(); connect(app_, SIGNAL(SettingsChanged()), SLOT(ReloadSettings())); connect(backend_, SIGNAL(SubscriptionAdded(Podcast)), SLOT(SubscriptionAdded(Podcast))); connect(backend_, SIGNAL(SubscriptionRemoved(Podcast)), SLOT(SubscriptionRemoved(Podcast))); get_updates_timer_->setInterval(kGetUpdatesInterval); connect(get_updates_timer_, SIGNAL(timeout()), SLOT(GetUpdatesNow())); flush_queue_timer_->setInterval(kFlushUpdateQueueDelay); flush_queue_timer_->setSingleShot(true); connect(flush_queue_timer_, SIGNAL(timeout()), SLOT(FlushUpdateQueue())); if (is_logged_in()) { GetUpdatesNow(); flush_queue_timer_->start(); get_updates_timer_->start(); } } GPodderSync::~GPodderSync() {} QString GPodderSync::DeviceId() { return QString("%1-%2") .arg(qApp->applicationName(), QHostInfo::localHostName()) .toLower(); } QString GPodderSync::DefaultDeviceName() { return tr("%1 on %2") .arg(qApp->applicationName(), QHostInfo::localHostName()); } bool GPodderSync::is_logged_in() const { return !username_.isEmpty() && !password_.isEmpty() && api_; } void GPodderSync::ReloadSettings() { QSettings s; s.beginGroup(kSettingsGroup); username_ = s.value("gpodder_username").toString(); password_ = s.value("gpodder_password").toString(); last_successful_get_ = s.value("gpodder_last_get").toDateTime(); if (!username_.isEmpty() && !password_.isEmpty()) { api_.reset(new mygpo::ApiRequest(username_, password_, network_)); } } QNetworkReply* GPodderSync::Login(const QString& username, const QString& password, const QString& device_name) { api_.reset(new mygpo::ApiRequest(username, password, network_)); QNetworkReply* reply = api_->renameDevice( username, DeviceId(), device_name, Utilities::IsLaptop() ? mygpo::Device::LAPTOP : mygpo::Device::DESKTOP); NewClosure(reply, SIGNAL(finished()), this, SLOT(LoginFinished(QNetworkReply*, QString, QString)), reply, username, password); return reply; } void GPodderSync::LoginFinished(QNetworkReply* reply, const QString& username, const QString& password) { reply->deleteLater(); if (reply->error() == QNetworkReply::NoError) { username_ = username; password_ = password; QSettings s; s.beginGroup(kSettingsGroup); s.setValue("gpodder_username", username); s.setValue("gpodder_password", password); DoInitialSync(); } else { api_.reset(); } } void GPodderSync::Logout() { QSettings s; s.beginGroup(kSettingsGroup); s.remove("gpodder_username"); s.remove("gpodder_password"); s.remove("gpodder_last_get"); api_.reset(); } void GPodderSync::GetUpdatesNow() { if (!is_logged_in()) return; qlonglong timestamp = 0; if (last_successful_get_.isValid()) { timestamp = last_successful_get_.toTime_t(); } mygpo::DeviceUpdatesPtr reply( api_->deviceUpdates(username_, DeviceId(), timestamp)); NewClosure(reply, SIGNAL(finished()), this, SLOT(DeviceUpdatesFinished(mygpo::DeviceUpdatesPtr)), reply); NewClosure(reply, SIGNAL(parseError()), this, SLOT(DeviceUpdatesFailed(mygpo::DeviceUpdatesPtr)), reply); NewClosure(reply, SIGNAL(requestError(QNetworkReply::NetworkError)), this, SLOT(DeviceUpdatesFailed(mygpo::DeviceUpdatesPtr)), reply); } void GPodderSync::DeviceUpdatesFailed(mygpo::DeviceUpdatesPtr reply) { qLog(Warning) << "Failed to get gpodder.net device updates"; } void GPodderSync::DeviceUpdatesFinished(mygpo::DeviceUpdatesPtr reply) { // Remember episode actions for each podcast, so when we add a new podcast // we can apply the actions immediately. QMap> episodes_by_podcast; for (mygpo::EpisodePtr episode : reply->updateList()) { episodes_by_podcast[episode->podcastUrl()].append(episode); } for (mygpo::PodcastPtr podcast : reply->addList()) { const QUrl url(podcast->url()); // Are we subscribed to this podcast already? Podcast existing_podcast = backend_->GetSubscriptionByUrl(url); if (existing_podcast.is_valid()) { // Just apply actions to this existing podcast ApplyActions(episodes_by_podcast[url], existing_podcast.mutable_episodes()); backend_->UpdateEpisodes(existing_podcast.episodes()); continue; } // Start loading the podcast. Remember actions and apply them after we // have a list of the episodes. PodcastUrlLoaderReply* loader_reply = loader_->Load(url); NewClosure(loader_reply, SIGNAL(Finished(bool)), this, SLOT(NewPodcastLoaded(PodcastUrlLoaderReply*, QUrl, QList)), loader_reply, url, episodes_by_podcast[url]); } // Unsubscribe from podcasts that were removed. for (const QUrl& url : reply->removeList()) { backend_->Unsubscribe(backend_->GetSubscriptionByUrl(url)); } last_successful_get_ = QDateTime::currentDateTime(); QSettings s; s.beginGroup(kSettingsGroup); s.setValue("gpodder_last_get", last_successful_get_); } void GPodderSync::NewPodcastLoaded(PodcastUrlLoaderReply* reply, const QUrl& url, const QList& actions) { reply->deleteLater(); if (!reply->is_success()) { qLog(Warning) << "Error fetching podcast at" << url << ":" << reply->error_text(); return; } if (reply->result_type() != PodcastUrlLoaderReply::Type_Podcast) { qLog(Warning) << "The URL" << url << "no longer contains a podcast"; return; } // Apply the actions to the episodes in the podcast. for (Podcast podcast : reply->podcast_results()) { ApplyActions(actions, podcast.mutable_episodes()); // Add the subscription backend_->Subscribe(&podcast); } } void GPodderSync::ApplyActions( const QList>& actions, PodcastEpisodeList* episodes) { for (PodcastEpisodeList::iterator it = episodes->begin(); it != episodes->end(); ++it) { // Find an action for this episode for (mygpo::EpisodePtr action : actions) { if (action->url() != it->url()) continue; switch (action->status()) { case mygpo::Episode::PLAY: case mygpo::Episode::DOWNLOAD: it->set_listened(true); break; default: break; } break; } } } void GPodderSync::SubscriptionAdded(const Podcast& podcast) { if (!is_logged_in()) return; const QUrl& url = podcast.url(); queued_remove_subscriptions_.remove(url); queued_add_subscriptions_.insert(url); SaveQueue(); flush_queue_timer_->start(); } void GPodderSync::SubscriptionRemoved(const Podcast& podcast) { if (!is_logged_in()) return; const QUrl& url = podcast.url(); queued_remove_subscriptions_.insert(url); queued_add_subscriptions_.remove(url); SaveQueue(); flush_queue_timer_->start(); } namespace { template void WriteContainer(const T& container, QSettings* s, const char* array_name, const char* item_name) { s->beginWriteArray(array_name, container.count()); int index = 0; for (const auto& item : container) { s->setArrayIndex(index++); s->setValue(item_name, item); } s->endArray(); } template void ReadContainer(T* container, QSettings* s, const char* array_name, const char* item_name) { container->clear(); const int count = s->beginReadArray(array_name); for (int i = 0; i < count; ++i) { s->setArrayIndex(i); *container << s->value(item_name).value(); } s->endArray(); } } // namespace void GPodderSync::SaveQueue() { QSettings s; s.beginGroup(kSettingsGroup); WriteContainer(queued_add_subscriptions_, &s, "gpodder_queued_add_subscriptions", "url"); WriteContainer(queued_remove_subscriptions_, &s, "gpodder_queued_remove_subscriptions", "url"); } void GPodderSync::LoadQueue() { QSettings s; s.beginGroup(kSettingsGroup); ReadContainer(&queued_add_subscriptions_, &s, "gpodder_queued_add_subscriptions", "url"); ReadContainer(&queued_remove_subscriptions_, &s, "gpodder_queued_remove_subscriptions", "url"); } void GPodderSync::FlushUpdateQueue() { if (!is_logged_in() || flushing_queue_) return; QSet all_urls = queued_add_subscriptions_ + queued_remove_subscriptions_; if (all_urls.isEmpty()) return; flushing_queue_ = true; mygpo::AddRemoveResultPtr reply(api_->addRemoveSubscriptions( username_, DeviceId(), queued_add_subscriptions_.toList(), queued_remove_subscriptions_.toList())); qLog(Info) << "Sending" << all_urls.count() << "changes to gpodder.net"; NewClosure(reply, SIGNAL(finished()), this, SLOT(AddRemoveFinished(mygpo::AddRemoveResultPtr, QList)), reply, all_urls.toList()); NewClosure(reply, SIGNAL(parseError()), this, SLOT(AddRemoveFailed(mygpo::AddRemoveResultPtr)), reply); NewClosure(reply, SIGNAL(requestError(QNetworkReply::NetworkError)), this, SLOT(AddRemoveFailed(mygpo::AddRemoveResultPtr)), reply); } void GPodderSync::AddRemoveFailed(mygpo::AddRemoveResultPtr reply) { flushing_queue_ = false; qLog(Warning) << "Failed to update gpodder.net subscriptions"; } void GPodderSync::AddRemoveFinished(mygpo::AddRemoveResultPtr reply, const QList& affected_urls) { flushing_queue_ = false; // Remove the URLs from the queue. for (const QUrl& url : affected_urls) { queued_add_subscriptions_.remove(url); queued_remove_subscriptions_.remove(url); } SaveQueue(); // Did more change in the mean time? if (!queued_add_subscriptions_.isEmpty() || !queued_remove_subscriptions_.isEmpty()) { flush_queue_timer_->start(); } } void GPodderSync::DoInitialSync() { // Get updates from the server GetUpdatesNow(); get_updates_timer_->start(); // Send our complete list of subscriptions queued_remove_subscriptions_.clear(); queued_add_subscriptions_.clear(); for (const Podcast& podcast : backend_->GetAllSubscriptions()) { queued_add_subscriptions_.insert(podcast.url()); } SaveQueue(); FlushUpdateQueue(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/gpoddersync.h000066400000000000000000000067251260417502300263320ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_PODCASTS_GPODDERSYNC_H_ #define INTERNET_PODCASTS_GPODDERSYNC_H_ #include "podcastepisode.h" #include #include #include #include #include #include #include class Application; class Podcast; class PodcastBackend; class PodcastUrlLoader; class PodcastUrlLoaderReply; class QNetworkAccessManager; class QNetworkReply; class QTimer; class GPodderSync : public QObject { Q_OBJECT public: explicit GPodderSync(Application* app, QObject* parent = nullptr); ~GPodderSync(); static const char* kSettingsGroup; static const int kFlushUpdateQueueDelay; static const int kGetUpdatesInterval; static QString DefaultDeviceName(); static QString DeviceId(); bool is_logged_in() const; // Tries to login using the given username and password. Also sets the // device name and type on gpodder.net. You do NOT need to deleteLater() // the QNetworkReply returned from this function. // If login succeeds the username and password will be saved in QSettings. QNetworkReply* Login(const QString& username, const QString& password, const QString& device_name); // Clears any saved username and password from QSettings. void Logout(); public slots: void GetUpdatesNow(); private slots: void ReloadSettings(); void LoginFinished(QNetworkReply* reply, const QString& username, const QString& password); void DeviceUpdatesFinished(mygpo::DeviceUpdatesPtr reply); void DeviceUpdatesFailed(mygpo::DeviceUpdatesPtr reply); void NewPodcastLoaded(PodcastUrlLoaderReply* reply, const QUrl& url, const QList& actions); void ApplyActions(const QList& actions, PodcastEpisodeList* episodes); void SubscriptionAdded(const Podcast& podcast); void SubscriptionRemoved(const Podcast& podcast); void FlushUpdateQueue(); void AddRemoveFinished(mygpo::AddRemoveResultPtr reply, const QList& affected_urls); void AddRemoveFailed(mygpo::AddRemoveResultPtr reply); private: void LoadQueue(); void SaveQueue(); void DoInitialSync(); private: Application* app_; QNetworkAccessManager* network_; QScopedPointer api_; PodcastBackend* backend_; PodcastUrlLoader* loader_; QString username_; QString password_; QDateTime last_successful_get_; QTimer* get_updates_timer_; QTimer* flush_queue_timer_; QSet queued_add_subscriptions_; QSet queued_remove_subscriptions_; bool flushing_queue_; }; #endif // INTERNET_PODCASTS_GPODDERSYNC_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/gpoddertoptagsmodel.cpp000066400000000000000000000075311260417502300304070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "gpoddertoptagsmodel.h" #include #include #include "gpoddertoptagspage.h" #include "podcast.h" #include "core/closure.h" GPodderTopTagsModel::GPodderTopTagsModel(mygpo::ApiRequest* api, Application* app, QObject* parent) : PodcastDiscoveryModel(app, parent), api_(api) {} bool GPodderTopTagsModel::hasChildren(const QModelIndex& parent) const { if (parent.isValid() && parent.data(Role_Type).toInt() == Type_Folder) { return true; } return PodcastDiscoveryModel::hasChildren(parent); } bool GPodderTopTagsModel::canFetchMore(const QModelIndex& parent) const { if (parent.isValid() && parent.data(Role_Type).toInt() == Type_Folder && parent.data(Role_HasLazyLoaded).toBool() == false) { return true; } return PodcastDiscoveryModel::canFetchMore(parent); } void GPodderTopTagsModel::fetchMore(const QModelIndex& parent) { if (!parent.isValid() || parent.data(Role_Type).toInt() != Type_Folder || parent.data(Role_HasLazyLoaded).toBool()) { return; } setData(parent, true, Role_HasLazyLoaded); // Create a little Loading... item. itemFromIndex(parent)->appendRow(CreateLoadingIndicator()); mygpo::PodcastListPtr list(api_->podcastsOfTag( GPodderTopTagsPage::kMaxTagCount, parent.data().toString())); NewClosure(list, SIGNAL(finished()), this, SLOT(PodcastsOfTagFinished(QModelIndex, mygpo::PodcastList*)), parent, list.data()); NewClosure(list, SIGNAL(parseError()), this, SLOT(PodcastsOfTagFailed(QModelIndex, mygpo::PodcastList*)), parent, list.data()); NewClosure(list, SIGNAL(requestError(QNetworkReply::NetworkError)), this, SLOT(PodcastsOfTagFailed(QModelIndex, mygpo::PodcastList*)), parent, list.data()); } void GPodderTopTagsModel::PodcastsOfTagFinished(const QModelIndex& parent, mygpo::PodcastList* list) { QStandardItem* parent_item = itemFromIndex(parent); if (!parent_item) return; // Remove the Loading... item. while (parent_item->hasChildren()) { parent_item->removeRow(0); } for (mygpo::PodcastPtr gpo_podcast : list->list()) { Podcast podcast; podcast.InitFromGpo(gpo_podcast.data()); parent_item->appendRow(CreatePodcastItem(podcast)); } } void GPodderTopTagsModel::PodcastsOfTagFailed(const QModelIndex& parent, mygpo::PodcastList* list) { QStandardItem* parent_item = itemFromIndex(parent); if (!parent_item) return; // Remove the Loading... item. while (parent_item->hasChildren()) { parent_item->removeRow(0); } if (QMessageBox::warning( nullptr, tr("Failed to fetch podcasts"), tr("There was a problem communicating with gpodder.net"), QMessageBox::Retry | QMessageBox::Close, QMessageBox::Retry) != QMessageBox::Retry) { return; } // Try fetching the list again. setData(parent, false, Role_HasLazyLoaded); fetchMore(parent); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/gpoddertoptagsmodel.h000066400000000000000000000033671260417502300300570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_PODCASTS_GPODDERTOPTAGSMODEL_H_ #define INTERNET_PODCASTS_GPODDERTOPTAGSMODEL_H_ #include "podcastdiscoverymodel.h" namespace mygpo { class ApiRequest; class PodcastList; } class GPodderTopTagsModel : public PodcastDiscoveryModel { Q_OBJECT public: GPodderTopTagsModel(mygpo::ApiRequest* api, Application* app, QObject* parent = nullptr); enum Role { Role_HasLazyLoaded = PodcastDiscoveryModel::RoleCount, RoleCount }; bool hasChildren(const QModelIndex& parent) const; bool canFetchMore(const QModelIndex& parent) const; void fetchMore(const QModelIndex& parent); private slots: void PodcastsOfTagFinished(const QModelIndex& parent, mygpo::PodcastList* list); void PodcastsOfTagFailed(const QModelIndex& parent, mygpo::PodcastList* list); private: mygpo::ApiRequest* api_; }; #endif // INTERNET_PODCASTS_GPODDERTOPTAGSMODEL_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/gpoddertoptagspage.cpp000066400000000000000000000052721260417502300302230ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "gpoddertoptagspage.h" #include #include "gpoddertoptagsmodel.h" #include "core/closure.h" #include "core/network.h" const int GPodderTopTagsPage::kMaxTagCount = 100; GPodderTopTagsPage::GPodderTopTagsPage(Application* app, QWidget* parent) : AddPodcastPage(app, parent), network_(new NetworkAccessManager(this)), api_(new mygpo::ApiRequest(network_)), done_initial_load_(false) { setWindowTitle(tr("gpodder.net directory")); setWindowIcon(QIcon(":providers/mygpo32.png")); SetModel(new GPodderTopTagsModel(api_, app, this)); } GPodderTopTagsPage::~GPodderTopTagsPage() { delete api_; } void GPodderTopTagsPage::Show() { if (!done_initial_load_) { // Start the request for list of top-level tags emit Busy(true); done_initial_load_ = true; mygpo::TagListPtr tag_list(api_->topTags(kMaxTagCount)); NewClosure(tag_list, SIGNAL(finished()), this, SLOT(TagListLoaded(mygpo::TagListPtr)), tag_list); NewClosure(tag_list, SIGNAL(parseError()), this, SLOT(TagListFailed(mygpo::TagListPtr)), tag_list); NewClosure(tag_list, SIGNAL(requestError(QNetworkReply::NetworkError)), this, SLOT(TagListFailed(mygpo::TagListPtr)), tag_list); } } void GPodderTopTagsPage::TagListLoaded(mygpo::TagListPtr tag_list) { emit Busy(false); for (mygpo::TagPtr tag : tag_list->list()) { model()->appendRow(model()->CreateFolder(tag->tag())); } } void GPodderTopTagsPage::TagListFailed(mygpo::TagListPtr list) { emit Busy(false); done_initial_load_ = false; if (QMessageBox::warning( nullptr, tr("Failed to fetch directory"), tr("There was a problem communicating with gpodder.net"), QMessageBox::Retry | QMessageBox::Close, QMessageBox::Retry) != QMessageBox::Retry) { return; } // Try doing the search again. Show(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/gpoddertoptagspage.h000066400000000000000000000031221260417502300276600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_PODCASTS_GPODDERTOPTAGSPAGE_H_ #define INTERNET_PODCASTS_GPODDERTOPTAGSPAGE_H_ #include #include #include "addpodcastpage.h" class QNetworkAccessManager; class GPodderTopTagsPage : public AddPodcastPage { Q_OBJECT public: explicit GPodderTopTagsPage(Application* app, QWidget* parent = nullptr); ~GPodderTopTagsPage(); static const int kMaxTagCount; virtual bool has_visible_widget() const { return false; } virtual void Show(); private slots: void TagListLoaded(mygpo::TagListPtr tag_list); void TagListFailed(mygpo::TagListPtr tag_list); private: QNetworkAccessManager* network_; mygpo::ApiRequest* api_; bool done_initial_load_; }; #endif // INTERNET_PODCASTS_GPODDERTOPTAGSPAGE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/itunessearchpage.cpp000066400000000000000000000066361260417502300276770ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "itunessearchpage.h" #include #include #include #include "core/closure.h" #include "core/network.h" #include "podcast.h" #include "podcastdiscoverymodel.h" #include "ui_itunessearchpage.h" const char* ITunesSearchPage::kUrlBase = "http://ax.phobos.apple.com.edgesuite.net/WebObjects/MZStoreServices.woa/" "wa/wsSearch?country=US&media=podcast"; ITunesSearchPage::ITunesSearchPage(Application* app, QWidget* parent) : AddPodcastPage(app, parent), ui_(new Ui_ITunesSearchPage), network_(new NetworkAccessManager(this)) { ui_->setupUi(this); connect(ui_->search, SIGNAL(clicked()), SLOT(SearchClicked())); } ITunesSearchPage::~ITunesSearchPage() { delete ui_; } void ITunesSearchPage::SearchClicked() { emit Busy(true); QUrl url(QUrl::fromEncoded(kUrlBase)); url.addQueryItem("term", ui_->query->text()); QNetworkReply* reply = network_->get(QNetworkRequest(url)); NewClosure(reply, SIGNAL(finished()), this, SLOT(SearchFinished(QNetworkReply*)), reply); } void ITunesSearchPage::SearchFinished(QNetworkReply* reply) { reply->deleteLater(); emit Busy(false); model()->clear(); // Was there a network error? if (reply->error() != QNetworkReply::NoError) { QMessageBox::warning(this, tr("Failed to fetch podcasts"), reply->errorString()); return; } QJson::Parser parser; QVariant data = parser.parse(reply); // Was it valid JSON? if (data.isNull()) { QMessageBox::warning( this, tr("Failed to fetch podcasts"), tr("There was a problem parsing the response from the iTunes Store")); return; } // Was there an error message in the JSON? if (data.toMap().contains("errorMessage")) { QMessageBox::warning(this, tr("Failed to fetch podcasts"), data.toMap()["errorMessage"].toString()); return; } for (const QVariant& result_variant : data.toMap()["results"].toList()) { QVariantMap result(result_variant.toMap()); if (result["kind"].toString() != "podcast") { continue; } Podcast podcast; podcast.set_author(result["artistName"].toString()); podcast.set_title(result["trackName"].toString()); podcast.set_url(result["feedUrl"].toUrl()); podcast.set_link(result["trackViewUrl"].toUrl()); podcast.set_image_url_small(QUrl(result["artworkUrl30"].toString())); podcast.set_image_url_large(QUrl(result["artworkUrl100"].toString())); model()->appendRow(model()->CreatePodcastItem(podcast)); } } void ITunesSearchPage::Show() { ui_->query->setFocus(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/itunessearchpage.h000066400000000000000000000026611260417502300273360ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_PODCASTS_ITUNESSEARCHPAGE_H_ #define INTERNET_PODCASTS_ITUNESSEARCHPAGE_H_ #include "addpodcastpage.h" class Ui_ITunesSearchPage; class QNetworkAccessManager; class QNetworkReply; class ITunesSearchPage : public AddPodcastPage { Q_OBJECT public: ITunesSearchPage(Application* app, QWidget* parent); ~ITunesSearchPage(); void Show(); static const char* kUrlBase; private slots: void SearchClicked(); void SearchFinished(QNetworkReply* reply); private: Ui_ITunesSearchPage* ui_; QNetworkAccessManager* network_; }; #endif // INTERNET_PODCASTS_ITUNESSEARCHPAGE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/itunessearchpage.ui000066400000000000000000000031521260417502300275200ustar00rootroot00000000000000 ITunesSearchPage 0 0 516 69 Search iTunes :/providers/itunes.png:/providers/itunes.png 0 Enter search terms below to find podcasts in the iTunes Store Search query returnPressed() search click() 237 52 461 55 clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/opmlcontainer.h000066400000000000000000000022561260417502300266560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_PODCASTS_OPMLCONTAINER_H_ #define INTERNET_PODCASTS_OPMLCONTAINER_H_ #include "podcast.h" class OpmlContainer { public: // Only set for the top-level container QUrl url; QString name; QList containers; PodcastList feeds; }; Q_DECLARE_METATYPE(OpmlContainer) #endif // INTERNET_PODCASTS_OPMLCONTAINER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcast.cpp000066400000000000000000000165051260417502300257760ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "podcast.h" #include #include #include #include "core/utilities.h" const QStringList Podcast::kColumns = QStringList() << "url" << "title" << "description" << "copyright" << "link" << "image_url_large" << "image_url_small" << "author" << "owner_name" << "owner_email" << "last_updated" << "last_update_error" << "extra"; const QString Podcast::kColumnSpec = Podcast::kColumns.join(", "); const QString Podcast::kJoinSpec = Utilities::Prepend("p.", Podcast::kColumns).join(", "); const QString Podcast::kBindSpec = Utilities::Prepend(":", Podcast::kColumns).join(", "); const QString Podcast::kUpdateSpec = Utilities::Updateify(Podcast::kColumns).join(", "); struct Podcast::Private : public QSharedData { Private(); int database_id_; QUrl url_; QString title_; QString description_; QString copyright_; QUrl link_; QUrl image_url_large_; QUrl image_url_small_; // iTunes extensions QString author_; QString owner_name_; QString owner_email_; QDateTime last_updated_; QString last_update_error_; QVariantMap extra_; // These are stored in a different table PodcastEpisodeList episodes_; }; Podcast::Private::Private() : database_id_(-1) {} Podcast::Podcast() : d(new Private) {} Podcast::Podcast(const Podcast& other) : d(other.d) {} Podcast::~Podcast() {} Podcast& Podcast::operator=(const Podcast& other) { d = other.d; return *this; } int Podcast::database_id() const { return d->database_id_; } const QUrl& Podcast::url() const { return d->url_; } const QString& Podcast::title() const { return d->title_; } const QString& Podcast::description() const { return d->description_; } const QString& Podcast::copyright() const { return d->copyright_; } const QUrl& Podcast::link() const { return d->link_; } const QUrl& Podcast::image_url_large() const { return d->image_url_large_; } const QUrl& Podcast::image_url_small() const { return d->image_url_small_; } const QString& Podcast::author() const { return d->author_; } const QString& Podcast::owner_name() const { return d->owner_name_; } const QString& Podcast::owner_email() const { return d->owner_email_; } const QDateTime& Podcast::last_updated() const { return d->last_updated_; } const QString& Podcast::last_update_error() const { return d->last_update_error_; } const QVariantMap& Podcast::extra() const { return d->extra_; } QVariant Podcast::extra(const QString& key) const { return d->extra_[key]; } void Podcast::set_database_id(int v) { d->database_id_ = v; } void Podcast::set_url(const QUrl& v) { d->url_ = v; } void Podcast::set_title(const QString& v) { d->title_ = v; } void Podcast::set_description(const QString& v) { d->description_ = v; } void Podcast::set_copyright(const QString& v) { d->copyright_ = v; } void Podcast::set_link(const QUrl& v) { d->link_ = v; } void Podcast::set_image_url_large(const QUrl& v) { d->image_url_large_ = v; } void Podcast::set_image_url_small(const QUrl& v) { d->image_url_small_ = v; } void Podcast::set_author(const QString& v) { d->author_ = v; } void Podcast::set_owner_name(const QString& v) { d->owner_name_ = v; } void Podcast::set_owner_email(const QString& v) { d->owner_email_ = v; } void Podcast::set_last_updated(const QDateTime& v) { d->last_updated_ = v; } void Podcast::set_last_update_error(const QString& v) { d->last_update_error_ = v; } void Podcast::set_extra(const QVariantMap& v) { d->extra_ = v; } void Podcast::set_extra(const QString& key, const QVariant& value) { d->extra_[key] = value; } const PodcastEpisodeList& Podcast::episodes() const { return d->episodes_; } PodcastEpisodeList* Podcast::mutable_episodes() { return &d->episodes_; } void Podcast::set_episodes(const PodcastEpisodeList& v) { d->episodes_ = v; } void Podcast::add_episode(const PodcastEpisode& episode) { d->episodes_.append(episode); } void Podcast::InitFromQuery(const QSqlQuery& query) { d->database_id_ = query.value(0).toInt(); d->url_ = QUrl::fromEncoded(query.value(1).toByteArray()); d->title_ = query.value(2).toString(); d->description_ = query.value(3).toString(); d->copyright_ = query.value(4).toString(); d->link_ = QUrl::fromEncoded(query.value(5).toByteArray()); d->image_url_large_ = QUrl::fromEncoded(query.value(6).toByteArray()); d->image_url_small_ = QUrl::fromEncoded(query.value(7).toByteArray()); d->author_ = query.value(8).toString(); d->owner_name_ = query.value(9).toString(); d->owner_email_ = query.value(10).toString(); d->last_updated_ = QDateTime::fromTime_t(query.value(11).toUInt()); d->last_update_error_ = query.value(12).toString(); QDataStream extra_stream(query.value(13).toByteArray()); extra_stream >> d->extra_; } void Podcast::BindToQuery(QSqlQuery* query) const { query->bindValue(":url", d->url_.toEncoded()); query->bindValue(":title", d->title_); query->bindValue(":description", d->description_); query->bindValue(":copyright", d->copyright_); query->bindValue(":link", d->link_.toEncoded()); query->bindValue(":image_url_large", d->image_url_large_.toEncoded()); query->bindValue(":image_url_small", d->image_url_small_.toEncoded()); query->bindValue(":author", d->author_); query->bindValue(":owner_name", d->owner_name_); query->bindValue(":owner_email", d->owner_email_); query->bindValue(":last_updated", d->last_updated_.toTime_t()); query->bindValue(":last_update_error", d->last_update_error_); QByteArray extra; QDataStream extra_stream(&extra, QIODevice::WriteOnly); extra_stream << d->extra_; query->bindValue(":extra", extra); } void Podcast::InitFromGpo(const mygpo::Podcast* podcast) { d->url_ = podcast->url(); d->title_ = podcast->title(); d->description_ = podcast->description(); d->link_ = podcast->website(); d->image_url_large_ = podcast->logoUrl(); set_extra("gpodder:subscribers", podcast->subscribers()); set_extra("gpodder:subscribers_last_week", podcast->subscribersLastWeek()); set_extra("gpodder:page", podcast->mygpoUrl()); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcast.h000066400000000000000000000070441260417502300254410ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_PODCASTS_PODCAST_H_ #define INTERNET_PODCASTS_PODCAST_H_ #include "podcastepisode.h" #include #include #include #include namespace mygpo { class Podcast; } class Podcast { public: Podcast(); Podcast(const Podcast& other); ~Podcast(); static const QStringList kColumns; static const QString kColumnSpec; static const QString kJoinSpec; static const QString kBindSpec; static const QString kUpdateSpec; void InitFromQuery(const QSqlQuery& query); void InitFromGpo(const mygpo::Podcast* podcast); void BindToQuery(QSqlQuery* query) const; bool is_valid() const { return database_id() != -1; } int database_id() const; const QUrl& url() const; const QString& title() const; const QString& description() const; const QString& copyright() const; const QUrl& link() const; const QUrl& image_url_large() const; const QUrl& image_url_small() const; const QString& author() const; const QString& owner_name() const; const QString& owner_email() const; const QDateTime& last_updated() const; const QString& last_update_error() const; const QVariantMap& extra() const; QVariant extra(const QString& key) const; void set_database_id(int v); void set_url(const QUrl& v); void set_title(const QString& v); void set_description(const QString& v); void set_copyright(const QString& v); void set_link(const QUrl& v); void set_image_url_large(const QUrl& v); void set_image_url_small(const QUrl& v); void set_author(const QString& v); void set_owner_name(const QString& v); void set_owner_email(const QString& v); void set_last_updated(const QDateTime& v); void set_last_update_error(const QString& v); void set_extra(const QVariantMap& v); void set_extra(const QString& key, const QVariant& value); // Small images are suitable for 16x16 icons in lists. Large images are // used in detailed information displays. const QUrl& ImageUrlLarge() const { return image_url_large().isValid() ? image_url_large() : image_url_small(); } const QUrl& ImageUrlSmall() const { return image_url_small().isValid() ? image_url_small() : image_url_large(); } // These are stored in a different database table, and aren't loaded or // persisted by InitFromQuery or BindToQuery. const PodcastEpisodeList& episodes() const; PodcastEpisodeList* mutable_episodes(); void set_episodes(const PodcastEpisodeList& v); void add_episode(const PodcastEpisode& episode); Podcast& operator=(const Podcast& other); private: struct Private; QSharedDataPointer d; }; Q_DECLARE_METATYPE(Podcast) typedef QList PodcastList; Q_DECLARE_METATYPE(QList) #endif // INTERNET_PODCASTS_PODCAST_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcastbackend.cpp000066400000000000000000000230171260417502300273020ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof A. Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "podcastbackend.h" #include #include "core/application.h" #include "core/database.h" #include "core/logging.h" #include "core/scopedtransaction.h" PodcastBackend::PodcastBackend(Application* app, QObject* parent) : QObject(parent), app_(app), db_(app->database()) {} void PodcastBackend::Subscribe(Podcast* podcast) { // If this podcast is already in the database, do nothing if (podcast->is_valid()) { return; } // If there's an entry in the database with the same URL, take its data. Podcast existing_podcast = GetSubscriptionByUrl(podcast->url()); if (existing_podcast.is_valid()) { *podcast = existing_podcast; return; } QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); ScopedTransaction t(&db); // Insert the podcast. QSqlQuery q("INSERT INTO podcasts (" + Podcast::kColumnSpec + ")" " VALUES (" + Podcast::kBindSpec + ")", db); podcast->BindToQuery(&q); q.exec(); if (db_->CheckErrors(q)) return; // Update the database ID. const int database_id = q.lastInsertId().toInt(); podcast->set_database_id(database_id); // Update the IDs of any episodes. PodcastEpisodeList* episodes = podcast->mutable_episodes(); for (auto it = episodes->begin(); it != episodes->end(); ++it) { it->set_podcast_database_id(database_id); } // Add those episodes to the database. AddEpisodes(episodes, &db); t.Commit(); emit SubscriptionAdded(*podcast); } void PodcastBackend::Unsubscribe(const Podcast& podcast) { // If this podcast is not already in the database, do nothing if (!podcast.is_valid()) { return; } QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); ScopedTransaction t(&db); // Remove the podcast. QSqlQuery q("DELETE FROM podcasts WHERE ROWID = :id", db); q.bindValue(":id", podcast.database_id()); q.exec(); if (db_->CheckErrors(q)) return; // Remove all episodes in the podcast q = QSqlQuery("DELETE FROM podcast_episodes WHERE podcast_id = :id", db); q.bindValue(":id", podcast.database_id()); q.exec(); if (db_->CheckErrors(q)) return; t.Commit(); emit SubscriptionRemoved(podcast); } void PodcastBackend::AddEpisodes(PodcastEpisodeList* episodes, QSqlDatabase* db) { QSqlQuery q("INSERT INTO podcast_episodes (" + PodcastEpisode::kColumnSpec + ")" " VALUES (" + PodcastEpisode::kBindSpec + ")", *db); for (auto it = episodes->begin(); it != episodes->end(); ++it) { it->BindToQuery(&q); q.exec(); if (db_->CheckErrors(q)) continue; const int database_id = q.lastInsertId().toInt(); it->set_database_id(database_id); } } void PodcastBackend::AddEpisodes(PodcastEpisodeList* episodes) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); ScopedTransaction t(&db); AddEpisodes(episodes, &db); t.Commit(); emit EpisodesAdded(*episodes); } void PodcastBackend::UpdateEpisodes(const PodcastEpisodeList& episodes) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); ScopedTransaction t(&db); QSqlQuery q( "UPDATE podcast_episodes" " SET listened = :listened," " listened_date = :listened_date," " downloaded = :downloaded," " local_url = :local_url" " WHERE ROWID = :id", db); for (const PodcastEpisode& episode : episodes) { q.bindValue(":listened", episode.listened()); q.bindValue(":listened_date", episode.listened_date().toTime_t()); q.bindValue(":downloaded", episode.downloaded()); q.bindValue(":local_url", episode.local_url().toEncoded()); q.bindValue(":id", episode.database_id()); q.exec(); db_->CheckErrors(q); } t.Commit(); emit EpisodesUpdated(episodes); } PodcastList PodcastBackend::GetAllSubscriptions() { PodcastList ret; QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery q("SELECT ROWID, " + Podcast::kColumnSpec + " FROM podcasts", db); q.exec(); if (db_->CheckErrors(q)) return ret; while (q.next()) { Podcast podcast; podcast.InitFromQuery(q); ret << podcast; } return ret; } Podcast PodcastBackend::GetSubscriptionById(int id) { Podcast ret; QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery q("SELECT ROWID, " + Podcast::kColumnSpec + " FROM podcasts" " WHERE ROWID = :id", db); q.bindValue(":id", id); q.exec(); if (!db_->CheckErrors(q) && q.next()) { ret.InitFromQuery(q); } return ret; } Podcast PodcastBackend::GetSubscriptionByUrl(const QUrl& url) { Podcast ret; QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery q("SELECT ROWID, " + Podcast::kColumnSpec + " FROM podcasts" " WHERE url = :url", db); q.bindValue(":url", url.toEncoded()); q.exec(); if (!db_->CheckErrors(q) && q.next()) { ret.InitFromQuery(q); } return ret; } PodcastEpisodeList PodcastBackend::GetEpisodes(int podcast_id) { PodcastEpisodeList ret; QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery q("SELECT ROWID, " + PodcastEpisode::kColumnSpec + " FROM podcast_episodes" " WHERE podcast_id = :id" " ORDER BY publication_date DESC", db); q.bindValue(":db", podcast_id); q.exec(); if (db_->CheckErrors(q)) return ret; while (q.next()) { PodcastEpisode episode; episode.InitFromQuery(q); ret << episode; } return ret; } PodcastEpisode PodcastBackend::GetEpisodeById(int id) { PodcastEpisode ret; QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery q("SELECT ROWID, " + PodcastEpisode::kColumnSpec + " FROM podcast_episodes" " WHERE ROWID = :id", db); q.bindValue(":db", id); q.exec(); if (!db_->CheckErrors(q) && q.next()) { ret.InitFromQuery(q); } return ret; } PodcastEpisode PodcastBackend::GetEpisodeByUrl(const QUrl& url) { PodcastEpisode ret; QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery q("SELECT ROWID, " + PodcastEpisode::kColumnSpec + " FROM podcast_episodes" " WHERE url = :url", db); q.bindValue(":url", url.toEncoded()); q.exec(); if (!db_->CheckErrors(q) && q.next()) { ret.InitFromQuery(q); } return ret; } PodcastEpisode PodcastBackend::GetEpisodeByUrlOrLocalUrl(const QUrl& url) { PodcastEpisode ret; QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery q("SELECT ROWID, " + PodcastEpisode::kColumnSpec + " FROM podcast_episodes" " WHERE url = :url" " OR local_url = :url", db); q.bindValue(":url", url.toEncoded()); q.exec(); if (!db_->CheckErrors(q) && q.next()) { ret.InitFromQuery(q); } return ret; } PodcastEpisodeList PodcastBackend::GetOldDownloadedEpisodes( const QDateTime& max_listened_date) { PodcastEpisodeList ret; QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery q("SELECT ROWID, " + PodcastEpisode::kColumnSpec + " FROM podcast_episodes" " WHERE downloaded = 'true'" " AND listened_date <= :max_listened_date", db); q.bindValue(":max_listened_date", max_listened_date.toTime_t()); q.exec(); if (db_->CheckErrors(q)) return ret; while (q.next()) { PodcastEpisode episode; episode.InitFromQuery(q); ret << episode; } return ret; } PodcastEpisode PodcastBackend::GetOldestDownloadedListenedEpisode() { PodcastEpisode ret; QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery q("SELECT ROWID, " + PodcastEpisode::kColumnSpec + " FROM podcast_episodes" " WHERE downloaded = 'true'" " AND listened = 'true'" " ORDER BY listened_date ASC", db); q.exec(); if (db_->CheckErrors(q)) return ret; q.next(); ret.InitFromQuery(q); return ret; } PodcastEpisodeList PodcastBackend::GetNewDownloadedEpisodes() { PodcastEpisodeList ret; QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery q("SELECT ROWID, " + PodcastEpisode::kColumnSpec + " FROM podcast_episodes" " WHERE downloaded = 'true'" " AND listened = 'false'", db); q.exec(); if (db_->CheckErrors(q)) return ret; while (q.next()) { PodcastEpisode episode; episode.InitFromQuery(q); ret << episode; } return ret; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcastbackend.h000066400000000000000000000071221260417502300267460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_PODCASTS_PODCASTBACKEND_H_ #define INTERNET_PODCASTS_PODCASTBACKEND_H_ #include #include "podcast.h" class Application; class Database; class PodcastBackend : public QObject { Q_OBJECT public: explicit PodcastBackend(Application* app, QObject* parent = nullptr); // Adds the podcast and any included Episodes to the database. Updates the // podcast with a database ID. If this podcast already has an ID set, this // function does nothing. If a podcast with this URL already exists in the // database, this function just updates the ID field in the provided podcast. void Subscribe(Podcast* podcast); // Removes the Podcast with the given ID from the database. Also removes any // episodes associated with this podcast. void Unsubscribe(const Podcast& podcast); // Returns a list of all the subscribed podcasts. For efficiency the Podcast // objects returned won't contain any PodcastEpisode objects - get them // separately if you want them. PodcastList GetAllSubscriptions(); Podcast GetSubscriptionById(int id); Podcast GetSubscriptionByUrl(const QUrl& url); // Returns podcast episodes that match various keys. All these queries are // indexed. PodcastEpisodeList GetEpisodes(int podcast_id); PodcastEpisode GetEpisodeById(int id); PodcastEpisode GetEpisodeByUrl(const QUrl& url); PodcastEpisode GetEpisodeByUrlOrLocalUrl(const QUrl& url); PodcastEpisode GetOldestDownloadedListenedEpisode(); // Returns a list of episodes that have local data (downloaded=true) but were // last listened to before the given QDateTime. This query is NOT indexed so // it involves a full search of the table. PodcastEpisodeList GetOldDownloadedEpisodes( const QDateTime& max_listened_date); PodcastEpisodeList GetNewDownloadedEpisodes(); // Adds episodes to the database. Every episode must have a valid // podcast_database_id set already. void AddEpisodes(PodcastEpisodeList* episodes); // Updates the editable fields (listened, listened_date, downloaded, and // local_url) on episodes that must already exist in the database. void UpdateEpisodes(const PodcastEpisodeList& episodes); signals: void SubscriptionAdded(const Podcast& podcast); void SubscriptionRemoved(const Podcast& podcast); // Emitted when episodes are added to a subscription that *already exists*. void EpisodesAdded(const PodcastEpisodeList& episodes); // Emitted when existing episodes are updated. void EpisodesUpdated(const PodcastEpisodeList& episodes); private: // Adds each episode to the database, setting their IDs after inserting each // one. void AddEpisodes(PodcastEpisodeList* episodes, QSqlDatabase* db); private: Application* app_; Database* db_; }; #endif // INTERNET_PODCASTS_PODCASTBACKEND_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcastdeleter.cpp000066400000000000000000000072601260417502300273410ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "podcastdeleter.h" #include #include #include #include #include #include #include "core/application.h" #include "core/logging.h" #include "core/timeconstants.h" #include "core/utilities.h" #include "library/librarydirectorymodel.h" #include "library/librarymodel.h" #include "podcastbackend.h" const char* PodcastDeleter::kSettingsGroup = "Podcasts"; const int PodcastDeleter::kAutoDeleteCheckIntervalMsec = 60 * 6 * 60 * kMsecPerSec; PodcastDeleter::PodcastDeleter(Application* app, QObject* parent) : QObject(parent), app_(app), backend_(app_->podcast_backend()), delete_after_secs_(0), auto_delete_timer_(new QTimer(this)) { ReloadSettings(); auto_delete_timer_->setSingleShot(true); AutoDelete(); connect(auto_delete_timer_, SIGNAL(timeout()), SLOT(AutoDelete())); connect(app_, SIGNAL(SettingsChanged()), SLOT(ReloadSettings())); } void PodcastDeleter::DeleteEpisode(const PodcastEpisode& episode) { // Delete the local file if (!QFile::remove(episode.local_url().toLocalFile())) { qLog(Warning) << "The local file" << episode.local_url().toLocalFile() << "could not be removed"; } // Update the episode in the DB PodcastEpisode episode_copy(episode); episode_copy.set_downloaded(false); episode_copy.set_local_url(QUrl()); episode_copy.set_listened_date(QDateTime()); backend_->UpdateEpisodes(PodcastEpisodeList() << episode_copy); } void PodcastDeleter::ReloadSettings() { QSettings s; s.beginGroup(kSettingsGroup); delete_after_secs_ = s.value("delete_after", 0).toInt(); AutoDelete(); } void PodcastDeleter::AutoDelete() { if (delete_after_secs_ <= 0) { return; } auto_delete_timer_->stop(); QDateTime max_date = QDateTime::currentDateTime(); qint64 timeout_ms; PodcastEpisode oldest_episode; QDateTime oldest_episode_time; max_date = max_date.addSecs(-delete_after_secs_); PodcastEpisodeList old_episodes = backend_->GetOldDownloadedEpisodes(max_date); qLog(Info) << "Deleting" << old_episodes.count() << "episodes because they were last listened to" << (delete_after_secs_ / kSecsPerDay) << "days ago"; for (const PodcastEpisode& episode : old_episodes) { DeleteEpisode(episode); } oldest_episode = backend_->GetOldestDownloadedListenedEpisode(); if (!oldest_episode.listened_date().isValid()) { oldest_episode_time = QDateTime::currentDateTime(); } else { oldest_episode_time = oldest_episode.listened_date(); } timeout_ms = QDateTime::currentDateTime().toMSecsSinceEpoch(); timeout_ms -= oldest_episode_time.toMSecsSinceEpoch(); timeout_ms = (delete_after_secs_ * kMsecPerSec) - timeout_ms; qLog(Info) << "Timeout for autodelete set to:" << timeout_ms <<"ms"; if (timeout_ms >= 0) { auto_delete_timer_->setInterval(timeout_ms); } else { auto_delete_timer_->setInterval(kAutoDeleteCheckIntervalMsec); } auto_delete_timer_->start(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcastdeleter.h000066400000000000000000000032371260417502300270060ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_PODCASTS_PODCASTDELETER_H_ #define INTERNET_PODCASTS_PODCASTDELETER_H_ #include "core/network.h" #include "podcast.h" #include "podcastepisode.h" #include #include #include #include #include #include #ifdef Q_OS_WIN #include #else #include #endif class Application; class PodcastBackend; class QNetworkAccessManager; class PodcastDeleter : public QObject { Q_OBJECT public: explicit PodcastDeleter(Application* app, QObject* parent = nullptr); static const char* kSettingsGroup; static const int kAutoDeleteCheckIntervalMsec; public slots: // Deletes downloaded data for this episode void DeleteEpisode(const PodcastEpisode& episode); void AutoDelete(); void ReloadSettings(); private: Application* app_; PodcastBackend* backend_; int delete_after_secs_; QTimer* auto_delete_timer_; }; #endif // INTERNET_PODCASTS_PODCASTDELETER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcastdiscoverymodel.cpp000066400000000000000000000071441260417502300307460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "podcastdiscoverymodel.h" #include #include #include "core/application.h" #include "opmlcontainer.h" #include "podcast.h" #include "ui/iconloader.h" #include "ui/standarditemiconloader.h" PodcastDiscoveryModel::PodcastDiscoveryModel(Application* app, QObject* parent) : QStandardItemModel(parent), app_(app), icon_loader_(new StandardItemIconLoader(app->album_cover_loader(), this)), default_icon_(":providers/podcast16.png") { icon_loader_->SetModel(this); } QVariant PodcastDiscoveryModel::data(const QModelIndex& index, int role) const { if (index.isValid() && role == Qt::DecorationRole && QStandardItemModel::data(index, Role_StartedLoadingImage).toBool() == false) { const QUrl image_url = QStandardItemModel::data(index, Role_ImageUrl).toUrl(); if (image_url.isValid()) { const_cast(this)->LazyLoadImage(image_url, index); } } return QStandardItemModel::data(index, role); } QStandardItem* PodcastDiscoveryModel::CreatePodcastItem( const Podcast& podcast) { QStandardItem* item = new QStandardItem; item->setIcon(default_icon_); item->setText(podcast.title()); item->setData(QVariant::fromValue(podcast), Role_Podcast); item->setData(Type_Podcast, Role_Type); item->setData(podcast.ImageUrlSmall(), Role_ImageUrl); return item; } QStandardItem* PodcastDiscoveryModel::CreateFolder(const QString& name) { if (folder_icon_.isNull()) { folder_icon_ = IconLoader::Load("folder"); } QStandardItem* item = new QStandardItem; item->setIcon(folder_icon_); item->setText(name); item->setData(Type_Folder, Role_Type); return item; } QStandardItem* PodcastDiscoveryModel::CreateOpmlContainerItem( const OpmlContainer& container) { QStandardItem* item = CreateFolder(container.name); CreateOpmlContainerItems(container, item); return item; } void PodcastDiscoveryModel::CreateOpmlContainerItems( const OpmlContainer& container, QStandardItem* parent) { for (const OpmlContainer& child : container.containers) { QStandardItem* child_item = CreateOpmlContainerItem(child); parent->appendRow(child_item); } for (const Podcast& child : container.feeds) { QStandardItem* child_item = CreatePodcastItem(child); parent->appendRow(child_item); } } void PodcastDiscoveryModel::LazyLoadImage(const QUrl& url, const QModelIndex& index) { QStandardItem* item = itemFromIndex(index); item->setData(true, Role_StartedLoadingImage); icon_loader_->LoadIcon(url.toString(), QString(), item); } QStandardItem* PodcastDiscoveryModel::CreateLoadingIndicator() { QStandardItem* item = new QStandardItem; item->setText(tr("Loading...")); item->setData(Type_LoadingIndicator, Role_Type); return item; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcastdiscoverymodel.h000066400000000000000000000041411260417502300304050ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_PODCASTS_PODCASTDISCOVERYMODEL_H_ #define INTERNET_PODCASTS_PODCASTDISCOVERYMODEL_H_ #include "covers/albumcoverloaderoptions.h" #include class Application; class OpmlContainer; class OpmlFeed; class Podcast; class StandardItemIconLoader; class PodcastDiscoveryModel : public QStandardItemModel { Q_OBJECT public: explicit PodcastDiscoveryModel(Application* app, QObject* parent = nullptr); enum Type { Type_Folder, Type_Podcast, Type_LoadingIndicator }; enum Role { Role_Podcast = Qt::UserRole, Role_Type, Role_ImageUrl, Role_StartedLoadingImage, RoleCount }; void CreateOpmlContainerItems(const OpmlContainer& container, QStandardItem* parent); QStandardItem* CreateOpmlContainerItem(const OpmlContainer& container); QStandardItem* CreatePodcastItem(const Podcast& podcast); QStandardItem* CreateFolder(const QString& name); QStandardItem* CreateLoadingIndicator(); QVariant data(const QModelIndex& index, int role) const; private: void LazyLoadImage(const QUrl& url, const QModelIndex& index); private: Application* app_; StandardItemIconLoader* icon_loader_; QIcon default_icon_; QIcon folder_icon_; }; #endif // INTERNET_PODCASTS_PODCASTDISCOVERYMODEL_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcastdownloader.cpp000066400000000000000000000207101260417502300300460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof A. Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "podcastdownloader.h" #include #include #include #include #include #include #include "core/application.h" #include "core/logging.h" #include "core/network.h" #include "core/tagreaderclient.h" #include "core/timeconstants.h" #include "core/utilities.h" #include "library/librarydirectorymodel.h" #include "library/librarymodel.h" #include "podcastbackend.h" const char* PodcastDownloader::kSettingsGroup = "Podcasts"; Task::Task(PodcastEpisode episode, QFile* file, PodcastBackend* backend) : file_(file), episode_(episode), req_(QNetworkRequest(episode.url())), backend_(backend), network_(new NetworkAccessManager(this)), repl(new RedirectFollower(network_->get(req_))) { connect(repl.get(), SIGNAL(readyRead()), SLOT(reading())); connect(repl.get(), SIGNAL(finished()), SLOT(finishedInternal())); connect(repl.get(), SIGNAL(downloadProgress(qint64, qint64)), SLOT(downloadProgressInternal(qint64, qint64))); emit ProgressChanged(episode_, PodcastDownload::Queued, 0); } PodcastEpisode Task::episode() const { return episode_; } void Task::reading() { qint64 bytes = 0; forever { bytes = repl->bytesAvailable(); if (bytes <= 0) break; file_->write(repl->reply()->read(bytes)); } } void Task::finishedPublic() { disconnect(repl.get(), SIGNAL(readyRead()), 0, 0); disconnect(repl.get(), SIGNAL(downloadProgress(qint64, qint64)), 0, 0); disconnect(repl.get(), SIGNAL(finished()), 0, 0); emit ProgressChanged(episode_, PodcastDownload::NotDownloading, 0); // Delete the file file_->remove(); emit finished(this); } void Task::finishedInternal() { if (repl->error() != QNetworkReply::NoError) { qLog(Warning) << "Error downloading episode:" << repl->errorString(); emit ProgressChanged(episode_, PodcastDownload::NotDownloading, 0); // Delete the file file_->remove(); emit finished(this); return; } qLog(Info) << "Download of" << file_->fileName() << "finished"; // Tell the database the episode has been updated. Get it from the DB again // in case the listened field changed in the mean time. PodcastEpisode episode = episode_; episode.set_downloaded(true); episode.set_local_url(QUrl::fromLocalFile(file_->fileName())); backend_->UpdateEpisodes(PodcastEpisodeList() << episode); Podcast podcast = backend_->GetSubscriptionById(episode.podcast_database_id()); Song song = episode_.ToSong(podcast); emit ProgressChanged(episode_, PodcastDownload::Finished, 0); // I didn't ecountered even a single podcast with a corect metadata TagReaderClient::Instance()->SaveFileBlocking(file_->fileName(), song); emit finished(this); } void Task::downloadProgressInternal(qint64 received, qint64 total) { if (total <= 0) { emit ProgressChanged(episode_, PodcastDownload::Downloading, 0); } else { emit ProgressChanged(episode_, PodcastDownload::Downloading, static_cast(received) / total * 100); } } PodcastDownloader::PodcastDownloader(Application* app, QObject* parent) : QObject(parent), app_(app), backend_(app_->podcast_backend()), network_(new NetworkAccessManager(this)), disallowed_filename_characters_("[^a-zA-Z0-9_~ -]"), auto_download_(false) { connect(backend_, SIGNAL(EpisodesAdded(PodcastEpisodeList)), SLOT(EpisodesAdded(PodcastEpisodeList))); connect(backend_, SIGNAL(SubscriptionAdded(Podcast)), SLOT(SubscriptionAdded(Podcast))); connect(app_, SIGNAL(SettingsChanged()), SLOT(ReloadSettings())); ReloadSettings(); } QString PodcastDownloader::DefaultDownloadDir() const { QString prefix = QDir::homePath(); LibraryDirectoryModel* model = app_->library_model()->directory_model(); if (model->rowCount() > 0) { // Download to the first library directory if there is one set prefix = model->index(0, 0).data().toString(); } return prefix + "/Podcasts"; } void PodcastDownloader::ReloadSettings() { QSettings s; s.beginGroup(kSettingsGroup); auto_download_ = s.value("auto_download", false).toBool(); download_dir_ = s.value("download_dir", DefaultDownloadDir()).toString(); } QString PodcastDownloader::FilenameForEpisode(const QString& directory, const PodcastEpisode& episode) const { const QString file_extension = QFileInfo(episode.url().path()).suffix(); int count = 0; // The file name contains the publication date and episode title QString base_filename = episode.publication_date().date().toString(Qt::ISODate) + "-" + SanitiseFilenameComponent(episode.title()); // Add numbers on to the end of the filename until we find one that doesn't // exist. forever { QString filename; if (count == 0) { filename = QString("%1/%2.%3").arg(directory, base_filename, file_extension); } else { filename = QString("%1/%2 (%3).%4").arg( directory, base_filename, QString::number(count), file_extension); } if (!QFile::exists(filename)) { return filename; } count++; } } void PodcastDownloader::DownloadEpisode(const PodcastEpisode& episode) { for (Task* tas : list_tasks_) { if (tas->episode().database_id() == episode.database_id()) { return; } } Podcast podcast = backend_->GetSubscriptionById(episode.podcast_database_id()); if (!podcast.is_valid()) { qLog(Warning) << "The podcast that contains episode" << episode.url() << "doesn't exist any more"; return; } const QString directory = download_dir_ + "/" + SanitiseFilenameComponent(podcast.title()); const QString filepath = FilenameForEpisode(directory, episode); // Open the output file QDir().mkpath(directory); QFile* file = new QFile(filepath); if (!file->open(QIODevice::WriteOnly)) { qLog(Warning) << "Could not open the file" << filepath << "for writing"; return; } Task* task = new Task(episode, file, backend_); list_tasks_ << task; qLog(Info) << "Downloading" << task->episode().url() << "to" << filepath; connect(task, SIGNAL(finished(Task*)), SLOT(ReplyFinished(Task*))); connect(task, SIGNAL(ProgressChanged(const PodcastEpisode&, PodcastDownload::State, int)), SIGNAL(ProgressChanged(const PodcastEpisode&, PodcastDownload::State, int))); } void PodcastDownloader::ReplyFinished(Task* task) { list_tasks_.removeAll(task); delete task; } QString PodcastDownloader::SanitiseFilenameComponent(const QString& text) const { return QString(text) .replace(disallowed_filename_characters_, " ") .simplified(); } void PodcastDownloader::SubscriptionAdded(const Podcast& podcast) { EpisodesAdded(podcast.episodes()); } void PodcastDownloader::EpisodesAdded(const PodcastEpisodeList& episodes) { if (auto_download_) { for (const PodcastEpisode& episode : episodes) { DownloadEpisode(episode); } } } PodcastEpisodeList PodcastDownloader::EpisodesDownloading(const PodcastEpisodeList& episodes) { PodcastEpisodeList ret; for (Task* tas : list_tasks_) { for (PodcastEpisode episode : episodes) { if (tas->episode().database_id() == episode.database_id()) { ret << episode; } } } return ret; } void PodcastDownloader::cancelDownload(const PodcastEpisodeList& episodes) { QList ta; for (Task* tas : list_tasks_) { for (PodcastEpisode episode : episodes) { if (tas->episode().database_id() == episode.database_id()) { ta << tas; } } } for (Task* tas : ta) { tas->finishedPublic(); list_tasks_.removeAll(tas); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcastdownloader.h000066400000000000000000000064051260417502300275200ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_PODCASTS_PODCASTDOWNLOADER_H_ #define INTERNET_PODCASTS_PODCASTDOWNLOADER_H_ #include "core/network.h" #include "podcast.h" #include "podcastepisode.h" #include #include #include #include #include #include #include #ifdef Q_OS_WIN #include #else #include #endif class Application; class PodcastBackend; class QNetworkAccessManager; namespace PodcastDownload { enum State { NotDownloading, Queued, Downloading, Finished }; } class Task : public QObject { Q_OBJECT public: Task(PodcastEpisode episode, QFile* file, PodcastBackend* backend); PodcastEpisode episode() const; signals: void ProgressChanged(const PodcastEpisode& episode, PodcastDownload::State state, int percent); void finished(Task* task); public slots: void finishedPublic(); private slots: void reading(); void downloadProgressInternal(qint64 received, qint64 total); void finishedInternal(); private: std::unique_ptr file_; PodcastEpisode episode_; QNetworkRequest req_; PodcastBackend* backend_; std::unique_ptr network_; std::unique_ptr repl; }; class PodcastDownloader : public QObject { Q_OBJECT public: explicit PodcastDownloader(Application* app, QObject* parent = nullptr); static const char* kSettingsGroup; PodcastEpisodeList EpisodesDownloading(const PodcastEpisodeList& episodes); QString DefaultDownloadDir() const; public slots: // Adds the episode to the download queue void DownloadEpisode(const PodcastEpisode& episode); void cancelDownload(const PodcastEpisodeList& episodes); signals: void ProgressChanged(const PodcastEpisode& episode, PodcastDownload::State state, int percent); private slots: void ReloadSettings(); void SubscriptionAdded(const Podcast& podcast); void EpisodesAdded(const PodcastEpisodeList& episodes); void ReplyFinished(Task* task); private: QString FilenameForEpisode(const QString& directory, const PodcastEpisode& episode) const; QString SanitiseFilenameComponent(const QString& text) const; private: Application* app_; PodcastBackend* backend_; QNetworkAccessManager* network_; QRegExp disallowed_filename_characters_; bool auto_download_; QString download_dir_; QList list_tasks_; }; #endif // INTERNET_PODCASTS_PODCASTDOWNLOADER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcastepisode.cpp000066400000000000000000000204361260417502300273450ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012-2014, David Sansome Copyright 2014, John Maguire Copyright 2014, Krzysztof A. Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "podcastepisode.h" #include #include #include #include #include "podcast.h" #include "core/logging.h" #include "core/timeconstants.h" #include "core/utilities.h" const QStringList PodcastEpisode::kColumns = QStringList() << "podcast_id" << "title" << "description" << "author" << "publication_date" << "duration_secs" << "url" << "listened" << "listened_date" << "downloaded" << "local_url" << "extra"; const QString PodcastEpisode::kColumnSpec = PodcastEpisode::kColumns.join(", "); const QString PodcastEpisode::kJoinSpec = Utilities::Prepend("e.", PodcastEpisode::kColumns).join(", "); const QString PodcastEpisode::kBindSpec = Utilities::Prepend(":", PodcastEpisode::kColumns).join(", "); const QString PodcastEpisode::kUpdateSpec = Utilities::Updateify(PodcastEpisode::kColumns).join(", "); struct PodcastEpisode::Private : public QSharedData { Private(); int database_id_; int podcast_database_id_; QString title_; QString description_; QString author_; QDateTime publication_date_; int duration_secs_; QUrl url_; bool listened_; QDateTime listened_date_; bool downloaded_; QUrl local_url_; QVariantMap extra_; }; PodcastEpisode::Private::Private() : database_id_(-1), podcast_database_id_(-1), duration_secs_(-1), listened_(false), downloaded_(false) {} PodcastEpisode::PodcastEpisode() : d(new Private) {} PodcastEpisode::PodcastEpisode(const PodcastEpisode& other) : d(other.d) {} PodcastEpisode::~PodcastEpisode() {} PodcastEpisode& PodcastEpisode::operator=(const PodcastEpisode& other) { d = other.d; return *this; } int PodcastEpisode::database_id() const { return d->database_id_; } int PodcastEpisode::podcast_database_id() const { return d->podcast_database_id_; } const QString& PodcastEpisode::title() const { return d->title_; } const QString& PodcastEpisode::description() const { return d->description_; } const QString& PodcastEpisode::author() const { return d->author_; } const QDateTime& PodcastEpisode::publication_date() const { return d->publication_date_; } int PodcastEpisode::duration_secs() const { return d->duration_secs_; } const QUrl& PodcastEpisode::url() const { return d->url_; } bool PodcastEpisode::listened() const { return d->listened_; } const QDateTime& PodcastEpisode::listened_date() const { return d->listened_date_; } bool PodcastEpisode::downloaded() const { return d->downloaded_; } const QUrl& PodcastEpisode::local_url() const { return d->local_url_; } const QVariantMap& PodcastEpisode::extra() const { return d->extra_; } QVariant PodcastEpisode::extra(const QString& key) const { return d->extra_[key]; } void PodcastEpisode::set_database_id(int v) { d->database_id_ = v; } void PodcastEpisode::set_podcast_database_id(int v) { d->podcast_database_id_ = v; } void PodcastEpisode::set_title(const QString& v) { d->title_ = v; } void PodcastEpisode::set_description(const QString& v) { d->description_ = v; } void PodcastEpisode::set_author(const QString& v) { d->author_ = v; } void PodcastEpisode::set_publication_date(const QDateTime& v) { d->publication_date_ = v; } void PodcastEpisode::set_duration_secs(int v) { d->duration_secs_ = v; } void PodcastEpisode::set_url(const QUrl& v) { d->url_ = v; } void PodcastEpisode::set_listened(bool v) { d->listened_ = v; } void PodcastEpisode::set_listened_date(const QDateTime& v) { d->listened_date_ = v; } void PodcastEpisode::set_downloaded(bool v) { d->downloaded_ = v; } void PodcastEpisode::set_local_url(const QUrl& v) { d->local_url_ = v; } void PodcastEpisode::set_extra(const QVariantMap& v) { d->extra_ = v; } void PodcastEpisode::set_extra(const QString& key, const QVariant& value) { d->extra_[key] = value; } void PodcastEpisode::InitFromQuery(const QSqlQuery& query) { d->database_id_ = query.value(0).toInt(); d->podcast_database_id_ = query.value(1).toInt(); d->title_ = query.value(2).toString(); d->description_ = query.value(3).toString(); d->author_ = query.value(4).toString(); d->publication_date_ = QDateTime::fromTime_t(query.value(5).toUInt()); d->duration_secs_ = query.value(6).toInt(); d->url_ = QUrl::fromEncoded(query.value(7).toByteArray()); d->listened_ = query.value(8).toBool(); // After setting QDateTime to invalid state, it's saved into database as time_t, // when this number std::numeric_limits::max() (4294967295) is read back // from database, it creates a valid QDateTime. // So to make it behave consistently, this change is needed. if (query.value(9).toUInt() == std::numeric_limits::max()) { d->listened_date_ = QDateTime(); } else { d->listened_date_ = QDateTime::fromTime_t(query.value(9).toUInt()); } d->downloaded_ = query.value(10).toBool(); d->local_url_ = QUrl::fromEncoded(query.value(11).toByteArray()); QDataStream extra_stream(query.value(12).toByteArray()); extra_stream >> d->extra_; } void PodcastEpisode::BindToQuery(QSqlQuery* query) const { query->bindValue(":podcast_id", d->podcast_database_id_); query->bindValue(":title", d->title_); query->bindValue(":description", d->description_); query->bindValue(":author", d->author_); query->bindValue(":publication_date", d->publication_date_.toTime_t()); query->bindValue(":duration_secs", d->duration_secs_); query->bindValue(":url", d->url_.toEncoded()); query->bindValue(":listened", d->listened_); query->bindValue(":listened_date", d->listened_date_.toTime_t()); query->bindValue(":downloaded", d->downloaded_); query->bindValue(":local_url", d->local_url_.toEncoded()); QByteArray extra; QDataStream extra_stream(&extra, QIODevice::WriteOnly); extra_stream << d->extra_; query->bindValue(":extra", extra); } Song PodcastEpisode::ToSong(const Podcast& podcast) const { Song ret; ret.set_valid(true); ret.set_title(title().simplified()); ret.set_artist(author().simplified()); ret.set_length_nanosec(kNsecPerSec * duration_secs()); ret.set_year(publication_date().date().year()); ret.set_comment(description()); ret.set_id(database_id()); ret.set_ctime(publication_date().toTime_t()); ret.set_genre(QString("Podcast")); ret.set_genre_id3(186); if (listened() && listened_date().isValid()) { ret.set_mtime(listened_date().toTime_t()); } else { ret.set_mtime(publication_date().toTime_t()); } if (ret.length_nanosec() < 0) { ret.set_length_nanosec(-1); } if (downloaded() && QFile::exists(local_url().toLocalFile())) { ret.set_url(local_url()); } else { ret.set_url(url()); } ret.set_basefilename(QFileInfo(ret.url().path()).fileName()); // Use information from the podcast if it's set if (podcast.is_valid()) { ret.set_album(podcast.title().simplified()); ret.set_art_automatic(podcast.ImageUrlLarge().toString()); if (author().isEmpty()) ret.set_artist(podcast.title().simplified()); } return ret; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcastepisode.h000066400000000000000000000054731260417502300270160ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_PODCASTS_PODCASTEPISODE_H_ #define INTERNET_PODCASTS_PODCASTEPISODE_H_ #include "core/song.h" #include #include #include #include class Podcast; class PodcastEpisode { public: PodcastEpisode(); PodcastEpisode(const PodcastEpisode& other); ~PodcastEpisode(); static const QStringList kColumns; static const QString kColumnSpec; static const QString kJoinSpec; static const QString kBindSpec; static const QString kUpdateSpec; void InitFromQuery(const QSqlQuery& query); void BindToQuery(QSqlQuery* query) const; Song ToSong(const Podcast& podcast) const; bool is_valid() const { return database_id() != -1; } int database_id() const; int podcast_database_id() const; const QString& title() const; const QString& description() const; const QString& author() const; const QDateTime& publication_date() const; int duration_secs() const; const QUrl& url() const; bool listened() const; const QDateTime& listened_date() const; bool downloaded() const; const QUrl& local_url() const; const QVariantMap& extra() const; QVariant extra(const QString& key) const; void set_database_id(int v); void set_podcast_database_id(int v); void set_title(const QString& v); void set_description(const QString& v); void set_author(const QString& v); void set_publication_date(const QDateTime& v); void set_duration_secs(int v); void set_url(const QUrl& v); void set_listened(bool v); void set_listened_date(const QDateTime& v); void set_downloaded(bool v); void set_local_url(const QUrl& v); void set_extra(const QVariantMap& v); void set_extra(const QString& key, const QVariant& value); PodcastEpisode& operator=(const PodcastEpisode& other); private: struct Private; QSharedDataPointer d; }; Q_DECLARE_METATYPE(PodcastEpisode) typedef QList PodcastEpisodeList; Q_DECLARE_METATYPE(QList) #endif // INTERNET_PODCASTS_PODCASTEPISODE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcastinfowidget.cpp000066400000000000000000000067701260417502300300610ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof A. Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "podcastinfowidget.h" #include "ui_podcastinfowidget.h" #include "core/application.h" #include "covers/albumcoverloader.h" PodcastInfoWidget::PodcastInfoWidget(QWidget* parent) : QWidget(parent), ui_(new Ui_PodcastInfoWidget), app_(nullptr), image_id_(0) { ui_->setupUi(this); cover_options_.desired_height_ = 180; ui_->image->setFixedSize(cover_options_.desired_height_, cover_options_.desired_height_); // Set the colour of all the labels const bool light = palette().color(QPalette::Base).value() > 128; const QColor color = palette().color(QPalette::Dark); QPalette label_palette(palette()); label_palette.setColor(QPalette::WindowText, light ? color.darker(150) : color.lighter(125)); for (QLabel* label : findChildren()) { if (label->property("field_label").toBool()) { label->setPalette(label_palette); } } } PodcastInfoWidget::~PodcastInfoWidget() {} void PodcastInfoWidget::SetApplication(Application* app) { app_ = app; connect(app_->album_cover_loader(), SIGNAL(ImageLoaded(quint64, QImage)), SLOT(ImageLoaded(quint64, QImage))); } namespace { template void SetText(const QString& value, T* label, QLabel* buddy_label = nullptr) { const bool visible = !value.isEmpty(); label->setVisible(visible); if (buddy_label) { buddy_label->setVisible(visible); } if (visible) { label->setText(value); } } } // namespace void PodcastInfoWidget::SetPodcast(const Podcast& podcast) { if (image_id_) { app_->album_cover_loader()->CancelTask(image_id_); image_id_ = 0; } podcast_ = podcast; if (podcast.ImageUrlLarge().isValid()) { // Start loading an image for this item. image_id_ = app_->album_cover_loader()->LoadImageAsync( cover_options_, podcast.ImageUrlLarge().toString(), QString()); } ui_->image->hide(); SetText(podcast.title(), ui_->title); SetText(podcast.description(), ui_->description); SetText(podcast.copyright(), ui_->copyright, ui_->copyright_label); SetText(podcast.author(), ui_->author, ui_->author_label); SetText(podcast.owner_name(), ui_->owner, ui_->owner_label); SetText(podcast.link().toString(), ui_->website, ui_->website_label); SetText(podcast.extra("gpodder:subscribers").toString(), ui_->subscribers, ui_->subscribers_label); if (!image_id_) { emit LoadingFinished(); } } void PodcastInfoWidget::ImageLoaded(quint64 id, const QImage& image) { if (id != image_id_) { return; } image_id_ = 0; if (!image.isNull()) { ui_->image->setPixmap(QPixmap::fromImage(image)); ui_->image->show(); } emit LoadingFinished(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcastinfowidget.h000066400000000000000000000031331260417502300275140ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_PODCASTS_PODCASTINFOWIDGET_H_ #define INTERNET_PODCASTS_PODCASTINFOWIDGET_H_ #include "podcast.h" #include "covers/albumcoverloaderoptions.h" #include class Application; class Ui_PodcastInfoWidget; class QLabel; class PodcastInfoWidget : public QWidget { Q_OBJECT public: explicit PodcastInfoWidget(QWidget* parent = nullptr); ~PodcastInfoWidget(); void SetApplication(Application* app); void SetPodcast(const Podcast& podcast); signals: void LoadingFinished(); private slots: void ImageLoaded(quint64 id, const QImage& image); private: Ui_PodcastInfoWidget* ui_; AlbumCoverLoaderOptions cover_options_; Application* app_; Podcast podcast_; quint64 image_id_; }; #endif // INTERNET_PODCASTS_PODCASTINFOWIDGET_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcastinfowidget.ui000066400000000000000000000130201260417502300276760ustar00rootroot00000000000000 PodcastInfoWidget 0 0 398 551 Form #title { font-weight: bold; } #description { font-size: smaller; } QLineEdit { background: transparent; } QLayout::SetMinAndMaxSize 0 Qt::Horizontal 0 0 0 0 Qt::Horizontal 0 0 true Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse true Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse QLayout::SetMinAndMaxSize false true Author true false true Website true false true Copyright true false true Owner true Subscribers true false true Qt::Vertical 0 0 clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcastparser.cpp000066400000000000000000000247311260417502300272130ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, 2014, David Sansome Copyright 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "podcastparser.h" #include #include #include "core/logging.h" #include "core/utilities.h" #include "opmlcontainer.h" // Namespace constants must be lower case. const char* PodcastParser::kAtomNamespace = "http://www.w3.org/2005/atom"; const char* PodcastParser::kItunesNamespace = "http://www.itunes.com/dtds/podcast-1.0.dtd"; PodcastParser::PodcastParser() { supported_mime_types_ << "application/rss+xml" << "application/xml" << "text/x-opml" << "text/xml"; } bool PodcastParser::SupportsContentType(const QString& content_type) const { if (content_type.isEmpty()) { // Why not have a go. return true; } for (const QString& mime_type : supported_mime_types()) { if (content_type.contains(mime_type)) { return true; } } return false; } bool PodcastParser::TryMagic(const QByteArray& data) const { QString str(QString::fromUtf8(data)); return str.contains(QRegExp("atEnd()) { QXmlStreamReader::TokenType type = reader->readNext(); switch (type) { case QXmlStreamReader::StartElement: { const QStringRef name = reader->name(); const QString lower_namespace = reader->namespaceUri().toString().toLower(); if (name == "title") { ret->set_title(reader->readElementText()); } else if (name == "link" && lower_namespace.isEmpty()) { ret->set_link(QUrl::fromEncoded(reader->readElementText().toAscii())); } else if (name == "description") { ret->set_description(reader->readElementText()); } else if (name == "owner" && lower_namespace == kItunesNamespace) { ParseItunesOwner(reader, ret); } else if (name == "image") { ParseImage(reader, ret); } else if (name == "copyright") { ret->set_copyright(reader->readElementText()); } else if (name == "link" && lower_namespace == kAtomNamespace && ret->url().isEmpty() && reader->attributes().value("rel") == "self") { ret->set_url(QUrl::fromEncoded(reader->readElementText().toAscii())); } else if (name == "item") { ParseItem(reader, ret); } else { Utilities::ConsumeCurrentElement(reader); } break; } case QXmlStreamReader::EndElement: return; default: break; } } } void PodcastParser::ParseImage(QXmlStreamReader* reader, Podcast* ret) const { while (!reader->atEnd()) { QXmlStreamReader::TokenType type = reader->readNext(); switch (type) { case QXmlStreamReader::StartElement: { const QStringRef name = reader->name(); if (name == "url") { ret->set_image_url_large( QUrl::fromEncoded(reader->readElementText().toAscii())); } else { Utilities::ConsumeCurrentElement(reader); } break; } case QXmlStreamReader::EndElement: return; default: break; } } } void PodcastParser::ParseItunesOwner(QXmlStreamReader* reader, Podcast* ret) const { while (!reader->atEnd()) { QXmlStreamReader::TokenType type = reader->readNext(); switch (type) { case QXmlStreamReader::StartElement: { const QStringRef name = reader->name(); if (name == "name") { ret->set_owner_name(reader->readElementText()); } else if (name == "email") { ret->set_owner_email(reader->readElementText()); } else { Utilities::ConsumeCurrentElement(reader); } break; } case QXmlStreamReader::EndElement: return; default: break; } } } void PodcastParser::ParseItem(QXmlStreamReader* reader, Podcast* ret) const { PodcastEpisode episode; while (!reader->atEnd()) { QXmlStreamReader::TokenType type = reader->readNext(); switch (type) { case QXmlStreamReader::StartElement: { const QStringRef name = reader->name(); const QString lower_namespace = reader->namespaceUri().toString().toLower(); if (name == "title") { episode.set_title(reader->readElementText()); } else if (name == "description") { episode.set_description(reader->readElementText()); } else if (name == "pubDate") { QString date = reader->readElementText(); episode.set_publication_date(Utilities::ParseRFC822DateTime(date)); if (!episode.publication_date().isValid()) { qLog(Error) << "Unable to parse date:" << date << "Please submit it to " << "https://github.com/clementine-player/Clementine/issues/new?title=" + QUrl::toPercentEncoding(QString("[podcast] Unable to parse date: %1").arg(date)); } } else if (name == "duration" && lower_namespace == kItunesNamespace) { // http://www.apple.com/itunes/podcasts/specs.html QStringList parts = reader->readElementText().split(':'); if (parts.count() == 2) { episode.set_duration_secs(parts[0].toInt() * 60 + parts[1].toInt()); } else if (parts.count() >= 3) { episode.set_duration_secs(parts[0].toInt() * 60 * 60 + parts[1].toInt() * 60 + parts[2].toInt()); } } else if (name == "enclosure") { const QString type = reader->attributes().value("type").toString(); if (type.startsWith("audio/") || type.startsWith("x-audio/")) { episode.set_url(QUrl::fromEncoded( reader->attributes().value("url").toString().toAscii())); } Utilities::ConsumeCurrentElement(reader); } else if (name == "author" && lower_namespace == kItunesNamespace) { episode.set_author(reader->readElementText()); } else { Utilities::ConsumeCurrentElement(reader); } break; } case QXmlStreamReader::EndElement: if (!episode.publication_date().isValid()) { episode.set_publication_date(QDateTime::currentDateTime()); } if (!episode.url().isEmpty()) { ret->add_episode(episode); } return; default: break; } } } bool PodcastParser::ParseOpml(QXmlStreamReader* reader, OpmlContainer* ret) const { if (!Utilities::ParseUntilElement(reader, "body")) { return false; } ParseOutline(reader, ret); // OPML files sometimes consist of a single top level container. while (ret->feeds.count() == 0 && ret->containers.count() == 1) { *ret = ret->containers[0]; } return true; } void PodcastParser::ParseOutline(QXmlStreamReader* reader, OpmlContainer* ret) const { while (!reader->atEnd()) { QXmlStreamReader::TokenType type = reader->readNext(); switch (type) { case QXmlStreamReader::StartElement: { const QStringRef name = reader->name(); if (name != "outline") { Utilities::ConsumeCurrentElement(reader); continue; } QXmlStreamAttributes attributes = reader->attributes(); if (attributes.value("type").toString() == "rss") { // Parse the feed and add it to this container Podcast podcast; podcast.set_description(attributes.value("description").toString()); podcast.set_title(attributes.value("text").toString()); podcast.set_image_url_large(QUrl::fromEncoded( attributes.value("imageHref").toString().toAscii())); podcast.set_url(QUrl::fromEncoded( attributes.value("xmlUrl").toString().toAscii())); ret->feeds.append(podcast); // Consume any children and the EndElement. Utilities::ConsumeCurrentElement(reader); } else { // Create a new child container OpmlContainer child; // Take the name from the fullname attribute first if it exists. child.name = attributes.value("fullname").toString(); if (child.name.isEmpty()) { child.name = attributes.value("text").toString(); } // Parse its contents and add it to this container ParseOutline(reader, &child); ret->containers.append(child); } break; } case QXmlStreamReader::EndElement: return; default: break; } } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcastparser.h000066400000000000000000000046001260417502300266510ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_PODCASTS_PODCASTPARSER_H_ #define INTERNET_PODCASTS_PODCASTPARSER_H_ #include #include "podcast.h" class OpmlContainer; class QXmlStreamReader; // Reads XML data from a QIODevice. // Returns either a Podcast or an OpmlContainer depending on what was inside // the XML document. class PodcastParser { public: PodcastParser(); static const char* kAtomNamespace; static const char* kItunesNamespace; const QStringList& supported_mime_types() const { return supported_mime_types_; } bool SupportsContentType(const QString& content_type) const; // You should check the type of the returned QVariant to see whether it // contains a Podcast or an OpmlContainer. If the QVariant isNull then an // error occurred parsing the XML. QVariant Load(QIODevice* device, const QUrl& url) const; // Really quick test to see if some data might be supported. Load() might // still return a null QVariant. bool TryMagic(const QByteArray& data) const; private: bool ParseRss(QXmlStreamReader* reader, Podcast* ret) const; void ParseChannel(QXmlStreamReader* reader, Podcast* ret) const; void ParseImage(QXmlStreamReader* reader, Podcast* ret) const; void ParseItunesOwner(QXmlStreamReader* reader, Podcast* ret) const; void ParseItem(QXmlStreamReader* reader, Podcast* ret) const; bool ParseOpml(QXmlStreamReader* reader, OpmlContainer* ret) const; void ParseOutline(QXmlStreamReader* reader, OpmlContainer* ret) const; private: QStringList supported_mime_types_; }; #endif // INTERNET_PODCASTS_PODCASTPARSER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcastservice.cpp000066400000000000000000000700531260417502300273550ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, 2014, John Maguire Copyright 2012-2013, David Sansome Copyright 2013-2014, Krzysztof A. Sobiecki Copyright 2014, Simeon Bird Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "internet/podcasts/podcastservice.h" #include #include #include #include #include "addpodcastdialog.h" #include "core/application.h" #include "core/logging.h" #include "core/mergedproxymodel.h" #include "devices/devicemanager.h" #include "devices/devicestatefiltermodel.h" #include "devices/deviceview.h" #include "internet/core/internetmodel.h" #include "library/libraryview.h" #include "opmlcontainer.h" #include "podcastbackend.h" #include "podcastdeleter.h" #include "podcastdownloader.h" #include "internet/podcasts/podcastservicemodel.h" #include "podcastupdater.h" #include "ui/iconloader.h" #include "ui/organisedialog.h" #include "ui/organiseerrordialog.h" #include "ui/standarditemiconloader.h" const char* PodcastService::kServiceName = "Podcasts"; const char* PodcastService::kSettingsGroup = "Podcasts"; class PodcastSortProxyModel : public QSortFilterProxyModel { public: explicit PodcastSortProxyModel(QObject* parent = nullptr); protected: bool lessThan(const QModelIndex& left, const QModelIndex& right) const; }; PodcastService::PodcastService(Application* app, InternetModel* parent) : InternetService(kServiceName, app, parent, parent), use_pretty_covers_(true), hide_listened_(false), show_episodes_(0), icon_loader_(new StandardItemIconLoader(app->album_cover_loader(), this)), backend_(app->podcast_backend()), model_(new PodcastServiceModel(this)), proxy_(new PodcastSortProxyModel(this)), context_menu_(nullptr), root_(nullptr), organise_dialog_(new OrganiseDialog(app_->task_manager(), nullptr)) { icon_loader_->SetModel(model_); proxy_->setSourceModel(model_); proxy_->setDynamicSortFilter(true); proxy_->sort(0); connect(backend_, SIGNAL(SubscriptionAdded(Podcast)), SLOT(SubscriptionAdded(Podcast))); connect(backend_, SIGNAL(SubscriptionRemoved(Podcast)), SLOT(SubscriptionRemoved(Podcast))); connect(backend_, SIGNAL(EpisodesAdded(PodcastEpisodeList)), SLOT(EpisodesAdded(PodcastEpisodeList))); connect(backend_, SIGNAL(EpisodesUpdated(PodcastEpisodeList)), SLOT(EpisodesUpdated(PodcastEpisodeList))); connect(app_->playlist_manager(), SIGNAL(CurrentSongChanged(Song)), SLOT(CurrentSongChanged(Song))); connect(organise_dialog_.get(), SIGNAL(FileCopied(int)), this, SLOT(FileCopied(int))); } PodcastService::~PodcastService() {} PodcastSortProxyModel::PodcastSortProxyModel(QObject* parent) : QSortFilterProxyModel(parent) {} bool PodcastSortProxyModel::lessThan(const QModelIndex& left, const QModelIndex& right) const { const int left_type = left.data(InternetModel::Role_Type).toInt(); const int right_type = right.data(InternetModel::Role_Type).toInt(); // The special Add Podcast item comes first if (left_type == PodcastService::Type_AddPodcast) return true; else if (right_type == PodcastService::Type_AddPodcast) return false; // Otherwise we only compare identical typed items. if (left_type != right_type) return QSortFilterProxyModel::lessThan(left, right); switch (left_type) { case PodcastService::Type_Podcast: return left.data().toString().localeAwareCompare( right.data().toString()) < 0; case PodcastService::Type_Episode: { const PodcastEpisode left_episode = left.data(PodcastService::Role_Episode).value(); const PodcastEpisode right_episode = right.data(PodcastService::Role_Episode).value(); return left_episode.publication_date() > right_episode.publication_date(); } default: return QSortFilterProxyModel::lessThan(left, right); } } QStandardItem* PodcastService::CreateRootItem() { root_ = new QStandardItem(QIcon(":providers/podcast16.png"), tr("Podcasts")); root_->setData(true, InternetModel::Role_CanLazyLoad); return root_; } void PodcastService::CopyToDevice() { if (selected_episodes_.isEmpty() && explicitly_selected_podcasts_.isEmpty()) { CopyToDevice(backend_->GetNewDownloadedEpisodes()); } else { CopyToDevice(selected_episodes_, explicitly_selected_podcasts_); } } void PodcastService::CopyToDevice(const PodcastEpisodeList& episodes_list) { SongList songs; Podcast podcast; for (const PodcastEpisode& episode : episodes_list) { podcast = backend_->GetSubscriptionById(episode.podcast_database_id()); songs.append(episode.ToSong(podcast)); } organise_dialog_->SetDestinationModel( app_->device_manager()->connected_devices_model(), true); organise_dialog_->SetCopy(true); if (organise_dialog_->SetSongs(songs)) organise_dialog_->show(); } void PodcastService::CopyToDevice(const QModelIndexList& episode_indexes, const QModelIndexList& podcast_indexes) { PodcastEpisode episode_tmp; SongList songs; PodcastEpisodeList episodes; Podcast podcast; for (const QModelIndex& index : episode_indexes) { episode_tmp = index.data(Role_Episode).value(); if (episode_tmp.downloaded()) episodes << episode_tmp; } for (const QModelIndex& podcast : podcast_indexes) { for (int i = 0; i < podcast.model()->rowCount(podcast); ++i) { const QModelIndex& index = podcast.child(i, 0); episode_tmp = index.data(Role_Episode).value(); if (episode_tmp.downloaded() && !episode_tmp.listened()) episodes << episode_tmp; } } for (const PodcastEpisode& episode : episodes) { podcast = backend_->GetSubscriptionById(episode.podcast_database_id()); songs.append(episode.ToSong(podcast)); } organise_dialog_->SetDestinationModel( app_->device_manager()->connected_devices_model(), true); organise_dialog_->SetCopy(true); if (organise_dialog_->SetSongs(songs)) organise_dialog_->show(); } void PodcastService::CancelDownload() { CancelDownload(selected_episodes_, explicitly_selected_podcasts_); } void PodcastService::CancelDownload(const QModelIndexList& episode_indexes, const QModelIndexList& podcast_indexes) { PodcastEpisode episode_tmp; SongList songs; PodcastEpisodeList episodes; Podcast podcast; for (const QModelIndex& index : episode_indexes) { episode_tmp = index.data(Role_Episode).value(); episodes << episode_tmp; } for (const QModelIndex& podcast : podcast_indexes) { for (int i = 0; i < podcast.model()->rowCount(podcast); ++i) { const QModelIndex& index = podcast.child(i, 0); episode_tmp = index.data(Role_Episode).value(); episodes << episode_tmp; } } episodes = app_->podcast_downloader()->EpisodesDownloading(episodes); app_->podcast_downloader()->cancelDownload(episodes); } void PodcastService::LazyPopulate(QStandardItem* parent) { switch (parent->data(InternetModel::Role_Type).toInt()) { case InternetModel::Type_Service: PopulatePodcastList(model_->invisibleRootItem()); model()->merged_model()->AddSubModel(parent->index(), proxy_); break; } } void PodcastService::PopulatePodcastList(QStandardItem* parent) { // Do this here since the downloader won't be created yet in the ctor. connect(app_->podcast_downloader(), SIGNAL(ProgressChanged(PodcastEpisode, PodcastDownload::State, int)), SLOT(DownloadProgressChanged(PodcastEpisode, PodcastDownload::State, int))); if (default_icon_.isNull()) { default_icon_ = QIcon(":providers/podcast16.png"); } for (const Podcast& podcast : backend_->GetAllSubscriptions()) { parent->appendRow(CreatePodcastItem(podcast)); } } void PodcastService::ClearPodcastList(QStandardItem* parent) { parent->removeRows(0, parent->rowCount()); } void PodcastService::UpdatePodcastText(QStandardItem* item, int unlistened_count) const { const Podcast podcast = item->data(Role_Podcast).value(); QString title = podcast.title().simplified(); QFont font; if (unlistened_count > 0) { // Add the number of new episodes after the title. title.append(QString(" (%1)").arg(unlistened_count)); // Set a bold font font.setBold(true); } item->setFont(font); item->setText(title); } void PodcastService::UpdateEpisodeText(QStandardItem* item, PodcastDownload::State state, int percent) { const PodcastEpisode episode = item->data(Role_Episode).value(); QString title = episode.title().simplified(); QString tooltip; QFont font; QIcon icon; // Unlistened episodes are bold if (!episode.listened()) { font.setBold(true); } // Downloaded episodes get an icon if (episode.downloaded()) { if (downloaded_icon_.isNull()) { downloaded_icon_ = IconLoader::Load("document-save"); } icon = downloaded_icon_; } // Queued or downloading episodes get icons, tooltips, and maybe a title. switch (state) { case PodcastDownload::Queued: if (queued_icon_.isNull()) { queued_icon_ = QIcon(":icons/22x22/user-away.png"); } icon = queued_icon_; tooltip = tr("Download queued"); break; case PodcastDownload::Downloading: if (downloading_icon_.isNull()) { downloading_icon_ = IconLoader::Load("go-down"); } icon = downloading_icon_; tooltip = tr("Downloading (%1%)...").arg(percent); title = QString("[ %1% ] %2").arg(QString::number(percent), episode.title()); break; case PodcastDownload::Finished: case PodcastDownload::NotDownloading: break; } item->setFont(font); item->setText(title); item->setIcon(icon); } void PodcastService::UpdatePodcastText(QStandardItem* item, PodcastDownload::State state, int percent) { const Podcast podcast = item->data(Role_Podcast).value(); QString tooltip; QIcon icon; // Queued or downloading podcasts get icons, tooltips, and maybe a title. switch (state) { case PodcastDownload::Queued: if (queued_icon_.isNull()) { queued_icon_ = QIcon(":icons/22x22/user-away.png"); } icon = queued_icon_; item->setIcon(icon); tooltip = tr("Download queued"); break; case PodcastDownload::Downloading: if (downloading_icon_.isNull()) { downloading_icon_ = IconLoader::Load("go-down"); } icon = downloading_icon_; item->setIcon(icon); tooltip = tr("Downloading (%1%)...").arg(percent); break; case PodcastDownload::Finished: case PodcastDownload::NotDownloading: if (podcast.ImageUrlSmall().isValid()) { icon_loader_->LoadIcon(podcast.ImageUrlSmall().toString(), QString(), item); } else { item->setIcon(default_icon_); } break; } } QStandardItem* PodcastService::CreatePodcastItem(const Podcast& podcast) { QStandardItem* item = new QStandardItem; // Add the episodes in this podcast and gather aggregate stats. int unlistened_count = 0; qint64 number = 0; for (const PodcastEpisode& episode : backend_->GetEpisodes(podcast.database_id())) { if (!episode.listened()) { unlistened_count++; } if (episode.listened() && hide_listened_) { continue; } else { item->appendRow(CreatePodcastEpisodeItem(episode)); ++number; } if ((number >= show_episodes_) && (show_episodes_ != 0)) { break; } } item->setIcon(default_icon_); item->setData(Type_Podcast, InternetModel::Role_Type); item->setData(QVariant::fromValue(podcast), Role_Podcast); item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsSelectable); UpdatePodcastText(item, unlistened_count); // Load the podcast's image if it has one if (podcast.ImageUrlSmall().isValid()) { icon_loader_->LoadIcon(podcast.ImageUrlSmall().toString(), QString(), item); } podcasts_by_database_id_[podcast.database_id()] = item; return item; } QStandardItem* PodcastService::CreatePodcastEpisodeItem( const PodcastEpisode& episode) { QStandardItem* item = new QStandardItem; item->setText(episode.title().simplified()); item->setData(Type_Episode, InternetModel::Role_Type); item->setData(QVariant::fromValue(episode), Role_Episode); item->setData(InternetModel::PlayBehaviour_UseSongLoader, InternetModel::Role_PlayBehaviour); item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsSelectable); UpdateEpisodeText(item); episodes_by_database_id_[episode.database_id()] = item; return item; } void PodcastService::ShowContextMenu(const QPoint& global_pos) { if (!context_menu_) { context_menu_ = new QMenu; context_menu_->addAction(IconLoader::Load("list-add"), tr("Add podcast..."), this, SLOT(AddPodcast())); context_menu_->addAction(IconLoader::Load("view-refresh"), tr("Update all podcasts"), app_->podcast_updater(), SLOT(UpdateAllPodcastsNow())); context_menu_->addSeparator(); context_menu_->addActions(GetPlaylistActions()); context_menu_->addSeparator(); update_selected_action_ = context_menu_->addAction( IconLoader::Load("view-refresh"), tr("Update this podcast"), this, SLOT(UpdateSelectedPodcast())); download_selected_action_ = context_menu_->addAction(IconLoader::Load("download"), "", this, SLOT(DownloadSelectedEpisode())); delete_downloaded_action_ = context_menu_->addAction( IconLoader::Load("edit-delete"), tr("Delete downloaded data"), this, SLOT(DeleteDownloadedData())); copy_to_device_ = context_menu_->addAction( IconLoader::Load("multimedia-player-ipod-mini-blue"), tr("Copy to device..."), this, SLOT(CopyToDevice())); cancel_download_ = context_menu_->addAction(IconLoader::Load("cancel"), tr("Cancel download"), this, SLOT(CancelDownload())); remove_selected_action_ = context_menu_->addAction( IconLoader::Load("list-remove"), tr("Unsubscribe"), this, SLOT(RemoveSelectedPodcast())); context_menu_->addSeparator(); set_new_action_ = context_menu_->addAction(tr("Mark as new"), this, SLOT(SetNew())); set_listened_action_ = context_menu_->addAction(tr("Mark as listened"), this, SLOT(SetListened())); context_menu_->addSeparator(); context_menu_->addAction(IconLoader::Load("configure"), tr("Configure podcasts..."), this, SLOT(ShowConfig())); copy_to_device_->setDisabled( app_->device_manager()->connected_devices_model()->rowCount() == 0); connect(app_->device_manager()->connected_devices_model(), SIGNAL(IsEmptyChanged(bool)), copy_to_device_, SLOT(setDisabled(bool))); } selected_episodes_.clear(); selected_podcasts_.clear(); explicitly_selected_podcasts_.clear(); QSet podcast_ids; for (const QModelIndex& index : model()->selected_indexes()) { switch (index.data(InternetModel::Role_Type).toInt()) { case Type_Podcast: { const int id = index.data(Role_Podcast).value().database_id(); if (!podcast_ids.contains(id)) { selected_podcasts_.append(index); explicitly_selected_podcasts_.append(index); podcast_ids.insert(id); } break; } case Type_Episode: { selected_episodes_.append(index); // Add the parent podcast as well. const QModelIndex parent = index.parent(); const int id = parent.data(Role_Podcast).value().database_id(); if (!podcast_ids.contains(id)) { selected_podcasts_.append(parent); podcast_ids.insert(id); } break; } } } const bool episodes = !selected_episodes_.isEmpty(); const bool podcasts = !selected_podcasts_.isEmpty(); update_selected_action_->setEnabled(podcasts); remove_selected_action_->setEnabled(podcasts); set_new_action_->setEnabled(episodes || podcasts); set_listened_action_->setEnabled(episodes || podcasts); cancel_download_->setEnabled(episodes || podcasts); if (selected_episodes_.count() == 1) { const PodcastEpisode episode = selected_episodes_[0].data(Role_Episode).value(); const bool downloaded = episode.downloaded(); const bool listened = episode.listened(); download_selected_action_->setEnabled(!downloaded); delete_downloaded_action_->setEnabled(downloaded); if (explicitly_selected_podcasts_.isEmpty()) { set_new_action_->setEnabled(listened); set_listened_action_->setEnabled(!listened || !episode.listened_date().isValid()); } } else { download_selected_action_->setEnabled(episodes); delete_downloaded_action_->setEnabled(episodes); } if (explicitly_selected_podcasts_.isEmpty() && selected_episodes_.isEmpty()) { PodcastEpisodeList epis = backend_->GetNewDownloadedEpisodes(); set_listened_action_->setEnabled(!epis.isEmpty()); } if (selected_episodes_.count() > 1) { download_selected_action_->setText( tr("Download %n episodes", "", selected_episodes_.count())); } else { download_selected_action_->setText(tr("Download this episode")); } GetAppendToPlaylistAction()->setEnabled(episodes || podcasts); GetReplacePlaylistAction()->setEnabled(episodes || podcasts); GetOpenInNewPlaylistAction()->setEnabled(episodes || podcasts); context_menu_->popup(global_pos); } void PodcastService::UpdateSelectedPodcast() { for (const QModelIndex& index : selected_podcasts_) { app_->podcast_updater()->UpdatePodcastNow( index.data(Role_Podcast).value()); } } void PodcastService::RemoveSelectedPodcast() { for (const QModelIndex& index : selected_podcasts_) { backend_->Unsubscribe(index.data(Role_Podcast).value()); } } void PodcastService::ReloadSettings() { InitialLoadSettings(); ClearPodcastList(model_->invisibleRootItem()); PopulatePodcastList(model_->invisibleRootItem()); } void PodcastService::InitialLoadSettings() { QSettings s; s.beginGroup(LibraryView::kSettingsGroup); use_pretty_covers_ = s.value("pretty_covers", true).toBool(); s.endGroup(); s.beginGroup(kSettingsGroup); hide_listened_ = s.value("hide_listened", false).toBool(); show_episodes_ = s.value("show_episodes", 0).toInt(); s.endGroup(); // TODO(notme): reload the podcast icons that are already loaded? } void PodcastService::EnsureAddPodcastDialogCreated() { add_podcast_dialog_.reset(new AddPodcastDialog(app_)); } void PodcastService::AddPodcast() { EnsureAddPodcastDialogCreated(); add_podcast_dialog_->show(); } void PodcastService::FileCopied(int database_id) { SetListened(PodcastEpisodeList() << backend_->GetEpisodeById(database_id), true); } void PodcastService::SubscriptionAdded(const Podcast& podcast) { // Ensure the root item is lazy loaded already LazyLoadRoot(); // The podcast might already be in the list - maybe the LazyLoadRoot() above // added it. QStandardItem* item = podcasts_by_database_id_[podcast.database_id()]; if (!item) { item = CreatePodcastItem(podcast); model_->appendRow(item); } emit ScrollToIndex(MapToMergedModel(item->index())); } void PodcastService::SubscriptionRemoved(const Podcast& podcast) { QStandardItem* item = podcasts_by_database_id_.take(podcast.database_id()); if (item) { // Remove any episode ID -> item mappings for the episodes in this podcast. for (int i = 0; i < item->rowCount(); ++i) { QStandardItem* episode_item = item->child(i); const int episode_id = episode_item->data(Role_Episode) .value() .database_id(); episodes_by_database_id_.remove(episode_id); } // Remove this episode's row model_->removeRow(item->row()); } } void PodcastService::EpisodesAdded(const PodcastEpisodeList& episodes) { QSet seen_podcast_ids; for (const PodcastEpisode& episode : episodes) { const int database_id = episode.podcast_database_id(); QStandardItem* parent = podcasts_by_database_id_[database_id]; if (!parent) continue; parent->appendRow(CreatePodcastEpisodeItem(episode)); if (!seen_podcast_ids.contains(database_id)) { // Update the unlistened count text once for each podcast int unlistened_count = 0; for (const PodcastEpisode& episode : backend_->GetEpisodes(database_id)) { if (!episode.listened()) { unlistened_count++; } } UpdatePodcastText(parent, unlistened_count); seen_podcast_ids.insert(database_id); } const Podcast podcast = parent->data(Role_Podcast).value(); ReloadPodcast(podcast); } } void PodcastService::EpisodesUpdated(const PodcastEpisodeList& episodes) { QSet seen_podcast_ids; QMap podcasts_map; for (const PodcastEpisode& episode : episodes) { const int podcast_database_id = episode.podcast_database_id(); QStandardItem* item = episodes_by_database_id_[episode.database_id()]; QStandardItem* parent = podcasts_by_database_id_[podcast_database_id]; if (!item || !parent) continue; // Update the episode data on the item, and update the item's text. item->setData(QVariant::fromValue(episode), Role_Episode); UpdateEpisodeText(item); // Update the parent podcast's text too. if (!seen_podcast_ids.contains(podcast_database_id)) { // Update the unlistened count text once for each podcast int unlistened_count = 0; for (const PodcastEpisode& episode : backend_->GetEpisodes(podcast_database_id)) { if (!episode.listened()) { unlistened_count++; } } UpdatePodcastText(parent, unlistened_count); seen_podcast_ids.insert(podcast_database_id); } const Podcast podcast = parent->data(Role_Podcast).value(); podcasts_map[podcast.database_id()] = podcast; } for (const Podcast& podcast_tmp : podcasts_map.values()) { ReloadPodcast(podcast_tmp); } } void PodcastService::DownloadSelectedEpisode() { for (const QModelIndex& index : selected_episodes_) { app_->podcast_downloader()->DownloadEpisode( index.data(Role_Episode).value()); } } void PodcastService::DeleteDownloadedData() { for (const QModelIndex& index : selected_episodes_) { app_->podcast_deleter()->DeleteEpisode( index.data(Role_Episode).value()); } } void PodcastService::DownloadProgressChanged(const PodcastEpisode& episode, PodcastDownload::State state, int percent) { QStandardItem* item = episodes_by_database_id_[episode.database_id()]; QStandardItem* item2 = podcasts_by_database_id_[episode.podcast_database_id()]; if (!item || !item2) return; UpdateEpisodeText(item, state, percent); UpdatePodcastText(item2, state, percent); } void PodcastService::ShowConfig() { app_->OpenSettingsDialogAtPage(SettingsDialog::Page_Podcasts); } void PodcastService::CurrentSongChanged(const Song& metadata) { // This does two db queries, and we are called on every song change, so run // this off the main thread. QtConcurrent::run(this, &PodcastService::UpdatePodcastListenedStateAsync, metadata); } void PodcastService::UpdatePodcastListenedStateAsync(const Song& metadata) { // Check whether this song is one of our podcast episodes. PodcastEpisode episode = backend_->GetEpisodeByUrlOrLocalUrl(metadata.url()); if (!episode.is_valid()) return; // Mark it as listened if it's not already if (!episode.listened() || !episode.listened_date().isValid()) { episode.set_listened(true); episode.set_listened_date(QDateTime::currentDateTime()); backend_->UpdateEpisodes(PodcastEpisodeList() << episode); } } void PodcastService::SetNew() { SetListened(selected_episodes_, explicitly_selected_podcasts_, false); } void PodcastService::SetListened() { if (selected_episodes_.isEmpty() && explicitly_selected_podcasts_.isEmpty()) SetListened(backend_->GetNewDownloadedEpisodes(), true); else SetListened(selected_episodes_, explicitly_selected_podcasts_, true); } void PodcastService::SetListened(const PodcastEpisodeList& episodes_list, bool listened) { PodcastEpisodeList episodes; QDateTime current_date_time = QDateTime::currentDateTime(); for (PodcastEpisode episode : episodes_list) { episode.set_listened(listened); if (listened) { episode.set_listened_date(current_date_time); } episodes << episode; } backend_->UpdateEpisodes(episodes); } void PodcastService::SetListened(const QModelIndexList& episode_indexes, const QModelIndexList& podcast_indexes, bool listened) { PodcastEpisodeList episodes; // Get all the episodes from the indexes. for (const QModelIndex& index : episode_indexes) { episodes << index.data(Role_Episode).value(); } for (const QModelIndex& podcast : podcast_indexes) { for (int i = 0; i < podcast.model()->rowCount(podcast); ++i) { const QModelIndex& index = podcast.child(i, 0); episodes << index.data(Role_Episode).value(); } } // Update each one with the new state and maybe the listened time. QDateTime current_date_time = QDateTime::currentDateTime(); for (int i = 0; i < episodes.count(); ++i) { PodcastEpisode* episode = &episodes[i]; episode->set_listened(listened); if (listened) { episode->set_listened_date(current_date_time); } } backend_->UpdateEpisodes(episodes); } QModelIndex PodcastService::MapToMergedModel(const QModelIndex& index) const { return model()->merged_model()->mapFromSource(proxy_->mapFromSource(index)); } void PodcastService::LazyLoadRoot() { if (root_->data(InternetModel::Role_CanLazyLoad).toBool()) { root_->setData(false, InternetModel::Role_CanLazyLoad); LazyPopulate(root_); } } void PodcastService::SubscribeAndShow(const QVariant& podcast_or_opml) { if (podcast_or_opml.canConvert()) { Podcast podcast(podcast_or_opml.value()); backend_->Subscribe(&podcast); // Lazy load the root item if it hasn't been already LazyLoadRoot(); QStandardItem* item = podcasts_by_database_id_[podcast.database_id()]; if (item) { // There will be an item already if this podcast was already there, // otherwise it'll be scrolled to when the item is created. emit ScrollToIndex(MapToMergedModel(item->index())); } } else if (podcast_or_opml.canConvert()) { EnsureAddPodcastDialogCreated(); add_podcast_dialog_->ShowWithOpml(podcast_or_opml.value()); } } void PodcastService::ReloadPodcast(const Podcast& podcast) { if (!(hide_listened_ || (show_episodes_ > 0))) { return; } QStandardItem* item = podcasts_by_database_id_[podcast.database_id()]; model_->invisibleRootItem()->removeRow(item->row()); model_->invisibleRootItem()->appendRow(CreatePodcastItem(podcast)); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcastservice.h000066400000000000000000000125771260417502300270310ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012-2013, David Sansome Copyright 2013-2014, Krzysztof A. Sobiecki Copyright 2014, John Maguire Copyright 2014, Simeon Bird Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_PODCASTS_PODCASTSERVICE_H_ #define INTERNET_PODCASTS_PODCASTSERVICE_H_ #include "podcastdeleter.h" #include "podcastdownloader.h" #include "internet/core/internetmodel.h" #include "internet/core/internetservice.h" #include #include class AddPodcastDialog; class OrganiseDialog; class Podcast; class PodcastBackend; class PodcastEpisode; class StandardItemIconLoader; class QSortFilterProxyModel; class PodcastService : public InternetService { Q_OBJECT public: PodcastService(Application* app, InternetModel* parent); ~PodcastService(); static const char* kServiceName; static const char* kSettingsGroup; enum Type { Type_AddPodcast = InternetModel::TypeCount, Type_Podcast, Type_Episode }; enum Role { Role_Podcast = InternetModel::RoleCount, Role_Episode }; QStandardItem* CreateRootItem(); void LazyPopulate(QStandardItem* parent); bool has_initial_load_settings() const { return true; } void ShowContextMenu(const QPoint& global_pos); void ReloadSettings(); void InitialLoadSettings(); // Called by SongLoader when the user adds a Podcast URL directly. Adds a // subscription to the podcast and displays it in the UI. If the QVariant // contains an OPML file then this displays it in the Add Podcast dialog. void SubscribeAndShow(const QVariant& podcast_or_opml); public slots: void AddPodcast(); void FileCopied(int database_id); private slots: void UpdateSelectedPodcast(); void ReloadPodcast(const Podcast& podcast); void RemoveSelectedPodcast(); void DownloadSelectedEpisode(); void DeleteDownloadedData(); void SetNew(); void SetListened(); void ShowConfig(); void SubscriptionAdded(const Podcast& podcast); void SubscriptionRemoved(const Podcast& podcast); void EpisodesAdded(const PodcastEpisodeList& episodes); void EpisodesUpdated(const PodcastEpisodeList& episodes); void DownloadProgressChanged(const PodcastEpisode& episode, PodcastDownload::State state, int percent); void CurrentSongChanged(const Song& metadata); void CopyToDevice(); void CopyToDevice(const PodcastEpisodeList& episodes_list); void CopyToDevice(const QModelIndexList& episode_indexes, const QModelIndexList& podcast_indexes); void CancelDownload(); void CancelDownload(const QModelIndexList& episode_indexes, const QModelIndexList& podcast_indexes); private: void EnsureAddPodcastDialogCreated(); void UpdatePodcastListenedStateAsync(const Song& metadata); void PopulatePodcastList(QStandardItem* parent); void ClearPodcastList(QStandardItem* parent); void UpdatePodcastText(QStandardItem* item, int unlistened_count) const; void UpdateEpisodeText( QStandardItem* item, PodcastDownload::State state = PodcastDownload::NotDownloading, int percent = 0); void UpdatePodcastText( QStandardItem* item, PodcastDownload::State state = PodcastDownload::NotDownloading, int percent = 0); QStandardItem* CreatePodcastItem(const Podcast& podcast); QStandardItem* CreatePodcastEpisodeItem(const PodcastEpisode& episode); QModelIndex MapToMergedModel(const QModelIndex& index) const; void SetListened(const QModelIndexList& episode_indexes, const QModelIndexList& podcast_indexes, bool listened); void SetListened(const PodcastEpisodeList& episodes_list, bool listened); void LazyLoadRoot(); private: bool use_pretty_covers_; bool hide_listened_; qint64 show_episodes_; StandardItemIconLoader* icon_loader_; // The podcast icon QIcon default_icon_; // Episodes get different icons depending on their state QIcon queued_icon_; QIcon downloading_icon_; QIcon downloaded_icon_; PodcastBackend* backend_; QStandardItemModel* model_; QSortFilterProxyModel* proxy_; QMenu* context_menu_; QAction* update_selected_action_; QAction* remove_selected_action_; QAction* download_selected_action_; QAction* delete_downloaded_action_; QAction* set_new_action_; QAction* set_listened_action_; QAction* copy_to_device_; QAction* cancel_download_; QStandardItem* root_; std::unique_ptr organise_dialog_; QModelIndexList explicitly_selected_podcasts_; QModelIndexList selected_podcasts_; QModelIndexList selected_episodes_; QMap podcasts_by_database_id_; QMap episodes_by_database_id_; std::unique_ptr add_podcast_dialog_; }; #endif // INTERNET_PODCASTS_PODCASTSERVICE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcastservicemodel.cpp000066400000000000000000000060721260417502300303760ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "internet/podcasts/podcastservice.h" #include "internet/podcasts/podcastservicemodel.h" #include "playlist/songmimedata.h" PodcastServiceModel::PodcastServiceModel(QObject* parent) : QStandardItemModel(parent) {} QMimeData* PodcastServiceModel::mimeData(const QModelIndexList& indexes) const { SongMimeData* data = new SongMimeData; QList urls; for (const QModelIndex& index : indexes) { switch (index.data(InternetModel::Role_Type).toInt()) { case PodcastService::Type_Episode: MimeDataForEpisode(index, data, &urls); break; case PodcastService::Type_Podcast: MimeDataForPodcast(index, data, &urls); break; } } data->setUrls(urls); return data; } void PodcastServiceModel::MimeDataForEpisode(const QModelIndex& index, SongMimeData* data, QList* urls) const { QVariant episode_variant = index.data(PodcastService::Role_Episode); if (!episode_variant.isValid()) return; PodcastEpisode episode(episode_variant.value()); // Get the podcast from the index's parent Podcast podcast; QVariant podcast_variant = index.parent().data(PodcastService::Role_Podcast); if (podcast_variant.isValid()) { podcast = podcast_variant.value(); } Song song = episode.ToSong(podcast); data->songs << song; *urls << song.url(); } void PodcastServiceModel::MimeDataForPodcast(const QModelIndex& index, SongMimeData* data, QList* urls) const { // Get the podcast Podcast podcast; QVariant podcast_variant = index.data(PodcastService::Role_Podcast); if (podcast_variant.isValid()) { podcast = podcast_variant.value(); } // Add each child episode const int children = index.model()->rowCount(index); for (int i = 0; i < children; ++i) { QVariant episode_variant = index.child(i, 0).data(PodcastService::Role_Episode); if (!episode_variant.isValid()) continue; PodcastEpisode episode(episode_variant.value()); Song song = episode.ToSong(podcast); data->songs << song; *urls << song.url(); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcastservicemodel.h000066400000000000000000000027461260417502300300470ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_PODCASTS_PODCASTSERVICEMODEL_H_ #define INTERNET_PODCASTS_PODCASTSERVICEMODEL_H_ #include class SongMimeData; class PodcastServiceModel : public QStandardItemModel { Q_OBJECT public: explicit PodcastServiceModel(QObject* parent = nullptr); QMimeData* mimeData(const QModelIndexList& indexes) const; private: void MimeDataForPodcast(const QModelIndex& index, SongMimeData* data, QList* urls) const; void MimeDataForEpisode(const QModelIndex& index, SongMimeData* data, QList* urls) const; }; #endif // INTERNET_PODCASTS_PODCASTSERVICEMODEL_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcastsettingspage.cpp000066400000000000000000000132511260417502300304070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "internet/podcasts/podcastsettingspage.h" #include "ui_podcastsettingspage.h" #include #include #include #include "core/application.h" #include "core/closure.h" #include "core/timeconstants.h" #include "gpoddersync.h" #include "library/librarydirectorymodel.h" #include "library/librarymodel.h" #include "podcastdownloader.h" #include "ui/settingsdialog.h" const char* PodcastSettingsPage::kSettingsGroup = "Podcasts"; PodcastSettingsPage::PodcastSettingsPage(SettingsDialog* dialog) : SettingsPage(dialog), ui_(new Ui_PodcastSettingsPage) { ui_->setupUi(this); connect(ui_->login, SIGNAL(clicked()), SLOT(LoginClicked())); connect(ui_->login_state, SIGNAL(LoginClicked()), SLOT(LoginClicked())); connect(ui_->login_state, SIGNAL(LogoutClicked()), SLOT(LogoutClicked())); connect(ui_->download_dir_browse, SIGNAL(clicked()), SLOT(DownloadDirBrowse())); ui_->login_state->AddCredentialField(ui_->username); ui_->login_state->AddCredentialField(ui_->device_name); ui_->login_state->AddCredentialField(ui_->password); ui_->login_state->AddCredentialGroup(ui_->login_group); ui_->check_interval->setItemData(0, 0); // manually ui_->check_interval->setItemData(1, 10 * 60); // 10 minutes ui_->check_interval->setItemData(2, 20 * 60); // 20 minutes ui_->check_interval->setItemData(3, 30 * 60); // 30 minutes ui_->check_interval->setItemData(4, 60 * 60); // 1 hour ui_->check_interval->setItemData(5, 2 * 60 * 60); // 2 hours ui_->check_interval->setItemData(6, 6 * 60 * 60); // 6 hours ui_->check_interval->setItemData(7, 12 * 60 * 60); // 12 hours } PodcastSettingsPage::~PodcastSettingsPage() { delete ui_; } void PodcastSettingsPage::Load() { QSettings s; s.beginGroup(kSettingsGroup); const int update_interval = s.value("update_interval_secs", 0).toInt(); ui_->check_interval->setCurrentIndex( ui_->check_interval->findData(update_interval)); const QString default_download_dir = dialog()->app()->podcast_downloader()->DefaultDownloadDir(); ui_->download_dir->setText(QDir::toNativeSeparators( s.value("download_dir", default_download_dir).toString())); ui_->auto_download->setChecked(s.value("auto_download", false).toBool()); ui_->hide_listened->setChecked(s.value("hide_listened", false).toBool()); ui_->delete_after->setValue(s.value("delete_after", 0).toInt() / kSecsPerDay); ui_->show_episodes->setValue(s.value("show_episodes", 0).toInt()); ui_->username->setText(s.value("gpodder_username").toString()); ui_->device_name->setText( s.value("gpodder_device_name", GPodderSync::DefaultDeviceName()) .toString()); if (dialog()->app()->gpodder_sync()->is_logged_in()) { ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedIn, ui_->username->text()); } else { ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedOut); } } void PodcastSettingsPage::Save() { QSettings s; s.beginGroup(kSettingsGroup); s.setValue("update_interval_secs", ui_->check_interval->itemData( ui_->check_interval->currentIndex())); s.setValue("download_dir", QDir::fromNativeSeparators(ui_->download_dir->text())); s.setValue("auto_download", ui_->auto_download->isChecked()); s.setValue("hide_listened", ui_->hide_listened->isChecked()); s.setValue("delete_after", ui_->delete_after->value() * kSecsPerDay); s.setValue("show_episodes", ui_->show_episodes->value()); s.setValue("gpodder_device_name", ui_->device_name->text()); } void PodcastSettingsPage::LoginClicked() { ui_->login_state->SetLoggedIn(LoginStateWidget::LoginInProgress); QNetworkReply* reply = dialog()->app()->gpodder_sync()->Login( ui_->username->text(), ui_->password->text(), ui_->device_name->text()); NewClosure(reply, SIGNAL(finished()), this, SLOT(LoginFinished(QNetworkReply*)), reply); } void PodcastSettingsPage::LoginFinished(QNetworkReply* reply) { const bool success = reply->error() == QNetworkReply::NoError; ui_->login_state->SetLoggedIn( success ? LoginStateWidget::LoggedIn : LoginStateWidget::LoggedOut, ui_->username->text()); ui_->login_state->SetAccountTypeVisible(!success); if (!success) { ui_->login_state->SetAccountTypeText(tr("Login failed") + ": " + reply->errorString()); } } void PodcastSettingsPage::LogoutClicked() { ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedOut); ui_->password->clear(); dialog()->app()->gpodder_sync()->Logout(); } void PodcastSettingsPage::DownloadDirBrowse() { QString directory = QFileDialog::getExistingDirectory( this, tr("Choose podcast download directory"), ui_->download_dir->text()); if (directory.isEmpty()) return; ui_->download_dir->setText(QDir::toNativeSeparators(directory)); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcastsettingspage.h000066400000000000000000000027151260417502300300570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_PODCASTS_PODCASTSETTINGSPAGE_H_ #define INTERNET_PODCASTS_PODCASTSETTINGSPAGE_H_ #include "ui/settingspage.h" class Ui_PodcastSettingsPage; class QNetworkReply; class PodcastSettingsPage : public SettingsPage { Q_OBJECT public: explicit PodcastSettingsPage(SettingsDialog* dialog); ~PodcastSettingsPage(); static const char* kSettingsGroup; void Load(); void Save(); private slots: void LoginClicked(); void LoginFinished(QNetworkReply* reply); void LogoutClicked(); void DownloadDirBrowse(); private: Ui_PodcastSettingsPage* ui_; }; #endif // INTERNET_PODCASTS_PODCASTSETTINGSPAGE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcastsettingspage.ui000066400000000000000000000206731260417502300302500ustar00rootroot00000000000000 PodcastSettingsPage 0 0 616 656 Podcasts :/providers/podcast32.png:/providers/podcast32.png Updating Check for new episodes Manually Every 10 minutes Every 20 minutes Every 30 minutes Every hour Every 2 hours Every 6 hours Every 12 hours Download episodes to Download new episodes automatically Browse... Cleaning up QFormLayout::AllNonFixedFieldsGrow Delete played episodes Manually days After 30 Appearance QFormLayout::AllNonFixedFieldsGrow Don't show listened episodes All Number of episodes to show gpodder.net Clementine can synchronize your subscription list with your other computers and podcast applications. <a href="https://gpodder.net/register/">Create an account</a>. true true 0 Username Sign in Password QLineEdit::Password Device name Qt::Vertical 20 0 LoginStateWidget QWidget
widgets/loginstatewidget.h
1
check_interval download_dir download_dir_browse auto_download delete_after username password device_name login
clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcastupdater.cpp000066400000000000000000000133341260417502300273600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "podcastupdater.h" #include #include #include "core/application.h" #include "core/closure.h" #include "core/logging.h" #include "core/qhash_qurl.h" #include "core/timeconstants.h" #include "podcastbackend.h" #include "podcasturlloader.h" const char* PodcastUpdater::kSettingsGroup = "Podcasts"; PodcastUpdater::PodcastUpdater(Application* app, QObject* parent) : QObject(parent), app_(app), update_interval_secs_(0), update_timer_(new QTimer(this)), loader_(new PodcastUrlLoader(this)), pending_replies_(0) { connect(app_, SIGNAL(SettingsChanged()), SLOT(ReloadSettings())); connect(update_timer_, SIGNAL(timeout()), SLOT(UpdateAllPodcastsNow())); connect(app_->podcast_backend(), SIGNAL(SubscriptionAdded(Podcast)), SLOT(SubscriptionAdded(Podcast))); update_timer_->setSingleShot(true); ReloadSettings(); } void PodcastUpdater::ReloadSettings() { QSettings s; s.beginGroup(kSettingsGroup); last_full_update_ = s.value("last_full_update").toDateTime(); update_interval_secs_ = s.value("update_interval_secs").toInt(); RestartTimer(); } void PodcastUpdater::SaveSettings() { QSettings s; s.beginGroup(kSettingsGroup); s.setValue("last_full_update", last_full_update_); } void PodcastUpdater::RestartTimer() { // Stop any existing timer update_timer_->stop(); if (pending_replies_ > 0) { // We're still waiting for replies from the last update - don't do anything. return; } if (update_interval_secs_ > 0) { if (!last_full_update_.isValid()) { // Updates are enabled and we've never updated before. Do it now. qLog(Info) << "Updating podcasts for the first time"; UpdateAllPodcastsNow(); } else { const QDateTime next_update = last_full_update_.addSecs(update_interval_secs_); const int secs_until_next_update = QDateTime::currentDateTime().secsTo(next_update); if (secs_until_next_update < 0) { qLog(Info) << "Updating podcasts" << (-secs_until_next_update) << "seconds late"; UpdateAllPodcastsNow(); } else { qLog(Info) << "Updating podcasts at" << next_update << "(in" << secs_until_next_update << "seconds)"; update_timer_->start(secs_until_next_update * kMsecPerSec); } } } } void PodcastUpdater::SubscriptionAdded(const Podcast& podcast) { // Only update a new podcast immediately if it doesn't have an episode list. // We assume that the episode list has already been fetched recently // otherwise. if (podcast.episodes().isEmpty()) { UpdatePodcastNow(podcast); } } void PodcastUpdater::UpdatePodcastNow(const Podcast& podcast) { PodcastUrlLoaderReply* reply = loader_->Load(podcast.url()); NewClosure(reply, SIGNAL(Finished(bool)), this, SLOT(PodcastLoaded(PodcastUrlLoaderReply*, Podcast, bool)), reply, podcast, false); } void PodcastUpdater::UpdateAllPodcastsNow() { for (const Podcast& podcast : app_->podcast_backend()->GetAllSubscriptions()) { PodcastUrlLoaderReply* reply = loader_->Load(podcast.url()); NewClosure(reply, SIGNAL(Finished(bool)), this, SLOT(PodcastLoaded(PodcastUrlLoaderReply*, Podcast, bool)), reply, podcast, true); pending_replies_++; } } void PodcastUpdater::PodcastLoaded(PodcastUrlLoaderReply* reply, const Podcast& podcast, bool one_of_many) { reply->deleteLater(); if (one_of_many) { if (--pending_replies_ == 0) { // This was the last reply we were waiting for. Save this time as being // the last sucessful update and restart the timer. last_full_update_ = QDateTime::currentDateTime(); SaveSettings(); RestartTimer(); } } if (!reply->is_success()) { qLog(Warning) << "Error fetching podcast at" << podcast.url() << ":" << reply->error_text(); return; } if (reply->result_type() != PodcastUrlLoaderReply::Type_Podcast) { qLog(Warning) << "The URL" << podcast.url() << "no longer contains a podcast"; return; } // Get the episode URLs we had for this podcast already. QSet existing_urls; for (const PodcastEpisode& episode : app_->podcast_backend()->GetEpisodes(podcast.database_id())) { existing_urls.insert(episode.url()); } // Add any new episodes PodcastEpisodeList new_episodes; for (const Podcast& reply_podcast : reply->podcast_results()) { for (const PodcastEpisode& episode : reply_podcast.episodes()) { if (!existing_urls.contains(episode.url())) { PodcastEpisode episode_copy(episode); episode_copy.set_podcast_database_id(podcast.database_id()); new_episodes.append(episode_copy); } } } app_->podcast_backend()->AddEpisodes(&new_episodes); qLog(Info) << "Added" << new_episodes.count() << "new episodes for" << podcast.url(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcastupdater.h000066400000000000000000000036541260417502300270310ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_PODCASTS_PODCASTUPDATER_H_ #define INTERNET_PODCASTS_PODCASTUPDATER_H_ #include #include class Application; class Podcast; class PodcastUrlLoader; class PodcastUrlLoaderReply; class QTimer; // Responsible for updating podcasts when they're first subscribed to, and // then updating them at regular intervals afterwards. class PodcastUpdater : public QObject { Q_OBJECT public: explicit PodcastUpdater(Application* app, QObject* parent = nullptr); static const char* kSettingsGroup; public slots: void UpdateAllPodcastsNow(); void UpdatePodcastNow(const Podcast& podcast); private slots: void ReloadSettings(); void SubscriptionAdded(const Podcast& podcast); void PodcastLoaded(PodcastUrlLoaderReply* reply, const Podcast& podcast, bool one_of_many); private: void RestartTimer(); void SaveSettings(); private: Application* app_; QDateTime last_full_update_; int update_interval_secs_; QTimer* update_timer_; PodcastUrlLoader* loader_; int pending_replies_; }; #endif // INTERNET_PODCASTS_PODCASTUPDATER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcasturlloader.cpp000066400000000000000000000170611260417502300277060ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "podcasturlloader.h" #include #include "podcastparser.h" #include "core/closure.h" #include "core/logging.h" #include "core/network.h" #include "core/utilities.h" const int PodcastUrlLoader::kMaxRedirects = 5; PodcastUrlLoader::PodcastUrlLoader(QObject* parent) : QObject(parent), network_(new NetworkAccessManager(this)), parser_(new PodcastParser), html_link_re_(""), html_link_rel_re_("rel\\s*=\\s*['\"]?\\s*alternate"), html_link_type_re_("type\\s*=\\s*['\"]?([^'\" ]+)"), html_link_href_re_("href\\s*=\\s*['\"]?([^'\" ]+)") { html_link_re_.setMinimal(true); html_link_re_.setCaseSensitivity(Qt::CaseInsensitive); } PodcastUrlLoader::~PodcastUrlLoader() { delete parser_; } QUrl PodcastUrlLoader::FixPodcastUrl(const QString& url_text) { QString url_text_copy(url_text.trimmed()); // Thanks gpodder! QuickPrefixList quick_prefixes = QuickPrefixList() << QuickPrefix("fb:", "http://feeds.feedburner.com/%1") << QuickPrefix("yt:", "https://www.youtube.com/rss/user/%1/videos.rss") << QuickPrefix("sc:", "https://soundcloud.com/%1") << QuickPrefix("fm4od:", "http://onapp1.orf.at/webcam/fm4/fod/%1.xspf") << QuickPrefix("ytpl:", "https://gdata.youtube.com/feeds/api/playlists/%1"); // Check if it matches one of the quick prefixes. for (QuickPrefixList::const_iterator it = quick_prefixes.constBegin(); it != quick_prefixes.constEnd(); ++it) { if (url_text_copy.startsWith(it->first)) { url_text_copy = it->second.arg(url_text_copy.mid(it->first.length())); } } if (!url_text_copy.contains("://")) { url_text_copy.prepend("http://"); } return FixPodcastUrl(QUrl(url_text_copy)); } QUrl PodcastUrlLoader::FixPodcastUrl(const QUrl& url_orig) { QUrl url(url_orig); // Replace schemes if (url.scheme().isEmpty() || url.scheme() == "feed" || url.scheme() == "itpc" || url.scheme() == "itms") { url.setScheme("http"); } else if (url.scheme() == "zune" && url.host() == "subscribe" && !url.queryItems().isEmpty()) { url = QUrl(url.queryItems()[0].second); } return url; } PodcastUrlLoaderReply* PodcastUrlLoader::Load(const QString& url_text) { return Load(FixPodcastUrl(url_text)); } PodcastUrlLoaderReply* PodcastUrlLoader::Load(const QUrl& url) { // Create a reply PodcastUrlLoaderReply* reply = new PodcastUrlLoaderReply(url, this); // Create a state object to track this request RequestState* state = new RequestState; state->redirects_remaining_ = kMaxRedirects + 1; state->reply_ = reply; // Start the first request NextRequest(url, state); return reply; } void PodcastUrlLoader::SendErrorAndDelete(const QString& error_text, RequestState* state) { state->reply_->SetFinished(error_text); delete state; } void PodcastUrlLoader::NextRequest(const QUrl& url, RequestState* state) { // Stop the request if there have been too many redirects already. if (state->redirects_remaining_-- == 0) { SendErrorAndDelete(tr("Too many redirects"), state); return; } qLog(Debug) << "Loading URL" << url; QNetworkRequest req(url); req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork); QNetworkReply* network_reply = network_->get(req); NewClosure(network_reply, SIGNAL(finished()), this, SLOT(RequestFinished(RequestState*, QNetworkReply*)), state, network_reply); } void PodcastUrlLoader::RequestFinished(RequestState* state, QNetworkReply* reply) { reply->deleteLater(); if (reply->attribute(QNetworkRequest::RedirectionTargetAttribute).isValid()) { const QUrl next_url = reply->url().resolved( reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl()); NextRequest(next_url, state); return; } // Check for errors. if (reply->error() != QNetworkReply::NoError) { SendErrorAndDelete(reply->errorString(), state); return; } const QVariant http_status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); if (http_status.isValid() && http_status.toInt() != 200) { SendErrorAndDelete( QString("HTTP %1: %2") .arg(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute) .toString(), reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute) .toString()), state); return; } // Check the mime type. const QString content_type = reply->header(QNetworkRequest::ContentTypeHeader).toString(); if (parser_->SupportsContentType(content_type)) { const QVariant ret = parser_->Load(reply, reply->url()); if (ret.canConvert()) { state->reply_->SetFinished(PodcastList() << ret.value()); } else if (ret.canConvert()) { state->reply_->SetFinished(ret.value()); } else { SendErrorAndDelete(tr("Failed to parse the XML for this RSS feed"), state); return; } delete state; return; } else if (content_type.contains("text/html")) { // I don't want a full HTML parser here, so do this the dirty way. const QString page_text = QString::fromUtf8(reply->readAll()); int pos = 0; while ((pos = html_link_re_.indexIn(page_text, pos)) != -1) { const QString link = html_link_re_.cap(1).toLower(); pos += html_link_re_.matchedLength(); if (html_link_rel_re_.indexIn(link) == -1 || html_link_type_re_.indexIn(link) == -1 || html_link_href_re_.indexIn(link) == -1) { continue; } const QString link_type = html_link_type_re_.cap(1); const QString href = Utilities::DecodeHtmlEntities(html_link_href_re_.cap(1)); if (parser_->supported_mime_types().contains(link_type)) { NextRequest(QUrl(href), state); return; } } SendErrorAndDelete(tr("HTML page did not contain any RSS feeds"), state); } else { SendErrorAndDelete(tr("Unknown content-type") + ": " + content_type, state); } } PodcastUrlLoaderReply::PodcastUrlLoaderReply(const QUrl& url, QObject* parent) : QObject(parent), url_(url), finished_(false) {} void PodcastUrlLoaderReply::SetFinished(const PodcastList& results) { result_type_ = Type_Podcast; podcast_results_ = results; finished_ = true; emit Finished(true); } void PodcastUrlLoaderReply::SetFinished(const OpmlContainer& results) { result_type_ = Type_Opml; opml_results_ = results; finished_ = true; emit Finished(true); } void PodcastUrlLoaderReply::SetFinished(const QString& error_text) { error_text_ = error_text; finished_ = true; emit Finished(false); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/podcasts/podcasturlloader.h000066400000000000000000000064661260417502300273620ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Copyright 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_PODCASTS_PODCASTURLLOADER_H_ #define INTERNET_PODCASTS_PODCASTURLLOADER_H_ #include #include #include "opmlcontainer.h" #include "podcast.h" class PodcastParser; class QNetworkAccessManager; class QNetworkReply; class PodcastUrlLoaderReply : public QObject { Q_OBJECT public: PodcastUrlLoaderReply(const QUrl& url, QObject* parent); enum ResultType { Type_Podcast, Type_Opml }; const QUrl& url() const { return url_; } bool is_finished() const { return finished_; } bool is_success() const { return error_text_.isEmpty(); } const QString& error_text() const { return error_text_; } ResultType result_type() const { return result_type_; } const PodcastList& podcast_results() const { return podcast_results_; } const OpmlContainer& opml_results() const { return opml_results_; } void SetFinished(const QString& error_text); void SetFinished(const PodcastList& results); void SetFinished(const OpmlContainer& results); signals: void Finished(bool success); private: QUrl url_; bool finished_; QString error_text_; ResultType result_type_; PodcastList podcast_results_; OpmlContainer opml_results_; }; class PodcastUrlLoader : public QObject { Q_OBJECT public: explicit PodcastUrlLoader(QObject* parent = nullptr); ~PodcastUrlLoader(); static const int kMaxRedirects; PodcastUrlLoaderReply* Load(const QString& url_text); PodcastUrlLoaderReply* Load(const QUrl& url); // Both the FixPodcastUrl functions replace common podcatcher URL schemes // like itpc:// or zune:// with their http:// equivalents. The QString // overload also cleans up user-entered text a bit - stripping whitespace and // applying shortcuts like sc:tag. static QUrl FixPodcastUrl(const QString& url_text); static QUrl FixPodcastUrl(const QUrl& url); private: struct RequestState { int redirects_remaining_; PodcastUrlLoaderReply* reply_; }; typedef QPair QuickPrefix; typedef QList QuickPrefixList; private slots: void RequestFinished(RequestState* state, QNetworkReply* reply); private: void SendErrorAndDelete(const QString& error_text, RequestState* state); void NextRequest(const QUrl& url, RequestState* state); private: QNetworkAccessManager* network_; PodcastParser* parser_; QRegExp html_link_re_; QRegExp whitespace_re_; QRegExp html_link_rel_re_; QRegExp html_link_type_re_; QRegExp html_link_href_re_; }; #endif // INTERNET_PODCASTS_PODCASTURLLOADER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/seafile/000077500000000000000000000000001260417502300234165ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/seafile/seafileservice.cpp000066400000000000000000000515211260417502300271170ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Chocobozzz Copyright 2014, Krzysztof Sobiecki Copyright 2014, David Sansome Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "seafileservice.h" #include #include #include #include "core/application.h" #include "core/taskmanager.h" #include "core/player.h" #include "core/waitforsignal.h" #include "internet/seafile/seafileurlhandler.h" #include "library/librarybackend.h" #include "internet/core/oauthenticator.h" const char* SeafileService::kServiceName = "Seafile"; const char* SeafileService::kSettingsGroup = "Seafile"; namespace { static const char* kAuthTokenUrl = "/api2/auth-token/"; static const char* kFolderItemsUrl = "/api2/repos/%1/dir/"; static const char* kListReposUrl = "/api2/repos/"; static const char* kFileUrl = "/api2/repos/%1/file/"; static const char* kFileContentUrl = "/api2/repos/%1/file/detail/"; static const int kMaxTries = 10; } // namespace SeafileService::SeafileService(Application* app, InternetModel* parent) : CloudFileService(app, parent, kServiceName, kSettingsGroup, QIcon(":/providers/seafile.png"), SettingsDialog::Page_Seafile), indexing_task_id_(-1), indexing_task_max_(0), indexing_task_progress_(0), changing_libary_(false) { QSettings s; s.beginGroup(kSettingsGroup); access_token_ = s.value("access_token").toString(); server_ = s.value("server").toString(); QByteArray tree_bytes = s.value("tree").toByteArray(); if (!tree_bytes.isEmpty()) { QDataStream stream(&tree_bytes, QIODevice::ReadOnly); stream >> tree_; } app->player()->RegisterUrlHandler(new SeafileUrlHandler(this, this)); connect(&tree_, SIGNAL(ToAdd(QString, QString, SeafileTree::Entry)), this, SLOT(AddEntry(QString, QString, SeafileTree::Entry))); connect(&tree_, SIGNAL(ToDelete(QString, QString, SeafileTree::Entry)), this, SLOT(DeleteEntry(QString, QString, SeafileTree::Entry))); connect(&tree_, SIGNAL(ToUpdate(QString, QString, SeafileTree::Entry)), this, SLOT(UpdateEntry(QString, QString, SeafileTree::Entry))); } bool SeafileService::has_credentials() const { return !access_token_.isEmpty(); } void SeafileService::AddAuthorizationHeader(QNetworkRequest* request) const { request->setRawHeader("Authorization", QString("Token %1").arg(access_token_).toAscii()); } void SeafileService::ForgetCredentials() { QSettings s; s.beginGroup(kSettingsGroup); s.remove("access_token"); s.remove("tree"); access_token_.clear(); tree_.Clear(); server_.clear(); } bool SeafileService::GetToken(const QString& mail, const QString& password, const QString& server) { QUrl url(server + kAuthTokenUrl); QNetworkRequest request(url); AddAuthorizationHeader(&request); url.addQueryItem("username", mail); url.addQueryItem("password", password); QNetworkReply* reply = network_->post(request, url.encodedQuery()); WaitForSignal(reply, SIGNAL(finished())); if (!CheckReply(&reply)) { qLog(Warning) << "Something wrong with the reply... (GetToken)"; return false; } reply->deleteLater(); QJson::Parser parser; QVariantMap response = parser.parse(reply->readAll()).toMap(); // Because the server responds "token" access_token_ = response["token"].toString().replace("\"", ""); if (access_token_.isEmpty()) { return false; } QSettings s; s.beginGroup(kSettingsGroup); s.setValue("access_token", access_token_); server_ = server; emit Connected(); return true; } void SeafileService::GetLibraries() { QUrl url(server_ + kListReposUrl); QNetworkRequest request(url); AddAuthorizationHeader(&request); QNetworkReply* reply = network_->get(request); NewClosure(reply, SIGNAL(finished()), this, SLOT(GetLibrariesFinished(QNetworkReply*)), reply); } void SeafileService::GetLibrariesFinished(QNetworkReply* reply) { if (!CheckReply(&reply)) { qLog(Warning) << "Something wrong with the reply... (GetLibraries)"; return; } reply->deleteLater(); // key : id, value : name QMap libraries; QByteArray data = reply->readAll(); QJson::Parser parser; QList repos = parser.parse(data).toList(); for (int i = 0; i < repos.size(); ++i) { QVariantMap repo = repos.at(i).toMap(); QString repo_name = repo["name"].toString(), repo_id = repo["id"].toString(); // One library can appear several times and we don't add encrypted libraries // (not supported yet) if (!libraries.contains(repo_id) && !repo["encrypted"].toBool()) { libraries.insert(repo_id, repo_name); } } emit GetLibrariesFinishedSignal(libraries); } void SeafileService::ChangeLibrary(const QString& new_library) { if (new_library == library_updated_ || changing_libary_) return; if (indexing_task_id_ != -1) { qLog(Debug) << "Want to change the Seafile library, but Clementine waits " "the previous indexing..."; changing_libary_ = true; NewClosure(this, SIGNAL(UpdatingLibrariesFinishedSignal()), this, SLOT(ChangeLibrary(QString)), new_library); return; } AbortReadTagsReplies(); qLog(Debug) << "Change the Seafile library"; // Every other libraries have to be destroyed from the tree if (new_library != "all") { for (SeafileTree::TreeItem* library : tree_.libraries()) { if (new_library != library->entry().id()) { DeleteEntry(library->entry().id(), "/", library->entry()); } } } changing_libary_ = false; UpdateLibraries(); } void SeafileService::Connect() { if (has_credentials()) { UpdateLibraries(); } else { ShowSettingsDialog(); } } void SeafileService::UpdateLibraries() { // Quit if we are already updating the libraries if (indexing_task_id_ != -1) { return; } indexing_task_id_ = app_->task_manager()->StartTask(tr("Building Seafile index...")); connect(this, SIGNAL(GetLibrariesFinishedSignal(QMap)), this, SLOT(UpdateLibrariesInProgress(QMap))); GetLibraries(); } void SeafileService::UpdateLibrariesInProgress( const QMap& libraries) { disconnect(this, SIGNAL(GetLibrariesFinishedSignal(QMap)), this, SLOT(UpdateLibrariesInProgress(QMap))); QSettings s; s.beginGroup(kSettingsGroup); QString library_to_update = s.value("library").toString(); // If the library didn't change, we don't need to update if (!library_updated_.isNull() && library_updated_ == library_to_update) { app_->task_manager()->SetTaskFinished(indexing_task_id_); indexing_task_id_ = -1; UpdatingLibrariesFinishedSignal(); return; } library_updated_ = library_to_update; if (library_to_update == "none") { app_->task_manager()->SetTaskFinished(indexing_task_id_); indexing_task_id_ = -1; UpdatingLibrariesFinishedSignal(); return; } QMapIterator library(libraries); while (library.hasNext()) { library.next(); // Need to check this library ? if (library_to_update == "all" || library.key() == library_to_update) { FetchAndCheckFolderItems( SeafileTree::Entry(library.value(), library.key(), SeafileTree::Entry::LIBRARY), "/"); // If not, we can destroy the library from the tree } else { // If the library was not in the tree, it's not a problem because // DeleteEntry won't do anything DeleteEntry(library.key(), "/", SeafileTree::Entry(library.value(), library.key(), SeafileTree::Entry::LIBRARY)); } } // If we didn't do anything, set the task finished if (indexing_task_max_ == 0) { app_->task_manager()->SetTaskFinished(indexing_task_id_); indexing_task_id_ = -1; UpdatingLibrariesFinishedSignal(); } } QNetworkReply* SeafileService::PrepareFetchFolderItems(const QString& library, const QString& path) { QUrl url(server_ + QString(kFolderItemsUrl).arg(library)); url.addQueryItem("p", path); QNetworkRequest request(url); AddAuthorizationHeader(&request); QNetworkReply* reply = network_->get(request); return reply; } void SeafileService::FetchAndCheckFolderItems(const SeafileTree::Entry& library, const QString& path) { StartTaskInProgress(); QNetworkReply* reply = PrepareFetchFolderItems(library.id(), path); NewClosure(reply, SIGNAL(finished()), this, SLOT(FetchAndCheckFolderItemsFinished( QNetworkReply*, SeafileTree::Entry, QString)), reply, library, path); } void SeafileService::FetchAndCheckFolderItemsFinished( QNetworkReply* reply, const SeafileTree::Entry& library, const QString& path) { if (!CheckReply(&reply)) { qLog(Warning) << "Something wrong with the reply... (FetchFolderItemsToList)"; FinishedTaskInProgress(); return; } reply->deleteLater(); QByteArray data = reply->readAll(); QJson::Parser parser; QList variant_entries = parser.parse(data).toList(); SeafileTree::Entries entries; for (const QVariant& e : variant_entries) { QVariantMap entry = e.toMap(); SeafileTree::Entry::Type entry_type = SeafileTree::Entry::StringToType(entry["type"].toString()); QString entry_name = entry["name"].toString(); // We just want libraries/directories and files which could be songs. if (entry_type == SeafileTree::Entry::NONE) { qLog(Warning) << "Type entry unknown for this entry"; } else if (entry_type == SeafileTree::Entry::FILE && GuessMimeTypeForFile(entry_name).isNull()) { continue; } entries.append( SeafileTree::Entry(entry_name, entry["id"].toString(), entry_type)); } tree_.CheckEntries(entries, library, path); FinishedTaskInProgress(); } void SeafileService::AddRecursivelyFolderItems(const QString& library, const QString& path) { StartTaskInProgress(); QNetworkReply* reply = PrepareFetchFolderItems(library, path); NewClosure( reply, SIGNAL(finished()), this, SLOT(AddRecursivelyFolderItemsFinished(QNetworkReply*, QString, QString)), reply, library, path); } void SeafileService::AddRecursivelyFolderItemsFinished(QNetworkReply* reply, const QString& library, const QString& path) { if (!CheckReply(&reply)) { qLog(Warning) << "Something wrong with the reply... (FetchFolderItems)"; FinishedTaskInProgress(); return; } reply->deleteLater(); QByteArray data = reply->readAll(); QJson::Parser parser; QList entries = parser.parse(data).toList(); for (const QVariant& e : entries) { QVariantMap entry_map = e.toMap(); SeafileTree::Entry::Type entry_type = SeafileTree::Entry::StringToType(entry_map["type"].toString()); QString entry_name = entry_map["name"].toString(); // We just want libraries/directories and files which could be songs. if (entry_type == SeafileTree::Entry::NONE) { qLog(Warning) << "Type entry unknown for this entry"; } else if (entry_type == SeafileTree::Entry::FILE && GuessMimeTypeForFile(entry_name).isNull()) { continue; } SeafileTree::Entry entry(entry_name, entry_map["id"].toString(), entry_type); // If AddEntry was not successful we stop if (!tree_.AddEntry(library, path, entry)) { FinishedTaskInProgress(); return; } if (entry.is_dir()) { AddRecursivelyFolderItems(library, path + entry.name() + "/"); } else { MaybeAddFileEntry(entry.name(), library, path); } } FinishedTaskInProgress(); } QNetworkReply* SeafileService::PrepareFetchContentForFile( const QString& library, const QString& filepath) { QUrl content_url(server_ + QString(kFileContentUrl).arg(library)); content_url.addQueryItem("p", filepath); QNetworkRequest request(content_url); AddAuthorizationHeader(&request); QNetworkReply* reply = network_->get(request); return reply; } void SeafileService::MaybeAddFileEntry(const QString& entry_name, const QString& library, const QString& path) { QString mime_type = GuessMimeTypeForFile(entry_name); if (mime_type.isNull()) return; // Get the details of the entry QNetworkReply* reply = PrepareFetchContentForFile(library, path + entry_name); NewClosure(reply, SIGNAL(finished()), this, SLOT(MaybeAddFileEntryInProgress(QNetworkReply*, QString, QString, QString)), reply, library, path, mime_type); } void SeafileService::MaybeAddFileEntryInProgress(QNetworkReply* reply, const QString& library, const QString& path, const QString& mime_type) { if (!CheckReply(&reply)) { qLog(Warning) << "Something wrong with the reply... (MaybeAddFileEntry)"; return; } reply->deleteLater(); QByteArray data = reply->readAll(); QJson::Parser parser; QVariantMap entry_detail_map = parser.parse(data).toMap(); QUrl url; url.setScheme("seafile"); url.setPath("/" + library + path + entry_detail_map["name"].toString()); Song song; song.set_url(url); song.set_ctime(0); song.set_mtime(entry_detail_map["mtime"].toInt()); song.set_filesize(entry_detail_map["size"].toInt()); song.set_title(entry_detail_map["name"].toString()); // Get the download url of the entry reply = PrepareFetchContentUrlForFile( library, path + entry_detail_map["name"].toString()); NewClosure( reply, SIGNAL(finished()), this, SLOT(FetchContentUrlForFileFinished(QNetworkReply*, Song, QString)), reply, song, mime_type); } QNetworkReply* SeafileService::PrepareFetchContentUrlForFile( const QString& library, const QString& filepath) { QUrl content_url(server_ + QString(kFileUrl).arg(library)); content_url.addQueryItem("p", filepath); QNetworkRequest request(content_url); AddAuthorizationHeader(&request); QNetworkReply* reply = network_->get(request); return reply; } void SeafileService::FetchContentUrlForFileFinished(QNetworkReply* reply, const Song& song, const QString& mime_type) { if (!CheckReply(&reply)) { qLog(Warning) << "Something wrong with the reply... (FetchContentUrlForFile)"; return; } reply->deleteLater(); // Because server response is "http://..." QString real_url = QString(reply->readAll()).replace("\"", ""); MaybeAddFileToDatabase(song, mime_type, QUrl(real_url), QString("Token %1").arg(access_token_)); } QUrl SeafileService::GetStreamingUrlFromSongId(const QString& library, const QString& filepath) { QNetworkReply* reply = PrepareFetchContentUrlForFile(library, filepath); WaitForSignal(reply, SIGNAL(finished())); if (!CheckReply(&reply)) { qLog(Warning) << "Something wrong with the reply... (GetStreamingUrlFromSongId)"; return QUrl(""); } reply->deleteLater(); QString response = QString(reply->readAll()).replace("\"", ""); return QUrl(response); } void SeafileService::AddEntry(const QString& library, const QString& path, const SeafileTree::Entry& entry) { if (entry.is_library()) { tree_.AddLibrary(entry.name(), entry.id()); AddRecursivelyFolderItems(library, "/"); } else { // If AddEntry was not successful we stop // It could happen when the user changes the library to update while an // update was in progress if (!tree_.AddEntry(library, path, entry)) { return; } if (entry.is_file()) { MaybeAddFileEntry(entry.name(), library, path); } else { AddRecursivelyFolderItems(library, path + entry.name() + "/"); } } } void SeafileService::UpdateEntry(const QString& library, const QString& path, const SeafileTree::Entry& entry) { if (entry.is_file()) { DeleteEntry(library, path, entry); AddEntry(library, path, entry); } else { QString entry_path = path; if (entry.is_dir()) { entry_path += entry.name() + "/"; } FetchAndCheckFolderItems( SeafileTree::Entry("", library, SeafileTree::Entry::LIBRARY), entry_path); } } void SeafileService::DeleteEntry(const QString& library, const QString& path, const SeafileTree::Entry& entry) { // For the QPair -> 1 : path, 2 : entry QList> files_to_delete; if (entry.is_library()) { SeafileTree::TreeItem* item = tree_.FindLibrary(library); files_to_delete = tree_.GetRecursiveFilesOfDir("/", item); tree_.DeleteLibrary(library); } else { if (entry.is_dir()) { SeafileTree::TreeItem* item = tree_.FindFromAbsolutePath(library, path + entry.name() + "/"); files_to_delete = tree_.GetRecursiveFilesOfDir(path + entry.name() + "/", item); } else { files_to_delete.append(qMakePair(path, entry)); } if (!tree_.DeleteEntry(library, path, entry)) { return; } } // Delete songs from the library of Clementine for (const QPair& file_to_delete : files_to_delete) { if (!GuessMimeTypeForFile(file_to_delete.second.name()).isEmpty()) { QUrl song_url("seafile:/" + library + file_to_delete.first + file_to_delete.second.name()); Song song = library_backend_->GetSongByUrl(song_url); if (song.is_valid()) { library_backend_->DeleteSongs(SongList() << song); } else { qLog(Warning) << "Can't delete song from the Clementine's library : " << song_url; } } } } bool SeafileService::CheckReply(QNetworkReply** reply, int tries) { if (!(*reply)) { return false; } else if (tries > kMaxTries) { (*reply)->deleteLater(); return false; } QVariant status_code_variant = (*reply)->attribute(QNetworkRequest::HttpStatusCodeAttribute); if (status_code_variant.isValid()) { int status_code = status_code_variant.toInt(); if (status_code == NO_ERROR) { return true; } else if (status_code == TOO_MANY_REQUESTS) { qLog(Debug) << "Too many requests, wait..."; int seconds_to_wait; if ((*reply)->hasRawHeader("X-Throttle-Wait-Seconds")) { seconds_to_wait = ((*reply)->rawHeader("X-Throttle-Wait-Seconds").toInt() + 1) * 1000; } else { seconds_to_wait = std::pow(tries, 2) * 1000; } QTimer timer; timer.start(seconds_to_wait); WaitForSignal(&timer, SIGNAL(timeout())); (*reply)->deleteLater(); // We execute the reply again *reply = network_->get((*reply)->request()); WaitForSignal(*reply, SIGNAL(finished())); return CheckReply(reply, ++tries); } } // Unknown, 404 ... (*reply)->deleteLater(); qLog(Warning) << "Error for reply : " << status_code_variant.toInt(); return false; } void SeafileService::StartTaskInProgress() { indexing_task_max_++; task_manager_->SetTaskProgress(indexing_task_id_, indexing_task_progress_, indexing_task_max_); } void SeafileService::FinishedTaskInProgress() { indexing_task_progress_++; if (indexing_task_progress_ == indexing_task_max_) { task_manager_->SetTaskFinished(indexing_task_id_); indexing_task_id_ = -1; UpdatingLibrariesFinishedSignal(); } else { task_manager_->SetTaskProgress(indexing_task_id_, indexing_task_progress_, indexing_task_max_); } } SeafileService::~SeafileService() { // Save the tree ! QSettings s; s.beginGroup(kSettingsGroup); QByteArray tree_byte; QDataStream stream(&tree_byte, QIODevice::WriteOnly); stream << tree_; s.setValue("tree", tree_byte); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/seafile/seafileservice.h000066400000000000000000000137171260417502300265710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Chocobozzz Copyright 2014, Krzysztof Sobiecki Copyright 2014, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ /* Contacts (for explanations, congratulations, insults) : * - * * Help : * - The "path" variable has to end with "/". * If we want to specify a filepath, the name of the variable has to be... *filepath :) * - Seafile stores files in libraries (or repositories) so variable with the *name "library" corresponds to the * Seafile library, not to the Clementine library * - The authentification of Seafile's API is simply a token (REST API) * - Seafile stores a hash for each entry. This hash changes when the entry is *modified. * This is the reason why we just have to compare the local hash with the *server * hash of a directory (for example) to know if the directory was modified. * Libraries are an exception : Seafile stores a hash that never changes. * This hash is called "id". * * Todo : * - Add ssl certificate exception (for people who generate their own *certificate on their Seafile server * - Stop Tagreader when user changes the library */ #ifndef INTERNET_SEAFILE_SEAFILESERVICE_H_ #define INTERNET_SEAFILE_SEAFILESERVICE_H_ #include "internet/core/cloudfileservice.h" #include #include #include "seafiletree.h" class QNetworkReply; class QNetworkRequest; // Interface between the seafile server and Clementine class SeafileService : public CloudFileService { Q_OBJECT public: enum ApiError { NO_ERROR = 200, NOT_FOUND = 404, TOO_MANY_REQUESTS = 429 }; SeafileService(Application* app, InternetModel* parent); ~SeafileService(); static const char* kServiceName; static const char* kSettingsGroup; bool has_credentials() const; QUrl GetStreamingUrlFromSongId(const QString& library, const QString& filepath); // Get the token for an user (simple rest api) bool GetToken(const QString& mail, const QString& password, const QString& server); // Get all the libraries available for the user. Will emit a signal void GetLibraries(); public slots: void Connect(); void ForgetCredentials(); void ChangeLibrary(const QString& new_library); signals: void Connected(); // QMap, key : library's id, value : library's name void GetLibrariesFinishedSignal(QMap); void UpdatingLibrariesFinishedSignal(); private slots: // Will emit the signal void GetLibrariesFinished(QNetworkReply* reply); void FetchAndCheckFolderItemsFinished(QNetworkReply* reply, const SeafileTree::Entry& library, const QString& path); // Add recursively the content of a folder from a library void AddRecursivelyFolderItemsFinished(QNetworkReply* reply, const QString& library, const QString& path); // Get the url and try to add the file to the database void FetchContentUrlForFileFinished(QNetworkReply* reply, const Song& song, const QString& mime_type); // Add the entry to the tree and maybe add this entry to the database void AddEntry(const QString& library, const QString& path, const SeafileTree::Entry& entry); // Update the entry or check recursively the directories void UpdateEntry(const QString& library, const QString& path, const SeafileTree::Entry& entry); // Delete the entry (eventually the files of its subdir) of the tree and the // database void DeleteEntry(const QString& library, const QString& path, const SeafileTree::Entry& entry); void UpdateLibrariesInProgress(const QMap& libraries); void MaybeAddFileEntryInProgress(QNetworkReply* reply, const QString& library, const QString& path, const QString& mime_type); private: void AddAuthorizationHeader(QNetworkRequest* request) const; void UpdateLibraries(); void FetchAndCheckFolderItems(const SeafileTree::Entry& library, const QString& path); void AddRecursivelyFolderItems(const QString& library, const QString& path); QNetworkReply* PrepareFetchFolderItems(const QString& library, const QString& path); QNetworkReply* PrepareFetchContentForFile(const QString& library, const QString& filepath); QNetworkReply* PrepareFetchContentUrlForFile(const QString& library, const QString& filepath); void MaybeAddFileEntry(const QString& entry_name, const QString& library, const QString& path); // False if not 200 or 429 // If 429 (too many requests), re execute the request and put the reply in the // argument bool CheckReply(QNetworkReply** reply, int tries = 1); void StartTaskInProgress(); void FinishedTaskInProgress(); SeafileTree tree_; QString access_token_; QString server_; QString library_updated_; int indexing_task_id_; int indexing_task_max_; int indexing_task_progress_; bool changing_libary_; }; #endif // INTERNET_SEAFILE_SEAFILESERVICE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/seafile/seafilesettingspage.cpp000066400000000000000000000113031260417502300301460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Chocobozzz Copyright 2014, Krzysztof Sobiecki Copyright 2014, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "seafilesettingspage.h" #include #include #include #include #include #include "seafileservice.h" #include "internet/core/internetmodel.h" #include "core/logging.h" #include "core/network.h" #include "ui_seafilesettingspage.h" #include "ui/iconloader.h" SeafileSettingsPage::SeafileSettingsPage(SettingsDialog* dialog) : SettingsPage(dialog), ui_(new Ui_SeafileSettingsPage), service_(InternetModel::Service()) { ui_->setupUi(this); setWindowIcon(QIcon(":/providers/seafile.png")); connect(ui_->login_button, SIGNAL(clicked()), SLOT(Login())); connect(ui_->login_state, SIGNAL(LogoutClicked()), SLOT(Logout())); ui_->login_state->AddCredentialField(ui_->server); ui_->login_state->AddCredentialField(ui_->mail); ui_->login_state->AddCredentialField(ui_->password); ui_->login_state->AddCredentialGroup(ui_->account_group); ui_->library_box->addItem("None", "none"); connect(service_, SIGNAL(GetLibrariesFinishedSignal(QMap)), this, SLOT(GetLibrariesFinished(QMap))); } SeafileSettingsPage::~SeafileSettingsPage() {} void SeafileSettingsPage::Load() { QSettings s; s.beginGroup(SeafileService::kSettingsGroup); ui_->server->setText(s.value("server").toString()); ui_->mail->setText(s.value("mail").toString()); if (!ui_->server->text().isEmpty() && !ui_->mail->text().isEmpty()) { ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedIn, ui_->mail->text()); // If there is more than "none" library, that means that we already got the // libraries if (ui_->library_box->count() <= 1) { service_->GetLibraries(); } } } void SeafileSettingsPage::GetLibrariesFinished( const QMap& libraries) { ui_->library_box->clear(); ui_->library_box->addItem("None", "none"); ui_->library_box->addItem("All (could be slow)", "all"); // key : library's id, value : library's name QMapIterator library(libraries); while (library.hasNext()) { library.next(); ui_->library_box->addItem(library.value(), library.key()); } QSettings s; s.beginGroup(SeafileService::kSettingsGroup); QString library_id = s.value("library").toString(); int saved_index = ui_->library_box->findData(library_id); if (saved_index != -1) { ui_->library_box->setCurrentIndex(saved_index); } } void SeafileSettingsPage::Save() { QString id = ui_->library_box->itemData(ui_->library_box->currentIndex()).toString(); QSettings s; s.beginGroup(SeafileService::kSettingsGroup); s.setValue("mail", ui_->mail->text()); s.setValue("server", ui_->server->text()); s.setValue("library", id); // Don't need to save the password if (service_->has_credentials()) { service_->ChangeLibrary(id); } } void SeafileSettingsPage::Login() { ui_->login_button->setEnabled(false); if (service_->GetToken(ui_->mail->text(), ui_->password->text(), ui_->server->text())) { Save(); ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedIn, ui_->mail->text()); service_->GetLibraries(); } else { ui_->login_button->setEnabled(true); QMessageBox::warning(this, tr("Unable to connect"), tr("Unable to connect")); } } void SeafileSettingsPage::Logout() { // Forget the songs added service_->ChangeLibrary("none"); service_->ForgetCredentials(); // We choose to keep the server ui_->mail->clear(); ui_->password->clear(); QSettings s; s.beginGroup(SeafileService::kSettingsGroup); s.remove("mail"); s.remove("server"); s.remove("library"); ui_->library_box->clear(); ui_->library_box->addItem("None", "none"); ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedOut); ui_->login_button->setEnabled(true); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/seafile/seafilesettingspage.h000066400000000000000000000027501260417502300276210ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Chocobozzz Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_SEAFILE_SEAFILESETTINGSPAGE_H_ #define INTERNET_SEAFILE_SEAFILESETTINGSPAGE_H_ #include "ui/settingspage.h" #include #include class Ui_SeafileSettingsPage; class SeafileService; class SeafileSettingsPage : public SettingsPage { Q_OBJECT public: explicit SeafileSettingsPage(SettingsDialog* dialog); ~SeafileSettingsPage(); void Load(); void Save(); private slots: void Login(); void Logout(); // Map -> key : library's id, value : library's name void GetLibrariesFinished(const QMap& libraries); private: std::unique_ptr ui_; SeafileService* service_; }; #endif // INTERNET_SEAFILE_SEAFILESETTINGSPAGE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/seafile/seafilesettingspage.ui000066400000000000000000000117551260417502300300140ustar00rootroot00000000000000 SeafileSettingsPage 0 0 480 261 Seafile Account details true 0 0 0 0 Password QLineEdit::Password Email Login Server 0 0 Preference 20 19 431 31 QLayout::SetDefaultConstraint 0 0 0 0 Library LoginStateWidget QWidget
widgets/loginstatewidget.h
1
server mail password login_button library_box
clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/seafile/seafiletree.cpp000066400000000000000000000241761260417502300264240ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Chocobozzz Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "seafiletree.h" #include #include #include #include "core/logging.h" SeafileTree::SeafileTree() {} SeafileTree::SeafileTree(const SeafileTree& copy) { libraries_ = copy.libraries(); } QList SeafileTree::libraries() const { return libraries_; } void SeafileTree::Print() const { qLog(Debug) << "library count : " << libraries_.count(); for (TreeItem* item : libraries_) { qLog(Debug) << "library : " << item->ToString(1); } } void SeafileTree::AddLibrary(const QString& name, const QString& id) { libraries_.append(new TreeItem(Entry(name, id, Entry::Type::LIBRARY))); } void SeafileTree::DeleteLibrary(const QString& id) { for (int i = 0; i < libraries_.size(); ++i) { if (libraries_.at(i)->entry().id() == id) { libraries_.removeAt(i); return; } } } bool SeafileTree::AddEntry(const QString& library, const QString& path, const Entry& entry) { TreeItem* dir_node = FindFromAbsolutePath(library, path); if (!dir_node) { qLog(Warning) << "Can't find the path..."; return false; } // If it is not a dir or a library we can't add an entry... if (!dir_node->entry().is_dir() && !dir_node->entry().is_library()) { qLog(Warning) << "This is not a dir or a file..."; return false; } dir_node->AppendChild(entry); return true; } void SeafileTree::CheckEntries(const Entries& server_entries, const Entry& library, const QString& path) { TreeItem* local_item = FindFromAbsolutePath(library.id(), path); // Don't know the path // Have to add all entries if (!local_item) { emit ToAdd(library.id(), path, library); return; } Entries local_entries = local_item->children_entries(); for (const Entry& server_entry : server_entries) { bool is_in_tree = false; for (int i = 0; i < local_entries.size(); ++i) { Entry local_entry = local_entries.at(i); // We found the entry in the tree if (local_entry.name() == server_entry.name() && local_entry.type() == server_entry.type()) { is_in_tree = true; // Need to update if (local_entry.id() != server_entry.id()) { emit ToUpdate(library.id(), path, server_entry); // Set the new id to the local entry local_entry.set_id(server_entry.id()); } // local_entries could be named "local_entries_to_proceed" // So we delete from the list the entry we just proceeded local_entries.removeAt(i); break; } } // Need to add the entry if (!is_in_tree) { emit ToAdd(library.id(), path, server_entry); } } // Each entry in this list corresponds to an entry that we didn't proceed // So if the entry is in the tree but not on the server : we have to delete it for (const Entry& local_entry : local_entries) { emit ToDelete(library.id(), path, local_entry); } } SeafileTree::TreeItem* SeafileTree::FindLibrary(const QString& library) { for (TreeItem* item : libraries_) { if (item->entry().id() == library) return item; } return nullptr; } SeafileTree::TreeItem* SeafileTree::FindFromAbsolutePath(const QString& library, const QString& path) { TreeItem* node_item = FindLibrary(library); if (!node_item) { return nullptr; } QStringList path_parts = path.split("/", QString::SkipEmptyParts); for (const QString& part : path_parts) { node_item = node_item->FindChild(part); if (!node_item) { break; } } return node_item; } bool SeafileTree::DeleteEntry(const QString& library, const QString& path, const Entry& entry) { TreeItem* item_parent = FindFromAbsolutePath(library, path); if (!item_parent) { qLog(Debug) << "Unable to delete " << library + path + entry.name() << " : path " << path << " not found"; return false; } TreeItem* item_entry = item_parent->FindChild(entry.name()); if (!item_entry) { qLog(Debug) << "Unable to delete " << library + path + entry.name() << " : entry " << entry.name() << " from path not found"; return false; } if (!item_parent->RemoveChild(item_entry)) { qLog(Debug) << "Can't remove " << item_entry->entry().name() << " from parent"; return false; } delete item_entry; return true; } void SeafileTree::Clear() { qDeleteAll(libraries_); libraries_.clear(); } QList> SeafileTree::GetRecursiveFilesOfDir( const QString& path, const TreeItem* item) { // key = path, value = entry QList> files; if (!item) { return files; } if (item->entry().is_file()) { files.append(qMakePair(path, item->entry())); // Get files of the dir } else { for (TreeItem* child_item : item->children()) { if (child_item->entry().is_file()) { files.append(qMakePair(path, child_item->entry())); } else { QString name = child_item->entry().name() + "/"; files.append(GetRecursiveFilesOfDir(path + name, child_item)); } } } return files; } SeafileTree::~SeafileTree() {} /* ################################# Entry ################################# */ QString SeafileTree::Entry::name() const { return name_; } QString SeafileTree::Entry::id() const { return id_; } SeafileTree::Entry::Type SeafileTree::Entry::type() const { return type_; } bool SeafileTree::Entry::is_dir() const { return (type_ == Entry::DIR); } bool SeafileTree::Entry::is_file() const { return (type_ == Entry::FILE); } bool SeafileTree::Entry::is_library() const { return (type_ == Entry::LIBRARY); } void SeafileTree::Entry::set_name(const QString& name) { name_ = name; } void SeafileTree::Entry::set_id(const QString& id) { id_ = id; } void SeafileTree::Entry::set_type(const Type& type) { type_ = type; } QString SeafileTree::Entry::ToString() const { return "name : " + name_ + " id : " + id_ + " type : " + TypeToString(type_); } SeafileTree::Entry& SeafileTree::Entry::operator=(const Entry& entry) { name_ = entry.name(); id_ = entry.id(); type_ = entry.type(); return *this; } bool SeafileTree::Entry::operator==(const Entry& a) const { return a.name() == name() && a.id() == id() && a.type() == type(); } bool SeafileTree::Entry::operator!=(const Entry& a) const { return !(operator==(a)); } SeafileTree::Entry::~Entry() {} QString SeafileTree::Entry::TypeToString(const Type& type) { switch (type) { case DIR: return "dir"; case FILE: return "file"; case LIBRARY: return "library"; default: return QString::null; } } SeafileTree::Entry::Type SeafileTree::Entry::StringToType(const QString& type) { if (type == "dir") { return DIR; } else if (type == "file") { return FILE; } else if (type == "library") { return LIBRARY; } return NONE; } /* ############################### TreeItem ############################### */ SeafileTree::Entries SeafileTree::TreeItem::children_entries() const { Entries entries; for (TreeItem* item : children_) { entries.append(Entry(item->entry())); } return entries; } SeafileTree::TreeItem* SeafileTree::TreeItem::child(int i) const { return children_.at(i); } QList SeafileTree::TreeItem::children() const { return children_; } SeafileTree::Entry SeafileTree::TreeItem::entry() const { return entry_; } void SeafileTree::TreeItem::set_entry(const Entry& entry) { entry_ = entry; } void SeafileTree::TreeItem::set_children(const QList& children) { children_ = children; } void SeafileTree::TreeItem::AppendChild(TreeItem* child) { children_.append(child); } void SeafileTree::TreeItem::AppendChild(const Entry& entry) { children_.append(new TreeItem(entry)); } bool SeafileTree::TreeItem::RemoveChild(TreeItem* child) { return children_.removeOne(child); } SeafileTree::TreeItem* SeafileTree::TreeItem::FindChild( const QString& name) const { for (TreeItem* item : children_) { if (item->entry().name() == name) return item; } return nullptr; } QString SeafileTree::TreeItem::ToString(int i) const { QString res = ""; for (int j = 0; j < i; ++j) { res += " "; } res += entry_.ToString() + "\n"; for (TreeItem* item : children_) { res += item->ToString(i + 1); } return res; } SeafileTree::TreeItem::~TreeItem() { // We need to delete children qDeleteAll(children_); } QDataStream& operator<<(QDataStream& out, const SeafileTree::Entry& entry) { out << entry.name_ << entry.id_ << static_cast(entry.type_); return out; } QDataStream& operator>>(QDataStream& in, SeafileTree::Entry& entry) { quint8 temp; in >> entry.name_; in >> entry.id_; in >> temp; entry.type_ = SeafileTree::Entry::Type(temp); return in; } QDataStream& operator<<(QDataStream& out, SeafileTree::TreeItem* item) { out << item->entry_ << item->children_; return out; } QDataStream& operator>>(QDataStream& in, SeafileTree::TreeItem*& item) { SeafileTree::Entry entry; QList children; in >> entry; in >> children; item = new SeafileTree::TreeItem(entry, children); return in; } QDataStream& operator<<(QDataStream& out, const SeafileTree& tree) { out << tree.libraries_; return out; } QDataStream& operator>>(QDataStream& in, SeafileTree& tree) { in >> tree.libraries_; return in; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/seafile/seafiletree.h000066400000000000000000000135351260417502300260660ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Chocobozzz Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ /* Contacts (for explanations, congratulations, insults) : * - */ #ifndef INTERNET_SEAFILE_SEAFILETREE_H_ #define INTERNET_SEAFILE_SEAFILETREE_H_ #include #include #include #include #include "internet/core/cloudfileservice.h" // Reproduce the file system of Seafile server libraries // Analog to a tree class SeafileTree : public QObject { Q_OBJECT public: SeafileTree(); SeafileTree(const SeafileTree& copy); ~SeafileTree(); class Entry { public: enum Type { DIR = 0, FILE = 1, LIBRARY = 2, NONE = 3 }; Entry(const QString& name = QString(), const QString& id = QString(), const Type& type = NONE) : name_(name), id_(id), type_(type) {} Entry(const Entry& entry) : name_(entry.name()), id_(entry.id()), type_(entry.type()) {} ~Entry(); QString name() const; void set_name(const QString& name); QString id() const; void set_id(const QString& id); Type type() const; void set_type(const Type& type); bool is_dir() const; bool is_file() const; bool is_library() const; Entry& operator=(const Entry& entry); bool operator==(const Entry& a) const; bool operator!=(const Entry& a) const; QString ToString() const; static QString TypeToString(const Type& type); static Type StringToType(const QString& type); private: QString name_, id_; Type type_; friend QDataStream& operator<<(QDataStream& out, const SeafileTree::Entry& entry); friend QDataStream& operator>>(QDataStream& in, SeafileTree::Entry& entry); }; typedef QList Entries; // Node of the tree // Contains an entry class TreeItem { public: TreeItem(const Entry& entry = Entry(), const QList& children = QList()) : entry_(entry), children_(children) {} TreeItem(const TreeItem& copy) : entry_(copy.entry()), children_(copy.children()) {} ~TreeItem(); TreeItem* child(int i) const; QList children() const; // List of each child's entry Entries children_entries() const; void set_children(const QList& children); Entry entry() const; void set_entry(const Entry& entry); void AppendChild(TreeItem* child); void AppendChild(const Entry& entry); // True if child is removed bool RemoveChild(TreeItem* child); // nullptr if we didn't find a child entry with the given name TreeItem* FindChild(const QString& name) const; // Convert the node in QString (for debug) QString ToString(int i) const; private: Entry entry_; QList children_; friend QDataStream& operator<<(QDataStream& out, SeafileTree::TreeItem* item); friend QDataStream& operator>>(QDataStream& in, SeafileTree::TreeItem*& item); }; QList libraries() const; void AddLibrary(const QString& name, const QString& id); void DeleteLibrary(const QString& id); bool AddEntry(const QString& library, const QString& path, const Entry& entry); bool DeleteEntry(const QString& library, const QString& path, const Entry& entry); // Get a list of pair (path, entry) corresponding to the subfiles (and // recursively to the subsubfiles...) of the given item QList> GetRecursiveFilesOfDir( const QString& path, const TreeItem* item); // nullptr if we didn't find the library with the given id TreeItem* FindLibrary(const QString& library); // nullptr if we didn't find the item TreeItem* FindFromAbsolutePath(const QString& library, const QString& path); // Compare the server entries with the tree // Emit signals (ToDelete, ToAdd, ToUpdate) void CheckEntries(const Entries& server_entries, const Entry& library, const QString& path); // Destroy the tree void Clear(); // Print the tree in the debug log void Print() const; signals: // Entry to delete in the tree void ToDelete(const QString& library, const QString& path, const SeafileTree::Entry& entry); // Entry to add in the tree void ToAdd(const QString& library, const QString& path, const SeafileTree::Entry& entry); // Entry to update in the tree void ToUpdate(const QString& library, const QString& path, const SeafileTree::Entry& entry); private: QList libraries_; friend QDataStream& operator<<(QDataStream& out, const SeafileTree& tree); friend QDataStream& operator>>(QDataStream& in, SeafileTree& tree); }; QDataStream& operator<<(QDataStream& out, const SeafileTree& tree); QDataStream& operator>>(QDataStream& in, SeafileTree& tree); QDataStream& operator<<(QDataStream& out, const SeafileTree::Entry& entry); QDataStream& operator>>(QDataStream& in, SeafileTree::Entry& entry); QDataStream& operator<<(QDataStream& out, SeafileTree::TreeItem* item); QDataStream& operator>>(QDataStream& in, SeafileTree::TreeItem*& item); #endif // INTERNET_SEAFILE_SEAFILETREE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/seafile/seafileurlhandler.cpp000066400000000000000000000026601260417502300276170ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Chocobozzz Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "seafileurlhandler.h" #include "seafileservice.h" SeafileUrlHandler::SeafileUrlHandler(SeafileService* service, QObject* parent) : UrlHandler(parent), service_(service) {} UrlHandler::LoadResult SeafileUrlHandler::StartLoading(const QUrl& url) { QString file_library_and_path = url.path(); QRegExp reg("/([^/]+)(/.*)$"); if (reg.indexIn(file_library_and_path) == -1) { qLog(Debug) << "Can't find repo and file path in " << url; } QString library = reg.cap(1); QString filepath = reg.cap(2); QUrl real_url = service_->GetStreamingUrlFromSongId(library, filepath); return LoadResult(url, LoadResult::TrackAvailable, real_url); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/seafile/seafileurlhandler.h000066400000000000000000000024651260417502300272670ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Chocobozzz Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_SEAFILE_SEAFILEURLHANDLER_H_ #define INTERNET_SEAFILE_SEAFILEURLHANDLER_H_ #include "core/urlhandler.h" class SeafileService; class SeafileUrlHandler : public UrlHandler { Q_OBJECT public: explicit SeafileUrlHandler(SeafileService* service, QObject* parent = nullptr); QString scheme() const { return "seafile"; } QIcon icon() const { return QIcon(":/providers/seafile.png"); } LoadResult StartLoading(const QUrl& url); private: SeafileService* service_; }; #endif // INTERNET_SEAFILE_SEAFILEURLHANDLER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/skydrive/000077500000000000000000000000001260417502300236465ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/skydrive/skydriveservice.cpp000066400000000000000000000142521260417502300275770ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012-2014, John Maguire Copyright 2014, Krzysztof Sobiecki Copyright 2014, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "skydriveservice.h" #include #include #include "core/application.h" #include "core/player.h" #include "core/waitforsignal.h" #include "internet/core/oauthenticator.h" #include "internet/skydrive/skydriveurlhandler.h" namespace { static const char* kServiceId = "skydrive"; static const char* kClientId = "0000000040111F16"; static const char* kClientSecret = "w2ClguSX0jG56cBl1CeUniypTBRjXt2Z"; static const char* kOAuthEndpoint = "https://login.live.com/oauth20_authorize.srf"; static const char* kOAuthTokenEndpoint = "https://login.live.com/oauth20_token.srf"; static const char* kOAuthScope = "wl.basic wl.skydrive wl.offline_access"; static const char* kLiveUserInfo = "https://apis.live.net/v5.0/me"; static const char* kSkydriveBase = "https://apis.live.net/v5.0/"; } // namespace const char* SkydriveService::kServiceName = "OneDrive"; const char* SkydriveService::kSettingsGroup = "Skydrive"; SkydriveService::SkydriveService(Application* app, InternetModel* parent) : CloudFileService(app, parent, kServiceName, kServiceId, QIcon(":providers/skydrive.png"), SettingsDialog::Page_Skydrive) { app->player()->RegisterUrlHandler(new SkydriveUrlHandler(this, this)); } bool SkydriveService::has_credentials() const { return !refresh_token().isEmpty(); } QString SkydriveService::refresh_token() const { QSettings s; s.beginGroup(kSettingsGroup); return s.value("refresh_token").toString(); } void SkydriveService::Connect() { OAuthenticator* oauth = new OAuthenticator( kClientId, kClientSecret, OAuthenticator::RedirectStyle::REMOTE, this); if (!refresh_token().isEmpty()) { oauth->RefreshAuthorisation(kOAuthTokenEndpoint, refresh_token()); } else { oauth->StartAuthorisation(kOAuthEndpoint, kOAuthTokenEndpoint, kOAuthScope); } NewClosure(oauth, SIGNAL(Finished()), this, SLOT(ConnectFinished(OAuthenticator*)), oauth); } void SkydriveService::ConnectFinished(OAuthenticator* oauth) { oauth->deleteLater(); QSettings s; s.beginGroup(kSettingsGroup); s.setValue("refresh_token", oauth->refresh_token()); access_token_ = oauth->access_token(); expiry_time_ = oauth->expiry_time(); QUrl url(kLiveUserInfo); QNetworkRequest request(url); AddAuthorizationHeader(&request); QNetworkReply* reply = network_->get(request); NewClosure(reply, SIGNAL(finished()), this, SLOT(FetchUserInfoFinished(QNetworkReply*)), reply); } void SkydriveService::AddAuthorizationHeader(QNetworkRequest* request) { request->setRawHeader("Authorization", QString("Bearer %1").arg(access_token_).toUtf8()); } void SkydriveService::FetchUserInfoFinished(QNetworkReply* reply) { reply->deleteLater(); QJson::Parser parser; QVariantMap response = parser.parse(reply).toMap(); QString name = response["name"].toString(); if (!name.isEmpty()) { QSettings s; s.beginGroup(kSettingsGroup); s.setValue("name", name); } emit Connected(); ListFiles("me/skydrive"); } void SkydriveService::ListFiles(const QString& folder) { QUrl url(QString(kSkydriveBase) + folder + "/files"); url.addQueryItem("filter", "audio,folders"); QNetworkRequest request(url); AddAuthorizationHeader(&request); QNetworkReply* reply = network_->get(request); NewClosure(reply, SIGNAL(finished()), this, SLOT(ListFilesFinished(QNetworkReply*)), reply); } void SkydriveService::ListFilesFinished(QNetworkReply* reply) { reply->deleteLater(); QJson::Parser parser; QVariantMap response = parser.parse(reply).toMap(); QVariantList files = response["data"].toList(); for (const QVariant& f : files) { QVariantMap file = f.toMap(); if (file["type"].toString() == "audio") { QString mime_type = GuessMimeTypeForFile(file["name"].toString()); QUrl url; url.setScheme("skydrive"); url.setPath(file["id"].toString()); Song song; song.set_url(url); song.set_ctime(file["created_time"].toDateTime().toTime_t()); song.set_mtime(file["updated_time"].toDateTime().toTime_t()); song.set_comment(file["description"].toString()); song.set_filesize(file["size"].toInt()); song.set_title(file["name"].toString()); QUrl download_url = file["source"].toUrl(); // HTTPS appears to be broken somehow between Qt & Skydrive downloads. // Fortunately, just changing the scheme to HTTP works. download_url.setScheme("http"); MaybeAddFileToDatabase(song, mime_type, download_url, QString::null); } else if (file["type"].toString() == "folder") { ListFiles(file["id"].toString()); } } } QUrl SkydriveService::GetStreamingUrlFromSongId(const QString& file_id) { EnsureConnected(); QUrl url(QString(kSkydriveBase) + file_id); QNetworkRequest request(url); AddAuthorizationHeader(&request); std::unique_ptr reply(network_->get(request)); WaitForSignal(reply.get(), SIGNAL(finished())); QJson::Parser parser; QVariantMap response = parser.parse(reply.get()).toMap(); return response["source"].toUrl(); } void SkydriveService::EnsureConnected() { if (!access_token_.isEmpty()) { return; } Connect(); WaitForSignal(this, SIGNAL(Connected())); } void SkydriveService::ForgetCredentials() { QSettings s; s.beginGroup(kSettingsGroup); s.remove("refresh_token"); s.remove("name"); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/skydrive/skydriveservice.h000066400000000000000000000035751260417502300272520ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Copyright 2014, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_SKYDRIVE_SKYDRIVESERVICE_H_ #define INTERNET_SKYDRIVE_SKYDRIVESERVICE_H_ #include "internet/core/cloudfileservice.h" #include class OAuthenticator; class QNetworkRequest; class QNetworkReply; class SkydriveService : public CloudFileService { Q_OBJECT public: SkydriveService(Application* app, InternetModel* parent); static const char* kServiceName; static const char* kSettingsGroup; virtual bool has_credentials() const; QUrl GetStreamingUrlFromSongId(const QString& song_id); public slots: virtual void Connect(); void ForgetCredentials(); private slots: void ConnectFinished(OAuthenticator* oauth); void FetchUserInfoFinished(QNetworkReply* reply); void ListFilesFinished(QNetworkReply* reply); signals: void Connected(); private: QString refresh_token() const; void AddAuthorizationHeader(QNetworkRequest* request); void ListFiles(const QString& folder); void EnsureConnected(); QString access_token_; QDateTime expiry_time_; }; #endif // INTERNET_SKYDRIVE_SKYDRIVESERVICE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/skydrive/skydrivesettingspage.cpp000066400000000000000000000052761260417502300306420ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Krzysztof Sobiecki Copyright 2014, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "skydrivesettingspage.h" #include #include "ui_skydrivesettingspage.h" #include "core/application.h" #include "internet/skydrive/skydriveservice.h" #include "internet/core/internetmodel.h" #include "ui/settingsdialog.h" SkydriveSettingsPage::SkydriveSettingsPage(SettingsDialog* parent) : SettingsPage(parent), ui_(new Ui::SkydriveSettingsPage), service_(dialog()->app()->internet_model()->Service()) { ui_->setupUi(this); ui_->login_state->AddCredentialGroup(ui_->login_container); connect(ui_->login_button, SIGNAL(clicked()), SLOT(LoginClicked())); connect(ui_->login_state, SIGNAL(LogoutClicked()), SLOT(LogoutClicked())); connect(service_, SIGNAL(Connected()), SLOT(Connected())); dialog()->installEventFilter(this); } SkydriveSettingsPage::~SkydriveSettingsPage() { delete ui_; } void SkydriveSettingsPage::Load() { QSettings s; s.beginGroup(SkydriveService::kSettingsGroup); const QString name = s.value("name").toString(); if (!name.isEmpty()) { ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedIn, name); } } void SkydriveSettingsPage::Save() { QSettings s; s.beginGroup(SkydriveService::kSettingsGroup); } void SkydriveSettingsPage::LoginClicked() { service_->Connect(); ui_->login_button->setEnabled(false); } bool SkydriveSettingsPage::eventFilter(QObject* object, QEvent* event) { if (object == dialog() && event->type() == QEvent::Enter) { ui_->login_button->setEnabled(true); return false; } return SettingsPage::eventFilter(object, event); } void SkydriveSettingsPage::LogoutClicked() { service_->ForgetCredentials(); ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedOut); } void SkydriveSettingsPage::Connected() { QSettings s; s.beginGroup(SkydriveService::kSettingsGroup); const QString name = s.value("name").toString(); ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedIn, name); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/skydrive/skydrivesettingspage.h000066400000000000000000000027271260417502300303050ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Krzysztof Sobiecki Copyright 2014, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_SKYDRIVE_SKYDRIVESETTINGSPAGE_H_ #define INTERNET_SKYDRIVE_SKYDRIVESETTINGSPAGE_H_ #include "ui/settingspage.h" #include #include class SkydriveService; class Ui_SkydriveSettingsPage; class SkydriveSettingsPage : public SettingsPage { Q_OBJECT public: explicit SkydriveSettingsPage(SettingsDialog* parent = nullptr); ~SkydriveSettingsPage(); void Load(); void Save(); // QObject bool eventFilter(QObject* object, QEvent* event); private slots: void LoginClicked(); void LogoutClicked(); void Connected(); private: Ui_SkydriveSettingsPage* ui_; SkydriveService* service_; }; #endif // INTERNET_SKYDRIVE_SKYDRIVESETTINGSPAGE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/skydrive/skydrivesettingspage.ui000066400000000000000000000057101260417502300304660ustar00rootroot00000000000000 SkydriveSettingsPage 0 0 569 491 OneDrive :/providers/skydrive.png:/providers/skydrive.png Clementine can play music that you have uploaded to OneDrive true 28 0 0 Login Qt::Horizontal 40 20 Clicking the Login button will open a web browser. You should return to Clementine after you have logged in. true Qt::Vertical 20 357 LoginStateWidget QWidget
widgets/loginstatewidget.h
1
clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/skydrive/skydriveurlhandler.cpp000066400000000000000000000023611260417502300302750ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "skydriveurlhandler.h" #include "skydriveservice.h" SkydriveUrlHandler::SkydriveUrlHandler(SkydriveService* service, QObject* parent) : UrlHandler(parent), service_(service) {} UrlHandler::LoadResult SkydriveUrlHandler::StartLoading(const QUrl& url) { QString file_id(url.path()); QUrl real_url = service_->GetStreamingUrlFromSongId(file_id); return LoadResult(url, LoadResult::TrackAvailable, real_url); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/skydrive/skydriveurlhandler.h000066400000000000000000000025041260417502300277410ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_SKYDRIVE_SKYDRIVEURLHANDLER_H_ #define INTERNET_SKYDRIVE_SKYDRIVEURLHANDLER_H_ #include "core/urlhandler.h" class SkydriveService; class SkydriveUrlHandler : public UrlHandler { Q_OBJECT public: explicit SkydriveUrlHandler(SkydriveService* service, QObject* parent = nullptr); QString scheme() const { return "skydrive"; } QIcon icon() const { return QIcon(":providers/skydrive.png"); } LoadResult StartLoading(const QUrl& url); private: SkydriveService* service_; }; #endif // INTERNET_SKYDRIVE_SKYDRIVEURLHANDLER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/somafm/000077500000000000000000000000001260417502300232705ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/somafm/somafmservice.cpp000066400000000000000000000202001260417502300266310ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2013, David Sansome Copyright 2011, Tyler Rhodes Copyright 2011, Paweł Bara Copyright 2012, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "somafmservice.h" #include #include #include #include #include #include #include #include "somafmurlhandler.h" #include "internet/core/internetmodel.h" #include "core/application.h" #include "core/closure.h" #include "core/logging.h" #include "core/network.h" #include "core/player.h" #include "core/taskmanager.h" #include "core/utilities.h" #include "globalsearch/globalsearch.h" #include "globalsearch/somafmsearchprovider.h" #include "ui/iconloader.h" const int SomaFMServiceBase::kStreamsCacheDurationSecs = 60 * 60 * 24 * 28; // 4 weeks bool operator<(const SomaFMServiceBase::Stream& a, const SomaFMServiceBase::Stream& b) { return a.title_.compare(b.title_, Qt::CaseInsensitive) < 0; } SomaFMServiceBase::SomaFMServiceBase(Application* app, InternetModel* parent, const QString& name, const QUrl& channel_list_url, const QUrl& homepage_url, const QUrl& donate_page_url, const QIcon& icon) : InternetService(name, app, parent, parent), url_scheme_(name.toLower().remove(' ')), url_handler_(new SomaFMUrlHandler(app, this, this)), root_(nullptr), context_menu_(nullptr), network_(new NetworkAccessManager(this)), streams_(name, "streams", kStreamsCacheDurationSecs), name_(name), channel_list_url_(channel_list_url), homepage_url_(homepage_url), donate_page_url_(donate_page_url), icon_(icon) { ReloadSettings(); app_->player()->RegisterUrlHandler(url_handler_); app_->global_search()->AddProvider( new SomaFMSearchProvider(this, app_, this)); } SomaFMServiceBase::~SomaFMServiceBase() { delete context_menu_; } QStandardItem* SomaFMServiceBase::CreateRootItem() { root_ = new QStandardItem(icon_, name_); root_->setData(true, InternetModel::Role_CanLazyLoad); return root_; } void SomaFMServiceBase::LazyPopulate(QStandardItem* item) { switch (item->data(InternetModel::Role_Type).toInt()) { case InternetModel::Type_Service: RefreshStreams(); break; default: break; } } void SomaFMServiceBase::ShowContextMenu(const QPoint& global_pos) { if (!context_menu_) { context_menu_ = new QMenu; context_menu_->addActions(GetPlaylistActions()); context_menu_->addAction(IconLoader::Load("download"), tr("Open %1 in browser").arg(homepage_url_.host()), this, SLOT(Homepage())); if (!donate_page_url_.isEmpty()) { context_menu_->addAction(IconLoader::Load("download"), tr("Donate"), this, SLOT(Donate())); } context_menu_->addAction(IconLoader::Load("view-refresh"), tr("Refresh channels"), this, SLOT(ForceRefreshStreams())); } context_menu_->popup(global_pos); } void SomaFMServiceBase::ForceRefreshStreams() { QNetworkReply* reply = network_->get(QNetworkRequest(channel_list_url_)); int task_id = app_->task_manager()->StartTask(tr("Getting channels")); NewClosure(reply, SIGNAL(finished()), this, SLOT(RefreshStreamsFinished(QNetworkReply*, int)), reply, task_id); } void SomaFMServiceBase::RefreshStreamsFinished(QNetworkReply* reply, int task_id) { app_->task_manager()->SetTaskFinished(task_id); reply->deleteLater(); if (reply->error() != QNetworkReply::NoError) { // TODO(David Sansome): Error handling qLog(Error) << reply->errorString(); return; } StreamList list; QXmlStreamReader reader(reply); while (!reader.atEnd()) { reader.readNext(); if (reader.tokenType() == QXmlStreamReader::StartElement && reader.name() == "channel") { ReadChannel(reader, &list); } } streams_.Update(list); streams_.Sort(); // Only update the item's children if it's already been populated if (!root_->data(InternetModel::Role_CanLazyLoad).toBool()) PopulateStreams(); emit StreamsChanged(); } void SomaFMServiceBase::ReadChannel(QXmlStreamReader& reader, StreamList* ret) { Stream stream; while (!reader.atEnd()) { switch (reader.readNext()) { case QXmlStreamReader::EndElement: if (!stream.url_.isEmpty()) { ret->append(stream); } return; case QXmlStreamReader::StartElement: if (reader.name() == "title") { stream.title_ = reader.readElementText(); } else if (reader.name() == "dj") { stream.dj_ = reader.readElementText(); } else if (reader.name() == "fastpls" && reader.attributes().value("format") == "mp3") { QUrl url(reader.readElementText()); url.setScheme(url_handler_->scheme()); stream.url_ = url; } else { Utilities::ConsumeCurrentElement(&reader); } break; default: break; } } } Song SomaFMServiceBase::Stream::ToSong(const QString& prefix) const { QString song_title = title_.trimmed(); if (!song_title.startsWith(prefix)) { song_title = prefix + " " + song_title; } Song ret; ret.set_valid(true); ret.set_title(song_title); ret.set_artist(dj_); ret.set_url(url_); return ret; } void SomaFMServiceBase::Homepage() { QDesktopServices::openUrl(homepage_url_); } void SomaFMServiceBase::Donate() { QDesktopServices::openUrl(donate_page_url_); } PlaylistItem::Options SomaFMServiceBase::playlistitem_options() const { return PlaylistItem::PauseDisabled; } SomaFMServiceBase::StreamList SomaFMServiceBase::Streams() { if (IsStreamListStale()) { metaObject()->invokeMethod(this, "ForceRefreshStreams", Qt::QueuedConnection); } return streams_; } void SomaFMServiceBase::RefreshStreams() { if (IsStreamListStale()) { ForceRefreshStreams(); return; } PopulateStreams(); } void SomaFMServiceBase::PopulateStreams() { if (root_->hasChildren()) root_->removeRows(0, root_->rowCount()); for (const Stream& stream : streams_) { QStandardItem* item = new QStandardItem(QIcon(":last.fm/icon_radio.png"), QString()); item->setText(stream.title_); item->setData(QVariant::fromValue(stream.ToSong(name_)), InternetModel::Role_SongMetadata); item->setData(InternetModel::PlayBehaviour_SingleItem, InternetModel::Role_PlayBehaviour); root_->appendRow(item); } } QDataStream& operator<<(QDataStream& out, const SomaFMServiceBase::Stream& stream) { out << stream.title_ << stream.dj_ << stream.url_; return out; } QDataStream& operator>>(QDataStream& in, SomaFMServiceBase::Stream& stream) { in >> stream.title_ >> stream.dj_ >> stream.url_; return in; } void SomaFMServiceBase::ReloadSettings() { streams_.Load(); streams_.Sort(); } SomaFMService::SomaFMService(Application* app, InternetModel* parent) : SomaFMServiceBase( app, parent, "SomaFM", QUrl("http://somafm.com/channels.xml"), QUrl("http://somafm.com"), QUrl(), QIcon(":providers/somafm.png")) {} clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/somafm/somafmservice.h000066400000000000000000000061751260417502300263150ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010-2013, David Sansome Copyright 2010, 2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_SOMAFM_SOMAFMSERVICE_H_ #define INTERNET_SOMAFM_SOMAFMSERVICE_H_ #include #include "internet/core/internetservice.h" #include "core/cachedlist.h" class SomaFMUrlHandler; class QNetworkAccessManager; class QNetworkReply; class QMenu; class SomaFMServiceBase : public InternetService { Q_OBJECT public: SomaFMServiceBase(Application* app, InternetModel* parent, const QString& name, const QUrl& channel_list_url, const QUrl& homepage_url, const QUrl& donate_page_url, const QIcon& icon); ~SomaFMServiceBase(); enum ItemType { Type_Stream = 2000, }; struct Stream { QString title_; QString dj_; QUrl url_; Song ToSong(const QString& prefix) const; }; typedef QList StreamList; static const int kStreamsCacheDurationSecs; const QString& url_scheme() const { return url_scheme_; } const QIcon& icon() const { return icon_; } QStandardItem* CreateRootItem(); void LazyPopulate(QStandardItem* item); void ShowContextMenu(const QPoint& global_pos); PlaylistItem::Options playlistitem_options() const; QNetworkAccessManager* network() const { return network_; } void ReloadSettings(); bool IsStreamListStale() const { return streams_.IsStale(); } StreamList Streams(); signals: void StreamsChanged(); private slots: void ForceRefreshStreams(); void RefreshStreams(); void RefreshStreamsFinished(QNetworkReply* reply, int task_id); void Homepage(); void Donate(); private: void ReadChannel(QXmlStreamReader& reader, StreamList* ret); void PopulateStreams(); private: const QString url_scheme_; SomaFMUrlHandler* url_handler_; QStandardItem* root_; QMenu* context_menu_; QNetworkAccessManager* network_; CachedList streams_; const QString name_; const QUrl channel_list_url_; const QUrl homepage_url_; const QUrl donate_page_url_; const QIcon icon_; }; class SomaFMService : public SomaFMServiceBase { public: SomaFMService(Application* app, InternetModel* parent); }; QDataStream& operator<<(QDataStream& out, const SomaFMService::Stream& stream); QDataStream& operator>>(QDataStream& in, SomaFMService::Stream& stream); Q_DECLARE_METATYPE(SomaFMService::Stream) #endif // INTERNET_SOMAFM_SOMAFMSERVICE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/somafm/somafmurlhandler.cpp000066400000000000000000000057521260417502300273500ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011-2013, David Sansome Copyright 2012, Olaf Christ Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "somafmurlhandler.h" #include #include #include #include #include "internet/core/internetmodel.h" #include "somafmservice.h" #include "core/application.h" #include "core/logging.h" #include "core/taskmanager.h" #include "playlistparsers/playlistparser.h" SomaFMUrlHandler::SomaFMUrlHandler(Application* app, SomaFMServiceBase* service, QObject* parent) : UrlHandler(parent), app_(app), service_(service), task_id_(0) {} QString SomaFMUrlHandler::scheme() const { return service_->url_scheme(); } QIcon SomaFMUrlHandler::icon() const { return service_->icon(); } UrlHandler::LoadResult SomaFMUrlHandler::StartLoading(const QUrl& url) { QUrl playlist_url = url; playlist_url.setScheme("http"); // Load the playlist QNetworkReply* reply = service_->network()->get(QNetworkRequest(playlist_url)); connect(reply, SIGNAL(finished()), SLOT(LoadPlaylistFinished())); if (!task_id_) task_id_ = app_->task_manager()->StartTask(tr("Loading stream")); return LoadResult(url, LoadResult::WillLoadAsynchronously); } void SomaFMUrlHandler::LoadPlaylistFinished() { QNetworkReply* reply = qobject_cast(sender()); app_->task_manager()->SetTaskFinished(task_id_); task_id_ = 0; QUrl original_url(reply->url()); original_url.setScheme(scheme()); if (reply->error() != QNetworkReply::NoError) { // TODO((David Sansome): Error handling qLog(Error) << reply->errorString(); emit AsyncLoadComplete(LoadResult(original_url, LoadResult::NoMoreTracks)); return; } // Parse the playlist PlaylistParser parser(nullptr); QList songs = parser.LoadFromDevice(reply); qLog(Info) << "Loading station finished, got" << songs.count() << "songs"; // Failed to get playlist? if (songs.count() == 0) { qLog(Error) << "Error loading" << scheme() << "playlist"; emit AsyncLoadComplete(LoadResult(original_url, LoadResult::NoMoreTracks)); return; } emit AsyncLoadComplete( LoadResult(original_url, LoadResult::TrackAvailable, songs[0].url())); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/somafm/somafmurlhandler.h000066400000000000000000000026571260417502300270160ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011-2013, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_SOMAFM_SOMAFMURLHANDLER_H_ #define INTERNET_SOMAFM_SOMAFMURLHANDLER_H_ #include "core/urlhandler.h" class Application; class SomaFMServiceBase; class SomaFMUrlHandler : public UrlHandler { Q_OBJECT public: SomaFMUrlHandler(Application* app, SomaFMServiceBase* service, QObject* parent); QString scheme() const; QIcon icon() const; LoadResult StartLoading(const QUrl& url); private slots: void LoadPlaylistFinished(); private: Application* app_; SomaFMServiceBase* service_; int task_id_; }; #endif // INTERNET_SOMAFM_SOMAFMURLHANDLER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/soundcloud/000077500000000000000000000000001260417502300241655ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/soundcloud/soundcloudservice.cpp000066400000000000000000000416641260417502300304440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, 2014, Arnaud Bienner Copyright 2014, maximko Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "soundcloudservice.h" #include #include #include #include #include #include #include #include "internet/core/internetmodel.h" #include "internet/core/oauthenticator.h" #include "internet/core/searchboxwidget.h" #include "core/application.h" #include "core/closure.h" #include "core/logging.h" #include "core/mergedproxymodel.h" #include "core/network.h" #include "core/song.h" #include "core/taskmanager.h" #include "core/timeconstants.h" #include "core/utilities.h" #include "globalsearch/globalsearch.h" #include "globalsearch/soundcloudsearchprovider.h" #include "ui/iconloader.h" const char* SoundCloudService::kApiClientId = "2add0f709fcfae1fd7a198ec7573d2d4"; const char* SoundCloudService::kApiClientSecret = "d1cd7829da2e98e1e0621d85d57a2077"; const char* SoundCloudService::kServiceName = "SoundCloud"; const char* SoundCloudService::kSettingsGroup = "SoundCloud"; const char* SoundCloudService::kUrl = "https://api.soundcloud.com/"; const char* SoundCloudService::kOAuthEndpoint = "https://soundcloud.com/connect"; const char* SoundCloudService::kOAuthTokenEndpoint = "https://api.soundcloud.com/oauth2/token"; const char* SoundCloudService::kOAuthScope = "non-expiring"; const char* SoundCloudService::kHomepage = "http://soundcloud.com/"; const int SoundCloudService::kSearchDelayMsec = 400; const int SoundCloudService::kSongSearchLimit = 100; const int SoundCloudService::kSongSimpleSearchLimit = 10; typedef QPair Param; SoundCloudService::SoundCloudService(Application* app, InternetModel* parent) : InternetService(kServiceName, app, parent, parent), root_(nullptr), search_(nullptr), user_tracks_(nullptr), user_playlists_(nullptr), user_activities_(nullptr), network_(new NetworkAccessManager(this)), context_menu_(nullptr), search_box_(new SearchBoxWidget(this)), search_delay_(new QTimer(this)), next_pending_search_id_(0) { search_delay_->setInterval(kSearchDelayMsec); search_delay_->setSingleShot(true); connect(search_delay_, SIGNAL(timeout()), SLOT(DoSearch())); SoundCloudSearchProvider* search_provider = new SoundCloudSearchProvider(app_, this); search_provider->Init(this); app_->global_search()->AddProvider(search_provider); connect(search_box_, SIGNAL(TextChanged(QString)), SLOT(Search(QString))); } SoundCloudService::~SoundCloudService() {} QStandardItem* SoundCloudService::CreateRootItem() { root_ = new QStandardItem(QIcon(":providers/soundcloud.png"), kServiceName); root_->setData(true, InternetModel::Role_CanLazyLoad); root_->setData(InternetModel::PlayBehaviour_DoubleClickAction, InternetModel::Role_PlayBehaviour); return root_; } void SoundCloudService::LazyPopulate(QStandardItem* item) { switch (item->data(InternetModel::Role_Type).toInt()) { case InternetModel::Type_Service: { EnsureItemsCreated(); break; } default: break; } } void SoundCloudService::EnsureItemsCreated() { if (!search_) { search_ = new QStandardItem(IconLoader::Load("edit-find"), tr("Search results")); search_->setToolTip( tr("Start typing something on the search box above to " "fill this search results list")); search_->setData(InternetModel::PlayBehaviour_MultipleItems, InternetModel::Role_PlayBehaviour); root_->appendRow(search_); } if (!user_tracks_ && !user_activities_ && !user_playlists_ && IsLoggedIn()) { user_activities_ = new QStandardItem(tr("Activities stream")); user_activities_->setData(InternetModel::PlayBehaviour_MultipleItems, InternetModel::Role_PlayBehaviour); root_->appendRow(user_activities_); user_playlists_ = new QStandardItem(tr("Playlists")); root_->appendRow(user_playlists_); user_tracks_ = new QStandardItem(tr("Tracks")); user_tracks_->setData(InternetModel::PlayBehaviour_MultipleItems, InternetModel::Role_PlayBehaviour); root_->appendRow(user_tracks_); RetrieveUserData(); // at least, try to (this will do nothing if user isn't // logged) } } QWidget* SoundCloudService::HeaderWidget() const { return search_box_; } void SoundCloudService::ShowConfig() { app_->OpenSettingsDialogAtPage(SettingsDialog::Page_SoundCloud); } void SoundCloudService::Homepage() { QDesktopServices::openUrl(QUrl(kHomepage)); } void SoundCloudService::Connect() { OAuthenticator* oauth = new OAuthenticator( kApiClientId, kApiClientSecret, OAuthenticator::RedirectStyle::REMOTE_WITH_STATE, this); oauth->StartAuthorisation(kOAuthEndpoint, kOAuthTokenEndpoint, kOAuthScope); NewClosure(oauth, SIGNAL(Finished()), this, SLOT(ConnectFinished(OAuthenticator*)), oauth); } void SoundCloudService::ConnectFinished(OAuthenticator* oauth) { oauth->deleteLater(); access_token_ = oauth->access_token(); if (!access_token_.isEmpty()) { emit Connected(); } expiry_time_ = oauth->expiry_time(); QSettings s; s.beginGroup(kSettingsGroup); s.setValue("access_token", access_token_); EnsureItemsCreated(); } void SoundCloudService::LoadAccessTokenIfEmpty() { if (access_token_.isEmpty()) { QSettings s; s.beginGroup(kSettingsGroup); if (!s.contains("access_token")) { return; } access_token_ = s.value("access_token").toString(); } } bool SoundCloudService::IsLoggedIn() { LoadAccessTokenIfEmpty(); return !access_token_.isEmpty(); } void SoundCloudService::Logout() { QSettings s; s.beginGroup(kSettingsGroup); access_token_.clear(); s.remove("access_token"); pending_playlists_requests_.clear(); if (user_activities_) root_->removeRow(user_activities_->row()); if (user_tracks_) root_->removeRow(user_tracks_->row()); if (user_playlists_) root_->removeRow(user_playlists_->row()); user_activities_ = nullptr; user_tracks_ = nullptr; user_playlists_ = nullptr; } void SoundCloudService::RetrieveUserData() { LoadAccessTokenIfEmpty(); RetrieveUserActivities(); RetrieveUserTracks(); RetrieveUserPlaylists(); } void SoundCloudService::RetrieveUserTracks() { QList parameters; parameters << Param("oauth_token", access_token_); QNetworkReply* reply = CreateRequest("me/tracks", parameters); NewClosure(reply, SIGNAL(finished()), this, SLOT(UserTracksRetrieved(QNetworkReply*)), reply); } void SoundCloudService::UserTracksRetrieved(QNetworkReply* reply) { reply->deleteLater(); SongList songs = ExtractSongs(ExtractResult(reply)); // Fill results list for (const Song& song : songs) { QStandardItem* child = CreateSongItem(song); user_tracks_->appendRow(child); } } void SoundCloudService::RetrieveUserActivities() { QList parameters; parameters << Param("oauth_token", access_token_); QNetworkReply* reply = CreateRequest("me/activities", parameters); NewClosure(reply, SIGNAL(finished()), this, SLOT(UserActivitiesRetrieved(QNetworkReply*)), reply); } void SoundCloudService::UserActivitiesRetrieved(QNetworkReply* reply) { reply->deleteLater(); QList activities = ExtractActivities(ExtractResult(reply)); // Fill results list for (QStandardItem* activity : activities) { user_activities_->appendRow(activity); } } void SoundCloudService::RetrieveUserPlaylists() { QList parameters; parameters << Param("oauth_token", access_token_); QNetworkReply* reply = CreateRequest("me/playlists", parameters); NewClosure(reply, SIGNAL(finished()), this, SLOT(UserPlaylistsRetrieved(QNetworkReply*)), reply); } void SoundCloudService::UserPlaylistsRetrieved(QNetworkReply* reply) { reply->deleteLater(); QList playlists = ExtractResult(reply).toList(); for (const QVariant& playlist : playlists) { QMap playlist_map = playlist.toMap(); QStandardItem* playlist_item = CreatePlaylistItem(playlist_map["title"].toString()); SongList songs = ExtractSongs(playlist_map["tracks"]); for (const Song& song : songs) { playlist_item->appendRow(CreateSongItem(song)); } user_playlists_->appendRow(playlist_item); } } void SoundCloudService::Search(const QString& text, bool now) { pending_search_ = text; // If there is no text (e.g. user cleared search box), we don't need to do a // real query that will return nothing: we can clear the playlist now if (text.isEmpty()) { search_delay_->stop(); ClearSearchResults(); return; } if (now) { search_delay_->stop(); DoSearch(); } else { search_delay_->start(); } } void SoundCloudService::DoSearch() { ClearSearchResults(); QList parameters; parameters << Param("q", pending_search_); QNetworkReply* reply = CreateRequest("tracks", parameters); const int id = next_pending_search_id_++; NewClosure(reply, SIGNAL(finished()), this, SLOT(SearchFinished(QNetworkReply*, int)), reply, id); } void SoundCloudService::SearchFinished(QNetworkReply* reply, int task_id) { reply->deleteLater(); SongList songs = ExtractSongs(ExtractResult(reply)); // Fill results list for (const Song& song : songs) { QStandardItem* child = CreateSongItem(song); search_->appendRow(child); } QModelIndex index = model()->merged_model()->mapFromSource(search_->index()); ScrollToIndex(index); } void SoundCloudService::ClearSearchResults() { if (search_) { search_->removeRows(0, search_->rowCount()); } } int SoundCloudService::SimpleSearch(const QString& text) { QList parameters; parameters << Param("q", text); QNetworkReply* reply = CreateRequest("tracks", parameters); const int id = next_pending_search_id_++; NewClosure(reply, SIGNAL(finished()), this, SLOT(SimpleSearchFinished(QNetworkReply*, int)), reply, id); return id; } void SoundCloudService::SimpleSearchFinished(QNetworkReply* reply, int id) { reply->deleteLater(); SongList songs = ExtractSongs(ExtractResult(reply)); emit SimpleSearchResults(id, songs); } void SoundCloudService::EnsureMenuCreated() { if (!context_menu_) { context_menu_ = new QMenu; context_menu_->addActions(GetPlaylistActions()); context_menu_->addSeparator(); context_menu_->addAction(IconLoader::Load("download"), tr("Open %1 in browser").arg("soundcloud.com"), this, SLOT(Homepage())); } } void SoundCloudService::ShowContextMenu(const QPoint& global_pos) { EnsureMenuCreated(); context_menu_->popup(global_pos); } QStandardItem* SoundCloudService::CreatePlaylistItem(const QString& playlist_name) { QStandardItem* item = new QStandardItem(playlist_name); item->setData(true, InternetModel::Role_CanLazyLoad); item->setData(InternetModel::PlayBehaviour_MultipleItems, InternetModel::Role_PlayBehaviour); return item; } QNetworkReply* SoundCloudService::CreateRequest(const QString& ressource_name, const QList& params) { QUrl url(kUrl); url.setPath(ressource_name); url.addQueryItem("client_id", kApiClientId); for (const Param& param : params) { url.addQueryItem(param.first, param.second); } qLog(Debug) << "Request Url: " << url.toEncoded(); QNetworkRequest req(url); req.setRawHeader("Accept", "application/json"); QNetworkReply* reply = network_->get(req); return reply; } QVariant SoundCloudService::ExtractResult(QNetworkReply* reply) { if (reply->error() != QNetworkReply::NoError) { qLog(Error) << "Error when retrieving SoundCloud results:" << reply->errorString() << QString(" (%1)").arg(reply->error()); if (reply->error() == QNetworkReply::ContentAccessDenied || reply->error() == QNetworkReply::ContentOperationNotPermittedError || reply->error() == QNetworkReply::ContentNotFoundError || reply->error() == QNetworkReply::AuthenticationRequiredError) { // In case of access denied errors (invalid token?) logout Logout(); return QVariant(); } } QJson::Parser parser; bool ok; QVariant result = parser.parse(reply, &ok); if (!ok) { qLog(Error) << "Error while parsing SoundCloud result"; } return result; } void SoundCloudService::RetrievePlaylist(int playlist_id, QStandardItem* playlist_item) { const int request_id = next_retrieve_playlist_id_++; pending_playlists_requests_.insert(request_id, PlaylistInfo(playlist_id, playlist_item)); QList parameters; parameters << Param("oauth_token", access_token_); QNetworkReply* reply = CreateRequest("playlists/" + QString::number(playlist_id), parameters); NewClosure(reply, SIGNAL(finished()), this, SLOT(PlaylistRetrieved(QNetworkReply*, int)), reply, request_id); } void SoundCloudService::PlaylistRetrieved(QNetworkReply* reply, int request_id) { if (!pending_playlists_requests_.contains(request_id)) return; PlaylistInfo playlist_info = pending_playlists_requests_.take(request_id); QVariant res = ExtractResult(reply); SongList songs = ExtractSongs(res.toMap()["tracks"]); for (const Song& song : songs) { QStandardItem* child = CreateSongItem(song); playlist_info.item_->appendRow(child); } } QList SoundCloudService::ExtractActivities(const QVariant& result) { QList activities; QVariantList q_variant_list = result.toMap()["collection"].toList(); for (const QVariant& q : q_variant_list) { QMap activity = q.toMap(); const QString type = activity["type"].toString(); if (type == "track") { Song song = ExtractSong(activity["origin"].toMap()); if (song.is_valid()) { activities << CreateSongItem(song); } } else if (type == "playlist") { QMap origin_map = activity["origin"].toMap(); QStandardItem* playlist_item = CreatePlaylistItem(origin_map["title"].toString()); activities << playlist_item; RetrievePlaylist(origin_map["id"].toInt(), playlist_item); } } return activities; } SongList SoundCloudService::ExtractSongs(const QVariant& result) { SongList songs; QVariantList q_variant_list = result.toList(); for (const QVariant& q : q_variant_list) { Song song = ExtractSong(q.toMap()); if (song.is_valid()) { songs << song; } } return songs; } Song SoundCloudService::ExtractSong(const QVariantMap& result_song) { Song song; if (!result_song.isEmpty() && result_song["streamable"].toBool()) { QUrl stream_url = result_song["stream_url"].toUrl(); stream_url.addQueryItem("client_id", kApiClientId); song.set_url(stream_url); QString username = result_song["user"].toMap()["username"].toString(); // We don't have a real artist name, but username is the most similar thing // we have song.set_artist(username); QString title = result_song["title"].toString(); song.set_title(title); QString genre = result_song["genre"].toString(); song.set_genre(genre); float bpm = result_song["bpm"].toFloat(); song.set_bpm(bpm); QVariant cover = result_song["artwork_url"]; if (cover.isValid()) { // Increase cover size. // See https://developers.soundcloud.com/docs/api/reference#artwork_url QString big_cover = cover.toString().replace("large", "t500x500"); QUrl cover_url(big_cover, QUrl::StrictMode); // SoundCloud covers URL are https, but our cover loader doesn't seem to // deal well with https URL. Anyway, we don't need a secure connection to // get a cover image. cover_url.setScheme("http"); song.set_art_automatic(cover_url.toEncoded()); } int playcount = result_song["playback_count"].toInt(); song.set_playcount(playcount); int year = result_song["release_year"].toInt(); song.set_year(year); QVariant q_duration = result_song["duration"]; quint64 duration = q_duration.toULongLong() * kNsecPerMsec; song.set_length_nanosec(duration); song.set_valid(true); } return song; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/soundcloud/soundcloudservice.h000066400000000000000000000105351260417502300301020ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, 2014, Arnaud Bienner Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_SOUNDCLOUD_SOUNDCLOUDSERVICE_H_ #define INTERNET_SOUNDCLOUD_SOUNDCLOUDSERVICE_H_ #include "internet/core/internetmodel.h" #include "internet/core/internetservice.h" class NetworkAccessManager; class OAuthenticator; class SearchBoxWidget; class QMenu; class QNetworkReply; class SoundCloudService : public InternetService { Q_OBJECT public: SoundCloudService(Application* app, InternetModel* parent); ~SoundCloudService(); // Internet Service methods QStandardItem* CreateRootItem(); void LazyPopulate(QStandardItem* parent); // TODO(Arnaud Bienner) // QList playlistitem_actions(const Song& song); void ShowContextMenu(const QPoint& global_pos); QWidget* HeaderWidget() const; void Connect(); bool IsLoggedIn(); void Logout(); int SimpleSearch(const QString& query); static const char* kServiceName; static const char* kSettingsGroup; signals: void SimpleSearchResults(int id, SongList songs); void Connected(); public slots: void ShowConfig(); private slots: void ConnectFinished(OAuthenticator* oauth); void UserTracksRetrieved(QNetworkReply* reply); void UserActivitiesRetrieved(QNetworkReply* reply); void UserPlaylistsRetrieved(QNetworkReply* reply); void PlaylistRetrieved(QNetworkReply* reply, int request_id); void Search(const QString& text, bool now = false); void DoSearch(); void SearchFinished(QNetworkReply* reply, int task); void SimpleSearchFinished(QNetworkReply* reply, int id); void Homepage(); private: struct PlaylistInfo { PlaylistInfo() {} PlaylistInfo(int id, QStandardItem* item) : id_(id), item_(item) {} int id_; QStandardItem* item_; }; // Try to load "access_token" from preferences if the current access_token's // value is empty void LoadAccessTokenIfEmpty(); void RetrieveUserData(); void RetrieveUserTracks(); void RetrieveUserActivities(); void RetrieveUserPlaylists(); void RetrievePlaylist(int playlist_id, QStandardItem* playlist_item); void ClearSearchResults(); void EnsureItemsCreated(); void EnsureMenuCreated(); QStandardItem* CreatePlaylistItem(const QString& playlist_name); QNetworkReply* CreateRequest(const QString& ressource_name, const QList>& params); // Convenient function for extracting result from reply QVariant ExtractResult(QNetworkReply* reply); // Returns items directly, as activities can be playlists or songs QList ExtractActivities(const QVariant& result); SongList ExtractSongs(const QVariant& result); Song ExtractSong(const QVariantMap& result_song); QStandardItem* root_; QStandardItem* search_; QStandardItem* user_tracks_; QStandardItem* user_playlists_; QStandardItem* user_activities_; NetworkAccessManager* network_; QMenu* context_menu_; SearchBoxWidget* search_box_; QTimer* search_delay_; QString pending_search_; // Request IDs int next_pending_search_id_; int next_retrieve_playlist_id_; QMap pending_playlists_requests_; QByteArray api_key_; QString access_token_; QDateTime expiry_time_; static const char* kUrl; static const char* kOAuthEndpoint; static const char* kOAuthTokenEndpoint; static const char* kOAuthScope; static const char* kHomepage; static const int kSongSearchLimit; static const int kSongSimpleSearchLimit; static const int kSearchDelayMsec; static const char* kApiClientId; static const char* kApiClientSecret; }; #endif // INTERNET_SOUNDCLOUD_SOUNDCLOUDSERVICE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/soundcloud/soundcloudsettingspage.cpp000066400000000000000000000047011260417502300314700ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Arnaud Bienner Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "soundcloudservice.h" #include "soundcloudsettingspage.h" #include "ui_soundcloudsettingspage.h" #include "core/application.h" #include "internet/core/internetmodel.h" SoundCloudSettingsPage::SoundCloudSettingsPage(SettingsDialog* parent) : SettingsPage(parent), ui_(new Ui::SoundCloudSettingsPage), service_( dialog()->app()->internet_model()->Service()) { ui_->setupUi(this); ui_->login_state->AddCredentialGroup(ui_->login_container); connect(ui_->login_button, SIGNAL(clicked()), SLOT(LoginClicked())); connect(ui_->login_state, SIGNAL(LogoutClicked()), SLOT(LogoutClicked())); connect(service_, SIGNAL(Connected()), SLOT(Connected())); dialog()->installEventFilter(this); } SoundCloudSettingsPage::~SoundCloudSettingsPage() { delete ui_; } void SoundCloudSettingsPage::Load() { if (service_->IsLoggedIn()) { ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedIn); } } void SoundCloudSettingsPage::Save() { // Everything is done in the service: nothing to do here } void SoundCloudSettingsPage::LoginClicked() { service_->Connect(); ui_->login_button->setEnabled(false); } bool SoundCloudSettingsPage::eventFilter(QObject* object, QEvent* event) { if (object == dialog() && event->type() == QEvent::Enter) { ui_->login_button->setEnabled(true); return false; } return SettingsPage::eventFilter(object, event); } void SoundCloudSettingsPage::LogoutClicked() { service_->Logout(); ui_->login_button->setEnabled(true); ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedOut); } void SoundCloudSettingsPage::Connected() { ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedIn); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/soundcloud/soundcloudsettingspage.h000066400000000000000000000027141260417502300311370ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Arnaud Bienner Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_SOUNDCLOUD_SOUNDCLOUDSETTINGSPAGE_H_ #define INTERNET_SOUNDCLOUD_SOUNDCLOUDSETTINGSPAGE_H_ #include "ui/settingspage.h" class SoundCloudService; class Ui_SoundCloudSettingsPage; class SoundCloudSettingsPage : public SettingsPage { Q_OBJECT public: explicit SoundCloudSettingsPage(SettingsDialog* parent = nullptr); ~SoundCloudSettingsPage(); void Load(); void Save(); // QObject bool eventFilter(QObject* object, QEvent* event); private slots: void LoginClicked(); void LogoutClicked(); void Connected(); private: Ui_SoundCloudSettingsPage* ui_; SoundCloudService* service_; }; #endif // INTERNET_SOUNDCLOUD_SOUNDCLOUDSETTINGSPAGE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/soundcloud/soundcloudsettingspage.ui000066400000000000000000000061611260417502300313250ustar00rootroot00000000000000 SoundCloudSettingsPage 0 0 569 491 SoundCloud :/providers/soundcloud.png:/providers/soundcloud.png true You don't need to be logged in to search and to listen to music on SoundCloud. However, you need to login to access your playlists and your stream. true 28 0 0 Login Qt::Horizontal 40 20 Clicking the Login button will open a web browser. You should return to Clementine after you have logged in. true Qt::Vertical 20 357 LoginStateWidget QWidget
widgets/loginstatewidget.h
1
clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/spotify/000077500000000000000000000000001260417502300235035ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/spotify/spotifyblobdownloader.cpp000066400000000000000000000177361260417502300306400ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011-2012, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "spotifyblobdownloader.h" #include "config.h" #include "spotifyservice.h" #include "core/arraysize.h" #include "core/logging.h" #include "core/network.h" #include "core/utilities.h" #include #include #include #include #include #include #include #include #ifdef Q_OS_UNIX #include #endif #ifdef HAVE_CRYPTOPP #include #include #endif // HAVE_CRYPTOPP const char* SpotifyBlobDownloader::kSignatureSuffix = ".sha512"; SpotifyBlobDownloader::SpotifyBlobDownloader(const QString& version, const QString& path, QObject* parent) : QObject(parent), version_(version), path_(path), network_(new NetworkAccessManager(this)), progress_(new QProgressDialog(tr("Downloading Spotify plugin"), tr("Cancel"), 0, 0)) { progress_->setWindowTitle(QCoreApplication::applicationName()); connect(progress_, SIGNAL(canceled()), SLOT(Cancel())); } SpotifyBlobDownloader::~SpotifyBlobDownloader() { qDeleteAll(replies_); replies_.clear(); delete progress_; } bool SpotifyBlobDownloader::Prompt() { QMessageBox::StandardButton ret = QMessageBox::question( nullptr, tr("Spotify plugin not installed"), tr("An additional plugin is required to use Spotify in Clementine. " "Would you like to download and install it now?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); return ret == QMessageBox::Yes; } void SpotifyBlobDownloader::Start() { qDeleteAll(replies_); replies_.clear(); const QStringList filenames = QStringList() << "blob" << "blob" + QString(kSignatureSuffix) << "libspotify.so.12.1.45" << "libspotify.so.12.1.45" + QString(kSignatureSuffix); for (const QString& filename : filenames) { const QUrl url(SpotifyService::kBlobDownloadUrl + version_ + "/" + filename); qLog(Info) << "Downloading" << url; QNetworkReply* reply = network_->get(QNetworkRequest(url)); connect(reply, SIGNAL(finished()), SLOT(ReplyFinished())); connect(reply, SIGNAL(downloadProgress(qint64, qint64)), SLOT(ReplyProgress())); replies_ << reply; } progress_->show(); } void SpotifyBlobDownloader::ReplyFinished() { QNetworkReply* reply = qobject_cast(sender()); if (reply->error() != QNetworkReply::NoError) { // Handle network errors ShowError(reply->errorString()); return; } // Is everything finished? for (QNetworkReply* reply : replies_) { if (!reply->isFinished()) { return; } } // Read files into memory first. QMap file_data; QStringList signature_filenames; for (QNetworkReply* reply : replies_) { const QString filename = reply->url().path().section('/', -1, -1); if (filename.endsWith(kSignatureSuffix)) { signature_filenames << filename; } file_data[filename] = reply->readAll(); } if (!CheckSignature(file_data, signature_filenames)) { qLog(Warning) << "Signature checks failed"; return; } // Make the destination directory and write the files into it QDir().mkpath(path_); for (const QString& filename : file_data.keys()) { const QString dest_path = path_ + "/" + filename; if (filename.endsWith(kSignatureSuffix)) continue; qLog(Info) << "Writing" << dest_path; QFile file(dest_path); if (!file.open(QIODevice::WriteOnly)) { ShowError("Failed to open " + dest_path + " for writing"); return; } file.write(file_data[filename]); file.close(); file.setPermissions(QFile::Permissions(0x7755)); #ifdef Q_OS_UNIX const int so_pos = filename.lastIndexOf(".so."); if (so_pos != -1) { QString link_path = path_ + "/" + filename.left(so_pos + 3); QStringList version_parts = filename.mid(so_pos + 4).split('.'); while (!version_parts.isEmpty()) { qLog(Debug) << "Linking" << dest_path << "to" << link_path; int ret = symlink(dest_path.toLocal8Bit().constData(), link_path.toLocal8Bit().constData()); if (ret != 0) { qLog(Warning) << "Creating symlink failed with return code" << ret; } link_path += "." + version_parts.takeFirst(); } } #endif // Q_OS_UNIX } EmitFinished(); } bool SpotifyBlobDownloader::CheckSignature( const QMap& file_data, const QStringList& signature_filenames) { #ifdef HAVE_CRYPTOPP QFile public_key_file(":/clementine-spotify-public.pem"); public_key_file.open(QIODevice::ReadOnly); const QByteArray public_key_data = ConvertPEMToDER(public_key_file.readAll()); try { CryptoPP::ByteQueue bytes; bytes.Put(reinterpret_cast(public_key_data.constData()), public_key_data.size()); bytes.MessageEnd(); CryptoPP::RSA::PublicKey public_key; public_key.Load(bytes); CryptoPP::RSASS::Verifier verifier( public_key); for (const QString& signature_filename : signature_filenames) { QString actual_filename = signature_filename; actual_filename.remove(kSignatureSuffix); const bool result = verifier.VerifyMessage( reinterpret_cast(file_data[actual_filename].constData()), file_data[actual_filename].size(), reinterpret_cast( file_data[signature_filename].constData()), file_data[signature_filename].size()); qLog(Debug) << "Verifying" << actual_filename << "against" << signature_filename << result; if (!result) { ShowError("Invalid signature: " + actual_filename); return false; } } } catch (std::exception e) { // This should only happen if we fail to parse our own key. qLog(Debug) << "Verifying spotify blob signature failed:" << e.what(); return false; } return true; #else return false; #endif // HAVE_CRYPTOPP } QByteArray SpotifyBlobDownloader::ConvertPEMToDER(const QByteArray& pem) { QSslKey key(pem, QSsl::Rsa, QSsl::Pem, QSsl::PublicKey); Q_ASSERT(!key.isNull()); return key.toDer(); } void SpotifyBlobDownloader::ReplyProgress() { int progress = 0; int total = 0; for (QNetworkReply* reply : replies_) { progress += reply->bytesAvailable(); total += reply->rawHeader("Content-Length").toInt(); } progress_->setMaximum(total); progress_->setValue(progress); } void SpotifyBlobDownloader::Cancel() { deleteLater(); } void SpotifyBlobDownloader::ShowError(const QString& message) { // Stop any remaining replies before showing the dialog so they don't // carry on in the background for (QNetworkReply* reply : replies_) { disconnect(reply, 0, this, 0); reply->abort(); } qLog(Warning) << message; QMessageBox::warning(nullptr, tr("Error downloading Spotify plugin"), message, QMessageBox::Close); deleteLater(); } void SpotifyBlobDownloader::EmitFinished() { emit Finished(); deleteLater(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/spotify/spotifyblobdownloader.h000066400000000000000000000036231260417502300302730ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_SPOTIFY_SPOTIFYBLOBDOWNLOADER_H_ #define INTERNET_SPOTIFY_SPOTIFYBLOBDOWNLOADER_H_ #include #include class QNetworkAccessManager; class QNetworkReply; class QProgressDialog; class SpotifyBlobDownloader : public QObject { Q_OBJECT public: SpotifyBlobDownloader(const QString& version, const QString& path, QObject* parent = nullptr); ~SpotifyBlobDownloader(); static const char* kSignatureSuffix; static bool Prompt(); void Start(); signals: void Finished(); private slots: void ReplyFinished(); void ReplyProgress(); void Cancel(); private: void ShowError(const QString& message); void EmitFinished(); bool CheckSignature(const QMap& file_data, const QStringList& signature_filenames); static QByteArray ConvertPEMToDER(const QByteArray& pem); private: QString version_; QString path_; QNetworkAccessManager* network_; QList replies_; QProgressDialog* progress_; }; #endif // INTERNET_SPOTIFY_SPOTIFYBLOBDOWNLOADER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/spotify/spotifyserver.cpp000066400000000000000000000255711260417502300271450ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011-2012, 2014, John Maguire Copyright 2011-2012, 2014, David Sansome Copyright 2014, Arnaud Bienner Copyright 2014, pie.or.paj Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "spotifyserver.h" #include #include #include #include #include "core/closure.h" #include "core/logging.h" #include "spotifymessages.pb.h" SpotifyServer::SpotifyServer(QObject* parent) : AbstractMessageHandler(nullptr, parent), server_(new QTcpServer(this)), logged_in_(false) { connect(server_, SIGNAL(newConnection()), SLOT(NewConnection())); } void SpotifyServer::Init() { if (!server_->listen(QHostAddress::LocalHost)) { qLog(Error) << "Couldn't open server socket" << server_->errorString(); } } int SpotifyServer::server_port() const { return server_->serverPort(); } void SpotifyServer::NewConnection() { QTcpSocket* socket = server_->nextPendingConnection(); SetDevice(socket); qLog(Info) << "Connection from port" << socket->peerPort(); // Send any login messages that were queued before the client connected for (const pb::spotify::Message& message : queued_login_messages_) { SendOrQueueMessage(message); } queued_login_messages_.clear(); // Don't take any more connections from clients disconnect(server_, SIGNAL(newConnection()), this, 0); } void SpotifyServer::SendOrQueueMessage(const pb::spotify::Message& message) { const bool is_login_message = message.has_login_request(); QList* queue = is_login_message ? &queued_login_messages_ : &queued_messages_; if (!device_ || (!is_login_message && !logged_in_)) { queue->append(message); } else { SendMessage(message); } } void SpotifyServer::Login(const QString& username, const QString& password, pb::spotify::Bitrate bitrate, bool volume_normalisation) { pb::spotify::Message message; pb::spotify::LoginRequest* request = message.mutable_login_request(); request->set_username(DataCommaSizeFromQString(username)); if (!password.isEmpty()) { request->set_password(DataCommaSizeFromQString(password)); } request->mutable_playback_settings()->set_bitrate(bitrate); request->mutable_playback_settings()->set_volume_normalisation( volume_normalisation); SendOrQueueMessage(message); } void SpotifyServer::SetPlaybackSettings(pb::spotify::Bitrate bitrate, bool volume_normalisation) { pb::spotify::Message message; pb::spotify::PlaybackSettings* request = message.mutable_set_playback_settings_request(); request->set_bitrate(bitrate); request->set_volume_normalisation(volume_normalisation); SendOrQueueMessage(message); } void SpotifyServer::MessageArrived(const pb::spotify::Message& message) { if (message.has_login_response()) { const pb::spotify::LoginResponse& response = message.login_response(); logged_in_ = response.success(); if (response.success()) { // Send any messages that were queued before the client logged in for (const pb::spotify::Message& message : queued_messages_) { SendOrQueueMessage(message); } queued_messages_.clear(); } emit LoginCompleted(response.success(), QStringFromStdString(response.error()), response.error_code()); } else if (message.has_playlists_updated()) { emit PlaylistsUpdated(message.playlists_updated()); } else if (message.has_load_playlist_response()) { const pb::spotify::LoadPlaylistResponse& response = message.load_playlist_response(); switch (response.request().type()) { case pb::spotify::Inbox: emit InboxLoaded(response); break; case pb::spotify::Starred: emit StarredLoaded(response); break; case pb::spotify::UserPlaylist: emit UserPlaylistLoaded(response); break; } } else if (message.has_playback_error()) { emit PlaybackError(QStringFromStdString(message.playback_error().error())); } else if (message.has_search_response()) { emit SearchResults(message.search_response()); } else if (message.has_image_response()) { const pb::spotify::ImageResponse& response = message.image_response(); const QString id = QStringFromStdString(response.id()); if (response.has_data()) { emit ImageLoaded( id, QImage::fromData( QByteArray(response.data().data(), response.data().size()))); } else { emit ImageLoaded(id, QImage()); } } else if (message.has_sync_playlist_progress()) { emit SyncPlaylistProgress(message.sync_playlist_progress()); } else if (message.has_browse_album_response()) { emit AlbumBrowseResults(message.browse_album_response()); } else if (message.has_browse_toplist_response()) { emit ToplistBrowseResults(message.browse_toplist_response()); } } void SpotifyServer::LoadPlaylist(pb::spotify::PlaylistType type, int index) { pb::spotify::Message message; pb::spotify::LoadPlaylistRequest* req = message.mutable_load_playlist_request(); req->set_type(type); if (index != -1) { req->set_user_playlist_index(index); } SendOrQueueMessage(message); } void SpotifyServer::SyncPlaylist(pb::spotify::PlaylistType type, int index, bool offline) { pb::spotify::Message message; pb::spotify::SyncPlaylistRequest* req = message.mutable_sync_playlist_request(); req->mutable_request()->set_type(type); if (index != -1) { req->mutable_request()->set_user_playlist_index(index); } req->set_offline_sync(offline); SendOrQueueMessage(message); } void SpotifyServer::SyncInbox() { SyncPlaylist(pb::spotify::Inbox, -1, true); } void SpotifyServer::SyncStarred() { SyncPlaylist(pb::spotify::Starred, -1, true); } void SpotifyServer::SyncUserPlaylist(int index) { Q_ASSERT(index >= 0); SyncPlaylist(pb::spotify::UserPlaylist, index, true); } void SpotifyServer::LoadInbox() { LoadPlaylist(pb::spotify::Inbox); } void SpotifyServer::LoadStarred() { LoadPlaylist(pb::spotify::Starred); } void SpotifyServer::LoadUserPlaylist(int index) { Q_ASSERT(index >= 0); LoadPlaylist(pb::spotify::UserPlaylist, index); } void SpotifyServer::AddSongsToStarred(const QList& songs_urls) { AddSongsToPlaylist(pb::spotify::Starred, songs_urls); } void SpotifyServer::AddSongsToUserPlaylist(int playlist_index, const QList& songs_urls) { AddSongsToPlaylist(pb::spotify::UserPlaylist, songs_urls, playlist_index); } void SpotifyServer::AddSongsToPlaylist( const pb::spotify::PlaylistType playlist_type, const QList& songs_urls, int playlist_index) { pb::spotify::Message message; pb::spotify::AddTracksToPlaylistRequest* req = message.mutable_add_tracks_to_playlist(); req->set_playlist_type(playlist_type); req->set_playlist_index(playlist_index); for (const QUrl& song_url : songs_urls) { req->add_track_uri(DataCommaSizeFromQString(song_url.toString())); } SendOrQueueMessage(message); } void SpotifyServer::RemoveSongsFromStarred( const QList& songs_indices_to_remove) { RemoveSongsFromPlaylist(pb::spotify::Starred, songs_indices_to_remove); } void SpotifyServer::RemoveSongsFromUserPlaylist( int playlist_index, const QList& songs_indices_to_remove) { RemoveSongsFromPlaylist(pb::spotify::UserPlaylist, songs_indices_to_remove, playlist_index); } void SpotifyServer::RemoveSongsFromPlaylist( const pb::spotify::PlaylistType playlist_type, const QList& songs_indices_to_remove, int playlist_index) { pb::spotify::Message message; pb::spotify::RemoveTracksFromPlaylistRequest* req = message.mutable_remove_tracks_from_playlist(); req->set_playlist_type(playlist_type); if (playlist_type == pb::spotify::UserPlaylist) { req->set_playlist_index(playlist_index); } for (int song_index : songs_indices_to_remove) { req->add_track_index(song_index); } SendOrQueueMessage(message); } void SpotifyServer::StartPlaybackLater(const QString& uri, quint16 port) { QTimer* timer = new QTimer(this); connect(timer, SIGNAL(timeout()), timer, SLOT(deleteLater())); timer->start(100); // lol NewClosure(timer, SIGNAL(timeout()), this, SLOT(StartPlayback(QString, quint16)), uri, port); } void SpotifyServer::StartPlayback(const QString& uri, quint16 port) { pb::spotify::Message message; pb::spotify::PlaybackRequest* req = message.mutable_playback_request(); req->set_track_uri(DataCommaSizeFromQString(uri)); req->set_media_port(port); SendOrQueueMessage(message); } void SpotifyServer::Seek(qint64 offset_nsec) { pb::spotify::Message message; pb::spotify::SeekRequest* req = message.mutable_seek_request(); req->set_offset_nsec(offset_nsec); SendOrQueueMessage(message); } void SpotifyServer::Search(const QString& text, int limit, int limit_album) { pb::spotify::Message message; pb::spotify::SearchRequest* req = message.mutable_search_request(); req->set_query(DataCommaSizeFromQString(text)); req->set_limit(limit); req->set_limit_album(limit_album); SendOrQueueMessage(message); } void SpotifyServer::LoadImage(const QString& id) { pb::spotify::Message message; pb::spotify::ImageRequest* req = message.mutable_image_request(); req->set_id(DataCommaSizeFromQString(id)); SendOrQueueMessage(message); } void SpotifyServer::AlbumBrowse(const QString& uri) { pb::spotify::Message message; pb::spotify::BrowseAlbumRequest* req = message.mutable_browse_album_request(); req->set_uri(DataCommaSizeFromQString(uri)); SendOrQueueMessage(message); } void SpotifyServer::LoadToplist() { pb::spotify::Message message; pb::spotify::BrowseToplistRequest* req = message.mutable_browse_toplist_request(); req->set_type(pb::spotify::BrowseToplistRequest::Tracks); req->set_region(pb::spotify::BrowseToplistRequest::Everywhere); SendOrQueueMessage(message); } void SpotifyServer::SetPaused(const bool paused) { pb::spotify::Message message; pb::spotify::PauseRequest* req = message.mutable_pause_request(); req->set_paused(paused); SendOrQueueMessage(message); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/spotify/spotifyserver.h000066400000000000000000000105231260417502300266010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011-2012, 2014, John Maguire Copyright 2011-2012, 2014, David Sansome Copyright 2014, Arnaud Bienner Copyright 2014, pie.or.paj Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_SPOTIFY_SPOTIFYSERVER_H_ #define INTERNET_SPOTIFY_SPOTIFYSERVER_H_ #include "spotifymessages.pb.h" #include "core/messagehandler.h" #include #include class QTcpServer; class QTcpSocket; class SpotifyServer : public AbstractMessageHandler { Q_OBJECT public: explicit SpotifyServer(QObject* parent = nullptr); void Init(); void Login(const QString& username, const QString& password, pb::spotify::Bitrate bitrate, bool volume_normalisation); void LoadStarred(); void SyncStarred(); void LoadInbox(); void SyncInbox(); void LoadUserPlaylist(int index); void SyncUserPlaylist(int index); void AddSongsToStarred(const QList& songs_urls); void AddSongsToUserPlaylist(int playlist_index, const QList& songs_urls); void RemoveSongsFromUserPlaylist(int playlist_index, const QList& songs_indices_to_remove); void RemoveSongsFromStarred(const QList& songs_indices_to_remove); void StartPlaybackLater(const QString& uri, quint16 port); void Search(const QString& text, int limit, int limit_album = 0); void LoadImage(const QString& id); void AlbumBrowse(const QString& uri); void SetPlaybackSettings(pb::spotify::Bitrate bitrate, bool volume_normalisation); void LoadToplist(); void SetPaused(const bool paused); int server_port() const; public slots: void StartPlayback(const QString& uri, quint16 port); void Seek(qint64 offset_nsec); signals: void LoginCompleted(bool success, const QString& error, pb::spotify::LoginResponse_Error error_code); void PlaylistsUpdated(const pb::spotify::Playlists& playlists); void StarredLoaded(const pb::spotify::LoadPlaylistResponse& response); void InboxLoaded(const pb::spotify::LoadPlaylistResponse& response); void UserPlaylistLoaded(const pb::spotify::LoadPlaylistResponse& response); void PlaybackError(const QString& message); void SearchResults(const pb::spotify::SearchResponse& response); void ImageLoaded(const QString& id, const QImage& image); void SyncPlaylistProgress(const pb::spotify::SyncPlaylistProgress& progress); void AlbumBrowseResults(const pb::spotify::BrowseAlbumResponse& response); void ToplistBrowseResults(const pb::spotify::BrowseToplistResponse& response); protected: void MessageArrived(const pb::spotify::Message& message); private slots: void NewConnection(); private: void LoadPlaylist(pb::spotify::PlaylistType type, int index = -1); void SyncPlaylist(pb::spotify::PlaylistType type, int index, bool offline); void AddSongsToPlaylist(const pb::spotify::PlaylistType playlist_type, const QList& songs_urls, // Used iff type is user_playlist int playlist_index = -1); void RemoveSongsFromPlaylist(const pb::spotify::PlaylistType playlist_type, const QList& songs_indices_to_remove, // Used iff type is user_playlist int playlist_index = -1); void SendOrQueueMessage(const pb::spotify::Message& message); QTcpServer* server_; bool logged_in_; QList queued_login_messages_; QList queued_messages_; }; #endif // INTERNET_SPOTIFY_SPOTIFYSERVER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/spotify/spotifyservice.cpp000066400000000000000000000772551260417502300273050ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011-2014, David Sansome Copyright 2011, Tyler Rhodes Copyright 2011-2012, 2014, John Maguire Copyright 2012, 2014, Arnaud Bienner Copyright 2014, Chocobozzz Copyright 2014, pie.or.paj Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "spotifyservice.h" #include #include #include #include #include #include #include #include #include #include "blobversion.h" #include "config.h" #include "internet/core/internetmodel.h" #include "internet/core/searchboxwidget.h" #include "spotifyserver.h" #include "core/application.h" #include "core/database.h" #include "core/logging.h" #include "core/mergedproxymodel.h" #include "core/player.h" #include "core/taskmanager.h" #include "core/timeconstants.h" #include "core/utilities.h" #include "globalsearch/globalsearch.h" #include "globalsearch/spotifysearchprovider.h" #include "playlist/playlist.h" #include "playlist/playlistcontainer.h" #include "playlist/playlistmanager.h" #include "ui/iconloader.h" #include "widgets/didyoumean.h" #ifdef HAVE_SPOTIFY_DOWNLOADER #include "spotifyblobdownloader.h" #endif Q_DECLARE_METATYPE(QStandardItem*); const char* SpotifyService::kServiceName = "Spotify"; const char* SpotifyService::kSettingsGroup = "Spotify"; const char* SpotifyService::kBlobDownloadUrl = "http://spotify.clementine-player.org/"; const int SpotifyService::kSearchDelayMsec = 400; SpotifyService::SpotifyService(Application* app, InternetModel* parent) : InternetService(kServiceName, app, parent, parent), server_(nullptr), blob_process_(nullptr), root_(nullptr), search_(nullptr), starred_(nullptr), inbox_(nullptr), toplist_(nullptr), login_task_id_(0), context_menu_(nullptr), playlist_context_menu_(nullptr), song_context_menu_(nullptr), playlist_sync_action_(nullptr), get_url_to_share_playlist_(nullptr), remove_from_playlist_(nullptr), search_box_(new SearchBoxWidget(this)), search_delay_(new QTimer(this)), login_state_(LoginState_OtherError), bitrate_(pb::spotify::Bitrate320k), volume_normalisation_(false) { // Build the search path for the binary blob. // Look for one distributed alongside clementine first, then check in the // user's home directory for any that have been downloaded. #ifdef Q_OS_MAC system_blob_path_ = QCoreApplication::applicationDirPath() + "/../PlugIns/clementine-spotifyblob"; #else system_blob_path_ = QCoreApplication::applicationDirPath() + "/clementine-spotifyblob" CMAKE_EXECUTABLE_SUFFIX; #endif local_blob_version_ = QString("version%1-%2bit") .arg(SPOTIFY_BLOB_VERSION) .arg(sizeof(void*) * 8); local_blob_path_ = Utilities::GetConfigPath(Utilities::Path_LocalSpotifyBlob) + "/" + local_blob_version_ + "/blob"; qLog(Debug) << "Spotify system blob path:" << system_blob_path_; qLog(Debug) << "Spotify local blob path:" << local_blob_path_; app_->global_search()->AddProvider(new SpotifySearchProvider(app_, this)); search_delay_->setInterval(kSearchDelayMsec); search_delay_->setSingleShot(true); connect(search_delay_, SIGNAL(timeout()), SLOT(DoSearch())); connect(search_box_, SIGNAL(TextChanged(QString)), SLOT(Search(QString))); } SpotifyService::~SpotifyService() { if (blob_process_ && blob_process_->state() == QProcess::Running) { qLog(Info) << "Terminating blob process..."; blob_process_->terminate(); blob_process_->waitForFinished(1000); } } QStandardItem* SpotifyService::CreateRootItem() { root_ = new QStandardItem(QIcon(":icons/22x22/spotify.png"), kServiceName); root_->setData(true, InternetModel::Role_CanLazyLoad); return root_; } void SpotifyService::LazyPopulate(QStandardItem* item) { switch (item->data(InternetModel::Role_Type).toInt()) { case InternetModel::Type_Service: EnsureServerCreated(); break; case Type_SearchResults: break; case Type_InboxPlaylist: EnsureServerCreated(); server_->LoadInbox(); break; case Type_StarredPlaylist: EnsureServerCreated(); server_->LoadStarred(); break; case InternetModel::Type_UserPlaylist: EnsureServerCreated(); server_->LoadUserPlaylist(item->data(Role_UserPlaylistIndex).toInt()); break; case Type_Toplist: EnsureServerCreated(); server_->LoadToplist(); break; default: break; } return; } void SpotifyService::Login(const QString& username, const QString& password) { Logout(); EnsureServerCreated(username, password); } void SpotifyService::LoginCompleted( bool success, const QString& error, pb::spotify::LoginResponse_Error error_code) { if (login_task_id_) { app_->task_manager()->SetTaskFinished(login_task_id_); login_task_id_ = 0; } if (!success) { bool show_error_dialog = true; QString error_copy(error); switch (error_code) { case pb::spotify::LoginResponse_Error_BadUsernameOrPassword: login_state_ = LoginState_BadCredentials; break; case pb::spotify::LoginResponse_Error_UserBanned: login_state_ = LoginState_Banned; break; case pb::spotify::LoginResponse_Error_UserNeedsPremium: login_state_ = LoginState_NoPremium; break; case pb::spotify::LoginResponse_Error_ReloginFailed: if (login_state_ == LoginState_LoggedIn) { // This is the first time the relogin has failed - show a message this // time only. error_copy = tr("You have been logged out of Spotify, please re-enter your " "password in the Settings dialog."); } else { show_error_dialog = false; } login_state_ = LoginState_ReloginFailed; break; default: login_state_ = LoginState_OtherError; break; } if (show_error_dialog) { QMessageBox::warning(nullptr, tr("Spotify login error"), error_copy, QMessageBox::Close); } } else { login_state_ = LoginState_LoggedIn; } QSettings s; s.beginGroup(kSettingsGroup); s.setValue("login_state", login_state_); emit LoginFinished(success); } void SpotifyService::BlobProcessError(QProcess::ProcessError error) { qLog(Error) << "Spotify blob process failed:" << error; blob_process_->deleteLater(); blob_process_ = nullptr; if (login_task_id_) { app_->task_manager()->SetTaskFinished(login_task_id_); } } void SpotifyService::ReloadSettings() { QSettings s; s.beginGroup(kSettingsGroup); login_state_ = LoginState(s.value("login_state", LoginState_OtherError).toInt()); bitrate_ = static_cast( s.value("bitrate", pb::spotify::Bitrate320k).toInt()); volume_normalisation_ = s.value("volume_normalisation", false).toBool(); if (server_ && blob_process_) { server_->SetPlaybackSettings(bitrate_, volume_normalisation_); } } void SpotifyService::EnsureServerCreated(const QString& username, const QString& password) { if (server_ && blob_process_) { return; } delete server_; server_ = new SpotifyServer(this); connect( server_, SIGNAL(LoginCompleted(bool, QString, pb::spotify::LoginResponse_Error)), SLOT(LoginCompleted(bool, QString, pb::spotify::LoginResponse_Error))); connect(server_, SIGNAL(PlaylistsUpdated(pb::spotify::Playlists)), SLOT(PlaylistsUpdated(pb::spotify::Playlists))); connect(server_, SIGNAL(InboxLoaded(pb::spotify::LoadPlaylistResponse)), SLOT(InboxLoaded(pb::spotify::LoadPlaylistResponse))); connect(server_, SIGNAL(StarredLoaded(pb::spotify::LoadPlaylistResponse)), SLOT(StarredLoaded(pb::spotify::LoadPlaylistResponse))); connect(server_, SIGNAL(UserPlaylistLoaded(pb::spotify::LoadPlaylistResponse)), SLOT(UserPlaylistLoaded(pb::spotify::LoadPlaylistResponse))); connect(server_, SIGNAL(PlaybackError(QString)), SIGNAL(StreamError(QString))); connect(server_, SIGNAL(SearchResults(pb::spotify::SearchResponse)), SLOT(SearchResults(pb::spotify::SearchResponse))); connect(server_, SIGNAL(ImageLoaded(QString, QImage)), SIGNAL(ImageLoaded(QString, QImage))); connect(server_, SIGNAL(SyncPlaylistProgress(pb::spotify::SyncPlaylistProgress)), SLOT(SyncPlaylistProgress(pb::spotify::SyncPlaylistProgress))); connect(server_, SIGNAL(ToplistBrowseResults(pb::spotify::BrowseToplistResponse)), SLOT(ToplistLoaded(pb::spotify::BrowseToplistResponse))); server_->Init(); login_task_id_ = app_->task_manager()->StartTask(tr("Connecting to Spotify")); QString login_username = username; QString login_password = password; if (username.isEmpty()) { QSettings s; s.beginGroup(kSettingsGroup); login_username = s.value("username").toString(); login_password = QString(); } server_->Login(login_username, login_password, bitrate_, volume_normalisation_); StartBlobProcess(); } void SpotifyService::StartBlobProcess() { // Try to find an executable to run QString blob_path; QProcessEnvironment env(QProcessEnvironment::systemEnvironment()); // Look in the system search path first if (QFile::exists(system_blob_path_)) { blob_path = system_blob_path_; } // Next look in the local path if (blob_path.isEmpty()) { if (QFile::exists(local_blob_path_)) { blob_path = local_blob_path_; env.insert("LD_LIBRARY_PATH", QFileInfo(local_blob_path_).path()); } } if (blob_path.isEmpty()) { // If the blob still wasn't found then we'll prompt the user to download one if (login_task_id_) { app_->task_manager()->SetTaskFinished(login_task_id_); } #ifdef HAVE_SPOTIFY_DOWNLOADER if (SpotifyBlobDownloader::Prompt()) { InstallBlob(); } #endif return; } delete blob_process_; blob_process_ = new QProcess(this); blob_process_->setProcessChannelMode(QProcess::ForwardedChannels); blob_process_->setProcessEnvironment(env); connect(blob_process_, SIGNAL(error(QProcess::ProcessError)), SLOT(BlobProcessError(QProcess::ProcessError))); qLog(Info) << "Starting" << blob_path; blob_process_->start( blob_path, QStringList() << QString::number(server_->server_port())); } bool SpotifyService::IsBlobInstalled() const { return QFile::exists(system_blob_path_) || QFile::exists(local_blob_path_); } void SpotifyService::InstallBlob() { #ifdef HAVE_SPOTIFY_DOWNLOADER // The downloader deletes itself when it finishes SpotifyBlobDownloader* downloader = new SpotifyBlobDownloader( local_blob_version_, QFileInfo(local_blob_path_).path(), this); connect(downloader, SIGNAL(Finished()), SLOT(BlobDownloadFinished())); connect(downloader, SIGNAL(Finished()), SIGNAL(BlobStateChanged())); downloader->Start(); #endif // HAVE_SPOTIFY_DOWNLOADER } void SpotifyService::BlobDownloadFinished() { EnsureServerCreated(); } void SpotifyService::AddCurrentSongToUserPlaylist(QAction* action) { int playlist_index = action->data().toInt(); AddSongsToUserPlaylist(playlist_index, QList() << current_song_url_); } void SpotifyService::AddSongsToUserPlaylist(int playlist_index, const QList& songs_urls) { EnsureServerCreated(); server_->AddSongsToUserPlaylist(playlist_index, songs_urls); } void SpotifyService::AddCurrentSongToStarredPlaylist() { AddSongsToStarred(QList() << current_song_url_); } void SpotifyService::AddSongsToStarred(const QList& songs_urls) { EnsureMenuCreated(); server_->AddSongsToStarred(songs_urls); } void SpotifyService::PlaylistsUpdated(const pb::spotify::Playlists& response) { if (login_task_id_) { app_->task_manager()->SetTaskFinished(login_task_id_); login_task_id_ = 0; } // Create starred and inbox playlists if they're not here already if (!search_) { search_ = new QStandardItem(IconLoader::Load("edit-find"), tr("Search results")); search_->setToolTip( tr("Start typing something on the search box above to " "fill this search results list")); search_->setData(Type_SearchResults, InternetModel::Role_Type); search_->setData(InternetModel::PlayBehaviour_MultipleItems, InternetModel::Role_PlayBehaviour); starred_ = new QStandardItem(QIcon(":/star-on.png"), tr("Starred")); starred_->setData(Type_StarredPlaylist, InternetModel::Role_Type); starred_->setData(true, InternetModel::Role_CanLazyLoad); starred_->setData(InternetModel::PlayBehaviour_MultipleItems, InternetModel::Role_PlayBehaviour); starred_->setData(true, InternetModel::Role_CanBeModified); inbox_ = new QStandardItem(IconLoader::Load("mail-message"), tr("Inbox")); inbox_->setData(Type_InboxPlaylist, InternetModel::Role_Type); inbox_->setData(true, InternetModel::Role_CanLazyLoad); inbox_->setData(InternetModel::PlayBehaviour_MultipleItems, InternetModel::Role_PlayBehaviour); toplist_ = new QStandardItem(QIcon(), tr("Top tracks")); toplist_->setData(Type_Toplist, InternetModel::Role_Type); toplist_->setData(true, InternetModel::Role_CanLazyLoad); toplist_->setData(InternetModel::PlayBehaviour_MultipleItems, InternetModel::Role_PlayBehaviour); root_->appendRow(search_); root_->appendRow(toplist_); root_->appendRow(starred_); root_->appendRow(inbox_); } else { // Always reset starred playlist // TODO: might be improved by including starred playlist in the response, // and reloading it only when needed, like other playlists. starred_->removeRows(0, starred_->rowCount()); LazyPopulate(starred_); } // Don't do anything if the playlists haven't changed since last time. if (!DoPlaylistsDiffer(response)) { qLog(Debug) << "Playlists haven't changed - not updating"; return; } qLog(Debug) << "Playlist have changed: updating"; // Remove and recreate the other playlists for (QStandardItem* item : playlists_) { item->parent()->removeRow(item->row()); } playlists_.clear(); for (int i = 0; i < response.playlist_size(); ++i) { const pb::spotify::Playlists::Playlist& msg = response.playlist(i); QString playlist_title = QStringFromStdString(msg.name()); if (!msg.is_mine()) { const std::string& owner = msg.owner(); playlist_title += tr(", by ") + QString::fromUtf8(owner.c_str(), owner.size()); } QStandardItem* item = new QStandardItem(playlist_title); item->setData(InternetModel::Type_UserPlaylist, InternetModel::Role_Type); item->setData(true, InternetModel::Role_CanLazyLoad); item->setData(msg.index(), Role_UserPlaylistIndex); item->setData(msg.is_mine(), InternetModel::Role_CanBeModified); item->setData(InternetModel::PlayBehaviour_MultipleItems, InternetModel::Role_PlayBehaviour); item->setData(QUrl(QStringFromStdString(msg.uri())), InternetModel::Role_Url); root_->appendRow(item); playlists_ << item; // Preload the playlist items so that drag & drop works immediately. LazyPopulate(item); } } bool SpotifyService::DoPlaylistsDiffer( const pb::spotify::Playlists& response) const { if (playlists_.count() != response.playlist_size()) { return true; } for (int i = 0; i < response.playlist_size(); ++i) { const pb::spotify::Playlists::Playlist& msg = response.playlist(i); const QStandardItem* item = PlaylistBySpotifyIndex(msg.index()); if (!item) { return true; } if (QStringFromStdString(msg.name()) != item->text()) { return true; } if (msg.nb_tracks() != item->rowCount()) { return true; } } return false; } void SpotifyService::InboxLoaded( const pb::spotify::LoadPlaylistResponse& response) { if (inbox_) { FillPlaylist(inbox_, response); } } void SpotifyService::StarredLoaded( const pb::spotify::LoadPlaylistResponse& response) { if (starred_) { FillPlaylist(starred_, response); } } void SpotifyService::ToplistLoaded( const pb::spotify::BrowseToplistResponse& response) { if (toplist_) { FillPlaylist(toplist_, response.track()); } } QStandardItem* SpotifyService::PlaylistBySpotifyIndex(int index) const { for (QStandardItem* item : playlists_) { if (item->data(Role_UserPlaylistIndex).toInt() == index) { return item; } } return nullptr; } void SpotifyService::UserPlaylistLoaded( const pb::spotify::LoadPlaylistResponse& response) { // Find a playlist with this index QStandardItem* item = PlaylistBySpotifyIndex(response.request().user_playlist_index()); if (item) { FillPlaylist(item, response); } } void SpotifyService::FillPlaylist( QStandardItem* item, const google::protobuf::RepeatedPtrField& tracks) { if (item->hasChildren()) item->removeRows(0, item->rowCount()); for (int i = 0; i < tracks.size(); ++i) { Song song; SongFromProtobuf(tracks.Get(i), &song); QStandardItem* child = CreateSongItem(song); item->appendRow(child); } } void SpotifyService::FillPlaylist( QStandardItem* item, const pb::spotify::LoadPlaylistResponse& response) { qLog(Debug) << "Filling playlist:" << item->text(); FillPlaylist(item, response.track()); } void SpotifyService::SongFromProtobuf(const pb::spotify::Track& track, Song* song) { song->set_rating(track.starred() ? 1.0 : 0.0); song->set_title(QStringFromStdString(track.title())); song->set_album(QStringFromStdString(track.album())); song->set_length_nanosec(track.duration_msec() * kNsecPerMsec); song->set_score(track.popularity()); song->set_disc(track.disc()); song->set_track(track.track()); song->set_year(track.year()); song->set_url(QUrl(QStringFromStdString(track.uri()))); song->set_art_automatic("spotify://image/" + QStringFromStdString(track.album_art_id())); QStringList artists; for (int i = 0; i < track.artist_size(); ++i) { artists << QStringFromStdString(track.artist(i)); } song->set_artist(artists.join(", ")); song->set_filetype(Song::Type_Stream); song->set_valid(true); song->set_directory_id(0); song->set_mtime(0); song->set_ctime(0); song->set_filesize(0); } QList SpotifyService::playlistitem_actions(const Song& song) { // Clear previous actions while (!playlistitem_actions_.isEmpty()) { QAction* action = playlistitem_actions_.takeFirst(); delete action->menu(); delete action; } QAction* add_to_starred = new QAction(QIcon(":/star-on.png"), tr("Add to Spotify starred"), this); connect(add_to_starred, SIGNAL(triggered()), SLOT(AddCurrentSongToStarredPlaylist())); playlistitem_actions_.append(add_to_starred); // Create a menu with 'add to playlist' actions for each Spotify playlist QAction* add_to_playlists = new QAction(IconLoader::Load("list-add"), tr("Add to Spotify playlists"), this); QMenu* playlists_menu = new QMenu(); for (const QStandardItem* playlist_item : playlists_) { if (!playlist_item->data(InternetModel::Role_CanBeModified).toBool()) { continue; } QAction* add_to_playlist = new QAction(playlist_item->text(), this); add_to_playlist->setData(playlist_item->data(Role_UserPlaylistIndex)); playlists_menu->addAction(add_to_playlist); } connect(playlists_menu, SIGNAL(triggered(QAction*)), SLOT(AddCurrentSongToUserPlaylist(QAction*))); add_to_playlists->setMenu(playlists_menu); playlistitem_actions_.append(add_to_playlists); QAction* share_song = new QAction(tr("Get a URL to share this Spotify song"), this); connect(share_song, SIGNAL(triggered()), SLOT(GetCurrentSongUrlToShare())); playlistitem_actions_.append(share_song); // Keep in mind the current song URL current_song_url_ = song.url(); return playlistitem_actions_; } PlaylistItem::Options SpotifyService::playlistitem_options() const { return PlaylistItem::SeekDisabled; } QWidget* SpotifyService::HeaderWidget() const { if (IsLoggedIn()) return search_box_; return nullptr; } void SpotifyService::EnsureMenuCreated() { if (context_menu_) return; context_menu_ = new QMenu; context_menu_->addAction(GetNewShowConfigAction()); playlist_context_menu_ = new QMenu; playlist_context_menu_->addActions(GetPlaylistActions()); playlist_context_menu_->addSeparator(); playlist_sync_action_ = playlist_context_menu_->addAction( IconLoader::Load("view-refresh"), tr("Make playlist available offline"), this, SLOT(SyncPlaylist())); get_url_to_share_playlist_ = playlist_context_menu_->addAction( tr("Get a URL to share this playlist"), this, SLOT(GetCurrentPlaylistUrlToShare())); playlist_context_menu_->addSeparator(); playlist_context_menu_->addAction(GetNewShowConfigAction()); song_context_menu_ = new QMenu; song_context_menu_->addActions(GetPlaylistActions()); song_context_menu_->addSeparator(); remove_from_playlist_ = song_context_menu_->addAction( IconLoader::Load("list-remove"), tr("Remove from playlist"), this, SLOT(RemoveCurrentFromPlaylist())); song_context_menu_->addAction(tr("Get a URL to share this Spotify song"), this, SLOT(GetCurrentSongUrlToShare())); song_context_menu_->addSeparator(); song_context_menu_->addAction(GetNewShowConfigAction()); } void SpotifyService::ClearSearchResults() { if (search_) search_->removeRows(0, search_->rowCount()); } void SpotifyService::SyncPlaylist() { QStandardItem* item = playlist_sync_action_->data().value(); Q_ASSERT(item); switch (item->data(InternetModel::Role_Type).toInt()) { case InternetModel::Type_UserPlaylist: { int index = item->data(Role_UserPlaylistIndex).toInt(); server_->SyncUserPlaylist(index); playlist_sync_ids_[index] = app_->task_manager()->StartTask(tr("Syncing Spotify playlist")); break; } case Type_InboxPlaylist: server_->SyncInbox(); inbox_sync_id_ = app_->task_manager()->StartTask(tr("Syncing Spotify inbox")); break; case Type_StarredPlaylist: server_->SyncStarred(); starred_sync_id_ = app_->task_manager()->StartTask(tr("Syncing Spotify starred tracks")); break; default: break; } } void SpotifyService::Search(const QString& text, bool now) { EnsureServerCreated(); pending_search_ = text; // If there is no text (e.g. user cleared search box), we don't need to do a // real query that will return nothing: we can clear the playlist now if (text.isEmpty()) { search_delay_->stop(); ClearSearchResults(); return; } if (now) { search_delay_->stop(); DoSearch(); } else { search_delay_->start(); } } void SpotifyService::DoSearch() { if (!pending_search_.isEmpty()) { server_->Search(pending_search_, 200); } } void SpotifyService::SearchResults( const pb::spotify::SearchResponse& response) { if (QStringFromStdString(response.request().query()) != pending_search_) { qLog(Debug) << "Old search result for" << QStringFromStdString(response.request().query()) << "expecting" << pending_search_; return; } pending_search_.clear(); SongList songs; for (int i = 0; i < response.result_size(); ++i) { Song song; SongFromProtobuf(response.result(i), &song); songs << song; } qLog(Debug) << "Got" << songs.count() << "results"; ClearSearchResults(); // Fill results list for (const Song& song : songs) { QStandardItem* child = CreateSongItem(song); search_->appendRow(child); } const QString did_you_mean_suggestion = QStringFromStdString(response.did_you_mean()); qLog(Debug) << "Did you mean suggestion: " << did_you_mean_suggestion; if (!did_you_mean_suggestion.isEmpty()) { search_box_->did_you_mean()->Show(did_you_mean_suggestion); } else { // In case something else was previously displayed search_box_->did_you_mean()->hide(); } QModelIndex index = model()->merged_model()->mapFromSource(search_->index()); ScrollToIndex(index); } SpotifyServer* SpotifyService::server() const { SpotifyService* nonconst_this = const_cast(this); if (QThread::currentThread() != thread()) { metaObject()->invokeMethod(nonconst_this, "EnsureServerCreated", Qt::BlockingQueuedConnection); } else { nonconst_this->EnsureServerCreated(); } return server_; } void SpotifyService::ShowContextMenu(const QPoint& global_pos) { EnsureMenuCreated(); QStandardItem* item = model()->itemFromIndex(model()->current_index()); if (item) { int type = item->data(InternetModel::Role_Type).toInt(); if (type == Type_InboxPlaylist || type == Type_StarredPlaylist || type == InternetModel::Type_UserPlaylist) { playlist_sync_action_->setData(qVariantFromValue(item)); playlist_context_menu_->popup(global_pos); current_playlist_url_ = item->data(InternetModel::Role_Url).toUrl(); get_url_to_share_playlist_->setVisible(type == InternetModel::Type_UserPlaylist); return; } else if (type == InternetModel::Type_Track) { current_song_url_ = item->data(InternetModel::Role_Url).toUrl(); // Is this track contained in a playlist we can modify? bool is_playlist_modifiable = item->parent() && item->parent()->data(InternetModel::Role_CanBeModified).toBool(); remove_from_playlist_->setVisible(is_playlist_modifiable); song_context_menu_->popup(global_pos); return; } } context_menu_->popup(global_pos); } void SpotifyService::GetCurrentSongUrlToShare() const { QString url = current_song_url_.toEncoded(); // URLs we use can be opened with Spotify application, but I believe it's // better to give website links instead. url.replace("spotify:track:", "https://play.spotify.com/track/"); InternetService::ShowUrlBox(tr("Spotify song's URL"), url); } void SpotifyService::GetCurrentPlaylistUrlToShare() const { QString url = current_playlist_url_.toEncoded(); // URLs we use can be opened with Spotify application, but I believe it's // better to give website links instead. url.replace(QRegExp("spotify:user:([^:]*):playlist:([^:]*)"), "https://play.spotify.com/user/\\1/playlist/\\2"); InternetService::ShowUrlBox(tr("Spotify playlist's URL"), url); } void SpotifyService::ItemDoubleClicked(QStandardItem* item) {} void SpotifyService::DropMimeData(const QMimeData* data, const QModelIndex& index) { QModelIndex playlist_root_index = index; QVariant q_playlist_type = playlist_root_index.data(InternetModel::Role_Type); if (!q_playlist_type.isValid() || q_playlist_type.toInt() == InternetModel::Type_Track) { // In case song was dropped on a playlist item, not on the playlist // title/root element playlist_root_index = index.parent(); q_playlist_type = playlist_root_index.data(InternetModel::Role_Type); } if (!q_playlist_type.isValid()) return; int playlist_type = q_playlist_type.toInt(); if (playlist_type == Type_StarredPlaylist) { AddSongsToStarred(data->urls()); } else if (playlist_type == InternetModel::Type_UserPlaylist) { QVariant q_playlist_index = playlist_root_index.data(Role_UserPlaylistIndex); if (!q_playlist_index.isValid()) return; AddSongsToUserPlaylist(q_playlist_index.toInt(), data->urls()); } } void SpotifyService::LoadImage(const QString& id) { EnsureServerCreated(); server_->LoadImage(id); } void SpotifyService::SetPaused(bool paused) { EnsureServerCreated(); server_->SetPaused(paused); } void SpotifyService::SyncPlaylistProgress( const pb::spotify::SyncPlaylistProgress& progress) { qLog(Debug) << "Sync progress:" << progress.sync_progress(); int task_id = -1; switch (progress.request().type()) { case pb::spotify::Inbox: task_id = inbox_sync_id_; break; case pb::spotify::Starred: task_id = starred_sync_id_; break; case pb::spotify::UserPlaylist: { QMap::const_iterator it = playlist_sync_ids_.constFind( progress.request().user_playlist_index()); if (it != playlist_sync_ids_.constEnd()) { task_id = it.value(); } break; } default: break; } if (task_id == -1) { qLog(Warning) << "Received sync progress for unknown playlist"; return; } app_->task_manager()->SetTaskProgress(task_id, progress.sync_progress(), 100); if (progress.sync_progress() == 100) { app_->task_manager()->SetTaskFinished(task_id); if (progress.request().type() == pb::spotify::UserPlaylist) { playlist_sync_ids_.remove(task_id); } } } QAction* SpotifyService::GetNewShowConfigAction() { QAction* action = new QAction(IconLoader::Load("configure"), tr("Configure Spotify..."), this); connect(action, SIGNAL(triggered()), this, SLOT(ShowConfig())); return action; } void SpotifyService::ShowConfig() { app_->OpenSettingsDialogAtPage(SettingsDialog::Page_Spotify); } void SpotifyService::RemoveCurrentFromPlaylist() { const QModelIndexList& indexes(model()->selected_indexes()); QMap> playlists_songs_indices; QList starred_songs_indices; for (const QModelIndex& index : indexes) { bool is_starred = false; if (index.parent().data(InternetModel::Role_Type).toInt() == Type_StarredPlaylist) { is_starred = true; } else if (index.parent().data(InternetModel::Role_Type).toInt() != InternetModel::Type_UserPlaylist) { continue; } if (index.data(InternetModel::Role_Type).toInt() != InternetModel::Type_Track) { continue; } int song_index = index.row(); if (is_starred) { starred_songs_indices << song_index; } else { int playlist_index = index.parent().data(Role_UserPlaylistIndex).toInt(); playlists_songs_indices[playlist_index] << song_index; } } for (QMap>::const_iterator it = playlists_songs_indices.constBegin(); it != playlists_songs_indices.constEnd(); ++it) { RemoveSongsFromUserPlaylist(it.key(), it.value()); } if (!starred_songs_indices.isEmpty()) { RemoveSongsFromStarred(starred_songs_indices); } } void SpotifyService::RemoveSongsFromUserPlaylist( int playlist_index, const QList& songs_indices_to_remove) { server_->RemoveSongsFromUserPlaylist(playlist_index, songs_indices_to_remove); } void SpotifyService::RemoveSongsFromStarred( const QList& songs_indices_to_remove) { server_->RemoveSongsFromStarred(songs_indices_to_remove); } void SpotifyService::Logout() { delete server_; delete blob_process_; server_ = nullptr; blob_process_ = nullptr; login_state_ = LoginState_OtherError; QSettings s; s.beginGroup(kSettingsGroup); s.setValue("login_state", login_state_); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/spotify/spotifyservice.h000066400000000000000000000144751260417502300267450ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, Tyler Rhodes Copyright 2011-2012, 2014, Arnaud Bienner Copyright 2011-2012, 2014, John Maguire Copyright 2011-2012, 2014, David Sansome Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_SPOTIFY_SPOTIFYSERVICE_H_ #define INTERNET_SPOTIFY_SPOTIFYSERVICE_H_ #include "internet/core/internetmodel.h" #include "internet/core/internetservice.h" #include "spotifymessages.pb.h" #include #include class Playlist; class SearchBoxWidget; class SpotifyServer; class QMenu; class SpotifyService : public InternetService { Q_OBJECT public: SpotifyService(Application* app, InternetModel* parent); ~SpotifyService(); enum Type { Type_SearchResults = InternetModel::TypeCount, Type_StarredPlaylist, Type_InboxPlaylist, Type_Toplist, }; enum Role { Role_UserPlaylistIndex = InternetModel::RoleCount, }; // Values are persisted - don't change. enum LoginState { LoginState_LoggedIn = 1, LoginState_Banned = 2, LoginState_BadCredentials = 3, LoginState_NoPremium = 4, LoginState_OtherError = 5, LoginState_ReloginFailed = 6 }; static const char* kServiceName; static const char* kSettingsGroup; static const char* kBlobDownloadUrl; static const int kSearchDelayMsec; void ReloadSettings() override; QStandardItem* CreateRootItem() override; void LazyPopulate(QStandardItem* parent) override; void ShowContextMenu(const QPoint& global_pos) override; void ItemDoubleClicked(QStandardItem* item) override; void DropMimeData(const QMimeData* data, const QModelIndex& index) override; QList playlistitem_actions(const Song& song) override; PlaylistItem::Options playlistitem_options() const override; QWidget* HeaderWidget() const override; void Logout(); void Login(const QString& username, const QString& password); Q_INVOKABLE void LoadImage(const QString& id); Q_INVOKABLE void SetPaused(bool paused); SpotifyServer* server() const; bool IsBlobInstalled() const; void InstallBlob(); // Persisted in the settings and updated on each Login(). LoginState login_state() const { return login_state_; } bool IsLoggedIn() const { return login_state_ == LoginState_LoggedIn; } static void SongFromProtobuf(const pb::spotify::Track& track, Song* song); signals: void BlobStateChanged(); void LoginFinished(bool success); void ImageLoaded(const QString& id, const QImage& image); public slots: void Search(const QString& text, bool now = false); void ShowConfig(); void RemoveCurrentFromPlaylist(); private: void StartBlobProcess(); void FillPlaylist( QStandardItem* item, const google::protobuf::RepeatedPtrField& tracks); void FillPlaylist(QStandardItem* item, const pb::spotify::LoadPlaylistResponse& response); void AddSongsToUserPlaylist(int playlist_index, const QList& songs_urls); void AddSongsToStarred(const QList& songs_urls); void EnsureMenuCreated(); // Create a new "show config" action. The caller is responsible for deleting // the pointer (or adding it to menu or anything else that will take ownership // of it) QAction* GetNewShowConfigAction(); void ClearSearchResults(); QStandardItem* PlaylistBySpotifyIndex(int index) const; bool DoPlaylistsDiffer(const pb::spotify::Playlists& response) const; private slots: void EnsureServerCreated(const QString& username = QString(), const QString& password = QString()); void BlobProcessError(QProcess::ProcessError error); void LoginCompleted(bool success, const QString& error, pb::spotify::LoginResponse_Error error_code); void AddCurrentSongToUserPlaylist(QAction* action); void AddCurrentSongToStarredPlaylist(); void RemoveSongsFromUserPlaylist(int playlist_index, const QList& songs_indices_to_remove); void RemoveSongsFromStarred(const QList& songs_indices_to_remove); void PlaylistsUpdated(const pb::spotify::Playlists& response); void InboxLoaded(const pb::spotify::LoadPlaylistResponse& response); void StarredLoaded(const pb::spotify::LoadPlaylistResponse& response); void UserPlaylistLoaded(const pb::spotify::LoadPlaylistResponse& response); void SearchResults(const pb::spotify::SearchResponse& response); void SyncPlaylistProgress(const pb::spotify::SyncPlaylistProgress& progress); void ToplistLoaded(const pb::spotify::BrowseToplistResponse& response); void GetCurrentSongUrlToShare() const; void GetCurrentPlaylistUrlToShare() const; void DoSearch(); void SyncPlaylist(); void BlobDownloadFinished(); private: SpotifyServer* server_; QString system_blob_path_; QString local_blob_version_; QString local_blob_path_; QProcess* blob_process_; QStandardItem* root_; QStandardItem* search_; QStandardItem* starred_; QStandardItem* inbox_; QStandardItem* toplist_; QList playlists_; int login_task_id_; QString pending_search_; QMenu* context_menu_; QMenu* playlist_context_menu_; QMenu* song_context_menu_; QAction* playlist_sync_action_; QAction* get_url_to_share_playlist_; QList playlistitem_actions_; QAction* remove_from_playlist_; QUrl current_song_url_; QUrl current_playlist_url_; SearchBoxWidget* search_box_; QTimer* search_delay_; int inbox_sync_id_; int starred_sync_id_; QMap playlist_sync_ids_; LoginState login_state_; pb::spotify::Bitrate bitrate_; bool volume_normalisation_; }; #endif // INTERNET_SPOTIFY_SPOTIFYSERVICE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/spotify/spotifysettingspage.cpp000066400000000000000000000126711260417502300303310ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, Andrea Decorte Copyright 2011-2013, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "spotifysettingspage.h" #include "ui_spotifysettingspage.h" #include #include #include #include #include #include "config.h" #include "spotifymessages.pb.h" #include "spotifyservice.h" #include "internet/core/internetmodel.h" #include "core/network.h" #include "ui/iconloader.h" SpotifySettingsPage::SpotifySettingsPage(SettingsDialog* dialog) : SettingsPage(dialog), ui_(new Ui_SpotifySettingsPage), service_(InternetModel::Service()), validated_(false) { ui_->setupUi(this); setWindowIcon(QIcon(":/icons/48x48/spotify.png")); QFont bold_font(font()); bold_font.setBold(true); ui_->blob_status->setFont(bold_font); connect(ui_->download_blob, SIGNAL(clicked()), SLOT(DownloadBlob())); connect(ui_->login, SIGNAL(clicked()), SLOT(Login())); connect(ui_->login_state, SIGNAL(LogoutClicked()), SLOT(Logout())); connect(ui_->login_state, SIGNAL(LoginClicked()), SLOT(Login())); connect(service_, SIGNAL(LoginFinished(bool)), SLOT(LoginFinished(bool))); connect(service_, SIGNAL(BlobStateChanged()), SLOT(BlobStateChanged())); ui_->login_state->AddCredentialField(ui_->username); ui_->login_state->AddCredentialField(ui_->password); ui_->login_state->AddCredentialGroup(ui_->account_group); ui_->bitrate->addItem("96 " + tr("kbps"), pb::spotify::Bitrate96k); ui_->bitrate->addItem("160 " + tr("kbps"), pb::spotify::Bitrate160k); ui_->bitrate->addItem("320 " + tr("kbps"), pb::spotify::Bitrate320k); BlobStateChanged(); } SpotifySettingsPage::~SpotifySettingsPage() { delete ui_; } void SpotifySettingsPage::BlobStateChanged() { const bool installed = service_->IsBlobInstalled(); ui_->account_group->setEnabled(installed); ui_->blob_status->setText(installed ? tr("Installed") : tr("Not installed")); #ifdef HAVE_SPOTIFY_DOWNLOADER ui_->download_blob->setEnabled(!installed); #else ui_->download_blob->hide(); #endif } void SpotifySettingsPage::DownloadBlob() { service_->InstallBlob(); } void SpotifySettingsPage::Login() { if (!service_->IsBlobInstalled()) { return; } if (ui_->username->text() == original_username_ && ui_->password->text() == original_password_ && service_->login_state() == SpotifyService::LoginState_LoggedIn) { return; } ui_->login_state->SetLoggedIn(LoginStateWidget::LoginInProgress); service_->Login(ui_->username->text(), ui_->password->text()); } void SpotifySettingsPage::Load() { QSettings s; s.beginGroup(SpotifyService::kSettingsGroup); original_username_ = s.value("username").toString(); ui_->username->setText(original_username_); validated_ = false; ui_->bitrate->setCurrentIndex(ui_->bitrate->findData( s.value("bitrate", pb::spotify::Bitrate320k).toInt())); ui_->volume_normalisation->setChecked( s.value("volume_normalisation", false).toBool()); UpdateLoginState(); } void SpotifySettingsPage::Save() { QSettings s; s.beginGroup(SpotifyService::kSettingsGroup); s.setValue("username", ui_->username->text()); s.setValue("password", ui_->password->text()); s.setValue("bitrate", ui_->bitrate->itemData(ui_->bitrate->currentIndex()).toInt()); s.setValue("volume_normalisation", ui_->volume_normalisation->isChecked()); } void SpotifySettingsPage::LoginFinished(bool success) { validated_ = success; Save(); UpdateLoginState(); } void SpotifySettingsPage::UpdateLoginState() { const bool logged_in = service_->login_state() == SpotifyService::LoginState_LoggedIn; ui_->login_state->SetLoggedIn( logged_in ? LoginStateWidget::LoggedIn : LoginStateWidget::LoggedOut, ui_->username->text()); ui_->login_state->SetAccountTypeVisible(!logged_in); switch (service_->login_state()) { case SpotifyService::LoginState_NoPremium: ui_->login_state->SetAccountTypeText( tr("You do not have a Spotify Premium account.")); break; case SpotifyService::LoginState_Banned: case SpotifyService::LoginState_BadCredentials: ui_->login_state->SetAccountTypeText( tr("Your username or password was incorrect.")); break; case SpotifyService::LoginState_ReloginFailed: ui_->login_state->SetAccountTypeText( tr("You have been logged out of Spotify, please re-enter your " "password.")); break; default: ui_->login_state->SetAccountTypeText( tr("A Spotify Premium account is required.")); break; } } void SpotifySettingsPage::Logout() { service_->Logout(); UpdateLoginState(); ui_->username->clear(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/spotify/spotifysettingspage.h000066400000000000000000000031411260417502300277660ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_SPOTIFY_SPOTIFYSETTINGSPAGE_H_ #define INTERNET_SPOTIFY_SPOTIFYSETTINGSPAGE_H_ #include "ui/settingspage.h" class NetworkAccessManager; class Ui_SpotifySettingsPage; class SpotifyService; class SpotifySettingsPage : public SettingsPage { Q_OBJECT public: explicit SpotifySettingsPage(SettingsDialog* dialog); ~SpotifySettingsPage(); void Load(); void Save(); public slots: void BlobStateChanged(); void DownloadBlob(); private slots: void Login(); void LoginFinished(bool success); void Logout(); private: void UpdateLoginState(); private: Ui_SpotifySettingsPage* ui_; SpotifyService* service_; bool validated_; QString original_username_; QString original_password_; }; #endif // INTERNET_SPOTIFY_SPOTIFYSETTINGSPAGE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/spotify/spotifysettingspage.ui000066400000000000000000000133251260417502300301610ustar00rootroot00000000000000 SpotifySettingsPage 0 0 545 458 Spotify Account details true 0 Username Password QLineEdit::Password Login Spotify plugin For licensing reasons Spotify support is in a separate plugin. Plugin status: Qt::Horizontal 40 20 Download... Preferences Preferred bitrate Use volume normalisation Qt::Vertical 20 30 Qt::Horizontal 40 20 64 64 64 64 :/spotify-attribution.png LoginStateWidget QWidget
widgets/loginstatewidget.h
1
clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/subsonic/000077500000000000000000000000001260417502300236335ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/subsonic/subsonicservice.cpp000066400000000000000000000451511260417502300275530ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011-2013, Alan Briolat Copyright 2013, David Sansome Copyright 2013, Ross Wolfson Copyright 2013-2014, John Maguire Copyright 2014, Chocobozzz Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "subsonicservice.h" #include #include #include #include #include #include #include #include "core/application.h" #include "core/closure.h" #include "core/database.h" #include "core/logging.h" #include "core/mergedproxymodel.h" #include "core/player.h" #include "core/taskmanager.h" #include "core/timeconstants.h" #include "core/utilities.h" #include "globalsearch/globalsearch.h" #include "globalsearch/librarysearchprovider.h" #include "internet/core/internetmodel.h" #include "internet/subsonic/subsonicurlhandler.h" #include "library/librarybackend.h" #include "library/libraryfilterwidget.h" #include "ui/iconloader.h" const char* SubsonicService::kServiceName = "Subsonic"; const char* SubsonicService::kSettingsGroup = "Subsonic"; const char* SubsonicService::kApiVersion = "1.8.0"; const char* SubsonicService::kApiClientName = "Clementine"; const char* SubsonicService::kSongsTable = "subsonic_songs"; const char* SubsonicService::kFtsTable = "subsonic_songs_fts"; const int SubsonicService::kMaxRedirects = 10; SubsonicService::SubsonicService(Application* app, InternetModel* parent) : InternetService(kServiceName, app, parent, parent), network_(new QNetworkAccessManager(this)), url_handler_(new SubsonicUrlHandler(this, this)), scanner_(new SubsonicLibraryScanner(this, this)), load_database_task_id_(0), context_menu_(nullptr), root_(nullptr), library_backend_(nullptr), library_model_(nullptr), library_filter_(nullptr), library_sort_model_(new QSortFilterProxyModel(this)), total_song_count_(0), login_state_(LoginState_OtherError), redirect_count_(0) { app_->player()->RegisterUrlHandler(url_handler_); connect(scanner_, SIGNAL(ScanFinished()), SLOT(ReloadDatabaseFinished())); library_backend_ = new LibraryBackend; library_backend_->moveToThread(app_->database()->thread()); library_backend_->Init(app_->database(), kSongsTable, QString::null, QString::null, kFtsTable); connect(library_backend_, SIGNAL(TotalSongCountUpdated(int)), SLOT(UpdateTotalSongCount(int))); library_model_ = new LibraryModel(library_backend_, app_, this); library_model_->set_show_various_artists(false); library_model_->set_show_smart_playlists(false); library_filter_ = new LibraryFilterWidget(0); library_filter_->SetSettingsGroup(kSettingsGroup); library_filter_->SetLibraryModel(library_model_); library_filter_->SetFilterHint(tr("Search Subsonic")); library_filter_->SetAgeFilterEnabled(false); library_sort_model_->setSourceModel(library_model_); library_sort_model_->setSortRole(LibraryModel::Role_SortText); library_sort_model_->setDynamicSortFilter(true); library_sort_model_->setSortLocaleAware(true); library_sort_model_->sort(0); connect(this, SIGNAL(LoginStateChanged(SubsonicService::LoginState)), SLOT(OnLoginStateChanged(SubsonicService::LoginState))); context_menu_ = new QMenu; context_menu_->addActions(GetPlaylistActions()); context_menu_->addSeparator(); context_menu_->addAction(IconLoader::Load("view-refresh"), tr("Refresh catalogue"), this, SLOT(ReloadDatabase())); QAction* config_action = context_menu_->addAction( IconLoader::Load("configure"), tr("Configure Subsonic..."), this, SLOT(ShowConfig())); context_menu_->addSeparator(); context_menu_->addMenu(library_filter_->menu()); library_filter_->AddMenuAction(config_action); app_->global_search()->AddProvider(new LibrarySearchProvider( library_backend_, tr("Subsonic"), "subsonic", QIcon(":/providers/subsonic.png"), true, app_, this)); } SubsonicService::~SubsonicService() {} QStandardItem* SubsonicService::CreateRootItem() { root_ = new QStandardItem(QIcon(":providers/subsonic.png"), kServiceName); root_->setData(true, InternetModel::Role_CanLazyLoad); return root_; } void SubsonicService::LazyPopulate(QStandardItem* item) { switch (item->data(InternetModel::Role_Type).toInt()) { case InternetModel::Type_Service: library_model_->Init(); if (login_state() != LoginState_Loggedin) { ShowConfig(); } else if (total_song_count_ == 0 && !load_database_task_id_) { ReloadDatabase(); } model()->merged_model()->AddSubModel(item->index(), library_sort_model_); break; default: break; } } void SubsonicService::ShowContextMenu(const QPoint& global_pos) { const bool is_valid = model()->current_index().model() == library_sort_model_; GetAppendToPlaylistAction()->setEnabled(is_valid); GetReplacePlaylistAction()->setEnabled(is_valid); GetOpenInNewPlaylistAction()->setEnabled(is_valid); context_menu_->popup(global_pos); } QWidget* SubsonicService::HeaderWidget() const { return library_filter_; } void SubsonicService::ReloadSettings() { QSettings s; s.beginGroup(kSettingsGroup); UpdateServer(s.value("server").toString()); username_ = s.value("username").toString(); password_ = s.value("password").toString(); usesslv3_ = s.value("usesslv3").toBool(); Login(); } bool SubsonicService::IsConfigured() const { return !configured_server_.isEmpty() && !username_.isEmpty() && !password_.isEmpty(); } void SubsonicService::Login() { // Recreate fresh network state, otherwise old HTTPS settings seem to get // reused network_->deleteLater(); network_ = new QNetworkAccessManager(this); network_->setCookieJar(new QNetworkCookieJar(network_)); // Forget login state whilst waiting login_state_ = LoginState_Unknown; if (IsConfigured()) { // Ping is enough to check credentials Ping(); } else { login_state_ = LoginState_IncompleteCredentials; emit LoginStateChanged(login_state_); } } void SubsonicService::Login(const QString& server, const QString& username, const QString& password, const bool& usesslv3) { UpdateServer(server); username_ = username; password_ = password; usesslv3_ = usesslv3; Login(); } void SubsonicService::Ping() { QNetworkReply* reply = Send(BuildRequestUrl("ping")); NewClosure(reply, SIGNAL(finished()), this, SLOT(OnPingFinished(QNetworkReply*)), reply); } QUrl SubsonicService::BuildRequestUrl(const QString& view) const { QUrl url(working_server_ + "/rest/" + view + ".view"); url.addQueryItem("v", kApiVersion); url.addQueryItem("c", kApiClientName); url.addQueryItem("u", username_); url.addQueryItem("p", QString("enc:" + password_.toUtf8().toHex())); return url; } QUrl SubsonicService::ScrubUrl(const QUrl& url) { QUrl return_url(url); QString path = url.path(); int rest_location = path.lastIndexOf("/rest", -1, Qt::CaseInsensitive); if (rest_location >= 0) { return_url.setPath(path.left(rest_location)); } return return_url; } QNetworkReply* SubsonicService::Send(const QUrl& url) { QNetworkRequest request(url); // Don't try and check the authenticity of the SSL certificate - it'll almost // certainly be self-signed. QSslConfiguration sslconfig = QSslConfiguration::defaultConfiguration(); sslconfig.setPeerVerifyMode(QSslSocket::VerifyNone); if (usesslv3_) { sslconfig.setProtocol(QSsl::SslV3); } request.setSslConfiguration(sslconfig); QNetworkReply* reply = network_->get(request); return reply; } void SubsonicService::UpdateTotalSongCount(int count) { total_song_count_ = count; } void SubsonicService::ReloadDatabase() { if (!load_database_task_id_) { load_database_task_id_ = app_->task_manager()->StartTask(tr("Fetching Subsonic library")); } scanner_->Scan(); } void SubsonicService::ReloadDatabaseFinished() { app_->task_manager()->SetTaskFinished(load_database_task_id_); load_database_task_id_ = 0; library_backend_->DeleteAll(); library_backend_->AddOrUpdateSongs(scanner_->GetSongs()); library_model_->Reset(); } void SubsonicService::OnLoginStateChanged( SubsonicService::LoginState newstate) { // TODO(Alan Briolat): library refresh logic? if (newstate != LoginState_Loggedin) library_backend_->DeleteAll(); } void SubsonicService::OnPingFinished(QNetworkReply* reply) { reply->deleteLater(); if (reply->error() != QNetworkReply::NoError) { switch (reply->error()) { case QNetworkReply::ConnectionRefusedError: login_state_ = LoginState_ConnectionRefused; break; case QNetworkReply::HostNotFoundError: login_state_ = LoginState_HostNotFound; break; case QNetworkReply::TimeoutError: login_state_ = LoginState_Timeout; break; case QNetworkReply::SslHandshakeFailedError: login_state_ = LoginState_SslError; break; default: // Treat uncaught error types here as generic login_state_ = LoginState_BadServer; break; } qLog(Error) << "Failed to connect (" << Utilities::EnumToString(QNetworkReply::staticMetaObject, "NetworkError", reply->error()) << "):" << reply->errorString(); } else { QXmlStreamReader reader(reply); reader.readNextStartElement(); QStringRef status = reader.attributes().value("status"); int http_status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); if (status == "ok") { login_state_ = LoginState_Loggedin; } else if (http_status_code >= 300 && http_status_code <= 399) { // Received a redirect status code, follow up on it. QUrl redirect_url = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); if (redirect_url.isEmpty()) { qLog(Debug) << "Received HTTP code " << http_status_code << ", but no URL"; login_state_ = LoginState_RedirectNoUrl; } else { redirect_count_++; qLog(Debug) << "Redirect receieved to " << redirect_url.toString(QUrl::RemoveQuery) << ", current redirect count is " << redirect_count_; if (redirect_count_ <= kMaxRedirects) { working_server_ = ScrubUrl(redirect_url).toString(QUrl::RemoveQuery); Ping(); // To avoid the LoginStateChanged, as it will come from the recursive // request. return; } else { // Redirect limit exceeded login_state_ = LoginState_RedirectLimitExceeded; } } } else { reader.readNextStartElement(); int error = reader.attributes().value("code").toString().toInt(); qLog(Error) << "Subsonic error (" << Utilities::EnumToString(SubsonicService::staticMetaObject, "ApiError", error) << "):" << reader.attributes().value("message").toString(); switch (error) { // "Parameter missing" for "ping" is always blank username or password case ApiError_ParameterMissing: case ApiError_BadCredentials: login_state_ = LoginState_BadCredentials; break; case ApiError_OutdatedClient: login_state_ = LoginState_OutdatedClient; break; case ApiError_OutdatedServer: login_state_ = LoginState_OutdatedServer; break; case ApiError_Unlicensed: login_state_ = LoginState_Unlicensed; break; default: login_state_ = LoginState_OtherError; break; } } } qLog(Debug) << "Login state changed:" << Utilities::EnumToString(SubsonicService::staticMetaObject, "LoginState", login_state_); emit LoginStateChanged(login_state_); } void SubsonicService::ShowConfig() { app_->OpenSettingsDialogAtPage(SettingsDialog::Page_Subsonic); } void SubsonicService::UpdateServer(const QString& server) { configured_server_ = server; working_server_ = server; redirect_count_ = 0; } const int SubsonicLibraryScanner::kAlbumChunkSize = 500; const int SubsonicLibraryScanner::kConcurrentRequests = 8; SubsonicLibraryScanner::SubsonicLibraryScanner(SubsonicService* service, QObject* parent) : QObject(parent), service_(service), scanning_(false) {} SubsonicLibraryScanner::~SubsonicLibraryScanner() {} void SubsonicLibraryScanner::Scan() { if (scanning_) { return; } album_queue_.clear(); pending_requests_.clear(); songs_.clear(); scanning_ = true; GetAlbumList(0); } void SubsonicLibraryScanner::OnGetAlbumListFinished(QNetworkReply* reply, int offset) { reply->deleteLater(); bool skip_read_albums = false; QXmlStreamReader reader(reply); reader.readNextStartElement(); if (reader.name() != "subsonic-response") { ParsingError("Not a subsonic-response. Aborting scan."); return; } if (reader.attributes().value("status") != "ok") { reader.readNextStartElement(); int error = reader.attributes().value("code").toString().toInt(); // Compatibility with Ampache : // When there is no data, Ampache returns NotFound // whereas Subsonic returns empty albumList2 tag switch (error) { case SubsonicService::ApiError_NotFound: skip_read_albums = true; break; default: ParsingError("Response status not ok. Aborting scan."); return; } } int albums_added = 0; if (!skip_read_albums) { reader.readNextStartElement(); if (reader.name() != "albumList2") { ParsingError("albumList2 tag expected. Aborting scan."); return; } while (reader.readNextStartElement()) { if (reader.name() != "album") { ParsingError("album tag expected. Aborting scan."); return; } album_queue_ << reader.attributes().value("id").toString(); albums_added++; reader.skipCurrentElement(); } } if (albums_added > 0) { // Non-empty reply means potentially more albums to fetch GetAlbumList(offset + kAlbumChunkSize); } else if (album_queue_.size() == 0) { // Empty reply and no albums means an empty Subsonic server scanning_ = false; emit ScanFinished(); } else { // Empty reply but we have some albums, time to start fetching songs // Start up the maximum number of concurrent requests, finished requests get // replaced with new ones for (int i = 0; i < kConcurrentRequests && !album_queue_.empty(); ++i) { GetAlbum(album_queue_.dequeue()); } } } void SubsonicLibraryScanner::OnGetAlbumFinished(QNetworkReply* reply) { reply->deleteLater(); pending_requests_.remove(reply); QXmlStreamReader reader(reply); reader.readNextStartElement(); if (reader.name() != "subsonic-response") { ParsingError("Not a subsonic-response. Aborting scan."); return; } if (reader.attributes().value("status") != "ok") { // TODO(Alan Briolat): error handling return; } // Read album information reader.readNextStartElement(); if (reader.name() != "album") { ParsingError("album tag expected. Aborting scan."); return; } QString album_artist = reader.attributes().value("artist").toString(); // Read song information while (reader.readNextStartElement()) { if (reader.name() != "song") { ParsingError("song tag expected. Aborting scan."); return; } Song song; QString id = reader.attributes().value("id").toString(); song.set_title(reader.attributes().value("title").toString()); song.set_album(reader.attributes().value("album").toString()); song.set_track(reader.attributes().value("track").toString().toInt()); song.set_disc(reader.attributes().value("discNumber").toString().toInt()); song.set_artist(reader.attributes().value("artist").toString()); song.set_albumartist(album_artist); song.set_bitrate(reader.attributes().value("bitRate").toString().toInt()); song.set_year(reader.attributes().value("year").toString().toInt()); song.set_genre(reader.attributes().value("genre").toString()); qint64 length = reader.attributes().value("duration").toString().toInt(); length *= kNsecPerSec; song.set_length_nanosec(length); QUrl url = QUrl(QString("subsonic://%1").arg(id)); song.set_url(url); song.set_filesize(reader.attributes().value("size").toString().toInt()); // We need to set these to satisfy the database constraints song.set_directory_id(0); song.set_mtime(0); song.set_ctime(0); songs_ << song; reader.skipCurrentElement(); } // Start the next request if albums remain if (!album_queue_.empty()) { GetAlbum(album_queue_.dequeue()); } // If this was the last response, we're done! if (album_queue_.empty() && pending_requests_.empty()) { scanning_ = false; emit ScanFinished(); } } void SubsonicLibraryScanner::GetAlbumList(int offset) { QUrl url = service_->BuildRequestUrl("getAlbumList2"); url.addQueryItem("type", "alphabeticalByName"); url.addQueryItem("size", QString::number(kAlbumChunkSize)); url.addQueryItem("offset", QString::number(offset)); QNetworkReply* reply = service_->Send(url); NewClosure(reply, SIGNAL(finished()), this, SLOT(OnGetAlbumListFinished(QNetworkReply*, int)), reply, offset); } void SubsonicLibraryScanner::GetAlbum(const QString& id) { QUrl url = service_->BuildRequestUrl("getAlbum"); url.addQueryItem("id", id); QNetworkReply* reply = service_->Send(url); NewClosure(reply, SIGNAL(finished()), this, SLOT(OnGetAlbumFinished(QNetworkReply*)), reply); pending_requests_.insert(reply); } void SubsonicLibraryScanner::ParsingError(const QString& message) { qLog(Warning) << "Subsonic parsing error: " << message; scanning_ = false; emit ScanFinished(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/subsonic/subsonicservice.h000066400000000000000000000127151260417502300272200ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011-2013, Alan Briolat Copyright 2013, Ross Wolfson Copyright 2013, David Sansome Copyright 2013-2014, John Maguire Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_SUBSONIC_SUBSONICSERVICE_H_ #define INTERNET_SUBSONIC_SUBSONICSERVICE_H_ #include #include "internet/core/internetmodel.h" #include "internet/core/internetservice.h" class QNetworkAccessManager; class QNetworkReply; class QSortFilterProxyModel; class QXmlStreamReader; class SubsonicUrlHandler; class SubsonicLibraryScanner; class SubsonicService : public InternetService { Q_OBJECT Q_ENUMS(LoginState) Q_ENUMS(ApiError) public: SubsonicService(Application* app, InternetModel* parent); ~SubsonicService(); enum LoginState { LoginState_Loggedin, LoginState_BadServer, LoginState_OutdatedClient, LoginState_OutdatedServer, LoginState_BadCredentials, LoginState_Unlicensed, LoginState_OtherError, LoginState_Unknown, LoginState_ConnectionRefused, LoginState_HostNotFound, LoginState_Timeout, LoginState_SslError, LoginState_IncompleteCredentials, LoginState_RedirectLimitExceeded, LoginState_RedirectNoUrl, }; enum ApiError { ApiError_Generic = 0, ApiError_ParameterMissing = 10, ApiError_OutdatedClient = 20, ApiError_OutdatedServer = 30, ApiError_BadCredentials = 40, ApiError_Unauthorized = 50, ApiError_Unlicensed = 60, ApiError_NotFound = 70, }; enum Type { Type_Artist = InternetModel::TypeCount, Type_Album, Type_Track, }; enum Role { Role_Id = InternetModel::RoleCount, }; typedef QMap RequestOptions; bool IsConfigured() const; QStandardItem* CreateRootItem(); void LazyPopulate(QStandardItem* item); void ShowContextMenu(const QPoint& global_pos); QWidget* HeaderWidget() const; void ReloadSettings(); void Login(); void Login(const QString& server, const QString& username, const QString& password, const bool& usesslv3); LoginState login_state() const { return login_state_; } // Subsonic API methods void Ping(); QUrl BuildRequestUrl(const QString& view) const; // Scrubs the part of the path that we re-add in BuildRequestUrl(). static QUrl ScrubUrl(const QUrl& url); // Convenience function to reduce QNetworkRequest/QSslConfiguration // boilerplate. QNetworkReply* Send(const QUrl& url); static const char* kServiceName; static const char* kSettingsGroup; static const char* kApiVersion; static const char* kApiClientName; static const char* kSongsTable; static const char* kFtsTable; static const int kMaxRedirects; signals: void LoginStateChanged(SubsonicService::LoginState newstate); private: void EnsureMenuCreated(); // Update configured and working server state void UpdateServer(const QString& server); QNetworkAccessManager* network_; SubsonicUrlHandler* url_handler_; SubsonicLibraryScanner* scanner_; int load_database_task_id_; QMenu* context_menu_; QStandardItem* root_; LibraryBackend* library_backend_; LibraryModel* library_model_; LibraryFilterWidget* library_filter_; QSortFilterProxyModel* library_sort_model_; int total_song_count_; // Configuration // The server that shows up in the GUI (use UpdateServer() to update) QString configured_server_; QString username_; QString password_; bool usesslv3_; LoginState login_state_; QString working_server_; // The actual server, possibly post-redirect int redirect_count_; private slots: void UpdateTotalSongCount(int count); void ReloadDatabase(); void ReloadDatabaseFinished(); void OnLoginStateChanged(SubsonicService::LoginState newstate); void OnPingFinished(QNetworkReply* reply); void ShowConfig(); }; class SubsonicLibraryScanner : public QObject { Q_OBJECT public: explicit SubsonicLibraryScanner(SubsonicService* service, QObject* parent = nullptr); ~SubsonicLibraryScanner(); void Scan(); const SongList& GetSongs() const { return songs_; } static const int kAlbumChunkSize; static const int kConcurrentRequests; signals: void ScanFinished(); private slots: // Step 1: use getAlbumList2 type=alphabeticalByName to list all albums void OnGetAlbumListFinished(QNetworkReply* reply, int offset); // Step 2: use getAlbum id=? to list all songs for each album void OnGetAlbumFinished(QNetworkReply* reply); private: void GetAlbumList(int offset); void GetAlbum(const QString& id); void ParsingError(const QString& message); SubsonicService* service_; bool scanning_; QQueue album_queue_; QSet pending_requests_; SongList songs_; }; #endif // INTERNET_SUBSONIC_SUBSONICSERVICE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/subsonic/subsonicsettingspage.cpp000066400000000000000000000157531260417502300306150ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, 2013, Alan Briolat Copyright 2013, Ross Wolfson Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "subsonicsettingspage.h" #include "ui_subsonicsettingspage.h" #include #include "core/logging.h" #include "internet/core/internetmodel.h" SubsonicSettingsPage::SubsonicSettingsPage(SettingsDialog* dialog) : SettingsPage(dialog), ui_(new Ui_SubsonicSettingsPage), service_(InternetModel::Service()) { ui_->setupUi(this); setWindowIcon(QIcon(":/providers/subsonic-32.png")); connect(ui_->server, SIGNAL(editingFinished()), SLOT(ServerEditingFinished())); connect(ui_->login, SIGNAL(clicked()), SLOT(Login())); connect(ui_->login_state, SIGNAL(LogoutClicked()), SLOT(Logout())); connect(service_, SIGNAL(LoginStateChanged(SubsonicService::LoginState)), SLOT(LoginStateChanged(SubsonicService::LoginState))); ui_->login_state->AddCredentialField(ui_->server); ui_->login_state->AddCredentialField(ui_->username); ui_->login_state->AddCredentialField(ui_->password); ui_->login_state->AddCredentialField(ui_->usesslv3); ui_->login_state->AddCredentialGroup(ui_->server_group); ui_->login_state->SetAccountTypeText( tr("Streaming from a Subsonic server requires a valid server license " "after the 30-day trial period.")); ui_->login_state->SetAccountTypeVisible(true); } SubsonicSettingsPage::~SubsonicSettingsPage() { delete ui_; } void SubsonicSettingsPage::Load() { QSettings s; s.beginGroup(SubsonicService::kSettingsGroup); ui_->server->setText(s.value("server").toString()); ui_->username->setText(s.value("username").toString()); ui_->password->setText(s.value("password").toString()); ui_->usesslv3->setChecked(s.value("usesslv3").toBool()); // If the settings are complete, SubsonicService will have used them already // and // we can tell the user if they worked if (ui_->server->text() != "" && ui_->username->text() != "") { LoginStateChanged(service_->login_state()); } } void SubsonicSettingsPage::Save() { QSettings s; s.beginGroup(SubsonicService::kSettingsGroup); s.setValue("server", ui_->server->text()); s.setValue("username", ui_->username->text()); s.setValue("password", ui_->password->text()); s.setValue("usesslv3", ui_->usesslv3->isChecked()); } void SubsonicSettingsPage::LoginStateChanged( SubsonicService::LoginState newstate) { const bool logged_in = newstate == SubsonicService::LoginState_Loggedin; ui_->login_state->SetLoggedIn( logged_in ? LoginStateWidget::LoggedIn : LoginStateWidget::LoggedOut, QString("%1 (%2)").arg(ui_->username->text()).arg(ui_->server->text())); ui_->login_state->SetAccountTypeVisible(!logged_in); switch (newstate) { case SubsonicService::LoginState_BadServer: ui_->login_state->SetAccountTypeText( tr("Could not connect to Subsonic, check server URL. " "Example: http://localhost:4040/")); break; case SubsonicService::LoginState_BadCredentials: ui_->login_state->SetAccountTypeText(tr("Wrong username or password.")); break; case SubsonicService::LoginState_OutdatedClient: ui_->login_state->SetAccountTypeText(tr( "Incompatible Subsonic REST protocol version. Client must upgrade.")); break; case SubsonicService::LoginState_OutdatedServer: ui_->login_state->SetAccountTypeText(tr( "Incompatible Subsonic REST protocol version. Server must upgrade.")); break; case SubsonicService::LoginState_Unlicensed: ui_->login_state->SetAccountTypeText( tr("The trial period for the Subsonic server is over. " "Please donate to get a license key. Visit subsonic.org for " "details.")); break; case SubsonicService::LoginState_OtherError: ui_->login_state->SetAccountTypeText( tr("An unspecified error occurred.")); break; case SubsonicService::LoginState_ConnectionRefused: ui_->login_state->SetAccountTypeText( tr("Connection refused by server, check server URL. " "Example: http://localhost:4040/")); break; case SubsonicService::LoginState_HostNotFound: ui_->login_state->SetAccountTypeText( tr("Host not found, check server URL. " "Example: http://localhost:4040/")); break; case SubsonicService::LoginState_Timeout: ui_->login_state->SetAccountTypeText( tr("Connection timed out, check server URL. " "Example: http://localhost:4040/")); break; case SubsonicService::LoginState_SslError: ui_->login_state->SetAccountTypeText( tr("SSL handshake error, verify server configuration. " "SSLv3 option below may workaround some issues.")); break; case SubsonicService::LoginState_IncompleteCredentials: ui_->login_state->SetAccountTypeText(tr( "Incomplete configuration, please ensure all fields are populated.")); break; case SubsonicService::LoginState_RedirectLimitExceeded: ui_->login_state->SetAccountTypeText( tr("Redirect limit exceeded, verify server configuration.")); break; case SubsonicService::LoginState_RedirectNoUrl: ui_->login_state->SetAccountTypeText( tr("HTTP 3xx status code received without URL, " "verify server configuration.")); break; default: break; } } void SubsonicSettingsPage::ServerEditingFinished() { QString input = ui_->server->text(); QUrl url = QUrl::fromUserInput(input); // Veto things that don't get guessed as an HTTP URL, the result will be // unhelpful if (!url.scheme().startsWith("http")) { return; } // If the user specified a /rest location, remove it since we're going to // re-add it later url = SubsonicService::ScrubUrl(url); ui_->server->setText(url.toString()); qLog(Debug) << "URL fixed:" << input << "to" << url; } void SubsonicSettingsPage::Login() { ui_->login_state->SetLoggedIn(LoginStateWidget::LoginInProgress); service_->Login(ui_->server->text(), ui_->username->text(), ui_->password->text(), ui_->usesslv3->isChecked()); } void SubsonicSettingsPage::Logout() { ui_->username->setText(""); ui_->password->setText(""); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/subsonic/subsonicsettingspage.h000066400000000000000000000027641260417502300302600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, 2013, Alan Briolat Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_SUBSONIC_SUBSONICSETTINGSPAGE_H_ #define INTERNET_SUBSONIC_SUBSONICSETTINGSPAGE_H_ #include "ui/settingspage.h" #include "subsonicservice.h" class Ui_SubsonicSettingsPage; class SubsonicSettingsPage : public SettingsPage { Q_OBJECT public: explicit SubsonicSettingsPage(SettingsDialog* dialog); ~SubsonicSettingsPage(); void Load(); void Save(); public slots: void LoginStateChanged(SubsonicService::LoginState newstate); private slots: void ServerEditingFinished(); void Login(); void Logout(); private: Ui_SubsonicSettingsPage* ui_; SubsonicService* service_; }; #endif // INTERNET_SUBSONIC_SUBSONICSETTINGSPAGE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/subsonic/subsonicsettingspage.ui000066400000000000000000000055301260417502300304400ustar00rootroot00000000000000 SubsonicSettingsPage 0 0 505 219 Subsonic Server details Server URL Username Password QLineEdit::Password Use SSLv3 Login Qt::Vertical 20 40 LoginStateWidget QWidget
widgets/loginstatewidget.h
1
server username password usesslv3 login
clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/subsonic/subsonicurlhandler.cpp000066400000000000000000000026111260417502300302450ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012-2013, Alan Briolat Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "subsonicservice.h" #include "subsonicurlhandler.h" SubsonicUrlHandler::SubsonicUrlHandler(SubsonicService* service, QObject* parent) : UrlHandler(parent), service_(service) {} UrlHandler::LoadResult SubsonicUrlHandler::StartLoading(const QUrl& url) { if (service_->login_state() != SubsonicService::LoginState_Loggedin) return LoadResult(url); QUrl newurl = service_->BuildRequestUrl("stream"); newurl.addQueryItem("id", url.host()); return LoadResult(url, LoadResult::TrackAvailable, newurl); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/subsonic/subsonicurlhandler.h000066400000000000000000000027031260417502300277140ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012-2013, Alan Briolat Copyright 2014, Krzysztof Sobiecki Copyright 2014, John Maguire Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_SUBSONIC_SUBSONICURLHANDLER_H_ #define INTERNET_SUBSONIC_SUBSONICURLHANDLER_H_ #include "core/urlhandler.h" class SubsonicService; // Subsonic URL handler: subsonic://id class SubsonicUrlHandler : public UrlHandler { Q_OBJECT public: SubsonicUrlHandler(SubsonicService* service, QObject* parent); QString scheme() const { return "subsonic"; } QIcon icon() const { return QIcon(":providers/subsonic-32.png"); } LoadResult StartLoading(const QUrl& url); // LoadResult LoadNext(const QUrl& url); private: SubsonicService* service_; }; #endif // INTERNET_SUBSONIC_SUBSONICURLHANDLER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/vk/000077500000000000000000000000001260417502300224265ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/vk/vkconnection.cpp000066400000000000000000000151751260417502300256430ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Vlad Maltsev Copyright 2014, Krzysztof Sobiecki Copyright 2014, Ivan Leontiev Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "vkconnection.h" #include #include #include #include "core/closure.h" #include "core/logging.h" #include "internet/core/localredirectserver.h" #include "vreen/utils.h" #include "vkservice.h" static const QUrl kVkOAuthEndpoint("https://oauth.vk.com/authorize"); static const QUrl kVkOAuthTokenEndpoint("https://oauth.vk.com/access_token"); static const QUrl kApiUrl("https://api.vk.com/method/"); static const char* kScopeNames[] = { "notify", "friends", "photos", "audio", "video", "docs", "notes", "pages", "status", "offers", "questions", "wall", "groups", "messages", "notifications", "stats", "ads", "offline"}; static const QString kAppID = "3421812"; static const QString kAppSecret = "cY7KMyX46Fq3nscZlbdo"; static const VkConnection::Scopes kScopes = VkConnection::Offline | VkConnection::Audio | VkConnection::Friends | VkConnection::Groups | VkConnection::Status; static const char* kSettingsGroup = "Vk.com/oauth"; VkConnection::VkConnection(QObject* parent) : Connection(parent), state_(Vreen::Client::StateOffline), expires_in_(0), uid_(0) { loadToken(); } VkConnection::~VkConnection() {} void VkConnection::connectToHost(const QString& login, const QString& password) { Q_UNUSED(login) Q_UNUSED(password) if (hasAccount()) { setConnectionState(Vreen::Client::StateOnline); } else { setConnectionState(Vreen::Client::StateConnecting); requestAccessToken(); } } void VkConnection::disconnectFromHost() { clear(); setConnectionState(Vreen::Client::StateOffline); } void VkConnection::clear() { access_token_.clear(); expires_in_ = 0; uid_ = 0; QSettings s; s.beginGroup(kSettingsGroup); s.remove("access_token"); s.remove("expires_in"); s.remove("uid"); } bool VkConnection::hasAccount() { return !access_token_.isNull() && (expires_in_ > static_cast(QDateTime::currentDateTime().toTime_t())); } QNetworkRequest VkConnection::makeRequest(const QString& method, const QVariantMap& args) { QUrl url = kApiUrl; url.setPath(url.path() % QLatin1Literal("/") % method); for (auto it = args.constBegin(); it != args.constEnd(); ++it) { url.addEncodedQueryItem(QUrl::toPercentEncoding(it.key()), QUrl::toPercentEncoding(it.value().toString())); } url.addEncodedQueryItem("access_token", access_token_); return QNetworkRequest(url); } void VkConnection::decorateRequest(QNetworkRequest& request) { QUrl url = request.url(); url.addEncodedQueryItem("access_token", access_token_); request.setUrl(url); } void VkConnection::requestAccessToken() { LocalRedirectServer* server = new LocalRedirectServer(this); server->Listen(); QUrl url = kVkOAuthEndpoint; url.addQueryItem("client_id", kAppID); url.addQueryItem("scope", Vreen::flagsToStrList(kScopes, kScopeNames).join(",")); url.addQueryItem("redirect_uri", server->url().toString()); url.addQueryItem("response_type", "code"); qLog(Debug) << "Try to login to Vk.com" << url; NewClosure(server, SIGNAL(Finished()), this, SLOT(codeRecived(LocalRedirectServer*, QUrl)), server, server->url()); QDesktopServices::openUrl(url); } void VkConnection::codeRecived(LocalRedirectServer* server, QUrl redirect_uri) { if (server->request_url().hasQueryItem("code")) { code_ = server->request_url().queryItemValue("code").toUtf8(); QUrl url = kVkOAuthTokenEndpoint; url.addQueryItem("client_id", kAppID); url.addQueryItem("client_secret", kAppSecret); url.addQueryItem("code", QString::fromUtf8(code_)); url.addQueryItem("redirect_uri", redirect_uri.toString()); qLog(Debug) << "Getting access token" << url; QNetworkRequest request(url); QNetworkReply* reply = network_.get(request); NewClosure(reply, SIGNAL(finished()), this, SLOT(accessTokenRecived(QNetworkReply*)), reply); } else { qLog(Error) << "Login failed" << server->request_url(); clear(); emit connectionStateChanged(Vreen::Client::StateOffline); } } void VkConnection::accessTokenRecived(QNetworkReply* reply) { if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute) != 200) { qLog(Error) << "Failed to get access token" << reply->readAll(); emit setConnectionState(Vreen::Client::StateOffline); clear(); return; } QJson::Parser parser; bool ok = false; QByteArray reply_data = reply->readAll(); QVariantMap result = parser.parse(reply_data, &ok).toMap(); if (!ok) { qLog(Error) << "Failed to parse oauth reply" << reply_data; emit setConnectionState(Vreen::Client::StateOffline); clear(); return; } qLog(Debug) << result; access_token_ = result["access_token"].toByteArray(); expires_in_ = result["expires_in"].toUInt(); uid_ = result["user_id"].toInt(); if (expires_in_) { expires_in_ += QDateTime::currentDateTime().toTime_t(); } else { expires_in_ += QDateTime::currentDateTime().addMonths(1).toTime_t(); } qLog(Debug) << "Access token expires in" << expires_in_; saveToken(); setConnectionState(Vreen::Client::StateOnline); reply->deleteLater(); } void VkConnection::setConnectionState(Vreen::Client::State state) { if (state != state_) { state_ = state; emit connectionStateChanged(state); } } void VkConnection::saveToken() { QSettings s; s.beginGroup(kSettingsGroup); s.setValue("access_token", access_token_); s.setValue("expires_in", QVariant::fromValue(expires_in_)); s.setValue("uid", uid_); } void VkConnection::loadToken() { QSettings s; s.beginGroup(kSettingsGroup); access_token_ = s.value("access_token").toByteArray(); expires_in_ = s.value("expires_in").toUInt(); uid_ = s.value("uid").toInt(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/vk/vkconnection.h000066400000000000000000000047251260417502300253070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Krzysztof Sobiecki Copyright 2014, Maltsev Vlad Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_VK_VKCONNECTION_H_ #define INTERNET_VK_VKCONNECTION_H_ #include "vreen/client.h" #include "vreen/connection.h" class LocalRedirectServer; class VkConnection : public Vreen::Connection { Q_OBJECT Q_ENUMS(DisplayType) Q_FLAGS(Scopes) public: enum DisplayType { Page, Popup, Touch, Wap }; enum Scope { Notify = 0x1, Friends = 0x2, Photos = 0x4, Audio = 0x8, Video = 0x10, Docs = 0x20, Notes = 0x40, Pages = 0x80, Status = 0x100, Offers = 0x200, Questions = 0x400, Wall = 0x800, Groups = 0x1000, Messages = 0x2000, Notifications = 0x4000, Stats = 0x8000, Ads = 0x10000, Offline = 0x20000 }; Q_DECLARE_FLAGS(Scopes, Scope) explicit VkConnection(QObject* parent = 0); ~VkConnection(); void connectToHost(const QString& login, const QString& password); void disconnectFromHost(); Vreen::Client::State connectionState() const { return state_; } int uid() const { return uid_; } void clear(); bool hasAccount(); protected: QNetworkRequest makeRequest(const QString& method, const QVariantMap& args = QVariantMap()); void decorateRequest(QNetworkRequest& request); private slots: void codeRecived(LocalRedirectServer* server, QUrl redirect_uri); void accessTokenRecived(QNetworkReply* reply); private: void requestAccessToken(); void setConnectionState(Vreen::Client::State state); void saveToken(); void loadToken(); QNetworkAccessManager network_; Vreen::Client::State state_; QByteArray code_; QByteArray access_token_; time_t expires_in_; int uid_; }; Q_DECLARE_OPERATORS_FOR_FLAGS(VkConnection::Scopes) #endif // INTERNET_VK_VKCONNECTION_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/vk/vkmusiccache.cpp000066400000000000000000000136661260417502300256130ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Maltsev Vlad Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "vkmusiccache.h" #include #include #include "core/application.h" #include "core/logging.h" #include "core/taskmanager.h" #include "vkservice.h" VkMusicCache::VkMusicCache(Application* app, VkService* service) : QObject(service), app_(app), service_(service), current_song_index(0), is_downloading(false), is_aborted(false), task_id(0), file_(NULL), network_manager_(new QNetworkAccessManager), reply_(NULL) {} QUrl VkMusicCache::Get(const QUrl& url) { QUrl result; if (InCache(url)) { QString cached_filename = CachedFilename(url); qLog(Info) << "Use cashed file" << cached_filename; result = QUrl::fromLocalFile(cached_filename); } return result; } void VkMusicCache::AddToCache(const QUrl& url, const QUrl& media_url, bool force) { AddToQueue(CachedFilename(url), media_url); if (!force) { current_song_index = queue_.size(); } } void VkMusicCache::BreakCurrentCaching() { if (current_song_index > 0) { // Current song in queue queue_.removeAt(current_song_index - 1); } else if (current_song_index == 0) { // Current song is downloading if (reply_) { reply_->abort(); is_aborted = true; } } } /*** * Queue operations */ void VkMusicCache::AddToQueue(const QString& filename, const QUrl& download_url) { DownloadItem item; item.filename = filename; item.url = download_url; queue_.push_back(item); DownloadNext(); } /*** * Downloading */ void VkMusicCache::DownloadNext() { if (is_downloading || queue_.isEmpty()) { return; } else { current_download = queue_.first(); queue_.pop_front(); current_song_index--; // Check file path and file existance first if (QFile::exists(current_download.filename)) { qLog(Warning) << "Tried to overwrite already cached file" << current_download.filename; return; } // Create temporarry file we download to. if (file_) { qLog(Warning) << "QFile" << file_->fileName() << "is not null"; delete file_; file_ = NULL; } file_ = new QTemporaryFile; if (!file_->open(QFile::WriteOnly)) { qLog(Warning) << "Can not create temporary file" << file_->fileName() << "Download right away to" << current_download.filename; } // Start downloading is_aborted = false; is_downloading = true; task_id = app_->task_manager()->StartTask( tr("Caching %1").arg(QFileInfo(current_download.filename).baseName())); reply_ = network_manager_->get(QNetworkRequest(current_download.url)); connect(reply_, SIGNAL(finished()), SLOT(Downloaded())); connect(reply_, SIGNAL(readyRead()), SLOT(DownloadReadyToRead())); connect(reply_, SIGNAL(downloadProgress(qint64, qint64)), SLOT(DownloadProgress(qint64, qint64))); qLog(Info) << "Start cashing" << current_download.filename << "from" << current_download.url; } } void VkMusicCache::DownloadProgress(qint64 bytesReceived, qint64 bytesTotal) { if (bytesTotal) { int progress = qRound(100 * bytesReceived / bytesTotal); app_->task_manager()->SetTaskProgress(task_id, progress, 100); } } void VkMusicCache::DownloadReadyToRead() { if (file_) { file_->write(reply_->readAll()); } else { qLog(Warning) << "Tried to write recived song to not created file"; } } void VkMusicCache::Downloaded() { app_->task_manager()->SetTaskFinished(task_id); if (is_aborted || reply_->error()) { if (reply_->error()) { qLog(Info) << "Downloading failed" << reply_->errorString(); } } else { DownloadReadyToRead(); // Save all recent recived data. QString path = service_->cacheDir(); if (file_->size() > 0) { QDir(path).mkpath(QFileInfo(current_download.filename).path()); if (file_->copy(current_download.filename)) { qLog(Info) << "Cached" << current_download.filename; } else { qLog(Error) << "Unable to save" << current_download.filename << ":" << file_->errorString(); } } else { qLog(Error) << "File" << current_download.filename << "is empty"; } } delete file_; file_ = NULL; reply_->deleteLater(); reply_ = NULL; is_downloading = false; DownloadNext(); } /*** * Utils */ bool VkMusicCache::InCache(const QUrl& url) { return QFile::exists(CachedFilename(url)); } QString VkMusicCache::CachedFilename(const QUrl& url) { QStringList args = url.path().split('/'); QString cache_filename; if (args.size() == 4) { cache_filename = service_->cacheFilename(); cache_filename.replace("%artist", args[2]); cache_filename.replace("%title", args[3]); } else { qLog(Warning) << "Song url with args" << args << "does not contain artist and title" << "use id as file name for cache."; cache_filename = args[1]; } QString cache_dir = service_->cacheDir(); if (cache_dir.isEmpty()) { qLog(Warning) << "Cache dir not defined"; return ""; } // TODO(Vk): Maybe use extenstion from link? Seems it's always mp3. return cache_dir + QDir::separator() + cache_filename + ".mp3"; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/vk/vkmusiccache.h000066400000000000000000000045151260417502300252510ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Maltsev Vlad Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_VK_VKMUSICCACHE_H_ #define INTERNET_VK_VKMUSICCACHE_H_ #include #include #include #include #include class VkService; class Application; class VkMusicCache : public QObject { Q_OBJECT public: explicit VkMusicCache(Application* app, VkService* service); ~VkMusicCache() {} // Return file path if file in cache otherwise // return internet url and add song to caching queue QUrl Get(const QUrl& url); void AddToCache(const QUrl& url, const QUrl& media_url, bool force = false); void BreakCurrentCaching(); bool InCache(const QUrl& url); private slots: void AddToQueue(const QString& filename, const QUrl& download_url); void DownloadNext(); void DownloadProgress(qint64 bytesReceived, qint64 bytesTotal); void DownloadReadyToRead(); void Downloaded(); private: struct DownloadItem { QString filename; QUrl url; bool operator==(const DownloadItem& rhv) { return filename == rhv.filename; } }; QString CachedFilename(const QUrl& url); Application* app_; VkService* service_; QList queue_; // Contain index of current song in queue, need for removing if song was // skipped. It's zero if song downloading now, and less that zero // if current song not caching or cached. int current_song_index; DownloadItem current_download; bool is_downloading; bool is_aborted; int task_id; QFile* file_; QNetworkAccessManager* network_manager_; QNetworkReply* reply_; }; #endif // INTERNET_VK_VKMUSICCACHE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/vk/vksearchdialog.cpp000066400000000000000000000132611260417502300261230ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Krzysztof Sobiecki Copyright 2014, Maltsev Vlad Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "vksearchdialog.h" #include "ui_vksearchdialog.h" #include #include #include "vkservice.h" VkSearchDialog::VkSearchDialog(VkService* service, QWidget* parent) : QDialog(parent), ui(new Ui::VkSearchDialog), service_(service), last_search_(SearchID(SearchID::UserOrGroup)) { ui->setupUi(this); timer = new QTimer(this); timer->setSingleShot(true); timer->setInterval(100); connect(timer, SIGNAL(timeout()), SLOT(suggest())); connect(ui->searchLine, SIGNAL(textChanged(QString)), timer, SLOT(start())); popup = new QTreeWidget(this); popup->setColumnCount(2); popup->setUniformRowHeights(true); popup->setRootIsDecorated(false); popup->setEditTriggers(QTreeWidget::NoEditTriggers); popup->setSelectionBehavior(QTreeWidget::SelectRows); popup->setFrameStyle(QFrame::Box | QFrame::Plain); popup->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); popup->header()->hide(); popup->installEventFilter(this); popup->setMouseTracking(true); popup->setWindowFlags(Qt::Popup); popup->setFocusPolicy(Qt::NoFocus); popup->setFocusProxy(parent); connect(popup, SIGNAL(itemSelectionChanged()), SLOT(selectionChanged())); connect(popup, SIGNAL(clicked(QModelIndex)), SLOT(selected())); connect(this, SIGNAL(Find(QString)), service_, SLOT(FindUserOrGroup(QString))); connect(service_, SIGNAL(UserOrGroupSearchResult(SearchID, MusicOwnerList)), this, SLOT(ReceiveResults(SearchID, MusicOwnerList))); ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); } VkSearchDialog::~VkSearchDialog() { delete ui; delete popup; } void VkSearchDialog::suggest() { emit Find(ui->searchLine->text()); } void VkSearchDialog::selected() { selectionChanged(); ui->searchLine->setText(selected_.name()); timer->stop(); popup->hide(); } void VkSearchDialog::ReceiveResults(const SearchID& id, const MusicOwnerList& owners) { if (id.id() > last_search_.id()) { popup->setUpdatesEnabled(false); popup->clear(); if (owners.count() > 0) { for (const MusicOwner& own : owners) { popup->addTopLevelItem(createItem(own)); } } else { popup->addTopLevelItem(new QTreeWidgetItem(QStringList(tr("Nothing found")))); } popup->setCurrentItem(popup->topLevelItem(0)); popup->resizeColumnToContents(0); int ch = popup->columnWidth(0); if (ch > 0.8 * ui->searchLine->width()) { popup->setColumnWidth(0, qRound(0.8 * ui->searchLine->width())); } popup->resizeColumnToContents(1); popup->adjustSize(); popup->setUpdatesEnabled(true); int elems = (owners.count() > 0) ? owners.count() : 1; int h = popup->sizeHintForRow(0) * qMin(10, elems) + 3; popup->resize(ui->searchLine->width(), h); QPoint relpos = ui->searchLine->pos() + QPoint(0, ui->searchLine->height()); popup->move(mapToGlobal(relpos)); popup->setFocus(); popup->show(); } } void VkSearchDialog::showEvent(QShowEvent*) { ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); selected_ = MusicOwner(); ui->searchLine->clear(); } void VkSearchDialog::selectionChanged() { if (popup->selectedItems().size() > 0) { QTreeWidgetItem* sel = popup->selectedItems()[0]; selected_ = sel->data(0, Qt::UserRole).value(); ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(selected_.id() != 0); ui->buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); } } MusicOwner VkSearchDialog::found() const { return selected_; } bool VkSearchDialog::eventFilter(QObject* obj, QEvent* ev) { if (obj != popup) return false; if (ev->type() == QEvent::MouseButtonPress) { popup->hide(); ui->searchLine->setFocus(); return true; } if (ev->type() == QEvent::KeyPress) { bool consumed = false; int key = static_cast(ev)->key(); switch (key) { case Qt::Key_Enter: case Qt::Key_Return: selected(); break; case Qt::Key_Escape: ui->searchLine->setFocus(); popup->hide(); consumed = true; break; case Qt::Key_Up: case Qt::Key_Down: case Qt::Key_Home: case Qt::Key_End: case Qt::Key_PageUp: case Qt::Key_PageDown: break; default: ui->searchLine->setFocus(); ui->searchLine->event(ev); break; } return consumed; } return false; } QTreeWidgetItem* VkSearchDialog::createItem(const MusicOwner& own) { QTreeWidgetItem* item = new QTreeWidgetItem(popup); item->setText(0, own.name()); if (own.id() > 0) { item->setIcon(0, QIcon(":vk/user.png")); } else { item->setIcon(0, QIcon(":vk/group.png")); } item->setData(0, Qt::UserRole, QVariant::fromValue(own)); item->setText(1, QString::number(own.song_count())); item->setTextAlignment(1, Qt::AlignRight); item->setTextColor(1, palette().color(QPalette::WindowText)); return item; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/vk/vksearchdialog.h000066400000000000000000000032721260417502300255710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Krzysztof Sobiecki Copyright 2014, Maltsev Vlad Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_VK_VKSEARCHDIALOG_H_ #define INTERNET_VK_VKSEARCHDIALOG_H_ #include #include #include #include "vkservice.h" namespace Ui { class VkSearchDialog; } class VkSearchDialog : public QDialog { Q_OBJECT public: explicit VkSearchDialog(VkService* service, QWidget* parent = 0); ~VkSearchDialog(); MusicOwner found() const; signals: void Find(const QString& query); public slots: void ReceiveResults(const SearchID& id, const MusicOwnerList& owners); protected: void showEvent(QShowEvent*); private slots: void selectionChanged(); void suggest(); void selected(); private: bool eventFilter(QObject* obj, QEvent* ev); QTreeWidgetItem* createItem(const MusicOwner& own); Ui::VkSearchDialog* ui; MusicOwner selected_; VkService* service_; SearchID last_search_; QTreeWidget* popup; QTimer* timer; }; #endif // INTERNET_VK_VKSEARCHDIALOG_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/vk/vksearchdialog.ui000066400000000000000000000027401260417502300257560ustar00rootroot00000000000000 VkSearchDialog 0 0 418 78 Dialog Qt::Vertical QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() VkSearchDialog accept() 248 254 157 274 buttonBox rejected() VkSearchDialog reject() 316 260 286 274 clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/vk/vkservice.cpp000066400000000000000000001325351260417502300251440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Vlad Maltsev Copyright 2014, Krzysztof Sobiecki Copyright 2014, Ivan Leontiev Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "vkservice.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "core/application.h" #include "core/closure.h" #include "core/logging.h" #include "core/mergedproxymodel.h" #include "core/player.h" #include "core/timeconstants.h" #include "core/utilities.h" #include "ui/iconloader.h" #include "widgets/didyoumean.h" #include "globalsearch/globalsearch.h" #include "internet/core/internetmodel.h" #include "internet/core/internetplaylistitem.h" #include "internet/core/searchboxwidget.h" #include "vreen/audio.h" #include "vreen/contact.h" #include "vreen/roster.h" #include "globalsearch/vksearchprovider.h" #include "vkmusiccache.h" #include "vksearchdialog.h" const char* VkService::kServiceName = "Vk.com"; const char* VkService::kSettingGroup = "Vk.com"; const char* VkService::kUrlScheme = "vk"; const char* VkService::kDefCacheFilename = "%artist - %title"; const int VkService::kMaxVkSongList = 6000; const int VkService::kMaxVkWallPostList = 100; const int VkService::kMaxVkSongCount = 300; const int VkService::kSearchDelayMsec = 400; QString VkService::DefaultCacheDir() { return QDir::toNativeSeparators( Utilities::GetConfigPath(Utilities::Path_CacheRoot) + "/vkcache"); } uint SearchID::last_id_ = 0; /*** * Little functions */ inline static void RemoveLastRow(QStandardItem* item, VkService::ItemType type) { QStandardItem* last_item = item->child(item->rowCount() - 1); if (last_item->data(InternetModel::Role_Type).toInt() == type) { item->removeRow(item->rowCount() - 1); } else { qLog(Error) << "Tryed to remove row" << last_item->text() << "of type" << last_item->data(InternetModel::Role_Type).toInt() << "instead of" << type << "from" << item->text(); } } struct SongId { SongId() : audio_id(0), owner_id(0) {} int audio_id; int owner_id; }; static SongId ExtractIds(const QUrl& url) { SongId res; QString song_ids = url.path().section('/', 1, 1); res.owner_id = song_ids.section('_', 0, 0).toInt(); res.audio_id = song_ids.section('_', 1, 1).toInt(); if (res.owner_id && res.audio_id && url.scheme() == "vk" && url.host() == "song") { return res; } else { qLog(Error) << "Wromg song url" << url; return SongId(); } } static Song SongFromUrl(const QUrl& url) { Song result; if (url.scheme() == "vk" && url.host() == "song") { QStringList ids = url.path().split('/'); if (ids.size() == 4) { result.set_artist(ids[2]); result.set_title(ids[3]); result.set_valid(true); } else { qLog(Error) << "Wrong song url" << url; result.set_valid(false); } result.set_url(url); } else { qLog(Error) << "Wrong song url" << url; result.set_valid(false); } return result; } MusicOwner::MusicOwner(const QUrl& group_url) { QStringList tokens = group_url.path().split('/'); if (group_url.scheme() == "vk" && group_url.host() == "group" && tokens.size() == 5) { id_ = -tokens[1].toInt(); songs_count_ = tokens[2].toInt(); screen_name_ = tokens[3]; name_ = tokens[4].replace('_', '/'); } else { qLog(Error) << "Wrong group url" << group_url; } } Song MusicOwner::toOwnerRadio() const { Song song; song.set_title(QObject::tr("%1 (%2 songs)").arg(name_).arg(songs_count_)); song.set_url(QUrl(QString("vk://group/%1/%2/%3/%4") .arg(-id_) .arg(songs_count_) .arg(screen_name_) .arg(QString(name_).replace('/', '_')))); song.set_artist(" " + QObject::tr("Community Radio")); song.set_valid(true); return song; } QDataStream& operator<<(QDataStream& stream, const MusicOwner& val) { stream << val.id_; stream << val.name_; stream << val.songs_count_; stream << val.screen_name_; return stream; } QDataStream& operator>>(QDataStream& stream, MusicOwner& var) { stream >> var.id_; stream >> var.name_; stream >> var.songs_count_; stream >> var.screen_name_; return stream; } QDebug operator<<(QDebug d, const MusicOwner& owner) { d << "MusicOwner(" << owner.id_ << "," << owner.name_ << "," << owner.songs_count_ << "," << owner.screen_name_ << ")"; return d; } MusicOwnerList MusicOwner::parseMusicOwnerList(const QVariant& request_result) { auto list = request_result.toList(); MusicOwnerList result; for (const auto& item : list) { auto map = item.toMap(); MusicOwner owner; owner.songs_count_ = map.value("songs_count").toInt(); owner.id_ = map.value("id").toInt(); owner.name_ = map.value("name").toString(); owner.screen_name_ = map.value("screen_name").toString(); owner.photo_ = map.value("photo").toUrl(); result.append(owner); } return result; } VkService::VkService(Application* app, InternetModel* parent) : InternetService(kServiceName, app, parent, parent), root_item_(NULL), recommendations_item_(NULL), my_music_item_(NULL), my_albums_item_(NULL), search_result_item_(NULL), context_menu_(NULL), update_item_(NULL), find_this_artist_(NULL), add_to_my_music_(NULL), remove_from_my_music_(NULL), add_song_to_cache_(NULL), copy_share_url_(NULL), add_to_bookmarks_(NULL), remove_from_bookmarks_(NULL), find_owner_(NULL), search_box_(new SearchBoxWidget(this)), vk_search_dialog_(new VkSearchDialog(this)), client_(new Vreen::Client), connection_(new VkConnection(this)), url_handler_(new VkUrlHandler(this, this)), audio_provider_(new Vreen::AudioProvider(client_.get())), cache_(new VkMusicCache(app_, this)), last_search_id_(0), search_delay_(new QTimer(this)) { QSettings s; s.beginGroup(kSettingGroup); /* Init connection */ client_->setTrackMessages(false); client_->setInvisible(true); client_->setConnection(connection_.get()); ReloadSettings(); if (HasAccount()) { Login(); } connect(client_.get(), SIGNAL(connectionStateChanged(Vreen::Client::State)), SLOT(ChangeConnectionState(Vreen::Client::State))); connect(client_.get(), SIGNAL(error(Vreen::Client::Error)), SLOT(Error(Vreen::Client::Error))); /* Init interface */ VkSearchProvider* search_provider = new VkSearchProvider(app_, this); search_provider->Init(this); app_->global_search()->AddProvider(search_provider); search_delay_->setInterval(kSearchDelayMsec); search_delay_->setSingleShot(true); connect(search_delay_, SIGNAL(timeout()), SLOT(DoLocalSearch())); connect(search_box_, SIGNAL(TextChanged(QString)), SLOT(FindSongs(QString))); connect(this, SIGNAL(SongSearchResult(SearchID, SongList)), SLOT(SearchResultLoaded(SearchID, SongList))); app_->player()->RegisterUrlHandler(url_handler_); } VkService::~VkService() {} /*** * Interface */ QStandardItem* VkService::CreateRootItem() { root_item_ = new QStandardItem(QIcon(":providers/vk.png"), kServiceName); root_item_->setData(true, InternetModel::Role_CanLazyLoad); return root_item_; } void VkService::LazyPopulate(QStandardItem* parent) { switch (parent->data(InternetModel::Role_Type).toInt()) { case InternetModel::Type_Service: UpdateRoot(); break; case Type_Recommendations: UpdateRecommendations(); break; case Type_AlbumList: UpdateAlbumList(parent); break; case Type_Music: UpdateMusic(parent); break; case Type_Album: UpdateAlbumSongs(parent); break; case Type_Wall: UpdateWallSongs(parent); break; default: break; } } void VkService::EnsureMenuCreated() { if (!context_menu_) { context_menu_ = new QMenu; context_menu_->addActions(GetPlaylistActions()); context_menu_->addSeparator(); add_to_bookmarks_ = context_menu_->addAction(QIcon(":vk/add.png"), tr("Add to bookmarks"), this, SLOT(AddSelectedToBookmarks())); remove_from_bookmarks_ = context_menu_->addAction( QIcon(":vk/remove.png"), tr("Remove from bookmarks"), this, SLOT(RemoveFromBookmark())); context_menu_->addSeparator(); find_this_artist_ = context_menu_->addAction(QIcon(":vk/find.png"), tr("Find this artist"), this, SLOT(FindThisArtist())); add_to_my_music_ = context_menu_->addAction(QIcon(":vk/add.png"), tr("Add to My Music"), this, SLOT(AddToMyMusic())); remove_from_my_music_ = context_menu_->addAction( QIcon(":vk/remove.png"), tr("Remove from My Music"), this, SLOT(RemoveFromMyMusic())); add_song_to_cache_ = context_menu_->addAction(QIcon(":vk/download.png"), tr("Add song to cache"), this, SLOT(AddSelectedToCache())); copy_share_url_ = context_menu_->addAction( QIcon(":vk/link.png"), tr("Copy share url to clipboard"), this, SLOT(CopyShareUrl())); find_owner_ = context_menu_->addAction(QIcon(":vk/find.png"), tr("Add user/group to bookmarks"), this, SLOT(ShowSearchDialog())); update_item_ = context_menu_->addAction(IconLoader::Load("view-refresh"), tr("Update"), this, SLOT(UpdateItem())); context_menu_->addSeparator(); context_menu_->addAction(IconLoader::Load("configure"), tr("Configure Vk.com..."), this, SLOT(ShowConfig())); } } void VkService::ShowContextMenu(const QPoint& global_pos) { EnsureMenuCreated(); QModelIndex current(model()->current_index()); QStandardItem* current_item = model()->itemFromIndex(current); const int item_type = current.data(InternetModel::Role_Type).toInt(); const int parent_type = current.parent().data(InternetModel::Role_Type).toInt(); const bool is_playable = model()->IsPlayable(current); const bool is_my_music_item = current_item == my_music_item_ || current_item->parent() == my_music_item_; const bool is_track = item_type == InternetModel::Type_Track; const bool is_bookmark = item_type == Type_Bookmark; const bool is_updatable = item_type != Type_Bookmark && item_type != Type_Loading && item_type != Type_More && item_type != Type_Search && parent_type != Type_Search; const bool is_update_enable = // To prevent call LazyPopulate twice when we try to Update not populated // item !current.data(InternetModel::Role_CanLazyLoad).toBool() && !current.parent().data(InternetModel::Role_CanLazyLoad).toBool() && // disable update action until all of item's children have finished // updating !isItemBusy(model()->itemFromIndex(current)); bool is_in_mymusic = false; bool is_cached = false; if (is_track) { selected_song_ = current.data(InternetModel::Role_SongMetadata).value(); is_in_mymusic = is_my_music_item || ExtractIds(selected_song_.url()).owner_id == UserID(); is_cached = cache_->InCache(selected_song_.url()); } update_item_->setVisible(is_updatable); update_item_->setEnabled(is_update_enable); find_this_artist_->setVisible(is_track); add_song_to_cache_->setVisible(is_track && !is_cached); add_to_my_music_->setVisible(is_track && !is_in_mymusic); remove_from_my_music_->setVisible(is_track && is_in_mymusic); copy_share_url_->setVisible(is_track); remove_from_bookmarks_->setVisible(is_bookmark); add_to_bookmarks_->setVisible(false); GetAppendToPlaylistAction()->setEnabled(is_playable); GetReplacePlaylistAction()->setEnabled(is_playable); GetOpenInNewPlaylistAction()->setEnabled(is_playable); context_menu_->popup(global_pos); } void VkService::ItemDoubleClicked(QStandardItem* item) { switch (item->data(InternetModel::Role_Type).toInt()) { case Type_More: switch (item->parent()->data(InternetModel::Role_Type).toInt()) { case Type_Recommendations: MoreRecommendations(); break; case Type_Search: FindMore(); break; case Type_Wall: MoreWallSongs(item); break; default: qLog(Warning) << "Wrong parent for More item:" << item->parent()->text(); } break; default: qLog(Warning) << "Wrong item for double click with type:" << item->data(InternetModel::Role_Type); } } QList VkService::playlistitem_actions(const Song& song) { EnsureMenuCreated(); QList actions; if (song.url().host() == "song") { selected_song_ = song; } else if (song.url().host() == "group") { add_to_bookmarks_->setVisible(true); actions << add_to_bookmarks_; if (song.url() == current_group_url_) { // Selected now playing group. selected_song_ = current_song_; } else { // If selected not playing group, return only "Add to bookmarks" action. selected_song_ = song; return actions; } } // Adding songs actions. find_this_artist_->setVisible(true); actions << find_this_artist_; if (ExtractIds(selected_song_.url()).owner_id != UserID()) { add_to_my_music_->setVisible(true); actions << add_to_my_music_; } else { remove_from_my_music_->setVisible(true); actions << remove_from_my_music_; } copy_share_url_->setVisible(true); actions << copy_share_url_; if (!cache_->InCache(selected_song_.url())) { add_song_to_cache_->setVisible(true); actions << add_song_to_cache_; } return actions; } void VkService::ShowConfig() { app_->OpenSettingsDialogAtPage(SettingsDialog::Page_Vk); } void VkService::UpdateRoot() { ClearStandardItem(root_item_); if (HasAccount()) { CreateAndAppendRow(root_item_, Type_Recommendations); AppendMusic(root_item_, true); AppendAlbumList(root_item_, true); LoadBookmarks(); } else { ShowConfig(); } } QWidget* VkService::HeaderWidget() const { if (HasAccount()) { return search_box_; } else { return NULL; } } QStandardItem* VkService::CreateAndAppendRow(QStandardItem* parent, VkService::ItemType type) { QStandardItem* item = NULL; switch (type) { case Type_Loading: item = new QStandardItem(tr("Loading...")); break; case Type_More: item = new QStandardItem(tr("More")); item->setData(InternetModel::PlayBehaviour_DoubleClickAction, InternetModel::Role_PlayBehaviour); break; case Type_Recommendations: item = new QStandardItem(QIcon(":vk/recommends.png"), tr("My Recommendations")); item->setData(true, InternetModel::Role_CanLazyLoad); item->setData(InternetModel::PlayBehaviour_MultipleItems, InternetModel::Role_PlayBehaviour); recommendations_item_ = item; break; case Type_Search: item = new QStandardItem(QIcon(":vk/find.png"), tr("Search")); item->setData(InternetModel::PlayBehaviour_MultipleItems, InternetModel::Role_PlayBehaviour); search_result_item_ = item; break; case Type_Bookmark: qLog(Error) << "Use AppendBookmark(const MusicOwner &owner)" << "for creating Bookmark item instead."; break; case Type_Album: qLog(Error) << "Use AppendAlbum(const Vreen::AudioAlbumItem &album)" << "for creating Album item instead."; break; default: qLog(Error) << "Invalid type for creating row: " << type; break; } item->setData(type, InternetModel::Role_Type); parent->appendRow(item); return item; } /*** * Connection */ void VkService::Login() { client_->connectToHost(); } void VkService::Logout() { if (connection_) { client_->disconnectFromHost(); connection_->clear(); } } bool VkService::HasAccount() const { return connection_->hasAccount(); } int VkService::UserID() const { return connection_->uid(); } void VkService::ChangeConnectionState(Vreen::Client::State state) { qLog(Debug) << "Connection state changed to" << state; switch (state) { case Vreen::Client::StateOnline: emit LoginSuccess(true); UpdateRoot(); break; case Vreen::Client::StateInvalid: case Vreen::Client::StateOffline: emit LoginSuccess(false); UpdateRoot(); break; case Vreen::Client::StateConnecting: break; default: qLog(Error) << "Wrong connection state " << state; break; } } void VkService::RequestUserProfile() { QVariantMap args; args.insert("users_ids", "0"); Vreen::Reply* reply = client_->request("users.get", args); connect(reply, SIGNAL(resultReady(QVariant)), this, SLOT(UserProfileRecived(QVariant)), Qt::UniqueConnection); } void VkService::UserProfileRecived(const QVariant& result) { auto list = result.toList(); if (!list.isEmpty()) { auto profile = list[0].toMap(); QString name = profile.value("first_name").toString() + " " + profile.value("last_name").toString(); emit NameUpdated(name); } else { qLog(Debug) << "Fetching user profile failed" << result; } } void VkService::Error(Vreen::Client::Error error) { QString msg; switch (error) { case Vreen::Client::ErrorApplicationDisabled: msg = "Application disabled"; break; case Vreen::Client::ErrorIncorrectSignature: msg = "Incorrect signature"; break; case Vreen::Client::ErrorAuthorizationFailed: msg = "Authorization failed"; emit LoginSuccess(false); break; case Vreen::Client::ErrorToManyRequests: msg = "Too many requests"; break; case Vreen::Client::ErrorPermissionDenied: msg = "Permission denied"; break; case Vreen::Client::ErrorCaptchaNeeded: msg = "Captcha needed"; QMessageBox::critical(NULL, tr("Error"), tr("Captcha is needed.\n" "Try to login into Vk.com with your browser," "to fix this problem."), QMessageBox::Close); break; case Vreen::Client::ErrorMissingOrInvalidParameter: msg = "Missing or invalid parameter"; break; case Vreen::Client::ErrorNetworkReply: msg = "Network reply"; break; default: msg = "Unknown error"; break; } qLog(Error) << "Client error: " << error << msg; } /*** * My Music */ void VkService::UpdateMusic(QStandardItem* item) { if (item) { MusicOwner owner = item->data(Role_MusicOwnerMetadata).value(); LoadAndAppendSongList(item, owner.id()); } } /*** * Recommendation */ void VkService::UpdateRecommendations() { ClearStandardItem(recommendations_item_); CreateAndAppendRow(recommendations_item_, Type_Loading); auto my_audio = audio_provider_->getRecommendationsForUser(0, kMaxVkSongCount, 0); NewClosure(my_audio, SIGNAL(resultReady(QVariant)), this, SLOT(RecommendationsLoaded(Vreen::AudioItemListReply*)), my_audio); } void VkService::MoreRecommendations() { RemoveLastRow(recommendations_item_, Type_More); CreateAndAppendRow(recommendations_item_, Type_Loading); auto my_audio = audio_provider_->getRecommendationsForUser( 0, kMaxVkSongCount, recommendations_item_->rowCount() - 1); NewClosure(my_audio, SIGNAL(resultReady(QVariant)), this, SLOT(RecommendationsLoaded(Vreen::AudioItemListReply*)), my_audio); } void VkService::RecommendationsLoaded(Vreen::AudioItemListReply* reply) { SongList songs = FromAudioList(reply->result()); RemoveLastRow(recommendations_item_, Type_Loading); AppendSongs(recommendations_item_, songs); if (songs.count() > 0) { CreateAndAppendRow(recommendations_item_, Type_More); } } /*** * Bookmarks */ void VkService::AddSelectedToBookmarks() { QUrl group_url; if (selected_song_.url().scheme() == "vk" && selected_song_.url().host() == "song") { // Selected song is song of now playing group, so group url in // current_group_url_ group_url = current_group_url_; } else { // Otherwise selectet group radio in playlist group_url = selected_song_.url(); } AppendBookmark(MusicOwner(group_url)); SaveBookmarks(); } void VkService::RemoveFromBookmark() { QModelIndex current(model()->current_index()); root_item_->removeRow(current.row()); SaveBookmarks(); } void VkService::SaveBookmarks() { QSettings s; s.beginGroup(kSettingGroup); s.beginWriteArray("bookmarks"); int index = 0; for (int i = 0; i < root_item_->rowCount(); ++i) { auto item = root_item_->child(i); if (item->data(InternetModel::Role_Type).toInt() == Type_Bookmark) { MusicOwner owner = item->data(Role_MusicOwnerMetadata).value(); s.setArrayIndex(index); qLog(Info) << "Save" << index << ":" << owner; s.setValue("owner", QVariant::fromValue(owner)); ++index; } } s.endArray(); } void VkService::LoadBookmarks() { QSettings s; s.beginGroup(kSettingGroup); int max = s.beginReadArray("bookmarks"); for (int i = 0; i < max; ++i) { s.setArrayIndex(i); MusicOwner owner = s.value("owner").value(); qLog(Info) << "Load" << i << ":" << owner; AppendBookmark(owner); } s.endArray(); } QStandardItem* VkService::AppendBookmark(const MusicOwner& owner) { QIcon icon; if (owner.id() > 0) { icon = QIcon(":vk/user.png"); } else { icon = QIcon(":vk/group.png"); } QStandardItem* item = new QStandardItem(icon, owner.name()); item->setData(QVariant::fromValue(owner), Role_MusicOwnerMetadata); item->setData(Type_Bookmark, InternetModel::Role_Type); AppendWall(item); AppendMusic(item); AppendAlbumList(item); root_item_->appendRow(item); return item; } void VkService::UpdateItem() { QModelIndex current(model()->current_index()); QStandardItem* item = current.data(InternetModel::Role_Type).toInt() == InternetModel::Type_Track ? model()->itemFromIndex(current.parent()) : model()->itemFromIndex(current); LazyPopulate(item); } void VkService::UpdateAlbumList(QStandardItem* item) { MusicOwner owner = item->data(Role_MusicOwnerMetadata).value(); ClearStandardItem(item); CreateAndAppendRow(item, Type_Loading); LoadAlbums(item, owner); } /*** * Albums */ void VkService::LoadAlbums(QStandardItem* parent, const MusicOwner& owner) { auto albums_request = audio_provider_->getAlbums(owner.id()); NewClosure( albums_request, SIGNAL(resultReady(QVariant)), this, SLOT(AlbumListReceived(QStandardItem*, Vreen::AudioAlbumItemListReply*)), parent, albums_request); } QStandardItem* VkService::AppendAlbum(QStandardItem* parent, const Vreen::AudioAlbumItem& album) { QStandardItem* item = new QStandardItem(QIcon(":vk/playlist.png"), album.title()); item->setData(QVariant::fromValue(album), Role_AlbumMetadata); item->setData(Type_Album, InternetModel::Role_Type); item->setData(true, InternetModel::Role_CanLazyLoad); item->setData(InternetModel::PlayBehaviour_MultipleItems, InternetModel::Role_PlayBehaviour); parent->appendRow(item); return item; } QStandardItem* VkService::AppendAlbumList(QStandardItem* parent, bool myself) { MusicOwner owner; QStandardItem* item; if (myself) { item = new QStandardItem(QIcon(":vk/discography.png"), tr("My Albums")); // TODO(Ivan Leontiev): Do this better. We have incomplete MusicOwner // instance for logged in user. owner.setId(UserID()); my_albums_item_ = item; } else { owner = parent->data(Role_MusicOwnerMetadata).value(); item = new QStandardItem(QIcon(":vk/discography.png"), tr("Albums")); } item->setData(QVariant::fromValue(owner), Role_MusicOwnerMetadata); item->setData(Type_AlbumList, InternetModel::Role_Type); item->setData(true, InternetModel::Role_CanLazyLoad); parent->appendRow(item); return item; } void VkService::AlbumListReceived(QStandardItem* parent, Vreen::AudioAlbumItemListReply* reply) { Vreen::AudioAlbumItemList albums = reply->result(); RemoveLastRow(parent, Type_Loading); for (const auto& album : albums) { AppendAlbum(parent, album); } } void VkService::UpdateAlbumSongs(QStandardItem* item) { Vreen::AudioAlbumItem album = item->data(Role_AlbumMetadata).value(); LoadAndAppendSongList(item, album.ownerId(), album.id()); } /*** * Wall */ QStandardItem* VkService::AppendWall(QStandardItem* parent) { QStandardItem* item = new QStandardItem(QIcon(":vk/playlist.png"), tr("Wall")); MusicOwner owner = parent->data(Role_MusicOwnerMetadata).value(); item->setData(QVariant::fromValue(owner), Role_MusicOwnerMetadata); item->setData(Type_Wall, InternetModel::Role_Type); item->setData(true, InternetModel::Role_CanLazyLoad); item->setData(InternetModel::PlayBehaviour_MultipleItems, InternetModel::Role_PlayBehaviour); parent->appendRow(item); return item; } QStandardItem* VkService::AppendMusic(QStandardItem* parent, bool myself) { MusicOwner owner; QStandardItem* item; if (myself) { item = new QStandardItem(QIcon(":vk/my_music.png"), tr("My Music")); // TODO(Ivan Leontiev): Do this better. We have incomplete MusicOwner // instance for logged in user. owner.setId(UserID()); my_music_item_ = item; } else { item = new QStandardItem(QIcon(":vk/playlist.png"), tr("Music")); owner = parent->data(Role_MusicOwnerMetadata).value(); } item->setData(QVariant::fromValue(owner), Role_MusicOwnerMetadata); item->setData(Type_Music, InternetModel::Role_Type); item->setData(true, InternetModel::Role_CanLazyLoad); item->setData(InternetModel::PlayBehaviour_MultipleItems, InternetModel::Role_PlayBehaviour); parent->appendRow(item); return item; } void VkService::UpdateWallSongs(QStandardItem* item) { MusicOwner owner = item->data(Role_MusicOwnerMetadata).value(); ClearStandardItem(item); LoadAndAppendWallSongList(item, owner); } void VkService::MoreWallSongs(QStandardItem* item) { QStandardItem* parent = item->parent(); MusicOwner owner = parent->data(Role_MusicOwnerMetadata).value(); int offset = item->data(Role_MoreMetadata).value(); RemoveLastRow(parent, Type_More); LoadAndAppendWallSongList(parent, owner, offset); } void VkService::WallPostsLoaded(QStandardItem* item, Vreen::Reply* reply, int offset) { auto response = reply->response().toMap(); int count = response.value("count").toInt(); SongList songs = FromAudioList(handleWallPosts(response.value("items"))); RemoveLastRow(item, Type_Loading); AppendSongs(item, songs); if (count > offset) { auto m = CreateAndAppendRow(item, Type_More); m->setData(offset, Role_MoreMetadata); } } void VkService::LoadAndAppendWallSongList(QStandardItem* item, const MusicOwner& owner, int offset) { if (item) { CreateAndAppendRow(item, Type_Loading); QVariantMap args; QString vk_script = "var a = API.wall.get({" " \"owner_id\": Args.q," " \"count\": Args.count," " \"offset\": Args.offset" "});" "return {\"count\": a.count, \"items\": a.items@.attachments};"; args.insert("v", "5.25"); args.insert("q", owner.id()); args.insert("offset", offset); args.insert("count", kMaxVkWallPostList); args.insert("code", vk_script); auto reply = client_->request("execute", args); NewClosure(reply, SIGNAL(resultReady(QVariant)), this, SLOT(WallPostsLoaded(QStandardItem*, Vreen::Reply*, int)), item, reply, offset + kMaxVkWallPostList); } } /*** * Features */ void VkService::FindThisArtist() { search_box_->SetText(selected_song_.artist()); } void VkService::AddToMyMusic() { SongId id = ExtractIds(selected_song_.url()); auto reply = audio_provider_->addToLibrary(id.audio_id, id.owner_id); NewClosure(reply, SIGNAL(resultReady(QVariant)), this, SLOT(UpdateMusic(QStandardItem*)), my_music_item_); } void VkService::AddToMyMusicCurrent() { if (isLoveAddToMyMusic() && current_song_.is_valid()) { selected_song_ = current_song_; AddToMyMusic(); } } void VkService::RemoveFromMyMusic() { SongId id = ExtractIds(selected_song_.url()); if (id.owner_id == UserID()) { auto reply = audio_provider_->removeFromLibrary(id.audio_id, id.owner_id); NewClosure(reply, SIGNAL(resultReady(QVariant)), this, SLOT(UpdateMusic(QStandardItem*)), my_music_item_); } else { qLog(Error) << "Tried to delete song that not owned by user (" << UserID() << selected_song_.url(); } } void VkService::AddSelectedToCache() { QUrl selected_song_media_url = GetAudioItemFromUrl(selected_song_.url()).url(); cache_->AddToCache(selected_song_.url(), selected_song_media_url, true); } void VkService::CopyShareUrl() { QByteArray share_url("http://vk.com/audio?q="); share_url += QUrl::toPercentEncoding( QString(selected_song_.artist() + " " + selected_song_.title())); QApplication::clipboard()->setText(share_url); } /*** * Search */ void VkService::DoLocalSearch() { ClearStandardItem(search_result_item_); CreateAndAppendRow(search_result_item_, Type_Loading); SearchID id(SearchID::LocalSearch); last_search_id_ = id.id(); SongSearch(id, last_query_); } void VkService::FindSongs(const QString& query) { last_query_ = query; if (query.isEmpty()) { search_delay_->stop(); root_item_->removeRow(search_result_item_->row()); search_result_item_ = NULL; last_search_id_ = 0; return; } search_delay_->start(); if (!search_result_item_) { CreateAndAppendRow(root_item_, Type_Search); } } void VkService::FindMore() { RemoveLastRow(search_result_item_, Type_More); CreateAndAppendRow(search_result_item_, Type_Loading); SearchID id(SearchID::MoreLocalSearch); last_search_id_ = id.id(); SongSearch(id, last_query_, kMaxVkSongCount, search_result_item_->rowCount() - 1); } void VkService::SearchResultLoaded(const SearchID& id, const SongList& songs) { if (!search_result_item_) { return; // Result received when search is already over. } if (id.id() == last_search_id_) { if (id.type() == SearchID::LocalSearch) { ClearStandardItem(search_result_item_); } else if (id.type() == SearchID::MoreLocalSearch) { RemoveLastRow(search_result_item_, Type_Loading); } else { return; // Others request types ignored. } if (!songs.isEmpty()) { AppendSongs(search_result_item_, songs); CreateAndAppendRow(search_result_item_, Type_More); } // If new search, scroll to search results. if (id.type() == SearchID::LocalSearch) { QModelIndex index = model()->merged_model()->mapFromSource(search_result_item_->index()); ScrollToIndex(index); } } } /*** * Load song list methods */ void VkService::LoadAndAppendSongList(QStandardItem* item, int uid, int album_id) { if (item) { ClearStandardItem(item); CreateAndAppendRow(item, Type_Loading); auto audioreq = audio_provider_->getContactAudio(uid, kMaxVkSongList, 0, album_id); NewClosure( audioreq, SIGNAL(resultReady(QVariant)), this, SLOT(AppendLoadedSongs(QStandardItem*, Vreen::AudioItemListReply*)), item, audioreq); } } void VkService::AppendLoadedSongs(QStandardItem* item, Vreen::AudioItemListReply* reply) { SongList songs = FromAudioList(reply->result()); if (item) { ClearStandardItem(item); if (songs.count() > 0) { AppendSongs(item, songs); return; } } else { qLog(Warning) << "Item for request not exist"; } item->appendRow(new QStandardItem( tr("Connection trouble " "or audio is disabled by owner"))); } static QString SanitiseCharacters(QString str) { // Remove all leading and trailing unicode symbols // that some users love to add to title and artist. str = str.remove(QRegExp("^[^\\w]*")); str = str.remove(QRegExp("[^])\\w]*$")); return str; } Song VkService::FromAudioItem(const Vreen::AudioItem& item) { Song song; song.set_title(SanitiseCharacters(item.title())); song.set_artist(SanitiseCharacters(item.artist())); song.set_length_nanosec(qFloor(item.duration()) * kNsecPerSec); QString url = QString("vk://song/%1_%2/%3/%4") .arg(item.ownerId()) .arg(item.id()) .arg(item.artist().replace('/', '_')) .arg(item.title().replace('/', '_')); song.set_url(QUrl(url)); song.set_valid(true); return song; } SongList VkService::FromAudioList(const Vreen::AudioItemList& list) { SongList song_list; for (const Vreen::AudioItem& item : list) { song_list.append(FromAudioItem(item)); } return song_list; } /*** * Url handling */ Vreen::AudioItem VkService::GetAudioItemFromUrl(const QUrl& url) { QStringList tokens = url.path().split('/'); if (tokens.count() < 2) { qLog(Error) << "Wrong song url" << url; return Vreen::AudioItem(); } QString song_id = tokens[1]; if (HasAccount()) { Vreen::AudioItemListReply* song_request = audio_provider_->getAudiosByIds(song_id); emit StopWaiting(); // Stop all previous requests. bool success = WaitForReply(song_request); if (success && !song_request->result().isEmpty()) { return song_request->result()[0]; } } qLog(Info) << "Unresolved url by id" << song_id; return Vreen::AudioItem(); } UrlHandler::LoadResult VkService::GetSongResult(const QUrl& url) { // Try get from cache QUrl media_url = cache_->Get(url); if (media_url.isValid()) { SongStarting(url); return UrlHandler::LoadResult(url, UrlHandler::LoadResult::TrackAvailable, media_url); } // Otherwise get fresh link auto audio_item = GetAudioItemFromUrl(url); media_url = audio_item.url(); if (media_url.isValid()) { Song song = FromAudioItem(audio_item); SongStarting(song); if (cachingEnabled_) { cache_->AddToCache(url, media_url); } return UrlHandler::LoadResult(url, UrlHandler::LoadResult::TrackAvailable, media_url, song.length_nanosec()); } return UrlHandler::LoadResult(url); } UrlHandler::LoadResult VkService::GetGroupNextSongUrl(const QUrl& url) { QStringList tokens = url.path().split('/'); if (tokens.count() < 3) { qLog(Error) << "Wrong url" << url; return UrlHandler::LoadResult(url); } int gid = tokens[1].toInt(); int songs_count = tokens[2].toInt(); if (songs_count > kMaxVkSongList) { songs_count = kMaxVkSongList; } if (HasAccount()) { // Getting one random song from groups playlist. Vreen::AudioItemListReply* song_request = audio_provider_->getContactAudio(-gid, 1, qrand() % songs_count); emit StopWaiting(); // Stop all previous requests. bool success = WaitForReply(song_request); if (success && !song_request->result().isEmpty()) { Vreen::AudioItem song = song_request->result()[0]; current_group_url_ = url; SongStarting(FromAudioItem(song)); emit StreamMetadataFound(url, current_song_); return UrlHandler::LoadResult(url, UrlHandler::LoadResult::TrackAvailable, song.url(), current_song_.length_nanosec()); } } qLog(Info) << "Unresolved group url" << url; return UrlHandler::LoadResult(url); } /*** * Song playing */ void VkService::SongStarting(const QUrl& url) { SongStarting(SongFromUrl(url)); } void VkService::SongStarting(const Song& song) { current_song_ = song; if (isBroadcasting() && HasAccount()) { auto id = ExtractIds(song.url()); auto reply = audio_provider_->setBroadcast(id.audio_id, id.owner_id, IdList()); NewClosure(reply, SIGNAL(resultReady(QVariant)), this, SLOT(BroadcastChangeReceived(Vreen::IntReply*)), reply); connect(app_->player(), SIGNAL(Stopped()), this, SLOT(SongStopped()), Qt::UniqueConnection); qLog(Debug) << "Broadcasting" << song.artist() << "-" << song.title(); } } void VkService::SongSkipped() { current_song_.set_valid(false); cache_->BreakCurrentCaching(); } void VkService::SongStopped() { current_song_.set_valid(false); if (isBroadcasting() && HasAccount()) { auto reply = audio_provider_->resetBroadcast(IdList()); NewClosure(reply, SIGNAL(resultReady(QVariant)), this, SLOT(BroadcastChangeReceived(Vreen::IntReply*)), reply); disconnect(app_->player(), SIGNAL(Stopped()), this, SLOT(SongStopped())); qLog(Debug) << "End of broadcasting"; } } void VkService::BroadcastChangeReceived(Vreen::IntReply* reply) { qLog(Debug) << "Broadcast changed for " << reply->result(); } /*** * Search */ void VkService::SongSearch(SearchID id, const QString& query, int count, int offset) { auto reply = audio_provider_->searchAudio( query, count, offset, false, Vreen::AudioProvider::SortByPopularity); NewClosure(reply, SIGNAL(resultReady(QVariant)), this, SLOT(SongSearchReceived(SearchID, Vreen::AudioItemListReply*)), id, reply); } void VkService::SongSearchReceived(const SearchID& id, Vreen::AudioItemListReply* reply) { SongList songs = FromAudioList(reply->result()); emit SongSearchResult(id, songs); } void VkService::GroupSearch(SearchID id, const QString& query) { QVariantMap args; args.insert("q", query); // This is using of 'execute' method that execute // this VKScript method on vk server: /* var groups = API.groups.search({"q": Args.q}); if (groups.length == 0) { return []; } var i = 1; var res = []; while (i < groups.length - 1) { i = i + 1; var grp = groups[i]; var songs = API.audio.getCount({oid: -grp.gid}); if ( songs > 1 && (grp.is_closed == 0 || grp.is_member == 1)) { res = res + [{"songs_count" : songs, "id" : -grp.gid, "name" : grp.name, "screen_name" : grp.screen_name, "photo": grp.photo}]; } } return res; */ // // I leave it here in case if my vk app disappear or smth. auto reply = client_->request("execute.searchMusicGroup", args); NewClosure(reply, SIGNAL(resultReady(QVariant)), this, SLOT(GroupSearchReceived(SearchID, Vreen::Reply*)), id, reply); } void VkService::GroupSearchReceived(const SearchID& id, Vreen::Reply* reply) { QVariant groups = reply->response(); emit GroupSearchResult(id, MusicOwner::parseMusicOwnerList(groups)); } /*** * Vk search user or group. */ void VkService::ShowSearchDialog() { if (vk_search_dialog_->exec() == QDialog::Accepted) { AppendBookmark(vk_search_dialog_->found()); SaveBookmarks(); } } void VkService::FindUserOrGroup(const QString& q) { QVariantMap args; args.insert("q", q); // This is using of 'execute' method that execute // this VKScript method on vk server: /* var q = Args.q; if (q + "" == ""){ return []; } var results_count = 0; var res = []; // Search groups var groups = API.groups.search({"q": q}); var i = 0; while (i < groups.length - 1 && results_count <= 5) { i = i + 1; var grp = groups[i]; var songs = API.audio.getCount({oid: -grp.gid}); // Add only accessible groups with songs if ( songs > 1 && (grp.is_closed == 0 || grp.is_member == 1)) { results_count = results_count + 1; res = res + [{"songs_count" : songs, "id" : -grp.gid, "name" : grp.name, "screen_name" : grp.screen_name, "photo": grp.photo}]; } } // Search peoples var peoples = API.users.search({"q": q, "count":10, "fields":"screen_name,photo"}); var i = 0; while (i < peoples.length - 1 && results_count <= 7) { i = i + 1; var user = peoples[i]; var songs = API.audio.getCount({"oid": user.uid}); // Add groups only with songs if (songs > 1) { results_count = results_count + 1; res = res + [{"songs_count" : songs, "id" : user.uid, "name" : user.first_name + " " + user.last_name, "screen_name" : user.screen_name, "phone" : user.photo}]; } } return res; */ // I leave it here just in case if my vk app will disappear or smth. auto reply = client_->request("execute.searchMusicOwner", args); NewClosure(reply, SIGNAL(resultReady(QVariant)), this, SLOT(UserOrGroupReceived(SearchID, Vreen::Reply*)), SearchID(SearchID::UserOrGroup), reply); } void VkService::UserOrGroupReceived(const SearchID& id, Vreen::Reply* reply) { QVariant owners = reply->response(); emit UserOrGroupSearchResult(id, MusicOwner::parseMusicOwnerList(owners)); } /*** * Utils */ int VkService::TypeOfItem(const QStandardItem* item) { return item->data(InternetModel::Role_Type).toInt(); } bool VkService::isItemBusy(const QStandardItem* item) { const QStandardItem* cur_item = TypeOfItem(item) == InternetModel::Type_Track ? item->parent() : item; int r_count = cur_item->rowCount(); bool flag = false; if (r_count) { if (TypeOfItem(cur_item->child(r_count - 1)) == Type_Loading) return true; int t = TypeOfItem(cur_item); if (cur_item == root_item_ || t == Type_Bookmark || t == Type_AlbumList) { for (int i = 0; i < r_count; i++) { flag |= isItemBusy(cur_item->child(i)); } } } return flag; } void VkService::AppendSongs(QStandardItem* parent, const SongList& songs) { for (const auto& song : songs) { parent->appendRow(CreateSongItem(song)); } } void VkService::ReloadSettings() { QSettings s; s.beginGroup(kSettingGroup); maxGlobalSearch_ = s.value("max_global_search", kMaxVkSongCount).toInt(); cachingEnabled_ = s.value("cache_enabled", false).toBool(); cacheDir_ = s.value("cache_dir", DefaultCacheDir()).toString(); cacheFilename_ = s.value("cache_filename", kDefCacheFilename).toString(); love_is_add_to_mymusic_ = s.value("love_is_add_to_my_music", false).toBool(); groups_in_global_search_ = s.value("groups_in_global_search", false).toBool(); if (!s.contains("enable_broadcast")) { // Need to update premissions Logout(); } enable_broadcast_ = s.value("enable_broadcast", false).toBool(); } void VkService::ClearStandardItem(QStandardItem* item) { if (item && item->hasChildren()) { item->removeRows(0, item->rowCount()); } } bool VkService::WaitForReply(Vreen::Reply* reply) { QEventLoop event_loop; QTimer timeout_timer; connect(this, SIGNAL(StopWaiting()), &timeout_timer, SLOT(stop())); connect(&timeout_timer, SIGNAL(timeout()), &event_loop, SLOT(quit())); connect(reply, SIGNAL(resultReady(QVariant)), &event_loop, SLOT(quit())); timeout_timer.start(10000); event_loop.exec(); if (!timeout_timer.isActive()) { qLog(Error) << "Vk.com request timeout"; return false; } timeout_timer.stop(); return true; } Vreen::AudioItemList VkService::handleWallPosts(const QVariant& response) { Vreen::AudioItemList items; auto list = response.toList(); for (const auto& i : list) { auto attachments = i.toList(); for (const auto& j : attachments) { auto item = j.toMap(); if (item.value("type") == "audio") { auto map = item.value("audio").toMap(); Vreen::AudioItem audio; audio.setId(map.value("id").toInt()); audio.setOwnerId(map.value("owner_id").toInt()); audio.setArtist(map.value("artist").toString()); audio.setTitle(map.value("title").toString()); audio.setDuration(map.value("duration").toReal()); audio.setAlbumId(map.value("album").toInt()); audio.setLyricsId(map.value("lyrics_id").toInt()); audio.setUrl(map.value("url").toUrl()); items.append(audio); } } } return items; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/vk/vkservice.h000066400000000000000000000236531260417502300246110ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Vlad Maltsev Copyright 2014, Krzysztof Sobiecki Copyright 2014, Ivan Leontiev Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_VK_VKSERVICE_H_ #define INTERNET_VK_VKSERVICE_H_ #include #include "internet/core/internetservice.h" #include "internet/core/internetmodel.h" #include "core/song.h" #include "vreen/audio.h" #include "vreen/contact.h" #include "vkconnection.h" #include "vkurlhandler.h" namespace Vreen { class Client; class Buddy; } class SearchBoxWidget; class VkMusicCache; class VkSearchDialog; /*** * Store information about user or group * using in bookmarks. */ class MusicOwner { public: MusicOwner() : songs_count_(0), id_(0) {} explicit MusicOwner(const QUrl& group_url); Song toOwnerRadio() const; QString name() const { return name_; } int id() const { return id_; } int song_count() const { return songs_count_; } static QList parseMusicOwnerList(const QVariant& request_result); // quick and dirty solution for creating MusicOwner instance for // logged in user void setId(int id) { id_ = id; } private: friend QDataStream& operator<<(QDataStream& stream, const MusicOwner& val); friend QDataStream& operator>>(QDataStream& stream, MusicOwner& val); friend QDebug operator<<(QDebug d, const MusicOwner& owner); int songs_count_; int id_; // if id > 0 is user otherwise id group QString name_; // name used in url http://vk.com/ for example: // http://vk.com/shedward QString screen_name_; QUrl photo_; }; typedef QList MusicOwnerList; Q_DECLARE_METATYPE(MusicOwner) QDataStream& operator<<(QDataStream& stream, const MusicOwner& val); QDataStream& operator>>(QDataStream& stream, MusicOwner& var); QDebug operator<<(QDebug d, const MusicOwner& owner); /*** * The simple structure allows the handler to determine * how to react to the received request or quickly skip unwanted. */ struct SearchID { enum Type { GlobalSearch, LocalSearch, MoreLocalSearch, UserOrGroup }; explicit SearchID(Type type) : type_(type) { id_ = last_id_++; } int id() const { return id_; } Type type() const { return type_; } private: static uint last_id_; int id_; Type type_; }; /*** * VkService */ class VkService : public InternetService { Q_OBJECT public: explicit VkService(Application* app, InternetModel* parent); ~VkService(); static const char* kServiceName; static const char* kSettingGroup; static const char* kUrlScheme; static const char* kDefCacheFilename; static QString DefaultCacheDir(); static const int kMaxVkSongList; static const int kMaxVkWallPostList; static const int kMaxVkSongCount; static const int kSearchDelayMsec; enum ItemType { Type_Loading = InternetModel::TypeCount, Type_More, Type_Recommendations, Type_Music, Type_Bookmark, Type_Album, Type_Wall, Type_AlbumList, Type_Search }; enum Role { Role_MusicOwnerMetadata = InternetModel::RoleCount, Role_AlbumMetadata, Role_MoreMetadata }; Application* app() const { return app_; } /* InternetService interface */ QStandardItem* CreateRootItem(); void LazyPopulate(QStandardItem* parent); void ShowContextMenu(const QPoint& global_pos); void ItemDoubleClicked(QStandardItem* item); QList playlistitem_actions(const Song& song); /* Interface*/ QWidget* HeaderWidget() const; /* Connection */ void Login(); void Logout(); bool HasAccount() const; int UserID() const; void RequestUserProfile(); bool WaitForReply(Vreen::Reply* reply); /* Music */ void SongStarting(const Song& song); void SongStarting(const QUrl& url); // Used if song taked from cache. void SongSkipped(); UrlHandler::LoadResult GetSongResult(const QUrl& url); Vreen::AudioItem GetAudioItemFromUrl(const QUrl& url); // Return random song result from group playlist. UrlHandler::LoadResult GetGroupNextSongUrl(const QUrl& url); void SongSearch(SearchID id, const QString& query, int count = kMaxVkSongCount, int offset = 0); void GroupSearch(SearchID id, const QString& query); /* Settings */ void ReloadSettings(); int maxGlobalSearch() const { return maxGlobalSearch_; } bool isCachingEnabled() const { return cachingEnabled_; } bool isGroupsInGlobalSearch() const { return groups_in_global_search_; } bool isBroadcasting() const { return enable_broadcast_; } QString cacheDir() const { return cacheDir_; } QString cacheFilename() const { return cacheFilename_; } bool isLoveAddToMyMusic() const { return love_is_add_to_mymusic_; } signals: void NameUpdated(const QString& name); void ConnectionStateChanged(Vreen::Client::State state); void LoginSuccess(bool success); void SongSearchResult(const SearchID& id, const SongList& songs); void GroupSearchResult(const SearchID& id, const MusicOwnerList& groups); void UserOrGroupSearchResult(const SearchID& id, const MusicOwnerList& owners); void StopWaiting(); public slots: void UpdateRoot(); void ShowConfig(); void FindUserOrGroup(const QString& q); void DoLocalSearch(); private slots: /* Interface */ void UpdateItem(); /* Connection */ void ChangeConnectionState(Vreen::Client::State state); void UserProfileRecived(const QVariant& result); void Error(Vreen::Client::Error error); /* Music */ void SongStopped(); void UpdateMusic(QStandardItem* item); void UpdateAlbumList(QStandardItem* item); void UpdateAlbumSongs(QStandardItem* item); void UpdateWallSongs(QStandardItem* item); void MoreWallSongs(QStandardItem* item); void FindSongs(const QString& query); void FindMore(); void UpdateRecommendations(); void MoreRecommendations(); void FindThisArtist(); void AddToMyMusic(); void AddToMyMusicCurrent(); void RemoveFromMyMusic(); void AddSelectedToCache(); void CopyShareUrl(); void ShowSearchDialog(); void AddSelectedToBookmarks(); void RemoveFromBookmark(); void SongSearchReceived(const SearchID& id, Vreen::AudioItemListReply* reply); void GroupSearchReceived(const SearchID& id, Vreen::Reply* reply); void UserOrGroupReceived(const SearchID& id, Vreen::Reply* reply); void AlbumListReceived(QStandardItem* parent, Vreen::AudioAlbumItemListReply* reply); void BroadcastChangeReceived(Vreen::IntReply* reply); void AppendLoadedSongs(QStandardItem* item, Vreen::AudioItemListReply* reply); void RecommendationsLoaded(Vreen::AudioItemListReply* reply); void SearchResultLoaded(const SearchID& id, const SongList& songs); void WallPostsLoaded(QStandardItem* item, Vreen::Reply* reply, int offset); private: bool isItemBusy(const QStandardItem* item); int TypeOfItem(const QStandardItem* item); Vreen::AudioItemList handleWallPosts(const QVariant& response); /* Interface */ QStandardItem* CreateAndAppendRow(QStandardItem* parent, VkService::ItemType type); void ClearStandardItem(QStandardItem* item); QStandardItem* GetBookmarkItemById(int id); void EnsureMenuCreated(); /* Music */ void LoadAndAppendSongList(QStandardItem* item, int uid, int album_id = -1); void LoadAndAppendWallSongList(QStandardItem* item, const MusicOwner& owner, int offset = 0); Song FromAudioItem(const Vreen::AudioItem& item); SongList FromAudioList(const Vreen::AudioItemList& list); void AppendSongs(QStandardItem* parent, const SongList& songs); QStandardItem* AppendBookmark(const MusicOwner& owner); void SaveBookmarks(); void LoadBookmarks(); void LoadAlbums(QStandardItem* parent, const MusicOwner& owner); QStandardItem* AppendAlbum(QStandardItem* parent, const Vreen::AudioAlbumItem& album); QStandardItem* AppendAlbumList(QStandardItem* parent, bool myself = false); QStandardItem* AppendWall(QStandardItem* parent); QStandardItem* AppendMusic(QStandardItem* parent, bool myself = false); /* Interface */ QStandardItem* root_item_; QStandardItem* recommendations_item_; QStandardItem* my_music_item_; QStandardItem* my_albums_item_; QStandardItem* search_result_item_; QMenu* context_menu_; QAction* update_item_; QAction* find_this_artist_; QAction* add_to_my_music_; QAction* remove_from_my_music_; QAction* add_song_to_cache_; QAction* copy_share_url_; QAction* add_to_bookmarks_; QAction* remove_from_bookmarks_; QAction* find_owner_; SearchBoxWidget* search_box_; VkSearchDialog* vk_search_dialog_; /* Connection */ std::unique_ptr client_; std::unique_ptr connection_; VkUrlHandler* url_handler_; /* Music */ std::unique_ptr audio_provider_; VkMusicCache* cache_; // Keeping when more recent results recived. // Using for prevent loading tardy result instead. uint last_search_id_; QTimer* search_delay_; QString last_query_; Song selected_song_; // Store for context menu actions. Song current_song_; // Store for actions with now playing song. // Store current group url for actions with it. QUrl current_group_url_; /* Settings */ int maxGlobalSearch_; bool cachingEnabled_; bool love_is_add_to_mymusic_; bool groups_in_global_search_; bool enable_broadcast_; QString cacheDir_; QString cacheFilename_; }; #endif // INTERNET_VK_VKSERVICE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/vk/vksettingspage.cpp000066400000000000000000000102521260417502300261700ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Maltsev Vlad Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "vksettingspage.h" #include #include #include "ui_vksettingspage.h" #include "core/application.h" #include "core/logging.h" #include "internet/vk/vkservice.h" VkSettingsPage::VkSettingsPage(SettingsDialog* parent) : SettingsPage(parent), ui_(new Ui::VkSettingsPage), service_(dialog()->app()->internet_model()->Service()) { ui_->setupUi(this); connect(service_, SIGNAL(LoginSuccess(bool)), SLOT(LoginSuccess(bool))); connect(ui_->choose_path, SIGNAL(clicked()), SLOT(CacheDirBrowse())); connect(ui_->reset, SIGNAL(clicked()), SLOT(ResetCasheFilenames())); } VkSettingsPage::~VkSettingsPage() { delete ui_; } void VkSettingsPage::Load() { service_->ReloadSettings(); ui_->max_global_search->setValue(service_->maxGlobalSearch()); ui_->enable_caching->setChecked(service_->isCachingEnabled()); ui_->cache_dir->setText(service_->cacheDir()); ui_->cache_filename->setText(service_->cacheFilename()); ui_->love_button_is_add_to_mymusic->setChecked( service_->isLoveAddToMyMusic()); ui_->groups_in_global_search->setChecked(service_->isGroupsInGlobalSearch()); ui_->enable_broadcast->setChecked(service_->isBroadcasting()); if (service_->HasAccount()) { LogoutWidgets(); } else { LoginWidgets(); } } void VkSettingsPage::Save() { QSettings s; s.beginGroup(VkService::kSettingGroup); s.setValue("max_global_search", ui_->max_global_search->value()); s.setValue("cache_enabled", ui_->enable_caching->isChecked()); s.setValue("cache_dir", ui_->cache_dir->text()); s.setValue("cache_filename", ui_->cache_filename->text()); s.setValue("love_is_add_to_my_music", ui_->love_button_is_add_to_mymusic->isChecked()); s.setValue("groups_in_global_search", ui_->groups_in_global_search->isChecked()); s.setValue("enable_broadcast", ui_->enable_broadcast->isChecked()); service_->ReloadSettings(); } void VkSettingsPage::Login() { ui_->login_button->setEnabled(false); service_->Login(); } void VkSettingsPage::LoginSuccess(bool success) { if (success) { LogoutWidgets(); } else { LoginWidgets(); } } void VkSettingsPage::Logout() { ui_->login_button->setEnabled(false); service_->Logout(); LoginWidgets(); } void VkSettingsPage::CacheDirBrowse() { QString directory = QFileDialog::getExistingDirectory( this, tr("Choose Vk.com cache directory"), ui_->cache_dir->text()); if (directory.isEmpty()) { return; } ui_->cache_dir->setText(QDir::toNativeSeparators(directory)); } void VkSettingsPage::ResetCasheFilenames() { ui_->cache_filename->setText(VkService::kDefCacheFilename); } void VkSettingsPage::LoginWidgets() { ui_->login_button->setText(tr("Login")); ui_->name->setText(""); ui_->login_button->setEnabled(true); connect(ui_->login_button, SIGNAL(clicked()), SLOT(Login()), Qt::UniqueConnection); disconnect(ui_->login_button, SIGNAL(clicked()), this, SLOT(Logout())); } void VkSettingsPage::LogoutWidgets() { ui_->login_button->setText(tr("Logout")); ui_->name->setText(tr("Loading...")); ui_->login_button->setEnabled(true); connect(service_, SIGNAL(NameUpdated(QString)), ui_->name, SLOT(setText(QString)), Qt::UniqueConnection); service_->RequestUserProfile(); connect(ui_->login_button, SIGNAL(clicked()), SLOT(Logout()), Qt::UniqueConnection); disconnect(ui_->login_button, SIGNAL(clicked()), this, SLOT(Login())); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/vk/vksettingspage.h000066400000000000000000000026441260417502300256430ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Krzysztof Sobiecki Copyright 2014, Maltsev Vlad Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_VK_VKSETTINGSPAGE_H_ #define INTERNET_VK_VKSETTINGSPAGE_H_ #include "ui/settingspage.h" #include #include class VkService; class Ui_VkSettingsPage; class VkSettingsPage : public SettingsPage { Q_OBJECT public: explicit VkSettingsPage(SettingsDialog* parent); ~VkSettingsPage(); void Load(); void Save(); private slots: void LoginSuccess(bool success); void Login(); void Logout(); void CacheDirBrowse(); void ResetCasheFilenames(); private: void LoginWidgets(); void LogoutWidgets(); Ui_VkSettingsPage* ui_; VkService* service_; }; #endif // INTERNET_VK_VKSETTINGSPAGE_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/vk/vksettingspage.ui000066400000000000000000000143061260417502300260270ustar00rootroot00000000000000 VkSettingsPage 0 0 569 491 Vk.com :/providers/vk.png:/providers/vk.png Account details true 120 16777215 Login Preferences Max global search results max_global_search 50 3000 50 Qt::Horizontal 40 20 Add songs to "My Music" when the "Love" button is clicked Show groups in global search result Show playing song on your page Caching Enable automatic caching true Cache path: cache_dir ... File name pattern: cache_filename %artist - %title Reset Qt::Vertical QSizePolicy::Expanding 20 40 clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/vk/vkurlhandler.cpp000066400000000000000000000036461260417502300256440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Maltsev Vlad Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "vkurlhandler.h" #include "core/application.h" #include "core/logging.h" #include "core/player.h" #include "vkservice.h" #include "vkmusiccache.h" VkUrlHandler::VkUrlHandler(VkService* service, QObject* parent) : UrlHandler(parent), service_(service) {} UrlHandler::LoadResult VkUrlHandler::StartLoading(const QUrl& url) { QStringList args = url.path().split("/"); LoadResult result(url); if (args.size() < 2) { qLog(Error) << "Invalid Vk.com URL: " << url << "Url format should be vk:///." << "For example vk://song/61145020_166946521/Daughtry/Gone Too Soon"; } else { QString action = url.host(); if (action == "song") { result = service_->GetSongResult(url); } else if (action == "group") { result = service_->GetGroupNextSongUrl(url); } else { qLog(Error) << "Invalid vk.com url action:" << action; } } return result; } void VkUrlHandler::TrackSkipped() { service_->SongSkipped(); } UrlHandler::LoadResult VkUrlHandler::LoadNext(const QUrl& url) { if (url.host() == "group") { return StartLoading(url); } else { return LoadResult(url); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/internet/vk/vkurlhandler.h000066400000000000000000000025741260417502300253100ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Maltsev Vlad Copyright 2014, Krzysztof Sobiecki Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNET_VK_VKURLHANDLER_H_ #define INTERNET_VK_VKURLHANDLER_H_ #include "core/urlhandler.h" #include #include #include class VkService; class VkMusicCache; class VkUrlHandler : public UrlHandler { Q_OBJECT public: VkUrlHandler(VkService* service, QObject* parent); QString scheme() const { return "vk"; } QIcon icon() const { return QIcon(":providers/vk.png"); } LoadResult StartLoading(const QUrl& url); void TrackSkipped(); LoadResult LoadNext(const QUrl& url); private: VkService* service_; }; #endif // INTERNET_VK_VKURLHANDLER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/000077500000000000000000000000001260417502300216225ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/directory.h000066400000000000000000000025701260417502300240030ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef DIRECTORY_H #define DIRECTORY_H #include #include #include class QSqlQuery; struct Directory { Directory() : id(-1) {} bool operator==(const Directory& other) const { return path == other.path && id == other.id; } QString path; int id; }; Q_DECLARE_METATYPE(Directory) typedef QList DirectoryList; Q_DECLARE_METATYPE(DirectoryList) struct Subdirectory { Subdirectory() : directory_id(-1), mtime(0) {} int directory_id; QString path; uint mtime; }; Q_DECLARE_METATYPE(Subdirectory) typedef QList SubdirectoryList; Q_DECLARE_METATYPE(SubdirectoryList) #endif // DIRECTORY_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/groupbydialog.cpp000066400000000000000000000101351260417502300251750ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "groupbydialog.h" #include "ui_groupbydialog.h" #include // boost::multi_index still relies on these being in the global namespace. using std::placeholders::_1; using std::placeholders::_2; #include #include #include using boost::multi_index_container; using boost::multi_index::indexed_by; using boost::multi_index::ordered_unique; using boost::multi_index::tag; using boost::multi_index::member; namespace { struct Mapping { Mapping(LibraryModel::GroupBy g, int i) : group_by(g), combo_box_index(i) {} LibraryModel::GroupBy group_by; int combo_box_index; }; struct tag_index {}; struct tag_group_by {}; } // namespace class GroupByDialogPrivate { private: typedef multi_index_container< Mapping, indexed_by< ordered_unique, member >, ordered_unique, member > > > MappingContainer; public: MappingContainer mapping_; }; GroupByDialog::GroupByDialog(QWidget* parent) : QDialog(parent), ui_(new Ui_GroupByDialog), p_(new GroupByDialogPrivate) { ui_->setupUi(this); Reset(); p_->mapping_.insert(Mapping(LibraryModel::GroupBy_None, 0)); p_->mapping_.insert(Mapping(LibraryModel::GroupBy_Album, 1)); p_->mapping_.insert(Mapping(LibraryModel::GroupBy_Artist, 2)); p_->mapping_.insert(Mapping(LibraryModel::GroupBy_AlbumArtist, 3)); p_->mapping_.insert(Mapping(LibraryModel::GroupBy_Composer, 4)); p_->mapping_.insert(Mapping(LibraryModel::GroupBy_FileType, 5)); p_->mapping_.insert(Mapping(LibraryModel::GroupBy_Genre, 6)); p_->mapping_.insert(Mapping(LibraryModel::GroupBy_Year, 7)); p_->mapping_.insert(Mapping(LibraryModel::GroupBy_OriginalYear, 8)); p_->mapping_.insert(Mapping(LibraryModel::GroupBy_YearAlbum, 9)); p_->mapping_.insert(Mapping(LibraryModel::GroupBy_OriginalYearAlbum, 10)); p_->mapping_.insert(Mapping(LibraryModel::GroupBy_Bitrate, 11)); p_->mapping_.insert(Mapping(LibraryModel::GroupBy_Disc, 12)); p_->mapping_.insert(Mapping(LibraryModel::GroupBy_Performer, 13)); p_->mapping_.insert(Mapping(LibraryModel::GroupBy_Grouping, 14)); connect(ui_->button_box->button(QDialogButtonBox::Reset), SIGNAL(clicked()), SLOT(Reset())); resize(sizeHint()); } GroupByDialog::~GroupByDialog() {} void GroupByDialog::Reset() { ui_->first->setCurrentIndex(2); // Artist ui_->second->setCurrentIndex(1); // Album ui_->third->setCurrentIndex(0); // None } void GroupByDialog::accept() { emit Accepted(LibraryModel::Grouping( p_->mapping_.get().find(ui_->first->currentIndex())->group_by, p_->mapping_.get().find(ui_->second->currentIndex())->group_by, p_->mapping_.get() .find(ui_->third->currentIndex()) ->group_by)); QDialog::accept(); } void GroupByDialog::LibraryGroupingChanged(const LibraryModel::Grouping& g) { ui_->first->setCurrentIndex( p_->mapping_.get().find(g[0])->combo_box_index); ui_->second->setCurrentIndex( p_->mapping_.get().find(g[1])->combo_box_index); ui_->third->setCurrentIndex( p_->mapping_.get().find(g[2])->combo_box_index); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/groupbydialog.h000066400000000000000000000024751260417502300246520ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef GROUPBYDIALOG_H #define GROUPBYDIALOG_H #include #include #include "librarymodel.h" class GroupByDialogPrivate; class Ui_GroupByDialog; class GroupByDialog : public QDialog { Q_OBJECT public: GroupByDialog(QWidget* parent = nullptr); ~GroupByDialog(); public slots: void LibraryGroupingChanged(const LibraryModel::Grouping& g); void accept(); signals: void Accepted(const LibraryModel::Grouping& g); private slots: void Reset(); private: std::unique_ptr ui_; std::unique_ptr p_; }; #endif // GROUPBYDIALOG_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/groupbydialog.ui000066400000000000000000000214211260417502300250300ustar00rootroot00000000000000 GroupByDialog 0 0 354 236 Library advanced grouping :/icon.png:/icon.png You can change the way the songs in the library are organised. true Group Library by... First level None Album Artist Album artist Composer File type Genre Year Original year Year - Album Original year - Album Bitrate Disc Performer Grouping Second level None Album Artist Album artist Composer File type Genre Year Original year Year - Album Original year - Album Bitrate Disc Performer Grouping Third level None Album Artist Album artist Composer File type Genre Year Original year Year - Album Original year - Album Bitrate Disc Performer Grouping Qt::Vertical 20 11 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Reset first second third button_box button_box accepted() GroupByDialog accept() 248 254 157 274 button_box rejected() GroupByDialog reject() 316 260 286 274 clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/library.cpp000066400000000000000000000237721260417502300240050ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "library.h" #include "librarymodel.h" #include "librarybackend.h" #include "core/application.h" #include "core/database.h" #include "core/player.h" #include "core/tagreaderclient.h" #include "core/taskmanager.h" #include "core/thread.h" #include "smartplaylists/generator.h" #include "smartplaylists/querygenerator.h" #include "smartplaylists/search.h" const char* Library::kSongsTable = "songs"; const char* Library::kDirsTable = "directories"; const char* Library::kSubdirsTable = "subdirectories"; const char* Library::kFtsTable = "songs_fts"; Library::Library(Application* app, QObject* parent) : QObject(parent), app_(app), backend_(nullptr), model_(nullptr), watcher_(nullptr), watcher_thread_(nullptr), save_statistics_in_files_(false), save_ratings_in_files_(false) { backend_ = new LibraryBackend; backend()->moveToThread(app->database()->thread()); backend_->Init(app->database(), kSongsTable, kDirsTable, kSubdirsTable, kFtsTable); using smart_playlists::Generator; using smart_playlists::GeneratorPtr; using smart_playlists::QueryGenerator; using smart_playlists::Search; using smart_playlists::SearchTerm; model_ = new LibraryModel(backend_, app_, this); model_->set_show_smart_playlists(true); model_->set_default_smart_playlists( LibraryModel::DefaultGenerators() << (LibraryModel::GeneratorList() << GeneratorPtr(new QueryGenerator( QT_TRANSLATE_NOOP("Library", "50 random tracks"), Search(Search::Type_All, Search::TermList(), Search::Sort_Random, SearchTerm::Field_Title, 50))) << GeneratorPtr(new QueryGenerator( QT_TRANSLATE_NOOP("Library", "Ever played"), Search(Search::Type_And, Search::TermList() << SearchTerm( SearchTerm::Field_PlayCount, SearchTerm::Op_GreaterThan, 0), Search::Sort_Random, SearchTerm::Field_Title))) << GeneratorPtr(new QueryGenerator( QT_TRANSLATE_NOOP("Library", "Never played"), Search(Search::Type_And, Search::TermList() << SearchTerm( SearchTerm::Field_PlayCount, SearchTerm::Op_Equals, 0), Search::Sort_Random, SearchTerm::Field_Title))) << GeneratorPtr(new QueryGenerator( QT_TRANSLATE_NOOP("Library", "Last played"), Search(Search::Type_All, Search::TermList(), Search::Sort_FieldDesc, SearchTerm::Field_LastPlayed))) << GeneratorPtr(new QueryGenerator( QT_TRANSLATE_NOOP("Library", "Most played"), Search(Search::Type_All, Search::TermList(), Search::Sort_FieldDesc, SearchTerm::Field_PlayCount))) << GeneratorPtr(new QueryGenerator( QT_TRANSLATE_NOOP("Library", "Favourite tracks"), Search(Search::Type_All, Search::TermList(), Search::Sort_FieldDesc, SearchTerm::Field_Score))) << GeneratorPtr(new QueryGenerator( QT_TRANSLATE_NOOP("Library", "Newest tracks"), Search(Search::Type_All, Search::TermList(), Search::Sort_FieldDesc, SearchTerm::Field_DateCreated)))) << (LibraryModel::GeneratorList() << GeneratorPtr(new QueryGenerator( QT_TRANSLATE_NOOP("Library", "All tracks"), Search(Search::Type_All, Search::TermList(), Search::Sort_FieldAsc, SearchTerm::Field_Artist, -1))) << GeneratorPtr(new QueryGenerator( QT_TRANSLATE_NOOP("Library", "Least favourite tracks"), Search(Search::Type_Or, Search::TermList() << SearchTerm(SearchTerm::Field_Rating, SearchTerm::Op_LessThan, 0.6) << SearchTerm(SearchTerm::Field_SkipCount, SearchTerm::Op_GreaterThan, 4), Search::Sort_FieldDesc, SearchTerm::Field_SkipCount)))) << (LibraryModel::GeneratorList() << GeneratorPtr(new QueryGenerator( QT_TRANSLATE_NOOP("Library", "Dynamic random mix"), Search(Search::Type_All, Search::TermList(), Search::Sort_Random, SearchTerm::Field_Title), true)))); // full rescan revisions full_rescan_revisions_[26] = tr("CUE sheet support"); full_rescan_revisions_[50] = tr("Original year tag support"); ReloadSettings(); } Library::~Library() { watcher_->deleteLater(); watcher_thread_->exit(); watcher_thread_->wait(5000 /* five seconds */); } void Library::Init() { watcher_ = new LibraryWatcher; watcher_thread_ = new Thread(this); watcher_thread_->SetIoPriority(Utilities::IOPRIO_CLASS_IDLE); watcher_->moveToThread(watcher_thread_); watcher_thread_->start(QThread::IdlePriority); watcher_->set_backend(backend_); watcher_->set_task_manager(app_->task_manager()); connect(backend_, SIGNAL(DirectoryDiscovered(Directory, SubdirectoryList)), watcher_, SLOT(AddDirectory(Directory, SubdirectoryList))); connect(backend_, SIGNAL(DirectoryDeleted(Directory)), watcher_, SLOT(RemoveDirectory(Directory))); connect(backend_, SIGNAL(SongsRatingChanged(SongList)), SLOT(SongsRatingChanged(SongList))); connect(backend_, SIGNAL(SongsStatisticsChanged(SongList)), SLOT(SongsStatisticsChanged(SongList))); connect(watcher_, SIGNAL(NewOrUpdatedSongs(SongList)), backend_, SLOT(AddOrUpdateSongs(SongList))); connect(watcher_, SIGNAL(SongsMTimeUpdated(SongList)), backend_, SLOT(UpdateMTimesOnly(SongList))); connect(watcher_, SIGNAL(SongsDeleted(SongList)), backend_, SLOT(MarkSongsUnavailable(SongList))); connect(watcher_, SIGNAL(SongsReadded(SongList, bool)), backend_, SLOT(MarkSongsUnavailable(SongList, bool))); connect(watcher_, SIGNAL(SubdirsDiscovered(SubdirectoryList)), backend_, SLOT(AddOrUpdateSubdirs(SubdirectoryList))); connect(watcher_, SIGNAL(SubdirsMTimeUpdated(SubdirectoryList)), backend_, SLOT(AddOrUpdateSubdirs(SubdirectoryList))); connect(watcher_, SIGNAL(CompilationsNeedUpdating()), backend_, SLOT(UpdateCompilations())); connect(app_->playlist_manager(), SIGNAL(CurrentSongChanged(Song)), SLOT(CurrentSongChanged(Song))); connect(app_->player(), SIGNAL(Stopped()), SLOT(Stopped())); // This will start the watcher checking for updates backend_->LoadDirectoriesAsync(); } void Library::IncrementalScan() { watcher_->IncrementalScanAsync(); } void Library::FullScan() { watcher_->FullScanAsync(); } void Library::PauseWatcher() { watcher_->SetRescanPausedAsync(true); } void Library::ResumeWatcher() { watcher_->SetRescanPausedAsync(false); } void Library::ReloadSettings() { watcher_->ReloadSettingsAsync(); // These don't belong in LibraryBackend's group but it's too late to change // now. QSettings s; s.beginGroup(LibraryBackend::kSettingsGroup); save_statistics_in_files_ = s.value("save_statistics_in_file", false).toBool(); save_ratings_in_files_ = s.value("save_ratings_in_file", false).toBool(); } void Library::WriteAllSongsStatisticsToFiles() { const SongList all_songs = backend_->GetAllSongs(); const int task_id = app_->task_manager()->StartTask( tr("Saving songs statistics into songs files")); app_->task_manager()->SetTaskBlocksLibraryScans(task_id); const int nb_songs = all_songs.size(); int i = 0; for (const Song& song : all_songs) { TagReaderClient::Instance()->UpdateSongStatisticsBlocking(song); TagReaderClient::Instance()->UpdateSongRatingBlocking(song); app_->task_manager()->SetTaskProgress(task_id, ++i, nb_songs); } app_->task_manager()->SetTaskFinished(task_id); } void Library::Stopped() { CurrentSongChanged(Song()); } void Library::CurrentSongChanged(const Song& song) { TagReaderReply* reply = nullptr; if (queued_rating_.is_valid()) { reply = app_->tag_reader_client()->UpdateSongRating(queued_rating_); queued_rating_ = Song(); } else if (queued_statistics_.is_valid()) { reply = app_->tag_reader_client()->UpdateSongStatistics(queued_statistics_); queued_statistics_ = Song(); } if (reply) { connect(reply, SIGNAL(Finished(bool)), reply, SLOT(deleteLater())); } if (song.filetype() == Song::Type_Asf) { current_wma_song_url_ = song.url(); } } void Library::SongsRatingChanged(const SongList& songs) { if (save_ratings_in_files_) { app_->tag_reader_client()->UpdateSongsRating( FilterCurrentWMASong(songs, &queued_rating_)); } } void Library::SongsStatisticsChanged(const SongList& songs) { if (save_statistics_in_files_) { app_->tag_reader_client()->UpdateSongsStatistics( FilterCurrentWMASong(songs, &queued_statistics_)); } } SongList Library::FilterCurrentWMASong(SongList songs, Song* queued) { for (SongList::iterator it = songs.begin(); it != songs.end();) { if (it->url() == current_wma_song_url_) { *queued = *it; it = songs.erase(it); } else { ++it; } } return songs; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/library.h000066400000000000000000000050011260417502300234330ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef LIBRARY_H #define LIBRARY_H #include #include #include #include "core/song.h" class Application; class Database; class LibraryBackend; class LibraryModel; class LibraryWatcher; class TaskManager; class Thread; class Library : public QObject { Q_OBJECT public: Library(Application* app, QObject* parent); ~Library(); static const char* kSongsTable; static const char* kDirsTable; static const char* kSubdirsTable; static const char* kFtsTable; void Init(); LibraryBackend* backend() const { return backend_; } LibraryModel* model() const { return model_; } QString full_rescan_reason(int schema_version) const { return full_rescan_revisions_.value(schema_version, QString()); } void WriteAllSongsStatisticsToFiles(); public slots: void ReloadSettings(); void PauseWatcher(); void ResumeWatcher(); void FullScan(); private slots: void IncrementalScan(); void SongsStatisticsChanged(const SongList& songs); void SongsRatingChanged(const SongList& songs); void CurrentSongChanged(const Song& song); void Stopped(); private: SongList FilterCurrentWMASong(SongList songs, Song* queued); private: Application* app_; LibraryBackend* backend_; LibraryModel* model_; LibraryWatcher* watcher_; Thread* watcher_thread_; bool save_statistics_in_files_; bool save_ratings_in_files_; // Hack: Gstreamer doesn't cope well with WMA files being rewritten while // being played, so we delay statistics and rating changes until the current // song has finished playing. QUrl current_wma_song_url_; Song queued_statistics_; Song queued_rating_; // DB schema versions which should trigger a full library rescan (each of // those with a short reason why). QHash full_rescan_revisions_; }; #endif clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/librarybackend.cpp000066400000000000000000001027641260417502300253140ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "librarybackend.h" #include "libraryquery.h" #include "sqlrow.h" #include "core/application.h" #include "core/database.h" #include "core/scopedtransaction.h" #include "core/tagreaderclient.h" #include "core/utilities.h" #include "smartplaylists/search.h" #include #include #include #include #include #include #include const char* LibraryBackend::kSettingsGroup = "LibraryBackend"; const char* LibraryBackend::kNewScoreSql = "case when playcount <= 0 then (%1 * 100 + score) / 2" " else (score * (playcount + skipcount) + %1 * 100) / (playcount + " "skipcount + 1)" " end"; LibraryBackend::LibraryBackend(QObject* parent) : LibraryBackendInterface(parent), save_statistics_in_file_(false), save_ratings_in_file_(false) {} void LibraryBackend::Init(Database* db, const QString& songs_table, const QString& dirs_table, const QString& subdirs_table, const QString& fts_table) { db_ = db; songs_table_ = songs_table; dirs_table_ = dirs_table; subdirs_table_ = subdirs_table; fts_table_ = fts_table; } void LibraryBackend::LoadDirectoriesAsync() { metaObject()->invokeMethod(this, "LoadDirectories", Qt::QueuedConnection); } void LibraryBackend::UpdateTotalSongCountAsync() { metaObject()->invokeMethod(this, "UpdateTotalSongCount", Qt::QueuedConnection); } void LibraryBackend::IncrementPlayCountAsync(int id) { metaObject()->invokeMethod(this, "IncrementPlayCount", Qt::QueuedConnection, Q_ARG(int, id)); } void LibraryBackend::IncrementSkipCountAsync(int id, float progress) { metaObject()->invokeMethod(this, "IncrementSkipCount", Qt::QueuedConnection, Q_ARG(int, id), Q_ARG(float, progress)); } void LibraryBackend::ResetStatisticsAsync(int id) { metaObject()->invokeMethod(this, "ResetStatistics", Qt::QueuedConnection, Q_ARG(int, id)); } void LibraryBackend::UpdateSongRatingAsync(int id, float rating) { metaObject()->invokeMethod(this, "UpdateSongRating", Qt::QueuedConnection, Q_ARG(int, id), Q_ARG(float, rating)); } void LibraryBackend::UpdateSongsRatingAsync(const QList& ids, float rating) { metaObject()->invokeMethod(this, "UpdateSongsRating", Qt::QueuedConnection, Q_ARG(const QList&, ids), Q_ARG(float, rating)); } void LibraryBackend::LoadDirectories() { DirectoryList dirs = GetAllDirectories(); QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); for (const Directory& dir : dirs) { emit DirectoryDiscovered(dir, SubdirsInDirectory(dir.id, db)); } } void LibraryBackend::ChangeDirPath(int id, const QString& old_path, const QString& new_path) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); ScopedTransaction t(&db); // Do the dirs table QSqlQuery q( QString("UPDATE %1 SET path=:path WHERE ROWID=:id").arg(dirs_table_), db); q.bindValue(":path", new_path); q.bindValue(":id", id); q.exec(); if (db_->CheckErrors(q)) return; const QByteArray old_url = QUrl::fromLocalFile(old_path).toEncoded(); const QByteArray new_url = QUrl::fromLocalFile(new_path).toEncoded(); const int path_len = old_url.length(); // Do the subdirs table q = QSqlQuery(QString( "UPDATE %1 SET path=:path || substr(path, %2)" " WHERE directory=:id") .arg(subdirs_table_) .arg(path_len), db); q.bindValue(":path", new_url); q.bindValue(":id", id); q.exec(); if (db_->CheckErrors(q)) return; // Do the songs table q = QSqlQuery(QString( "UPDATE %1 SET filename=:path || substr(filename, %2)" " WHERE directory=:id") .arg(songs_table_) .arg(path_len), db); q.bindValue(":path", new_url); q.bindValue(":id", id); q.exec(); if (db_->CheckErrors(q)) return; t.Commit(); } DirectoryList LibraryBackend::GetAllDirectories() { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); DirectoryList ret; QSqlQuery q(QString("SELECT ROWID, path FROM %1").arg(dirs_table_), db); q.exec(); if (db_->CheckErrors(q)) return ret; while (q.next()) { Directory dir; dir.id = q.value(0).toInt(); dir.path = q.value(1).toString(); ret << dir; } return ret; } SubdirectoryList LibraryBackend::SubdirsInDirectory(int id) { QMutexLocker l(db_->Mutex()); QSqlDatabase db = db_->Connect(); return SubdirsInDirectory(id, db); } SubdirectoryList LibraryBackend::SubdirsInDirectory(int id, QSqlDatabase& db) { QSqlQuery q(QString( "SELECT path, mtime FROM %1" " WHERE directory = :dir").arg(subdirs_table_), db); q.bindValue(":dir", id); q.exec(); if (db_->CheckErrors(q)) return SubdirectoryList(); SubdirectoryList subdirs; while (q.next()) { Subdirectory subdir; subdir.directory_id = id; subdir.path = q.value(0).toString(); subdir.mtime = q.value(1).toUInt(); subdirs << subdir; } return subdirs; } void LibraryBackend::UpdateTotalSongCount() { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery q(QString("SELECT COUNT(*) FROM %1 WHERE unavailable = 0") .arg(songs_table_), db); q.exec(); if (db_->CheckErrors(q)) return; if (!q.next()) return; emit TotalSongCountUpdated(q.value(0).toInt()); } void LibraryBackend::AddDirectory(const QString& path) { QString canonical_path = QFileInfo(path).canonicalFilePath(); QString db_path = canonical_path; if (Application::kIsPortable && Utilities::UrlOnSameDriveAsClementine( QUrl::fromLocalFile(canonical_path))) { db_path = Utilities::GetRelativePathToClementineBin( QUrl::fromLocalFile(db_path)).toLocalFile(); qLog(Debug) << "db_path" << db_path; } QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery q(QString( "INSERT INTO %1 (path, subdirs)" " VALUES (:path, 1)").arg(dirs_table_), db); q.bindValue(":path", db_path); q.exec(); if (db_->CheckErrors(q)) return; Directory dir; dir.path = canonical_path; dir.id = q.lastInsertId().toInt(); emit DirectoryDiscovered(dir, SubdirectoryList()); } void LibraryBackend::RemoveDirectory(const Directory& dir) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); // Remove songs first DeleteSongs(FindSongsInDirectory(dir.id)); ScopedTransaction transaction(&db); // Delete the subdirs that were in this directory QSqlQuery q( QString("DELETE FROM %1 WHERE directory = :id").arg(subdirs_table_), db); q.bindValue(":id", dir.id); q.exec(); if (db_->CheckErrors(q)) return; // Now remove the directory itself q = QSqlQuery(QString("DELETE FROM %1 WHERE ROWID = :id").arg(dirs_table_), db); q.bindValue(":id", dir.id); q.exec(); if (db_->CheckErrors(q)) return; emit DirectoryDeleted(dir); transaction.Commit(); } SongList LibraryBackend::FindSongsInDirectory(int id) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery q( QString("SELECT ROWID, " + Song::kColumnSpec + " FROM %1 WHERE directory = :directory").arg(songs_table_), db); q.bindValue(":directory", id); q.exec(); if (db_->CheckErrors(q)) return SongList(); SongList ret; while (q.next()) { Song song; song.InitFromQuery(q, true); ret << song; } return ret; } void LibraryBackend::AddOrUpdateSubdirs(const SubdirectoryList& subdirs) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery find_query( QString( "SELECT ROWID FROM %1" " WHERE directory = :id AND path = :path").arg(subdirs_table_), db); QSqlQuery add_query(QString( "INSERT INTO %1 (directory, path, mtime)" " VALUES (:id, :path, :mtime)").arg(subdirs_table_), db); QSqlQuery update_query( QString( "UPDATE %1 SET mtime = :mtime" " WHERE directory = :id AND path = :path").arg(subdirs_table_), db); QSqlQuery delete_query( QString( "DELETE FROM %1" " WHERE directory = :id AND path = :path").arg(subdirs_table_), db); ScopedTransaction transaction(&db); for (const Subdirectory& subdir : subdirs) { if (subdir.mtime == 0) { // Delete the subdirectory delete_query.bindValue(":id", subdir.directory_id); delete_query.bindValue(":path", subdir.path); delete_query.exec(); db_->CheckErrors(delete_query); } else { // See if this subdirectory already exists in the database find_query.bindValue(":id", subdir.directory_id); find_query.bindValue(":path", subdir.path); find_query.exec(); if (db_->CheckErrors(find_query)) continue; if (find_query.next()) { update_query.bindValue(":mtime", subdir.mtime); update_query.bindValue(":id", subdir.directory_id); update_query.bindValue(":path", subdir.path); update_query.exec(); db_->CheckErrors(update_query); } else { add_query.bindValue(":id", subdir.directory_id); add_query.bindValue(":path", subdir.path); add_query.bindValue(":mtime", subdir.mtime); add_query.exec(); db_->CheckErrors(add_query); } } } transaction.Commit(); } void LibraryBackend::AddOrUpdateSongs(const SongList& songs) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery check_dir( QString("SELECT ROWID FROM %1 WHERE ROWID = :id").arg(dirs_table_), db); QSqlQuery add_song(QString("INSERT INTO %1 (" + Song::kColumnSpec + ")" " VALUES (" + Song::kBindSpec + ")").arg(songs_table_), db); QSqlQuery update_song(QString("UPDATE %1 SET " + Song::kUpdateSpec + " WHERE ROWID = :id").arg(songs_table_), db); QSqlQuery add_song_fts( QString("INSERT INTO %1 (ROWID, " + Song::kFtsColumnSpec + ")" " VALUES (:id, " + Song::kFtsBindSpec + ")").arg(fts_table_), db); QSqlQuery update_song_fts(QString("UPDATE %1 SET " + Song::kFtsUpdateSpec + " WHERE ROWID = :id").arg(fts_table_), db); ScopedTransaction transaction(&db); SongList added_songs; SongList deleted_songs; for (const Song& song : songs) { // Do a sanity check first - make sure the song's directory still exists // This is to fix a possible race condition when a directory is removed // while LibraryWatcher is scanning it. if (!dirs_table_.isEmpty()) { check_dir.bindValue(":id", song.directory_id()); check_dir.exec(); if (db_->CheckErrors(check_dir)) continue; if (!check_dir.next()) continue; // Directory didn't exist } if (song.id() == -1) { // Create // Insert the row and create a new ID song.BindToQuery(&add_song); add_song.exec(); if (db_->CheckErrors(add_song)) continue; // Get the new ID const int id = add_song.lastInsertId().toInt(); // Add to the FTS index add_song_fts.bindValue(":id", id); song.BindToFtsQuery(&add_song_fts); add_song_fts.exec(); if (db_->CheckErrors(add_song_fts)) continue; Song copy(song); copy.set_id(id); added_songs << copy; } else { // Get the previous song data first Song old_song(GetSongById(song.id())); if (!old_song.is_valid()) continue; // Update song.BindToQuery(&update_song); update_song.bindValue(":id", song.id()); update_song.exec(); if (db_->CheckErrors(update_song)) continue; song.BindToFtsQuery(&update_song_fts); update_song_fts.bindValue(":id", song.id()); update_song_fts.exec(); if (db_->CheckErrors(update_song_fts)) continue; deleted_songs << old_song; added_songs << song; } } transaction.Commit(); if (!deleted_songs.isEmpty()) emit SongsDeleted(deleted_songs); if (!added_songs.isEmpty()) emit SongsDiscovered(added_songs); UpdateTotalSongCountAsync(); } void LibraryBackend::UpdateMTimesOnly(const SongList& songs) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery q(QString("UPDATE %1 SET mtime = :mtime WHERE ROWID = :id") .arg(songs_table_), db); ScopedTransaction transaction(&db); for (const Song& song : songs) { q.bindValue(":mtime", song.mtime()); q.bindValue(":id", song.id()); q.exec(); db_->CheckErrors(q); } transaction.Commit(); } void LibraryBackend::DeleteSongs(const SongList& songs) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery remove( QString("DELETE FROM %1 WHERE ROWID = :id").arg(songs_table_), db); QSqlQuery remove_fts( QString("DELETE FROM %1 WHERE ROWID = :id").arg(fts_table_), db); ScopedTransaction transaction(&db); for (const Song& song : songs) { remove.bindValue(":id", song.id()); remove.exec(); db_->CheckErrors(remove); remove_fts.bindValue(":id", song.id()); remove_fts.exec(); db_->CheckErrors(remove_fts); } transaction.Commit(); emit SongsDeleted(songs); UpdateTotalSongCountAsync(); } void LibraryBackend::MarkSongsUnavailable(const SongList& songs, bool unavailable) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery remove(QString("UPDATE %1 SET unavailable = %2 WHERE ROWID = :id") .arg(songs_table_) .arg(int(unavailable)), db); ScopedTransaction transaction(&db); for (const Song& song : songs) { remove.bindValue(":id", song.id()); remove.exec(); db_->CheckErrors(remove); } transaction.Commit(); emit SongsDeleted(songs); UpdateTotalSongCountAsync(); } QStringList LibraryBackend::GetAll(const QString& column, const QueryOptions& opt) { LibraryQuery query(opt); query.SetColumnSpec("DISTINCT " + column); query.AddCompilationRequirement(false); QMutexLocker l(db_->Mutex()); if (!ExecQuery(&query)) return QStringList(); QStringList ret; while (query.Next()) { ret << query.Value(0).toString(); } return ret; } QStringList LibraryBackend::GetAllArtists(const QueryOptions& opt) { return GetAll("artist", opt); } QStringList LibraryBackend::GetAllArtistsWithAlbums(const QueryOptions& opt) { LibraryQuery query(opt); query.SetColumnSpec("DISTINCT artist"); query.AddCompilationRequirement(false); query.AddWhere("album", "", "!="); QMutexLocker l(db_->Mutex()); if (!ExecQuery(&query)) return QStringList(); QStringList ret; while (query.Next()) { ret << query.Value(0).toString(); } return ret; } LibraryBackend::AlbumList LibraryBackend::GetAllAlbums( const QueryOptions& opt) { return GetAlbums(QString(), false, opt); } LibraryBackend::AlbumList LibraryBackend::GetAlbumsByArtist( const QString& artist, const QueryOptions& opt) { return GetAlbums(artist, false, opt); } SongList LibraryBackend::GetSongsByAlbum(const QString& album, const QueryOptions& opt) { LibraryQuery query(opt); query.AddCompilationRequirement(false); query.AddWhere("album", album); return ExecLibraryQuery(&query); } SongList LibraryBackend::GetSongs(const QString& artist, const QString& album, const QueryOptions& opt) { LibraryQuery query(opt); query.AddCompilationRequirement(false); query.AddWhere("artist", artist); query.AddWhere("album", album); return ExecLibraryQuery(&query); } SongList LibraryBackend::ExecLibraryQuery(LibraryQuery* query) { query->SetColumnSpec("%songs_table.ROWID, " + Song::kColumnSpec); QMutexLocker l(db_->Mutex()); if (!ExecQuery(query)) return SongList(); SongList ret; while (query->Next()) { Song song; song.InitFromQuery(*query, true); ret << song; } return ret; } Song LibraryBackend::GetSongById(int id) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); return GetSongById(id, db); } SongList LibraryBackend::GetSongsById(const QList& ids) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QStringList str_ids; for (int id : ids) { str_ids << QString::number(id); } return GetSongsById(str_ids, db); } SongList LibraryBackend::GetSongsById(const QStringList& ids) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); return GetSongsById(ids, db); } SongList LibraryBackend::GetSongsByForeignId(const QStringList& ids, const QString& table, const QString& column) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QString in = ids.join(","); QSqlQuery q( QString( "SELECT %2.ROWID, " + Song::kColumnSpec + ", %2.%3" " FROM %2, %1" " WHERE %2.%3 IN (%4) AND %1.ROWID = %2.ROWID AND unavailable = 0") .arg(songs_table_, table, column, in), db); q.exec(); if (db_->CheckErrors(q)) return SongList(); QVector ret(ids.count()); while (q.next()) { const QString foreign_id = q.value(Song::kColumns.count() + 1).toString(); const int index = ids.indexOf(foreign_id); if (index == -1) continue; ret[index].InitFromQuery(q, true); } return ret.toList(); } Song LibraryBackend::GetSongById(int id, QSqlDatabase& db) { SongList list = GetSongsById(QStringList() << QString::number(id), db); if (list.isEmpty()) return Song(); return list.first(); } SongList LibraryBackend::GetSongsById(const QStringList& ids, QSqlDatabase& db) { QString in = ids.join(","); QSqlQuery q(QString("SELECT ROWID, " + Song::kColumnSpec + " FROM %1" " WHERE ROWID IN (%2)").arg(songs_table_, in), db); q.exec(); if (db_->CheckErrors(q)) return SongList(); SongList ret; while (q.next()) { Song song; song.InitFromQuery(q, true); ret << song; } return ret; } Song LibraryBackend::GetSongByUrl(const QUrl& url, qint64 beginning) { LibraryQuery query; query.SetColumnSpec("%songs_table.ROWID, " + Song::kColumnSpec); query.AddWhere("filename", url.toEncoded()); query.AddWhere("beginning", beginning); Song song; if (ExecQuery(&query) && query.Next()) { song.InitFromQuery(query, true); } return song; } SongList LibraryBackend::GetSongsByUrl(const QUrl& url) { LibraryQuery query; query.SetColumnSpec("%songs_table.ROWID, " + Song::kColumnSpec); query.AddWhere("filename", url.toEncoded()); SongList songlist; if (ExecQuery(&query)) { while (query.Next()) { Song song; song.InitFromQuery(query, true); songlist << song; } } return songlist; } LibraryBackend::AlbumList LibraryBackend::GetCompilationAlbums( const QueryOptions& opt) { return GetAlbums(QString(), true, opt); } SongList LibraryBackend::GetCompilationSongs(const QString& album, const QueryOptions& opt) { LibraryQuery query(opt); query.SetColumnSpec("%songs_table.ROWID, " + Song::kColumnSpec); query.AddCompilationRequirement(true); query.AddWhere("album", album); QMutexLocker l(db_->Mutex()); if (!ExecQuery(&query)) return SongList(); SongList ret; while (query.Next()) { Song song; song.InitFromQuery(query, true); ret << song; } return ret; } void LibraryBackend::UpdateCompilations() { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); // Look for albums that have songs by more than one 'effective album artist' // in the same // directory QSqlQuery q( QString( "SELECT effective_albumartist, album, filename, sampler " "FROM %1 WHERE unavailable = 0 ORDER BY album").arg(songs_table_), db); q.exec(); if (db_->CheckErrors(q)) return; QMap compilation_info; while (q.next()) { QString artist = q.value(0).toString(); QString album = q.value(1).toString(); QString filename = q.value(2).toString(); bool sampler = q.value(3).toBool(); // Ignore songs that don't have an album field set if (album.isEmpty()) continue; // Find the directory the song is in int last_separator = filename.lastIndexOf('/'); if (last_separator == -1) continue; CompilationInfo& info = compilation_info[album]; info.artists.insert(artist); info.directories.insert(filename.left(last_separator)); if (sampler) info.has_samplers = true; else info.has_not_samplers = true; } // Now mark the songs that we think are in compilations QSqlQuery update( QString( "UPDATE %1" " SET sampler = :sampler," " effective_compilation = ((compilation OR :sampler OR " "forced_compilation_on) AND NOT forced_compilation_off) + 0" " WHERE album = :album AND unavailable = 0").arg(songs_table_), db); QSqlQuery find_songs( QString( "SELECT ROWID, " + Song::kColumnSpec + " FROM %1" " WHERE album = :album AND sampler = :sampler AND unavailable = 0") .arg(songs_table_), db); SongList deleted_songs; SongList added_songs; ScopedTransaction transaction(&db); QMap::const_iterator it = compilation_info.constBegin(); for (; it != compilation_info.constEnd(); ++it) { const CompilationInfo& info = it.value(); QString album(it.key()); // If there were more 'effective album artists' than there were directories // for this album, // then it's a compilation if (info.artists.count() > info.directories.count()) { if (info.has_not_samplers) UpdateCompilations(find_songs, update, deleted_songs, added_songs, album, 1); } else { if (info.has_samplers) UpdateCompilations(find_songs, update, deleted_songs, added_songs, album, 0); } } transaction.Commit(); if (!deleted_songs.isEmpty()) { emit SongsDeleted(deleted_songs); emit SongsDiscovered(added_songs); } } void LibraryBackend::UpdateCompilations(QSqlQuery& find_songs, QSqlQuery& update, SongList& deleted_songs, SongList& added_songs, const QString& album, int sampler) { // Get songs that were already in that album, so we can tell the model // they've been updated find_songs.bindValue(":album", album); find_songs.bindValue(":sampler", int(!sampler)); find_songs.exec(); while (find_songs.next()) { Song song; song.InitFromQuery(find_songs, true); deleted_songs << song; song.set_sampler(true); added_songs << song; } // Mark this album update.bindValue(":sampler", sampler); update.bindValue(":album", album); update.exec(); db_->CheckErrors(update); } LibraryBackend::AlbumList LibraryBackend::GetAlbums(const QString& artist, bool compilation, const QueryOptions& opt) { AlbumList ret; LibraryQuery query(opt); query.SetColumnSpec( "album, artist, compilation, sampler, art_automatic, " "art_manual, filename"); query.SetOrderBy("album"); if (compilation) { query.AddCompilationRequirement(true); } else if (!artist.isNull()) { query.AddCompilationRequirement(false); query.AddWhere("artist", artist); } QMutexLocker l(db_->Mutex()); if (!ExecQuery(&query)) return ret; QString last_album; QString last_artist; while (query.Next()) { bool compilation = query.Value(2).toBool() | query.Value(3).toBool(); Album info; info.artist = compilation ? QString() : query.Value(1).toString(); info.album_name = query.Value(0).toString(); info.art_automatic = query.Value(4).toString(); info.art_manual = query.Value(5).toString(); info.first_url = QUrl::fromEncoded(query.Value(6).toByteArray()); if (info.artist == last_artist && info.album_name == last_album) continue; ret << info; last_album = info.album_name; last_artist = info.artist; } return ret; } LibraryBackend::Album LibraryBackend::GetAlbumArt(const QString& artist, const QString& album) { Album ret; ret.album_name = album; ret.artist = artist; LibraryQuery query = LibraryQuery(QueryOptions()); query.SetColumnSpec("art_automatic, art_manual, filename"); query.AddWhere("artist", artist); query.AddWhere("album", album); QMutexLocker l(db_->Mutex()); if (!ExecQuery(&query)) return ret; if (query.Next()) { ret.art_automatic = query.Value(0).toString(); ret.art_manual = query.Value(1).toString(); ret.first_url = QUrl::fromEncoded(query.Value(2).toByteArray()); } return ret; } void LibraryBackend::UpdateManualAlbumArtAsync(const QString& artist, const QString& album, const QString& art) { metaObject()->invokeMethod(this, "UpdateManualAlbumArt", Qt::QueuedConnection, Q_ARG(QString, artist), Q_ARG(QString, album), Q_ARG(QString, art)); } void LibraryBackend::UpdateManualAlbumArt(const QString& artist, const QString& album, const QString& art) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); // Get the songs before they're updated LibraryQuery query; query.SetColumnSpec("ROWID, " + Song::kColumnSpec); query.AddWhere("album", album); if (!artist.isNull()) query.AddWhere("artist", artist); if (!ExecQuery(&query)) return; SongList deleted_songs; while (query.Next()) { Song song; song.InitFromQuery(query, true); deleted_songs << song; } // Update the songs QString sql( QString( "UPDATE %1 SET art_manual = :art" " WHERE album = :album AND unavailable = 0").arg(songs_table_)); if (!artist.isNull()) sql += " AND artist = :artist"; QSqlQuery q(sql, db); q.bindValue(":art", art); q.bindValue(":album", album); if (!artist.isNull()) q.bindValue(":artist", artist); q.exec(); db_->CheckErrors(q); // Now get the updated songs if (!ExecQuery(&query)) return; SongList added_songs; while (query.Next()) { Song song; song.InitFromQuery(query, true); added_songs << song; } if (!added_songs.isEmpty() || !deleted_songs.isEmpty()) { emit SongsDeleted(deleted_songs); emit SongsDiscovered(added_songs); } } void LibraryBackend::ForceCompilation(const QString& album, const QList& artists, bool on) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); SongList deleted_songs, added_songs; for (const QString& artist : artists) { // Get the songs before they're updated LibraryQuery query; query.SetColumnSpec("ROWID, " + Song::kColumnSpec); query.AddWhere("album", album); if (!artist.isNull()) query.AddWhere("artist", artist); if (!ExecQuery(&query)) return; while (query.Next()) { Song song; song.InitFromQuery(query, true); deleted_songs << song; } // Update the songs QString sql( QString( "UPDATE %1 SET forced_compilation_on = :forced_compilation_on," " forced_compilation_off = :forced_compilation_off," " effective_compilation = ((compilation OR sampler OR " ":forced_compilation_on) AND NOT :forced_compilation_off) + 0" " WHERE album = :album AND unavailable = 0").arg(songs_table_)); if (!artist.isEmpty()) sql += " AND artist = :artist"; QSqlQuery q(sql, db); q.bindValue(":forced_compilation_on", on ? 1 : 0); q.bindValue(":forced_compilation_off", on ? 0 : 1); q.bindValue(":album", album); if (!artist.isEmpty()) q.bindValue(":artist", artist); q.exec(); db_->CheckErrors(q); // Now get the updated songs if (!ExecQuery(&query)) return; while (query.Next()) { Song song; song.InitFromQuery(query, true); added_songs << song; } } if (!added_songs.isEmpty() || !deleted_songs.isEmpty()) { emit SongsDeleted(deleted_songs); emit SongsDiscovered(added_songs); } } bool LibraryBackend::ExecQuery(LibraryQuery* q) { return !db_->CheckErrors(q->Exec(db_->Connect(), songs_table_, fts_table_)); } SongList LibraryBackend::FindSongs(const smart_playlists::Search& search) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); // Build the query QString sql = search.ToSql(songs_table()); // Run the query SongList ret; QSqlQuery query(sql, db); query.exec(); if (db_->CheckErrors(query)) return ret; // Read the results while (query.next()) { Song song; song.InitFromQuery(query, true); ret << song; } return ret; } SongList LibraryBackend::GetAllSongs() { // Get all the songs! return FindSongs(smart_playlists::Search( smart_playlists::Search::Type_All, smart_playlists::Search::TermList(), smart_playlists::Search::Sort_FieldAsc, smart_playlists::SearchTerm::Field_Artist, -1)); } void LibraryBackend::IncrementPlayCount(int id) { if (id == -1) return; QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery q(QString( "UPDATE %1 SET playcount = playcount + 1," " lastplayed = :now," " score = " + QString(kNewScoreSql).arg("1.0") + " WHERE ROWID = :id").arg(songs_table_), db); q.bindValue(":now", QDateTime::currentDateTime().toTime_t()); q.bindValue(":id", id); q.exec(); if (db_->CheckErrors(q)) return; Song new_song = GetSongById(id, db); emit SongsStatisticsChanged(SongList() << new_song); } void LibraryBackend::IncrementSkipCount(int id, float progress) { if (id == -1) return; progress = qBound(0.0f, progress, 1.0f); QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery q(QString( "UPDATE %1 SET skipcount = skipcount + 1," " score = " + QString(kNewScoreSql).arg(progress) + " WHERE ROWID = :id").arg(songs_table_), db); q.bindValue(":id", id); q.exec(); if (db_->CheckErrors(q)) return; Song new_song = GetSongById(id, db); emit SongsStatisticsChanged(SongList() << new_song); } void LibraryBackend::ResetStatistics(int id) { if (id == -1) return; QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery q(QString( "UPDATE %1 SET playcount = 0, skipcount = 0," " lastplayed = -1, score = 0" " WHERE ROWID = :id").arg(songs_table_), db); q.bindValue(":id", id); q.exec(); if (db_->CheckErrors(q)) return; Song new_song = GetSongById(id, db); emit SongsStatisticsChanged(SongList() << new_song); } void LibraryBackend::UpdateSongRating(int id, float rating) { if (id == -1) return; QList id_list; id_list << id; UpdateSongsRating(id_list, rating); } void LibraryBackend::UpdateSongsRating(const QList& id_list, float rating) { if (id_list.isEmpty()) return; QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QStringList id_str_list; for (int i : id_list) { id_str_list << QString::number(i); } QString ids = id_str_list.join(","); QSqlQuery q(QString( "UPDATE %1 SET rating = :rating" " WHERE ROWID IN (%2)").arg(songs_table_, ids), db); q.bindValue(":rating", rating); q.exec(); if (db_->CheckErrors(q)) return; SongList new_song_list = GetSongsById(id_str_list, db); emit SongsRatingChanged(new_song_list); } void LibraryBackend::DeleteAll() { { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); ScopedTransaction t(&db); QSqlQuery q("DELETE FROM " + songs_table_, db); q.exec(); if (db_->CheckErrors(q)) return; q = QSqlQuery("DELETE FROM " + fts_table_, db); q.exec(); if (db_->CheckErrors(q)) return; t.Commit(); } emit DatabaseReset(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/librarybackend.h000066400000000000000000000221521260417502300247510ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef LIBRARYBACKEND_H #define LIBRARYBACKEND_H #include #include #include #include "directory.h" #include "libraryquery.h" #include "core/song.h" class Database; namespace smart_playlists { class Search; } class LibraryBackendInterface : public QObject { Q_OBJECT public: LibraryBackendInterface(QObject* parent = nullptr) : QObject(parent) {} virtual ~LibraryBackendInterface() {} struct Album { Album() {} Album(const QString& _artist, const QString& _album_name, const QString& _art_automatic, const QString& _art_manual, const QUrl& _first_url) : artist(_artist), album_name(_album_name), art_automatic(_art_automatic), art_manual(_art_manual), first_url(_first_url) {} QString artist; QString album_name; QString art_automatic; QString art_manual; QUrl first_url; }; typedef QList AlbumList; virtual QString songs_table() const = 0; // Get a list of directories in the library. Emits DirectoriesDiscovered. virtual void LoadDirectoriesAsync() = 0; // Counts the songs in the library. Emits TotalSongCountUpdated virtual void UpdateTotalSongCountAsync() = 0; virtual SongList FindSongsInDirectory(int id) = 0; virtual SubdirectoryList SubdirsInDirectory(int id) = 0; virtual DirectoryList GetAllDirectories() = 0; virtual void ChangeDirPath(int id, const QString& old_path, const QString& new_path) = 0; virtual QStringList GetAllArtists( const QueryOptions& opt = QueryOptions()) = 0; virtual QStringList GetAllArtistsWithAlbums( const QueryOptions& opt = QueryOptions()) = 0; virtual SongList GetSongsByAlbum( const QString& album, const QueryOptions& opt = QueryOptions()) = 0; virtual SongList GetSongs(const QString& artist, const QString& album, const QueryOptions& opt = QueryOptions()) = 0; virtual SongList GetCompilationSongs( const QString& album, const QueryOptions& opt = QueryOptions()) = 0; virtual AlbumList GetAllAlbums(const QueryOptions& opt = QueryOptions()) = 0; virtual AlbumList GetAlbumsByArtist( const QString& artist, const QueryOptions& opt = QueryOptions()) = 0; virtual AlbumList GetCompilationAlbums( const QueryOptions& opt = QueryOptions()) = 0; virtual void UpdateManualAlbumArtAsync(const QString& artist, const QString& album, const QString& art) = 0; virtual Album GetAlbumArt(const QString& artist, const QString& album) = 0; virtual Song GetSongById(int id) = 0; // Returns all sections of a song with the given filename. If there's just one // section // the resulting list will have it's size equal to 1. virtual SongList GetSongsByUrl(const QUrl& url) = 0; // Returns a section of a song with the given filename and beginning. If the // section // is not present in library, returns invalid song. // Using default beginning value is suitable when searching for single-section // songs. virtual Song GetSongByUrl(const QUrl& url, qint64 beginning = 0) = 0; virtual void AddDirectory(const QString& path) = 0; virtual void RemoveDirectory(const Directory& dir) = 0; virtual bool ExecQuery(LibraryQuery* q) = 0; }; class LibraryBackend : public LibraryBackendInterface { Q_OBJECT public: static const char* kSettingsGroup; Q_INVOKABLE LibraryBackend(QObject* parent = nullptr); void Init(Database* db, const QString& songs_table, const QString& dirs_table, const QString& subdirs_table, const QString& fts_table); Database* db() const { return db_; } QString songs_table() const { return songs_table_; } QString dirs_table() const { return dirs_table_; } QString subdirs_table() const { return subdirs_table_; } // Get a list of directories in the library. Emits DirectoriesDiscovered. void LoadDirectoriesAsync(); // Counts the songs in the library. Emits TotalSongCountUpdated void UpdateTotalSongCountAsync(); SongList FindSongsInDirectory(int id); SubdirectoryList SubdirsInDirectory(int id); DirectoryList GetAllDirectories(); void ChangeDirPath(int id, const QString& old_path, const QString& new_path); QStringList GetAll(const QString& column, const QueryOptions& opt = QueryOptions()); QStringList GetAllArtists(const QueryOptions& opt = QueryOptions()); QStringList GetAllArtistsWithAlbums(const QueryOptions& opt = QueryOptions()); SongList GetSongsByAlbum(const QString& album, const QueryOptions& opt = QueryOptions()); SongList GetSongs(const QString& artist, const QString& album, const QueryOptions& opt = QueryOptions()); SongList GetCompilationSongs(const QString& album, const QueryOptions& opt = QueryOptions()); AlbumList GetAllAlbums(const QueryOptions& opt = QueryOptions()); AlbumList GetAlbumsByArtist(const QString& artist, const QueryOptions& opt = QueryOptions()); AlbumList GetCompilationAlbums(const QueryOptions& opt = QueryOptions()); void UpdateManualAlbumArtAsync(const QString& artist, const QString& album, const QString& art); Album GetAlbumArt(const QString& artist, const QString& album); Song GetSongById(int id); SongList GetSongsById(const QList& ids); SongList GetSongsById(const QStringList& ids); SongList GetSongsByForeignId(const QStringList& ids, const QString& table, const QString& column); SongList GetSongsByUrl(const QUrl& url); Song GetSongByUrl(const QUrl& url, qint64 beginning = 0); void AddDirectory(const QString& path); void RemoveDirectory(const Directory& dir); bool ExecQuery(LibraryQuery* q); SongList ExecLibraryQuery(LibraryQuery* query); SongList FindSongs(const smart_playlists::Search& search); SongList GetAllSongs(); void IncrementPlayCountAsync(int id); void IncrementSkipCountAsync(int id, float progress); void ResetStatisticsAsync(int id); void UpdateSongRatingAsync(int id, float rating); void UpdateSongsRatingAsync(const QList& ids, float rating); void DeleteAll(); public slots: void LoadDirectories(); void UpdateTotalSongCount(); void AddOrUpdateSongs(const SongList& songs); void UpdateMTimesOnly(const SongList& songs); void DeleteSongs(const SongList& songs); void MarkSongsUnavailable(const SongList& songs, bool unavailable = true); void AddOrUpdateSubdirs(const SubdirectoryList& subdirs); void UpdateCompilations(); void UpdateManualAlbumArt(const QString& artist, const QString& album, const QString& art); void ForceCompilation(const QString& album, const QList& artists, bool on); void IncrementPlayCount(int id); void IncrementSkipCount(int id, float progress); void ResetStatistics(int id); void UpdateSongRating(int id, float rating); void UpdateSongsRating(const QList& id_list, float rating); signals: void DirectoryDiscovered(const Directory& dir, const SubdirectoryList& subdirs); void DirectoryDeleted(const Directory& dir); void SongsDiscovered(const SongList& songs); void SongsDeleted(const SongList& songs); void SongsStatisticsChanged(const SongList& songs); void SongsRatingChanged(const SongList& songs); void DatabaseReset(); void TotalSongCountUpdated(int total); private: struct CompilationInfo { CompilationInfo() : has_samplers(false), has_not_samplers(false) {} QSet artists; QSet directories; bool has_samplers; bool has_not_samplers; }; static const char* kNewScoreSql; void UpdateCompilations(QSqlQuery& find_songs, QSqlQuery& update, SongList& deleted_songs, SongList& added_songs, const QString& album, int sampler); AlbumList GetAlbums(const QString& artist, bool compilation = false, const QueryOptions& opt = QueryOptions()); SubdirectoryList SubdirsInDirectory(int id, QSqlDatabase& db); Song GetSongById(int id, QSqlDatabase& db); SongList GetSongsById(const QStringList& ids, QSqlDatabase& db); private: Database* db_; QString songs_table_; QString dirs_table_; QString subdirs_table_; QString fts_table_; bool save_statistics_in_file_; bool save_ratings_in_file_; }; #endif // LIBRARYBACKEND_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/librarydirectorymodel.cpp000066400000000000000000000063321260417502300267440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "librarydirectorymodel.h" #include "librarybackend.h" #include "core/application.h" #include "core/filesystemmusicstorage.h" #include "core/musicstorage.h" #include "core/utilities.h" #include "ui/iconloader.h" LibraryDirectoryModel::LibraryDirectoryModel(LibraryBackend* backend, QObject* parent) : QStandardItemModel(parent), dir_icon_(IconLoader::Load("document-open-folder")), backend_(backend) { connect(backend_, SIGNAL(DirectoryDiscovered(Directory, SubdirectoryList)), SLOT(DirectoryDiscovered(Directory))); connect(backend_, SIGNAL(DirectoryDeleted(Directory)), SLOT(DirectoryDeleted(Directory))); } LibraryDirectoryModel::~LibraryDirectoryModel() {} void LibraryDirectoryModel::DirectoryDiscovered(const Directory& dir) { QStandardItem* item; if (Application::kIsPortable && Utilities::UrlOnSameDriveAsClementine(QUrl::fromLocalFile(dir.path))) { item = new QStandardItem(Utilities::GetRelativePathToClementineBin( QUrl::fromLocalFile(dir.path)).toLocalFile()); } else { item = new QStandardItem(dir.path); } item->setData(dir.id, kIdRole); item->setIcon(dir_icon_); storage_ << std::shared_ptr( new FilesystemMusicStorage(dir.path)); appendRow(item); } void LibraryDirectoryModel::DirectoryDeleted(const Directory& dir) { for (int i = 0; i < rowCount(); ++i) { if (item(i, 0)->data(kIdRole).toInt() == dir.id) { removeRow(i); storage_.removeAt(i); break; } } } void LibraryDirectoryModel::AddDirectory(const QString& path) { if (!backend_) return; backend_->AddDirectory(path); } void LibraryDirectoryModel::RemoveDirectory(const QModelIndex& index) { if (!backend_ || !index.isValid()) return; Directory dir; dir.path = index.data().toString(); dir.id = index.data(kIdRole).toInt(); backend_->RemoveDirectory(dir); } QVariant LibraryDirectoryModel::data(const QModelIndex& index, int role) const { switch (role) { case MusicStorage::Role_Storage: case MusicStorage::Role_StorageForceConnect: return QVariant::fromValue(storage_[index.row()]); case MusicStorage::Role_FreeSpace: return Utilities::FileSystemFreeSpace( data(index, Qt::DisplayRole).toString()); case MusicStorage::Role_Capacity: return Utilities::FileSystemCapacity( data(index, Qt::DisplayRole).toString()); default: return QStandardItemModel::data(index, role); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/librarydirectorymodel.h000066400000000000000000000031641260417502300264110ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef LIBRARYDIRECTORYMODEL_H #define LIBRARYDIRECTORYMODEL_H #include #include #include #include "directory.h" class LibraryBackend; class MusicStorage; class LibraryDirectoryModel : public QStandardItemModel { Q_OBJECT public: LibraryDirectoryModel(LibraryBackend* backend, QObject* parent = nullptr); ~LibraryDirectoryModel(); // To be called by GUIs void AddDirectory(const QString& path); void RemoveDirectory(const QModelIndex& index); QVariant data(const QModelIndex& index, int role) const; private slots: // To be called by the backend void DirectoryDiscovered(const Directory& directories); void DirectoryDeleted(const Directory& directories); private: static const int kIdRole = Qt::UserRole + 1; QIcon dir_icon_; LibraryBackend* backend_; QList > storage_; }; #endif // LIBRARYDIRECTORYMODEL_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/libraryfilterwidget.cpp000066400000000000000000000250071260417502300264100ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "libraryfilterwidget.h" #include "librarymodel.h" #include "libraryquery.h" #include "groupbydialog.h" #include "ui_libraryfilterwidget.h" #include "core/song.h" #include "ui/iconloader.h" #include "ui/settingsdialog.h" #include #include #include #include #include #include #include LibraryFilterWidget::LibraryFilterWidget(QWidget* parent) : QWidget(parent), ui_(new Ui_LibraryFilterWidget), model_(nullptr), group_by_dialog_(new GroupByDialog), filter_delay_(new QTimer(this)), filter_applies_to_model_(true), delay_behaviour_(DelayedOnLargeLibraries) { ui_->setupUi(this); // Add the available fields to the tooltip here instead of the ui // file to prevent that they get translated by mistake. QString available_fields = Song::kFtsColumns.join(", ").replace(QRegExp("\\bfts"), ""); ui_->filter->setToolTip(ui_->filter->toolTip().arg(available_fields)); connect(ui_->filter, SIGNAL(returnPressed()), SIGNAL(ReturnPressed())); connect(filter_delay_, SIGNAL(timeout()), SLOT(FilterDelayTimeout())); filter_delay_->setInterval(kFilterDelay); filter_delay_->setSingleShot(true); // Icons ui_->options->setIcon(IconLoader::Load("configure")); // Filter by age QActionGroup* filter_age_group = new QActionGroup(this); filter_age_group->addAction(ui_->filter_age_all); filter_age_group->addAction(ui_->filter_age_today); filter_age_group->addAction(ui_->filter_age_week); filter_age_group->addAction(ui_->filter_age_month); filter_age_group->addAction(ui_->filter_age_three_months); filter_age_group->addAction(ui_->filter_age_year); filter_age_menu_ = new QMenu(tr("Show"), this); filter_age_menu_->addActions(filter_age_group->actions()); filter_age_mapper_ = new QSignalMapper(this); filter_age_mapper_->setMapping(ui_->filter_age_all, -1); filter_age_mapper_->setMapping(ui_->filter_age_today, 60 * 60 * 24); filter_age_mapper_->setMapping(ui_->filter_age_week, 60 * 60 * 24 * 7); filter_age_mapper_->setMapping(ui_->filter_age_month, 60 * 60 * 24 * 30); filter_age_mapper_->setMapping(ui_->filter_age_three_months, 60 * 60 * 24 * 30 * 3); filter_age_mapper_->setMapping(ui_->filter_age_year, 60 * 60 * 24 * 365); connect(ui_->filter_age_all, SIGNAL(triggered()), filter_age_mapper_, SLOT(map())); connect(ui_->filter_age_today, SIGNAL(triggered()), filter_age_mapper_, SLOT(map())); connect(ui_->filter_age_week, SIGNAL(triggered()), filter_age_mapper_, SLOT(map())); connect(ui_->filter_age_month, SIGNAL(triggered()), filter_age_mapper_, SLOT(map())); connect(ui_->filter_age_three_months, SIGNAL(triggered()), filter_age_mapper_, SLOT(map())); connect(ui_->filter_age_year, SIGNAL(triggered()), filter_age_mapper_, SLOT(map())); // "Group by ..." group_by_group_ = CreateGroupByActions(this); group_by_menu_ = new QMenu(tr("Group by"), this); group_by_menu_->addActions(group_by_group_->actions()); connect(group_by_group_, SIGNAL(triggered(QAction*)), SLOT(GroupByClicked(QAction*))); // Library config menu library_menu_ = new QMenu(tr("Display options"), this); library_menu_->setIcon(ui_->options->icon()); library_menu_->addMenu(filter_age_menu_); library_menu_->addMenu(group_by_menu_); library_menu_->addSeparator(); ui_->options->setMenu(library_menu_); connect(ui_->filter, SIGNAL(textChanged(QString)), SLOT(FilterTextChanged(QString))); } LibraryFilterWidget::~LibraryFilterWidget() { delete ui_; } QActionGroup* LibraryFilterWidget::CreateGroupByActions(QObject* parent) { QActionGroup* ret = new QActionGroup(parent); ret->addAction(CreateGroupByAction( tr("Group by Artist"), parent, LibraryModel::Grouping(LibraryModel::GroupBy_Artist))); ret->addAction( CreateGroupByAction(tr("Group by Artist/Album"), parent, LibraryModel::Grouping(LibraryModel::GroupBy_Artist, LibraryModel::GroupBy_Album))); ret->addAction(CreateGroupByAction( tr("Group by Artist/Year - Album"), parent, LibraryModel::Grouping(LibraryModel::GroupBy_Artist, LibraryModel::GroupBy_YearAlbum))); ret->addAction( CreateGroupByAction(tr("Group by Album"), parent, LibraryModel::Grouping(LibraryModel::GroupBy_Album))); ret->addAction( CreateGroupByAction(tr("Group by Genre/Album"), parent, LibraryModel::Grouping(LibraryModel::GroupBy_Genre, LibraryModel::GroupBy_Album))); ret->addAction( CreateGroupByAction(tr("Group by Genre/Artist/Album"), parent, LibraryModel::Grouping(LibraryModel::GroupBy_Genre, LibraryModel::GroupBy_Artist, LibraryModel::GroupBy_Album))); ret->addAction(CreateGroupByAction(tr("Advanced grouping..."), parent, LibraryModel::Grouping())); return ret; } QAction* LibraryFilterWidget::CreateGroupByAction( const QString& text, QObject* parent, const LibraryModel::Grouping& grouping) { QAction* ret = new QAction(text, parent); ret->setCheckable(true); if (grouping.first != LibraryModel::GroupBy_None) { ret->setProperty("group_by", QVariant::fromValue(grouping)); } return ret; } void LibraryFilterWidget::FocusOnFilter(QKeyEvent* event) { ui_->filter->setFocus(); QApplication::sendEvent(ui_->filter, event); } void LibraryFilterWidget::SetLibraryModel(LibraryModel* model) { if (model_) { disconnect(model_, 0, this, 0); disconnect(model_, 0, group_by_dialog_.get(), 0); disconnect(group_by_dialog_.get(), 0, model_, 0); disconnect(filter_age_mapper_, 0, model_, 0); } model_ = model; // Connect signals connect(model_, SIGNAL(GroupingChanged(LibraryModel::Grouping)), group_by_dialog_.get(), SLOT(LibraryGroupingChanged(LibraryModel::Grouping))); connect(model_, SIGNAL(GroupingChanged(LibraryModel::Grouping)), SLOT(GroupingChanged(LibraryModel::Grouping))); connect(group_by_dialog_.get(), SIGNAL(Accepted(LibraryModel::Grouping)), model_, SLOT(SetGroupBy(LibraryModel::Grouping))); connect(filter_age_mapper_, SIGNAL(mapped(int)), model_, SLOT(SetFilterAge(int))); // Load settings if (!settings_group_.isEmpty()) { QSettings s; s.beginGroup(settings_group_); model_->SetGroupBy(LibraryModel::Grouping( LibraryModel::GroupBy( s.value("group_by1", int(LibraryModel::GroupBy_Artist)).toInt()), LibraryModel::GroupBy( s.value("group_by2", int(LibraryModel::GroupBy_Album)).toInt()), LibraryModel::GroupBy( s.value("group_by3", int(LibraryModel::GroupBy_None)).toInt()))); } } void LibraryFilterWidget::GroupByClicked(QAction* action) { if (action->property("group_by").isNull()) { group_by_dialog_->show(); return; } LibraryModel::Grouping g = action->property("group_by").value(); model_->SetGroupBy(g); } void LibraryFilterWidget::GroupingChanged(const LibraryModel::Grouping& g) { if (!settings_group_.isEmpty()) { // Save the settings QSettings s; s.beginGroup(settings_group_); s.setValue("group_by1", int(g[0])); s.setValue("group_by2", int(g[1])); s.setValue("group_by3", int(g[2])); } // Now make sure the correct action is checked for (QAction* action : group_by_group_->actions()) { if (action->property("group_by").isNull()) continue; if (g == action->property("group_by").value()) { action->setChecked(true); return; } } // Check the advanced action group_by_group_->actions().last()->setChecked(true); } void LibraryFilterWidget::SetFilterHint(const QString& hint) { ui_->filter->setPlaceholderText(hint); } void LibraryFilterWidget::SetQueryMode(QueryOptions::QueryMode query_mode) { ui_->filter->clear(); ui_->filter->setEnabled(query_mode == QueryOptions::QueryMode_All); model_->SetFilterQueryMode(query_mode); } void LibraryFilterWidget::ShowInLibrary(const QString& search) { ui_->filter->setText(search); } void LibraryFilterWidget::SetAgeFilterEnabled(bool enabled) { filter_age_menu_->setEnabled(enabled); } void LibraryFilterWidget::SetGroupByEnabled(bool enabled) { group_by_menu_->setEnabled(enabled); } void LibraryFilterWidget::AddMenuAction(QAction* action) { library_menu_->addAction(action); } void LibraryFilterWidget::keyReleaseEvent(QKeyEvent* e) { switch (e->key()) { case Qt::Key_Up: emit UpPressed(); e->accept(); break; case Qt::Key_Down: emit DownPressed(); e->accept(); break; case Qt::Key_Escape: ui_->filter->clear(); e->accept(); break; } QWidget::keyReleaseEvent(e); } void LibraryFilterWidget::FilterTextChanged(const QString& text) { // Searching with one or two characters can be very expensive on the database // even with FTS, so if there are a large number of songs in the database // introduce a small delay before actually filtering the model, so if the // user is typing the first few characters of something it will be quicker. const bool delay = (delay_behaviour_ == AlwaysDelayed) || (delay_behaviour_ == DelayedOnLargeLibraries && !text.isEmpty() && text.length() < 3 && model_->total_song_count() >= 100000); if (delay) { filter_delay_->start(); } else { filter_delay_->stop(); FilterDelayTimeout(); } } void LibraryFilterWidget::FilterDelayTimeout() { emit Filter(ui_->filter->text()); if (filter_applies_to_model_) { model_->SetFilterText(ui_->filter->text()); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/libraryfilterwidget.h000066400000000000000000000057371260417502300260650ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef LIBRARYFILTERWIDGET_H #define LIBRARYFILTERWIDGET_H #include #include #include "librarymodel.h" class GroupByDialog; class SettingsDialog; class Ui_LibraryFilterWidget; struct QueryOptions; class QMenu; class QActionGroup; class QSignalMapper; class LibraryFilterWidget : public QWidget { Q_OBJECT public: LibraryFilterWidget(QWidget* parent = nullptr); ~LibraryFilterWidget(); static const int kFilterDelay = 500; // msec enum DelayBehaviour { AlwaysInstant, DelayedOnLargeLibraries, AlwaysDelayed, }; static QActionGroup* CreateGroupByActions(QObject* parent); void SetFilterHint(const QString& hint); void SetApplyFilterToLibrary(bool filter_applies_to_model) { filter_applies_to_model_ = filter_applies_to_model; } void SetDelayBehaviour(DelayBehaviour behaviour) { delay_behaviour_ = behaviour; } void SetAgeFilterEnabled(bool enabled); void SetGroupByEnabled(bool enabled); void ShowInLibrary(const QString& search); QMenu* menu() const { return library_menu_; } void AddMenuAction(QAction* action); void SetSettingsGroup(const QString& group) { settings_group_ = group; } void SetLibraryModel(LibraryModel* model); public slots: void SetQueryMode(QueryOptions::QueryMode view); void FocusOnFilter(QKeyEvent* e); signals: void UpPressed(); void DownPressed(); void ReturnPressed(); void Filter(const QString& text); protected: void keyReleaseEvent(QKeyEvent* e); private slots: void GroupingChanged(const LibraryModel::Grouping& g); void GroupByClicked(QAction* action); void FilterTextChanged(const QString& text); void FilterDelayTimeout(); private: static QAction* CreateGroupByAction(const QString& text, QObject* parent, const LibraryModel::Grouping& grouping); private: Ui_LibraryFilterWidget* ui_; LibraryModel* model_; std::unique_ptr group_by_dialog_; SettingsDialog* settings_dialog_; QMenu* filter_age_menu_; QMenu* group_by_menu_; QMenu* library_menu_; QActionGroup* group_by_group_; QSignalMapper* filter_age_mapper_; QTimer* filter_delay_; bool filter_applies_to_model_; DelayBehaviour delay_behaviour_; QString settings_group_; }; #endif // LIBRARYFILTERWIDGET_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/libraryfilterwidget.ui000066400000000000000000000062211260417502300262400ustar00rootroot00000000000000 LibraryFilterWidget 0 0 400 30 Form 0 0 <html><head/><body><p>Prefix a word with a field name to limit the search to that field, e.g. <span style=" font-weight:600;">artist:</span><span style=" font-style:italic;">Bode</span> searches the library for all artists that contain the word Bode.</p><p><span style=" font-weight:600;">Available fields: </span><span style=" font-style:italic;">%1</span>.</p></body></html> Enter search terms here 16 16 QToolButton::InstantPopup true true Entire collection true Added today true Added this week true Added within three months Added within three months true Added this year true Added this month QSearchField QWidget
3rdparty/qocoa/qsearchfield.h
clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/libraryitem.h000066400000000000000000000031131260417502300243140ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef LIBRARYITEM_H #define LIBRARYITEM_H #include #include #include "core/simpletreeitem.h" #include "core/song.h" class LibraryItem : public SimpleTreeItem { public: enum Type { Type_Root, Type_Divider, Type_Container, Type_Song, Type_PlaylistContainer, Type_SmartPlaylist, Type_LoadingIndicator, }; LibraryItem(SimpleTreeModel* model) : SimpleTreeItem(Type_Root, model), container_level(-1), compilation_artist_node_(nullptr) {} LibraryItem(Type type, LibraryItem* parent = nullptr) : SimpleTreeItem(type, parent), container_level(-1), compilation_artist_node_(nullptr) {} int container_level; Song metadata; QByteArray smart_playlist_data; LibraryItem* compilation_artist_node_; }; #endif // LIBRARYITEM_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/librarymodel.cpp000066400000000000000000001342511260417502300250210ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "librarymodel.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "librarybackend.h" #include "libraryitem.h" #include "librarydirectorymodel.h" #include "libraryview.h" #include "sqlrow.h" #include "core/application.h" #include "core/database.h" #include "core/logging.h" #include "core/taskmanager.h" #include "core/utilities.h" #include "covers/albumcoverloader.h" #include "playlist/songmimedata.h" #include "smartplaylists/generator.h" #include "smartplaylists/generatormimedata.h" #include "smartplaylists/querygenerator.h" #include "ui/iconloader.h" using std::placeholders::_1; using std::placeholders::_2; using smart_playlists::Generator; using smart_playlists::GeneratorMimeData; using smart_playlists::GeneratorPtr; using smart_playlists::QueryGenerator; const char* LibraryModel::kSmartPlaylistsMimeType = "application/x-clementine-smart-playlist-generator"; const char* LibraryModel::kSmartPlaylistsSettingsGroup = "SerialisedSmartPlaylists"; const int LibraryModel::kSmartPlaylistsVersion = 4; const int LibraryModel::kPrettyCoverSize = 32; const qint64 LibraryModel::kIconCacheSize = 100000000; //~100MB typedef QFuture RootQueryFuture; typedef QFutureWatcher RootQueryWatcher; static bool IsArtistGroupBy(const LibraryModel::GroupBy by) { return by == LibraryModel::GroupBy_Artist || by == LibraryModel::GroupBy_AlbumArtist; } static bool IsCompilationArtistNode(const LibraryItem* node) { return node == node->parent->compilation_artist_node_; } LibraryModel::LibraryModel(LibraryBackend* backend, Application* app, QObject* parent) : SimpleTreeModel(new LibraryItem(this), parent), backend_(backend), app_(app), dir_model_(new LibraryDirectoryModel(backend, this)), show_smart_playlists_(false), show_various_artists_(true), total_song_count_(0), artist_icon_(":/icons/22x22/x-clementine-artist.png"), album_icon_(":/icons/22x22/x-clementine-album.png"), playlists_dir_icon_(IconLoader::Load("folder-sound")), playlist_icon_(":/icons/22x22/x-clementine-albums.png"), icon_cache_(new QNetworkDiskCache(this)), init_task_id_(-1), use_pretty_covers_(false), show_dividers_(true) { root_->lazy_loaded = true; group_by_[0] = GroupBy_Artist; group_by_[1] = GroupBy_Album; group_by_[2] = GroupBy_None; cover_loader_options_.desired_height_ = kPrettyCoverSize; cover_loader_options_.pad_output_image_ = true; cover_loader_options_.scale_output_image_ = true; connect(app_->album_cover_loader(), SIGNAL(ImageLoaded(quint64, QImage)), SLOT(AlbumArtLoaded(quint64, QImage))); icon_cache_->setCacheDirectory( Utilities::GetConfigPath(Utilities::Path_CacheRoot) + "/pixmapcache"); icon_cache_->setMaximumCacheSize(LibraryModel::kIconCacheSize); no_cover_icon_ = QPixmap(":nocover.png") .scaled(kPrettyCoverSize, kPrettyCoverSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); connect(backend_, SIGNAL(SongsDiscovered(SongList)), SLOT(SongsDiscovered(SongList))); connect(backend_, SIGNAL(SongsDeleted(SongList)), SLOT(SongsDeleted(SongList))); connect(backend_, SIGNAL(SongsStatisticsChanged(SongList)), SLOT(SongsSlightlyChanged(SongList))); connect(backend_, SIGNAL(SongsRatingChanged(SongList)), SLOT(SongsSlightlyChanged(SongList))); connect(backend_, SIGNAL(DatabaseReset()), SLOT(Reset())); connect(backend_, SIGNAL(TotalSongCountUpdated(int)), SLOT(TotalSongCountUpdatedSlot(int))); backend_->UpdateTotalSongCountAsync(); } LibraryModel::~LibraryModel() { delete root_; } void LibraryModel::set_pretty_covers(bool use_pretty_covers) { if (use_pretty_covers != use_pretty_covers_) { use_pretty_covers_ = use_pretty_covers; Reset(); } } void LibraryModel::set_show_dividers(bool show_dividers) { if (show_dividers != show_dividers_) { show_dividers_ = show_dividers; Reset(); } } void LibraryModel::Init(bool async) { if (async) { // Show a loading indicator in the model. LibraryItem* loading = new LibraryItem(LibraryItem::Type_LoadingIndicator, root_); loading->display_text = tr("Loading..."); loading->lazy_loaded = true; reset(); // Show a loading indicator in the status bar too. init_task_id_ = app_->task_manager()->StartTask(tr("Loading songs")); ResetAsync(); } else { Reset(); } } void LibraryModel::SongsDiscovered(const SongList& songs) { for (const Song& song : songs) { // Sanity check to make sure we don't add songs that are outside the user's // filter if (!query_options_.Matches(song)) continue; // Hey, we've already got that one! if (song_nodes_.contains(song.id())) continue; // Before we can add each song we need to make sure the required container // items already exist in the tree. These depend on which "group by" // settings the user has on the library. Eg. if the user grouped by // artist and album, we would need to make sure nodes for the song's artist // and album were already in the tree. // Find parent containers in the tree LibraryItem* container = root_; for (int i = 0; i < 3; ++i) { GroupBy type = group_by_[i]; if (type == GroupBy_None) break; // Special case: if the song is a compilation and the current GroupBy // level is Artists, then we want the Various Artists node :( if (IsArtistGroupBy(type) && song.is_compilation()) { if (container->compilation_artist_node_ == nullptr) CreateCompilationArtistNode(true, container); container = container->compilation_artist_node_; } else { // Otherwise find the proper container at this level based on the // item's key QString key; switch (type) { case GroupBy_Album: key = song.album(); break; case GroupBy_Artist: key = song.artist(); break; case GroupBy_Composer: key = song.composer(); break; case GroupBy_Performer: key = song.performer(); break; case GroupBy_Disc: key = QString::number(song.disc()); break; case GroupBy_Grouping: key = song.grouping(); break; case GroupBy_Genre: key = song.genre(); break; case GroupBy_AlbumArtist: key = song.effective_albumartist(); break; case GroupBy_Year: key = QString::number(qMax(0, song.year())); break; case GroupBy_OriginalYear: key = QString::number(qMax(0, song.effective_originalyear())); break; case GroupBy_YearAlbum: key = PrettyYearAlbum(qMax(0, song.year()), song.album()); break; case GroupBy_OriginalYearAlbum: key = PrettyYearAlbum(qMax(0, song.effective_originalyear()), song.album()); break; case GroupBy_FileType: key = song.filetype(); break; case GroupBy_Bitrate: key = song.bitrate(); break; case GroupBy_None: qLog(Error) << "GroupBy_None"; break; } // Does it exist already? if (!container_nodes_[i].contains(key)) { // Create the container container_nodes_[i][key] = ItemFromSong(type, true, i == 0, container, song, i); } container = container_nodes_[i][key]; } // If we just created the damn thing then we don't need to continue into // it any further because it'll get lazy-loaded properly later. if (!container->lazy_loaded) break; } if (!container->lazy_loaded) continue; // We've gone all the way down to the deepest level and everything was // already lazy loaded, so now we have to create the song in the container. song_nodes_[song.id()] = ItemFromSong(GroupBy_None, true, false, container, song, -1); } } void LibraryModel::SongsSlightlyChanged(const SongList& songs) { // This is called if there was a minor change to the songs that will not // normally require the library to be restructured. We can just update our // internal cache of Song objects without worrying about resetting the model. for (const Song& song : songs) { if (song_nodes_.contains(song.id())) { song_nodes_[song.id()]->metadata = song; } } } LibraryItem* LibraryModel::CreateCompilationArtistNode(bool signal, LibraryItem* parent) { if (signal) beginInsertRows(ItemToIndex(parent), parent->children.count(), parent->children.count()); parent->compilation_artist_node_ = new LibraryItem(LibraryItem::Type_Container, parent); parent->compilation_artist_node_->compilation_artist_node_ = nullptr; parent->compilation_artist_node_->key = tr("Various artists"); parent->compilation_artist_node_->sort_text = " various"; parent->compilation_artist_node_->container_level = parent->container_level + 1; if (signal) endInsertRows(); return parent->compilation_artist_node_; } QString LibraryModel::DividerKey(GroupBy type, LibraryItem* item) const { // Items which are to be grouped under the same divider must produce the // same divider key. This will only get called for top-level items. if (item->sort_text.isEmpty()) return QString(); switch (type) { case GroupBy_Album: case GroupBy_Artist: case GroupBy_Composer: case GroupBy_Performer: case GroupBy_Disc: case GroupBy_Grouping: case GroupBy_Genre: case GroupBy_AlbumArtist: case GroupBy_FileType: { QChar c = item->sort_text[0]; if (c.isDigit()) return "0"; if (c == ' ') return QString(); if (c.decompositionTag() != QChar::NoDecomposition) return QChar(c.decomposition()[0]); return c; } case GroupBy_Year: case GroupBy_OriginalYear: return SortTextForNumber(item->sort_text.toInt() / 10 * 10); case GroupBy_YearAlbum: return SortTextForNumber(item->metadata.year()); case GroupBy_OriginalYearAlbum: return SortTextForNumber(item->metadata.effective_originalyear()); case GroupBy_Bitrate: return SortTextForNumber(item->metadata.bitrate()); case GroupBy_None: return QString(); } qLog(Error) << "Unknown GroupBy type" << type << "for item" << item->display_text; return QString(); } QString LibraryModel::DividerDisplayText(GroupBy type, const QString& key) const { // Pretty display text for the dividers. switch (type) { case GroupBy_Album: case GroupBy_Artist: case GroupBy_Composer: case GroupBy_Performer: case GroupBy_Disc: case GroupBy_Grouping: case GroupBy_Genre: case GroupBy_AlbumArtist: case GroupBy_FileType: if (key == "0") return "0-9"; return key.toUpper(); case GroupBy_YearAlbum: case GroupBy_OriginalYearAlbum: if (key == "0000") return tr("Unknown"); return key.toUpper(); case GroupBy_Year: case GroupBy_OriginalYear: if (key == "0000") return tr("Unknown"); return QString::number(key.toInt()); // To remove leading 0s case GroupBy_Bitrate: if (key == "000") return tr("Unknown"); return QString::number(key.toInt()); // To remove leading 0s case GroupBy_None: // fallthrough ; } qLog(Error) << "Unknown GroupBy type" << type << "for divider key" << key; return QString(); } void LibraryModel::SongsDeleted(const SongList& songs) { // Delete the actual song nodes first, keeping track of each parent so we // might check to see if they're empty later. QSet parents; for (const Song& song : songs) { if (song_nodes_.contains(song.id())) { LibraryItem* node = song_nodes_[song.id()]; if (node->parent != root_) parents << node->parent; beginRemoveRows(ItemToIndex(node->parent), node->row, node->row); node->parent->Delete(node->row); song_nodes_.remove(song.id()); endRemoveRows(); } else { // If we get here it means some of the songs we want to delete haven't // been lazy-loaded yet. This is bad, because it would mean that to // clean up empty parents we would need to lazy-load them all // individually to see if they're empty. This can take a very long time, // so better to just reset the model and be done with it. Reset(); return; } } // Now delete empty parents QSet divider_keys; while (!parents.isEmpty()) { // Since we are going to remove elements from the container, we // need a copy to iterate over. If we iterate over the original, // the behavior will be undefined. QSet parents_copy = parents; for (LibraryItem* node : parents_copy) { parents.remove(node); if (node->children.count() != 0) continue; // Consider its parent for the next round if (node->parent != root_) parents << node->parent; // Maybe consider its divider node if (node->container_level == 0) divider_keys << DividerKey(group_by_[0], node); // Special case the Various Artists node if (IsCompilationArtistNode(node)) node->parent->compilation_artist_node_ = nullptr; else container_nodes_[node->container_level].remove(node->key); // It was empty - delete it beginRemoveRows(ItemToIndex(node->parent), node->row, node->row); node->parent->Delete(node->row); endRemoveRows(); } } // Delete empty dividers for (const QString& divider_key : divider_keys) { if (!divider_nodes_.contains(divider_key)) continue; // Look to see if there are any other items still under this divider bool found = false; for (LibraryItem* node : container_nodes_[0].values()) { if (DividerKey(group_by_[0], node) == divider_key) { found = true; break; } } if (found) continue; // Remove the divider int row = divider_nodes_[divider_key]->row; beginRemoveRows(ItemToIndex(root_), row, row); root_->Delete(row); endRemoveRows(); divider_nodes_.remove(divider_key); } } QString LibraryModel::AlbumIconPixmapCacheKey(const QModelIndex& index) const { QStringList path; QModelIndex index_copy(index); while (index_copy.isValid()) { path.prepend(index_copy.data().toString()); index_copy = index_copy.parent(); } return "libraryart:" + path.join("/"); } QVariant LibraryModel::AlbumIcon(const QModelIndex& index) { LibraryItem* item = IndexToItem(index); if (!item) return no_cover_icon_; // Check the cache for a pixmap we already loaded. const QString cache_key = AlbumIconPixmapCacheKey(index); QPixmap cached_pixmap; if (QPixmapCache::find(cache_key, &cached_pixmap)) { return cached_pixmap; } // Try to load it from the disk cache std::unique_ptr cache(icon_cache_->data(QUrl(cache_key))); if (cache) { QImage cached_pixmap; if (cached_pixmap.load(cache.get(), "XPM")) { QPixmapCache::insert(cache_key, QPixmap::fromImage(cached_pixmap)); return QPixmap::fromImage(cached_pixmap); } } // Maybe we're loading a pixmap already? if (pending_cache_keys_.contains(cache_key)) { return no_cover_icon_; } // No art is cached and we're not loading it already. Load art for the first // Song in the album. SongList songs = GetChildSongs(index); if (!songs.isEmpty()) { const quint64 id = app_->album_cover_loader()->LoadImageAsync( cover_loader_options_, songs.first()); pending_art_[id] = ItemAndCacheKey(item, cache_key); pending_cache_keys_.insert(cache_key); } return no_cover_icon_; } void LibraryModel::AlbumArtLoaded(quint64 id, const QImage& image) { ItemAndCacheKey item_and_cache_key = pending_art_.take(id); LibraryItem* item = item_and_cache_key.first; const QString& cache_key = item_and_cache_key.second; if (!item) return; pending_cache_keys_.remove(cache_key); // Insert this image in the cache. if (image.isNull()) { // Set the no_cover image so we don't continually try to load art. QPixmapCache::insert(cache_key, no_cover_icon_); } else { QPixmapCache::insert(cache_key, QPixmap::fromImage(image)); } // if not already in the disk cache std::unique_ptr cached_img(icon_cache_->data(QUrl(cache_key))); if (!cached_img) { QNetworkCacheMetaData item_metadata; item_metadata.setSaveToDisk(true); item_metadata.setUrl(QUrl(cache_key)); QIODevice* cache = icon_cache_->prepare(item_metadata); if (cache) { image.save(cache, "XPM"); icon_cache_->insert(cache); } } const QModelIndex index = ItemToIndex(item); emit dataChanged(index, index); } QVariant LibraryModel::data(const QModelIndex& index, int role) const { const LibraryItem* item = IndexToItem(index); // Handle a special case for returning album artwork instead of a generic CD // icon. // this is here instead of in the other data() function to let us use the // QModelIndex& version of GetChildSongs, which satisfies const-ness, instead // of the LibraryItem* version, which doesn't. if (use_pretty_covers_) { bool is_album_node = false; if (role == Qt::DecorationRole && item->type == LibraryItem::Type_Container) { GroupBy container_type = group_by_[item->container_level]; is_album_node = container_type == GroupBy_Album || container_type == GroupBy_YearAlbum || container_type == GroupBy_OriginalYearAlbum; } if (is_album_node) { // It has const behaviour some of the time - that's ok right? return const_cast(this)->AlbumIcon(index); } } return data(item, role); } QVariant LibraryModel::data(const LibraryItem* item, int role) const { GroupBy container_type = item->type == LibraryItem::Type_Container ? group_by_[item->container_level] : GroupBy_None; switch (role) { case Qt::DisplayRole: case Qt::ToolTipRole: return item->DisplayText(); case Qt::DecorationRole: switch (item->type) { case LibraryItem::Type_PlaylistContainer: return playlists_dir_icon_; case LibraryItem::Type_Container: switch (container_type) { case GroupBy_Album: case GroupBy_YearAlbum: case GroupBy_OriginalYearAlbum: return album_icon_; case GroupBy_Artist: case GroupBy_AlbumArtist: return artist_icon_; default: break; } break; case LibraryItem::Type_SmartPlaylist: return playlist_icon_; default: break; } break; case Role_Type: return item->type; case Role_IsDivider: return item->type == LibraryItem::Type_Divider; case Role_ContainerType: return container_type; case Role_Key: return item->key; case Role_Artist: return item->metadata.artist(); case Role_Editable: if (!item->lazy_loaded) { const_cast(this) ->LazyPopulate(const_cast(item), true); } if (item->type == LibraryItem::Type_Container) { // if we have even one non editable item as a child, we ourselves // are not available for edit if (!item->children.isEmpty()) { for (LibraryItem* child : item->children) { if (!data(child, role).toBool()) { return false; } } return true; } else { return false; } } else if (item->type == LibraryItem::Type_Song) { return item->metadata.IsEditable(); } else { return false; } case Role_SortText: return item->SortText(); } return QVariant(); } bool LibraryModel::HasCompilations(const LibraryQuery& query) { LibraryQuery q = query; q.AddCompilationRequirement(true); q.SetLimit(1); QMutexLocker l(backend_->db()->Mutex()); if (!backend_->ExecQuery(&q)) return false; return q.Next(); } LibraryModel::QueryResult LibraryModel::RunQuery(LibraryItem* parent) { QueryResult result; // Information about what we want the children to be int child_level = parent == root_ ? 0 : parent->container_level + 1; GroupBy child_type = child_level >= 3 ? GroupBy_None : group_by_[child_level]; // Initialise the query. child_type says what type of thing we want (artists, // songs, etc.) LibraryQuery q(query_options_); InitQuery(child_type, &q); // Walk up through the item's parents adding filters as necessary LibraryItem* p = parent; while (p && p->type == LibraryItem::Type_Container) { FilterQuery(group_by_[p->container_level], p, &q); p = p->parent; } // Artists GroupBy is special - we don't want compilation albums appearing if (IsArtistGroupBy(child_type)) { // Add the special Various artists node if (show_various_artists_ && HasCompilations(q)) { result.create_va = true; } // Don't show compilations again outside the Various artists node q.AddCompilationRequirement(false); } // Execute the query QMutexLocker l(backend_->db()->Mutex()); if (!backend_->ExecQuery(&q)) return result; while (q.Next()) { result.rows << SqlRow(q); } return result; } void LibraryModel::PostQuery(LibraryItem* parent, const LibraryModel::QueryResult& result, bool signal) { // Information about what we want the children to be int child_level = parent == root_ ? 0 : parent->container_level + 1; GroupBy child_type = child_level >= 3 ? GroupBy_None : group_by_[child_level]; if (result.create_va) { CreateCompilationArtistNode(signal, parent); } // Step through the results for (const SqlRow& row : result.rows) { // Create the item - it will get inserted into the model here LibraryItem* item = ItemFromQuery(child_type, signal, child_level == 0, parent, row, child_level); // Save a pointer to it for later if (child_type == GroupBy_None) song_nodes_[item->metadata.id()] = item; else container_nodes_[child_level][item->key] = item; } } void LibraryModel::LazyPopulate(LibraryItem* parent, bool signal) { if (parent->lazy_loaded) return; parent->lazy_loaded = true; QueryResult result = RunQuery(parent); PostQuery(parent, result, signal); } void LibraryModel::ResetAsync() { RootQueryFuture future = QtConcurrent::run(this, &LibraryModel::RunQuery, root_); RootQueryWatcher* watcher = new RootQueryWatcher(this); watcher->setFuture(future); connect(watcher, SIGNAL(finished()), SLOT(ResetAsyncQueryFinished())); } void LibraryModel::ResetAsyncQueryFinished() { RootQueryWatcher* watcher = static_cast(sender()); const struct QueryResult result = watcher->result(); watcher->deleteLater(); BeginReset(); root_->lazy_loaded = true; PostQuery(root_, result, false); if (init_task_id_ != -1) { app_->task_manager()->SetTaskFinished(init_task_id_); init_task_id_ = -1; } endResetModel(); } void LibraryModel::BeginReset() { beginResetModel(); delete root_; song_nodes_.clear(); container_nodes_[0].clear(); container_nodes_[1].clear(); container_nodes_[2].clear(); divider_nodes_.clear(); pending_art_.clear(); smart_playlist_node_ = nullptr; root_ = new LibraryItem(this); root_->compilation_artist_node_ = nullptr; root_->lazy_loaded = false; // Smart playlists? if (show_smart_playlists_ && query_options_.filter().isEmpty()) CreateSmartPlaylists(); } void LibraryModel::Reset() { BeginReset(); // Populate top level LazyPopulate(root_, false); endResetModel(); } void LibraryModel::InitQuery(GroupBy type, LibraryQuery* q) { // Say what type of thing we want to get back from the database. switch (type) { case GroupBy_Artist: q->SetColumnSpec("DISTINCT artist"); break; case GroupBy_Album: q->SetColumnSpec("DISTINCT album"); break; case GroupBy_Composer: q->SetColumnSpec("DISTINCT composer"); break; case GroupBy_Performer: q->SetColumnSpec("DISTINCT performer"); break; case GroupBy_Disc: q->SetColumnSpec("DISTINCT disc"); break; case GroupBy_Grouping: q->SetColumnSpec("DISTINCT grouping"); break; case GroupBy_YearAlbum: q->SetColumnSpec("DISTINCT year, album, grouping"); break; case GroupBy_OriginalYearAlbum: q->SetColumnSpec("DISTINCT year, originalyear, album, grouping"); break; case GroupBy_Year: q->SetColumnSpec("DISTINCT year"); break; case GroupBy_OriginalYear: q->SetColumnSpec("DISTINCT effective_originalyear"); break; case GroupBy_Genre: q->SetColumnSpec("DISTINCT genre"); break; case GroupBy_AlbumArtist: q->SetColumnSpec("DISTINCT effective_albumartist"); break; case GroupBy_Bitrate: q->SetColumnSpec("DISTINCT bitrate"); break; case GroupBy_None: q->SetColumnSpec("%songs_table.ROWID, " + Song::kColumnSpec); break; case GroupBy_FileType: q->SetColumnSpec("DISTINCT filetype"); break; } } void LibraryModel::FilterQuery(GroupBy type, LibraryItem* item, LibraryQuery* q) { // Say how we want the query to be filtered. This is done once for each // parent going up the tree. switch (type) { case GroupBy_Artist: if (IsCompilationArtistNode(item)) q->AddCompilationRequirement(true); else { // Don't duplicate compilations outside the Various artists node q->AddCompilationRequirement(false); q->AddWhere("artist", item->key); } break; case GroupBy_Album: q->AddWhere("album", item->key); break; case GroupBy_YearAlbum: q->AddWhere("year", item->metadata.year()); q->AddWhere("album", item->metadata.album()); q->AddWhere("grouping", item->metadata.grouping()); break; case GroupBy_OriginalYearAlbum: q->AddWhere("year", item->metadata.year()); q->AddWhere("originalyear", item->metadata.originalyear()); q->AddWhere("album", item->metadata.album()); q->AddWhere("grouping", item->metadata.grouping()); break; case GroupBy_Year: q->AddWhere("year", item->key); break; case GroupBy_OriginalYear: q->AddWhere("effective_originalyear", item->key); break; case GroupBy_Composer: q->AddWhere("composer", item->key); break; case GroupBy_Performer: q->AddWhere("performer", item->key); break; case GroupBy_Disc: q->AddWhere("disc", item->key); break; case GroupBy_Grouping: q->AddWhere("grouping", item->key); break; case GroupBy_Genre: q->AddWhere("genre", item->key); break; case GroupBy_AlbumArtist: if (IsCompilationArtistNode(item)) q->AddCompilationRequirement(true); else { // Don't duplicate compilations outside the Various artists node q->AddCompilationRequirement(false); q->AddWhere("effective_albumartist", item->key); } break; case GroupBy_FileType: q->AddWhere("filetype", item->metadata.filetype()); break; case GroupBy_Bitrate: q->AddWhere("bitrate", item->key); break; case GroupBy_None: qLog(Error) << "Unknown GroupBy type" << type << "used in filter"; break; } } LibraryItem* LibraryModel::InitItem(GroupBy type, bool signal, LibraryItem* parent, int container_level) { LibraryItem::Type item_type = type == GroupBy_None ? LibraryItem::Type_Song : LibraryItem::Type_Container; if (signal) beginInsertRows(ItemToIndex(parent), parent->children.count(), parent->children.count()); // Initialise the item depending on what type it's meant to be LibraryItem* item = new LibraryItem(item_type, parent); item->compilation_artist_node_ = nullptr; item->container_level = container_level; return item; } LibraryItem* LibraryModel::ItemFromQuery(GroupBy type, bool signal, bool create_divider, LibraryItem* parent, const SqlRow& row, int container_level) { LibraryItem* item = InitItem(type, signal, parent, container_level); int year = 0; int effective_originalyear = 0; int bitrate = 0; int disc = 0; switch (type) { case GroupBy_Artist: item->key = row.value(0).toString(); item->display_text = TextOrUnknown(item->key); item->sort_text = SortTextForArtist(item->key); break; case GroupBy_YearAlbum: year = qMax(0, row.value(0).toInt()); item->metadata.set_year(row.value(0).toInt()); item->metadata.set_album(row.value(1).toString()); item->metadata.set_grouping(row.value(2).toString()); item->key = PrettyYearAlbum(year, item->metadata.album()); item->sort_text = SortTextForNumber(year) + item->metadata.grouping() + item->metadata.album(); break; case GroupBy_OriginalYearAlbum: item->metadata.set_year(row.value(0).toInt()); item->metadata.set_originalyear(row.value(1).toInt()); item->metadata.set_album(row.value(2).toString()); item->metadata.set_grouping(row.value(3).toString()); effective_originalyear = qMax(0, item->metadata.effective_originalyear()); item->key = PrettyYearAlbum(effective_originalyear, item->metadata.album()); item->sort_text = SortTextForNumber(effective_originalyear) + item->metadata.grouping() + item->metadata.album(); break; case GroupBy_Year: year = qMax(0, row.value(0).toInt()); item->key = QString::number(year); item->sort_text = SortTextForNumber(year) + " "; break; case GroupBy_OriginalYear: year = qMax(0, row.value(0).toInt()); item->key = QString::number(year); item->sort_text = SortTextForNumber(year) + " "; break; case GroupBy_Composer: case GroupBy_Performer: case GroupBy_Grouping: case GroupBy_Genre: case GroupBy_Album: case GroupBy_AlbumArtist: item->key = row.value(0).toString(); item->display_text = TextOrUnknown(item->key); item->sort_text = SortTextForArtist(item->key); break; case GroupBy_Disc: disc = row.value(0).toInt(); item->key = QString::number(disc); item->sort_text = SortTextForNumber(disc); break; case GroupBy_FileType: item->metadata.set_filetype(Song::FileType(row.value(0).toInt())); item->key = item->metadata.TextForFiletype(); break; case GroupBy_Bitrate: bitrate = qMax(0, row.value(0).toInt()); item->key = QString::number(bitrate); item->sort_text = SortTextForNumber(bitrate) + " "; break; case GroupBy_None: item->metadata.InitFromQuery(row, true); item->key = item->metadata.title(); item->display_text = item->metadata.TitleWithCompilationArtist(); item->sort_text = SortTextForSong(item->metadata); break; } FinishItem(type, signal, create_divider, parent, item); return item; } LibraryItem* LibraryModel::ItemFromSong(GroupBy type, bool signal, bool create_divider, LibraryItem* parent, const Song& s, int container_level) { LibraryItem* item = InitItem(type, signal, parent, container_level); int year = 0; int originalyear = 0; int effective_originalyear = 0; int bitrate = 0; switch (type) { case GroupBy_Artist: item->key = s.artist(); item->display_text = TextOrUnknown(item->key); item->sort_text = SortTextForArtist(item->key); break; case GroupBy_YearAlbum: year = qMax(0, s.year()); item->metadata.set_year(year); item->metadata.set_album(s.album()); item->key = PrettyYearAlbum(year, s.album()); item->sort_text = SortTextForNumber(year) + s.grouping() + s.album(); break; case GroupBy_OriginalYearAlbum: year = qMax(0, s.year()); originalyear = qMax(0, s.originalyear()); effective_originalyear = qMax(0, s.effective_originalyear()); item->metadata.set_year(year); item->metadata.set_originalyear(originalyear); item->metadata.set_album(s.album()); item->key = PrettyYearAlbum(effective_originalyear, s.album()); item->sort_text = SortTextForNumber(effective_originalyear) + s.grouping() + s.album(); break; case GroupBy_Year: year = qMax(0, s.year()); item->key = QString::number(year); item->sort_text = SortTextForNumber(year) + " "; break; case GroupBy_OriginalYear: year = qMax(0, s.effective_originalyear()); item->key = QString::number(year); item->sort_text = SortTextForNumber(year) + " "; break; case GroupBy_Composer: item->key = s.composer(); case GroupBy_Performer: item->key = s.performer(); case GroupBy_Grouping: item->key = s.grouping(); case GroupBy_Genre: if (item->key.isNull()) item->key = s.genre(); case GroupBy_Album: if (item->key.isNull()) item->key = s.album(); case GroupBy_AlbumArtist: if (item->key.isNull()) item->key = s.effective_albumartist(); item->display_text = TextOrUnknown(item->key); item->sort_text = SortTextForArtist(item->key); break; case GroupBy_Disc: item->key = QString::number(s.disc()); item->sort_text = SortTextForNumber(s.disc()); break; case GroupBy_FileType: item->metadata.set_filetype(s.filetype()); item->key = s.TextForFiletype(); break; case GroupBy_Bitrate: bitrate = qMax(0, s.bitrate()); item->key = QString::number(bitrate); item->sort_text = SortTextForNumber(bitrate) + " "; break; case GroupBy_None: item->metadata = s; item->key = s.title(); item->display_text = s.TitleWithCompilationArtist(); item->sort_text = SortTextForSong(s); break; } FinishItem(type, signal, create_divider, parent, item); if (s.url().scheme() == "cdda") item->lazy_loaded = true; return item; } void LibraryModel::FinishItem(GroupBy type, bool signal, bool create_divider, LibraryItem* parent, LibraryItem* item) { if (type == GroupBy_None) item->lazy_loaded = true; if (signal) endInsertRows(); // Create the divider entry if we're supposed to if (create_divider && show_dividers_) { QString divider_key = DividerKey(type, item); item->sort_text.prepend(divider_key); if (!divider_key.isEmpty() && !divider_nodes_.contains(divider_key)) { if (signal) beginInsertRows(ItemToIndex(parent), parent->children.count(), parent->children.count()); LibraryItem* divider = new LibraryItem(LibraryItem::Type_Divider, root_); divider->key = divider_key; divider->display_text = DividerDisplayText(type, divider_key); divider->lazy_loaded = true; divider_nodes_[divider_key] = divider; if (signal) endInsertRows(); } } } QString LibraryModel::TextOrUnknown(const QString& text) { if (text.isEmpty()) { return tr("Unknown"); } return text; } QString LibraryModel::PrettyYearAlbum(int year, const QString& album) { if (year <= 0) return TextOrUnknown(album); return QString::number(year) + " - " + TextOrUnknown(album); } QString LibraryModel::SortText(QString text) { if (text.isEmpty()) { text = " unknown"; } else { text = text.toLower(); } text = text.remove(QRegExp("[^\\w ]")); return text; } QString LibraryModel::SortTextForArtist(QString artist) { artist = SortText(artist); if (artist.startsWith("the ")) { artist = artist.right(artist.length() - 4) + ", the"; } else if (artist.startsWith("a ")) { artist = artist.right(artist.length() - 2) + ", a"; } else if (artist.startsWith("an ")) { artist = artist.right(artist.length() - 3) + ", an"; } return artist; } QString LibraryModel::SortTextForNumber(int number) { return QString("%1").arg(number, 4, 10, QChar('0')); } QString LibraryModel::SortTextForSong(const Song& song) { QString ret = QString::number(qMax(0, song.disc()) * 1000 + qMax(0, song.track())); ret.prepend(QString("0").repeated(6 - ret.length())); ret.append(song.url().toString()); return ret; } Qt::ItemFlags LibraryModel::flags(const QModelIndex& index) const { switch (IndexToItem(index)->type) { case LibraryItem::Type_Song: case LibraryItem::Type_Container: case LibraryItem::Type_SmartPlaylist: return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled; case LibraryItem::Type_Divider: case LibraryItem::Type_Root: case LibraryItem::Type_LoadingIndicator: default: return Qt::ItemIsEnabled; } } QStringList LibraryModel::mimeTypes() const { return QStringList() << "text/uri-list"; } QMimeData* LibraryModel::mimeData(const QModelIndexList& indexes) const { if (indexes.isEmpty()) return nullptr; // Special case: a smart playlist was dragged if (IndexToItem(indexes.first())->type == LibraryItem::Type_SmartPlaylist) { GeneratorPtr generator = CreateGenerator(indexes.first()); if (!generator) return nullptr; GeneratorMimeData* data = new GeneratorMimeData(generator); data->setData(kSmartPlaylistsMimeType, QByteArray()); data->name_for_new_playlist_ = this->data(indexes.first()).toString(); return data; } SongMimeData* data = new SongMimeData; QList urls; QSet song_ids; data->backend = backend_; for (const QModelIndex& index : indexes) { GetChildSongs(IndexToItem(index), &urls, &data->songs, &song_ids); } data->setUrls(urls); data->name_for_new_playlist_ = PlaylistManager::GetNameForNewPlaylist(data->songs); return data; } bool LibraryModel::CompareItems(const LibraryItem* a, const LibraryItem* b) const { QVariant left(data(a, LibraryModel::Role_SortText)); QVariant right(data(b, LibraryModel::Role_SortText)); if (left.type() == QVariant::Int) return left.toInt() < right.toInt(); return left.toString() < right.toString(); } void LibraryModel::GetChildSongs(LibraryItem* item, QList* urls, SongList* songs, QSet* song_ids) const { switch (item->type) { case LibraryItem::Type_Container: { const_cast(this)->LazyPopulate(item); QList children = item->children; qSort(children.begin(), children.end(), std::bind(&LibraryModel::CompareItems, this, _1, _2)); for (LibraryItem* child : children) GetChildSongs(child, urls, songs, song_ids); break; } case LibraryItem::Type_Song: urls->append(item->metadata.url()); if (!song_ids->contains(item->metadata.id())) { songs->append(item->metadata); song_ids->insert(item->metadata.id()); } break; default: break; } } SongList LibraryModel::GetChildSongs(const QModelIndexList& indexes) const { QList dontcare; SongList ret; QSet song_ids; for (const QModelIndex& index : indexes) { GetChildSongs(IndexToItem(index), &dontcare, &ret, &song_ids); } return ret; } SongList LibraryModel::GetChildSongs(const QModelIndex& index) const { return GetChildSongs(QModelIndexList() << index); } void LibraryModel::SetFilterAge(int age) { query_options_.set_max_age(age); ResetAsync(); } void LibraryModel::SetFilterText(const QString& text) { query_options_.set_filter(text); ResetAsync(); } void LibraryModel::SetFilterQueryMode(QueryOptions::QueryMode query_mode) { query_options_.set_query_mode(query_mode); ResetAsync(); } bool LibraryModel::canFetchMore(const QModelIndex& parent) const { if (!parent.isValid()) return false; LibraryItem* item = IndexToItem(parent); return !item->lazy_loaded; } void LibraryModel::SetGroupBy(const Grouping& g) { group_by_ = g; ResetAsync(); emit GroupingChanged(g); } const LibraryModel::GroupBy& LibraryModel::Grouping::operator[](int i) const { switch (i) { case 0: return first; case 1: return second; case 2: return third; } qLog(Error) << "LibraryModel::Grouping[] index out of range" << i; return first; } LibraryModel::GroupBy& LibraryModel::Grouping::operator[](int i) { switch (i) { case 0: return first; case 1: return second; case 2: return third; } qLog(Error) << "LibraryModel::Grouping[] index out of range" << i; return first; } void LibraryModel::CreateSmartPlaylists() { smart_playlist_node_ = new LibraryItem(LibraryItem::Type_PlaylistContainer, root_); smart_playlist_node_->container_level = 0; smart_playlist_node_->sort_text = "\0"; smart_playlist_node_->key = tr("Smart playlists"); smart_playlist_node_->lazy_loaded = true; QSettings s; s.beginGroup(kSmartPlaylistsSettingsGroup); int version = s.value(backend_->songs_table() + "_version", 0).toInt(); // How many defaults do we have to write? int unwritten_defaults = 0; for (int i = version; i < default_smart_playlists_.count(); ++i) { unwritten_defaults += default_smart_playlists_[i].count(); } // Save the defaults if there are any unwritten ones if (unwritten_defaults) { // How many items are stored already? int playlist_index = s.beginReadArray(backend_->songs_table()); s.endArray(); // Append the new ones s.beginWriteArray(backend_->songs_table(), playlist_index + unwritten_defaults); for (; version < default_smart_playlists_.count(); ++version) { for (smart_playlists::GeneratorPtr gen : default_smart_playlists_[version]) { SaveGenerator(&s, playlist_index++, gen); } } s.endArray(); } s.setValue(backend_->songs_table() + "_version", version); const int count = s.beginReadArray(backend_->songs_table()); for (int i = 0; i < count; ++i) { s.setArrayIndex(i); ItemFromSmartPlaylist(s, false); } } void LibraryModel::ItemFromSmartPlaylist(const QSettings& s, bool notify) const { LibraryItem* item = new LibraryItem(LibraryItem::Type_SmartPlaylist, notify ? nullptr : smart_playlist_node_); item->display_text = tr(qPrintable(s.value("name").toString())); item->sort_text = item->display_text; item->key = s.value("type").toString(); item->smart_playlist_data = s.value("data").toByteArray(); item->lazy_loaded = true; if (notify) item->InsertNotify(smart_playlist_node_); } void LibraryModel::AddGenerator(GeneratorPtr gen) { QSettings s; s.beginGroup(kSmartPlaylistsSettingsGroup); // Count the existing items const int count = s.beginReadArray(backend_->songs_table()); s.endArray(); // Add this one to the end s.beginWriteArray(backend_->songs_table(), count + 1); SaveGenerator(&s, count, gen); // Add it to the model ItemFromSmartPlaylist(s, true); s.endArray(); } void LibraryModel::UpdateGenerator(const QModelIndex& index, GeneratorPtr gen) { if (index.parent() != ItemToIndex(smart_playlist_node_)) return; LibraryItem* item = IndexToItem(index); if (!item) return; // Update the config QSettings s; s.beginGroup(kSmartPlaylistsSettingsGroup); // Count the existing items const int count = s.beginReadArray(backend_->songs_table()); s.endArray(); s.beginWriteArray(backend_->songs_table(), count); SaveGenerator(&s, index.row(), gen); // Update the text of the item item->display_text = gen->name(); item->sort_text = item->display_text; item->key = gen->type(); item->smart_playlist_data = gen->Save(); item->ChangedNotify(); } void LibraryModel::DeleteGenerator(const QModelIndex& index) { if (index.parent() != ItemToIndex(smart_playlist_node_)) return; // Remove the item from the tree smart_playlist_node_->DeleteNotify(index.row()); QSettings s; s.beginGroup(kSmartPlaylistsSettingsGroup); // Rewrite all the items to the settings s.beginWriteArray(backend_->songs_table(), smart_playlist_node_->children.count()); int i = 0; for (LibraryItem* item : smart_playlist_node_->children) { s.setArrayIndex(i++); s.setValue("name", item->display_text); s.setValue("type", item->key); s.setValue("data", item->smart_playlist_data); } s.endArray(); } void LibraryModel::SaveGenerator(QSettings* s, int i, GeneratorPtr generator) const { s->setArrayIndex(i); s->setValue("name", generator->name()); s->setValue("type", generator->type()); s->setValue("data", generator->Save()); } GeneratorPtr LibraryModel::CreateGenerator(const QModelIndex& index) const { GeneratorPtr ret; const LibraryItem* item = IndexToItem(index); if (!item || item->type != LibraryItem::Type_SmartPlaylist) return ret; ret = Generator::Create(item->key); if (!ret) return ret; ret->set_name(item->display_text); ret->set_library(backend()); ret->Load(item->smart_playlist_data); return ret; } void LibraryModel::TotalSongCountUpdatedSlot(int count) { total_song_count_ = count; emit TotalSongCountUpdated(count); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/librarymodel.h000066400000000000000000000234161260417502300244660ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef LIBRARYMODEL_H #define LIBRARYMODEL_H #include #include #include #include "libraryitem.h" #include "libraryquery.h" #include "librarywatcher.h" #include "sqlrow.h" #include "core/simpletreemodel.h" #include "core/song.h" #include "covers/albumcoverloaderoptions.h" #include "engines/engine_fwd.h" #include "playlist/playlistmanager.h" #include "smartplaylists/generator_fwd.h" class Application; class AlbumCoverLoader; class LibraryDirectoryModel; class LibraryBackend; namespace smart_playlists { class Search; } class QSettings; class LibraryModel : public SimpleTreeModel { Q_OBJECT Q_ENUMS(GroupBy); public: LibraryModel(LibraryBackend* backend, Application* app, QObject* parent = nullptr); ~LibraryModel(); static const char* kSmartPlaylistsMimeType; static const char* kSmartPlaylistsSettingsGroup; static const char* kSmartPlaylistsArray; static const int kSmartPlaylistsVersion; static const int kPrettyCoverSize; static const qint64 kIconCacheSize; enum Role { Role_Type = Qt::UserRole + 1, Role_ContainerType, Role_SortText, Role_Key, Role_Artist, Role_IsDivider, Role_Editable, LastRole }; // These values get saved in QSettings - don't change them enum GroupBy { GroupBy_None = 0, GroupBy_Artist = 1, GroupBy_Album = 2, GroupBy_YearAlbum = 3, GroupBy_Year = 4, GroupBy_Composer = 5, GroupBy_Genre = 6, GroupBy_AlbumArtist = 7, GroupBy_FileType = 8, GroupBy_Performer = 9, GroupBy_Grouping = 10, GroupBy_Bitrate = 11, GroupBy_Disc = 12, GroupBy_OriginalYearAlbum = 13, GroupBy_OriginalYear = 14, }; struct Grouping { Grouping(GroupBy f = GroupBy_None, GroupBy s = GroupBy_None, GroupBy t = GroupBy_None) : first(f), second(s), third(t) {} GroupBy first; GroupBy second; GroupBy third; const GroupBy& operator[](int i) const; GroupBy& operator[](int i); bool operator==(const Grouping& other) const { return first == other.first && second == other.second && third == other.third; } bool operator!=(const Grouping& other) const { return !(*this == other); } }; struct QueryResult { QueryResult() : create_va(false) {} SqlRowList rows; bool create_va; }; LibraryBackend* backend() const { return backend_; } LibraryDirectoryModel* directory_model() const { return dir_model_; } typedef QList GeneratorList; typedef QList DefaultGenerators; // Call before Init() void set_show_smart_playlists(bool show_smart_playlists) { show_smart_playlists_ = show_smart_playlists; } void set_default_smart_playlists(const DefaultGenerators& defaults) { default_smart_playlists_ = defaults; } void set_show_various_artists(bool show_various_artists) { show_various_artists_ = show_various_artists; } // Get information about the library void GetChildSongs(LibraryItem* item, QList* urls, SongList* songs, QSet* song_ids) const; SongList GetChildSongs(const QModelIndex& index) const; SongList GetChildSongs(const QModelIndexList& indexes) const; // Might be accurate int total_song_count() const { return total_song_count_; } // Smart playlists smart_playlists::GeneratorPtr CreateGenerator(const QModelIndex& index) const; void AddGenerator(smart_playlists::GeneratorPtr gen); void UpdateGenerator(const QModelIndex& index, smart_playlists::GeneratorPtr gen); void DeleteGenerator(const QModelIndex& index); // QAbstractItemModel QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; Qt::ItemFlags flags(const QModelIndex& index) const; QStringList mimeTypes() const; QMimeData* mimeData(const QModelIndexList& indexes) const; bool canFetchMore(const QModelIndex& parent) const; // Whether or not to use album cover art, if it exists, in the library view void set_pretty_covers(bool use_pretty_covers); bool use_pretty_covers() const { return use_pretty_covers_; } // Whether or not to show letters heading in the library view void set_show_dividers(bool show_dividers); // Utility functions for manipulating text static QString TextOrUnknown(const QString& text); static QString PrettyYearAlbum(int year, const QString& album); static QString SortText(QString text); static QString SortTextForArtist(QString artist); static QString SortTextForNumber(int year); static QString SortTextForSong(const Song& song); signals: void TotalSongCountUpdated(int count); void GroupingChanged(const LibraryModel::Grouping& g); public slots: void SetFilterAge(int age); void SetFilterText(const QString& text); void SetFilterQueryMode(QueryOptions::QueryMode query_mode); void SetGroupBy(const LibraryModel::Grouping& g); void Init(bool async = true); void Reset(); void ResetAsync(); protected: void LazyPopulate(LibraryItem* item) { LazyPopulate(item, true); } void LazyPopulate(LibraryItem* item, bool signal); private slots: // From LibraryBackend void SongsDiscovered(const SongList& songs); void SongsDeleted(const SongList& songs); void SongsSlightlyChanged(const SongList& songs); void TotalSongCountUpdatedSlot(int count); // Called after ResetAsync void ResetAsyncQueryFinished(); void AlbumArtLoaded(quint64 id, const QImage& image); private: // Provides some optimisations for loading the list of items in the root. // This gets called a lot when filtering the playlist, so it's nice to be // able to do it in a background thread. QueryResult RunQuery(LibraryItem* parent); void PostQuery(LibraryItem* parent, const QueryResult& result, bool signal); bool HasCompilations(const LibraryQuery& query); void BeginReset(); // Functions for working with queries and creating items. // When the model is reset or when a node is lazy-loaded the Library // constructs a database query to populate the items. Filters are added // for each parent item, restricting the songs returned to a particular // album or artist for example. static void InitQuery(GroupBy type, LibraryQuery* q); void FilterQuery(GroupBy type, LibraryItem* item, LibraryQuery* q); // Items can be created either from a query that's been run to populate a // node, or by a spontaneous SongsDiscovered emission from the backend. LibraryItem* ItemFromQuery(GroupBy type, bool signal, bool create_divider, LibraryItem* parent, const SqlRow& row, int container_level); LibraryItem* ItemFromSong(GroupBy type, bool signal, bool create_divider, LibraryItem* parent, const Song& s, int container_level); // The "Various Artists" node is an annoying special case. LibraryItem* CreateCompilationArtistNode(bool signal, LibraryItem* parent); // Smart playlists are shown in another top-level node void CreateSmartPlaylists(); void SaveGenerator(QSettings* s, int i, smart_playlists::GeneratorPtr generator) const; void ItemFromSmartPlaylist(const QSettings& s, bool notify) const; // Helpers for ItemFromQuery and ItemFromSong LibraryItem* InitItem(GroupBy type, bool signal, LibraryItem* parent, int container_level); void FinishItem(GroupBy type, bool signal, bool create_divider, LibraryItem* parent, LibraryItem* item); QString DividerKey(GroupBy type, LibraryItem* item) const; QString DividerDisplayText(GroupBy type, const QString& key) const; // Helpers QString AlbumIconPixmapCacheKey(const QModelIndex& index) const; QVariant AlbumIcon(const QModelIndex& index); QVariant data(const LibraryItem* item, int role) const; bool CompareItems(const LibraryItem* a, const LibraryItem* b) const; private: LibraryBackend* backend_; Application* app_; LibraryDirectoryModel* dir_model_; bool show_smart_playlists_; DefaultGenerators default_smart_playlists_; bool show_various_artists_; int total_song_count_; QueryOptions query_options_; Grouping group_by_; // Keyed on database ID QMap song_nodes_; // Keyed on whatever the key is for that level - artist, album, year, etc. QMap container_nodes_[3]; // Keyed on a letter, a year, a century, etc. QMap divider_nodes_; // Only applies if smart playlists are set to on LibraryItem* smart_playlist_node_; QIcon artist_icon_; QIcon album_icon_; // used as a generic icon to show when no cover art is found, // fixed to the same size as the artwork (32x32) QPixmap no_cover_icon_; QIcon playlists_dir_icon_; QIcon playlist_icon_; QNetworkDiskCache* icon_cache_; int init_task_id_; bool use_pretty_covers_; bool show_dividers_; AlbumCoverLoaderOptions cover_loader_options_; typedef QPair ItemAndCacheKey; QMap pending_art_; QSet pending_cache_keys_; }; Q_DECLARE_METATYPE(LibraryModel::Grouping); #endif // LIBRARYMODEL_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/libraryplaylistitem.cpp000066400000000000000000000033401260417502300264330ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "libraryplaylistitem.h" #include "core/tagreaderclient.h" #include LibraryPlaylistItem::LibraryPlaylistItem(const QString& type) : PlaylistItem(type) {} LibraryPlaylistItem::LibraryPlaylistItem(const Song& song) : PlaylistItem("Library"), song_(song) {} QUrl LibraryPlaylistItem::Url() const { return song_.url(); } void LibraryPlaylistItem::Reload() { TagReaderClient::Instance()->ReadFileBlocking(song_.url().toLocalFile(), &song_); } bool LibraryPlaylistItem::InitFromQuery(const SqlRow& query) { // Rows from the songs tables come first song_.InitFromQuery(query, true); return song_.is_valid(); } QVariant LibraryPlaylistItem::DatabaseValue(DatabaseColumn column) const { switch (column) { case Column_LibraryId: return song_.id(); default: return PlaylistItem::DatabaseValue(column); } } Song LibraryPlaylistItem::Metadata() const { if (HasTemporaryMetadata()) return temp_metadata_; return song_; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/libraryplaylistitem.h000066400000000000000000000024771260417502300261120ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef LIBRARYPLAYLISTITEM_H #define LIBRARYPLAYLISTITEM_H #include "core/song.h" #include "playlist/playlistitem.h" class LibraryPlaylistItem : public PlaylistItem { public: LibraryPlaylistItem(const QString& type); LibraryPlaylistItem(const Song& song); bool InitFromQuery(const SqlRow& query); void Reload(); Song Metadata() const; void SetMetadata(const Song& song) { song_ = song; } QUrl Url() const; bool IsLocalLibraryItem() const { return true; } protected: QVariant DatabaseValue(DatabaseColumn column) const; protected: Song song_; }; #endif // LIBRARYPLAYLISTITEM_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/libraryquery.cpp000066400000000000000000000153251260417502300250660ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "libraryquery.h" #include "core/song.h" #include #include #include QueryOptions::QueryOptions() : max_age_(-1), query_mode_(QueryMode_All) {} LibraryQuery::LibraryQuery(const QueryOptions& options) : include_unavailable_(false), join_with_fts_(false), limit_(-1) { if (!options.filter().isEmpty()) { // We need to munge the filter text a little bit to get it to work as // expected with sqlite's FTS3: // 1) Append * to all tokens. // 2) Prefix "fts" to column names. // 3) Remove colons which don't correspond to column names. // Split on whitespace QStringList tokens( options.filter().split(QRegExp("\\s+"), QString::SkipEmptyParts)); QString query; for (QString token : tokens) { token.remove('('); token.remove(')'); token.remove('"'); token.replace('-', ' '); if (token.contains(':')) { // Only prefix fts if the token is a valid column name. if (Song::kFtsColumns.contains("fts" + token.section(':', 0, 0), Qt::CaseInsensitive)) { // Account for multiple colons. QString columntoken = token.section(':', 0, 0, QString::SectionIncludeTrailingSep); QString subtoken = token.section(':', 1, -1); subtoken.replace(":", " "); subtoken = subtoken.trimmed(); query += "fts" + columntoken + subtoken + "* "; } else { token.replace(":", " "); token = token.trimmed(); query += token + "* "; } } else { query += token + "* "; } } where_clauses_ << "fts.%fts_table_noprefix MATCH ?"; bound_values_ << query; join_with_fts_ = true; } if (options.max_age() != -1) { int cutoff = QDateTime::currentDateTime().toTime_t() - options.max_age(); where_clauses_ << "ctime > ?"; bound_values_ << cutoff; } // TODO: currently you cannot use any QueryMode other than All and fts at the // same time. // joining songs, duplicated_songs and songs_fts all together takes a huge // amount of // time. the query takes about 20 seconds on my machine then. why? // untagged mode could work with additional filtering but I'm disabling it // just to be // consistent - this way filtering is available only in the All mode. // remember though that when you fix the Duplicates + FTS cooperation, enable // the // filtering in both Duplicates and Untagged modes. duplicates_only_ = options.query_mode() == QueryOptions::QueryMode_Duplicates; if (options.query_mode() == QueryOptions::QueryMode_Untagged) { where_clauses_ << "(artist = '' OR album = '' OR title ='')"; } } QString LibraryQuery::GetInnerQuery() { return duplicates_only_ ? QString( " INNER JOIN (select * from duplicated_songs) dsongs " "ON (%songs_table.artist = dsongs.dup_artist " "AND %songs_table.album = dsongs.dup_album " "AND %songs_table.title = dsongs.dup_title) ") : QString(); } void LibraryQuery::AddWhere(const QString& column, const QVariant& value, const QString& op) { // ignore 'literal' for IN if (!op.compare("IN", Qt::CaseInsensitive)) { QStringList final; for (const QString& single_value : value.toStringList()) { final.append("?"); bound_values_ << single_value; } where_clauses_ << QString("%1 IN (" + final.join(",") + ")").arg(column); } else { // Do integers inline - sqlite seems to get confused when you pass integers // to bound parameters if (value.type() == QVariant::Int) { where_clauses_ << QString("%1 %2 %3").arg(column, op, value.toString()); } else { where_clauses_ << QString("%1 %2 ?").arg(column, op); bound_values_ << value; } } } void LibraryQuery::AddCompilationRequirement(bool compilation) { // The unary + is added to prevent sqlite from using the index // idx_comp_artist. When joining with fts, sqlite 3.8 has a tendency // to use this index and thereby nesting the tables in an order // which gives very poor performance. See // https://github.com/clementine-player/Clementine/pull/4285 for // more details. where_clauses_ << QString("+effective_compilation = %1") .arg(compilation ? 1 : 0); } QSqlQuery LibraryQuery::Exec(QSqlDatabase db, const QString& songs_table, const QString& fts_table) { QString sql; if (join_with_fts_) { sql = QString( "SELECT %1 FROM %2 INNER JOIN %3 AS fts ON %2.ROWID = fts.ROWID") .arg(column_spec_, songs_table, fts_table); } else { sql = QString("SELECT %1 FROM %2 %3") .arg(column_spec_, songs_table, GetInnerQuery()); } QStringList where_clauses(where_clauses_); if (!include_unavailable_) { where_clauses << "unavailable = 0"; } if (!where_clauses.isEmpty()) sql += " WHERE " + where_clauses.join(" AND "); if (!order_by_.isEmpty()) sql += " ORDER BY " + order_by_; if (limit_ != -1) sql += " LIMIT " + QString::number(limit_); sql.replace("%songs_table", songs_table); sql.replace("%fts_table_noprefix", fts_table.section('.', -1, -1)); sql.replace("%fts_table", fts_table); query_ = QSqlQuery(sql, db); // Bind values for (const QVariant& value : bound_values_) { query_.addBindValue(value); } query_.exec(); return query_; } bool LibraryQuery::Next() { return query_.next(); } QVariant LibraryQuery::Value(int column) const { return query_.value(column); } bool QueryOptions::Matches(const Song& song) const { if (max_age_ != -1) { const uint cutoff = QDateTime::currentDateTime().toTime_t() - max_age_; if (song.ctime() <= cutoff) return false; } if (!filter_.isNull()) { return song.artist().contains(filter_, Qt::CaseInsensitive) || song.album().contains(filter_, Qt::CaseInsensitive) || song.title().contains(filter_, Qt::CaseInsensitive); } return true; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/libraryquery.h000066400000000000000000000066711260417502300245370ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef LIBRARYQUERY_H #define LIBRARYQUERY_H #include #include #include #include #include class Song; class LibraryBackend; // This structure let's you customize behaviour of any LibraryQuery. struct QueryOptions { // Modes of LibraryQuery: // - use the all songs table // - use the duplicated songs view; by duplicated we mean those songs // for which the (artist, album, title) tuple is found more than once // in the songs table // - use the untagged songs view; by untagged we mean those for which // at least one of the (artist, album, title) tags is empty // Please note that additional filtering based on fts table (the filter // attribute) won't work in Duplicates and Untagged modes. enum QueryMode { QueryMode_All, QueryMode_Duplicates, QueryMode_Untagged }; QueryOptions(); bool Matches(const Song& song) const; QString filter() const { return filter_; } void set_filter(const QString& filter) { this->filter_ = filter; this->query_mode_ = QueryMode_All; } int max_age() const { return max_age_; } void set_max_age(int max_age) { this->max_age_ = max_age; } QueryMode query_mode() const { return query_mode_; } void set_query_mode(QueryMode query_mode) { this->query_mode_ = query_mode; this->filter_ = QString(); } private: QString filter_; int max_age_; QueryMode query_mode_; }; class LibraryQuery { public: LibraryQuery(const QueryOptions& options = QueryOptions()); // Sets contents of SELECT clause on the query (list of columns to get). void SetColumnSpec(const QString& spec) { column_spec_ = spec; } // Sets an ORDER BY clause on the query. void SetOrderBy(const QString& order_by) { order_by_ = order_by; } // Adds a fragment of WHERE clause. When executed, this Query will connect all // the fragments with AND operator. // Please note that IN operator expects a QStringList as value. void AddWhere(const QString& column, const QVariant& value, const QString& op = "="); void AddCompilationRequirement(bool compilation); void SetLimit(int limit) { limit_ = limit; } void SetIncludeUnavailable(bool include_unavailable) { include_unavailable_ = include_unavailable; } QSqlQuery Exec(QSqlDatabase db, const QString& songs_table, const QString& fts_table); bool Next(); QVariant Value(int column) const; operator const QSqlQuery&() const { return query_; } private: QString GetInnerQuery(); bool include_unavailable_; bool join_with_fts_; QString column_spec_; QString order_by_; QStringList where_clauses_; QVariantList bound_values_; int limit_; bool duplicates_only_; QSqlQuery query_; }; #endif // LIBRARYQUERY_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/librarysettingspage.cpp000066400000000000000000000127771260417502300264260ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "librarysettingspage.h" #include "librarybackend.h" #include "librarydirectorymodel.h" #include "librarymodel.h" #include "libraryview.h" #include "librarywatcher.h" #include "ui_librarysettingspage.h" #include "core/application.h" #include "core/utilities.h" #include "playlist/playlistdelegates.h" #include "ui/iconloader.h" #include "ui/settingsdialog.h" #include #include #include #include #include const char* LibrarySettingsPage::kSettingsGroup = "LibraryConfig"; LibrarySettingsPage::LibrarySettingsPage(SettingsDialog* dialog) : SettingsPage(dialog), ui_(new Ui_LibrarySettingsPage), initialised_model_(false) { ui_->setupUi(this); ui_->list->setItemDelegate(new NativeSeparatorsDelegate(this)); // Icons setWindowIcon(IconLoader::Load("folder-sound")); ui_->add->setIcon(IconLoader::Load("document-open-folder")); connect(ui_->add, SIGNAL(clicked()), SLOT(Add())); connect(ui_->remove, SIGNAL(clicked()), SLOT(Remove())); connect(ui_->sync_stats_button, SIGNAL(clicked()), SLOT(WriteAllSongsStatisticsToFiles())); } LibrarySettingsPage::~LibrarySettingsPage() { delete ui_; } void LibrarySettingsPage::Add() { QSettings settings; settings.beginGroup(kSettingsGroup); QString path( settings.value("last_path", Utilities::GetConfigPath( Utilities::Path_DefaultMusicLibrary)) .toString()); path = QFileDialog::getExistingDirectory(this, tr("Add directory..."), path); if (!path.isNull()) { dialog()->library_directory_model()->AddDirectory(path); } settings.setValue("last_path", path); } void LibrarySettingsPage::Remove() { dialog()->library_directory_model()->RemoveDirectory( ui_->list->currentIndex()); } void LibrarySettingsPage::CurrentRowChanged(const QModelIndex& index) { ui_->remove->setEnabled(index.isValid()); } void LibrarySettingsPage::Save() { QSettings s; s.beginGroup(LibraryView::kSettingsGroup); s.setValue("auto_open", ui_->auto_open->isChecked()); s.setValue("pretty_covers", ui_->pretty_covers->isChecked()); s.setValue("show_dividers", ui_->show_dividers->isChecked()); s.endGroup(); s.beginGroup(LibraryWatcher::kSettingsGroup); s.setValue("startup_scan", ui_->startup_scan->isChecked()); s.setValue("monitor", ui_->monitor->isChecked()); QString filter_text = ui_->cover_art_patterns->text(); QStringList filters = filter_text.split(',', QString::SkipEmptyParts); s.setValue("cover_art_patterns", filters); s.endGroup(); s.beginGroup(LibraryBackend::kSettingsGroup); s.setValue("save_ratings_in_file", ui_->save_ratings_in_file->isChecked()); s.setValue("save_statistics_in_file", ui_->save_statistics_in_file->isChecked()); s.endGroup(); } void LibrarySettingsPage::Load() { if (!initialised_model_) { if (ui_->list->selectionModel()) { disconnect(ui_->list->selectionModel(), SIGNAL(currentRowChanged(QModelIndex, QModelIndex)), this, SLOT(CurrentRowChanged(QModelIndex))); } ui_->list->setModel(dialog()->library_directory_model()); initialised_model_ = true; connect(ui_->list->selectionModel(), SIGNAL(currentRowChanged(QModelIndex, QModelIndex)), SLOT(CurrentRowChanged(QModelIndex))); } QSettings s; s.beginGroup(LibraryView::kSettingsGroup); ui_->auto_open->setChecked(s.value("auto_open", true).toBool()); ui_->pretty_covers->setChecked(s.value("pretty_covers", true).toBool()); ui_->show_dividers->setChecked(s.value("show_dividers", true).toBool()); s.endGroup(); s.beginGroup(LibraryWatcher::kSettingsGroup); ui_->startup_scan->setChecked(s.value("startup_scan", true).toBool()); ui_->monitor->setChecked(s.value("monitor", true).toBool()); QStringList filters = s.value("cover_art_patterns", QStringList() << "front" << "cover").toStringList(); ui_->cover_art_patterns->setText(filters.join(",")); s.endGroup(); s.beginGroup(LibraryBackend::kSettingsGroup); ui_->save_ratings_in_file->setChecked( s.value("save_ratings_in_file", false).toBool()); ui_->save_statistics_in_file->setChecked( s.value("save_statistics_in_file", false).toBool()); s.endGroup(); } void LibrarySettingsPage::WriteAllSongsStatisticsToFiles() { QMessageBox confirmation_dialog( QMessageBox::Question, tr("Write all songs statistics into songs' files"), tr("Are you sure you want to write song's statistics into song's file " "for all the songs of your library?"), QMessageBox::Yes | QMessageBox::Cancel); if (confirmation_dialog.exec() != QMessageBox::Yes) { return; } QtConcurrent::run(dialog()->app()->library(), &Library::WriteAllSongsStatisticsToFiles); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/librarysettingspage.h000066400000000000000000000025241260417502300260600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef LIBRARYSETTINGSPAGE_H #define LIBRARYSETTINGSPAGE_H #include "ui/settingspage.h" class Ui_LibrarySettingsPage; class LibraryDirectoryModel; class QModelIndex; class LibrarySettingsPage : public SettingsPage { Q_OBJECT public: LibrarySettingsPage(SettingsDialog* dialog); ~LibrarySettingsPage(); static const char* kSettingsGroup; void Load(); void Save(); private slots: void Add(); void Remove(); void WriteAllSongsStatisticsToFiles(); void CurrentRowChanged(const QModelIndex& index); private: Ui_LibrarySettingsPage* ui_; bool initialised_model_; }; #endif // LIBRARYSETTINGSPAGE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/librarysettingspage.ui000066400000000000000000000143071260417502300262500ustar00rootroot00000000000000 LibrarySettingsPage 0 0 509 452 Music Library These folders will be scanned for music to make up your library 16 16 true Add new folder... false Remove folder Qt::Vertical 20 40 Automatic updating Update the library when Clementine starts Monitor the library for changes Save ratings in file tags when possible <html><head/><body><p>If not checked, Clementine will try to save your ratings and other statistics only in a separate database and don't modify your files.</p><p>If checked, it will save statistics both in database and directly into the file each time they changed.</p><p>Please note it might not work for every format and, as there is no standard for doing so, other music players might not be able to read them.</p></body></html> Save statistics in file tags when possible <html><head/><body><p>This will write songs' ratings and statistics into files tags for all your library's songs.</p><p>This is not needed if the &quot;Save ratings and statistics in file tags&quot; option has always been activated.</p></body></html> Synchronize statistics to files now Qt::Horizontal 40 20 Preferred album art filenames (comma separated) When looking for album art Clementine will first look for picture files that contain one of these words. If there are no matches then it will use the largest image in the directory. Display options Automatically open single categories in the library tree Show cover art in library Show dividers list add remove clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/libraryview.cpp000066400000000000000000000610651260417502300246750ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "libraryview.h" #include #include #include #include #include #include #include #include #include #include #include "librarydirectorymodel.h" #include "libraryfilterwidget.h" #include "librarymodel.h" #include "libraryitem.h" #include "librarybackend.h" #include "core/application.h" #include "core/deletefiles.h" #include "core/logging.h" #include "core/mimedata.h" #include "core/musicstorage.h" #include "core/utilities.h" #include "devices/devicemanager.h" #include "devices/devicestatefiltermodel.h" #include "smartplaylists/wizard.h" #include "ui/iconloader.h" #include "ui/organisedialog.h" #include "ui/organiseerrordialog.h" using smart_playlists::Wizard; const char* LibraryView::kSettingsGroup = "LibraryView"; LibraryItemDelegate::LibraryItemDelegate(QObject* parent) : QStyledItemDelegate(parent) {} void LibraryItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& opt, const QModelIndex& index) const { const bool is_divider = index.data(LibraryModel::Role_IsDivider).toBool(); if (is_divider) { QString text(index.data().toString()); painter->save(); QRect text_rect(opt.rect); // Does this item have an icon? QPixmap pixmap; QVariant decoration = index.data(Qt::DecorationRole); if (!decoration.isNull()) { if (decoration.canConvert()) { pixmap = decoration.value(); } else if (decoration.canConvert()) { pixmap = decoration.value().pixmap(opt.decorationSize); } } // Draw the icon at the left of the text rectangle if (!pixmap.isNull()) { QRect icon_rect(text_rect.topLeft(), opt.decorationSize); const int padding = (text_rect.height() - icon_rect.height()) / 2; icon_rect.adjust(padding, padding, padding, padding); text_rect.moveLeft(icon_rect.right() + padding + 6); if (pixmap.size() != opt.decorationSize) { pixmap = pixmap.scaled(opt.decorationSize, Qt::KeepAspectRatio); } painter->drawPixmap(icon_rect, pixmap); } else { text_rect.setLeft(text_rect.left() + 30); } // Draw the text QFont bold_font(opt.font); bold_font.setBold(true); painter->setPen(opt.palette.color(QPalette::Text)); painter->setFont(bold_font); painter->drawText(text_rect, text); // Draw the line under the item QColor line_color = opt.palette.color(QPalette::Text); line_color.setAlpha(100); QPen line_pen(line_color); line_pen.setWidth(2); painter->setPen(line_pen); painter->drawLine(opt.rect.bottomLeft(), opt.rect.bottomRight()); painter->restore(); } else { QStyledItemDelegate::paint(painter, opt, index); } } bool LibraryItemDelegate::helpEvent(QHelpEvent* event, QAbstractItemView* view, const QStyleOptionViewItem& option, const QModelIndex& index) { Q_UNUSED(option); if (!event || !view) return false; QHelpEvent* he = static_cast(event); QString text = displayText(index.data(), QLocale::system()); if (text.isEmpty() || !he) return false; switch (event->type()) { case QEvent::ToolTip: { QRect displayed_text; QSize real_text; bool is_elided = false; real_text = sizeHint(option, index); displayed_text = view->visualRect(index); is_elided = displayed_text.width() < real_text.width(); if (is_elided) { QToolTip::showText(he->globalPos(), text, view); } else if (index.data(Qt::ToolTipRole).isValid()) { // If the item has a tooltip text, display it QString tooltip_text = index.data(Qt::ToolTipRole).toString(); QToolTip::showText(he->globalPos(), tooltip_text, view); } else { // in case that another text was previously displayed QToolTip::hideText(); } return true; } case QEvent::QueryWhatsThis: return true; case QEvent::WhatsThis: QWhatsThis::showText(he->globalPos(), text, view); return true; default: break; } return false; } LibraryView::LibraryView(QWidget* parent) : AutoExpandingTreeView(parent), app_(nullptr), filter_(nullptr), total_song_count_(-1), nomusic_(":nomusic.png"), context_menu_(nullptr), is_in_keyboard_search_(false) { setItemDelegate(new LibraryItemDelegate(this)); setAttribute(Qt::WA_MacShowFocusRect, false); setHeaderHidden(true); setAllColumnsShowFocus(true); setDragEnabled(true); setDragDropMode(QAbstractItemView::DragOnly); setSelectionMode(QAbstractItemView::ExtendedSelection); setStyleSheet("QTreeView::item{padding-top:1px;}"); } LibraryView::~LibraryView() {} void LibraryView::SaveFocus() { QModelIndex current = currentIndex(); QVariant type = model()->data(current, LibraryModel::Role_Type); if (!type.isValid() || !(type.toInt() == LibraryItem::Type_Song || type.toInt() == LibraryItem::Type_Container || type.toInt() == LibraryItem::Type_Divider)) { return; } last_selected_path_.clear(); last_selected_song_ = Song(); last_selected_container_ = QString(); switch (type.toInt()) { case LibraryItem::Type_Song: { QModelIndex index = qobject_cast(model())->mapToSource(current); SongList songs = app_->library_model()->GetChildSongs(index); if (!songs.isEmpty()) { last_selected_song_ = songs.last(); } break; } case LibraryItem::Type_Container: case LibraryItem::Type_Divider: { QString text = model()->data(current, LibraryModel::Role_SortText).toString(); last_selected_container_ = text; break; } default: return; } SaveContainerPath(current); } void LibraryView::SaveContainerPath(const QModelIndex& child) { QModelIndex current = model()->parent(child); QVariant type = model()->data(current, LibraryModel::Role_Type); if (!type.isValid() || !(type.toInt() == LibraryItem::Type_Container || type.toInt() == LibraryItem::Type_Divider)) { return; } QString text = model()->data(current, LibraryModel::Role_SortText).toString(); last_selected_path_ << text; SaveContainerPath(current); } void LibraryView::RestoreFocus() { if (last_selected_container_.isEmpty() && last_selected_song_.url().isEmpty()) { return; } RestoreLevelFocus(); } bool LibraryView::RestoreLevelFocus(const QModelIndex& parent) { if (model()->canFetchMore(parent)) { model()->fetchMore(parent); } int rows = model()->rowCount(parent); for (int i = 0; i < rows; i++) { QModelIndex current = model()->index(i, 0, parent); QVariant type = model()->data(current, LibraryModel::Role_Type); switch (type.toInt()) { case LibraryItem::Type_Song: if (!last_selected_song_.url().isEmpty()) { QModelIndex index = qobject_cast(model()) ->mapToSource(current); SongList songs = app_->library_model()->GetChildSongs(index); for (const Song& song : songs) { if (song == last_selected_song_) { setCurrentIndex(current); return true; } } } break; case LibraryItem::Type_Container: case LibraryItem::Type_Divider: { QString text = model()->data(current, LibraryModel::Role_SortText).toString(); if (!last_selected_container_.isEmpty() && last_selected_container_ == text) { emit expand(current); setCurrentIndex(current); return true; } else if (last_selected_path_.contains(text)) { emit expand(current); // If a selected container or song were not found, we've got into a // wrong subtree // (happens with "unknown" all the time) if (!RestoreLevelFocus(current)) { emit collapse(current); } else { return true; } } break; } } } return false; } void LibraryView::ReloadSettings() { QSettings s; s.beginGroup(kSettingsGroup); SetAutoOpen(s.value("auto_open", true).toBool()); if (app_ != nullptr) { app_->library_model()->set_pretty_covers( s.value("pretty_covers", true).toBool()); app_->library_model()->set_show_dividers( s.value("show_dividers", true).toBool()); } } void LibraryView::SetApplication(Application* app) { app_ = app; ReloadSettings(); } void LibraryView::SetFilter(LibraryFilterWidget* filter) { filter_ = filter; } void LibraryView::TotalSongCountUpdated(int count) { bool old = total_song_count_; total_song_count_ = count; if (old != total_song_count_) update(); if (total_song_count_ == 0) setCursor(Qt::PointingHandCursor); else unsetCursor(); } void LibraryView::paintEvent(QPaintEvent* event) { if (total_song_count_ == 0) { QPainter p(viewport()); QRect rect(viewport()->rect()); // Draw the confused clementine QRect image_rect((rect.width() - nomusic_.width()) / 2, 50, nomusic_.width(), nomusic_.height()); p.drawPixmap(image_rect, nomusic_); // Draw the title text QFont bold_font; bold_font.setBold(true); p.setFont(bold_font); QFontMetrics metrics(bold_font); QRect title_rect(0, image_rect.bottom() + 20, rect.width(), metrics.height()); p.drawText(title_rect, Qt::AlignHCenter, tr("Your library is empty!")); // Draw the other text p.setFont(QFont()); QRect text_rect(0, title_rect.bottom() + 5, rect.width(), metrics.height()); p.drawText(text_rect, Qt::AlignHCenter, tr("Click here to add some music")); } else { QTreeView::paintEvent(event); } } void LibraryView::mouseReleaseEvent(QMouseEvent* e) { QTreeView::mouseReleaseEvent(e); if (total_song_count_ == 0) { emit ShowConfigDialog(); } } void LibraryView::contextMenuEvent(QContextMenuEvent* e) { if (!context_menu_) { context_menu_ = new QMenu(this); add_to_playlist_ = context_menu_->addAction( IconLoader::Load("media-playback-start"), tr("Append to current playlist"), this, SLOT(AddToPlaylist())); load_ = context_menu_->addAction(IconLoader::Load("media-playback-start"), tr("Replace current playlist"), this, SLOT(Load())); open_in_new_playlist_ = context_menu_->addAction( IconLoader::Load("document-new"), tr("Open in new playlist"), this, SLOT(OpenInNewPlaylist())); context_menu_->addSeparator(); add_to_playlist_enqueue_ = context_menu_->addAction(IconLoader::Load("go-next"), tr("Queue track"), this, SLOT(AddToPlaylistEnqueue())); context_menu_->addSeparator(); new_smart_playlist_ = context_menu_->addAction( IconLoader::Load("document-new"), tr("New smart playlist..."), this, SLOT(NewSmartPlaylist())); edit_smart_playlist_ = context_menu_->addAction( IconLoader::Load("edit-rename"), tr("Edit smart playlist..."), this, SLOT(EditSmartPlaylist())); delete_smart_playlist_ = context_menu_->addAction( IconLoader::Load("edit-delete"), tr("Delete smart playlist"), this, SLOT(DeleteSmartPlaylist())); context_menu_->addSeparator(); organise_ = context_menu_->addAction(IconLoader::Load("edit-copy"), tr("Organise files..."), this, SLOT(Organise())); copy_to_device_ = context_menu_->addAction( IconLoader::Load("multimedia-player-ipod-mini-blue"), tr("Copy to device..."), this, SLOT(CopyToDevice())); delete_ = context_menu_->addAction(IconLoader::Load("edit-delete"), tr("Delete from disk..."), this, SLOT(Delete())); context_menu_->addSeparator(); edit_track_ = context_menu_->addAction(IconLoader::Load("edit-rename"), tr("Edit track information..."), this, SLOT(EditTracks())); edit_tracks_ = context_menu_->addAction(IconLoader::Load("edit-rename"), tr("Edit tracks information..."), this, SLOT(EditTracks())); show_in_browser_ = context_menu_->addAction( IconLoader::Load("document-open-folder"), tr("Show in file browser..."), this, SLOT(ShowInBrowser())); context_menu_->addSeparator(); show_in_various_ = context_menu_->addAction(tr("Show in various artists"), this, SLOT(ShowInVarious())); no_show_in_various_ = context_menu_->addAction( tr("Don't show in various artists"), this, SLOT(NoShowInVarious())); context_menu_->addSeparator(); context_menu_->addMenu(filter_->menu()); copy_to_device_->setDisabled( app_->device_manager()->connected_devices_model()->rowCount() == 0); connect(app_->device_manager()->connected_devices_model(), SIGNAL(IsEmptyChanged(bool)), copy_to_device_, SLOT(setDisabled(bool))); } context_menu_index_ = indexAt(e->pos()); if (!context_menu_index_.isValid()) return; context_menu_index_ = qobject_cast(model()) ->mapToSource(context_menu_index_); QModelIndexList selected_indexes = qobject_cast(model()) ->mapSelectionToSource(selectionModel()->selection()) .indexes(); // number of smart playlists selected int smart_playlists = 0; // is the smart playlists header selected? int smart_playlists_header = 0; // number of non smart playlists selected int regular_elements = 0; // number of editable non smart playlists selected int regular_editable = 0; for (const QModelIndex& index : selected_indexes) { int type = app_->library_model()->data(index, LibraryModel::Role_Type).toInt(); if (type == LibraryItem::Type_SmartPlaylist) { smart_playlists++; } else if (type == LibraryItem::Type_PlaylistContainer) { smart_playlists_header++; } else { regular_elements++; } if (app_->library_model() ->data(index, LibraryModel::Role_Editable) .toBool()) { regular_editable++; } } // TODO: check if custom plugin actions should be enabled / visible const int songs_selected = smart_playlists + smart_playlists_header + regular_elements; const bool regular_elements_only = songs_selected == regular_elements && regular_elements > 0; const bool smart_playlists_only = songs_selected == smart_playlists + smart_playlists_header; const bool only_smart_playlist_selected = smart_playlists == 1 && songs_selected == 1; // in all modes load_->setEnabled(songs_selected); add_to_playlist_->setEnabled(songs_selected); open_in_new_playlist_->setEnabled(songs_selected); add_to_playlist_enqueue_->setEnabled(songs_selected); // allow mixed smart playlists / regular elements selected show_in_browser_->setVisible(!smart_playlists_only); edit_tracks_->setVisible(!smart_playlists_only && regular_editable > 1); // if neither edit_track not edit_tracks are available, we show disabled // edit_track element edit_track_->setVisible(!smart_playlists_only && (regular_editable <= 1)); edit_track_->setEnabled(regular_editable == 1); // only when no smart playlists selected organise_->setVisible(regular_elements_only); copy_to_device_->setVisible(regular_elements_only); delete_->setVisible(regular_elements_only); show_in_various_->setVisible(regular_elements_only); no_show_in_various_->setVisible(regular_elements_only); // only when all selected items are editable organise_->setEnabled(regular_elements == regular_editable); copy_to_device_->setEnabled(regular_elements == regular_editable); delete_->setEnabled(regular_elements == regular_editable); // only when no regular elements selected new_smart_playlist_->setVisible(smart_playlists_only); edit_smart_playlist_->setVisible(smart_playlists_only); delete_smart_playlist_->setVisible(smart_playlists_only); edit_smart_playlist_->setEnabled(only_smart_playlist_selected); delete_smart_playlist_->setEnabled(only_smart_playlist_selected); context_menu_->popup(e->globalPos()); } void LibraryView::ShowInVarious() { ShowInVarious(true); } void LibraryView::NoShowInVarious() { ShowInVarious(false); } void LibraryView::ShowInVarious(bool on) { if (!context_menu_index_.isValid()) return; // Map is from album name -> all artists sharing that album name, built from // each selected // song. We put through "Various Artists" changes one album at a time, to make // sure the old album // node gets removed (due to all children removed), before the new one gets // added QMultiMap albums; for (const Song& song : GetSelectedSongs()) { if (albums.find(song.album(), song.artist()) == albums.end()) albums.insert(song.album(), song.artist()); } // If we have only one album and we are putting it into Various Artists, check // to see // if there are other Artists in this album and prompt the user if they'd like // them moved, too if (on && albums.keys().count() == 1) { const QString album = albums.keys().first(); QList all_of_album = app_->library_backend()->GetSongsByAlbum(album); QSet other_artists; for (const Song& s : all_of_album) { if (!albums.contains(album, s.artist()) && !other_artists.contains(s.artist())) { other_artists.insert(s.artist()); } } if (other_artists.count() > 0) { if (QMessageBox::question(this, tr("There are other songs in this album"), tr("Would you like to move the other songs in " "this album to Various Artists as well?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) { for (const QString& s : other_artists) { albums.insert(album, s); } } } } for (const QString& album : QSet::fromList(albums.keys())) { app_->library_backend()->ForceCompilation(album, albums.values(album), on); } } void LibraryView::Load() { QMimeData* data = model()->mimeData(selectedIndexes()); if (MimeData* mime_data = qobject_cast(data)) { mime_data->clear_first_ = true; } emit AddToPlaylistSignal(data); } void LibraryView::AddToPlaylist() { emit AddToPlaylistSignal(model()->mimeData(selectedIndexes())); } void LibraryView::AddToPlaylistEnqueue() { QMimeData* data = model()->mimeData(selectedIndexes()); if (MimeData* mime_data = qobject_cast(data)) { mime_data->enqueue_now_ = true; } emit AddToPlaylistSignal(data); } void LibraryView::OpenInNewPlaylist() { QMimeData* data = model()->mimeData(selectedIndexes()); if (MimeData* mime_data = qobject_cast(data)) { mime_data->open_in_new_playlist_ = true; } emit AddToPlaylistSignal(data); } void LibraryView::keyboardSearch(const QString& search) { is_in_keyboard_search_ = true; QTreeView::keyboardSearch(search); is_in_keyboard_search_ = false; } void LibraryView::scrollTo(const QModelIndex& index, ScrollHint hint) { if (is_in_keyboard_search_) QTreeView::scrollTo(index, QAbstractItemView::PositionAtTop); else QTreeView::scrollTo(index, hint); } SongList LibraryView::GetSelectedSongs() const { QModelIndexList selected_indexes = qobject_cast(model()) ->mapSelectionToSource(selectionModel()->selection()) .indexes(); return app_->library_model()->GetChildSongs(selected_indexes); } void LibraryView::Organise() { if (!organise_dialog_) organise_dialog_.reset(new OrganiseDialog(app_->task_manager())); organise_dialog_->SetDestinationModel( app_->library_model()->directory_model()); organise_dialog_->SetCopy(false); if (organise_dialog_->SetSongs(GetSelectedSongs())) organise_dialog_->show(); else { QMessageBox::warning( this, tr("Error"), tr("None of the selected songs were suitable for copying to a device")); } } void LibraryView::Delete() { if (QMessageBox::warning(this, tr("Delete files"), tr("These files will be permanently deleted from " "disk, are you sure you want to continue?"), QMessageBox::Yes, QMessageBox::Cancel) != QMessageBox::Yes) return; // We can cheat and always take the storage of the first directory, since // they'll all be FilesystemMusicStorage in a library and deleting doesn't // check the actual directory. std::shared_ptr storage = app_->library_model() ->directory_model() ->index(0, 0) .data(MusicStorage::Role_Storage) .value>(); DeleteFiles* delete_files = new DeleteFiles(app_->task_manager(), storage); connect(delete_files, SIGNAL(Finished(SongList)), SLOT(DeleteFinished(SongList))); delete_files->Start(GetSelectedSongs()); } void LibraryView::EditTracks() { if (!edit_tag_dialog_) { edit_tag_dialog_.reset(new EditTagDialog(app_, this)); } edit_tag_dialog_->SetSongs(GetSelectedSongs()); edit_tag_dialog_->show(); } void LibraryView::CopyToDevice() { if (!organise_dialog_) organise_dialog_.reset(new OrganiseDialog(app_->task_manager())); organise_dialog_->SetDestinationModel( app_->device_manager()->connected_devices_model(), true); organise_dialog_->SetCopy(true); organise_dialog_->SetSongs(GetSelectedSongs()); organise_dialog_->show(); } void LibraryView::DeleteFinished(const SongList& songs_with_errors) { if (songs_with_errors.isEmpty()) return; OrganiseErrorDialog* dialog = new OrganiseErrorDialog(this); dialog->Show(OrganiseErrorDialog::Type_Delete, songs_with_errors); // It deletes itself when the user closes it } void LibraryView::FilterReturnPressed() { if (!currentIndex().isValid()) { // Pick the first thing that isn't a divider for (int row = 0; row < model()->rowCount(); ++row) { QModelIndex idx(model()->index(row, 0)); if (idx.data(LibraryModel::Role_Type) != LibraryItem::Type_Divider) { setCurrentIndex(idx); break; } } } if (!currentIndex().isValid()) return; emit doubleClicked(currentIndex()); } void LibraryView::NewSmartPlaylist() { Wizard* wizard = new Wizard(app_, app_->library_backend(), this); wizard->setAttribute(Qt::WA_DeleteOnClose); connect(wizard, SIGNAL(accepted()), SLOT(NewSmartPlaylistFinished())); wizard->show(); } void LibraryView::EditSmartPlaylist() { Wizard* wizard = new Wizard(app_, app_->library_backend(), this); wizard->setAttribute(Qt::WA_DeleteOnClose); connect(wizard, SIGNAL(accepted()), SLOT(EditSmartPlaylistFinished())); wizard->show(); wizard->SetGenerator( app_->library_model()->CreateGenerator(context_menu_index_)); } void LibraryView::DeleteSmartPlaylist() { app_->library_model()->DeleteGenerator(context_menu_index_); } void LibraryView::NewSmartPlaylistFinished() { const Wizard* wizard = qobject_cast(sender()); app_->library_model()->AddGenerator(wizard->CreateGenerator()); } void LibraryView::EditSmartPlaylistFinished() { const Wizard* wizard = qobject_cast(sender()); app_->library_model()->UpdateGenerator(context_menu_index_, wizard->CreateGenerator()); } void LibraryView::ShowInBrowser() { QList urls; for (const Song& song : GetSelectedSongs()) { urls << song.url(); } Utilities::OpenInFileBrowser(urls); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/libraryview.h000066400000000000000000000076231260417502300243420ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef LIBRARYVIEW_H #define LIBRARYVIEW_H #include #include #include "core/song.h" #include "ui/edittagdialog.h" #include "widgets/autoexpandingtreeview.h" class Application; class LibraryFilterWidget; class OrganiseDialog; class QMimeData; namespace smart_playlists { class Wizard; } class LibraryItemDelegate : public QStyledItemDelegate { Q_OBJECT public: LibraryItemDelegate(QObject* parent); void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; public slots: bool helpEvent(QHelpEvent* event, QAbstractItemView* view, const QStyleOptionViewItem& option, const QModelIndex& index); }; class LibraryView : public AutoExpandingTreeView { Q_OBJECT public: LibraryView(QWidget* parent = nullptr); ~LibraryView(); static const char* kSettingsGroup; // Returns Songs currently selected in the library view. Please note that the // selection is recursive meaning that if for example an album is selected // this will return all of it's songs. SongList GetSelectedSongs() const; void SetApplication(Application* app); void SetFilter(LibraryFilterWidget* filter); // QTreeView void keyboardSearch(const QString& search); void scrollTo(const QModelIndex& index, ScrollHint hint = EnsureVisible); public slots: void TotalSongCountUpdated(int count); void ReloadSettings(); void FilterReturnPressed(); void SaveFocus(); void RestoreFocus(); signals: void ShowConfigDialog(); protected: // QWidget void paintEvent(QPaintEvent* event); void mouseReleaseEvent(QMouseEvent* e); void contextMenuEvent(QContextMenuEvent* e); private slots: void Load(); void AddToPlaylist(); void AddToPlaylistEnqueue(); void OpenInNewPlaylist(); void Organise(); void CopyToDevice(); void Delete(); void EditTracks(); void ShowInBrowser(); void ShowInVarious(); void NoShowInVarious(); void NewSmartPlaylist(); void EditSmartPlaylist(); void DeleteSmartPlaylist(); void NewSmartPlaylistFinished(); void EditSmartPlaylistFinished(); void DeleteFinished(const SongList& songs_with_errors); private: void RecheckIsEmpty(); void ShowInVarious(bool on); bool RestoreLevelFocus(const QModelIndex& parent = QModelIndex()); void SaveContainerPath(const QModelIndex& child); private: Application* app_; LibraryFilterWidget* filter_; int total_song_count_; QPixmap nomusic_; QMenu* context_menu_; QModelIndex context_menu_index_; QAction* load_; QAction* add_to_playlist_; QAction* add_to_playlist_enqueue_; QAction* open_in_new_playlist_; QAction* organise_; QAction* copy_to_device_; QAction* delete_; QAction* edit_track_; QAction* edit_tracks_; QAction* show_in_browser_; QAction* show_in_various_; QAction* no_show_in_various_; QAction* new_smart_playlist_; QAction* edit_smart_playlist_; QAction* delete_smart_playlist_; std::unique_ptr organise_dialog_; std::unique_ptr edit_tag_dialog_; bool is_in_keyboard_search_; // Save focus Song last_selected_song_; QString last_selected_container_; QSet last_selected_path_; }; #endif // LIBRARYVIEW_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/libraryviewcontainer.cpp000066400000000000000000000032221260417502300265670ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "libraryviewcontainer.h" #include "ui_libraryviewcontainer.h" #include "globalsearch/globalsearch.h" LibraryViewContainer::LibraryViewContainer(QWidget* parent) : QWidget(parent), ui_(new Ui_LibraryViewContainer) { ui_->setupUi(this); view()->SetFilter(filter()); connect(filter(), SIGNAL(UpPressed()), view(), SLOT(UpAndFocus())); connect(filter(), SIGNAL(DownPressed()), view(), SLOT(DownAndFocus())); connect(filter(), SIGNAL(ReturnPressed()), view(), SLOT(FilterReturnPressed())); connect(view(), SIGNAL(FocusOnFilterSignal(QKeyEvent*)), filter(), SLOT(FocusOnFilter(QKeyEvent*))); ReloadSettings(); } LibraryViewContainer::~LibraryViewContainer() { delete ui_; } LibraryView* LibraryViewContainer::view() const { return ui_->view; } LibraryFilterWidget* LibraryViewContainer::filter() const { return ui_->filter; } void LibraryViewContainer::ReloadSettings() { view()->ReloadSettings(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/libraryviewcontainer.h000066400000000000000000000022761260417502300262440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef LIBRARYVIEWCONTAINER_H #define LIBRARYVIEWCONTAINER_H #include class LibraryFilterWidget; class LibraryView; class Ui_LibraryViewContainer; class LibraryViewContainer : public QWidget { Q_OBJECT public: LibraryViewContainer(QWidget* parent = nullptr); ~LibraryViewContainer(); LibraryFilterWidget* filter() const; LibraryView* view() const; void ReloadSettings(); private: Ui_LibraryViewContainer* ui_; }; #endif // LIBRARYVIEWCONTAINER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/libraryviewcontainer.ui000066400000000000000000000022041260417502300264210ustar00rootroot00000000000000 LibraryViewContainer 0 0 400 300 Form 0 0 LibraryFilterWidget QWidget
library/libraryfilterwidget.h
1
LibraryView QWidget
library/libraryview.h
1
clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/librarywatcher.cpp000066400000000000000000000575101260417502300253600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "librarywatcher.h" #include "librarybackend.h" #include "core/filesystemwatcherinterface.h" #include "core/logging.h" #include "core/tagreaderclient.h" #include "core/taskmanager.h" #include "core/utilities.h" #include "playlistparsers/cueparser.h" #include #include #include #include #include #include #include #include #include #include #include // This is defined by one of the windows headers that is included by taglib. #ifdef RemoveDirectory #undef RemoveDirectory #endif QStringList LibraryWatcher::sValidImages; const char* LibraryWatcher::kSettingsGroup = "LibraryWatcher"; LibraryWatcher::LibraryWatcher(QObject* parent) : QObject(parent), backend_(nullptr), task_manager_(nullptr), fs_watcher_(FileSystemWatcherInterface::Create(this)), stop_requested_(false), scan_on_startup_(true), monitor_(true), rescan_timer_(new QTimer(this)), rescan_paused_(false), total_watches_(0), cue_parser_(new CueParser(backend_, this)) { rescan_timer_->setInterval(1000); rescan_timer_->setSingleShot(true); if (sValidImages.isEmpty()) { sValidImages << "jpg" << "png" << "gif" << "jpeg"; } ReloadSettings(); connect(rescan_timer_, SIGNAL(timeout()), SLOT(RescanPathsNow())); } LibraryWatcher::ScanTransaction::ScanTransaction(LibraryWatcher* watcher, int dir, bool incremental, bool ignores_mtime) : progress_(0), progress_max_(0), dir_(dir), incremental_(incremental), ignores_mtime_(ignores_mtime), watcher_(watcher), cached_songs_dirty_(true), known_subdirs_dirty_(true) { QString description; if (watcher_->device_name_.isEmpty()) description = tr("Updating library"); else description = tr("Updating %1").arg(watcher_->device_name_); task_id_ = watcher_->task_manager_->StartTask(description); emit watcher_->ScanStarted(task_id_); } LibraryWatcher::ScanTransaction::~ScanTransaction() { // If we're stopping then don't commit the transaction if (watcher_->stop_requested_) return; if (!new_songs.isEmpty()) emit watcher_->NewOrUpdatedSongs(new_songs); if (!touched_songs.isEmpty()) emit watcher_->SongsMTimeUpdated(touched_songs); if (!deleted_songs.isEmpty()) emit watcher_->SongsDeleted(deleted_songs); if (!readded_songs.isEmpty()) emit watcher_->SongsReadded(readded_songs); if (!new_subdirs.isEmpty()) emit watcher_->SubdirsDiscovered(new_subdirs); if (!touched_subdirs.isEmpty()) emit watcher_->SubdirsMTimeUpdated(touched_subdirs); watcher_->task_manager_->SetTaskFinished(task_id_); if (watcher_->monitor_) { // Watch the new subdirectories for (const Subdirectory& subdir : new_subdirs) { watcher_->AddWatch(watcher_->watched_dirs_[dir_], subdir.path); } } } void LibraryWatcher::ScanTransaction::AddToProgress(int n) { progress_ += n; watcher_->task_manager_->SetTaskProgress(task_id_, progress_, progress_max_); } void LibraryWatcher::ScanTransaction::AddToProgressMax(int n) { progress_max_ += n; watcher_->task_manager_->SetTaskProgress(task_id_, progress_, progress_max_); } SongList LibraryWatcher::ScanTransaction::FindSongsInSubdirectory( const QString& path) { if (cached_songs_dirty_) { cached_songs_ = watcher_->backend_->FindSongsInDirectory(dir_); cached_songs_dirty_ = false; } // TODO: Make this faster SongList ret; for (const Song& song : cached_songs_) { if (song.url().toLocalFile().section('/', 0, -2) == path) ret << song; } return ret; } void LibraryWatcher::ScanTransaction::SetKnownSubdirs( const SubdirectoryList& subdirs) { known_subdirs_ = subdirs; known_subdirs_dirty_ = false; } bool LibraryWatcher::ScanTransaction::HasSeenSubdir(const QString& path) { if (known_subdirs_dirty_) SetKnownSubdirs(watcher_->backend_->SubdirsInDirectory(dir_)); for (const Subdirectory& subdir : known_subdirs_) { if (subdir.path == path && subdir.mtime != 0) return true; } return false; } SubdirectoryList LibraryWatcher::ScanTransaction::GetImmediateSubdirs( const QString& path) { if (known_subdirs_dirty_) SetKnownSubdirs(watcher_->backend_->SubdirsInDirectory(dir_)); SubdirectoryList ret; for (const Subdirectory& subdir : known_subdirs_) { if (subdir.path.left(subdir.path.lastIndexOf(QDir::separator())) == path && subdir.mtime != 0) { ret << subdir; } } return ret; } SubdirectoryList LibraryWatcher::ScanTransaction::GetAllSubdirs() { if (known_subdirs_dirty_) SetKnownSubdirs(watcher_->backend_->SubdirsInDirectory(dir_)); return known_subdirs_; } void LibraryWatcher::AddDirectory(const Directory& dir, const SubdirectoryList& subdirs) { watched_dirs_[dir.id] = dir; if (subdirs.isEmpty()) { // This is a new directory that we've never seen before. // Scan it fully. ScanTransaction transaction(this, dir.id, false); transaction.SetKnownSubdirs(subdirs); transaction.AddToProgressMax(1); ScanSubdirectory(dir.path, Subdirectory(), &transaction); } else { // We can do an incremental scan - looking at the mtimes of each // subdirectory and only rescan if the directory has changed. ScanTransaction transaction(this, dir.id, true); transaction.SetKnownSubdirs(subdirs); transaction.AddToProgressMax(subdirs.count()); for (const Subdirectory& subdir : subdirs) { if (stop_requested_) return; if (scan_on_startup_) ScanSubdirectory(subdir.path, subdir, &transaction); if (monitor_) AddWatch(dir, subdir.path); } } emit CompilationsNeedUpdating(); } void LibraryWatcher::ScanSubdirectory(const QString& path, const Subdirectory& subdir, ScanTransaction* t, bool force_noincremental) { QFileInfo path_info(path); // Do not scan symlinked dirs that are already in collection if (path_info.isSymLink()) { QString real_path = path_info.symLinkTarget(); for (const Directory& dir : watched_dirs_) { if (real_path.startsWith(dir.path)) { t->AddToProgress(1); return; } } } if (!t->ignores_mtime() && !force_noincremental && t->is_incremental() && subdir.mtime == path_info.lastModified().toTime_t()) { // The directory hasn't changed since last time t->AddToProgress(1); return; } QMap album_art; QStringList files_on_disk; SubdirectoryList my_new_subdirs; // If a directory is moved then only its parent gets a changed notification, // so we need to look and see if any of our children don't exist any more. // If one has been removed, "rescan" it to get the deleted songs SubdirectoryList previous_subdirs = t->GetImmediateSubdirs(path); for (const Subdirectory& subdir : previous_subdirs) { if (!QFile::exists(subdir.path) && subdir.path != path) { t->AddToProgressMax(1); ScanSubdirectory(subdir.path, subdir, t, true); } } // First we "quickly" get a list of the files in the directory that we // think might be music. While we're here, we also look for new // subdirectories // and possible album artwork. QDirIterator it( path, QDir::Dirs | QDir::Files | QDir::Hidden | QDir::NoDotAndDotDot); while (it.hasNext()) { if (stop_requested_) return; QString child(it.next()); QFileInfo child_info(child); if (child_info.isDir()) { if (!child_info.isHidden() && !t->HasSeenSubdir(child)) { // We haven't seen this subdirectory before - add it to a list and // later we'll tell the backend about it and scan it. Subdirectory new_subdir; new_subdir.directory_id = -1; new_subdir.path = child; new_subdir.mtime = child_info.lastModified().toTime_t(); my_new_subdirs << new_subdir; } } else { QString ext_part(ExtensionPart(child)); QString dir_part(DirectoryPart(child)); if (sValidImages.contains(ext_part)) album_art[dir_part] << child; else if (!child_info.isHidden()) files_on_disk << child; } } if (stop_requested_) return; // Ask the database for a list of files in this directory SongList songs_in_db = t->FindSongsInSubdirectory(path); QSet cues_processed; // Now compare the list from the database with the list of files on disk for (const QString& file : files_on_disk) { if (stop_requested_) return; // associated cue QString matching_cue = NoExtensionPart(file) + ".cue"; Song matching_song; if (FindSongByPath(songs_in_db, file, &matching_song)) { uint matching_cue_mtime = GetMtimeForCue(matching_cue); // The song is in the database and still on disk. // Check the mtime to see if it's been changed since it was added. QFileInfo file_info(file); if (!file_info.exists()) { // Partially fixes race condition - if file was removed between being // added to the list and now. files_on_disk.removeAll(file); continue; } // cue sheet's path from library (if any) QString song_cue = matching_song.cue_path(); uint song_cue_mtime = GetMtimeForCue(song_cue); bool cue_deleted = song_cue_mtime == 0 && matching_song.has_cue(); bool cue_added = matching_cue_mtime != 0 && !matching_song.has_cue(); // watch out for cue songs which have their mtime equal to // qMax(media_file_mtime, cue_sheet_mtime) bool changed = (matching_song.mtime() != qMax(file_info.lastModified().toTime_t(), song_cue_mtime)) || cue_deleted || cue_added; // Also want to look to see whether the album art has changed QString image = ImageForSong(file, album_art); if ((matching_song.art_automatic().isEmpty() && !image.isEmpty()) || (!matching_song.art_automatic().isEmpty() && !matching_song.has_embedded_cover() && !QFile::exists(matching_song.art_automatic()))) { changed = true; } // the song's changed - reread the metadata from file if (t->ignores_mtime() || changed) { qLog(Debug) << file << "changed"; // if cue associated... if (!cue_deleted && (matching_song.has_cue() || cue_added)) { UpdateCueAssociatedSongs(file, path, matching_cue, image, t); // if no cue or it's about to lose it... } else { UpdateNonCueAssociatedSong(file, matching_song, image, cue_deleted, t); } } // nothing has changed - mark the song available without re-scanning if (matching_song.is_unavailable()) t->readded_songs << matching_song; } else { // The song is on disk but not in the DB SongList song_list = ScanNewFile(file, path, matching_cue, &cues_processed); if (song_list.isEmpty()) { continue; } qLog(Debug) << file << "created"; // choose an image for the song(s) QString image = ImageForSong(file, album_art); for (Song song : song_list) { song.set_directory_id(t->dir()); if (song.art_automatic().isEmpty()) song.set_art_automatic(image); t->new_songs << song; } } } // Look for deleted songs for (const Song& song : songs_in_db) { if (!song.is_unavailable() && !files_on_disk.contains(song.url().toLocalFile())) { qLog(Debug) << "Song deleted from disk:" << song.url().toLocalFile(); t->deleted_songs << song; } } // Add this subdir to the new or touched list Subdirectory updated_subdir; updated_subdir.directory_id = t->dir(); updated_subdir.mtime = path_info.exists() ? path_info.lastModified().toTime_t() : 0; updated_subdir.path = path; if (subdir.directory_id == -1) t->new_subdirs << updated_subdir; else t->touched_subdirs << updated_subdir; t->AddToProgress(1); // Recurse into the new subdirs that we found t->AddToProgressMax(my_new_subdirs.count()); for (const Subdirectory& my_new_subdir : my_new_subdirs) { if (stop_requested_) return; ScanSubdirectory(my_new_subdir.path, my_new_subdir, t, true); } } void LibraryWatcher::UpdateCueAssociatedSongs(const QString& file, const QString& path, const QString& matching_cue, const QString& image, ScanTransaction* t) { QFile cue(matching_cue); cue.open(QIODevice::ReadOnly); SongList old_sections = backend_->GetSongsByUrl(QUrl::fromLocalFile(file)); QHash sections_map; for (const Song& song : old_sections) { sections_map[song.beginning_nanosec()] = song; } QSet used_ids; // update every song that's in the cue and library for (Song cue_song : cue_parser_->Load(&cue, matching_cue, path)) { cue_song.set_directory_id(t->dir()); Song matching = sections_map[cue_song.beginning_nanosec()]; // a new section if (!matching.is_valid()) { t->new_songs << cue_song; // changed section } else { PreserveUserSetData(file, image, matching, &cue_song, t); used_ids.insert(matching.id()); } } // sections that are now missing for (const Song& matching : old_sections) { if (!used_ids.contains(matching.id())) { t->deleted_songs << matching; } } } void LibraryWatcher::UpdateNonCueAssociatedSong(const QString& file, const Song& matching_song, const QString& image, bool cue_deleted, ScanTransaction* t) { // if a cue got deleted, we turn it's first section into the new // 'raw' (cueless) song and we just remove the rest of the sections // from the library if (cue_deleted) { for (const Song& song : backend_->GetSongsByUrl(QUrl::fromLocalFile(file))) { if (!song.IsMetadataEqual(matching_song)) { t->deleted_songs << song; } } } Song song_on_disk; song_on_disk.set_directory_id(t->dir()); TagReaderClient::Instance()->ReadFileBlocking(file, &song_on_disk); if (song_on_disk.is_valid()) { PreserveUserSetData(file, image, matching_song, &song_on_disk, t); } } SongList LibraryWatcher::ScanNewFile(const QString& file, const QString& path, const QString& matching_cue, QSet* cues_processed) { SongList song_list; uint matching_cue_mtime = GetMtimeForCue(matching_cue); // if it's a cue - create virtual tracks if (matching_cue_mtime) { // don't process the same cue many times if (cues_processed->contains(matching_cue)) return song_list; QFile cue(matching_cue); cue.open(QIODevice::ReadOnly); // Ignore FILEs pointing to other media files. Also, watch out for incorrect // media files. Playlist parser for CUEs considers every entry in sheet // valid and we don't want invalid media getting into library! for (const Song& cue_song : cue_parser_->Load(&cue, matching_cue, path)) { if (cue_song.url().toLocalFile() == file) { if (TagReaderClient::Instance()->IsMediaFileBlocking(file)) { song_list << cue_song; } } } if (!song_list.isEmpty()) { *cues_processed << matching_cue; } // it's a normal media file } else { Song song; TagReaderClient::Instance()->ReadFileBlocking(file, &song); if (song.is_valid()) { song_list << song; } } return song_list; } void LibraryWatcher::PreserveUserSetData(const QString& file, const QString& image, const Song& matching_song, Song* out, ScanTransaction* t) { out->set_id(matching_song.id()); // Previous versions of Clementine incorrectly overwrote this and // stored it in the DB, so we can't rely on matching_song to // know if it has embedded artwork or not, but we can check here. if (!out->has_embedded_cover()) out->set_art_automatic(image); out->MergeUserSetData(matching_song); // The song was deleted from the database (e.g. due to an unmounted // filesystem), but has been restored. if (matching_song.is_unavailable()) { qLog(Debug) << file << " unavailable song restored"; t->new_songs << *out; } else if (!matching_song.IsMetadataEqual(*out)) { qLog(Debug) << file << "metadata changed"; // Update the song in the DB t->new_songs << *out; } else { // Only the mtime's changed t->touched_songs << *out; } } uint LibraryWatcher::GetMtimeForCue(const QString& cue_path) { // slight optimisation if (cue_path.isEmpty()) { return 0; } const QFileInfo file_info(cue_path); if (!file_info.exists()) { return 0; } const QDateTime cue_last_modified = file_info.lastModified(); return cue_last_modified.isValid() ? cue_last_modified.toTime_t() : 0; } void LibraryWatcher::AddWatch(const Directory& dir, const QString& path) { if (!QFile::exists(path)) return; connect(fs_watcher_, SIGNAL(PathChanged(const QString&)), this, SLOT(DirectoryChanged(const QString&)), Qt::UniqueConnection); fs_watcher_->AddPath(path); subdir_mapping_[path] = dir; } void LibraryWatcher::RemoveDirectory(const Directory& dir) { rescan_queue_.remove(dir.id); watched_dirs_.remove(dir.id); // Stop watching the directory's subdirectories for (const QString& subdir_path : subdir_mapping_.keys(dir)) { fs_watcher_->RemovePath(subdir_path); subdir_mapping_.remove(subdir_path); } } bool LibraryWatcher::FindSongByPath(const SongList& list, const QString& path, Song* out) { // TODO: Make this faster for (const Song& song : list) { if (song.url().toLocalFile() == path) { *out = song; return true; } } return false; } void LibraryWatcher::DirectoryChanged(const QString& subdir) { // Find what dir it was in QHash::const_iterator it = subdir_mapping_.constFind(subdir); if (it == subdir_mapping_.constEnd()) { return; } Directory dir = *it; qLog(Debug) << "Subdir" << subdir << "changed under directory" << dir.path << "id" << dir.id; // Queue the subdir for rescanning if (!rescan_queue_[dir.id].contains(subdir)) rescan_queue_[dir.id] << subdir; if (!rescan_paused_) rescan_timer_->start(); } void LibraryWatcher::RescanPathsNow() { for (int dir : rescan_queue_.keys()) { if (stop_requested_) return; ScanTransaction transaction(this, dir, false); transaction.AddToProgressMax(rescan_queue_[dir].count()); for (const QString& path : rescan_queue_[dir]) { if (stop_requested_) return; Subdirectory subdir; subdir.directory_id = dir; subdir.mtime = 0; subdir.path = path; ScanSubdirectory(path, subdir, &transaction); } } rescan_queue_.clear(); emit CompilationsNeedUpdating(); } QString LibraryWatcher::PickBestImage(const QStringList& images) { // This is used when there is more than one image in a directory. // Pick the biggest image that matches the most important filter QStringList filtered; for (const QString& filter_text : best_image_filters_) { // the images in the images list are represented by a full path, // so we need to isolate just the filename for (const QString& image : images) { QFileInfo file_info(image); QString filename(file_info.fileName()); if (filename.contains(filter_text, Qt::CaseInsensitive)) filtered << image; } /* We assume the filters are give in the order best to worst, so if we've got a result, we go with it. Otherwise we might start capturing more generic rules */ if (!filtered.isEmpty()) break; } if (filtered.isEmpty()) { // the filter was too restrictive, just use the original list filtered = images; } int biggest_size = 0; QString biggest_path; for (const QString& path : filtered) { QImage image(path); if (image.isNull()) continue; int size = image.width() * image.height(); if (size > biggest_size) { biggest_size = size; biggest_path = path; } } return biggest_path; } QString LibraryWatcher::ImageForSong(const QString& path, QMap& album_art) { QString dir(DirectoryPart(path)); if (album_art.contains(dir)) { if (album_art[dir].count() == 1) return album_art[dir][0]; else { QString best_image = PickBestImage(album_art[dir]); album_art[dir] = QStringList() << best_image; return best_image; } } return QString(); } void LibraryWatcher::ReloadSettingsAsync() { QMetaObject::invokeMethod(this, "ReloadSettings", Qt::QueuedConnection); } void LibraryWatcher::ReloadSettings() { const bool was_monitoring_before = monitor_; QSettings s; s.beginGroup(kSettingsGroup); scan_on_startup_ = s.value("startup_scan", true).toBool(); monitor_ = s.value("monitor", true).toBool(); best_image_filters_.clear(); QStringList filters = s.value("cover_art_patterns", QStringList() << "front" << "cover").toStringList(); for (const QString& filter : filters) { QString s = filter.trimmed(); if (!s.isEmpty()) best_image_filters_ << s; } if (!monitor_ && was_monitoring_before) { fs_watcher_->Clear(); } else if (monitor_ && !was_monitoring_before) { // Add all directories to all QFileSystemWatchers again for (const Directory& dir : watched_dirs_.values()) { SubdirectoryList subdirs = backend_->SubdirsInDirectory(dir.id); for (const Subdirectory& subdir : subdirs) { AddWatch(dir, subdir.path); } } } } void LibraryWatcher::SetRescanPausedAsync(bool pause) { QMetaObject::invokeMethod(this, "SetRescanPaused", Qt::QueuedConnection, Q_ARG(bool, pause)); } void LibraryWatcher::SetRescanPaused(bool pause) { rescan_paused_ = pause; if (!rescan_paused_ && !rescan_queue_.isEmpty()) RescanPathsNow(); } void LibraryWatcher::IncrementalScanAsync() { QMetaObject::invokeMethod(this, "IncrementalScanNow", Qt::QueuedConnection); } void LibraryWatcher::FullScanAsync() { QMetaObject::invokeMethod(this, "FullScanNow", Qt::QueuedConnection); } void LibraryWatcher::IncrementalScanNow() { PerformScan(true, false); } void LibraryWatcher::FullScanNow() { PerformScan(false, true); } void LibraryWatcher::PerformScan(bool incremental, bool ignore_mtimes) { for (const Directory& dir : watched_dirs_.values()) { ScanTransaction transaction(this, dir.id, incremental, ignore_mtimes); SubdirectoryList subdirs(transaction.GetAllSubdirs()); transaction.AddToProgressMax(subdirs.count()); for (const Subdirectory& subdir : subdirs) { if (stop_requested_) return; ScanSubdirectory(subdir.path, subdir, &transaction); } } emit CompilationsNeedUpdating(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/librarywatcher.h000066400000000000000000000175531260417502300250300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef LIBRARYWATCHER_H #define LIBRARYWATCHER_H #include "directory.h" #include "core/song.h" #include #include #include #include class QFileSystemWatcher; class QTimer; class CueParser; class FileSystemWatcherInterface; class LibraryBackend; class TaskManager; class LibraryWatcher : public QObject { Q_OBJECT public: LibraryWatcher(QObject* parent = nullptr); static const char* kSettingsGroup; void set_backend(LibraryBackend* backend) { backend_ = backend; } void set_task_manager(TaskManager* task_manager) { task_manager_ = task_manager; } void set_device_name(const QString& device_name) { device_name_ = device_name; } void IncrementalScanAsync(); void FullScanAsync(); void SetRescanPausedAsync(bool pause); void ReloadSettingsAsync(); void Stop() { stop_requested_ = true; } signals: void NewOrUpdatedSongs(const SongList& songs); void SongsMTimeUpdated(const SongList& songs); void SongsDeleted(const SongList& songs); void SongsReadded(const SongList& songs, bool unavailable = false); void SubdirsDiscovered(const SubdirectoryList& subdirs); void SubdirsMTimeUpdated(const SubdirectoryList& subdirs); void CompilationsNeedUpdating(); void ScanStarted(int task_id); public slots: void ReloadSettings(); void AddDirectory(const Directory& dir, const SubdirectoryList& subdirs); void RemoveDirectory(const Directory& dir); void SetRescanPaused(bool pause); private: // This class encapsulates a full or partial scan of a directory. // Each directory has one or more subdirectories, and any number of // subdirectories can be scanned during one transaction. ScanSubdirectory() // adds its results to the members of this transaction class, and they are // "committed" through calls to the LibraryBackend in the transaction's dtor. // The transaction also caches the list of songs in this directory according // to the library. Multiple calls to FindSongsInSubdirectory during one // transaction will only result in one call to // LibraryBackend::FindSongsInDirectory. class ScanTransaction { public: ScanTransaction(LibraryWatcher* watcher, int dir, bool incremental, bool ignores_mtime = false); ~ScanTransaction(); SongList FindSongsInSubdirectory(const QString& path); bool HasSeenSubdir(const QString& path); void SetKnownSubdirs(const SubdirectoryList& subdirs); SubdirectoryList GetImmediateSubdirs(const QString& path); SubdirectoryList GetAllSubdirs(); void AddToProgress(int n = 1); void AddToProgressMax(int n); int dir() const { return dir_; } bool is_incremental() const { return incremental_; } bool ignores_mtime() const { return ignores_mtime_; } SongList deleted_songs; SongList readded_songs; SongList new_songs; SongList touched_songs; SubdirectoryList new_subdirs; SubdirectoryList touched_subdirs; private: ScanTransaction(const ScanTransaction&) {} ScanTransaction& operator=(const ScanTransaction&) { return *this; } int task_id_; int progress_; int progress_max_; int dir_; // Incremental scan enters a directory only if it has changed since the // last scan. bool incremental_; // This type of scan updates every file in a folder that's // being scanned. Even if it detects the file hasn't changed since // the last scan. Also, since it's ignoring mtimes on folders too, // it will go as deep in the folder hierarchy as it's possible. bool ignores_mtime_; LibraryWatcher* watcher_; SongList cached_songs_; bool cached_songs_dirty_; SubdirectoryList known_subdirs_; bool known_subdirs_dirty_; }; private slots: void DirectoryChanged(const QString& path); void IncrementalScanNow(); void FullScanNow(); void RescanPathsNow(); void ScanSubdirectory(const QString& path, const Subdirectory& subdir, ScanTransaction* t, bool force_noincremental = false); private: static bool FindSongByPath(const SongList& list, const QString& path, Song* out); inline static QString NoExtensionPart(const QString& fileName); inline static QString ExtensionPart(const QString& fileName); inline static QString DirectoryPart(const QString& fileName); QString PickBestImage(const QStringList& images); QString ImageForSong(const QString& path, QMap& album_art); void AddWatch(const Directory& dir, const QString& path); uint GetMtimeForCue(const QString& cue_path); void PerformScan(bool incremental, bool ignore_mtimes); // Updates the sections of a cue associated and altered (according to mtime) // media file during a scan. void UpdateCueAssociatedSongs(const QString& file, const QString& path, const QString& matching_cue, const QString& image, ScanTransaction* t); // Updates a single non-cue associated and altered (according to mtime) song // during a scan. void UpdateNonCueAssociatedSong(const QString& file, const Song& matching_song, const QString& image, bool cue_deleted, ScanTransaction* t); // Updates a new song with some metadata taken from it's equivalent old // song (for example rating and score). void PreserveUserSetData(const QString& file, const QString& image, const Song& matching_song, Song* out, ScanTransaction* t); // Scans a single media file that's present on the disk but not yet in the // library. // It may result in a multiple files added to the library when the media file // has many sections (like a CUE related media file). SongList ScanNewFile(const QString& file, const QString& path, const QString& matching_cue, QSet* cues_processed); private: LibraryBackend* backend_; TaskManager* task_manager_; QString device_name_; FileSystemWatcherInterface* fs_watcher_; QHash subdir_mapping_; /* A list of words use to try to identify the (likely) best image * found in an directory to use as cover artwork. * e.g. using ["front", "cover"] would identify front.jpg and * exclude back.jpg. */ QStringList best_image_filters_; bool stop_requested_; bool scan_on_startup_; bool monitor_; QMap watched_dirs_; QTimer* rescan_timer_; QMap rescan_queue_; // dir id -> list of subdirs to be scanned bool rescan_paused_; int total_watches_; CueParser* cue_parser_; static QStringList sValidImages; }; inline QString LibraryWatcher::NoExtensionPart(const QString& fileName) { return fileName.contains('.') ? fileName.section('.', 0, -2) : ""; } // Thanks Amarok inline QString LibraryWatcher::ExtensionPart(const QString& fileName) { return fileName.contains('.') ? fileName.mid(fileName.lastIndexOf('.') + 1).toLower() : ""; } inline QString LibraryWatcher::DirectoryPart(const QString& fileName) { return fileName.section('/', 0, -2); } #endif // LIBRARYWATCHER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/sqlrow.cpp000066400000000000000000000021061260417502300236540ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "libraryquery.h" #include "sqlrow.h" #include #include SqlRow::SqlRow(const QSqlQuery& query) { Init(query); } SqlRow::SqlRow(const LibraryQuery& query) { Init(query); } void SqlRow::Init(const QSqlQuery& query) { int rows = query.record().count(); for (int i = 0; i < rows; ++i) { columns_ << query.value(i); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/library/sqlrow.h000066400000000000000000000022661260417502300233300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SQLROW_H #define SQLROW_H #include #include class QSqlQuery; class LibraryQuery; class SqlRow { public: // WARNING: Implicit construction from QSqlQuery and LibraryQuery. SqlRow(const QSqlQuery& query); SqlRow(const LibraryQuery& query); const QVariant& value(int i) const { return columns_[i]; } private: SqlRow(); void Init(const QSqlQuery& query); QList columns_; }; typedef QList SqlRowList; #endif clementine-1.2.3+git1354-gdaddbde+dfsg/src/mac/000077500000000000000000000000001260417502300207165ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/mac/SBSystemPreferences.h000066400000000000000000000154511260417502300247700ustar00rootroot00000000000000/* * SBSystemPreferences.h * * Generated with: * sdef "/Applications/System Preferences.app" | sdp -fh --basename *SBSystemPreferences -o SBSystemPreferences.h */ #import #import @class SBSystemPreferencesApplication, SBSystemPreferencesDocument, SBSystemPreferencesWindow, SBSystemPreferencesPane, SBSystemPreferencesAnchor; enum SBSystemPreferencesSaveOptions { SBSystemPreferencesSaveOptionsYes = 'yes ' /* Save the file. */, SBSystemPreferencesSaveOptionsNo = 'no ' /* Do not save the file. */, SBSystemPreferencesSaveOptionsAsk = 'ask ' /* Ask the user whether or not to save the file. */ }; typedef enum SBSystemPreferencesSaveOptions SBSystemPreferencesSaveOptions; enum SBSystemPreferencesPrintingErrorHandling { SBSystemPreferencesPrintingErrorHandlingStandard = 'lwst' /* Standard PostScript error handling */, SBSystemPreferencesPrintingErrorHandlingDetailed = 'lwdt' /* print a detailed report of PostScript errors */ }; typedef enum SBSystemPreferencesPrintingErrorHandling SBSystemPreferencesPrintingErrorHandling; /* * Standard Suite */ // The application's top-level scripting object. @interface SBSystemPreferencesApplication : SBApplication - (SBElementArray*)documents; - (SBElementArray*)windows; @property(copy, readonly) NSString* name; // The name of the application. @property(readonly) BOOL frontmost; // Is this the active application? @property(copy, readonly) NSString* version; // The version number of the application. - (id)open:(id)x; // Open a document. - (void)print:(id)x withProperties:(NSDictionary*)withProperties printDialog:(BOOL)printDialog; // Print a document. - (void)quitSaving: (SBSystemPreferencesSaveOptions)saving; // Quit the application. - (BOOL)exists:(id)x; // Verify that an object exists. @end // A document. @interface SBSystemPreferencesDocument : SBObject @property(copy, readonly) NSString* name; // Its name. @property(readonly) BOOL modified; // Has it been modified since the last save? @property(copy, readonly) NSURL* file; // Its location on disk, if it has one. - (void)closeSaving:(SBSystemPreferencesSaveOptions)saving savingIn:(NSURL*)savingIn; // Close a document. - (void)saveIn:(NSURL*)in_ as:(id)as; // Save a document. - (void)printWithProperties:(NSDictionary*)withProperties printDialog:(BOOL)printDialog; // Print a document. - (void) delete; // Delete an object. - (void)duplicateTo:(SBObject*)to withProperties:(NSDictionary*)withProperties; // Copy an object. - (void)moveTo:(SBObject*)to; // Move an object to a new location. @end // A window. @interface SBSystemPreferencesWindow : SBObject @property(copy, readonly) NSString* name; // The title of the window. - (NSInteger)id; // The unique identifier of the window. @property NSInteger index; // The index of the window, ordered front to back. @property NSRect bounds; // The bounding rectangle of the window. @property(readonly) BOOL closeable; // Does the window have a close button? @property(readonly) BOOL miniaturizable; // Does the window have a minimize button? @property BOOL miniaturized; // Is the window minimized right now? @property(readonly) BOOL resizable; // Can the window be resized? @property BOOL visible; // Is the window visible right now? @property(readonly) BOOL zoomable; // Does the window have a zoom button? @property BOOL zoomed; // Is the window zoomed right now? @property(copy, readonly) SBSystemPreferencesDocument* document; // The document whose contents are displayed in the window. - (void)closeSaving:(SBSystemPreferencesSaveOptions)saving savingIn:(NSURL*)savingIn; // Close a document. - (void)saveIn:(NSURL*)in_ as:(id)as; // Save a document. - (void)printWithProperties:(NSDictionary*)withProperties printDialog:(BOOL)printDialog; // Print a document. - (void) delete; // Delete an object. - (void)duplicateTo:(SBObject*)to withProperties:(NSDictionary*)withProperties; // Copy an object. - (void)moveTo:(SBObject*)to; // Move an object to a new location. @end /* * System Preferences */ // System Preferences top level scripting object @interface SBSystemPreferencesApplication (SystemPreferences) - (SBElementArray*)panes; @property(copy) SBSystemPreferencesPane* currentPane; // the currently selected pane @property(copy, readonly) SBSystemPreferencesWindow* preferencesWindow; // the main preferences window @property BOOL showAll; // Is SystemPrefs in show all view. (Setting to false // will do nothing) @end // a preference pane @interface SBSystemPreferencesPane : SBObject - (SBElementArray*)anchors; - (NSString*)id; // locale independent name of the preference pane; can refer // to a pane using the expression: pane id "" @property(copy, readonly) NSString* localizedName; // localized name of the preference pane @property(copy, readonly) NSString* name; // name of the preference pane as it // appears in the title bar; can // refer to a pane using the // expression: pane "" - (void)closeSaving:(SBSystemPreferencesSaveOptions)saving savingIn:(NSURL*)savingIn; // Close a document. - (void)saveIn:(NSURL*)in_ as:(id)as; // Save a document. - (void)printWithProperties:(NSDictionary*)withProperties printDialog:(BOOL)printDialog; // Print a document. - (void) delete; // Delete an object. - (void)duplicateTo:(SBObject*)to withProperties:(NSDictionary*)withProperties; // Copy an object. - (void)moveTo:(SBObject*)to; // Move an object to a new location. - (id)reveal; // Reveals an anchor within a preference pane or preference pane // itself @end // an anchor within a preference pane @interface SBSystemPreferencesAnchor : SBObject @property(copy, readonly) NSString* name; // name of the anchor within a preference pane - (void)closeSaving:(SBSystemPreferencesSaveOptions)saving savingIn:(NSURL*)savingIn; // Close a document. - (void)saveIn:(NSURL*)in_ as:(id)as; // Save a document. - (void)printWithProperties:(NSDictionary*)withProperties printDialog:(BOOL)printDialog; // Print a document. - (void) delete; // Delete an object. - (void)duplicateTo:(SBObject*)to withProperties:(NSDictionary*)withProperties; // Copy an object. - (void)moveTo:(SBObject*)to; // Move an object to a new location. - (id)reveal; // Reveals an anchor within a preference pane or preference pane // itself @end clementine-1.2.3+git1354-gdaddbde+dfsg/src/main.cpp000066400000000000000000000360731260417502300216170ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include #include #ifdef Q_OS_WIN32 #define _WIN32_WINNT 0x0600 #include #include #endif // Q_OS_WIN32 #ifdef Q_OS_UNIX #include #endif // Q_OS_UNIX #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "core/application.h" #include "core/commandlineoptions.h" #include "core/crashreporting.h" #include "core/database.h" #include "core/logging.h" #include "core/mac_startup.h" #include "core/metatypes.h" #include "core/network.h" #include "core/networkproxyfactory.h" #include "core/potranslator.h" #include "core/song.h" #include "core/ubuntuunityhack.h" #include "core/utilities.h" #include "covers/amazoncoverprovider.h" #include "covers/coverproviders.h" #include "covers/musicbrainzcoverprovider.h" #include "engines/enginebase.h" #include "smartplaylists/generator.h" #include "ui/iconloader.h" #include "ui/mainwindow.h" #include "ui/systemtrayicon.h" #include "version.h" #include "widgets/osd.h" #include "tagreadermessages.pb.h" #include "qtsingleapplication.h" #include "qtsinglecoreapplication.h" #include #include #include #include #ifdef Q_OS_DARWIN #include #include #endif #ifdef HAVE_LIBLASTFM #include "internet/lastfm/lastfmservice.h" #else class LastFMService; #endif #ifdef HAVE_DBUS #include "core/mpris.h" #include "core/mpris2.h" #include #include QDBusArgument& operator<<(QDBusArgument& arg, const QImage& image); const QDBusArgument& operator>>(const QDBusArgument& arg, QImage& image); #endif #ifdef Q_OS_WIN32 #include #endif // Load sqlite plugin on windows and mac. #include Q_IMPORT_PLUGIN(qsqlite) namespace { void LoadTranslation(const QString& prefix, const QString& path, const QString& language) { #if QT_VERSION < 0x040700 // QTranslator::load will try to open and read "clementine" if it exists, // without checking if it's a file first. // This was fixed in Qt 4.7 QFileInfo maybe_clementine_directory(path + "/clementine"); if (maybe_clementine_directory.exists() && !maybe_clementine_directory.isFile()) return; #endif QTranslator* t = new PoTranslator; if (t->load(prefix + "_" + language, path)) QCoreApplication::installTranslator(t); else delete t; QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); } void IncreaseFDLimit() { #ifdef Q_OS_DARWIN // Bump the soft limit for the number of file descriptors from the default of // 256 to // the maximum (usually 10240). struct rlimit limit; getrlimit(RLIMIT_NOFILE, &limit); // getrlimit() lies about the hard limit so we have to check sysctl. int max_fd = 0; size_t len = sizeof(max_fd); sysctlbyname("kern.maxfilesperproc", &max_fd, &len, nullptr, 0); limit.rlim_cur = max_fd; int ret = setrlimit(RLIMIT_NOFILE, &limit); if (ret == 0) { qLog(Debug) << "Max fd:" << max_fd; } #endif } void SetEnv(const char* key, const QString& value) { #ifdef Q_OS_WIN32 putenv(QString("%1=%2").arg(key, value).toLocal8Bit().constData()); #else setenv(key, value.toLocal8Bit().constData(), 1); #endif } // This must be done early so that the spotify blob process also picks up // these environment variables. void SetGstreamerEnvironment() { QString scanner_path; QString plugin_path; QString registry_filename; // On windows and mac we bundle the gstreamer plugins with clementine #if defined(Q_OS_DARWIN) scanner_path = QCoreApplication::applicationDirPath() + "/../PlugIns/gst-plugin-scanner"; plugin_path = QCoreApplication::applicationDirPath() + "/../PlugIns/gstreamer"; #elif defined(Q_OS_WIN32) plugin_path = QCoreApplication::applicationDirPath() + "/gstreamer-plugins"; #endif #if defined(Q_OS_WIN32) || defined(Q_OS_DARWIN) registry_filename = Utilities::GetConfigPath(Utilities::Path_GstreamerRegistry); #endif if (!scanner_path.isEmpty()) SetEnv("GST_PLUGIN_SCANNER", scanner_path); if (!plugin_path.isEmpty()) { SetEnv("GST_PLUGIN_PATH", plugin_path); // Never load plugins from anywhere else. SetEnv("GST_PLUGIN_SYSTEM_PATH", plugin_path); } if (!registry_filename.isEmpty()) { SetEnv("GST_REGISTRY", registry_filename); } #ifdef Q_OS_DARWIN SetEnv("GIO_EXTRA_MODULES", QCoreApplication::applicationDirPath() + "/../PlugIns/gio-modules"); #endif SetEnv("PULSE_PROP_media.role", "music"); } void ParseAProto() { const QByteArray data = QByteArray::fromHex( "08001a8b010a8801b2014566696c653a2f2f2f453a2f4d7573696b2f28414c42554d2" "9253230476f74616e25323050726f6a6563742532302d253230416d6269656e742532" "304c6f756e67652e6d786dba012a28414c42554d2920476f74616e2050726f6a65637" "4202d20416d6269656e74204c6f756e67652e6d786dc001c7a7efd104c801bad685e4" "04d001eeca32"); pb::tagreader::Message message; message.ParseFromArray(data.constData(), data.size()); } void CheckPortable() { QFile f(QApplication::applicationDirPath() + QDir::separator() + "data"); if (f.exists()) { // We are portable. Set the bool and change the qsettings path Application::kIsPortable = true; QSettings::setDefaultFormat(QSettings::IniFormat); QSettings::setPath(QSettings::IniFormat, QSettings::UserScope, f.fileName()); } } } // namespace #ifdef HAVE_GIO #undef signals // Clashes with GIO, and not needed in this file #include namespace { void ScanGIOModulePath() { QString gio_module_path; #if defined(Q_OS_WIN32) gio_module_path = QCoreApplication::applicationDirPath() + "/gio-modules"; #endif if (!gio_module_path.isEmpty()) { qLog(Debug) << "Adding GIO module path:" << gio_module_path; QByteArray bytes = gio_module_path.toLocal8Bit(); g_io_modules_scan_all_in_directory(bytes.data()); } } } // namespace #endif // HAVE_GIO int main(int argc, char* argv[]) { if (CrashReporting::SendCrashReport(argc, argv)) { return 0; } CrashReporting crash_reporting; #ifdef Q_OS_DARWIN // Do Mac specific startup to get media keys working. // This must go before QApplication initialisation. mac::MacMain(); if (QSysInfo::MacintoshVersion > QSysInfo::MV_10_8) { // Work around 10.9 issue. // https://bugreports.qt-project.org/browse/QTBUG-32789 QFont::insertSubstitution(".Lucida Grande UI", "Lucida Grande"); } #endif QCoreApplication::setApplicationName("Clementine"); QCoreApplication::setApplicationVersion(CLEMENTINE_VERSION_DISPLAY); QCoreApplication::setOrganizationName("Clementine"); QCoreApplication::setOrganizationDomain("clementine-player.org"); // This makes us show up nicely in gnome-volume-control #if !GLIB_CHECK_VERSION(2, 36, 0) g_type_init(); // Deprecated in glib 2.36.0 #endif g_set_application_name(QCoreApplication::applicationName().toLocal8Bit()); RegisterMetaTypes(); // Initialise logging. Log levels are set after the commandline options are // parsed below. logging::Init(); g_log_set_default_handler(reinterpret_cast(&logging::GLog), nullptr); CommandlineOptions options(argc, argv); { // Only start a core application now so we can check if there's another // Clementine running without needing an X server. // This MUST be done before parsing the commandline options so QTextCodec // gets the right system locale for filenames. QtSingleCoreApplication a(argc, argv); CheckPortable(); crash_reporting.SetApplicationPath(a.applicationFilePath()); // Parse commandline options - need to do this before starting the // full QApplication so it works without an X server if (!options.Parse()) return 1; logging::SetLevels(options.log_levels()); if (a.isRunning()) { if (options.is_empty()) { qLog(Info) << "Clementine is already running - activating existing window"; } if (a.sendMessage(options.Serialize(), 5000)) { return 0; } // Couldn't send the message so start anyway } } #ifdef Q_OS_DARWIN // Must happen after QCoreApplication::setOrganizationName(). setenv( "XDG_CONFIG_HOME", Utilities::GetConfigPath(Utilities::Path_Root).toLocal8Bit().constData(), 1); #endif #ifdef HAVE_LIBLASTFM lastfm::ws::ApiKey = LastFMService::kApiKey; lastfm::ws::SharedSecret = LastFMService::kSecret; lastfm::setNetworkAccessManager(new NetworkAccessManager); #endif // Output the version, so when people attach log output to bug reports they // don't have to tell us which version they're using. qLog(Info) << "Clementine" << CLEMENTINE_VERSION_DISPLAY; // Seed the random number generators. time_t t = time(nullptr); srand(t); qsrand(t); IncreaseFDLimit(); QtSingleApplication a(argc, argv); // A bug in Qt means the wheel_scroll_lines setting gets ignored and replaced // with the default value of 3 in QApplicationPrivate::initialize. { QSettings qt_settings(QSettings::UserScope, "Trolltech"); qt_settings.beginGroup("Qt"); QApplication::setWheelScrollLines( qt_settings.value("wheelScrollLines", QApplication::wheelScrollLines()) .toInt()); } #ifdef Q_OS_DARWIN QCoreApplication::setLibraryPaths( QStringList() << QCoreApplication::applicationDirPath() + "/../PlugIns"); #endif a.setQuitOnLastWindowClosed(false); // Do this check again because another instance might have started by now if (a.isRunning() && a.sendMessage(options.Serialize(), 5000)) { return 0; } #ifndef Q_OS_DARWIN // Gnome on Ubuntu has menu icons disabled by default. I think that's a bad // idea, and makes some menus in Clementine look confusing. QCoreApplication::setAttribute(Qt::AA_DontShowIconsInMenus, false); #else QCoreApplication::setAttribute(Qt::AA_DontShowIconsInMenus, true); // Fixes focus issue with NSSearchField, see QTBUG-11401 QCoreApplication::setAttribute(Qt::AA_NativeWindows, true); #endif SetGstreamerEnvironment(); // Set the permissions on the config file on Unix - it can contain passwords // for internet services so it's important that other users can't read it. // On Windows these are stored in the registry instead. #ifdef Q_OS_UNIX { QSettings s; // Create the file if it doesn't exist already if (!QFile::exists(s.fileName())) { QFile file(s.fileName()); file.open(QIODevice::WriteOnly); } // Set -rw------- QFile::setPermissions(s.fileName(), QFile::ReadOwner | QFile::WriteOwner); } #endif // Resources Q_INIT_RESOURCE(data); Q_INIT_RESOURCE(translations); // Add root CA cert for SoundCloud, whose certificate is missing on OS X. QSslSocket::addDefaultCaCertificates( QSslCertificate::fromPath(":/soundcloud-ca.pem", QSsl::Pem)); QSslSocket::addDefaultCaCertificates( QSslCertificate::fromPath(":/Equifax_Secure_Certificate_Authority.pem", QSsl::Pem)); // Has the user forced a different language? QString override_language = options.language(); if (override_language.isEmpty()) { QSettings s; s.beginGroup("General"); override_language = s.value("language").toString(); } const QString language = override_language.isEmpty() ? Utilities::SystemLanguageName() : override_language; // Translations LoadTranslation("qt", QLibraryInfo::location(QLibraryInfo::TranslationsPath), language); LoadTranslation("clementine", ":/translations", language); LoadTranslation("clementine", a.applicationDirPath(), language); LoadTranslation("clementine", QDir::currentPath(), language); #ifdef Q_OS_WIN32 // Set the language for qtsparkle qtsparkle::LoadTranslations(language); #endif // Icons IconLoader::Init(); // This is a nasty hack to ensure that everything in libprotobuf is // initialised in the main thread. It fixes issue 3265 but nobody knows why. // Don't remove this unless you can reproduce the error that it fixes. ParseAProto(); QtConcurrent::run(&ParseAProto); Application app; app.set_language_name(language); Echonest::Config::instance()->setAPIKey("DFLFLJBUF4EGTXHIG"); Echonest::Config::instance()->setNetworkAccessManager( new NetworkAccessManager); // Network proxy QNetworkProxyFactory::setApplicationProxyFactory( NetworkProxyFactory::Instance()); // Initialize the repository of cover providers. Last.fm registers itself // when its service is created. app.cover_providers()->AddProvider(new AmazonCoverProvider); app.cover_providers()->AddProvider(new MusicbrainzCoverProvider); #ifdef Q_OS_LINUX // In 11.04 Ubuntu decided that the system tray should be reserved for certain // whitelisted applications. Clementine will override this setting and insert // itself into the list of whitelisted apps. UbuntuUnityHack hack; #endif // Q_OS_LINUX // Create the tray icon and OSD std::unique_ptr tray_icon( SystemTrayIcon::CreateSystemTrayIcon()); OSD osd(tray_icon.get(), &app); #ifdef HAVE_DBUS mpris::Mpris mpris(&app); #endif // Window MainWindow w(&app, tray_icon.get(), &osd); #ifdef Q_OS_DARWIN mac::EnableFullScreen(w); #endif // Q_OS_DARWIN #ifdef HAVE_GIO ScanGIOModulePath(); #endif #ifdef HAVE_DBUS QObject::connect(&mpris, SIGNAL(RaiseMainWindow()), &w, SLOT(Raise())); #endif QObject::connect(&a, SIGNAL(messageReceived(QByteArray)), &w, SLOT(CommandlineOptionsReceived(QByteArray))); w.CommandlineOptionsReceived(options); int ret = a.exec(); #ifdef Q_OS_LINUX // The nvidia driver would cause Clementine (or any application that used // opengl) to use 100% cpu on shutdown. See: // http://code.google.com/p/clementine-player/issues/detail?id=2088 // https://bugs.gentoo.org/show_bug.cgi?id=375615 // Work around this problem by exiting immediately (and not running the buggy // nvidia atexit shutdown handler) if we're using one of the affected versions // of the nvidia driver. QFile self_maps("/proc/self/maps"); if (self_maps.open(QIODevice::ReadOnly)) { QByteArray data = self_maps.readAll(); if (data.contains("libnvidia-tls.so.")) { qLog(Warning) << "Exiting immediately to work around NVIDIA driver bug"; _exit(ret); } self_maps.close(); } #endif return ret; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/moodbar/000077500000000000000000000000001260417502300216015ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/moodbar/moodbarbuilder.cpp000066400000000000000000000111001260417502300252700ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "moodbarbuilder.h" #include "core/arraysize.h" #include namespace { static const int sBarkBands[] = { 100, 200, 300, 400, 510, 630, 770, 920, 1080, 1270, 1480, 1720, 2000, 2320, 2700, 3150, 3700, 4400, 5300, 6400, 7700, 9500, 12000, 15500}; static const int sBarkBandCount = arraysize(sBarkBands); } // namespace MoodbarBuilder::MoodbarBuilder() : bands_(0), rate_hz_(0) {} int MoodbarBuilder::BandFrequency(int band) const { return ((rate_hz_ / 2) * band + rate_hz_ / 4) / bands_; } void MoodbarBuilder::Init(int bands, int rate_hz) { bands_ = bands; rate_hz_ = rate_hz; barkband_table_.clear(); barkband_table_.reserve(bands + 1); int barkband = 0; for (int i = 0; i < bands + 1; ++i) { if (barkband < sBarkBandCount - 1 && BandFrequency(i) >= sBarkBands[barkband]) { barkband++; } barkband_table_.append(barkband); } } void MoodbarBuilder::AddFrame(const double* magnitudes, int size) { if (size > barkband_table_.length()) { return; } // Calculate total magnitudes for different bark bands. double bands[sBarkBandCount]; for (int i = 0; i < sBarkBandCount; ++i) { bands[i] = 0.0; } for (int i = 0; i < size; ++i) { bands[barkband_table_[i]] += magnitudes[i]; } // Now divide the bark bands into thirds and compute their total amplitudes. double rgb[] = {0, 0, 0}; for (int i = 0; i < sBarkBandCount; ++i) { rgb[(i * 3) / sBarkBandCount] += bands[i] * bands[i]; } frames_.append(Rgb(sqrt(rgb[0]), sqrt(rgb[1]), sqrt(rgb[2]))); } void MoodbarBuilder::Normalize(QList* vals, double Rgb::*member) { double mini = vals->at(0).*member; double maxi = vals->at(0).*member; for (int i = 1; i < vals->count(); i++) { const double value = vals->at(i).*member; if (value > maxi) { maxi = value; } else if (value < mini) { mini = value; } } double avg = 0; int t = 0; for (const Rgb& rgb : *vals) { const double value = rgb.*member; if (value != mini && value != maxi) { avg += value / vals->count(); t++; } } double tu = 0; double tb = 0; double avgu = 0; double avgb = 0; for (const Rgb& rgb : *vals) { const double value = rgb.*member; if (value != mini && value != maxi) { if (value > avg) { avgu += value; tu++; } else { avgb += value; tb++; } } } avgu /= tu; avgb /= tb; tu = 0; tb = 0; double avguu = 0; double avgbb = 0; for (const Rgb& rgb : *vals) { const double value = rgb.*member; if (value != mini && value != maxi) { if (value > avgu) { avguu += value; tu++; } else if (value < avgb) { avgbb += value; tb++; } } } avguu /= tu; avgbb /= tb; mini = std::max(avg + (avgb - avg) * 2, avgbb); maxi = std::min(avg + (avgu - avg) * 2, avguu); double delta = maxi - mini; if (delta == 0) { delta = 1; } for (auto it = vals->begin(); it != vals->end(); ++it) { double* value = &((*it).*member); *value = std::isfinite(*value) ? qBound(0.0, (*value - mini) / delta, 1.0) : 0; } } QByteArray MoodbarBuilder::Finish(int width) { QByteArray ret; ret.resize(width * 3); char* data = ret.data(); if (frames_.count() == 0) return ret; Normalize(&frames_, &Rgb::r); Normalize(&frames_, &Rgb::g); Normalize(&frames_, &Rgb::b); for (int i = 0; i < width; ++i) { Rgb rgb; int start = i * frames_.count() / width; int end = (i + 1) * frames_.count() / width; if (start == end) { end = start + 1; } for (int j = start; j < end; j++) { const Rgb& frame = frames_[j]; rgb.r += frame.r * 255; rgb.g += frame.g * 255; rgb.b += frame.b * 255; } const int n = end - start; *(data++) = rgb.r / n; *(data++) = rgb.g / n; *(data++) = rgb.b / n; } return ret; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/moodbar/moodbarbuilder.h000066400000000000000000000025221260417502300247450ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MOODBARBUILDER_H #define MOODBARBUILDER_H #include #include class MoodbarBuilder { public: MoodbarBuilder(); void Init(int bands, int rate_hz); void AddFrame(const double* magnitudes, int size); QByteArray Finish(int width); private: struct Rgb { Rgb() : r(0), g(0), b(0) {} Rgb(double r_, double g_, double b_) : r(r_), g(g_), b(b_) {} double r, g, b; }; int BandFrequency(int band) const; static void Normalize(QList* vals, double Rgb::*member); QList barkband_table_; int bands_; int rate_hz_; QList frames_; }; #endif // MOODBARBUILDER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/moodbar/moodbarcontroller.cpp000066400000000000000000000053011260417502300260330ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "moodbarcontroller.h" #include "moodbarloader.h" #include "moodbarpipeline.h" #include "core/application.h" #include "core/closure.h" #include "core/logging.h" #include "core/player.h" #include "playlist/playlistmanager.h" MoodbarController::MoodbarController(Application* app, QObject* parent) : QObject(parent), app_(app) { connect(app_->playlist_manager(), SIGNAL(CurrentSongChanged(Song)), SLOT(CurrentSongChanged(Song))); connect(app_->player(), SIGNAL(Stopped()), SLOT(PlaybackStopped())); } void MoodbarController::CurrentSongChanged(const Song& song) { QByteArray data; MoodbarPipeline* pipeline = nullptr; const MoodbarLoader::Result result = app_->moodbar_loader()->Load(song.url(), &data, &pipeline); switch (result) { case MoodbarLoader::CannotLoad: emit CurrentMoodbarDataChanged(QByteArray()); break; case MoodbarLoader::Loaded: emit CurrentMoodbarDataChanged(data); break; case MoodbarLoader::WillLoadAsync: // Emit an empty array for now so the GUI reverts to a normal progress // bar. Our slot will be called when the data is actually loaded. emit CurrentMoodbarDataChanged(QByteArray()); NewClosure(pipeline, SIGNAL(Finished(bool)), this, SLOT(AsyncLoadComplete(MoodbarPipeline*, QUrl)), pipeline, song.url()); break; } } void MoodbarController::PlaybackStopped() { emit CurrentMoodbarDataChanged(QByteArray()); } void MoodbarController::AsyncLoadComplete(MoodbarPipeline* pipeline, const QUrl& url) { // Is this song still playing? PlaylistItemPtr current_item = app_->player()->GetCurrentItem(); if (current_item && current_item->Url() != url) { return; } // Did we stop the song? switch(app_->player()->GetState()) { case Engine::Error: case Engine::Empty: case Engine::Idle: return; default: break; } emit CurrentMoodbarDataChanged(pipeline->data()); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/moodbar/moodbarcontroller.h000066400000000000000000000024241260417502300255030ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MOODBARCONTROLLER_H #define MOODBARCONTROLLER_H #include class Application; class MoodbarPipeline; class Song; class QUrl; class MoodbarController : public QObject { Q_OBJECT public: MoodbarController(Application* app, QObject* parent = nullptr); signals: void CurrentMoodbarDataChanged(const QByteArray& data); private slots: void CurrentSongChanged(const Song& song); void PlaybackStopped(); void AsyncLoadComplete(MoodbarPipeline* pipeline, const QUrl& url); private: Application* app_; }; #endif // MOODBARCONTROLLER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/moodbar/moodbaritemdelegate.cpp000066400000000000000000000173241260417502300263110ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "moodbaritemdelegate.h" #include "moodbarloader.h" #include "moodbarpipeline.h" #include "moodbarrenderer.h" #include "core/application.h" #include "core/closure.h" #include "core/qhash_qurl.h" #include "playlist/playlist.h" #include "playlist/playlistview.h" #include #include #include #include #include MoodbarItemDelegate::Data::Data() : state_(State_None) {} MoodbarItemDelegate::MoodbarItemDelegate(Application* app, PlaylistView* view, QObject* parent) : QItemDelegate(parent), app_(app), view_(view), style_(MoodbarRenderer::Style_Normal) { connect(app_, SIGNAL(SettingsChanged()), SLOT(ReloadSettings())); ReloadSettings(); } void MoodbarItemDelegate::ReloadSettings() { QSettings s; s.beginGroup("Moodbar"); MoodbarRenderer::MoodbarStyle new_style = static_cast( s.value("style", MoodbarRenderer::Style_Normal).toInt()); if (new_style != style_) { style_ = new_style; ReloadAllColors(); } } void MoodbarItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { QPixmap pixmap = const_cast(this) ->PixmapForIndex(index, option.rect.size()); drawBackground(painter, option, index); if (!pixmap.isNull()) { // Make a little border for the moodbar const QRect moodbar_rect(option.rect.adjusted(1, 1, -1, -1)); painter->drawPixmap(moodbar_rect, pixmap); } } QPixmap MoodbarItemDelegate::PixmapForIndex(const QModelIndex& index, const QSize& size) { // Pixmaps are keyed off URL. const QUrl url( index.sibling(index.row(), Playlist::Column_Filename).data().toUrl()); Data* data = data_[url]; if (!data) { data = new Data; data_.insert(url, data); } data->indexes_.insert(index); data->desired_size_ = size; switch (data->state_) { case Data::State_CannotLoad: case Data::State_LoadingData: case Data::State_LoadingColors: case Data::State_LoadingImage: return data->pixmap_; case Data::State_Loaded: // Is the pixmap the right size? if (data->pixmap_.size() != size) { StartLoadingImage(url, data); } return data->pixmap_; case Data::State_None: break; } // We have to start loading the data from scratch. StartLoadingData(url, data); return QPixmap(); } void MoodbarItemDelegate::StartLoadingData(const QUrl& url, Data* data) { data->state_ = Data::State_LoadingData; // Load a mood file for this song and generate some colors from it QByteArray bytes; MoodbarPipeline* pipeline = nullptr; switch (app_->moodbar_loader()->Load(url, &bytes, &pipeline)) { case MoodbarLoader::CannotLoad: data->state_ = Data::State_CannotLoad; break; case MoodbarLoader::Loaded: // We got the data immediately. StartLoadingColors(url, bytes, data); break; case MoodbarLoader::WillLoadAsync: // Maybe in a little while. NewClosure(pipeline, SIGNAL(Finished(bool)), this, SLOT(DataLoaded(QUrl, MoodbarPipeline*)), url, pipeline); break; } } bool MoodbarItemDelegate::RemoveFromCacheIfIndexesInvalid(const QUrl& url, Data* data) { for (const QPersistentModelIndex& index : data->indexes_) { if (index.isValid()) { return false; } } data_.remove(url); return true; } void MoodbarItemDelegate::ReloadAllColors() { for (const QUrl& url : data_.keys()) { Data* data = data_[url]; if (data->state_ == Data::State_Loaded) { StartLoadingData(url, data); } } } void MoodbarItemDelegate::DataLoaded(const QUrl& url, MoodbarPipeline* pipeline) { Data* data = data_[url]; if (!data) { return; } if (RemoveFromCacheIfIndexesInvalid(url, data)) { return; } if (!pipeline->success()) { data->state_ = Data::State_CannotLoad; return; } // Load the colors next. StartLoadingColors(url, pipeline->data(), data); } void MoodbarItemDelegate::StartLoadingColors(const QUrl& url, const QByteArray& bytes, Data* data) { data->state_ = Data::State_LoadingColors; QFutureWatcher* watcher = new QFutureWatcher(); NewClosure(watcher, SIGNAL(finished()), this, SLOT(ColorsLoaded(QUrl, QFutureWatcher*)), url, watcher); QFuture future = QtConcurrent::run( MoodbarRenderer::Colors, bytes, style_, qApp->palette()); watcher->setFuture(future); } void MoodbarItemDelegate::ColorsLoaded(const QUrl& url, QFutureWatcher* watcher) { watcher->deleteLater(); Data* data = data_[url]; if (!data) { return; } if (RemoveFromCacheIfIndexesInvalid(url, data)) { return; } data->colors_ = watcher->result(); // Load the image next. StartLoadingImage(url, data); } void MoodbarItemDelegate::StartLoadingImage(const QUrl& url, Data* data) { data->state_ = Data::State_LoadingImage; QFutureWatcher* watcher = new QFutureWatcher(); NewClosure(watcher, SIGNAL(finished()), this, SLOT(ImageLoaded(QUrl, QFutureWatcher*)), url, watcher); QFuture future = QtConcurrent::run( MoodbarRenderer::RenderToImage, data->colors_, data->desired_size_); watcher->setFuture(future); } void MoodbarItemDelegate::ImageLoaded(const QUrl& url, QFutureWatcher* watcher) { watcher->deleteLater(); Data* data = data_[url]; if (!data) { return; } if (RemoveFromCacheIfIndexesInvalid(url, data)) { return; } QImage image(watcher->result()); // If the desired size changed then don't even bother converting the image // to a pixmap, just reload it at the new size. if (!image.isNull() && data->desired_size_ != image.size()) { StartLoadingImage(url, data); return; } data->pixmap_ = QPixmap::fromImage(image); data->state_ = Data::State_Loaded; Playlist* playlist = view_->playlist(); const QSortFilterProxyModel* filter = playlist->proxy(); // Update all the indices with the new pixmap. for (const QPersistentModelIndex& index : data->indexes_) { if (index.isValid() && index.sibling(index.row(), Playlist::Column_Filename).data().toUrl() == url) { QModelIndex source_index = index; if (index.model() == filter) { source_index = filter->mapToSource(source_index); } if (source_index.model() != playlist) { // The pixmap was for an index in a different playlist, maybe the user // switched to a different one. continue; } playlist->MoodbarUpdated(source_index); } } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/moodbar/moodbaritemdelegate.h000066400000000000000000000045541260417502300257570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MOODBARITEMDELEGATE_H #define MOODBARITEMDELEGATE_H #include "moodbarrenderer.h" #include #include #include #include class Application; class MoodbarPipeline; class PlaylistView; class QModelIndex; class MoodbarItemDelegate : public QItemDelegate { Q_OBJECT public: MoodbarItemDelegate(Application* app, PlaylistView* view, QObject* parent = nullptr); void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; private slots: void ReloadSettings(); void DataLoaded(const QUrl& url, MoodbarPipeline* pipeline); void ColorsLoaded(const QUrl& url, QFutureWatcher* watcher); void ImageLoaded(const QUrl& url, QFutureWatcher* watcher); private: struct Data { Data(); enum State { State_None, State_CannotLoad, State_LoadingData, State_LoadingColors, State_LoadingImage, State_Loaded }; QSet indexes_; State state_; ColorVector colors_; QSize desired_size_; QPixmap pixmap_; }; private: QPixmap PixmapForIndex(const QModelIndex& index, const QSize& size); void StartLoadingData(const QUrl& url, Data* data); void StartLoadingColors(const QUrl& url, const QByteArray& bytes, Data* data); void StartLoadingImage(const QUrl& url, Data* data); bool RemoveFromCacheIfIndexesInvalid(const QUrl& url, Data* data); void ReloadAllColors(); private: Application* app_; PlaylistView* view_; QCache data_; MoodbarRenderer::MoodbarStyle style_; }; #endif // MOODBARITEMDELEGATE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/moodbar/moodbarloader.cpp000066400000000000000000000135161260417502300251250ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "moodbarloader.h" #include #include #include #include #include #include #include #include #include "moodbarpipeline.h" #include "core/application.h" #include "core/closure.h" #include "core/logging.h" #include "core/qhash_qurl.h" #include "core/utilities.h" #ifdef Q_OS_WIN32 #include #endif MoodbarLoader::MoodbarLoader(Application* app, QObject* parent) : QObject(parent), cache_(new QNetworkDiskCache(this)), thread_(new QThread(this)), kMaxActiveRequests(qMax(1, QThread::idealThreadCount() / 2)), save_alongside_originals_(false), disable_moodbar_calculation_(false) { cache_->setCacheDirectory( Utilities::GetConfigPath(Utilities::Path_MoodbarCache)); cache_->setMaximumCacheSize(60 * 1024 * 1024); // 60MB - enough for 20,000 moodbars connect(app, SIGNAL(SettingsChanged()), SLOT(ReloadSettings())); ReloadSettings(); } MoodbarLoader::~MoodbarLoader() { thread_->quit(); thread_->wait(1000); } void MoodbarLoader::ReloadSettings() { QSettings s; s.beginGroup("Moodbar"); save_alongside_originals_ = s.value("save_alongside_originals", false).toBool(); disable_moodbar_calculation_ = !s.value("calculate", true).toBool(); MaybeTakeNextRequest(); } QStringList MoodbarLoader::MoodFilenames(const QString& song_filename) { const QFileInfo file_info(song_filename); const QString dir_path(file_info.dir().path()); QStringList parts(file_info.fileName().split('.')); parts.removeLast(); parts.append("mood"); const QString mood_filename(parts.join(".")); return QStringList() << dir_path + "/." + mood_filename << dir_path + "/" + mood_filename; } MoodbarLoader::Result MoodbarLoader::Load(const QUrl& url, QByteArray* data, MoodbarPipeline** async_pipeline) { if (url.scheme() != "file") { return CannotLoad; } // Are we in the middle of loading this moodbar already? if (requests_.contains(url)) { *async_pipeline = requests_[url]; return WillLoadAsync; } // Check if a mood file exists for this file already const QString filename(url.toLocalFile()); for (const QString& possible_mood_file : MoodFilenames(filename)) { QFile f(possible_mood_file); if (f.open(QIODevice::ReadOnly)) { qLog(Info) << "Loading moodbar data from" << possible_mood_file; *data = f.readAll(); return Loaded; } } // Maybe it exists in the cache? std::unique_ptr cache_device(cache_->data(url)); if (cache_device) { qLog(Info) << "Loading cached moodbar data for" << filename; *data = cache_device->readAll(); if (!data->isEmpty()) { return Loaded; } } if (!thread_->isRunning()) thread_->start(QThread::IdlePriority); // There was no existing file, analyze the audio file and create one. MoodbarPipeline* pipeline = new MoodbarPipeline(url); pipeline->moveToThread(thread_); NewClosure(pipeline, SIGNAL(Finished(bool)), this, SLOT(RequestFinished(MoodbarPipeline*, QUrl)), pipeline, url); requests_[url] = pipeline; queued_requests_ << url; MaybeTakeNextRequest(); *async_pipeline = pipeline; return WillLoadAsync; } void MoodbarLoader::MaybeTakeNextRequest() { Q_ASSERT(QThread::currentThread() == qApp->thread()); if (active_requests_.count() >= kMaxActiveRequests || queued_requests_.isEmpty() || disable_moodbar_calculation_) { return; } const QUrl url = queued_requests_.takeFirst(); active_requests_ << url; qLog(Info) << "Creating moodbar data for" << url.toLocalFile(); QMetaObject::invokeMethod(requests_[url], "Start", Qt::QueuedConnection); } void MoodbarLoader::RequestFinished(MoodbarPipeline* request, const QUrl& url) { Q_ASSERT(QThread::currentThread() == qApp->thread()); if (request->success()) { qLog(Info) << "Moodbar data generated successfully for" << url.toLocalFile(); // Save the data in the cache QNetworkCacheMetaData metadata; metadata.setUrl(url); QIODevice* cache_file = cache_->prepare(metadata); if (cache_file) { cache_file->write(request->data()); cache_->insert(cache_file); } // Save the data alongside the original as well if we're configured to. if (save_alongside_originals_) { const QString mood_filename(MoodFilenames(url.toLocalFile())[0]); QFile mood_file(mood_filename); if (mood_file.open(QIODevice::WriteOnly)) { mood_file.write(request->data()); #ifdef Q_OS_WIN32 if (!SetFileAttributes((LPCTSTR)mood_filename.utf16(), FILE_ATTRIBUTE_HIDDEN)) { qLog(Warning) << "Error setting hidden attribute for file" << mood_filename; } #endif } else { qLog(Warning) << "Error opening mood file for writing" << mood_filename; } } } // Remove the request from the active list and delete it requests_.remove(url); active_requests_.remove(url); QTimer::singleShot(1000, request, SLOT(deleteLater())); MaybeTakeNextRequest(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/moodbar/moodbarloader.h000066400000000000000000000040131260417502300245620ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MOODBARLOADER_H #define MOODBARLOADER_H #include #include #include class QNetworkDiskCache; class QUrl; class Application; class MoodbarPipeline; class MoodbarLoader : public QObject { Q_OBJECT public: MoodbarLoader(Application* app, QObject* parent = nullptr); ~MoodbarLoader(); enum Result { // The URL isn't a local file or the moodbar plugin was not available - // moodbar data can never be loaded. CannotLoad, // Moodbar data was loaded and returned. Loaded, // Moodbar data will be loaded in the background, a MoodbarPipeline* was // was returned that you can connect to the Finished() signal on. WillLoadAsync }; Result Load(const QUrl& url, QByteArray* data, MoodbarPipeline** async_pipeline); private slots: void ReloadSettings(); void RequestFinished(MoodbarPipeline* request, const QUrl& filename); void MaybeTakeNextRequest(); private: static QStringList MoodFilenames(const QString& song_filename); private: QNetworkDiskCache* cache_; QThread* thread_; const int kMaxActiveRequests; QMap requests_; QList queued_requests_; QSet active_requests_; bool save_alongside_originals_; bool disable_moodbar_calculation_; }; #endif // MOODBARLOADER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/moodbar/moodbarpipeline.cpp000066400000000000000000000130101260417502300254510ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "moodbarpipeline.h" #include #include #include #include "core/logging.h" #include "core/signalchecker.h" #include "core/timeconstants.h" #include "core/utilities.h" #include "moodbar/moodbarbuilder.h" #include "gst/moodbar/gstfastspectrum.h" bool MoodbarPipeline::sIsAvailable = false; const int MoodbarPipeline::kBands = 128; MoodbarPipeline::MoodbarPipeline(const QUrl& local_filename) : QObject(nullptr), local_filename_(local_filename), pipeline_(nullptr), convert_element_(nullptr), success_(false) {} MoodbarPipeline::~MoodbarPipeline() { Cleanup(); } bool MoodbarPipeline::IsAvailable() { if (!sIsAvailable) { GstElementFactory* factory = gst_element_factory_find("fftwspectrum"); if (!factory) { return false; } gst_object_unref(factory); sIsAvailable = true; } return sIsAvailable; } GstElement* MoodbarPipeline::CreateElement(const QString& factory_name) { GstElement* ret = gst_element_factory_make(factory_name.toAscii().constData(), nullptr); if (ret) { gst_bin_add(GST_BIN(pipeline_), ret); } else { qLog(Warning) << "Unable to create gstreamer element" << factory_name; } return ret; } void MoodbarPipeline::Start() { Q_ASSERT(QThread::currentThread() != qApp->thread()); Utilities::SetThreadIOPriority(Utilities::IOPRIO_CLASS_IDLE); if (pipeline_) { return; } pipeline_ = gst_pipeline_new("moodbar-pipeline"); GstElement* decodebin = CreateElement("uridecodebin"); convert_element_ = CreateElement("audioconvert"); GstElement* spectrum = CreateElement("fastspectrum"); GstElement* fakesink = CreateElement("fakesink"); if (!decodebin || !convert_element_ || !spectrum || !fakesink) { pipeline_ = nullptr; emit Finished(false); return; } // Join them together if (!gst_element_link(convert_element_, spectrum) || !gst_element_link(spectrum, fakesink)) { qLog(Error) << "Failed to link elements"; pipeline_ = nullptr; emit Finished(false); return; } builder_.reset(new MoodbarBuilder); // Set properties g_object_set(decodebin, "uri", local_filename_.toEncoded().constData(), nullptr); g_object_set(spectrum, "bands", kBands, nullptr); GstFastSpectrum* fast_spectrum = GST_FASTSPECTRUM(spectrum); fast_spectrum->output_callback = [this]( double* magnitudes, int size) { builder_->AddFrame(magnitudes, size); }; // Connect signals CHECKED_GCONNECT(decodebin, "pad-added", &NewPadCallback, this); GstBus* bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline_)); gst_bus_set_sync_handler(bus, BusCallbackSync, this, nullptr); gst_object_unref(bus); // Start playing gst_element_set_state(pipeline_, GST_STATE_PLAYING); } void MoodbarPipeline::ReportError(GstMessage* msg) { GError* error; gchar* debugs; gst_message_parse_error(msg, &error, &debugs); QString message = QString::fromLocal8Bit(error->message); g_error_free(error); free(debugs); qLog(Error) << "Error processing" << local_filename_ << ":" << message; } void MoodbarPipeline::NewPadCallback(GstElement*, GstPad* pad, gpointer data) { MoodbarPipeline* self = reinterpret_cast(data); GstPad* const audiopad = gst_element_get_static_pad(self->convert_element_, "sink"); if (GST_PAD_IS_LINKED(audiopad)) { qLog(Warning) << "audiopad is already linked, unlinking old pad"; gst_pad_unlink(audiopad, GST_PAD_PEER(audiopad)); } gst_pad_link(pad, audiopad); gst_object_unref(audiopad); int rate = 0; GstCaps* caps = gst_pad_get_current_caps(pad); GstStructure* structure = gst_caps_get_structure(caps, 0); gst_structure_get_int(structure, "rate", &rate); gst_caps_unref(caps); self->builder_->Init(kBands, rate); } GstBusSyncReply MoodbarPipeline::BusCallbackSync(GstBus*, GstMessage* msg, gpointer data) { MoodbarPipeline* self = reinterpret_cast(data); switch (GST_MESSAGE_TYPE(msg)) { case GST_MESSAGE_EOS: self->Stop(true); break; case GST_MESSAGE_ERROR: self->ReportError(msg); self->Stop(false); break; default: break; } return GST_BUS_PASS; } void MoodbarPipeline::Stop(bool success) { success_ = success; if (builder_ != nullptr) { data_ = builder_->Finish(1000); builder_.reset(); } emit Finished(success); } void MoodbarPipeline::Cleanup() { Q_ASSERT(QThread::currentThread() == thread()); Q_ASSERT(QThread::currentThread() != qApp->thread()); if (pipeline_) { GstBus* bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline_)); gst_bus_set_sync_handler(bus, nullptr, nullptr, nullptr); gst_object_unref(bus); gst_element_set_state(pipeline_, GST_STATE_NULL); gst_object_unref(pipeline_); pipeline_ = nullptr; } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/moodbar/moodbarpipeline.h000066400000000000000000000040261260417502300251250ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MOODBARPIPELINE_H #define MOODBARPIPELINE_H #include #include #include #include #include class MoodbarBuilder; // Creates moodbar data for a single local music file. class MoodbarPipeline : public QObject { Q_OBJECT public: MoodbarPipeline(const QUrl& local_filename); ~MoodbarPipeline(); static bool IsAvailable(); bool success() const { return success_; } const QByteArray& data() const { return data_; } public slots: void Start(); signals: void Finished(bool success); private: GstElement* CreateElement(const QString& factory_name); void ReportError(GstMessage* message); void Stop(bool success); void Cleanup(); static void NewPadCallback(GstElement*, GstPad* pad, gpointer data); static GstFlowReturn NewBufferCallback(GstAppSink* app_sink, gpointer self); static gboolean BusCallback(GstBus*, GstMessage* msg, gpointer data); static GstBusSyncReply BusCallbackSync(GstBus*, GstMessage* msg, gpointer data); private: static bool sIsAvailable; static const int kBands; QUrl local_filename_; GstElement* pipeline_; GstElement* convert_element_; std::unique_ptr builder_; bool success_; QByteArray data_; }; #endif // MOODBARPIPELINE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/moodbar/moodbarproxystyle.cpp000066400000000000000000000317061260417502300261220ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "moodbarproxystyle.h" #include "core/application.h" #include "core/logging.h" #include #include #include #include #include #include #include #include #include const int MoodbarProxyStyle::kMarginSize = 3; const int MoodbarProxyStyle::kBorderSize = 1; const int MoodbarProxyStyle::kArrowWidth = 17; const int MoodbarProxyStyle::kArrowHeight = 13; MoodbarProxyStyle::MoodbarProxyStyle(Application* app, QSlider* slider) : QProxyStyle(slider->style()), app_(app), slider_(slider), enabled_(true), moodbar_style_(MoodbarRenderer::Style_Normal), state_(MoodbarOff), fade_timeline_(new QTimeLine(1000, this)), moodbar_colors_dirty_(true), moodbar_pixmap_dirty_(true), context_menu_(nullptr), show_moodbar_action_(nullptr), style_action_group_(nullptr) { slider->setStyle(this); slider->installEventFilter(this); connect(fade_timeline_, SIGNAL(valueChanged(qreal)), SLOT(FaderValueChanged(qreal))); connect(app, SIGNAL(SettingsChanged()), SLOT(ReloadSettings())); ReloadSettings(); } void MoodbarProxyStyle::ReloadSettings() { QSettings s; s.beginGroup("Moodbar"); // Get the enabled/disabled setting, and start the timelines if there's a // change. enabled_ = s.value("show", true).toBool(); NextState(); // Get the style, and redraw if there's a change. MoodbarRenderer::MoodbarStyle new_style = static_cast( s.value("style", MoodbarRenderer::Style_Normal).toInt()); if (new_style != moodbar_style_) { moodbar_style_ = new_style; moodbar_colors_dirty_ = true; slider_->update(); } } void MoodbarProxyStyle::SetMoodbarData(const QByteArray& data) { data_ = data; moodbar_colors_dirty_ = true; // Redraw next time NextState(); } void MoodbarProxyStyle::SetMoodbarEnabled(bool enabled) { enabled_ = enabled; // Save the enabled setting. QSettings s; s.beginGroup("Moodbar"); s.setValue("show", enabled); app_->ReloadSettings(); } void MoodbarProxyStyle::NextState() { const bool visible = enabled_ && !data_.isEmpty(); // While the regular slider should stay at the standard size (Fixed), // moodbars should use all available space (MinimumExpanding). slider_->setSizePolicy( QSizePolicy::Expanding, visible ? QSizePolicy::MinimumExpanding : QSizePolicy::Fixed); slider_->updateGeometry(); if (show_moodbar_action_) { show_moodbar_action_->setChecked(enabled_); } if ((visible && (state_ == MoodbarOn || state_ == FadingToOn)) || (!visible && (state_ == MoodbarOff || state_ == FadingToOff))) { return; } const QTimeLine::Direction direction = visible ? QTimeLine::Forward : QTimeLine::Backward; if (state_ == MoodbarOn || state_ == MoodbarOff) { // Start the fade from the beginning. fade_timeline_->setDirection(direction); fade_timeline_->start(); fade_source_ = QPixmap(); fade_target_ = QPixmap(); } else { // Stop an existing fade and start fading the other direction from the // same place. fade_timeline_->stop(); fade_timeline_->setDirection(direction); fade_timeline_->resume(); } state_ = visible ? FadingToOn : FadingToOff; } void MoodbarProxyStyle::FaderValueChanged(qreal value) { slider_->update(); } bool MoodbarProxyStyle::eventFilter(QObject* object, QEvent* event) { if (object == slider_) { switch (event->type()) { case QEvent::Resize: // The widget was resized, we've got to render a new pixmap. moodbar_pixmap_dirty_ = true; break; case QEvent::ContextMenu: ShowContextMenu(static_cast(event)->globalPos()); return true; default: break; } } return QProxyStyle::eventFilter(object, event); } void MoodbarProxyStyle::drawComplexControl(ComplexControl control, const QStyleOptionComplex* option, QPainter* painter, const QWidget* widget) const { if (control != CC_Slider || widget != slider_) { QProxyStyle::drawComplexControl(control, option, painter, widget); return; } const_cast(this) ->Render(control, qstyleoption_cast(option), painter, widget); } void MoodbarProxyStyle::Render(ComplexControl control, const QStyleOptionSlider* option, QPainter* painter, const QWidget* widget) { const qreal fade_value = fade_timeline_->currentValue(); // Have we finished fading? if (state_ == FadingToOn && fade_value == 1.0) { state_ = MoodbarOn; } else if (state_ == FadingToOff && fade_value == 0.0) { state_ = MoodbarOff; } switch (state_) { case FadingToOn: case FadingToOff: // Update the cached pixmaps if necessary if (fade_source_.isNull()) { // Draw the normal slider into the fade source pixmap. fade_source_ = QPixmap(option->rect.size()); fade_source_.fill( option->palette.color(QPalette::Active, QPalette::Background)); QPainter p(&fade_source_); QStyleOptionSlider opt_copy(*option); opt_copy.rect.moveTo(0, 0); QProxyStyle::drawComplexControl(control, &opt_copy, &p, widget); p.end(); } if (fade_target_.isNull()) { if (state_ == FadingToOn) { EnsureMoodbarRendered(option); } fade_target_ = moodbar_pixmap_; QPainter p(&fade_target_); DrawArrow(option, &p); p.end(); } // Blend the pixmaps into each other painter->drawPixmap(option->rect, fade_source_); painter->setOpacity(fade_value); painter->drawPixmap(option->rect, fade_target_); painter->setOpacity(1.0); break; case MoodbarOff: // It's a normal slider widget. QProxyStyle::drawComplexControl(control, option, painter, widget); break; case MoodbarOn: EnsureMoodbarRendered(option); painter->drawPixmap(option->rect, moodbar_pixmap_); DrawArrow(option, painter); break; } } void MoodbarProxyStyle::EnsureMoodbarRendered(const QStyleOptionSlider* opt) { if (moodbar_colors_dirty_) { moodbar_colors_ = MoodbarRenderer::Colors(data_, moodbar_style_, slider_->palette()); moodbar_colors_dirty_ = false; moodbar_pixmap_dirty_ = true; } if (moodbar_pixmap_dirty_) { moodbar_pixmap_ = MoodbarPixmap(moodbar_colors_, slider_->size(), slider_->palette(), opt); moodbar_pixmap_dirty_ = false; } } int MoodbarProxyStyle::GetExtraSpace(const QStyleOptionComplex* opt) const { int space_available = slider_->style()->pixelMetric( QStyle::PM_SliderSpaceAvailable, opt, slider_); int w = slider_->width(); return w - space_available; } QRect MoodbarProxyStyle::subControlRect(ComplexControl cc, const QStyleOptionComplex* opt, SubControl sc, const QWidget* widget) const { if (cc != QStyle::CC_Slider || widget != slider_) { return QProxyStyle::subControlRect(cc, opt, sc, widget); } switch (state_) { case MoodbarOff: case FadingToOff: break; case MoodbarOn: case FadingToOn: switch (sc) { case SC_SliderGroove: { int margin_leftright = GetExtraSpace(opt) / 2; return opt->rect.adjusted(margin_leftright, kMarginSize, -margin_leftright, -kMarginSize); } case SC_SliderHandle: { const QStyleOptionSlider* slider_opt = qstyleoption_cast(opt); int space_available = slider_->style()->pixelMetric( QStyle::PM_SliderSpaceAvailable, opt, slider_); int w = slider_->width(); int margin = (w - space_available) / 2; int x = 0; if (slider_opt->maximum != slider_opt->minimum) { x = (slider_opt->sliderValue - slider_opt->minimum) * (space_available - kArrowWidth) / (slider_opt->maximum - slider_opt->minimum); } x += margin; return QRect(QPoint(opt->rect.left() + x, opt->rect.top()), QSize(kArrowWidth, kArrowHeight)); } default: break; } } return QProxyStyle::subControlRect(cc, opt, sc, widget); } void MoodbarProxyStyle::DrawArrow(const QStyleOptionSlider* option, QPainter* painter) const { // Get the dimensions of the arrow const QRect rect = subControlRect(CC_Slider, option, SC_SliderHandle, slider_); // Make a polygon QPolygon poly; poly << rect.topLeft() << rect.topRight() << QPoint(rect.center().x(), rect.bottom()); // Draw it painter->save(); painter->setRenderHint(QPainter::Antialiasing); painter->translate(0.5, 0.5); painter->setPen(Qt::black); painter->setBrush(slider_->palette().brush(QPalette::Active, QPalette::Base)); painter->drawPolygon(poly); painter->restore(); } QPixmap MoodbarProxyStyle::MoodbarPixmap(const ColorVector& colors, const QSize& size, const QPalette& palette, const QStyleOptionSlider* opt) { int margin_leftright = GetExtraSpace(opt); const QRect rect(QPoint(0, 0), size); QRect border_rect(rect); // I would expect we need to adjust by margin_lr/2, so the extra space is // distributed on both side, but if we do so, the margin is too small, and I'm // not sure why... border_rect.adjust(margin_leftright, kMarginSize, -margin_leftright, -kMarginSize); QRect inner_rect(border_rect); inner_rect.adjust(kBorderSize, kBorderSize, -kBorderSize, -kBorderSize); QPixmap ret(size); QPainter p(&ret); // Draw the moodbar MoodbarRenderer::Render(colors, &p, inner_rect); // Draw the border p.setPen( QPen(Qt::black, kBorderSize, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin)); p.drawRect(border_rect.adjusted(0, 0, -1, -1)); // Draw the outer bit p.setPen(QPen(palette.brush(QPalette::Active, QPalette::Background), kMarginSize, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin)); // First: a rectangle around the slider p.drawRect(rect.adjusted(1, 1, -2, -2)); // Then, thicker border on left and right, because of the margins. p.setPen(QPen(palette.brush(QPalette::Active, QPalette::Background), margin_leftright * 2 - kBorderSize, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin)); p.drawLine(rect.topLeft(), rect.bottomLeft()); p.drawLine(rect.topRight(), rect.bottomRight()); p.end(); return ret; } void MoodbarProxyStyle::ShowContextMenu(const QPoint& pos) { if (!context_menu_) { context_menu_ = new QMenu(slider_); show_moodbar_action_ = context_menu_->addAction( tr("Show moodbar"), this, SLOT(SetMoodbarEnabled(bool))); show_moodbar_action_->setCheckable(true); show_moodbar_action_->setChecked(enabled_); QMenu* styles_menu = context_menu_->addMenu(tr("Moodbar style")); style_action_group_ = new QActionGroup(styles_menu); for (int i = 0; i < MoodbarRenderer::StyleCount; ++i) { const MoodbarRenderer::MoodbarStyle style = MoodbarRenderer::MoodbarStyle(i); QAction* action = style_action_group_->addAction(MoodbarRenderer::StyleName(style)); action->setCheckable(true); action->setData(i); } styles_menu->addActions(style_action_group_->actions()); connect(styles_menu, SIGNAL(triggered(QAction*)), SLOT(ChangeStyle(QAction*))); } // Update the currently selected style for (QAction* action : style_action_group_->actions()) { if (MoodbarRenderer::MoodbarStyle(action->data().toInt()) == moodbar_style_) { action->setChecked(true); break; } } context_menu_->popup(pos); } void MoodbarProxyStyle::ChangeStyle(QAction* action) { QSettings s; s.beginGroup("Moodbar"); s.setValue("style", action->data().toInt()); app_->ReloadSettings(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/moodbar/moodbarproxystyle.h000066400000000000000000000062771260417502300255740ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MOODBARPROXYSTYLE_H #define MOODBARPROXYSTYLE_H #include "moodbarrenderer.h" #include class Application; class QActionGroup; class QMenu; class QSlider; class QStyleOptionSlider; class QTimeLine; class MoodbarProxyStyle : public QProxyStyle { Q_OBJECT public: MoodbarProxyStyle(Application* app, QSlider* slider); // QProxyStyle void drawComplexControl(ComplexControl control, const QStyleOptionComplex* option, QPainter* painter, const QWidget* widget) const; QRect subControlRect(ComplexControl cc, const QStyleOptionComplex* opt, SubControl sc, const QWidget* widget) const; // QObject bool eventFilter(QObject* object, QEvent* event); public slots: // An empty byte array means there's no moodbar, so just show a normal slider. void SetMoodbarData(const QByteArray& data); // If the moodbar is disabled then a normal slider will always be shown. void SetMoodbarEnabled(bool enabled); private: static const int kMarginSize; static const int kBorderSize; static const int kArrowWidth; static const int kArrowHeight; enum State { MoodbarOn, MoodbarOff, FadingToOn, FadingToOff }; private: void NextState(); void Render(ComplexControl control, const QStyleOptionSlider* option, QPainter* painter, const QWidget* widget); void EnsureMoodbarRendered(const QStyleOptionSlider* opt); void DrawArrow(const QStyleOptionSlider* option, QPainter* painter) const; void ShowContextMenu(const QPoint& pos); QPixmap MoodbarPixmap(const ColorVector& colors, const QSize& size, const QPalette& palette, const QStyleOptionSlider* opt); private slots: void ReloadSettings(); void FaderValueChanged(qreal value); void ChangeStyle(QAction* action); private: // The slider "groove" is smaller than the actual slider: this convenient // function returns the difference between groove width and slider width. int GetExtraSpace(const QStyleOptionComplex* opt) const; Application* app_; QSlider* slider_; bool enabled_; QByteArray data_; MoodbarRenderer::MoodbarStyle moodbar_style_; State state_; QTimeLine* fade_timeline_; QPixmap fade_source_; QPixmap fade_target_; bool moodbar_colors_dirty_; bool moodbar_pixmap_dirty_; ColorVector moodbar_colors_; QPixmap moodbar_pixmap_; QMenu* context_menu_; QAction* show_moodbar_action_; QActionGroup* style_action_group_; }; #endif // MOODBARPROXYSTYLE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/moodbar/moodbarrenderer.cpp000066400000000000000000000127331260417502300254650ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "moodbarrenderer.h" #include #include #include "core/arraysize.h" const int MoodbarRenderer::kNumHues = 12; ColorVector MoodbarRenderer::Colors(const QByteArray& data, MoodbarStyle style, const QPalette& palette) { const int samples = data.size() / 3; // Set some parameters based on the moodbar style StyleProperties properties; switch (style) { case Style_Angry: properties = StyleProperties(samples / 360 * 9, 45, -45, 200, 100); break; case Style_Frozen: properties = StyleProperties(samples / 360 * 1, 140, 160, 50, 100); break; case Style_Happy: properties = StyleProperties(samples / 360 * 2, 0, 359, 150, 250); break; case Style_Normal: properties = StyleProperties(samples / 360 * 3, 0, 359, 100, 100); break; case Style_SystemPalette: default: { const QColor highlight_color( palette.color(QPalette::Active, QPalette::Highlight)); properties.threshold_ = samples / 360 * 3; properties.range_start_ = (highlight_color.hsvHue() - 20 + 360) % 360; properties.range_delta_ = 20; properties.sat_ = highlight_color.hsvSaturation(); properties.val_ = highlight_color.value() / 2; } } const unsigned char* data_p = reinterpret_cast(data.constData()); int hue_distribution[360]; int total = 0; memset(hue_distribution, 0, sizeof(hue_distribution)); ColorVector colors; // Read the colors, keeping track of some histograms for (int i = 0; i < samples; ++i) { QColor color; color.setRed(int(*data_p++)); color.setGreen(int(*data_p++)); color.setBlue(int(*data_p++)); colors << color; const int hue = qMax(0, color.hue()); if (hue_distribution[hue]++ == properties.threshold_) { total++; } } total = qMax(total, 1); // Remap the hue values to be between rangeStart and // rangeStart + rangeDelta. Every time we see an input hue // above the threshold, increment the output hue by // (1/total) * rangeDelta. for (int i = 0, n = 0; i < 360; i++) { hue_distribution[i] = ((hue_distribution[i] > properties.threshold_ ? n++ : n) * properties.range_delta_ / total + properties.range_start_) % 360; } // Now huedist is a hue mapper: huedist[h] is the new hue value // for a bar with hue h for (ColorVector::iterator it = colors.begin(); it != colors.end(); ++it) { const int hue = qMax(0, it->hue()); *it = QColor::fromHsv( qBound(0, hue_distribution[hue], 359), qBound(0, it->saturation() * properties.sat_ / 100, 255), qBound(0, it->value() * properties.val_ / 100, 255)); } return colors; } void MoodbarRenderer::Render(const ColorVector& colors, QPainter* p, const QRect& rect) { // Sample the colors and map them to screen pixels. ColorVector screen_colors; for (int x = 0; x < rect.width(); ++x) { int r = 0; int g = 0; int b = 0; int start = x * colors.size() / rect.width(); int end = (x + 1) * colors.size() / rect.width(); if (start == end) end = qMin(start + 1, colors.size() - 1); for (int j = start; j < end; j++) { r += colors[j].red(); g += colors[j].green(); b += colors[j].blue(); } const int n = qMax(1, end - start); screen_colors.append(QColor(r / n, g / n, b / n)); } // Draw the actual moodbar. for (int x = 0; x < rect.width(); x++) { int h, s, v; screen_colors[x].getHsv(&h, &s, &v); for (int y = 0; y <= rect.height() / 2; y++) { float coeff = float(y) / float(rect.height() / 2); float coeff2 = 1.0f - ((1.0f - coeff) * (1.0f - coeff)); coeff = 1.0f - (1.0f - coeff) / 2.0f; coeff2 = 1.f - (1.f - coeff2) / 2.0f; p->setPen(QColor::fromHsv( h, qBound(0, int(float(s) * coeff), 255), qBound(0, int(255.f - (255.f - float(v)) * coeff2), 255))); p->drawPoint(rect.left() + x, rect.top() + y); p->drawPoint(rect.left() + x, rect.top() + rect.height() - 1 - y); } } } QImage MoodbarRenderer::RenderToImage(const ColorVector& colors, const QSize& size) { QImage image(size, QImage::Format_ARGB32_Premultiplied); QPainter p(&image); Render(colors, &p, image.rect()); p.end(); return image; } QString MoodbarRenderer::StyleName(MoodbarStyle style) { switch (style) { case Style_Normal: return QObject::tr("Normal"); case Style_Angry: return QObject::tr("Angry"); case Style_Frozen: return QObject::tr("Frozen"); case Style_Happy: return QObject::tr("Happy"); case Style_SystemPalette: return QObject::tr("System colors"); default: return QString(); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/moodbar/moodbarrenderer.h000066400000000000000000000040211260417502300251210ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MOODBARRENDERER_H #define MOODBARRENDERER_H #include #include #include #include class QPalette; typedef QVector ColorVector; class MoodbarRenderer { public: // These values are persisted. Remember to change appearancesettingspage.ui // when changing them. enum MoodbarStyle { Style_Normal = 0, Style_Angry, Style_Frozen, Style_Happy, Style_SystemPalette, StyleCount }; static const int kNumHues; static QString StyleName(MoodbarStyle style); static ColorVector Colors(const QByteArray& data, MoodbarStyle style, const QPalette& palette); static void Render(const ColorVector& colors, QPainter* p, const QRect& rect); static QImage RenderToImage(const ColorVector& colors, const QSize& size); private: MoodbarRenderer(); struct StyleProperties { StyleProperties(int threshold = 0, int range_start = 0, int range_delta = 0, int sat = 0, int val = 0) : threshold_(threshold), range_start_(range_start), range_delta_(range_delta), sat_(sat), val_(val) {} int threshold_; int range_start_; int range_delta_; int sat_; int val_; }; }; Q_DECLARE_METATYPE(QVector) #endif // MOODBARRENDERER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/musicbrainz/000077500000000000000000000000001260417502300225045ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/musicbrainz/acoustidclient.cpp000066400000000000000000000103361260417502300262250ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "acoustidclient.h" #include #include #include #include #include "core/closure.h" #include "core/logging.h" #include "core/network.h" #include "core/timeconstants.h" const char* AcoustidClient::kClientId = "qsZGpeLx"; const char* AcoustidClient::kUrl = "http://api.acoustid.org/v2/lookup"; const int AcoustidClient::kDefaultTimeout = 5000; // msec AcoustidClient::AcoustidClient(QObject* parent) : QObject(parent), network_(new NetworkAccessManager(this)), timeouts_(new NetworkTimeouts(kDefaultTimeout, this)) {} void AcoustidClient::SetTimeout(int msec) { timeouts_->SetTimeout(msec); } void AcoustidClient::Start(int id, const QString& fingerprint, int duration_msec) { typedef QPair Param; QList parameters; parameters << Param("format", "json") << Param("client", kClientId) << Param("duration", QString::number(duration_msec / kMsecPerSec)) << Param("meta", "recordingids+sources") << Param("fingerprint", fingerprint); QUrl url(kUrl); url.setQueryItems(parameters); QNetworkRequest req(url); QNetworkReply* reply = network_->get(req); NewClosure(reply, SIGNAL(finished()), this, SLOT(RequestFinished(QNetworkReply*, int)), reply, id); requests_[id] = reply; timeouts_->AddReply(reply); } void AcoustidClient::Cancel(int id) { delete requests_.take(id); } void AcoustidClient::CancelAll() { qDeleteAll(requests_.values()); requests_.clear(); } namespace { // Struct used when extracting results in RequestFinished struct IdSource { IdSource(const QString& id, int source) : id_(id), nb_sources_(source) {} bool operator<(const IdSource& other) const { // We want the items with more sources to be at the beginning of the list return nb_sources_ > other.nb_sources_; } QString id_; int nb_sources_; }; } void AcoustidClient::RequestFinished(QNetworkReply* reply, int request_id) { reply->deleteLater(); requests_.remove(request_id); if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() != 200) { emit Finished(request_id, QStringList()); return; } QJson::Parser parser; bool ok = false; QVariantMap result = parser.parse(reply, &ok).toMap(); if (!ok) { emit Finished(request_id, QStringList()); return; } QString status = result["status"].toString(); if (status != "ok") { emit Finished(request_id, QStringList()); return; } // Get the results: // -in a first step, gather ids and their corresponding number of sources // -then sort results by number of sources (the results are originally // unsorted but results with more sources are likely to be more accurate) // -keep only the ids, as sources where useful only to sort the results QVariantList results = result["results"].toList(); // List of pairs QList id_source_list; for (const QVariant& v : results) { QVariantMap r = v.toMap(); if (r.contains("recordings")) { QVariantList recordings = r["recordings"].toList(); for (const QVariant& recording : recordings) { QVariantMap o = recording.toMap(); if (o.contains("id")) { id_source_list << IdSource(o["id"].toString(), o["sources"].toInt()); } } } } qStableSort(id_source_list); QList id_list; for (const IdSource& is : id_source_list) { id_list << is.id_; } emit Finished(request_id, id_list); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/musicbrainz/acoustidclient.h000066400000000000000000000045331260417502300256740ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ACOUSTIDCLIENT_H #define ACOUSTIDCLIENT_H #include #include class NetworkTimeouts; class QNetworkAccessManager; class QNetworkReply; class AcoustidClient : public QObject { Q_OBJECT // Gets a MBID from a Chromaprint fingerprint. // A fingerprint identifies one particular encoding of a song and is created // by Fingerprinter. An MBID identifies the actual song and can be passed to // Musicbrainz to get metadata. // You can create one AcoustidClient and make multiple requests using it. // IDs are provided by the caller when a request is started and included in // the Finished signal - they have no meaning to AcoustidClient. public: AcoustidClient(QObject* parent = nullptr); // Network requests will be aborted after this interval. void SetTimeout(int msec); // Starts a request and returns immediately. Finished() will be emitted // later with the same ID. void Start(int id, const QString& fingerprint, int duration_msec); // Cancels the request with the given ID. Finished() will never be emitted // for that ID. Does nothing if there is no request with the given ID. void Cancel(int id); // Cancels all requests. Finished() will never be emitted for any pending // requests. void CancelAll(); signals: void Finished(int id, const QStringList& mbid_list); private slots: void RequestFinished(QNetworkReply* reply, int id); private: static const char* kClientId; static const char* kUrl; static const int kDefaultTimeout; QNetworkAccessManager* network_; NetworkTimeouts* timeouts_; QMap requests_; }; #endif // ACOUSTIDCLIENT_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/musicbrainz/chromaprinter.cpp000066400000000000000000000152121260417502300260660ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "chromaprinter.h" #include #include #include #include #include #include #include #include "core/logging.h" #include "core/signalchecker.h" static const int kDecodeRate = 11025; static const int kDecodeChannels = 1; static const int kPlayLengthSecs = 30; static const int kTimeoutSecs = 10; Chromaprinter::Chromaprinter(const QString& filename) : filename_(filename), convert_element_(nullptr) {} Chromaprinter::~Chromaprinter() {} GstElement* Chromaprinter::CreateElement(const QString& factory_name, GstElement* bin) { GstElement* ret = gst_element_factory_make( factory_name.toAscii().constData(), factory_name.toAscii().constData()); if (ret && bin) gst_bin_add(GST_BIN(bin), ret); if (!ret) { qLog(Warning) << "Couldn't create the gstreamer element" << factory_name; } return ret; } QString Chromaprinter::CreateFingerprint() { Q_ASSERT(QThread::currentThread() != qApp->thread()); buffer_.open(QIODevice::WriteOnly); GstElement* pipeline = gst_pipeline_new("pipeline"); GstElement* src = CreateElement("filesrc", pipeline); GstElement* decode = CreateElement("decodebin", pipeline); GstElement* convert = CreateElement("audioconvert", pipeline); GstElement* resample = CreateElement("audioresample", pipeline); GstElement* sink = CreateElement("appsink", pipeline); if (!src || !decode || !convert || !resample || !sink) { return QString(); } convert_element_ = convert; // Connect the elements gst_element_link_many(src, decode, nullptr); gst_element_link_many(convert, resample, nullptr); // Chromaprint expects mono 16-bit ints at a sample rate of 11025Hz. GstCaps* caps = gst_caps_new_simple( "audio/x-raw", "format", G_TYPE_STRING, "S16LE", "channels", G_TYPE_INT, kDecodeChannels, "rate", G_TYPE_INT, kDecodeRate, NULL); gst_element_link_filtered(resample, sink, caps); gst_caps_unref(caps); GstAppSinkCallbacks callbacks; memset(&callbacks, 0, sizeof(callbacks)); callbacks.new_sample = NewBufferCallback; gst_app_sink_set_callbacks(reinterpret_cast(sink), &callbacks, this, nullptr); g_object_set(G_OBJECT(sink), "sync", FALSE, nullptr); g_object_set(G_OBJECT(sink), "emit-signals", TRUE, nullptr); // Set the filename g_object_set(src, "location", filename_.toUtf8().constData(), nullptr); // Connect signals GstBus* bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline)); CHECKED_GCONNECT(decode, "pad-added", &NewPadCallback, this); // Play only first x seconds gst_element_set_state(pipeline, GST_STATE_PAUSED); // wait for state change before seeking gst_element_get_state(pipeline, nullptr, nullptr, kTimeoutSecs * GST_SECOND); gst_element_seek(pipeline, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 0 * GST_SECOND, GST_SEEK_TYPE_SET, kPlayLengthSecs * GST_SECOND); QTime time; time.start(); // Start playing gst_element_set_state(pipeline, GST_STATE_PLAYING); // Wait until EOS or error GstMessage* msg = gst_bus_timed_pop_filtered( bus, kTimeoutSecs * GST_SECOND, static_cast(GST_MESSAGE_EOS | GST_MESSAGE_ERROR)); if (msg != nullptr) { if (msg->type == GST_MESSAGE_ERROR) { // Report error GError* error = nullptr; gchar* debugs = nullptr; gst_message_parse_error(msg, &error, &debugs); QString message = QString::fromLocal8Bit(error->message); g_error_free(error); free(debugs); qLog(Debug) << "Error processing" << filename_ << ":" << message; } gst_message_unref(msg); } int decode_time = time.restart(); buffer_.close(); // Generate fingerprint from recorded buffer data QByteArray data = buffer_.data(); ChromaprintContext* chromaprint = chromaprint_new(CHROMAPRINT_ALGORITHM_DEFAULT); chromaprint_start(chromaprint, kDecodeRate, kDecodeChannels); chromaprint_feed(chromaprint, reinterpret_cast(data.data()), data.size() / 2); chromaprint_finish(chromaprint); void* fprint = nullptr; int size = 0; int ret = chromaprint_get_raw_fingerprint(chromaprint, &fprint, &size); QByteArray fingerprint; if (ret == 1) { void* encoded = nullptr; int encoded_size = 0; chromaprint_encode_fingerprint(fprint, size, CHROMAPRINT_ALGORITHM_DEFAULT, &encoded, &encoded_size, 1); fingerprint.append(reinterpret_cast(encoded), encoded_size); chromaprint_dealloc(fprint); chromaprint_dealloc(encoded); } chromaprint_free(chromaprint); int codegen_time = time.elapsed(); qLog(Debug) << "Decode time:" << decode_time << "Codegen time:" << codegen_time; // Cleanup callbacks.new_sample = nullptr; gst_object_unref(bus); gst_element_set_state(pipeline, GST_STATE_NULL); gst_object_unref(pipeline); return fingerprint; } void Chromaprinter::NewPadCallback(GstElement*, GstPad* pad, gpointer data) { Chromaprinter* instance = reinterpret_cast(data); GstPad* const audiopad = gst_element_get_static_pad(instance->convert_element_, "sink"); if (GST_PAD_IS_LINKED(audiopad)) { qLog(Warning) << "audiopad is already linked, unlinking old pad"; gst_pad_unlink(audiopad, GST_PAD_PEER(audiopad)); } gst_pad_link(pad, audiopad); gst_object_unref(audiopad); } GstFlowReturn Chromaprinter::NewBufferCallback(GstAppSink* app_sink, gpointer self) { Chromaprinter* me = reinterpret_cast(self); GstSample* sample = gst_app_sink_pull_sample(app_sink); GstBuffer* buffer = gst_sample_get_buffer(sample); GstMapInfo map; gst_buffer_map(buffer, &map, GST_MAP_READ); me->buffer_.write(reinterpret_cast(map.data), map.size); gst_buffer_unmap(buffer, &map); gst_buffer_unref(buffer); return GST_FLOW_OK; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/musicbrainz/chromaprinter.h000066400000000000000000000036201260417502300255330ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CHROMAPRINTER_H #define CHROMAPRINTER_H #include #include #include #include class Chromaprinter { // Creates a Chromaprint fingerprint from a song. // Uses GStreamer to open and decode the file as PCM data and passes this // to Chromaprint's code generator. The generated code can be used to identify // a song via Acoustid. // You should create one Chromaprinter for each file you want to fingerprint. // This class works well with QtConcurrentMap. public: Chromaprinter(const QString& filename); ~Chromaprinter(); // Creates a fingerprint from the song. This method is blocking, so you want // to call it in another thread. Returns an empty string if no fingerprint // could be created. QString CreateFingerprint(); private: GstElement* CreateElement(const QString& factory_name, GstElement* bin = nullptr); static void NewPadCallback(GstElement*, GstPad* pad, gpointer data); static GstFlowReturn NewBufferCallback(GstAppSink* app_sink, gpointer self); private: QString filename_; GstElement* convert_element_; QBuffer buffer_; }; #endif // CHROMAPRINTER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/musicbrainz/musicbrainzclient.cpp000066400000000000000000000275031260417502300267440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "musicbrainzclient.h" #include #include #include #include #include "core/closure.h" #include "core/logging.h" #include "core/network.h" #include "core/utilities.h" const char* MusicBrainzClient::kTrackUrl = "https://musicbrainz.org/ws/2/recording/"; const char* MusicBrainzClient::kDiscUrl = "https://musicbrainz.org/ws/2/discid/"; const char* MusicBrainzClient::kDateRegex = "^[12]\\d{3}"; const int MusicBrainzClient::kDefaultTimeout = 5000; // msec const int MusicBrainzClient::kMaxRequestPerTrack = 3; MusicBrainzClient::MusicBrainzClient(QObject* parent, QNetworkAccessManager* network) : QObject(parent), network_(network ? network : new NetworkAccessManager(this)), timeouts_(new NetworkTimeouts(kDefaultTimeout, this)) {} void MusicBrainzClient::Start(int id, const QStringList& mbid_list) { typedef QPair Param; int request_number = 0; for (const QString& mbid : mbid_list) { QList parameters; parameters << Param("inc", "artists+releases+media"); QUrl url(kTrackUrl + mbid); url.setQueryItems(parameters); QNetworkRequest req(url); QNetworkReply* reply = network_->get(req); NewClosure(reply, SIGNAL(finished()), this, SLOT(RequestFinished(QNetworkReply*, int, int)), reply, id, request_number++); requests_.insert(id, reply); timeouts_->AddReply(reply); if (request_number >= kMaxRequestPerTrack) { break; } } } void MusicBrainzClient::StartDiscIdRequest(const QString& discid) { typedef QPair Param; QList parameters; parameters << Param("inc", "artists+recordings"); QUrl url(kDiscUrl + discid); url.setQueryItems(parameters); QNetworkRequest req(url); QNetworkReply* reply = network_->get(req); NewClosure(reply, SIGNAL(finished()), this, SLOT(DiscIdRequestFinished(const QString&, QNetworkReply*)), discid, reply); timeouts_->AddReply(reply); } void MusicBrainzClient::Cancel(int id) { delete requests_.take(id); } void MusicBrainzClient::CancelAll() { qDeleteAll(requests_.values()); requests_.clear(); } void MusicBrainzClient::DiscIdRequestFinished(const QString& discid, QNetworkReply* reply) { reply->deleteLater(); ResultList ret; QString artist; QString album; int year = 0; if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() != 200) { qLog(Error) << "Error:" << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute) .toInt() << "http status code received"; qLog(Error) << reply->readAll(); emit Finished(artist, album, ret); return; } // Parse xml result: // -get title // -get artist // -get year // -get all the tracks' tags // Note: If there are multiple releases for the discid, the first // release is chosen. QXmlStreamReader reader(reply); while (!reader.atEnd()) { QXmlStreamReader::TokenType type = reader.readNext(); if (type == QXmlStreamReader::StartElement) { QStringRef name = reader.name(); if (name == "title") { album = reader.readElementText(); } else if (name == "date") { QRegExp regex(kDateRegex); if (regex.indexIn(reader.readElementText()) == 0) { year = regex.cap(0).toInt(); } } else if (name == "artist-credit") { ParseArtist(&reader, &artist); } else if (name == "medium-list") { break; } } } while (!reader.atEnd()) { QXmlStreamReader::TokenType token = reader.readNext(); if (token == QXmlStreamReader::StartElement && reader.name() == "medium") { // Get the medium with a matching discid. if (MediumHasDiscid(discid, &reader)) { ResultList tracks = ParseMedium(&reader); for (const Result& track : tracks) { if (!track.title_.isEmpty()) { ret << track; } } } else { Utilities::ConsumeCurrentElement(&reader); } } else if (token == QXmlStreamReader::EndElement && reader.name() == "medium-list") { break; } } // If we parsed a year, copy it to the tracks. if (year > 0) { for (ResultList::iterator it = ret.begin(); it != ret.end(); ++it) { it->year_ = year; } } emit Finished(artist, album, UniqueResults(ret, SortResults)); } void MusicBrainzClient::RequestFinished(QNetworkReply* reply, int id, int request_number) { reply->deleteLater(); const int nb_removed = requests_.remove(id, reply); if (nb_removed != 1) { qLog(Error) << "Error: unknown reply received:" << nb_removed << "requests removed, while only one was supposed to be removed"; } if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 200) { QXmlStreamReader reader(reply); ResultList res; while (!reader.atEnd()) { if (reader.readNext() == QXmlStreamReader::StartElement && reader.name() == "recording") { ResultList tracks = ParseTrack(&reader); for (const Result& track : tracks) { if (!track.title_.isEmpty()) { res << track; } } } } pending_results_[id] << PendingResults(request_number, res); } else { qLog(Error) << "Error:" << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute) .toInt() << "http status code received"; qLog(Error) << reply->readAll(); } // No more pending requests for this id: emit the results we have. if (!requests_.contains(id)) { // Merge the results we have ResultList ret; QList result_list_list = pending_results_.take(id); qSort(result_list_list); for (const PendingResults& result_list : result_list_list) { ret << result_list.results_; } emit Finished(id, UniqueResults(ret, KeepOriginalOrder)); } } bool MusicBrainzClient::MediumHasDiscid(const QString& discid, QXmlStreamReader* reader) { while (!reader->atEnd()) { QXmlStreamReader::TokenType type = reader->readNext(); if (type == QXmlStreamReader::StartElement && reader->name() == "disc" && reader->attributes().value("id").toString() == discid) { return true; } else if (type == QXmlStreamReader::EndElement && reader->name() == "disc-list") { return false; } } qLog(Debug) << "Reached end of xml stream without encountering "; return false; } MusicBrainzClient::ResultList MusicBrainzClient::ParseMedium( QXmlStreamReader* reader) { ResultList ret; while (!reader->atEnd()) { QXmlStreamReader::TokenType type = reader->readNext(); if (type == QXmlStreamReader::StartElement) { if (reader->name() == "track") { Result result; result = ParseTrackFromDisc(reader); ret << result; } } if (type == QXmlStreamReader::EndElement && reader->name() == "track-list") { break; } } return ret; } MusicBrainzClient::Result MusicBrainzClient::ParseTrackFromDisc( QXmlStreamReader* reader) { Result result; while (!reader->atEnd()) { QXmlStreamReader::TokenType type = reader->readNext(); if (type == QXmlStreamReader::StartElement) { QStringRef name = reader->name(); if (name == "position") { result.track_ = reader->readElementText().toInt(); } else if (name == "length") { result.duration_msec_ = reader->readElementText().toInt(); } else if (name == "title") { result.title_ = reader->readElementText(); } } if (type == QXmlStreamReader::EndElement && reader->name() == "track") { break; } } return result; } MusicBrainzClient::ResultList MusicBrainzClient::ParseTrack( QXmlStreamReader* reader) { Result result; QList releases; while (!reader->atEnd()) { QXmlStreamReader::TokenType type = reader->readNext(); if (type == QXmlStreamReader::StartElement) { QStringRef name = reader->name(); if (name == "title") { result.title_ = reader->readElementText(); } else if (name == "length") { result.duration_msec_ = reader->readElementText().toInt(); } else if (name == "artist-credit") { ParseArtist(reader, &result.artist_); } else if (name == "release") { releases << ParseRelease(reader); } } if (type == QXmlStreamReader::EndElement && reader->name() == "recording") { break; } } ResultList ret; if (releases.isEmpty()) { ret << result; } else { qStableSort(releases); for (const Release& release : releases) { ret << release.CopyAndMergeInto(result); } } return ret; } // Parse the artist. Multiple artists are joined together with the // joinphrase from musicbrainz. void MusicBrainzClient::ParseArtist(QXmlStreamReader* reader, QString* artist) { QString join_phrase; while (!reader->atEnd()) { QXmlStreamReader::TokenType type = reader->readNext(); if (type == QXmlStreamReader::StartElement && reader->name() == "name-credit") { join_phrase = reader->attributes().value("joinphrase").toString(); } if (type == QXmlStreamReader::StartElement && reader->name() == "name") { *artist += reader->readElementText() + join_phrase; } if (type == QXmlStreamReader::EndElement && reader->name() == "artist-credit") { return; } } } MusicBrainzClient::Release MusicBrainzClient::ParseRelease( QXmlStreamReader* reader) { Release ret; while (!reader->atEnd()) { QXmlStreamReader::TokenType type = reader->readNext(); if (type == QXmlStreamReader::StartElement) { QStringRef name = reader->name(); if (name == "title") { ret.album_ = reader->readElementText(); } else if (name == "status") { ret.SetStatusFromString(reader->readElementText()); } else if (name == "date") { QRegExp regex(kDateRegex); if (regex.indexIn(reader->readElementText()) == 0) { ret.year_ = regex.cap(0).toInt(); } } else if (name == "track-list") { ret.track_ = reader->attributes().value("offset").toString().toInt() + 1; Utilities::ConsumeCurrentElement(reader); } } if (type == QXmlStreamReader::EndElement && reader->name() == "release") { break; } } return ret; } MusicBrainzClient::ResultList MusicBrainzClient::UniqueResults( const ResultList& results, UniqueResultsSortOption opt) { ResultList ret; if (opt == SortResults) { ret = QSet::fromList(results).toList(); qSort(ret); } else { // KeepOriginalOrder // Qt doesn't provide a ordered set (QSet "stores values in an unspecified // order" according to Qt documentation). // We might use std::set instead, but it's probably faster to use ResultList // directly to avoid converting from one structure to another. for (const Result& res : results) { if (!ret.contains(res)) { ret << res; } } } return ret; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/musicbrainz/musicbrainzclient.h000066400000000000000000000142641260417502300264110ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MUSICBRAINZCLIENT_H #define MUSICBRAINZCLIENT_H #include #include #include #include class NetworkTimeouts; class QNetworkAccessManager; class QNetworkReply; class MusicBrainzClient : public QObject { Q_OBJECT // Gets metadata for a particular MBID. // An MBID is created from a fingerprint using MusicDnsClient. // You can create one MusicBrainzClient and make multiple requests using it. // IDs are provided by the caller when a request is started and included in // the Finished signal - they have no meaning to MusicBrainzClient. public: // The second argument allows for specifying a custom network access // manager. It is used in tests. The ownership of network // is not transferred. MusicBrainzClient(QObject* parent = nullptr, QNetworkAccessManager* network = nullptr); struct Result { Result() : duration_msec_(0), track_(0), year_(-1) {} bool operator<(const Result& other) const { #define cmp(field) \ if (field < other.field) return true; \ if (field > other.field) return false; cmp(track_); cmp(year_); cmp(title_); cmp(artist_); return false; #undef cmp } bool operator==(const Result& other) const { return title_ == other.title_ && artist_ == other.artist_ && album_ == other.album_ && duration_msec_ == other.duration_msec_ && track_ == other.track_ && year_ == other.year_; } QString title_; QString artist_; QString album_; int duration_msec_; int track_; int year_; }; typedef QList ResultList; // Starts a request and returns immediately. Finished() will be emitted // later with the same ID. void Start(int id, const QStringList& mbid); void StartDiscIdRequest(const QString& discid); // Cancels the request with the given ID. Finished() will never be emitted // for that ID. Does nothing if there is no request with the given ID. void Cancel(int id); // Cancels all requests. Finished() will never be emitted for any pending // requests. void CancelAll(); signals: // Finished signal emitted when fechting songs tags void Finished(int id, const MusicBrainzClient::ResultList& result); // Finished signal emitted when fechting album's songs tags using DiscId void Finished(const QString& artist, const QString album, const MusicBrainzClient::ResultList& result); private slots: // id identifies the track, and request_number means it's the // 'request_number'th request for this track void RequestFinished(QNetworkReply* reply, int id, int request_number); void DiscIdRequestFinished(const QString& discid, QNetworkReply* reply); private: // Used as parameter for UniqueResults enum UniqueResultsSortOption { SortResults = 0, KeepOriginalOrder }; struct Release { enum Status { Status_Unknown = 0, Status_PseudoRelease, Status_Bootleg, Status_Promotional, Status_Official }; Release() : track_(0), year_(0), status_(Status_Unknown) {} Result CopyAndMergeInto(const Result& orig) const { Result ret(orig); ret.album_ = album_; ret.track_ = track_; ret.year_ = year_; return ret; } void SetStatusFromString(const QString& s) { if (s.compare("Official", Qt::CaseInsensitive) == 0) { status_ = Status_Official; } else if (s.compare("Promotion", Qt::CaseInsensitive) == 0) { status_ = Status_Promotional; } else if (s.compare("Bootleg", Qt::CaseInsensitive) == 0) { status_ = Status_Bootleg; } else if (s.compare("Pseudo-release", Qt::CaseInsensitive) == 0) { status_ = Status_PseudoRelease; } else { status_ = Status_Unknown; } } bool operator<(const Release& other) const { // Compare status so that "best" status (e.g. Official) will be first // when sorting a list of releases. return status_ > other.status_; } QString album_; int track_; int year_; Status status_; }; struct PendingResults { PendingResults(int sort_id, const ResultList& results) : sort_id_(sort_id), results_(results) {} bool operator<(const PendingResults& other) const { return sort_id_ < other.sort_id_; } int sort_id_; ResultList results_; }; static bool MediumHasDiscid(const QString& discid, QXmlStreamReader* reader); static ResultList ParseMedium(QXmlStreamReader* reader); static Result ParseTrackFromDisc(QXmlStreamReader* reader); static ResultList ParseTrack(QXmlStreamReader* reader); static void ParseArtist(QXmlStreamReader* reader, QString* artist); static Release ParseRelease(QXmlStreamReader* reader); static ResultList UniqueResults(const ResultList& results, UniqueResultsSortOption opt = SortResults); private: static const char* kTrackUrl; static const char* kDiscUrl; static const char* kDateRegex; static const int kDefaultTimeout; static const int kMaxRequestPerTrack; QNetworkAccessManager* network_; NetworkTimeouts* timeouts_; QMultiMap requests_; // Results we received so far, kept here until all the replies are finished QMap> pending_results_; }; inline uint qHash(const MusicBrainzClient::Result& result) { return qHash(result.album_) ^ qHash(result.artist_) ^ result.duration_msec_ ^ qHash(result.title_) ^ result.track_ ^ result.year_; } #endif // MUSICBRAINZCLIENT_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/musicbrainz/tagfetcher.cpp000066400000000000000000000073001260417502300253240ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "tagfetcher.h" #include "acoustidclient.h" #include "chromaprinter.h" #include "musicbrainzclient.h" #include "core/timeconstants.h" #include #include #include #include TagFetcher::TagFetcher(QObject* parent) : QObject(parent), fingerprint_watcher_(nullptr), acoustid_client_(new AcoustidClient(this)), musicbrainz_client_(new MusicBrainzClient(this)) { connect(acoustid_client_, SIGNAL(Finished(int, QStringList)), SLOT(PuidsFound(int, QStringList))); connect(musicbrainz_client_, SIGNAL(Finished(int, MusicBrainzClient::ResultList)), SLOT(TagsFetched(int, MusicBrainzClient::ResultList))); } QString TagFetcher::GetFingerprint(const Song& song) { return Chromaprinter(song.url().toLocalFile()).CreateFingerprint(); } void TagFetcher::StartFetch(const SongList& songs) { Cancel(); songs_ = songs; QFuture future = QtConcurrent::mapped(songs_, GetFingerprint); fingerprint_watcher_ = new QFutureWatcher(this); fingerprint_watcher_->setFuture(future); connect(fingerprint_watcher_, SIGNAL(resultReadyAt(int)), SLOT(FingerprintFound(int))); for (const Song& song : songs) { emit Progress(song, tr("Fingerprinting song")); } } void TagFetcher::Cancel() { if (fingerprint_watcher_) { fingerprint_watcher_->cancel(); delete fingerprint_watcher_; fingerprint_watcher_ = nullptr; } acoustid_client_->CancelAll(); musicbrainz_client_->CancelAll(); songs_.clear(); } void TagFetcher::FingerprintFound(int index) { QFutureWatcher* watcher = reinterpret_cast*>(sender()); if (!watcher || index >= songs_.count()) { return; } const QString fingerprint = watcher->resultAt(index); const Song& song = songs_[index]; if (fingerprint.isEmpty()) { emit ResultAvailable(song, SongList()); return; } emit Progress(song, tr("Identifying song")); acoustid_client_->Start(index, fingerprint, song.length_nanosec() / kNsecPerMsec); } void TagFetcher::PuidsFound(int index, const QStringList& puid_list) { if (index >= songs_.count()) { return; } const Song& song = songs_[index]; if (puid_list.isEmpty()) { emit ResultAvailable(song, SongList()); return; } emit Progress(song, tr("Downloading metadata")); musicbrainz_client_->Start(index, puid_list); } void TagFetcher::TagsFetched(int index, const MusicBrainzClient::ResultList& results) { if (index >= songs_.count()) { return; } const Song& original_song = songs_[index]; SongList songs_guessed; for (const MusicBrainzClient::Result& result : results) { Song song; song.Init(result.title_, result.artist_, result.album_, result.duration_msec_ * kNsecPerMsec); song.set_track(result.track_); song.set_year(result.year_); songs_guessed << song; } emit ResultAvailable(original_song, songs_guessed); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/musicbrainz/tagfetcher.h000066400000000000000000000033511260417502300247730ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef TAGFETCHER_H #define TAGFETCHER_H #include "musicbrainzclient.h" #include "core/song.h" #include #include class AcoustidClient; class TagFetcher : public QObject { Q_OBJECT // High level interface to Fingerprinter, AcoustidClient and // MusicBrainzClient. public: TagFetcher(QObject* parent = nullptr); void StartFetch(const SongList& songs); public slots: void Cancel(); signals: void Progress(const Song& original_song, const QString& stage); void ResultAvailable(const Song& original_song, const SongList& songs_guessed); private slots: void FingerprintFound(int index); void PuidsFound(int index, const QStringList& puid_list); void TagsFetched(int index, const MusicBrainzClient::ResultList& result); private: static QString GetFingerprint(const Song& song); QFutureWatcher* fingerprint_watcher_; AcoustidClient* acoustid_client_; MusicBrainzClient* musicbrainz_client_; SongList songs_; }; #endif // TAGFETCHER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/networkremote/000077500000000000000000000000001260417502300230635ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/networkremote/avahi.cpp000066400000000000000000000065411260417502300246650ustar00rootroot00000000000000#include "avahi.h" #include #include "core/closure.h" #include "core/logging.h" #include "dbus/avahientrygroup.h" #include "dbus/avahiserver.h" namespace { void AddService(const QString domain, const QString type, const QByteArray name, quint16 port, QDBusPendingReply path_reply); void Commit(OrgFreedesktopAvahiEntryGroupInterface* interface); void LogCommit(QDBusPendingReply<> reply); } // namespace void Avahi::PublishInternal(const QString& domain, const QString& type, const QByteArray& name, quint16 port) { OrgFreedesktopAvahiServerInterface server_interface( "org.freedesktop.Avahi", "/", QDBusConnection::systemBus()); QDBusPendingReply reply = server_interface.EntryGroupNew(); QDBusPendingCallWatcher* watcher = new QDBusPendingCallWatcher(reply); NewClosure(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), &AddService, domain, type, name, port, reply); QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), watcher, SLOT(deleteLater())); } namespace { void AddService(const QString domain, const QString type, const QByteArray name, quint16 port, QDBusPendingReply path_reply) { if (path_reply.isError()) { qLog(Warning) << "Failed to create Avahi entry group:" << path_reply.error(); qLog(Info) << "This might be because 'disable-user-service-publishing'" << "is set to 'yes' in avahi-daemon.conf"; return; } qLog(Debug) << path_reply.error(); OrgFreedesktopAvahiEntryGroupInterface* entry_group_interface = new OrgFreedesktopAvahiEntryGroupInterface("org.freedesktop.Avahi", path_reply.value().path(), QDBusConnection::systemBus()); QDBusPendingReply<> reply = entry_group_interface->AddService( -1, // Interface (all) -1, // Protocol (v4 & v6) 0, // Flags // Service name, eg. Clementine QString::fromUtf8(name.constData(), name.size()), type, // Service type, eg. _clementine._tcp domain, // Domain, eg. local QString::null, // Hostname (filled in by Avahi) port, // Port our service is running on QList()); // TXT record QDBusPendingCallWatcher* watcher = new QDBusPendingCallWatcher(reply); NewClosure(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), &Commit, entry_group_interface); QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), watcher, SLOT(deleteLater())); } void Commit(OrgFreedesktopAvahiEntryGroupInterface* interface) { QDBusPendingReply<> reply = interface->Commit(); QDBusPendingCallWatcher* watcher = new QDBusPendingCallWatcher(reply); QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), watcher, SLOT(deleteLater())); QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), interface, SLOT(deleteLater())); NewClosure(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), &LogCommit, reply); } void LogCommit(QDBusPendingReply<> reply) { qLog(Debug) << "Remote interface published on Avahi:" << reply.error(); } } // namespace clementine-1.2.3+git1354-gdaddbde+dfsg/src/networkremote/avahi.h000066400000000000000000000004141260417502300243230ustar00rootroot00000000000000#ifndef AVAHI_H #define AVAHI_H #include "zeroconf.h" class Avahi : public Zeroconf { protected: virtual void PublishInternal(const QString& domain, const QString& type, const QByteArray& name, quint16 port); }; #endif // AVAHI_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/networkremote/bonjour.h000066400000000000000000000007561260417502300247220ustar00rootroot00000000000000#ifndef BONJOUR_H #define BONJOUR_H #include "zeroconf.h" #ifdef __OBJC__ @class NetServicePublicationDelegate; #else class NetServicePublicationDelegate; #endif // __OBJC__ class Bonjour : public Zeroconf { public: Bonjour(); virtual ~Bonjour(); protected: virtual void PublishInternal(const QString& domain, const QString& type, const QByteArray& name, quint16 port); private: NetServicePublicationDelegate* delegate_; }; #endif // BONJOUR_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/networkremote/bonjour.mm000066400000000000000000000032521260417502300250760ustar00rootroot00000000000000#include "bonjour.h" #import #import #include "core/logging.h" #include "core/scoped_nsautorelease_pool.h" @interface NetServicePublicationDelegate : NSObject { } - (void)netServiceWillPublish:(NSNetService*)netService; - (void)netService:(NSNetService*)netService didNotPublish:(NSDictionary*)errorDict; - (void)netServiceDidStop:(NSNetService*)netService; @end @implementation NetServicePublicationDelegate - (void)netServiceWillPublish:(NSNetService*)netService { qLog(Debug) << "Publishing:" << [[netService name] UTF8String]; } - (void)netService:(NSNetService*)netServie didNotPublish:(NSDictionary*)errorDict { qLog(Debug) << "Failed to publish remote service with Bonjour"; NSLog(@"%@", errorDict); } - (void)netServiceDidStop:(NSNetService*)netService { qLog(Debug) << "Unpublished:" << [[netService name] UTF8String]; } @end namespace { NSString* NSStringFromQString(const QString& s) { return [[NSString alloc] initWithUTF8String:s.toUtf8().constData()]; } } Bonjour::Bonjour() : delegate_([[NetServicePublicationDelegate alloc] init]) {} Bonjour::~Bonjour() { [delegate_ release]; } void Bonjour::PublishInternal(const QString& domain, const QString& type, const QByteArray& name, quint16 port) { ScopedNSAutoreleasePool pool; NSNetService* service = [[NSNetService alloc] initWithDomain:NSStringFromQString(domain) type:NSStringFromQString(type) name:[NSString stringWithUTF8String:name.constData()] port:port]; if (service) { [service setDelegate:delegate_]; [service publish]; } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/networkremote/incomingdataparser.cpp000066400000000000000000000263421260417502300274500ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, Andreas Muttscheller Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "incomingdataparser.h" #include #include "core/logging.h" #include "core/timeconstants.h" #include "engines/enginebase.h" #include "internet/core/internetmodel.h" #include "playlist/playlistmanager.h" #include "playlist/playlistsequence.h" #include "playlist/playlist.h" #ifdef HAVE_LIBLASTFM #include "internet/lastfm/lastfmservice.h" #endif IncomingDataParser::IncomingDataParser(Application* app) : app_(app) { // Connect all the signals // due the player is in a different thread, we cannot access these functions // directly connect(this, SIGNAL(Play()), app_->player(), SLOT(Play())); connect(this, SIGNAL(PlayPause()), app_->player(), SLOT(PlayPause())); connect(this, SIGNAL(Pause()), app_->player(), SLOT(Pause())); connect(this, SIGNAL(Stop()), app_->player(), SLOT(Stop())); connect(this, SIGNAL(StopAfterCurrent()), app_->player(), SLOT(StopAfterCurrent())); connect(this, SIGNAL(Next()), app_->player(), SLOT(Next())); connect(this, SIGNAL(Previous()), app_->player(), SLOT(Previous())); connect(this, SIGNAL(SetVolume(int)), app_->player(), SLOT(SetVolume(int))); connect(this, SIGNAL(PlayAt(int, Engine::TrackChangeFlags, bool)), app_->player(), SLOT(PlayAt(int, Engine::TrackChangeFlags, bool))); connect(this, SIGNAL(SeekTo(int)), app_->player(), SLOT(SeekTo(int))); connect(this, SIGNAL(SetActivePlaylist(int)), app_->playlist_manager(), SLOT(SetActivePlaylist(int))); connect(this, SIGNAL(ShuffleCurrent()), app_->playlist_manager(), SLOT(ShuffleCurrent())); connect(this, SIGNAL(SetRepeatMode(PlaylistSequence::RepeatMode)), app_->playlist_manager()->sequence(), SLOT(SetRepeatMode(PlaylistSequence::RepeatMode))); connect(this, SIGNAL(SetShuffleMode(PlaylistSequence::ShuffleMode)), app_->playlist_manager()->sequence(), SLOT(SetShuffleMode(PlaylistSequence::ShuffleMode))); connect(this, SIGNAL(InsertUrls(int, const QList&, int, bool, bool)), app_->playlist_manager(), SLOT(InsertUrls(int, const QList&, int, bool, bool))); connect(this, SIGNAL(InsertSongs(int, const SongList&, int, bool, bool)), app_->playlist_manager(), SLOT(InsertSongs(int, const SongList&, int, bool, bool))); connect(this, SIGNAL(RemoveSongs(int, const QList&)), app_->playlist_manager(), SLOT(RemoveItemsWithoutUndo(int, const QList&))); connect(this, SIGNAL(Open(int)), app_->playlist_manager(), SLOT(Open(int))); connect(this, SIGNAL(Close(int)), app_->playlist_manager(), SLOT(Close(int))); connect(this, SIGNAL(RateCurrentSong(double)), app_->playlist_manager(), SLOT(RateCurrentSong(double))); #ifdef HAVE_LIBLASTFM connect(this, SIGNAL(Love()), app_->scrobbler(), SLOT(Love())); #endif } IncomingDataParser::~IncomingDataParser() {} bool IncomingDataParser::close_connection() { return close_connection_; } void IncomingDataParser::Parse(const pb::remote::Message& msg) { close_connection_ = false; RemoteClient* client = qobject_cast(sender()); // Now check what's to do switch (msg.type()) { case pb::remote::CONNECT: ClientConnect(msg, client); break; case pb::remote::DISCONNECT: close_connection_ = true; break; case pb::remote::REQUEST_PLAYLISTS: SendPlaylists(msg); break; case pb::remote::REQUEST_PLAYLIST_SONGS: GetPlaylistSongs(msg); break; case pb::remote::SET_VOLUME: emit SetVolume(msg.request_set_volume().volume()); break; case pb::remote::PLAY: emit Play(); break; case pb::remote::PLAYPAUSE: emit PlayPause(); break; case pb::remote::PAUSE: emit Pause(); break; case pb::remote::STOP: emit Stop(); break; case pb::remote::STOP_AFTER: emit StopAfterCurrent(); break; case pb::remote::NEXT: emit Next(); break; case pb::remote::PREVIOUS: emit Previous(); break; case pb::remote::CHANGE_SONG: ChangeSong(msg); break; case pb::remote::SHUFFLE_PLAYLIST: emit ShuffleCurrent(); break; case pb::remote::REPEAT: SetRepeatMode(msg.repeat()); break; case pb::remote::SHUFFLE: SetShuffleMode(msg.shuffle()); break; case pb::remote::SET_TRACK_POSITION: emit SeekTo(msg.request_set_track_position().position()); break; case pb::remote::INSERT_URLS: InsertUrls(msg); break; case pb::remote::REMOVE_SONGS: RemoveSongs(msg); break; case pb::remote::OPEN_PLAYLIST: OpenPlaylist(msg); break; case pb::remote::CLOSE_PLAYLIST: ClosePlaylist(msg); break; case pb::remote::LOVE: emit Love(); break; case pb::remote::BAN: emit Ban(); break; case pb::remote::GET_LYRICS: emit GetLyrics(); break; case pb::remote::DOWNLOAD_SONGS: client->song_sender()->SendSongs(msg.request_download_songs()); break; case pb::remote::SONG_OFFER_RESPONSE: client->song_sender()->ResponseSongOffer(msg.response_song_offer().accepted()); break; case pb::remote::GET_LIBRARY: emit SendLibrary(client); break; case pb::remote::RATE_SONG: RateSong(msg); break; case pb::remote::GLOBAL_SEARCH: GlobalSearch(client, msg); break; default: break; } } void IncomingDataParser::GetPlaylistSongs(const pb::remote::Message& msg) { emit SendPlaylistSongs(msg.request_playlist_songs().id()); } void IncomingDataParser::ChangeSong(const pb::remote::Message& msg) { // Get the first entry and check if there is a song const pb::remote::RequestChangeSong& request = msg.request_change_song(); // Check if we need to change the playlist if (request.playlist_id() != app_->playlist_manager()->active_id()) { emit SetActivePlaylist(request.playlist_id()); } // Play the selected song emit PlayAt(request.song_index(), Engine::Manual, false); } void IncomingDataParser::SetRepeatMode(const pb::remote::Repeat& repeat) { switch (repeat.repeat_mode()) { case pb::remote::Repeat_Off: emit SetRepeatMode(PlaylistSequence::Repeat_Off); break; case pb::remote::Repeat_Track: emit SetRepeatMode(PlaylistSequence::Repeat_Track); break; case pb::remote::Repeat_Album: emit SetRepeatMode(PlaylistSequence::Repeat_Album); break; case pb::remote::Repeat_Playlist: emit SetRepeatMode(PlaylistSequence::Repeat_Playlist); break; default: break; } } void IncomingDataParser::SetShuffleMode(const pb::remote::Shuffle& shuffle) { switch (shuffle.shuffle_mode()) { case pb::remote::Shuffle_Off: emit SetShuffleMode(PlaylistSequence::Shuffle_Off); break; case pb::remote::Shuffle_All: emit SetShuffleMode(PlaylistSequence::Shuffle_All); break; case pb::remote::Shuffle_InsideAlbum: emit SetShuffleMode(PlaylistSequence::Shuffle_InsideAlbum); break; case pb::remote::Shuffle_Albums: emit SetShuffleMode(PlaylistSequence::Shuffle_Albums); break; default: break; } } void IncomingDataParser::InsertUrls(const pb::remote::Message& msg) { const pb::remote::RequestInsertUrls& request = msg.request_insert_urls(); // Insert plain urls without metadata if (request.urls().size() > 0) { QList urls; for (auto it = request.urls().begin(); it != request.urls().end(); ++it) { std::string s = *it; urls << QUrl(QStringFromStdString(s)); } // Insert the urls emit InsertUrls(request.playlist_id(), urls, request.position(), request.play_now(), request.enqueue()); } // Add songs with metadata if present if (request.songs().size() > 0) { SongList songs; for (int i = 0; i < request.songs().size(); i++) { songs << CreateSongFromProtobuf(request.songs(i)); } emit InsertSongs(request.playlist_id(), songs, request.position(), request.play_now(), request.enqueue()); } } void IncomingDataParser::RemoveSongs(const pb::remote::Message& msg) { const pb::remote::RequestRemoveSongs& request = msg.request_remove_songs(); // Extract urls QList songs; for (int i = 0; i < request.songs().size(); i++) { songs.append(request.songs(i)); } // Insert the urls emit RemoveSongs(request.playlist_id(), songs); } void IncomingDataParser::ClientConnect(const pb::remote::Message& msg, RemoteClient* client) { // Always sned the Clementine infos emit SendClementineInfo(); // Check if we should send the first data if (!client->isDownloader()) { if (!msg.request_connect().has_send_playlist_songs() // legacy || msg.request_connect().send_playlist_songs()) { emit SendFirstData(true); } else { emit SendFirstData(false); } } } void IncomingDataParser::SendPlaylists(const pb::remote::Message& msg) { if (!msg.has_request_playlists() || !msg.request_playlists().include_closed()) { emit SendAllActivePlaylists(); } else { emit SendAllPlaylists(); } } void IncomingDataParser::OpenPlaylist(const pb::remote::Message& msg) { emit Open(msg.request_open_playlist().playlist_id()); } void IncomingDataParser::ClosePlaylist(const pb::remote::Message& msg) { emit Close(msg.request_close_playlist().playlist_id()); } void IncomingDataParser::RateSong(const pb::remote::Message& msg) { double rating = (double)msg.request_rate_song().rating(); emit RateCurrentSong(rating); } void IncomingDataParser::GlobalSearch(RemoteClient *client, const pb::remote::Message &msg) { emit DoGlobalSearch(QStringFromStdString(msg.request_global_search().query()), client); } Song IncomingDataParser::CreateSongFromProtobuf(const pb::remote::SongMetadata& pb){ Song song; song.Init(QStringFromStdString(pb.title()), QStringFromStdString(pb.artist()), QStringFromStdString(pb.album()), pb.length() * kNsecPerSec); song.set_albumartist(QStringFromStdString(pb.albumartist())); song.set_genre(QStringFromStdString(pb.genre())); song.set_year(QStringFromStdString(pb.pretty_year()).toInt()); song.set_track(pb.track()); song.set_disc(pb.disc()); song.set_url(QUrl(QStringFromStdString(pb.url()))); song.set_filesize(pb.file_size()); song.set_rating(pb.rating()); song.set_basefilename(QStringFromStdString(pb.filename())); song.set_art_automatic(QStringFromStdString(pb.art_automatic())); song.set_art_manual(QStringFromStdString(pb.art_manual())); song.set_filetype(static_cast(pb.type())); return song; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/networkremote/incomingdataparser.h000066400000000000000000000044521260417502300271130ustar00rootroot00000000000000#ifndef INCOMINGDATAPARSER_H #define INCOMINGDATAPARSER_H #include "core/player.h" #include "core/application.h" #include "remotecontrolmessages.pb.h" #include "remoteclient.h" class IncomingDataParser : public QObject { Q_OBJECT public: IncomingDataParser(Application* app); ~IncomingDataParser(); bool close_connection(); public slots: void Parse(const pb::remote::Message& msg); signals: void SendClementineInfo(); void SendFirstData(bool send_playlist_songs); void SendAllPlaylists(); void SendAllActivePlaylists(); void SendPlaylistSongs(int id); void Open(int id); void Close(int id); void GetLyrics(); void Love(); void Ban(); void Play(); void PlayPause(); void Pause(); void Stop(); void StopAfterCurrent(); void Next(); void Previous(); void SetVolume(int volume); void PlayAt(int i, Engine::TrackChangeFlags change, bool reshuffle); void SetActivePlaylist(int id); void ShuffleCurrent(); void SetRepeatMode(PlaylistSequence::RepeatMode mode); void SetShuffleMode(PlaylistSequence::ShuffleMode mode); void InsertUrls(int id, const QList& urls, int pos, bool play_now, bool enqueue); void InsertSongs(int id, const SongList& songs, int pos, bool play_now, bool enqueue); void RemoveSongs(int id, const QList& indices); void SeekTo(int seconds); void SendLibrary(RemoteClient* client); void RateCurrentSong(double); void DoGlobalSearch(QString, RemoteClient*); private: Application* app_; bool close_connection_; void GetPlaylistSongs(const pb::remote::Message& msg); void ChangeSong(const pb::remote::Message& msg); void SetRepeatMode(const pb::remote::Repeat& repeat); void SetShuffleMode(const pb::remote::Shuffle& shuffle); void InsertUrls(const pb::remote::Message& msg); void RemoveSongs(const pb::remote::Message& msg); void ClientConnect(const pb::remote::Message& msg, RemoteClient* client); void SendPlaylists(const pb::remote::Message& msg); void OpenPlaylist(const pb::remote::Message& msg); void ClosePlaylist(const pb::remote::Message& msg); void RateSong(const pb::remote::Message& msg); void GlobalSearch(RemoteClient* client, const pb::remote::Message& msg); Song CreateSongFromProtobuf(const pb::remote::SongMetadata& pb); }; #endif // INCOMINGDATAPARSER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/networkremote/networkremote.cpp000066400000000000000000000204141260417502300264750ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, Andreas Muttscheller Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "networkremote.h" #include "core/logging.h" #include "covers/currentartloader.h" #include "networkremote/zeroconf.h" #include "playlist/playlistmanager.h" #include #include #include #include const char* NetworkRemote::kSettingsGroup = "NetworkRemote"; const quint16 NetworkRemote::kDefaultServerPort = 5500; const char* NetworkRemote::kTranscoderSettingPostfix = "/NetworkRemote"; NetworkRemote::NetworkRemote(Application* app, QObject* parent) : QObject(parent), signals_connected_(false), app_(app) {} NetworkRemote::~NetworkRemote() { StopServer(); } void NetworkRemote::ReadSettings() { QSettings s; s.beginGroup(NetworkRemote::kSettingsGroup); use_remote_ = s.value("use_remote", false).toBool(); port_ = s.value("port", kDefaultServerPort).toInt(); // Use only non public ips must be true be default only_non_public_ip_ = s.value("only_non_public_ip", true).toBool(); s.endGroup(); } void NetworkRemote::SetupServer() { server_.reset(new QTcpServer()); server_ipv6_.reset(new QTcpServer()); incoming_data_parser_.reset(new IncomingDataParser(app_)); outgoing_data_creator_.reset(new OutgoingDataCreator(app_)); outgoing_data_creator_->SetClients(&clients_); connect(app_->current_art_loader(), SIGNAL(ArtLoaded(const Song&, const QString&, const QImage&)), outgoing_data_creator_.get(), SLOT(CurrentSongChanged(const Song&, const QString&, const QImage&))); // Only connect the signals once connect(server_.get(), SIGNAL(newConnection()), this, SLOT(AcceptConnection())); connect(server_ipv6_.get(), SIGNAL(newConnection()), this, SLOT(AcceptConnection())); } void NetworkRemote::StartServer() { if (!app_) { qLog(Error) << "Start Server called without having an application!"; return; } // Check if user desires to start a network remote server ReadSettings(); if (!use_remote_) { qLog(Info) << "Network Remote deactivated"; return; } qLog(Info) << "Starting network remote"; server_->setProxy(QNetworkProxy::NoProxy); server_ipv6_->setProxy(QNetworkProxy::NoProxy); server_->listen(QHostAddress::Any, port_); server_ipv6_->listen(QHostAddress::AnyIPv6, port_); qLog(Info) << "Listening on port " << port_; if (Zeroconf::GetZeroconf()) { QString name = QString("Clementine on %1").arg(QHostInfo::localHostName()); Zeroconf::GetZeroconf()->Publish("local", "_clementine._tcp", name, port_); } } void NetworkRemote::StopServer() { if (server_->isListening()) { outgoing_data_creator_.get()->DisconnectAllClients(); server_->close(); server_ipv6_->close(); qDeleteAll(clients_); clients_.clear(); } } void NetworkRemote::ReloadSettings() { StopServer(); StartServer(); } void NetworkRemote::AcceptConnection() { if (!signals_connected_) { signals_connected_ = true; // Setting up the signals, but only once connect(incoming_data_parser_.get(), SIGNAL(SendClementineInfo()), outgoing_data_creator_.get(), SLOT(SendClementineInfo())); connect(incoming_data_parser_.get(), SIGNAL(SendFirstData(bool)), outgoing_data_creator_.get(), SLOT(SendFirstData(bool))); connect(incoming_data_parser_.get(), SIGNAL(SendAllPlaylists()), outgoing_data_creator_.get(), SLOT(SendAllPlaylists())); connect(incoming_data_parser_.get(), SIGNAL(SendAllActivePlaylists()), outgoing_data_creator_.get(), SLOT(SendAllActivePlaylists())); connect(incoming_data_parser_.get(), SIGNAL(SendPlaylistSongs(int)), outgoing_data_creator_.get(), SLOT(SendPlaylistSongs(int))); connect(app_->playlist_manager(), SIGNAL(ActiveChanged(Playlist*)), outgoing_data_creator_.get(), SLOT(ActiveChanged(Playlist*))); connect(app_->playlist_manager(), SIGNAL(PlaylistChanged(Playlist*)), outgoing_data_creator_.get(), SLOT(PlaylistChanged(Playlist*))); connect(app_->playlist_manager(), SIGNAL(PlaylistAdded(int, QString, bool)), outgoing_data_creator_.get(), SLOT(PlaylistAdded(int, QString, bool))); connect(app_->playlist_manager(), SIGNAL(PlaylistRenamed(int, QString)), outgoing_data_creator_.get(), SLOT(PlaylistRenamed(int, QString))); connect(app_->playlist_manager(), SIGNAL(PlaylistClosed(int)), outgoing_data_creator_.get(), SLOT(PlaylistClosed(int))); connect(app_->playlist_manager(), SIGNAL(PlaylistDeleted(int)), outgoing_data_creator_.get(), SLOT(PlaylistDeleted(int))); connect(app_->player(), SIGNAL(VolumeChanged(int)), outgoing_data_creator_.get(), SLOT(VolumeChanged(int))); connect(app_->player()->engine(), SIGNAL(StateChanged(Engine::State)), outgoing_data_creator_.get(), SLOT(StateChanged(Engine::State))); connect(app_->playlist_manager()->sequence(), SIGNAL(RepeatModeChanged(PlaylistSequence::RepeatMode)), outgoing_data_creator_.get(), SLOT(SendRepeatMode(PlaylistSequence::RepeatMode))); connect(app_->playlist_manager()->sequence(), SIGNAL(ShuffleModeChanged(PlaylistSequence::ShuffleMode)), outgoing_data_creator_.get(), SLOT(SendShuffleMode(PlaylistSequence::ShuffleMode))); connect(incoming_data_parser_.get(), SIGNAL(GetLyrics()), outgoing_data_creator_.get(), SLOT(GetLyrics())); connect(incoming_data_parser_.get(), SIGNAL(SendLibrary(RemoteClient*)), outgoing_data_creator_.get(), SLOT(SendLibrary(RemoteClient*))); connect(incoming_data_parser_.get(), SIGNAL(DoGlobalSearch(QString, RemoteClient*)), outgoing_data_creator_.get(), SLOT(DoGlobalSearch(QString, RemoteClient*))); } QTcpServer* server = qobject_cast(sender()); QTcpSocket* client_socket = server->nextPendingConnection(); // Check if our ip is in private scope if (only_non_public_ip_ && !IpIsPrivate(client_socket->peerAddress())) { qLog(Info) << "Got a connection from public ip" << client_socket->peerAddress().toString(); client_socket->close(); client_socket->deleteLater(); } else { CreateRemoteClient(client_socket); } } bool NetworkRemote::IpIsPrivate(const QHostAddress& address) { return // Localhost v4 address.isInSubnet(QHostAddress::parseSubnet("127.0.0.0/8")) || // Link Local v4 address.isInSubnet(QHostAddress::parseSubnet("169.254.1.0/16")) || // Link Local v6 address.isInSubnet(QHostAddress::parseSubnet("::1/128")) || address.isInSubnet(QHostAddress::parseSubnet("fe80::/10")) || // Private v4 range address.isInSubnet(QHostAddress::parseSubnet("192.168.0.0/16")) || address.isInSubnet(QHostAddress::parseSubnet("172.16.0.0/12")) || address.isInSubnet(QHostAddress::parseSubnet("10.0.0.0/8")) || // Private v6 range address.isInSubnet(QHostAddress::parseSubnet("fc00::/7")); } void NetworkRemote::CreateRemoteClient(QTcpSocket* client_socket) { if (client_socket) { // Add the client to the list RemoteClient* client = new RemoteClient(app_, client_socket); clients_.push_back(client); // Connect the signal to parse data connect(client, SIGNAL(Parse(pb::remote::Message)), incoming_data_parser_.get(), SLOT(Parse(pb::remote::Message))); } } void NetworkRemote::EnableKittens(bool aww) { if (outgoing_data_creator_.get()) outgoing_data_creator_->EnableKittens(aww); } void NetworkRemote::SendKitten(quint64 id, const QImage& kitten) { if (outgoing_data_creator_.get()) outgoing_data_creator_->SendKitten(kitten); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/networkremote/networkremote.h000066400000000000000000000024011260417502300261360ustar00rootroot00000000000000#ifndef NETWORKREMOTE_H #define NETWORKREMOTE_H #include #include #include #include "core/player.h" #include "core/application.h" #include "incomingdataparser.h" #include "outgoingdatacreator.h" #include "remoteclient.h" class NetworkRemote : public QObject { Q_OBJECT public: static const char* kSettingsGroup; static const quint16 kDefaultServerPort; static const char* kTranscoderSettingPostfix; explicit NetworkRemote(Application* app, QObject* parent = nullptr); ~NetworkRemote(); public slots: void SetupServer(); void StartServer(); void ReloadSettings(); void AcceptConnection(); void EnableKittens(bool aww); void SendKitten(quint64 id, const QImage& kitten); private: std::unique_ptr server_; std::unique_ptr server_ipv6_; std::unique_ptr incoming_data_parser_; std::unique_ptr outgoing_data_creator_; quint16 port_; bool use_remote_; bool only_non_public_ip_; bool signals_connected_; Application* app_; QList clients_; void StopServer(); void ReadSettings(); void CreateRemoteClient(QTcpSocket* client_socket); bool IpIsPrivate(const QHostAddress& address); }; #endif // NETWORKREMOTE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/networkremote/networkremotehelper.cpp000066400000000000000000000036131260417502300276770ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, Andreas Muttscheller Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "core/logging.h" #include "networkremote.h" #include "networkremotehelper.h" NetworkRemoteHelper* NetworkRemoteHelper::sInstance = nullptr; NetworkRemoteHelper::NetworkRemoteHelper(Application* app) : app_(app) { app_ = app; connect(this, SIGNAL(ReloadSettingsSig()), app_->network_remote(), SLOT(ReloadSettings())); connect(this, SIGNAL(StartServerSig()), app_->network_remote(), SLOT(StartServer())); connect(this, SIGNAL(SetupServerSig()), app_->network_remote(), SLOT(SetupServer())); // Start the server once the playlistmanager is initialized connect(app_->playlist_manager(), SIGNAL(PlaylistManagerInitialized()), this, SLOT(StartServer())); sInstance = this; } NetworkRemoteHelper::~NetworkRemoteHelper() {} void NetworkRemoteHelper::StartServer() { emit SetupServerSig(); emit StartServerSig(); } void NetworkRemoteHelper::ReloadSettings() { emit ReloadSettingsSig(); } // For using in Settingsdialog, we haven't the appication there NetworkRemoteHelper* NetworkRemoteHelper::Instance() { if (!sInstance) { // normally he shouldn't go here. Only for safety return nullptr; } return sInstance; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/networkremote/networkremotehelper.h000066400000000000000000000010431260417502300273370ustar00rootroot00000000000000#ifndef NETWORKREMOTEHELPER_H #define NETWORKREMOTEHELPER_H #include #include "networkremote.h" class NetworkRemoteHelper : public QObject { Q_OBJECT public: static NetworkRemoteHelper* Instance(); NetworkRemoteHelper(Application* app); ~NetworkRemoteHelper(); void ReloadSettings(); private slots: void StartServer(); signals: void SetupServerSig(); void StartServerSig(); void ReloadSettingsSig(); private: static NetworkRemoteHelper* sInstance; Application* app_; }; #endif // NETWORKREMOTEHELPER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/networkremote/outgoingdatacreator.cpp000066400000000000000000000565751260417502300276560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, Andreas Muttscheller Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "outgoingdatacreator.h" #include #include "networkremote.h" #include "core/logging.h" #include "core/timeconstants.h" #include "core/utilities.h" #include "globalsearch/librarysearchprovider.h" #include "library/librarybackend.h" #include "ui/iconloader.h" #include #include #include "core/database.h" const quint32 OutgoingDataCreator::kFileChunkSize = 100000; // in Bytes OutgoingDataCreator::OutgoingDataCreator(Application* app) : app_(app), aww_(false), ultimate_reader_(new UltimateLyricsReader(this)), fetcher_(new SongInfoFetcher(this)) { // Create Keep Alive Timer keep_alive_timer_ = new QTimer(this); connect(keep_alive_timer_, SIGNAL(timeout()), this, SLOT(SendKeepAlive())); keep_alive_timeout_ = 10000; } OutgoingDataCreator::~OutgoingDataCreator() {} void OutgoingDataCreator::SetClients(QList* clients) { clients_ = clients; // After we got some clients, start the keep alive timer // Default: every 10 seconds keep_alive_timer_->start(keep_alive_timeout_); // Create the song position timer track_position_timer_ = new QTimer(this); connect(track_position_timer_, SIGNAL(timeout()), this, SLOT(UpdateTrackPosition())); // Parse the ultimate lyrics xml file ultimate_reader_->SetThread(this->thread()); provider_list_ = ultimate_reader_->Parse(":lyrics/ultimate_providers.xml"); // Set up the lyrics parser connect(fetcher_, SIGNAL(ResultReady(int, SongInfoFetcher::Result)), SLOT(SendLyrics(int, SongInfoFetcher::Result))); for (SongInfoProvider* provider : provider_list_) { fetcher_->AddProvider(provider); } CheckEnabledProviders(); // Setup global search app_->global_search()->ReloadSettings(); connect(app_->global_search(), SIGNAL(ResultsAvailable(int, SearchProvider::ResultList)), SLOT(ResultsAvailable(int, SearchProvider::ResultList)), Qt::QueuedConnection); connect(app_->global_search(), SIGNAL(SearchFinished(int)), SLOT(SearchFinished(int)), Qt::QueuedConnection); } void OutgoingDataCreator::CheckEnabledProviders() { QSettings s; s.beginGroup(SongInfoView::kSettingsGroup); // Put the providers in the right order QList ordered_providers; QVariantList default_order; default_order << "lyrics.wikia.com" << "lyricstime.com" << "lyricsreg.com" << "lyricsmania.com" << "metrolyrics.com" << "azlyrics.com" << "songlyrics.com" << "elyrics.net" << "lyricsdownload.com" << "lyrics.com" << "lyricsbay.com" << "directlyrics.com" << "loudson.gs" << "teksty.org" << "tekstowo.pl (Polish translations)" << "vagalume.uol.com.br" << "vagalume.uol.com.br (Portuguese translations)" << "darklyrics.com"; QVariant saved_order = s.value("search_order", default_order); for (const QVariant& name : saved_order.toList()) { SongInfoProvider* provider = ProviderByName(name.toString()); if (provider) ordered_providers << provider; } // Enable all the providers in the list and rank them int relevance = 100; for (SongInfoProvider* provider : ordered_providers) { provider->set_enabled(true); qobject_cast(provider)->set_relevance(relevance--); } // Any lyric providers we don't have in ordered_providers are considered // disabled for (SongInfoProvider* provider : fetcher_->providers()) { if (qobject_cast(provider) && !ordered_providers.contains(provider)) { provider->set_enabled(false); } } } SongInfoProvider* OutgoingDataCreator::ProviderByName( const QString& name) const { for (SongInfoProvider* provider : fetcher_->providers()) { if (UltimateLyricsProvider* lyrics = qobject_cast(provider)) { if (lyrics->name() == name) return provider; } } return nullptr; } void OutgoingDataCreator::SendDataToClients(pb::remote::Message* msg) { // Check if we have clients to send data to if (clients_->empty()) { return; } for (RemoteClient* client : *clients_) { // Do not send data to downloaders if (client->isDownloader()) { if (client->State() != QTcpSocket::ConnectedState) { clients_->removeAt(clients_->indexOf(client)); delete client; } continue; } // Check if the client is still active if (client->State() == QTcpSocket::ConnectedState) { client->SendData(msg); } else { clients_->removeAt(clients_->indexOf(client)); delete client; } } } void OutgoingDataCreator::SendClementineInfo() { // Create the general message and set the message type pb::remote::Message msg; msg.set_type(pb::remote::INFO); // Now add the message specific data pb::remote::ResponseClementineInfo* info = msg.mutable_response_clementine_info(); SetEngineState(info); QString version = QString("%1 %2").arg(QCoreApplication::applicationName(), QCoreApplication::applicationVersion()); info->set_version(version.toAscii()); SendDataToClients(&msg); } void OutgoingDataCreator::SetEngineState( pb::remote::ResponseClementineInfo* msg) { switch (app_->player()->GetState()) { case Engine::Idle: msg->set_state(pb::remote::Idle); break; case Engine::Error: case Engine::Empty: msg->set_state(pb::remote::Empty); break; case Engine::Playing: msg->set_state(pb::remote::Playing); break; case Engine::Paused: msg->set_state(pb::remote::Paused); break; } } void OutgoingDataCreator::SendAllPlaylists() { // Get all Playlists QList app_playlists = app_->playlist_manager()->GetAllPlaylists(); int active_playlist = app_->playlist_manager()->active_id(); // Create message pb::remote::Message msg; msg.set_type(pb::remote::PLAYLISTS); pb::remote::ResponsePlaylists* playlists = msg.mutable_response_playlists(); // Get all playlists, even ones that are hidden in the UI. for (const PlaylistBackend::Playlist& p : app_->playlist_backend()->GetAllPlaylists()) { bool playlist_open = app_->playlist_manager()->IsPlaylistOpen(p.id); int item_count = playlist_open ? app_playlists.at(p.id)->rowCount() : 0; // Create a new playlist pb::remote::Playlist* playlist = playlists->add_playlist(); playlist->set_name(DataCommaSizeFromQString(p.name)); playlist->set_id(p.id); playlist->set_active((p.id == active_playlist)); playlist->set_item_count(item_count); playlist->set_closed(!playlist_open); } SendDataToClients(&msg); } void OutgoingDataCreator::SendAllActivePlaylists() { // Get all Playlists QList app_playlists = app_->playlist_manager()->GetAllPlaylists(); int active_playlist = app_->playlist_manager()->active_id(); // Create message pb::remote::Message msg; msg.set_type(pb::remote::PLAYLISTS); pb::remote::ResponsePlaylists* playlists = msg.mutable_response_playlists(); QListIterator it(app_playlists); while (it.hasNext()) { // Get the next Playlist Playlist* p = it.next(); QString playlist_name = app_->playlist_manager()->GetPlaylistName(p->id()); // Create a new playlist pb::remote::Playlist* playlist = playlists->add_playlist(); playlist->set_name(DataCommaSizeFromQString(playlist_name)); playlist->set_id(p->id()); playlist->set_active((p->id() == active_playlist)); playlist->set_item_count(p->rowCount()); playlist->set_closed(false); } SendDataToClients(&msg); } void OutgoingDataCreator::ActiveChanged(Playlist* playlist) { // Send the tracks of the active playlist SendPlaylistSongs(playlist->id()); // Send the changed message after sending the playlist songs pb::remote::Message msg; msg.set_type(pb::remote::ACTIVE_PLAYLIST_CHANGED); msg.mutable_response_active_changed()->set_id(playlist->id()); SendDataToClients(&msg); } void OutgoingDataCreator::PlaylistAdded(int id, const QString& name, bool favorite) { SendAllActivePlaylists(); } void OutgoingDataCreator::PlaylistDeleted(int id) { SendAllActivePlaylists(); } void OutgoingDataCreator::PlaylistClosed(int id) { SendAllActivePlaylists(); } void OutgoingDataCreator::PlaylistRenamed(int id, const QString& new_name) { SendAllActivePlaylists(); } void OutgoingDataCreator::SendFirstData(bool send_playlist_songs) { // First Send the current song PlaylistItemPtr item = app_->player()->GetCurrentItem(); if (!item) { qLog(Info) << "No current item found!"; } CurrentSongChanged(current_song_, current_uri_, current_image_); // then the current volume VolumeChanged(app_->player()->GetVolume()); // Check if we need to start the track position timer if (!track_position_timer_->isActive() && app_->player()->engine()->state() == Engine::Playing) { track_position_timer_->start(1000); } // And the current track position UpdateTrackPosition(); // And the current playlists SendAllActivePlaylists(); // Send the tracks of the active playlist if (send_playlist_songs) { SendPlaylistSongs(app_->playlist_manager()->active_id()); } // Send the current random and repeat mode SendShuffleMode(app_->playlist_manager()->sequence()->shuffle_mode()); SendRepeatMode(app_->playlist_manager()->sequence()->repeat_mode()); // We send all first data pb::remote::Message msg; msg.set_type(pb::remote::FIRST_DATA_SENT_COMPLETE); SendDataToClients(&msg); } void OutgoingDataCreator::CurrentSongChanged(const Song& song, const QString& uri, const QImage& img) { current_song_ = song; current_uri_ = uri; if (!aww_) { current_image_ = img; } SendSongMetadata(); } void OutgoingDataCreator::SendSongMetadata() { // Create the message pb::remote::Message msg; msg.set_type(pb::remote::CURRENT_METAINFO); // If there is no song, create an empty node, otherwise fill it with data int i = app_->playlist_manager()->active()->current_row(); CreateSong(current_song_, current_image_, i, msg.mutable_response_current_metadata()->mutable_song_metadata()); SendDataToClients(&msg); } void OutgoingDataCreator::CreateSong(const Song& song, const QImage& art, const int index, pb::remote::SongMetadata* song_metadata) { if (song.is_valid()) { song_metadata->set_id(song.id()); song_metadata->set_index(index); song_metadata->set_title(DataCommaSizeFromQString(song.PrettyTitle())); song_metadata->set_artist(DataCommaSizeFromQString(song.artist())); song_metadata->set_album(DataCommaSizeFromQString(song.album())); song_metadata->set_albumartist( DataCommaSizeFromQString(song.albumartist())); song_metadata->set_length(song.length_nanosec() / kNsecPerSec); song_metadata->set_pretty_length( DataCommaSizeFromQString(song.PrettyLength())); song_metadata->set_genre(DataCommaSizeFromQString(song.genre())); song_metadata->set_pretty_year(DataCommaSizeFromQString(song.PrettyYear())); song_metadata->set_track(song.track()); song_metadata->set_disc(song.disc()); song_metadata->set_playcount(song.playcount()); song_metadata->set_is_local(song.url().scheme() == "file"); song_metadata->set_filename(DataCommaSizeFromQString(song.basefilename())); song_metadata->set_file_size(song.filesize()); song_metadata->set_rating(song.rating()); song_metadata->set_url(DataCommaSizeFromQString(song.url().toString())); song_metadata->set_art_automatic( DataCommaSizeFromQString(song.art_automatic())); song_metadata->set_art_manual(DataCommaSizeFromQString(song.art_manual())); song_metadata->set_type( static_cast< ::pb::remote::SongMetadata_Type>(song.filetype())); // Append coverart if (!art.isNull()) { QImage small; // Check if we resize the image if (art.width() > 1000 || art.height() > 1000) { small = art.scaled(1000, 1000, Qt::KeepAspectRatio); } else { small = art; } // Read the image in a buffer and compress it QByteArray data; QBuffer buf(&data); buf.open(QIODevice::WriteOnly); small.save(&buf, "JPG"); // Append the Data in the protocol buffer song_metadata->set_art(data.constData(), data.size()); } } } void OutgoingDataCreator::VolumeChanged(int volume) { // Create the message pb::remote::Message msg; msg.set_type(pb::remote::SET_VOLUME); msg.mutable_request_set_volume()->set_volume(volume); SendDataToClients(&msg); } void OutgoingDataCreator::SendPlaylistSongs(int id) { // Get the PlaylistQByteArray(data.data(), data.size() Playlist* playlist = app_->playlist_manager()->playlist(id); if (!playlist) { qLog(Info) << "Could not find playlist with id = " << id; return; } // Create the message and the playlist pb::remote::Message msg; msg.set_type(pb::remote::PLAYLIST_SONGS); // Create the Response message pb::remote::ResponsePlaylistSongs* pb_response_playlist_songs = msg.mutable_response_playlist_songs(); // Create a new playlist pb::remote::Playlist* pb_playlist = pb_response_playlist_songs->mutable_requested_playlist(); pb_playlist->set_id(id); // Send all songs int index = 0; SongList song_list = playlist->GetAllSongs(); QListIterator it(song_list); QImage null_img; while (it.hasNext()) { Song song = it.next(); pb::remote::SongMetadata* pb_song = pb_response_playlist_songs->add_songs(); CreateSong(song, null_img, index, pb_song); ++index; } SendDataToClients(&msg); } void OutgoingDataCreator::PlaylistChanged(Playlist* playlist) { // If a playlist changed, then send the new songs to the client SendPlaylistSongs(playlist->id()); } void OutgoingDataCreator::StateChanged(Engine::State state) { // Send state only if it changed // When selecting next song, StateChanged is emitted, but we already know // that we are playing if (state == last_state_) { return; } last_state_ = state; pb::remote::Message msg; switch (state) { case Engine::Playing: msg.set_type(pb::remote::PLAY); track_position_timer_->start(1000); break; case Engine::Paused: msg.set_type(pb::remote::PAUSE); track_position_timer_->stop(); break; case Engine::Empty: msg.set_type(pb::remote::STOP); // Empty is called when player stopped track_position_timer_->stop(); break; default: msg.set_type(pb::remote::STOP); track_position_timer_->stop(); break; }; SendDataToClients(&msg); } void OutgoingDataCreator::SendRepeatMode(PlaylistSequence::RepeatMode mode) { pb::remote::Message msg; msg.set_type(pb::remote::REPEAT); switch (mode) { case PlaylistSequence::Repeat_Off: msg.mutable_repeat()->set_repeat_mode(pb::remote::Repeat_Off); break; case PlaylistSequence::Repeat_Track: msg.mutable_repeat()->set_repeat_mode(pb::remote::Repeat_Track); break; case PlaylistSequence::Repeat_Album: msg.mutable_repeat()->set_repeat_mode(pb::remote::Repeat_Album); break; case PlaylistSequence::Repeat_Playlist: msg.mutable_repeat()->set_repeat_mode(pb::remote::Repeat_Playlist); break; case PlaylistSequence::Repeat_OneByOne: msg.mutable_repeat()->set_repeat_mode(pb::remote::Repeat_OneByOne); break; case PlaylistSequence::Repeat_Intro: msg.mutable_repeat()->set_repeat_mode(pb::remote::Repeat_Intro); break; } SendDataToClients(&msg); } void OutgoingDataCreator::SendShuffleMode(PlaylistSequence::ShuffleMode mode) { pb::remote::Message msg; msg.set_type(pb::remote::SHUFFLE); switch (mode) { case PlaylistSequence::Shuffle_Off: msg.mutable_shuffle()->set_shuffle_mode(pb::remote::Shuffle_Off); break; case PlaylistSequence::Shuffle_All: msg.mutable_shuffle()->set_shuffle_mode(pb::remote::Shuffle_All); break; case PlaylistSequence::Shuffle_InsideAlbum: msg.mutable_shuffle()->set_shuffle_mode(pb::remote::Shuffle_InsideAlbum); break; case PlaylistSequence::Shuffle_Albums: msg.mutable_shuffle()->set_shuffle_mode(pb::remote::Shuffle_Albums); break; } SendDataToClients(&msg); } void OutgoingDataCreator::SendKeepAlive() { pb::remote::Message msg; msg.set_type(pb::remote::KEEP_ALIVE); SendDataToClients(&msg); } void OutgoingDataCreator::UpdateTrackPosition() { pb::remote::Message msg; msg.set_type(pb::remote::UPDATE_TRACK_POSITION); int position = std::floor( float(app_->player()->engine()->position_nanosec()) / kNsecPerSec + 0.5); if (app_->player()->engine()->position_nanosec() > current_song_.length_nanosec()) position = last_track_position_; msg.mutable_response_update_track_position()->set_position(position); last_track_position_ = position; SendDataToClients(&msg); } void OutgoingDataCreator::DisconnectAllClients() { pb::remote::Message msg; msg.set_type(pb::remote::DISCONNECT); msg.mutable_response_disconnect()->set_reason_disconnect( pb::remote::Server_Shutdown); SendDataToClients(&msg); } void OutgoingDataCreator::GetLyrics() { fetcher_->FetchInfo(current_song_); } void OutgoingDataCreator::SendLyrics(int id, const SongInfoFetcher::Result& result) { pb::remote::Message msg; msg.set_type(pb::remote::LYRICS); pb::remote::ResponseLyrics* response = msg.mutable_response_lyrics(); for (const CollapsibleInfoPane::Data& data : result.info_) { // If the size is zero, do not send the provider UltimateLyricsLyric* editor = qobject_cast(data.content_object_); if (editor->toPlainText().length() == 0) continue; pb::remote::Lyric* lyric = response->mutable_lyrics()->Add(); lyric->set_id(DataCommaSizeFromQString(data.id_)); lyric->set_title(DataCommaSizeFromQString(data.title_)); lyric->set_content(DataCommaSizeFromQString(editor->toPlainText())); } SendDataToClients(&msg); results_.take(id); } void OutgoingDataCreator::SendLibrary(RemoteClient* client) { // Get a temporary file name QString temp_file_name = Utilities::GetTemporaryFileName(); // Attach this file to the database Database::AttachedDatabase adb(temp_file_name, "", true); QSqlDatabase db(app_->database()->Connect()); app_->database()->AttachDatabaseOnDbConnection("songs_export", adb, db); // Copy the content of the song table to this temporary database QSqlQuery q(QString( "create table songs_export.songs as SELECT * FROM songs " "where unavailable = 0;"), db); if (app_->database()->CheckErrors(q)) return; // Detach the database app_->database()->DetachDatabase("songs_export"); // Open the file QFile file(temp_file_name); // Get the sha1 hash QByteArray sha1 = Utilities::Sha1File(file).toHex(); qLog(Debug) << "Library sha1" << sha1; file.open(QIODevice::ReadOnly); QByteArray data; pb::remote::Message msg; pb::remote::ResponseLibraryChunk* chunk = msg.mutable_response_library_chunk(); msg.set_type(pb::remote::LIBRARY_CHUNK); // Calculate the number of chunks int chunk_count = qRound((file.size() / kFileChunkSize) + 0.5); int chunk_number = 1; while (!file.atEnd()) { // Read file chunk data = file.read(kFileChunkSize); // Set chunk data chunk->set_chunk_count(chunk_count); chunk->set_chunk_number(chunk_number); chunk->set_size(file.size()); chunk->set_data(data.data(), data.size()); chunk->set_file_hash(sha1.data(), sha1.size()); // Send data directly to the client client->SendData(&msg); // Clear working data chunk->Clear(); data.clear(); chunk_number++; } // Remove temporary file file.remove(); } void OutgoingDataCreator::EnableKittens(bool aww) { aww_ = aww; } void OutgoingDataCreator::SendKitten(const QImage& kitten) { if (aww_) { current_image_ = kitten; SendSongMetadata(); } } void OutgoingDataCreator::DoGlobalSearch(const QString& query, RemoteClient* client) { int id = app_->global_search()->SearchAsync(query); GlobalSearchRequest request(id, query, client); global_search_result_map_.insert(id, request); // Send status message pb::remote::Message msg; pb::remote::ResponseGlobalSearchStatus* status = msg.mutable_response_global_search_status(); msg.set_type(pb::remote::GLOBAL_SEARCH_STATUS); status->set_id(id); status->set_query(DataCommaSizeFromQString(query)); status->set_status(pb::remote::GlobalSearchStarted); client->SendData(&msg); qLog(Debug) << "DoGlobalSearch" << id << query; } void OutgoingDataCreator::ResultsAvailable( int id, const SearchProvider::ResultList& results) { if (!global_search_result_map_.contains(id)) return; GlobalSearchRequest search_request = global_search_result_map_.value(id); RemoteClient* client = search_request.client_; QImage null_img; pb::remote::Message msg; pb::remote::ResponseGlobalSearch* response = msg.mutable_response_global_search(); msg.set_type(pb::remote::GLOBAL_SEARCH_RESULT); response->set_id(search_request.id_); response->set_query(DataCommaSizeFromQString(search_request.query_)); response->set_search_provider( DataCommaSizeFromQString(results.first().provider_->name())); // Append the icon QImage icon_image(results.first().provider_->icon_as_image()); QByteArray byte_array; QBuffer buf(&byte_array); buf.open(QIODevice::WriteOnly); icon_image.save(&buf, "PNG"); response->set_search_provider_icon(byte_array.constData(), byte_array.size()); for (const SearchProvider::Result& result : results) { pb::remote::SongMetadata* pb_song = response->add_song_metadata(); CreateSong(result.metadata_, null_img, 0, pb_song); } client->SendData(&msg); qLog(Debug) << "ResultsAvailable" << id << results.first().provider_->name() << results.size(); } void OutgoingDataCreator::SearchFinished(int id) { if (!global_search_result_map_.contains(id)) return; GlobalSearchRequest req = global_search_result_map_.take(id); // Send status message pb::remote::Message msg; pb::remote::ResponseGlobalSearchStatus* status = msg.mutable_response_global_search_status(); msg.set_type(pb::remote::GLOBAL_SEARCH_STATUS); status->set_id(req.id_); status->set_query(DataCommaSizeFromQString(req.query_)); status->set_status(pb::remote::GlobalSearchFinished); req.client_->SendData(&msg); qLog(Debug) << "SearchFinished" << req.id_ << req.query_; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/networkremote/outgoingdatacreator.h000066400000000000000000000066071260417502300273120ustar00rootroot00000000000000#ifndef OUTGOINGDATACREATOR_H #define OUTGOINGDATACREATOR_H #include #include #include #include #include #include #include #include "core/player.h" #include "core/application.h" #include "engines/enginebase.h" #include "engines/engine_fwd.h" #include "globalsearch/globalsearch.h" #include "playlist/playlist.h" #include "playlist/playlistmanager.h" #include "playlist/playlistbackend.h" #include "songinfo/collapsibleinfopane.h" #include "songinfo/songinfofetcher.h" #include "songinfo/songinfoprovider.h" #include "songinfo/songinfoview.h" #include "songinfo/ultimatelyricslyric.h" #include "songinfo/ultimatelyricsprovider.h" #include "songinfo/ultimatelyricsreader.h" #include "remotecontrolmessages.pb.h" #include "remoteclient.h" typedef QList ProviderList; struct GlobalSearchRequest { int id_; QString query_; RemoteClient* client_; GlobalSearchRequest() : id_(-1), client_(nullptr) {} GlobalSearchRequest(int i, const QString& q, RemoteClient* c) : id_(i), query_(q), client_(c) {} }; class OutgoingDataCreator : public QObject { Q_OBJECT public: OutgoingDataCreator(Application* app); ~OutgoingDataCreator(); static const quint32 kFileChunkSize; void SetClients(QList* clients); static void CreateSong(const Song& song, const QImage& art, const int index, pb::remote::SongMetadata* song_metadata); public slots: void SendClementineInfo(); void SendAllPlaylists(); void SendAllActivePlaylists(); void SendFirstData(bool send_playlist_songs); void SendPlaylistSongs(int id); void PlaylistChanged(Playlist*); void VolumeChanged(int volume); void PlaylistAdded(int id, const QString& name, bool favorite); void PlaylistDeleted(int id); void PlaylistClosed(int id); void PlaylistRenamed(int id, const QString& new_name); void ActiveChanged(Playlist*); void CurrentSongChanged(const Song& song, const QString& uri, const QImage& img); void SendSongMetadata(); void StateChanged(Engine::State); void SendKeepAlive(); void SendRepeatMode(PlaylistSequence::RepeatMode mode); void SendShuffleMode(PlaylistSequence::ShuffleMode mode); void UpdateTrackPosition(); void DisconnectAllClients(); void GetLyrics(); void SendLyrics(int id, const SongInfoFetcher::Result& result); void SendLibrary(RemoteClient* client); void EnableKittens(bool aww); void SendKitten(const QImage& kitten); void DoGlobalSearch(const QString& query, RemoteClient* client); void ResultsAvailable(int id, const SearchProvider::ResultList& results); void SearchFinished(int id); private: Application* app_; QList* clients_; Song current_song_; QString current_uri_; QImage current_image_; Engine::State last_state_; QTimer* keep_alive_timer_; QTimer* track_position_timer_; int keep_alive_timeout_; int last_track_position_; bool aww_; std::unique_ptr ultimate_reader_; ProviderList provider_list_; QMap results_; SongInfoFetcher* fetcher_; QMap global_search_result_map_; void SendDataToClients(pb::remote::Message* msg); void SetEngineState(pb::remote::ResponseClementineInfo* msg); void CheckEnabledProviders(); SongInfoProvider* ProviderByName(const QString& name) const; }; #endif // OUTGOINGDATACREATOR_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/networkremote/remoteclient.cpp000066400000000000000000000126671260417502300262750ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2013, Andreas Muttscheller Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "core/logging.h" #include "remoteclient.h" #include "networkremote.h" #include #include RemoteClient::RemoteClient(Application* app, QTcpSocket* client) : app_(app), downloader_(false), client_(client), song_sender_(new SongSender(app, this)) { // Open the buffer buffer_.setData(QByteArray()); buffer_.open(QIODevice::ReadWrite); reading_protobuf_ = false; // Connect to the slot IncomingData when receiving data connect(client, SIGNAL(readyRead()), this, SLOT(IncomingData())); // Check if we use auth code QSettings s; s.beginGroup(NetworkRemote::kSettingsGroup); use_auth_code_ = s.value("use_auth_code", false).toBool(); auth_code_ = s.value("auth_code", 0).toInt(); allow_downloads_ = s.value("allow_downloads", false).toBool(); s.endGroup(); // If we don't use an auth code, we don't need to authenticate the client. authenticated_ = !use_auth_code_; } RemoteClient::~RemoteClient() { client_->close(); if (client_->state() == QAbstractSocket::ConnectedState) client_->waitForDisconnected(2000); song_sender_->deleteLater(); client_->deleteLater(); } void RemoteClient::setDownloader(bool downloader) { downloader_ = downloader; } void RemoteClient::IncomingData() { while (client_->bytesAvailable()) { if (!reading_protobuf_) { // Read the length of the next message QDataStream s(client_); s >> expected_length_; // Receiving more than 128mb is very unlikely // Flush the data and disconnect the client if (expected_length_ > 134217728) { qLog(Debug) << "Received invalid data, disconnect client"; qLog(Debug) << "expected_length_ =" << expected_length_; client_->close(); return; } reading_protobuf_ = true; } // Read some of the message buffer_.write(client_->read(expected_length_ - buffer_.size())); // Did we get everything? if (buffer_.size() == expected_length_) { // Parse the message ParseMessage(buffer_.data()); // Clear the buffer buffer_.close(); buffer_.setData(QByteArray()); buffer_.open(QIODevice::ReadWrite); reading_protobuf_ = false; } } } void RemoteClient::ParseMessage(const QByteArray& data) { pb::remote::Message msg; if (!msg.ParseFromArray(data.constData(), data.size())) { qLog(Info) << "Couldn't parse data"; return; } if (msg.type() == pb::remote::CONNECT && use_auth_code_) { if (msg.request_connect().auth_code() != auth_code_) { DisconnectClient(pb::remote::Wrong_Auth_Code); return; } else { authenticated_ = true; } } if (msg.type() == pb::remote::CONNECT) { setDownloader(msg.request_connect().downloader()); qDebug() << "Downloader" << downloader_; } // Check if downloads are allowed if (msg.type() == pb::remote::DOWNLOAD_SONGS && !allow_downloads_) { DisconnectClient(pb::remote::Download_Forbidden); return; } if (msg.type() == pb::remote::DISCONNECT) { client_->abort(); qDebug() << "Client disconnected"; return; } // Check if the client has sent the correct auth code if (!authenticated_) { DisconnectClient(pb::remote::Not_Authenticated); return; } // Now parse the other data emit Parse(msg); } void RemoteClient::DisconnectClient(pb::remote::ReasonDisconnect reason) { pb::remote::Message msg; msg.set_type(pb::remote::DISCONNECT); msg.mutable_response_disconnect()->set_reason_disconnect(reason); SendDataToClient(&msg); // Just close the connection. The next time the outgoing data creator // sends a keep alive, the client will be deleted client_->close(); } // Sends data to client without check if authenticated void RemoteClient::SendDataToClient(pb::remote::Message* msg) { // Set the default version msg->set_version(msg->default_instance().version()); // Check if we are still connected if (client_->state() == QTcpSocket::ConnectedState) { // Serialize the message std::string data = msg->SerializeAsString(); // write the length of the data first QDataStream s(client_); s << qint32(data.length()); if (downloader_) { // Don't use QDataSteam for large files client_->write(data.data(), data.length()); } else { s.writeRawData(data.data(), data.length()); } // Do NOT flush data here! If the client is already disconnected, it // causes a SIGPIPE termination!!! } else { qDebug() << "Closed"; client_->close(); } } void RemoteClient::SendData(pb::remote::Message* msg) { // Check if client is authenticated before sending the data if (authenticated_) { SendDataToClient(msg); } } QAbstractSocket::SocketState RemoteClient::State() { return client_->state(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/networkremote/remoteclient.h000066400000000000000000000023411260417502300257260ustar00rootroot00000000000000#ifndef REMOTECLIENT_H #define REMOTECLIENT_H #include #include #include #include "songsender.h" #include "core/application.h" #include "remotecontrolmessages.pb.h" class RemoteClient : public QObject { Q_OBJECT public: RemoteClient(Application* app, QTcpSocket* client); ~RemoteClient(); // This method checks if client is authenticated before sending the data void SendData(pb::remote::Message* msg); QAbstractSocket::SocketState State(); void setDownloader(bool downloader); bool isDownloader() { return downloader_; } void DisconnectClient(pb::remote::ReasonDisconnect reason); SongSender* song_sender() { return song_sender_; } private slots: void IncomingData(); signals: void Parse(const pb::remote::Message& msg); private: void ParseMessage(const QByteArray& data); // Sends data to client without check if authenticated void SendDataToClient(pb::remote::Message* msg); Application* app_; bool use_auth_code_; int auth_code_; bool authenticated_; bool allow_downloads_; bool downloader_; QTcpSocket* client_; bool reading_protobuf_; quint32 expected_length_; QBuffer buffer_; SongSender* song_sender_; }; #endif // REMOTECLIENT_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/networkremote/songsender.cpp000066400000000000000000000241301260417502300257360ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, Andreas Muttscheller Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "songsender.h" #include "networkremote.h" #include #include "core/application.h" #include "core/logging.h" #include "core/utilities.h" #include "library/librarybackend.h" #include "playlist/playlistitem.h" const quint32 SongSender::kFileChunkSize = 100000; // in Bytes SongSender::SongSender(Application* app, RemoteClient* client) : app_(app), client_(client), transcoder_(new Transcoder(this)) { QSettings s; s.beginGroup(NetworkRemote::kSettingsGroup); transcode_lossless_files_ = s.value("convert_lossless", false).toBool(); // Load preset QString last_output_format = s.value("last_output_format", "audio/x-vorbis").toString(); QList presets = transcoder_->GetAllPresets(); for (int i = 0; iCancel(); } void SongSender::SendSongs(const pb::remote::RequestDownloadSongs& request) { Song current_song; if (app_->player()->GetCurrentItem()) { current_song = app_->player()->GetCurrentItem()->Metadata(); } switch (request.download_item()) { case pb::remote::CurrentItem: { if (current_song.is_valid()) { DownloadItem item(current_song, 1, 1); download_queue_.append(item); } break; } case pb::remote::ItemAlbum: if (current_song.is_valid()) { SendAlbum(current_song); } break; case pb::remote::APlaylist: SendPlaylist(request.playlist_id()); break; case pb::remote::Urls: SendUrls(request); break; default: break; } if (transcode_lossless_files_) { TranscodeLosslessFiles(); } else { StartTransfer(); } } void SongSender::TranscodeLosslessFiles() { for (DownloadItem item : download_queue_) { // Check only lossless files if (!item.song_.IsFileLossless()) continue; // Add the file to the transcoder QString local_file = item.song_.url().toLocalFile(); transcoder_->AddTemporaryJob(local_file, transcoder_preset_); qLog(Debug) << "transcoding" << local_file; total_transcode_++; } if (total_transcode_ > 0) { transcoder_->Start(); SendTranscoderStatus(); } else { StartTransfer(); } } void SongSender::TranscodeJobComplete(const QString& input, const QString& output, bool success) { qLog(Debug) << input << "transcoded to" << output << success; // If it wasn't successful send original file if (success) { transcoder_map_.insert(input, output); } SendTranscoderStatus(); } void SongSender::SendTranscoderStatus() { // Send a message to the remote that we are converting files pb::remote::Message msg; msg.set_type(pb::remote::TRANSCODING_FILES); pb::remote::ResponseTranscoderStatus* status = msg.mutable_response_transcoder_status(); status->set_processed(transcoder_map_.count()); status->set_total(total_transcode_); client_->SendData(&msg); } void SongSender::StartTransfer() { total_transcode_ = 0; // Send total file size & file count SendTotalFileSize(); // Send first file OfferNextSong(); } void SongSender::SendTotalFileSize() { pb::remote::Message msg; msg.set_type(pb::remote::DOWNLOAD_TOTAL_SIZE); pb::remote::ResponseDownloadTotalSize* response = msg.mutable_response_download_total_size(); response->set_file_count(download_queue_.size()); int total = 0; for (DownloadItem item : download_queue_) { QString local_file = item.song_.url().toLocalFile(); bool is_transcoded = transcoder_map_.contains(local_file); if (is_transcoded) { local_file = transcoder_map_.value(local_file); } total += QFileInfo(local_file).size(); } response->set_total_size(total); client_->SendData(&msg); } void SongSender::OfferNextSong() { pb::remote::Message msg; if (download_queue_.isEmpty()) { msg.set_type(pb::remote::DOWNLOAD_QUEUE_EMPTY); } else { // Get the item and send the single song DownloadItem item = download_queue_.head(); msg.set_type(pb::remote::SONG_FILE_CHUNK); pb::remote::ResponseSongFileChunk* chunk = msg.mutable_response_song_file_chunk(); // Open the file QFile file(item.song_.url().toLocalFile()); // Song offer is chunk no 0 chunk->set_chunk_count(0); chunk->set_chunk_number(0); chunk->set_file_count(item.song_count_); chunk->set_file_number(item.song_no_); chunk->set_size(file.size()); OutgoingDataCreator::CreateSong(item.song_, QImage(), -1, chunk->mutable_song_metadata()); } client_->SendData(&msg); } void SongSender::ResponseSongOffer(bool accepted) { if (download_queue_.isEmpty()) return; // Get the item and send the single song DownloadItem item = download_queue_.dequeue(); if (accepted) SendSingleSong(item); // And offer the next song OfferNextSong(); } void SongSender::SendSingleSong(DownloadItem download_item) { // Only local files!!! if (!(download_item.song_.url().scheme() == "file")) return; QString local_file = download_item.song_.url().toLocalFile(); bool is_transcoded = transcoder_map_.contains(local_file); if (is_transcoded) { local_file = transcoder_map_.take(local_file); } // Open the file QFile file(local_file); // Get sha1 for file QByteArray sha1 = Utilities::Sha1File(file).toHex(); qLog(Debug) << "sha1 for file" << local_file << "=" << sha1; file.open(QIODevice::ReadOnly); QByteArray data; pb::remote::Message msg; pb::remote::ResponseSongFileChunk* chunk = msg.mutable_response_song_file_chunk(); msg.set_type(pb::remote::SONG_FILE_CHUNK); QImage null_image; // Calculate the number of chunks int chunk_count = qRound((file.size() / kFileChunkSize) + 0.5); int chunk_number = 1; while (!file.atEnd()) { // Read file chunk data = file.read(kFileChunkSize); // Set chunk data chunk->set_chunk_count(chunk_count); chunk->set_chunk_number(chunk_number); chunk->set_file_count(download_item.song_count_); chunk->set_file_number(download_item.song_no_); chunk->set_size(file.size()); chunk->set_data(data.data(), data.size()); chunk->set_file_hash(sha1.data(), sha1.size()); // On the first chunk send the metadata, so the client knows // what file it receives. if (chunk_number == 1) { int i = app_->playlist_manager()->active()->current_row(); pb::remote::SongMetadata* song_metadata = msg.mutable_response_song_file_chunk()->mutable_song_metadata(); OutgoingDataCreator::CreateSong(download_item.song_, null_image, i,song_metadata); // if the file was transcoded, we have to change the filename and filesize if (is_transcoded) { song_metadata->set_file_size(file.size()); QString basefilename = download_item.song_.basefilename(); QFileInfo info(basefilename); basefilename.replace("." + info.suffix(), "." + transcoder_preset_.extension_); song_metadata->set_filename(DataCommaSizeFromQString(basefilename)); } } // Send data directly to the client client_->SendData(&msg); // Clear working data chunk->Clear(); data.clear(); chunk_number++; } // If the file was transcoded, delete the temporary one if (is_transcoded) { file.remove(); } else { file.close(); } } void SongSender::SendAlbum(const Song& song) { // No streams! if (song.url().scheme() != "file") return; SongList album = app_->library_backend()->GetSongsByAlbum(song.album()); for (Song s : album) { DownloadItem item(s, album.indexOf(s) + 1, album.size()); download_queue_.append(item); } } void SongSender::SendPlaylist(int playlist_id) { Playlist* playlist = app_->playlist_manager()->playlist(playlist_id); if (!playlist) { qLog(Info) << "Could not find playlist with id = " << playlist_id; return; } SongList song_list = playlist->GetAllSongs(); // Count the local songs int count = 0; for (Song s : song_list) { if (s.url().scheme() == "file") { count++; } } for (Song s : song_list) { // Only local files! if (s.url().scheme() == "file") { DownloadItem item(s, song_list.indexOf(s) + 1, count); download_queue_.append(item); } } } void SongSender::SendUrls(const pb::remote::RequestDownloadSongs &request) { SongList song_list; // First gather all valid songs for (auto it = request.urls().begin(); it != request.urls().end(); ++it) { std::string s = *it; QUrl url = QUrl(QStringFromStdString(s)); Song song = app_->library_backend()->GetSongByUrl(url); if (song.is_valid() && song.url().scheme() == "file") { song_list.append(song); } } // Then send them to Clementine Remote for (Song s : song_list) { DownloadItem item(s, song_list.indexOf(s) + 1, song_list.count()); download_queue_.append(item); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/networkremote/songsender.h000066400000000000000000000026401260417502300254050ustar00rootroot00000000000000#ifndef SONGSENDER_H #define SONGSENDER_H #include #include #include #include "remotecontrolmessages.pb.h" #include "core/song.h" #include "transcoder/transcoder.h" class Application; class RemoteClient; class Transcoder; struct DownloadItem { Song song_; int song_no_; int song_count_; DownloadItem(Song s, int no, int count) : song_(s), song_no_(no), song_count_(count) {} }; class SongSender : public QObject { Q_OBJECT public: SongSender(Application* app, RemoteClient* client); ~SongSender(); static const quint32 kFileChunkSize; public slots: void SendSongs(const pb::remote::RequestDownloadSongs& request); void ResponseSongOffer(bool accepted); private slots: void TranscodeJobComplete(const QString& input, const QString& output, bool success); void StartTransfer(); private: Application* app_; RemoteClient* client_; TranscoderPreset transcoder_preset_; Transcoder* transcoder_; bool transcode_lossless_files_; QQueue download_queue_; QMap transcoder_map_; int total_transcode_; void SendSingleSong(DownloadItem download_item); void SendAlbum(const Song& song); void SendPlaylist(int playlist_id); void SendUrls(const pb::remote::RequestDownloadSongs& request); void OfferNextSong(); void SendTotalFileSize(); void TranscodeLosslessFiles(); void SendTranscoderStatus(); }; #endif // SONGSENDER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/networkremote/tinysvcmdns.cpp000066400000000000000000000045631260417502300261600ustar00rootroot00000000000000#include "tinysvcmdns.h" extern "C" { #include "mdnsd.h" } #include #include #include #include "core/logging.h" void TinySVCMDNS::CreateMdnsd(uint32_t ipv4, QString ipv6) { // Get our hostname QString host = QHostInfo::localHostName(); // Start the service mdnsd* mdnsd = mdnsd_start_bind(ipv4); // Set our hostname mdnsd_set_hostname(mdnsd, QString(host + ".local").toUtf8().constData(), ipv4); // Add to the list mdnsd_.append(mdnsd); } TinySVCMDNS::TinySVCMDNS() { // Get all network interfaces QList network_interfaces = QNetworkInterface::allInterfaces(); for (QNetworkInterface network_interface : network_interfaces) { // Only use up and non loopback interfaces if (network_interface.flags().testFlag(network_interface.IsUp) && !network_interface.flags().testFlag(network_interface.IsLoopBack)) { uint32_t ipv4 = 0; QString ipv6; qLog(Debug) << "Interface" << network_interface.humanReadableName(); // Now check all network addresses for this device QList network_address_entries = network_interface.addressEntries(); for (QNetworkAddressEntry network_address_entry : network_address_entries) { QHostAddress host_address = network_address_entry.ip(); if (host_address.protocol() == QAbstractSocket::IPv4Protocol) { ipv4 = qToBigEndian(host_address.toIPv4Address()); qLog(Debug) << " ipv4:" << host_address.toString(); } else if (host_address.protocol() == QAbstractSocket::IPv6Protocol) { ipv6 = host_address.toString(); qLog(Debug) << " ipv6:" << host_address.toString(); } } // Now start the service CreateMdnsd(ipv4, ipv6); } } } TinySVCMDNS::~TinySVCMDNS() { for (mdnsd* mdnsd : mdnsd_) { mdnsd_stop(mdnsd); } } void TinySVCMDNS::PublishInternal(const QString& domain, const QString& type, const QByteArray& name, quint16 port) { // Some pointless text, so tinymDNS publishes the service correctly. const char* txt[] = {"cat=nyan", nullptr}; for (mdnsd* mdnsd : mdnsd_) { mdnsd_register_svc(mdnsd, name.constData(), QString(type + ".local").toUtf8().constData(), port, nullptr, txt); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/networkremote/tinysvcmdns.h000066400000000000000000000007151260417502300256200ustar00rootroot00000000000000#ifndef TINYSVCMDNS_H #define TINYSVCMDNS_H #include "zeroconf.h" #include struct mdnsd; class TinySVCMDNS : public Zeroconf { public: TinySVCMDNS(); virtual ~TinySVCMDNS(); protected: virtual void PublishInternal(const QString& domain, const QString& type, const QByteArray& name, quint16 port); private: void CreateMdnsd(uint32_t ipv4, QString ipv6); QList mdnsd_; }; #endif // TINYSVCMDNS_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/networkremote/zeroconf.cpp000066400000000000000000000022671260417502300254230ustar00rootroot00000000000000#include "zeroconf.h" #include "config.h" #ifdef HAVE_DBUS #include "avahi.h" #endif #ifdef Q_OS_DARWIN #include "bonjour.h" #endif #ifdef Q_OS_WIN32 #include "tinysvcmdns.h" #endif #include Zeroconf* Zeroconf::sInstance = nullptr; Zeroconf::~Zeroconf() {} Zeroconf* Zeroconf::GetZeroconf() { if (!sInstance) { #ifdef HAVE_DBUS sInstance = new Avahi; #endif // HAVE_DBUS #ifdef Q_OS_DARWIN sInstance = new Bonjour; #endif #ifdef Q_OS_WIN32 sInstance = new TinySVCMDNS; #endif } return sInstance; } QByteArray Zeroconf::TruncateName(const QString& name) { QTextCodec* codec = QTextCodec::codecForName("UTF-8"); QByteArray truncated_utf8; for (QChar c : name) { QByteArray rendered = codec->fromUnicode(&c, 1, nullptr); if (truncated_utf8.size() + rendered.size() >= 63) { break; } truncated_utf8 += rendered; } // NULL-terminate the string. truncated_utf8.append('\0'); return truncated_utf8; } void Zeroconf::Publish(const QString& domain, const QString& type, const QString& name, quint16 port) { QByteArray truncated_name = TruncateName(name); PublishInternal(domain, type, truncated_name, port); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/networkremote/zeroconf.h000066400000000000000000000011111260417502300250530ustar00rootroot00000000000000#ifndef ZEROCONF_H #define ZEROCONF_H #include class Zeroconf { public: virtual ~Zeroconf(); void Publish(const QString& domain, const QString& type, const QString& name, quint16 port); static Zeroconf* GetZeroconf(); // Truncate a QString to 63 bytes of UTF-8. static QByteArray TruncateName(const QString& name); protected: virtual void PublishInternal(const QString& domain, const QString& type, const QByteArray& name, quint16 port) = 0; private: static Zeroconf* sInstance; }; #endif // ZEROCONF_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/000077500000000000000000000000001260417502300220175ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/dynamicplaylistcontrols.cpp000066400000000000000000000023041260417502300275140ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "dynamicplaylistcontrols.h" #include "ui_dynamicplaylistcontrols.h" DynamicPlaylistControls::DynamicPlaylistControls(QWidget* parent) : QWidget(parent), ui_(new Ui_DynamicPlaylistControls) { ui_->setupUi(this); connect(ui_->expand, SIGNAL(clicked()), SIGNAL(Expand())); connect(ui_->repopulate, SIGNAL(clicked()), SIGNAL(Repopulate())); connect(ui_->off, SIGNAL(clicked()), SIGNAL(TurnOff())); } DynamicPlaylistControls::~DynamicPlaylistControls() { delete ui_; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/dynamicplaylistcontrols.h000066400000000000000000000022131260417502300271600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef DYNAMICPLAYLISTCONTROLS_H #define DYNAMICPLAYLISTCONTROLS_H #include class Ui_DynamicPlaylistControls; class DynamicPlaylistControls : public QWidget { Q_OBJECT public: DynamicPlaylistControls(QWidget* parent = nullptr); ~DynamicPlaylistControls(); signals: void Expand(); void Repopulate(); void TurnOff(); private: Ui_DynamicPlaylistControls* ui_; }; #endif // DYNAMICPLAYLISTCONTROLS_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/dynamicplaylistcontrols.ui000066400000000000000000000042451260417502300273550ustar00rootroot00000000000000 DynamicPlaylistControls 0 0 397 50 #container { background: rgba(200, 200, 200, 50%); border-radius: 10px; border: 1px solid rgb(200, 200, 200, 75%); } #label1 { font-weight: bold; } #label2 { font-size: 7.5pt; } 0 QFrame::StyledPanel QFrame::Raised 0 Dynamic mode is on New tracks will be added automatically. Expand Repopulate Turn off clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlist.cpp000066400000000000000000002046221260417502300243720ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "playlist.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "playlistbackend.h" #include "playlistfilter.h" #include "playlistitemmimedata.h" #include "playlistundocommands.h" #include "playlistview.h" #include "queue.h" #include "songloaderinserter.h" #include "songmimedata.h" #include "songplaylistitem.h" #include "core/application.h" #include "core/closure.h" #include "core/logging.h" #include "core/modelfuturewatcher.h" #include "core/qhash_qurl.h" #include "core/tagreaderclient.h" #include "core/timeconstants.h" #include "internet/jamendo/jamendoplaylistitem.h" #include "internet/jamendo/jamendoservice.h" #include "internet/magnatune/magnatuneplaylistitem.h" #include "internet/magnatune/magnatuneservice.h" #include "internet/core/internetmimedata.h" #include "internet/core/internetmodel.h" #include "internet/core/internetplaylistitem.h" #include "internet/core/internetsongmimedata.h" #include "internet/internetradio/savedradio.h" #include "library/library.h" #include "library/librarybackend.h" #include "library/librarymodel.h" #include "library/libraryplaylistitem.h" #include "smartplaylists/generator.h" #include "smartplaylists/generatorinserter.h" #include "smartplaylists/generatormimedata.h" using std::placeholders::_1; using std::placeholders::_2; using std::shared_ptr; using std::unordered_map; using smart_playlists::Generator; using smart_playlists::GeneratorInserter; using smart_playlists::GeneratorPtr; const char* Playlist::kCddaMimeType = "x-content/audio-cdda"; const char* Playlist::kRowsMimetype = "application/x-clementine-playlist-rows"; const char* Playlist::kPlayNowMimetype = "application/x-clementine-play-now"; const int Playlist::kInvalidSongPriority = 200; const QRgb Playlist::kInvalidSongColor = qRgb(0xC0, 0xC0, 0xC0); const int Playlist::kDynamicHistoryPriority = 100; const QRgb Playlist::kDynamicHistoryColor = qRgb(0x80, 0x80, 0x80); const char* Playlist::kSettingsGroup = "Playlist"; const char* Playlist::kPathType = "path_type"; const char* Playlist::kWriteMetadata = "write_metadata"; const int Playlist::kUndoStackSize = 20; const int Playlist::kUndoItemLimit = 500; const qint64 Playlist::kMinScrobblePointNsecs = 31ll * kNsecPerSec; const qint64 Playlist::kMaxScrobblePointNsecs = 240ll * kNsecPerSec; Playlist::Playlist(PlaylistBackend* backend, TaskManager* task_manager, LibraryBackend* library, int id, const QString& special_type, bool favorite, QObject* parent) : QAbstractListModel(parent), is_loading_(false), proxy_(new PlaylistFilter(this)), queue_(new Queue(this)), backend_(backend), task_manager_(task_manager), library_(library), id_(id), favorite_(favorite), current_is_paused_(false), current_virtual_index_(-1), is_shuffled_(false), scrobble_point_(-1), lastfm_status_(LastFM_New), have_incremented_playcount_(false), playlist_sequence_(nullptr), ignore_sorting_(false), undo_stack_(new QUndoStack(this)), special_type_(special_type) { undo_stack_->setUndoLimit(kUndoStackSize); connect(this, SIGNAL(rowsInserted(const QModelIndex&, int, int)), SIGNAL(PlaylistChanged())); connect(this, SIGNAL(rowsRemoved(const QModelIndex&, int, int)), SIGNAL(PlaylistChanged())); Restore(); proxy_->setSourceModel(this); queue_->setSourceModel(this); connect(queue_, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), SLOT(TracksAboutToBeDequeued(QModelIndex, int, int))); connect(queue_, SIGNAL(rowsRemoved(QModelIndex, int, int)), SLOT(TracksDequeued())); connect(queue_, SIGNAL(rowsInserted(const QModelIndex&, int, int)), SLOT(TracksEnqueued(const QModelIndex&, int, int))); connect(queue_, SIGNAL(layoutChanged()), SLOT(QueueLayoutChanged())); column_alignments_ = PlaylistView::DefaultColumnAlignment(); } Playlist::~Playlist() { items_.clear(); library_items_by_id_.clear(); } template void Playlist::InsertSongItems(const SongList& songs, int pos, bool play_now, bool enqueue) { PlaylistItemList items; for (const Song& song : songs) { items << PlaylistItemPtr(new T(song)); } InsertItems(items, pos, play_now, enqueue); } QVariant Playlist::headerData(int section, Qt::Orientation, int role) const { if (role != Qt::DisplayRole && role != Qt::ToolTipRole) return QVariant(); const QString name = column_name((Playlist::Column)section); if (!name.isEmpty()) return name; return QVariant(); } bool Playlist::column_is_editable(Playlist::Column column) { switch (column) { case Column_Title: case Column_Artist: case Column_Album: case Column_AlbumArtist: case Column_Composer: case Column_Performer: case Column_Grouping: case Column_Track: case Column_Disc: case Column_Year: case Column_Genre: case Column_Score: case Column_Comment: return true; default: break; } return false; } bool Playlist::set_column_value(Song& song, Playlist::Column column, const QVariant& value) { if (!song.IsEditable()) return false; switch (column) { case Column_Title: song.set_title(value.toString()); break; case Column_Artist: song.set_artist(value.toString()); break; case Column_Album: song.set_album(value.toString()); break; case Column_AlbumArtist: song.set_albumartist(value.toString()); break; case Column_Composer: song.set_composer(value.toString()); break; case Column_Performer: song.set_performer(value.toString()); break; case Column_Grouping: song.set_grouping(value.toString()); break; case Column_Track: song.set_track(value.toInt()); break; case Column_Disc: song.set_disc(value.toInt()); break; case Column_Year: song.set_year(value.toInt()); break; case Column_Genre: song.set_genre(value.toString()); break; case Column_Score: song.set_score(value.toInt()); break; case Column_Comment: song.set_comment(value.toString()); break; default: break; } return true; } QVariant Playlist::data(const QModelIndex& index, int role) const { switch (role) { case Role_IsCurrent: return current_item_index_.isValid() && index.row() == current_item_index_.row(); case Role_IsPaused: return current_is_paused_; case Role_StopAfter: return stop_after_.isValid() && stop_after_.row() == index.row(); case Role_QueuePosition: return queue_->PositionOf(index); case Role_CanSetRating: return index.column() == Column_Rating && items_[index.row()]->IsLocalLibraryItem() && items_[index.row()]->Metadata().id() != -1; case Qt::EditRole: case Qt::ToolTipRole: case Qt::DisplayRole: { PlaylistItemPtr item = items_[index.row()]; Song song = item->Metadata(); // Don't forget to change Playlist::CompareItems when adding new columns switch (index.column()) { case Column_Title: return song.PrettyTitle(); case Column_Artist: return song.artist(); case Column_Album: return song.album(); case Column_Length: return song.length_nanosec(); case Column_Track: return song.track(); case Column_Disc: return song.disc(); case Column_Year: return song.year(); case Column_OriginalYear: return song.effective_originalyear(); case Column_Genre: return song.genre(); case Column_AlbumArtist: return song.playlist_albumartist(); case Column_Composer: return song.composer(); case Column_Performer: return song.performer(); case Column_Grouping: return song.grouping(); case Column_Rating: return song.rating(); case Column_PlayCount: return song.playcount(); case Column_SkipCount: return song.skipcount(); case Column_LastPlayed: return song.lastplayed(); case Column_Score: return song.score(); case Column_BPM: return song.bpm(); case Column_Bitrate: return song.bitrate(); case Column_Samplerate: return song.samplerate(); case Column_Filename: return song.url(); case Column_BaseFilename: return song.basefilename(); case Column_Filesize: return song.filesize(); case Column_Filetype: return song.filetype(); case Column_DateModified: return song.mtime(); case Column_DateCreated: return song.ctime(); case Column_Comment: if (role == Qt::DisplayRole) return song.comment().simplified(); return song.comment(); case Column_Source: return item->Url(); } return QVariant(); } case Qt::TextAlignmentRole: return QVariant(column_alignments_.value( index.column(), (Qt::AlignLeft | Qt::AlignVCenter))); case Qt::ForegroundRole: if (data(index, Role_IsCurrent).toBool()) { // Ignore any custom colours for the currently playing item - they might // clash with the glowing current track indicator. return QVariant(); } if (items_[index.row()]->HasCurrentForegroundColor()) { return QBrush(items_[index.row()]->GetCurrentForegroundColor()); } if (index.row() < dynamic_history_length()) { return QBrush(kDynamicHistoryColor); } return QVariant(); case Qt::BackgroundRole: if (data(index, Role_IsCurrent).toBool()) { // Ignore any custom colours for the currently playing item - they might // clash with the glowing current track indicator. return QVariant(); } if (items_[index.row()]->HasCurrentBackgroundColor()) { return QBrush(items_[index.row()]->GetCurrentBackgroundColor()); } return QVariant(); case Qt::FontRole: if (items_[index.row()]->GetShouldSkip()) { QFont track_font; track_font.setStrikeOut(true); return track_font; } return QVariant(); default: return QVariant(); } } void Playlist::MoodbarUpdated(const QModelIndex& index) { emit dataChanged(index.sibling(index.row(), Column_Mood), index.sibling(index.row(), Column_Mood)); } bool Playlist::setData(const QModelIndex& index, const QVariant& value, int role) { int row = index.row(); PlaylistItemPtr item = item_at(row); Song song = item->Metadata(); if (index.data() == value) return false; if (!set_column_value(song, (Column)index.column(), value)) return false; if ((Column)index.column() == Column_Score) { // The score is only saved in the database, not the file library_->AddOrUpdateSongs(SongList() << song); emit EditingFinished(index); } else { TagReaderReply* reply = TagReaderClient::Instance()->SaveFile(song.url().toLocalFile(), song); NewClosure(reply, SIGNAL(Finished(bool)), this, SLOT(SongSaveComplete(TagReaderReply*, QPersistentModelIndex)), reply, QPersistentModelIndex(index)); } return true; } void Playlist::SongSaveComplete(TagReaderReply* reply, const QPersistentModelIndex& index) { if (reply->is_successful() && index.isValid()) { QFuture future = item_at(index.row())->BackgroundReload(); ModelFutureWatcher* watcher = new ModelFutureWatcher(index, this); watcher->setFuture(future); connect(watcher, SIGNAL(finished()), SLOT(ItemReloadComplete())); } reply->deleteLater(); } void Playlist::ItemReloadComplete() { ModelFutureWatcher* watcher = static_cast*>(sender()); watcher->deleteLater(); const QPersistentModelIndex& index = watcher->index(); if (index.isValid()) { emit dataChanged(index, index); emit EditingFinished(index); } } int Playlist::current_row() const { return current_item_index_.isValid() ? current_item_index_.row() : -1; } const QModelIndex Playlist::current_index() const { return current_item_index_; } int Playlist::last_played_row() const { return last_played_item_index_.isValid() ? last_played_item_index_.row() : -1; } void Playlist::ShuffleModeChanged(PlaylistSequence::ShuffleMode mode) { is_shuffled_ = (mode != PlaylistSequence::Shuffle_Off); ReshuffleIndices(); } bool Playlist::FilterContainsVirtualIndex(int i) const { if (i < 0 || i >= virtual_items_.count()) return false; return proxy_->filterAcceptsRow(virtual_items_[i], QModelIndex()); } int Playlist::NextVirtualIndex(int i, bool ignore_repeat_track) const { PlaylistSequence::RepeatMode repeat_mode = playlist_sequence_->repeat_mode(); PlaylistSequence::ShuffleMode shuffle_mode = playlist_sequence_->shuffle_mode(); bool album_only = repeat_mode == PlaylistSequence::Repeat_Album || shuffle_mode == PlaylistSequence::Shuffle_InsideAlbum; // This one's easy - if we have to repeat the current track then just return i if (repeat_mode == PlaylistSequence::Repeat_Track && !ignore_repeat_track) { if (!FilterContainsVirtualIndex(i)) return virtual_items_.count(); // It's not in the filter any more return i; } // If we're not bothered about whether a song is on the same album then // return the next virtual index, whatever it is. if (!album_only) { ++i; // Advance i until we find any track that is in the filter, skipping // the selected to be skipped while (i < virtual_items_.count() && (!FilterContainsVirtualIndex(i) || item_at(virtual_items_[i])->GetShouldSkip())) { ++i; } return i; } // We need to advance i until we get something else on the same album Song last_song = current_item_metadata(); for (int j = i + 1; j < virtual_items_.count(); ++j) { if (item_at(virtual_items_[j])->GetShouldSkip()) { continue; } Song this_song = item_at(virtual_items_[j])->Metadata(); if (((last_song.is_compilation() && this_song.is_compilation()) || last_song.artist() == this_song.artist()) && last_song.album() == this_song.album() && FilterContainsVirtualIndex(j)) { return j; // Found one } } // Couldn't find one - return past the end of the list return virtual_items_.count(); } int Playlist::PreviousVirtualIndex(int i, bool ignore_repeat_track) const { PlaylistSequence::RepeatMode repeat_mode = playlist_sequence_->repeat_mode(); PlaylistSequence::ShuffleMode shuffle_mode = playlist_sequence_->shuffle_mode(); bool album_only = repeat_mode == PlaylistSequence::Repeat_Album || shuffle_mode == PlaylistSequence::Shuffle_InsideAlbum; // This one's easy - if we have to repeat the current track then just return i if (repeat_mode == PlaylistSequence::Repeat_Track && !ignore_repeat_track) { if (!FilterContainsVirtualIndex(i)) return -1; return i; } // If we're not bothered about whether a song is on the same album then // return the previous virtual index, whatever it is. if (!album_only) { --i; // Decrement i until we find any track that is in the filter while (i >= 0 && (!FilterContainsVirtualIndex(i) || item_at(virtual_items_[i])->GetShouldSkip())) --i; return i; } // We need to decrement i until we get something else on the same album Song last_song = current_item_metadata(); for (int j = i - 1; j >= 0; --j) { if (item_at(virtual_items_[j])->GetShouldSkip()) { continue; } Song this_song = item_at(virtual_items_[j])->Metadata(); if (((last_song.is_compilation() && this_song.is_compilation()) || last_song.artist() == this_song.artist()) && last_song.album() == this_song.album() && FilterContainsVirtualIndex(j)) { return j; // Found one } } // Couldn't find one - return before the start of the list return -1; } int Playlist::next_row(bool ignore_repeat_track) const { // Any queued items take priority if (!queue_->is_empty()) { return queue_->PeekNext(); } int next_virtual_index = NextVirtualIndex(current_virtual_index_, ignore_repeat_track); if (next_virtual_index >= virtual_items_.count()) { // We've gone off the end of the playlist. switch (playlist_sequence_->repeat_mode()) { case PlaylistSequence::Repeat_Off: case PlaylistSequence::Repeat_Intro: return -1; case PlaylistSequence::Repeat_Track: next_virtual_index = current_virtual_index_; break; default: next_virtual_index = NextVirtualIndex(-1, ignore_repeat_track); break; } } // Still off the end? Then just give up if (next_virtual_index < 0 || next_virtual_index >= virtual_items_.count()) return -1; return virtual_items_[next_virtual_index]; } int Playlist::previous_row(bool ignore_repeat_track) const { int prev_virtual_index = PreviousVirtualIndex(current_virtual_index_, ignore_repeat_track); if (prev_virtual_index < 0) { // We've gone off the beginning of the playlist. switch (playlist_sequence_->repeat_mode()) { case PlaylistSequence::Repeat_Off: return -1; case PlaylistSequence::Repeat_Track: prev_virtual_index = current_virtual_index_; break; default: prev_virtual_index = PreviousVirtualIndex(virtual_items_.count(), ignore_repeat_track); break; } } // Still off the beginning? Then just give up if (prev_virtual_index < 0) return -1; return virtual_items_[prev_virtual_index]; } int Playlist::dynamic_history_length() const { return dynamic_playlist_ && last_played_item_index_.isValid() ? last_played_item_index_.row() + 1 : 0; } void Playlist::set_current_row(int i, bool is_stopping) { QModelIndex old_current_item_index = current_item_index_; ClearStreamMetadata(); current_item_index_ = QPersistentModelIndex(index(i, 0, QModelIndex())); // if the given item is the first in the queue, remove it from the queue if (current_item_index_.row() == queue_->PeekNext()) { queue_->TakeNext(); } if (current_item_index_ == old_current_item_index) return; if (old_current_item_index.isValid()) { emit dataChanged(old_current_item_index, old_current_item_index.sibling( old_current_item_index.row(), ColumnCount - 1)); } if (current_item_index_.isValid() && !is_stopping) { InformOfCurrentSongChange(); } // Update the virtual index if (i == -1) { current_virtual_index_ = -1; } else if (is_shuffled_ && current_virtual_index_ == -1) { // This is the first thing we're playing so we want to make sure the array // is shuffled ReshuffleIndices(); // Bring the one we've been asked to play to the start of the list virtual_items_.takeAt(virtual_items_.indexOf(i)); virtual_items_.prepend(i); current_virtual_index_ = 0; } else if (is_shuffled_) { current_virtual_index_ = virtual_items_.indexOf(i); } else { current_virtual_index_ = i; } // The structure of a dynamic playlist is as follows: // history - active song - future // We have to ensure that this invariant is maintained. if (dynamic_playlist_ && current_item_index_.isValid()) { using smart_playlists::Generator; // When advancing to the next track if (i > old_current_item_index.row()) { // Move the new item one position ahead of the last item in the history. MoveItemWithoutUndo(current_item_index_.row(), dynamic_history_length()); // Compute the number of new items that have to be inserted. This is not // necessarily 1 because the user might have added or removed items // manually. Note that the future excludes the current item. const int count = dynamic_history_length() + 1 + dynamic_playlist_->GetDynamicFuture() - items_.count(); if (count > 0) { InsertDynamicItems(count); } // Shrink the history, again this is not necessarily by 1, because the // user might have moved items by hand. const int remove_count = dynamic_history_length() - dynamic_playlist_->GetDynamicHistory(); if (0 < remove_count) RemoveItemsWithoutUndo(0, remove_count); } // the above actions make all commands on the undo stack invalid, so we // better clear it. undo_stack_->clear(); } if (current_item_index_.isValid()) { last_played_item_index_ = current_item_index_; Save(); } UpdateScrobblePoint(); } void Playlist::InsertDynamicItems(int count) { GeneratorInserter* inserter = new GeneratorInserter(task_manager_, library_, this); connect(inserter, SIGNAL(Error(QString)), SIGNAL(LoadTracksError(QString))); connect(inserter, SIGNAL(PlayRequested(QModelIndex)), SIGNAL(PlayRequested(QModelIndex))); inserter->Load(this, -1, false, false, dynamic_playlist_, count); } Qt::ItemFlags Playlist::flags(const QModelIndex& index) const { Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable; if (column_is_editable((Column)index.column())) flags |= Qt::ItemIsEditable; if (index.isValid()) return flags | Qt::ItemIsDragEnabled; return Qt::ItemIsDropEnabled; } QStringList Playlist::mimeTypes() const { return QStringList() << "text/uri-list" << kRowsMimetype << LibraryModel::kSmartPlaylistsMimeType; } Qt::DropActions Playlist::supportedDropActions() const { return Qt::MoveAction | Qt::CopyAction | Qt::LinkAction; } bool Playlist::dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int, const QModelIndex&) { if (action == Qt::IgnoreAction) return false; using smart_playlists::GeneratorMimeData; bool play_now = false; bool enqueue_now = false; if (const MimeData* mime_data = qobject_cast(data)) { if (mime_data->clear_first_) { Clear(); } play_now = mime_data->play_now_; enqueue_now = mime_data->enqueue_now_; } if (const SongMimeData* song_data = qobject_cast(data)) { // Dragged from a library // We want to check if these songs are from the actual local file backend, // if they are we treat them differently. if (song_data->backend && song_data->backend->songs_table() == Library::kSongsTable) InsertSongItems(song_data->songs, row, play_now, enqueue_now); else if (song_data->backend && song_data->backend->songs_table() == MagnatuneService::kSongsTable) InsertSongItems(song_data->songs, row, play_now, enqueue_now); else if (song_data->backend && song_data->backend->songs_table() == JamendoService::kSongsTable) InsertSongItems(song_data->songs, row, play_now, enqueue_now); else InsertSongItems(song_data->songs, row, play_now, enqueue_now); } else if (const InternetMimeData* internet_data = qobject_cast(data)) { // Dragged from the Internet pane InsertInternetItems(internet_data->model, internet_data->indexes, row, play_now, enqueue_now); } else if (const InternetSongMimeData* internet_song_data = qobject_cast(data)) { InsertInternetItems(internet_song_data->service, internet_song_data->songs, row, play_now, enqueue_now); } else if (const GeneratorMimeData* generator_data = qobject_cast(data)) { InsertSmartPlaylist(generator_data->generator_, row, play_now, enqueue_now); } else if (const PlaylistItemMimeData* item_data = qobject_cast(data)) { InsertItems(item_data->items_, row, play_now, enqueue_now); } else if (data->hasFormat(kRowsMimetype)) { // Dragged from the playlist // Rearranging it is tricky... // Get the list of rows that were moved QList source_rows; Playlist* source_playlist = nullptr; qint64 pid = 0; qint64 own_pid = QCoreApplication::applicationPid(); QDataStream stream(data->data(kRowsMimetype)); stream.readRawData(reinterpret_cast(&source_playlist), sizeof(source_playlist)); stream >> source_rows; if (!stream.atEnd()) { stream.readRawData((char*)&pid, sizeof(pid)); } else { pid = !own_pid; } qStableSort(source_rows); // Make sure we take them in order if (source_playlist == this) { // Dragged from this playlist - rearrange the items undo_stack_->push( new PlaylistUndoCommands::MoveItems(this, source_rows, row)); } else if (pid == own_pid) { // Drag from a different playlist PlaylistItemList items; for (int row : source_rows) items << source_playlist->item_at(row); if (items.count() > kUndoItemLimit) { // Too big to keep in the undo stack. Also clear the stack because it // might have been invalidated. InsertItemsWithoutUndo(items, row, false); undo_stack_->clear(); } else { undo_stack_->push( new PlaylistUndoCommands::InsertItems(this, items, row)); } // Remove the items from the source playlist if it was a move event if (action == Qt::MoveAction) { for (int row : source_rows) { source_playlist->undo_stack()->push( new PlaylistUndoCommands::RemoveItems(source_playlist, row, 1)); } } } } else if (data->hasFormat(kCddaMimeType)) { SongLoaderInserter* inserter = new SongLoaderInserter( task_manager_, library_, backend_->app()->player()); connect(inserter, SIGNAL(Error(QString)), SIGNAL(LoadTracksError(QString))); inserter->LoadAudioCD(this, row, play_now, enqueue_now); } else if (data->hasUrls()) { // URL list dragged from the file list or some other app InsertUrls(data->urls(), row, play_now, enqueue_now); } return true; } void Playlist::InsertUrls(const QList& urls, int pos, bool play_now, bool enqueue) { SongLoaderInserter* inserter = new SongLoaderInserter( task_manager_, library_, backend_->app()->player()); connect(inserter, SIGNAL(Error(QString)), SIGNAL(LoadTracksError(QString))); inserter->Load(this, pos, play_now, enqueue, urls); } void Playlist::InsertSmartPlaylist(GeneratorPtr generator, int pos, bool play_now, bool enqueue) { // Hack: If the generator hasn't got a library set then use the main one if (!generator->library()) { generator->set_library(library_); } GeneratorInserter* inserter = new GeneratorInserter(task_manager_, library_, this); connect(inserter, SIGNAL(Error(QString)), SIGNAL(LoadTracksError(QString))); inserter->Load(this, pos, play_now, enqueue, generator); if (generator->is_dynamic()) { TurnOnDynamicPlaylist(generator); } } void Playlist::TurnOnDynamicPlaylist(GeneratorPtr gen) { dynamic_playlist_ = gen; playlist_sequence_->SetUsingDynamicPlaylist(true); ShuffleModeChanged(PlaylistSequence::Shuffle_Off); emit DynamicModeChanged(true); Save(); } void Playlist::MoveItemWithoutUndo(int source, int dest) { MoveItemsWithoutUndo(QList() << source, dest); } void Playlist::MoveItemsWithoutUndo(const QList& source_rows, int pos) { layoutAboutToBeChanged(); PlaylistItemList moved_items; if (pos < 0) { pos = items_.count(); } // Take the items out of the list first, keeping track of whether the // insertion point changes int offset = 0; int start = pos; for (int source_row : source_rows) { moved_items << items_.takeAt(source_row - offset); if (pos > source_row) { start--; } offset++; } // Put the items back in for (int i = start; i < start + moved_items.count(); ++i) { moved_items[i - start]->RemoveForegroundColor(kDynamicHistoryPriority); items_.insert(i, moved_items[i - start]); } // Update persistent indexes for (const QModelIndex& pidx : persistentIndexList()) { const int dest_offset = source_rows.indexOf(pidx.row()); if (dest_offset != -1) { // This index was moved changePersistentIndex( pidx, index(start + dest_offset, pidx.column(), QModelIndex())); } else { int d = 0; for (int source_row : source_rows) { if (pidx.row() > source_row) d--; } if (pidx.row() + d >= start) d += source_rows.count(); changePersistentIndex( pidx, index(pidx.row() + d, pidx.column(), QModelIndex())); } } current_virtual_index_ = virtual_items_.indexOf(current_row()); layoutChanged(); Save(); } void Playlist::MoveItemsWithoutUndo(int start, const QList& dest_rows) { layoutAboutToBeChanged(); PlaylistItemList moved_items; int pos = start; for (int dest_row : dest_rows) { if (dest_row < pos) start--; } if (start < 0) { start = items_.count() - dest_rows.count(); } // Take the items out of the list first for (int i = 0; i < dest_rows.count(); i++) moved_items << items_.takeAt(start); // Put the items back in int offset = 0; for (int dest_row : dest_rows) { items_.insert(dest_row, moved_items[offset]); offset++; } // Update persistent indexes for (const QModelIndex& pidx : persistentIndexList()) { if (pidx.row() >= start && pidx.row() < start + dest_rows.count()) { // This index was moved const int i = pidx.row() - start; changePersistentIndex(pidx, index(dest_rows[i], pidx.column(), QModelIndex())); } else { int d = 0; if (pidx.row() >= start + dest_rows.count()) d -= dest_rows.count(); for (int dest_row : dest_rows) { if (pidx.row() + d > dest_row) d++; } changePersistentIndex( pidx, index(pidx.row() + d, pidx.column(), QModelIndex())); } } current_virtual_index_ = virtual_items_.indexOf(current_row()); layoutChanged(); Save(); } void Playlist::InsertItems(const PlaylistItemList& itemsIn, int pos, bool play_now, bool enqueue) { if (itemsIn.isEmpty()) return; PlaylistItemList items = itemsIn; // exercise vetoes SongList songs; for (PlaylistItemPtr item : items) { songs << item->Metadata(); } const int song_count = songs.length(); QSet vetoed; for (SongInsertVetoListener* listener : veto_listeners_) { for (const Song& song : listener->AboutToInsertSongs(GetAllSongs(), songs)) { // avoid veto-ing a song multiple times vetoed.insert(song); } if (vetoed.count() == song_count) { // all songs were vetoed and there's nothing more to do (there's no need // for an undo step) return; } } if (!vetoed.isEmpty()) { QMutableListIterator it(items); while (it.hasNext()) { PlaylistItemPtr item = it.next(); const Song& current = item->Metadata(); if (vetoed.contains(current)) { vetoed.remove(current); it.remove(); } } // check for empty items once again after veto if (items.isEmpty()) { return; } } const int start = pos == -1 ? items_.count() : pos; if (items.count() > kUndoItemLimit) { // Too big to keep in the undo stack. Also clear the stack because it // might have been invalidated. InsertItemsWithoutUndo(items, pos, enqueue); undo_stack_->clear(); } else { undo_stack_->push( new PlaylistUndoCommands::InsertItems(this, items, pos, enqueue)); } if (play_now) emit PlayRequested(index(start, 0)); } void Playlist::InsertItemsWithoutUndo(const PlaylistItemList& items, int pos, bool enqueue) { if (items.isEmpty()) return; const int start = pos == -1 ? items_.count() : pos; const int end = start + items.count() - 1; beginInsertRows(QModelIndex(), start, end); for (int i = start; i <= end; ++i) { PlaylistItemPtr item = items[i - start]; items_.insert(i, item); virtual_items_ << virtual_items_.count(); if (item->type() == "Library") { int id = item->Metadata().id(); if (id != -1) { library_items_by_id_.insertMulti(id, item); } } if (item == current_item()) { // It's one we removed before that got re-added through an undo current_item_index_ = index(i, 0); last_played_item_index_ = current_item_index_; } } endInsertRows(); if (enqueue) { QModelIndexList indexes; for (int i = start; i <= end; ++i) { indexes << index(i, 0); } queue_->ToggleTracks(indexes); } Save(); ReshuffleIndices(); } void Playlist::InsertLibraryItems(const SongList& songs, int pos, bool play_now, bool enqueue) { InsertSongItems(songs, pos, play_now, enqueue); } void Playlist::InsertSongs(const SongList& songs, int pos, bool play_now, bool enqueue) { InsertSongItems(songs, pos, play_now, enqueue); } void Playlist::InsertSongsOrLibraryItems(const SongList& songs, int pos, bool play_now, bool enqueue) { PlaylistItemList items; for (const Song& song : songs) { if (song.is_library_song()) { items << PlaylistItemPtr(new LibraryPlaylistItem(song)); } else { items << PlaylistItemPtr(new SongPlaylistItem(song)); } } InsertItems(items, pos, play_now, enqueue); } void Playlist::InsertInternetItems(const InternetModel* model, const QModelIndexList& items, int pos, bool play_now, bool enqueue) { PlaylistItemList playlist_items; QList song_urls; for (const QModelIndex& item : items) { switch (item.data(InternetModel::Role_PlayBehaviour).toInt()) { case InternetModel::PlayBehaviour_SingleItem: playlist_items << shared_ptr(new InternetPlaylistItem( model->ServiceForIndex(item), item.data(InternetModel::Role_SongMetadata).value())); break; case InternetModel::PlayBehaviour_UseSongLoader: song_urls << item.data(InternetModel::Role_Url).toUrl(); break; } } if (!song_urls.isEmpty()) { InsertUrls(song_urls, pos, play_now, enqueue); play_now = false; } InsertItems(playlist_items, pos, play_now, enqueue); } void Playlist::InsertInternetItems(InternetService* service, const SongList& songs, int pos, bool play_now, bool enqueue) { PlaylistItemList playlist_items; for (const Song& song : songs) { playlist_items << shared_ptr( new InternetPlaylistItem(service, song)); } InsertItems(playlist_items, pos, play_now, enqueue); } void Playlist::UpdateItems(const SongList& songs) { qLog(Debug) << "Updating playlist with new tracks' info"; // We first convert our songs list into a linked list (a 'real' list), // because removals are faster with QLinkedList. // Next, we walk through the list of playlist's items then the list of songs // we want to update: if an item corresponds to the song (we rely on URL for // this), we update the item with the new metadata, then we remove song from // our list because we will not need to check it again. // And we also update undo actions. QLinkedList songs_list; for (const Song& song : songs) songs_list.append(song); for (int i = 0; i < items_.size(); i++) { // Update current items list QMutableLinkedListIterator it(songs_list); while (it.hasNext()) { const Song& song = it.next(); PlaylistItemPtr& item = items_[i]; if (item->Metadata().url() == song.url() && (item->Metadata().filetype() == Song::Type_Unknown || // Stream may change and may need to be updated too item->Metadata().filetype() == Song::Type_Stream || // And CD tracks as well (tags are loaded in a second step) item->Metadata().filetype() == Song::Type_Cdda)) { PlaylistItemPtr new_item; if (song.is_library_song()) { new_item = PlaylistItemPtr(new LibraryPlaylistItem(song)); library_items_by_id_.insertMulti(song.id(), new_item); } else { new_item = PlaylistItemPtr(new SongPlaylistItem(song)); } items_[i] = new_item; emit dataChanged(index(i, 0), index(i, ColumnCount - 1)); // Also update undo actions for (int i = 0; i < undo_stack_->count(); i++) { QUndoCommand* undo_action = const_cast(undo_stack_->command(i)); PlaylistUndoCommands::InsertItems* undo_action_insert = dynamic_cast(undo_action); if (undo_action_insert) { bool found_and_updated = undo_action_insert->UpdateItem(new_item); if (found_and_updated) break; } } it.remove(); break; } } } Save(); } QMimeData* Playlist::mimeData(const QModelIndexList& indexes) const { if (indexes.isEmpty()) return nullptr; // We only want one index per row, but we can't just take column 0 because // the user might have hidden it. const int first_column = indexes.first().column(); QMimeData* data = new QMimeData; QList urls; QList rows; for (const QModelIndex& index : indexes) { if (index.column() != first_column) continue; urls << items_[index.row()]->Url(); rows << index.row(); } QBuffer buf; buf.open(QIODevice::WriteOnly); QDataStream stream(&buf); const Playlist* self = this; const qint64 pid = QCoreApplication::applicationPid(); stream.writeRawData(reinterpret_cast(&self), sizeof(self)); stream << rows; stream.writeRawData((char*)&pid, sizeof(pid)); buf.close(); data->setUrls(urls); data->setData(kRowsMimetype, buf.data()); return data; } bool Playlist::CompareItems(int column, Qt::SortOrder order, shared_ptr _a, shared_ptr _b) { shared_ptr a = order == Qt::AscendingOrder ? _a : _b; shared_ptr b = order == Qt::AscendingOrder ? _b : _a; #define cmp(field) return a->Metadata().field() < b->Metadata().field() #define strcmp(field) \ return QString::localeAwareCompare(a->Metadata().field().toLower(), \ b->Metadata().field().toLower()) < 0; switch (column) { case Column_Title: strcmp(title); case Column_Artist: strcmp(artist); case Column_Album: strcmp(album); case Column_Length: cmp(length_nanosec); case Column_Track: cmp(track); case Column_Disc: cmp(disc); case Column_Year: cmp(year); case Column_OriginalYear: cmp(originalyear); case Column_Genre: strcmp(genre); case Column_AlbumArtist: strcmp(playlist_albumartist); case Column_Composer: strcmp(composer); case Column_Performer: strcmp(performer); case Column_Grouping: strcmp(grouping); case Column_Rating: cmp(rating); case Column_PlayCount: cmp(playcount); case Column_SkipCount: cmp(skipcount); case Column_LastPlayed: cmp(lastplayed); case Column_Score: cmp(score); case Column_BPM: cmp(bpm); case Column_Bitrate: cmp(bitrate); case Column_Samplerate: cmp(samplerate); case Column_Filename: cmp(url); case Column_BaseFilename: cmp(basefilename); case Column_Filesize: cmp(filesize); case Column_Filetype: cmp(filetype); case Column_DateModified: cmp(mtime); case Column_DateCreated: cmp(ctime); case Column_Comment: strcmp(comment); case Column_Source: cmp(url); } #undef cmp #undef strcmp return false; } QString Playlist::column_name(Column column) { switch (column) { case Column_Title: return tr("Title"); case Column_Artist: return tr("Artist"); case Column_Album: return tr("Album"); case Column_Length: return tr("Length"); case Column_Track: return tr("Track"); case Column_Disc: return tr("Disc"); case Column_Year: return tr("Year"); case Column_OriginalYear: return tr("Original year"); case Column_Genre: return tr("Genre"); case Column_AlbumArtist: return tr("Album artist"); case Column_Composer: return tr("Composer"); case Column_Performer: return tr("Performer"); case Column_Grouping: return tr("Grouping"); case Column_Rating: return tr("Rating"); case Column_PlayCount: return tr("Play count"); case Column_SkipCount: return tr("Skip count"); case Column_LastPlayed: return tr("Last played", "A playlist's tag."); case Column_Score: return tr("Score"); case Column_BPM: return tr("BPM"); case Column_Bitrate: return tr("Bit rate"); case Column_Samplerate: return tr("Sample rate"); case Column_Filename: return tr("File name"); case Column_BaseFilename: return tr("File name (without path)"); case Column_Filesize: return tr("File size"); case Column_Filetype: return tr("File type"); case Column_DateModified: return tr("Date modified"); case Column_DateCreated: return tr("Date created"); case Column_Comment: return tr("Comment"); case Column_Source: return tr("Source"); case Column_Mood: return tr("Mood"); default: return QString(); } return ""; } QString Playlist::abbreviated_column_name(Column column) { const QString& column_name = Playlist::column_name(column); switch (column) { case Column_Disc: case Column_PlayCount: case Column_SkipCount: case Column_Track: return QString("%1#").arg(column_name[0]); default: return column_name; } return ""; } void Playlist::sort(int column, Qt::SortOrder order) { if (ignore_sorting_) return; PlaylistItemList new_items(items_); PlaylistItemList::iterator begin = new_items.begin(); if (dynamic_playlist_ && current_item_index_.isValid()) begin += current_item_index_.row() + 1; if (column == Column_Album) { // When sorting by album, also take into account discs and tracks. qStableSort(begin, new_items.end(), std::bind(&Playlist::CompareItems, Column_Track, order, _1, _2)); qStableSort(begin, new_items.end(), std::bind(&Playlist::CompareItems, Column_Disc, order, _1, _2)); qStableSort(begin, new_items.end(), std::bind(&Playlist::CompareItems, Column_Album, order, _1, _2)); } else { qStableSort(begin, new_items.end(), std::bind(&Playlist::CompareItems, column, order, _1, _2)); } undo_stack_->push( new PlaylistUndoCommands::SortItems(this, column, order, new_items)); } void Playlist::ReOrderWithoutUndo(const PlaylistItemList& new_items) { layoutAboutToBeChanged(); PlaylistItemList old_items = items_; items_ = new_items; QMap new_rows; for (int i = 0; i < new_items.length(); ++i) { new_rows[new_items[i].get()] = i; } for (const QModelIndex& idx : persistentIndexList()) { const PlaylistItem* item = old_items[idx.row()].get(); changePersistentIndex(idx, index(new_rows[item], idx.column(), idx.parent())); } layoutChanged(); emit PlaylistChanged(); Save(); } void Playlist::Playing() { SetCurrentIsPaused(false); } void Playlist::Paused() { SetCurrentIsPaused(true); } void Playlist::Stopped() { SetCurrentIsPaused(false); } void Playlist::SetCurrentIsPaused(bool paused) { if (paused == current_is_paused_) return; current_is_paused_ = paused; if (current_item_index_.isValid()) dataChanged(index(current_item_index_.row(), 0), index(current_item_index_.row(), ColumnCount - 1)); } void Playlist::Save() const { if (!backend_ || is_loading_) return; backend_->SavePlaylistAsync(id_, items_, last_played_row(), dynamic_playlist_); } namespace { typedef QFutureWatcher> PlaylistItemFutureWatcher; } void Playlist::Restore() { if (!backend_) return; items_.clear(); virtual_items_.clear(); library_items_by_id_.clear(); QFuture> future = QtConcurrent::run(backend_, &PlaylistBackend::GetPlaylistItems, id_); PlaylistItemFutureWatcher* watcher = new PlaylistItemFutureWatcher(this); watcher->setFuture(future); connect(watcher, SIGNAL(finished()), SLOT(ItemsLoaded())); } void Playlist::ItemsLoaded() { PlaylistItemFutureWatcher* watcher = static_cast(sender()); watcher->deleteLater(); PlaylistItemList items = watcher->future().result(); // backend returns empty elements for library items which it couldn't // match (because they got deleted); we don't need those QMutableListIterator it(items); while (it.hasNext()) { PlaylistItemPtr item = it.next(); if (item->IsLocalLibraryItem() && item->Metadata().url().isEmpty()) { it.remove(); } } is_loading_ = true; InsertItems(items, 0); is_loading_ = false; PlaylistBackend::Playlist p = backend_->GetPlaylist(id_); // the newly loaded list of items might be shorter than it was before so // look out for a bad last_played index last_played_item_index_ = p.last_played == -1 || p.last_played >= rowCount() ? QModelIndex() : index(p.last_played); if (!p.dynamic_type.isEmpty()) { GeneratorPtr gen = Generator::Create(p.dynamic_type); if (gen) { // Hack: can't think of a better way to get the right backend LibraryBackend* backend = nullptr; if (p.dynamic_backend == library_->songs_table()) backend = library_; else if (p.dynamic_backend == MagnatuneService::kSongsTable) backend = InternetModel::Service()->library_backend(); else if (p.dynamic_backend == JamendoService::kSongsTable) backend = InternetModel::Service()->library_backend(); if (backend) { gen->set_library(backend); gen->Load(p.dynamic_data); TurnOnDynamicPlaylist(gen); } } } emit RestoreFinished(); QSettings s; s.beginGroup(kSettingsGroup); // should we gray out deleted songs asynchronously on startup? if (s.value("greyoutdeleted", false).toBool()) { QtConcurrent::run(this, &Playlist::InvalidateDeletedSongs); } } static bool DescendingIntLessThan(int a, int b) { return a > b; } void Playlist::RemoveItemsWithoutUndo(const QList& indicesIn) { // Sort the indices descending because removing elements 'backwards' // is easier - indices don't 'move' in the process. QList indices = indicesIn; qSort(indices.begin(), indices.end(), DescendingIntLessThan); for (int j = 0; j < indices.count(); j++) { int beginning = indices[j], end = indices[j]; // Splits the indices into sequences. For example this: [1, 2, 4], // will get split into [1, 2] and [4]. while (j != indices.count() - 1 && indices[j] == indices[j + 1] + 1) { beginning--; j++; } // Remove the current sequence. removeRows(beginning, end - beginning + 1); } } bool Playlist::removeRows(int row, int count, const QModelIndex& parent) { if (row < 0 || row >= items_.size() || row + count > items_.size()) { return false; } if (count > kUndoItemLimit) { // Too big to keep in the undo stack. Also clear the stack because it // might have been invalidated. RemoveItemsWithoutUndo(row, count); undo_stack_->clear(); } else { undo_stack_->push(new PlaylistUndoCommands::RemoveItems(this, row, count)); } return true; } bool Playlist::removeRows(QList& rows) { if (rows.isEmpty()) { return false; } // start from the end to be sure that indices won't 'move' during // the removal process qSort(rows.begin(), rows.end(), qGreater()); QList part; while (!rows.isEmpty()) { // we're splitting the input list into sequences of consecutive // numbers part.append(rows.takeFirst()); while (!rows.isEmpty() && rows.first() == part.last() - 1) { part.append(rows.takeFirst()); } // and now we're removing the current sequence if (!removeRows(part.last(), part.size())) { return false; } part.clear(); } return true; } PlaylistItemList Playlist::RemoveItemsWithoutUndo(int row, int count) { if (row < 0 || row >= items_.size() || row + count > items_.size()) { return PlaylistItemList(); } beginRemoveRows(QModelIndex(), row, row + count - 1); // Remove items PlaylistItemList ret; for (int i = 0; i < count; ++i) { PlaylistItemPtr item(items_.takeAt(row)); ret << item; if (item->type() == "Library") { int id = item->Metadata().id(); if (id != -1) { library_items_by_id_.remove(id, item); } } } endRemoveRows(); QList::iterator it = virtual_items_.begin(); int i = 0; while (it != virtual_items_.end()) { if (*it >= items_.count()) it = virtual_items_.erase(it); else ++it; ++i; } // Reset current_virtual_index_ if (current_row() == -1) current_virtual_index_ = -1; else current_virtual_index_ = virtual_items_.indexOf(current_row()); Save(); return ret; } void Playlist::StopAfter(int row) { QModelIndex old_stop_after = stop_after_; if ((stop_after_.isValid() && stop_after_.row() == row) || row == -1) stop_after_ = QModelIndex(); else stop_after_ = index(row, 0); if (old_stop_after.isValid()) emit dataChanged( old_stop_after, old_stop_after.sibling(old_stop_after.row(), ColumnCount - 1)); if (stop_after_.isValid()) emit dataChanged(stop_after_, stop_after_.sibling(stop_after_.row(), ColumnCount - 1)); } void Playlist::SetStreamMetadata(const QUrl& url, const Song& song) { qLog(Debug) << "Setting metadata for" << url << "to" << song.artist() << song.title(); if (!current_item()) return; if (current_item()->Url() != url) return; // Don't update the metadata if it's only a minor change from before if (current_item()->Metadata().artist() == song.artist() && current_item()->Metadata().title() == song.title()) return; current_item()->SetTemporaryMetadata(song); UpdateScrobblePoint(); InformOfCurrentSongChange(); } void Playlist::ClearStreamMetadata() { if (!current_item()) return; current_item()->ClearTemporaryMetadata(); UpdateScrobblePoint(); emit dataChanged(index(current_item_index_.row(), 0), index(current_item_index_.row(), ColumnCount - 1)); } bool Playlist::stop_after_current() const { PlaylistSequence::RepeatMode repeat_mode = playlist_sequence_->repeat_mode(); if (repeat_mode == PlaylistSequence::Repeat_OneByOne) { return true; } return stop_after_.isValid() && current_item_index_.isValid() && stop_after_.row() == current_item_index_.row(); } PlaylistItemPtr Playlist::current_item() const { // QList[] runs in constant time, so no need to cache current_item if (current_item_index_.isValid() && current_item_index_.row() <= items_.length()) return items_[current_item_index_.row()]; return PlaylistItemPtr(); } PlaylistItem::Options Playlist::current_item_options() const { if (!current_item()) return PlaylistItem::Default; return current_item()->options(); } Song Playlist::current_item_metadata() const { if (!current_item()) return Song(); return current_item()->Metadata(); } void Playlist::UpdateScrobblePoint(qint64 seek_point_nanosec) { const qint64 length = current_item_metadata().length_nanosec(); if (seek_point_nanosec == 0) { if (length == 0) { scrobble_point_ = kMaxScrobblePointNsecs; // 4 minutes } else { scrobble_point_ = qBound(kMinScrobblePointNsecs, length / 2, kMaxScrobblePointNsecs); } } else { if (length == 0) { // current time + 4 minutes scrobble_point_ = seek_point_nanosec + kMaxScrobblePointNsecs; } else { scrobble_point_ = qBound(seek_point_nanosec + kMinScrobblePointNsecs, seek_point_nanosec + (length / 2), seek_point_nanosec + kMaxScrobblePointNsecs); } } set_lastfm_status(LastFM_New); have_incremented_playcount_ = false; } void Playlist::Clear() { const int count = items_.count(); if (count > kUndoItemLimit) { // Too big to keep in the undo stack. Also clear the stack because it // might have been invalidated. RemoveItemsWithoutUndo(0, count); undo_stack_->clear(); } else { undo_stack_->push(new PlaylistUndoCommands::RemoveItems(this, 0, count)); } TurnOffDynamicPlaylist(); Save(); } void Playlist::TurnOffDynamicPlaylist() { dynamic_playlist_.reset(); if (playlist_sequence_) { playlist_sequence_->SetUsingDynamicPlaylist(false); ShuffleModeChanged(playlist_sequence_->shuffle_mode()); } emit DynamicModeChanged(false); Save(); } void Playlist::RepopulateDynamicPlaylist() { if (!dynamic_playlist_) return; RemoveItemsNotInQueue(); InsertSmartPlaylist(dynamic_playlist_); } void Playlist::ExpandDynamicPlaylist() { if (!dynamic_playlist_) return; InsertDynamicItems(5); } void Playlist::RemoveItemsNotInQueue() { if (queue_->is_empty() && !current_item_index_.isValid()) { RemoveItemsWithoutUndo(0, items_.count()); return; } int start = 0; forever { // Find a place to start - first row that isn't in the queue forever { if (start >= rowCount()) return; if (!queue_->ContainsSourceRow(start) && current_row() != start) break; start++; } // Figure out how many rows to remove - keep going until we find a row // that is in the queue int count = 1; forever { if (start + count >= rowCount()) break; if (queue_->ContainsSourceRow(start + count) || current_row() == start + count) break; count++; } RemoveItemsWithoutUndo(start, count); start++; } } void Playlist::ReloadItems(const QList& rows) { for (int row : rows) { PlaylistItemPtr item = item_at(row); item->Reload(); if (row == current_row()) { InformOfCurrentSongChange(); } else { emit dataChanged(index(row, 0), index(row, ColumnCount - 1)); } } Save(); } void Playlist::RateSong(const QModelIndex& index, double rating) { int row = index.row(); if (has_item_at(row)) { PlaylistItemPtr item = item_at(row); if (item && item->IsLocalLibraryItem() && item->Metadata().id() != -1) { library_->UpdateSongRatingAsync(item->Metadata().id(), rating); } } } void Playlist::RateSongs(const QModelIndexList& index_list, double rating) { QList id_list; for (const QModelIndex& index : index_list) { int row = index.row(); if (has_item_at(row)) { PlaylistItemPtr item = item_at(row); if (item && item->IsLocalLibraryItem() && item->Metadata().id() != -1) { id_list << item->Metadata().id(); } } } library_->UpdateSongsRatingAsync(id_list, rating); } void Playlist::AddSongInsertVetoListener(SongInsertVetoListener* listener) { veto_listeners_.append(listener); connect(listener, SIGNAL(destroyed()), this, SLOT(SongInsertVetoListenerDestroyed())); } void Playlist::RemoveSongInsertVetoListener(SongInsertVetoListener* listener) { disconnect(listener, SIGNAL(destroyed()), this, SLOT(SongInsertVetoListenerDestroyed())); veto_listeners_.removeAll(listener); } void Playlist::SongInsertVetoListenerDestroyed() { veto_listeners_.removeAll(qobject_cast(sender())); } void Playlist::Shuffle() { PlaylistItemList new_items(items_); int begin = 0; if (dynamic_playlist_ && current_item_index_.isValid()) begin += current_item_index_.row() + 1; const int count = items_.count(); for (int i = begin; i < count; ++i) { int new_pos = i + (rand() % (count - i)); std::swap(new_items[i], new_items[new_pos]); } undo_stack_->push(new PlaylistUndoCommands::ShuffleItems(this, new_items)); } namespace { bool AlbumShuffleComparator(const QMap& album_key_positions, const QMap& album_keys, int left, int right) { const int left_pos = album_key_positions[album_keys[left]]; const int right_pos = album_key_positions[album_keys[right]]; if (left_pos == right_pos) return left < right; return left_pos < right_pos; } } void Playlist::ReshuffleIndices() { if (!playlist_sequence_) { return; } if (playlist_sequence_->shuffle_mode() == PlaylistSequence::Shuffle_Off) { // No shuffling - sort the virtual item list normally. std::sort(virtual_items_.begin(), virtual_items_.end()); if (current_row() != -1) current_virtual_index_ = virtual_items_.indexOf(current_row()); return; } // If the user is already playing a song, advance the begin iterator to // only shuffle items that haven't been played yet. QList::iterator begin = virtual_items_.begin(); QList::iterator end = virtual_items_.end(); if (current_virtual_index_ != -1) std::advance(begin, current_virtual_index_ + 1); switch (playlist_sequence_->shuffle_mode()) { case PlaylistSequence::Shuffle_Off: // Handled above. break; case PlaylistSequence::Shuffle_All: case PlaylistSequence::Shuffle_InsideAlbum: std::random_shuffle(begin, end); break; case PlaylistSequence::Shuffle_Albums: { QMap album_keys; // real index -> key QSet album_key_set; // unique keys // Find all the unique albums in the playlist for (QList::iterator it = begin; it != end; ++it) { const int index = *it; const QString key = items_[index]->Metadata().AlbumKey(); album_keys[index] = key; album_key_set << key; } // Shuffle them QStringList shuffled_album_keys = album_key_set.toList(); std::random_shuffle(shuffled_album_keys.begin(), shuffled_album_keys.end()); // If the user is currently playing a song, force its album to be first // Or if the song was not playing but it was selected, force its album // to be first. if (current_virtual_index_ != -1 || current_row() != -1) { const QString key = items_[current_row()]->Metadata().AlbumKey(); const int pos = shuffled_album_keys.indexOf(key); if (pos >= 1) { std::swap(shuffled_album_keys[0], shuffled_album_keys[pos]); } } // Create album key -> position mapping for fast lookup QMap album_key_positions; for (int i = 0; i < shuffled_album_keys.count(); ++i) { album_key_positions[shuffled_album_keys[i]] = i; } // Sort the virtual items std::stable_sort(begin, end, std::bind(AlbumShuffleComparator, album_key_positions, album_keys, _1, _2)); break; } } } void Playlist::set_sequence(PlaylistSequence* v) { playlist_sequence_ = v; connect(v, SIGNAL(ShuffleModeChanged(PlaylistSequence::ShuffleMode)), SLOT(ShuffleModeChanged(PlaylistSequence::ShuffleMode))); ShuffleModeChanged(v->shuffle_mode()); } QSortFilterProxyModel* Playlist::proxy() const { return proxy_; } SongList Playlist::GetAllSongs() const { SongList ret; for (PlaylistItemPtr item : items_) { ret << item->Metadata(); } return ret; } PlaylistItemList Playlist::GetAllItems() const { return items_; } quint64 Playlist::GetTotalLength() const { quint64 ret = 0; for (PlaylistItemPtr item : items_) { quint64 length = item->Metadata().length_nanosec(); if (length > 0) ret += length; } return ret; } PlaylistItemList Playlist::library_items_by_id(int id) const { return library_items_by_id_.values(id); } void Playlist::TracksAboutToBeDequeued(const QModelIndex&, int begin, int end) { for (int i = begin; i <= end; ++i) { temp_dequeue_change_indexes_ << queue_->mapToSource(queue_->index(i, Column_Title)); } } void Playlist::TracksDequeued() { for (const QModelIndex& index : temp_dequeue_change_indexes_) { emit dataChanged(index, index); } temp_dequeue_change_indexes_.clear(); emit QueueChanged(); } void Playlist::TracksEnqueued(const QModelIndex&, int begin, int end) { const QModelIndex& b = queue_->mapToSource(queue_->index(begin, Column_Title)); const QModelIndex& e = queue_->mapToSource(queue_->index(end, Column_Title)); emit dataChanged(b, e); } void Playlist::QueueLayoutChanged() { for (int i = 0; i < queue_->rowCount(); ++i) { const QModelIndex& index = queue_->mapToSource(queue_->index(i, Column_Title)); emit dataChanged(index, index); } } void Playlist::ItemChanged(PlaylistItemPtr item) { for (int row = 0; row < items_.count(); ++row) { if (items_[row] == item) { emit dataChanged(index(row, 0), index(row, ColumnCount - 1)); return; } } } void Playlist::InformOfCurrentSongChange() { emit dataChanged(index(current_item_index_.row(), 0), index(current_item_index_.row(), ColumnCount - 1)); // if the song is invalid, we won't play it - there's no point in // informing anybody about the change const Song metadata(current_item_metadata()); if (metadata.is_valid()) { emit CurrentSongChanged(metadata); } } void Playlist::InvalidateDeletedSongs() { QList invalidated_rows; for (int row = 0; row < items_.count(); ++row) { PlaylistItemPtr item = items_[row]; Song song = item->Metadata(); if (!song.is_stream()) { bool exists = QFile::exists(song.url().toLocalFile()); if (!exists && !item->HasForegroundColor(kInvalidSongPriority)) { // gray out the song if it's not there item->SetForegroundColor(kInvalidSongPriority, kInvalidSongColor); invalidated_rows.append(row); } else if (exists && item->HasForegroundColor(kInvalidSongPriority)) { item->RemoveForegroundColor(kInvalidSongPriority); invalidated_rows.append(row); } } } ReloadItems(invalidated_rows); } void Playlist::RemoveDeletedSongs() { QList rows_to_remove; for (int row = 0; row < items_.count(); ++row) { PlaylistItemPtr item = items_[row]; Song song = item->Metadata(); if (!song.is_stream() && !QFile::exists(song.url().toLocalFile())) { rows_to_remove.append(row); } } removeRows(rows_to_remove); } struct SongSimilarHash { long operator()(const Song& song) const { return HashSimilar(song); } }; struct SongSimilarEqual { long operator()(const Song& song1, const Song& song2) const { return song1.IsSimilar(song2); } }; void Playlist::RemoveDuplicateSongs() { QList rows_to_remove; unordered_map unique_songs; for (int row = 0; row < items_.count(); ++row) { PlaylistItemPtr item = items_[row]; const Song& song = item->Metadata(); bool found_duplicate = false; auto uniq_song_it = unique_songs.find(song); if (uniq_song_it != unique_songs.end()) { const Song& uniq_song = uniq_song_it->first; if (song.bitrate() > uniq_song.bitrate()) { rows_to_remove.append(unique_songs[uniq_song]); unique_songs.erase(uniq_song); unique_songs.insert(std::make_pair(song, row)); } else { rows_to_remove.append(row); } found_duplicate = true; } if (!found_duplicate) { unique_songs.insert(std::make_pair(song, row)); } } removeRows(rows_to_remove); } void Playlist::RemoveUnavailableSongs() { QList rows_to_remove; for (int row = 0; row < items_.count(); ++row) { PlaylistItemPtr item = items_[row]; const Song& song = item->Metadata(); // check only local files if (song.url().isLocalFile() && !QFile::exists(song.url().toLocalFile())) { rows_to_remove.append(row); } } removeRows(rows_to_remove); } bool Playlist::ApplyValidityOnCurrentSong(const QUrl& url, bool valid) { PlaylistItemPtr current = current_item(); if (current) { Song current_song = current->Metadata(); // if validity has changed, reload the item if (!current_song.is_stream() && !current_song.is_cdda() && current_song.url() == url && current_song.is_valid() != QFile::exists(current_song.url().toLocalFile())) { ReloadItems(QList() << current_row()); } // gray out the song if it's now broken; otherwise undo the gray color if (valid) { current->RemoveForegroundColor(kInvalidSongPriority); } else { current->SetForegroundColor(kInvalidSongPriority, kInvalidSongColor); } } return static_cast(current); } void Playlist::SetColumnAlignment(const ColumnAlignmentMap& alignment) { column_alignments_ = alignment; } void Playlist::SkipTracks(const QModelIndexList& source_indexes) { for (const QModelIndex& source_index : source_indexes) { PlaylistItemPtr track_to_skip = item_at(source_index.row()); track_to_skip->SetShouldSkip(!((track_to_skip)->GetShouldSkip())); emit dataChanged(source_index, source_index); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlist.h000066400000000000000000000357171260417502300240460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PLAYLIST_H #define PLAYLIST_H #include #include #include "playlistitem.h" #include "playlistsequence.h" #include "core/tagreaderclient.h" #include "core/song.h" #include "smartplaylists/generator_fwd.h" class LibraryBackend; class PlaylistBackend; class PlaylistFilter; class Queue; class InternetModel; class InternetService; class TaskManager; class QSortFilterProxyModel; class QUndoStack; namespace PlaylistUndoCommands { class InsertItems; class RemoveItems; class MoveItems; class ReOrderItems; class SortItems; class ShuffleItems; } typedef QMap ColumnAlignmentMap; Q_DECLARE_METATYPE(Qt::Alignment); Q_DECLARE_METATYPE(ColumnAlignmentMap); // Objects that may prevent a song being added to the playlist. When there // is something about to be inserted into it, Playlist notifies all of it's // listeners about the fact and every one of them picks 'invalid' songs. class SongInsertVetoListener : public QObject { Q_OBJECT public: // Listener returns a list of 'invalid' songs. 'old_songs' are songs that are // currently in the playlist and 'new_songs' are the songs about to be added // if // nobody exercises a veto. virtual SongList AboutToInsertSongs(const SongList& old_songs, const SongList& new_songs) = 0; }; class Playlist : public QAbstractListModel { Q_OBJECT friend class PlaylistUndoCommands::InsertItems; friend class PlaylistUndoCommands::RemoveItems; friend class PlaylistUndoCommands::MoveItems; friend class PlaylistUndoCommands::ReOrderItems; public: Playlist(PlaylistBackend* backend, TaskManager* task_manager, LibraryBackend* library, int id, const QString& special_type = QString(), bool favorite = false, QObject* parent = nullptr); ~Playlist(); void SkipTracks(const QModelIndexList& source_indexes); // Always add new columns to the end of this enum - the values are persisted enum Column { Column_Title = 0, Column_Artist, Column_Album, Column_AlbumArtist, Column_Composer, Column_Length, Column_Track, Column_Disc, Column_Year, Column_Genre, Column_BPM, Column_Bitrate, Column_Samplerate, Column_Filename, Column_BaseFilename, Column_Filesize, Column_Filetype, Column_DateCreated, Column_DateModified, Column_Rating, Column_PlayCount, Column_SkipCount, Column_LastPlayed, Column_Score, Column_Comment, Column_Source, Column_Mood, Column_Performer, Column_Grouping, Column_OriginalYear, ColumnCount }; enum Role { Role_IsCurrent = Qt::UserRole + 1, Role_IsPaused, Role_StopAfter, Role_QueuePosition, Role_CanSetRating, }; enum LastFMStatus { LastFM_New = 0, // Haven't scrobbled yet, but we want to later LastFM_Scrobbled, // Scrobbled ok LastFM_Seeked, // The user seeked so don't scrobble LastFM_Error, // Tried to scrobble but got an error LastFM_Invalid, // The song isn't suitable for scrobbling LastFM_Queued, // Track added to the queue for scrobbling }; enum Path { Path_Automatic = 0, // Automatically select path type Path_Absolute, // Always use absolute paths Path_Relative, // Always use relative paths Path_Ask_User, // Only used in preferences: to ask user which of the // previous values he wants to use. }; static const char* kCddaMimeType; static const char* kRowsMimetype; static const char* kPlayNowMimetype; static const int kInvalidSongPriority; static const QRgb kInvalidSongColor; static const int kDynamicHistoryPriority; static const QRgb kDynamicHistoryColor; static const char* kSettingsGroup; static const char* kPathType; static const char* kWriteMetadata; static const int kUndoStackSize; static const int kUndoItemLimit; static const qint64 kMinScrobblePointNsecs; static const qint64 kMaxScrobblePointNsecs; static bool CompareItems(int column, Qt::SortOrder order, PlaylistItemPtr a, PlaylistItemPtr b); static QString column_name(Column column); static QString abbreviated_column_name(Column column); static bool column_is_editable(Playlist::Column column); static bool set_column_value(Song& song, Column column, const QVariant& value); // Persistence void Save() const; void Restore(); // Accessors QSortFilterProxyModel* proxy() const; Queue* queue() const { return queue_; } int id() const { return id_; } const QString& ui_path() const { return ui_path_; } void set_ui_path(const QString& path) { ui_path_ = path; } bool is_favorite() const { return favorite_; } void set_favorite(bool favorite) { favorite_ = favorite; } int current_row() const; int last_played_row() const; int next_row(bool ignore_repeat_track = false) const; int previous_row(bool ignore_repeat_track = false) const; const QModelIndex current_index() const; bool stop_after_current() const; bool is_dynamic() const { return static_cast(dynamic_playlist_); } int dynamic_history_length() const; QString special_type() const { return special_type_; } void set_special_type(const QString& v) { special_type_ = v; } const PlaylistItemPtr& item_at(int index) const { return items_[index]; } const bool has_item_at(int index) const { return index >= 0 && index < rowCount(); } PlaylistItemPtr current_item() const; PlaylistItem::Options current_item_options() const; Song current_item_metadata() const; PlaylistItemList library_items_by_id(int id) const; SongList GetAllSongs() const; PlaylistItemList GetAllItems() const; quint64 GetTotalLength() const; // in seconds void set_sequence(PlaylistSequence* v); PlaylistSequence* sequence() const { return playlist_sequence_; } QUndoStack* undo_stack() const { return undo_stack_; } // Scrobbling qint64 scrobble_point_nanosec() const { return scrobble_point_; } LastFMStatus get_lastfm_status() const { return lastfm_status_; } bool have_incremented_playcount() const { return have_incremented_playcount_; } void set_lastfm_status(LastFMStatus status) { lastfm_status_ = status; } void set_have_incremented_playcount() { have_incremented_playcount_ = true; } void UpdateScrobblePoint(qint64 seek_point_nanosec = 0); // Changing the playlist void InsertItems(const PlaylistItemList& items, int pos = -1, bool play_now = false, bool enqueue = false); void InsertLibraryItems(const SongList& items, int pos = -1, bool play_now = false, bool enqueue = false); void InsertSongs(const SongList& items, int pos = -1, bool play_now = false, bool enqueue = false); void InsertSongsOrLibraryItems(const SongList& items, int pos = -1, bool play_now = false, bool enqueue = false); void InsertSmartPlaylist(smart_playlists::GeneratorPtr gen, int pos = -1, bool play_now = false, bool enqueue = false); void InsertInternetItems(InternetService* service, const SongList& songs, int pos = -1, bool play_now = false, bool enqueue = false); void ReshuffleIndices(); // If this playlist contains the current item, this method will apply the // "valid" flag on it. // If the "valid" flag is false, the song will be greyed out. Otherwise the // grey color will // be undone. // If the song is a local file and it's valid but non existent or invalid but // exists, the // song will be reloaded to even out the situation because obviously something // has changed. // This returns true if this playlist had current item when the method was // invoked. bool ApplyValidityOnCurrentSong(const QUrl& url, bool valid); // Grays out and reloads all deleted songs in all playlists. Also, "ungreys" // those songs // which were once deleted but now got restored somehow. void InvalidateDeletedSongs(); // Removes from the playlist all local files that don't exist anymore. void RemoveDeletedSongs(); void StopAfter(int row); void ReloadItems(const QList& rows); void InformOfCurrentSongChange(); // Changes rating of a song to the given value asynchronously void RateSong(const QModelIndex& index, double rating); void RateSongs(const QModelIndexList& index_list, double rating); // Registers an object which will get notifications when new songs // are about to be inserted into this playlist. void AddSongInsertVetoListener(SongInsertVetoListener* listener); // Unregisters a SongInsertVetoListener object. void RemoveSongInsertVetoListener(SongInsertVetoListener* listener); // Just emits the dataChanged() signal so the mood column is repainted. void MoodbarUpdated(const QModelIndex& index); // QAbstractListModel int rowCount(const QModelIndex& = QModelIndex()) const { return items_.count(); } int columnCount(const QModelIndex& = QModelIndex()) const { return ColumnCount; } QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; bool setData(const QModelIndex& index, const QVariant& value, int role); QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; Qt::ItemFlags flags(const QModelIndex& index) const; QStringList mimeTypes() const; Qt::DropActions supportedDropActions() const; QMimeData* mimeData(const QModelIndexList& indexes) const; bool dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent); void sort(int column, Qt::SortOrder order); bool removeRows(int row, int count, const QModelIndex& parent = QModelIndex()); public slots: void set_current_row(int index, bool is_stopping = false); void Paused(); void Playing(); void Stopped(); void IgnoreSorting(bool value) { ignore_sorting_ = value; } void ClearStreamMetadata(); void SetStreamMetadata(const QUrl& url, const Song& song); void ItemChanged(PlaylistItemPtr item); void UpdateItems(const SongList& songs); void Clear(); void RemoveDuplicateSongs(); void RemoveUnavailableSongs(); void Shuffle(); void ShuffleModeChanged(PlaylistSequence::ShuffleMode mode); void ExpandDynamicPlaylist(); void RepopulateDynamicPlaylist(); void TurnOffDynamicPlaylist(); void SetColumnAlignment(const ColumnAlignmentMap& alignment); void InsertUrls(const QList& urls, int pos = -1, bool play_now = false, bool enqueue = false); // Removes items with given indices from the playlist. This operation is not // undoable. void RemoveItemsWithoutUndo(const QList& indices); signals: void RestoreFinished(); void CurrentSongChanged(const Song& metadata); void EditingFinished(const QModelIndex& index); void PlayRequested(const QModelIndex& index); // Signals that the underlying list of items was changed, meaning that // something was added to it, removed from it or the ordering changed. void PlaylistChanged(); void DynamicModeChanged(bool dynamic); void LoadTracksError(const QString& message); // Signals that the queue has changed, meaning that the remaining queued // items should update their position. void QueueChanged(); private: void SetCurrentIsPaused(bool paused); int NextVirtualIndex(int i, bool ignore_repeat_track) const; int PreviousVirtualIndex(int i, bool ignore_repeat_track) const; bool FilterContainsVirtualIndex(int i) const; void TurnOnDynamicPlaylist(smart_playlists::GeneratorPtr gen); void InsertInternetItems(const InternetModel* model, const QModelIndexList& items, int pos, bool play_now, bool enqueue); template void InsertSongItems(const SongList& songs, int pos, bool play_now, bool enqueue); void InsertDynamicItems(int count); // Modify the playlist without changing the undo stack. These are used by // our friends in PlaylistUndoCommands void InsertItemsWithoutUndo(const PlaylistItemList& items, int pos, bool enqueue = false); PlaylistItemList RemoveItemsWithoutUndo(int pos, int count); void MoveItemsWithoutUndo(const QList& source_rows, int pos); void MoveItemWithoutUndo(int source, int dest); void MoveItemsWithoutUndo(int start, const QList& dest_rows); void ReOrderWithoutUndo(const PlaylistItemList& new_items); void RemoveItemsNotInQueue(); // Removes rows with given indices from this playlist. bool removeRows(QList& rows); private slots: void TracksAboutToBeDequeued(const QModelIndex&, int begin, int end); void TracksDequeued(); void TracksEnqueued(const QModelIndex&, int begin, int end); void QueueLayoutChanged(); void SongSaveComplete(TagReaderReply* reply, const QPersistentModelIndex& index); void ItemReloadComplete(); void ItemsLoaded(); void SongInsertVetoListenerDestroyed(); private: bool is_loading_; PlaylistFilter* proxy_; Queue* queue_; QList temp_dequeue_change_indexes_; PlaylistBackend* backend_; TaskManager* task_manager_; LibraryBackend* library_; int id_; QString ui_path_; bool favorite_; PlaylistItemList items_; QList virtual_items_; // Contains the indices into items_ in the order // that they will be played. // A map of library ID to playlist item - for fast lookups when library // items change. QMultiMap library_items_by_id_; QPersistentModelIndex current_item_index_; QPersistentModelIndex last_played_item_index_; QPersistentModelIndex stop_after_; bool current_is_paused_; int current_virtual_index_; bool is_shuffled_; qint64 scrobble_point_; LastFMStatus lastfm_status_; bool have_incremented_playcount_; PlaylistSequence* playlist_sequence_; // Hack to stop QTreeView::setModel sorting the playlist bool ignore_sorting_; QUndoStack* undo_stack_; smart_playlists::GeneratorPtr dynamic_playlist_; ColumnAlignmentMap column_alignments_; QList veto_listeners_; QString special_type_; }; // QDataStream& operator <<(QDataStream&, const Playlist*); // QDataStream& operator >>(QDataStream&, Playlist*&); #endif // PLAYLIST_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistbackend.cpp000066400000000000000000000323551260417502300257040ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "playlistbackend.h" #include #include #include #include #include #include #include #include "core/application.h" #include "core/database.h" #include "core/logging.h" #include "core/scopedtransaction.h" #include "core/song.h" #include "library/librarybackend.h" #include "library/sqlrow.h" #include "playlist/songplaylistitem.h" #include "playlistparsers/cueparser.h" #include "smartplaylists/generator.h" using std::placeholders::_1; using std::shared_ptr; using smart_playlists::GeneratorPtr; const int PlaylistBackend::kSongTableJoins = 4; PlaylistBackend::PlaylistBackend(Application* app, QObject* parent) : QObject(parent), app_(app), db_(app_->database()) {} PlaylistBackend::PlaylistList PlaylistBackend::GetAllPlaylists() { return GetPlaylists(GetPlaylists_All); } PlaylistBackend::PlaylistList PlaylistBackend::GetAllOpenPlaylists() { return GetPlaylists(GetPlaylists_OpenInUi); } PlaylistBackend::PlaylistList PlaylistBackend::GetAllFavoritePlaylists() { return GetPlaylists(GetPlaylists_Favorite); } PlaylistBackend::PlaylistList PlaylistBackend::GetPlaylists( GetPlaylistsFlags flags) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); PlaylistList ret; QStringList condition_list; if (flags & GetPlaylists_OpenInUi) { condition_list << "ui_order != -1"; } if (flags & GetPlaylists_Favorite) { condition_list << "is_favorite != 0"; } QString condition; if (!condition_list.isEmpty()) { condition = " WHERE " + condition_list.join(" OR "); } QSqlQuery q( "SELECT ROWID, name, last_played, dynamic_playlist_type," " dynamic_playlist_data, dynamic_playlist_backend," " special_type, ui_path, is_favorite" " FROM playlists" " " + condition + " ORDER BY ui_order", db); q.exec(); if (db_->CheckErrors(q)) return ret; while (q.next()) { Playlist p; p.id = q.value(0).toInt(); p.name = q.value(1).toString(); p.last_played = q.value(2).toInt(); p.dynamic_type = q.value(3).toString(); p.dynamic_data = q.value(4).toByteArray(); p.dynamic_backend = q.value(5).toString(); p.special_type = q.value(6).toString(); p.ui_path = q.value(7).toString(); p.favorite = q.value(8).toBool(); ret << p; } return ret; } PlaylistBackend::Playlist PlaylistBackend::GetPlaylist(int id) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery q( "SELECT ROWID, name, last_played, dynamic_playlist_type," " dynamic_playlist_data, dynamic_playlist_backend," " special_type, ui_path, is_favorite" " FROM playlists" " WHERE ROWID=:id", db); q.bindValue(":id", id); q.exec(); if (db_->CheckErrors(q)) return Playlist(); q.next(); Playlist p; p.id = q.value(0).toInt(); p.name = q.value(1).toString(); p.last_played = q.value(2).toInt(); p.dynamic_type = q.value(3).toString(); p.dynamic_data = q.value(4).toByteArray(); p.dynamic_backend = q.value(5).toString(); p.special_type = q.value(6).toString(); p.ui_path = q.value(7).toString(); p.favorite = q.value(8).toBool(); return p; } QSqlQuery PlaylistBackend::GetPlaylistRows(int playlist) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QString query = "SELECT songs.ROWID, " + Song::JoinSpec("songs") + "," " magnatune_songs.ROWID, " + Song::JoinSpec("magnatune_songs") + "," " jamendo_songs.ROWID, " + Song::JoinSpec("jamendo_songs") + "," " p.ROWID, " + Song::JoinSpec("p") + "," " p.type, p.radio_service" " FROM playlist_items AS p" " LEFT JOIN songs" " ON p.library_id = songs.ROWID" " LEFT JOIN magnatune_songs" " ON p.library_id = magnatune_songs.ROWID" " LEFT JOIN jamendo.songs AS jamendo_songs" " ON p.library_id = jamendo_songs.ROWID" " WHERE p.playlist = :playlist"; QSqlQuery q(db); // Forward iterations only may be faster q.setForwardOnly(true); q.prepare(query); q.bindValue(":playlist", playlist); q.exec(); return q; } QList PlaylistBackend::GetPlaylistItems(int playlist) { QSqlQuery q = GetPlaylistRows(playlist); // Note that as this only accesses the query, not the db, we don't need the // mutex. if (db_->CheckErrors(q)) return QList(); // it's probable that we'll have a few songs associated with the // same CUE so we're caching results of parsing CUEs std::shared_ptr state_ptr(new NewSongFromQueryState()); QList playlistitems; while (q.next()) { playlistitems << NewPlaylistItemFromQuery(SqlRow(q), state_ptr); } return playlistitems; } QList PlaylistBackend::GetPlaylistSongs(int playlist) { QSqlQuery q = GetPlaylistRows(playlist); // Note that as this only accesses the query, not the db, we don't need the // mutex. if (db_->CheckErrors(q)) return QList(); // it's probable that we'll have a few songs associated with the // same CUE so we're caching results of parsing CUEs std::shared_ptr state_ptr(new NewSongFromQueryState()); QList songs; while (q.next()) { songs << NewSongFromQuery(SqlRow(q), state_ptr); } return songs; } PlaylistItemPtr PlaylistBackend::NewPlaylistItemFromQuery( const SqlRow& row, std::shared_ptr state) { // The song tables get joined first, plus one each for the song ROWIDs const int playlist_row = (Song::kColumns.count() + 1) * kSongTableJoins; PlaylistItemPtr item( PlaylistItem::NewFromType(row.value(playlist_row).toString())); if (item) { item->InitFromQuery(row); return RestoreCueData(item, state); } else { return item; } } Song PlaylistBackend::NewSongFromQuery( const SqlRow& row, std::shared_ptr state) { return NewPlaylistItemFromQuery(row, state)->Metadata(); } // If song had a CUE and the CUE still exists, the metadata from it will // be applied here. PlaylistItemPtr PlaylistBackend::RestoreCueData( PlaylistItemPtr item, std::shared_ptr state) { // we need library to run a CueParser; also, this method applies only to // file-type PlaylistItems if (item->type() != "File") { return item; } CueParser cue_parser(app_->library_backend()); Song song = item->Metadata(); // we're only interested in .cue songs here if (!song.has_cue()) { return item; } QString cue_path = song.cue_path(); // if .cue was deleted - reload the song if (!QFile::exists(cue_path)) { item->Reload(); return item; } SongList song_list; { QMutexLocker locker(&state->mutex_); if (!state->cached_cues_.contains(cue_path)) { QFile cue(cue_path); cue.open(QIODevice::ReadOnly); song_list = cue_parser.Load(&cue, cue_path, QDir(cue_path.section('/', 0, -2))); state->cached_cues_[cue_path] = song_list; } else { song_list = state->cached_cues_[cue_path]; } } for (const Song& from_list : song_list) { if (from_list.url().toEncoded() == song.url().toEncoded() && from_list.beginning_nanosec() == song.beginning_nanosec()) { // we found a matching section; replace the input // item with a new one containing CUE metadata return PlaylistItemPtr(new SongPlaylistItem(from_list)); } } // there's no such section in the related .cue -> reload the song item->Reload(); return item; } void PlaylistBackend::SavePlaylistAsync(int playlist, const PlaylistItemList& items, int last_played, GeneratorPtr dynamic) { metaObject()->invokeMethod( this, "SavePlaylist", Qt::QueuedConnection, Q_ARG(int, playlist), Q_ARG(PlaylistItemList, items), Q_ARG(int, last_played), Q_ARG(smart_playlists::GeneratorPtr, dynamic)); } void PlaylistBackend::SavePlaylist(int playlist, const PlaylistItemList& items, int last_played, GeneratorPtr dynamic) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); qLog(Debug) << "Saving playlist" << playlist; QSqlQuery clear("DELETE FROM playlist_items WHERE playlist = :playlist", db); QSqlQuery insert( "INSERT INTO playlist_items" " (playlist, type, library_id, radio_service, " + Song::kColumnSpec + ")" " VALUES (:playlist, :type, :library_id, :radio_service, " + Song::kBindSpec + ")", db); QSqlQuery update( "UPDATE playlists SET " " last_played=:last_played," " dynamic_playlist_type=:dynamic_type," " dynamic_playlist_data=:dynamic_data," " dynamic_playlist_backend=:dynamic_backend" " WHERE ROWID=:playlist", db); ScopedTransaction transaction(&db); // Clear the existing items in the playlist clear.bindValue(":playlist", playlist); clear.exec(); if (db_->CheckErrors(clear)) return; // Save the new ones for (PlaylistItemPtr item : items) { insert.bindValue(":playlist", playlist); item->BindToQuery(&insert); insert.exec(); db_->CheckErrors(insert); } // Update the last played track number update.bindValue(":last_played", last_played); if (dynamic) { update.bindValue(":dynamic_type", dynamic->type()); update.bindValue(":dynamic_data", dynamic->Save()); update.bindValue(":dynamic_backend", dynamic->library()->songs_table()); } else { update.bindValue(":dynamic_type", QString()); update.bindValue(":dynamic_data", QByteArray()); update.bindValue(":dynamic_backend", QString()); } update.bindValue(":playlist", playlist); update.exec(); if (db_->CheckErrors(update)) return; transaction.Commit(); } int PlaylistBackend::CreatePlaylist(const QString& name, const QString& special_type) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery q( "INSERT INTO playlists (name, special_type)" " VALUES (:name, :special_type)", db); q.bindValue(":name", name); q.bindValue(":special_type", special_type); q.exec(); if (db_->CheckErrors(q)) return -1; return q.lastInsertId().toInt(); } void PlaylistBackend::RemovePlaylist(int id) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery delete_playlist("DELETE FROM playlists WHERE ROWID=:id", db); QSqlQuery delete_items("DELETE FROM playlist_items WHERE playlist=:id", db); delete_playlist.bindValue(":id", id); delete_items.bindValue(":id", id); ScopedTransaction transaction(&db); delete_playlist.exec(); if (db_->CheckErrors(delete_playlist)) return; delete_items.exec(); if (db_->CheckErrors(delete_items)) return; transaction.Commit(); } void PlaylistBackend::RenamePlaylist(int id, const QString& new_name) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery q("UPDATE playlists SET name=:name WHERE ROWID=:id", db); q.bindValue(":name", new_name); q.bindValue(":id", id); q.exec(); db_->CheckErrors(q); } void PlaylistBackend::FavoritePlaylist(int id, bool is_favorite) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery q("UPDATE playlists SET is_favorite=:is_favorite WHERE ROWID=:id", db); q.bindValue(":is_favorite", is_favorite ? 1 : 0); q.bindValue(":id", id); q.exec(); db_->CheckErrors(q); } void PlaylistBackend::SetPlaylistOrder(const QList& ids) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); ScopedTransaction transaction(&db); QSqlQuery q("UPDATE playlists SET ui_order=-1", db); q.exec(); if (db_->CheckErrors(q)) return; q = QSqlQuery("UPDATE playlists SET ui_order=:index WHERE ROWID=:id", db); for (int i = 0; i < ids.count(); ++i) { q.bindValue(":index", i); q.bindValue(":id", ids[i]); q.exec(); if (db_->CheckErrors(q)) return; } transaction.Commit(); } void PlaylistBackend::SetPlaylistUiPath(int id, const QString& path) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery q("UPDATE playlists SET ui_path=:path WHERE ROWID=:id", db); ScopedTransaction transaction(&db); q.bindValue(":path", path); q.bindValue(":id", id); q.exec(); if (db_->CheckErrors(q)) return; transaction.Commit(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistbackend.h000066400000000000000000000065041260417502300253460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PLAYLISTBACKEND_H #define PLAYLISTBACKEND_H #include #include #include #include #include "playlistitem.h" #include "smartplaylists/generator_fwd.h" class Application; class Database; class PlaylistBackend : public QObject { Q_OBJECT public: Q_INVOKABLE PlaylistBackend(Application* app, QObject* parent = nullptr); struct Playlist { Playlist() : id(-1), favorite(false), last_played(0) {} int id; QString name; QString ui_path; bool favorite; int last_played; QString dynamic_type; QString dynamic_backend; QByteArray dynamic_data; // Special playlists have different behaviour, eg. the "spotify-search" // type has a spotify search box at the top, replacing the ordinary filter. QString special_type; }; typedef QList PlaylistList; static const int kSongTableJoins; PlaylistList GetAllPlaylists(); PlaylistList GetAllOpenPlaylists(); PlaylistList GetAllFavoritePlaylists(); PlaylistBackend::Playlist GetPlaylist(int id); QList GetPlaylistItems(int playlist); QList GetPlaylistSongs(int playlist); void SetPlaylistOrder(const QList& ids); void SetPlaylistUiPath(int id, const QString& path); int CreatePlaylist(const QString& name, const QString& special_type); void SavePlaylistAsync(int playlist, const PlaylistItemList& items, int last_played, smart_playlists::GeneratorPtr dynamic); void RenamePlaylist(int id, const QString& new_name); void FavoritePlaylist(int id, bool is_favorite); void RemovePlaylist(int id); Application* app() const { return app_; } public slots: void SavePlaylist(int playlist, const PlaylistItemList& items, int last_played, smart_playlists::GeneratorPtr dynamic); private: struct NewSongFromQueryState { QHash cached_cues_; QMutex mutex_; }; QSqlQuery GetPlaylistRows(int playlist); Song NewSongFromQuery(const SqlRow& row, std::shared_ptr state); PlaylistItemPtr NewPlaylistItemFromQuery( const SqlRow& row, std::shared_ptr state); PlaylistItemPtr RestoreCueData(PlaylistItemPtr item, std::shared_ptr state); enum GetPlaylistsFlags { GetPlaylists_OpenInUi = 1, GetPlaylists_Favorite = 2, GetPlaylists_All = GetPlaylists_OpenInUi | GetPlaylists_Favorite }; PlaylistList GetPlaylists(GetPlaylistsFlags flags); Application* app_; Database* db_; }; #endif // PLAYLISTBACKEND_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistcontainer.cpp000066400000000000000000000356551260417502300263050ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "playlistcontainer.h" #include "playlistmanager.h" #include "ui_playlistcontainer.h" #include "core/logging.h" #include "playlistparsers/playlistparser.h" #include "ui/iconloader.h" #include #include #include #include #include #include #include #include #include #include const char* PlaylistContainer::kSettingsGroup = "Playlist"; const int PlaylistContainer::kFilterDelayMs = 100; const int PlaylistContainer::kFilterDelayPlaylistSizeThreshold = 5000; PlaylistContainer::PlaylistContainer(QWidget* parent) : QWidget(parent), ui_(new Ui_PlaylistContainer), manager_(nullptr), undo_(nullptr), redo_(nullptr), playlist_(nullptr), starting_up_(true), tab_bar_visible_(false), tab_bar_animation_(new QTimeLine(500, this)), no_matches_label_(nullptr), filter_timer_(new QTimer(this)) { ui_->setupUi(this); no_matches_label_ = new QLabel(ui_->playlist); no_matches_label_->setAlignment(Qt::AlignTop | Qt::AlignHCenter); no_matches_label_->setAttribute(Qt::WA_TransparentForMouseEvents); no_matches_label_->setWordWrap(true); no_matches_label_->raise(); no_matches_label_->hide(); // Set the colour of the no matches label to the disabled text colour QPalette no_matches_palette = no_matches_label_->palette(); const QColor no_matches_color = no_matches_palette.color(QPalette::Disabled, QPalette::Text); no_matches_palette.setColor(QPalette::Normal, QPalette::WindowText, no_matches_color); no_matches_palette.setColor(QPalette::Inactive, QPalette::WindowText, no_matches_color); no_matches_label_->setPalette(no_matches_palette); // Make it bold QFont no_matches_font = no_matches_label_->font(); no_matches_font.setBold(true); no_matches_label_->setFont(no_matches_font); settings_.beginGroup(kSettingsGroup); // Tab bar ui_->tab_bar->setExpanding(false); ui_->tab_bar->setMovable(true); connect(tab_bar_animation_, SIGNAL(frameChanged(int)), SLOT(SetTabBarHeight(int))); ui_->tab_bar->setMaximumHeight(0); // Connections connect(ui_->tab_bar, SIGNAL(currentChanged(int)), SLOT(Save())); connect(ui_->tab_bar, SIGNAL(Save(int)), SLOT(SavePlaylist(int))); // set up timer for delayed filter updates filter_timer_->setSingleShot(true); filter_timer_->setInterval(kFilterDelayMs); connect(filter_timer_, SIGNAL(timeout()), this, SLOT(UpdateFilter())); // Replace playlist search filter with native search box. connect(ui_->filter, SIGNAL(textChanged(QString)), SLOT(MaybeUpdateFilter())); connect(ui_->playlist, SIGNAL(FocusOnFilterSignal(QKeyEvent*)), SLOT(FocusOnFilter(QKeyEvent*))); ui_->filter->installEventFilter(this); } PlaylistContainer::~PlaylistContainer() { delete ui_; } PlaylistView* PlaylistContainer::view() const { return ui_->playlist; } void PlaylistContainer::SetActions(QAction* new_playlist, QAction* load_playlist, QAction* save_playlist, QAction* next_playlist, QAction* previous_playlist) { ui_->create_new->setDefaultAction(new_playlist); ui_->save->setDefaultAction(save_playlist); ui_->load->setDefaultAction(load_playlist); ui_->tab_bar->SetActions(new_playlist, load_playlist); connect(new_playlist, SIGNAL(triggered()), SLOT(NewPlaylist())); connect(save_playlist, SIGNAL(triggered()), SLOT(SavePlaylist())); connect(load_playlist, SIGNAL(triggered()), SLOT(LoadPlaylist())); connect(next_playlist, SIGNAL(triggered()), SLOT(GoToNextPlaylistTab())); connect(previous_playlist, SIGNAL(triggered()), SLOT(GoToPreviousPlaylistTab())); } void PlaylistContainer::SetManager(PlaylistManager* manager) { manager_ = manager; ui_->tab_bar->SetManager(manager); connect(ui_->tab_bar, SIGNAL(CurrentIdChanged(int)), manager, SLOT(SetCurrentPlaylist(int))); connect(ui_->tab_bar, SIGNAL(Rename(int, QString)), manager, SLOT(Rename(int, QString))); connect(ui_->tab_bar, SIGNAL(Close(int)), manager, SLOT(Close(int))); connect(ui_->tab_bar, SIGNAL(PlaylistFavorited(int, bool)), manager, SLOT(Favorite(int, bool))); connect(ui_->tab_bar, SIGNAL(PlaylistOrderChanged(QList)), manager, SLOT(ChangePlaylistOrder(QList))); connect(manager, SIGNAL(CurrentChanged(Playlist*)), SLOT(SetViewModel(Playlist*))); connect(manager, SIGNAL(PlaylistAdded(int, QString, bool)), SLOT(PlaylistAdded(int, QString, bool))); connect(manager, SIGNAL(PlaylistManagerInitialized()), SLOT(Started())); connect(manager, SIGNAL(PlaylistClosed(int)), SLOT(PlaylistClosed(int))); connect(manager, SIGNAL(PlaylistRenamed(int, QString)), SLOT(PlaylistRenamed(int, QString))); } void PlaylistContainer::SetViewModel(Playlist* playlist) { if (view()->selectionModel()) { disconnect(view()->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this, SLOT(SelectionChanged())); } if (playlist_ && playlist_->proxy()) { disconnect(playlist_->proxy(), SIGNAL(modelReset()), this, SLOT(UpdateNoMatchesLabel())); disconnect(playlist_->proxy(), SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(UpdateNoMatchesLabel())); disconnect(playlist_->proxy(), SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(UpdateNoMatchesLabel())); } if (playlist_) { disconnect(playlist_, SIGNAL(modelReset()), this, SLOT(UpdateNoMatchesLabel())); disconnect(playlist_, SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(UpdateNoMatchesLabel())); disconnect(playlist_, SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(UpdateNoMatchesLabel())); } playlist_ = playlist; // Set the view playlist->IgnoreSorting(true); view()->setModel(playlist->proxy()); view()->SetItemDelegates(manager_->library_backend()); view()->SetPlaylist(playlist); view()->selectionModel()->select(manager_->current_selection(), QItemSelectionModel::ClearAndSelect); playlist->IgnoreSorting(false); connect(view()->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this, SLOT(SelectionChanged())); emit ViewSelectionModelChanged(); // Update filter ui_->filter->setText(playlist->proxy()->filterRegExp().pattern()); // Update the no matches label connect(playlist_->proxy(), SIGNAL(modelReset()), SLOT(UpdateNoMatchesLabel())); connect(playlist_->proxy(), SIGNAL(rowsInserted(QModelIndex, int, int)), SLOT(UpdateNoMatchesLabel())); connect(playlist_->proxy(), SIGNAL(rowsRemoved(QModelIndex, int, int)), SLOT(UpdateNoMatchesLabel())); connect(playlist_, SIGNAL(modelReset()), SLOT(UpdateNoMatchesLabel())); connect(playlist_, SIGNAL(rowsInserted(QModelIndex, int, int)), SLOT(UpdateNoMatchesLabel())); connect(playlist_, SIGNAL(rowsRemoved(QModelIndex, int, int)), SLOT(UpdateNoMatchesLabel())); UpdateNoMatchesLabel(); // Ensure that tab is current if (ui_->tab_bar->current_id() != manager_->current_id()) ui_->tab_bar->set_current_id(manager_->current_id()); // Sort out the undo/redo actions delete undo_; delete redo_; undo_ = playlist->undo_stack()->createUndoAction(this); redo_ = playlist->undo_stack()->createRedoAction(this); undo_->setIcon(IconLoader::Load("edit-undo")); undo_->setShortcut(QKeySequence::Undo); redo_->setIcon(IconLoader::Load("edit-redo")); redo_->setShortcut(QKeySequence::Redo); ui_->undo->setDefaultAction(undo_); ui_->redo->setDefaultAction(redo_); emit UndoRedoActionsChanged(undo_, redo_); } void PlaylistContainer::ActivePlaying() { UpdateActiveIcon(QIcon(":tiny-start.png")); } void PlaylistContainer::ActivePaused() { UpdateActiveIcon(QIcon(":tiny-pause.png")); } void PlaylistContainer::ActiveStopped() { UpdateActiveIcon(QIcon()); } void PlaylistContainer::UpdateActiveIcon(const QIcon& icon) { // Unset all existing icons for (int i = 0; i < ui_->tab_bar->count(); ++i) { ui_->tab_bar->setTabIcon(i, QIcon()); } // Set our icon if (!icon.isNull()) ui_->tab_bar->set_icon_by_id(manager_->active_id(), icon); } void PlaylistContainer::PlaylistAdded(int id, const QString& name, bool favorite) { const int index = ui_->tab_bar->count(); ui_->tab_bar->InsertTab(id, index, name, favorite); // Are we startup up, should we select this tab? if (starting_up_ && settings_.value("current_playlist", 1).toInt() == id) { starting_up_ = false; ui_->tab_bar->set_current_id(id); } if (ui_->tab_bar->count() > 1) { // Have to do this here because sizeHint() is only valid when there's a // tab in the bar. tab_bar_animation_->setFrameRange(0, ui_->tab_bar->sizeHint().height()); if (!isVisible()) { // Skip the animation since the window is hidden (eg. if we're still // loading the UI). tab_bar_visible_ = true; ui_->tab_bar->setMaximumHeight(tab_bar_animation_->endFrame()); } else { SetTabBarVisible(true); } } } void PlaylistContainer::Started() { starting_up_ = false; } void PlaylistContainer::PlaylistClosed(int id) { ui_->tab_bar->RemoveTab(id); if (ui_->tab_bar->count() <= 1) SetTabBarVisible(false); } void PlaylistContainer::PlaylistRenamed(int id, const QString& new_name) { ui_->tab_bar->set_text_by_id(id, new_name); } void PlaylistContainer::NewPlaylist() { manager_->New(tr("Playlist")); } void PlaylistContainer::LoadPlaylist() { QString filename = settings_.value("last_load_playlist").toString(); filename = QFileDialog::getOpenFileName(this, tr("Load playlist"), filename, manager_->parser()->filters()); if (filename.isNull()) return; settings_.setValue("last_load_playlist", filename); manager_->Load(filename); } void PlaylistContainer::SavePlaylist(int id = -1) { // Use the tab name as the suggested name QString suggested_name = ui_->tab_bar->tabText(ui_->tab_bar->currentIndex()); manager_->SaveWithUI(id, suggested_name); } void PlaylistContainer::GoToNextPlaylistTab() { // Get the next tab' id int id_next = ui_->tab_bar->id_of((ui_->tab_bar->currentIndex() + 1) % ui_->tab_bar->count()); // Switch to next tab manager_->SetCurrentPlaylist(id_next); } void PlaylistContainer::GoToPreviousPlaylistTab() { // Get the next tab' id int id_previous = ui_->tab_bar->id_of( (ui_->tab_bar->currentIndex() + ui_->tab_bar->count() - 1) % ui_->tab_bar->count()); // Switch to next tab manager_->SetCurrentPlaylist(id_previous); } void PlaylistContainer::Save() { if (starting_up_) return; settings_.setValue("current_playlist", ui_->tab_bar->current_id()); } void PlaylistContainer::SetTabBarVisible(bool visible) { if (tab_bar_visible_ == visible) return; tab_bar_visible_ = visible; tab_bar_animation_->setDirection(visible ? QTimeLine::Forward : QTimeLine::Backward); tab_bar_animation_->start(); } void PlaylistContainer::SetTabBarHeight(int height) { ui_->tab_bar->setMaximumHeight(height); } void PlaylistContainer::MaybeUpdateFilter() { // delaying the filter update on small playlists is undesirable // and an empty filter applies very quickly, too if (manager_->current()->rowCount() < kFilterDelayPlaylistSizeThreshold || ui_->filter->text().isEmpty()) { UpdateFilter(); } else { filter_timer_->start(); } } void PlaylistContainer::UpdateFilter() { manager_->current()->proxy()->setFilterFixedString(ui_->filter->text()); ui_->playlist->JumpToCurrentlyPlayingTrack(); UpdateNoMatchesLabel(); } void PlaylistContainer::UpdateNoMatchesLabel() { Playlist* playlist = manager_->current(); const bool has_rows = playlist->rowCount() != 0; const bool has_results = playlist->proxy()->rowCount() != 0; QString text; if (has_rows && !has_results) { if (ui_->filter->text().trimmed().compare( "the answer to life the universe " "and everything", Qt::CaseInsensitive) == 0) { text = "42"; } else { text = tr( "No matches found. Clear the search box to show the whole playlist " "again."); } } if (!text.isEmpty()) { no_matches_label_->setText(text); RepositionNoMatchesLabel(true); no_matches_label_->show(); } else { no_matches_label_->hide(); } } void PlaylistContainer::resizeEvent(QResizeEvent* e) { QWidget::resizeEvent(e); RepositionNoMatchesLabel(); } void PlaylistContainer::FocusOnFilter(QKeyEvent* event) { ui_->filter->setFocus(); if (event->key() == Qt::Key_Escape) { ui_->filter->clear(); } else { ui_->filter->setText(ui_->filter->text() + event->text()); } } void PlaylistContainer::RepositionNoMatchesLabel(bool force) { if (!force && !no_matches_label_->isVisible()) return; const int kBorder = 10; QPoint pos = ui_->playlist->viewport()->mapTo(ui_->playlist, QPoint(kBorder, kBorder)); QSize size = ui_->playlist->viewport()->size(); size.setWidth(size.width() - kBorder * 2); size.setHeight(size.height() - kBorder * 2); no_matches_label_->move(pos); no_matches_label_->resize(size); } void PlaylistContainer::SelectionChanged() { manager_->SelectionChanged(view()->selectionModel()->selection()); } bool PlaylistContainer::eventFilter(QObject* objectWatched, QEvent* event) { if (objectWatched == ui_->filter) { if (event->type() == QEvent::KeyPress) { QKeyEvent* e = static_cast(event); switch (e->key()) { case Qt::Key_Up: case Qt::Key_Down: case Qt::Key_PageUp: case Qt::Key_PageDown: case Qt::Key_Return: case Qt::Key_Enter: view()->setFocus(Qt::OtherFocusReason); QApplication::sendEvent(ui_->playlist, event); return true; case Qt::Key_Escape: ui_->filter->clear(); return true; default: break; } } } return QWidget::eventFilter(objectWatched, event); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistcontainer.h000066400000000000000000000056361260417502300257460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PLAYLISTCONTAINER_H #define PLAYLISTCONTAINER_H #include #include class Ui_PlaylistContainer; class LineEditInterface; class Playlist; class PlaylistManager; class PlaylistView; class QTimeLine; class QTimer; class QLabel; class PlaylistContainer : public QWidget { Q_OBJECT public: PlaylistContainer(QWidget* parent = nullptr); ~PlaylistContainer(); static const char* kSettingsGroup; void SetActions(QAction* new_playlist, QAction* load_playlist, QAction* save_playlist, QAction* next_playlist, QAction* previous_playlist); void SetManager(PlaylistManager* manager); PlaylistView* view() const; bool eventFilter(QObject* objectWatched, QEvent* event); signals: void TabChanged(int id); void Rename(int id, const QString& new_name); void UndoRedoActionsChanged(QAction* undo, QAction* redo); void ViewSelectionModelChanged(); protected: // QWidget void resizeEvent(QResizeEvent*); private slots: void NewPlaylist(); void LoadPlaylist(); void SavePlaylist() { SavePlaylist(-1); } void SavePlaylist(int id); void GoToNextPlaylistTab(); void GoToPreviousPlaylistTab(); void SetViewModel(Playlist* playlist); void PlaylistAdded(int id, const QString& name, bool favorite); void PlaylistClosed(int id); void PlaylistRenamed(int id, const QString& new_name); void Started(); void ActivePlaying(); void ActivePaused(); void ActiveStopped(); void Save(); void SetTabBarVisible(bool visible); void SetTabBarHeight(int height); void SelectionChanged(); void MaybeUpdateFilter(); void UpdateFilter(); void FocusOnFilter(QKeyEvent* event); void UpdateNoMatchesLabel(); private: void UpdateActiveIcon(const QIcon& icon); void RepositionNoMatchesLabel(bool force = false); private: static const int kFilterDelayMs; static const int kFilterDelayPlaylistSizeThreshold; Ui_PlaylistContainer* ui_; PlaylistManager* manager_; QAction* undo_; QAction* redo_; Playlist* playlist_; QSettings settings_; bool starting_up_; bool tab_bar_visible_; QTimeLine* tab_bar_animation_; QLabel* no_matches_label_; QTimer* filter_timer_; }; #endif // PLAYLISTCONTAINER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistcontainer.ui000066400000000000000000000106711260417502300261270ustar00rootroot00000000000000 PlaylistContainer 0 0 987 707 Form #toolbar { border-color: palette(dark); border-style: solid; border-width: 0px 1px 0px 1px; } 0 0 0 0 16 16 true 16 16 true 16 16 true 16 16 true 16 16 true Qt::Vertical true QAbstractItemView::EditKeyPressed|QAbstractItemView::SelectedClicked true QAbstractItemView::DragDrop QAbstractItemView::ExtendedSelection false true false true true QSearchField QWidget
3rdparty/qocoa/qsearchfield.h
PlaylistView QTreeView
playlist/playlistview.h
PlaylistTabBar QWidget
playlist/playlisttabbar.h
1
clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistdelegates.cpp000066400000000000000000000403701260417502300262460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "playlistdelegates.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "queue.h" #include "core/logging.h" #include "core/player.h" #include "core/utilities.h" #include "library/librarybackend.h" #include "widgets/trackslider.h" #include "ui/iconloader.h" #ifdef Q_OS_DARWIN #include "core/mac_utilities.h" #endif // Q_OS_DARWIN const int QueuedItemDelegate::kQueueBoxBorder = 1; const int QueuedItemDelegate::kQueueBoxCornerRadius = 3; const int QueuedItemDelegate::kQueueBoxLength = 30; const QRgb QueuedItemDelegate::kQueueBoxGradientColor1 = qRgb(102, 150, 227); const QRgb QueuedItemDelegate::kQueueBoxGradientColor2 = qRgb(77, 121, 200); const int QueuedItemDelegate::kQueueOpacitySteps = 10; const float QueuedItemDelegate::kQueueOpacityLowerBound = 0.4; const int PlaylistDelegateBase::kMinHeight = 19; QueuedItemDelegate::QueuedItemDelegate(QObject* parent, int indicator_column) : QStyledItemDelegate(parent), indicator_column_(indicator_column) {} void QueuedItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { QStyledItemDelegate::paint(painter, option, index); if (index.column() == indicator_column_) { bool ok = false; const int queue_pos = index.data(Playlist::Role_QueuePosition).toInt(&ok); if (ok && queue_pos != -1) { float opacity = kQueueOpacitySteps - qMin(kQueueOpacitySteps, queue_pos); opacity /= kQueueOpacitySteps; opacity *= 1.0 - kQueueOpacityLowerBound; opacity += kQueueOpacityLowerBound; painter->setOpacity(opacity); DrawBox(painter, option.rect, option.font, QString::number(queue_pos + 1), kQueueBoxLength); painter->setOpacity(1.0); } } } void QueuedItemDelegate::DrawBox(QPainter* painter, const QRect& line_rect, const QFont& font, const QString& text, int width) const { QFont smaller = font; smaller.setPointSize(smaller.pointSize() - 1); smaller.setBold(true); if (width == -1) width = QFontMetrics(font).width(text + " "); QRect rect(line_rect); rect.setLeft(rect.right() - width - kQueueBoxBorder); rect.setWidth(width); rect.setTop(rect.top() + kQueueBoxBorder); rect.setBottom(rect.bottom() - kQueueBoxBorder - 1); QRect text_rect(rect); text_rect.setBottom(text_rect.bottom() + 1); QLinearGradient gradient(rect.topLeft(), rect.bottomLeft()); gradient.setColorAt(0.0, kQueueBoxGradientColor1); gradient.setColorAt(1.0, kQueueBoxGradientColor2); // Turn on antialiasing painter->setRenderHint(QPainter::Antialiasing); // Draw the box painter->translate(0.5, 0.5); painter->setPen(QPen(Qt::white, 1)); painter->setBrush(gradient); painter->drawRoundedRect(rect, kQueueBoxCornerRadius, kQueueBoxCornerRadius); // Draw the text painter->setFont(smaller); painter->drawText(rect, Qt::AlignCenter, text); painter->translate(-0.5, -0.5); } int QueuedItemDelegate::queue_indicator_size(const QModelIndex& index) const { if (index.column() == indicator_column_) { const int queue_pos = index.data(Playlist::Role_QueuePosition).toInt(); if (queue_pos != -1) { return kQueueBoxLength + kQueueBoxBorder * 2; } } return 0; } PlaylistDelegateBase::PlaylistDelegateBase(QObject* parent, const QString& suffix) : QueuedItemDelegate(parent), view_(qobject_cast(parent)), suffix_(suffix) {} QString PlaylistDelegateBase::displayText(const QVariant& value, const QLocale&) const { QString text; switch (static_cast(value.type())) { case QMetaType::Int: { int v = value.toInt(); if (v > 0) text = QString::number(v); break; } case QMetaType::Float: case QMetaType::Double: { double v = value.toDouble(); if (v > 0) text = QString::number(v); break; } default: text = value.toString(); break; } if (!text.isNull() && !suffix_.isNull()) text += " " + suffix_; return text; } QSize PlaylistDelegateBase::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const { QSize size = QueuedItemDelegate::sizeHint(option, index); if (size.height() < kMinHeight) size.setHeight(kMinHeight); return size; } void PlaylistDelegateBase::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { QueuedItemDelegate::paint(painter, Adjusted(option, index), index); // Stop after indicator if (index.column() == Playlist::Column_Title) { if (index.data(Playlist::Role_StopAfter).toBool()) { QRect rect(option.rect); rect.setRight(rect.right() - queue_indicator_size(index)); DrawBox(painter, rect, option.font, tr("stop")); } } } QStyleOptionViewItemV4 PlaylistDelegateBase::Adjusted( const QStyleOptionViewItem& option, const QModelIndex& index) const { if (!view_) return option; QPoint top_left(-view_->horizontalScrollBar()->value(), -view_->verticalScrollBar()->value()); if (view_->header()->logicalIndexAt(top_left) != index.column()) return option; QStyleOptionViewItemV4 ret(option); if (index.data(Playlist::Role_IsCurrent).toBool()) { // Move the text in a bit on the first column for the song that's currently // playing ret.rect.setLeft(ret.rect.left() + 20); } return ret; } bool PlaylistDelegateBase::helpEvent(QHelpEvent* event, QAbstractItemView* view, const QStyleOptionViewItem& option, const QModelIndex& index) { // This function is copied from QAbstractItemDelegate, and changed to show // displayText() in the tooltip, rather than the index's naked // Qt::ToolTipRole text. Q_UNUSED(option); if (!event || !view) return false; QHelpEvent* he = static_cast(event); QString text = displayText(index.data(), QLocale::system()); // Special case: we want newlines in the comment tooltip if (index.column() == Playlist::Column_Comment) { text = Qt::escape(index.data(Qt::ToolTipRole).toString()); text.replace("\\r\\n", "
"); text.replace("\\n", "
"); text.replace("\r\n", "
"); text.replace("\n", "
"); } if (text.isEmpty() || !he) return false; switch (event->type()) { case QEvent::ToolTip: { QRect displayed_text; QSize real_text; bool is_elided = false; real_text = sizeHint(option, index); displayed_text = view->visualRect(index); is_elided = displayed_text.width() < real_text.width(); if (is_elided) { QToolTip::showText(he->globalPos(), text, view); } else { // in case that another text was previously displayed QToolTip::hideText(); } return true; } case QEvent::QueryWhatsThis: return true; case QEvent::WhatsThis: QWhatsThis::showText(he->globalPos(), text, view); return true; default: break; } return false; } QString LengthItemDelegate::displayText(const QVariant& value, const QLocale&) const { bool ok = false; qint64 nanoseconds = value.toLongLong(&ok); if (ok && nanoseconds > 0) return Utilities::PrettyTimeNanosec(nanoseconds); return QString::null; } QString SizeItemDelegate::displayText(const QVariant& value, const QLocale&) const { bool ok = false; int bytes = value.toInt(&ok); if (ok) return Utilities::PrettySize(bytes); return QString(); } QString DateItemDelegate::displayText(const QVariant& value, const QLocale& locale) const { bool ok = false; int time = value.toInt(&ok); if (!ok || time == -1) return QString::null; return QDateTime::fromTime_t(time) .toString(QLocale::system().dateTimeFormat(QLocale::ShortFormat)); } QString LastPlayedItemDelegate::displayText(const QVariant& value, const QLocale& locale) const { bool ok = false; const int time = value.toInt(&ok); if (!ok || time == -1) return tr("Never"); return Utilities::Ago(time, locale); } QString FileTypeItemDelegate::displayText(const QVariant& value, const QLocale& locale) const { bool ok = false; Song::FileType type = Song::FileType(value.toInt(&ok)); if (!ok) return tr("Unknown"); return Song::TextForFiletype(type); } QWidget* TextItemDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const { return new QLineEdit(parent); } RatingItemDelegate::RatingItemDelegate(QObject* parent) : PlaylistDelegateBase(parent) {} void RatingItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { // Draw the background const QStyleOptionViewItemV3* vopt = qstyleoption_cast(&option); vopt->widget->style()->drawPrimitive(QStyle::PE_PanelItemViewItem, vopt, painter, vopt->widget); // Don't draw anything else if the user can't set the rating of this item if (!index.data(Playlist::Role_CanSetRating).toBool()) return; const bool hover = mouse_over_index_.isValid() && (mouse_over_index_ == index || (selected_indexes_.contains(mouse_over_index_) && selected_indexes_.contains(index))); const double rating = (hover ? RatingPainter::RatingForPos(mouse_over_pos_, option.rect) : index.data().toDouble()); painter_.Paint(painter, option.rect, rating); } QSize RatingItemDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const { QSize size = PlaylistDelegateBase::sizeHint(option, index); size.setWidth(size.height() * RatingPainter::kStarCount); return size; } QString RatingItemDelegate::displayText(const QVariant& value, const QLocale&) const { if (value.isNull() || value.toDouble() <= 0) return QString(); // Round to the nearest 0.5 const double rating = float(int(value.toDouble() * RatingPainter::kStarCount * 2 + 0.5)) / 2; return QString::number(rating, 'f', 1); } TagCompletionModel::TagCompletionModel(LibraryBackend* backend, Playlist::Column column) : QStringListModel() { QString col = database_column(column); if (!col.isEmpty()) { setStringList(backend->GetAll(col)); } } QString TagCompletionModel::database_column(Playlist::Column column) { switch (column) { case Playlist::Column_Artist: return "artist"; case Playlist::Column_Album: return "album"; case Playlist::Column_AlbumArtist: return "albumartist"; case Playlist::Column_Composer: return "composer"; case Playlist::Column_Performer: return "performer"; case Playlist::Column_Grouping: return "grouping"; case Playlist::Column_Genre: return "genre"; default: qLog(Warning) << "Unknown column" << column; return QString(); } } static TagCompletionModel* InitCompletionModel(LibraryBackend* backend, Playlist::Column column) { return new TagCompletionModel(backend, column); } TagCompleter::TagCompleter(LibraryBackend* backend, Playlist::Column column, QLineEdit* editor) : QCompleter(editor), editor_(editor) { QFuture future = QtConcurrent::run(&InitCompletionModel, backend, column); QFutureWatcher* watcher = new QFutureWatcher(this); watcher->setFuture(future); connect(watcher, SIGNAL(finished()), SLOT(ModelReady())); } void TagCompleter::ModelReady() { QFutureWatcher* watcher = dynamic_cast*>(sender()); if (!watcher) return; TagCompletionModel* model = watcher->result(); setModel(model); setCaseSensitivity(Qt::CaseInsensitive); editor_->setCompleter(this); } QWidget* TagCompletionItemDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem&, const QModelIndex&) const { QLineEdit* editor = new QLineEdit(parent); new TagCompleter(backend_, column_, editor); return editor; } QString NativeSeparatorsDelegate::displayText(const QVariant& value, const QLocale&) const { const QString string_value = value.toString(); QUrl url; if (value.type() == QVariant::Url) { url = value.toUrl(); } else if (string_value.contains("://")) { url = QUrl::fromEncoded(string_value.toAscii()); } else { return QDir::toNativeSeparators(string_value); } if (url.scheme() == "file") { return QDir::toNativeSeparators(url.toLocalFile()); } return string_value; } SongSourceDelegate::SongSourceDelegate(QObject* parent, Player* player) : PlaylistDelegateBase(parent), player_(player) {} QString SongSourceDelegate::displayText(const QVariant& value, const QLocale&) const { return QString(); } QPixmap SongSourceDelegate::LookupPixmap(const QUrl& url, const QSize& size) const { QPixmap pixmap; if (cache_.find(url.scheme(), &pixmap)) { return pixmap; } QIcon icon; const UrlHandler* handler = player_->HandlerForUrl(url); if (handler) { icon = handler->icon(); } else { if (url.scheme() == "spotify") { icon = QIcon(":icons/22x22/spotify.png"); } else if (url.scheme() == "file") { icon = IconLoader::Load("folder-sound"); } else if (url.host() == "api.jamendo.com") { icon = QIcon(":/providers/jamendo.png"); } else if (url.host() == "api.soundcloud.com") { icon = QIcon(":/providers/soundcloud.png"); } else if (url.scheme() == "cdda") { icon = IconLoader::Load("media-optical"); } } pixmap = icon.pixmap(size.height()); cache_.insert(url.scheme(), pixmap); return pixmap; } void SongSourceDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { // Draw the background PlaylistDelegateBase::paint(painter, option, index); QStyleOptionViewItem option_copy(option); initStyleOption(&option_copy, index); // Find the pixmap to use for this URL const QUrl& url = index.data().toUrl(); QPixmap pixmap = LookupPixmap(url, option_copy.decorationSize); float device_pixel_ratio = 1.0f; #ifdef Q_OS_DARWIN QWidget* parent_widget = reinterpret_cast(parent()); device_pixel_ratio = mac::GetDevicePixelRatio(parent_widget); #endif // Draw the pixmap in the middle of the rectangle QRect draw_rect(QPoint(0, 0), option_copy.decorationSize / device_pixel_ratio); draw_rect.moveCenter(option_copy.rect.center()); painter->drawPixmap(draw_rect, pixmap); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistdelegates.h000066400000000000000000000147561260417502300257240ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PLAYLISTDELEGATES_H #define PLAYLISTDELEGATES_H #include "playlist.h" #include "library/library.h" #include "widgets/ratingwidget.h" #include #include #include #include #include class Player; class QueuedItemDelegate : public QStyledItemDelegate { public: QueuedItemDelegate(QObject* parent, int indicator_column = Playlist::Column_Title); void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; void DrawBox(QPainter* painter, const QRect& line_rect, const QFont& font, const QString& text, int width = -1) const; int queue_indicator_size(const QModelIndex& index) const; private: static const int kQueueBoxBorder; static const int kQueueBoxCornerRadius; static const int kQueueBoxLength; static const QRgb kQueueBoxGradientColor1; static const QRgb kQueueBoxGradientColor2; static const int kQueueOpacitySteps; static const float kQueueOpacityLowerBound; int indicator_column_; }; class PlaylistDelegateBase : public QueuedItemDelegate { Q_OBJECT public: PlaylistDelegateBase(QObject* parent, const QString& suffix = QString()); void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; QString displayText(const QVariant& value, const QLocale& locale) const; QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const; QStyleOptionViewItemV4 Adjusted(const QStyleOptionViewItem& option, const QModelIndex& index) const; static const int kMinHeight; public slots: bool helpEvent(QHelpEvent* event, QAbstractItemView* view, const QStyleOptionViewItem& option, const QModelIndex& index); protected: QTreeView* view_; QString suffix_; }; class LengthItemDelegate : public PlaylistDelegateBase { public: LengthItemDelegate(QObject* parent) : PlaylistDelegateBase(parent) {} QString displayText(const QVariant& value, const QLocale& locale) const; }; class SizeItemDelegate : public PlaylistDelegateBase { public: SizeItemDelegate(QObject* parent) : PlaylistDelegateBase(parent) {} QString displayText(const QVariant& value, const QLocale& locale) const; }; class DateItemDelegate : public PlaylistDelegateBase { public: DateItemDelegate(QObject* parent) : PlaylistDelegateBase(parent) {} QString displayText(const QVariant& value, const QLocale& locale) const; }; class LastPlayedItemDelegate : public PlaylistDelegateBase { public: LastPlayedItemDelegate(QObject* parent) : PlaylistDelegateBase(parent) {} QString displayText(const QVariant& value, const QLocale& locale) const; }; class FileTypeItemDelegate : public PlaylistDelegateBase { public: FileTypeItemDelegate(QObject* parent) : PlaylistDelegateBase(parent) {} QString displayText(const QVariant& value, const QLocale& locale) const; }; class TextItemDelegate : public PlaylistDelegateBase { public: TextItemDelegate(QObject* parent) : PlaylistDelegateBase(parent) {} QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const; }; class RatingItemDelegate : public PlaylistDelegateBase { public: RatingItemDelegate(QObject* parent); void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const; QString displayText(const QVariant& value, const QLocale& locale) const; void set_mouse_over(const QModelIndex& index, const QModelIndexList& selected_indexes, const QPoint& pos) { mouse_over_index_ = index; selected_indexes_ = selected_indexes; mouse_over_pos_ = pos; } void set_mouse_out() { mouse_over_index_ = QModelIndex(); } bool is_mouse_over() const { return mouse_over_index_.isValid(); } QModelIndex mouse_over_index() const { return mouse_over_index_; } private: RatingPainter painter_; QModelIndex mouse_over_index_; QPoint mouse_over_pos_; QModelIndexList selected_indexes_; }; class TagCompletionModel : public QStringListModel { public: TagCompletionModel(LibraryBackend* backend, Playlist::Column column); private: static QString database_column(Playlist::Column column); }; class TagCompleter : public QCompleter { Q_OBJECT public: TagCompleter(LibraryBackend* backend, Playlist::Column column, QLineEdit* editor); private slots: void ModelReady(); private: QLineEdit* editor_; }; class TagCompletionItemDelegate : public PlaylistDelegateBase { public: TagCompletionItemDelegate(QObject* parent, LibraryBackend* backend, Playlist::Column column) : PlaylistDelegateBase(parent), backend_(backend), column_(column) {}; QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const; private: LibraryBackend* backend_; Playlist::Column column_; }; class NativeSeparatorsDelegate : public PlaylistDelegateBase { public: NativeSeparatorsDelegate(QObject* parent) : PlaylistDelegateBase(parent) {} QString displayText(const QVariant& value, const QLocale& locale) const; }; class SongSourceDelegate : public PlaylistDelegateBase { public: SongSourceDelegate(QObject* parent, Player* player); QString displayText(const QVariant& value, const QLocale& locale) const; void paint(QPainter* paint, const QStyleOptionViewItem& option, const QModelIndex& index) const; private: QPixmap LookupPixmap(const QUrl& url, const QSize& size) const; Player* player_; mutable QPixmapCache cache_; }; #endif // PLAYLISTDELEGATES_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistfilter.cpp000066400000000000000000000060021260417502300255700ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "playlistfilter.h" #include "playlistfilterparser.h" #include PlaylistFilter::PlaylistFilter(QObject* parent) : QSortFilterProxyModel(parent), filter_tree_(new NopFilter), query_hash_(0) { setDynamicSortFilter(true); column_names_["title"] = Playlist::Column_Title; column_names_["name"] = Playlist::Column_Title; column_names_["artist"] = Playlist::Column_Artist; column_names_["album"] = Playlist::Column_Album; column_names_["albumartist"] = Playlist::Column_AlbumArtist; column_names_["composer"] = Playlist::Column_Composer; column_names_["performer"] = Playlist::Column_Performer; column_names_["grouping"] = Playlist::Column_Grouping; column_names_["length"] = Playlist::Column_Length; column_names_["track"] = Playlist::Column_Track; column_names_["disc"] = Playlist::Column_Disc; column_names_["year"] = Playlist::Column_Year; column_names_["originalyear"] = Playlist::Column_OriginalYear; column_names_["genre"] = Playlist::Column_Genre; column_names_["score"] = Playlist::Column_Score; column_names_["comment"] = Playlist::Column_Comment; column_names_["bpm"] = Playlist::Column_BPM; column_names_["bitrate"] = Playlist::Column_Bitrate; column_names_["filename"] = Playlist::Column_Filename; column_names_["rating"] = Playlist::Column_Rating; numerical_columns_ << Playlist::Column_Length << Playlist::Column_Track << Playlist::Column_Disc << Playlist::Column_Year << Playlist::Column_OriginalYear << Playlist::Column_Score << Playlist::Column_BPM << Playlist::Column_Bitrate << Playlist::Column_Rating; } PlaylistFilter::~PlaylistFilter() {} void PlaylistFilter::sort(int column, Qt::SortOrder order) { // Pass this through to the Playlist, it does sorting itself sourceModel()->sort(column, order); } bool PlaylistFilter::filterAcceptsRow(int row, const QModelIndex& parent) const { QString filter = filterRegExp().pattern(); uint hash = qHash(filter); if (hash != query_hash_) { // Parse the query FilterParser p(filter, column_names_, numerical_columns_); filter_tree_.reset(p.parse()); query_hash_ = hash; } // Test the row return filter_tree_->accept(row, parent, sourceModel()); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistfilter.h000066400000000000000000000030431260417502300252370ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PLAYLISTFILTER_H #define PLAYLISTFILTER_H #include #include #include "playlist.h" #include class FilterTree; class PlaylistFilter : public QSortFilterProxyModel { Q_OBJECT public: PlaylistFilter(QObject* parent = nullptr); ~PlaylistFilter(); // QAbstractItemModel void sort(int column, Qt::SortOrder order = Qt::AscendingOrder); // QSortFilterProxyModel // public so Playlist::NextVirtualIndex and friends can get at it bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const; private: // Mutable because they're modified from filterAcceptsRow() const mutable QScopedPointer filter_tree_; mutable uint query_hash_; QMap column_names_; QSet numerical_columns_; }; #endif // PLAYLISTFILTER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistfilterparser.cpp000066400000000000000000000356361260417502300270240ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "playlistfilterparser.h" #include "playlist.h" #include "core/logging.h" #include class SearchTermComparator { public: virtual ~SearchTermComparator() {} virtual bool Matches(const QString& element) const = 0; }; // "compares" by checking if the field contains the search term class DefaultComparator : public SearchTermComparator { public: explicit DefaultComparator(const QString& value) : search_term_(value) {} virtual bool Matches(const QString& element) const { return element.contains(search_term_); } private: QString search_term_; }; class EqComparator : public SearchTermComparator { public: explicit EqComparator(const QString& value) : search_term_(value) {} virtual bool Matches(const QString& element) const { return search_term_ == element; } private: QString search_term_; }; class NeComparator : public SearchTermComparator { public: explicit NeComparator(const QString& value) : search_term_(value) {} virtual bool Matches(const QString& element) const { return search_term_ != element; } private: QString search_term_; }; class LexicalGtComparator : public SearchTermComparator { public: explicit LexicalGtComparator(const QString& value) : search_term_(value) {} virtual bool Matches(const QString& element) const { return element > search_term_; } private: QString search_term_; }; class LexicalGeComparator : public SearchTermComparator { public: explicit LexicalGeComparator(const QString& value) : search_term_(value) {} virtual bool Matches(const QString& element) const { return element >= search_term_; } private: QString search_term_; }; class LexicalLtComparator : public SearchTermComparator { public: explicit LexicalLtComparator(const QString& value) : search_term_(value) {} virtual bool Matches(const QString& element) const { return element < search_term_; } private: QString search_term_; }; class LexicalLeComparator : public SearchTermComparator { public: explicit LexicalLeComparator(const QString& value) : search_term_(value) {} virtual bool Matches(const QString& element) const { return element <= search_term_; } private: QString search_term_; }; class GtComparator : public SearchTermComparator { public: explicit GtComparator(int value) : search_term_(value) {} virtual bool Matches(const QString& element) const { return element.toInt() > search_term_; } private: int search_term_; }; class GeComparator : public SearchTermComparator { public: explicit GeComparator(int value) : search_term_(value) {} virtual bool Matches(const QString& element) const { return element.toInt() >= search_term_; } private: int search_term_; }; class LtComparator : public SearchTermComparator { public: explicit LtComparator(int value) : search_term_(value) {} virtual bool Matches(const QString& element) const { return element.toInt() < search_term_; } private: int search_term_; }; class LeComparator : public SearchTermComparator { public: explicit LeComparator(int value) : search_term_(value) {} virtual bool Matches(const QString& element) const { return element.toInt() <= search_term_; } private: int search_term_; }; // The length field of the playlist (entries) contains a // song's running time in nano seconds. However, We don't // really care about nano seconds, just seconds. Thus, with // this decorator we drop the last 9 digits, if that many // are present. class DropTailComparatorDecorator : public SearchTermComparator { public: explicit DropTailComparatorDecorator(SearchTermComparator* cmp) : cmp_(cmp) {} virtual bool Matches(const QString& element) const { if (element.length() > 9) return cmp_->Matches(element.left(element.length() - 9)); else return cmp_->Matches(element); } private: QScopedPointer cmp_; }; class RatingComparatorDecorator : public SearchTermComparator { public: explicit RatingComparatorDecorator(SearchTermComparator* cmp) : cmp_(cmp) {} virtual bool Matches(const QString& element) const { return cmp_->Matches( QString::number(static_cast(element.toDouble() * 10.0 + 0.5))); } private: QScopedPointer cmp_; }; // filter that applies a SearchTermComparator to all fields of a playlist entry class FilterTerm : public FilterTree { public: explicit FilterTerm(SearchTermComparator* comparator, const QList& columns) : cmp_(comparator), columns_(columns) {} virtual bool accept(int row, const QModelIndex& parent, const QAbstractItemModel* const model) const { for (int i : columns_) { QModelIndex idx(model->index(row, i, parent)); if (cmp_->Matches(idx.data().toString().toLower())) return true; } return false; } virtual FilterType type() { return Term; } private: QScopedPointer cmp_; QList columns_; }; // filter that applies a SearchTermComparator to one specific field of a // playlist entry class FilterColumnTerm : public FilterTree { public: FilterColumnTerm(int column, SearchTermComparator* comparator) : col(column), cmp_(comparator) {} virtual bool accept(int row, const QModelIndex& parent, const QAbstractItemModel* const model) const { QModelIndex idx(model->index(row, col, parent)); return cmp_->Matches(idx.data().toString().toLower()); } virtual FilterType type() { return Column; } private: int col; QScopedPointer cmp_; }; class NotFilter : public FilterTree { public: explicit NotFilter(const FilterTree* inv) : child_(inv) {} virtual bool accept(int row, const QModelIndex& parent, const QAbstractItemModel* const model) const { return !child_->accept(row, parent, model); } virtual FilterType type() { return Not; } private: QScopedPointer child_; }; class OrFilter : public FilterTree { public: ~OrFilter() { qDeleteAll(children_); } virtual void add(FilterTree* child) { children_.append(child); } virtual bool accept(int row, const QModelIndex& parent, const QAbstractItemModel* const model) const { for (FilterTree* child : children_) { if (child->accept(row, parent, model)) return true; } return false; } FilterType type() { return Or; } private: QList children_; }; class AndFilter : public FilterTree { public: virtual ~AndFilter() { qDeleteAll(children_); } virtual void add(FilterTree* child) { children_.append(child); } virtual bool accept(int row, const QModelIndex& parent, const QAbstractItemModel* const model) const { for (FilterTree* child : children_) { if (!child->accept(row, parent, model)) return false; } return true; } FilterType type() { return And; } private: QList children_; }; FilterParser::FilterParser(const QString& filter, const QMap& columns, const QSet& numerical_cols) : filterstring_(filter), columns_(columns), numerical_columns_(numerical_cols) {} FilterTree* FilterParser::parse() { iter_ = filterstring_.constBegin(); end_ = filterstring_.constEnd(); return parseOrGroup(); } void FilterParser::advance() { while (iter_ != end_ && iter_->isSpace()) { ++iter_; } } FilterTree* FilterParser::parseOrGroup() { advance(); if (iter_ == end_) return new NopFilter; OrFilter* group = new OrFilter; group->add(parseAndGroup()); advance(); while (checkOr()) { group->add(parseAndGroup()); advance(); } return group; } FilterTree* FilterParser::parseAndGroup() { advance(); if (iter_ == end_) return new NopFilter; AndFilter* group = new AndFilter(); do { group->add(parseSearchExpression()); advance(); if (iter_ != end_ && *iter_ == QChar(')')) break; if (checkOr(false)) { break; } checkAnd(); // if there's no 'AND', we'll add the term anyway... } while (iter_ != end_); return group; } bool FilterParser::checkAnd() { if (iter_ != end_) { if (*iter_ == QChar('A')) { buf_ += *iter_; iter_++; if (iter_ != end_ && *iter_ == QChar('N')) { buf_ += *iter_; iter_++; if (iter_ != end_ && *iter_ == QChar('D')) { buf_ += *iter_; iter_++; if (iter_ != end_ && (iter_->isSpace() || *iter_ == QChar('-') || *iter_ == '(')) { advance(); buf_.clear(); return true; } } } } } return false; } bool FilterParser::checkOr(bool step_over) { if (!buf_.isEmpty()) { if (buf_ == "OR") { if (step_over) { buf_.clear(); advance(); } return true; } } else { if (iter_ != end_) { if (*iter_ == 'O') { buf_ += *iter_; iter_++; if (iter_ != end_ && *iter_ == 'R') { buf_ += *iter_; iter_++; if (iter_ != end_ && (iter_->isSpace() || *iter_ == '-' || *iter_ == '(')) { if (step_over) { buf_.clear(); advance(); } return true; } } } } } return false; } FilterTree* FilterParser::parseSearchExpression() { advance(); if (iter_ == end_) return new NopFilter; if (*iter_ == '(') { iter_++; advance(); FilterTree* tree = parseOrGroup(); advance(); if (iter_ != end_) { if (*iter_ == ')') { ++iter_; } } return tree; } else if (*iter_ == '-') { ++iter_; FilterTree* tree = parseSearchExpression(); if (tree->type() != FilterTree::Nop) return new NotFilter(tree); return tree; } else { return parseSearchTerm(); } } FilterTree* FilterParser::parseSearchTerm() { QString col; QString search; QString prefix; bool inQuotes = false; for (; iter_ != end_; ++iter_) { if (inQuotes) { if (*iter_ == '"') inQuotes = false; else buf_ += *iter_; } else { if (*iter_ == '"') { inQuotes = true; } else if (col.isEmpty() && *iter_ == ':') { col = buf_.toLower(); buf_.clear(); prefix.clear(); // prefix isn't allowed here - let's ignore it } else if (iter_->isSpace() || *iter_ == '(' || *iter_ == ')' || *iter_ == '-') { break; } else if (buf_.isEmpty()) { // we don't know whether there is a column part in this search term // thus we assume the latter and just try and read a prefix if (prefix.isEmpty() && (*iter_ == '>' || *iter_ == '<' || *iter_ == '=' || *iter_ == '!')) { prefix += *iter_; } else if (prefix != "=" && *iter_ == '=') { prefix += *iter_; } else { buf_ += *iter_; } } else { buf_ += *iter_; } } } search = buf_.toLower(); buf_.clear(); return createSearchTermTreeNode(col, prefix, search); } FilterTree* FilterParser::createSearchTermTreeNode( const QString& col, const QString& prefix, const QString& search) const { if (search.isEmpty() && prefix != "=") { return new NopFilter; } // here comes a mess :/ // well, not that much of a mess, but so many options -_- SearchTermComparator* cmp = nullptr; if (prefix == "!=" || prefix == "<>") { cmp = new NeComparator(search); } else if (!col.isEmpty() && columns_.contains(col) && numerical_columns_.contains(columns_[col])) { // the length column contains the time in seconds (nano seconds, actually - // the "nano" part is handled by the DropTailComparatorDecorator, though). int search_value; if (columns_[col] == Playlist::Column_Length) { search_value = parseTime(search); } else if (columns_[col] == Playlist::Column_Rating) { search_value = static_cast(search.toDouble() * 2.0 + 0.5); } else { search_value = search.toInt(); } // alright, back to deciding which comparator we'll use if (prefix == ">") { cmp = new GtComparator(search_value); } else if (prefix == ">=") { cmp = new GeComparator(search_value); } else if (prefix == "<") { cmp = new LtComparator(search_value); } else if (prefix == "<=") { cmp = new LeComparator(search_value); } else { // convert back because for time/rating cmp = new EqComparator(QString::number(search_value)); } } else { if (prefix == "=") { cmp = new EqComparator(search); } else if (prefix == ">") { cmp = new LexicalGtComparator(search); } else if (prefix == ">=") { cmp = new LexicalGeComparator(search); } else if (prefix == "<") { cmp = new LexicalLtComparator(search); } else if (prefix == "<=") { cmp = new LexicalLeComparator(search); } else { cmp = new DefaultComparator(search); } } if (columns_.contains(col)) { if (columns_[col] == Playlist::Column_Length) { cmp = new DropTailComparatorDecorator(cmp); } else if (columns_[col] == Playlist::Column_Rating) { cmp = new RatingComparatorDecorator(cmp); } return new FilterColumnTerm(columns_[col], cmp); } else { return new FilterTerm(cmp, columns_.values()); } } // Try and parse the string as '[[h:]m:]s' (ignoring all spaces), // and return the number of seconds if it parses correctly. // If not, the original string is returned. // The 'h', 'm' and 's' components can have any length (including 0). // // A few examples: // "::" is parsed to "0" // "1::" is parsed to "3600" // "3:45" is parsed to "225" // "1:165" is parsed to "225" // "225" is parsed to "225" (srsly! ^.^) // "2:3:4:5" is parsed to "2:3:4:5" // "25m" is parsed to "25m" int FilterParser::parseTime(const QString& time_str) const { int seconds = 0; int accum = 0; int colon_count = 0; for (const QChar& c : time_str) { if (c.isDigit()) { accum = accum * 10 + c.digitValue(); } else if (c == ':') { seconds = seconds * 60 + accum; accum = 0; ++colon_count; if (colon_count > 2) { return 0; } } else if (!c.isSpace()) { return 0; } } seconds = seconds * 60 + accum; return seconds; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistfilterparser.h000066400000000000000000000061051260417502300264560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PLAYLISTFILTERPARSER_H #define PLAYLISTFILTERPARSER_H #include #include #include #include class QAbstractItemModel; // structure for filter parse tree class FilterTree { public: virtual ~FilterTree() {} virtual bool accept(int row, const QModelIndex& parent, const QAbstractItemModel* const model) const = 0; enum FilterType { Nop = 0, Or, And, Not, Column, Term }; virtual FilterType type() = 0; }; // trivial filter that accepts *anything* class NopFilter : public FilterTree { public: virtual bool accept(int row, const QModelIndex& parent, const QAbstractItemModel* const model) const { return true; } virtual FilterType type() { return Nop; } }; // A utility class to parse search filter strings into a decision tree // that can decide whether a playlist entry matches the filter. // // Here's a grammar describing the filters we expect: //  expr ::= or-group // or-group ::= and-group ('OR' and-group)* // and-group ::= sexpr ('AND' sexpr)* // sexpr ::= sterm | '-' sexpr | '(' or-group ')' // sterm ::= col ':' sstring | sstring // sstring ::= prefix? string // string ::= [^:-()" ]+ | '"' [^"]+ '"' // prefix ::= '=' | '<' | '>' | '<=' | '>=' // col ::= "title" | "artist" | ... class FilterParser { public: FilterParser(const QString& filter, const QMap& columns, const QSet& numerical_cols); FilterTree* parse(); private: void advance(); FilterTree* parseOrGroup(); FilterTree* parseAndGroup(); // check if iter is at the start of 'AND' // if so, step over it and return true // it not, return false and leave iter where it was bool checkAnd(); // check if iter is at the start of 'OR' bool checkOr(bool step_over = true); FilterTree* parseSearchExpression(); FilterTree* parseSearchTerm(); FilterTree* createSearchTermTreeNode(const QString& col, const QString& prefix, const QString& search) const; int parseTime(const QString& time_str) const; QString::const_iterator iter_; QString::const_iterator end_; QString buf_; const QString filterstring_; const QMap columns_; const QSet numerical_columns_; }; #endif // PLAYLISTFILTERPARSER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistheader.cpp000066400000000000000000000104431260417502300255370ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "playlistheader.h" #include "playlistview.h" #include #include #include #include PlaylistHeader::PlaylistHeader(Qt::Orientation orientation, PlaylistView* view, QWidget* parent) : StretchHeaderView(orientation, parent), view_(view), menu_(new QMenu(this)), show_mapper_(new QSignalMapper(this)) { hide_action_ = menu_->addAction(tr("&Hide..."), this, SLOT(HideCurrent())); stretch_action_ = menu_->addAction(tr("&Stretch columns to fit window"), this, SLOT(ToggleStretchEnabled())); menu_->addSeparator(); QMenu* align_menu = new QMenu(tr("&Align text"), this); QActionGroup* align_group = new QActionGroup(this); align_left_action_ = new QAction(tr("&Left"), align_group); align_center_action_ = new QAction(tr("&Center"), align_group); align_right_action_ = new QAction(tr("&Right"), align_group); align_left_action_->setCheckable(true); align_center_action_->setCheckable(true); align_right_action_->setCheckable(true); align_menu->addActions(align_group->actions()); connect(align_group, SIGNAL(triggered(QAction*)), SLOT(SetColumnAlignment(QAction*))); menu_->addMenu(align_menu); menu_->addSeparator(); stretch_action_->setCheckable(true); stretch_action_->setChecked(is_stretch_enabled()); connect(show_mapper_, SIGNAL(mapped(int)), SLOT(ToggleVisible(int))); connect(this, SIGNAL(StretchEnabledChanged(bool)), stretch_action_, SLOT(setChecked(bool))); } void PlaylistHeader::contextMenuEvent(QContextMenuEvent* e) { menu_section_ = logicalIndexAt(e->pos()); if (menu_section_ == -1 || (menu_section_ == logicalIndex(0) && logicalIndex(1) == -1)) hide_action_->setVisible(false); else { hide_action_->setVisible(true); QString title( model()->headerData(menu_section_, Qt::Horizontal).toString()); hide_action_->setText(tr("&Hide %1").arg(title)); Qt::Alignment alignment = view_->column_alignment(menu_section_); if (alignment & Qt::AlignLeft) align_left_action_->setChecked(true); else if (alignment & Qt::AlignHCenter) align_center_action_->setChecked(true); else if (alignment & Qt::AlignRight) align_right_action_->setChecked(true); } qDeleteAll(show_actions_); show_actions_.clear(); for (int i = 0; i < count(); ++i) { AddColumnAction(i); } menu_->popup(e->globalPos()); } void PlaylistHeader::AddColumnAction(int index) { #ifndef HAVE_MOODBAR if (index == Playlist::Column_Mood) { return; } #endif QString title(model()->headerData(index, Qt::Horizontal).toString()); QAction* action = menu_->addAction(title, show_mapper_, SLOT(map())); action->setCheckable(true); action->setChecked(!isSectionHidden(index)); show_actions_ << action; show_mapper_->setMapping(action, index); } void PlaylistHeader::HideCurrent() { if (menu_section_ == -1) return; SetSectionHidden(menu_section_, true); } void PlaylistHeader::SetColumnAlignment(QAction* action) { Qt::Alignment alignment = Qt::AlignVCenter; if (action == align_left_action_) alignment |= Qt::AlignLeft; if (action == align_center_action_) alignment |= Qt::AlignHCenter; if (action == align_right_action_) alignment |= Qt::AlignRight; view_->SetColumnAlignment(menu_section_, alignment); } void PlaylistHeader::ToggleVisible(int section) { SetSectionHidden(section, !isSectionHidden(section)); emit SectionVisibilityChanged(section, !isSectionHidden(section)); } void PlaylistHeader::enterEvent(QEvent*) { emit MouseEntered(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistheader.h000066400000000000000000000032751260417502300252110ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PLAYLISTHEADER_H #define PLAYLISTHEADER_H #include "widgets/stretchheaderview.h" class PlaylistView; class QMenu; class QSignalMapper; class PlaylistHeader : public StretchHeaderView { Q_OBJECT public: PlaylistHeader(Qt::Orientation orientation, PlaylistView* view, QWidget* parent = nullptr); // QWidget void contextMenuEvent(QContextMenuEvent* e); void enterEvent(QEvent*); signals: void SectionVisibilityChanged(int logical, bool visible); void MouseEntered(); private slots: void HideCurrent(); void ToggleVisible(int section); void SetColumnAlignment(QAction* action); private: void AddColumnAction(int index); private: PlaylistView* view_; int menu_section_; QMenu* menu_; QAction* hide_action_; QAction* stretch_action_; QAction* align_left_action_; QAction* align_center_action_; QAction* align_right_action_; QList show_actions_; QSignalMapper* show_mapper_; }; #endif // PLAYLISTHEADER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistitem.cpp000066400000000000000000000103221260417502300252410ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "playlistitem.h" #include "songplaylistitem.h" #include "core/logging.h" #include "core/song.h" #include "internet/jamendo/jamendoplaylistitem.h" #include "internet/jamendo/jamendoservice.h" #include "internet/magnatune/magnatuneplaylistitem.h" #include "internet/magnatune/magnatuneservice.h" #include "internet/core/internetplaylistitem.h" #include "library/library.h" #include "library/libraryplaylistitem.h" #include #include #include PlaylistItem::~PlaylistItem() {} PlaylistItem* PlaylistItem::NewFromType(const QString& type) { if (type == "Library") return new LibraryPlaylistItem(type); if (type == "Magnatune") return new MagnatunePlaylistItem(type); if (type == "Jamendo") return new JamendoPlaylistItem(type); if (type == "Stream" || type == "File") return new SongPlaylistItem(type); if (type == "Internet" || type == "Radio") return new InternetPlaylistItem("Internet"); qLog(Warning) << "Invalid PlaylistItem type:" << type; return nullptr; } PlaylistItem* PlaylistItem::NewFromSongsTable(const QString& table, const Song& song) { if (table == Library::kSongsTable) return new LibraryPlaylistItem(song); if (table == MagnatuneService::kSongsTable) return new MagnatunePlaylistItem(song); if (table == JamendoService::kSongsTable) return new JamendoPlaylistItem(song); qLog(Warning) << "Invalid PlaylistItem songs table:" << table; return nullptr; } void PlaylistItem::BindToQuery(QSqlQuery* query) const { query->bindValue(":type", type()); query->bindValue(":library_id", DatabaseValue(Column_LibraryId)); query->bindValue(":radio_service", DatabaseValue(Column_InternetService)); DatabaseSongMetadata().BindToQuery(query); } void PlaylistItem::SetTemporaryMetadata(const Song& metadata) { temp_metadata_ = metadata; temp_metadata_.set_filetype(Song::Type_Stream); } void PlaylistItem::ClearTemporaryMetadata() { temp_metadata_ = Song(); } static void ReloadPlaylistItem(PlaylistItemPtr item) { item->Reload(); } QFuture PlaylistItem::BackgroundReload() { return QtConcurrent::run(ReloadPlaylistItem, shared_from_this()); } void PlaylistItem::SetBackgroundColor(short priority, const QColor& color) { background_colors_[priority] = color; } bool PlaylistItem::HasBackgroundColor(short priority) const { return background_colors_.contains(priority); } void PlaylistItem::RemoveBackgroundColor(short priority) { background_colors_.remove(priority); } QColor PlaylistItem::GetCurrentBackgroundColor() const { return background_colors_.isEmpty() ? QColor() : background_colors_[background_colors_.keys().last()]; } bool PlaylistItem::HasCurrentBackgroundColor() const { return !background_colors_.isEmpty(); } void PlaylistItem::SetForegroundColor(short priority, const QColor& color) { foreground_colors_[priority] = color; } bool PlaylistItem::HasForegroundColor(short priority) const { return foreground_colors_.contains(priority); } void PlaylistItem::RemoveForegroundColor(short priority) { foreground_colors_.remove(priority); } QColor PlaylistItem::GetCurrentForegroundColor() const { return foreground_colors_.isEmpty() ? QColor() : foreground_colors_[foreground_colors_.keys().last()]; } bool PlaylistItem::HasCurrentForegroundColor() const { return !foreground_colors_.isEmpty(); } void PlaylistItem::SetShouldSkip(bool val) { should_skip_ = val; } bool PlaylistItem::GetShouldSkip() const { return should_skip_; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistitem.h000066400000000000000000000072701260417502300247160ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PLAYLISTITEM_H #define PLAYLISTITEM_H #include #include #include #include #include #include "core/song.h" class QAction; class SqlRow; class PlaylistItem : public std::enable_shared_from_this { public: PlaylistItem(const QString& type) : should_skip_(false), type_(type) {} virtual ~PlaylistItem(); static PlaylistItem* NewFromType(const QString& type); static PlaylistItem* NewFromSongsTable(const QString& table, const Song& song); enum Option { Default = 0x00, // Disables the "pause" action. PauseDisabled = 0x01, // Enables the last.fm "ban" action. LastFMControls = 0x02, // Disables the seek slider. SeekDisabled = 0x04, }; Q_DECLARE_FLAGS(Options, Option); virtual QString type() const { return type_; } virtual Options options() const { return Default; } virtual QList actions() { return QList(); } virtual bool InitFromQuery(const SqlRow& query) = 0; void BindToQuery(QSqlQuery* query) const; virtual void Reload() {} QFuture BackgroundReload(); virtual Song Metadata() const = 0; virtual QUrl Url() const = 0; void SetTemporaryMetadata(const Song& metadata); void ClearTemporaryMetadata(); bool HasTemporaryMetadata() const { return temp_metadata_.is_valid(); } // Background colors. void SetBackgroundColor(short priority, const QColor& color); bool HasBackgroundColor(short priority) const; void RemoveBackgroundColor(short priority); QColor GetCurrentBackgroundColor() const; bool HasCurrentBackgroundColor() const; // Foreground colors. void SetForegroundColor(short priority, const QColor& color); bool HasForegroundColor(short priority) const; void RemoveForegroundColor(short priority); QColor GetCurrentForegroundColor() const; bool HasCurrentForegroundColor() const; // Convenience function to find out whether this item is from the local // library, as opposed to a device, a file on disk, or a stream. // Remember that even if this returns true, the library item might be // invalid so you might want to check that its id is not equal to -1 // before actually using it. virtual bool IsLocalLibraryItem() const { return false; } void SetShouldSkip(bool val); bool GetShouldSkip() const; protected: bool should_skip_; enum DatabaseColumn { Column_LibraryId, Column_InternetService, }; virtual QVariant DatabaseValue(DatabaseColumn) const { return QVariant(QVariant::String); } virtual Song DatabaseSongMetadata() const { return Song(); } QString type_; Song temp_metadata_; QMap background_colors_; QMap foreground_colors_; }; typedef std::shared_ptr PlaylistItemPtr; typedef QList PlaylistItemList; Q_DECLARE_METATYPE(PlaylistItemPtr) Q_DECLARE_METATYPE(QList) Q_DECLARE_OPERATORS_FOR_FLAGS(PlaylistItem::Options) #endif // PLAYLISTITEM_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistitemmimedata.h000066400000000000000000000022021260417502300264060ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PLAYLISTITEMMIMEDATA_H #define PLAYLISTITEMMIMEDATA_H #include "playlistitem.h" #include "core/mimedata.h" class PlaylistItemMimeData : public MimeData { Q_OBJECT public: PlaylistItemMimeData(const PlaylistItemPtr& item) : items_(PlaylistItemList() << item) {} PlaylistItemMimeData(const PlaylistItemList& items) : items_(items) {} PlaylistItemList items_; }; #endif // PLAYLISTITEMMIMEDATA_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistlistcontainer.cpp000066400000000000000000000313161260417502300271670ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "playlist.h" #include "playlistlistcontainer.h" #include "playlistlistmodel.h" #include "playlistmanager.h" #include "ui_playlistlistcontainer.h" #include "core/application.h" #include "core/logging.h" #include "core/player.h" #include "ui/iconloader.h" #include #include #include #include #include #include #include class PlaylistListSortFilterModel : public QSortFilterProxyModel { public: explicit PlaylistListSortFilterModel(QObject* parent) : QSortFilterProxyModel(parent) {} bool lessThan(const QModelIndex& left, const QModelIndex& right) const { // Compare the display text first. const int ret = left.data().toString().localeAwareCompare(right.data().toString()); if (ret < 0) return true; if (ret > 0) return false; // Now use the source model row order to ensure we always get a // deterministic sorting even when two items are named the same. return left.row() < right.row(); } }; PlaylistListContainer::PlaylistListContainer(QWidget* parent) : QWidget(parent), app_(nullptr), ui_(new Ui_PlaylistListContainer), menu_(nullptr), action_new_folder_(new QAction(this)), action_remove_(new QAction(this)), action_save_playlist_(new QAction(this)), model_(new PlaylistListModel(this)), proxy_(new PlaylistListSortFilterModel(this)), loaded_icons_(false), active_playlist_id_(-1) { ui_->setupUi(this); ui_->tree->setAttribute(Qt::WA_MacShowFocusRect, false); action_new_folder_->setText(tr("New folder")); action_remove_->setText(tr("Delete")); action_save_playlist_->setText( tr("Save playlist", "Save playlist menu action.")); ui_->new_folder->setDefaultAction(action_new_folder_); ui_->remove->setDefaultAction(action_remove_); ui_->save_playlist->setDefaultAction(action_save_playlist_); connect(action_new_folder_, SIGNAL(triggered()), SLOT(NewFolderClicked())); connect(action_remove_, SIGNAL(triggered()), SLOT(DeleteClicked())); connect(action_save_playlist_, SIGNAL(triggered()), SLOT(SavePlaylist())); connect(model_, SIGNAL(PlaylistPathChanged(int, QString)), SLOT(PlaylistPathChanged(int, QString))); proxy_->setSourceModel(model_); proxy_->setDynamicSortFilter(true); proxy_->sort(0); ui_->tree->setModel(proxy_); connect(ui_->tree, SIGNAL(doubleClicked(QModelIndex)), SLOT(ItemDoubleClicked(QModelIndex))); model_->invisibleRootItem()->setData(PlaylistListModel::Type_Folder, PlaylistListModel::Role_Type); } PlaylistListContainer::~PlaylistListContainer() { delete ui_; } void PlaylistListContainer::showEvent(QShowEvent* e) { // Loading icons is expensive so only do it when the view is first opened if (loaded_icons_) { QWidget::showEvent(e); return; } loaded_icons_ = true; action_new_folder_->setIcon(IconLoader::Load("folder-new")); action_remove_->setIcon(IconLoader::Load("edit-delete")); action_save_playlist_->setIcon(IconLoader::Load("document-save")); model_->SetIcons(IconLoader::Load("view-media-playlist"), IconLoader::Load("folder")); // Apply these icons to items that have already been created. RecursivelySetIcons(model_->invisibleRootItem()); QWidget::showEvent(e); } void PlaylistListContainer::RecursivelySetIcons(QStandardItem* parent) const { for (int i = 0; i < parent->rowCount(); ++i) { QStandardItem* child = parent->child(i); switch (child->data(PlaylistListModel::Role_Type).toInt()) { case PlaylistListModel::Type_Folder: child->setIcon(model_->folder_icon()); RecursivelySetIcons(child); break; case PlaylistListModel::Type_Playlist: child->setIcon(model_->playlist_icon()); break; } } } void PlaylistListContainer::SetApplication(Application* app) { app_ = app; PlaylistManager* manager = app_->playlist_manager(); Player* player = app_->player(); connect(manager, SIGNAL(PlaylistAdded(int, QString, bool)), SLOT(AddPlaylist(int, QString, bool))); connect(manager, SIGNAL(PlaylistFavorited(int, bool)), SLOT(PlaylistFavoriteStateChanged(int, bool))); connect(manager, SIGNAL(PlaylistRenamed(int, QString)), SLOT(PlaylistRenamed(int, QString))); connect(manager, SIGNAL(CurrentChanged(Playlist*)), SLOT(CurrentChanged(Playlist*))); connect(manager, SIGNAL(ActiveChanged(Playlist*)), SLOT(ActiveChanged(Playlist*))); connect(model_, SIGNAL(PlaylistRenamed(int, QString)), manager, SLOT(Rename(int, QString))); connect(player, SIGNAL(Paused()), SLOT(ActivePaused())); connect(player, SIGNAL(Playing()), SLOT(ActivePlaying())); connect(player, SIGNAL(Stopped()), SLOT(ActiveStopped())); // Get all playlists, even ones that are hidden in the UI. for (const PlaylistBackend::Playlist& p : app->playlist_backend()->GetAllFavoritePlaylists()) { QStandardItem* playlist_item = model_->NewPlaylist(p.name, p.id); QStandardItem* parent_folder = model_->FolderByPath(p.ui_path); parent_folder->appendRow(playlist_item); } } void PlaylistListContainer::NewFolderClicked() { QString name = QInputDialog::getText(this, tr("New folder"), tr("Enter the name of the folder")); if (name.isEmpty()) { return; } name.replace("/", " "); model_->invisibleRootItem()->appendRow(model_->NewFolder(name)); } void PlaylistListContainer::AddPlaylist(int id, const QString& name, bool favorite) { if (!favorite) { return; } if (model_->PlaylistById(id)) { // We know about this playlist already - it was probably one of the open // ones that was loaded on startup. return; } const QString& ui_path = app_->playlist_manager()->playlist(id)->ui_path(); QStandardItem* playlist_item = model_->NewPlaylist(name, id); QStandardItem* parent_folder = model_->FolderByPath(ui_path); parent_folder->appendRow(playlist_item); } void PlaylistListContainer::PlaylistRenamed(int id, const QString& new_name) { QStandardItem* item = model_->PlaylistById(id); if (!item) { return; } item->setText(new_name); } void PlaylistListContainer::RemovePlaylist(int id) { QStandardItem* item = model_->PlaylistById(id); if (item) { QStandardItem* parent = item->parent(); if (!parent) { parent = model_->invisibleRootItem(); } parent->removeRow(item->row()); } } void PlaylistListContainer::SavePlaylist() { const QModelIndex& current_index = proxy_->mapToSource(ui_->tree->currentIndex()); // Is it a playlist? if (current_index.data(PlaylistListModel::Role_Type).toInt() == PlaylistListModel::Type_Playlist) { const int playlist_id = current_index.data(PlaylistListModel::Role_PlaylistId).toInt(); QStandardItem* item = model_->PlaylistById(playlist_id); QString playlist_name = item ? item->text() : tr("Playlist"); app_->playlist_manager()->SaveWithUI(playlist_id, playlist_name); } } void PlaylistListContainer::PlaylistFavoriteStateChanged(int id, bool favorite) { if (favorite) { const QString& name = app_->playlist_manager()->GetPlaylistName(id); AddPlaylist(id, name, favorite); } else { RemovePlaylist(id); } } void PlaylistListContainer::ActiveChanged(Playlist* new_playlist) { const int new_id = new_playlist->id(); if (new_id != active_playlist_id_) { UpdateActiveIcon(active_playlist_id_, QIcon()); } active_playlist_id_ = new_id; } void PlaylistListContainer::CurrentChanged(Playlist* new_playlist) { if (!new_playlist) { return; } // Focus this playlist in the tree QStandardItem* item = model_->PlaylistById(new_playlist->id()); if (!item) { return; } QModelIndex index = proxy_->mapFromSource(item->index()); ui_->tree->selectionModel()->setCurrentIndex( index, QItemSelectionModel::ClearAndSelect); ui_->tree->scrollTo(index); } void PlaylistListContainer::PlaylistPathChanged(int id, const QString& new_path) { // Update the path in the database app_->playlist_backend()->SetPlaylistUiPath(id, new_path); Playlist* playlist = app_->playlist_manager()->playlist(id); // Check the playlist exists (if it's not opened it's not in the manager) if (playlist) { playlist->set_ui_path(new_path); } } void PlaylistListContainer::ItemDoubleClicked(const QModelIndex& proxy_index) { const QModelIndex& index = proxy_->mapToSource(proxy_index); // Is it a playlist? if (index.data(PlaylistListModel::Role_Type).toInt() == PlaylistListModel::Type_Playlist) { app_->playlist_manager()->SetCurrentOrOpen( index.data(PlaylistListModel::Role_PlaylistId).toInt()); } } void PlaylistListContainer::DeleteClicked() { QSet ids; QList folders_to_delete; for (const QModelIndex& proxy_index : ui_->tree->selectionModel()->selectedRows(0)) { const QModelIndex& index = proxy_->mapToSource(proxy_index); // Is it a playlist? switch (index.data(PlaylistListModel::Role_Type).toInt()) { case PlaylistListModel::Type_Playlist: ids << index.data(PlaylistListModel::Role_PlaylistId).toInt(); break; case PlaylistListModel::Type_Folder: // Find all the playlists inside. RecursivelyFindPlaylists(index, &ids); folders_to_delete << index; break; } } // Make sure the user really wants to unfavorite all these playlists. if (ids.count() > 1) { const int button = QMessageBox::question( this, tr("Remove playlists"), tr("You are about to remove %1 playlists from your favorites, are you " "sure?").arg(ids.count()), QMessageBox::Yes, QMessageBox::Cancel); if (button != QMessageBox::Yes) { return; } } // Unfavorite the playlists for (int id : ids) { app_->playlist_manager()->Favorite(id, false); } // Delete the top-level folders. for (const QPersistentModelIndex& index : folders_to_delete) { if (index.isValid()) { model_->removeRow(index.row(), index.parent()); } } } void PlaylistListContainer::RecursivelyFindPlaylists(const QModelIndex& parent, QSet* ids) const { switch (parent.data(PlaylistListModel::Role_Type).toInt()) { case PlaylistListModel::Type_Playlist: ids->insert(parent.data(PlaylistListModel::Role_PlaylistId).toInt()); break; case PlaylistListModel::Type_Folder: for (int i = 0; i < parent.model()->rowCount(parent); ++i) { RecursivelyFindPlaylists(parent.child(i, 0), ids); } break; } } void PlaylistListContainer::contextMenuEvent(QContextMenuEvent* e) { if (!menu_) { menu_ = new QMenu(this); menu_->addAction(action_new_folder_); menu_->addAction(action_remove_); menu_->addSeparator(); menu_->addAction(action_save_playlist_); } menu_->popup(e->globalPos()); } void PlaylistListContainer::ActivePlaying() { if (padded_play_icon_.isNull()) { QPixmap pixmap(":tiny-start.png"); QPixmap new_pixmap(QSize(pixmap.height(), pixmap.height())); new_pixmap.fill(Qt::transparent); QPainter p(&new_pixmap); p.drawPixmap((new_pixmap.width() - pixmap.width()) / 2, 0, pixmap.width(), pixmap.height(), pixmap); p.end(); padded_play_icon_.addPixmap(new_pixmap); } UpdateActiveIcon(active_playlist_id_, padded_play_icon_); } void PlaylistListContainer::ActivePaused() { UpdateActiveIcon(active_playlist_id_, QIcon(":tiny-pause.png")); } void PlaylistListContainer::ActiveStopped() { UpdateActiveIcon(active_playlist_id_, QIcon()); } void PlaylistListContainer::UpdateActiveIcon(int id, const QIcon& icon) { if (id == -1) { return; } QStandardItem* item = model_->PlaylistById(id); if (!item) { return; } if (icon.isNull()) { item->setIcon(model_->playlist_icon()); } else { item->setIcon(icon); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistlistcontainer.h000066400000000000000000000052171260417502300266350ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PLAYLISTLISTCONTAINER_H #define PLAYLISTLISTCONTAINER_H #include "playlistbackend.h" #include class QMenu; class QSortFilterProxyModel; class QStandardItemModel; class Application; class Playlist; class PlaylistListModel; class Ui_PlaylistListContainer; class PlaylistListContainer : public QWidget { Q_OBJECT public: PlaylistListContainer(QWidget* parent = nullptr); ~PlaylistListContainer(); void SetApplication(Application* app); protected: void showEvent(QShowEvent* e); void contextMenuEvent(QContextMenuEvent* e); private slots: // From the UI void NewFolderClicked(); void DeleteClicked(); void ItemDoubleClicked(const QModelIndex& index); // From the model void PlaylistPathChanged(int id, const QString& new_path); // From the PlaylistManager void PlaylistRenamed(int id, const QString& new_name); // Add playlist if favorite == true void AddPlaylist(int id, const QString& name, bool favorite); void RemovePlaylist(int id); void SavePlaylist(); void PlaylistFavoriteStateChanged(int id, bool favorite); void CurrentChanged(Playlist* new_playlist); void ActiveChanged(Playlist* new_playlist); // From the Player void ActivePlaying(); void ActivePaused(); void ActiveStopped(); private: QStandardItem* ItemForPlaylist(const QString& name, int id); QStandardItem* ItemForFolder(const QString& name) const; void RecursivelySetIcons(QStandardItem* parent) const; void RecursivelyFindPlaylists(const QModelIndex& parent, QSet* ids) const; void UpdateActiveIcon(int id, const QIcon& icon); Application* app_; Ui_PlaylistListContainer* ui_; QMenu* menu_; QAction* action_new_folder_; QAction* action_remove_; QAction* action_save_playlist_; PlaylistListModel* model_; QSortFilterProxyModel* proxy_; bool loaded_icons_; QIcon padded_play_icon_; int active_playlist_id_; }; #endif // PLAYLISTLISTCONTAINER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistlistcontainer.ui000066400000000000000000000073141260417502300270230ustar00rootroot00000000000000 PlaylistListContainer 0 0 160 503 0 0 Form 0 0 0 0 0 0 New folder Delete Qt::Vertical Qt::Vertical Qt::Horizontal 70 20 0 0 true true QAbstractItemView::InternalMove Qt::MoveAction QAbstractItemView::ExtendedSelection 16 16 false AutoExpandingTreeView QTreeView
widgets/autoexpandingtreeview.h
PlaylistListView AutoExpandingTreeView
playlist/playlistlistview.h
1
clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistlistmodel.cpp000066400000000000000000000145501260417502300263060ustar00rootroot00000000000000#include "playlistlistmodel.h" #include "core/logging.h" #include PlaylistListModel::PlaylistListModel(QObject* parent) : QStandardItemModel(parent), dropping_rows_(false) { connect(this, SIGNAL(dataChanged(QModelIndex, QModelIndex)), SLOT(RowsChanged(QModelIndex, QModelIndex))); connect(this, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), SLOT(RowsAboutToBeRemoved(QModelIndex, int, int))); connect(this, SIGNAL(rowsInserted(QModelIndex, int, int)), SLOT(RowsInserted(QModelIndex, int, int))); } void PlaylistListModel::SetIcons(const QIcon& playlist_icon, const QIcon& folder_icon) { playlist_icon_ = playlist_icon; folder_icon_ = folder_icon; } bool PlaylistListModel::dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent) { dropping_rows_ = true; bool ret = QStandardItemModel::dropMimeData(data, action, row, column, parent); dropping_rows_ = false; return ret; } QString PlaylistListModel::ItemPath(const QStandardItem* item) const { QStringList components; const QStandardItem* current = item; while (current) { if (current->data(Role_Type).toInt() == Type_Folder) { components.insert(0, current->data(Qt::DisplayRole).toString()); } current = current->parent(); } return components.join("/"); } void PlaylistListModel::RowsChanged(const QModelIndex& begin, const QModelIndex& end) { AddRowMappings(begin, end); } void PlaylistListModel::RowsInserted(const QModelIndex& parent, int start, int end) { // RowsChanged will take care of these when dropping. if (!dropping_rows_) { AddRowMappings(index(start, 0, parent), index(end, 0, parent)); } } void PlaylistListModel::AddRowMappings(const QModelIndex& begin, const QModelIndex& end) { const QString parent_path = ItemPath(itemFromIndex(begin)); for (int i = begin.row(); i <= end.row(); ++i) { const QModelIndex index = begin.sibling(i, 0); QStandardItem* item = itemFromIndex(index); AddRowItem(item, parent_path); } } void PlaylistListModel::AddRowItem(QStandardItem* item, const QString& parent_path) { switch (item->data(Role_Type).toInt()) { case Type_Playlist: { const int id = item->data(Role_PlaylistId).toInt(); playlists_by_id_[id] = item; if (dropping_rows_) { emit PlaylistPathChanged(id, parent_path); } break; } case Type_Folder: for (int j = 0; j < item->rowCount(); ++j) { QStandardItem* child_item = item->child(j); AddRowItem(child_item, parent_path); } break; } } void PlaylistListModel::RowsAboutToBeRemoved(const QModelIndex& parent, int start, int end) { for (int i = start; i <= end; ++i) { const QModelIndex idx = index(i, 0, parent); const QStandardItem* item = itemFromIndex(idx); switch (idx.data(Role_Type).toInt()) { case Type_Playlist: { const int id = idx.data(Role_PlaylistId).toInt(); QMap::Iterator it = playlists_by_id_.find(id); if (it != playlists_by_id_.end() && it.value() == item) { playlists_by_id_.erase(it); } break; } case Type_Folder: break; } } } QStandardItem* PlaylistListModel::PlaylistById(int id) const { return playlists_by_id_[id]; } QStandardItem* PlaylistListModel::FolderByPath(const QString& path) { if (path.isEmpty()) { return invisibleRootItem(); } // Walk down from the root until we find the target folder. This is pretty // inefficient but maintaining a path -> item map is difficult. QStandardItem* parent = invisibleRootItem(); const QStringList parts = path.split('/', QString::SkipEmptyParts); for (const QString& part : parts) { QStandardItem* matching_child = nullptr; const int child_count = parent->rowCount(); for (int i = 0; i < child_count; ++i) { if (parent->child(i)->data(Qt::DisplayRole).toString() == part) { matching_child = parent->child(i); break; } } // Does this folder exist already? if (matching_child) { parent = matching_child; } else { QStandardItem* child = NewFolder(part); parent->appendRow(child); parent = child; } } return parent; } QStandardItem* PlaylistListModel::NewFolder(const QString& name) const { QStandardItem* ret = new QStandardItem; ret->setText(name); ret->setData(PlaylistListModel::Type_Folder, PlaylistListModel::Role_Type); ret->setIcon(folder_icon_); ret->setFlags(Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable); return ret; } QStandardItem* PlaylistListModel::NewPlaylist(const QString& name, int id) const { QStandardItem* ret = new QStandardItem; ret->setText(name); ret->setData(PlaylistListModel::Type_Playlist, PlaylistListModel::Role_Type); ret->setData(id, PlaylistListModel::Role_PlaylistId); ret->setIcon(playlist_icon_); ret->setFlags(Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable); return ret; } bool PlaylistListModel::setData(const QModelIndex& index, const QVariant& value, int role) { if (!QStandardItemModel::setData(index, value, role)) { return false; } switch (index.data(Role_Type).toInt()) { case Type_Playlist: emit PlaylistRenamed(index.data(Role_PlaylistId).toInt(), value.toString()); break; case Type_Folder: // Walk all the children and modify their paths. UpdatePathsRecursive(index); break; } return true; } void PlaylistListModel::UpdatePathsRecursive(const QModelIndex& parent) { switch (parent.data(Role_Type).toInt()) { case Type_Playlist: emit PlaylistPathChanged(parent.data(Role_PlaylistId).toInt(), ItemPath(itemFromIndex(parent))); break; case Type_Folder: for (int i = 0; i < rowCount(parent); ++i) { UpdatePathsRecursive(index(i, 0, parent)); } break; } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistlistmodel.h000066400000000000000000000047501260417502300257540ustar00rootroot00000000000000#ifndef PLAYLISTLISTMODEL_H #define PLAYLISTLISTMODEL_H #include class PlaylistListModel : public QStandardItemModel { Q_OBJECT public: PlaylistListModel(QObject* parent = nullptr); enum Types { Type_Folder, Type_Playlist }; enum Roles { Role_Type = Qt::UserRole, Role_PlaylistId }; bool dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent); // These icons will be used for newly created playlists and folders. // The caller will need to set these icons on existing items if there are any. void SetIcons(const QIcon& playlist_icon, const QIcon& folder_icon); const QIcon& playlist_icon() const { return playlist_icon_; } const QIcon& folder_icon() const { return folder_icon_; } // Walks from the given item to the root, returning the / separated path of // all the parent folders. The path includes this item if it is a folder. QString ItemPath(const QStandardItem* item) const; // Finds the playlist with the given ID, returns 0 if it doesn't exist. QStandardItem* PlaylistById(int id) const; // Finds the folder with the given path, creating it (and its parents) if they // do not exist. Returns invisibleRootItem() if path is empty. QStandardItem* FolderByPath(const QString& path); // Returns a new folder item with the given name. The item isn't added to // the model yet. QStandardItem* NewFolder(const QString& name) const; // Returns a new playlist item with the given name and ID. The item isn't // added to the model yet. QStandardItem* NewPlaylist(const QString& name, int id) const; // QStandardItemModel bool setData(const QModelIndex& index, const QVariant& value, int role); signals: void PlaylistPathChanged(int id, const QString& new_path); void PlaylistRenamed(int id, const QString& new_name); private slots: void RowsChanged(const QModelIndex& begin, const QModelIndex& end); void RowsAboutToBeRemoved(const QModelIndex& parent, int start, int end); void RowsInserted(const QModelIndex& parent, int start, int end); private: void AddRowMappings(const QModelIndex& begin, const QModelIndex& end); void AddRowItem(QStandardItem* item, const QString& parent_path); void UpdatePathsRecursive(const QModelIndex& parent); private: bool dropping_rows_; QIcon playlist_icon_; QIcon folder_icon_; QMap playlists_by_id_; QMap folders_by_path_; }; #endif // PLAYLISTLISTMODEL_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistlistview.cpp000066400000000000000000000027421260417502300261600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2013, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "playlistlistview.h" #include PlaylistListView::PlaylistListView(QWidget* parent) : AutoExpandingTreeView(parent) {} void PlaylistListView::paintEvent(QPaintEvent* event) { if (model()->rowCount() <= 0) { QPainter p(viewport()); QRect rect(viewport()->rect()); p.setPen(palette().color(QPalette::Disabled, QPalette::Text)); QFont bold_font; bold_font.setBold(true); p.setFont(bold_font); p.drawText(rect, Qt::AlignHCenter | Qt::TextWordWrap, tr("\n\n" "You can favorite playlists by clicking the star icon next " "to a playlist name\n\n" "Favorited playlists will be saved here")); } else { AutoExpandingTreeView::paintEvent(event); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistlistview.h000066400000000000000000000017411260417502300256230ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2013, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "widgets/autoexpandingtreeview.h" class PlaylistListView : public AutoExpandingTreeView { Q_OBJECT public: PlaylistListView(QWidget* parent = nullptr); ~PlaylistListView() {} protected: // QWidget void paintEvent(QPaintEvent* event); }; clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistmanager.cpp000066400000000000000000000403521260417502300257230ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "playlistbackend.h" #include "playlistcontainer.h" #include "playlistmanager.h" #include "playlistsaveoptionsdialog.h" #include "playlistview.h" #include "core/application.h" #include "core/logging.h" #include "core/player.h" #include "core/songloader.h" #include "core/utilities.h" #include "library/librarybackend.h" #include "library/libraryplaylistitem.h" #include "playlistparsers/playlistparser.h" #include "smartplaylists/generator.h" #include #include #include #include #include #include #include using smart_playlists::GeneratorPtr; PlaylistManager::PlaylistManager(Application* app, QObject* parent) : PlaylistManagerInterface(app, parent), app_(app), playlist_backend_(nullptr), library_backend_(nullptr), sequence_(nullptr), parser_(nullptr), playlist_container_(nullptr), current_(-1), active_(-1) { connect(app_->player(), SIGNAL(Paused()), SLOT(SetActivePaused())); connect(app_->player(), SIGNAL(Playing()), SLOT(SetActivePlaying())); connect(app_->player(), SIGNAL(Stopped()), SLOT(SetActiveStopped())); } PlaylistManager::~PlaylistManager() { for (const Data& data : playlists_.values()) { delete data.p; } } void PlaylistManager::Init(LibraryBackend* library_backend, PlaylistBackend* playlist_backend, PlaylistSequence* sequence, PlaylistContainer* playlist_container) { library_backend_ = library_backend; playlist_backend_ = playlist_backend; sequence_ = sequence; parser_ = new PlaylistParser(library_backend, this); playlist_container_ = playlist_container; connect(library_backend_, SIGNAL(SongsDiscovered(SongList)), SLOT(SongsDiscovered(SongList))); connect(library_backend_, SIGNAL(SongsStatisticsChanged(SongList)), SLOT(SongsDiscovered(SongList))); connect(library_backend_, SIGNAL(SongsRatingChanged(SongList)), SLOT(SongsDiscovered(SongList))); for (const PlaylistBackend::Playlist& p : playlist_backend->GetAllOpenPlaylists()) { AddPlaylist(p.id, p.name, p.special_type, p.ui_path, p.favorite); } // If no playlist exists then make a new one if (playlists_.isEmpty()) New(tr("Playlist")); emit PlaylistManagerInitialized(); } QList PlaylistManager::GetAllPlaylists() const { QList result; for (const Data& data : playlists_.values()) { result.append(data.p); } return result; } QItemSelection PlaylistManager::selection(int id) const { QMap::const_iterator it = playlists_.find(id); return it->selection; } Playlist* PlaylistManager::AddPlaylist(int id, const QString& name, const QString& special_type, const QString& ui_path, bool favorite) { Playlist* ret = new Playlist(playlist_backend_, app_->task_manager(), library_backend_, id, special_type, favorite); ret->set_sequence(sequence_); ret->set_ui_path(ui_path); connect(ret, SIGNAL(CurrentSongChanged(Song)), SIGNAL(CurrentSongChanged(Song))); connect(ret, SIGNAL(PlaylistChanged()), SLOT(OneOfPlaylistsChanged())); connect(ret, SIGNAL(PlaylistChanged()), SLOT(UpdateSummaryText())); connect(ret, SIGNAL(EditingFinished(QModelIndex)), SIGNAL(EditingFinished(QModelIndex))); connect(ret, SIGNAL(LoadTracksError(QString)), SIGNAL(Error(QString))); connect(ret, SIGNAL(PlayRequested(QModelIndex)), SIGNAL(PlayRequested(QModelIndex))); connect(playlist_container_->view(), SIGNAL(ColumnAlignmentChanged(ColumnAlignmentMap)), ret, SLOT(SetColumnAlignment(ColumnAlignmentMap))); playlists_[id] = Data(ret, name); emit PlaylistAdded(id, name, favorite); if (current_ == -1) { SetCurrentPlaylist(id); } if (active_ == -1) { SetActivePlaylist(id); } return ret; } void PlaylistManager::New(const QString& name, const SongList& songs, const QString& special_type) { if (name.isNull()) return; int id = playlist_backend_->CreatePlaylist(name, special_type); if (id == -1) qFatal("Couldn't create playlist"); Playlist* playlist = AddPlaylist(id, name, special_type, QString(), false); playlist->InsertSongsOrLibraryItems(songs); SetCurrentPlaylist(id); // If the name is just "Playlist", append the id if (name == tr("Playlist")) { Rename(id, QString("%1 %2").arg(name).arg(id)); } } void PlaylistManager::Load(const QString& filename) { QFileInfo info(filename); int id = playlist_backend_->CreatePlaylist(info.baseName(), QString()); if (id == -1) { emit Error(tr("Couldn't create playlist")); return; } Playlist* playlist = AddPlaylist(id, info.baseName(), QString(), QString(), false); QList urls; playlist->InsertUrls(urls << QUrl::fromLocalFile(filename)); } void PlaylistManager::Save(int id, const QString& filename, Playlist::Path path_type) { if (playlists_.contains(id)) { parser_->Save(playlist(id)->GetAllSongs(), filename, path_type); } else { // Playlist is not in the playlist manager: probably save action was // triggered // from the left side bar and the playlist isn't loaded. QFuture> future = QtConcurrent::run( playlist_backend_, &PlaylistBackend::GetPlaylistSongs, id); QFutureWatcher* watcher = new QFutureWatcher(this); watcher->setFuture(future); NewClosure(watcher, SIGNAL(finished()), this, SLOT(ItemsLoadedForSavePlaylist(QFutureWatcher*, QString, Playlist::Path)), watcher, filename); } } void PlaylistManager::ItemsLoadedForSavePlaylist( QFutureWatcher* watcher, const QString& filename, Playlist::Path path_type) { SongList song_list = watcher->future().result(); parser_->Save(song_list, filename, path_type); } void PlaylistManager::SaveWithUI(int id, const QString& suggested_filename) { QSettings settings; settings.beginGroup(Playlist::kSettingsGroup); QString filename = settings.value("last_save_playlist").toString(); settings.endGroup(); // We want to use the playlist tab name as a default filename, but in the // same directory as the last saved file. // Strip off filename components until we find something that's a folder forever { QFileInfo fileinfo(filename); if (filename.isEmpty() || fileinfo.isDir()) break; filename = filename.section('/', 0, -2); } // Use the home directory as a fallback in case the path is empty. if (filename.isEmpty()) filename = QDir::homePath(); // Add the suggested filename filename += "/" + suggested_filename + "." + parser()->default_extension(); QString default_filter = parser()->default_filter(); filename = QFileDialog::getSaveFileName( nullptr, tr("Save playlist", "Title of the playlist save dialog."), filename, parser()->filters(), &default_filter); if (filename.isNull()) { settings.endGroup(); return; } QSettings s; s.beginGroup(Playlist::kSettingsGroup); int p = s.value(Playlist::kPathType, Playlist::Path_Automatic).toInt(); Playlist::Path path = static_cast(p); if (path == Playlist::Path_Ask_User) { PlaylistSaveOptionsDialog optionsDialog(nullptr); optionsDialog.setModal(true); if (optionsDialog.exec() != QDialog::Accepted) { return; } path = optionsDialog.path_type(); } settings.setValue("last_save_playlist", filename); settings.endGroup(); Save(id == -1 ? current_id() : id, filename, path); } void PlaylistManager::Rename(int id, const QString& new_name) { Q_ASSERT(playlists_.contains(id)); playlist_backend_->RenamePlaylist(id, new_name); playlists_[id].name = new_name; emit PlaylistRenamed(id, new_name); } void PlaylistManager::Favorite(int id, bool favorite) { if (playlists_.contains(id)) { // If playlists_ contains this playlist, its means it's opened: star or // unstar it. playlist_backend_->FavoritePlaylist(id, favorite); playlists_[id].p->set_favorite(favorite); } else { Q_ASSERT(!favorite); // Otherwise it means user wants to remove this playlist from the left // panel, // while it's not visible in the playlist tabbar either, because it has been // closed: delete it. playlist_backend_->RemovePlaylist(id); } emit PlaylistFavorited(id, favorite); } bool PlaylistManager::Close(int id) { // Won't allow removing the last playlist if (playlists_.count() <= 1 || !playlists_.contains(id)) return false; int next_id = -1; for (int possible_next_id : playlists_.keys()) { if (possible_next_id != id) { next_id = possible_next_id; break; } } if (next_id == -1) return false; if (id == active_) SetActivePlaylist(next_id); if (id == current_) SetCurrentPlaylist(next_id); Data data = playlists_.take(id); emit PlaylistClosed(id); if (!data.p->is_favorite()) { playlist_backend_->RemovePlaylist(id); emit PlaylistDeleted(id); } delete data.p; return true; } void PlaylistManager::Delete(int id) { if (!Close(id)) { return; } playlist_backend_->RemovePlaylist(id); emit PlaylistDeleted(id); } void PlaylistManager::OneOfPlaylistsChanged() { emit PlaylistChanged(qobject_cast(sender())); } void PlaylistManager::SetCurrentPlaylist(int id) { Q_ASSERT(playlists_.contains(id)); current_ = id; emit CurrentChanged(current()); UpdateSummaryText(); } void PlaylistManager::SetActivePlaylist(int id) { Q_ASSERT(playlists_.contains(id)); // Kinda a hack: unset the current item from the old active playlist before // setting the new one if (active_ != -1 && active_ != id) active()->set_current_row(-1); active_ = id; emit ActiveChanged(active()); sequence_->SetUsingDynamicPlaylist(active()->is_dynamic()); } void PlaylistManager::SetActiveToCurrent() { // Check if we need to update the active playlist. // By calling SetActiveToCurrent, the playlist manager emits the signal // "ActiveChanged". This signal causes the network remote module to // send all playlists to the clients, even no change happend. if (current_id() != active_id()) { SetActivePlaylist(current_id()); } } void PlaylistManager::ClearCurrent() { current()->Clear(); } void PlaylistManager::ShuffleCurrent() { current()->Shuffle(); } void PlaylistManager::RemoveDuplicatesCurrent() { current()->RemoveDuplicateSongs(); } void PlaylistManager::RemoveUnavailableCurrent() { current()->RemoveUnavailableSongs(); } void PlaylistManager::SetActivePlaying() { active()->Playing(); } void PlaylistManager::SetActivePaused() { active()->Paused(); } void PlaylistManager::SetActiveStopped() { active()->Stopped(); } void PlaylistManager::SetActiveStreamMetadata(const QUrl& url, const Song& song) { active()->SetStreamMetadata(url, song); } void PlaylistManager::RateCurrentSong(double rating) { active()->RateSong(active()->current_index(), rating); } void PlaylistManager::RateCurrentSong(int rating) { RateCurrentSong(rating / 5.0); } void PlaylistManager::ChangePlaylistOrder(const QList& ids) { playlist_backend_->SetPlaylistOrder(ids); } void PlaylistManager::UpdateSummaryText() { int tracks = current()->rowCount(); quint64 nanoseconds = 0; int selected = 0; // Get the length of the selected tracks for (const QItemSelectionRange& range : playlists_[current_id()].selection) { if (!range.isValid()) continue; selected += range.bottom() - range.top() + 1; for (int i = range.top(); i <= range.bottom(); ++i) { qint64 length = range.model()->index(i, Playlist::Column_Length).data().toLongLong(); if (length > 0) nanoseconds += length; } } QString summary; if (selected > 1) { summary += tr("%1 selected of").arg(selected) + " "; } else { nanoseconds = current()->GetTotalLength(); } // TODO: Make the plurals translatable summary += tracks == 1 ? tr("1 track") : tr("%1 tracks").arg(tracks); if (nanoseconds) summary += " - [ " + Utilities::WordyTimeNanosec(nanoseconds) + " ]"; emit SummaryTextChanged(summary); } void PlaylistManager::SelectionChanged(const QItemSelection& selection) { playlists_[current_id()].selection = selection; UpdateSummaryText(); } void PlaylistManager::SongsDiscovered(const SongList& songs) { // Some songs might've changed in the library, let's update any playlist // items we have that match those songs for (const Song& song : songs) { for (const Data& data : playlists_) { PlaylistItemList items = data.p->library_items_by_id(song.id()); for (PlaylistItemPtr item : items) { if (item->Metadata().directory_id() != song.directory_id()) continue; static_cast(item.get())->SetMetadata(song); data.p->ItemChanged(item); } } } } void PlaylistManager::PlaySmartPlaylist(GeneratorPtr generator, bool as_new, bool clear) { if (as_new) { New(generator->name()); } if (clear) { current()->Clear(); } current()->InsertSmartPlaylist(generator); } // When Player has processed the new song chosen by the user... void PlaylistManager::SongChangeRequestProcessed(const QUrl& url, bool valid) { for (Playlist* playlist : GetAllPlaylists()) { if (playlist->ApplyValidityOnCurrentSong(url, valid)) { return; } } } void PlaylistManager::InsertUrls(int id, const QList& urls, int pos, bool play_now, bool enqueue) { Q_ASSERT(playlists_.contains(id)); playlists_[id].p->InsertUrls(urls, pos, play_now, enqueue); } void PlaylistManager::InsertSongs(int id, const SongList& songs, int pos, bool play_now, bool enqueue) { Q_ASSERT(playlists_.contains(id)); playlists_[id].p->InsertSongs(songs, pos, play_now, enqueue); } void PlaylistManager::RemoveItemsWithoutUndo(int id, const QList& indices) { Q_ASSERT(playlists_.contains(id)); playlists_[id].p->RemoveItemsWithoutUndo(indices); } void PlaylistManager::InvalidateDeletedSongs() { for (Playlist* playlist : GetAllPlaylists()) { playlist->InvalidateDeletedSongs(); } } void PlaylistManager::RemoveDeletedSongs() { for (Playlist* playlist : GetAllPlaylists()) { playlist->RemoveDeletedSongs(); } } QString PlaylistManager::GetNameForNewPlaylist(const SongList& songs) { if (songs.isEmpty()) { return tr("Playlist"); } QSet artists; QSet albums; for (const Song& song : songs) { artists << (song.artist().isEmpty() ? tr("Unknown") : song.artist()); albums << (song.album().isEmpty() ? tr("Unknown") : song.album()); if (artists.size() > 1) { break; } } bool various_artists = artists.size() > 1; QString result; if (various_artists) { result = tr("Various artists"); } else { result = artists.values().first(); } if (!various_artists && albums.size() == 1) { result += " - " + albums.toList().first(); } return result; } void PlaylistManager::Open(int id) { if (playlists_.contains(id)) { return; } const PlaylistBackend::Playlist& p = playlist_backend_->GetPlaylist(id); if (p.id != id) { return; } AddPlaylist(p.id, p.name, p.special_type, p.ui_path, p.favorite); } void PlaylistManager::SetCurrentOrOpen(int id) { Open(id); SetCurrentPlaylist(id); } bool PlaylistManager::IsPlaylistOpen(int id) { return playlists_.contains(id); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistmanager.h000066400000000000000000000225371260417502300253750ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PLAYLISTMANAGER_H #define PLAYLISTMANAGER_H #include #include #include #include #include #include "core/song.h" #include "playlist.h" #include "smartplaylists/generator_fwd.h" class Application; class LibraryBackend; class PlaylistBackend; class PlaylistContainer; class PlaylistParser; class PlaylistSequence; class TaskManager; class QModelIndex; class QUrl; class PlaylistManagerInterface : public QObject { Q_OBJECT public: PlaylistManagerInterface(Application* app, QObject* parent) : QObject(parent) {} virtual int current_id() const = 0; virtual int active_id() const = 0; virtual Playlist* playlist(int id) const = 0; virtual Playlist* current() const = 0; virtual Playlist* active() const = 0; // Returns the collection of playlists managed by this PlaylistManager. virtual QList GetAllPlaylists() const = 0; // Grays out and reloads all deleted songs in all playlists. virtual void InvalidateDeletedSongs() = 0; // Removes all deleted songs from all playlists. virtual void RemoveDeletedSongs() = 0; virtual QItemSelection selection(int id) const = 0; virtual QItemSelection current_selection() const = 0; virtual QItemSelection active_selection() const = 0; virtual QString GetPlaylistName(int index) const = 0; virtual LibraryBackend* library_backend() const = 0; virtual PlaylistBackend* playlist_backend() const = 0; virtual PlaylistSequence* sequence() const = 0; virtual PlaylistParser* parser() const = 0; virtual PlaylistContainer* playlist_container() const = 0; public slots: virtual void New(const QString& name, const SongList& songs = SongList(), const QString& special_type = QString()) = 0; virtual void Load(const QString& filename) = 0; virtual void Save(int id, const QString& filename, Playlist::Path path_type) = 0; virtual void Rename(int id, const QString& new_name) = 0; virtual void Delete(int id) = 0; virtual bool Close(int id) = 0; virtual void Open(int id) = 0; virtual void ChangePlaylistOrder(const QList& ids) = 0; virtual void SongChangeRequestProcessed(const QUrl& url, bool valid) = 0; virtual void SetCurrentPlaylist(int id) = 0; virtual void SetActivePlaylist(int id) = 0; virtual void SetActiveToCurrent() = 0; virtual void SelectionChanged(const QItemSelection& selection) = 0; // Convenience slots that defer to either current() or active() virtual void ClearCurrent() = 0; virtual void ShuffleCurrent() = 0; virtual void RemoveDuplicatesCurrent() = 0; virtual void RemoveUnavailableCurrent() = 0; virtual void SetActivePlaying() = 0; virtual void SetActivePaused() = 0; virtual void SetActiveStopped() = 0; virtual void SetActiveStreamMetadata(const QUrl& url, const Song& song) = 0; // Rate current song using 0.0 - 1.0 scale. virtual void RateCurrentSong(double rating) = 0; // Rate current song using 0 - 5 scale. virtual void RateCurrentSong(int rating) = 0; virtual void PlaySmartPlaylist(smart_playlists::GeneratorPtr generator, bool as_new, bool clear) = 0; signals: void PlaylistManagerInitialized(); void PlaylistAdded(int id, const QString& name, bool favorite); void PlaylistDeleted(int id); void PlaylistClosed(int id); void PlaylistRenamed(int id, const QString& new_name); void PlaylistFavorited(int id, bool favorite); void CurrentChanged(Playlist* new_playlist); void ActiveChanged(Playlist* new_playlist); void Error(const QString& message); void SummaryTextChanged(const QString& summary); // Forwarded from individual playlists void CurrentSongChanged(const Song& song); // Signals that one of manager's playlists has changed (new items, new // ordering etc.) - the argument shows which. void PlaylistChanged(Playlist* playlist); void EditingFinished(const QModelIndex& index); void PlayRequested(const QModelIndex& index); }; class PlaylistManager : public PlaylistManagerInterface { Q_OBJECT public: PlaylistManager(Application* app, QObject* parent = nullptr); ~PlaylistManager(); int current_id() const { return current_; } int active_id() const { return active_; } Playlist* playlist(int id) const { return playlists_[id].p; } Playlist* current() const { return playlist(current_id()); } Playlist* active() const { return playlist(active_id()); } // Returns the collection of playlists managed by this PlaylistManager. QList GetAllPlaylists() const; // Grays out and reloads all deleted songs in all playlists. void InvalidateDeletedSongs(); // Removes all deleted songs from all playlists. void RemoveDeletedSongs(); // Returns true if the playlist is open bool IsPlaylistOpen(int id); // Returns a pretty automatic name for playlist created from the given list of // songs. static QString GetNameForNewPlaylist(const SongList& songs); QItemSelection selection(int id) const; QItemSelection current_selection() const { return selection(current_id()); } QItemSelection active_selection() const { return selection(active_id()); } QString GetPlaylistName(int index) const { return playlists_[index].name; } bool IsPlaylistFavorite(int index) const { return playlists_[index].p->is_favorite(); } void Init(LibraryBackend* library_backend, PlaylistBackend* playlist_backend, PlaylistSequence* sequence, PlaylistContainer* playlist_container); LibraryBackend* library_backend() const { return library_backend_; } PlaylistBackend* playlist_backend() const { return playlist_backend_; } PlaylistSequence* sequence() const { return sequence_; } PlaylistParser* parser() const { return parser_; } PlaylistContainer* playlist_container() const { return playlist_container_; } public slots: void New(const QString& name, const SongList& songs = SongList(), const QString& special_type = QString()); void Load(const QString& filename); void Save(int id, const QString& filename, Playlist::Path path_type); // Display a file dialog to let user choose a file before saving the file void SaveWithUI(int id, const QString& suggested_filename); void Rename(int id, const QString& new_name); void Favorite(int id, bool favorite); void Delete(int id); bool Close(int id); void Open(int id); void ChangePlaylistOrder(const QList& ids); void SetCurrentPlaylist(int id); void SetActivePlaylist(int id); void SetActiveToCurrent(); void SelectionChanged(const QItemSelection& selection); // Makes a playlist current if it's open already, or opens it and makes it // current if it is hidden. void SetCurrentOrOpen(int id); // Convenience slots that defer to either current() or active() void ClearCurrent(); void ShuffleCurrent(); void RemoveDuplicatesCurrent(); void RemoveUnavailableCurrent(); void SetActiveStreamMetadata(const QUrl& url, const Song& song); // Rate current song using 0.0 - 1.0 scale. void RateCurrentSong(double rating); // Rate current song using 0 - 5 scale. void RateCurrentSong(int rating); void PlaySmartPlaylist(smart_playlists::GeneratorPtr generator, bool as_new, bool clear); void SongChangeRequestProcessed(const QUrl& url, bool valid); void InsertUrls(int id, const QList& urls, int pos = -1, bool play_now = false, bool enqueue = false); void InsertSongs(int id, const SongList& songs, int pos = -1, bool play_now = false, bool enqueue = false); // Removes items with given indices from the playlist. This operation is not // undoable. void RemoveItemsWithoutUndo(int id, const QList& indices); private slots: void SetActivePlaying(); void SetActivePaused(); void SetActiveStopped(); void OneOfPlaylistsChanged(); void UpdateSummaryText(); void SongsDiscovered(const SongList& songs); void ItemsLoadedForSavePlaylist(QFutureWatcher* watcher, const QString& filename, Playlist::Path path_type); private: Playlist* AddPlaylist(int id, const QString& name, const QString& special_type, const QString& ui_path, bool favorite); private: struct Data { Data(Playlist* _p = nullptr, const QString& _name = QString()) : p(_p), name(_name) {} Playlist* p; QString name; QItemSelection selection; }; Application* app_; PlaylistBackend* playlist_backend_; LibraryBackend* library_backend_; PlaylistSequence* sequence_; PlaylistParser* parser_; PlaylistContainer* playlist_container_; // key = id QMap playlists_; int current_; int active_; }; #endif // PLAYLISTMANAGER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistsaveoptionsdialog.cpp000066400000000000000000000035151260417502300300430ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "playlistsaveoptionsdialog.h" #include "ui_playlistsaveoptionsdialog.h" #include "playlistparsers/parserbase.h" #include const char* PlaylistSaveOptionsDialog::kSettingsGroup = "PlaylistSaveOptionsDialog"; PlaylistSaveOptionsDialog::PlaylistSaveOptionsDialog(QWidget* parent) : QDialog(parent), ui(new Ui::PlaylistSaveOptionsDialog) { ui->setupUi(this); ui->filePaths->addItem(tr("Automatic"), Playlist::Path_Automatic); ui->filePaths->addItem(tr("Relative"), Playlist::Path_Relative); ui->filePaths->addItem(tr("Absolute"), Playlist::Path_Absolute); } PlaylistSaveOptionsDialog::~PlaylistSaveOptionsDialog() { delete ui; } void PlaylistSaveOptionsDialog::accept() { if (ui->remember_user_choice->isChecked()) { QSettings s; s.beginGroup(Playlist::kSettingsGroup); s.setValue(Playlist::kPathType, ui->filePaths->itemData(ui->filePaths->currentIndex()).toInt()); } QDialog::accept(); } Playlist::Path PlaylistSaveOptionsDialog::path_type() const { return static_cast( ui->filePaths->itemData(ui->filePaths->currentIndex()).toInt()); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistsaveoptionsdialog.h000066400000000000000000000023351260417502300275070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PLAYLISTSAVEOPTIONSDIALOG_H #define PLAYLISTSAVEOPTIONSDIALOG_H #include #include "playlist.h" namespace Ui { class PlaylistSaveOptionsDialog; } class PlaylistSaveOptionsDialog : public QDialog { Q_OBJECT public: explicit PlaylistSaveOptionsDialog(QWidget* parent = 0); ~PlaylistSaveOptionsDialog(); void accept(); Playlist::Path path_type() const; private: static const char* kSettingsGroup; Ui::PlaylistSaveOptionsDialog* ui; }; #endif // PLAYLISTSAVEOPTIONSDIALOG_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistsaveoptionsdialog.ui000066400000000000000000000051621260417502300276760ustar00rootroot00000000000000 PlaylistSaveOptionsDialog 0 0 348 116 Playlist options File paths 0 This can be changed later through the preferences Remember my choice Qt::Vertical 20 40 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() PlaylistSaveOptionsDialog accept() 248 254 157 274 buttonBox rejected() PlaylistSaveOptionsDialog reject() 316 260 286 274 clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistsequence.cpp000066400000000000000000000165571260417502300261330ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "playlistsequence.h" #include "ui_playlistsequence.h" #include "ui/iconloader.h" #include #include #include #include #include const char* PlaylistSequence::kSettingsGroup = "PlaylistSequence"; PlaylistSequence::PlaylistSequence(QWidget* parent, SettingsProvider* settings) : QWidget(parent), ui_(new Ui_PlaylistSequence), settings_(settings ? settings : new DefaultSettingsProvider), repeat_menu_(new QMenu(this)), shuffle_menu_(new QMenu(this)), loading_(false), repeat_mode_(Repeat_Off), shuffle_mode_(Shuffle_Off), dynamic_(false) { ui_->setupUi(this); // Icons ui_->repeat->setIcon( AddDesaturatedIcon(IconLoader::Load("media-playlist-repeat"))); ui_->shuffle->setIcon( AddDesaturatedIcon(IconLoader::Load("media-playlist-shuffle"))); settings_->set_group(kSettingsGroup); QActionGroup* repeat_group = new QActionGroup(this); repeat_group->addAction(ui_->action_repeat_off); repeat_group->addAction(ui_->action_repeat_track); repeat_group->addAction(ui_->action_repeat_album); repeat_group->addAction(ui_->action_repeat_playlist); repeat_group->addAction(ui_->action_repeat_onebyone); repeat_group->addAction(ui_->action_repeat_intro); repeat_menu_->addActions(repeat_group->actions()); ui_->repeat->setMenu(repeat_menu_); QActionGroup* shuffle_group = new QActionGroup(this); shuffle_group->addAction(ui_->action_shuffle_off); shuffle_group->addAction(ui_->action_shuffle_all); shuffle_group->addAction(ui_->action_shuffle_inside_album); shuffle_group->addAction(ui_->action_shuffle_albums); shuffle_menu_->addActions(shuffle_group->actions()); ui_->shuffle->setMenu(shuffle_menu_); connect(repeat_group, SIGNAL(triggered(QAction*)), SLOT(RepeatActionTriggered(QAction*))); connect(shuffle_group, SIGNAL(triggered(QAction*)), SLOT(ShuffleActionTriggered(QAction*))); Load(); } PlaylistSequence::~PlaylistSequence() { delete ui_; } void PlaylistSequence::Load() { loading_ = true; // Stops these setter functions calling Save() SetShuffleMode( ShuffleMode(settings_->value("shuffle_mode", Shuffle_Off).toInt())); SetRepeatMode( RepeatMode(settings_->value("repeat_mode", Repeat_Off).toInt())); loading_ = false; } void PlaylistSequence::Save() { if (loading_) return; settings_->setValue("shuffle_mode", shuffle_mode_); settings_->setValue("repeat_mode", repeat_mode_); } QIcon PlaylistSequence::AddDesaturatedIcon(const QIcon& icon) { QIcon ret; for (const QSize& size : icon.availableSizes()) { QPixmap on(icon.pixmap(size)); QPixmap off(DesaturatedPixmap(on)); ret.addPixmap(off, QIcon::Normal, QIcon::Off); ret.addPixmap(on, QIcon::Normal, QIcon::On); } return ret; } QPixmap PlaylistSequence::DesaturatedPixmap(const QPixmap& pixmap) { QPixmap ret(pixmap.size()); ret.fill(Qt::transparent); QPainter p(&ret); p.setOpacity(0.5); p.drawPixmap(0, 0, pixmap); p.end(); return ret; } void PlaylistSequence::RepeatActionTriggered(QAction* action) { RepeatMode mode = Repeat_Off; if (action == ui_->action_repeat_track) mode = Repeat_Track; if (action == ui_->action_repeat_album) mode = Repeat_Album; if (action == ui_->action_repeat_playlist) mode = Repeat_Playlist; if (action == ui_->action_repeat_onebyone) mode = Repeat_OneByOne; if (action == ui_->action_repeat_intro) mode = Repeat_Intro; SetRepeatMode(mode); } void PlaylistSequence::ShuffleActionTriggered(QAction* action) { ShuffleMode mode = Shuffle_Off; if (action == ui_->action_shuffle_all) mode = Shuffle_All; if (action == ui_->action_shuffle_inside_album) mode = Shuffle_InsideAlbum; if (action == ui_->action_shuffle_albums) mode = Shuffle_Albums; SetShuffleMode(mode); } void PlaylistSequence::SetRepeatMode(RepeatMode mode) { ui_->repeat->setChecked(mode != Repeat_Off); switch (mode) { case Repeat_Off: ui_->action_repeat_off->setChecked(true); break; case Repeat_Track: ui_->action_repeat_track->setChecked(true); break; case Repeat_Album: ui_->action_repeat_album->setChecked(true); break; case Repeat_Playlist: ui_->action_repeat_playlist->setChecked(true); break; case Repeat_OneByOne: ui_->action_repeat_onebyone->setChecked(true); break; case Repeat_Intro: ui_->action_repeat_intro->setChecked(true); break; } if (mode != repeat_mode_) { repeat_mode_ = mode; emit RepeatModeChanged(mode); } Save(); } void PlaylistSequence::SetShuffleMode(ShuffleMode mode) { ui_->shuffle->setChecked(mode != Shuffle_Off); switch (mode) { case Shuffle_Off: ui_->action_shuffle_off->setChecked(true); break; case Shuffle_All: ui_->action_shuffle_all->setChecked(true); break; case Shuffle_InsideAlbum: ui_->action_shuffle_inside_album->setChecked(true); break; case Shuffle_Albums: ui_->action_shuffle_albums->setChecked(true); break; } if (mode != shuffle_mode_) { shuffle_mode_ = mode; emit ShuffleModeChanged(mode); } Save(); } void PlaylistSequence::SetUsingDynamicPlaylist(bool dynamic) { dynamic_ = dynamic; const QString not_available( tr("Not available while using a dynamic playlist")); setEnabled(!dynamic); ui_->shuffle->setToolTip(dynamic ? not_available : tr("Shuffle")); ui_->repeat->setToolTip(dynamic ? not_available : tr("Repeat")); } PlaylistSequence::ShuffleMode PlaylistSequence::shuffle_mode() const { return dynamic_ ? Shuffle_Off : shuffle_mode_; } PlaylistSequence::RepeatMode PlaylistSequence::repeat_mode() const { return dynamic_ ? Repeat_Off : repeat_mode_; } // called from global shortcut void PlaylistSequence::CycleShuffleMode() { ShuffleMode mode = Shuffle_Off; // we cycle through the shuffle modes switch (shuffle_mode()) { case Shuffle_Off: mode = Shuffle_All; break; case Shuffle_All: mode = Shuffle_InsideAlbum; break; case Shuffle_InsideAlbum: mode = Shuffle_Albums; break; case Shuffle_Albums: break; } SetShuffleMode(mode); } // called from global shortcut void PlaylistSequence::CycleRepeatMode() { RepeatMode mode = Repeat_Off; // we cycle through the repeat modes switch (repeat_mode()) { case Repeat_Off: mode = Repeat_Track; break; case Repeat_Track: mode = Repeat_Album; break; case Repeat_Album: mode = Repeat_Playlist; break; case Repeat_Playlist: mode = Repeat_OneByOne; break; case Repeat_OneByOne: mode = Repeat_Intro; break; case Repeat_Intro: break; } SetRepeatMode(mode); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistsequence.h000066400000000000000000000046201260417502300255640ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PLAYLISTSEQUENCE_H #define PLAYLISTSEQUENCE_H #include #include #include "core/settingsprovider.h" class QMenu; class Ui_PlaylistSequence; class PlaylistSequence : public QWidget { Q_OBJECT public: PlaylistSequence(QWidget* parent = nullptr, SettingsProvider* settings = 0); ~PlaylistSequence(); enum RepeatMode { Repeat_Off = 0, Repeat_Track = 1, Repeat_Album = 2, Repeat_Playlist = 3, Repeat_OneByOne = 4, Repeat_Intro = 5, }; enum ShuffleMode { Shuffle_Off = 0, Shuffle_All = 1, Shuffle_InsideAlbum = 2, Shuffle_Albums = 3, }; static const char* kSettingsGroup; RepeatMode repeat_mode() const; ShuffleMode shuffle_mode() const; QMenu* repeat_menu() const { return repeat_menu_; } QMenu* shuffle_menu() const { return shuffle_menu_; } public slots: void SetRepeatMode(PlaylistSequence::RepeatMode mode); void SetShuffleMode(PlaylistSequence::ShuffleMode mode); void CycleShuffleMode(); void CycleRepeatMode(); void SetUsingDynamicPlaylist(bool dynamic); signals: void RepeatModeChanged(PlaylistSequence::RepeatMode mode); void ShuffleModeChanged(PlaylistSequence::ShuffleMode mode); private slots: void RepeatActionTriggered(QAction*); void ShuffleActionTriggered(QAction*); private: void Load(); void Save(); static QIcon AddDesaturatedIcon(const QIcon& icon); static QPixmap DesaturatedPixmap(const QPixmap& pixmap); private: Ui_PlaylistSequence* ui_; std::unique_ptr settings_; QMenu* repeat_menu_; QMenu* shuffle_menu_; bool loading_; RepeatMode repeat_mode_; ShuffleMode shuffle_mode_; bool dynamic_; }; #endif // PLAYLISTSEQUENCE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistsequence.ui000066400000000000000000000072101260417502300257500ustar00rootroot00000000000000 PlaylistSequence 0 0 80 37 QToolButton, QToolButton:hover, QToolButton:pressed { border: 0px; background: transparent; } 0 0 Repeat 16 16 true QToolButton::InstantPopup Shuffle 16 16 true QToolButton::InstantPopup true true Don't repeat true Repeat track true Repeat album true Repeat playlist true Stop after each track true Intro tracks true true Don't shuffle true Shuffle tracks in this album true Shuffle all true Shuffle albums clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlisttabbar.cpp000066400000000000000000000312271260417502300255450ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "playlist.h" #include "playlistmanager.h" #include "playlisttabbar.h" #include "playlistview.h" #include "songmimedata.h" #include "core/logging.h" #include "internet/core/internetmimedata.h" #include "ui/iconloader.h" #include "widgets/renametablineedit.h" #include "widgets/favoritewidget.h" #include #include #include #include #include #include #include #include #include const char* PlaylistTabBar::kSettingsGroup = "PlaylistTabBar"; PlaylistTabBar::PlaylistTabBar(QWidget* parent) : QTabBar(parent), manager_(nullptr), menu_(new QMenu(this)), menu_index_(-1), suppress_current_changed_(false), initialized_(false), rename_editor_(new RenameTabLineEdit(this)) { setAcceptDrops(true); setElideMode(Qt::ElideRight); setUsesScrollButtons(true); setTabsClosable(true); close_ = menu_->addAction(IconLoader::Load("list-remove"), tr("Close playlist"), this, SLOT(Close())); rename_ = menu_->addAction(IconLoader::Load("edit-rename"), tr("Rename playlist..."), this, SLOT(Rename())); save_ = menu_->addAction(IconLoader::Load("document-save"), tr("Save playlist..."), this, SLOT(Save())); menu_->addSeparator(); rename_editor_->setVisible(false); connect(rename_editor_, SIGNAL(editingFinished()), SLOT(RenameInline())); connect(rename_editor_, SIGNAL(EditingCanceled()), SLOT(HideEditor())); connect(this, SIGNAL(currentChanged(int)), SLOT(CurrentIndexChanged(int))); connect(this, SIGNAL(tabMoved(int, int)), SLOT(TabMoved())); // We can't just emit Close signal, we need to extract the playlist id first connect(this, SIGNAL(tabCloseRequested(int)), SLOT(CloseFromTabIndex(int))); } void PlaylistTabBar::SetActions(QAction* new_playlist, QAction* load_playlist) { menu_->insertAction(0, new_playlist); menu_->insertAction(0, load_playlist); new_ = new_playlist; } void PlaylistTabBar::SetManager(PlaylistManager* manager) { manager_ = manager; connect(manager_, SIGNAL(PlaylistFavorited(int, bool)), SLOT(PlaylistFavoritedSlot(int, bool))); connect(manager_, SIGNAL(PlaylistManagerInitialized()), this, SLOT(PlaylistManagerInitialized())); } void PlaylistTabBar::PlaylistManagerInitialized() { // Signal that we are done loading and thus further changes should be // committed to the db. initialized_ = true; disconnect(manager_, SIGNAL(PlaylistManagerInitialized()), this, SLOT(PlaylistManagerInitialized())); } void PlaylistTabBar::contextMenuEvent(QContextMenuEvent* e) { // we need to finish the renaming action before showing context menu if (rename_editor_->isVisible()) { // discard any change HideEditor(); } menu_index_ = tabAt(e->pos()); rename_->setEnabled(menu_index_ != -1); close_->setEnabled(menu_index_ != -1 && count() > 1); save_->setEnabled(menu_index_ != -1); menu_->popup(e->globalPos()); } void PlaylistTabBar::mouseReleaseEvent(QMouseEvent* e) { if (e->button() == Qt::MidButton) { // Update menu index menu_index_ = tabAt(e->pos()); Close(); } QTabBar::mouseReleaseEvent(e); } void PlaylistTabBar::mouseDoubleClickEvent(QMouseEvent* e) { int index = tabAt(e->pos()); // discard a double click with the middle button if (e->button() != Qt::MidButton) { if (index == -1) { new_->activate(QAction::Trigger); } else { // update current tab menu_index_ = index; // set position rename_editor_->setGeometry(tabRect(index)); rename_editor_->setText(tabText(index)); rename_editor_->setVisible(true); rename_editor_->setFocus(); } } QTabBar::mouseDoubleClickEvent(e); } void PlaylistTabBar::Rename() { if (menu_index_ == -1) return; QString name = tabText(menu_index_); name = QInputDialog::getText(this, tr("Rename playlist"), tr("Enter a new name for this playlist"), QLineEdit::Normal, name); if (name.isNull()) return; emit Rename(tabData(menu_index_).toInt(), name); } void PlaylistTabBar::RenameInline() { emit Rename(tabData(menu_index_).toInt(), rename_editor_->text()); HideEditor(); } void PlaylistTabBar::HideEditor() { // editingFinished() will be called twice due to Qt bug #40, so we reuse the // same instance, don't delete it rename_editor_->setVisible(false); // hack to give back focus to playlist view manager_->SetCurrentPlaylist(manager_->current()->id()); } void PlaylistTabBar::Close() { if (menu_index_ == -1) return; const int playlist_id = tabData(menu_index_).toInt(); QSettings s; s.beginGroup(kSettingsGroup); const bool ask_for_delete = s.value("warn_close_playlist", true).toBool(); if (ask_for_delete && !manager_->IsPlaylistFavorite(playlist_id) && !manager_->playlist(playlist_id)->GetAllSongs().empty()) { QMessageBox confirmation_box; confirmation_box.setWindowIcon(QIcon(":/icon.png")); confirmation_box.setWindowTitle(tr("Remove playlist")); confirmation_box.setIcon(QMessageBox::Question); confirmation_box.setText( tr("You are about to remove a playlist which is not part of your " "favorite playlists: " "the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?")); confirmation_box.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel); QCheckBox dont_prompt_again(tr("Warn me when closing a playlist tab"), &confirmation_box); dont_prompt_again.setChecked(ask_for_delete); dont_prompt_again.blockSignals(true); dont_prompt_again.setToolTip( tr("This option can be changed in the \"Behavior\" preferences")); QGridLayout* grid = qobject_cast(confirmation_box.layout()); QDialogButtonBox* buttons = confirmation_box.findChild(); if (grid && buttons) { const int index = grid->indexOf(buttons); int row, column, row_span, column_span = 0; grid->getItemPosition(index, &row, &column, &row_span, &column_span); QLayoutItem* buttonsItem = grid->takeAt(index); grid->addWidget(&dont_prompt_again, row, column, row_span, column_span, Qt::AlignLeft | Qt::AlignTop); grid->addItem(buttonsItem, ++row, column, row_span, column_span); } else { confirmation_box.addButton(&dont_prompt_again, QMessageBox::ActionRole); } if (confirmation_box.exec() != QMessageBox::Yes) { return; } // If user changed the pref, save the new one if (dont_prompt_again.isChecked() != ask_for_delete) { s.setValue("warn_close_playlist", dont_prompt_again.isChecked()); } } // Close the playlist. If the playlist is not a favorite playlist, it will be // deleted, as it will not be visible after being closed. Otherwise, the tab // is closed but the playlist still exists and can be resurrected from the // "Playlists" tab. emit Close(playlist_id); // Select the nearest tab. if (menu_index_ > 1) { setCurrentIndex(menu_index_ - 1); } // Update playlist tab order/visibility TabMoved(); } void PlaylistTabBar::CloseFromTabIndex(int index) { // Update the global index menu_index_ = index; Close(); } void PlaylistTabBar::Save() { if (menu_index_ == -1) return; emit Save(tabData(menu_index_).toInt()); } int PlaylistTabBar::current_id() const { if (currentIndex() == -1) return -1; return tabData(currentIndex()).toInt(); } int PlaylistTabBar::index_of(int id) const { for (int i = 0; i < count(); ++i) { if (tabData(i).toInt() == id) { return i; } } return -1; } void PlaylistTabBar::set_current_id(int id) { setCurrentIndex(index_of(id)); } int PlaylistTabBar::id_of(int index) const { if (index < 0 || index >= count()) { qLog(Warning) << "Playlist tab index requested is out of bounds!"; return 0; } return tabData(index).toInt(); } void PlaylistTabBar::set_icon_by_id(int id, const QIcon& icon) { setTabIcon(index_of(id), icon); } void PlaylistTabBar::RemoveTab(int id) { removeTab(index_of(id)); } void PlaylistTabBar::set_text_by_id(int id, const QString& text) { setTabText(index_of(id), text); setTabToolTip(index_of(id), text); } void PlaylistTabBar::CurrentIndexChanged(int index) { if (!suppress_current_changed_) emit CurrentIdChanged(tabData(index).toInt()); } void PlaylistTabBar::InsertTab(int id, int index, const QString& text, bool favorite) { suppress_current_changed_ = true; insertTab(index, text); setTabData(index, id); setTabToolTip(index, text); FavoriteWidget* widget = new FavoriteWidget(id, favorite); widget->setToolTip( tr("Click here to favorite this playlist so it will be saved and remain " "accessible " "through the \"Playlists\" panel on the left side bar")); connect(widget, SIGNAL(FavoriteStateChanged(int, bool)), SIGNAL(PlaylistFavorited(int, bool))); setTabButton(index, QTabBar::LeftSide, widget); suppress_current_changed_ = false; // If we are still starting up, we don't need to do this, as the // tab ordering after startup will be the same as was already in the db. if (initialized_) { if (currentIndex() == index) emit CurrentIdChanged(id); // Update playlist tab order/visibility TabMoved(); } } void PlaylistTabBar::TabMoved() { QList ids; for (int i = 0; i < count(); ++i) { ids << tabData(i).toInt(); } emit PlaylistOrderChanged(ids); } void PlaylistTabBar::dragEnterEvent(QDragEnterEvent* e) { if (e->mimeData()->hasUrls() || e->mimeData()->hasFormat(Playlist::kRowsMimetype) || qobject_cast(e->mimeData())) { e->acceptProposedAction(); } } void PlaylistTabBar::dragMoveEvent(QDragMoveEvent* e) { drag_hover_tab_ = tabAt(e->pos()); if (drag_hover_tab_ != -1) { e->setDropAction(Qt::CopyAction); e->accept(tabRect(drag_hover_tab_)); if (!drag_hover_timer_.isActive()) drag_hover_timer_.start(kDragHoverTimeout, this); } else { drag_hover_timer_.stop(); } } void PlaylistTabBar::dragLeaveEvent(QDragLeaveEvent*) { drag_hover_timer_.stop(); } void PlaylistTabBar::timerEvent(QTimerEvent* e) { QTabBar::timerEvent(e); if (e->timerId() == drag_hover_timer_.timerId()) { drag_hover_timer_.stop(); if (drag_hover_tab_ != -1) setCurrentIndex(drag_hover_tab_); } } void PlaylistTabBar::dropEvent(QDropEvent* e) { if (drag_hover_tab_ == -1) { const MimeData* mime_data = qobject_cast(e->mimeData()); if (mime_data && !mime_data->name_for_new_playlist_.isEmpty()) { manager_->New(mime_data->name_for_new_playlist_); } else { manager_->New(tr("Playlist")); } setCurrentIndex(count() - 1); } else { setCurrentIndex(drag_hover_tab_); } manager_->current()->dropMimeData(e->mimeData(), e->proposedAction(), -1, 0, QModelIndex()); } bool PlaylistTabBar::event(QEvent* e) { switch (e->type()) { case QEvent::ToolTip: { QHelpEvent* he = static_cast(e); QRect displayed_tab; QSize real_tab; bool is_elided = false; real_tab = tabSizeHint(tabAt(he->pos())); displayed_tab = tabRect(tabAt(he->pos())); // Check whether the tab is elided or not is_elided = displayed_tab.width() < real_tab.width(); if (!is_elided) { // If it's not elided, don't show the tooltip QToolTip::hideText(); } else { QToolTip::showText(he->globalPos(), tabToolTip(tabAt(he->pos()))); } return true; } default: return QTabBar::event(e); } } void PlaylistTabBar::PlaylistFavoritedSlot(int id, bool favorite) { const int index = index_of(id); FavoriteWidget* favorite_widget = qobject_cast(tabButton(index, QTabBar::LeftSide)); if (favorite_widget) { favorite_widget->SetFavorite(favorite); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlisttabbar.h000066400000000000000000000061301260417502300252050ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PLAYLISTTABBAR_H #define PLAYLISTTABBAR_H #include #include #include class PlaylistManager; class RenameTabLineEdit; class QMenu; class PlaylistTabBar : public QTabBar { Q_OBJECT public: PlaylistTabBar(QWidget* parent = nullptr); static const int kDragHoverTimeout = 500; static const char* kSettingsGroup; void SetActions(QAction* new_playlist, QAction* load_playlist); void SetManager(PlaylistManager* manager); // We use IDs to refer to tabs so the tabs can be moved around (and their // indexes change). int index_of(int id) const; int current_id() const; int id_of(int index) const; // Utility functions that use IDs rather than indexes void set_current_id(int id); void set_icon_by_id(int id, const QIcon& icon); void set_text_by_id(int id, const QString& text); void RemoveTab(int id); void InsertTab(int id, int index, const QString& text, bool favorite); signals: void CurrentIdChanged(int id); void Rename(int id, const QString& name); void Close(int id); void Save(int id); void PlaylistOrderChanged(const QList& ids); void PlaylistFavorited(int id, bool favorite); protected: void contextMenuEvent(QContextMenuEvent* e); void mouseReleaseEvent(QMouseEvent* e); void mouseDoubleClickEvent(QMouseEvent* e); void dragEnterEvent(QDragEnterEvent* e); void dragMoveEvent(QDragMoveEvent* e); void dragLeaveEvent(QDragLeaveEvent* e); void dropEvent(QDropEvent* e); void timerEvent(QTimerEvent* e); bool event(QEvent* e); private slots: void CurrentIndexChanged(int index); void Rename(); void RenameInline(); void HideEditor(); void Close(); void CloseFromTabIndex(int index); // Used when playlist's favorite flag isn't changed from the favorite widget // (e.g. from the playlistlistcontainer): will update the favorite widget void PlaylistFavoritedSlot(int id, bool favorite); // Used to signal that the playlist manager is done starting up void PlaylistManagerInitialized(); void TabMoved(); void Save(); private: PlaylistManager* manager_; QMenu* menu_; int menu_index_; QAction* new_; QAction* rename_; QAction* close_; QAction* save_; QBasicTimer drag_hover_timer_; int drag_hover_tab_; bool suppress_current_changed_; bool initialized_; // Editor for inline renaming RenameTabLineEdit* rename_editor_; }; #endif // PLAYLISTTABBAR_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistundocommands.cpp000066400000000000000000000071051260417502300267770ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "playlistundocommands.h" #include "playlist.h" namespace PlaylistUndoCommands { Base::Base(Playlist* playlist) : QUndoCommand(0), playlist_(playlist) {} InsertItems::InsertItems(Playlist* playlist, const PlaylistItemList& items, int pos, bool enqueue) : Base(playlist), items_(items), pos_(pos), enqueue_(enqueue) { setText(tr("add %n songs", "", items_.count())); } void InsertItems::redo() { playlist_->InsertItemsWithoutUndo(items_, pos_, enqueue_); } void InsertItems::undo() { const int start = pos_ == -1 ? playlist_->rowCount() - items_.count() : pos_; playlist_->RemoveItemsWithoutUndo(start, items_.count()); } bool InsertItems::UpdateItem(const PlaylistItemPtr& updated_item) { for (int i = 0; i < items_.size(); i++) { PlaylistItemPtr item = items_[i]; if (item->Metadata().url() == updated_item->Metadata().url()) { items_[i] = updated_item; return true; } } return false; } RemoveItems::RemoveItems(Playlist* playlist, int pos, int count) : Base(playlist) { setText(tr("remove %n songs", "", count)); ranges_ << Range(pos, count); } void RemoveItems::redo() { for (int i = 0; i < ranges_.count(); ++i) ranges_[i].items_ = playlist_->RemoveItemsWithoutUndo(ranges_[i].pos_, ranges_[i].count_); } void RemoveItems::undo() { for (int i = ranges_.count() - 1; i >= 0; --i) playlist_->InsertItemsWithoutUndo(ranges_[i].items_, ranges_[i].pos_); } bool RemoveItems::mergeWith(const QUndoCommand* other) { const RemoveItems* remove_command = static_cast(other); ranges_.append(remove_command->ranges_); int sum = 0; for (const Range& range : ranges_) sum += range.count_; setText(tr("remove %n songs", "", sum)); return true; } MoveItems::MoveItems(Playlist* playlist, const QList& source_rows, int pos) : Base(playlist), source_rows_(source_rows), pos_(pos) { setText(tr("move %n songs", "", source_rows.count())); } void MoveItems::redo() { playlist_->MoveItemsWithoutUndo(source_rows_, pos_); } void MoveItems::undo() { playlist_->MoveItemsWithoutUndo(pos_, source_rows_); } ReOrderItems::ReOrderItems(Playlist* playlist, const PlaylistItemList& new_items) : Base(playlist), old_items_(playlist->items_), new_items_(new_items) {} void ReOrderItems::undo() { playlist_->ReOrderWithoutUndo(old_items_); } void ReOrderItems::redo() { playlist_->ReOrderWithoutUndo(new_items_); } SortItems::SortItems(Playlist* playlist, int column, Qt::SortOrder order, const PlaylistItemList& new_items) : ReOrderItems(playlist, new_items), column_(column), order_(order) { setText(tr("sort songs")); } ShuffleItems::ShuffleItems(Playlist* playlist, const PlaylistItemList& new_items) : ReOrderItems(playlist, new_items) { setText(tr("shuffle songs")); } } // namespace clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistundocommands.h000066400000000000000000000055461260417502300264530ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PLAYLISTUNDOCOMMANDS_H #define PLAYLISTUNDOCOMMANDS_H #include #include #include "playlistitem.h" class Playlist; namespace PlaylistUndoCommands { enum Types { Type_RemoveItems = 0, }; class Base : public QUndoCommand { Q_DECLARE_TR_FUNCTIONS(PlaylistUndoCommands); public: Base(Playlist* playlist); protected: Playlist* playlist_; }; class InsertItems : public Base { public: InsertItems(Playlist* playlist, const PlaylistItemList& items, int pos, bool enqueue = false); void undo(); void redo(); // When load is async, items have already been pushed, so we need to update // them. // This function try to find the equivalent item, and replace it with the // new (completely loaded) one. // return true if the was found (and updated), false otherwise bool UpdateItem(const PlaylistItemPtr& updated_item); private: PlaylistItemList items_; int pos_; bool enqueue_; }; class RemoveItems : public Base { public: RemoveItems(Playlist* playlist, int pos, int count); int id() const { return Type_RemoveItems; } void undo(); void redo(); bool mergeWith(const QUndoCommand* other); private: struct Range { Range(int pos, int count) : pos_(pos), count_(count) {} int pos_; int count_; PlaylistItemList items_; }; QList ranges_; }; class MoveItems : public Base { public: MoveItems(Playlist* playlist, const QList& source_rows, int pos); void undo(); void redo(); private: QList source_rows_; int pos_; }; class ReOrderItems : public Base { public: ReOrderItems(Playlist* playlist, const PlaylistItemList& new_items); void undo(); void redo(); private: PlaylistItemList old_items_; PlaylistItemList new_items_; }; class SortItems : public ReOrderItems { public: SortItems(Playlist* playlist, int column, Qt::SortOrder order, const PlaylistItemList& new_items); private: int column_; Qt::SortOrder order_; }; class ShuffleItems : public ReOrderItems { public: ShuffleItems(Playlist* playlist, const PlaylistItemList& new_items); }; } // namespace #endif // PLAYLISTUNDOCOMMANDS_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistview.cpp000066400000000000000000001340751260417502300252710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "config.h" #include "dynamicplaylistcontrols.h" #include "playlist.h" #include "playlistdelegates.h" #include "playlistheader.h" #include "playlistview.h" #include "core/application.h" #include "core/logging.h" #include "core/player.h" #include "covers/currentartloader.h" #include "ui/qt_blurimage.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_MOODBAR #include "moodbar/moodbaritemdelegate.h" #endif const int PlaylistView::kStateVersion = 6; const int PlaylistView::kGlowIntensitySteps = 24; const int PlaylistView::kAutoscrollGraceTimeout = 30; // seconds const int PlaylistView::kDropIndicatorWidth = 2; const int PlaylistView::kDropIndicatorGradientWidth = 5; const char* PlaylistView::kSettingBackgroundImageType = "playlistview_background_type"; const char* PlaylistView::kSettingBackgroundImageFilename = "playlistview_background_image_file"; const int PlaylistView::kDefaultBlurRadius = 0; const int PlaylistView::kDefaultOpacityLevel = 40; PlaylistProxyStyle::PlaylistProxyStyle(QStyle* base) : QProxyStyle(base), cleanlooks_(new QCleanlooksStyle) {} void PlaylistProxyStyle::drawControl(ControlElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget) const { if (element == CE_Header) { const QStyleOptionHeader* header_option = qstyleoption_cast(option); const QRect& rect = header_option->rect; const QString& text = header_option->text; const QFontMetrics& font_metrics = header_option->fontMetrics; // spaces added to make transition less abrupt if (rect.width() < font_metrics.width(text + " ")) { const Playlist::Column column = static_cast(header_option->section); QStyleOptionHeader new_option(*header_option); new_option.text = Playlist::abbreviated_column_name(column); QProxyStyle::drawControl(element, &new_option, painter, widget); return; } } if (element == CE_ItemViewItem) cleanlooks_->drawControl(element, option, painter, widget); else QProxyStyle::drawControl(element, option, painter, widget); } void PlaylistProxyStyle::drawPrimitive(PrimitiveElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget) const { if (element == QStyle::PE_PanelItemViewRow || element == QStyle::PE_PanelItemViewItem) cleanlooks_->drawPrimitive(element, option, painter, widget); else QProxyStyle::drawPrimitive(element, option, painter, widget); } PlaylistView::PlaylistView(QWidget* parent) : QTreeView(parent), app_(nullptr), style_(new PlaylistProxyStyle(style())), playlist_(nullptr), header_(new PlaylistHeader(Qt::Horizontal, this, this)), setting_initial_header_layout_(false), upgrading_from_qheaderview_(false), read_only_settings_(true), upgrading_from_version_(-1), background_image_type_(Default), previous_background_image_opacity_(0.0), fade_animation_(new QTimeLine(1000, this)), last_height_(-1), last_width_(-1), force_background_redraw_(false), glow_enabled_(true), currently_glowing_(false), glow_intensity_step_(0), rating_delegate_(nullptr), inhibit_autoscroll_timer_(new QTimer(this)), inhibit_autoscroll_(false), currently_autoscrolling_(false), row_height_(-1), currenttrack_play_(":currenttrack_play.png"), currenttrack_pause_(":currenttrack_pause.png"), cached_current_row_row_(-1), drop_indicator_row_(-1), drag_over_(false), dynamic_controls_(new DynamicPlaylistControls(this)) { setHeader(header_); header_->setMovable(true); setStyle(style_); setMouseTracking(true); connect(header_, SIGNAL(sectionResized(int, int, int)), SLOT(SaveGeometry())); connect(header_, SIGNAL(sectionMoved(int, int, int)), SLOT(SaveGeometry())); connect(header_, SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)), SLOT(SaveGeometry())); connect(header_, SIGNAL(SectionVisibilityChanged(int, bool)), SLOT(SaveGeometry())); connect(header_, SIGNAL(sectionResized(int, int, int)), SLOT(InvalidateCachedCurrentPixmap())); connect(header_, SIGNAL(sectionMoved(int, int, int)), SLOT(InvalidateCachedCurrentPixmap())); connect(header_, SIGNAL(SectionVisibilityChanged(int, bool)), SLOT(InvalidateCachedCurrentPixmap())); connect(header_, SIGNAL(StretchEnabledChanged(bool)), SLOT(SaveSettings())); connect(header_, SIGNAL(StretchEnabledChanged(bool)), SLOT(StretchChanged(bool))); connect(header_, SIGNAL(MouseEntered()), SLOT(RatingHoverOut())); inhibit_autoscroll_timer_->setInterval(kAutoscrollGraceTimeout * 1000); inhibit_autoscroll_timer_->setSingleShot(true); connect(inhibit_autoscroll_timer_, SIGNAL(timeout()), SLOT(InhibitAutoscrollTimeout())); horizontalScrollBar()->installEventFilter(this); verticalScrollBar()->installEventFilter(this); setAlternatingRowColors(true); setAttribute(Qt::WA_MacShowFocusRect, false); dynamic_controls_->hide(); #ifdef Q_OS_DARWIN setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); #endif // For fading connect(fade_animation_, SIGNAL(valueChanged(qreal)), SLOT(FadePreviousBackgroundImage(qreal))); fade_animation_->setDirection(QTimeLine::Backward); // 1.0 -> 0.0 } void PlaylistView::SetApplication(Application* app) { Q_ASSERT(app); app_ = app; connect(app_->current_art_loader(), SIGNAL(ArtLoaded(const Song&, const QString&, const QImage&)), SLOT(CurrentSongChanged(const Song&, const QString&, const QImage&))); connect(app_->player(), SIGNAL(Paused()), SLOT(StopGlowing())); connect(app_->player(), SIGNAL(Playing()), SLOT(StartGlowing())); connect(app_->player(), SIGNAL(Stopped()), SLOT(StopGlowing())); connect(app_->player(), SIGNAL(Stopped()), SLOT(PlayerStopped())); } void PlaylistView::SetItemDelegates(LibraryBackend* backend) { rating_delegate_ = new RatingItemDelegate(this); setItemDelegate(new PlaylistDelegateBase(this)); setItemDelegateForColumn(Playlist::Column_Title, new TextItemDelegate(this)); setItemDelegateForColumn( Playlist::Column_Album, new TagCompletionItemDelegate(this, backend, Playlist::Column_Album)); setItemDelegateForColumn( Playlist::Column_Artist, new TagCompletionItemDelegate(this, backend, Playlist::Column_Artist)); setItemDelegateForColumn(Playlist::Column_AlbumArtist, new TagCompletionItemDelegate( this, backend, Playlist::Column_AlbumArtist)); setItemDelegateForColumn( Playlist::Column_Genre, new TagCompletionItemDelegate(this, backend, Playlist::Column_Genre)); setItemDelegateForColumn( Playlist::Column_Composer, new TagCompletionItemDelegate(this, backend, Playlist::Column_Composer)); setItemDelegateForColumn( Playlist::Column_Performer, new TagCompletionItemDelegate(this, backend, Playlist::Column_Performer)); setItemDelegateForColumn( Playlist::Column_Grouping, new TagCompletionItemDelegate(this, backend, Playlist::Column_Grouping)); setItemDelegateForColumn(Playlist::Column_Length, new LengthItemDelegate(this)); setItemDelegateForColumn(Playlist::Column_Filesize, new SizeItemDelegate(this)); setItemDelegateForColumn(Playlist::Column_Filetype, new FileTypeItemDelegate(this)); setItemDelegateForColumn(Playlist::Column_DateCreated, new DateItemDelegate(this)); setItemDelegateForColumn(Playlist::Column_DateModified, new DateItemDelegate(this)); setItemDelegateForColumn(Playlist::Column_BPM, new PlaylistDelegateBase(this, tr("bpm"))); setItemDelegateForColumn(Playlist::Column_Samplerate, new PlaylistDelegateBase(this, ("Hz"))); setItemDelegateForColumn(Playlist::Column_Bitrate, new PlaylistDelegateBase(this, tr("kbps"))); setItemDelegateForColumn(Playlist::Column_Filename, new NativeSeparatorsDelegate(this)); setItemDelegateForColumn(Playlist::Column_Rating, rating_delegate_); setItemDelegateForColumn(Playlist::Column_LastPlayed, new LastPlayedItemDelegate(this)); #ifdef HAVE_MOODBAR setItemDelegateForColumn(Playlist::Column_Mood, new MoodbarItemDelegate(app_, this, this)); #endif if (app_ && app_->player()) { setItemDelegateForColumn(Playlist::Column_Source, new SongSourceDelegate(this, app_->player())); } else { header_->HideSection(Playlist::Column_Source); } } void PlaylistView::SetPlaylist(Playlist* playlist) { if (playlist_) { disconnect(playlist_, SIGNAL(CurrentSongChanged(Song)), this, SLOT(MaybeAutoscroll())); disconnect(playlist_, SIGNAL(DynamicModeChanged(bool)), this, SLOT(DynamicModeChanged(bool))); disconnect(playlist_, SIGNAL(destroyed()), this, SLOT(PlaylistDestroyed())); disconnect(playlist_, SIGNAL(QueueChanged()), this, SLOT(update())); disconnect(dynamic_controls_, SIGNAL(Expand()), playlist_, SLOT(ExpandDynamicPlaylist())); disconnect(dynamic_controls_, SIGNAL(Repopulate()), playlist_, SLOT(RepopulateDynamicPlaylist())); disconnect(dynamic_controls_, SIGNAL(TurnOff()), playlist_, SLOT(TurnOffDynamicPlaylist())); } playlist_ = playlist; LoadGeometry(); ReloadSettings(); DynamicModeChanged(playlist->is_dynamic()); setFocus(); read_only_settings_ = false; JumpToLastPlayedTrack(); connect(playlist_, SIGNAL(RestoreFinished()), SLOT(JumpToLastPlayedTrack())); connect(playlist_, SIGNAL(CurrentSongChanged(Song)), SLOT(MaybeAutoscroll())); connect(playlist_, SIGNAL(DynamicModeChanged(bool)), SLOT(DynamicModeChanged(bool))); connect(playlist_, SIGNAL(destroyed()), SLOT(PlaylistDestroyed())); connect(playlist_, SIGNAL(QueueChanged()), SLOT(update())); connect(dynamic_controls_, SIGNAL(Expand()), playlist_, SLOT(ExpandDynamicPlaylist())); connect(dynamic_controls_, SIGNAL(Repopulate()), playlist_, SLOT(RepopulateDynamicPlaylist())); connect(dynamic_controls_, SIGNAL(TurnOff()), playlist_, SLOT(TurnOffDynamicPlaylist())); } void PlaylistView::setModel(QAbstractItemModel* m) { if (model()) { disconnect(model(), SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SLOT(InvalidateCachedCurrentPixmap())); disconnect(model(), SIGNAL(layoutAboutToBeChanged()), this, SLOT(RatingHoverOut())); // When changing the model, always invalidate the current pixmap. // If a remote client uses "stop after", without invaliding the stop // mark would not appear. InvalidateCachedCurrentPixmap(); } QTreeView::setModel(m); connect(model(), SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SLOT(InvalidateCachedCurrentPixmap())); connect(model(), SIGNAL(layoutAboutToBeChanged()), this, SLOT(RatingHoverOut())); } void PlaylistView::LoadGeometry() { QSettings settings; settings.beginGroup(Playlist::kSettingsGroup); QByteArray state(settings.value("state").toByteArray()); if (!header_->RestoreState(state)) { // Maybe we're upgrading from a version that persisted the state with // QHeaderView. if (!header_->restoreState(state)) { header_->HideSection(Playlist::Column_Disc); header_->HideSection(Playlist::Column_Year); header_->HideSection(Playlist::Column_OriginalYear); header_->HideSection(Playlist::Column_Genre); header_->HideSection(Playlist::Column_BPM); header_->HideSection(Playlist::Column_Bitrate); header_->HideSection(Playlist::Column_Samplerate); header_->HideSection(Playlist::Column_Filename); header_->HideSection(Playlist::Column_Filesize); header_->HideSection(Playlist::Column_Filetype); header_->HideSection(Playlist::Column_DateCreated); header_->HideSection(Playlist::Column_DateModified); header_->HideSection(Playlist::Column_AlbumArtist); header_->HideSection(Playlist::Column_Composer); header_->HideSection(Playlist::Column_Performer); header_->HideSection(Playlist::Column_Grouping); header_->HideSection(Playlist::Column_Rating); header_->HideSection(Playlist::Column_PlayCount); header_->HideSection(Playlist::Column_SkipCount); header_->HideSection(Playlist::Column_LastPlayed); header_->moveSection(header_->visualIndex(Playlist::Column_Track), 0); setting_initial_header_layout_ = true; } else { upgrading_from_qheaderview_ = true; } } // New columns that we add are visible by default if the user has upgraded // Clementine. Hide them again here const int state_version = settings.value("state_version", 0).toInt(); upgrading_from_version_ = state_version; if (state_version < 1) { header_->HideSection(Playlist::Column_Rating); header_->HideSection(Playlist::Column_PlayCount); header_->HideSection(Playlist::Column_SkipCount); header_->HideSection(Playlist::Column_LastPlayed); } if (state_version < 2) { header_->HideSection(Playlist::Column_Score); } if (state_version < 3) { header_->HideSection(Playlist::Column_Comment); } if (state_version < 5) { header_->HideSection(Playlist::Column_Mood); } if (state_version < 6) { header_->HideSection(Playlist::Column_Performer); header_->HideSection(Playlist::Column_Grouping); } // Make sure at least one column is visible bool all_hidden = true; for (int i = 0; i < header_->count(); ++i) { if (!header_->isSectionHidden(i) && header_->sectionSize(i) > 0) { all_hidden = false; break; } } if (all_hidden) { header_->ShowSection(Playlist::Column_Title); } } void PlaylistView::SaveGeometry() { if (read_only_settings_) return; QSettings settings; settings.beginGroup(Playlist::kSettingsGroup); settings.setValue("state", header_->SaveState()); settings.setValue("state_version", kStateVersion); } void PlaylistView::ReloadBarPixmaps() { currenttrack_bar_left_ = LoadBarPixmap(":currenttrack_bar_left.png"); currenttrack_bar_mid_ = LoadBarPixmap(":currenttrack_bar_mid.png"); currenttrack_bar_right_ = LoadBarPixmap(":currenttrack_bar_right.png"); } QList PlaylistView::LoadBarPixmap(const QString& filename) { QImage image(filename); image = image.scaledToHeight(row_height_, Qt::SmoothTransformation); // Colour the bar with the palette colour QPainter p(&image); p.setCompositionMode(QPainter::CompositionMode_SourceAtop); p.setOpacity(0.7); p.fillRect(image.rect(), QApplication::palette().color(QPalette::Highlight)); p.end(); // Animation steps QList ret; for (int i = 0; i < kGlowIntensitySteps; ++i) { QImage step(image.copy()); p.begin(&step); p.setCompositionMode(QPainter::CompositionMode_SourceAtop); p.setOpacity(0.4 - 0.6 * sin(float(i) / kGlowIntensitySteps * (M_PI / 2))); p.fillRect(step.rect(), Qt::white); p.end(); ret << QPixmap::fromImage(step); } return ret; } void PlaylistView::drawTree(QPainter* painter, const QRegion& region) const { const_cast(this)->current_paint_region_ = region; QTreeView::drawTree(painter, region); const_cast(this)->current_paint_region_ = QRegion(); } void PlaylistView::drawRow(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { QStyleOptionViewItemV4 opt(option); bool is_current = index.data(Playlist::Role_IsCurrent).toBool(); bool is_paused = index.data(Playlist::Role_IsPaused).toBool(); if (is_current) { const_cast(this)->last_current_item_ = index; const_cast(this)->last_glow_rect_ = opt.rect; int step = glow_intensity_step_; if (step >= kGlowIntensitySteps) step = 2 * (kGlowIntensitySteps - 1) - step + 1; int row_height = opt.rect.height(); if (row_height != row_height_) { // Recreate the pixmaps if the height changed since last time const_cast(this)->row_height_ = row_height; const_cast(this)->ReloadBarPixmaps(); } QRect middle(opt.rect); middle.setLeft(middle.left() + currenttrack_bar_left_[0].width()); middle.setRight(middle.right() - currenttrack_bar_right_[0].width()); // Selection if (selectionModel()->isSelected(index)) painter->fillRect(opt.rect, opt.palette.color(QPalette::Highlight)); // Draw the bar painter->drawPixmap(opt.rect.topLeft(), currenttrack_bar_left_[step]); painter->drawPixmap( opt.rect.topRight() - currenttrack_bar_right_[0].rect().topRight(), currenttrack_bar_right_[step]); painter->drawPixmap(middle, currenttrack_bar_mid_[step]); // Draw the play icon QPoint play_pos(currenttrack_bar_left_[0].width() / 3 * 2, (row_height - currenttrack_play_.height()) / 2); painter->drawPixmap(opt.rect.topLeft() + play_pos, is_paused ? currenttrack_pause_ : currenttrack_play_); // Set the font opt.palette.setColor(QPalette::Text, QApplication::palette().color( QPalette::HighlightedText)); opt.palette.setColor(QPalette::Highlight, Qt::transparent); opt.palette.setColor(QPalette::AlternateBase, Qt::transparent); opt.decorationSize = QSize(20, 20); // Draw the actual row data on top. We cache this, because it's fairly // expensive (1-2ms), and we do it many times per second. const bool cache_dirty = cached_current_row_rect_ != opt.rect || cached_current_row_row_ != index.row() || cached_current_row_.isNull(); // We can't update the cache if we're not drawing the entire region, // QTreeView clips its drawing to only the columns in the region, so it // wouldn't update the whole pixmap properly. const bool whole_region = current_paint_region_.boundingRect().width() == viewport()->width(); if (!cache_dirty) { painter->drawPixmap(opt.rect, cached_current_row_); } else { if (whole_region) { const_cast(this) ->UpdateCachedCurrentRowPixmap(opt, index); painter->drawPixmap(opt.rect, cached_current_row_); } else { QTreeView::drawRow(painter, opt, index); } } } else { QTreeView::drawRow(painter, opt, index); } } void PlaylistView::UpdateCachedCurrentRowPixmap(QStyleOptionViewItemV4 option, const QModelIndex& index) { cached_current_row_rect_ = option.rect; cached_current_row_row_ = index.row(); option.rect.moveTo(0, 0); cached_current_row_ = QPixmap(option.rect.size()); cached_current_row_.fill(Qt::transparent); QPainter p(&cached_current_row_); QTreeView::drawRow(&p, option, index); } void PlaylistView::InvalidateCachedCurrentPixmap() { cached_current_row_ = QPixmap(); } void PlaylistView::timerEvent(QTimerEvent* event) { QTreeView::timerEvent(event); if (event->timerId() == glow_timer_.timerId()) GlowIntensityChanged(); } void PlaylistView::GlowIntensityChanged() { glow_intensity_step_ = (glow_intensity_step_ + 1) % (kGlowIntensitySteps * 2); viewport()->update(last_glow_rect_); } void PlaylistView::StopGlowing() { currently_glowing_ = false; glow_timer_.stop(); glow_intensity_step_ = kGlowIntensitySteps; } void PlaylistView::StartGlowing() { currently_glowing_ = true; if (isVisible() && glow_enabled_) glow_timer_.start(1500 / kGlowIntensitySteps, this); } void PlaylistView::hideEvent(QHideEvent*) { glow_timer_.stop(); } void PlaylistView::showEvent(QShowEvent*) { if (currently_glowing_ && glow_enabled_) glow_timer_.start(1500 / kGlowIntensitySteps, this); MaybeAutoscroll(); } bool CompareSelectionRanges(const QItemSelectionRange& a, const QItemSelectionRange& b) { return b.bottom() < a.bottom(); } void PlaylistView::keyPressEvent(QKeyEvent* event) { if (!model() || state() == QAbstractItemView::EditingState) { QTreeView::keyPressEvent(event); } else if (event == QKeySequence::Delete) { RemoveSelected(); event->accept(); #ifdef Q_OS_DARWIN } else if (event->key() == Qt::Key_Backspace) { RemoveSelected(); event->accept(); #endif } else if (event == QKeySequence::Copy) { CopyCurrentSongToClipboard(); } else if (event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return) { if (currentIndex().isValid()) emit PlayItem(currentIndex()); event->accept(); } else if (event->modifiers() != Qt::ControlModifier // Ctrl+Space selects // the item && event->key() == Qt::Key_Space) { emit PlayPause(); event->accept(); } else if (event->key() == Qt::Key_Left) { emit SeekBackward(); event->accept(); } else if (event->key() == Qt::Key_Right) { emit SeekForward(); event->accept(); } else if (event->modifiers() == Qt::NoModifier // No modifier keys currently pressed... // ... and key pressed is something related to text && ((event->key() >= Qt::Key_Exclam && event->key() <= Qt::Key_Z) || event->key() == Qt::Key_Backspace || event->key() == Qt::Key_Escape)) { emit FocusOnFilterSignal(event); event->accept(); } else { QTreeView::keyPressEvent(event); } } void PlaylistView::contextMenuEvent(QContextMenuEvent* e) { emit RightClicked(e->globalPos(), indexAt(e->pos())); e->accept(); } void PlaylistView::RemoveSelected() { int rows_removed = 0; QItemSelection selection(selectionModel()->selection()); if (selection.isEmpty()) { return; } // Store the last selected row, which is the last in the list int last_row = selection.last().top(); // Sort the selection so we remove the items at the *bottom* first, ensuring // we don't have to mess around with changing row numbers qSort(selection.begin(), selection.end(), CompareSelectionRanges); for (const QItemSelectionRange& range : selection) { if (range.top() < last_row) rows_removed += range.height(); model()->removeRows(range.top(), range.height(), range.parent()); } int new_row = last_row - rows_removed; // Index of the first column for the row to select QModelIndex new_index = model()->index(new_row, 0); // Select the new current item, we want always the item after the last // selected if (new_index.isValid()) { // Workaround to update keyboard selected row, if it's not the first row // (this also triggers selection) if (new_row != 0) keyPressEvent( new QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier)); // Update visual selection with the entire row selectionModel()->select(new_index, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); } else { // We're removing the last item, select the new last row selectionModel()->select( model()->index(model()->rowCount() - 1, 0), QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); } } QList PlaylistView::GetEditableColumns() { QList columns; QHeaderView* h = header(); for (int col = 0; col < h->count(); col++) { if (h->isSectionHidden(col)) continue; QModelIndex index = model()->index(0, col); if (index.flags() & Qt::ItemIsEditable) columns << h->visualIndex(col); } qSort(columns); return columns; } QModelIndex PlaylistView::NextEditableIndex(const QModelIndex& current) { QList columns = GetEditableColumns(); QHeaderView* h = header(); int index = columns.indexOf(h->visualIndex(current.column())); if (index + 1 >= columns.size()) return model()->index(current.row() + 1, h->logicalIndex(columns.first())); return model()->index(current.row(), h->logicalIndex(columns[index + 1])); } QModelIndex PlaylistView::PrevEditableIndex(const QModelIndex& current) { QList columns = GetEditableColumns(); QHeaderView* h = header(); int index = columns.indexOf(h->visualIndex(current.column())); if (index - 1 < 0) return model()->index(current.row() - 1, h->logicalIndex(columns.last())); return model()->index(current.row(), h->logicalIndex(columns[index - 1])); } void PlaylistView::closeEditor(QWidget* editor, QAbstractItemDelegate::EndEditHint hint) { if (hint == QAbstractItemDelegate::NoHint) { QTreeView::closeEditor(editor, QAbstractItemDelegate::SubmitModelCache); } else if (hint == QAbstractItemDelegate::EditNextItem || hint == QAbstractItemDelegate::EditPreviousItem) { QModelIndex index; if (hint == QAbstractItemDelegate::EditNextItem) index = NextEditableIndex(currentIndex()); else index = PrevEditableIndex(currentIndex()); if (!index.isValid()) { QTreeView::closeEditor(editor, QAbstractItemDelegate::SubmitModelCache); } else { QTreeView::closeEditor(editor, QAbstractItemDelegate::NoHint); setCurrentIndex(index); edit(index); } } else { QTreeView::closeEditor(editor, hint); } } void PlaylistView::mouseMoveEvent(QMouseEvent* event) { QModelIndex index = indexAt(event->pos()); if (index.isValid() && index.data(Playlist::Role_CanSetRating).toBool()) { RatingHoverIn(index, event->pos()); } else if (rating_delegate_->is_mouse_over()) { RatingHoverOut(); } if (!drag_over_) { QTreeView::mouseMoveEvent(event); } } void PlaylistView::leaveEvent(QEvent* e) { if (rating_delegate_->is_mouse_over()) { RatingHoverOut(); } QTreeView::leaveEvent(e); } void PlaylistView::RatingHoverIn(const QModelIndex& index, const QPoint& pos) { if (editTriggers() & QAbstractItemView::NoEditTriggers) { return; } const QModelIndex old_index = rating_delegate_->mouse_over_index(); rating_delegate_->set_mouse_over(index, selectedIndexes(), pos); setCursor(Qt::PointingHandCursor); update(index); update(old_index); for (const QModelIndex& index : selectedIndexes()) { if (index.column() == Playlist::Column_Rating) { update(index); } } if (index.data(Playlist::Role_IsCurrent).toBool() || old_index.data(Playlist::Role_IsCurrent).toBool()) { InvalidateCachedCurrentPixmap(); } } void PlaylistView::RatingHoverOut() { if (editTriggers() & QAbstractItemView::NoEditTriggers) { return; } const QModelIndex old_index = rating_delegate_->mouse_over_index(); rating_delegate_->set_mouse_out(); setCursor(QCursor()); update(old_index); for (const QModelIndex& index : selectedIndexes()) { if (index.column() == Playlist::Column_Rating) { update(index); } } if (old_index.data(Playlist::Role_IsCurrent).toBool()) { InvalidateCachedCurrentPixmap(); } } void PlaylistView::mousePressEvent(QMouseEvent* event) { if (editTriggers() & QAbstractItemView::NoEditTriggers) { QTreeView::mousePressEvent(event); return; } QModelIndex index = indexAt(event->pos()); if (event->button() == Qt::LeftButton && index.isValid() && index.data(Playlist::Role_CanSetRating).toBool()) { // Calculate which star was clicked double new_rating = RatingPainter::RatingForPos(event->pos(), visualRect(index)); if (selectedIndexes().contains(index)) { // Update all the selected items QModelIndexList src_index_list; for (const QModelIndex& index : selectedIndexes()) { if (index.data(Playlist::Role_CanSetRating).toBool()) { QModelIndex src_index = playlist_->proxy()->mapToSource(index); src_index_list << src_index; } } playlist_->RateSongs(src_index_list, new_rating); } else { // Update only this item playlist_->RateSong(playlist_->proxy()->mapToSource(index), new_rating); } } else { QTreeView::mousePressEvent(event); } inhibit_autoscroll_ = true; inhibit_autoscroll_timer_->start(); } void PlaylistView::scrollContentsBy(int dx, int dy) { if (dx) { InvalidateCachedCurrentPixmap(); } cached_tree_ = QPixmap(); QTreeView::scrollContentsBy(dx, dy); if (!currently_autoscrolling_) { // We only want to do this if the scroll was initiated by the user inhibit_autoscroll_ = true; inhibit_autoscroll_timer_->start(); } } void PlaylistView::InhibitAutoscrollTimeout() { // For 30 seconds after the user clicks on or scrolls the playlist we promise // not to automatically scroll the view to keep up with a track change. inhibit_autoscroll_ = false; } void PlaylistView::MaybeAutoscroll() { if (!inhibit_autoscroll_) JumpToCurrentlyPlayingTrack(); } void PlaylistView::JumpToCurrentlyPlayingTrack() { Q_ASSERT(playlist_); // Usage of the "Jump to the currently playing track" action shall enable // autoscroll inhibit_autoscroll_ = false; if (playlist_->current_row() == -1) return; QModelIndex current = playlist_->proxy()->mapFromSource( playlist_->index(playlist_->current_row(), 0)); if (!current.isValid()) return; currently_autoscrolling_ = true; // Scroll to the item scrollTo(current, QAbstractItemView::PositionAtCenter); currently_autoscrolling_ = false; } void PlaylistView::JumpToLastPlayedTrack() { Q_ASSERT(playlist_); if (playlist_->last_played_row() == -1) return; QModelIndex last_played = playlist_->proxy()->mapFromSource( playlist_->index(playlist_->last_played_row(), 0)); if (!last_played.isValid()) return; // Select last played song last_current_item_ = last_played; setCurrentIndex(last_current_item_); currently_autoscrolling_ = true; // Scroll to the item scrollTo(last_played, QAbstractItemView::PositionAtCenter); currently_autoscrolling_ = false; } void PlaylistView::paintEvent(QPaintEvent* event) { // Reimplemented to draw the background image. // Reimplemented also to draw the drop indicator // When the user is dragging some stuff over the playlist paintEvent gets // called for the entire viewport every time the user moves the mouse. // The drawTree is kinda expensive, so we cache the result and draw from the // cache while the user is dragging. The cached pixmap gets invalidated in // dragLeaveEvent, dropEvent and scrollContentsBy. // Draw background if (background_image_type_ == Custom || background_image_type_ == AlbumCover) { if (!background_image_.isNull() || !previous_background_image_.isNull()) { QPainter background_painter(viewport()); // Check if we should recompute the background image if (height() != last_height_ || width() != last_width_ || force_background_redraw_) { if (background_image_.isNull()) { cached_scaled_background_image_ = QPixmap(); } else { cached_scaled_background_image_ = QPixmap::fromImage(background_image_.scaled( width(), height(), Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation)); } last_height_ = height(); last_width_ = width(); force_background_redraw_ = false; } // Actually draw the background image if (!cached_scaled_background_image_.isNull()) { // Set opactiy only if needed, as this deactivate hardware acceleration if (!qFuzzyCompare(previous_background_image_opacity_, qreal(0.0))) { background_painter.setOpacity(1.0 - previous_background_image_opacity_); } background_painter.drawPixmap( (width() - cached_scaled_background_image_.width()) / 2, (height() - cached_scaled_background_image_.height()) / 2, cached_scaled_background_image_); } // Draw the previous background image if we're fading if (!previous_background_image_.isNull()) { background_painter.setOpacity(previous_background_image_opacity_); background_painter.drawPixmap( (width() - previous_background_image_.width()) / 2, (height() - previous_background_image_.height()) / 2, previous_background_image_); } } } QPainter p(viewport()); if (drop_indicator_row_ != -1) { if (cached_tree_.isNull()) { cached_tree_ = QPixmap(size()); cached_tree_.fill(Qt::transparent); QPainter cache_painter(&cached_tree_); drawTree(&cache_painter, event->region()); } p.drawPixmap(0, 0, cached_tree_); } else { drawTree(&p, event->region()); return; } const int first_column = header_->logicalIndex(0); // Find the y position of the drop indicator QModelIndex drop_index = model()->index(drop_indicator_row_, first_column); int drop_pos = -1; switch (dropIndicatorPosition()) { case QAbstractItemView::OnItem: return; // Don't draw anything case QAbstractItemView::AboveItem: drop_pos = visualRect(drop_index).top(); break; case QAbstractItemView::BelowItem: drop_pos = visualRect(drop_index).bottom() + 1; break; case QAbstractItemView::OnViewport: if (model()->rowCount() == 0) drop_pos = 1; else drop_pos = 1 + visualRect(model()->index(model()->rowCount() - 1, first_column)).bottom(); break; } // Draw a nice gradient first QColor line_color(QApplication::palette().color(QPalette::Highlight)); QColor shadow_color(line_color.lighter(140)); QColor shadow_fadeout_color(shadow_color); shadow_color.setAlpha(255); shadow_fadeout_color.setAlpha(0); QLinearGradient gradient(QPoint(0, drop_pos - kDropIndicatorGradientWidth), QPoint(0, drop_pos + kDropIndicatorGradientWidth)); gradient.setColorAt(0.0, shadow_fadeout_color); gradient.setColorAt(0.5, shadow_color); gradient.setColorAt(1.0, shadow_fadeout_color); QPen gradient_pen(QBrush(gradient), kDropIndicatorGradientWidth * 2); p.setPen(gradient_pen); p.drawLine(QPoint(0, drop_pos), QPoint(width(), drop_pos)); // Now draw the line on top QPen line_pen(line_color, kDropIndicatorWidth); p.setPen(line_pen); p.drawLine(QPoint(0, drop_pos), QPoint(width(), drop_pos)); } void PlaylistView::dragMoveEvent(QDragMoveEvent* event) { QTreeView::dragMoveEvent(event); QModelIndex index(indexAt(event->pos())); drop_indicator_row_ = index.isValid() ? index.row() : 0; } void PlaylistView::dragEnterEvent(QDragEnterEvent* event) { QTreeView::dragEnterEvent(event); cached_tree_ = QPixmap(); drag_over_ = true; } void PlaylistView::dragLeaveEvent(QDragLeaveEvent* event) { QTreeView::dragLeaveEvent(event); cached_tree_ = QPixmap(); drag_over_ = false; drop_indicator_row_ = -1; } void PlaylistView::dropEvent(QDropEvent* event) { QTreeView::dropEvent(event); cached_tree_ = QPixmap(); drop_indicator_row_ = -1; drag_over_ = false; } void PlaylistView::PlaylistDestroyed() { playlist_ = nullptr; // We'll get a SetPlaylist() soon } void PlaylistView::ReloadSettings() { QSettings s; s.beginGroup(Playlist::kSettingsGroup); glow_enabled_ = s.value("glow_effect", true).toBool(); if (setting_initial_header_layout_ || upgrading_from_qheaderview_) { header_->SetStretchEnabled(s.value("stretch", true).toBool()); upgrading_from_qheaderview_ = false; } if (currently_glowing_ && glow_enabled_ && isVisible()) StartGlowing(); if (!glow_enabled_) StopGlowing(); if (setting_initial_header_layout_) { header_->SetColumnWidth(Playlist::Column_Length, 0.06); header_->SetColumnWidth(Playlist::Column_Track, 0.05); setting_initial_header_layout_ = false; } if (upgrading_from_version_ != -1) { if (upgrading_from_version_ < 4) { header_->SetColumnWidth(Playlist::Column_Source, 0.05); } upgrading_from_version_ = -1; } column_alignment_ = s.value("column_alignments").value(); if (column_alignment_.isEmpty()) { column_alignment_ = DefaultColumnAlignment(); } emit ColumnAlignmentChanged(column_alignment_); // Background: QVariant q_playlistview_background_type = s.value(kSettingBackgroundImageType); BackgroundImageType background_type(Default); // bg_enabled should also be checked for backward compatibility (in releases // <= 1.0, there was just a boolean to activate/deactivate the background) QVariant bg_enabled = s.value("bg_enabled"); if (q_playlistview_background_type.isValid()) { background_type = static_cast( q_playlistview_background_type.toInt()); } else if (bg_enabled.isValid()) { if (bg_enabled.toBool()) { background_type = Default; } else { background_type = None; } } QString background_image_filename = s.value(kSettingBackgroundImageFilename).toString(); int blur_radius = s.value("blur_radius", kDefaultBlurRadius).toInt(); int opacity_level = s.value("opacity_level", kDefaultOpacityLevel).toInt(); // Check if background properties have changed. // We change properties only if they have actually changed, to avoid to call // set_background_image when it is not needed, as this will cause the fading // animation to start again. This also avoid to do useless // "force_background_redraw". if (background_image_filename != background_image_filename_ || background_type != background_image_type_ || blur_radius_ != blur_radius || opacity_level_ != opacity_level) { // Store background properties background_image_type_ = background_type; background_image_filename_ = background_image_filename; blur_radius_ = blur_radius; opacity_level_ = opacity_level; if (background_image_type_ == Custom) { set_background_image(QImage(background_image_filename)); } else if (background_image_type_ == AlbumCover) { set_background_image(current_song_cover_art_); } else { // User changed background image type to something that will not be // painted through paintEvent: reset all background images. // This avoid to use old (deprecated) images for fading when selecting // AlbumCover or Custom background image type later. set_background_image(QImage()); cached_scaled_background_image_ = QPixmap(); previous_background_image_ = QPixmap(); } setProperty("default_background_enabled", background_image_type_ == Default); emit BackgroundPropertyChanged(); force_background_redraw_ = true; } if (!s.value("click_edit_inline", true).toBool()) setEditTriggers(editTriggers() & ~QAbstractItemView::SelectedClicked); else setEditTriggers(editTriggers() | QAbstractItemView::SelectedClicked); } void PlaylistView::SaveSettings() { if (read_only_settings_) return; QSettings s; s.beginGroup(Playlist::kSettingsGroup); s.setValue("glow_effect", glow_enabled_); s.setValue("column_alignments", QVariant::fromValue(column_alignment_)); s.setValue(kSettingBackgroundImageType, background_image_type_); } void PlaylistView::StretchChanged(bool stretch) { setHorizontalScrollBarPolicy(stretch ? Qt::ScrollBarAlwaysOff : Qt::ScrollBarAsNeeded); SaveGeometry(); } void PlaylistView::DynamicModeChanged(bool dynamic) { if (!dynamic) { dynamic_controls_->hide(); } else { RepositionDynamicControls(); dynamic_controls_->show(); } } void PlaylistView::resizeEvent(QResizeEvent* e) { QTreeView::resizeEvent(e); if (dynamic_controls_->isVisible()) { RepositionDynamicControls(); } } void PlaylistView::RepositionDynamicControls() { dynamic_controls_->resize(dynamic_controls_->sizeHint()); dynamic_controls_->move((width() - dynamic_controls_->width()) / 2, height() - dynamic_controls_->height() - 20); } bool PlaylistView::eventFilter(QObject* object, QEvent* event) { if (event->type() == QEvent::Enter && (object == horizontalScrollBar() || object == verticalScrollBar())) { RatingHoverOut(); return false; } return QObject::eventFilter(object, event); } void PlaylistView::rowsInserted(const QModelIndex& parent, int start, int end) { const bool at_end = end == model()->rowCount(parent) - 1; QTreeView::rowsInserted(parent, start, end); if (at_end) { // If the rows were inserted at the end of the playlist then let's scroll // the view so the user can see. scrollTo(model()->index(start, 0, parent), QAbstractItemView::PositionAtTop); } } ColumnAlignmentMap PlaylistView::DefaultColumnAlignment() { ColumnAlignmentMap ret; ret[Playlist::Column_Length] = ret[Playlist::Column_Track] = ret[Playlist::Column_Disc] = ret[Playlist::Column_Year] = ret[Playlist::Column_BPM] = ret[Playlist::Column_Bitrate] = ret[Playlist::Column_Samplerate] = ret[Playlist::Column_Filesize] = ret[Playlist::Column_PlayCount] = ret[Playlist::Column_SkipCount] = ret[Playlist::Column_OriginalYear] = (Qt::AlignRight | Qt::AlignVCenter); ret[Playlist::Column_Score] = (Qt::AlignCenter); return ret; } void PlaylistView::SetColumnAlignment(int section, Qt::Alignment alignment) { if (section < 0) return; column_alignment_[section] = alignment; emit ColumnAlignmentChanged(column_alignment_); SaveSettings(); } Qt::Alignment PlaylistView::column_alignment(int section) const { return column_alignment_.value(section, Qt::AlignLeft | Qt::AlignVCenter); } void PlaylistView::CopyCurrentSongToClipboard() const { // Get the display text of all visible columns. QStringList columns; for (int i = 0; i < header()->count(); ++i) { if (header()->isSectionHidden(i)) { continue; } const QVariant data = model()->data(currentIndex().sibling(currentIndex().row(), i)); if (data.type() == QVariant::String) { columns << data.toString(); } } // Get the song's URL const QUrl url = model() ->data(currentIndex().sibling(currentIndex().row(), Playlist::Column_Filename)) .toUrl(); QMimeData* mime_data = new QMimeData; mime_data->setUrls(QList() << url); mime_data->setText(columns.join(" - ")); QApplication::clipboard()->setMimeData(mime_data); } void PlaylistView::CurrentSongChanged(const Song& song, const QString& uri, const QImage& song_art) { if (current_song_cover_art_ == song_art) return; current_song_cover_art_ = song_art; if (background_image_type_ == AlbumCover) { if (song.art_automatic().isEmpty() && song.art_manual().isEmpty()) { set_background_image(QImage()); } else { set_background_image(current_song_cover_art_); } force_background_redraw_ = true; update(); } } void PlaylistView::set_background_image(const QImage& image) { // Save previous image, for fading previous_background_image_ = cached_scaled_background_image_; if (image.isNull() || image.format() == QImage::Format_ARGB32) { background_image_ = image; } else { background_image_ = image.convertToFormat(QImage::Format_ARGB32); } if (!background_image_.isNull()) { // Apply opacity filter uchar* bits = background_image_.bits(); for (int i = 0; i < background_image_.height() * background_image_.bytesPerLine(); i += 4) { bits[i + 3] = (opacity_level_ / 100.0) * 255; } if (blur_radius_ != 0) { QImage blurred(background_image_.size(), QImage::Format_ARGB32_Premultiplied); blurred.fill(Qt::transparent); QPainter blur_painter(&blurred); qt_blurImage(&blur_painter, background_image_, blur_radius_, true, false); blur_painter.end(); background_image_ = blurred; } } if (isVisible()) { previous_background_image_opacity_ = 1.0; fade_animation_->start(); } } void PlaylistView::FadePreviousBackgroundImage(qreal value) { previous_background_image_opacity_ = value; if (qFuzzyCompare(previous_background_image_opacity_, qreal(0.0))) { previous_background_image_ = QPixmap(); previous_background_image_opacity_ = 0.0; } update(); } void PlaylistView::PlayerStopped() { CurrentSongChanged(Song(), QString(), QImage()); } void PlaylistView::focusInEvent(QFocusEvent* event) { QTreeView::focusInEvent(event); if (event->reason() == Qt::TabFocusReason || event->reason() == Qt::BacktabFocusReason) { // If there's a current item but no selection it probably means the list was // filtered, and the selected item does not match the filter. If there's // only 1 item in the view it is now impossible to select that item without // using the mouse. const QModelIndex& current = selectionModel()->currentIndex(); if (current.isValid() && selectionModel()->selectedIndexes().isEmpty()) { QItemSelection new_selection( current.sibling(current.row(), 0), current.sibling(current.row(), current.model()->columnCount(current.parent()) - 1)); selectionModel()->select(new_selection, QItemSelectionModel::Select); } } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/playlistview.h000066400000000000000000000177401260417502300247350ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PLAYLISTVIEW_H #define PLAYLISTVIEW_H #include #include #include #include #include "playlist.h" class QCleanlooksStyle; class Application; class DynamicPlaylistControls; class LibraryBackend; class PlaylistHeader; class RadioLoadingIndicator; class RatingItemDelegate; class QTimeLine; // This proxy style works around a bug/feature introduced in Qt 4.7's QGtkStyle // that uses Gtk to paint row backgrounds, ignoring any custom brush or palette // the caller set in the QStyleOption. That breaks our currently playing track // animation, which relies on the background painted by Qt to be transparent. // This proxy style uses QCleanlooksStyle to paint the affected elements. // This class is used by the global search view as well. class PlaylistProxyStyle : public QProxyStyle { public: PlaylistProxyStyle(QStyle* base); void drawControl(ControlElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget) const; void drawPrimitive(PrimitiveElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget) const; private: std::unique_ptr cleanlooks_; }; class PlaylistView : public QTreeView { Q_OBJECT public: enum BackgroundImageType { Default, None, Custom, AlbumCover }; PlaylistView(QWidget* parent = nullptr); static const int kStateVersion; // Constants for settings: are persistent, values should not be changed static const char* kSettingBackgroundImageType; static const char* kSettingBackgroundImageFilename; static const int kDefaultBlurRadius; static const int kDefaultOpacityLevel; static ColumnAlignmentMap DefaultColumnAlignment(); void SetApplication(Application* app); void SetItemDelegates(LibraryBackend* backend); void SetPlaylist(Playlist* playlist); void RemoveSelected(); void SetReadOnlySettings(bool read_only) { read_only_settings_ = read_only; } Playlist* playlist() const { return playlist_; } BackgroundImageType background_image_type() const { return background_image_type_; } Qt::Alignment column_alignment(int section) const; // QTreeView void drawTree(QPainter* painter, const QRegion& region) const; void drawRow(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; void setModel(QAbstractItemModel* model); public slots: void ReloadSettings(); void StopGlowing(); void StartGlowing(); void JumpToCurrentlyPlayingTrack(); void JumpToLastPlayedTrack(); void closeEditor(QWidget* editor, QAbstractItemDelegate::EndEditHint hint); void DynamicModeChanged(bool dynamic); void SetColumnAlignment(int section, Qt::Alignment alignment); void CopyCurrentSongToClipboard() const; void CurrentSongChanged(const Song& new_song, const QString& uri, const QImage& cover_art); void PlayerStopped(); signals: void PlayItem(const QModelIndex& index); void PlayPause(); void RightClicked(const QPoint& global_pos, const QModelIndex& index); void SeekForward(); void SeekBackward(); void FocusOnFilterSignal(QKeyEvent* event); void BackgroundPropertyChanged(); void ColumnAlignmentChanged(const ColumnAlignmentMap& alignment); protected: // QWidget void keyPressEvent(QKeyEvent* event); void contextMenuEvent(QContextMenuEvent* e); void hideEvent(QHideEvent* event); void showEvent(QShowEvent* event); void timerEvent(QTimerEvent* event); void mouseMoveEvent(QMouseEvent* event); void mousePressEvent(QMouseEvent* event); void leaveEvent(QEvent*); void paintEvent(QPaintEvent* event); void dragMoveEvent(QDragMoveEvent* event); void dragEnterEvent(QDragEnterEvent* event); void dragLeaveEvent(QDragLeaveEvent* event); void dropEvent(QDropEvent* event); void resizeEvent(QResizeEvent* event); bool eventFilter(QObject* object, QEvent* event); void focusInEvent(QFocusEvent* event); // QAbstractScrollArea void scrollContentsBy(int dx, int dy); // QAbstractItemView void rowsInserted(const QModelIndex& parent, int start, int end); private slots: void LoadGeometry(); void SaveGeometry(); void GlowIntensityChanged(); void InhibitAutoscrollTimeout(); void MaybeAutoscroll(); void InvalidateCachedCurrentPixmap(); void PlaylistDestroyed(); void SaveSettings(); void StretchChanged(bool stretch); void RatingHoverIn(const QModelIndex& index, const QPoint& pos); void RatingHoverOut(); void FadePreviousBackgroundImage(qreal value); private: void ReloadBarPixmaps(); QList LoadBarPixmap(const QString& filename); void UpdateCachedCurrentRowPixmap(QStyleOptionViewItemV4 option, const QModelIndex& index); void set_background_image_type(BackgroundImageType bg) { background_image_type_ = bg; emit BackgroundPropertyChanged(); } // Save image as the background_image_ after applying some modifications // (opacity, ...). // Should be used instead of modifying background_image_ directly void set_background_image(const QImage& image); private: static const int kGlowIntensitySteps; static const int kAutoscrollGraceTimeout; static const int kDropIndicatorWidth; static const int kDropIndicatorGradientWidth; QList GetEditableColumns(); QModelIndex NextEditableIndex(const QModelIndex& current); QModelIndex PrevEditableIndex(const QModelIndex& current); void RepositionDynamicControls(); Application* app_; PlaylistProxyStyle* style_; Playlist* playlist_; PlaylistHeader* header_; bool setting_initial_header_layout_; bool upgrading_from_qheaderview_; bool read_only_settings_; int upgrading_from_version_; BackgroundImageType background_image_type_; // Stores the background image to be displayed. As we want this image to be // particular (in terms of format, opacity), you should probably use // set_background_image_type instead of modifying background_image_ directly QImage background_image_; int blur_radius_; int opacity_level_; // Used if background image is a filemane QString background_image_filename_; QImage current_song_cover_art_; QPixmap cached_scaled_background_image_; // For fading when image change QPixmap previous_background_image_; qreal previous_background_image_opacity_; QTimeLine* fade_animation_; // To know if we should redraw the background or not int last_height_; int last_width_; bool force_background_redraw_; bool glow_enabled_; bool currently_glowing_; QBasicTimer glow_timer_; int glow_intensity_step_; QModelIndex last_current_item_; QRect last_glow_rect_; RatingItemDelegate* rating_delegate_; QTimer* inhibit_autoscroll_timer_; bool inhibit_autoscroll_; bool currently_autoscrolling_; int row_height_; // Used to invalidate the currenttrack_bar pixmaps QList currenttrack_bar_left_; QList currenttrack_bar_mid_; QList currenttrack_bar_right_; QPixmap currenttrack_play_; QPixmap currenttrack_pause_; QRegion current_paint_region_; QPixmap cached_current_row_; QRect cached_current_row_rect_; int cached_current_row_row_; QPixmap cached_tree_; int drop_indicator_row_; bool drag_over_; DynamicPlaylistControls* dynamic_controls_; ColumnAlignmentMap column_alignment_; }; #endif // PLAYLISTVIEW_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/queue.cpp000066400000000000000000000234561260417502300236610ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "queue.h" #include #include #include const char* Queue::kRowsMimetype = "application/x-clementine-queue-rows"; Queue::Queue(QObject* parent) : QAbstractProxyModel(parent) {} QModelIndex Queue::mapFromSource(const QModelIndex& source_index) const { if (!source_index.isValid()) return QModelIndex(); const int source_row = source_index.row(); for (int i = 0; i < source_indexes_.count(); ++i) { if (source_indexes_[i].row() == source_row) return index(i, source_index.column()); } return QModelIndex(); } bool Queue::ContainsSourceRow(int source_row) const { for (int i = 0; i < source_indexes_.count(); ++i) { if (source_indexes_[i].row() == source_row) return true; } return false; } QModelIndex Queue::mapToSource(const QModelIndex& proxy_index) const { if (!proxy_index.isValid()) return QModelIndex(); return source_indexes_[proxy_index.row()]; } void Queue::setSourceModel(QAbstractItemModel* source_model) { if (sourceModel()) { disconnect(sourceModel(), SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SLOT(SourceDataChanged(QModelIndex, QModelIndex))); disconnect(sourceModel(), SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(SourceLayoutChanged())); disconnect(sourceModel(), SIGNAL(layoutChanged()), this, SLOT(SourceLayoutChanged())); } QAbstractProxyModel::setSourceModel(source_model); connect(sourceModel(), SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SLOT(SourceDataChanged(QModelIndex, QModelIndex))); connect(sourceModel(), SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(SourceLayoutChanged())); connect(sourceModel(), SIGNAL(layoutChanged()), this, SLOT(SourceLayoutChanged())); } void Queue::SourceDataChanged(const QModelIndex& top_left, const QModelIndex& bottom_right) { for (int row = top_left.row(); row <= bottom_right.row(); ++row) { QModelIndex proxy_index = mapFromSource(sourceModel()->index(row, 0)); if (!proxy_index.isValid()) continue; emit dataChanged(proxy_index, proxy_index); } } void Queue::SourceLayoutChanged() { for (int i = 0; i < source_indexes_.count(); ++i) { if (!source_indexes_[i].isValid()) { beginRemoveRows(QModelIndex(), i, i); source_indexes_.removeAt(i); endRemoveRows(); --i; } } } QModelIndex Queue::index(int row, int column, const QModelIndex& parent) const { return createIndex(row, column); } QModelIndex Queue::parent(const QModelIndex& child) const { return QModelIndex(); } int Queue::rowCount(const QModelIndex& parent) const { if (parent.isValid()) return 0; return source_indexes_.count(); } int Queue::columnCount(const QModelIndex&) const { return 1; } QVariant Queue::data(const QModelIndex& proxy_index, int role) const { QModelIndex source_index = source_indexes_[proxy_index.row()]; switch (role) { case Playlist::Role_QueuePosition: return proxy_index.row(); case Qt::DisplayRole: { const QString artist = source_index.sibling(source_index.row(), Playlist::Column_Artist) .data() .toString(); const QString title = source_index.sibling(source_index.row(), Playlist::Column_Title) .data() .toString(); if (artist.isEmpty()) return title; return QString(artist + " - " + title); } default: return QVariant(); } } void Queue::ToggleTracks(const QModelIndexList& source_indexes) { for (const QModelIndex& source_index : source_indexes) { QModelIndex proxy_index = mapFromSource(source_index); if (proxy_index.isValid()) { // Dequeue the track const int row = proxy_index.row(); beginRemoveRows(QModelIndex(), row, row); source_indexes_.removeAt(row); endRemoveRows(); } else { // Enqueue the track const int row = source_indexes_.count(); beginInsertRows(QModelIndex(), row, row); source_indexes_ << QPersistentModelIndex(source_index); endInsertRows(); } } } int Queue::PositionOf(const QModelIndex& source_index) const { return mapFromSource(source_index).row(); } bool Queue::is_empty() const { return source_indexes_.isEmpty(); } void Queue::Clear() { if (source_indexes_.isEmpty()) return; beginRemoveRows(QModelIndex(), 0, source_indexes_.count() - 1); source_indexes_.clear(); endRemoveRows(); } void Queue::Move(const QList& proxy_rows, int pos) { layoutAboutToBeChanged(); QList moved_items; // Take the items out of the list first, keeping track of whether the // insertion point changes int offset = 0; for (int row : proxy_rows) { moved_items << source_indexes_.takeAt(row - offset); if (pos != -1 && pos >= row) pos--; offset++; } // Put the items back in const int start = pos == -1 ? source_indexes_.count() : pos; for (int i = start; i < start + moved_items.count(); ++i) { source_indexes_.insert(i, moved_items[i - start]); } // Update persistent indexes for (const QModelIndex& pidx : persistentIndexList()) { const int dest_offset = proxy_rows.indexOf(pidx.row()); if (dest_offset != -1) { // This index was moved changePersistentIndex( pidx, index(start + dest_offset, pidx.column(), QModelIndex())); } else { int d = 0; for (int row : proxy_rows) { if (pidx.row() > row) d--; } if (pidx.row() + d >= start) d += proxy_rows.count(); changePersistentIndex( pidx, index(pidx.row() + d, pidx.column(), QModelIndex())); } } layoutChanged(); } void Queue::MoveUp(int row) { Move(QList() << row, row - 1); } void Queue::MoveDown(int row) { Move(QList() << row, row + 2); } QStringList Queue::mimeTypes() const { return QStringList() << kRowsMimetype << Playlist::kRowsMimetype; } Qt::DropActions Queue::supportedDropActions() const { return Qt::MoveAction | Qt::CopyAction | Qt::LinkAction; } QMimeData* Queue::mimeData(const QModelIndexList& indexes) const { QMimeData* data = new QMimeData; QList rows; for (const QModelIndex& index : indexes) { if (index.column() != 0) continue; rows << index.row(); } QBuffer buf; buf.open(QIODevice::WriteOnly); QDataStream stream(&buf); stream << rows; buf.close(); data->setData(kRowsMimetype, buf.data()); return data; } bool Queue::dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int, const QModelIndex&) { if (action == Qt::IgnoreAction) return false; if (data->hasFormat(kRowsMimetype)) { // Dragged from the queue QList proxy_rows; QDataStream stream(data->data(kRowsMimetype)); stream >> proxy_rows; qStableSort(proxy_rows); // Make sure we take them in order Move(proxy_rows, row); } else if (data->hasFormat(Playlist::kRowsMimetype)) { // Dragged from the playlist Playlist* playlist = nullptr; QList source_rows; QDataStream stream(data->data(Playlist::kRowsMimetype)); stream.readRawData(reinterpret_cast(&playlist), sizeof(playlist)); stream >> source_rows; QModelIndexList source_indexes; for (int source_row : source_rows) { const QModelIndex source_index = sourceModel()->index(source_row, 0); const QModelIndex proxy_index = mapFromSource(source_index); if (proxy_index.isValid()) { // This row was already in the queue, so no need to add it again continue; } source_indexes << source_index; } if (!source_indexes.isEmpty()) { const int insert_point = row == -1 ? source_indexes_.count() : row; beginInsertRows(QModelIndex(), insert_point, insert_point + source_indexes.count() - 1); for (int i = 0; i < source_indexes.count(); ++i) { source_indexes_.insert(insert_point + i, source_indexes[i]); } endInsertRows(); } } return true; } Qt::ItemFlags Queue::flags(const QModelIndex& index) const { Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable; if (index.isValid()) flags |= Qt::ItemIsDragEnabled; else flags |= Qt::ItemIsDropEnabled; return flags; } int Queue::PeekNext() const { if (source_indexes_.isEmpty()) return -1; return source_indexes_.first().row(); } int Queue::TakeNext() { if (source_indexes_.isEmpty()) return -1; beginRemoveRows(QModelIndex(), 0, 0); int ret = source_indexes_.takeFirst().row(); endRemoveRows(); return ret; } QVariant Queue::headerData(int section, Qt::Orientation orientation, int role) const { return QVariant(); } void Queue::Remove(QList& proxy_rows) { // order the rows qStableSort(proxy_rows); // reflects immediately changes in the playlist layoutAboutToBeChanged(); int removed_rows = 0; for (int row : proxy_rows) { // after the first row, the row number needs to be updated const int real_row = row - removed_rows; beginRemoveRows(QModelIndex(), real_row, real_row); source_indexes_.removeAt(real_row); endRemoveRows(); removed_rows++; } layoutChanged(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/queue.h000066400000000000000000000051321260417502300233150ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef QUEUE_H #define QUEUE_H #include "playlist.h" #include class Queue : public QAbstractProxyModel { Q_OBJECT public: Queue(QObject* parent = nullptr); static const char* kRowsMimetype; // Query the queue bool is_empty() const; int PositionOf(const QModelIndex& source_index) const; bool ContainsSourceRow(int source_row) const; int PeekNext() const; // Modify the queue int TakeNext(); void ToggleTracks(const QModelIndexList& source_indexes); void Clear(); void Move(const QList& proxy_rows, int pos); void MoveUp(int row); void MoveDown(int row); void Remove(QList& proxy_rows); // QAbstractProxyModel void setSourceModel(QAbstractItemModel* source_model); QModelIndex mapFromSource(const QModelIndex& source_index) const; QModelIndex mapToSource(const QModelIndex& proxy_index) const; // QAbstractItemModel QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const; QModelIndex parent(const QModelIndex& child) const; int rowCount(const QModelIndex& parent = QModelIndex()) const; int columnCount(const QModelIndex& parent = QModelIndex()) const; QVariant data(const QModelIndex& proxy_index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role) const; QStringList mimeTypes() const; Qt::DropActions supportedDropActions() const; QMimeData* mimeData(const QModelIndexList& indexes) const; bool dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent); Qt::ItemFlags flags(const QModelIndex& index) const; private slots: void SourceDataChanged(const QModelIndex& top_left, const QModelIndex& bottom_right); void SourceLayoutChanged(); private: QList source_indexes_; }; #endif // QUEUE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/queuemanager.cpp000066400000000000000000000121531260417502300252040ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "playlist.h" #include "playlistdelegates.h" #include "playlistmanager.h" #include "queue.h" #include "queuemanager.h" #include "ui_queuemanager.h" #include "ui/iconloader.h" #include #include QueueManager::QueueManager(QWidget* parent) : QDialog(parent), ui_(new Ui_QueueManager), playlists_(nullptr), current_playlist_(nullptr) { ui_->setupUi(this); ui_->list->setItemDelegate(new QueuedItemDelegate(this, 0)); // Set icons on buttons ui_->move_down->setIcon(IconLoader::Load("go-down")); ui_->move_up->setIcon(IconLoader::Load("go-up")); ui_->remove->setIcon(IconLoader::Load("edit-delete")); ui_->clear->setIcon(IconLoader::Load("edit-clear-list")); // Set a standard shortcut ui_->remove->setShortcut(QKeySequence::Delete); // Button connections connect(ui_->move_down, SIGNAL(clicked()), SLOT(MoveDown())); connect(ui_->move_up, SIGNAL(clicked()), SLOT(MoveUp())); connect(ui_->remove, SIGNAL(clicked()), SLOT(Remove())); connect(ui_->clear, SIGNAL(clicked()), SLOT(Clear())); QShortcut* close = new QShortcut(QKeySequence::Close, this); connect(close, SIGNAL(activated()), SLOT(close())); } QueueManager::~QueueManager() { delete ui_; } void QueueManager::SetPlaylistManager(PlaylistManager* manager) { playlists_ = manager; connect(playlists_, SIGNAL(CurrentChanged(Playlist*)), SLOT(CurrentPlaylistChanged(Playlist*))); CurrentPlaylistChanged(playlists_->current()); } void QueueManager::CurrentPlaylistChanged(Playlist* playlist) { if (current_playlist_) { disconnect(current_playlist_->queue(), SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(UpdateButtonState())); disconnect(current_playlist_->queue(), SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(UpdateButtonState())); disconnect(current_playlist_->queue(), SIGNAL(layoutChanged()), this, SLOT(UpdateButtonState())); disconnect(current_playlist_, SIGNAL(destroyed()), this, SLOT(PlaylistDestroyed())); } current_playlist_ = playlist; connect(current_playlist_->queue(), SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(UpdateButtonState())); connect(current_playlist_->queue(), SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(UpdateButtonState())); connect(current_playlist_->queue(), SIGNAL(layoutChanged()), this, SLOT(UpdateButtonState())); connect(current_playlist_, SIGNAL(destroyed()), this, SLOT(PlaylistDestroyed())); ui_->list->setModel(current_playlist_->queue()); connect(ui_->list->selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex)), SLOT(UpdateButtonState())); } void QueueManager::MoveUp() { QModelIndexList indexes = ui_->list->selectionModel()->selectedRows(); qStableSort(indexes); if (indexes.isEmpty() || indexes.first().row() == 0) return; for (const QModelIndex& index : indexes) { current_playlist_->queue()->MoveUp(index.row()); } } void QueueManager::MoveDown() { QModelIndexList indexes = ui_->list->selectionModel()->selectedRows(); qStableSort(indexes); if (indexes.isEmpty() || indexes.last().row() == current_playlist_->queue()->rowCount() - 1) return; for (int i = indexes.count() - 1; i >= 0; --i) { current_playlist_->queue()->MoveDown(indexes[i].row()); } } void QueueManager::Clear() { current_playlist_->queue()->Clear(); } void QueueManager::Remove() { // collect the rows to be removed QList row_list; for (const QModelIndex& index : ui_->list->selectionModel()->selectedRows()) { if (index.isValid()) row_list << index.row(); } current_playlist_->queue()->Remove(row_list); } void QueueManager::UpdateButtonState() { const QModelIndex current = ui_->list->selectionModel()->currentIndex(); if (current.isValid()) { ui_->move_up->setEnabled(current.row() != 0); ui_->move_down->setEnabled(current.row() != current_playlist_->queue()->rowCount() - 1); ui_->remove->setEnabled(true); } else { ui_->move_up->setEnabled(false); ui_->move_down->setEnabled(false); ui_->remove->setEnabled(false); } ui_->clear->setEnabled(!current_playlist_->queue()->is_empty()); } void QueueManager::PlaylistDestroyed() { current_playlist_ = nullptr; // We'll get another CurrentPlaylistChanged() soon } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/queuemanager.h000066400000000000000000000025431260417502300246530ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef QUEUEMANAGER_H #define QUEUEMANAGER_H #include class Playlist; class PlaylistManager; class Ui_QueueManager; class QModelIndex; class QueueManager : public QDialog { Q_OBJECT public: QueueManager(QWidget* parent = nullptr); ~QueueManager(); void SetPlaylistManager(PlaylistManager* manager); private slots: void CurrentPlaylistChanged(Playlist* playlist); void PlaylistDestroyed(); void UpdateButtonState(); void MoveUp(); void MoveDown(); void Remove(); void Clear(); private: Ui_QueueManager* ui_; PlaylistManager* playlists_; Playlist* current_playlist_; }; #endif // QUEUEMANAGER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/queuemanager.ui000066400000000000000000000117571260417502300250500ustar00rootroot00000000000000 QueueManager 0 0 582 363 Queue Manager :/icon.png:/icon.png true true true QAbstractItemView::DragDrop Qt::MoveAction true QAbstractItemView::ExtendedSelection QAbstractItemView::SelectRows false false false Move up 16 16 Ctrl+Up false Move down 16 16 Ctrl+Down false Remove false Clear 16 16 Ctrl+K Qt::Vertical 20 40 Qt::Horizontal QDialogButtonBox::Close buttonBox accepted() QueueManager accept() 248 254 157 274 buttonBox rejected() QueueManager reject() 316 260 286 274 clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/songloaderinserter.cpp000066400000000000000000000132401260417502300264340ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include #include "playlist.h" #include "songloaderinserter.h" #include "core/logging.h" #include "core/songloader.h" #include "core/taskmanager.h" SongLoaderInserter::SongLoaderInserter(TaskManager* task_manager, LibraryBackendInterface* library, const Player* player) : task_manager_(task_manager), destination_(nullptr), row_(-1), play_now_(true), enqueue_(false), library_(library), player_(player) {} SongLoaderInserter::~SongLoaderInserter() { qDeleteAll(pending_); } void SongLoaderInserter::Load(Playlist* destination, int row, bool play_now, bool enqueue, const QList& urls) { destination_ = destination; row_ = row; play_now_ = play_now; enqueue_ = enqueue; connect(destination, SIGNAL(destroyed()), SLOT(DestinationDestroyed())); connect(this, SIGNAL(PreloadFinished()), SLOT(InsertSongs())); connect(this, SIGNAL(EffectiveLoadFinished(const SongList&)), destination, SLOT(UpdateItems(const SongList&))); for (const QUrl& url : urls) { SongLoader* loader = new SongLoader(library_, player_, this); SongLoader::Result ret = loader->Load(url); if (ret == SongLoader::BlockingLoadRequired) { pending_.append(loader); continue; } if (ret == SongLoader::Success) songs_ << loader->songs(); else emit Error(tr("Error loading %1").arg(url.toString())); delete loader; } if (pending_.isEmpty()) { InsertSongs(); deleteLater(); } else { QtConcurrent::run(this, &SongLoaderInserter::AsyncLoad); } } // Load audio CD tracks: // First, we add tracks (without metadata) into the playlist // In the meantime, MusicBrainz will be queried to get songs' metadata. // AudioCDTagsLoaded will be called next, and playlist's items will be updated. void SongLoaderInserter::LoadAudioCD(Playlist* destination, int row, bool play_now, bool enqueue) { destination_ = destination; row_ = row; play_now_ = play_now; enqueue_ = enqueue; SongLoader* loader = new SongLoader(library_, player_, this); NewClosure(loader, SIGNAL(AudioCDTracksLoaded()), this, SLOT(AudioCDTracksLoaded(SongLoader*)), loader); connect(loader, SIGNAL(LoadAudioCDFinished(bool)), SLOT(AudioCDTagsLoaded(bool))); qLog(Info) << "Loading audio CD..."; SongLoader::Result ret = loader->LoadAudioCD(); if (ret == SongLoader::Error) { emit Error(tr("Error while loading audio CD")); delete loader; } // Songs will be loaded later: see AudioCDTracksLoaded and AudioCDTagsLoaded slots } void SongLoaderInserter::DestinationDestroyed() { destination_ = nullptr; } void SongLoaderInserter::AudioCDTracksLoaded(SongLoader* loader) { songs_ = loader->songs(); InsertSongs(); } void SongLoaderInserter::AudioCDTagsLoaded(bool success) { SongLoader* loader = qobject_cast(sender()); if (!loader || !destination_) return; if (success) destination_->UpdateItems(loader->songs()); else qLog(Error) << "Error while getting audio CD metadata from MusicBrainz"; deleteLater(); } void SongLoaderInserter::InsertSongs() { // Insert songs (that haven't been completely loaded) to allow user to see // and play them while not loaded completely if (destination_) { destination_->InsertSongsOrLibraryItems(songs_, row_, play_now_, enqueue_); } } void SongLoaderInserter::AsyncLoad() { // First, quick load raw songs. int async_progress = 0; int async_load_id = task_manager_->StartTask(tr("Loading tracks")); task_manager_->SetTaskProgress(async_load_id, async_progress, pending_.count()); for (int i = 0; i < pending_.count(); ++i) { SongLoader* loader = pending_[i]; loader->LoadFilenamesBlocking(); task_manager_->SetTaskProgress(async_load_id, ++async_progress); if (i == 0) { // Load everything from the first song. It'll start playing as soon as // we emit PreloadFinished, so it needs to have the duration set to show // properly in the UI. loader->LoadMetadataBlocking(); } songs_ << loader->songs(); } task_manager_->SetTaskFinished(async_load_id); emit PreloadFinished(); // Songs are inserted in playlist, now load them completely. async_progress = 0; async_load_id = task_manager_->StartTask(tr("Loading tracks info")); task_manager_->SetTaskProgress(async_load_id, async_progress, songs_.count()); SongList songs; for (int i = 0; i < pending_.count(); ++i) { SongLoader* loader = pending_[i]; if (i != 0) { // We already did this earlier for the first song. loader->LoadMetadataBlocking(); } songs << loader->songs(); task_manager_->SetTaskProgress(async_load_id, songs.count()); } task_manager_->SetTaskFinished(async_load_id); // Replace the partially-loaded items by the new ones, fully loaded. emit EffectiveLoadFinished(songs); deleteLater(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/songloaderinserter.h000066400000000000000000000036701260417502300261070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SONGLOADERINSERTER_H #define SONGLOADERINSERTER_H #include #include #include #include "core/song.h" class LibraryBackendInterface; class Player; class Playlist; class SongLoader; class TaskManager; class QModelIndex; class SongLoaderInserter : public QObject { Q_OBJECT public: SongLoaderInserter(TaskManager* task_manager, LibraryBackendInterface* library, const Player* player); ~SongLoaderInserter(); void Load(Playlist* destination, int row, bool play_now, bool enqueue, const QList& urls); void LoadAudioCD(Playlist* destination, int row, bool play_now, bool enqueue); signals: void Error(const QString& message); void PreloadFinished(); void EffectiveLoadFinished(const SongList& songs); private slots: void DestinationDestroyed(); void AudioCDTracksLoaded(SongLoader* loader); void AudioCDTagsLoaded(bool success); void InsertSongs(); private: void AsyncLoad(); private: TaskManager* task_manager_; Playlist* destination_; int row_; bool play_now_; bool enqueue_; SongList songs_; QList pending_; LibraryBackendInterface* library_; const Player* player_; }; #endif // SONGLOADERINSERTER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/songmimedata.h000066400000000000000000000020541260417502300246410ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SONGMIMEDATA_H #define SONGMIMEDATA_H #include #include "core/mimedata.h" #include "core/song.h" class LibraryBackendInterface; class SongMimeData : public MimeData { Q_OBJECT public: SongMimeData() : backend(nullptr) {} LibraryBackendInterface* backend; SongList songs; }; #endif // SONGMIMEDATA_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/songplaylistitem.cpp000066400000000000000000000033101260417502300261270ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "playlistbackend.h" #include "songplaylistitem.h" #include "core/tagreaderclient.h" #include "library/sqlrow.h" #include #include #include SongPlaylistItem::SongPlaylistItem(const QString& type) : PlaylistItem(type) {} SongPlaylistItem::SongPlaylistItem(const Song& song) : PlaylistItem(song.is_stream() ? "Stream" : "File"), song_(song) {} bool SongPlaylistItem::InitFromQuery(const SqlRow& query) { song_.InitFromQuery(query, false, (Song::kColumns.count() + 1) * 3); if (type() == "Stream") { song_.set_filetype(Song::Type_Stream); } return true; } QUrl SongPlaylistItem::Url() const { return song_.url(); } void SongPlaylistItem::Reload() { if (song_.url().scheme() != "file") return; TagReaderClient::Instance()->ReadFileBlocking(song_.url().toLocalFile(), &song_); } Song SongPlaylistItem::Metadata() const { if (HasTemporaryMetadata()) return temp_metadata_; return song_; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlist/songplaylistitem.h000066400000000000000000000025651260417502300256070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SONGPLAYLISTITEM_H #define SONGPLAYLISTITEM_H #include "playlistitem.h" #include "core/song.h" class SongPlaylistItem : public PlaylistItem { public: SongPlaylistItem(const QString& type); SongPlaylistItem(const Song& song); // Restores a stream- or file-related playlist item using query row. // If it's a file related playlist item, this will restore it's CUE // attributes (if any) but won't parse the CUE! bool InitFromQuery(const SqlRow& query); void Reload(); Song Metadata() const; QUrl Url() const; protected: Song DatabaseSongMetadata() const { return song_; } private: Song song_; }; #endif // SONGPLAYLISTITEM_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlistparsers/000077500000000000000000000000001260417502300234175ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlistparsers/asxiniparser.cpp000066400000000000000000000036111260417502300266340ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "asxiniparser.h" #include "core/logging.h" #include #include AsxIniParser::AsxIniParser(LibraryBackendInterface* library, QObject* parent) : ParserBase(library, parent) {} bool AsxIniParser::TryMagic(const QByteArray& data) const { return data.toLower().contains("[reference]"); } SongList AsxIniParser::Load(QIODevice* device, const QString& playlist_path, const QDir& dir) const { SongList ret; while (!device->atEnd()) { QString line = QString::fromUtf8(device->readLine()).trimmed(); int equals = line.indexOf('='); QString key = line.left(equals).toLower(); QString value = line.mid(equals + 1); if (key.startsWith("ref")) { Song song = LoadSong(value, 0, dir); if (song.is_valid()) { ret << song; } } } return ret; } void AsxIniParser::Save(const SongList& songs, QIODevice* device, const QDir& dir, Playlist::Path path_type) const { QTextStream s(device); s << "[Reference]" << endl; int n = 1; for (const Song& song : songs) { s << "Ref" << n << "=" << URLOrFilename(song.url(), dir, path_type) << endl; ++n; } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlistparsers/asxiniparser.h000066400000000000000000000026071260417502300263050ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ASXINIPARSER_H #define ASXINIPARSER_H #include "parserbase.h" class AsxIniParser : public ParserBase { Q_OBJECT public: AsxIniParser(LibraryBackendInterface* library, QObject* parent = nullptr); QString name() const { return "ASX/INI"; } QStringList file_extensions() const { return QStringList() << "asxini"; } bool TryMagic(const QByteArray& data) const; SongList Load(QIODevice* device, const QString& playlist_path = "", const QDir& dir = QDir()) const; void Save(const SongList& songs, QIODevice* device, const QDir& dir = QDir(), Playlist::Path path_type = Playlist::Path_Automatic) const; }; #endif // ASXINIPARSER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlistparsers/asxparser.cpp000066400000000000000000000105731260417502300261410ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "asxparser.h" #include "core/utilities.h" #include #include #include #include #include #include #include #include ASXParser::ASXParser(LibraryBackendInterface* library, QObject* parent) : XMLParser(library, parent) {} SongList ASXParser::Load(QIODevice* device, const QString& playlist_path, const QDir& dir) const { // We have to load everything first so we can munge the "XML". QByteArray data = device->readAll(); // (thanks Amarok...) // ASX looks a lot like xml, but doesn't require tags to be case sensitive, // meaning we have to accept things like: ... // We use a dirty way to achieve this: we make all tags lower case QRegExp ex("(<[/]?[^>]*[A-Z]+[^>]*>)"); ex.setCaseSensitivity(Qt::CaseInsensitive); int index = 0; while ((index = ex.indexIn(data, index)) != -1) { data.replace(ex.cap(1).toLocal8Bit(), ex.cap(1).toLower().toLocal8Bit()); index += ex.matchedLength(); } // Some playlists have unescaped & characters in URLs :( ex.setPattern("(href\\s*=\\s*\")([^\"]+)\""); index = 0; while ((index = ex.indexIn(data, index)) != -1) { QString url = ex.cap(2); url.replace(QRegExp("&(?!amp;|quot;|apos;|lt;|gt;)"), "&"); QByteArray replacement = QString(ex.cap(1) + url + "\"").toLocal8Bit(); data.replace(ex.cap(0).toLocal8Bit(), replacement); index += replacement.length(); } QBuffer buffer(&data); buffer.open(QIODevice::ReadOnly); SongList ret; QXmlStreamReader reader(&buffer); if (!Utilities::ParseUntilElement(&reader, "asx")) { return ret; } while (!reader.atEnd() && Utilities::ParseUntilElement(&reader, "entry")) { Song song = ParseTrack(&reader, dir); if (song.is_valid()) { ret << song; } } return ret; } Song ASXParser::ParseTrack(QXmlStreamReader* reader, const QDir& dir) const { QString title, artist, album, ref; while (!reader->atEnd()) { QXmlStreamReader::TokenType type = reader->readNext(); switch (type) { case QXmlStreamReader::StartElement: { QStringRef name = reader->name(); if (name == "ref") { ref = reader->attributes().value("href").toString(); } else if (name == "title") { title = reader->readElementText(); } else if (name == "author") { artist = reader->readElementText(); } break; } case QXmlStreamReader::EndElement: { if (reader->name() == "entry") { goto return_song; } break; } default: break; } } return_song: Song song = LoadSong(ref, 0, dir); // Override metadata with what was in the playlist song.set_title(title); song.set_artist(artist); song.set_album(album); return song; } void ASXParser::Save(const SongList& songs, QIODevice* device, const QDir&, Playlist::Path path_type) const { QXmlStreamWriter writer(device); writer.setAutoFormatting(true); writer.setAutoFormattingIndent(2); writer.writeStartDocument(); { StreamElement asx("asx", &writer); writer.writeAttribute("version", "3.0"); for (const Song& song : songs) { StreamElement entry("entry", &writer); writer.writeTextElement("title", song.title()); { StreamElement ref("ref", &writer); writer.writeAttribute("href", song.url().toString()); } if (!song.artist().isEmpty()) { writer.writeTextElement("author", song.artist()); } } } writer.writeEndDocument(); } bool ASXParser::TryMagic(const QByteArray& data) const { return data.toLower().contains(" Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ASXPARSER_H #define ASXPARSER_H #include "xmlparser.h" class ASXParser : public XMLParser { Q_OBJECT public: ASXParser(LibraryBackendInterface* library, QObject* parent = nullptr); QString name() const { return "ASX"; } QStringList file_extensions() const { return QStringList() << "asx"; } bool TryMagic(const QByteArray& data) const; SongList Load(QIODevice* device, const QString& playlist_path = "", const QDir& dir = QDir()) const; void Save(const SongList& songs, QIODevice* device, const QDir& dir = QDir(), Playlist::Path path_type = Playlist::Path_Automatic) const; private: Song ParseTrack(QXmlStreamReader* reader, const QDir& dir) const; }; #endif clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlistparsers/cueparser.cpp000066400000000000000000000254001260417502300261150ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "cueparser.h" #include "core/logging.h" #include "core/timeconstants.h" #include #include #include #include #include #include #include #include const char* CueParser::kFileLineRegExp = "(\\S+)\\s+(?:\"([^\"]+)\"|(\\S+))\\s*(?:\"([^\"]+)\"|(\\S+))?"; const char* CueParser::kIndexRegExp = "(\\d{2,3}):(\\d{2}):(\\d{2})"; const char* CueParser::kPerformer = "performer"; const char* CueParser::kTitle = "title"; const char* CueParser::kSongWriter = "songwriter"; const char* CueParser::kFile = "file"; const char* CueParser::kTrack = "track"; const char* CueParser::kIndex = "index"; const char* CueParser::kAudioTrackType = "audio"; const char* CueParser::kRem = "rem"; const char* CueParser::kGenre = "genre"; const char* CueParser::kDate = "date"; CueParser::CueParser(LibraryBackendInterface* library, QObject* parent) : ParserBase(library, parent) {} SongList CueParser::Load(QIODevice* device, const QString& playlist_path, const QDir& dir) const { SongList ret; QTextStream text_stream(device); text_stream.setCodec(QTextCodec::codecForUtfText( device->peek(1024), QTextCodec::codecForName("UTF-8"))); QString dir_path = dir.absolutePath(); // read the first line already QString line = text_stream.readLine(); QList entries; int files = 0; // -- whole file while (!text_stream.atEnd()) { QString album_artist; QString album; QString album_composer; QString file; QString file_type; QString genre; QString date; // -- FILE section do { QStringList splitted = SplitCueLine(line); // uninteresting or incorrect line if (splitted.size() < 2) { continue; } QString line_name = splitted[0].toLower(); QString line_value = splitted[1]; // PERFORMER if (line_name == kPerformer) { album_artist = line_value; // TITLE } else if (line_name == kTitle) { album = line_value; // SONGWRITER } else if (line_name == kSongWriter) { album_composer = line_value; // FILE } else if (line_name == kFile) { file = QDir::isAbsolutePath(line_value) ? line_value : dir.absoluteFilePath(line_value); if (splitted.size() > 2) { file_type = splitted[2]; } // REM } else if (line_name == kRem) { if (splitted.size() < 3) { break; } // REM GENRE if (line_value.toLower() == kGenre) { genre = splitted[2]; // REM DATE } else if (line_value.toLower() == kDate) { date = splitted[2]; } // end of the header -> go into the track mode } else if (line_name == kTrack) { files++; break; } // just ignore the rest of possible field types for now... } while (!(line = text_stream.readLine()).isNull()); if (line.isNull()) { qLog(Warning) << "the .cue file from " << dir_path << " defines no tracks!"; return ret; } // if this is a data file, all of it's tracks will be ignored bool valid_file = file_type.compare("BINARY", Qt::CaseInsensitive) && file_type.compare("MOTOROLA", Qt::CaseInsensitive); QString track_type; QString index; QString artist; QString composer; QString title; // TRACK section do { QStringList splitted = SplitCueLine(line); // uninteresting or incorrect line if (splitted.size() < 2) { continue; } QString line_name = splitted[0].toLower(); QString line_value = splitted[1]; QString line_additional = splitted.size() > 2 ? splitted[2].toLower() : ""; if (line_name == kTrack) { // the beginning of another track's definition - we're saving the // current one // for later (if it's valid of course) // please note that the same code is repeated just after this 'do-while' // loop if (valid_file && !index.isEmpty() && (track_type.isEmpty() || track_type == kAudioTrackType)) { entries.append(CueEntry(file, index, title, artist, album_artist, album, composer, album_composer, genre, date)); } // clear the state track_type = index = artist = title = ""; if (!line_additional.isEmpty()) { track_type = line_additional; } } else if (line_name == kIndex) { // we need the index's position field if (!line_additional.isEmpty()) { // if there's none "01" index, we'll just take the first one // also, we'll take the "01" index even if it's the last one if (line_value == "01" || index.isEmpty()) { index = line_additional; } } } else if (line_name == kPerformer) { artist = line_value; } else if (line_name == kTitle) { title = line_value; } else if (line_name == kSongWriter) { composer = line_value; // end of track's for the current file -> parse next one } else if (line_name == kFile) { break; } // just ignore the rest of possible field types for now... } while (!(line = text_stream.readLine()).isNull()); // we didn't add the last song yet... if (valid_file && !index.isEmpty() && (track_type.isEmpty() || track_type == kAudioTrackType)) { entries.append(CueEntry(file, index, title, artist, album_artist, album, composer, album_composer, genre, date)); } } QDateTime cue_mtime = QFileInfo(playlist_path).lastModified(); // finalize parsing songs for (int i = 0; i < entries.length(); i++) { CueEntry entry = entries.at(i); Song song = LoadSong(entry.file, IndexToMarker(entry.index), dir); // cue song has mtime equal to qMax(media_file_mtime, cue_sheet_mtime) if (cue_mtime.isValid()) { song.set_mtime(qMax(cue_mtime.toTime_t(), song.mtime())); } song.set_cue_path(playlist_path); // overwrite the stuff, we may have read from the file or library, using // the current .cue metadata // set track number only in single-file mode if (files == 1) { song.set_track(i + 1); } // the last TRACK for every FILE gets it's 'end' marker from the media // file's // length if (i + 1 < entries.size() && entries.at(i).file == entries.at(i + 1).file) { // incorrect indices? if (!UpdateSong(entry, entries.at(i + 1).index, &song)) { continue; } } else { // incorrect index? if (!UpdateLastSong(entry, &song)) { continue; } } ret << song; } return ret; } // This and the kFileLineRegExp do most of the "dirty" work, namely: splitting // the raw .cue // line into logical parts and getting rid of all the unnecessary whitespaces // and quoting. QStringList CueParser::SplitCueLine(const QString& line) const { QRegExp line_regexp(kFileLineRegExp); if (!line_regexp.exactMatch(line.trimmed())) { return QStringList(); } // let's remove the empty entries while we're at it return line_regexp.capturedTexts().filter(QRegExp(".+")).mid(1, -1); } // Updates the song with data from the .cue entry. This one mustn't be used for // the // last song in the .cue file. bool CueParser::UpdateSong(const CueEntry& entry, const QString& next_index, Song* song) const { qint64 beginning = IndexToMarker(entry.index); qint64 end = IndexToMarker(next_index); // incorrect indices (we won't be able to calculate beginning or end) if (beginning == -1 || end == -1) { return false; } // believe the CUE: Init() forces validity song->Init(entry.title, entry.PrettyArtist(), entry.album, beginning, end); song->set_albumartist(entry.album_artist); song->set_composer(entry.PrettyComposer()); song->set_genre(entry.genre); song->set_year(entry.date.toInt()); return true; } // Updates the song with data from the .cue entry. This one must be used only // for the // last song in the .cue file. bool CueParser::UpdateLastSong(const CueEntry& entry, Song* song) const { qint64 beginning = IndexToMarker(entry.index); // incorrect index (we won't be able to calculate beginning) if (beginning == -1) { return false; } // believe the CUE and force validity (like UpdateSong() does) song->set_valid(true); song->set_title(entry.title); song->set_artist(entry.PrettyArtist()); song->set_album(entry.album); song->set_albumartist(entry.album_artist); song->set_genre(entry.genre); song->set_year(entry.date.toInt()); song->set_composer(entry.PrettyComposer()); // we don't do anything with the end here because it's already set to // the end of the media file (if it exists) song->set_beginning_nanosec(beginning); return true; } qint64 CueParser::IndexToMarker(const QString& index) const { QRegExp index_regexp(kIndexRegExp); if (!index_regexp.exactMatch(index)) { return -1; } QStringList splitted = index_regexp.capturedTexts().mid(1, -1); qlonglong frames = splitted.at(0).toLongLong() * 60 * 75 + splitted.at(1).toLongLong() * 75 + splitted.at(2).toLongLong(); return (frames * kNsecPerSec) / 75; } void CueParser::Save(const SongList& songs, QIODevice* device, const QDir& dir, Playlist::Path path_type) const { // TODO } // Looks for a track starting with one of the .cue's keywords. bool CueParser::TryMagic(const QByteArray& data) const { QStringList splitted = QString::fromUtf8(data.constData()).split('\n'); for (int i = 0; i < splitted.length(); i++) { QString line = splitted.at(i).trimmed(); if (line.startsWith(kPerformer, Qt::CaseInsensitive) || line.startsWith(kTitle, Qt::CaseInsensitive) || line.startsWith(kFile, Qt::CaseInsensitive) || line.startsWith(kTrack, Qt::CaseInsensitive)) { return true; } } return false; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlistparsers/cueparser.h000066400000000000000000000064101260417502300255620ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CUEPARSER_H #define CUEPARSER_H #include "parserbase.h" #include // This parser will try to detect the real encoding of a .cue file but there's // a great chance it will fail so it's probably best to assume that the parser // is UTF compatible only. class CueParser : public ParserBase { Q_OBJECT public: static const char* kFileLineRegExp; static const char* kIndexRegExp; static const char* kPerformer; static const char* kTitle; static const char* kSongWriter; static const char* kFile; static const char* kTrack; static const char* kIndex; static const char* kAudioTrackType; static const char* kRem; static const char* kGenre; static const char* kDate; CueParser(LibraryBackendInterface* library, QObject* parent = nullptr); QString name() const { return "CUE"; } QStringList file_extensions() const { return QStringList() << "cue"; } QString mime_type() const { return "application/x-cue"; } bool TryMagic(const QByteArray& data) const; SongList Load(QIODevice* device, const QString& playlist_path = "", const QDir& dir = QDir()) const; void Save(const SongList& songs, QIODevice* device, const QDir& dir = QDir(), Playlist::Path path_type = Playlist::Path_Automatic) const; private: // A single TRACK entry in .cue file. struct CueEntry { QString file; QString index; QString title; QString artist; QString album_artist; QString album; QString composer; QString album_composer; QString genre; QString date; QString PrettyArtist() const { return artist.isEmpty() ? album_artist : artist; } QString PrettyComposer() const { return composer.isEmpty() ? album_composer : composer; } CueEntry(QString& file, QString& index, QString& title, QString& artist, QString& album_artist, QString& album, QString& composer, QString& album_composer, QString& genre, QString& date) { this->file = file; this->index = index; this->title = title; this->artist = artist; this->album_artist = album_artist; this->album = album; this->composer = composer; this->album_composer = album_composer; this->genre = genre; this->date = date; } }; bool UpdateSong(const CueEntry& entry, const QString& next_index, Song* song) const; bool UpdateLastSong(const CueEntry& entry, Song* song) const; QStringList SplitCueLine(const QString& line) const; qint64 IndexToMarker(const QString& index) const; }; #endif // CUEPARSER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlistparsers/m3uparser.cpp000066400000000000000000000077251260417502300260570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "m3uparser.h" #include "core/logging.h" #include "core/timeconstants.h" #include "playlist/playlist.h" #include #include M3UParser::M3UParser(LibraryBackendInterface* library, QObject* parent) : ParserBase(library, parent) {} SongList M3UParser::Load(QIODevice* device, const QString& playlist_path, const QDir& dir) const { SongList ret; M3UType type = STANDARD; Metadata current_metadata; QString data = QString::fromUtf8(device->readAll()); data.replace('\r', '\n'); data.replace("\n\n", "\n"); QByteArray bytes = data.toUtf8(); QBuffer buffer(&bytes); buffer.open(QIODevice::ReadOnly); QString line = QString::fromUtf8(buffer.readLine()).trimmed(); if (line.startsWith("#EXTM3U")) { // This is in extended M3U format. type = EXTENDED; line = QString::fromUtf8(buffer.readLine()).trimmed(); } forever { if (line.startsWith('#')) { // Extended info or comment. if (type == EXTENDED && line.startsWith("#EXT")) { if (!ParseMetadata(line, ¤t_metadata)) { qLog(Warning) << "Failed to parse metadata: " << line; } } } else if (!line.isEmpty()) { Song song = LoadSong(line, 0, dir); if (!current_metadata.title.isEmpty()) { song.set_title(current_metadata.title); } if (!current_metadata.artist.isEmpty()) { song.set_artist(current_metadata.artist); } if (current_metadata.length > 0) { song.set_length_nanosec(current_metadata.length); } ret << song; current_metadata = Metadata(); } if (buffer.atEnd()) { break; } line = QString::fromUtf8(buffer.readLine()).trimmed(); } return ret; } bool M3UParser::ParseMetadata(const QString& line, M3UParser::Metadata* metadata) const { // Extended info, eg. // #EXTINF:123,Sample Artist - Sample title QString info = line.section(':', 1); QString l = info.section(',', 0, 0); bool ok = false; int length = l.toInt(&ok); if (!ok) { return false; } metadata->length = length * kNsecPerSec; QString track_info = info.section(',', 1); QStringList list = track_info.split(" - "); if (list.size() <= 1) { metadata->title = track_info; return true; } metadata->artist = list[0].trimmed(); metadata->title = list[1].trimmed(); return true; } void M3UParser::Save(const SongList& songs, QIODevice* device, const QDir& dir, Playlist::Path path_type) const { device->write("#EXTM3U\n"); QSettings s; s.beginGroup(Playlist::kSettingsGroup); bool writeMetadata = s.value(Playlist::kWriteMetadata, true).toBool(); s.endGroup(); for (const Song& song : songs) { if (song.url().isEmpty()) { continue; } if (writeMetadata) { QString meta = QString("#EXTINF:%1,%2 - %3\n") .arg(song.length_nanosec() / kNsecPerSec) .arg(song.artist()) .arg(song.title()); device->write(meta.toUtf8()); } device->write(URLOrFilename(song.url(), dir, path_type).toUtf8()); device->write("\n"); } } bool M3UParser::TryMagic(const QByteArray& data) const { return data.contains("#EXTM3U") || data.contains("#EXTINF"); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlistparsers/m3uparser.h000066400000000000000000000042241260417502300255130ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef M3UPARSER_H #define M3UPARSER_H #include #include "gtest/gtest_prod.h" #include "parserbase.h" class M3UParser : public ParserBase { Q_OBJECT public: M3UParser(LibraryBackendInterface* library, QObject* parent = nullptr); QString name() const { return "M3U"; } QStringList file_extensions() const { return QStringList() << "m3u" << "m3u8"; } QString mime_type() const { return "text/uri-list"; } bool TryMagic(const QByteArray& data) const; SongList Load(QIODevice* device, const QString& playlist_path = "", const QDir& dir = QDir()) const; void Save(const SongList& songs, QIODevice* device, const QDir& dir = QDir(), Playlist::Path path_type = Playlist::Path_Automatic) const; private: enum M3UType { STANDARD = 0, EXTENDED, // Includes extended info (track, artist, etc.) LINK, // Points to a directory. }; struct Metadata { Metadata() : length(-1) {} QString artist; QString title; qint64 length; }; bool ParseMetadata(const QString& line, Metadata* metadata) const; FRIEND_TEST(M3UParserTest, ParsesMetadata); FRIEND_TEST(M3UParserTest, ParsesTrackLocation); FRIEND_TEST(M3UParserTest, ParsesTrackLocationRelative); FRIEND_TEST(M3UParserTest, ParsesTrackLocationHttp); #ifdef Q_OS_WIN32 FRIEND_TEST(M3UParserTest, ParsesTrackLocationAbsoluteWindows); #endif // Q_OS_WIN32 }; #endif // M3UPARSER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlistparsers/parserbase.cpp000066400000000000000000000062601260417502300262560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "parserbase.h" #include "core/tagreaderclient.h" #include "library/librarybackend.h" #include "library/libraryquery.h" #include "library/sqlrow.h" #include "playlist/playlist.h" #include ParserBase::ParserBase(LibraryBackendInterface* library, QObject* parent) : QObject(parent), library_(library) {} void ParserBase::LoadSong(const QString& filename_or_url, qint64 beginning, const QDir& dir, Song* song) const { if (filename_or_url.isEmpty()) { return; } QString filename = filename_or_url; if (filename_or_url.contains(QRegExp("^[a-z]{2,}:"))) { QUrl url(filename_or_url); if (url.scheme() == "file") { filename = url.toLocalFile(); } else { song->set_url(QUrl::fromUserInput(filename_or_url)); song->set_filetype(Song::Type_Stream); song->set_valid(true); return; } } // Clementine always wants / separators internally. Using // QDir::fromNativeSeparators() only works on the same platform the playlist // was created on/for, using replace() lets playlists work on any platform. filename = filename.replace('\\', '/'); // Make the path absolute if (!QDir::isAbsolutePath(filename)) { filename = dir.absoluteFilePath(filename); } // Use the canonical path if (QFile::exists(filename)) { filename = QFileInfo(filename).canonicalFilePath(); } const QUrl url = QUrl::fromLocalFile(filename); // Search in the library Song library_song; if (library_) { library_song = library_->GetSongByUrl(url, beginning); } // If it was found in the library then use it, otherwise load metadata from // disk. if (library_song.is_valid()) { *song = library_song; } else { TagReaderClient::Instance()->ReadFileBlocking(filename, song); } } Song ParserBase::LoadSong(const QString& filename_or_url, qint64 beginning, const QDir& dir) const { Song song; LoadSong(filename_or_url, beginning, dir, &song); return song; } QString ParserBase::URLOrFilename(const QUrl& url, const QDir& dir, Playlist::Path path_type) const { if (url.scheme() != "file") return url.toString(); const QString filename = url.toLocalFile(); if (path_type != Playlist::Path_Absolute && QDir::isAbsolutePath(filename)) { const QString relative = dir.relativeFilePath(filename); if (!relative.startsWith("../") || path_type == Playlist::Path_Relative) return relative; } return filename; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlistparsers/parserbase.h000066400000000000000000000061251260417502300257230ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PARSERBASE_H #define PARSERBASE_H #include #include #include "core/song.h" #include "playlist/playlist.h" class LibraryBackendInterface; class ParserBase : public QObject { Q_OBJECT public: ParserBase(LibraryBackendInterface* library, QObject* parent = nullptr); virtual QString name() const = 0; virtual QStringList file_extensions() const = 0; virtual QString mime_type() const { return QString(); } virtual bool TryMagic(const QByteArray& data) const = 0; // Loads all songs from playlist found at path 'playlist_path' in directory // 'dir'. // The 'device' argument is an opened and ready to read from represantation of // this playlist. // This method might not return all of the songs found in the playlist. Any // playlist // parser may decide to leave out some entries if it finds them incomplete or // invalid. // This means that the final resulting SongList should be considered valid (at // least // from the parser's point of view). virtual SongList Load(QIODevice* device, const QString& playlist_path = "", const QDir& dir = QDir()) const = 0; virtual void Save( const SongList& songs, QIODevice* device, const QDir& dir = QDir(), Playlist::Path path_type = Playlist::Path_Automatic) const = 0; protected: // Loads a song. If filename_or_url is a URL (with a scheme other than // "file") then it is set on the song and the song marked as a stream. // If it is a filename or a file:// URL then it is made absolute and canonical // and set as a file:// url on the song. Also sets the song's metadata by // searching in the Library, or loading from the file as a fallback. // This function should always be used when loading a playlist. Song LoadSong(const QString& filename_or_url, qint64 beginning, const QDir& dir) const; void LoadSong(const QString& filename_or_url, qint64 beginning, const QDir& dir, Song* song) const; // If the URL is a file:// URL then returns its path, absolute or relative to // the directory depending on the path_type option. // Otherwise returns the URL as is. // This function should always be used when saving a playlist. QString URLOrFilename(const QUrl& url, const QDir& dir, Playlist::Path path_type) const; private: LibraryBackendInterface* library_; }; #endif // PARSERBASE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlistparsers/playlistparser.cpp000066400000000000000000000105751260417502300272110ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "asxparser.h" #include "asxiniparser.h" #include "cueparser.h" #include "m3uparser.h" #include "playlistparser.h" #include "plsparser.h" #include "wplparser.h" #include "xspfparser.h" #include "core/logging.h" #include const int PlaylistParser::kMagicSize = 512; PlaylistParser::PlaylistParser(LibraryBackendInterface* library, QObject* parent) : QObject(parent) { default_parser_ = new XSPFParser(library, this); parsers_ << new M3UParser(library, this); parsers_ << default_parser_; parsers_ << new PLSParser(library, this); parsers_ << new ASXParser(library, this); parsers_ << new AsxIniParser(library, this); parsers_ << new CueParser(library, this); parsers_ << new WplParser(library, this); } QStringList PlaylistParser::file_extensions() const { QStringList ret; for (ParserBase* parser : parsers_) { ret << parser->file_extensions(); } qStableSort(ret); return ret; } QString PlaylistParser::filters() const { QStringList filters; QStringList all_extensions; for (ParserBase* parser : parsers_) { filters << FilterForParser(parser, &all_extensions); } filters.prepend(tr("All playlists (%1)").arg(all_extensions.join(" "))); return filters.join(";;"); } QString PlaylistParser::FilterForParser(const ParserBase* parser, QStringList* all_extensions) const { QStringList extensions; for (const QString& extension : parser->file_extensions()) extensions << "*." + extension; if (all_extensions) *all_extensions << extensions; return tr("%1 playlists (%2)").arg(parser->name(), extensions.join(" ")); } QString PlaylistParser::default_extension() const { return default_parser_->file_extensions()[0]; } QString PlaylistParser::default_filter() const { return FilterForParser(default_parser_); } ParserBase* PlaylistParser::ParserForExtension(const QString& suffix) const { for (ParserBase* p : parsers_) { if (p->file_extensions().contains(suffix)) return p; } return nullptr; } ParserBase* PlaylistParser::ParserForMagic(const QByteArray& data, const QString& mime_type) const { for (ParserBase* p : parsers_) { if ((!mime_type.isEmpty() && mime_type == p->mime_type()) || p->TryMagic(data)) return p; } return nullptr; } SongList PlaylistParser::LoadFromFile(const QString& filename) const { QFileInfo info(filename); // Find a parser that supports this file extension ParserBase* parser = ParserForExtension(info.suffix()); if (!parser) { qLog(Warning) << "Unknown filetype:" << filename; return SongList(); } // Open the file QFile file(filename); file.open(QIODevice::ReadOnly); return parser->Load(&file, filename, info.absolutePath()); } SongList PlaylistParser::LoadFromDevice(QIODevice* device, const QString& path_hint, const QDir& dir_hint) const { // Find a parser that supports this data ParserBase* parser = ParserForMagic(device->peek(kMagicSize)); if (!parser) { return SongList(); } return parser->Load(device, path_hint, dir_hint); } void PlaylistParser::Save(const SongList& songs, const QString& filename, Playlist::Path path_type) const { QFileInfo info(filename); // Find a parser that supports this file extension ParserBase* parser = ParserForExtension(info.suffix()); if (!parser) { qLog(Warning) << "Unknown filetype:" << filename; return; } // Open the file QFile file(filename); file.open(QIODevice::WriteOnly); return parser->Save(songs, &file, info.absolutePath(), path_type); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlistparsers/playlistparser.h000066400000000000000000000037071260417502300266550ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PLAYLISTPARSER_H #define PLAYLISTPARSER_H #include #include #include "core/song.h" #include "playlist/playlist.h" class ParserBase; class LibraryBackendInterface; class PlaylistParser : public QObject { Q_OBJECT public: PlaylistParser(LibraryBackendInterface* library, QObject* parent = nullptr); static const int kMagicSize; QStringList file_extensions() const; QString filters() const; QString default_extension() const; QString default_filter() const; ParserBase* ParserForMagic(const QByteArray& data, const QString& mime_type = QString()) const; ParserBase* ParserForExtension(const QString& suffix) const; SongList LoadFromFile(const QString& filename) const; SongList LoadFromDevice(QIODevice* device, const QString& path_hint = QString(), const QDir& dir_hint = QDir()) const; void Save(const SongList& songs, const QString& filename, Playlist::Path) const; private: QString FilterForParser(const ParserBase* parser, QStringList* all_extensions = nullptr) const; private: QList parsers_; ParserBase* default_parser_; }; #endif // PLAYLISTPARSER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlistparsers/plsparser.cpp000066400000000000000000000052341260417502300261420ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "plsparser.h" #include "core/logging.h" #include "core/timeconstants.h" #include #include PLSParser::PLSParser(LibraryBackendInterface* library, QObject* parent) : ParserBase(library, parent) {} SongList PLSParser::Load(QIODevice* device, const QString& playlist_path, const QDir& dir) const { QMap songs; QRegExp n_re("\\d+$"); while (!device->atEnd()) { QString line = QString::fromUtf8(device->readLine()).trimmed(); int equals = line.indexOf('='); QString key = line.left(equals).toLower(); QString value = line.mid(equals + 1); n_re.indexIn(key); int n = n_re.cap(0).toInt(); if (key.startsWith("file")) { Song song = LoadSong(value, 0, dir); // Use the title and length we've already loaded if any if (!songs[n].title().isEmpty()) song.set_title(songs[n].title()); if (songs[n].length_nanosec() != -1) song.set_length_nanosec(songs[n].length_nanosec()); songs[n] = song; } else if (key.startsWith("title")) { songs[n].set_title(value); } else if (key.startsWith("length")) { qint64 seconds = value.toLongLong(); if (seconds > 0) { songs[n].set_length_nanosec(seconds * kNsecPerSec); } } } return songs.values(); } void PLSParser::Save(const SongList& songs, QIODevice* device, const QDir& dir, Playlist::Path path_type) const { QTextStream s(device); s << "[playlist]" << endl; s << "Version=2" << endl; s << "NumberOfEntries=" << songs.count() << endl; int n = 1; for (const Song& song : songs) { s << "File" << n << "=" << URLOrFilename(song.url(), dir, path_type) << endl; s << "Title" << n << "=" << song.title() << endl; s << "Length" << n << "=" << song.length_nanosec() / kNsecPerSec << endl; ++n; } } bool PLSParser::TryMagic(const QByteArray& data) const { return data.toLower().contains("[playlist]"); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlistparsers/plsparser.h000066400000000000000000000025611260417502300256070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PLSPARSER_H #define PLSPARSER_H #include "parserbase.h" class PLSParser : public ParserBase { Q_OBJECT public: PLSParser(LibraryBackendInterface* library, QObject* parent = nullptr); QString name() const { return "PLS"; } QStringList file_extensions() const { return QStringList() << "pls"; } bool TryMagic(const QByteArray& data) const; SongList Load(QIODevice* device, const QString& playlist_path = "", const QDir& dir = QDir()) const; void Save(const SongList& songs, QIODevice* device, const QDir& dir = QDir(), Playlist::Path path_type = Playlist::Path_Automatic) const; }; #endif // PLSPARSER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlistparsers/wplparser.cpp000066400000000000000000000067101260417502300261460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2013, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "wplparser.h" #include "core/utilities.h" #include "version.h" #include WplParser::WplParser(LibraryBackendInterface* library, QObject* parent) : XMLParser(library, parent) {} bool WplParser::TryMagic(const QByteArray& data) const { return data.contains(""); } SongList WplParser::Load(QIODevice* device, const QString& playlist_path, const QDir& dir) const { SongList ret; QXmlStreamReader reader(device); if (!Utilities::ParseUntilElement(&reader, "smil") || !Utilities::ParseUntilElement(&reader, "body")) { return ret; } while (!reader.atEnd() && Utilities::ParseUntilElement(&reader, "seq")) { ParseSeq(dir, &reader, &ret); } return ret; } void WplParser::ParseSeq(const QDir& dir, QXmlStreamReader* reader, SongList* songs) const { while (!reader->atEnd()) { QXmlStreamReader::TokenType type = reader->readNext(); switch (type) { case QXmlStreamReader::StartElement: { QStringRef name = reader->name(); if (name == "media") { QStringRef src = reader->attributes().value("src"); if (!src.isEmpty()) { Song song = LoadSong(src.toString(), 0, dir); if (song.is_valid()) { songs->append(song); } } } else { Utilities::ConsumeCurrentElement(reader); } break; } case QXmlStreamReader::EndElement: { if (reader->name() == "seq") { return; } break; } default: break; } } } void WplParser::Save(const SongList& songs, QIODevice* device, const QDir& dir, Playlist::Path path_type) const { QXmlStreamWriter writer(device); writer.setAutoFormatting(true); writer.setAutoFormattingIndent(2); writer.writeProcessingInstruction("wpl", "version=\"1.0\""); StreamElement smil("smil", &writer); { StreamElement head("head", &writer); WriteMeta("Generator", "Clementine -- " CLEMENTINE_VERSION_DISPLAY, &writer); WriteMeta("ItemCount", QString::number(songs.count()), &writer); } { StreamElement body("body", &writer); { StreamElement seq("seq", &writer); for (const Song& song : songs) { writer.writeStartElement("media"); writer.writeAttribute("src", URLOrFilename(song.url(), dir, path_type)); writer.writeEndElement(); } } } } void WplParser::WriteMeta(const QString& name, const QString& content, QXmlStreamWriter* writer) const { writer->writeStartElement("meta"); writer->writeAttribute("name", name); writer->writeAttribute("content", content); writer->writeEndElement(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlistparsers/wplparser.h000066400000000000000000000031531260417502300256110ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2013, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef WPLPARSER_H #define WPLPARSER_H #include "xmlparser.h" class WplParser : public XMLParser { public: WplParser(LibraryBackendInterface* library, QObject* parent = nullptr); QString name() const { return "WPL"; } QStringList file_extensions() const { return QStringList() << "wpl"; } QString mime_type() const { return "application/vnd.ms-wpl"; } bool TryMagic(const QByteArray& data) const; SongList Load(QIODevice* device, const QString& playlist_path, const QDir& dir) const; void Save(const SongList& songs, QIODevice* device, const QDir& dir, Playlist::Path path_type = Playlist::Path_Automatic) const; private: void ParseSeq(const QDir& dir, QXmlStreamReader* reader, SongList* songs) const; void WriteMeta(const QString& name, const QString& content, QXmlStreamWriter* writer) const; }; #endif // WPLPARSER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlistparsers/xmlparser.cpp000066400000000000000000000017371260417502300261500ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "xmlparser.h" #include #include #include #include #include #include XMLParser::XMLParser(LibraryBackendInterface* library, QObject* parent) : ParserBase(library, parent) {} clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlistparsers/xmlparser.h000066400000000000000000000024611260417502300256100ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef XMLPARSER_H #define XMLPARSER_H #include "parserbase.h" #include #include class QDomDocument; class QDomNode; class XMLParser : public ParserBase { protected: XMLParser(LibraryBackendInterface* library, QObject* parent); class StreamElement { public: StreamElement(const QString& name, QXmlStreamWriter* stream) : stream_(stream) { stream->writeStartElement(name); } ~StreamElement() { stream_->writeEndElement(); } private: QXmlStreamWriter* stream_; Q_DISABLE_COPY(StreamElement); }; }; #endif clementine-1.2.3+git1354-gdaddbde+dfsg/src/playlistparsers/xspfparser.cpp000066400000000000000000000127341260417502300263270ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "xspfparser.h" #include "core/timeconstants.h" #include "core/utilities.h" #include "playlist/playlist.h" #include #include #include #include #include #include XSPFParser::XSPFParser(LibraryBackendInterface* library, QObject* parent) : XMLParser(library, parent) {} SongList XSPFParser::Load(QIODevice* device, const QString& playlist_path, const QDir& dir) const { SongList ret; QXmlStreamReader reader(device); if (!Utilities::ParseUntilElement(&reader, "playlist") || !Utilities::ParseUntilElement(&reader, "trackList")) { return ret; } while (!reader.atEnd() && Utilities::ParseUntilElement(&reader, "track")) { Song song = ParseTrack(&reader, dir); if (song.is_valid()) { ret << song; } } return ret; } Song XSPFParser::ParseTrack(QXmlStreamReader* reader, const QDir& dir) const { QString title, artist, album, location; qint64 nanosec = -1; while (!reader->atEnd()) { QXmlStreamReader::TokenType type = reader->readNext(); switch (type) { case QXmlStreamReader::StartElement: { QStringRef name = reader->name(); if (name == "location") { location = reader->readElementText(); } else if (name == "title") { title = reader->readElementText(); } else if (name == "creator") { artist = reader->readElementText(); } else if (name == "album") { album = reader->readElementText(); } else if (name == "duration") { // in milliseconds. const QString duration = reader->readElementText(); bool ok = false; nanosec = duration.toInt(&ok) * kNsecPerMsec; if (!ok) { nanosec = -1; } } else if (name == "image") { // TODO: Fetch album covers. } else if (name == "info") { // TODO: Do something with extra info? } break; } case QXmlStreamReader::EndElement: { if (reader->name() == "track") { goto return_song; } } default: break; } } return_song: Song song = LoadSong(location, 0, dir); // Override metadata with what was in the playlist song.set_title(title); song.set_artist(artist); song.set_album(album); song.set_length_nanosec(nanosec); return song; } void XSPFParser::Save(const SongList& songs, QIODevice* device, const QDir& dir, Playlist::Path path_type) const { QFileInfo file; QXmlStreamWriter writer(device); writer.setAutoFormatting(true); writer.setAutoFormattingIndent(2); writer.writeStartDocument(); StreamElement playlist("playlist", &writer); writer.writeAttribute("version", "1"); writer.writeDefaultNamespace("http://xspf.org/ns/0/"); QSettings s; s.beginGroup(Playlist::kSettingsGroup); bool writeMetadata = s.value(Playlist::kWriteMetadata, true).toBool(); s.endGroup(); StreamElement tracklist("trackList", &writer); for (const Song& song : songs) { QString filename_or_url = URLOrFilename(song.url(), dir, path_type); StreamElement track("track", &writer); writer.writeTextElement("location", filename_or_url); if (writeMetadata) { writer.writeTextElement("title", song.title()); if (!song.artist().isEmpty()) { writer.writeTextElement("creator", song.artist()); } if (!song.album().isEmpty()) { writer.writeTextElement("album", song.album()); } if (song.length_nanosec() != -1) { writer.writeTextElement( "duration", QString::number(song.length_nanosec() / kNsecPerMsec)); } QString art = song.art_manual().isEmpty() ? song.art_automatic() : song.art_manual(); // Ignore images that are in our resource bundle. if (!art.startsWith(":") && !art.isEmpty()) { QString art_filename; if (!art.contains("://")) { art_filename = art; } else if (QUrl(art).scheme() == "file") { art_filename = QUrl(art).toLocalFile(); } if (!art_filename.isEmpty() && !(art_filename == "(embedded)")) { // Make this filename relative to the directory we're saving the // playlist. QUrl url = QUrl(art_filename); url.setScheme("file"); // Need to explicitly set this. art_filename = URLOrFilename(url, dir, path_type).toUtf8(); } else { // Just use whatever URL was in the Song. art_filename = art; } writer.writeTextElement("image", art_filename); } } } writer.writeEndDocument(); } bool XSPFParser::TryMagic(const QByteArray& data) const { return data.contains(" Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef XSPFPARSER_H #define XSPFPARSER_H #include "xmlparser.h" #include class QDomDocument; class QDomNode; class XSPFParser : public XMLParser { Q_OBJECT public: XSPFParser(LibraryBackendInterface* library, QObject* parent = nullptr); QString name() const { return "XSPF"; } QStringList file_extensions() const { return QStringList() << "xspf"; } bool TryMagic(const QByteArray& data) const; SongList Load(QIODevice* device, const QString& playlist_path = "", const QDir& dir = QDir()) const; void Save(const SongList& songs, QIODevice* device, const QDir& dir = QDir(), Playlist::Path path_type = Playlist::Path_Automatic) const; private: Song ParseTrack(QXmlStreamReader* reader, const QDir& dir) const; }; #endif clementine-1.2.3+git1354-gdaddbde+dfsg/src/ripper/000077500000000000000000000000001260417502300214575ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/ripper/ripcddialog.cpp000066400000000000000000000240421260417502300244460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Andre Siviero Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "ripper/ripcddialog.h" #include #include #include #include #include #include #include #include "config.h" #include "core/logging.h" #include "core/tagreaderclient.h" #include "core/utilities.h" #include "ripper/ripper.h" #include "ui_ripcddialog.h" #include "transcoder/transcoder.h" #include "transcoder/transcoderoptionsdialog.h" #include "ui/iconloader.h" namespace { bool ComparePresetsByName(const TranscoderPreset& left, const TranscoderPreset& right) { return left.name_ < right.name_; } const int kCheckboxColumn = 0; const int kTrackNumberColumn = 1; const int kTrackTitleColumn = 2; } const char* RipCDDialog::kSettingsGroup = "Transcoder"; const int RipCDDialog::kMaxDestinationItems = 10; RipCDDialog::RipCDDialog(QWidget* parent) : QDialog(parent), ui_(new Ui_RipCDDialog), ripper_(new Ripper(this)), working_(false) { // Init ui_->setupUi(this); // Set column widths in the QTableWidget. ui_->tableWidget->horizontalHeader()->setResizeMode( kCheckboxColumn, QHeaderView::ResizeToContents); ui_->tableWidget->horizontalHeader()->setResizeMode( kTrackNumberColumn, QHeaderView::ResizeToContents); ui_->tableWidget->horizontalHeader()->setResizeMode(kTrackTitleColumn, QHeaderView::Stretch); // Add a rip button rip_button_ = ui_->button_box->addButton(tr("Start ripping"), QDialogButtonBox::ActionRole); cancel_button_ = ui_->button_box->button(QDialogButtonBox::Cancel); close_button_ = ui_->button_box->button(QDialogButtonBox::Close); // Hide elements cancel_button_->hide(); ui_->progress_group->hide(); connect(ui_->select_all_button, SIGNAL(clicked()), SLOT(SelectAll())); connect(ui_->select_none_button, SIGNAL(clicked()), SLOT(SelectNone())); connect(ui_->invert_selection_button, SIGNAL(clicked()), SLOT(InvertSelection())); connect(rip_button_, SIGNAL(clicked()), SLOT(ClickedRipButton())); connect(cancel_button_, SIGNAL(clicked()), ripper_, SLOT(Cancel())); connect(close_button_, SIGNAL(clicked()), SLOT(hide())); connect(ui_->options, SIGNAL(clicked()), SLOT(Options())); connect(ui_->select, SIGNAL(clicked()), SLOT(AddDestination())); connect(ripper_, SIGNAL(Finished()), SLOT(Finished())); connect(ripper_, SIGNAL(Cancelled()), SLOT(Cancelled())); connect(ripper_, SIGNAL(ProgressInterval(int, int)), SLOT(SetupProgressBarLimits(int, int))); connect(ripper_, SIGNAL(Progress(int)), SLOT(UpdateProgressBar(int))); setWindowTitle(tr("Rip CD")); AddDestinationDirectory(QDir::homePath()); // Get presets QList presets = Transcoder::GetAllPresets(); qSort(presets.begin(), presets.end(), ComparePresetsByName); for (const TranscoderPreset& preset : presets) { ui_->format->addItem( QString("%1 (.%2)").arg(preset.name_).arg(preset.extension_), QVariant::fromValue(preset)); } // Load settings QSettings s; s.beginGroup(kSettingsGroup); last_add_dir_ = s.value("last_add_dir", QDir::homePath()).toString(); QString last_output_format = s.value("last_output_format", "ogg").toString(); for (int i = 0; i < ui_->format->count(); ++i) { if (last_output_format == ui_->format->itemData(i).value().extension_) { ui_->format->setCurrentIndex(i); break; } } } RipCDDialog::~RipCDDialog() {} bool RipCDDialog::CheckCDIOIsValid() { return ripper_->CheckCDIOIsValid(); } void RipCDDialog::showEvent(QShowEvent* event) { BuildTrackListTable(); if (!working_) { ui_->progress_group->hide(); } } void RipCDDialog::ClickedRipButton() { if (ripper_->MediaChanged()) { QMessageBox cdio_fail(QMessageBox::Critical, tr("Error Ripping CD"), tr("Media has changed. Reloading")); cdio_fail.exec(); if (CheckCDIOIsValid()) { BuildTrackListTable(); } else { ui_->tableWidget->clearContents(); } return; } // Add tracks and album information to the ripper. ripper_->ClearTracks(); TranscoderPreset preset = ui_->format->itemData(ui_->format->currentIndex()) .value(); for (int i = 1; i <= ui_->tableWidget->rowCount(); ++i) { if (!checkboxes_.value(i - 1)->isChecked()) { continue; } QString transcoded_filename = GetOutputFileName( ParseFileFormatString(ui_->format_filename->text(), i)); QString title = track_names_.value(i - 1)->text(); ripper_->AddTrack(i, title, transcoded_filename, preset); } ripper_->SetAlbumInformation( ui_->albumLineEdit->text(), ui_->artistLineEdit->text(), ui_->genreLineEdit->text(), ui_->yearLineEdit->text().toInt(), ui_->discLineEdit->text().toInt(), preset.type_); SetWorking(true); ripper_->Start(); } void RipCDDialog::Options() { TranscoderPreset preset = ui_->format->itemData(ui_->format->currentIndex()) .value(); TranscoderOptionsDialog dialog(preset.type_, this); if (dialog.is_valid()) { dialog.exec(); } } // Adds a folder to the destination box. void RipCDDialog::AddDestination() { int index = ui_->destination->currentIndex(); QString initial_dir = (!ui_->destination->itemData(index).isNull() ? ui_->destination->itemData(index).toString() : QDir::homePath()); QString dir = QFileDialog::getExistingDirectory(this, tr("Add folder"), initial_dir); if (!dir.isEmpty()) { // Keep only a finite number of items in the box. while (ui_->destination->count() >= kMaxDestinationItems) { ui_->destination->removeItem(0); // The oldest item. } AddDestinationDirectory(dir); } } // Adds a directory to the 'destination' combo box. void RipCDDialog::AddDestinationDirectory(QString dir) { QIcon icon = IconLoader::Load("folder"); QVariant data = QVariant::fromValue(dir); // Do not insert duplicates. int duplicate_index = ui_->destination->findData(data); if (duplicate_index == -1) { ui_->destination->addItem(icon, dir, data); ui_->destination->setCurrentIndex(ui_->destination->count() - 1); } else { ui_->destination->setCurrentIndex(duplicate_index); } } void RipCDDialog::SelectAll() { for (QCheckBox* checkbox : checkboxes_) { checkbox->setCheckState(Qt::Checked); } } void RipCDDialog::SelectNone() { for (QCheckBox* checkbox : checkboxes_) { checkbox->setCheckState(Qt::Unchecked); } } void RipCDDialog::InvertSelection() { for (QCheckBox* checkbox : checkboxes_) { checkbox->setCheckState(checkbox->isChecked() ? Qt::Unchecked : Qt::Checked); } } void RipCDDialog::Finished() { SetWorking(false); } void RipCDDialog::Cancelled() { ui_->progress_bar->setValue(0); SetWorking(false); } void RipCDDialog::SetupProgressBarLimits(int min, int max) { ui_->progress_bar->setRange(min, max); } void RipCDDialog::UpdateProgressBar(int progress) { ui_->progress_bar->setValue(progress); } void RipCDDialog::SetWorking(bool working) { working_ = working; rip_button_->setVisible(!working); cancel_button_->setVisible(working); close_button_->setVisible(!working); ui_->input_group->setEnabled(!working); ui_->output_group->setEnabled(!working); ui_->progress_group->setVisible(true); } void RipCDDialog::BuildTrackListTable() { checkboxes_.clear(); track_names_.clear(); int tracks = ripper_->TracksOnDisc(); ui_->tableWidget->setRowCount(tracks); for (int i = 1; i <= tracks; i++) { QCheckBox* checkbox_i = new QCheckBox(ui_->tableWidget); checkbox_i->setCheckState(Qt::Checked); checkboxes_.append(checkbox_i); ui_->tableWidget->setCellWidget(i - 1, kCheckboxColumn, checkbox_i); ui_->tableWidget->setCellWidget(i - 1, kTrackNumberColumn, new QLabel(QString::number(i))); QString track_title = QString("Track %1").arg(i); QLineEdit* line_edit_track_title_i = new QLineEdit(track_title, ui_->tableWidget); track_names_.append(line_edit_track_title_i); ui_->tableWidget->setCellWidget(i - 1, kTrackTitleColumn, line_edit_track_title_i); } } QString RipCDDialog::GetOutputFileName(const QString& basename) const { QFileInfo path( ui_->destination->itemData(ui_->destination->currentIndex()).toString()); QString extension = ui_->format->itemData(ui_->format->currentIndex()) .value() .extension_; return path.filePath() + '/' + basename + '.' + extension; } QString RipCDDialog::ParseFileFormatString(const QString& file_format, int track_no) const { QString to_return = file_format; to_return.replace(QString("%artist"), ui_->artistLineEdit->text()); to_return.replace(QString("%album"), ui_->albumLineEdit->text()); to_return.replace(QString("%disc"), ui_->discLineEdit->text()); to_return.replace(QString("%genre"), ui_->genreLineEdit->text()); to_return.replace(QString("%year"), ui_->yearLineEdit->text()); to_return.replace(QString("%title"), track_names_.value(track_no - 1)->text()); to_return.replace(QString("%track"), QString::number(track_no)); return to_return; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ripper/ripcddialog.h000066400000000000000000000043231260417502300241130ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Andre Siviero Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SRC_RIPPER_RIPCDDIALOG_H_ #define SRC_RIPPER_RIPCDDIALOG_H_ #include #include #include #include "core/song.h" #include "core/tagreaderclient.h" class QCheckBox; class QLineEdit; class Ripper; class Ui_RipCDDialog; class RipCDDialog : public QDialog { Q_OBJECT public: explicit RipCDDialog(QWidget* parent = nullptr); ~RipCDDialog(); bool CheckCDIOIsValid(); protected: void showEvent(QShowEvent* event); private slots: void ClickedRipButton(); void Options(); void AddDestination(); void SelectAll(); void SelectNone(); void InvertSelection(); void Finished(); void Cancelled(); void SetupProgressBarLimits(int min, int max); void UpdateProgressBar(int progress); private: static const char* kSettingsGroup; static const int kMaxDestinationItems; // Constructs a filename from the given base name with a path taken // from the ui dialog and an extension that corresponds to the audio // format chosen in the ui. void AddDestinationDirectory(QString dir); void BuildTrackListTable(); QString GetOutputFileName(const QString& basename) const; QString ParseFileFormatString(const QString& file_format, int track_no) const; void SetWorking(bool working); QList checkboxes_; QList track_names_; QString last_add_dir_; QPushButton* cancel_button_; QPushButton* close_button_; QPushButton* rip_button_; std::unique_ptr ui_; Ripper* ripper_; bool working_; }; #endif // SRC_RIPPER_RIPCDDIALOG_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/ripper/ripcddialog.ui000066400000000000000000000216771260417502300243140ustar00rootroot00000000000000 RipCDDialog Qt::NonModal 0 0 522 563 Dialog :/icon.png:/icon.png Input options 0 0 4 true 10 false false Rip Track Title Duration Select All Select None Invert Selection Qt::Horizontal 40 20 0 Year Disc Album 0 0 Artist Genre Output options Select... File Format %track - %artist - %title Destination 0 0 true 0 0 Options... Audio format Progress Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Close tableWidget select_all_button select_none_button invert_selection_button albumLineEdit artistLineEdit genreLineEdit yearLineEdit discLineEdit format_filename format options destination select button_box clementine-1.2.3+git1354-gdaddbde+dfsg/src/ripper/ripper.cpp000066400000000000000000000244151260417502300234720ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Andre Siviero Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "ripper.h" #include #include #include #include "core/closure.h" #include "core/logging.h" #include "core/tagreaderclient.h" #include "transcoder/transcoder.h" #include "core/utilities.h" // winspool.h defines this :( #ifdef AddJob #undef AddJob #endif namespace { const char kWavHeaderRiffMarker[] = "RIFF"; const char kWavFileTypeFormatChunk[] = "WAVEfmt "; const char kWavDataString[] = "data"; } // namespace Ripper::Ripper(QObject* parent) : QObject(parent), transcoder_(new Transcoder(this)), cancel_requested_(false), finished_success_(0), finished_failed_(0), files_tagged_(0) { cdio_ = cdio_open(NULL, DRIVER_UNKNOWN); connect(this, SIGNAL(RippingComplete()), transcoder_, SLOT(Start())); connect(transcoder_, SIGNAL(JobComplete(QString, QString, bool)), SLOT(TranscodingJobComplete(QString, QString, bool))); connect(transcoder_, SIGNAL(AllJobsComplete()), SLOT(AllTranscodingJobsComplete())); connect(transcoder_, SIGNAL(LogLine(QString)), SLOT(LogLine(QString))); } Ripper::~Ripper() { cdio_destroy(cdio_); } void Ripper::AddTrack(int track_number, const QString& title, const QString& transcoded_filename, const TranscoderPreset& preset) { if (track_number < 1 || track_number > TracksOnDisc()) { qLog(Warning) << "Invalid track number:" << track_number << "Ignoring"; return; } TrackInformation track(track_number, title, transcoded_filename, preset); tracks_.append(track); } void Ripper::SetAlbumInformation(const QString& album, const QString& artist, const QString& genre, int year, int disc, Song::FileType type) { album_.album = album; album_.artist = artist; album_.genre = genre; album_.year = year; album_.disc = disc; album_.type = type; } int Ripper::TracksOnDisc() const { int number_of_tracks = cdio_get_num_tracks(cdio_); // Return zero tracks if there is an error, e.g. no medium found. if (number_of_tracks == CDIO_INVALID_TRACK) number_of_tracks = 0; return number_of_tracks; } int Ripper::AddedTracks() const { return tracks_.length(); } void Ripper::ClearTracks() { tracks_.clear(); } bool Ripper::CheckCDIOIsValid() { if (cdio_) { cdio_destroy(cdio_); } cdio_ = cdio_open(NULL, DRIVER_UNKNOWN); // Refresh the status of the cd media. This will prevent unnecessary // rebuilds of the track list table. if (cdio_) { cdio_get_media_changed(cdio_); } return cdio_; } bool Ripper::MediaChanged() const { if (cdio_ && cdio_get_media_changed(cdio_)) return true; else return false; } void Ripper::Start() { { QMutexLocker l(&mutex_); cancel_requested_ = false; } SetupProgressInterval(); qLog(Debug) << "Ripping" << AddedTracks() << "tracks."; QtConcurrent::run(this, &Ripper::Rip); } void Ripper::Cancel() { { QMutexLocker l(&mutex_); cancel_requested_ = true; } transcoder_->Cancel(); RemoveTemporaryDirectory(); emit(Cancelled()); } void Ripper::TranscodingJobComplete(const QString& input, const QString& output, bool success) { if (success) finished_success_++; else finished_failed_++; UpdateProgress(); // The the transcoder does not overwrite files. Instead, it changes // the name of the output file. We need to update the transcoded // filename for the corresponding track so that we tag the correct // file later on. for (QList::iterator it = tracks_.begin(); it != tracks_.end(); ++it) { if (it->temporary_filename == input) { it->transcoded_filename = output; } } } void Ripper::AllTranscodingJobsComplete() { RemoveTemporaryDirectory(); TagFiles(); } void Ripper::LogLine(const QString& message) { qLog(Debug) << message; } /* * WAV Header documentation * as taken from: * http://www.topherlee.com/software/pcm-tut-wavformat.html * Pos Value Description * 0-3 | "RIFF" | Marks the file as a riff file. * | Characters are each 1 byte long. * 4-7 | File size (integer) | Size of the overall file - 8 bytes, * | in bytes (32-bit integer). * 8-11 | "WAVE" | File Type Header. For our purposes, * | it always equals "WAVE". * 13-16 | "fmt " | Format chunk marker. Includes trailing null. * 17-20 | 16 | Length of format data as listed above * 21-22 | 1 | Type of format (1 is PCM) - 2 byte integer * 23-24 | 2 | Number of Channels - 2 byte integer * 25-28 | 44100 | Sample Rate - 32 byte integer. Common values * | are 44100 (CD), 48000 (DAT). * | Sample Rate = Number of Samples per second, or Hertz. * 29-32 | 176400 | (Sample Rate * BitsPerSample * Channels) / 8. * 33-34 | 4 | (BitsPerSample * Channels) / 8.1 - 8 bit mono2 - 8 bit stereo/16 * bit mono4 - 16 bit stereo * 35-36 | 16 | Bits per sample * 37-40 | "data" | "data" chunk header. * | Marks the beginning of the data section. * 41-44 | File size (data) | Size of the data section. */ void Ripper::WriteWAVHeader(QFile* stream, int32_t i_bytecount) { QDataStream data_stream(stream); data_stream.setByteOrder(QDataStream::LittleEndian); // sizeof() - 1 to avoid including "\0" in the file too data_stream.writeRawData(kWavHeaderRiffMarker, sizeof(kWavHeaderRiffMarker) - 1); /* 0-3 */ data_stream << qint32(i_bytecount + 44 - 8); /* 4-7 */ data_stream.writeRawData(kWavFileTypeFormatChunk, sizeof(kWavFileTypeFormatChunk) - 1); /* 8-15 */ data_stream << (qint32)16; /* 16-19 */ data_stream << (qint16)1; /* 20-21 */ data_stream << (qint16)2; /* 22-23 */ data_stream << (qint32)44100; /* 24-27 */ data_stream << (qint32)(44100 * 2 * 2); /* 28-31 */ data_stream << (qint16)4; /* 32-33 */ data_stream << (qint16)16; /* 34-35 */ data_stream.writeRawData(kWavDataString, sizeof(kWavDataString) - 1); /* 36-39 */ data_stream << (qint32)i_bytecount; /* 40-43 */ } void Ripper::Rip() { temporary_directory_ = Utilities::MakeTempDir() + "/"; finished_success_ = 0; finished_failed_ = 0; // Set up progress bar UpdateProgress(); for (QList::iterator it = tracks_.begin(); it != tracks_.end(); ++it) { QString filename = QString("%1%2.wav").arg(temporary_directory_).arg(it->track_number); QFile destination_file(filename); destination_file.open(QIODevice::WriteOnly); lsn_t i_first_lsn = cdio_get_track_lsn(cdio_, it->track_number); lsn_t i_last_lsn = cdio_get_track_last_lsn(cdio_, it->track_number); WriteWAVHeader(&destination_file, (i_last_lsn - i_first_lsn + 1) * CDIO_CD_FRAMESIZE_RAW); QByteArray buffered_input_bytes(CDIO_CD_FRAMESIZE_RAW, '\0'); for (lsn_t i_cursor = i_first_lsn; i_cursor <= i_last_lsn; i_cursor++) { { QMutexLocker l(&mutex_); if (cancel_requested_) { qLog(Debug) << "CD ripping canceled."; return; } } if (cdio_read_audio_sector(cdio_, buffered_input_bytes.data(), i_cursor) == DRIVER_OP_SUCCESS) { destination_file.write(buffered_input_bytes.data(), buffered_input_bytes.size()); } else { qLog(Error) << "CD read error"; break; } } finished_success_++; UpdateProgress(); it->temporary_filename = filename; transcoder_->AddJob(it->temporary_filename, it->preset, it->transcoded_filename); } emit(RippingComplete()); } // The progress interval is [0, 200*AddedTracks()], where the first // half corresponds to the CD ripping and the second half corresponds // to the transcoding. void Ripper::SetupProgressInterval() { int max = AddedTracks() * 2 * 100; emit ProgressInterval(0, max); } void Ripper::UpdateProgress() { int progress = (finished_success_ + finished_failed_) * 100; QMap current_jobs = transcoder_->GetProgress(); for (float value : current_jobs.values()) { progress += qBound(0, static_cast(value * 100), 99); } emit Progress(progress); qLog(Debug) << "Progress:" << progress; } void Ripper::RemoveTemporaryDirectory() { if (!temporary_directory_.isEmpty()) Utilities::RemoveRecursive(temporary_directory_); temporary_directory_.clear(); } void Ripper::TagFiles() { files_tagged_ = 0; for (const TrackInformation& track : tracks_) { Song song; song.InitFromFilePartial(track.transcoded_filename); song.set_track(track.track_number); song.set_title(track.title); song.set_album(album_.album); song.set_artist(album_.artist); song.set_genre(album_.genre); song.set_year(album_.year); song.set_disc(album_.disc); song.set_filetype(album_.type); TagReaderReply* reply = TagReaderClient::Instance()->SaveFile(song.url().toLocalFile(), song); NewClosure(reply, SIGNAL(Finished(bool)), this, SLOT(FileTagged(TagReaderReply*)), reply); } } void Ripper::FileTagged(TagReaderReply* reply) { files_tagged_++; qLog(Debug) << "Tagged" << files_tagged_ << "of" << tracks_.length() << "files"; if (files_tagged_ == tracks_.length()) { qLog(Debug) << "CD ripper finished."; emit(Finished()); } reply->deleteLater(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ripper/ripper.h000066400000000000000000000077231260417502300231420ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, Andre Siviero Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SRC_RIPPER_RIPPER_H_ #define SRC_RIPPER_RIPPER_H_ #include #include #include #include "core/song.h" #include "core/tagreaderclient.h" #include "transcoder/transcoder.h" class QFile; // Rips selected tracks from an audio CD, transcodes them to a chosen // format, and finally tags the files with the supplied metadata. // // Usage: Add tracks with AddTrack() and album metadata with // SetAlbumInformation(). Then start the ripper with Start(). The ripper // emits the Finished() signal when it's done or the Cancelled() // signal if the ripping has been cancelled. class Ripper : public QObject { Q_OBJECT public: explicit Ripper(QObject* parent = nullptr); ~Ripper(); // Adds a track to the rip list if the track number corresponds to a // track on the audio cd. The track will transcoded according to the // chosen TranscoderPreset. void AddTrack(int track_number, const QString& title, const QString& transcoded_filename, const TranscoderPreset& preset); // Sets album metadata. This information is used when tagging the // final files. void SetAlbumInformation(const QString& album, const QString& artist, const QString& genre, int year, int disc, Song::FileType type); // Returns the number of audio tracks on the disc. int TracksOnDisc() const; // Returns the number of tracks added to the rip list. int AddedTracks() const; // Clears the rip list. void ClearTracks(); // Returns true if a cd device was successfully opened. bool CheckCDIOIsValid(); // Returns true if the cd media has changed. bool MediaChanged() const; signals: void Finished(); void Cancelled(); void ProgressInterval(int min, int max); void Progress(int progress); void RippingComplete(); public slots: void Start(); void Cancel(); private slots: void TranscodingJobComplete(const QString& input, const QString& output, bool success); void AllTranscodingJobsComplete(); void LogLine(const QString& message); void FileTagged(TagReaderReply* reply); private: struct TrackInformation { TrackInformation(int track_number, const QString& title, const QString& transcoded_filename, const TranscoderPreset& preset) : track_number(track_number), title(title), transcoded_filename(transcoded_filename), preset(preset) {} int track_number; QString title; QString transcoded_filename; TranscoderPreset preset; QString temporary_filename; }; struct AlbumInformation { AlbumInformation() : year(0), disc(0), type(Song::Type_Unknown) {} QString album; QString artist; QString genre; int year; int disc; Song::FileType type; }; void WriteWAVHeader(QFile* stream, int32_t i_bytecount); void Rip(); void SetupProgressInterval(); void UpdateProgress(); void RemoveTemporaryDirectory(); void TagFiles(); CdIo_t* cdio_; Transcoder* transcoder_; QString temporary_directory_; bool cancel_requested_; QMutex mutex_; int finished_success_; int finished_failed_; int files_tagged_; QList tracks_; AlbumInformation album_; }; #endif // SRC_RIPPER_RIPPER_H_ clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/000077500000000000000000000000001260417502300232515ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/generator.cpp000066400000000000000000000026301260417502300257440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "generator.h" #include "querygenerator.h" #include "core/logging.h" #include "internet/jamendo/jamendodynamicplaylist.h" #include namespace smart_playlists { const int Generator::kDefaultLimit = 20; const int Generator::kDefaultDynamicHistory = 5; const int Generator::kDefaultDynamicFuture = 15; Generator::Generator() : QObject(nullptr), backend_(nullptr) {} GeneratorPtr Generator::Create(const QString& type) { if (type == "Query") return GeneratorPtr(new QueryGenerator); else if (type == "Jamendo") return GeneratorPtr(new JamendoDynamicPlaylist); qLog(Warning) << "Invalid playlist generator type:" << type; return GeneratorPtr(); } } // namespace clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/generator.h000066400000000000000000000052741260417502300254200ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PLAYLISTGENERATOR_H #define PLAYLISTGENERATOR_H #include "playlist/playlistitem.h" #include class LibraryBackend; namespace smart_playlists { class Generator : public QObject, public std::enable_shared_from_this { Q_OBJECT public: Generator(); static const int kDefaultLimit; static const int kDefaultDynamicHistory; static const int kDefaultDynamicFuture; // Creates a new Generator of the given type static std::shared_ptr Create(const QString& type); // Should be called before Load on a new Generator void set_library(LibraryBackend* backend) { backend_ = backend; } void set_name(const QString& name) { name_ = name; } LibraryBackend* library() const { return backend_; } QString name() const { return name_; } // Name of the subclass virtual QString type() const = 0; // Serialises the Generator's settings // Called on UI-thread. virtual void Load(const QByteArray& data) = 0; // Called on UI-thread. virtual QByteArray Save() const = 0; // Creates and returns a playlist // Called from non-UI thread. virtual PlaylistItemList Generate() = 0; // If the generator can be used as a dynamic playlist then GenerateMore // should return the next tracks in the sequence. The subclass should // remember the last GetDynamicHistory() + GetDynamicFuture() tracks and // ensure that // the tracks returned from this method are not in that set. virtual bool is_dynamic() const { return false; } virtual void set_dynamic(bool dynamic) {} // Called from non-UI thread. virtual PlaylistItemList GenerateMore(int count) { return PlaylistItemList(); } virtual int GetDynamicHistory() { return kDefaultDynamicHistory; } virtual int GetDynamicFuture() { return kDefaultDynamicFuture; } signals: void Error(const QString& message); protected: LibraryBackend* backend_; private: QString name_; }; } // namespace #include "generator_fwd.h" #endif // PLAYLISTGENERATOR_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/generator_fwd.h000066400000000000000000000017051260417502300262530ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PLAYLISTGENERATOR_FWD_H #define PLAYLISTGENERATOR_FWD_H #include namespace smart_playlists { class Generator; typedef std::shared_ptr GeneratorPtr; } // namespace #endif // PLAYLISTGENERATOR_FWD_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/generatorinserter.cpp000066400000000000000000000051151260417502300275210ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "generator.h" #include "generatorinserter.h" #include "core/taskmanager.h" #include "playlist/playlist.h" #include #include namespace smart_playlists { typedef QFuture Future; typedef QFutureWatcher FutureWatcher; GeneratorInserter::GeneratorInserter(TaskManager* task_manager, LibraryBackend* library, QObject* parent) : QObject(parent), task_manager_(task_manager), library_(library), task_id_(-1), is_dynamic_(false) {} static PlaylistItemList Generate(GeneratorPtr generator, int dynamic_count) { if (dynamic_count) { return generator->GenerateMore(dynamic_count); } else { return generator->Generate(); } } void GeneratorInserter::Load(Playlist* destination, int row, bool play_now, bool enqueue, GeneratorPtr generator, int dynamic_count) { task_id_ = task_manager_->StartTask(tr("Loading smart playlist")); destination_ = destination; row_ = row; play_now_ = play_now; enqueue_ = enqueue; is_dynamic_ = generator->is_dynamic(); connect(generator.get(), SIGNAL(Error(QString)), SIGNAL(Error(QString))); Future future = QtConcurrent::run(Generate, generator, dynamic_count); FutureWatcher* watcher = new FutureWatcher(this); watcher->setFuture(future); connect(watcher, SIGNAL(finished()), SLOT(Finished())); } void GeneratorInserter::Finished() { FutureWatcher* watcher = static_cast(sender()); watcher->deleteLater(); PlaylistItemList items = watcher->result(); if (items.isEmpty()) { if (is_dynamic_) { destination_->TurnOffDynamicPlaylist(); } } else { destination_->InsertItems(items, row_, play_now_, enqueue_); } task_manager_->SetTaskFinished(task_id_); deleteLater(); } } // namespace clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/generatorinserter.h000066400000000000000000000031471260417502300271710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PLAYLISTGENERATORINSERTER_H #define PLAYLISTGENERATORINSERTER_H #include "generator_fwd.h" #include class LibraryBackend; class Playlist; class TaskManager; class QModelIndex; namespace smart_playlists { class GeneratorInserter : public QObject { Q_OBJECT public: GeneratorInserter(TaskManager* task_manager, LibraryBackend* library, QObject* parent); void Load(Playlist* destination, int row, bool play_now, bool enqueue, GeneratorPtr generator, int dynamic_count = 0); signals: void Error(const QString& message); void PlayRequested(const QModelIndex& index); private slots: void Finished(); private: TaskManager* task_manager_; LibraryBackend* library_; int task_id_; Playlist* destination_; int row_; bool play_now_; bool enqueue_; bool is_dynamic_; }; } // namespace #endif // PLAYLISTGENERATORINSERTER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/generatormimedata.h000066400000000000000000000021271260417502300271140ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef GENERATORMIMEDATA_H #define GENERATORMIMEDATA_H #include #include "generator_fwd.h" #include "core/mimedata.h" namespace smart_playlists { class GeneratorMimeData : public MimeData { Q_OBJECT public: GeneratorMimeData(GeneratorPtr generator) : generator_(generator) {} GeneratorPtr generator_; }; } // namespace #endif // GENERATORMIMEDATA_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/querygenerator.cpp000066400000000000000000000044621260417502300270370ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "querygenerator.h" #include "library/librarybackend.h" #include namespace smart_playlists { QueryGenerator::QueryGenerator() : dynamic_(false), current_pos_(0) {} QueryGenerator::QueryGenerator(const QString& name, const Search& search, bool dynamic) : search_(search), dynamic_(dynamic), current_pos_(0) { set_name(name); } void QueryGenerator::Load(const Search& search) { search_ = search; dynamic_ = false; current_pos_ = 0; } void QueryGenerator::Load(const QByteArray& data) { QDataStream s(data); s >> search_; s >> dynamic_; } QByteArray QueryGenerator::Save() const { QByteArray ret; QDataStream s(&ret, QIODevice::WriteOnly); s << search_; s << dynamic_; return ret; } PlaylistItemList QueryGenerator::Generate() { previous_ids_.clear(); current_pos_ = 0; return GenerateMore(0); } PlaylistItemList QueryGenerator::GenerateMore(int count) { Search search_copy = search_; search_copy.id_not_in_ = previous_ids_; if (count) { search_copy.limit_ = count; } if (search_copy.sort_type_ != Search::Sort_Random) { search_copy.first_item_ = current_pos_; current_pos_ += search_copy.limit_; } SongList songs = backend_->FindSongs(search_copy); PlaylistItemList items; for (const Song& song : songs) { items << PlaylistItemPtr(PlaylistItem::NewFromSongsTable( backend_->songs_table(), song)); previous_ids_ << song.id(); if (previous_ids_.count() > GetDynamicFuture() + GetDynamicHistory()) previous_ids_.removeFirst(); } return items; } } // namespace clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/querygenerator.h000066400000000000000000000031201260417502300264720ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef QUERYPLAYLISTGENERATOR_H #define QUERYPLAYLISTGENERATOR_H #include "generator.h" #include "search.h" namespace smart_playlists { class QueryGenerator : public Generator { public: QueryGenerator(); QueryGenerator(const QString& name, const Search& search, bool dynamic = false); QString type() const { return "Query"; } void Load(const Search& search); void Load(const QByteArray& data); QByteArray Save() const; PlaylistItemList Generate(); PlaylistItemList GenerateMore(int count); bool is_dynamic() const { return dynamic_; } void set_dynamic(bool dynamic) { dynamic_ = dynamic; } Search search() const { return search_; } int GetDynamicFuture() { return search_.limit_; } private: Search search_; bool dynamic_; QList previous_ids_; int current_pos_; }; } // namespace #endif // QUERYPLAYLISTGENERATOR_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/querysearchpage.ui000066400000000000000000000072721260417502300270100ustar00rootroot00000000000000 SmartPlaylistQuerySearchPage 0 0 448 450 0 0 Form #terms_scroll_area, #terms_scroll_area_content { background: transparent; } 0 Search mode Match every search term (AND) Match one or more search terms (OR) Include all songs 0 0 0 300 Search terms 0 0 QFrame::NoFrame true 0 0 418 251 0 0 0 Qt::Vertical 20 40 clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/querysortpage.ui000066400000000000000000000063771260417502300265370ustar00rootroot00000000000000 SmartPlaylistQuerySortPage 0 0 723 335 Form 0 Sorting Put songs in a random order true Sort songs by QComboBox::AdjustToContents Limits Show all the songs true Only show the first songs 1000 15 Qt::Horizontal smart_playlists::SearchPreview QWidget
smartplaylists/searchpreview.h
1
clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/querywizardplugin.cpp000066400000000000000000000240131260417502300275620ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "querygenerator.h" #include "querywizardplugin.h" #include "searchtermwidget.h" #include "ui_querysearchpage.h" #include "ui_querysortpage.h" #include "core/logging.h" #include #include namespace smart_playlists { class QueryWizardPlugin::SearchPage : public QWizardPage { friend class QueryWizardPlugin; public: SearchPage(QWidget* parent = 0) : QWizardPage(parent), ui_(new Ui_SmartPlaylistQuerySearchPage) { ui_->setupUi(this); } bool isComplete() const { if (ui_->type->currentIndex() == 2) // All songs return true; for (SearchTermWidget* widget : terms_) { if (!widget->Term().is_valid()) return false; } return true; } QVBoxLayout* layout_; QList terms_; SearchTermWidget* new_term_; SearchPreview* preview_; std::unique_ptr ui_; }; class QueryWizardPlugin::SortPage : public QWizardPage { public: SortPage(QueryWizardPlugin* plugin, QWidget* parent, int next_id) : QWizardPage(parent), next_id_(next_id), plugin_(plugin) {} void showEvent(QShowEvent*) { plugin_->UpdateSortPreview(); } int nextId() const { return next_id_; } int next_id_; QueryWizardPlugin* plugin_; }; QueryWizardPlugin::QueryWizardPlugin(Application* app, LibraryBackend* library, QObject* parent) : WizardPlugin(app, library, parent), search_page_(nullptr), previous_scrollarea_max_(0) {} QueryWizardPlugin::~QueryWizardPlugin() {} QString QueryWizardPlugin::name() const { return tr("Library search"); } QString QueryWizardPlugin::description() const { return tr("Find songs in your library that match the criteria you specify."); } int QueryWizardPlugin::CreatePages(QWizard* wizard, int finish_page_id) { // Create the UI search_page_ = new SearchPage(wizard); QWizardPage* sort_page = new SortPage(this, wizard, finish_page_id); sort_ui_.reset(new Ui_SmartPlaylistQuerySortPage); sort_ui_->setupUi(sort_page); sort_ui_->limit_value->setValue(Generator::kDefaultLimit); connect(search_page_->ui_->type, SIGNAL(currentIndexChanged(int)), SLOT(SearchTypeChanged())); // Create the new search term widget search_page_->new_term_ = new SearchTermWidget(library_, search_page_); search_page_->new_term_->SetActive(false); connect(search_page_->new_term_, SIGNAL(Clicked()), SLOT(AddSearchTerm())); // Add an empty initial term search_page_->layout_ = static_cast( search_page_->ui_->terms_scroll_area_content->layout()); search_page_->layout_->addWidget(search_page_->new_term_); AddSearchTerm(); // Ensure that the terms are scrolled to the bottom when a new one is added connect(search_page_->ui_->terms_scroll_area->verticalScrollBar(), SIGNAL(rangeChanged(int, int)), this, SLOT(MoveTermListToBottom(int, int))); // Add the preview widget at the bottom of the search terms page QVBoxLayout* terms_page_layout = static_cast(search_page_->layout()); terms_page_layout->addStretch(); search_page_->preview_ = new SearchPreview(search_page_); search_page_->preview_->set_application(app_); search_page_->preview_->set_library(library_); terms_page_layout->addWidget(search_page_->preview_); // Add sort field texts for (int i = 0; i < SearchTerm::FieldCount; ++i) { const SearchTerm::Field field = SearchTerm::Field(i); const QString field_name = SearchTerm::FieldName(field); sort_ui_->field_value->addItem(field_name); } connect(sort_ui_->field_value, SIGNAL(currentIndexChanged(int)), SLOT(UpdateSortOrder())); UpdateSortOrder(); // Set the sort and limit radio buttons back to their defaults - they would // have been changed by setupUi sort_ui_->random->setChecked(true); sort_ui_->limit_none->setChecked(true); // Set up the preview widget that's already at the bottom of the sort page sort_ui_->preview->set_application(app_); sort_ui_->preview->set_library(library_); connect(sort_ui_->field, SIGNAL(toggled(bool)), SLOT(UpdateSortPreview())); connect(sort_ui_->field_value, SIGNAL(currentIndexChanged(int)), SLOT(UpdateSortPreview())); connect(sort_ui_->limit_limit, SIGNAL(toggled(bool)), SLOT(UpdateSortPreview())); connect(sort_ui_->limit_none, SIGNAL(toggled(bool)), SLOT(UpdateSortPreview())); connect(sort_ui_->limit_value, SIGNAL(valueChanged(QString)), SLOT(UpdateSortPreview())); connect(sort_ui_->order, SIGNAL(currentIndexChanged(int)), SLOT(UpdateSortPreview())); connect(sort_ui_->random, SIGNAL(toggled(bool)), SLOT(UpdateSortPreview())); // Configure the page text search_page_->setTitle(tr("Search terms")); search_page_->setSubTitle( tr("A song will be included in the playlist if it matches these " "conditions.")); sort_page->setTitle(tr("Search options")); sort_page->setSubTitle(tr( "Choose how the playlist is sorted and how many songs it will contain.")); // Add the pages const int first_page = wizard->addPage(search_page_); wizard->addPage(sort_page); return first_page; } void QueryWizardPlugin::SetGenerator(GeneratorPtr g) { std::shared_ptr gen = std::dynamic_pointer_cast(g); if (!gen) return; Search search = gen->search(); // Search type search_page_->ui_->type->setCurrentIndex(search.search_type_); // Search terms qDeleteAll(search_page_->terms_); search_page_->terms_.clear(); for (const SearchTerm& term : search.terms_) { AddSearchTerm(); search_page_->terms_.last()->SetTerm(term); } // Sort order if (search.sort_type_ == Search::Sort_Random) { sort_ui_->random->setChecked(true); } else { sort_ui_->field->setChecked(true); sort_ui_->order->setCurrentIndex( search.sort_type_ == Search::Sort_FieldAsc ? 0 : 1); sort_ui_->field_value->setCurrentIndex(search.sort_field_); } // Limit if (search.limit_ == -1) { sort_ui_->limit_none->setChecked(true); } else { sort_ui_->limit_limit->setChecked(true); sort_ui_->limit_value->setValue(search.limit_); } } GeneratorPtr QueryWizardPlugin::CreateGenerator() const { std::shared_ptr gen(new QueryGenerator); gen->Load(MakeSearch()); return std::static_pointer_cast(gen); } void QueryWizardPlugin::UpdateSortOrder() { const SearchTerm::Field field = SearchTerm::Field(sort_ui_->field_value->currentIndex()); const SearchTerm::Type type = SearchTerm::TypeOf(field); const QString asc = SearchTerm::FieldSortOrderText(type, true); const QString desc = SearchTerm::FieldSortOrderText(type, false); const int old_current_index = sort_ui_->order->currentIndex(); sort_ui_->order->clear(); sort_ui_->order->addItem(asc); sort_ui_->order->addItem(desc); sort_ui_->order->setCurrentIndex(old_current_index); } void QueryWizardPlugin::AddSearchTerm() { SearchTermWidget* widget = new SearchTermWidget(library_, search_page_); connect(widget, SIGNAL(RemoveClicked()), SLOT(RemoveSearchTerm())); connect(widget, SIGNAL(Changed()), SLOT(UpdateTermPreview())); search_page_->layout_->insertWidget(search_page_->terms_.count(), widget); search_page_->terms_ << widget; UpdateTermPreview(); } void QueryWizardPlugin::RemoveSearchTerm() { SearchTermWidget* widget = qobject_cast(sender()); if (!widget) return; const int index = search_page_->terms_.indexOf(widget); if (index == -1) return; search_page_->terms_.takeAt(index)->deleteLater(); UpdateTermPreview(); } void QueryWizardPlugin::UpdateTermPreview() { Search search = MakeSearch(); emit search_page_->completeChanged(); // When removing last term, update anyway the search if (!search.is_valid() && !search_page_->terms_.isEmpty()) return; // Don't apply limits in the term page search.limit_ = -1; search_page_->preview_->Update(search); } void QueryWizardPlugin::UpdateSortPreview() { Search search = MakeSearch(); if (!search.is_valid()) return; sort_ui_->preview->Update(search); } Search QueryWizardPlugin::MakeSearch() const { Search ret; // Search type ret.search_type_ = Search::SearchType(search_page_->ui_->type->currentIndex()); // Search terms for (SearchTermWidget* widget : search_page_->terms_) { SearchTerm term = widget->Term(); if (term.is_valid()) ret.terms_ << term; } // Sort order if (sort_ui_->random->isChecked()) { ret.sort_type_ = Search::Sort_Random; } else { const bool ascending = sort_ui_->order->currentIndex() == 0; ret.sort_type_ = ascending ? Search::Sort_FieldAsc : Search::Sort_FieldDesc; ret.sort_field_ = SearchTerm::Field(sort_ui_->field_value->currentIndex()); } // Limit if (sort_ui_->limit_none->isChecked()) ret.limit_ = -1; else ret.limit_ = sort_ui_->limit_value->value(); return ret; } void QueryWizardPlugin::SearchTypeChanged() { const bool all = search_page_->ui_->type->currentIndex() == 2; search_page_->ui_->terms_scroll_area_content->setEnabled(!all); UpdateTermPreview(); } void QueryWizardPlugin::MoveTermListToBottom(int min, int max) { Q_UNUSED(min); // Only scroll to the bottom if a new term is added if (previous_scrollarea_max_ < max) search_page_->ui_->terms_scroll_area->verticalScrollBar()->setValue(max); previous_scrollarea_max_ = max; } } // namespace smart_playlists clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/querywizardplugin.h000066400000000000000000000037101260417502300272300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef QUERYWIZARDPLUGIN_H #define QUERYWIZARDPLUGIN_H #include "wizardplugin.h" #include #include #include "search.h" class Ui_SmartPlaylistQuerySearchPage; class Ui_SmartPlaylistQuerySortPage; class QVBoxLayout; namespace smart_playlists { class SearchPreview; class SearchTermWidget; class QueryWizardPlugin : public WizardPlugin { Q_OBJECT public: QueryWizardPlugin(Application* app, LibraryBackend* library, QObject* parent); ~QueryWizardPlugin(); QString type() const { return "Query"; } QString name() const; QString description() const; bool is_dynamic() const { return true; } int CreatePages(QWizard* wizard, int finish_page_id); void SetGenerator(GeneratorPtr); GeneratorPtr CreateGenerator() const; private slots: void AddSearchTerm(); void RemoveSearchTerm(); void SearchTypeChanged(); void UpdateTermPreview(); void UpdateSortPreview(); void UpdateSortOrder(); void MoveTermListToBottom(int min, int max); private: class SearchPage; class SortPage; Search MakeSearch() const; SearchPage* search_page_; std::unique_ptr sort_ui_; int previous_scrollarea_max_; }; } // namespace smart_playlists #endif // QUERYWIZARDPLUGIN_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/search.cpp000066400000000000000000000076071260417502300252340ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "search.h" #include "core/logging.h" #include "core/song.h" #include namespace smart_playlists { Search::Search() { Reset(); } Search::Search(SearchType type, TermList terms, SortType sort_type, SearchTerm::Field sort_field, int limit) : search_type_(type), terms_(terms), sort_type_(sort_type), sort_field_(sort_field), limit_(limit), first_item_(0) {} void Search::Reset() { search_type_ = Type_And; terms_.clear(); sort_type_ = Sort_Random; sort_field_ = SearchTerm::Field_Title; limit_ = -1; first_item_ = 0; } QString Search::ToSql(const QString& songs_table) const { QString sql = "SELECT ROWID," + Song::kColumnSpec + " FROM " + songs_table; // Add search terms QStringList where_clauses; QStringList term_where_clauses; for (const SearchTerm& term : terms_) { term_where_clauses << term.ToSql(); } if (!terms_.isEmpty() && search_type_ != Type_All) { QString boolean_op = search_type_ == Type_And ? " AND " : " OR "; where_clauses << "(" + term_where_clauses.join(boolean_op) + ")"; } // Restrict the IDs of songs if we're making a dynamic playlist if (!id_not_in_.isEmpty()) { QString numbers; for (int id : id_not_in_) { numbers += (numbers.isEmpty() ? "" : ",") + QString::number(id); } where_clauses << "(ROWID NOT IN (" + numbers + "))"; } // We never want to include songs that have been deleted, but are still kept // in the database in case the directory containing them has just been // unmounted. where_clauses << "unavailable = 0"; if (!where_clauses.isEmpty()) { sql += " WHERE " + where_clauses.join(" AND "); } // Add sort by if (sort_type_ == Sort_Random) { sql += " ORDER BY random()"; } else { sql += " ORDER BY " + SearchTerm::FieldColumnName(sort_field_) + (sort_type_ == Sort_FieldAsc ? " ASC" : " DESC"); } // Add limit if (first_item_) { sql += QString(" LIMIT %1 OFFSET %2").arg(limit_).arg(first_item_); } else if (limit_ != -1) { sql += " LIMIT " + QString::number(limit_); } qLog(Debug) << sql; return sql; } bool Search::is_valid() const { if (search_type_ == Type_All) return true; return !terms_.isEmpty(); } bool Search::operator==(const Search& other) const { return search_type_ == other.search_type_ && terms_ == other.terms_ && sort_type_ == other.sort_type_ && sort_field_ == other.sort_field_ && limit_ == other.limit_; } } // namespace QDataStream& operator<<(QDataStream& s, const smart_playlists::Search& search) { s << search.terms_; s << quint8(search.sort_type_); s << quint8(search.sort_field_); s << qint32(search.limit_); s << quint8(search.search_type_); return s; } QDataStream& operator>>(QDataStream& s, smart_playlists::Search& search) { quint8 sort_type, sort_field, search_type; qint32 limit; s >> search.terms_ >> sort_type >> sort_field >> limit >> search_type; search.sort_type_ = smart_playlists::Search::SortType(sort_type); search.sort_field_ = smart_playlists::SearchTerm::Field(sort_field); search.limit_ = limit; search.search_type_ = smart_playlists::Search::SearchType(search_type); return s; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/search.h000066400000000000000000000037131260417502300246730ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SMARTPLAYLISTSEARCH_H #define SMARTPLAYLISTSEARCH_H #include "generator.h" #include "searchterm.h" namespace smart_playlists { class Search { public: typedef QList TermList; // These values are persisted, so add to the end of the enum only enum SearchType { Type_And = 0, Type_Or, Type_All, }; // These values are persisted, so add to the end of the enum only enum SortType { Sort_Random = 0, Sort_FieldAsc, Sort_FieldDesc, }; Search(); Search(SearchType type, TermList terms, SortType sort_type, SearchTerm::Field sort_field, int limit = Generator::kDefaultLimit); bool is_valid() const; bool operator==(const Search& other) const; bool operator!=(const Search& other) const { return !(*this == other); } SearchType search_type_; TermList terms_; SortType sort_type_; SearchTerm::Field sort_field_; int limit_; // Not persisted, used to alter the behaviour of the query QList id_not_in_; int first_item_; void Reset(); QString ToSql(const QString& songs_table) const; }; } // namespace QDataStream& operator<<(QDataStream& s, const smart_playlists::Search& search); QDataStream& operator>>(QDataStream& s, smart_playlists::Search& search); #endif // SMARTPLAYLISTSEARCH_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/searchpreview.cpp000066400000000000000000000101471260417502300266270ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "searchpreview.h" #include "ui_searchpreview.h" #include #include #include #include "querygenerator.h" #include "playlist/playlist.h" namespace smart_playlists { typedef QFuture Future; typedef QFutureWatcher FutureWatcher; SearchPreview::SearchPreview(QWidget* parent) : QWidget(parent), ui_(new Ui_SmartPlaylistSearchPreview), model_(nullptr) { ui_->setupUi(this); // Prevent editing songs and saving settings (like header columns and // geometry) ui_->tree->setEditTriggers(QAbstractItemView::NoEditTriggers); ui_->tree->SetReadOnlySettings(true); QFont bold_font; bold_font.setBold(true); ui_->preview_label->setFont(bold_font); ui_->busy_container->hide(); } SearchPreview::~SearchPreview() { delete ui_; } void SearchPreview::set_application(Application* app) { ui_->tree->SetApplication(app); } void SearchPreview::set_library(LibraryBackend* backend) { backend_ = backend; model_ = new Playlist(nullptr, nullptr, backend_, -1, QString(), false, this); ui_->tree->setModel(model_); ui_->tree->SetPlaylist(model_); ui_->tree->SetItemDelegates(backend_); } void SearchPreview::Update(const Search& search) { if (search == last_search_) { // This search was the same as the last one we did return; } if (generator_ || isHidden()) { // It's busy generating something already, or the widget isn't visible pending_search_ = search; return; } RunSearch(search); } void SearchPreview::showEvent(QShowEvent* e) { if (pending_search_.is_valid() && !generator_) { // There was a search waiting while we were hidden, so run it now RunSearch(pending_search_); pending_search_ = Search(); } QWidget::showEvent(e); } PlaylistItemList DoRunSearch(GeneratorPtr gen) { return gen->Generate(); } void SearchPreview::RunSearch(const Search& search) { generator_.reset(new QueryGenerator); generator_->set_library(backend_); std::dynamic_pointer_cast(generator_)->Load(search); ui_->busy_container->show(); ui_->count_label->hide(); Future future = QtConcurrent::run(DoRunSearch, generator_); FutureWatcher* watcher = new FutureWatcher(this); watcher->setFuture(future); connect(watcher, SIGNAL(finished()), SLOT(SearchFinished())); } void SearchPreview::SearchFinished() { FutureWatcher* watcher = static_cast(sender()); watcher->deleteLater(); last_search_ = std::dynamic_pointer_cast(generator_)->search(); generator_.reset(); if (pending_search_.is_valid() && pending_search_ != last_search_) { // There was another search done while we were running - throw away these // results and do that one now instead RunSearch(pending_search_); pending_search_ = Search(); return; } PlaylistItemList all_items = watcher->result(); PlaylistItemList displayed_items = all_items.mid(0, Generator::kDefaultLimit); model_->Clear(); model_->InsertItems(displayed_items); if (displayed_items.count() < all_items.count()) { ui_->count_label->setText(tr("%1 songs found (showing %2)") .arg(all_items.count()) .arg(displayed_items.count())); } else { ui_->count_label->setText(tr("%1 songs found").arg(all_items.count())); } ui_->busy_container->hide(); ui_->count_label->show(); } } // namespace clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/searchpreview.h000066400000000000000000000032111260417502300262660ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SMARTPLAYLISTSEARCHPREVIEW_H #define SMARTPLAYLISTSEARCHPREVIEW_H #include "search.h" #include "smartplaylists/generator_fwd.h" #include class Application; class LibraryBackend; class Playlist; class Ui_SmartPlaylistSearchPreview; namespace smart_playlists { class SearchPreview : public QWidget { Q_OBJECT public: SearchPreview(QWidget* parent = nullptr); ~SearchPreview(); void set_application(Application* app); void set_library(LibraryBackend* backend); void Update(const Search& search); protected: void showEvent(QShowEvent*); private: void RunSearch(const Search& search); private slots: void SearchFinished(); private: Ui_SmartPlaylistSearchPreview* ui_; QList fields_; LibraryBackend* backend_; Playlist* model_; Search pending_search_; Search last_search_; GeneratorPtr generator_; }; } // namespace #endif // SMARTPLAYLISTSEARCHPREVIEW_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/searchpreview.ui000066400000000000000000000047661260417502300264740ustar00rootroot00000000000000 SmartPlaylistSearchPreview 0 0 651 377 Form 0 Preview Qt::Horizontal 40 20 0 Loading... Qt::ScrollBarAlwaysOn false false true BusyIndicator QWidget
widgets/busyindicator.h
1
PlaylistView QTreeView
playlist/playlistview.h
clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/searchterm.cpp000066400000000000000000000326121260417502300261160ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "searchterm.h" #include "playlist/playlist.h" namespace smart_playlists { SearchTerm::SearchTerm() : field_(Field_Title), operator_(Op_Equals) {} SearchTerm::SearchTerm(Field field, Operator op, const QVariant& value) : field_(field), operator_(op), value_(value) {} QString SearchTerm::ToSql() const { QString col = FieldColumnName(field_); QString date = DateName(date_, true); QString value = value_.toString(); value.replace('\'', "''"); QString second_value; bool special_date_query = (operator_ == SearchTerm::Op_NumericDate || operator_ == SearchTerm::Op_NumericDateNot || operator_ == SearchTerm::Op_RelativeDate); // Floating point problems... // Theoretically 0.0 == 0 stars, 0.1 == 0.5 star, 0.2 == 1 star etc. // but in reality we need to consider anything from [0.05, 0.15) range // to be 0.5 star etc. // To make this simple, I transform the ranges to integeres and then // operate on ints: [0.0, 0.05) -> 0, [0.05, 0.15) -> 1 etc. if (TypeOf(field_) == Type_Rating) { col = "CAST ((" + col + " + 0.05) * 10 AS INTEGER)"; value = "CAST ((" + value + " + 0.05) * 10 AS INTEGER)"; } else if (TypeOf(field_) == Type_Date) { if (!special_date_query) { // We have the exact date // The calendar widget specifies no time so ditch the possible time part // from integers representing the dates. col = "DATE(" + col + ", 'unixepoch', 'localtime')"; value = "DATE(" + value + ", 'unixepoch', 'localtime')"; } else { // We have a numeric date, consider also the time for more precision col = "DATETIME(" + col + ", 'unixepoch', 'localtime')"; second_value = second_value_.toString(); second_value.replace('\'', "''"); if (date == "weeks") { // Sqlite doesn't know weeks, transform them to days date = "days"; value = QString::number(value_.toInt() * 7); second_value = QString::number(second_value_.toInt() * 7); } } } else if (TypeOf(field_) == Type_Time) { // Convert seconds to nanoseconds value = "CAST (" + value + " *1000000000 AS INTEGER)"; } switch (operator_) { case Op_Contains: return col + " LIKE '%" + value + "%'"; case Op_NotContains: return col + " NOT LIKE '%" + value + "%'"; case Op_StartsWith: return col + " LIKE '" + value + "%'"; case Op_EndsWith: return col + " LIKE '%" + value + "'"; case Op_Equals: if (TypeOf(field_) == Type_Text) return col + " LIKE '" + value + "'"; else if (TypeOf(field_) == Type_Rating || TypeOf(field_) == Type_Date || TypeOf(field_) == Type_Time) return col + " = " + value; else return col + " = '" + value + "'"; case Op_GreaterThan: if (TypeOf(field_) == Type_Rating || TypeOf(field_) == Type_Date || TypeOf(field_) == Type_Time) return col + " > " + value; else return col + " > '" + value + "'"; case Op_LessThan: if (TypeOf(field_) == Type_Rating || TypeOf(field_) == Type_Date || TypeOf(field_) == Type_Time) return col + " < " + value; else return col + " < '" + value + "'"; case Op_NumericDate: return col + " > " + "DATETIME('now', '-" + value + " " + date + "', 'localtime')"; case Op_NumericDateNot: return col + " < " + "DATETIME('now', '-" + value + " " + date + "', 'localtime')"; case Op_RelativeDate: // Consider the time range before the first date but after the second one return "(" + col + " < " + "DATETIME('now', '-" + value + " " + date + "', 'localtime') AND " + col + " > " + "DATETIME('now', '-" + second_value + " " + date + "', 'localtime'))"; case Op_NotEquals: if (TypeOf(field_) == Type_Text) { return col + " <> '" + value + "'"; } else { return col + " <> " + value; } } return QString(); } bool SearchTerm::is_valid() const { // We can accept also a zero value in these cases if (operator_ == SearchTerm::Op_NumericDate) { return value_.toInt() >= 0; } else if (operator_ == SearchTerm::Op_RelativeDate) { return (value_.toInt() >= 0 && value_.toInt() < second_value_.toInt()); } switch (TypeOf(field_)) { case Type_Text: return !value_.toString().isEmpty(); case Type_Date: return value_.toInt() != 0; case Type_Number: return value_.toInt() >= 0; case Type_Rating: return value_.toFloat() >= 0.0; case Type_Time: return true; case Type_Invalid: return false; } return false; } bool SearchTerm::operator==(const SearchTerm& other) const { return field_ == other.field_ && operator_ == other.operator_ && value_ == other.value_ && date_ == other.date_ && second_value_ == other.second_value_; } SearchTerm::Type SearchTerm::TypeOf(Field field) { switch (field) { case Field_Length: return Type_Time; case Field_Track: case Field_Disc: case Field_Year: case Field_OriginalYear: case Field_BPM: case Field_Bitrate: case Field_Samplerate: case Field_Filesize: case Field_PlayCount: case Field_SkipCount: case Field_Score: return Type_Number; case Field_LastPlayed: case Field_DateCreated: case Field_DateModified: return Type_Date; case Field_Rating: return Type_Rating; default: return Type_Text; } } OperatorList SearchTerm::OperatorsForType(Type type) { switch (type) { case Type_Text: return OperatorList() << Op_Contains << Op_NotContains << Op_Equals << Op_NotEquals << Op_StartsWith << Op_EndsWith; case Type_Date: return OperatorList() << Op_Equals << Op_NotEquals << Op_GreaterThan << Op_LessThan << Op_NumericDate << Op_NumericDateNot << Op_RelativeDate; default: return OperatorList() << Op_Equals << Op_NotEquals << Op_GreaterThan << Op_LessThan; } } QString SearchTerm::OperatorText(Type type, Operator op) { if (type == Type_Date) { switch (op) { case Op_GreaterThan: return QObject::tr("after"); case Op_LessThan: return QObject::tr("before"); case Op_Equals: return QObject::tr("on"); case Op_NotEquals: return QObject::tr("not on"); case Op_NumericDate: return QObject::tr("in the last"); case Op_NumericDateNot: return QObject::tr("not in the last"); case Op_RelativeDate: return QObject::tr("between"); default: return QString(); } } switch (op) { case Op_Contains: return QObject::tr("contains"); case Op_NotContains: return QObject::tr("does not contain"); case Op_StartsWith: return QObject::tr("starts with"); case Op_EndsWith: return QObject::tr("ends with"); case Op_GreaterThan: return QObject::tr("greater than"); case Op_LessThan: return QObject::tr("less than"); case Op_Equals: return QObject::tr("equals"); case Op_NotEquals: return QObject::tr("not equals"); default: return QString(); } return QString(); } QString SearchTerm::FieldColumnName(Field field) { switch (field) { case Field_Length: return "length"; case Field_Track: return "track"; case Field_Disc: return "disc"; case Field_Year: return "year"; case Field_OriginalYear: return "originalyear"; case Field_BPM: return "bpm"; case Field_Bitrate: return "bitrate"; case Field_Samplerate: return "samplerate"; case Field_Filesize: return "filesize"; case Field_PlayCount: return "playcount"; case Field_SkipCount: return "skipcount"; case Field_LastPlayed: return "lastplayed"; case Field_DateCreated: return "ctime"; case Field_DateModified: return "mtime"; case Field_Rating: return "rating"; case Field_Score: return "score"; case Field_Title: return "title"; case Field_Artist: return "artist"; case Field_Album: return "album"; case Field_AlbumArtist: return "albumartist"; case Field_Composer: return "composer"; case Field_Performer: return "performer"; case Field_Grouping: return "grouping"; case Field_Genre: return "genre"; case Field_Comment: return "comment"; case Field_Filepath: return "filename"; case FieldCount: Q_ASSERT(0); } return QString(); } QString SearchTerm::FieldName(Field field) { switch (field) { case Field_Length: return Playlist::column_name(Playlist::Column_Length); case Field_Track: return Playlist::column_name(Playlist::Column_Track); case Field_Disc: return Playlist::column_name(Playlist::Column_Disc); case Field_Year: return Playlist::column_name(Playlist::Column_Year); case Field_OriginalYear: return Playlist::column_name(Playlist::Column_OriginalYear); case Field_BPM: return Playlist::column_name(Playlist::Column_BPM); case Field_Bitrate: return Playlist::column_name(Playlist::Column_Bitrate); case Field_Samplerate: return Playlist::column_name(Playlist::Column_Samplerate); case Field_Filesize: return Playlist::column_name(Playlist::Column_Filesize); case Field_PlayCount: return Playlist::column_name(Playlist::Column_PlayCount); case Field_SkipCount: return Playlist::column_name(Playlist::Column_SkipCount); case Field_LastPlayed: return Playlist::column_name(Playlist::Column_LastPlayed); case Field_DateCreated: return Playlist::column_name(Playlist::Column_DateCreated); case Field_DateModified: return Playlist::column_name(Playlist::Column_DateModified); case Field_Rating: return Playlist::column_name(Playlist::Column_Rating); case Field_Score: return Playlist::column_name(Playlist::Column_Score); case Field_Title: return Playlist::column_name(Playlist::Column_Title); case Field_Artist: return Playlist::column_name(Playlist::Column_Artist); case Field_Album: return Playlist::column_name(Playlist::Column_Album); case Field_AlbumArtist: return Playlist::column_name(Playlist::Column_AlbumArtist); case Field_Composer: return Playlist::column_name(Playlist::Column_Composer); case Field_Performer: return Playlist::column_name(Playlist::Column_Performer); case Field_Grouping: return Playlist::column_name(Playlist::Column_Grouping); case Field_Genre: return Playlist::column_name(Playlist::Column_Genre); case Field_Comment: return QObject::tr("Comment"); case Field_Filepath: return Playlist::column_name(Playlist::Column_Filename); case FieldCount: Q_ASSERT(0); } return QString(); } QString SearchTerm::FieldSortOrderText(Type type, bool ascending) { switch (type) { case Type_Text: return ascending ? QObject::tr("A-Z") : QObject::tr("Z-A"); case Type_Date: return ascending ? QObject::tr("oldest first") : QObject::tr("newest first"); case Type_Time: return ascending ? QObject::tr("shortest first") : QObject::tr("longest first"); case Type_Number: case Type_Rating: return ascending ? QObject::tr("smallest first") : QObject::tr("biggest first"); case Type_Invalid: return QString(); } return QString(); } QString SearchTerm::DateName(DateType date, bool forQuery) { // If forQuery is true, untranslated keywords are returned switch (date) { case Date_Hour: return (forQuery ? "hours" : QObject::tr("Hours")); case Date_Day: return (forQuery ? "days" : QObject::tr("Days")); case Date_Week: return (forQuery ? "weeks" : QObject::tr("Weeks")); case Date_Month: return (forQuery ? "months" : QObject::tr("Months")); case Date_Year: return (forQuery ? "years" : QObject::tr("Years")); } return QString(); } } // namespace QDataStream& operator<<(QDataStream& s, const smart_playlists::SearchTerm& term) { s << quint8(term.field_); s << quint8(term.operator_); s << term.value_; s << term.second_value_; s << quint8(term.date_); return s; } QDataStream& operator>>(QDataStream& s, smart_playlists::SearchTerm& term) { quint8 field, op, date; s >> field >> op >> term.value_ >> term.second_value_ >> date; term.field_ = smart_playlists::SearchTerm::Field(field); term.operator_ = smart_playlists::SearchTerm::Operator(op); term.date_ = smart_playlists::SearchTerm::DateType(date); return s; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/searchterm.h000066400000000000000000000065551260417502300255720ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SMARTPLAYLISTSEARCHTERM_H #define SMARTPLAYLISTSEARCHTERM_H #include #include namespace smart_playlists { class SearchTerm { public: // These values are persisted, so add to the end of the enum only enum Field { Field_Title = 0, Field_Artist, Field_Album, Field_AlbumArtist, Field_Composer, Field_Length, Field_Track, Field_Disc, Field_Year, Field_Genre, Field_BPM, Field_Bitrate, Field_Samplerate, Field_Filesize, Field_DateCreated, Field_DateModified, Field_Rating, Field_Score, Field_PlayCount, Field_SkipCount, Field_LastPlayed, Field_Comment, Field_Filepath, Field_Performer, Field_Grouping, Field_OriginalYear, FieldCount }; // These values are persisted, so add to the end of the enum only enum Operator { // For text Op_Contains = 0, Op_NotContains = 1, Op_StartsWith = 2, Op_EndsWith = 3, // For numbers Op_GreaterThan = 4, Op_LessThan = 5, // For everything Op_Equals = 6, Op_NotEquals = 9, // For numeric dates (e.g. in the last X days) Op_NumericDate = 7, // For relative dates Op_RelativeDate = 8, // For numeric dates (e.g. not in the last X days) Op_NumericDateNot = 10, // Next value = 11 }; enum Type { Type_Text, Type_Date, Type_Time, Type_Number, Type_Rating, Type_Invalid }; // These values are persisted, so add to the end of the enum only enum DateType { Date_Hour = 0, Date_Day, Date_Week, Date_Month, Date_Year, }; SearchTerm(); SearchTerm(Field field, Operator op, const QVariant& value); Field field_; Operator operator_; QVariant value_; DateType date_; // For relative dates, we need a second parameter, might be useful somewhere // else QVariant second_value_; QString ToSql() const; bool is_valid() const; bool operator==(const SearchTerm& other) const; bool operator!=(const SearchTerm& other) const { return !(*this == other); } static Type TypeOf(Field field); static QList OperatorsForType(Type type); static QString OperatorText(Type type, Operator op); static QString FieldName(Field field); static QString FieldColumnName(Field field); static QString FieldSortOrderText(Type type, bool ascending); static QString DateName(DateType date, bool forQuery); }; typedef QList OperatorList; } // namespace QDataStream& operator<<(QDataStream& s, const smart_playlists::SearchTerm& term); QDataStream& operator>>(QDataStream& s, smart_playlists::SearchTerm& term); #endif // SMARTPLAYLISTSEARCHTERM_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/searchtermwidget.cpp000066400000000000000000000322221260417502300273170ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "searchterm.h" #include "searchtermwidget.h" #include "ui_searchtermwidget.h" #include "core/utilities.h" #include "playlist/playlist.h" #include "playlist/playlistdelegates.h" #include "ui/iconloader.h" #include #include #include #include #include #include #include // Exported by QtGui void qt_blurImage(QPainter* p, QImage& blurImage, qreal radius, bool quality, bool alphaOnly, int transposed = 0); namespace smart_playlists { class SearchTermWidget::Overlay : public QWidget { public: Overlay(SearchTermWidget* parent); void Grab(); void SetOpacity(float opacity); float opacity() const { return opacity_; } static const int kSpacing; static const int kIconSize; protected: void paintEvent(QPaintEvent*); void mouseReleaseEvent(QMouseEvent*); void keyReleaseEvent(QKeyEvent* e); private: SearchTermWidget* parent_; float opacity_; QString text_; QPixmap pixmap_; QPixmap icon_; }; const int SearchTermWidget::Overlay::kSpacing = 6; const int SearchTermWidget::Overlay::kIconSize = 22; SearchTermWidget::SearchTermWidget(LibraryBackend* library, QWidget* parent) : QWidget(parent), ui_(new Ui_SmartPlaylistSearchTermWidget), library_(library), overlay_(nullptr), animation_(new QPropertyAnimation(this, "overlay_opacity", this)), active_(true), initialized_(false), current_field_type_(SearchTerm::Type_Invalid) { ui_->setupUi(this); connect(ui_->field, SIGNAL(currentIndexChanged(int)), SLOT(FieldChanged(int))); connect(ui_->op, SIGNAL(currentIndexChanged(int)), SLOT(OpChanged(int))); connect(ui_->remove, SIGNAL(clicked()), SIGNAL(RemoveClicked())); connect(ui_->value_date, SIGNAL(dateChanged(QDate)), SIGNAL(Changed())); connect(ui_->value_number, SIGNAL(valueChanged(int)), SIGNAL(Changed())); connect(ui_->value_rating, SIGNAL(RatingChanged(float)), SIGNAL(Changed())); connect(ui_->value_text, SIGNAL(textChanged(QString)), SIGNAL(Changed())); connect(ui_->value_time, SIGNAL(timeChanged(QTime)), SIGNAL(Changed())); connect(ui_->value_date_numeric, SIGNAL(valueChanged(int)), SIGNAL(Changed())); connect(ui_->value_date_numeric1, SIGNAL(valueChanged(int)), SLOT(RelativeValueChanged())); connect(ui_->value_date_numeric2, SIGNAL(valueChanged(int)), SLOT(RelativeValueChanged())); connect(ui_->date_type, SIGNAL(currentIndexChanged(int)), SIGNAL(Changed())); connect(ui_->date_type_relative, SIGNAL(currentIndexChanged(int)), SIGNAL(Changed())); ui_->value_date->setDate(QDate::currentDate()); // Populate the combo boxes for (int i = 0; i < SearchTerm::FieldCount; ++i) { ui_->field->addItem(SearchTerm::FieldName(SearchTerm::Field(i))); ui_->field->setItemData(i, i); } ui_->field->model()->sort(0); // Populate the date type combo box for (int i = 0; i < 5; ++i) { ui_->date_type->addItem( SearchTerm::DateName(SearchTerm::DateType(i), false)); ui_->date_type->setItemData(i, i); ui_->date_type_relative->addItem( SearchTerm::DateName(SearchTerm::DateType(i), false)); ui_->date_type_relative->setItemData(i, i); } // Icons on the buttons ui_->remove->setIcon(IconLoader::Load("list-remove")); // Set stylesheet QFile stylesheet_file(":/smartplaylistsearchterm.css"); stylesheet_file.open(QIODevice::ReadOnly); QString stylesheet = QString::fromAscii(stylesheet_file.readAll()); const QColor base(222, 97, 97, 128); stylesheet.replace("%light2", Utilities::ColorToRgba(base.lighter(140))); stylesheet.replace("%light", Utilities::ColorToRgba(base.lighter(120))); stylesheet.replace("%dark", Utilities::ColorToRgba(base.darker(120))); stylesheet.replace("%base", Utilities::ColorToRgba(base)); setStyleSheet(stylesheet); } SearchTermWidget::~SearchTermWidget() { delete ui_; } void SearchTermWidget::FieldChanged(int index) { SearchTerm::Field field = SearchTerm::Field(ui_->field->itemData(index).toInt()); SearchTerm::Type type = SearchTerm::TypeOf(field); // Populate the operator combo box if (type != current_field_type_) { ui_->op->clear(); for (SearchTerm::Operator op : SearchTerm::OperatorsForType(type)) { const int i = ui_->op->count(); ui_->op->addItem(SearchTerm::OperatorText(type, op)); ui_->op->setItemData(i, op); } current_field_type_ = type; } // Show the correct value editor QWidget* page = nullptr; switch (type) { case SearchTerm::Type_Time: page = ui_->page_time; break; case SearchTerm::Type_Number: page = ui_->page_number; break; case SearchTerm::Type_Date: page = ui_->page_date; break; case SearchTerm::Type_Rating: page = ui_->page_rating; break; case SearchTerm::Type_Text: page = ui_->page_text; break; case SearchTerm::Type_Invalid: page = nullptr; break; } ui_->value_stack->setCurrentWidget(page); // Maybe set a tag completer switch (field) { case SearchTerm::Field_Artist: new TagCompleter(library_, Playlist::Column_Artist, ui_->value_text); break; case SearchTerm::Field_Album: new TagCompleter(library_, Playlist::Column_Album, ui_->value_text); break; default: ui_->value_text->setCompleter(nullptr); } emit Changed(); } void SearchTermWidget::OpChanged(int index) { // We need to change the page only in the following case if ((ui_->value_stack->currentWidget() == ui_->page_date) || (ui_->value_stack->currentWidget() == ui_->page_date_numeric) || (ui_->value_stack->currentWidget() == ui_->page_date_relative)) { QWidget* page = nullptr; if (index == 4 || index == 5) { page = ui_->page_date_numeric; } else if (index == 6) { page = ui_->page_date_relative; } else { page = ui_->page_date; } ui_->value_stack->setCurrentWidget(page); } emit Changed(); } void SearchTermWidget::SetActive(bool active) { active_ = active; delete overlay_; overlay_ = nullptr; ui_->container->setEnabled(active); if (!active) { overlay_ = new Overlay(this); } } void SearchTermWidget::enterEvent(QEvent*) { if (!overlay_ || !isEnabled()) return; animation_->stop(); animation_->setEndValue(1.0); animation_->setDuration(80); animation_->start(); } void SearchTermWidget::leaveEvent(QEvent*) { if (!overlay_) return; animation_->stop(); animation_->setEndValue(0.0); animation_->setDuration(160); animation_->start(); } void SearchTermWidget::resizeEvent(QResizeEvent* e) { QWidget::resizeEvent(e); if (overlay_ && overlay_->isVisible()) { QTimer::singleShot(0, this, SLOT(Grab())); } } void SearchTermWidget::showEvent(QShowEvent* e) { QWidget::showEvent(e); if (overlay_) { QTimer::singleShot(0, this, SLOT(Grab())); } } void SearchTermWidget::Grab() { overlay_->Grab(); } void SearchTermWidget::set_overlay_opacity(float opacity) { if (overlay_) overlay_->SetOpacity(opacity); } float SearchTermWidget::overlay_opacity() const { return overlay_ ? overlay_->opacity() : 0.0; } void SearchTermWidget::SetTerm(const SearchTerm& term) { ui_->field->setCurrentIndex(ui_->field->findData(term.field_)); ui_->op->setCurrentIndex(ui_->op->findData(term.operator_)); // The value depends on the data type switch (SearchTerm::TypeOf(term.field_)) { case SearchTerm::Type_Text: ui_->value_text->setText(term.value_.toString()); break; case SearchTerm::Type_Number: ui_->value_number->setValue(term.value_.toInt()); break; case SearchTerm::Type_Date: if (ui_->value_stack->currentWidget() == ui_->page_date_numeric) { ui_->value_date_numeric->setValue(term.value_.toInt()); ui_->date_type->setCurrentIndex(term.date_); } else if (ui_->value_stack->currentWidget() == ui_->page_date_relative) { ui_->value_date_numeric1->setValue(term.value_.toInt()); ui_->value_date_numeric2->setValue(term.second_value_.toInt()); ui_->date_type_relative->setCurrentIndex(term.date_); } else if (ui_->value_stack->currentWidget() == ui_->page_date) { ui_->value_date->setDateTime( QDateTime::fromTime_t(term.value_.toInt())); } break; case SearchTerm::Type_Time: ui_->value_time->setTime(QTime(0, 0).addSecs(term.value_.toInt())); break; case SearchTerm::Type_Rating: ui_->value_rating->set_rating(term.value_.toFloat()); break; case SearchTerm::Type_Invalid: break; } } SearchTerm SearchTermWidget::Term() const { const int field = ui_->field->itemData(ui_->field->currentIndex()).toInt(); const int op = ui_->op->itemData(ui_->op->currentIndex()).toInt(); SearchTerm ret; ret.field_ = SearchTerm::Field(field); ret.operator_ = SearchTerm::Operator(op); // The value depends on the data type const QWidget* value_page = ui_->value_stack->currentWidget(); if (value_page == ui_->page_text) { ret.value_ = ui_->value_text->text(); } else if (value_page == ui_->page_number) { ret.value_ = ui_->value_number->value(); } else if (value_page == ui_->page_date) { ret.value_ = ui_->value_date->dateTime().toTime_t(); } else if (value_page == ui_->page_time) { ret.value_ = QTime(0, 0).secsTo(ui_->value_time->time()); } else if (value_page == ui_->page_rating) { ret.value_ = ui_->value_rating->rating(); } else if (value_page == ui_->page_date_numeric) { ret.date_ = SearchTerm::DateType(ui_->date_type->currentIndex()); ret.value_ = ui_->value_date_numeric->value(); } else if (value_page == ui_->page_date_relative) { ret.date_ = SearchTerm::DateType(ui_->date_type_relative->currentIndex()); ret.value_ = ui_->value_date_numeric1->value(); ret.second_value_ = ui_->value_date_numeric2->value(); } return ret; } void SearchTermWidget::RelativeValueChanged() { // Don't check for validity when creating the widget if (!initialized_) { initialized_ = true; return; } // Explain the user why he can't proceed if (ui_->value_date_numeric1->value() >= ui_->value_date_numeric2->value()) { QMessageBox::warning( this, tr("Clementine"), tr("The second value must be greater than the first one!")); } // Emit the signal in any case, so the Next button will be disabled emit Changed(); } SearchTermWidget::Overlay::Overlay(SearchTermWidget* parent) : QWidget(parent), parent_(parent), opacity_(0.0), text_(tr("Add search term")), icon_(IconLoader::Load("list-add").pixmap(kIconSize)) { raise(); setFocusPolicy(Qt::TabFocus); } void SearchTermWidget::Overlay::SetOpacity(float opacity) { opacity_ = opacity; update(); } void SearchTermWidget::Overlay::Grab() { hide(); // Take a "screenshot" of the window QPixmap pixmap = QPixmap::grabWidget(parent_); QImage image = pixmap.toImage(); // Blur it QImage blurred(image.size(), QImage::Format_ARGB32_Premultiplied); blurred.fill(Qt::transparent); QPainter blur_painter(&blurred); qt_blurImage(&blur_painter, image, 10.0, true, false); blur_painter.end(); pixmap_ = QPixmap::fromImage(blurred); resize(parent_->size()); show(); update(); } void SearchTermWidget::Overlay::paintEvent(QPaintEvent*) { QPainter p(this); // Background p.fillRect(rect(), palette().window()); // Blurred parent widget p.setOpacity(0.25 + opacity_ * 0.25); p.drawPixmap(0, 0, pixmap_); // Draw a frame p.setOpacity(1.0); p.setPen(palette().color(QPalette::Mid)); p.setRenderHint(QPainter::Antialiasing); p.drawRoundedRect(rect(), 5, 5); // Geometry const QSize contents_size(kIconSize + kSpacing + fontMetrics().width(text_), qMax(kIconSize, fontMetrics().height())); const QRect contents(QPoint((width() - contents_size.width()) / 2, (height() - contents_size.height()) / 2), contents_size); const QRect icon(contents.topLeft(), QSize(kIconSize, kIconSize)); const QRect text(icon.right() + kSpacing, icon.top(), contents.width() - kSpacing - kIconSize, contents.height()); // Icon and text p.setPen(palette().color(QPalette::Text)); p.drawPixmap(icon, icon_); p.drawText(text, Qt::TextDontClip | Qt::AlignVCenter, text_); } void SearchTermWidget::Overlay::mouseReleaseEvent(QMouseEvent*) { emit parent_->Clicked(); } void SearchTermWidget::Overlay::keyReleaseEvent(QKeyEvent* e) { if (e->key() == Qt::Key_Space) emit parent_->Clicked(); } } // namespace clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/searchtermwidget.h000066400000000000000000000040341260417502300267640ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SMARTPLAYLISTSEARCHTERMWIDGET_H #define SMARTPLAYLISTSEARCHTERMWIDGET_H #include "searchterm.h" #include #include class LibraryBackend; class Ui_SmartPlaylistSearchTermWidget; class QPropertyAnimation; namespace smart_playlists { class SearchTermWidget : public QWidget { Q_OBJECT Q_PROPERTY(float overlay_opacity READ overlay_opacity WRITE set_overlay_opacity); public: SearchTermWidget(LibraryBackend* library, QWidget* parent); ~SearchTermWidget(); void SetActive(bool active); float overlay_opacity() const; void set_overlay_opacity(float opacity); void SetTerm(const SearchTerm& term); SearchTerm Term() const; signals: void Clicked(); void RemoveClicked(); void Changed(); protected: void showEvent(QShowEvent*); void enterEvent(QEvent*); void leaveEvent(QEvent*); void resizeEvent(QResizeEvent*); private slots: void FieldChanged(int index); void OpChanged(int index); void RelativeValueChanged(); void Grab(); private: class Overlay; friend class Overlay; Ui_SmartPlaylistSearchTermWidget* ui_; LibraryBackend* library_; Overlay* overlay_; QPropertyAnimation* animation_; bool active_; bool initialized_; SearchTerm::Type current_field_type_; }; } // namespace #endif // SMARTPLAYLISTSEARCHTERMWIDGET_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/searchtermwidget.ui000066400000000000000000000202531260417502300271530ustar00rootroot00000000000000 SmartPlaylistSearchTermWidget 0 0 640 38 0 0 Form 0 0 QFrame::StyledPanel QFrame::Raised 0 0 6 0 0 0 0 0 0 0 mm:ss 0 0 1000000 0 0 true 0 0 1 999 0 0 0 999 1 0 0 and Qt::AlignCenter 1 999 2 0 0 ago 0 0 RatingWidget QWidget
widgets/ratingwidget.h
1
clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/wizard.cpp000066400000000000000000000113741260417502300252630ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "querywizardplugin.h" #include "wizard.h" #include "wizardplugin.h" #include "ui_wizardfinishpage.h" #include #include #include #include namespace smart_playlists { class Wizard::TypePage : public QWizardPage { public: TypePage(QWidget* parent) : QWizardPage(parent), next_id_(-1) {} int nextId() const { return next_id_; } int next_id_; }; class Wizard::FinishPage : public QWizardPage { public: FinishPage(QWidget* parent) : QWizardPage(parent), ui_(new Ui_SmartPlaylistWizardFinishPage) { ui_->setupUi(this); connect(ui_->name, SIGNAL(textChanged(QString)), SIGNAL(completeChanged())); } ~FinishPage() { delete ui_; } int nextId() const { return -1; } bool isComplete() const { return !ui_->name->text().isEmpty(); } Ui_SmartPlaylistWizardFinishPage* ui_; }; Wizard::Wizard(Application* app, LibraryBackend* library, QWidget* parent) : QWizard(parent), app_(app), library_(library), type_page_(new TypePage(this)), finish_page_(new FinishPage(this)), type_index_(-1), type_mapper_(new QSignalMapper(this)) { setWindowIcon(QIcon(":/icon.png")); setWindowTitle(tr("Smart playlist")); resize(788, 628); #ifdef Q_OS_MAC // MacStyle leaves an ugly empty space on the left side of the dialog. setWizardStyle(QWizard::ClassicStyle); #endif // Q_OS_MAC // Type page type_page_->setTitle(tr("Playlist type")); type_page_->setSubTitle( tr("A smart playlist is a dynamic list of songs that come from your " "library. There are different types of smart playlist that offer " "different ways of selecting songs.")); type_page_->setStyleSheet( "QRadioButton { font-weight: bold; }" "QLabel { margin-bottom: 1em; margin-left: 24px; }"); addPage(type_page_); // Finish page finish_page_->setTitle(tr("Finish")); finish_page_->setSubTitle(tr("Choose a name for your smart playlist")); finish_id_ = addPage(finish_page_); connect(type_mapper_, SIGNAL(mapped(int)), SLOT(TypeChanged(int))); new QVBoxLayout(type_page_); AddPlugin(new QueryWizardPlugin(app_, library_, this)); // Skip the type page - remove this when we have more than one type setStartId(2); } Wizard::~Wizard() { qDeleteAll(plugins_); } void Wizard::SetGenerator(GeneratorPtr gen) { // Find the right type and jump to the start page for (int i = 0; i < plugins_.count(); ++i) { if (plugins_[i]->type() == gen->type()) { TypeChanged(i); // TODO: Put this back in when the setStartId is removed from the ctor // next(); break; } } // Set the name finish_page_->ui_->name->setText(gen->name()); finish_page_->ui_->dynamic->setChecked(gen->is_dynamic()); // Tell the plugin to load plugins_[type_index_]->SetGenerator(gen); } void Wizard::AddPlugin(WizardPlugin* plugin) { const int index = plugins_.count(); plugins_ << plugin; plugin->Init(this, finish_id_); // Create the radio button QRadioButton* radio_button = new QRadioButton(plugin->name(), type_page_); QLabel* description = new QLabel(plugin->description(), type_page_); type_page_->layout()->addWidget(radio_button); type_page_->layout()->addWidget(description); type_mapper_->setMapping(radio_button, index); connect(radio_button, SIGNAL(clicked()), type_mapper_, SLOT(map())); if (index == 0) { radio_button->setChecked(true); TypeChanged(0); } } void Wizard::TypeChanged(int index) { type_index_ = index; type_page_->next_id_ = plugins_[type_index_]->start_page(); } GeneratorPtr Wizard::CreateGenerator() const { GeneratorPtr ret; if (type_index_ == -1) return ret; ret = plugins_[type_index_]->CreateGenerator(); if (!ret) return ret; ret->set_name(finish_page_->ui_->name->text()); ret->set_dynamic(finish_page_->ui_->dynamic->isChecked()); return ret; } void Wizard::initializePage(int id) { if (id == finish_id_) { finish_page_->ui_->dynamic_container->setEnabled( plugins_[type_index_]->is_dynamic()); } QWizard::initializePage(id); } } // namespace clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/wizard.h000066400000000000000000000031751260417502300247300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SMARTPLAYLISTWIZARD_H #define SMARTPLAYLISTWIZARD_H #include "generator_fwd.h" #include class Application; class LibraryBackend; class Ui_SmartPlaylistWizardFinishPage; class QSignalMapper; namespace smart_playlists { class WizardPlugin; class Wizard : public QWizard { Q_OBJECT public: Wizard(Application* app, LibraryBackend* library, QWidget* parent); ~Wizard(); void SetGenerator(GeneratorPtr gen); GeneratorPtr CreateGenerator() const; protected: void initializePage(int id); private: class TypePage; class FinishPage; void AddPlugin(WizardPlugin* plugin); private slots: void TypeChanged(int index); private: Application* app_; LibraryBackend* library_; TypePage* type_page_; FinishPage* finish_page_; int finish_id_; int type_index_; QList plugins_; QSignalMapper* type_mapper_; }; } // namespace #endif // SMARTPLAYLISTWIZARD_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/wizardfinishpage.ui000066400000000000000000000031361260417502300271510ustar00rootroot00000000000000 SmartPlaylistWizardFinishPage 0 0 583 370 Form Name 0 Use dynamic mode In dynamic mode new tracks will be chosen and added to the playlist every time a song finishes. true 24 clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/wizardplugin.cpp000066400000000000000000000021461260417502300264770ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "wizardplugin.h" namespace smart_playlists { WizardPlugin::WizardPlugin(Application* app, LibraryBackend* library, QObject* parent) : QObject(parent), app_(app), library_(library), start_page_(-1) {} void WizardPlugin::Init(QWizard* wizard, int finish_page_id) { start_page_ = CreatePages(wizard, finish_page_id); } } // namespace smart_playlists clementine-1.2.3+git1354-gdaddbde+dfsg/src/smartplaylists/wizardplugin.h000066400000000000000000000031551260417502300261450ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef WIZARDPLUGIN_H #define WIZARDPLUGIN_H #include #include "generator_fwd.h" class Application; class LibraryBackend; class QWizard; namespace smart_playlists { class WizardPlugin : public QObject { Q_OBJECT public: WizardPlugin(Application* app, LibraryBackend* library, QObject* parent); virtual QString type() const = 0; virtual QString name() const = 0; virtual QString description() const = 0; virtual bool is_dynamic() const { return false; } int start_page() const { return start_page_; } virtual void SetGenerator(GeneratorPtr gen) = 0; virtual GeneratorPtr CreateGenerator() const = 0; void Init(QWizard* wizard, int finish_page_id); protected: virtual int CreatePages(QWizard* wizard, int finish_page_id) = 0; Application* app_; LibraryBackend* library_; private: int start_page_; }; } // namespace smart_playlists #endif // WIZARDPLUGIN_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/000077500000000000000000000000001260417502300220005ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/artistinfoview.cpp000066400000000000000000000044051260417502300255640ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "artistinfoview.h" #include "echonestbiographies.h" #include "echonestimages.h" #include "songinfofetcher.h" #include "songkickconcerts.h" #include "widgets/prettyimageview.h" #ifdef HAVE_LIBLASTFM #include "echonestsimilarartists.h" #include "echonesttags.h" #endif ArtistInfoView::ArtistInfoView(QWidget* parent) : SongInfoBase(parent) { fetcher_->AddProvider(new EchoNestBiographies); fetcher_->AddProvider(new EchoNestImages); fetcher_->AddProvider(new SongkickConcerts); #ifdef HAVE_LIBLASTFM fetcher_->AddProvider(new EchoNestSimilarArtists); fetcher_->AddProvider(new EchoNestTags); #endif } ArtistInfoView::~ArtistInfoView() {} bool ArtistInfoView::NeedsUpdate(const Song& old_metadata, const Song& new_metadata) const { if (new_metadata.artist().isEmpty()) return false; return old_metadata.artist() != new_metadata.artist(); } void ArtistInfoView::InfoResultReady(int id, const CollapsibleInfoPane::Data& data) { if (id != current_request_id_) return; AddSection(new CollapsibleInfoPane(data, this)); CollapseSections(); } void ArtistInfoView::ResultReady(int id, const SongInfoFetcher::Result& result) { if (id != current_request_id_) return; if (!result.images_.isEmpty()) { // Image view goes at the top PrettyImageView* image_view = new PrettyImageView(network_, this); AddWidget(image_view); for (const QUrl& url : result.images_) { image_view->AddImage(url); } } CollapseSections(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/artistinfoview.h000066400000000000000000000025341260417502300252320ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ARTISTINFOVIEW_H #define ARTISTINFOVIEW_H #include "collapsibleinfopane.h" #include "songinfobase.h" #include "songinfofetcher.h" class PrettyImageView; class QScrollArea; class QTimeLine; class QVBoxLayout; class ArtistInfoView : public SongInfoBase { Q_OBJECT public: ArtistInfoView(QWidget* parent = nullptr); ~ArtistInfoView(); protected: virtual void InfoResultReady(int id, const CollapsibleInfoPane::Data& data); bool NeedsUpdate(const Song& old_metadata, const Song& new_metadata) const; protected slots: void ResultReady(int id, const SongInfoFetcher::Result& result); }; #endif // ARTISTINFOVIEW_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/collapsibleinfoheader.cpp000066400000000000000000000113321260417502300270220ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "collapsibleinfoheader.h" #include #include #include #include #include const int CollapsibleInfoHeader::kHeight = 20; const int CollapsibleInfoHeader::kIconSize = 16; CollapsibleInfoHeader::CollapsibleInfoHeader(QWidget* parent) : QWidget(parent), expanded_(false), hovering_(false), animation_(new QPropertyAnimation(this, "opacity", this)), opacity_(0.0) { setMinimumHeight(kHeight); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); setCursor(QCursor(Qt::PointingHandCursor)); } void CollapsibleInfoHeader::SetTitle(const QString& title) { title_ = title; update(); } void CollapsibleInfoHeader::SetIcon(const QIcon& icon) { icon_ = icon; update(); } void CollapsibleInfoHeader::SetExpanded(bool expanded) { expanded_ = expanded; emit ExpandedToggled(expanded); if (expanded) emit Expanded(); else emit Collapsed(); } void CollapsibleInfoHeader::enterEvent(QEvent*) { hovering_ = true; if (!expanded_) { animation_->stop(); animation_->setEndValue(1.0); animation_->setDuration(80); animation_->start(); } } void CollapsibleInfoHeader::leaveEvent(QEvent*) { hovering_ = false; if (!expanded_) { animation_->stop(); animation_->setEndValue(0.0); animation_->setDuration(160); animation_->start(); } } void CollapsibleInfoHeader::set_opacity(float opacity) { opacity_ = opacity; update(); } void CollapsibleInfoHeader::paintEvent(QPaintEvent* e) { QPainter p(this); QColor active_text_color( palette().color(QPalette::Active, QPalette::HighlightedText)); QColor inactive_text_color(palette().color(QPalette::Active, QPalette::Text)); QColor text_color; if (expanded_) { text_color = active_text_color; } else { p.setOpacity(0.4 + opacity_ * 0.6); text_color = QColor(active_text_color.red() * opacity_ + inactive_text_color.red() * (1.0 - opacity_), active_text_color.green() * opacity_ + inactive_text_color.green() * (1.0 - opacity_), active_text_color.blue() * opacity_ + inactive_text_color.blue() * (1.0 - opacity_)); } QRect indicator_rect(0, 0, height(), height()); QRect icon_rect(height() + 2, (kHeight - kIconSize) / 2, kIconSize, kIconSize); QRect text_rect(rect()); text_rect.setLeft(icon_rect.right() + 4); // Draw the background QColor highlight(palette().color(QPalette::Active, QPalette::Highlight)); const QColor bg_color_1(highlight.lighter(120)); const QColor bg_color_2(highlight.darker(120)); const QColor bg_border(palette().color(QPalette::Dark)); QLinearGradient bg_brush(rect().topLeft(), rect().bottomLeft()); bg_brush.setColorAt(0.0, bg_color_1); bg_brush.setColorAt(0.5, bg_color_1); bg_brush.setColorAt(0.5, bg_color_2); bg_brush.setColorAt(1.0, bg_color_2); p.setPen(Qt::NoPen); p.fillRect(rect(), bg_brush); p.setPen(bg_border); p.drawLine(rect().topLeft(), rect().topRight()); p.drawLine(rect().bottomLeft(), rect().bottomRight()); // Draw the expand/collapse indicator QStyleOption opt; opt.initFrom(this); opt.rect = indicator_rect; opt.state |= QStyle::State_Children; if (expanded_) opt.state |= QStyle::State_Open; if (hovering_) opt.state |= QStyle::State_Active; // Have to use the application's style here because using the widget's style // will trigger QStyleSheetStyle's recursion guard (I don't know why). QApplication::style()->drawPrimitive(QStyle::PE_IndicatorBranch, &opt, &p, this); // Draw the icon p.drawPixmap(icon_rect, icon_.pixmap(kIconSize)); // Draw the title text QFont bold_font(font()); bold_font.setBold(true); p.setFont(bold_font); p.setPen(text_color); p.drawText(text_rect, Qt::AlignLeft | Qt::AlignVCenter, title_); } void CollapsibleInfoHeader::mouseReleaseEvent(QMouseEvent* e) { SetExpanded(!expanded_); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/collapsibleinfoheader.h000066400000000000000000000035531260417502300264750ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef COLLAPSIBLEINFOHEADER_H #define COLLAPSIBLEINFOHEADER_H #include #include class QPropertyAnimation; class CollapsibleInfoHeader : public QWidget { Q_OBJECT Q_PROPERTY(float opacity READ opacity WRITE set_opacity); public: CollapsibleInfoHeader(QWidget* parent = nullptr); static const int kHeight; static const int kIconSize; bool expanded() const { return expanded_; } bool hovering() const { return hovering_; } const QString& title() const { return title_; } const QIcon& icon() const { return icon_; } float opacity() const { return opacity_; } void set_opacity(float opacity); public slots: void SetExpanded(bool expanded); void SetTitle(const QString& title); void SetIcon(const QIcon& icon); signals: void Expanded(); void Collapsed(); void ExpandedToggled(bool expanded); protected: void enterEvent(QEvent*); void leaveEvent(QEvent*); void paintEvent(QPaintEvent* e); void mouseReleaseEvent(QMouseEvent*); private: bool expanded_; bool hovering_; QString title_; QIcon icon_; QPropertyAnimation* animation_; float opacity_; }; #endif // COLLAPSIBLEINFOHEADER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/collapsibleinfopane.cpp000066400000000000000000000040261260417502300265170ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "collapsibleinfoheader.h" #include "collapsibleinfopane.h" #include CollapsibleInfoPane::CollapsibleInfoPane(const Data& data, QWidget* parent) : QWidget(parent), data_(data), header_(new CollapsibleInfoHeader(this)) { QVBoxLayout* layout = new QVBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(3); layout->setSizeConstraint(QLayout::SetMinAndMaxSize); setLayout(layout); layout->addWidget(header_); layout->addWidget(data.contents_); data.contents_->hide(); header_->SetTitle(data.title_); header_->SetIcon(data.icon_); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); connect(header_, SIGNAL(ExpandedToggled(bool)), SLOT(ExpandedToggled(bool))); connect(header_, SIGNAL(ExpandedToggled(bool)), SIGNAL(Toggled(bool))); } void CollapsibleInfoPane::Collapse() { header_->SetExpanded(false); } void CollapsibleInfoPane::Expand() { header_->SetExpanded(true); } void CollapsibleInfoPane::ExpandedToggled(bool expanded) { data_.contents_->setVisible(expanded); } bool CollapsibleInfoPane::Data::operator<( const CollapsibleInfoPane::Data& other) const { const int my_score = (TypeCount - type_) * 1000 + relevance_; const int other_score = (TypeCount - other.type_) * 1000 + other.relevance_; return my_score > other_score; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/collapsibleinfopane.h000066400000000000000000000032351260417502300261650ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef COLLAPSIBLEINFOPANE_H #define COLLAPSIBLEINFOPANE_H #include #include class CollapsibleInfoHeader; class CollapsibleInfoPane : public QWidget { Q_OBJECT public: struct Data { Data() : type_(Type_Biography), relevance_(0) {} bool operator<(const Data& other) const; enum Type { Type_PlayCounts, Type_Tags, Type_Similar, Type_Biography, Type_Lyrics, TypeCount }; QString id_; QString title_; QIcon icon_; Type type_; int relevance_; QWidget* contents_; QObject* content_object_; }; CollapsibleInfoPane(const Data& data, QWidget* parent = nullptr); const Data& data() const { return data_; } public slots: void Expand(); void Collapse(); signals: void Toggled(bool expanded); private slots: void ExpandedToggled(bool expanded); private: Data data_; CollapsibleInfoHeader* header_; }; #endif // COLLAPSIBLEINFOPANE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/echonestbiographies.cpp000066400000000000000000000101741260417502300265340ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "echonestbiographies.h" #include #include #include "songinfotextview.h" #include "core/logging.h" struct EchoNestBiographies::Request { Request(int id) : id_(id), artist_(new Echonest::Artist) {} int id_; std::unique_ptr artist_; }; EchoNestBiographies::EchoNestBiographies() { site_relevance_["wikipedia"] = 100; site_relevance_["lastfm"] = 60; site_relevance_["amazon"] = 30; site_icons_["amazon"] = QIcon(":/providers/amazon.png"); site_icons_["aol"] = QIcon(":/providers/aol.png"); site_icons_["cdbaby"] = QIcon(":/providers/cdbaby.png"); site_icons_["lastfm"] = QIcon(":/last.fm/as.png"); site_icons_["mog"] = QIcon(":/providers/mog.png"); site_icons_["mtvmusic"] = QIcon(":/providers/mtvmusic.png"); site_icons_["myspace"] = QIcon(":/providers/myspace.png"); site_icons_["wikipedia"] = QIcon(":/providers/wikipedia.png"); } void EchoNestBiographies::FetchInfo(int id, const Song& metadata) { std::shared_ptr request(new Request(id)); request->artist_->setName(metadata.artist()); QNetworkReply* reply = request->artist_->fetchBiographies(); connect(reply, SIGNAL(finished()), SLOT(RequestFinished())); requests_[reply] = request; } void EchoNestBiographies::RequestFinished() { QNetworkReply* reply = qobject_cast(sender()); if (!reply || !requests_.contains(reply)) return; reply->deleteLater(); RequestPtr request = requests_.take(reply); try { request->artist_->parseProfile(reply); } catch (Echonest::ParseError e) { qLog(Warning) << "Error parsing echonest reply:" << e.errorType() << e.what(); } QSet already_seen; for (const Echonest::Biography& bio : request->artist_->biographies()) { QString canonical_site = bio.site().toLower(); canonical_site.replace(QRegExp("[^a-z]"), ""); if (already_seen.contains(canonical_site)) continue; already_seen.insert(canonical_site); CollapsibleInfoPane::Data data; data.id_ = "echonest/bio/" + bio.site(); data.title_ = tr("Biography from %1").arg(bio.site()); data.type_ = CollapsibleInfoPane::Data::Type_Biography; if (site_relevance_.contains(canonical_site)) data.relevance_ = site_relevance_[canonical_site]; if (site_icons_.contains(canonical_site)) data.icon_ = site_icons_[canonical_site]; SongInfoTextView* editor = new SongInfoTextView; QString text; // Add a link to the bio webpage at the top if we have one if (!bio.url().isEmpty()) { QString bio_url = bio.url().toEncoded(); if (bio.site() == "facebook") { bio_url.replace("graph.facebook.com", "www.facebook.com"); } text += "
"; } text += bio.text(); if (bio.site() == "last.fm") { // Echonest lost formatting and it seems there is currently no plans on // Echonest side for changing this. // But with last.fm, we can guess newlines: " " corresponds to a newline // (this seems to be because on last.fm' website, extra blank is inserted // before
tag, and this blank is kept). // This is tricky, but this make the display nicer for last.fm // biographies. text.replace(" ", "

"); } editor->SetHtml(text); data.contents_ = editor; emit InfoReady(request->id_, data); } emit Finished(request->id_); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/echonestbiographies.h000066400000000000000000000024141260417502300261770ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ECHONESTBIOGRAPHIES_H #define ECHONESTBIOGRAPHIES_H #include #include "songinfoprovider.h" class QNetworkReply; class EchoNestBiographies : public SongInfoProvider { Q_OBJECT public: EchoNestBiographies(); void FetchInfo(int id, const Song& metadata); private slots: void RequestFinished(); private: QMap site_relevance_; QMap site_icons_; struct Request; typedef std::shared_ptr RequestPtr; QMap requests_; }; #endif // ECHONESTBIOGRAPHIES_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/echonestimages.cpp000066400000000000000000000035521260417502300255070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "echonestimages.h" #include #include #include "core/logging.h" struct EchoNestImages::Request { Request(int id) : id_(id), artist_(new Echonest::Artist) {} int id_; std::unique_ptr artist_; }; void EchoNestImages::FetchInfo(int id, const Song& metadata) { std::shared_ptr request(new Request(id)); request->artist_->setName(metadata.artist()); QNetworkReply* reply = request->artist_->fetchImages(); connect(reply, SIGNAL(finished()), SLOT(RequestFinished())); requests_[reply] = request; } void EchoNestImages::RequestFinished() { QNetworkReply* reply = qobject_cast(sender()); if (!reply || !requests_.contains(reply)) return; reply->deleteLater(); RequestPtr request = requests_.take(reply); try { request->artist_->parseProfile(reply); } catch (Echonest::ParseError e) { qLog(Warning) << "Error parsing echonest reply:" << e.errorType() << e.what(); } for (const Echonest::ArtistImage& image : request->artist_->images()) { emit ImageReady(request->id_, image.url()); } emit Finished(request->id_); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/echonestimages.h000066400000000000000000000022231260417502300251460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ECHONESTIMAGES_H #define ECHONESTIMAGES_H #include #include "songinfoprovider.h" class QNetworkReply; class EchoNestImages : public SongInfoProvider { Q_OBJECT public: void FetchInfo(int id, const Song& metadata); private slots: void RequestFinished(); private: struct Request; typedef std::shared_ptr RequestPtr; QMap requests_; }; #endif // ECHONESTIMAGES_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/echonestsimilarartists.cpp000066400000000000000000000045571260417502300273220ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "echonestsimilarartists.h" #include "tagwidget.h" #include "core/logging.h" #include "ui/iconloader.h" #include Q_DECLARE_METATYPE(QVector); void EchoNestSimilarArtists::FetchInfo(int id, const Song& metadata) { using Echonest::Artist; Artist::SearchParams params; params << Artist::SearchParamEntry(Artist::Name, metadata.artist()); params << Artist::SearchParamEntry(Artist::MinHotttnesss, 0.5); QNetworkReply* reply = Echonest::Artist::fetchSimilar(params); connect(reply, SIGNAL(finished()), SLOT(RequestFinished())); requests_[reply] = id; } void EchoNestSimilarArtists::RequestFinished() { QNetworkReply* reply = qobject_cast(sender()); if (!reply || !requests_.contains(reply)) return; reply->deleteLater(); int id = requests_.take(reply); Echonest::Artists artists; try { artists = Echonest::Artist::parseSimilar(reply); } catch (Echonest::ParseError e) { qLog(Warning) << "Error parsing echonest reply:" << e.errorType() << e.what(); } if (!artists.isEmpty()) { CollapsibleInfoPane::Data data; data.id_ = "echonest/similarartists"; data.title_ = tr("Similar artists"); data.type_ = CollapsibleInfoPane::Data::Type_Similar; data.icon_ = QIcon(":/providers/echonest.png"); TagWidget* widget = new TagWidget(TagWidget::Type_Artists); data.contents_ = widget; widget->SetIcon(QIcon(":/icons/22x22/x-clementine-artist.png")); for (const Echonest::Artist& artist : artists) { widget->AddTag(artist.name()); if (widget->count() >= 10) break; } emit InfoReady(id, data); } emit Finished(id); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/echonestsimilarartists.h000066400000000000000000000021271260417502300267560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ECHONESTSIMILARARTISTS_H #define ECHONESTSIMILARARTISTS_H #include "songinfoprovider.h" class QNetworkReply; class EchoNestSimilarArtists : public SongInfoProvider { Q_OBJECT public: void FetchInfo(int id, const Song& metadata); private slots: void RequestFinished(); private: QMap requests_; }; #endif // ECHONESTSIMILARARTISTS_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/echonesttags.cpp000066400000000000000000000044771260417502300252070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "echonesttags.h" #include #include #include "tagwidget.h" #include "core/logging.h" struct EchoNestTags::Request { Request(int id) : id_(id), artist_(new Echonest::Artist) {} int id_; std::unique_ptr artist_; }; void EchoNestTags::FetchInfo(int id, const Song& metadata) { std::shared_ptr request(new Request(id)); request->artist_->setName(metadata.artist()); QNetworkReply* reply = request->artist_->fetchTerms(); connect(reply, SIGNAL(finished()), SLOT(RequestFinished())); requests_[reply] = request; } void EchoNestTags::RequestFinished() { QNetworkReply* reply = qobject_cast(sender()); if (!reply || !requests_.contains(reply)) return; reply->deleteLater(); RequestPtr request = requests_.take(reply); try { request->artist_->parseProfile(reply); } catch (Echonest::ParseError e) { qLog(Warning) << "Error parsing echonest reply:" << e.errorType() << e.what(); } if (!request->artist_->terms().isEmpty()) { CollapsibleInfoPane::Data data; data.id_ = "echonest/artisttags"; data.title_ = tr("Artist tags"); data.type_ = CollapsibleInfoPane::Data::Type_Tags; data.icon_ = QIcon(":/last.fm/icon_tag.png"); TagWidget* widget = new TagWidget(TagWidget::Type_Tags); data.contents_ = widget; widget->SetIcon(data.icon_); for (const Echonest::Term& term : request->artist_->terms()) { widget->AddTag(term.name()); if (widget->count() >= 10) break; } emit InfoReady(request->id_, data); } emit Finished(request->id_); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/echonesttags.h000066400000000000000000000022131260417502300246360ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ECHONESTTAGS_H #define ECHONESTTAGS_H #include #include "songinfoprovider.h" class QNetworkReply; class EchoNestTags : public SongInfoProvider { Q_OBJECT public: void FetchInfo(int id, const Song& metadata); private slots: void RequestFinished(); private: struct Request; typedef std::shared_ptr RequestPtr; QMap requests_; }; #endif // ECHONESTTAGS_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/lastfmtrackinfoprovider.cpp000066400000000000000000000110061260417502300274440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "lastfmtrackinfoprovider.h" #include "songinfotextview.h" #include "songplaystats.h" #include "tagwidget.h" #include "internet/lastfm/lastfmcompat.h" #include "ui/iconloader.h" void LastfmTrackInfoProvider::FetchInfo(int id, const Song& metadata) { QMap params; params["method"] = "track.getInfo"; params["track"] = metadata.title(); params["artist"] = metadata.artist(); if (!lastfm::ws::Username.isEmpty()) params["username"] = lastfm::ws::Username; QNetworkReply* reply = lastfm::ws::get(params); connect(reply, SIGNAL(finished()), SLOT(RequestFinished())); requests_[reply] = id; } void LastfmTrackInfoProvider::RequestFinished() { QNetworkReply* reply = qobject_cast(sender()); if (!reply || !requests_.contains(reply)) return; const int id = requests_.take(reply); if (reply->error() != QNetworkReply::NoError) { emit Finished(id); return; } lastfm::XmlQuery query(lastfm::compat::EmptyXmlQuery()); if (lastfm::compat::ParseQuery(reply->readAll(), &query)) { GetPlayCounts(id, query); GetWiki(id, query); GetTags(id, query); } emit Finished(id); } void LastfmTrackInfoProvider::GetPlayCounts(int id, const lastfm::XmlQuery& q) { // Parse the response const int listeners = q["track"]["listeners"].text().toInt(); const int playcount = q["track"]["playcount"].text().toInt(); int myplaycount = -1; bool love = false; if (!q["track"].children("userplaycount").isEmpty()) { myplaycount = q["track"]["userplaycount"].text().toInt(); love = q["track"]["userloved"].text() == "1"; } if (!listeners && !playcount && myplaycount == -1) return; // No useful data CollapsibleInfoPane::Data data; data.id_ = "lastfm/playcounts"; data.title_ = tr("Last.fm play counts"); data.type_ = CollapsibleInfoPane::Data::Type_PlayCounts; data.icon_ = QIcon(":/last.fm/as.png"); SongPlayStats* widget = new SongPlayStats; data.contents_ = widget; if (myplaycount != -1) { if (love) widget->AddItem(QIcon(":/last.fm/love.png"), tr("You love this track")); widget->AddItem(QIcon(":/last.fm/icon_user.png"), tr("Your scrobbles: %1").arg(myplaycount)); } if (playcount) widget->AddItem(IconLoader::Load("media-playback-start"), tr("%L1 total plays").arg(playcount)); if (listeners) widget->AddItem(QIcon(":/last.fm/my_neighbours.png"), tr("%L1 other listeners").arg(listeners)); emit InfoReady(id, data); } void LastfmTrackInfoProvider::GetWiki(int id, const lastfm::XmlQuery& q) { // Parse the response if (q["track"].children("wiki").isEmpty()) return; // No wiki element const QString content = q["track"]["wiki"]["content"].text(); if (content.isEmpty()) return; // No useful data CollapsibleInfoPane::Data data; data.id_ = "lastfm/songwiki"; data.title_ = tr("Last.fm wiki"); data.type_ = CollapsibleInfoPane::Data::Type_Biography; data.icon_ = QIcon(":/last.fm/as.png"); SongInfoTextView* widget = new SongInfoTextView; data.contents_ = widget; widget->SetHtml(content); emit InfoReady(id, data); } void LastfmTrackInfoProvider::GetTags(int id, const lastfm::XmlQuery& q) { // Parse the response if (q["track"].children("toptags").isEmpty() || q["track"]["toptags"].children("tag").isEmpty()) return; // No tag elements CollapsibleInfoPane::Data data; data.id_ = "lastfm/songtags"; data.title_ = tr("Last.fm tags"); data.type_ = CollapsibleInfoPane::Data::Type_Biography; data.icon_ = QIcon(":/last.fm/icon_tag.png"); TagWidget* widget = new TagWidget(TagWidget::Type_Tags); data.contents_ = widget; widget->SetIcon(data.icon_); for (const lastfm::XmlQuery& e : q["track"]["toptags"].children("tag")) { widget->AddTag(e["name"].text()); } emit InfoReady(id, data); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/lastfmtrackinfoprovider.h000066400000000000000000000024531260417502300271170ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef LASTFMTRACKINFOPROVIDER_H #define LASTFMTRACKINFOPROVIDER_H #include "songinfoprovider.h" namespace lastfm { class XmlQuery; } class QNetworkReply; class LastfmTrackInfoProvider : public SongInfoProvider { Q_OBJECT public: void FetchInfo(int id, const Song& metadata); private slots: void RequestFinished(); private: void GetPlayCounts(int id, const lastfm::XmlQuery& q); void GetWiki(int id, const lastfm::XmlQuery& q); void GetTags(int id, const lastfm::XmlQuery& q); private: QMap requests_; }; #endif // LASTFMTRACKINFOPROVIDER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/songinfobase.cpp000066400000000000000000000156031260417502300251660ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "songinfobase.h" #include "core/network.h" #include #include #include #include #include #include const char* SongInfoBase::kSettingsGroup = "SongInfo"; SongInfoBase::SongInfoBase(QWidget* parent) : QWidget(parent), network_(new NetworkAccessManager(this)), fetcher_(new SongInfoFetcher(this)), current_request_id_(-1), scroll_area_(new QScrollArea), container_(new QVBoxLayout), section_container_(nullptr), fader_(new WidgetFadeHelper(this, 1000)), dirty_(false) { // Add the top-level scroll area setLayout(new QVBoxLayout); layout()->setContentsMargins(0, 0, 0, 0); layout()->addWidget(scroll_area_); // Add a container widget to the scroll area QWidget* container_widget = new QWidget; container_widget->setLayout(container_); container_widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); container_widget->setBackgroundRole(QPalette::Base); container_->setSizeConstraint(QLayout::SetMinAndMaxSize); container_->setContentsMargins(0, 0, 0, 0); container_->setSpacing(6); scroll_area_->setWidget(container_widget); scroll_area_->setWidgetResizable(true); // Add a spacer to the bottom of the container container_->addStretch(); // Set stylesheet QFile stylesheet(":/songinfo.css"); stylesheet.open(QIODevice::ReadOnly); setStyleSheet(QString::fromAscii(stylesheet.readAll())); connect(fetcher_, SIGNAL(ResultReady(int, SongInfoFetcher::Result)), SLOT(ResultReady(int, SongInfoFetcher::Result))); connect(fetcher_, SIGNAL(InfoResultReady(int, CollapsibleInfoPane::Data)), SLOT(InfoResultReady(int, CollapsibleInfoPane::Data))); } void SongInfoBase::Clear() { fader_->StartFade(); qDeleteAll(widgets_); widgets_.clear(); delete section_container_; sections_.clear(); // Container for collapsable sections goes below section_container_ = new QWidget; section_container_->setLayout(new QVBoxLayout); section_container_->layout()->setContentsMargins(0, 0, 0, 0); section_container_->layout()->setSpacing(1); section_container_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); container_->insertWidget(0, section_container_); } void SongInfoBase::AddSection(CollapsibleInfoPane* section) { int index = 0; for (; index < sections_.count(); ++index) { if (section->data() < sections_[index]->data()) break; } ConnectWidget(section->data().contents_); sections_.insert(index, section); qobject_cast(section_container_->layout()) ->insertWidget(index, section); section->show(); } void SongInfoBase::AddWidget(QWidget* widget) { ConnectWidget(widget); container_->insertWidget(container_->count() - 2, widget); widgets_ << widget; } void SongInfoBase::SongChanged(const Song& metadata) { if (isVisible()) { MaybeUpdate(metadata); dirty_ = false; } else { queued_metadata_ = metadata; dirty_ = true; } } void SongInfoBase::SongFinished() { dirty_ = false; } void SongInfoBase::showEvent(QShowEvent* e) { if (dirty_) { MaybeUpdate(queued_metadata_); dirty_ = false; } QWidget::showEvent(e); } void SongInfoBase::MaybeUpdate(const Song& metadata) { if (old_metadata_.is_valid()) { if (!NeedsUpdate(old_metadata_, metadata)) { return; } } Update(metadata); old_metadata_ = metadata; } void SongInfoBase::Update(const Song& metadata) { current_request_id_ = fetcher_->FetchInfo(metadata); // Do this after the new pane has been shown otherwise it'll just grab a // black rectangle. Clear(); QTimer::singleShot(0, fader_, SLOT(StartBlur())); } void SongInfoBase::InfoResultReady(int id, const CollapsibleInfoPane::Data& data) {} void SongInfoBase::ResultReady(int id, const SongInfoFetcher::Result& result) { for (const CollapsibleInfoPane::Data& data : result.info_) { delete data.contents_; } } void SongInfoBase::CollapseSections() { QSettings s; s.beginGroup(kSettingsGroup); // Sections are already sorted by type and relevance, so the algorithm we use // to determine which ones to show by default is: // * In the absense of any user preference, show the first (highest // relevance section of each type and hide the rest) // * If one or more sections in a type have been explicitly hidden/shown // by the user before then hide all sections in that type and show only // the ones that are explicitly shown. QMap types_; QSet has_user_preference_; for (CollapsibleInfoPane* pane : sections_) { const CollapsibleInfoPane::Data::Type type = pane->data().type_; types_.insertMulti(type, pane); QVariant preference = s.value(pane->data().id_); if (preference.isValid()) { has_user_preference_.insert(type); if (preference.toBool()) { pane->Expand(); } } } for (CollapsibleInfoPane::Data::Type type : types_.keys()) { if (!has_user_preference_.contains(type)) { // Expand the first one types_.values(type).last()->Expand(); } } for (CollapsibleInfoPane* pane : sections_) { connect(pane, SIGNAL(Toggled(bool)), SLOT(SectionToggled(bool))); } } void SongInfoBase::SectionToggled(bool value) { CollapsibleInfoPane* pane = qobject_cast(sender()); if (!pane || !sections_.contains(pane)) return; QSettings s; s.beginGroup(kSettingsGroup); s.setValue(pane->data().id_, value); } void SongInfoBase::ReloadSettings() { for (CollapsibleInfoPane* pane : sections_) { QWidget* contents = pane->data().contents_; if (!contents) continue; QMetaObject::invokeMethod(contents, "ReloadSettings"); } } void SongInfoBase::ConnectWidget(QWidget* widget) { const QMetaObject* m = widget->metaObject(); if (m->indexOfSignal("ShowSettingsDialog()") != -1) { connect(widget, SIGNAL(ShowSettingsDialog()), SIGNAL(ShowSettingsDialog())); } if (m->indexOfSignal("DoGlobalSearch(QString)") != -1) { connect(widget, SIGNAL(DoGlobalSearch(QString)), SIGNAL(DoGlobalSearch(QString))); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/songinfobase.h000066400000000000000000000047351260417502300246370ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SONGINFOBASE_H #define SONGINFOBASE_H #include #include "collapsibleinfopane.h" #include "songinfofetcher.h" #include "core/song.h" #include "playlist/playlistitem.h" #include "smartplaylists/generator_fwd.h" #include "widgets/widgetfadehelper.h" class CollapsibleInfoPane; class WidgetFadeHelper; class QNetworkAccessManager; class QScrollArea; class QVBoxLayout; class SongInfoBase : public QWidget { Q_OBJECT public: SongInfoBase(QWidget* parent = nullptr); static const char* kSettingsGroup; public slots: void SongChanged(const Song& metadata); void SongFinished(); virtual void ReloadSettings(); signals: void ShowSettingsDialog(); void DoGlobalSearch(const QString& query); protected: void showEvent(QShowEvent* e); virtual void Update(const Song& metadata); virtual bool NeedsUpdate(const Song& old_metadata, const Song& new_metadata) const { return true; } void AddWidget(QWidget* widget); void AddSection(CollapsibleInfoPane* section); void Clear(); void CollapseSections(); protected slots: virtual void InfoResultReady(int id, const CollapsibleInfoPane::Data& data); virtual void ResultReady(int id, const SongInfoFetcher::Result& result); protected: QNetworkAccessManager* network_; SongInfoFetcher* fetcher_; int current_request_id_; private: void MaybeUpdate(const Song& metadata); void ConnectWidget(QWidget* widget); private slots: void SectionToggled(bool value); private: QScrollArea* scroll_area_; QVBoxLayout* container_; QList widgets_; QWidget* section_container_; QList sections_; WidgetFadeHelper* fader_; Song queued_metadata_; Song old_metadata_; bool dirty_; }; #endif // SONGINFOBASE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/songinfofetcher.cpp000066400000000000000000000067661260417502300257060ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "songinfofetcher.h" #include "songinfoprovider.h" #include "core/logging.h" #include #include SongInfoFetcher::SongInfoFetcher(QObject* parent) : QObject(parent), timeout_timer_mapper_(new QSignalMapper(this)), timeout_duration_(kDefaultTimeoutDuration), next_id_(1) { connect(timeout_timer_mapper_, SIGNAL(mapped(int)), SLOT(Timeout(int))); } void SongInfoFetcher::AddProvider(SongInfoProvider* provider) { providers_ << provider; connect(provider, SIGNAL(ImageReady(int, QUrl)), SLOT(ImageReady(int, QUrl)), Qt::QueuedConnection); connect(provider, SIGNAL(InfoReady(int, CollapsibleInfoPane::Data)), SLOT(InfoReady(int, CollapsibleInfoPane::Data)), Qt::QueuedConnection); connect(provider, SIGNAL(Finished(int)), SLOT(ProviderFinished(int)), Qt::QueuedConnection); } int SongInfoFetcher::FetchInfo(const Song& metadata) { const int id = next_id_++; results_[id] = Result(); timeout_timers_[id] = new QTimer(this); timeout_timers_[id]->setSingleShot(true); timeout_timers_[id]->setInterval(timeout_duration_); timeout_timers_[id]->start(); timeout_timer_mapper_->setMapping(timeout_timers_[id], id); connect(timeout_timers_[id], SIGNAL(timeout()), timeout_timer_mapper_, SLOT(map())); for (SongInfoProvider* provider : providers_) { if (provider->is_enabled()) { waiting_for_[id].append(provider); provider->FetchInfo(id, metadata); } } return id; } void SongInfoFetcher::ImageReady(int id, const QUrl& url) { if (!results_.contains(id)) return; results_[id].images_ << url; } void SongInfoFetcher::InfoReady(int id, const CollapsibleInfoPane::Data& data) { if (!results_.contains(id)) return; results_[id].info_ << data; if (!waiting_for_.contains(id)) return; emit InfoResultReady(id, data); } void SongInfoFetcher::ProviderFinished(int id) { if (!results_.contains(id)) return; if (!waiting_for_.contains(id)) return; SongInfoProvider* provider = qobject_cast(sender()); if (!waiting_for_[id].contains(provider)) return; waiting_for_[id].removeAll(provider); if (waiting_for_[id].isEmpty()) { emit ResultReady(id, results_.take(id)); waiting_for_.remove(id); delete timeout_timers_.take(id); } } void SongInfoFetcher::Timeout(int id) { if (!results_.contains(id)) return; if (!waiting_for_.contains(id)) return; // Emit the results that we have already emit ResultReady(id, results_.take(id)); // Cancel any providers that we're still waiting for for (SongInfoProvider* provider : waiting_for_[id]) { qLog(Info) << "Request timed out from info provider" << provider->name(); provider->Cancel(id); } waiting_for_.remove(id); // Remove the timer delete timeout_timers_.take(id); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/songinfofetcher.h000066400000000000000000000036741260417502300253460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SONGINFOFETCHER_H #define SONGINFOFETCHER_H #include #include #include #include "collapsibleinfopane.h" #include "core/song.h" class SongInfoProvider; class QSignalMapper; class SongInfoFetcher : public QObject { Q_OBJECT public: SongInfoFetcher(QObject* parent = nullptr); struct Result { QList images_; QList info_; }; static const int kDefaultTimeoutDuration = 25000; // msec void AddProvider(SongInfoProvider* provider); int FetchInfo(const Song& metadata); QList providers() const { return providers_; } signals: void InfoResultReady(int id, const CollapsibleInfoPane::Data& data); void ResultReady(int id, const SongInfoFetcher::Result& result); private slots: void ImageReady(int id, const QUrl& url); void InfoReady(int id, const CollapsibleInfoPane::Data& data); void ProviderFinished(int id); void Timeout(int id); private: QList providers_; QMap results_; QMap > waiting_for_; QMap timeout_timers_; QSignalMapper* timeout_timer_mapper_; int timeout_duration_; int next_id_; }; #endif // SONGINFOFETCHER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/songinfoprovider.cpp000066400000000000000000000016021260417502300261000ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "songinfoprovider.h" SongInfoProvider::SongInfoProvider() : enabled_(true) {} QString SongInfoProvider::name() const { return metaObject()->className(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/songinfoprovider.h000066400000000000000000000025731260417502300255550ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SONGINFOPROVIDER_H #define SONGINFOPROVIDER_H #include #include #include "collapsibleinfopane.h" #include "core/song.h" class SongInfoProvider : public QObject { Q_OBJECT public: SongInfoProvider(); virtual void FetchInfo(int id, const Song& metadata) = 0; virtual void Cancel(int id) {} virtual QString name() const; bool is_enabled() const { return enabled_; } void set_enabled(bool enabled) { enabled_ = enabled; } signals: void ImageReady(int id, const QUrl& url); void InfoReady(int id, const CollapsibleInfoPane::Data& data); void Finished(int id); private: bool enabled_; }; #endif // SONGINFOPROVIDER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/songinfosettingspage.cpp000066400000000000000000000104541260417502300267500ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "songinfofetcher.h" #include "songinfosettingspage.h" #include "songinfotextview.h" #include "songinfoview.h" #include "ultimatelyricsprovider.h" #include "ui_songinfosettingspage.h" #include "ui/iconloader.h" #include "ui/settingsdialog.h" #include #include SongInfoSettingsPage::SongInfoSettingsPage(SettingsDialog* dialog) : SettingsPage(dialog), ui_(new Ui_SongInfoSettingsPage) { ui_->setupUi(this); setWindowIcon(IconLoader::Load("view-media-lyrics")); connect(ui_->up, SIGNAL(clicked()), SLOT(MoveUp())); connect(ui_->down, SIGNAL(clicked()), SLOT(MoveDown())); connect(ui_->providers, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), SLOT(CurrentItemChanged(QListWidgetItem*))); connect(ui_->providers, SIGNAL(itemChanged(QListWidgetItem*)), SLOT(ItemChanged(QListWidgetItem*))); QFile song_info_preview(":/lumberjacksong.txt"); song_info_preview.open(QIODevice::ReadOnly); ui_->song_info_font_preview->setText( QString::fromUtf8(song_info_preview.readAll())); connect(ui_->song_info_font_size, SIGNAL(valueChanged(double)), SLOT(FontSizeChanged(double))); } SongInfoSettingsPage::~SongInfoSettingsPage() { delete ui_; } void SongInfoSettingsPage::Load() { QSettings s; s.beginGroup(SongInfoTextView::kSettingsGroup); ui_->song_info_font_size->setValue( s.value("font_size", SongInfoTextView::kDefaultFontSize).toReal()); s.endGroup(); QList providers = dialog()->song_info_view()->lyric_providers(); ui_->providers->clear(); for (const UltimateLyricsProvider* provider : providers) { QListWidgetItem* item = new QListWidgetItem(ui_->providers); item->setText(provider->name()); item->setCheckState(provider->is_enabled() ? Qt::Checked : Qt::Unchecked); item->setForeground( provider->is_enabled() ? palette().color(QPalette::Active, QPalette::Text) : palette().color(QPalette::Disabled, QPalette::Text)); } } void SongInfoSettingsPage::Save() { QSettings s; s.beginGroup(SongInfoTextView::kSettingsGroup); s.setValue("font_size", ui_->song_info_font_preview->font().pointSizeF()); s.endGroup(); s.beginGroup(SongInfoView::kSettingsGroup); QVariantList search_order; for (int i = 0; i < ui_->providers->count(); ++i) { const QListWidgetItem* item = ui_->providers->item(i); if (item->checkState() == Qt::Checked) search_order << item->text(); } s.setValue("search_order", search_order); s.endGroup(); } void SongInfoSettingsPage::CurrentItemChanged(QListWidgetItem* item) { if (!item) { ui_->up->setEnabled(false); ui_->down->setEnabled(false); } else { const int row = ui_->providers->row(item); ui_->up->setEnabled(row != 0); ui_->down->setEnabled(row != ui_->providers->count() - 1); } } void SongInfoSettingsPage::MoveUp() { Move(-1); } void SongInfoSettingsPage::MoveDown() { Move(+1); } void SongInfoSettingsPage::Move(int d) { const int row = ui_->providers->currentRow(); QListWidgetItem* item = ui_->providers->takeItem(row); ui_->providers->insertItem(row + d, item); ui_->providers->setCurrentRow(row + d); } void SongInfoSettingsPage::ItemChanged(QListWidgetItem* item) { const bool checked = item->checkState() == Qt::Checked; item->setForeground( checked ? palette().color(QPalette::Active, QPalette::Text) : palette().color(QPalette::Disabled, QPalette::Text)); } void SongInfoSettingsPage::FontSizeChanged(double value) { QFont font; font.setPointSizeF(value); ui_->song_info_font_preview->setFont(font); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/songinfosettingspage.h000066400000000000000000000025261260417502300264160ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SONGINFOSETTINGSPAGE_H #define SONGINFOSETTINGSPAGE_H #include "ui/settingspage.h" class SongInfoView; class Ui_SongInfoSettingsPage; class QListWidgetItem; class SongInfoSettingsPage : public SettingsPage { Q_OBJECT public: SongInfoSettingsPage(SettingsDialog* parent); ~SongInfoSettingsPage(); void Load(); void Save(); private slots: void MoveUp(); void MoveDown(); void Move(int d); void CurrentItemChanged(QListWidgetItem* item); void ItemChanged(QListWidgetItem* item); void FontSizeChanged(double value); private: Ui_SongInfoSettingsPage* ui_; }; #endif // SONGINFOSETTINGSPAGE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/songinfosettingspage.ui000066400000000000000000000103231260417502300265760ustar00rootroot00000000000000 SongInfoSettingsPage 0 0 625 556 Song Information 0 0 Appearance Font size pt 1 5.000000000000000 50.000000000000000 0.500000000000000 Preview 16777215 100 true 0 0 Lyrics Choose the websites you want Clementine to use when searching for lyrics. true false Move up false Move down Qt::Vertical 20 40 clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/songinfotextview.cpp000066400000000000000000000061611260417502300261320ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "songinfotextview.h" #include #include #include #include #include #include "core/logging.h" const qreal SongInfoTextView::kDefaultFontSize = 8.5; const char* SongInfoTextView::kSettingsGroup = "SongInfo"; SongInfoTextView::SongInfoTextView(QWidget* parent) : QTextBrowser(parent), last_width_(-1), recursion_filter_(false) { setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setOpenExternalLinks(true); ReloadSettings(); } qreal SongInfoTextView::FontSize() { QSettings s; s.beginGroup(kSettingsGroup); return s.value("font_size", kDefaultFontSize).toReal(); } QFont SongInfoTextView::Font() { QFont font; font.setPointSizeF(FontSize()); return font; } void SongInfoTextView::ReloadSettings() { document()->setDefaultFont(Font()); } void SongInfoTextView::resizeEvent(QResizeEvent* e) { const int w = qMax(100, width()); if (w == last_width_) return; last_width_ = w; document()->setTextWidth(w); setMinimumHeight(document()->size().height()); QTextBrowser::resizeEvent(e); } QSize SongInfoTextView::sizeHint() const { return minimumSize(); } void SongInfoTextView::wheelEvent(QWheelEvent* e) { e->ignore(); } void SongInfoTextView::contextMenuEvent(QContextMenuEvent* e) { QMenu* menu = createStandardContextMenu(e->pos()); menu->setAttribute(Qt::WA_DeleteOnClose); menu->addAction(tr("Change font size..."), this, SIGNAL(ShowSettingsDialog())); menu->popup(e->globalPos()); } void SongInfoTextView::SetHtml(const QString& html) { QString copy(html.trimmed()); // Simplify newlines, and convert them to

copy.replace(QRegExp("[\\r\\n]+"), "\n"); copy.replace(QRegExp("([^>])[\\t ]*\\n"), "\\1

"); // Strip any newlines from the end copy.replace(QRegExp("((<\\s*br\\s*/?\\s*>)|(<\\s*/?\\s*p\\s*/?\\s*>))+$"), ""); setHtml(copy); } // Prevents QTextDocument from trying to load remote images before they are // ready. QVariant SongInfoTextView::loadResource(int type, const QUrl& name) { if (recursion_filter_) { recursion_filter_ = false; return QVariant(); } recursion_filter_ = true; if (type == QTextDocument::ImageResource && name.scheme() == "http") { if (document()->resource(type, name).isNull()) { return QVariant(); } } return QTextBrowser::loadResource(type, name); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/songinfotextview.h000066400000000000000000000027021260417502300255740ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SONGINFOTEXTVIEW_H #define SONGINFOTEXTVIEW_H #include class SongInfoTextView : public QTextBrowser { Q_OBJECT public: SongInfoTextView(QWidget* parent = nullptr); static const qreal kDefaultFontSize; static const char* kSettingsGroup; static qreal FontSize(); static QFont Font(); QSize sizeHint() const; public slots: void ReloadSettings(); void SetHtml(const QString& html); signals: void ShowSettingsDialog(); protected: void resizeEvent(QResizeEvent* e); void wheelEvent(QWheelEvent* e); void contextMenuEvent(QContextMenuEvent* e); QVariant loadResource(int type, const QUrl& name); private: int last_width_; bool recursion_filter_; }; #endif // SONGINFOTEXTVIEW_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/songinfoview.cpp000066400000000000000000000127611260417502300252300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "config.h" #include "songinfoprovider.h" #include "songinfoview.h" #include "taglyricsinfoprovider.h" #include "ultimatelyricsprovider.h" #include "ultimatelyricsreader.h" #ifdef HAVE_LIBLASTFM #include "lastfmtrackinfoprovider.h" #endif #include #include #include #include const char* SongInfoView::kSettingsGroup = "SongInfo"; typedef QList ProviderList; SongInfoView::SongInfoView(QWidget* parent) : SongInfoBase(parent), ultimate_reader_(new UltimateLyricsReader(this)) { // Parse the ultimate lyrics xml file in the background QFuture future = QtConcurrent::run(ultimate_reader_.get(), &UltimateLyricsReader::Parse, QString(":lyrics/ultimate_providers.xml")); QFutureWatcher* watcher = new QFutureWatcher(this); watcher->setFuture(future); connect(watcher, SIGNAL(finished()), SLOT(UltimateLyricsParsed())); #ifdef HAVE_LIBLASTFM fetcher_->AddProvider(new LastfmTrackInfoProvider); #endif fetcher_->AddProvider(new TagLyricsInfoProvider); } SongInfoView::~SongInfoView() {} void SongInfoView::UltimateLyricsParsed() { QFutureWatcher* watcher = static_cast*>(sender()); for (SongInfoProvider* provider : watcher->result()) { fetcher_->AddProvider(provider); } watcher->deleteLater(); ultimate_reader_.reset(); ReloadSettings(); } bool SongInfoView::NeedsUpdate(const Song& old_metadata, const Song& new_metadata) const { if (new_metadata.title().isEmpty() || new_metadata.artist().isEmpty()) return false; return old_metadata.title() != new_metadata.title() || old_metadata.artist() != new_metadata.artist(); } void SongInfoView::InfoResultReady(int id, const CollapsibleInfoPane::Data& data) { if (id != current_request_id_) return; AddSection(new CollapsibleInfoPane(data, this)); CollapseSections(); } void SongInfoView::ResultReady(int id, const SongInfoFetcher::Result& result) {} void SongInfoView::ReloadSettings() { QSettings s; s.beginGroup(kSettingsGroup); // Put the providers in the right order QList ordered_providers; QVariantList default_order; default_order << "lyrics.wikia.com" << "lyricstime.com" << "lyricsreg.com" << "lyricsmania.com" << "metrolyrics.com" << "azlyrics.com" << "songlyrics.com" << "elyrics.net" << "lyricsdownload.com" << "lyrics.com" << "lyricsbay.com" << "directlyrics.com" << "loudson.gs" << "teksty.org" << "tekstowo.pl (Polish translations)" << "vagalume.uol.com.br" << "vagalume.uol.com.br (Portuguese translations)" << "darklyrics.com"; QVariant saved_order = s.value("search_order", default_order); for (const QVariant& name : saved_order.toList()) { SongInfoProvider* provider = ProviderByName(name.toString()); if (provider) ordered_providers << provider; } // Enable all the providers in the list and rank them int relevance = 100; for (SongInfoProvider* provider : ordered_providers) { provider->set_enabled(true); qobject_cast(provider)->set_relevance(relevance--); } // Any lyric providers we don't have in ordered_providers are considered // disabled for (SongInfoProvider* provider : fetcher_->providers()) { if (qobject_cast(provider) && !ordered_providers.contains(provider)) { provider->set_enabled(false); } } SongInfoBase::ReloadSettings(); } SongInfoProvider* SongInfoView::ProviderByName(const QString& name) const { for (SongInfoProvider* provider : fetcher_->providers()) { if (UltimateLyricsProvider* lyrics = qobject_cast(provider)) { if (lyrics->name() == name) return provider; } } return nullptr; } namespace { bool CompareLyricProviders(const UltimateLyricsProvider* a, const UltimateLyricsProvider* b) { if (a->is_enabled() && !b->is_enabled()) return true; if (!a->is_enabled() && b->is_enabled()) return false; return a->relevance() > b->relevance(); } } QList SongInfoView::lyric_providers() const { QList ret; for (SongInfoProvider* provider : fetcher_->providers()) { if (UltimateLyricsProvider* lyrics = qobject_cast(provider)) { ret << lyrics; } } qSort(ret.begin(), ret.end(), CompareLyricProviders); return ret; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/songinfoview.h000066400000000000000000000031471260417502300246730ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SONGINFOVIEW_H #define SONGINFOVIEW_H #include #include "songinfobase.h" class UltimateLyricsProvider; class UltimateLyricsReader; class SongInfoView : public SongInfoBase { Q_OBJECT public: SongInfoView(QWidget* parent = nullptr); ~SongInfoView(); static const char* kSettingsGroup; QList lyric_providers() const; public slots: void ReloadSettings(); protected: bool NeedsUpdate(const Song& old_metadata, const Song& new_metadata) const; protected slots: virtual void InfoResultReady(int id, const CollapsibleInfoPane::Data& data); virtual void ResultReady(int id, const SongInfoFetcher::Result& result); private: SongInfoProvider* ProviderByName(const QString& name) const; private slots: void UltimateLyricsParsed(); private: std::unique_ptr ultimate_reader_; }; #endif // SONGINFOVIEW_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/songkickconcerts.cpp000066400000000000000000000135611260417502300260630ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "songkickconcerts.h" #include #include #include #include #include #include "core/closure.h" #include "core/logging.h" #include "songkickconcertwidget.h" const char* SongkickConcerts::kSongkickArtistBucket = "id:songkick"; const char* SongkickConcerts::kSongkickArtistCalendarUrl = "https://api.songkick.com/api/3.0/artists/%1/calendar.json?" "per_page=5&" "apikey=8rgKfy1WU6IlJFfN"; SongkickConcerts::SongkickConcerts() { Geolocator* geolocator = new Geolocator; geolocator->Geolocate(); connect(geolocator, SIGNAL(Finished(Geolocator::LatLng)), SLOT(GeolocateFinished(Geolocator::LatLng))); NewClosure(geolocator, SIGNAL(Finished(Geolocator::LatLng)), geolocator, SLOT(deleteLater())); } void SongkickConcerts::FetchInfo(int id, const Song& metadata) { Echonest::Artist::SearchParams params; params.push_back( qMakePair(Echonest::Artist::Name, QVariant(metadata.artist()))); params.push_back( qMakePair(Echonest::Artist::IdSpace, QVariant(kSongkickArtistBucket))); qLog(Debug) << "Params:" << params; QNetworkReply* reply = Echonest::Artist::search(params); qLog(Debug) << reply->request().url(); NewClosure(reply, SIGNAL(finished()), this, SLOT(ArtistSearchFinished(QNetworkReply*, int)), reply, id); } void SongkickConcerts::ArtistSearchFinished(QNetworkReply* reply, int id) { reply->deleteLater(); try { Echonest::Artists artists = Echonest::Artist::parseSearch(reply); if (artists.isEmpty()) { qLog(Debug) << "Failed to find artist in echonest"; emit Finished(id); return; } const Echonest::Artist& artist = artists[0]; const Echonest::ForeignIds& foreign_ids = artist.foreignIds(); QString songkick_id; for (const Echonest::ForeignId& id : foreign_ids) { if (id.catalog == "songkick") { songkick_id = id.foreign_id; break; } } if (songkick_id.isEmpty()) { qLog(Debug) << "Failed to fetch songkick foreign id for artist"; emit Finished(id); return; } QStringList split = songkick_id.split(':'); if (split.count() != 3) { qLog(Error) << "Weird songkick id"; emit Finished(id); return; } FetchSongkickCalendar(split[2], id); } catch (Echonest::ParseError& e) { qLog(Error) << "Error parsing echonest reply:" << e.errorType() << e.what(); emit Finished(id); } } void SongkickConcerts::FetchSongkickCalendar(const QString& artist_id, int id) { QUrl url(QString(kSongkickArtistCalendarUrl).arg(artist_id)); qLog(Debug) << url; QNetworkReply* reply = network_.get(QNetworkRequest(url)); NewClosure(reply, SIGNAL(finished()), this, SLOT(CalendarRequestFinished(QNetworkReply*, int)), reply, id); } void SongkickConcerts::CalendarRequestFinished(QNetworkReply* reply, int id) { QJson::Parser parser; bool ok = false; QVariant result = parser.parse(reply, &ok); if (!ok) { qLog(Error) << "Error parsing Songkick reply"; emit Finished(id); return; } QVariantMap root = result.toMap(); QVariantMap results_page = root["resultsPage"].toMap(); QVariantMap results = results_page["results"].toMap(); QVariantList events = results["event"].toList(); if (events.isEmpty()) { emit Finished(id); return; } QWidget* container = new QWidget; QVBoxLayout* layout = new QVBoxLayout(container); for (const QVariant& v : events) { QVariantMap event = v.toMap(); QString display_name = event["displayName"].toString(); QString start_date = event["start"].toMap()["date"].toString(); QString city = event["location"].toMap()["city"].toString(); QString uri = event["uri"].toString(); // Try to get the lat/lng coordinates of the venue. QVariantMap venue = event["venue"].toMap(); const bool valid_latlng = venue["lng"].isValid() && venue["lat"].isValid(); if (valid_latlng && latlng_.IsValid()) { static const int kFilterDistanceMetres = 250 * 1e3; // 250km Geolocator::LatLng latlng(venue["lat"].toString(), venue["lng"].toString()); if (latlng_.IsValid() && latlng.IsValid()) { int distance_metres = latlng_.Distance(latlng); if (distance_metres > kFilterDistanceMetres) { qLog(Debug) << "Filtered concert:" << display_name << "as too far away:" << distance_metres; continue; } } } SongKickConcertWidget* widget = new SongKickConcertWidget(container); widget->Init(display_name, uri, start_date, city); if (valid_latlng) { widget->SetMap(venue["lat"].toString(), venue["lng"].toString(), venue["displayName"].toString()); } layout->addWidget(widget); } CollapsibleInfoPane::Data data; data.type_ = CollapsibleInfoPane::Data::Type_Biography; data.id_ = QString("songkick/%1").arg(id); data.title_ = tr("Upcoming Concerts"); data.icon_ = QIcon(":providers/songkick.png"); data.contents_ = container; emit InfoReady(id, data); emit Finished(id); } void SongkickConcerts::GeolocateFinished(Geolocator::LatLng latlng) { latlng_ = latlng; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/songkickconcerts.h000066400000000000000000000030061260417502300255210ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SONGKICKCONCERTS_H #define SONGKICKCONCERTS_H #include "songinfoprovider.h" #include "core/network.h" #include "core/override.h" #include "internet/core/geolocator.h" class QNetworkReply; class SongInfoTextView; class SongkickConcerts : public SongInfoProvider { Q_OBJECT public: SongkickConcerts(); void FetchInfo(int id, const Song& metadata) OVERRIDE; private slots: void ArtistSearchFinished(QNetworkReply* reply, int id); void CalendarRequestFinished(QNetworkReply* reply, int id); void GeolocateFinished(Geolocator::LatLng latlng); private: void FetchSongkickCalendar(const QString& artist_id, int id); NetworkAccessManager network_; Geolocator::LatLng latlng_; static const char* kSongkickArtistBucket; static const char* kSongkickArtistCalendarUrl; }; #endif clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/songkickconcertwidget.cpp000066400000000000000000000105551260417502300271040ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "songkickconcertwidget.h" #include #include #include #include #include "songinfotextview.h" #include "ui_songkickconcertwidget.h" #include "core/closure.h" #include "core/logging.h" #include "core/network.h" #include "core/utilities.h" const int SongKickConcertWidget::kStaticMapWidth = 100; const int SongKickConcertWidget::kStaticMapHeight = 100; SongKickConcertWidget::SongKickConcertWidget(QWidget* parent) : QWidget(parent), ui_(new Ui_SongKickConcertWidget), network_(new NetworkAccessManager(this)) { ui_->setupUi(this); // Hide the map by default ui_->map->hide(); ui_->map->setFixedSize(kStaticMapWidth, kStaticMapHeight); ui_->map->installEventFilter(this); ReloadSettings(); } SongKickConcertWidget::~SongKickConcertWidget() { delete ui_; } void SongKickConcertWidget::ReloadSettings() { QFont font(SongInfoTextView::Font()); ui_->title->setFont(font); ui_->date->setFont(font); ui_->location->setFont(font); } void SongKickConcertWidget::Init(const QString& title, const QString& url, const QString& date, const QString& location) { ui_->title->setText( QString("%2").arg(Qt::escape(url), Qt::escape(title))); if (!location.isEmpty()) { ui_->location->setText(location); } else { ui_->location->hide(); } if (!date.isEmpty()) { QDate parsed_date(QDate::fromString(date, Qt::ISODate)); QString date_text = Utilities::PrettyFutureDate(parsed_date); if (date_text.isEmpty()) { date_text = date; } else { date_text += " (" + date + ")"; } ui_->date->setText(date_text); } else { ui_->date->hide(); } } void SongKickConcertWidget::SetMap(const QString& lat, const QString& lng, const QString& venue_name) { static const char* kStaticMapUrl = "https://maps.googleapis.com/maps/api/staticmap" "?key=AIzaSyDDJqmLOeE1mY_EBONhnQmdXbKtasgCtqg" "&sensor=false" "&size=%1x%2" "&zoom=12" "¢er=%3,%4" "&markers=%3,%4"; ui_->map->show(); map_url_ = QUrl("https://maps.google.com/"); map_url_.addQueryItem("ll", QString("%1,%2").arg(lat, lng)); if (!venue_name.isEmpty()) { map_url_.addQueryItem("q", venue_name); } // Request the static map image const QUrl url(QString(kStaticMapUrl).arg(QString::number(kStaticMapWidth), QString::number(kStaticMapHeight), lat, lng)); QNetworkReply* reply = network_->get(QNetworkRequest(url)); NewClosure(reply, SIGNAL(finished()), this, SLOT(MapLoaded(QNetworkReply*)), reply); } void SongKickConcertWidget::MapLoaded(QNetworkReply* reply) { reply->deleteLater(); QImage image; if (!image.load(reply, "PNG")) { qLog(Warning) << "Failed to load static map image" << reply->url(); return; } // Scale it if it was the wrong size. if (image.width() != kStaticMapWidth || image.height() != kStaticMapHeight) { qLog(Warning) << "Scaling static map image" << image.size(); image = image.scaled(kStaticMapWidth, kStaticMapHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation); } ui_->map->setPixmap(QPixmap::fromImage(image)); } bool SongKickConcertWidget::eventFilter(QObject* object, QEvent* event) { if (object == ui_->map && event->type() == QEvent::MouseButtonRelease) { QMouseEvent* e = dynamic_cast(event); if (e->button() == Qt::LeftButton) { QDesktopServices::openUrl(map_url_); return true; } } return QWidget::eventFilter(object, event); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/songkickconcertwidget.h000066400000000000000000000031611260417502300265440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SONGKICKCONCERTWIDGET_H #define SONGKICKCONCERTWIDGET_H #include #include class Ui_SongKickConcertWidget; class QNetworkAccessManager; class QNetworkReply; class SongKickConcertWidget : public QWidget { Q_OBJECT public: SongKickConcertWidget(QWidget* parent = nullptr); ~SongKickConcertWidget(); static const int kStaticMapWidth; static const int kStaticMapHeight; void Init(const QString& title, const QString& url, const QString& date, const QString& location); void SetMap(const QString& lat, const QString& lng, const QString& venue_name); // QObject bool eventFilter(QObject* object, QEvent* event); public slots: void ReloadSettings(); private slots: void MapLoaded(QNetworkReply* reply); private: Ui_SongKickConcertWidget* ui_; QNetworkAccessManager* network_; QUrl map_url_; }; #endif // SONGKICKCONCERTWIDGET_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/songkickconcertwidget.ui000066400000000000000000000052611260417502300267350ustar00rootroot00000000000000 SongKickConcertWidget 0 0 571 195 Form #location, #date { color: #666; } 0 0 true true Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse true Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse true Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse Qt::Vertical QSizePolicy::MinimumExpanding 0 0 0 0 PointingHandCursor clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/songplaystats.cpp000066400000000000000000000037121260417502300254220ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "songplaystats.h" #include #include const int SongPlayStats::kIconSize = 16; const int SongPlayStats::kLineSpacing = 2; const int SongPlayStats::kIconTextSpacing = 6; const int SongPlayStats::kMargin = 4; SongPlayStats::SongPlayStats(QWidget* parent) : QWidget(parent) { setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); } void SongPlayStats::AddItem(const QIcon& icon, const QString& text) { items_ << Item(icon, text); updateGeometry(); update(); } QSize SongPlayStats::sizeHint() const { return QSize(100, kMargin * 2 + items_.count() * kIconSize + (items_.count() - 1) * kLineSpacing); } void SongPlayStats::paintEvent(QPaintEvent*) { QPainter p(this); int y = kMargin; for (const Item& item : items_) { const QRect line(kMargin, y, width() - kMargin * 2, kIconSize); const QRect icon_rect(line.topLeft(), QSize(kIconSize, kIconSize)); const QRect text_rect( icon_rect.topRight() + QPoint(kIconTextSpacing, 0), QSize(line.width() - icon_rect.width() - kIconTextSpacing, line.height())); p.drawPixmap(icon_rect, item.icon_.pixmap(kIconSize)); p.drawText(text_rect, item.text_); y += line.height() + kLineSpacing; } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/songplaystats.h000066400000000000000000000025461260417502300250730ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SONGPLAYSTATS_H #define SONGPLAYSTATS_H #include #include class SongPlayStats : public QWidget { Q_OBJECT public: SongPlayStats(QWidget* parent = nullptr); static const int kIconSize; static const int kLineSpacing; static const int kIconTextSpacing; static const int kMargin; void AddItem(const QIcon& icon, const QString& text); QSize sizeHint() const; protected: void paintEvent(QPaintEvent*); private: struct Item { Item(const QIcon& icon, const QString& text) : icon_(icon), text_(text) {} QIcon icon_; QString text_; }; QList items_; }; #endif // SONGPLAYSTATS_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/taglyricsinfoprovider.cpp000066400000000000000000000024461260417502300271420ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "songinfotextview.h" #include "taglyricsinfoprovider.h" #include "core/logging.h" void TagLyricsInfoProvider::FetchInfo(int id, const Song& metadata) { QString lyrics; lyrics = metadata.lyrics(); if (!lyrics.isEmpty()) { CollapsibleInfoPane::Data data; data.id_ = "tag/lyrics"; data.title_ = tr("Lyrics from the ID3v2 tag"); data.type_ = CollapsibleInfoPane::Data::Type_Lyrics; SongInfoTextView* editor = new SongInfoTextView; editor->setPlainText(lyrics); data.contents_ = editor; emit InfoReady(id, data); } emit Finished(id); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/taglyricsinfoprovider.h000066400000000000000000000017401260417502300266030ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef TAGLYRICSINFOPROVIDER_H #define TAGLYRICSINFOPROVIDER_H #include "songinfoprovider.h" class TagLyricsInfoProvider : public SongInfoProvider { Q_OBJECT public: void FetchInfo(int id, const Song& metadata); }; #endif // TAGLYRICSINFOPROVIDER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/tagwidget.cpp000066400000000000000000000075631260417502300244760ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "tagwidget.h" #include "internet/lastfm/lastfmservice.h" #include "internet/core/internetmimedata.h" #include "internet/core/internetmodel.h" #include "playlist/playlistitemmimedata.h" #include "smartplaylists/generator.h" #include "smartplaylists/generatormimedata.h" #include "smartplaylists/querygenerator.h" #include "ui/flowlayout.h" #include "ui/iconloader.h" #include #include const int TagWidgetTag::kIconSize = 16; const int TagWidgetTag::kIconTextSpacing = 8; const int TagWidgetTag::kHPadding = 6; const int TagWidgetTag::kVPadding = 2; TagWidgetTag::TagWidgetTag(const QIcon& icon, const QString& text, QWidget* parent) : QWidget(parent), text_(text), icon_(icon), opacity_(0.0), animation_(new QPropertyAnimation(this, "background_opacity", this)) { setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); } QSize TagWidgetTag::sizeHint() const { QSize text = fontMetrics().size(0, text_); QSize icon(kIconSize + kIconTextSpacing, kIconSize); return QSize(kHPadding + icon.width() + text.width() + kHPadding, kVPadding + qMax(text.height(), icon.height()) + kVPadding); } void TagWidgetTag::set_background_opacity(float opacity) { opacity_ = opacity; update(); } void TagWidgetTag::enterEvent(QEvent*) { animation_->stop(); animation_->setEndValue(1.0); animation_->setDuration(80); animation_->start(); } void TagWidgetTag::leaveEvent(QEvent*) { animation_->stop(); animation_->setEndValue(0.0); animation_->setDuration(160); animation_->start(); } void TagWidgetTag::paintEvent(QPaintEvent*) { QPainter p(this); const QRect tag_rect(rect()); const QRect icon_rect(tag_rect.topLeft() + QPoint(kHPadding, kVPadding), QSize(kIconSize, kIconSize)); const QRect text_rect( icon_rect.topRight() + QPoint(kIconTextSpacing, 0), QSize(tag_rect.width() - icon_rect.right() - kIconTextSpacing - kHPadding, icon_rect.height())); // Use the tag's opacity p.setOpacity(0.3 + opacity_ * 0.7); // Background QColor background_color = palette().color(QPalette::Highlight); background_color.setAlpha(128); p.setRenderHint(QPainter::Antialiasing); p.setPen(QPen(palette().dark(), 1.0)); p.setBrush(background_color); p.drawRoundedRect(tag_rect, 5, 5); // Icon p.drawPixmap(icon_rect, icon_.pixmap(kIconSize)); // Text p.setOpacity(1.0); p.setPen(palette().color(QPalette::Text)); p.drawText(text_rect, text_); } void TagWidgetTag::mouseReleaseEvent(QMouseEvent*) { emit Clicked(); } void TagWidgetTag::contextMenuEvent(QContextMenuEvent*) { emit Clicked(); } TagWidget::TagWidget(Type type, QWidget* parent) : QWidget(parent), type_(type) { setLayout(new FlowLayout(4, 6, 4)); } void TagWidget::AddTag(const QString& tag) { if (tag.isEmpty()) return; TagWidgetTag* widget = new TagWidgetTag(icon_, tag, this); connect(widget, SIGNAL(Clicked()), SLOT(TagClicked())); layout()->addWidget(widget); tags_ << widget; } void TagWidget::TagClicked() { TagWidgetTag* tag = qobject_cast(sender()); if (!tag) return; emit DoGlobalSearch(tag->text()); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/tagwidget.h000066400000000000000000000044641260417502300241400ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef TAGWIDGET_H #define TAGWIDGET_H #include "playlist/playlistitem.h" #include "smartplaylists/generator_fwd.h" #include #include class QMenu; class QPropertyAnimation; class TagWidgetTag : public QWidget { Q_OBJECT Q_PROPERTY(float background_opacity READ background_opacity WRITE set_background_opacity); public: TagWidgetTag(const QIcon& icon, const QString& text, QWidget* parent); static const int kIconSize; static const int kIconTextSpacing; static const int kHPadding; static const int kVPadding; float background_opacity() const { return opacity_; } void set_background_opacity(float opacity); QSize sizeHint() const; QString text() const { return text_; } signals: void Clicked(); protected: void enterEvent(QEvent*); void leaveEvent(QEvent*); void paintEvent(QPaintEvent*); void mouseReleaseEvent(QMouseEvent*); void contextMenuEvent(QContextMenuEvent*); private: QString text_; QIcon icon_; float opacity_; QPropertyAnimation* animation_; }; class TagWidget : public QWidget { Q_OBJECT public: enum Type { Type_Tags, Type_Artists, }; TagWidget(Type type, QWidget* parent = nullptr); void SetIcon(const QIcon& icon) { icon_ = icon; } void AddTag(const QString& tag); int count() const { return tags_.count(); } signals: void AddToPlaylist(QMimeData* data); void DoGlobalSearch(const QString& query); private slots: void TagClicked(); private: void PlayLastFm(const QString& url_pattern); private: Type type_; QIcon icon_; QList tags_; }; #endif // TAGWIDGET_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/ultimatelyricslyric.cpp000066400000000000000000000023651260417502300266270ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "ultimatelyricslyric.h" #include UltimateLyricsLyric::UltimateLyricsLyric(QObject* parent) : QTextDocument(parent) {} void UltimateLyricsLyric::SetHtml(const QString& html) { QString copy(html.trimmed()); // Simplify newlines, and convert them to

copy.replace(QRegExp("[\\r\\n]+"), "\n"); copy.replace(QRegExp("([^>])[\\t ]*\\n"), "\\1

"); // Strip any newlines from the end copy.replace(QRegExp("((<\\s*br\\s*/?\\s*>)|(<\\s*/?\\s*p\\s*/?\\s*>))+$"), ""); setHtml(copy); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/ultimatelyricslyric.h000066400000000000000000000020131260417502300262620ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ULTIMATELYRICSLYRIC_H #define ULTIMATELYRICSLYRIC_H #include #include class UltimateLyricsLyric : public QTextDocument { Q_OBJECT public: UltimateLyricsLyric(QObject* parent = nullptr); void SetHtml(const QString& html); }; #endif // ULTIMATELYRICSLYRIC_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/ultimatelyricsprovider.cpp000066400000000000000000000242051260417502300273340ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "songinfotextview.h" #include "ultimatelyricslyric.h" #include "ultimatelyricsprovider.h" #include "core/logging.h" #include "core/network.h" #include #include #include #include const int UltimateLyricsProvider::kRedirectLimit = 5; UltimateLyricsProvider::UltimateLyricsProvider() : network_(new NetworkAccessManager(this)), relevance_(0), redirect_count_(0), url_hop_(false) {} void UltimateLyricsProvider::FetchInfo(int id, const Song& metadata) { // Get the text codec const QTextCodec* codec = QTextCodec::codecForName(charset_.toAscii().constData()); if (!codec) { qLog(Warning) << "Invalid codec" << charset_; emit Finished(id); return; } // Fill in fields in the URL QString url_text(url_); ReplaceFields(metadata, &url_text); QUrl url(url_text); qLog(Debug) << "Fetching lyrics from" << url; // Fetch the URL, follow redirects metadata_ = metadata; redirect_count_ = 0; QNetworkReply* reply = network_->get(QNetworkRequest(url)); requests_[reply] = id; connect(reply, SIGNAL(finished()), SLOT(LyricsFetched())); } void UltimateLyricsProvider::LyricsFetched() { QNetworkReply* reply = qobject_cast(sender()); if (!reply) { url_hop_ = false; return; } int id = requests_.take(reply); reply->deleteLater(); if (reply->error() != QNetworkReply::NoError) { url_hop_ = false; emit Finished(id); return; } // Handle redirects QVariant redirect_target = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); if (redirect_target.isValid()) { if (redirect_count_ >= kRedirectLimit) { url_hop_ = false; emit Finished(id); return; } QUrl target = redirect_target.toUrl(); if (target.scheme().isEmpty() || target.host().isEmpty()) { QString path = target.path(); target = reply->url(); target.setPath(path); } redirect_count_++; QNetworkReply* reply = network_->get(QNetworkRequest(target)); requests_[reply] = id; connect(reply, SIGNAL(finished()), SLOT(LyricsFetched())); return; } const QTextCodec* codec = QTextCodec::codecForName(charset_.toAscii().constData()); const QString original_content = codec->toUnicode(reply->readAll()); QString lyrics; // Check for invalid indicators for (const QString& indicator : invalid_indicators_) { if (original_content.contains(indicator)) { qLog(Debug) << "Found invalid indicator" << indicator; url_hop_ = false; emit Finished(id); return; } } if (!url_hop_) { // Apply extract rules for (const Rule& rule : extract_rules_) { // Modify the rule for this request's metadata Rule rule_copy(rule); for (Rule::iterator it = rule_copy.begin(); it != rule_copy.end(); ++it) { ReplaceFields(metadata_, &it->first); } QString content = original_content; if (ApplyExtractRule(rule_copy, &content)) { url_hop_ = true; QUrl url(content); qLog(Debug) << "Next url hop: " << url; QNetworkReply* reply = network_->get(QNetworkRequest(url)); requests_[reply] = id; connect(reply, SIGNAL(finished()), SLOT(LyricsFetched())); return; } // Apply exclude rules for (const Rule& rule : exclude_rules_) { ApplyExcludeRule(rule, &content); } if (!content.isEmpty() and HTMLHasAlphaNumeric(content)) { lyrics = content; break; } } } else { lyrics = original_content; } if (!lyrics.isEmpty() and HTMLHasAlphaNumeric(lyrics)) { CollapsibleInfoPane::Data data; data.id_ = "ultimatelyrics/" + name_; data.title_ = tr("Lyrics from %1").arg(name_); data.type_ = CollapsibleInfoPane::Data::Type_Lyrics; data.relevance_ = relevance(); if (QThread::currentThread() == QCoreApplication::instance()->thread()) { SongInfoTextView* editor = new SongInfoTextView; editor->SetHtml(lyrics); data.contents_ = editor; } else { UltimateLyricsLyric* editor = new UltimateLyricsLyric; editor->SetHtml(lyrics); data.content_object_ = editor; } emit InfoReady(id, data); } url_hop_ = false; emit Finished(id); } bool UltimateLyricsProvider::ApplyExtractRule(const Rule& rule, QString* content) const { for (const RuleItem& item : rule) { if (item.second.isNull()) { if (item.first.startsWith("http://") && item.second.isNull()) { *content = ExtractUrl(*content, rule); return true; } else { *content = ExtractXmlTag(*content, item.first); } } else { *content = Extract(*content, item.first, item.second); } } return false; } QString UltimateLyricsProvider::ExtractUrl(const QString& source, const Rule& rule) { QString url; QString id; for (const RuleItem& item : rule) { if (item.first.startsWith("http://") && item.second.isNull()) url = item.first; else id = Extract(source, item.first, item.second); } url.replace("{id}", id); return url; } QString UltimateLyricsProvider::ExtractXmlTag(const QString& source, const QString& tag) { QRegExp re("<(\\w+).*>"); // ಠ_ಠ if (re.indexIn(tag) == -1) return QString(); return Extract(source, tag, ""); } QString UltimateLyricsProvider::Extract(const QString& source, const QString& begin, const QString& end) { int begin_idx = source.indexOf(begin); if (begin_idx == -1) return QString(); begin_idx += begin.length(); int end_idx = source.indexOf(end, begin_idx); if (end_idx == -1) return QString(); return source.mid(begin_idx, end_idx - begin_idx - 1); } void UltimateLyricsProvider::ApplyExcludeRule(const Rule& rule, QString* content) const { for (const RuleItem& item : rule) { if (item.second.isNull()) { *content = ExcludeXmlTag(*content, item.first); } else { *content = Exclude(*content, item.first, item.second); } } } QString UltimateLyricsProvider::ExcludeXmlTag(const QString& source, const QString& tag) { QRegExp re("<(\\w+).*>"); // ಠ_ಠ if (re.indexIn(tag) == -1) return source; return Exclude(source, tag, ""); } QString UltimateLyricsProvider::Exclude(const QString& source, const QString& begin, const QString& end) { int begin_idx = source.indexOf(begin); if (begin_idx == -1) return source; int end_idx = source.indexOf(end, begin_idx + begin.length()); if (end_idx == -1) return source; return source.left(begin_idx) + source.right(source.length() - end_idx - end.length()); } QString UltimateLyricsProvider::FirstChar(const QString& text) { if (text.isEmpty()) return QString(); return text[0].toLower(); } QString UltimateLyricsProvider::TitleCase(const QString& text) { if (text.length() == 0) return QString(); QString ret = text; bool last_was_space = true; for (QString::iterator it = ret.begin(); it != ret.end(); ++it) { if (last_was_space) { *it = it->toUpper(); last_was_space = false; } else if (it->isSpace()) { last_was_space = true; } } return ret; } void UltimateLyricsProvider::ReplaceField(const QString& tag, const QString& value, QString* text) const { if (!text->contains(tag)) return; // Apply URL character replacement QString value_copy(value); for (const UrlFormat& format : url_formats_) { QRegExp re("[" + QRegExp::escape(format.first) + "]"); value_copy.replace(re, format.second); } text->replace(tag, value_copy, Qt::CaseInsensitive); } void UltimateLyricsProvider::ReplaceFields(const Song& metadata, QString* text) const { ReplaceField("{artist}", metadata.artist().toLower(), text); ReplaceField("{artist2}", NoSpace(metadata.artist().toLower()), text); ReplaceField("{album}", metadata.album().toLower(), text); ReplaceField("{album2}", NoSpace(metadata.album().toLower()), text); ReplaceField("{title}", metadata.title().toLower(), text); ReplaceField("{Artist}", metadata.artist(), text); ReplaceField("{Album}", metadata.album(), text); ReplaceField("{ARTIST}", metadata.artist().toUpper(), text); ReplaceField("{year}", metadata.PrettyYear(), text); ReplaceField("{Title}", metadata.title(), text); ReplaceField("{Title2}", TitleCase(metadata.title()), text); ReplaceField("{a}", FirstChar(metadata.artist()), text); ReplaceField("{track}", QString::number(metadata.track()), text); } QString UltimateLyricsProvider::NoSpace(const QString& text) { QString ret(text); ret.remove(' '); return ret; } // tells whether a html block has alphanumeric characters (skipping tags) // TODO: handle special characters (e.g. ® á) bool UltimateLyricsProvider::HTMLHasAlphaNumeric(const QString& html) { bool in_tag = false; for (const QChar& c : html) { if (!in_tag and c.isLetterOrNumber()) return true; else if (c == QChar('<')) in_tag = true; else if (c == QChar('>')) in_tag = false; } qLog(Debug) << html; return false; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/ultimatelyricsprovider.h000066400000000000000000000065241260417502300270050ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ULTIMATELYRICSPROVIDER_H #define ULTIMATELYRICSPROVIDER_H #include #include #include #include "songinfoprovider.h" class NetworkAccessManager; class QNetworkReply; class UltimateLyricsProvider : public SongInfoProvider { Q_OBJECT public: UltimateLyricsProvider(); static const int kRedirectLimit; typedef QPair RuleItem; typedef QList Rule; typedef QPair UrlFormat; void set_name(const QString& name) { name_ = name; } void set_title(const QString& title) { title_ = title; } void set_url(const QString& url) { url_ = url; } void set_charset(const QString& charset) { charset_ = charset; } void set_relevance(int relevance) { relevance_ = relevance; } void add_url_format(const QString& replace, const QString& with) { url_formats_ << UrlFormat(replace, with); } void add_extract_rule(const Rule& rule) { extract_rules_ << rule; } void add_exclude_rule(const Rule& rule) { exclude_rules_ << rule; } void add_invalid_indicator(const QString& indicator) { invalid_indicators_ << indicator; } QString name() const { return name_; } int relevance() const { return relevance_; } void FetchInfo(int id, const Song& metadata); private slots: void LyricsFetched(); private: bool ApplyExtractRule(const Rule& rule, QString* content) const; void ApplyExcludeRule(const Rule& rule, QString* content) const; static QString ExtractUrl(const QString& source, const Rule& rule); static QString ExtractXmlTag(const QString& source, const QString& tag); static QString Extract(const QString& source, const QString& begin, const QString& end); static QString ExcludeXmlTag(const QString& source, const QString& tag); static QString Exclude(const QString& source, const QString& begin, const QString& end); static QString FirstChar(const QString& text); static QString TitleCase(const QString& text); static QString NoSpace(const QString& text); static bool HTMLHasAlphaNumeric(const QString& html); void ReplaceField(const QString& tag, const QString& value, QString* text) const; void ReplaceFields(const Song& metadata, QString* text) const; private: NetworkAccessManager* network_; QMap requests_; QString name_; QString title_; QString url_; QString charset_; int relevance_; QList url_formats_; QList extract_rules_; QList exclude_rules_; QStringList invalid_indicators_; Song metadata_; int redirect_count_; bool url_hop_; }; #endif // ULTIMATELYRICSPROVIDER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/ultimatelyricsreader.cpp000066400000000000000000000103701260417502300267420ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "ultimatelyricsprovider.h" #include "ultimatelyricsreader.h" #include "core/logging.h" #include #include #include UltimateLyricsReader::UltimateLyricsReader(QObject* parent) : QObject(parent), thread_(qApp->thread()) {} void UltimateLyricsReader::SetThread(QThread* thread) { thread_ = thread; } QList UltimateLyricsReader::Parse(const QString& filename) const { QFile file(filename); if (!file.open(QIODevice::ReadOnly)) { qLog(Warning) << "Error opening" << filename; return QList(); } return ParseDevice(&file); } QList UltimateLyricsReader::ParseDevice(QIODevice* device) const { QList ret; QXmlStreamReader reader(device); while (!reader.atEnd()) { reader.readNext(); if (reader.name() == "provider") { SongInfoProvider* provider = ParseProvider(&reader); if (provider) { provider->moveToThread(thread_); ret << provider; } } } return ret; } SongInfoProvider* UltimateLyricsReader::ParseProvider(QXmlStreamReader* reader) const { QXmlStreamAttributes attributes = reader->attributes(); UltimateLyricsProvider* scraper = new UltimateLyricsProvider; scraper->set_name(attributes.value("name").toString()); scraper->set_title(attributes.value("title").toString()); scraper->set_charset(attributes.value("charset").toString()); scraper->set_url(attributes.value("url").toString()); while (!reader->atEnd()) { reader->readNext(); if (reader->tokenType() == QXmlStreamReader::EndElement) break; if (reader->tokenType() == QXmlStreamReader::StartElement) { if (reader->name() == "extract") scraper->add_extract_rule(ParseRule(reader)); else if (reader->name() == "exclude") scraper->add_exclude_rule(ParseRule(reader)); else if (reader->name() == "invalidIndicator") scraper->add_invalid_indicator(ParseInvalidIndicator(reader)); else if (reader->name() == "urlFormat") { scraper->add_url_format( reader->attributes().value("replace").toString(), reader->attributes().value("with").toString()); reader->skipCurrentElement(); } else reader->skipCurrentElement(); } } return scraper; } UltimateLyricsProvider::Rule UltimateLyricsReader::ParseRule( QXmlStreamReader* reader) const { UltimateLyricsProvider::Rule ret; while (!reader->atEnd()) { reader->readNext(); if (reader->tokenType() == QXmlStreamReader::EndElement) break; if (reader->tokenType() == QXmlStreamReader::StartElement) { if (reader->name() == "item") { QXmlStreamAttributes attr = reader->attributes(); if (attr.hasAttribute("tag")) ret << UltimateLyricsProvider::RuleItem(attr.value("tag").toString(), QString()); else if (attr.hasAttribute("url")) ret << UltimateLyricsProvider::RuleItem(attr.value("url").toString(), QString()); else if (attr.hasAttribute("begin")) ret << UltimateLyricsProvider::RuleItem( attr.value("begin").toString(), attr.value("end").toString()); } reader->skipCurrentElement(); } } return ret; } QString UltimateLyricsReader::ParseInvalidIndicator(QXmlStreamReader* reader) const { QString ret = reader->attributes().value("value").toString(); reader->skipCurrentElement(); return ret; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/songinfo/ultimatelyricsreader.h000066400000000000000000000027021260417502300264070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ULTIMATELYRICSREADER_H #define ULTIMATELYRICSREADER_H #include "ultimatelyricsprovider.h" #include #include class QIODevice; class QThread; class UltimateLyricsReader : public QObject { Q_OBJECT public: UltimateLyricsReader(QObject* parent = nullptr); QList Parse(const QString& filename) const; QList ParseDevice(QIODevice* device) const; void SetThread(QThread* thread); private: SongInfoProvider* ParseProvider(QXmlStreamReader* reader) const; UltimateLyricsProvider::Rule ParseRule(QXmlStreamReader* reader) const; QString ParseInvalidIndicator(QXmlStreamReader* reader) const; QThread* thread_; }; #endif // ULTIMATELYRICSREADER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/000077500000000000000000000000001260417502300223225ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcodedialog.cpp000066400000000000000000000250721260417502300261760ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "transcodedialog.h" #include "transcoder.h" #include "transcoderoptionsdialog.h" #include "ui_transcodedialog.h" #include "ui_transcodelogdialog.h" #include "ui/iconloader.h" #include "ui/mainwindow.h" #include "widgets/fileview.h" #include #include #include #include #include // winspool.h defines this :( #ifdef AddJob #undef AddJob #endif const char* TranscodeDialog::kSettingsGroup = "Transcoder"; const int TranscodeDialog::kProgressInterval = 500; const int TranscodeDialog::kMaxDestinationItems = 10; static bool ComparePresetsByName(const TranscoderPreset& left, const TranscoderPreset& right) { return left.name_ < right.name_; } TranscodeDialog::TranscodeDialog(QWidget* parent) : QDialog(parent), ui_(new Ui_TranscodeDialog), log_ui_(new Ui_TranscodeLogDialog), log_dialog_(new QDialog(this)), transcoder_(new Transcoder(this)), queued_(0), finished_success_(0), finished_failed_(0) { ui_->setupUi(this); ui_->files->header()->setResizeMode(QHeaderView::ResizeToContents); log_ui_->setupUi(log_dialog_); QPushButton* clear_button = log_ui_->buttonBox->addButton(tr("Clear"), QDialogButtonBox::ResetRole); connect(clear_button, SIGNAL(clicked()), log_ui_->log, SLOT(clear())); // Get presets QList presets = Transcoder::GetAllPresets(); qSort(presets.begin(), presets.end(), ComparePresetsByName); for (const TranscoderPreset& preset : presets) { ui_->format->addItem( QString("%1 (.%2)").arg(preset.name_, preset.extension_), QVariant::fromValue(preset)); } // Load settings QSettings s; s.beginGroup(kSettingsGroup); last_add_dir_ = s.value("last_add_dir", QDir::homePath()).toString(); last_import_dir_ = s.value("last_import_dir", QDir::homePath()).toString(); QString last_output_format = s.value("last_output_format", "audio/x-vorbis").toString(); for (int i = 0; i < ui_->format->count(); ++i) { if (last_output_format == ui_->format->itemData(i).value().codec_mimetype_) { ui_->format->setCurrentIndex(i); break; } } // Add a start button start_button_ = ui_->button_box->addButton(tr("Start transcoding"), QDialogButtonBox::ActionRole); cancel_button_ = ui_->button_box->button(QDialogButtonBox::Cancel); close_button_ = ui_->button_box->button(QDialogButtonBox::Close); close_button_->setShortcut(QKeySequence::Close); // Hide elements cancel_button_->hide(); ui_->progress_group->hide(); // Connect stuff connect(ui_->add, SIGNAL(clicked()), SLOT(Add())); connect(ui_->import, SIGNAL(clicked()), SLOT(Import())); connect(ui_->remove, SIGNAL(clicked()), SLOT(Remove())); connect(start_button_, SIGNAL(clicked()), SLOT(Start())); connect(cancel_button_, SIGNAL(clicked()), SLOT(Cancel())); connect(close_button_, SIGNAL(clicked()), SLOT(hide())); connect(ui_->details, SIGNAL(clicked()), log_dialog_, SLOT(show())); connect(ui_->options, SIGNAL(clicked()), SLOT(Options())); connect(ui_->select, SIGNAL(clicked()), SLOT(AddDestination())); connect(transcoder_, SIGNAL(JobComplete(QString, QString, bool)), SLOT(JobComplete(QString, QString, bool))); connect(transcoder_, SIGNAL(LogLine(QString)), SLOT(LogLine(QString))); connect(transcoder_, SIGNAL(AllJobsComplete()), SLOT(AllJobsComplete())); } TranscodeDialog::~TranscodeDialog() { delete log_ui_; delete ui_; } void TranscodeDialog::SetWorking(bool working) { start_button_->setVisible(!working); cancel_button_->setVisible(working); close_button_->setVisible(!working); ui_->input_group->setEnabled(!working); ui_->output_group->setEnabled(!working); ui_->progress_group->setVisible(true); if (working) progress_timer_.start(kProgressInterval, this); else progress_timer_.stop(); } void TranscodeDialog::Start() { SetWorking(true); QAbstractItemModel* file_model = ui_->files->model(); TranscoderPreset preset = ui_->format->itemData(ui_->format->currentIndex()) .value(); // Add jobs to the transcoder for (int i = 0; i < file_model->rowCount(); ++i) { QFileInfo input_fileinfo( file_model->index(i, 0).data(Qt::UserRole).toString()); QString output_filename = GetOutputFileName(input_fileinfo, preset); transcoder_->AddJob(input_fileinfo.filePath(), preset, output_filename); } // Set up the progressbar ui_->progress_bar->setValue(0); ui_->progress_bar->setMaximum(file_model->rowCount() * 100); // Reset the UI queued_ = file_model->rowCount(); finished_success_ = 0; finished_failed_ = 0; UpdateStatusText(); // Start transcoding transcoder_->Start(); // Save the last output format QSettings s; s.beginGroup(kSettingsGroup); s.setValue("last_output_format", preset.codec_mimetype_); } void TranscodeDialog::Cancel() { transcoder_->Cancel(); SetWorking(false); } void TranscodeDialog::JobComplete(const QString& input, const QString& output, bool success) { if (success) finished_success_++; else finished_failed_++; queued_--; UpdateStatusText(); UpdateProgress(); } void TranscodeDialog::UpdateProgress() { int progress = (finished_success_ + finished_failed_) * 100; QMap current_jobs = transcoder_->GetProgress(); for (float value : current_jobs.values()) { progress += qBound(0, int(value * 100), 99); } ui_->progress_bar->setValue(progress); } void TranscodeDialog::UpdateStatusText() { QStringList sections; if (queued_) { sections << "" + tr("%n remaining", "", queued_) + ""; } if (finished_success_) { sections << "" + tr("%n finished", "", finished_success_) + ""; } if (finished_failed_) { sections << "" + tr("%n failed", "", finished_failed_) + ""; } ui_->progress_text->setText(sections.join(", ")); } void TranscodeDialog::AllJobsComplete() { SetWorking(false); } void TranscodeDialog::Add() { QStringList filenames = QFileDialog::getOpenFileNames( this, tr("Add files to transcode"), last_add_dir_, QString("%1 (%2);;%3").arg(tr("Music"), FileView::kFileFilter, tr(MainWindow::kAllFilesFilterSpec))); if (filenames.isEmpty()) return; SetFilenames(filenames); last_add_dir_ = filenames[0]; QSettings s; s.beginGroup(kSettingsGroup); s.setValue("last_add_dir", last_add_dir_); } void TranscodeDialog::Import() { QString path = QFileDialog::getExistingDirectory( this, tr("Open a directory to import music from"), last_import_dir_, QFileDialog::ShowDirsOnly); if (path.isEmpty()) return; QStringList filenames; QStringList audioTypes = QString(FileView::kFileFilter).split(" ", QString::SkipEmptyParts); QDirIterator files(path, audioTypes, QDir::Files | QDir::Readable, QDirIterator::Subdirectories); while (files.hasNext()) { filenames << files.next(); } SetFilenames(filenames); last_import_dir_ = path; QSettings settings; settings.beginGroup(kSettingsGroup); settings.setValue("last_import_dir", last_import_dir_); } void TranscodeDialog::SetFilenames(const QStringList& filenames) { for (const QString& filename : filenames) { QString name = filename.section('/', -1, -1); QString path = filename.section('/', 0, -2); QTreeWidgetItem* item = new QTreeWidgetItem(ui_->files, QStringList() << name << path); item->setData(0, Qt::UserRole, filename); } } void TranscodeDialog::Remove() { qDeleteAll(ui_->files->selectedItems()); } void TranscodeDialog::LogLine(const QString& message) { QString date(QDateTime::currentDateTime().toString(Qt::TextDate)); log_ui_->log->appendPlainText(QString("%1: %2").arg(date, message)); } void TranscodeDialog::timerEvent(QTimerEvent* e) { QDialog::timerEvent(e); if (e->timerId() == progress_timer_.timerId()) { UpdateProgress(); } } void TranscodeDialog::Options() { TranscoderPreset preset = ui_->format->itemData(ui_->format->currentIndex()) .value(); TranscoderOptionsDialog dialog(preset.type_, this); if (dialog.is_valid()) { dialog.exec(); } } // Adds a folder to the destination box. void TranscodeDialog::AddDestination() { int index = ui_->destination->currentIndex(); QString initial_dir = (!ui_->destination->itemData(index).isNull() ? ui_->destination->itemData(index).toString() : QDir::homePath()); QString dir = QFileDialog::getExistingDirectory(this, tr("Add folder"), initial_dir); if (!dir.isEmpty()) { // Keep only a finite number of items in the box. while (ui_->destination->count() >= kMaxDestinationItems) { ui_->destination->removeItem(1); // Remove the oldest folder item. } QIcon icon = IconLoader::Load("folder"); QVariant data = QVariant::fromValue(dir); // Do not insert duplicates. int duplicate_index = ui_->destination->findData(data); if (duplicate_index == -1) { ui_->destination->addItem(icon, dir, data); ui_->destination->setCurrentIndex(ui_->destination->count() - 1); } else { ui_->destination->setCurrentIndex(duplicate_index); } } } QString TranscodeDialog::GetOutputFileName( const QFileInfo& input, const TranscoderPreset& preset) const { QFileInfo path( ui_->destination->itemData(ui_->destination->currentIndex()).toString()); QString output_path; if (path.isDir()) { output_path = path.filePath(); } else { // Keep the original path. output_path = input.path(); } return output_path + '/' + input.completeBaseName() + '.' + preset.extension_; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcodedialog.h000066400000000000000000000042241260417502300256370ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef TRANSCODEDIALOG_H #define TRANSCODEDIALOG_H #include #include #include class Transcoder; class Ui_TranscodeDialog; class Ui_TranscodeLogDialog; struct TranscoderPreset; class TranscodeDialog : public QDialog { Q_OBJECT public: TranscodeDialog(QWidget* parent = nullptr); ~TranscodeDialog(); static const char* kSettingsGroup; static const int kProgressInterval; static const int kMaxDestinationItems; void SetFilenames(const QStringList& filenames); protected: void timerEvent(QTimerEvent* e); private slots: void Add(); void Import(); void Remove(); void Start(); void Cancel(); void JobComplete(const QString& input, const QString& output, bool success); void LogLine(const QString& message); void AllJobsComplete(); void Options(); void AddDestination(); private: void SetWorking(bool working); void UpdateStatusText(); void UpdateProgress(); QString GetOutputFileName(const QFileInfo& input, const TranscoderPreset& preset) const; private: Ui_TranscodeDialog* ui_; Ui_TranscodeLogDialog* log_ui_; QDialog* log_dialog_; QBasicTimer progress_timer_; QPushButton* start_button_; QPushButton* cancel_button_; QPushButton* close_button_; QString last_add_dir_; QString last_import_dir_; Transcoder* transcoder_; int queued_; int finished_success_; int finished_failed_; }; #endif // TRANSCODEDIALOG_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcodedialog.ui000066400000000000000000000143621260417502300260310ustar00rootroot00000000000000 TranscodeDialog 0 0 499 448 Transcode Music :/icon.png:/icon.png Files to transcode true QAbstractItemView::ExtendedSelection false true false true false Filename Directory Add... Remove Qt::Vertical 20 40 Add all tracks from a directory and all its subdirectories Import... Output options Audio format 0 0 Options... Destination true 0 0 Alongside the originals Select... Progress 0 0 Qt::RichText Details... QDialogButtonBox::Cancel|QDialogButtonBox::Close files add remove format button_box clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcodelogdialog.ui000066400000000000000000000025331260417502300265300ustar00rootroot00000000000000 TranscodeLogDialog 0 0 676 358 Transcoder Log :/icon.png:/icon.png true QDialogButtonBox::Close buttonBox rejected() TranscodeLogDialog hide() 599 331 582 355 clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoder.cpp000066400000000000000000000453631260417502300252050ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "transcoder.h" #include #include #include #include #include #include #include #include "core/logging.h" #include "core/signalchecker.h" #include "core/utilities.h" using std::shared_ptr; int Transcoder::JobFinishedEvent::sEventType = -1; TranscoderPreset::TranscoderPreset(Song::FileType type, const QString& name, const QString& extension, const QString& codec_mimetype, const QString& muxer_mimetype) : type_(type), name_(name), extension_(extension), codec_mimetype_(codec_mimetype), muxer_mimetype_(muxer_mimetype) {} GstElement* Transcoder::CreateElement(const QString& factory_name, GstElement* bin, const QString& name) { GstElement* ret = gst_element_factory_make( factory_name.toAscii().constData(), name.isNull() ? factory_name.toAscii().constData() : name.toAscii().constData()); if (ret && bin) gst_bin_add(GST_BIN(bin), ret); if (!ret) { emit LogLine( tr("Could not create the GStreamer element \"%1\" -" " make sure you have all the required GStreamer plugins installed") .arg(factory_name)); } else { SetElementProperties(factory_name, G_OBJECT(ret)); } return ret; } struct SuitableElement { SuitableElement(const QString& name = QString(), int rank = 0) : name_(name), rank_(rank) {} bool operator<(const SuitableElement& other) const { return rank_ < other.rank_; } QString name_; int rank_; }; GstElement* Transcoder::CreateElementForMimeType(const QString& element_type, const QString& mime_type, GstElement* bin) { if (mime_type.isEmpty()) return nullptr; // HACK: Force ffmux_mp4 because it doesn't set any useful src caps if (mime_type == "audio/mp4") { LogLine(QString("Using '%1' (rank %2)").arg("ffmux_mp4").arg(-1)); return CreateElement("ffmux_mp4", bin); } // Keep track of all the suitable elements we find and figure out which // is the best at the end. QList suitable_elements_; // The caps we're trying to find GstCaps* target_caps = gst_caps_from_string(mime_type.toUtf8().constData()); GstRegistry* registry = gst_registry_get(); GList* const features = gst_registry_get_feature_list(registry, GST_TYPE_ELEMENT_FACTORY); for (GList* p = features; p; p = g_list_next(p)) { GstElementFactory* factory = GST_ELEMENT_FACTORY(p->data); // Is this the right type of plugin? if (QString(gst_element_factory_get_klass(factory)).contains(element_type)) { const GList* const templates = gst_element_factory_get_static_pad_templates(factory); for (const GList* p = templates; p; p = g_list_next(p)) { // Only interested in source pads GstStaticPadTemplate* pad_template = reinterpret_cast(p->data); if (pad_template->direction != GST_PAD_SRC) continue; // Does this pad support the mime type we want? GstCaps* caps = gst_static_pad_template_get_caps(pad_template); GstCaps* intersection = gst_caps_intersect(caps, target_caps); if (intersection) { if (!gst_caps_is_empty(intersection)) { int rank = gst_plugin_feature_get_rank(GST_PLUGIN_FEATURE(factory)); QString name = GST_OBJECT_NAME(factory); if (name.startsWith("ffmux") || name.startsWith("ffenc")) rank = -1; // ffmpeg usually sucks suitable_elements_ << SuitableElement(name, rank); } gst_caps_unref(intersection); } } } } gst_plugin_feature_list_free(features); gst_caps_unref(target_caps); if (suitable_elements_.isEmpty()) return nullptr; // Sort by rank qSort(suitable_elements_); const SuitableElement& best = suitable_elements_.last(); LogLine(QString("Using '%1' (rank %2)").arg(best.name_).arg(best.rank_)); if (best.name_ == "lamemp3enc") { // Special case: we need to add xingmux and id3v2mux to the pipeline when // using lamemp3enc because it doesn't write the VBR or ID3v2 headers // itself. LogLine("Adding xingmux and id3v2mux to the pipeline"); // Create the bin GstElement* mp3bin = gst_bin_new("mp3bin"); gst_bin_add(GST_BIN(bin), mp3bin); // Create the elements GstElement* lame = CreateElement("lamemp3enc", mp3bin); GstElement* xing = CreateElement("xingmux", mp3bin); GstElement* id3v2 = CreateElement("id3v2mux", mp3bin); if (!lame || !xing || !id3v2) { return nullptr; } // Link the elements together gst_element_link_many(lame, xing, id3v2, nullptr); // Link the bin's ghost pads to the elements on each end GstPad* pad = gst_element_get_static_pad(lame, "sink"); gst_element_add_pad(mp3bin, gst_ghost_pad_new("sink", pad)); gst_object_unref(GST_OBJECT(pad)); pad = gst_element_get_static_pad(id3v2, "src"); gst_element_add_pad(mp3bin, gst_ghost_pad_new("src", pad)); gst_object_unref(GST_OBJECT(pad)); return mp3bin; } else { return CreateElement(best.name_, bin); } } Transcoder::JobFinishedEvent::JobFinishedEvent(JobState* state, bool success) : QEvent(QEvent::Type(sEventType)), state_(state), success_(success) {} void Transcoder::JobState::PostFinished(bool success) { if (success) { emit parent_->LogLine(tr("Successfully written %1") .arg(QDir::toNativeSeparators(job_.output))); } QCoreApplication::postEvent(parent_, new Transcoder::JobFinishedEvent(this, success)); } Transcoder::Transcoder(QObject* parent, const QString& settings_postfix) : QObject(parent), max_threads_(QThread::idealThreadCount()), settings_postfix_(settings_postfix) { if (JobFinishedEvent::sEventType == -1) JobFinishedEvent::sEventType = QEvent::registerEventType(); // Initialise some settings for the lamemp3enc element. QSettings s; s.beginGroup("Transcoder/lamemp3enc" + settings_postfix_); if (s.value("target").isNull()) { s.setValue("target", 1); // 1 == bitrate } if (s.value("cbr").isNull()) { s.setValue("cbr", true); } } QList Transcoder::GetAllPresets() { QList ret; ret << PresetForFileType(Song::Type_Flac); ret << PresetForFileType(Song::Type_Mp4); ret << PresetForFileType(Song::Type_Mpeg); ret << PresetForFileType(Song::Type_OggVorbis); ret << PresetForFileType(Song::Type_OggFlac); ret << PresetForFileType(Song::Type_OggSpeex); ret << PresetForFileType(Song::Type_Asf); ret << PresetForFileType(Song::Type_Wav); ret << PresetForFileType(Song::Type_OggOpus); return ret; } TranscoderPreset Transcoder::PresetForFileType(Song::FileType type) { switch (type) { case Song::Type_Flac: return TranscoderPreset(type, tr("Flac"), "flac", "audio/x-flac"); case Song::Type_Mp4: return TranscoderPreset(type, tr("M4A AAC"), "mp4", "audio/mpeg, mpegversion=(int)4", "audio/mp4"); case Song::Type_Mpeg: return TranscoderPreset(type, tr("MP3"), "mp3", "audio/mpeg, mpegversion=(int)1, layer=(int)3"); case Song::Type_OggVorbis: return TranscoderPreset(type, tr("Ogg Vorbis"), "ogg", "audio/x-vorbis", "application/ogg"); case Song::Type_OggFlac: return TranscoderPreset(type, tr("Ogg Flac"), "ogg", "audio/x-flac", "application/ogg"); case Song::Type_OggSpeex: return TranscoderPreset(type, tr("Ogg Speex"), "spx", "audio/x-speex", "application/ogg"); case Song::Type_OggOpus: return TranscoderPreset(type, tr("Ogg Opus"), "opus", "audio/x-opus", "application/ogg"); case Song::Type_Asf: return TranscoderPreset(type, tr("Windows Media audio"), "wma", "audio/x-wma", "video/x-ms-asf"); case Song::Type_Wav: return TranscoderPreset(type, tr("Wav"), "wav", QString(), "audio/x-wav"); default: qLog(Warning) << "Unsupported format in PresetForFileType:" << type; return TranscoderPreset(); } } Song::FileType Transcoder::PickBestFormat(QList supported) { if (supported.isEmpty()) return Song::Type_Unknown; QList best_formats; best_formats << Song::Type_Mpeg; best_formats << Song::Type_OggVorbis; best_formats << Song::Type_Asf; for (Song::FileType type : best_formats) { if (supported.isEmpty() || supported.contains(type)) return type; } return supported[0]; } void Transcoder::AddJob(const QString& input, const TranscoderPreset& preset, const QString& output) { Job job; job.input = input; job.preset = preset; // Use the supplied filename if there was one, otherwise take the file // extension off the input filename and append the correct one. if (!output.isEmpty()) job.output = output; else job.output = input.section('.', 0, -2) + '.' + preset.extension_; // Never overwrite existing files if (QFile::exists(job.output)) { for (int i = 0;; ++i) { QString new_filename = QString("%1.%2.%3").arg(job.output.section('.', 0, -2)).arg(i).arg( preset.extension_); if (!QFile::exists(new_filename)) { job.output = new_filename; break; } } } queued_jobs_ << job; } void Transcoder::AddTemporaryJob(const QString &input, const TranscoderPreset &preset) { Job job; job.input = input; job.output = Utilities::GetTemporaryFileName(); job.preset = preset; queued_jobs_ << job; } void Transcoder::Start() { emit LogLine(tr("Transcoding %1 files using %2 threads") .arg(queued_jobs_.count()) .arg(max_threads())); forever { StartJobStatus status = MaybeStartNextJob(); if (status == AllThreadsBusy || status == NoMoreJobs) break; } } Transcoder::StartJobStatus Transcoder::MaybeStartNextJob() { if (current_jobs_.count() >= max_threads()) return AllThreadsBusy; if (queued_jobs_.isEmpty()) { if (current_jobs_.isEmpty()) { emit AllJobsComplete(); } return NoMoreJobs; } Job job = queued_jobs_.takeFirst(); if (StartJob(job)) { return StartedSuccessfully; } emit JobComplete(job.input, job.output, false); return FailedToStart; } void Transcoder::NewPadCallback(GstElement*, GstPad* pad, gpointer data) { JobState* state = reinterpret_cast(data); GstPad* const audiopad = gst_element_get_static_pad(state->convert_element_, "sink"); if (GST_PAD_IS_LINKED(audiopad)) { qLog(Debug) << "audiopad is already linked, unlinking old pad"; gst_pad_unlink(audiopad, GST_PAD_PEER(audiopad)); } gst_pad_link(pad, audiopad); gst_object_unref(audiopad); } GstBusSyncReply Transcoder::BusCallbackSync(GstBus*, GstMessage* msg, gpointer data) { JobState* state = reinterpret_cast(data); switch (GST_MESSAGE_TYPE(msg)) { case GST_MESSAGE_EOS: state->PostFinished(true); break; case GST_MESSAGE_ERROR: state->ReportError(msg); state->PostFinished(false); break; default: break; } return GST_BUS_PASS; } void Transcoder::JobState::ReportError(GstMessage* msg) { GError* error; gchar* debugs; gst_message_parse_error(msg, &error, &debugs); QString message = QString::fromLocal8Bit(error->message); g_error_free(error); free(debugs); emit parent_->LogLine(tr("Error processing %1: %2").arg( QDir::toNativeSeparators(job_.input), message)); } bool Transcoder::StartJob(const Job& job) { shared_ptr state(new JobState(job, this)); emit LogLine(tr("Starting %1").arg(QDir::toNativeSeparators(job.input))); // Create the pipeline. // This should be a scoped_ptr, but scoped_ptr doesn't support custom // destructors. state->pipeline_ = gst_pipeline_new("pipeline"); if (!state->pipeline_) return false; // Create all the elements GstElement* src = CreateElement("filesrc", state->pipeline_); GstElement* decode = CreateElement("decodebin", state->pipeline_); GstElement* convert = CreateElement("audioconvert", state->pipeline_); GstElement* resample = CreateElement("audioresample", state->pipeline_); GstElement* codec = CreateElementForMimeType( "Codec/Encoder/Audio", job.preset.codec_mimetype_, state->pipeline_); GstElement* muxer = CreateElementForMimeType( "Codec/Muxer", job.preset.muxer_mimetype_, state->pipeline_); GstElement* sink = CreateElement("filesink", state->pipeline_); if (!src || !decode || !convert || !sink) return false; if (!codec && !job.preset.codec_mimetype_.isEmpty()) { LogLine(tr("Couldn't find an encoder for %1, check you have the correct " "GStreamer plugins installed").arg(job.preset.codec_mimetype_)); return false; } if (!muxer && !job.preset.muxer_mimetype_.isEmpty()) { LogLine(tr("Couldn't find a muxer for %1, check you have the correct " "GStreamer plugins installed").arg(job.preset.muxer_mimetype_)); return false; } // Join them together gst_element_link(src, decode); if (codec && muxer) gst_element_link_many(convert, resample, codec, muxer, sink, nullptr); else if (codec) gst_element_link_many(convert, resample, codec, sink, nullptr); else if (muxer) gst_element_link_many(convert, resample, muxer, sink, nullptr); // Set properties g_object_set(src, "location", job.input.toUtf8().constData(), nullptr); g_object_set(sink, "location", job.output.toUtf8().constData(), nullptr); // Set callbacks state->convert_element_ = convert; CHECKED_GCONNECT(decode, "pad-added", &NewPadCallback, state.get()); gst_bus_set_sync_handler(gst_pipeline_get_bus(GST_PIPELINE(state->pipeline_)), BusCallbackSync, state.get(), nullptr); // Start the pipeline gst_element_set_state(state->pipeline_, GST_STATE_PLAYING); // GStreamer now transcodes in another thread, so we can return now and do // something else. Keep the JobState object around. It'll post an event // to our event loop when it finishes. current_jobs_ << state; return true; } Transcoder::JobState::~JobState() { if (pipeline_) { gst_element_set_state(pipeline_, GST_STATE_NULL); gst_object_unref(pipeline_); } } bool Transcoder::event(QEvent* e) { if (e->type() == JobFinishedEvent::sEventType) { JobFinishedEvent* finished_event = static_cast(e); // Find this job in the list JobStateList::iterator it = current_jobs_.begin(); while (it != current_jobs_.end()) { if (it->get() == finished_event->state_) break; ++it; } if (it == current_jobs_.end()) { // Couldn't find it, maybe GStreamer gave us an event after we'd destroyed // the pipeline? return true; } QString input = (*it)->job_.input; QString output = (*it)->job_.output; // Remove event handlers from the gstreamer pipeline so they don't get // called after the pipeline is shutting down gst_bus_set_sync_handler( gst_pipeline_get_bus(GST_PIPELINE(finished_event->state_->pipeline_)), nullptr, nullptr, nullptr); // Remove it from the list - this will also destroy the GStreamer pipeline current_jobs_.erase(it); // Emit the finished signal emit JobComplete(input, output, finished_event->success_); // Start some more jobs MaybeStartNextJob(); return true; } return QObject::event(e); } void Transcoder::Cancel() { // Remove all pending jobs queued_jobs_.clear(); // Stop the running ones JobStateList::iterator it = current_jobs_.begin(); while (it != current_jobs_.end()) { shared_ptr state(*it); // Remove event handlers from the gstreamer pipeline so they don't get // called after the pipeline is shutting down gst_bus_set_sync_handler(gst_pipeline_get_bus( GST_PIPELINE(state->pipeline_)), nullptr, nullptr, nullptr); // Stop the pipeline if (gst_element_set_state(state->pipeline_, GST_STATE_NULL) == GST_STATE_CHANGE_ASYNC) { // Wait for it to finish stopping... gst_element_get_state(state->pipeline_, nullptr, nullptr, GST_CLOCK_TIME_NONE); } // Remove the job, this destroys the GStreamer pipeline too it = current_jobs_.erase(it); } } QMap Transcoder::GetProgress() const { QMap ret; for (const auto& state : current_jobs_) { if (!state->pipeline_) continue; gint64 position = 0; gint64 duration = 0; gst_element_query_position(state->pipeline_, GST_FORMAT_TIME, &position); gst_element_query_duration(state->pipeline_, GST_FORMAT_TIME, &duration); ret[state->job_.input] = float(position) / duration; } return ret; } void Transcoder::SetElementProperties(const QString& name, GObject* object) { QSettings s; s.beginGroup("Transcoder/" + name + settings_postfix_); guint properties_count = 0; GParamSpec** properties = g_object_class_list_properties( G_OBJECT_GET_CLASS(object), &properties_count); for (int i = 0; i < properties_count; ++i) { GParamSpec* property = properties[i]; const QVariant value = s.value(property->name); if (value.isNull()) continue; LogLine(QString("Setting %1 property: %2 = %3") .arg(name, property->name, value.toString())); switch (property->value_type) { case G_TYPE_DOUBLE: g_object_set(object, property->name, value.toDouble(), nullptr); break; case G_TYPE_FLOAT: g_object_set(object, property->name, value.toFloat(), nullptr); break; case G_TYPE_BOOLEAN: g_object_set(object, property->name, value.toInt(), nullptr); break; case G_TYPE_INT: default: g_object_set(object, property->name, value.toInt(), nullptr); break; } } g_free(properties); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoder.h000066400000000000000000000102761260417502300246450ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef TRANSCODER_H #define TRANSCODER_H #include #include #include #include #include #include #include "core/song.h" struct TranscoderPreset { TranscoderPreset() : type_(Song::Type_Unknown) {} TranscoderPreset(Song::FileType type, const QString& name, const QString& extension, const QString& codec_mimetype, const QString& muxer_mimetype_ = QString()); Song::FileType type_; QString name_; QString extension_; QString codec_mimetype_; QString muxer_mimetype_; }; Q_DECLARE_METATYPE(TranscoderPreset); class Transcoder : public QObject { Q_OBJECT public: Transcoder(QObject* parent = nullptr, const QString& settings_postfix = ""); static TranscoderPreset PresetForFileType(Song::FileType type); static QList GetAllPresets(); static Song::FileType PickBestFormat(QList supported); int max_threads() const { return max_threads_; } void set_max_threads(int count) { max_threads_ = count; } void AddJob(const QString& input, const TranscoderPreset& preset, const QString& output = QString()); void AddTemporaryJob(const QString& input, const TranscoderPreset& preset); QMap GetProgress() const; int QueuedJobsCount() const { return queued_jobs_.count(); } public slots: void Start(); void Cancel(); signals: void JobComplete(const QString& input, const QString& output, bool success); void LogLine(const QString& message); void AllJobsComplete(); protected: bool event(QEvent* e); private: // The description of a file to transcode - lives in the main thread. struct Job { QString input; QString output; TranscoderPreset preset; }; // State held by a job and shared across gstreamer callbacks - lives in the // job's thread. struct JobState { JobState(const Job& job, Transcoder* parent) : job_(job), parent_(parent), pipeline_(nullptr), convert_element_(nullptr) {} ~JobState(); void PostFinished(bool success); void ReportError(GstMessage* msg); Job job_; Transcoder* parent_; GstElement* pipeline_; GstElement* convert_element_; }; // Event passed from a GStreamer callback to the Transcoder when a job // finishes. struct JobFinishedEvent : public QEvent { JobFinishedEvent(JobState* state, bool success); static int sEventType; JobState* state_; bool success_; }; enum StartJobStatus { StartedSuccessfully, FailedToStart, NoMoreJobs, AllThreadsBusy, }; StartJobStatus MaybeStartNextJob(); bool StartJob(const Job& job); GstElement* CreateElement(const QString& factory_name, GstElement* bin = nullptr, const QString& name = QString()); GstElement* CreateElementForMimeType(const QString& element_type, const QString& mime_type, GstElement* bin = nullptr); void SetElementProperties(const QString& name, GObject* element); static void NewPadCallback(GstElement*, GstPad* pad, gpointer data); static GstBusSyncReply BusCallbackSync(GstBus*, GstMessage* msg, gpointer data); private: typedef QList> JobStateList; int max_threads_; QList queued_jobs_; JobStateList current_jobs_; QString settings_postfix_; }; #endif // TRANSCODER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoderoptionsaac.cpp000066400000000000000000000036221260417502300272560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "transcoderoptionsaac.h" #include "ui_transcoderoptionsaac.h" #include const char* TranscoderOptionsAAC::kSettingsGroup = "Transcoder/faac"; TranscoderOptionsAAC::TranscoderOptionsAAC(QWidget* parent) : TranscoderOptionsInterface(parent), ui_(new Ui_TranscoderOptionsAAC) { ui_->setupUi(this); } TranscoderOptionsAAC::~TranscoderOptionsAAC() { delete ui_; } void TranscoderOptionsAAC::Load() { QSettings s; s.beginGroup(kSettingsGroup + settings_postfix_); ui_->bitrate_slider->setValue(s.value("bitrate", 128000).toInt() / 1000); ui_->profile->setCurrentIndex(s.value("profile", 2).toInt() - 1); ui_->tns->setChecked(s.value("tns", false).toBool()); ui_->midside->setChecked(s.value("midside", true).toBool()); ui_->shortctl->setCurrentIndex(s.value("shortctl", 0).toInt()); } void TranscoderOptionsAAC::Save() { QSettings s; s.beginGroup(kSettingsGroup + settings_postfix_); s.setValue("bitrate", ui_->bitrate_slider->value() * 1000); s.setValue("profile", ui_->profile->currentIndex() + 1); s.setValue("tns", ui_->tns->isChecked()); s.setValue("midside", ui_->midside->isChecked()); s.setValue("shortctl", ui_->shortctl->currentIndex()); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoderoptionsaac.h000066400000000000000000000022221260417502300267160ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef TRANSCODEROPTIONSAAC_H #define TRANSCODEROPTIONSAAC_H #include "transcoderoptionsinterface.h" class Ui_TranscoderOptionsAAC; class TranscoderOptionsAAC : public TranscoderOptionsInterface { public: TranscoderOptionsAAC(QWidget* parent = nullptr); ~TranscoderOptionsAAC(); void Load(); void Save(); private: static const char* kSettingsGroup; Ui_TranscoderOptionsAAC* ui_; }; #endif // TRANSCODEROPTIONSAAC_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoderoptionsaac.ui000066400000000000000000000106761260417502300271200ustar00rootroot00000000000000 TranscoderOptionsAAC 0 0 480 344 Form Bitrate 8 320 128 Qt::Horizontal kbps 8 320 8 128 Profile 1 Main profile (MAIN) Low complexity profile (LC) Scalable sampling rate profile (SSR) Long term prediction profile (LTP) Use temporal noise shaping Allow mid/side encoding true Block type Normal block type No short blocks No long blocks bitrate_slider bitrate_spinbox profile shortctl tns midside bitrate_slider valueChanged(int) bitrate_spinbox setValue(int) 170 29 445 24 bitrate_spinbox valueChanged(int) bitrate_slider setValue(int) 407 18 191 29 clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoderoptionsdialog.cpp000066400000000000000000000052051260417502300277700ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "transcoderoptionsaac.h" #include "transcoderoptionsdialog.h" #include "transcoderoptionsflac.h" #include "transcoderoptionsmp3.h" #include "transcoderoptionsspeex.h" #include "transcoderoptionsvorbis.h" #include "transcoderoptionsopus.h" #include "transcoderoptionswma.h" #include "ui_transcoderoptionsdialog.h" TranscoderOptionsDialog::TranscoderOptionsDialog(Song::FileType type, QWidget* parent) : QDialog(parent), ui_(new Ui_TranscoderOptionsDialog), options_(nullptr) { ui_->setupUi(this); switch (type) { case Song::Type_Flac: case Song::Type_OggFlac: options_ = new TranscoderOptionsFlac(this); break; case Song::Type_Mp4: options_ = new TranscoderOptionsAAC(this); break; case Song::Type_Mpeg: options_ = new TranscoderOptionsMP3(this); break; case Song::Type_OggVorbis: options_ = new TranscoderOptionsVorbis(this); break; case Song::Type_OggOpus: options_ = new TranscoderOptionsOpus(this); break; case Song::Type_OggSpeex: options_ = new TranscoderOptionsSpeex(this); break; case Song::Type_Asf: options_ = new TranscoderOptionsWma(this); break; default: break; } if (options_) { setWindowTitle(windowTitle() + " - " + Song::TextForFiletype(type)); options_->layout()->setContentsMargins(0, 0, 0, 0); ui_->verticalLayout->insertWidget(0, options_); resize(width(), minimumHeight()); } } TranscoderOptionsDialog::~TranscoderOptionsDialog() { delete ui_; } void TranscoderOptionsDialog::showEvent(QShowEvent* e) { if (options_) { options_->Load(); } } void TranscoderOptionsDialog::accept() { if (options_) { options_->Save(); } QDialog::accept(); } void TranscoderOptionsDialog::set_settings_postfix(const QString &settings_postfix) { if (options_) { options_->settings_postfix_ = settings_postfix; } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoderoptionsdialog.h000066400000000000000000000025631260417502300274410ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef TRANSCODEROPTIONSDIALOG_H #define TRANSCODEROPTIONSDIALOG_H #include #include "transcoderoptionsinterface.h" #include "core/song.h" class Ui_TranscoderOptionsDialog; class TranscoderOptionsDialog : public QDialog { Q_OBJECT public: TranscoderOptionsDialog(Song::FileType type, QWidget* parent = nullptr); ~TranscoderOptionsDialog(); bool is_valid() const { return options_; } void accept(); void set_settings_postfix(const QString& settings_postfix); protected: void showEvent(QShowEvent* e); private: Ui_TranscoderOptionsDialog* ui_; TranscoderOptionsInterface* options_; }; #endif // TRANSCODEROPTIONSDIALOG_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoderoptionsdialog.ui000066400000000000000000000027131260417502300276240ustar00rootroot00000000000000 TranscoderOptionsDialog 0 0 400 300 Transcoding options Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() TranscoderOptionsDialog accept() 248 254 157 274 buttonBox rejected() TranscoderOptionsDialog reject() 316 260 286 274 clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoderoptionsflac.cpp000066400000000000000000000026551260417502300274440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "transcoderoptionsflac.h" #include "ui_transcoderoptionsflac.h" #include const char* TranscoderOptionsFlac::kSettingsGroup = "Transcoder/flacenc"; TranscoderOptionsFlac::TranscoderOptionsFlac(QWidget* parent) : TranscoderOptionsInterface(parent), ui_(new Ui_TranscoderOptionsFlac) { ui_->setupUi(this); } TranscoderOptionsFlac::~TranscoderOptionsFlac() { delete ui_; } void TranscoderOptionsFlac::Load() { QSettings s; s.beginGroup(kSettingsGroup + settings_postfix_); ui_->quality->setValue(s.value("quality", 5).toInt()); } void TranscoderOptionsFlac::Save() { QSettings s; s.beginGroup(kSettingsGroup + settings_postfix_); s.setValue("quality", ui_->quality->value()); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoderoptionsflac.h000066400000000000000000000022321260417502300271000ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef TRANSCODEROPTIONSFLAC_H #define TRANSCODEROPTIONSFLAC_H #include "transcoderoptionsinterface.h" class Ui_TranscoderOptionsFlac; class TranscoderOptionsFlac : public TranscoderOptionsInterface { public: TranscoderOptionsFlac(QWidget* parent = nullptr); ~TranscoderOptionsFlac(); void Load(); void Save(); private: static const char* kSettingsGroup; Ui_TranscoderOptionsFlac* ui_; }; #endif // TRANSCODEROPTIONSFLAC_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoderoptionsflac.ui000066400000000000000000000030011260417502300272610ustar00rootroot00000000000000 TranscoderOptionsFlac 0 0 400 102 Form Quality Fast 9 5 Qt::Horizontal QSlider::TicksBelow Best clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoderoptionsinterface.h000066400000000000000000000021471260417502300301400ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef TRANSCODEROPTIONSINTERFACE_H #define TRANSCODEROPTIONSINTERFACE_H #include class TranscoderOptionsInterface : public QWidget { public: TranscoderOptionsInterface(QWidget* parent) : QWidget(parent) {} virtual ~TranscoderOptionsInterface() {} virtual void Load() = 0; virtual void Save() = 0; QString settings_postfix_; }; #endif // TRANSCODEROPTIONSINTERFACE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoderoptionsmp3.cpp000066400000000000000000000051351260417502300272320ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "transcoderoptionsmp3.h" #include "ui_transcoderoptionsmp3.h" #include const char* TranscoderOptionsMP3::kSettingsGroup = "Transcoder/lamemp3enc"; TranscoderOptionsMP3::TranscoderOptionsMP3(QWidget* parent) : TranscoderOptionsInterface(parent), ui_(new Ui_TranscoderOptionsMP3) { ui_->setupUi(this); connect(ui_->quality_slider, SIGNAL(valueChanged(int)), SLOT(QualitySliderChanged(int))); connect(ui_->quality_spinbox, SIGNAL(valueChanged(double)), SLOT(QualitySpinboxChanged(double))); } TranscoderOptionsMP3::~TranscoderOptionsMP3() { delete ui_; } void TranscoderOptionsMP3::Load() { QSettings s; s.beginGroup(kSettingsGroup + settings_postfix_); ; if (s.value("target", 1).toInt() == 0) { ui_->target_quality->setChecked(true); } else { ui_->target_bitrate->setChecked(true); } ui_->quality_spinbox->setValue(s.value("quality", 4.0).toFloat()); ui_->bitrate_slider->setValue(s.value("bitrate", 128).toInt()); ui_->cbr->setChecked(s.value("cbr", true).toBool()); ui_->encoding_engine_quality->setCurrentIndex( s.value("encoding-engine-quality", 1).toInt()); ui_->mono->setChecked(s.value("mono", false).toBool()); } void TranscoderOptionsMP3::Save() { QSettings s; s.beginGroup(kSettingsGroup + settings_postfix_); s.setValue("target", ui_->target_quality->isChecked() ? 0 : 1); s.setValue("quality", ui_->quality_spinbox->value()); s.setValue("bitrate", ui_->bitrate_slider->value()); s.setValue("cbr", ui_->cbr->isChecked()); s.setValue("encoding-engine-quality", ui_->encoding_engine_quality->currentIndex()); s.setValue("mono", ui_->mono->isChecked()); } void TranscoderOptionsMP3::QualitySliderChanged(int value) { ui_->quality_spinbox->setValue(float(value) / 100); } void TranscoderOptionsMP3::QualitySpinboxChanged(double value) { ui_->quality_slider->setValue(value * 100); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoderoptionsmp3.h000066400000000000000000000024031260417502300266720ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef TRANSCODEROPTIONSMP3_H #define TRANSCODEROPTIONSMP3_H #include "transcoderoptionsinterface.h" class Ui_TranscoderOptionsMP3; class TranscoderOptionsMP3 : public TranscoderOptionsInterface { Q_OBJECT public: TranscoderOptionsMP3(QWidget* parent = nullptr); ~TranscoderOptionsMP3(); void Load(); void Save(); private slots: void QualitySliderChanged(int value); void QualitySpinboxChanged(double value); private: static const char* kSettingsGroup; Ui_TranscoderOptionsMP3* ui_; }; #endif // TRANSCODEROPTIONSMP3_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoderoptionsmp3.ui000066400000000000000000000170531260417502300270670ustar00rootroot00000000000000 TranscoderOptionsMP3 0 0 557 486 Form Optimize for quality false false 32 0 0 0 Quality 999 400 Qt::Horizontal QSlider::TicksBelow 100 9.990000000000000 4.000000000000000 Optimize for bitrate true 32 0 0 0 Bitrate 8 320 128 Qt::Horizontal QSlider::TicksBelow 32 kbps 8 320 8 128 Constant bitrate Encoding engine quality 1 Fast Standard High Force mono encoding target_quality quality_slider quality_spinbox target_bitrate bitrate_slider bitrate_spinbox cbr encoding_engine_quality mono bitrate_slider valueChanged(int) bitrate_spinbox setValue(int) 191 109 492 115 bitrate_spinbox valueChanged(int) bitrate_slider setValue(int) 485 115 182 113 target_quality toggled(bool) widget setEnabled(bool) 65 23 20 49 target_bitrate toggled(bool) widget_2 setEnabled(bool) 46 87 22 122 clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoderoptionsopus.cpp000066400000000000000000000031331260417502300275150ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2013, Martin Brodbeck Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "transcoderoptionsopus.h" #include "ui_transcoderoptionsopus.h" #include // TODO: Add more options than only bitrate as soon as gst doesn't crash // anymore while using the cbr parmameter (like cbr=false) const char* TranscoderOptionsOpus::kSettingsGroup = "Transcoder/opusenc"; TranscoderOptionsOpus::TranscoderOptionsOpus(QWidget* parent) : TranscoderOptionsInterface(parent), ui_(new Ui_TranscoderOptionsOpus) { ui_->setupUi(this); } TranscoderOptionsOpus::~TranscoderOptionsOpus() { delete ui_; } void TranscoderOptionsOpus::Load() { QSettings s; s.beginGroup(kSettingsGroup + settings_postfix_); ui_->bitrate_slider->setValue(s.value("bitrate", 128000).toInt() / 1000); } void TranscoderOptionsOpus::Save() { QSettings s; s.beginGroup(kSettingsGroup + settings_postfix_); s.setValue("bitrate", ui_->bitrate_slider->value() * 1000); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoderoptionsopus.h000066400000000000000000000022421260417502300271620ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2013, Martin Brodbeck Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef TRANSCODEROPTIONSOPUS_H #define TRANSCODEROPTIONSOPUS_H #include "transcoderoptionsinterface.h" class Ui_TranscoderOptionsOpus; class TranscoderOptionsOpus : public TranscoderOptionsInterface { public: TranscoderOptionsOpus(QWidget* parent = nullptr); ~TranscoderOptionsOpus(); void Load(); void Save(); private: static const char* kSettingsGroup; Ui_TranscoderOptionsOpus* ui_; }; #endif // TRANSCODEROPTIONSOPUS_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoderoptionsopus.ui000066400000000000000000000042601260417502300273520ustar00rootroot00000000000000 TranscoderOptionsOpus 0 0 400 300 Form Bitrate 6 510 128 Qt::Horizontal kbps 320 128 bitrate_slider valueChanged(int) bitrate_spinbox setValue(int) 166 25 323 24 bitrate_spinbox valueChanged(int) bitrate_slider setValue(int) 325 14 190 31 clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoderoptionsspeex.cpp000066400000000000000000000044651260417502300276640ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "transcoderoptionsspeex.h" #include "ui_transcoderoptionsspeex.h" #include const char* TranscoderOptionsSpeex::kSettingsGroup = "Transcoder/speexenc"; TranscoderOptionsSpeex::TranscoderOptionsSpeex(QWidget* parent) : TranscoderOptionsInterface(parent), ui_(new Ui_TranscoderOptionsSpeex) { ui_->setupUi(this); } TranscoderOptionsSpeex::~TranscoderOptionsSpeex() { delete ui_; } void TranscoderOptionsSpeex::Load() { QSettings s; s.beginGroup(kSettingsGroup + settings_postfix_); ui_->quality_slider->setValue(s.value("quality", 8).toInt()); ui_->bitrate_slider->setValue(s.value("bitrate", 0).toInt() / 1000); ui_->mode->setCurrentIndex(s.value("mode", 0).toInt()); ui_->vbr->setChecked(s.value("vbr", false).toBool()); ui_->abr_slider->setValue(s.value("abr", 0).toInt() / 1000); ui_->vad->setChecked(s.value("vad", false).toBool()); ui_->dtx->setChecked(s.value("dtx", false).toBool()); ui_->complexity->setValue(s.value("complexity", 3).toInt()); ui_->nframes->setValue(s.value("nframes", 1).toInt()); } void TranscoderOptionsSpeex::Save() { QSettings s; s.beginGroup(kSettingsGroup + settings_postfix_); s.setValue("quality", ui_->quality_slider->value()); s.setValue("bitrate", ui_->bitrate_slider->value() * 1000); s.setValue("mode", ui_->mode->currentIndex()); s.setValue("vbr", ui_->vbr->isChecked()); s.setValue("abr", ui_->abr_slider->value() * 1000); s.setValue("vad", ui_->vad->isChecked()); s.setValue("dtx", ui_->dtx->isChecked()); s.setValue("complexity", ui_->complexity->value()); s.setValue("nframes", ui_->nframes->value()); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoderoptionsspeex.h000066400000000000000000000022421260417502300273200ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef TRANSCODEROPTIONSSPEEX_H #define TRANSCODEROPTIONSSPEEX_H #include "transcoderoptionsinterface.h" class Ui_TranscoderOptionsSpeex; class TranscoderOptionsSpeex : public TranscoderOptionsInterface { public: TranscoderOptionsSpeex(QWidget* parent = nullptr); ~TranscoderOptionsSpeex(); void Load(); void Save(); private: static const char* kSettingsGroup; Ui_TranscoderOptionsSpeex* ui_; }; #endif // TRANSCODEROPTIONSSPEEX_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoderoptionsspeex.ui000066400000000000000000000210301260417502300275020ustar00rootroot00000000000000 TranscoderOptionsSpeex 0 0 555 424 Form Quality 10 8 Qt::Horizontal QSlider::TicksBelow 10 8 Bitrate 320 8 32 Qt::Horizontal 100 0 automatic kbps 320 8 Average bitrate 320 8 32 Qt::Horizontal 100 0 disabled kbps 320 8 Encoding mode Auto Ultra wide band (UWB) Wide band (WB) Narrow band (NB) Variable bit rate Voice activity detection Discontinuous transmission Encoding complexity 10000 3 Frames per buffer 10000 1 quality_slider quality_spinbox bitrate_slider bitrate_spinbox abr_slider abr_spinbox mode vbr vad dtx complexity nframes quality_slider valueChanged(int) quality_spinbox setValue(int) 232 29 525 23 quality_spinbox valueChanged(int) quality_slider setValue(int) 517 25 248 31 bitrate_slider valueChanged(int) bitrate_spinbox setValue(int) 185 66 445 51 bitrate_spinbox valueChanged(int) bitrate_slider setValue(int) 471 68 214 56 abr_slider valueChanged(int) abr_spinbox setValue(int) 323 90 500 95 abr_spinbox valueChanged(int) abr_slider setValue(int) 493 84 339 94 clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoderoptionsvorbis.cpp000066400000000000000000000046701260417502300300420ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "transcoderoptionsvorbis.h" #include "ui_transcoderoptionsvorbis.h" #include const char* TranscoderOptionsVorbis::kSettingsGroup = "Transcoder/vorbisenc"; TranscoderOptionsVorbis::TranscoderOptionsVorbis(QWidget* parent) : TranscoderOptionsInterface(parent), ui_(new Ui_TranscoderOptionsVorbis) { ui_->setupUi(this); } TranscoderOptionsVorbis::~TranscoderOptionsVorbis() { delete ui_; } void TranscoderOptionsVorbis::Load() { QSettings s; s.beginGroup(kSettingsGroup + settings_postfix_); #define GET_BITRATE(variable, property) \ int variable = s.value(property, -1).toInt(); \ variable = variable == -1 ? 0 : variable / 1000 GET_BITRATE(bitrate, "bitrate"); GET_BITRATE(min_bitrate, "min-bitrate"); GET_BITRATE(max_bitrate, "max-bitrate"); #undef GET_BITRATE ui_->quality_slider->setValue(s.value("quality", 0.3).toDouble() * 10); ui_->managed->setChecked(s.value("managed", false).toBool()); ui_->max_bitrate_slider->setValue(max_bitrate); ui_->min_bitrate_slider->setValue(min_bitrate); ui_->bitrate_slider->setValue(bitrate); } void TranscoderOptionsVorbis::Save() { QSettings s; s.beginGroup(kSettingsGroup + settings_postfix_); #define GET_BITRATE(variable, ui_slider) \ int variable = ui_slider->value(); \ variable = variable == 0 ? -1 : variable * 1000 GET_BITRATE(bitrate, ui_->bitrate_slider); GET_BITRATE(min_bitrate, ui_->min_bitrate_slider); GET_BITRATE(max_bitrate, ui_->max_bitrate_slider); #undef GET_BITRATE s.setValue("quality", double(ui_->quality_slider->value()) / 10); s.setValue("managed", ui_->managed->isChecked()); s.setValue("bitrate", bitrate); s.setValue("min-bitrate", min_bitrate); s.setValue("max-bitrate", max_bitrate); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoderoptionsvorbis.h000066400000000000000000000022521260417502300275010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef TRANSCODEROPTIONSVORBIS_H #define TRANSCODEROPTIONSVORBIS_H #include "transcoderoptionsinterface.h" class Ui_TranscoderOptionsVorbis; class TranscoderOptionsVorbis : public TranscoderOptionsInterface { public: TranscoderOptionsVorbis(QWidget* parent = nullptr); ~TranscoderOptionsVorbis(); void Load(); void Save(); private: static const char* kSettingsGroup; Ui_TranscoderOptionsVorbis* ui_; }; #endif // TRANSCODEROPTIONSVORBIS_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoderoptionsvorbis.ui000066400000000000000000000223361260417502300276740ustar00rootroot00000000000000 TranscoderOptionsVorbis 0 0 400 300 Form Quality -1 10 3 Qt::Horizontal QSlider::TicksBelow -1 10 3 Use bitrate management engine false 32 0 0 0 Target bitrate 250 128 Qt::Horizontal kbps 250 128 Minimum bitrate 250 0 Qt::Horizontal disabled kbps 250 0 Maximum bitrate 250 0 Qt::Horizontal disabled kbps 250 0 quality_slider quality_spinbox managed bitrate_slider bitrate_spinbox min_bitrate_slider min_bitrate_spinbox max_bitrate_slider max_bitrate_spinbox quality_slider valueChanged(int) quality_spinbox setValue(int) 176 29 365 31 quality_spinbox valueChanged(int) quality_slider setValue(int) 358 19 136 29 bitrate_slider valueChanged(int) bitrate_spinbox setValue(int) 255 83 344 88 bitrate_spinbox valueChanged(int) bitrate_slider setValue(int) 341 77 244 80 min_bitrate_spinbox valueChanged(int) min_bitrate_slider setValue(int) 324 122 265 115 min_bitrate_slider valueChanged(int) min_bitrate_spinbox setValue(int) 217 122 347 124 max_bitrate_slider valueChanged(int) max_bitrate_spinbox setValue(int) 278 157 323 155 max_bitrate_spinbox valueChanged(int) max_bitrate_slider setValue(int) 344 166 216 155 managed toggled(bool) widget setEnabled(bool) 55 58 25 86 clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoderoptionswma.cpp000066400000000000000000000027101260417502300273130ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "transcoderoptionswma.h" #include "ui_transcoderoptionswma.h" #include const char* TranscoderOptionsWma::kSettingsGroup = "Transcoder/ffenc_wmav2"; TranscoderOptionsWma::TranscoderOptionsWma(QWidget* parent) : TranscoderOptionsInterface(parent), ui_(new Ui_TranscoderOptionsWma) { ui_->setupUi(this); } TranscoderOptionsWma::~TranscoderOptionsWma() { delete ui_; } void TranscoderOptionsWma::Load() { QSettings s; s.beginGroup(kSettingsGroup + settings_postfix_); ui_->bitrate_slider->setValue(s.value("bitrate", 128000).toInt() / 1000); } void TranscoderOptionsWma::Save() { QSettings s; s.beginGroup(kSettingsGroup + settings_postfix_); s.setValue("bitrate", ui_->bitrate_slider->value() * 1000); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoderoptionswma.h000066400000000000000000000022221260417502300267560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef TRANSCODEROPTIONSWMA_H #define TRANSCODEROPTIONSWMA_H #include "transcoderoptionsinterface.h" class Ui_TranscoderOptionsWma; class TranscoderOptionsWma : public TranscoderOptionsInterface { public: TranscoderOptionsWma(QWidget* parent = nullptr); ~TranscoderOptionsWma(); void Load(); void Save(); private: static const char* kSettingsGroup; Ui_TranscoderOptionsWma* ui_; }; #endif // TRANSCODEROPTIONSWMA_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcoderoptionswma.ui000066400000000000000000000041371260417502300271530ustar00rootroot00000000000000 TranscoderOptionsWma 0 0 400 300 Form Bitrate 320 128 Qt::Horizontal kbps 320 128 bitrate_slider valueChanged(int) bitrate_spinbox setValue(int) 166 25 323 24 bitrate_spinbox valueChanged(int) bitrate_slider setValue(int) 325 14 190 31 clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcodersettingspage.cpp000066400000000000000000000031711260417502300276120ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "transcodersettingspage.h" #include "ui_transcodersettingspage.h" #include "ui/iconloader.h" TranscoderSettingsPage::TranscoderSettingsPage(SettingsDialog* dialog) : SettingsPage(dialog), ui_(new Ui_TranscoderSettingsPage) { ui_->setupUi(this); setWindowIcon(IconLoader::Load("tools-wizard")); } TranscoderSettingsPage::~TranscoderSettingsPage() { delete ui_; } void TranscoderSettingsPage::Load() { ui_->transcoding_aac->Load(); ui_->transcoding_flac->Load(); ui_->transcoding_mp3->Load(); ui_->transcoding_speex->Load(); ui_->transcoding_vorbis->Load(); ui_->transcoding_wma->Load(); ui_->transcoding_opus->Load(); } void TranscoderSettingsPage::Save() { ui_->transcoding_aac->Save(); ui_->transcoding_flac->Save(); ui_->transcoding_mp3->Save(); ui_->transcoding_speex->Save(); ui_->transcoding_vorbis->Save(); ui_->transcoding_wma->Save(); ui_->transcoding_opus->Save(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcodersettingspage.h000066400000000000000000000021541260417502300272570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef TRANSCODERSETTINGSPAGE_H #define TRANSCODERSETTINGSPAGE_H #include "ui/settingspage.h" class Ui_TranscoderSettingsPage; class TranscoderSettingsPage : public SettingsPage { Q_OBJECT public: TranscoderSettingsPage(SettingsDialog* dialog); ~TranscoderSettingsPage(); void Load(); void Save(); private: Ui_TranscoderSettingsPage* ui_; }; #endif // TRANSCODERSETTINGSPAGE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/transcoder/transcodersettingspage.ui000066400000000000000000000131431260417502300274450ustar00rootroot00000000000000 TranscoderSettingsPage 0 0 400 300 Transcoding These settings are used in the "Transcode Music" dialog, and when converting music before copying it to a device. true 0 MP3 0 0 Vorbis 0 0 FLAC 0 0 Speex 0 0 AAC 0 0 WMA 0 0 Opus 0 0 TranscoderOptionsMP3 QWidget

transcoder/transcoderoptionsmp3.h
1 TranscoderOptionsVorbis QWidget
transcoder/transcoderoptionsvorbis.h
1
TranscoderOptionsSpeex QWidget
transcoder/transcoderoptionsspeex.h
1
TranscoderOptionsAAC QWidget
transcoder/transcoderoptionsaac.h
1
TranscoderOptionsFlac QWidget
transcoder/transcoderoptionsflac.h
1
TranscoderOptionsWma QWidget
transcoder/transcoderoptionswma.h
1
TranscoderOptionsOpus QWidget
transcoder/transcoderoptionsopus.h
1
clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/000077500000000000000000000000001260417502300226775ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/af.po000066400000000000000000005070241260417502300236350ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Allan Nieuwoudt, 2014 # johannes hermias franz wagener , 2015 # jpmeijers , 2012 # jpmeijers , 2012 # Rudolf Byker , 2013 # ste soren , 2015 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Afrikaans (http://www.transifex.com/davidsansome/clementine/language/af/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: af\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nJy kan 'n speellys as 'n gunsteling merk deur op die ster ikoon langs die speellysnaam te klik\n\nGunsteling speellyste sal hier gestoor word " #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "dae" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr "ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr "pte" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "s" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr "sekondes" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "liedjies" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 liedjies)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 albums" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 dae" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 dae terug" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 op %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 speellys (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 gekies uit" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 liedjie" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 liedjies" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 liedjies gevind" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 liedjies gevind (%2 word getoon)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 snitte" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 oorgedra" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev module" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 ander luisteraars" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 keer gespeel" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n onsuksesvol" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n voltooi" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n oorblywend" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Lyn teks op" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Sentreer" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Eie keuse" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "&Ekstras" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Hulp" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&Steek %1 weg" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Steek weg..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Links" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "&Musiek" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Geen" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "&Speellys" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Maak toe" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "&Herhaal modus" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Regs" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "&Skommel modus" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Rek kolomme om in venster te pas" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Gereedskap" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(verskillend tussen meervuldige liedjies)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", deur" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...en almal wat bygedra het tot Amarok" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 dag" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 snit" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192,000Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44,100Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48,000Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 lukraake snitte" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96,000Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Gradeer nou op na Premium" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Indien nie geselekteer nie, sal Clementine poog om jou graderings en ander statistiek slegs in 'n aparte databasis te stoor en nie jou lêers modifiseer nie.

Indien geselekteer, sal dit statistiek beide in die databasis en direk in die lêers stoor indien daar veranderinge aangebring word.

Let asseblief dat dit nie noodwendig vir alle formate sal werk nie, aangesien daar geen standaard daarvoor is nie. Ander musiek spelers mag dalk nie die inligting kan lees nie.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Plaas die naam van 'n veld voor die soekterm om die soektog tot die veld te beperk, bv. kunstenaar:Bode deursoek die biblioteek vir alle kunstenaars wat die woord Bode bevat.

Beskikbare velde: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Dit sal die liedjie se gradering en ander statistiek binne-in die etikette van die lêers skryf vir al die liedjies in jou biblioteek.

Dit is onnodig indien die "Save gradering en die statistiek in die lêer etiket " opsie altyd aan was.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Etikette begin met %, byvoorbeeld: %artist %album %title

\n\n

Indien 'n stuk teks wat 'n etiket bevat deur krulhakies omring word, sal daardie stuk teks weggesteek word as die etiket leeg is.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "'n Spotify Premium-rekening word benodig." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "'n Kliënt kan slegs verbind indien die regte kode ingevoer is." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "'n Slimspeellys is 'n dinamiese lys liedjies uit jou eie versameling. Daar is verskeie soorte slimspeellyste wat verskillende maniere bied om jou musiek te kies." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "'n Liedjie sal ingesluit word in die speellys as dit aan hierdie vereisdes voldoen." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "Alle glorie aan die HYPNOTOAD" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Staak" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Meer oor %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Meer oor Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Meer oor Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Absoluut" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Rekening besonderhede" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Rekening besonderhede (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Aksie" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Aksie" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Aktiveer/Deaktiveer Wii-afstandsbeheer" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Aktiewe strome" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Voeg potgooi by" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Voeg Stroom by" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Voeg 'n nuwelyn by as die kennisgewer dit ondersteun" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Voeg aksie by" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Voeg alle snitte by vanuit 'n gids en al sy subgidse" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Voeg nog 'n stroom by..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Voeg gids by..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Voeg lêer by" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Voeg die lêer by die transkodeerder by" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Voeg lêer(s) by die transkodeerder by" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Voeg lêer by..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Voeg lêers by om te transkodeer" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Voeg gids by" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Voeg gids by..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Voeg nuwe gids by..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Voeg potgooi by" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Voeg potgooi by..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Voeg soekterm by" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Voeg album-etiket by liedjie" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Voeg albumkunstenaar-etiket by liedjie" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Voeg kunstenaar-etiket by liedjie" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Voeg outo-graad by die liedjie" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Voeg komponis-etiket by liedjie" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Voeg plaat-etiket by liedjie" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Voeg liedjie se lêernaam by" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Voeg genre-etiket by liedjie" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Voeg liedjie-groepering etiket by" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Voeg liedjie se lengte as 'n etiket by" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Voeg sanger etiket by" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Voeg aantal keer gespeel by" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Voeg liedjie gradering by" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Voeg aantal keer oorgeslaan by" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Voeg liedjienaam-etiket by" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Voeg liedjie tot die kas" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Voeg liedjie se snitnommer as 'n etiket by" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Voeg liedjie se jaar by as 'n etiket" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Voeg liedjie by \"My Music\" wanneer ek die \"Bemin\" knoppie druk" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Voeg stroom by..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Voeg tot My Music" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Voeg tot Spotify speellyste by" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Voeg by Spotify gester" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Voeg tot 'n ander speellys by" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Voeg tot boekmerke by" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Voeg tot 'n speellys by" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Voeg aan die einde van die tou by" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Voeg gebruiker/groep by boekmerke by" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Voeg wiimotedev-aksie by" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Voeg by.." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Hierdie maand bygevoeg" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Hierdie week bygevoeg" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Hierdie jaar bygevoeg" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Vandag bygevoeg" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Afgelope 3 maande bygevoeg" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Gevorderde groeperings..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Na" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Na kopiëring..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Album (ideale hardheid vir alle snitte)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Albumkunstenaar" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Album omslag" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Album se inligting op jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Albums" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Albums met omslae" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Albums sonder omslae" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Alle" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Alle lêers (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "Alle heil aan die Hypnotoad!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Alle albums" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Alle kunstenaars" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Alle lêers (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Alle speellyste (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Al die vertalers" #: library/library.cpp:98 msgid "All tracks" msgstr "Alle snitte" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Laat 'n kliënt toe om musiek van die rekenaar af te laai." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Laat aflaaie toe" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Laat \"mid/side\"-enkodering toe." #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Naas die oorspronlikes" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Steek altyd die hoofvenster weg" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Wys altyd die hoofvenster" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Begin altyd dadelik speel" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon Wolk Skyf" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "'n Ekstra uitbreiding word benodig om Spotify in Clementine te gebruik. Wil jy dit nou aflaai en installeer?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "'n Fout het plaasgevind tydens die laai van die iTunes-databasis" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "'n Fout het plaasgevind tydens die skryf van metadata na '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "'n Onbekende fout het voorgekom" #: ui/about.cpp:85 msgid "And:" msgstr "En:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Kwaai" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Voorkoms" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Voeg lêers/URLs by die speellys by" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Voeg by huidige speellys by" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Voeg by speellys by" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Doen kompressie om afkapping te voorkom" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Is jy seker jy wil die \"%1\" opstellingspatroon verwyder?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Is jy seker jy wil die liedjie se statistiek herstel?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Is jy seker dat jy die liedjie se statestiek in die liedjie se lêer wil skryf vir al die liedjies in jou biblioteek?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Kunstenaar" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Kunstenaar informasie" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Kunstenaarsetikette" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Kunstenaar se voorletters" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Vra voor storing" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Oudioformaat" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Oudio uitset" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Aanteken onsuksesvol" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Outeur" #: ui/about.cpp:68 msgid "Authors" msgstr "Outeurs" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Outomaties" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Outomaties" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Outomatiese opdatering" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Maak outomaties kortspeelalbum-kategorië oop in jou versamelingboom" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Beskikbaar" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Gemiddelde bistempo" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Gemiddelde beeldgrootte" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "BBC potgooi" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "SPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Agtergrond strome" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Agtergrondkleur" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Agtergrond prentjie" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Agtergrond deurskynendheid" #: core/database.cpp:648 msgid "Backing up database" msgstr "Databasis word gerugsteun" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Balans" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Balk-analiseerder" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Eenvoudig Blou" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Basies oudio tipe" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Gedrag" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Beste" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Biografie vanaf %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Bistempo" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Bistempo" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Bistempo" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Blokanaliseerder" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Blok tipe" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Hoeveelheid vervaging" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Liggaam" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Boem!-analiseerder" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Boks" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Gaan soek..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Buffer tydsduur" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Aan die buffer" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Besig om Seafile indeks te bou..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Maar hierdie bronne is afgeskakel:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Knoppies" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Seinlys ondersteuning" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Kas gids:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Aan die kas" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "%1 word gekas" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Kanselleer" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Kanselleer aflaai" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Captcha word benodig.\nProbeer om by Vk.com aan te sluit met jou webblaaier om die probleem op te los." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Verander omslag" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Verander lettergrootte" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Verander herhalingsmodus" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Verander kortskakel" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Verander skommel modus" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "Kies 'n nuwe liedjie" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Verander die taal" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "Verandering sal gebeur sodra die volgende liedjie begin speel" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Verandering in Mono-speel instellings sal eers aktief wees by die speel van die volgende snit" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Soek vir nuwe episodes" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Kyk vir nuwer weergawes" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Kyk vir nuwer weergawes..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Kies Vk.com kas gids" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Kies 'n naam vir jou slimspeellys" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Kies outomaties" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Kies kleur..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Kies lettertipe..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Kies uit die lys" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Kies hoe die speellys gesorteer word en hoeveel liedjies dit moet bevat." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Kies potgooi aflaaigids" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Kies die Internet dienste wat jy wil vertoon." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Titel" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Klassiek" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Daar word skoongemaak" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Wis" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Wis speellys" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Clementine Fout" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Clementine oranje" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Clementine Visualisering" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine kan outomaties die musiek na 'n formaat omskakel wat die toestel waarheen dit gekopiëer word sal kan terugspeel." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Clementine kan musiek speel wat jy al klaar na Amazon Wolk Skyf opgelaai het." #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine kan musiek speel wat jy op Box geplaas het." #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine kan musiek speel wat jy op Dropbox geplaas het." #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine kan musiek speel wat jy op Google Drive geplaas het." #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine kan musiek speel wat jy op OneDrive geplaas het." #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine kan 'n boodskap toon wanneer die snit verander." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine kan jou lidmaatskappe sinkroniseer tussen jou rekenaars. Skep 'n rekening hier." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine kan nie enige projectM-visualisasies laai nie. Maak seker jy het Clementine korrek geïnstalleer." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Clementine prentjiekyker" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine kon nie enige resultate vir hierdie lêer vind nie." #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine sal musiek vind in:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Kliek hier om musiek by te voeg" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Kliek hier om die speellys as gunsteling te stoor en teganklik sal bly in die \"Speellys\" paneel in die linker systaaf" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Kliek hier om te wissel tussen oorblywende en totale tyd" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "As jy op die Login knoppie kliek sal 'n webblaaier oopmaak. Jy moet terugkeer na Clementine nadat jy aangeteken het." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Maak toe" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Maak snitlys toe" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Maak visualisasie toe" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Die aflaai sal stop as hierdie venster toegemaak word." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Die soek vir album-omslae sal stop as hierdie venster toegemaak word." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Klub" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Kleure" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Komma geskeide lys van klas:vlak, vlak is 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Kommentaar" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Gemeenskaps Radio" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Voltooi etikette outomaties" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Voltooi etikette outomaties..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Komponis" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Stel %1 op..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Stel Magnatune op..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Stel snelskakels op" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Stel Spotify op..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Stel Subsonic op..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Stel VK.com op..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Globale soek instellings..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Stel my versameling op..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Stel potgooie op..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Stel op" #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Verbind Wii-afstandbehere met aktiveer/deaktiveer aksie" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Verbind toestel" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Verbind aan Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Konneksie deur die bediener geweier. Beaam die bediener URL. Byvoorbeeld: http://localhost:4040" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Die konneksie se tydlimiet is bereik. Beaam die bediener se URL. Byvoorbeeld: http://localhost:4040" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Konneksie probleme of die oudio is deur die eienaar afgeskakel" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Konsole" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Konstante bistempo" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Skakel alle musiek om" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Skakel alle musiek wat die toestel nie kan speel nie om" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Omskep verlieslose oudiolêers voordat hulle versend word." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Omskep verlieslose lêers" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Kopieër die deel URL na die klipbord" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Kopiëer na knipbord" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Kopiëer na die toestel..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Kopiëer na my versameling" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Kopiereg" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Kan nie aan Subsonic verbind nie. Kyk op die bediener se URL reg is. Byvoorbeeld: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Kan nie die GStreamer element \"%1\" skep nie - maak seker jy het alle nodige GStreamer uitbreidings installeer" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Kon nie speellys skep nie" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Kan nie 'n multiplekser vir %1 vind nie. Maak seker jy het die korrekte GStreamer uitbreidings installeer." #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Kan nie 'n enkodeerder vir %1 vind nie. Maak seker jy het die korrekte GStreamer uitbreidings installeer." #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Kan nie die uittreelêer %1 oopmaak nie" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Omslagbestuurder" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Omslag van ingeslote beeld" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Omslag outomaties gelaai vanaf %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Omslag per hand onstel" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Geen omslag" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Omslag gestel vanaf %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Omslae vanaf %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Pas oorgangsdowing toe wanneer snitte outomaties verander word" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Pas oorgangsdowing toe wanneer snitte per hand verander word" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Af" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Op" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Na keuse" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Prentjie na keuse:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Eie gekose boodskap" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Na keuse..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "DBus lêergids" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dans" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Databasiskorrupsie ontdek. Lees asseblief https://code.google.com/p/clementine-player/wiki/DatabaseCorruption vir instruksies hoe om dit reg te maak." #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Datum geskep" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Datum verander" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Dae" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "&Verstek" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Verlaag die volume met 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Verlaag die volume met %" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Verlaag die volume" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Standaars agtergrond prentjie" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Verstek toestel op %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Verstekstellinge" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Wagperiode tussen visualisasies" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Skrap" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Vee afgelaaide data uit" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Skrap lêers" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Skrap van toestel..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Skrap van skyf..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Vee gespeelde episodes uit" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Skrap voorafinstelling" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Skrap slimspeellys" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Skrap die oorspronklike lêers" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Lêers word geskrap" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Verwyder gekose snitte uit die tou" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Verwyder snit uit die tou" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Bestemming" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Besonderhede..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Toestel" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Toestelseienskappe" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Toestelsnaam" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Toestelseienskappe..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Toestelle" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Dialoog" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Het jy bedoel" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Digitally Imported wagwoord" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Digitally Imported gebruikersnaam" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Direkte internetverbinding" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Gids" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Steek tydsduur weg" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Skakel skep van die 'moodbar' af" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Afgeskakel" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Afgeskakel" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Skyf" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Uitsending met onderbrekings" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Vertoon keuses" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Toon skermbeeld" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Gaan in geheel my versameling weer na" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Gaan in geheel weer na" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Gaan in geheel weer na..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Moenie enige musiek omskakel nie" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Moet nie oorskryf nie" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "As jy in geheel nagaan, sal jy al die metadata wat jy in Clementine gestoor het -soos omslae, speel tellinge en grade- verloor. Clementine sal die musiek in Google Drive in geheel nagaan wat baie lank kan neem." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Moenie herhaal nie" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Moenie onder verskeie kunstenaars wys nie" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Moenie geluister na episodes wys nie" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Moenie skommel nie" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Moenie stop nie!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Maak 'n skenking" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Dubbelkliek om oop te maak" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "As jy 'n liedjie in die snitlys tweemaal klik sal..." #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Dubbelkliek op 'n liedjie sal..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Laai %n episodes af" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Laai gids af" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Laai episodes af na" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Laai lidmaatskap af" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Laai nuwe episodes outomaties af" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Aflaai tou" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Aflaai verstellinge" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Laai die Andriod app af" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Laai hierdie album af" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Laai hierdie album af..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Laai hierdie episode af" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Laai af..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Besig met aflaai (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Laai icecast gids af" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Laai jamendo katalogus af" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Laai Magnatune katalogus af" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Laai Spotify uitbreiding af" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Laai metadata af" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Sleep om te skuif" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dubstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Tydsduur" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Tans in dinamiese modus" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Dinamiese skommeling" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Verander slimspeellys" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Verander etiket \"%1\"..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Verander etiket" #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Verander etikette" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Verander snit se inligting" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Verander snit se inligting..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Verander snitte se inligting" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Verander..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "E-pos" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Skakel Wii-afstansbeheer ondersteuning aan" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Skakel outomatiese kas aan" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Skakel grafiese effenaar aan" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Laat kortskakels slegs toe wanneer Clementine in fokus is" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Skakel liedjie metadata in-lyn uitgawe aan met 'n kliek" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Skakel 'n bron hier onder aan om dit in te sluit in die soektog. Resultate sal in hierdie volgorde vertoon word." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Skakel die opteken van geluisterde musiek op Last.fm aan/af" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Enkoderingskompleksiteit" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Enkoderingsenjin kwaliteit" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Enkoderingsmodus" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Tik 'n URL in" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Sleutel 'n URL in om af te laai as omslag:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Kies 'n lêernaam vir uitgevoerde omslae (geen uitbreiding)" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Kies 'n nuwe naam vir hierdie speellys" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Tik soekterme hier bo in om musiek te soek op jou rekenaar en op die internet." #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Tik soekterme hier onder in om potgooie te soek in die iTunes winkel" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Tik soekterme hier onder in om potgooie te soek op gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Tik soekterme hier in" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Tik die URL van 'n internet-radiostroom in:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Voer die gidsnaam in" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Voer hierdie IP-adres in die programetjie in om met Clementine te verbind." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Hele versameling" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Grafiese effenaar" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Ekwivalent aan --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Ekwivalent aan --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Fout" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Fout met die \"rip\" van die CD" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Fout tydens verbinding aan MTP-toestel" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Fout tydens kopiëring van liedjies" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Fout tydens verwydering van liedjies" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Fout tydens aflaai van die Spotify uitbreiding" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Fout tydens laai van %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Fout tydens laai van di.fm speellys" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Fout tydens verwerking van %1:%2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Fout tydens laai van musiek CD" #: library/library.cpp:68 msgid "Ever played" msgstr "Ooit gespeel" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Elke 10 minute" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Elke 12 ure" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Elke 2 dae" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Elke 20 minute" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Elke 30 minute" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Elke 6 ure" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Uurliks" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Behalwe tussen snitte van die selfde album of CUE blad" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Bestaande omslae" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Meer..." #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Verval op %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Voer omslae uit" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Voer omslae uit" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Voer afgelaaide omslae uit" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Voer ingeslote omslae uit" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Uitvoer voltooid" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "%1 omslae uit %2 uitgevoer (%3 gespring)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Doof uit met vries / doof in met hervatting" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Doof klank uit as snit gestop word" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Uitdowing" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Duur van uitdowing" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Kan nie van die CD-dryf lees nie" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Gids kon nie gehaal word nie" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Kan nie die potgooi gaan haal nie" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Die potgooi kan nie gelaai word nie" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Onsuksesvol met die analisering van die XML vir hierdie RSS voer" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Vinnig" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Gunsteling snitte" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Gaan haal uitstaande omslae" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Gaan haal outomaties" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Klaar met haal" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Laai die Subsonic-biblioteek" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Fout met haal van omslae" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Lêer formaat" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Lêeruitsbreiding" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Lêer formate" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Lêernaam" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Lêernaam (sonder pad)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Lêernaam patroon:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Lêer roetes" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Lêergrootte" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Lêertipe" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Lêernaam" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Lêers" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Lêers om te transkodeer" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Vind liedjies in jou versameling wat aan hierdie eise voldoen." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Vind dié kunstenaar" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Bereken liedjie se vingerafdruk" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Maak klaar" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Eerste vlak" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Pas die omslag in die breedte" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Teks grootte" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Vir lisensiëringsredes word 'n aparte uitbreing vir Spotify ondersteuning benodig" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Dwing mono-enkodering" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Vergeet van toestel" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Deur van 'n toestel te vergeet sal dit uit hierdie lys verwyder word. Clementine sal dit van voor af moet deursoek vir liedjies as dit weer verbind word." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Vorm" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Formaat" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Beeldduur" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Beelde per buffer" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Bevrore" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Volle bas" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Volle bas + hoëtoon" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Volle hoëtoon" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Algemeen" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Algemene instellings" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Genre" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Kry 'n URL om hierdie Spotify lied te deel" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Kry 'n URL om hierdie snitlys te deel" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Kanale word verkry" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Strome word verkry" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Gee dit 'n naam:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Gaan" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Gaan na volgende speellys oortjie" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Gaan na vorige speellys oortjie" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "%1 van %2 omslae is verky (%3 onsuksesvol)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Maak lidejies in my speellys wat nie bestaan nie grys" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Groeppeer versameling volgens..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Groeppeer volgens" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Groeppeer volgens Album" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Groeppeer volgens Kunstenaar" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Groeppeer volgens Kunstenaar/Album" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Groeppeer volgens Kunstenaar/Jaar - Album" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Groeppeer volgens Genre/Album" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Groeppeer volgens Genre/Kunstenaar/Album" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Groepering" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "HTML bladsy bevat nie enige RSS voer nie" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "HTTP 3xx status kode ontvang sonder URL. Beaam bediener konfigurasie." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "HTTP instaanbediener" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Gelukkig" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Hardeware inligting" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Hardeware inligting is slegs beskikbaar as die toestel verbind is" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Hoog" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Hoog (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Hoog (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "HipHop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Gasheer nie gevind nie. Beaam die bediener URL. Byvoorbeeld: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Ure" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Ek het nie 'n Magnatune rekening nie" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Ikoon" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Ikone bo" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Liedjies word geïdentifiseer" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Indien aangeskakel, sal die kliek van 'n liedjie in die speellys direkte redigering van die etiket toelaat." #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "As jy voortgaan sal hierdie toestel stadig wees en liedjies wat daarheen gekopiëer word mag dalk nei werk nie." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "As jy die URL van 'n potgooi ken, tik dit hier onder in en druk dan op Gaan." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Ignoreer \"The\" in kunstenaars se name" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Beelde (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Beelde (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Voer in..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "Oor %1 dae" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "Oor %1 weke" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "In dinamiese modus sal nuwe snitte gekies en bygevoeg word by die speellys elke keer as 'n liedjie klaarmaak." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Posbus" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Sluit omslag in die kennisgewing in" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Sluit alle liedjies in" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Onversoenbare Subsonic REST protokol weergawe. Die kliënt moet opgradeer." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Onversoenbare Subsonic REST protokol weergawe. Die bediener moet opgradeer." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Onvoltooide konfigurasie. Verseker asseblief dat al die velde ingevul is." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Verhoog die volume met 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Verhoog die volume met %" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Verhoog die volume" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "%1 word geïndeks" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Inligting" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Inset opsies" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Voeg in..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Geïnstalleer" #: core/database.cpp:585 msgid "Integrity check" msgstr "Integriteitstoets" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Insternet verskaffers" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Internet dienste" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Ongeldige API sleutel" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Ongeldige formaat" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Ongeldige metode" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Ongeldige parameters" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Ongeldige bron gespesifiseer" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Ongeldige diens" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Ongeldige sessiesleutel" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Inverse van seleksie" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Mees geluisterde Jamendo snitte" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Jamendo top snitte" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo se top snitte vir die maand" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo se top snitte vir die week" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Jamendo databasis" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Spring dadelik na vorige lied" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Spring na die snit wat tans speel" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Hou knoppies vir %1 sekonde vas" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Hou knoppies vir %1 sekondes vas" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Hou aan uitvoer in die agtergrond al word die venster gesluit" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Hou die oorspronklike lêers" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Katjies" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Taal" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Laptop/Oorfone" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Groot saal" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Groot album omslag" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Groot album omslag (besonderhede benede)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Groot album omslag (geen besonderhede)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Groot kantlyn-kieslys" #: library/library.cpp:80 msgid "Last played" msgstr "Laaste gespeel" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Laaste gespeel" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm is tans besig. Probeer asseblief later weer." #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Last.fm wagwoord" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Last.fm tellings" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Last.fm etikette" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Last.fm gebruikersnaam" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Mins gunsteling snitte" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Links" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Lengte" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Versameling" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Gevorderde groeppering van versameling" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Versameling hernagaan kennisgewing" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Soek deur my versameling" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Limiete" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Regstreeks" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Laai" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Verkry omslag van URL" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Verkry omslag van URL..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Laai omslag vanaf skyf" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Verkry omslag van skyf..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Laai speellys" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Laai speellys..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "MTP toestel word gelaai" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "iPod databasis word gelaai" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Slimspeellys word gelaai" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Liedjies word gelaai" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Stroom word gelaai" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Snitte word gelaai" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Snitinligting word gelaai" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Besig om te laai..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Laai lêers/URLs en vervang huidige speellys" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Teken aan" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Aanteken onsuksesvol" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Sluit af" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Langtermyn voorspellingsmodel (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Bemin" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Laag (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Laag (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Lae kompleksitietsprofiel (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Lirieke" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Lirieke vanaf %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Lirieke van die ID3v2 etiket" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Magnatune aflaai" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Klaar afgelaai vanaf Magnatune" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Hoofprofiel (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Maak dit so!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Maak dit so!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Maak speellys beskikbaar indien van lyn af" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Misvormde antwoord" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Stel instaanbediener per hand in" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Handmatig" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Vervaardiger" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Merk as geluister" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Merk as nuut" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Voldoen aan alle soekterme (AND)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Voldoen aan een of meer soekterme (OR)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Maksimum globale soektog uitslae" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Maksimum bistempo" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Media het verander. 'n Herlaai word gedoen." #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Medium (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Medium (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Lidmaatskapstipe" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Minimum bistempo" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Minimum toelaatbare buffer" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "projectM voorinstellings word vermis" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Hou my versameling dop vir veranderings" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Speel in Mono af" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Maande" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Stemming" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Stemmingsbalk styl" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Stemmingsbalk" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Meer" #: library/library.cpp:84 msgid "Most played" msgstr "Meeste gespeel" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Monteringsadres" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Monteringsadresse" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Skuid af" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Skuif na my versameling..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Skuid op" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Musiek" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Musiekversameling" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Maak stil" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "My Albums" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "My Musiek" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Aanbevelings" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Naam" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Naam" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Benamingsopsies" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Nouband (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Instaanbediener" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Netwerk-afstandbeheer" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Nooit" #: library/library.cpp:74 msgid "Never played" msgstr "Nooit deurgespeel" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Moet nooit begin speel nie" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Nuwe gids" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Nuwe speellys" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Nuwe slimspeellys" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Nuwe liedjies" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Nuwe snitte sal outomaties toegevoeg word." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Nuutste snitte" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Volgende" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Volgende snit" #: core/utilities.cpp:151 msgid "Next week" msgstr "Volgende week" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Geen analiseerder" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Geen agtergrond prentjie" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Geen omslae om uit te voer nie" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Geen lang blokke" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Geen gevind. Vee soekveld uit om hele speellys te toon." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Geen kort blokke" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Geen" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Geen van die gekose liedjies is geskik om na die toestel te kopiëer nie." #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Normaal" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Normale blok tipe" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Nie beskibaar gedurende die gebruik van dinamies speellyste nie" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Nie verbind" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Nie genoeg inhoud" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Nie genoeg ondersteuners nie" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Nie genoeg lidmate nie" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Nie genoeg bure nie" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Nie geïnstalleer" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Nie aangeteken nie" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Nie gemonteer - dubbelkliek om te monteer" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Niks is gevind nie" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Kennisgewing tipe" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Kennisgewings" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Aan die speel" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Nommer van episodes om te wys" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Skermbeeld voorskou" #: widgets/osd.cpp:173 msgid "Off" msgstr "Af" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "Aan" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Laat slegs verbindings vanaf die volgende adresreekse toe:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Laat slegs plaaslike netwerk konneksies toe" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Toon slegs die eerste" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Ondeursigtigheid" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Maak %1 in webblaaier oop" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Maak &oudio CD oop..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Maak OPML lêer oop" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Maak OPML lêer oop..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Maak 'n gids oop om musiek van in te trek" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Open device" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Lêer..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Maak oop in Google Drive." #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Maak in nuwe speellys oop" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Open in 'n nuwe speellys" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Maak in jou webblaaier oop" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Maak oop..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Aksie gestop" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Fokus op bistempo" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Fokus op kwaliteit" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Keuses..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Sorteer Lêers" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Sorteer Lêers..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Lêers word gesorteer" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Oorspronklike etikette" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Ander keuses" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Uitset" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Uitset toestel" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Uittree keuses" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Oorskryf alles" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Oorskryf bestaande lêers" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Oorskryf slegs kleiner enes" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Eienaar" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Verwerk Jamendo katalogus" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Partytjie" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Wagwoord" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Vries" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Vries terugspel" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Gevries" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Kunstenaar" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Pixel" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Gewone sykieslys" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Speel" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Speeltelling" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Speel indien gestop, vries indien aan die speel" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Speel as daar niks anders tans speel nie" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Speel die de snit in die speellys" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Speel/Vries" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Terugspeel" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Speler keuses" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Speellys" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Speellys deurgewerk" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Speellys keuses" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Speellys tipe" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Speellys" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Kies jou webblaaier en kom dan terug na Clementine." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Uitbreiding toestand:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Potgooie" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Duur van opspringkennisgewing" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Poort" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Voorversterker" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Instellings" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Instellings" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Instellings..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Voorkeur album omslag lêername (skei met 'n komma)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Voorkeur oudioformaat" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Voorkeur bistempo" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Voorkeur formaat" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Premium oudio tipe" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Voorinstelling:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Druk 'n sleutelsamestelling om te gebruik vir" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Druk 'n knoppie" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Druk 'n sleutelsametelling om te gebruik vir %1..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Om \"Vorige\" in die speler te druk sal..." #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Mooi skermbeeld keuses" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Voorskou" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Vorige" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Vorige snit" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Toon weergawe inligting" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Profiel" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Vordering" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Vordering" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psychedelic" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Druk 'n knoppie op die Wii-afstandsbeheer" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Skommel die liedjies" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Kwaliteit" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Kwaliteit" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Toestel word ondervra..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Tou bestuurder" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Plaas geselekteerde snitte in die tou" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Plaas snit in die tou" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (selfde hardheid vir alle snitte)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Reën" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Reën" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Lukrake visualisasie" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Gee die huidige liedjie 0 sterre" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Gee die huidige liedjie 1 ster" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Gee die huidige liedjie 2 sterre" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Gee die huidige liedjie 3 sterre" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Gee die huidige liedjie 4 sterre" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Gee die huidige liedjie 5 sterre" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Aantal sterre" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Wil jy rêrig opgee?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Aanstuur limiet oortref. Beaam jou bediener se opstellings." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Verfris katalogus" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Verfris kanale" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Verfris lys van stasies" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Verfris strome" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Relatief" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Onthou die Wii-afstandsbeheer se swaai" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Onthou van laas keer" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Ontou my keuse" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Verwyder" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Verwyder aksie" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Verwyder duplikate vanuit die speellys" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Verwyder vouer" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Verwyder vanuit My Musiek" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Verwyder vanuit boekmerke" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Verwyder vanuit speellys" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Verwyder speellys" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Verwyder speellyste" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Verwyder onbeskikbare snitte van die speellys" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Herbenoem speellys" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Herbenoem speellys..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Hernommer snitte in hierdie volgorde..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Herhaal" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Herhaal album" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Herhaal speellys" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Herhaal snit" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Vervang huidige speellys" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Vervang die speellys" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Vervang spasies met onderstrepe" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Terugspeel aanwins" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Terugspel aanwins modus" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Verfris" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Benodig verifikasie kode" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Herstel" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Herstel afspeeltelling" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Herbegin lied, dan spring na vorige as weer gedruk" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Hervat die snit, of speel die vorige snit indien binne 8 sekondes van die opening." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Beperk tot ASCII karakters" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Hervat terugspel met opening" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Gaan terug na Clementine." #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Regs" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "\"Rip\"" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "\"Rip\" CD" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "\"Rip\" oudio CD" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Laat loop" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "SOCKS instaanbediener" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "SSL handskud fout. Beaam die bediener se konfigurasie. Die SSLv3 opsie benede mag dalk die probleem omseil." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Veilige verwydering van toestel" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Verwyder toestel veilig na kopiëring" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Monstertempo" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Monstertempo" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Stoor .mood-lêers in jou musiekversameling" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Stoor albumomslag" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Stoor omslag op skyf" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Stoor beeld" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Stoor speellys" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Stoor speellys" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Stoor speellys..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Stoor voorinstelling" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Wanneer moontlik, stoor die graad in die lêer se merker" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Wanneer moontlik, stoor die statistiek in die lêer se merker" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Stoor hierdie stroom in die internet oortjie" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Die liedjies se statistiek word in die liedjies se lêer geskryf" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Snitte word gestoor" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Skaleerbare monstertempo profiel (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Geskaleerde grootte" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Telling" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Scrobble snitte wat ek na luister op" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Soek" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Soek" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Soek deur Icecast stasies" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Soek deur Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Soek deur Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Soek deur Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Soek outomaties" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Soek vir album omslae..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Soek vir enigiets" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Soek op gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Soek deur iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Soek modus" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Soek instellings" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Soekresultate" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Soekterme" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Tweede vlak" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Streef terugwaarts" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Streef vorentoe" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Streef 'n relatiewe hoeveelheid deur die huidige snit" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Streef na 'n spesifieke posisie in die huidige snit" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Kies Almal" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Kies geen" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Kies agtergrond kleur:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Kies 'n agtergrond prentjie" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Kies een wat beste voldoen" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Kies voorgrond kleur:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Kies visualisasie" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Kies visualisasie..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Selekteer..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Reeksnommer" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Bediener" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "URL van Bediener" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Bedienerbesonderhede" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Diens aflyn" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Stel %1 na \"%2\"..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Stel die volume na persent" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Stel waarde vir alle geselekteerde snitte" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Verstellinge" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Kortskakel" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Kortskakel vir %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Kortskakel vir %1 bestaan reeds" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Wys" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Wys skermbeeld" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Maak die huidige snit gloei" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Wys 'n stemmingsbalk in die snit se vorderingsbalk" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Gebruik die sisteem se eie kennisgewings" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Wys 'n kennisgewing as ek die hehaal/skommel modus verander" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Wys 'n kennisgewing as ek die volume verander" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Wys 'n kennisgewing as ek die terugspel vries" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Wys 'n opwipkennisgewing vanaf die stelselbalk" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Wys 'n mooi skermbeeld" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Wys bo toestandsbalk" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Wys alle liedjies" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Wys alle liedjies" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Wys omslae in die versameling" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Wys verdelers" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Wys volgrootte..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Vertoon groepe in die globale soektog resultate" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Wys in lêerblaaier..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Wys in die biblioteek..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Wys tussen verkeie kunstenaars" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Wys stemmingsbalk" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Wys slegs duplikate" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Wys slegs sonder etikette" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Vertoon die spelende liedjie op jou blad" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Wys aanbevole soektogte" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Vertoon die \"bemin\" knoppie" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Wys die scrobble knoppie in die hoofvenster" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Wys in stelselbalk" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Wys watter bronne is aan- en afgeskakel" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Wys/Steek weg" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Skommel" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Skommel albums" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Skommel alles" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Skommel speellys" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Skommel snitte in hierdie album" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Teken aan" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Teken uit" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Aan die aanteken..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Soortgelyke kunstenaars" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Grootte" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Grootte:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Spring terugwaarts in speellys" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Aantal keer oorgeslaan" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Spring voorentoe in speellys" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Spring geselekteerde snitte" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Spring snit" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Klein omslag" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Klein kantbalk" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Slimspeellys" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Slimspeellyste" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Sag" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Sagte Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Liedjie Inligting" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Liedjie" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Jammer" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Sorteer volgens genre (alfabeties)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Sorteer volgens genre (populariteit)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Sorteer volgens stasienaam" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Sorteer liedjies volgens" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Sortering" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Bron" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Bronne" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Spotify aantekenfout" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "Spotifyspeellys se URL" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Spotify uitbreiding" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Spotify uitbreiding is nie geïnstalleer nie" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "Spotify lied se URL" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Standaard" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Gegradeer" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Bigin om te \"rip\"" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Begin die huidige speellys speel" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Begin transkodering" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Begin iets bo in die soekblokkie te tik om resultate hier te sien" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "%1 word begin" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "In aanvang..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Stop" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Stop na" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Stop na elke snit" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Stop na elke snit" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Stop na hierdie snit" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Beëindig terugspel" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Hou op speel na die huidige snit" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Beëindig die terugspel na snit: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Terugspeel is gestop" #: core/song.cpp:431 msgid "Stream" msgstr "Stroom" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Om vanaf die Subsonic bediener te kan stroom na die 30 dae toets tydperk, het jy 'n geldige lisensie nodig." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Stroomlidmaatskap" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Teken in" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Sukses!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "%1 suksesvol geskryf" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Voorgestelde etikette" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Opsomming" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Siper hoog (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Super hoog (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Ondersteunde formate" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Sinkroniseer nou die statistiek na die lêers" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Spotify inbox word gesinkroniseer" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Spotify speellys word gesinkroniseer" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Gegradeerde Spotify snitte word gesinkroniseer" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Standaard kleure" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Oortjies bo" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Etiketsoeker" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Teiken bistempo" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Teksinstellings" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Dank aan" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Die \"%1\" bevel kan nie begin word nie." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Die album omslag van die huidige liedjie" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "Die gids %1 is nie geldig nie" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "Die tweede waarde moet groter wees as die eerste!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Die blad wat jy aangevra het bestaan nie!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Die blad wat jy aangevra het is nie 'n beeld nie!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Die toetsperiode vir toegang tot die Subsonic bediener is verstreke. Gee asseblief 'n donasie om 'n lisensie sleutel te ontvang. Besoek subsonic.org vir meer inligting." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Die weergawe van Clementine waarheen jy sopas opgradeer het benodig 'n volle versameling herindeksering weens hierdie nuwe funksies:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Daar is ander liedjies in hierdie album" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Fout tydens kommunikasie met gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Daar was 'n probleem met die haal van metadata vanaf Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Fout tydens analisering van iTunes winkel se antwoord" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Daar was 'n probleem met die kopiëring van liedjies. Die volgende lêers kan nie gekopiëer word nie:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Daar was 'n probleem met die verwydering van sommige liedjies. Die volgende lêers kan nie verwyder word nie:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Hierdie lêers sal vanaf die toestel verwyder word. Is jy seker?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Die lêers sal permanent van die skyf verwyder word. Is jy seker jy wil voortgaan?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Hierdie vouers sal deursoek word vir musiek om in jou versameling te plaas" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Hierdie instellings word gebruik vir die transkodeer van musiek en ook wanneer musiek na 'n toestel gekopiëer word." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Derde vlak" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Hierdie aksie skep 'n databasis wat so groot soos 150MB mag wees.\nIs jy seker jy wil voortgaan?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Hierdie album is nie tans in die aangevraagde formaat beskikbaar nie." #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Dit kan later deur die verstellings verander word" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Hierdie toestel moet eers gekoppel en oopgemaak word voordat Clememntine kan sien watter lêer-tipes dit ondersteun." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Die toestel ondersteun die volgende lêer formate:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Hierdie toestel sal nie goed werk nie" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Hierdie is 'n MTP toestel, maar jy het Clementine sonder libmtp ondersteuning gekompileer." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Hierdie is 'n iPos, maar jy het Clementine sonder libgpod ondersteuning gekompileer." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Dit is die eerste keer dat jy hierdie toestel verbind. Clementine gaan dit nou deursoek vir musiek. Dit mak dalk enkele oomblike duur." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Die opsie kan in die \"Gedrag\" opstellinge verander word" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Hierdie stroom is slegs vir betalende lede." #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Hierdie tipe toestel word nie ondersteun nie: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Titel" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Vandag" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Skakel mooi skermbeeld aan/af" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Skakel volskerm aan/af" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Skakel tou-status aan/af" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Skakel log van geluisterde musiek aanlyn aan/af" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Skakel mooi skermbeeld aan/af" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Môre" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Te veel aansture" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Top snitte" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Album totaal:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Totale aantal grepe oorgedra" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Totale aantal versoeke oor die netwerk gemaak" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Snit" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Snitte" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Transkodeer musiek" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Transkodeerder log" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Besig met transkodering" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Lêer %1 word met %2 prosesse getranskodeer" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Transkodering instellings" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Skakel af" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Ultra wyeband (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Kan nie konnekteer nie" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Kan nie %1 aflaai nie (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Onbekend" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Onbekende inhoudtipe" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Onbekende fout" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Verwyder omslag" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Moet nie geselekteerde snitte spring nie" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Moet nie snit spring nie" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Teken uit" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Komende opvoerings" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Dateeer op" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Dateer alle potgooie op" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Gaan versameling na vir veranderinge" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Gaan die versameling vir veranderings na elke keer as Clementine oopgemaak word" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Dateer hierdie potgooi op" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Dateer op..." #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "%1 word opgedateer" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "%1% word opgedateer..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Jou versameling word nagegaan" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Gebruik" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Gebruik Albumkunstenaar etiket as dit beskikbaar is" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Gebruik Gnome se kortskakel knoppies" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Gebruik afspeel-aanwins metadata as dit beskikbaar is" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Gebruik SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Gebruik Wii Afstandsbeheer" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Gebruik 'n ander kleurskema" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Gebruik 'n eie gekose boodskap vir kennisgewings" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Gebruik 'n netwerk afstandbeheer" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Teken aan" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Gebruik bistempo beheerstelsel" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Gebruik dinamiese modus" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Gebruik kennisgewings om die Wii-afstandsbeheer se status te toon" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Gebruik tydgebasseerde ruis vervorming" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Gebruik die stelsel se standaard waarde" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Gebruik die standaard kleurskema" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Gebruik die stelsel se instaanbediener instellings" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Gebruik volume normalisering" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Reeds gebruik" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Gebruikerskoppelvlak" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Gebruikersnaam" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Deur van die kieslys gebruik te maak om 'n liedjie by te voeg sal..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Wisselende bistempo" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Verskeie kunstenaars" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Weergawe %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Bekyk" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Visualisasie modus" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Visualisasies" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Visualisasie instellings" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Stem deteksie" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Volume %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Muur" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Waarsku my met die sluit van 'n speellys oortjie" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Webtuiste" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Weke" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Wanneer Clementine oopgemaak word" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Wanneer daar vir album omslae gesoek word, sal Clementine eers soek vir beelde met die volgende woorde in hulle name.\nAs daar niks gevind word nie word die grootste beeld gebruik." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "Met die stoor van 'n speellys moet die lêer roetes" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Wanneer die lys leeg is..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Probeer ook..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Wyeband (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii afstandsbeheer %1: aktief" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii afstandsbeheer %1: verbind" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii afstandsbeheer %1: battery krities laag (%2%)" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii afstandsbeheer %1: deaktiveer" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii afstandsbeheer %1: ontkoppel" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii afstandsbeheer %1: lae battery (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media oudio" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Sonder omslag:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Wil jy die ander liedjies in hierdie album ook na Verskeie Kunstenaars skuif?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Wil jy alles van voor af deursoek?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Skryf al die liedjies se statistiek in die liedjie se lêer." #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Skryf metedata" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Verkeerde gebruikersnaam of wagwoord." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Jaar" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Jaar -Album" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Jare" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Gister" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Jy is op die punt om die volgende albums af te laai" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Jy is op die punt daarvan om %1 speellyste uit jou gunstelinge verwyder. Is jy seker?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Jy is op die punt om 'n spellys te verwyder wat nie deel van jou gunsteling speellyste is nie. Die speellys sal uitgevee word (die aksie kan nie ongedaan gemaak word nie).\nIs jy seker jy wil voort gaan?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Jy is nie aangeteken nie." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Jy is aangeteken as %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Jy is aangeteken." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Jy kan die manier waarop die liedjies in jou versameling georganiseer word verander." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Jy kan gratis sonder lidmaatskap luister, maar Premium lede kan hoër kwaliteit strome sonder advertensies kry." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Jy kan gratis sonder lidmaatskap na Magnatune liedjies luister. Betalende lede kry nie die boodskap na elke liedjie nie." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Jy kan na agtergrond strome luister terwyl ander musiek speel." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Jy kan 'n Wii-afstandsbeheer gebruik om Clementine te beheer. Hierdie bladsy op die Clementine wiki verduidelik in meer detail hoe.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Jy het nie Spotify Premium lidmaatskap nie." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Jy het nie 'n aktiewe lidmaatskap nie" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "Jy hoef nie ingesluit te wees om op SoundCloud na musiek te soek of te luister nie. Jy moet egter insluit sou jy toegant tot jou strome en speellyste wil hê. " #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Jy is uitgeteken vanuit Spotify. Tik weer jou wagwoord in in die Instellings skerm." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Jy is uitgeteken uit Spotify. Tik asseblief weer jou wagwoord in." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Jy hou van hierdie snit." #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "Jy moet \"System Preferences\" oopmaak en Clementine toelaat om \"control your computer\" vir die gebruik van globale kortpaaie." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Jy moet Clementine van voor af oopmaak om die taal te verander." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Jou IP-adres:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Jou Last.fm aanteken details was verkeerd" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Jou Magnatune aanteken details was verkeerd" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Jou versameling is leeg!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Jou radiostasies" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Jou aanlyn logs: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Jou rekenaar het nie OpenGL ondersteuning nie. Visualiserings is dus onbeskikbaar." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Jou gebruikersnaam of wagwoord was verkeerd." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "voeg %n liedjies by" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "na" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "gelede" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "en" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "outomaties" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "voor" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "tussen" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "grootste eerste" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "bevat" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "skakel af" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "skyf %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "bevat nie" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "eindig met" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "gelyk aan" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "gpodder.net gids" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "groter as" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "iPods en USB toestelle werk huidiglik nie op Windows nie. Jammer!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "in die laaste" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "minder as" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "langste eerste" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "skuif %n liedjies" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "nuutste eerste" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "nie gelyk aan" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "nie in die laaste" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "nie volgens" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "oudste eerste" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "volgens" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "instellings" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "of skandeer die QR kode!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "druk Enter" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "verwyder %n liedjies" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "korste eerste" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "meng liedjies" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "kleinste eerste" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "sorteer liedjies" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "begin met" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "stop" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "snit %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/ar.po000066400000000000000000005402151260417502300236500ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # ahameed , 2012 # FIRST AUTHOR , 2010 # mankind , 2014 # khire aldin kajjan , 2012 # StormX , 2013 # Mohamed Sakhri , 2013-2014 # Mohammed A. Tayeh , 2013-2014 # newstyle20 , 2012 # طاهر , 2014 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Arabic (http://www.transifex.com/davidsansome/clementine/language/ar/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ar\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nيمكنك تفضيل قائمة تشغيل بالضغط على النجمة التي بجانب اسم القائمة\n\nسيتم حفظ قوائم التشغيل المفضلة هنا" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "الأيام" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "كب\\ث" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr "مث" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr "ثانية" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "المقاطع" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "1% (2% أغنية)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 ألبومات" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 أيام" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 مند أيام" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 من %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 قوائم التشغيل (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 مختارة" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 مقطع" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 مقاطع" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 العثور على مقاطع" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "عثر على 1% أغنية (يعرض منها 2%)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 المسارات" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 منقولة" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "1%: أداة Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 مستمعون أخرون" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 مجموع التشغيل" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%اسم الملف%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n فشل" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n إنتهى" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n المتبقية" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&محاذاة النص" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&وسط" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&تخصيص" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "&إضافات" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&مساعدة" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "أخفِ %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "إخفاء..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&يسار" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "&موسيقى" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&لا شيئ" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "&قائمة التشغيل" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&خروج" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "&نمط التكرار" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&يمين" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "&نمط الخلط" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&تمديد الأعمدة لتتناسب مع الناقدة" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&أدوات" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(مختلفة عبر أغنيات متعددة)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...وكل المساهمين في أماروك" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 يوم" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 مقطع" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 مقطع عشوائي" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "رقي إلى بريميوم الأن" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

إن لم يتم تفعيله، سيحاول كلمنتاين حفظ التقييمات والاحصائيا في قاعدة بيانات منفصلة دون التغيير في ملفاتك.

إن تم تفعيله، سيتم حفظ الاحصائيات في كل من قاعدة البيانات والملف كلما تغيرت.

الرجاء الانتباه إلى أن هذه الخاصية قد لا تشتغل مع كل صيغة، كما أنه لا ضمانة لتمكن مشغلات أخرى من قرائتها، بما أنه لا توجد معايير قياسية لهذه الخاصية.\n

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

اسبق كلمة البحث باسم حقل حتى تحدد نطاق البحث لذلك الحقل، مثل فنان:بوديه والتي تقوم بالبحث عن كل الفنانين في المكتبة التي تحتوي أسماءهم على كلمة بوديه.

الحقول المتوفرة: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

سيتم كتابة تقييمات المقاطع والاحصائيات في وسوم الملفات لكل المقاطع التي بمكتبتك الصوتية.

هذا ليس ضرويا إن كان قد تم تفعيل خياري \"احفظ التقييمات والاحصائيات في وسوم الملف إن أمكن ذلك\".

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

النطاقات تبدأ بـ %، مثلا: %artist %album %title

\n

إن استخدمت معقوفات للإحاطة بقطعة نص تحتوي على نطاق ما، سيتم إخفاء تلك القطعة النصية إن كان النطاق فارغا.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "يجب أن تتوفر على حساب في Spotify" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "لا يمكن لعميل الاتصال، إلا إن أدخل شفرة صحيحة." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "قائمة التشغيل الذكية هي قائمة ديناميكية من المقاطع التي تأتي من المكتبة الخاصة بك. هناك أنواع مختلفة من قوائم التشغيل الذكية التي توفر طرق مختلفة للاختيار المقاطع" #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "سيتم إدراج المقطع في قائمة التشغيل إذا كان يتطابق مع هذه الشروط." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "أ-ي" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "HYPNOTOADكل المجد ل" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "ألغ" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "عن %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "عن كليمنتاين..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "عن QT..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "معلومات الحساب" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "تفاصيل الحساب(المدفوع)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "عمل" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "تفعيل\\إلغاء تفعيل أداة التحكم عن بعد لـ Wii" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "سجل النشاطات" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "إضافة بودكاست" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "إضافة Stream" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "إضافة سطر جديد إن كان مدعوم من قبل نوعية التنبيه" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "إضافة عمل" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "إضافة Stream أخر" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "أضف مجلد..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "أضف ملفا" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "أضف ملفا للتحويل" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "أضف ملف(s) للتحويل" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "أضافة ملف..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "أضف ملفات للتحويل" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "إضافة مجلد" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "إضافة مجلد..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "أضف مجلد جديد..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "إضافة بودكاست" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "إضافة بودكاست..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "إضافة تعبير للبحث" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "إضافة علامة الألبوم للأغنية" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "إضافة علامة مؤلف الألبوم للأغنية" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "إضافة مؤلف الأغنية" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "أضف وسم نتيجة المقطع" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "أضف وسم مؤلف المقطع" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "أضف وسمة قرص المقطع" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "أضف اسم ملف المقطع" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "أضف وسم نوع المقطع" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "أضف وسم تجميع المقطع" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "أضف وسم مدة المقطع" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "أضف وسم مؤدي المقطع" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "أضف عدد مرات تشغيل المقطع" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "أضف تقييم المقطع" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "أضف عدد مرات تجاوز تشغيل المقطع" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "أضف وسم عنوان المقطع" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "أضف أغنية إلى التخزين المؤقت" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "أضف وسم للمقطع" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "أضف وسم سنة المقطع" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "أضف الأغاني إلى \"الموسيقى\" حين أنقر زر \"حب\"" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "أضف رابط انترنت..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "أضف إلى الموسيقى" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "أضف إلى قائمة تشغيل أخرى" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "أضف إلى الإشارات المرجعية" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "إضافة لقائمة التشغيل" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "أضف إلى لائحة الانتظار" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "أضف مستخدما\\مجموعة إلى الإشارات المرجعية" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "أضف عملية wiimotedev" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "أضف..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "أُضيفَ هذا الشهر" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "أُضيفَ هذا الأسبوع" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "أُضيفَ هذه السنة" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "أُضيفَ اليوم" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "أُضيفَ خلال ثلاثة أشهر" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "تجميع متقدم..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "بعد" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "بعد النسخ..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "الألبوم" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "ألبوم (شدة صوت مثلى لجميع المقاطع)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "فنان الألبوم" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "غلاف الألبوم" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "معلومات الألبوم على Jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "ألبومات بغلاف" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "ألبومات بدون غلاف" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "جميع الملفات (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "العظمة لهيبنوتود!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "كل الألبومات" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "كل الفنانين" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "كل الملفات (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "كل قوائم التشغيل (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "كل المترجمين" #: library/library.cpp:98 msgid "All tracks" msgstr "كل المقطوعات" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "اسمح للعملاء بتحميل المقاطع من هذا الحاسوب." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "اسمح بالتحميل" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "اسمح بترميز mid/side" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "بجانب الأصلية" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "اخف النافذة الرئيسية دائما" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "أظهر النافذة الرئيسية دائما" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "ابدأ التشغيل دائما" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "لاستعمال Spotify في كلمنتاين تحتاج لملحق إضافي. هل ترغب في تحميل هذا الملحق وتثبيته الآن؟" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "حدث خطأ أثناء تحميل قاعدة بيانات iTunes" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "حدث خطأ أثناء حفظ المعلومات في '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "حدث خطأ عير محدد." #: ui/about.cpp:85 msgid "And:" msgstr "إضافة لـ:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "غاضب" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "المظهر" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "أضف الملفات/العناوين إلى قائمة التشغيل" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "أضف إلى قائمة التشغيل الحالية" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "أضف إلى قائمة التشغيل" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "اجعل المقاطع مضغوطة لتفادي أخطاء القص" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "هل أنت متأكد من رغبتك بحذف ملف الإعدادات \"%1\"؟" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "هل أنت متأكد من رغبتك بتصفير إحصائيات هذا المقطع؟" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "هل أنت متأكد من رغبتك بكتابة احصائيات المقاطع في ملفات المقاطع بالنسبة لكل المقاطع التي في مكتبتك الصوتية؟" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "الفنان" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "معلومات الفنان" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "وسومات الفنان" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "بداية الفنان" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "صيغة الصوت" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "مخرج الصوت" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "فشلت عملية التحقق" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "المؤلف" #: ui/about.cpp:68 msgid "Authors" msgstr "المؤلفون" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "تلقائي" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "التحديث تلقائيا" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "افتح الفئات المفردة تلقائيا في تشجر المكتبة" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "متاح" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "صبيب متوسط" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "القياس المتوسط للصور" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "بودكاست BBC" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "تيارات الخلفية" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "لون الخلفية" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "صورة الخلفية" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "شفافية الخلفية" #: core/database.cpp:648 msgid "Backing up database" msgstr "استعادة قاعدة البيانات" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "توازن" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "عارضة معدل الصوت" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Basic Blue" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "صوت عادي" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "السلوك" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "الأفضل" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "السيرة الذاتية من %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "معدل البت" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "الصبيب" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "معدل البت" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "محلل الأجزاء" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "احظر النوع" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "قيمة التضبيب" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "النص الأساسي" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "محلل Boom" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "تصفح..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "مدة التخزين المؤقت" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "تخزين مؤقت" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "لكن هذه المصادر غير مفعلة" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "أزرار" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "دعم CUE" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "مسار التخزين المؤقت:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "تخزين مؤقت" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "تخزين مؤقت %1" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "إلغاء" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "الكابتشا مطلوبة.\nحاول الدخول إلى VK.com باستخدام متصفحك، ثم حل هذه المشكلة." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "تغيير الغلاف" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "تغيير حجم الخط..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "تغيير نمط التكرار" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "تغيير اختصار لوحة المفاتيح..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "تغيير نمط الخلط" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "تغيير اللغة" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "تغيير إعدادات تشغيل مونو سيأخذ بعين الاعتبار انطلاقا من المقطع الموالي" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "التمس حلقات جديدة" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "التمس التحديثات" #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "اختر مستار تخزين VK.com المؤقت" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "اختر اسما لقائمة التشغيل" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "اختيار تلقائي" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "اختيار اللون..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "اختيار الخط" #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "الاختيار من اللائحة" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "اختيار طريقة ترتيب قائمة التشغيل وكم من مقطع ستتضمن" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "اختر مجلد تحميل البودكاست" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "اختر المواقع التي تريد من كلمنتاين أن يستخدم للبحث عن كلمات المقاطع" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "كلاسيكي" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "تنضيف" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "امسح" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "امسح قائمة التشغيل" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "كلمنتاين" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "خطأ بكلمنتاين" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "برتقالة كلمنتاين" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "التأثيرات المرئية لكلمنتاين" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "يمكن لكلمنتاين أن يحول تلقائيا المقاطع التي تنسخ لهذا الجهاز للصيغ التي يستطيع قرائتها." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "يستطيع كلمنتاين تشغيل المقاطع التي رفعتها على Box" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "يستطيع كلمنتاين تشغيل المقاطع التي رفعتها على Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "يستطيع كلمنتاين تشغيل المقاطع التي رفعتها على Google Drive" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "يستطيع كليمينتين تشغيل الأغاني المرفوعة على OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "يمكن لكلمنتاين أن يظهر رسالة إذا تغير المقطع المقروء." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "يمكن لكلمنتاين مزامنة لائحة اشتراكاتك مع حواسيبك الأخرى وتطبيقات البودكاست. أنشئ حسابا." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "تعذر على كلمنتاين تحميل أي تأثيرات مرئية. تأكد من أنك ثبت كلمنتاين بطريقة صحيحة." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "عارض صور كلمنتاين" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "تعذر على كلمنتاين إيجاد نتائج لهذا الملف." #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "سيبحث كلمنتاين عن المقاطع في:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "اضغط هنا لإضافة بعض الموسيقى" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "اضغط هنا لتفضيل هذه القائمة. هكذا سيتم حفظها وتصبح متوفرة في شريط \"قوائم التشغيل\" في العارضة الجانبية اليمنى." #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "اضغط للتبديل بين الوقت المتبقي والوقت الكلي." #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "الضغط على زر تسجيل الدخول سيفتح متصفح الانترنت. بعد تسجيل الدخول منه سيمكنك العودة لاستعمال كلمنتاين." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "غلق" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "أغلق قائمة التشغيل" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "غلق التأثيرات المرئية" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "إغلاق هذه النافذة سيلغي التحميل." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "غلق هذه النافذة سينهي البحث عن أغلفة الألبومات" #: ui/equalizer.cpp:114 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "الألوان" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "لائحة عناصر مفروقة بفاصلة لـ \"class:level\"، قيمة Level بين 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "تعليق" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "الإذاعة المجتمعية" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "أكمل الوسوم تلقائيا" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "أكمل الوسوم تلقائيا..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "الملحّن" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "إعدادات %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "إعدادات Magnature" #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "إعدادات اختصارات لوحة المفاتيح" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "إعدادات Spotify..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "إعدادات Subsonic..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "ضبط VK.com..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "إعدادات البحث العامة..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "إعدادات المكتبة" #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "إعدادات بودكاست..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "إعدادات..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "أوصل بأداة التحكم عن بعد لـ Wii بواسطة عملية التفعيل/إلغاء التفعيل" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "وصل الجهاز" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr " جاري الاتصال بـ Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "تم رفض الاتصال من الخادم، تأكد من رابط الخادم. مثال: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "تم تجاوز مدة الانتظار، تأكد من رابط الخادم. مثال: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "مشكلة في الاتصال أو أن الصوت معطل من المالك" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "طرفية" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "صبيب ثابت" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "حول جميع المقاطع" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "حول جميع المقاطع التي لا يستطيع الجهاز تشغيلها" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "انسخ الرابط إلى الحافظة" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "نسخ إلى المكتبة..." #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "نسخ إلى جهاز..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "نسخ إلى المكتبة..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "حفظ الحقوق" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "تعذر الاتصال بخادم Subsonic، تأكد من عنوان الخادم. مثال للعنوان: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "تعذر إنشاء عنصر Gstreamer \"%1\" - تأكد أن جميع ملحقات GStreamer الضرورية مثبتة" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "لا تنشئ قائمة تشغيل" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "تعذر العثور على معدد من أجل %1، تأكد أن ملحقات GStreamer الضرورية مثبتة" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "تعذر العثور على محول لـ %1، تأكد من أنك ثبت ملحق GStreamer المناسب" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "تعذر فتح الملف %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "مدير الغلاف" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "الغلاف من الصورة المدمجة" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "تم تحميل الغلاف تلقائيا من %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "الغلاف غير محدد يدويا" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "الغلاف غير محدد" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "الغلاف محدد من %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "الأغلفة من %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "أخفت الصوت تدريجيا عند التبديل تلقائيا بين المقاطع" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "أخفت الصوت تدريجيا عند التبديل يدويا بين المقاطع" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "خصص" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "صورة مخصصة:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "خصص إعدادات الرسائل" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "خصص..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "مسار DBus" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "رقص" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "تم كشف قاعدة بيانات فاسدة. الرجاء قراءة https://code.google.com/p/clementine-player/wiki/DatabaseCorruption ففيها تعليمات لكيفية استعادة قاعدة البيانات." #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "تاريخ الإنشاء" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "حُرِرَ بِتاريخ" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "الأيام" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "&افتراضي" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "اخفض الصوت 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "أخفض الصوت بنسبة مئوية" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "اخفض الصوت" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "صورة الخلفية الافتراضية" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "الجهاز الافتراضي 1%" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "الافتراضية" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "المدة بين التأثيرات المرئية" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "احذف" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "حذف البيانات المحملة" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "احذف الملفات" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "احذف من الجهاز" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "احذف من القرص..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "حذف الحلقات المشغلة" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "احذف ملف الإعدادات" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "احذف لائحة التشغيل الذكية" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "احذف الملفات الأصلية" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "حذف الملفات" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "أزل المختارة من لائحة الانتظار" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "أزل المقطع من لائحة الانتظار" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "الوجهة" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "التفاصيل..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "الجهاز" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "خصائص الجهاز" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "اسم الجهاز" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "خصائص الجهاز..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "أجهزة" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "الحوار" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "هل قصدت" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "كلمة السر" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "اسم المستخدم" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "اتصال انترنت مباشر" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "مجلد" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "إلغاء التمديد" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "ألغ إنشاء شريط المزاج" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "معطل" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "معطل" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "قرص مدمج" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "إرسال غير مستمر" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "خيارات العرض" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "أظهر قائمة الشاشة" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "افحص المكتبة كاملة" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "لا تحول أي مقطع" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "لا تستبدل" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "لا تكرر" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "لا تظهره في فئة فنانون متنوعون" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "لا تخلط" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "لا تتوقف!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "تبرع" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "النقر مرتين للتشغيل" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "النقر مرتين على مقطع سـ..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "حمل %n حلقات" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "مجلد التحميل" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "حمل الحلقات إلى" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "عضوية التحميل" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "حمل الحلقات الجديدة تلقائيا" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "حمل مقاطع لائحة الانتظار" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "حمل تطبيق أندرويد" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "حمل هذا الألبوم" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "حمل هذا الألبوم..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "حمل هذه الحلقة" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "حمل..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "تحميل (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "جاري تحميل مجلد Icecast" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "جاري تحميل فهرس Jamendo" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "جاري تحميل فهرس Magnatune" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "جاري تحميل ملحق Spotify" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "جاري تحميل المعلومات..." #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "جر لإعادة الترتيب" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dubstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "المدة" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "النمط النشيط مفعل" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "مزج عشوائي تلقائيا" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "حرر قائمة التشغيل الذكية" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "حرر الوسم \"%1\"" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "حرر الوسم..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "حرر الوسوم" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "تعديل معلومات المقطع" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "تعديل معلومات المقطع..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "تعديل معلومات المقاطع..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "حرر..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "فعل دعم أداة التحكم عن بعد لـ Wii" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "مكن التخزين المؤقت الذاتي" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "فعل معدل الصوت" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "فعل اختصارات لوحة المفاتيح فقط حين يكون كلمنتاين في الواجهة" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "فعل المصادر أسفله لتضمينهم في نتائج البحث. ستظهر النتائج في هذا الترتيب." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "فعل/ألغ نقل معلومات الاستماع لحسابك على Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "تعقيد الترميز" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "جودة المحول" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "نمط التحويل" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "أدخل رابط انترنت" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "أدخل رابطا لتحميل الغلاف من الانترنت" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "أدخل اسم ملف للأغلفة المصدرة (بدون امتداد)" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "أدخل اسما جديدا لهذه القائمة" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "أدخل كلمات للبحث عن مقاطع في حاسوبك وفي الانترنت" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "أدخل كلمات البحث أسفله للعثور على بودكاست في متجر iTunes" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "أدخل كلمات البحث أسفله للعثور على بودكاست في gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "ادخل كلمات البحث هنا" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "أدخل رابط الراديو" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "أدخل اسم المجلد" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "أدخل عنوان الايبي - IP - في التطبيق للاتصال بكلمنتاين." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "كامل المجموعة" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "معدل الصوت" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "يكافئ --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "يكافئ --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "خطأ" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "خطأ في الاستخراج من القرص المضغوط" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "حدث خطأ بالاتصال بجهاز MTP" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "خطأ في نسخ المقاطع" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "خطأ في حذف المقاطع" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "خطأ أثناء تحميل ملحق Spotify" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "خطأ في تحميل %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "خطأ في تحميل قائمة تشغيل di.fm" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "حدث خطأ بتطبيق %1:%2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "حدث خطأ أثناء تحميل القرص الصوتي" #: library/library.cpp:68 msgid "Ever played" msgstr "لم تشغل أبدا" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "كل 10 دقائق" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "كل 12 ساعة" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "كل 2 ساعة" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "كل 20 دقيقة" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "كل 30 دقيقة" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "كل 6 ساعات" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "كل ساعة" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "باستثناء بين مقاطع نفس الألبوم أو نفس صفحة CUE" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "الأغلفة الموجودة" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "توسيع" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "تنتهي صلاحيته في %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "صدر الأغلفة" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "صدر الأغلفة" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "صدر الأغلفة المحملة" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "صدر الأغلفة المدمجة" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "تم الانتهاء من التصدير" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "تم تصدير %1 أغلفة من إجمالي %2 (تم تخطي %3)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "اخفت الصوت عند الإيقاف/ارفعه تدريجيا عند متابعة التشغيل" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "تلاشي تدريجيا عند إيقاف المقطع" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "تلاشي" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "مدة التلاشي" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "فشل في قراءة القرص CD" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "فشل جلب المسار" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "فشل جلب البودكاست" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "فشل تحميل البودكاست" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "تعذر قراءة تلقيمات RSS" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "سريع" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "المقاطع المفضلة" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "اجلب الأغلفة المفقودة" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "اجلب تلقائيا" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "تم التجلب" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "جلب مكتبة Subsonic..." #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "خطأ أثناء جلب الغلاف" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "صيغة الملف" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "امتداد الملف" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "صيغ الملف" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "اسم الملف" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "اسم الملف (من دون المسار)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "نمط اسم الملف:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "حجم الملف" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "نوع الملف" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "اسم الملف" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "الملفات" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "الملفات التي ستحول" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "ابحث في المكتبة عن المقاطع التي توافق المعايير التي حددت." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "اعثر على هذا الفنان" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "التحقق من هوية المقطع" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "انهاء" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "المستوى الأول" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "حجم الخط" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "لدواعي تتعلق بالرخصة، دعم Spotify متوفر في ملحق منفصل." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "أجبر ترميز مونو" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "انسى الجهاز" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "نسيان جهاز سيحذفه من القائمة. لهذا، سيتوجب على كلمنتاين إعادة فحص كل المقاطع مرة أخرى عند وصله المرة القادمة." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "النموذج" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "صيغة" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "معدل اللقطات" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "عدد اللقطات في كل وحدة تخزين" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "متجمد" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Full Bass" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Full Bass + Treble" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Full Treble" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "عام" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "إعدادات عامة" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "النوع" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "جاري جلب القنوات" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "جاري جلب التيارات..." #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "أعط اسما:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "اذهب" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "انتقل للسان قائمة التشغيل التالي" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "انتقل للسان قائمة التشغيل السابق" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "تم جلب %1 أغلفة من %2 (%3 فشلت)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "اجعل المقاطع التي لا توجد في مكتبتي بلون باهت" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "تجميع المكتبة حسب:" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "تجميع حسب" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "تجميع حسب الألبوم" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "تجميع حسب الفنان" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "تجميع حسب الفنان/الألبوم" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "تجميع حسب فنان/سنة - الألبوم" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "تجميع حسب النوع/الألبوم" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "تجميع حسب النوع/الفنان/الألبوم" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "تجميع" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "الصفحة لا تحتوي على أي تلقيم RSS" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "تم تلقي رمز الحالة HTTP 3xx دون أي رابط، تحقق من إعدادات الخادم." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "بروكسي HTTP" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "سعيد" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "معلومات العتاد" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "معلومات العتاد متاحة إذا كان الجهاز موصولا فقط." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "أعلى" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "أعلى (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "أعلى (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "تعذر العثور على المضيف، تأكد من رابط الخادم. مثال: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "الساعات" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "العلجوم المنوِّم" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "ليس لدي حساب Magnatune" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "أيقونة" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "الأيقونة في الأعلى" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "جاري التعرف على المقطع" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "إذا قررت الاستمرار، سيشتغل هذا الجهاز ببطء ويمكن للمقاطع المنسوخة إليه ألا تشغل." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "إن كنت تتوفر على رابط البودكاست، أدخله أسفله واضغط اذهب." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "تجاهل \"The\" في أسماء الفنانين" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "الصور (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "الصور (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "في %1 أيام" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "في %1 أسابيع" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "في النمط الديناميكي سيتم اختيار مقاطع جديدة وإضافتها لقائمة التشغيل كلما انتهى تشغيل المقطع." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "صندوق البريد" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "ضمن غلاف الألبوم في التنبيهات" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "ضمن جميع المقاطع" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "نسخة Subsonic REST غير متوافقة. يجب تحديث العميل." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "نسخة Subsonic REST غير متوافقة. يجب تحديث الخادم." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "لم يتم إكمال التهيئة، الرجاء التأكد من أن جميع الحقول مملوئة." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "ارفع الصوت 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "ارفع الصوت بنسبة مئوية" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "ارفع الصوت" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "فهرسة %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "معلومات" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "خيارات المدخل" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "إدارج..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "مثبت" #: core/database.cpp:585 msgid "Integrity check" msgstr "فحص شامل" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "انترنت" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "خدمات الانترنت" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "مفتاح API غير صالح" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "صيغة غير متاحة" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "طريقة غير متاحة" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "إعدادات غير صالحة" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "تم تعيين مصدر غير صالح" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "خدمة غير متاحة" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "مفتاح جلسة غير صالح" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "اعكس الاختيار" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "المقاطع الأكثر استماعا على Jamendo" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "أفضل المقاطع على Jamendo" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "أفضل مقاطع الشهر على Jamendo " #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "أفضل مقاطع الأسبوع على Jamendo" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "قاعدة بيانات Jamendo" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "اقفز إلى المقطع الجاري تشغيله" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "أبق الأزار لمدة %1 ثانية..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "أبق الأزار لمدة %1 ثواني" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "تابع التشغيل في الخلفية عند إغلاق النافذة" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "أبقي على الملفات الأصلية" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "هرر" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "اللغة" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "جهاز محمول/سماعات" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "قاعة واسعة" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "غلاف كبير لـ الألبوم" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "غلاف ألبوم كبير (التفاصيل في الأسفل)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "عارضة جانبية عريضة" #: library/library.cpp:80 msgid "Last played" msgstr "المشغلة مؤخرا" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "آخر تشغيل" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm مشغول حاليا، الرجاء إعادة المحاولة بعد دقائق." #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "كلمة السر" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "مرات تشغيل Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "وسوم Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "اسم المستخدم" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "ويكي Last.fm" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "المقاطع الأقل تفضيلا" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "يسار" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "المدة" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "المكتبة" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "إعدادات متقدمة لتجميع المكتبة" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "إشعار إعادة فحص المكتبة" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "البحث في المكتبة" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "الحدود" #: ui/equalizer.cpp:137 msgid "Live" msgstr "مباشر" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "تحميل" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "تحميل الغلاف من رابط انترنت" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "تحميل الغلاف من رابط انترنت..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "حمل الغلاف من القرص" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "تحميل الغلاف من القرص..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "تحميل قائمة تشغيل" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "تحميل قائمة تشغيل..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "تحميل جهاز MTP" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "تحميل قاعدة بيانات أيبود" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "تحميل قائمة تشغيل ذكية" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "تحميل المقاطع" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "تحميل تيار الانترنت" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "جاري تحميل المقاطع" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "جاري تحميل معلومات المقاطع" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "جاري التحميل" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "تحميل ملفات/روابط، استبدال قائمة التشغيل الحالية" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "تسجيل الدخول" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "فشل الولوج" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "تسجيل الخروج" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "ملف تعريف لتوقعات بعيدة المدى (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "إعجاب" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "أقل (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "أقل (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "ملف تعريف بأقل تعقيد (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "كلمات المقطع" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "كلمات المقطع من %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "تحميل Magnatude" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "تم تحميل Magnatude" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "ملف التعريف القياسي (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "فلتكن هكذا!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "اجعلها كذلك!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "اجعل قائمة التشغيل متاحة دون اتصال" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "إجابة غير صالحة" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "إعدادات يدوية للبروكسي" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "يدويا" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "المصنع" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "علم كمستمع إليه" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "علم كجديد" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "طابق كل كلمة بحث (و)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "طابق كلمة بحث أو عدة كلمات (أو)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "كل نتائج البحث الشامل" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "أقصى صبيب" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "تغيرت المادة. يعاد التحميل" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "متوسط (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "متوسط (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "نوع العضوية" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "أدنى صبيب" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "أقل تخزين للموازن" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "ملف إعدادات projectM غير متوفر" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "نموذج" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "راقب تغيرات المكتبة " #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "تشغيل مونو" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "الأشهر" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "المزاج" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "نمط عارضة المزاج" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "أشرطة المزاج" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "المزيد" #: library/library.cpp:84 msgid "Most played" msgstr "الأكثر تشغيلا" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "نقطة الوصل" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "نقط الوصل" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "أسفل" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "انقل إلى المكتبة" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "أعلى" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "موسيقى" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "مكتبة الصوتيات" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "كتم الصوت" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "مقاطعي" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "المقترحة لي" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "الاسم" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "الاسم" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "إعدادات التسمية" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Narrow band (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "شبكة بروكسي" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "شبكة عن بعد" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "أبدا" #: library/library.cpp:74 msgid "Never played" msgstr "لم تشغل أبدا" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "لم يبدأ تشغيلها أبدا" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "مجلد جديد" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "قائمة تشغيل جديدة" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "قائمة تشغيل ذكية جديدة" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "مقاطع جديدة" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "مقاطع جديدة ستنضاف تلقائيا" #: library/library.cpp:92 msgid "Newest tracks" msgstr "أحدث المقاطع" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "التالي" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "المقطع التالي" #: core/utilities.cpp:151 msgid "Next week" msgstr "الأسبوع المقبل" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "دون محلل" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "دون صورة خلفية" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "لا توجد أغلفة للتصدير." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "بدون أجزاء طويلة" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "لم يتم العثور على أي نتيجة. امسح خانة البحث لإظهار جميع قوائم التشغيل من جديد." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "بدون أجزاء قصيرة" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "لا شيء" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "لا مقطع من المقاطع المختارة مناسب لنسخه لجهاز." #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "عادي" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "نوع أجزاء عادي" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "غير متاح عند استعمال قائمة تشغيل ديناميكية" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "غير متصل" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "لا يوجد محتوى كافي" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "عدد المعجبين غير كافٍ" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "عدد الأعضاء غير كافٍ" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "عدد الجيران غير كافٍ" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "غير مثبت" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "غير متصل" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "غير موصول - انقر مرتين للوصل" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "لم يعثر على شيء" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "نوع التنبيهات" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "التنبيهات" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "جاري تشغيلها" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "معاينة التنبيهات" #: widgets/osd.cpp:173 msgid "Off" msgstr "معطل" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "مفعل" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "اقبل الاتصال فقط من العملاء بمجال الايبي - IP - التالي:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "اسمح بالاتصال من الشبكة المحلية فقط" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "أظهر الأول فقط" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "الشفافية" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "فتح %1 في المتصفح" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "فتح &قرص CD..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "فتح ملف OPML" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "فتح ملف OPML..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "فتح جهاز" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "فتح ملف..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "فتح في Google Drive" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "فتح في قائمة تشغيل جديدة" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "فتح في قائمة جديدة" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "افتح في المتصفح" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "فتح..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "فشلت العملية" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "تحسين لصبيب أفضل" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "تحسين لجودة أفضل" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "الإعدادات..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "ترتيب الملفات" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "ترتيب الملفات..." #: core/organise.cpp:73 msgid "Organising files" msgstr "ترتيب الملفات" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "الوسوم الأصلية" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "خيارات اخرى" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "مخرج" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "جهاز الإخراج" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "خيارات المخرج" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "استبدل الكل" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "أكتب على الملفات الموجودة" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "استبدل الملفات الأصغر فقط" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "المالك" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "تحليل فهرس Jamendo" #: ui/equalizer.cpp:139 msgid "Party" msgstr "حفلة" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "كلمة السر" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "إيقاف مؤقت" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "أوقف التشغيل مؤقتا" #: widgets/osd.cpp:156 msgid "Paused" msgstr "تم الإيقاف مؤقتا" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "المؤدي" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "بكسل" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "شريط جانبي عريض" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "تشغيل" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "عدد مرات التشغيل" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "شغل إذا انتهى، أوقف إذا كان قيد التشغيل" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "شغل إذا لم يكن هناك مقطع قيد التشغيل " #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "شغيل المقطع رقم في قائمة التشغيل" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "تشغيل/إيقاف" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "التشغيل" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "خيارات المشغل" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "قائمة تشغيل" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "قائمة تشغيل منتهية" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "خيارات قائمة التشغيل" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "نوع قائمة التشغيل" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "قوائم التشغيل" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "الرجاء إغلاق متصفحك والعودة إلى كلمنتاين" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "حالة الملحق:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "بودكاست" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "مدة نافذة الانبثاق" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "المنفذ" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "تقوية استباقية" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "التفضيلات" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "التفضيلات..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "الأسماء المفضلة لأغلفة الألبومات (استخدم فاصلة للفصل بينها)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "صيغة الصوت المفضلة" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "الصبيب المفضل" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "الصيغة المفضلة" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "صوت مميز" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "ملف الإعدادات:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "اضغط تجميعة أزرار لاستخدامها لـ" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "اضغط زرا" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "اضغط على تجميعة أزرار لاستخدامها في %1 ..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "إعدادات تنبيهات كلمنتاين" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "المعاينة" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "السابق" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "المقطع السابق" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "اطبع معلومات النسخة" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "ملف التعريف" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "التقدم" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "التقدم" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psychedelic" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "اضغط زر أداة التحكم عن بعد لـ Wii" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "ضع المقاطع في ترتيب عشوائي" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "الجودة" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "الجودة" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "الاستعلام عن الجهاز..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "مدير لائحة الانتظار" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "أضف المختارة للائحة الانتظار" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "أضف للائحة الانتظار" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "راديو (شدة صوت متساوية لجمع المقاطع)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "مطر" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "مطر" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "تأثيرات مرئية عشوائية" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "قيم المقطع الحالي ب 0 نجوم" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "قيم المقطع الحالي بـ 1 نجمة" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "قيم المقطع الحالي بنجمتين *2*" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "قيم المقطع الحالي ب 3 نجوم" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "قيم المقطع الحالي ب 4 نجوم" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "قيم المقطع الحالي ب 5 نجوم" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "تقييم" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "تريد فعلا الإلغاء؟" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "تم تجاوز عدد مرات إعادات التوجيه المسوح به، تحقق من إعدادات الخادم." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "حدث الفهرس" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "حدث القنوات" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "حدث قائمة المحطة" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "حدث تيارات الانترنت" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "تذكر تحركات أداة التحكم عن بعد لـ Wii" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "تذكر من اخر مرة" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "احذف" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "احذف العملية" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "احذف المقاطع المكررة من قائمة التشغيل" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "أزل الملف" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "حذف من مقاطعي" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "إزالة من الإشارات المرجعية" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "احذف من قائمة التشغيل" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "احذف قائمة التشغيل" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "احذف قوائم التشغيل" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "أعد تسمية قائمة التشغيل" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "أعد تسمية قائمة التشغيل" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "أعد ترقيم المقاطع في هذا الترتيب..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "كرر" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "كرر الألبوم" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "كرر قائمة التشغيل" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "كرر المقطع" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "استبدل قائمة التشغيل الحالية" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "استبدل قائمة التشغيل" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "استبدل الفراغات برمز \"_\"" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "نمط Replay Gain" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "أعد ملأه من جديد" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "يتطلب كود التحقق" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "استرجاع الحالة البدئية" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "صفّر عدد مرات التشغيل" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "أعد تشغيل المقطع، أو شغل المقطع السابق إن كان لم يتجاوز 8 ثوانٍ من بدء التشغيل." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "اكتف بأحرف ASCII" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "تابع التشغيل عند البدء" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "ارجع لكلمنتاين" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "يمين" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "نسخ" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "قرص RIP" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "شغل" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "بروكسي SOCKS" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "حدث خطأ بتبادل SSL، تحقق من إعدادات الخادم. خيار SSLv3 أسفله يمكن أن يحل بعض المشاكل." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "احذف الجهاز بأمان" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "احذف الجهاز بأمان بعد انتهاء النسخ" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "معدل العينة" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "معدل العينة" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "احفظ ملفات .mood في المكتبة" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "احفظ غلاف الألبوم" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "احفظ الغلاف في القرص..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "احفظ الصورة" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "حفظ قائمة التشغيل" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "حفظ قائمة التشغيل" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "حفظ قائمة التشغيل..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "احفظ ملف الإعدادات" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "احفظ التقييمات في وسوم الملف إن إمكن ذلك" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "احفظ الإحصائيات في وسوم الملف إن إمكن ذلك" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "احفظ المقطع في لسان الانترنت" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "حفظ إحصائيات المقاطع في ملفات المقاطع" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "حفظ المقاطع" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "ملف التعريف Scalable sampling rate (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "غيّر الحجم" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "النتيجة" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "أرسل معلومات المقاطع التي استمع إليها" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "البحث" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "بحث" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "البحث في محطات Icecast" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "بحث Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "بحث Magnatude" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "بحث Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "ابحث تلقائيا" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "ابحث عن أغلفة الألبومات..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "ابحث عن أي شيء" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "بحث gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "بحث iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "نمط البحث" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "إعدادات البحث" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "نتائج البحث" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "كلمات البحث" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "المستوى الثاني" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "ابحث إلى الخلف" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "ابحث إلى الأمام" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "انتقل في المقطع الحالي إلى موضع نسبي" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "انتقل في المقطع الحالي إلى موضع محدد" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "اختر الكل" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "لا تختر شيئا" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "اختر لون الخلفية:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "اختر صورة الخلفية" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "اختر النتيجة الأكثر مطابقة" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "اختر لون الخلفية:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "اختر التأثيرات المرئية" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "اختر التأثيرات المرئية..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "اختر..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "الرقم التسلسلي" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "عنوان الخادم" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "معلومات الخادم" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "خدمة غير متصلة" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "غير %1 إلى %2" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "اجعل درجة الصوت بنسبة " #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "اجعل هذه القيمة لجميع المقاطع المختارة" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "الإعدادات" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "اختصار لوحة المفاتيح" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "اختصار لوحة المفاتيح لـ %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "اختصار لوحة المفاتيح لـ %1 يوجد مسبقا" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "عرض" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "أظهر التنبيهات" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "أظهر توهجا في المقطع الحالي" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "أظهر شريط المزاج في شريط تقدم تشغيل المقطع" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "أظهر تنبيهات سطح المكتب الأصلية" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "أظهر تنبيها حين أبدل نمط التكرار/الخلط" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "أظهر تنبيها عند تغيير شدة الصوت" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "أظهر نافذة انبثاق من شريط التنبيهات" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "أظهر تنبيهات كلمنتاين" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "أظهر فوق شريط الحالة" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "أظهر جميع المقاطع" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "أظهر جميع المقاطع" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "أظهر الغلاف في المكتبة" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "أظهر الفواصل" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "أظهر الحجم الأصلي..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "أظهر المجموعات في نتائج البحث الشامل" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "أظهر في متصفح الملفات..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "أظهر في المكتبة..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "أظهر في فنانين متنوعين" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "أظهر عارضة المزاج" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "أظهر المقاطع المكررة فقط" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "أظهر المقطاع غير الموسومة فقط" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "أظهر اقتراحات البحث" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "أظهر زر \"حب\"" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "أظهر زر نقل معلومات الاستماع في النافذة الرئيسية" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "أظهر الأيقونة في شريط التنبيهات" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "أظهر المصادر المفعلة وغير المفعلة" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "أظهر/أخف" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "اخلط" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "اخلط الألبومات" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "اخلط الكل" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "اخلط قائمة التشغيل" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "اخلط مقاطع هذا الألبوم" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "تسجيل الدخول" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "تسجيل الخروج" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "تسجيل الدخول..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "فنانون مشابهون" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "الحجم" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "الحجم:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "تجاهل السابق في قائمة التشغيل" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "تخطى العد" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "تجاهل اللاحق في قائمة التشغيل" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "تجاوز المسارات المختارة" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "تجاوز المسار" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "غلاف ألبوم صغير" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "عارضة جانبية صغيرة" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "قائمة تشغيل ذكية" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "قوائم تشغيل ذكية" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "معلومات المقطع" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "معلومات المقطع" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "عفوا" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "رتب حسب النوع (ألفبائيا)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "رتب حسب النوع (حسب الشعبية)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "رتب حسب اسم المحطة" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "رتب المقاطع حسب" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "ترتيب" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "المصدر" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "المصادر" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "خطأ بتسجيل الدخول لـ Spotify" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "ملحق Spotify" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "ملحق Spotify غير مثبت." #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "قياسي" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "مميز" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "ابدء النسخ" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "ابدأ قئمة التشغيل اللتي تعمل حالياً" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "ابدأ التحويل" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "ابدأ بكتابة شيء ما في خانة البحث أعلاه لملء هذه اللائحة من النتائج" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "بدأ %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "بدأ..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "إيقاف" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "إيقاف بعد" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "أوقف بعد هذا المقطع" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "أوقف التشغيل" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "أوقف التشغيل بعد المقطع الحالي" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "أوقف التشغيل بعد المقطع: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "تم الايقاف" #: core/song.cpp:431 msgid "Stream" msgstr "المجرى" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "الاستماع للموسيقى من خادوم Subsonic يتطلب رخصة صالحة بعد انقضاء مدة 30 يوم التجريبية." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "عضوية الاستماع لتيارات الانترنت" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "المشتركون" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "نجاح!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "تم كتابة %1 بنجاح" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "وسوم مقترحة" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "ملخص" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "عالي جدا (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "عالي جدا (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "الصيغ المدعومة" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "زامن الإحصائيات مع الملفات الآن" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "مزامنة صندوق بريد Spotify" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "مزامنة قائمة تشغيل Spotify" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "مزامنة مقاطع Spotify المميزة" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "ألوان النظام" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "الألسنة فوق" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "جالب الوسوم" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "بدّل الصبيب" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "خيارات النص" #: ui/about.cpp:74 msgid "Thanks to" msgstr "الشكر لـ" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "تعذر تشغيل الأمر %1." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "غلاف ألبوم المقطع المشغل حاليا" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "المسار %1 غير صالح" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "يجب أن تكون القيمة الثانية أكبر من القيمة الأولى!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "الموقع الذي طلبته غير موجود!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "الموقع الذي طلبته ليس بصورة!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "لقد انتهت المدة التجريبية لخادم Subsonic. الرجاء التبرع للحصول على مفتاح رخصة. لمزيد من التفاصيل زر subsonic.org." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "إصدار كلمنتاين الذي حدثت إليه يتطلب القيام بفحص شامل للمكتبة من جديد لدعم ميزات الإصدار الجديدة المذكورة أسفله:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "هناك مقاطع أخرى في هذا الألبوم" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "حدث خطأ في الاتصال مع gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "واجه كلمنتاين مشاكل عند جلب المعلومات من Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "حدثت مشكلة أثناء القراءة من متجر iTunes" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "واجه كلمنتاين مشاكل عند نسخ بعض المقاطع. تعذر نسخ المقاطع التالية:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "واجه كلمنتاين مشاكل عند حذف بعض المقاطع. تعذر حذف المقاطع التالية:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "سيتم حذف هذه الملفات من الجهاز. هل أنت متأكد من رغبتك بالاستمرار؟" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "سيتم حذف هذه الملفات من القرص للأبد، هل تريد الاستمرار؟" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "سيتم فحص الملفات الصوتية الموجودة في هذه الملفات لإضافتها لمكتبتك" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "تستخدم هذه الإعدادات في نافذة \"تحويل الصوتيات\" وأثناء تحويل المقاطع قبل نسخها لجهاز ما." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "المستوى الثالث" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "سيترتب عن هذه العملية إنشاء قاعدة بيانات يمكن أن تصل لـ 150 ميجابايت.\nهل تريد الاستمرار رغم ذلك؟" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "هذا الألبوم غير متوفر بالصيغة المطلوبة" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "يجب وصل هذا الجهاز وفتحه قبل أن يتمكن كلمنتاين من معرفة الصيغ التي يدعمها" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "يدعم هذا الجهاز الصيغ التالية:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "لن يشتغل هذا الجهاز بصفة سليمة" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "هذا جهاز MTP، لكنك ثبت كلمنتاين دون دعم مكتبة libmtp." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "هذا جهاز آيبود، لكنك ثبت كلمنتاين دون دعم مكتبة libgpod." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "هذه أول مرة تقوم بوصل هذا الجهاز. سيعمل كلمنتاين الآن على فحص الجهاز للعثور على ملفات صوتية - هذا سيتطلب بعض الوقت، فكن صبورا!" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "يمكن تغيير هذه الخاصية من إعدادات \"السلوك\"" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "هذا التيار للاشتراكات المدفوعة فقط" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "هذا النوع من الأجهزة غير مدعوم: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "العنوان" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "اليوم" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "بدّل تنبيهات كلمنتاين" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "بدّل نمط ملء الشاشة" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "بدّل حالة لائحة الانتظار" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "بدّل حالة نقل المعلومات المستمع إليها" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "بدّل حالة الإظهار على الشاشة" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "غدا" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "إعادات توجيه كثيرة جدا" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "أفضل المقاطع" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "إجمالي الألبومات:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "إجمالي البايتات المرسلة" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "إجمالي طلبات الشبكة " #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "المقطوعة" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "المسارات" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "تحويل الصوتيات" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "سجل محول الصوتيات" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "تحويل الصوتيات" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "جاري تحويل %1 ملفات على %2 أشغال" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "إعدادات تحويل الصوتيات" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "إيقاف تشغيل" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "رابط(روابط)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Ultra wide band (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "تعذر تحميل %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "مجهول" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "نوع محتوى غير معروف" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "خطأ مجهول" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "ألغ الغلاف" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "إلغاء تجاوز المسارات المختارة" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "إلغاء تجاوز المسار" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "ألغ الاشتراك" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "الحفلات القادمة" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "تحديث" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "حدّث جميع البودكاست" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "حدّث المجلدات التي تغيرت في المكتبة" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "حدّث المكتبة عند بدء كلمنتاين" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "حدّث هذا البودكاست" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "جاري التحديث" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "جاري تحديث %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "جاري تحديث %1%" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "تحديث المكتبة" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "الإستخدام" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "استخدم وسم فنان الألبوم إن كان متوفرا" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "استخدم مفاتيح اختصارات جنوم" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "استخدم معلومات Replay Gain إن كانت متوفرة" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "استخدم SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "استخدم أداة التحكم عن بعد لـ Wii" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "استخدم تجميعة ألوان مخصصة" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "استخدم رسالة مخصصة للتنبيهات" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "استخدم شبكة تحكم عن بعد" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "استخدم الاستيثاق" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "استخدم محرك إدارة الصبيب" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "استخدم النمط الديناميكي" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "استخدم التنبيهات لإظهار حالة أداة التحكم عن بعد لـ Wii" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "استخدم نمط التغيير المؤقت للتشويش" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "استخدم إعدادات النظام الافتراضية" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "استخدم تجميعة ألوان النظام" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "استخدام إعدادات النظام للبروكسي" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "استخدم تسوية الصوت" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "مستعمل" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "واجهة المستخدم" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "اسم المستخدم" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "استخدام القائمة لإضافة مقطع سـ..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "معدل بت متغير" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "فنانون متنوعون" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "النسخة %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "عرض" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "نمط التأثيرات المرئية" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "التأثيرات المرئية" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "إعدادات التأثيرات المرئية" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "VK.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "تحديد نشاط الصوت" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "شدة الصوت %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "نبهني عند إغلاق لسان قائمة تشغيل" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "الموقع" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "الأسابيع" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "عند تشغيل كلمنتاين" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "أثناء البحث عن غلاف للألبوم سيبحث كلمنتاين في ملفات الصور التي تحتوي على أحد الكلمات التالية.\nإن تعذر العثور على أي نتيجة، سيتم استخدام الصورة الأكبر حجما في المجلد." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "عندما تكون القائمة فارغة..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "لما لا تجرب..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Wide band (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "أداة التحكم عن بعد لـ Wii %1: مفعلة" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "أداة التحكم عن بعد لـ Wii %1: متصلة" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "أداة التحكم عن بعد لـ Wii %1: بطارية في حالة حرجة (%2%)" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "أداة التحكم عن بعد لـ Wii %1: غير مفعلة" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "أداة التحكم عن بعد لـ Wii %1: غير متصلة" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: بطارية ضعيفة (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "بدون أغلفة:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "هل ترغب بنقل المقاطع الأخرى في هذا الألبوم لفئة فنانون متنوعون؟" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "هل ترغب بالقيام بفحص شامل الآن؟" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "أكتب جميع إحصائيات المقاطع في ملفات المقاطع" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "اسم مستخدم أو كلمة سر خاطئة." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "السنة" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "سنة - البوم" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "السنوات" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "أمس" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "أنت بصدد تحميل الألبومات التالية" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "أنت على وشك حذف %1 قوائم تشغيل من المفضلة، هل أنت متأكد من ذلك؟" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "أنت على وشك حذف قائمة تشغيل لا تنتمي لقوائم التشغيل المفضلة لديك: سيتم حذف قائمة التشغيل (لا يمكن التراجع عن هذه العملية).\nهل أنت متأكد من رغبتك بالاستمرار؟" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "أنت غير متصل." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "أنت متصل بصفتك %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "أنت متصل." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "يمكنك تغيير طريقة ترتيب المقاطع في المكتبة" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "يمكنك الاستماع للمقاطع دون إنشاء حساب، لكن من له حساب مميز يمكنه الاستماع للمقاطع بجودة أعلى ودون إشهارات." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "يمكنك الاستماع للمقاطع من Magnatude مجانا دون أي حساب. الحصول على عضوية يمكن من حذف الرسائل اخر كل مقطع." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "يمكنك الاستماع لتيارات في الخلفية في نفس الوقت الذي تستمع فيه لمقاطع أخرى." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "يمكنك استعمال أداة التحكم عن بعد لـ Wii كأداة تحكم عن بعد بكلمنتاين. شاهد هذه الصفحة في توثيق كلمنتاين لمزيد كم المعلومات.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "لا تملك حساب Spotify مدفوع." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "ليس لديك اشتراك مفعل" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "ليس عليك أن تسجل دخولك حتى تبحث وتستمع إلى SoundCloud. لكن إذا أردت دخول قوائم تشغيلك وسير نشاطك فإنه عليك أن تسجل الدخول." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "لقد تم تسجيل خروجك من Spotify، الرجاء إعادة إدخال كلمة السر في نافذة الإعدادات." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "لقد تم تسجيل خروجك من Spotify، الرجاء إعادة إدخال كلمة السر." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "هذا المقطع يعجبك" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "عليك أن تستخدم تفضيلات النظام وتمكن كليمينتين من \"التحكم في حاسوبك\" لتستخدم الاختصارات العامة في كليمينتين." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "سيتوجب عليك إعادة تشغيل كلمنتاين إذا غيرت اللغة." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "عنوان الايبي الخاص بك هو:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "بيانات التعريف الخاصة بحسابك على Last.fm خاطئة" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "بيانات التعريف الخاصة بحسابك على Magnatune خاطئة" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "مكتبتك فارغة!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "راديو تيارات الانترنت الخاصة بك" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr " نقل معلومات الاستماع: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "لا يتوفر نظامك على دعم OpenGL، لهذا التأثيرات المرئية غير متاحة." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "اسم المستخدم أو كلمة السر خاطئة." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "صفر" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "أضِف %n أغاني\\أغنية" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "بعد" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "خلت" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "و" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "تلقائي" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "قبل" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "بين" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "الأكبر أولا" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "يحتوي" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "غير مفعل" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "قرص %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "لا يحتوي" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "ينتهي بـ" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "يساوي" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "مجلد gpodder.net" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "أكبر من" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "أجهزة أيبود ووحدات USB لا تشتغل حاليا على ويندوز. نعتذر لذلك!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "من بين اخر المقاطع المشغلة" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "أقل من" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "الأطول أولا" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "انقل %n مقاطع" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "الأحدث أولا" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "لا يساوي" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "ليس من اخر المقاطع المشغلة" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "الغير مفعل" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "الأقدم أولا" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "مفعل" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "الخيارات" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "أو افحص شفرة QR" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "اضغط زر التأكيد" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "أزِل %n أغاني\\أغنية" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "الأقصر أولا" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "اخلط المقاطع" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "الأصغر أولا" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "رتب المقاطع" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "يبدأ بـ" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "إيقاف" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "المقطع %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/be.po000066400000000000000000005442261260417502300236420ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Aheyenka Dzmitry , 2014 # Fiodar Maroźka , 2012-2013 # FIRST AUTHOR , 2010 # Fiodar Maroźka , 2012 # Валерий Третьяк , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Belarusian (http://www.transifex.com/davidsansome/clementine/language/be/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: be\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "дзён" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " Кбіт/c" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " мс" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " пунктаў" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " с" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "кампазыцыі" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 альбом(аў)" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 дзён" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 дзён таму" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 на %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 плэйлістоў (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 абрана з" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 кампазыцыя" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 кампазыцый" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 кампазыцый знойдзена" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 кампазыцый знойдзена (паказана %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 трэкаў" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 перададзены" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: модуль Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 іншыx слухачоў" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 прайграваньняў увогуле" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n з памылкай" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n завершана" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n засталося" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Выраўнаць тэкст" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "Па &цэнтры" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Іншы" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "Пашырэньні" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Даведка" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&Схаваць %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Схаваць..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Зьлева" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "Музыка" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Няма" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "Плэйліст" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Выйсьці" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Рэжым паўтору" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Справа" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Рэжым мяшаньня" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Выраўнаць слупкі па памеры вакна" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Iнструмэнты" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(розны праз некалькі кампазыцый)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...і ўсім стваральнікам Amarok" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 дзень" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 кампазыцыя" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128к MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 выпадковых трэкаў" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Абнавіць да вэрсіі Premium" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

калі не праверана, Clementine будзе спрабаваць захоўваць вашыя ацэнкі і іншую статыстыку толькі ў асобныя базы дадзеных і ня будзе зьмяняць вашыя файлы.

Калі праверана, ён будзе захоўваць статыстыку разам у базу дадзеных і непасрэдна ў файл кожны раз калі яна зьмяняецца.

Калі ласка памятайце, што гэта можа не працаваць для кожнага фармату і, так як няма асобнага стандарту для гэтага, іншыя музычныя плэеры могуць не прачытаць яе." #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Палі пачынаюцца са знака %, напрыклад: %artist %album %title

\n

Калі вы абмежавалі частку тэкста фігурнымі дужкамі, то гэтая частка тэкста ня будзе бачная, калі значэньні палёў будуць пустымі

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Патрабуецца акаўнт Spotify Premium." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Кліент можа падключыцца толькі калі быў уведзены правільны код." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Смарт-плэйліст - гэта дынамічны сьпіс кампазыцый з Вашай бібліятэкі. Існуюць розныя тыпы смарт-плэйлістоў, якія прапануюць розныя спосабы выбару кампазыцый" #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Кампазыцыя будзе дададзеная ў плэйліст, калі адпавядае гэтым умовам." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z (А-Я)" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "УСЯ СЛАВА ГІПНАЖАБЕ!" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Адмена" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Пра %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Пра праграму Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Пра Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Дэталі акаўнта" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Дэталі акаўнта (вэрсія Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Дзеяньне" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Актываваць/дэактываваць Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Дадаць Подкаст" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Дадаць струменевае вяшчанне" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Дадаць новы радок, калі падтрымліваецца тыпам апавяшчэння" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Дадаць дзеяньне" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Дадаць іншае струменевае вяшчанне" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Дадаць каталёг" #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Дадаць файл" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Дадаць файл..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Дадаць файлы для перакадаваньня" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Дадаць каталёг" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Дадаць каталёг..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Дадаць новы каталёг..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Дадаць подкаст" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Дадаць подкаст..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Дадаць умову пошуку" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Дадаць тэг \"Альбом\"" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Дадаць тэг \"Выканаўца альбома\"" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Дадаць тэг \"Выканаўца\"" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Дадаць аўтападлік песень" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Дадаць тэг \"Кампазытар\"" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Дадаць тэг \"Дыск\"" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Дадаць імя файлу з кампазыцыяй" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Дадаць тэг \"Жанр\"" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Дадаць тэг \"Працягласьць\"" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Дадаць колькасць прайграваньняў" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Дадаць ацэнку песьні" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Дадаць колькасьць пропускаў" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Дадаць тэг \"Назва\"" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Дадаць тэг \"Нумар трэку\"" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Дадаць тэг \"Год\"" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Дадаць струмень..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Дадаць у іншы плэйліст" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Дадаць у плэйліст" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Дадаць у чаргу" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Дадаць дзеяньне wiimotedev" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Дадаць..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Дададзена за месяц" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Дададзена за тыдзень" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Дададзена за год" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Дададзена сёньня" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Дададзена за тры месяцы" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Пашыраная сартоўка" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Пасьля" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Пасьля капіяваньня..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Альбом" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Альбом (ідэальная гучнасьць для ўсіх трэкаў)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Выканаўца альбому" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Вокладка альбому" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Інфармацыя аб альбоме на jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Альбомы з вокладкамі" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Альбомы бяз вокладак" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Усе файлы (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Усе альбомы" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Усе выканаўцы" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Усе файлы (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Усе спісы прайгравання (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Усе перакладчыкі" #: library/library.cpp:98 msgid "All tracks" msgstr "Усе кампазіцыі" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Дазволіць mid/side кадаваньне" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Разам з арыгіналамі" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Заўсёды хаваць галоўнае акно" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Заўсёды паказваць галоўнае акно" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Заўсёды пачынаць прайграваньне" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Патрабуецца дадатковы плагін для выкарыстаньня Spotify у Clementine. Жадаеце спампаваць і ўсталяваць яго?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Адбылася памылка пры загрузке дадзеных iTunes" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Адбылася памылка пры запісе мэта-дадзеных в '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Адбылася невядомая памылка" #: ui/about.cpp:85 msgid "And:" msgstr "І:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Злы" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Зьнешні выгляд" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Дадаць файлы/URLs ў плэйліст" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Дадаць у бягучы плэйліст" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Дадаць у плэйліст" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Ужыць кампрэсію для прадухіленьня скажэнняў" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Вы сапраўды жадаеце выдаліць прэсэт \"%1\"?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Вы сапраўды жадаеце ачысьціць статыстыку гэтых песень?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Выканаўца" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Пра Артыста" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Тэгі выканаўцы" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Ініцыялы выканаўцы" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Фармат аўдыё" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Памылка аўтэнтыфікацыі" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Аутар" #: ui/about.cpp:68 msgid "Authors" msgstr "Аўтары" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Аўта" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Аўтаматычнае абнаўленьне" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Аўтаматычна адкрываць адзіночныя катэгорыі ў дрэве калекцыі" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Даступна" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Сярэдні бітрэйт" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Прыкладны памер выявы" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "Подкасты BBC" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Фонавыя гукі" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Колер фону" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Фонавая выява" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Празрыстасьць фону" #: core/database.cpp:648 msgid "Backing up database" msgstr "Рэзэрвнае капіяваньне базы дадзеных" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Балянс" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Аналізатар палосамі" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Стандартны блакітны" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Фармат аўдыёзапісаў" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Паводзіны" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Найлепшая" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Біяграфія з %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Бітрэйт" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Бітрэйт" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Аналізатар блёкамі" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Тып блёка" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Ступень размыцьця" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Зьмесьціва" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Пад'ём аналізатару" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Агляд..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Працяжнасьць буфэру" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Буфэрызацыя" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Гэтыя крыніцы адключаныя:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Клявішы" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Падтрымка CUE" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Адмена" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Абярыце вокладку" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Зьмяніць памер шрыфту..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Зьмяніць рэжым паўтарэньня" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Зьмяніць камбінацыю клявішаў..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Зьмяніць рэжым мяшаньня" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Зьмяніць мову" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Зьмяненьне наладаў прайграваньня мона падзейнічае з наступных кампазыцыяў" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Праверыць новыя выпускі" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Праверыць абнаўленьні..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Пазначце імя для смарт-плэйліста" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Выбраць аўтаматычна" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Абраць колер..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Абраць шрыфт" #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Выбар са сьпісу" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Выбраць, як плэйліст адсартаваны і колькі ў ім будзе песень." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Абраць каталёг для загрузкі подкастаў" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Выберыце сайт, які Clementine будзе выкарыстоўваць для пошуку тэкстаў песень." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Клясычная" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Ачыстка" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Ачысьціць" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Ачысьціць плэйліст" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Памылка Clementine" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Памаранчовы Clementine" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Візуалізацыя Clementine" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine можа аўтаматычна канвэртаваць музыку, якую капіруеце на гэтую прыладу ў фармат, які яна падтрымлівае." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine можа прайграваць музыку, загружаную на " #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine можа прайграваць музыку, якую вы загрузілі на Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine можа граць музыку на вашым Google Drive" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine можа паказваць паведамленьні пры зьмене дарожкі." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine можа сынхранізаваць вашыя падпіскі з іншымі кампутарамі й прылажэньнямі. Create an account." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine ня можа загрузіць якою-небудзь візуалізацыю projectM. Праверце, што ўсталявалі Clementine правільна." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Прагляд малюнкаў у Clementine" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine ня змог знайсьці вынікі па запыце для гэтака файлу" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine будзе шукаць тут:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Націсьніце тут, каб дадаць музыку" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Націсьніце для пераключэньня паміж часам, які застаецца і поўнай працягласьцю" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Націск на кнопку рэгістрацыі адкрые браўзэр. Вярніцеся ў Clementine пясьля рэгістрацыі і ўваходу." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Зачыніць" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Зачыніць плэйліст" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Зачыніць візуалізацыю" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Закрыцьцё гэтага вакна адменіць загрузку." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Закрыцьцё гэтага вакна спыніць пошук вокладак альбомаў." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Клюбны" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Колеры" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Падзелены коскамі сьпіс \"кляс:узровень\", дзе ўзровень ад 0 да 3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Камэнтар" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Аўтаматычна запоўніць тэгі" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Аўтаматычна запоўніць тэгі..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Кампазытар" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Наладзіць %1" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Наладзіць Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Камбінацыі клявішаў" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Наладзіць Spotify..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Наладзіць Subsonic..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Наладзіць глябальны пошук..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Наладзіць калекцыю..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Наладзіць подкасты..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Наладзіць..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Падключыць пульт Wii, выкарыстоўваючы актывацыю/дэактывацыю" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Падлучыць прыладу" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Падключэньне да Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Кансоль" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Пастаянны бітрэйт" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Канвэртаваць ўсю музыку" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Канвэртаваць ўсю музыку, якую можа прайграваць прылада." #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Скапіяваць у буфэр" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Капіяваць на прыладу..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Капіяваць у калекцыю..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Копірайт" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Немагчыма злучыцца з Subsonic, праверце URL. Прыклад: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Немагчыма стварыць элемент GStreamer \"%1\" - пераканайцеся, што ў вас усталяваныя ўсе неабходныя плагіны GStreamer" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Немагчыма знайсці мультыплексар для %1. Пераканайцеся, што ў вас усталяваныя неабходныя плагіны GStreamer." #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Немагчыма знайсці кадавальнік для %1, праверце, што ўсталяваныя ўсе неабходныя плагіны GStreamer" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Немагчыма адкрыць выходны файл %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Мэнэджэр вокладак" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Вокладка са ўбудаванай выявы" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Вокладка загружаная аўтаматычна з %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Вокладка самастойна адключаная" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Вокладка не заданая" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Вокладка заданая з %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Вокладкі з %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Кросфэйд пры аўтаматычнай зьмене трэку" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Кросфэйд пры ручной змене трэку" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Карыстальніцкі" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Карыстальніцкая выява:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Налады паведамленьня" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Карыстальніцкі..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "DBus path" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Танцавальны" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "База дадзеных пашкоджаная. Калі ласка прачытайце https://code.google.com/p/clementine-player/wiki/DatabaseCorruption для інструкцыяў па аднаўленьню." #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Дата стварэньня" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Дата зьмены" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Дзень (дня, дзён)" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "Па &змоўчаньні" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Паменьшыць гучнасьць на 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Памяншаць гучнасьць на адсоткаў" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Паменьшыць гучнасьць" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Карыстальніцкая выява па-змоўчаньні:" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Па змоўчаньні" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Затрымка паміж візуалізацыямі" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Выдаліць" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Выдаліць спампаваныя дадзеныя" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Выдаліць файлы" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Выдаліць з прылады" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Выдаліць з дыску..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Выдаліць праслуханыя выпускі" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Выдаліць прэсэт" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Выдаліць смарт-плэйліст" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Выдаліць арыгінальныя файлы" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Выдаленьне файлаў" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Прыбраць з чаргі абраныя трэкі" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Прыбраць трэк з чаргі " #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Назначэньне" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Падрабязнасьці..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Прылада" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Уласьцівасьці прылады" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Імя прылады" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Уласьцівасьці прылады..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Прылады" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Магчыма, вы мелі на ўвазе" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Пароль" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Імя карыстальніка" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Простае Інтэрнэт злучэньне" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Каталёг" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Адключыць працягласьць" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Выключыць генэрацыю панэлі настрою" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Дыск" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Бесперапынная перадача" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Налады адлюстраваньня" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Паказваць экраннае апавяшчэньне" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Перасканаваць бібліятэку" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Не канвэртаваць ніякую музыку" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Не перазапісваць" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Не паўтараць" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Не паказваць у \"Розных выканаўцах\"" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Ня зьмешваць" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Не спыняць!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Ахвяраваць" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Двайная пстрычка для адкрыцьця" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Двайны клік на песьні" #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Спампаваць %n сэрыяў" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Каталёг загрузак" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Спампаваць сэрыі ў" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "\"Download\" падпіска" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Пампаваць новыя выпускі аўтаматычна" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Запампоўка даданая ў чаргу" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Загрузіць гэты альбом" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Спампаваць гэты альбом..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Спампаваць гэтую сэрыю" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Спампаваць..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Пампаваньне (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Запампоўка дырэкторыі lcecast" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Запампоўка каталёга Jamendo" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Спампаваць каталог Magnatune" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Запампоўка плагіна Spotify" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Запампоўка мэтададзеных" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Цягнеце для перамяшчэння" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Дынамічны рэжым уключаны" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Выпадковы дынамічны мікс" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Рэдагаваць смарт-плэйліст" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Рэдагаваць тэг..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Рэдагаваць тэгі" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Рэдагаваньне інфарамацыі аб кампазыцыі" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Рэдагаваць інфармацыю аб кампазыцыі..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Рэдагаваць інфармацыю аб кампазыцыях..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Рэдагаваць..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Уключыць падтрымку Wii Remote" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Задзейнічаць эквалайзэр" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Задзейнічаць камбінацыі толькі ў вакне праграмы" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Уключыць пералічаныя ніжэй крыніцы, каб уключыць іх у вынікі пошуку. Вынікі будуць адлюстраваныя ў гэтым парадку." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Уключыць/выключыць скроблінг Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Складанасьць кадаваньня" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Якасьць кадаваньня" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Рэжым кадаваньня" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Уведзьце URL" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Уведзьце URL для пампаваньня вокладки з Інтэрнэту" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Уведзьце імя файла для экспартаванае вокладкі (без пашырэньня)" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Уведзьце новае імя для гэтага плэйлісту" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Уведзьце ключавыя словы для пошуку музыкі на кампутары і ў інтэрнэце" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Уведзьце ключавыя словы для пошуку ў iTunes Store" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Уведзьце ключавыя словы для пошуку ў gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Пошук..." #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Уведзьце адрас радыёпатоку:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Уведзьце імя тэчкі" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Уведзьце гэты IP у Прыкладаньні для падлучэньня да Clementine." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Уся калекцыя" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Эквалайзэр" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Аналягічна --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Аналягічна --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Памылка" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Памылка падлучэньня да прылады MTP" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Памылка капіяваньня песень" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Памылка выдаленьня песень" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Памылка запампоўкі плагіна Spotify" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Памылка загрузкі %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Памылка пры загрузке плэйлісту di.fm" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Памылка пры апрацоўке %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Памылка пры загрузке Аўдыё CD" #: library/library.cpp:68 msgid "Ever played" msgstr "Прайграных хоць калі" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Кожныя 10 хвілінаў" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Кожныя 12 гадзін" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Кожныя 2 гадзіны" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Кожныя 20 хвілінаў" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Кожныя 30 хвілінаў" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Кожныя 6 гадзінаў" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Кожную гадзіну" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Акрамя трэкаў з аднаго й таго ж альбому ці CUE-файлу" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Існыя вокладкі" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Разгарнуць" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Тэрмін дзеяньня мінае %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Экспартаваць Вокладкі" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Экспартаваць вокладкі" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Экспартаваць спампаваныя вокладкі" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Экспартаваньне скончана" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Экспартавана %1 вокладак(кі) з %2 (%3 прапушчана)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Плаўная паўза / працяг" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Згасаць пры спыненьні прайграваньня" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Згасаньне" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Працягласьць згасаньня" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Памылка атрыманьне каталёгу" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Памылка атрыманьня подкастаў" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Памылка загрузкі подкастаў" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Памылка разбору XML у дадзенай RSS падпісцы" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Хутка" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Улюбёныя трэкі" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Запоўнiць пустыя вокладкi" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Выбіраць аўтаматычна" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Дадзеныя атрыманыя" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Складаньне бібліятэкі Subsonic" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Памылка пошуку вокладкі" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Пашырэньне файлу" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Фарматы файлаў" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Імя файла" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Імя файла (без указаньня шляху)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Памер файлу" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Тып файлу" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Имя файлу" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Файлы" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Файлы для перакадаваньня" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Знайсьці песьні ў вашай бібліятэцы, якія адпавядаюць пазначаным" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Дактыласкапаваньне песьні" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Гатова" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Першы ўзровень" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Памер шрыфту" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Праз ліцэнзыйныя згаджэньні падтрымка Spotify рэалізаваная ў выглядзе асобнага плагіну" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Прымусовае кадаваньне ў мона" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Забыць прыладу" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Калі выбраць \"Забыць прыладу\", то яна будзе выдаленая з гэтага сьпісу й Clementine пераскануе ўсе песьні на ім пры наступным падлучэньні." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Форма" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Фармат" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Чашчыня кадраў" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Фрэймаў на буфэр" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Зьмерзлы" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Full Bass" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Full Bass + Treble" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Full Treble" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Агульныя" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Агульныя налады" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Жанр" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Атрыманьне каналаў" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Атрыманьне струменяў" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Даць імя:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Перайсьці" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Перайсьці да наступнага сьпісу прайграваньня" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Перайсьці да папярэдняга сьпісу прайграваньня" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Атрымана %1 вокладак з %2 (%3 атрымаць не ўдалося)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Адзначаць шэрым няісныя песьні ў плэйлістах" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Сартаваць Бібліятэку па..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Згрупаваць па" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Сартаваць па Альбом" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Сартаваць па Выканаўца" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Сартаваць па Выканаўца/Альбом" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Сартаваць па Выканаўца/Год - Альбом" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Сартаваць па Жанр/Альбом" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Сартаваць па Жанр/Выканаўца/Альбом" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Групаваньне" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "HTML-старонка не зьмяшчае RSS-падпісак" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "HTTP проксі" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Шчасьлівы" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Інфармацыя пра абсталяваньне." #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Інфармацыя пра абсталяваньне даступная толькі калі прылада падключаная" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Высокі" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Высокі (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Высокая (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Гадзін(ы)" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Гіпнажаба" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "У мяне няма акаўнту Magnatune" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Іконка" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Іконкі ўверсе" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Вызначэньне песьні" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Калі працягваць, то прылада будзе працаваць павольна й капіяваньне кампазыцый на яго можа не працаваць" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Калі вы ведаеце URL подкасту, уведзьце яго сюды і націсьніце Go." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Ігнараваць \"The\" ў імені выканаўцы" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Выявы (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Выявы (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "Праз %1 дзён (дні)" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "Праз %1 тыдняў (тыдні)" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "У дынамічнам рэжыме новыя трэкі выбіраюцца й дадаюцца ў сьпіс прайграваньня кожны раз, калі зьвяршаецца чарговая песьня." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Уваходныя" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Уключыць вокладку ў апавяшчэньні" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Уключыць усе песьні" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Несумяшчальная вэрсія пратаколу Subsonic REST. Трэба абнавіць кліент." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Несумяшчальная вэрсія пратаколу Subsonic REST. Трэба абнавіць сэрвэр." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Павялічыць гучнасьць на 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Павялічваць гучнасьць на адсоткаў" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Павялічыць гучнасьць" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Індэксуем %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Сьведкі" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Устаўка" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Усталявана" #: core/database.cpp:585 msgid "Integrity check" msgstr "Праверка цельнасьці" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Інтэрнэт" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Інтрэрнэт правайдэры" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Нявправільны ключ API" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Няверны фармат" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Няправільны мэтад" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Няверныя парамэтры" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Няправільна ўказаная крыніца" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Няправільная служба" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Няправільны ключ сэсіі" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Найчасьцей праслуханыя трэкі на Jamendo" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Самыя папулярныя трэкі на Jamendo" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Лепшыя трэкі месяца на Jamendo" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Самыя папулярныя трэкі тыдня на Jamendo" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "База Jamendo" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Перайсьці да бягучага трэку" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Адлюстроўваць кнопкі на працягу %1 сэкунд..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Адлюстроўваць кнопкі на працягу %1 сэкунды..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Працягваць працу ў фонавым рэжыме, калі вакно зачыненае" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Захаваць арыгінальныя файлы" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Мова" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Ноўтбук/навушнікі" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Вялікі карыдор" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Вялікая вокладка альбому" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Шырокая бакавая панэль" #: library/library.cpp:80 msgid "Last played" msgstr "Апошняе праслуханае" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm у дадзены момант заняты, паспрабуйце праз некаторы час" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Пароль Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Колькасьць праслухоўваньняў на Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Last.fm тэгі" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Логін Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Найменш улюбёныя трэкі" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Левы" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Працягласьць" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Бібліятэка" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Пашыраная сартоўка калекцыі" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Апавяшчэньне сканіраваньня бібліятэкі" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Пошук па бібліятэцы" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Абмежаваньні" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Загрузіць" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Загрузка вокладкі па спасылцы" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Загрузіць вокладку з URL..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Загрузіць вокладку з дыску" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Загрузіць вокладку з дыску..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Загрузіць плэйліст" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Загрузіць плэйліст..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Загрузка прылады MTP" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Загрузка базы дадзеных iPod" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Загрузка смарт-плэйлісту" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Загрузка песень" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Загрузка струменю" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Загрузка трэкаў" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Загрузка інфармацыі пра трэк" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Загрузка..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Загрузіць файлы/URLs, замяняючы бягучы плэйліст" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Уваход" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Памылка ўваходу" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Профіль Long term prediction (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Упадабаць" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Нізкі (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Нізкая (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Профіль нізкай складанасьці (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Тэксты песень" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Тэкст песьні з %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Загрузка Magnatune" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Загрузка Magnatune скончаная" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Асноўны профіль (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Да будзе так!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Зрабіць плэйліст даступным офлайн" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Няправільны адказ" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Ручная наладка проксі" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Самастойна" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Вытворца" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Пазначыць як праслуханае" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Пазначыць як новае" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Супадае з кожнай умовай пошуку (І)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Супадае з адным ці некалькімі ўмовамі (ЦІ)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Максымальны бітрэйт" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Сярэдні (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Сярэдняе (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Тып падпіскі" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Мінімальны бітрэйт" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Прапушчаныя ўсталёўкі projectM" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Мадэль" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Сачыць за зьменамі бібліятэкі" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Прайграваньне мона" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Месяцаў" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Настрой" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Стыль панэлі настрою" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Панэлі Настрою" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "Найчасьцей праслуханае" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Пункт мантаваньня" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Пункты мантаваньня" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Перамясьціць долу" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Перамясьціць у бібліятэку" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Перамясьціць вышэй" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Музыка" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Музычная Бібліятэка" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Бязгучна" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Мая Музыка" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Мае Рэкамэндацыі" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Імя" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Налады называньня" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Вузкая паласа прапусканьня (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Сеціўная проксі-служба" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Сеткавае кіраваньне" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Ніколі" #: library/library.cpp:74 msgid "Never played" msgstr "Ніколі не праслухоўвалася" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Ніколі не пачынаць прайграваць" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Новая тэчка" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Новы плэйліст" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Новы смарт-плэйліст..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Новыя песьні" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Новыя трэкі будуць даданыя аўтаматычна" #: library/library.cpp:92 msgid "Newest tracks" msgstr "Новыя трэкі" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Далей" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Наступны трэк" #: core/utilities.cpp:151 msgid "Next week" msgstr "На наступным тыдні" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Без аналізатару" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Няма фонавай выявы" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Няма вокладак для экспартаваньня." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Бяз доўгіх блёкаў" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Супадзеньняў ня знойдзена. Ачысьціце радок пошуку, каб зноў убачыць плэйліст." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Без кароткіх блёкаў" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Нічога" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Ніводная з абраных песень ня будзе скапіяваная на прыладу" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Звычайны" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Нармальны тып блёкаў" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Не даступныя пры выкарыстаньні дынамічных плэйлістоў" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Не падключана" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Нестае зьместу" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Нестае фанаў" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Нестае ўдзельнікаў" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Нестае суседзяў" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Не ўсталявана" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Ня быў выкананы логін" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Не падключана. Зрабіце двайны пстрык мышшу для падключэньня." #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Тып апавяшчэньня" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Апавяшчэньні" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Зараз грае" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Перадагляд OSD" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Дапускаць злучэньні толькі ад кліентаў з ip наступных абсягаў:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Паказваць толькі першы" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Непразрыстасьць" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Адчыніць %1 у браўзэры" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Адкрыць аўдыё CD..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Адкрыць файл OPML" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Адкрыць файл OPML..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Адкрыць прыладу" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Адкрыць файл..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Адчыніць у Google Drive" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Адкрыць у новым плэйлісьце" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Адкрыць" #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Апэрацыя не ўдалася" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Аптымізаваць па бітрэйце" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Аптымізаваць па якасьці" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Опцыі..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Упарадкаваць файлы" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Упарадкаваць файлы..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Арганізацыя файлаў" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Першапачатковыя тэгі" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Іншыя налады" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Вывадная прылада" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Опцыі вываду" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Перазапісаць усё" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Перазапісаць існыя файлы" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Перазапісаць толькі меньшыя:" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Уладальнік" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Аналіз каталога Jamendo" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Party" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Пароль" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Прыпыніць" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Прыпыніць прайграваньне" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Прыпынены" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Нармальная бакавая панэль" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Прайграць" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Колькасць прайграваньняў" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Прайграць калі спынена, прыпыніць калі прайграваецца" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Прайграць, калі яшчэ нічога не прайграваецца" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Прайграць кампазыцыю ў плэйлісьце" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Граць/Прыпыніць" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Прайграваньне" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Налады плэеру" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Плэйліст" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Плэйліст скончыўся" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Налады плэйлісту" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Тып плэйлісту" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Плэйлісты" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Зачыніце браўзэр і вяпніцеся ў Clementine." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Статус плагіну:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Подкасты" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Працягласьць усплываючага паведамленьня" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Порт" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Прадузмацненьне" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Налады" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Налады..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Пераважныя імёны файлаў вокладак (раздзеленыя коскамі)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Пераважны аўдыё фармат" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Пераважны бітрэйт" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Пераважны фармат" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Прэміум аўдыё" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Профіль:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Націсьніце камбінацыю клявішаў" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Націсьніце клявішу" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Нажміце камбінацыю клявішаў для %1..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Парамэтры OSD" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Перадагляд" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Папярэдні" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Папярэдні трэк" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Вывесьці інфармацыю аб вэрсіі" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Профіль" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Прагрэс" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Націсьніце на кнопку пульта Wii" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Раськідаць песьні ў выпадковым парадку" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Апытваньне прылады..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Мэнэджэр Чаргі" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Дадаць абраныя трэкі ў чаргу" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Дадаць у чаргу" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Радыё (аднолькавая гучнасьць для ўсіх трэкаў)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Дождж" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Выпадковая візуалізацыя" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Ацаніць бягучую кампазыцыю ў 0 зорак" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Ацаніць бягучую кампазыцыю ў 1 зорку" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Ацаніць бягучую кампазыцыю ў 2 зоркі" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Ацаніць бягучую кампазыцыю ў 3 зоркі" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Ацаніць бягучую кампазыцыю ў 4 зоркі" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Ацаніць бягучую кампазыцыю ў 5 зорак" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Рэйтынг" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Ці сапраўды адмяніць?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Абнавіць каталёг" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Абнавіць каналы" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Абнавіць сьпіс станцый" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Абнавіць струмені" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Запомніць рух пульта Wii" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Запомніць апошняе" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Выдаліць" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Выдаліць дзеяньне" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Прыбраць паўторы з плэйлісту" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Прыбраць каталёг" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Прыбраць з Маёй Музыкі" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Прыбраць з плэйлісту" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Выдаліць плэйлісты" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Пераназваць плэйліст" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Пераназваць плэйліст..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Перанумараваць трэкі ў такім парадку..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Паўтараць" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Паўтараць альбом" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Паўтараць плэйліст" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Паўтараць трэк" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Замяніць бягучы плэйліст" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Замяніць плэйліст" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Замяняць прагалы падкрэсьліваньнем" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Рэжым Replay Gain" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Перазапоўніць" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Ськід" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Ськінуць лічыльнікі прайграваньня" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Абмежаваць толькі сымбалямі ASCII" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Працягваць прайграваньне пры запуску" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Вярнуцца ў Clementine." #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Правы" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Запусьцiць" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "SOCKS проксі" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Бясьпечна выняць прыладу" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Бясьпечна выняць прыладу пасьля капіяваньня" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Чашчыня" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Чашчыня дыскрэтызацыі" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Захаваць файлы .mood у музычную бібліятэку" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Такая ж вокладка альбому" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Захаваць вокладку на дыск..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Захаваць выяву" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Захаваць плэйліст..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Захаваць профіль" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Захоўваць ацэнкі ў тэгах файлаў, калі магчыма" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Захоўваць статыстыку ў тэгах файлаў, калі магчыма" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Захаваць гэты струмень ў закладцы Інтэрнэт" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Захаваньне статыстыкі песень у файлы" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Захоўваньне трэкаў" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Профіль Scalable sampling rate (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Лік" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Скробліць трэкі, якія я слухаю" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Пошук" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Шукаць станцыі Icecast" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Шукаць у Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Шукаць на Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Пошук " #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Шукаць вокладкі альбомаў..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Пошук усяго" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Шукаць на gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Пошук у iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Рэжым пошуку" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Парамэтры пошуку" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Вынікі пошуку" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Умовы пошуку" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Другі ўзровень" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Перамотка назад" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Перамотка наперад" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Крыху пераматаць быгучы трэк" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Пераматаць бягучы трэк на абсалютную пазыцыю" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Абраць усё" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Адмяніць выбар" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Абярыце колер фону:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Абрацт фонавую выяву" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Выбраць самыя пасуючыя вынікі" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Абярыце колер:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Выбраць візуалізацыі" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Выбраць візуалізацыі..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Сэрыйны нумар" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "URL Сэрвэру" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Дэталі сэрвэру" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Служба не працуе" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Усталяваць %1 у \"%2\"..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Усталяваць гучнасьць у адсоткаў" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Усталяваць значэньне для вызначаных трэкаў..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Камбінацыя клявішаў" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Камбінацыя клявішаў для %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Камбінацыя клявішаў для %1 ужо існуе" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Паказаць" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Паказваць OSD" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Падсьвечваць бягучы трэк" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Паказваць панэль настрою ў радку прагрэсу" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Паказваць сыстэмныя апавяшчэньні" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Паказваць апавяшчэньне пры зьмене рэжыму паўтору/мяшаньня" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Паказваць апавяшчэньне пры зьмене гучнасьці" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Паказваць усплываючыя паведамленьні" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Паказваць OSD" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Паказаць над радком стану" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Паказаць усе кампазыцыі" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Паказаць усе песьні" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Паказваць вокладкі ў бібліятэцы" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Паказваць падзяляльнікі" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Паказаць поўны памер..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Паказаць ў аглядчыку файлаў" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Паказаць ў \"Розных выканаўцах\"" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Паказаць панэль настрою" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Паказваць толькі дубляваныя" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Паказваць толькі бяз тэгаў" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Паказаць пошукавыя падказкі" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Паказваць кнопку скроблінгу ў галоўным вакне" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Паказаць значок у латку" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Паказаць якія крыніцы ўключаны і адключаны" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Паказаць/Схаваць" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Перамяшаць" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Перамяшаць альбомы" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Перамяшаць усё" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Перамяшаць плэйліст" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Перамяшаць трэкі ў гэтым альбоме" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Уваход" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Выйсьці" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Адбываецца ўваход..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Падобныя выканаўцы" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Памер" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Памер:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Перамясьціць назад у плэйлісьце" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Прапусьціць падлік" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Перамясьціць наперад ў плэйлісьце" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Маленькая вокладка альбому" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Вузкая бакавая панэль" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Смарт-плэйліст" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Смарт-плэйлісты" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Інфармацыя аб кампазыцыі" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Пра Песьню" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Санаграма" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Прабачце" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Сартаваць па жанры (ў альфабэтным парадку)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Сартаваць па стылю (па папулярнасьці)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Сартаваць па назве станцыі" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Сартаваць песьні па" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Сартаваць" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Крыніца" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Крыніцы" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Памылка логіну Spotify" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Плагін Spotify" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Плагін Spotify не ўсталяваны" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Стандартны" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Ацэненыя" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Запусьціць бягучы плэйліст" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Пачаць перакадаваньне" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Пачніце друкаваць штосьці ў пошукавым радку" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Запуск %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Запуск..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Спыніць" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Спыніць пасьля" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Спыніць пасьля гэтага трэку" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Спыніць прайграваньне" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Спыніць прайграваньне пасьля бягучага трэку" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Спынена" #: core/song.cpp:431 msgid "Stream" msgstr "Струмень" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Праслухоўваньне з сэрвэру Subsonic патрабуе сапраўдную ліцэнзію пясьля 30-дзённага пробнага пэрыяду." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "\"Streaming\" падпіска" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Падпісанты" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Пасьпяхова!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "Пасьпяхова запісанае %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Прапанаваныя тэгі" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Зводка" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Звышвысокі (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Вельмі высокая (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Падтрыманыя фарматы" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Сынхранізацыя ўваходных Spotify" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Сынхранізацыя плэйлістоў Spotify" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Сынхранізацыя рэйтынгавых трэкаў Spotify" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Сыстэмныя колеры" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Укладкі ўверсе" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Зьбіральнік тэгаў" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Мэтавы бітрэйт" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Уласьцівасьці тэксту" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Дзякуй" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Каманда \"%1\" ня можа быць выкананая." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Вокладка альбому бягучае кампазыцыі" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "Каталёг %1 няправільны" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "Другое значэньне павінна быць большым за першае!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Запытаны вамі сайт не існуе!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Запытаная вамі спасылка не зьяўляецца выявай!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Скончыўся пробны пэрыяд сэрвэру Subsonic. Калі ласка заплаціце каб атрымаць ліцэнзыйны ключ. Наведайце subsonic.org для падрабязнасьцяў." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Абноўленая вэрсія Clementine патрабуе паўторнага сканіраваньня бібліятэкі з-за асаблівасьцяў, пералічаных ніжэй:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "У альбоме прысутнічаюць іншыя песьні" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Праблема сувязі з gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Праблема атрыманьня мэтададзеных з Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Праблема разбору адказу ад iTunes Store" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Падчас капіяваньня некаторых кампазыцый узьніклі праблемы. Наступныя файлы ня могуць быць скапіяваныя:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Падчас выдаленьня некаторых кампазыцый узьніклі праблемы. Наступныя файлы ня могуць быць выдаленыя:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Гэтыя файлы будуць выдаленыя з прылады, вы дакладна жадаеце працягнуць?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Гэтыя каталёгі будуць прасканіраваныя, каб пабудаваць вашую бібліятэку." #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Гэтыя налады выкарыстоўваюцца ў дыялёгу \"Перакадаваньне музыкі\" і пры канвэртацыі музыкі перад капіяваньнем на прыладу." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Трэці ўзровень" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Гэтае дзеяньне створыць базу дадзеных, якая можа займаць больш за 150МБ.\nЦі працягнуць?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Гэты альбом не даступны ў патрабаваным фармаце" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Прылада павінна быць падключаная і адчыненая перад тым, як Clementine вызначыць, які фармат яна падтрымлівае." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Гэтая прылада падтрымлівае наступныя фарматы:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Гэтая прылада ня будзе працаваць правільна" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Гэта MTP прылада, а вашая вэрсія Clementine скампіляваная без падтрымкі libmtp." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Гэта iPod, а вашая вэрсія Clementine скампіляваная без падтрымкі libgpod." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Гэта першы раз, калі вы падключылі прыладу. Clementine прасканіруе прыладу для атрыманьня музычных файлаў - гэта можа заняць нейкі час." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Гэты струмень толькі для платных падпісантаў" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Гэты тып прылады не падтрымліваецца: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Назва" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Сёньня" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Уключыць" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Укл/Выкл поўнаэкранны рэжым" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Пераключыць стан чаргі" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Укл/Выкл скроблінг" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Паказаць/Скрыць экраннае апавяшчэньне" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Заўтра" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Занадта шмат перанакіраваньняў" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Самыя папулярныя" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Перадана байтаў увогуле" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Выканана сеткавых запытаў увогуле" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Трэк" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Перакадаваньне Музыкі" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Лог Перакадоўшчыку" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Перакадоўка" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Перакадавана %1 файлаў, выкарыстоўваючы %2 тэм" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Парамэтры перакадоўкі" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Турбіна" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Выключыць" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URI(s)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Ультрашырокая паласа прапусканьня (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Немагчыма спампаваць %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Невядомы" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Невядомы тып кантэнту" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Невядомая памылка" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Выдаліць вокладку" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Адпісацца" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Канцэрты, якія маюць адбыцца" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Абнавіць усе подкасты" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Абнавіць зьмененыя тэчкі бібліятэкі" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Абнаўляць бібліятэку пры старце Clementine" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Абнавіць гэты подкаст" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Абнаўленьне" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Абнаўленьне %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Абнаўленьне %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Абнаўленьне бібліятэкі" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Выкарыстаньне" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Выкарыстоўваць тэг Выканаўца Альбому калі магчыма" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Выкарыстоуваць камбінацыі клявішаў Gnome" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Выкарыстоўваць мэтададзеныя Replay Gain, калі гэта магчыма" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Выкарыстоўваць пульт Wii" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Выкарыстоўваць карыстальніцкія колеры" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Выкарыстоўваць уласнае апавяшчэньне" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Выкарыстоўваць аўтэнтыфікацыю" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Выкарыстоўваць рухавічок кіраваньня бітрэйтам" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Выкарыстоўваць дынамічны рэжым" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Паказваць апавяшчэньні аб статусе пульту Wii" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Выкарыстоўваць часавое зглажваньне шумоў" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Выкарыстоўваць сыстэмныя змоўчаньні" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Выкарыстоўвауць сыстэмныя колеры" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Выкарыстоўваць сыстэмныя налады проксі" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Выкарыстоўваць выраўнаваньне гучнасьці" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Скарыстана" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Інтэрфэйс" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Імя карыстальніку" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Выкарыстаньне мэню для даданьня песьні..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Пераменны бітрэйт" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Розныя выканаўцы" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Вэрсія %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Прагляд" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Рэжым візуалізацыі" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Візуалізацыі" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Налады візуалізацыі" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Вызначэньне голасу" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Гучнасьць %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Вэб-сайт" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Тыдняў" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Падчас запуску Clementine" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Пры пошуку вокладак альбомаў Clementine будзе спачатку шукаць файлы выяў, якія зьмяшчаюць адно з гэтых словаў.\nПры адсутнасьці супадзеньняў ён будзе выкарыстоўваць найбольшую выяву ў каталёгу." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Калі сьпіс пусты..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Чаму б не паспрабаваць..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Шырокая паласа прапусканьня (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: актываваны" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Пульт Wii Remote %1: злучаны" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Пульт Wii Remote %1: крытычны ўзровень зарада батарэі (%2%)" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Пульт Wii Remote %1: дэактываваны" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Пульт Wii Remote %1: адлучаны" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Пульт Wii Remote %1: нізкі зарад батарэі (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Бяз вокладкі:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Перасунуць іншыя песьні з гэтага альбому ў Розныя Выканаўцы?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Ці жадаеце запусьціць паўторнае сканіраваньне?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Запісваць усю статыстыку песень ў іх файлы" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Няправільнае імя ці пароль." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Год" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Год - Альбом" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Годы" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Учора" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Вы зьбіраецеся спампаваць наступныя альбомы" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Вы не ўвайшлі." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Вы ўвайшлі як %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Вы ўвайшлі ў сыстэму." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Вы можаце абраць спосаб сартоўкі кампазыцый ў бібліятэцы." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Вы можаце свабодна слухаць музыку без рэгістрацыі, але чальцы Premium акаўнтаў могуць слухаць струмені ў лепшай якасьці без рэклямы." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Вы можаце слухаць песьні з Magnatune свабодна без рэгістрацыі. Рэгістрацыя прыбірае паведамленьні ў канцы кожнага трэку." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Вы можаце слухаць фонавыя гукі адначасова з іншай музыкай." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Вы можаце выкарыстоўваць пульт Wii для дыстанцыйнага кіраваньня Clementine. Глядзі разьдзел на wiki-старонцы Clementime для падрабнейшай инфармацыі.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Вы ня маеце акаунту Spotify Premium" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Вы ня маеце актыўнае падпіскі" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Падлучэньне да сэрвісу Spotify было разарванае, уведзьце ваш пароль яшчэ раз у дыялёге Налады." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Падлучэньне да сэрвісу Spotify было разарванае, уведзьце ваш пароль яшчэ раз." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Вы ўпадабалі гэты трэк" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Пасьля зьмены мовы патрабуецца перазапуск Clementine." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Вашая IP адрэса:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Вашыя дадзеныя Last.fm некарэктныя" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Вашыя дадзеныя Magnatune некарэктныя" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Вашая бібліятэка пустая!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Вашыя струмені радыё" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Вашыя скроблінгі: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Адсутнічае падтрымка OpenGL у сыстэме, візуалізацыі недаступныя." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Імя карыстальніка ці пароль няправільныя." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A(Я-А)" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Па-змоўчаньні" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "дадаць %n кампазыцыяў" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "пасьля" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "таму" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "і" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "аўтаматычна" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "да" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "паміж" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "спачатку найбольшыя" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "зьмяшчае" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "адключаны" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "дыск %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "не зьмяшчае" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "завяршаецца на" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "раўняецца" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "Каталёг gpodder.net" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "болей за" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "у апошнія" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "кбіт/с" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "менш за" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "спачатку найдаўжэйшыя" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "перасунуць %n кампазыцый" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "спачатку найноўшыя" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "ня роўна" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "не ў апошнія" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "выключана" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "спачатку найстарэйшыя" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "на" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "налады" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "націсьніце \"enter\"" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "выдаліць %n кампазыцый" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "спачатку найкарацейшыя" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "Перамяшаць кампазыцыі" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "спачатку найменьшыя" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "сартаваць кампазыцыі" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "пачынаецца на" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "Спыніць" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "трэк %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/bg.po000066400000000000000000006040421260417502300236350ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # arnaudbienner , 2011 # albertvision , 2012 # FIRST AUTHOR , 2010 # Ivailo Monev , 2014 # Kiril Kirilov , 2013 # mijiturka, 2014-2015 # svetlisashkov , 2012 # mandarinki , 2011 # Valentin Laskov , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Bulgarian (http://www.transifex.com/davidsansome/clementine/language/bg/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bg\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nМожете да добавите списъци с песни в любими като щракнете на звездичката до името на списъка с песни.\n\nЛюбимите плейлисти ще бъдат запазени тук" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " дни" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " кбита/сек" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " точки" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " секунди" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " песни" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 песни)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 албума" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 дни" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "Преди %1 дни" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 на %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 списъци с песни (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 избрани от" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 песен" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 песни" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 намерени песни" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 намерени песни (%2 показани)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 песни" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 прехвърлени" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1:Wiimotedev модул" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 други слушатели" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 прослушвания общо" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n неуспешно" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n завършено" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n оставащо" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Подравни текста" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Център" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Потребителски" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "Допълнения" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "Помо&щ" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&Скриване на %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Скриване..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Ляво" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "Музика" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Никакъв" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "Списък с песни" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Изход" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Режим „Повторение“" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Дясно" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Режим „Случаен ред“" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Разтегли колоните да се вместят в прозореца" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Инструменти" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(различен по време на множество песни)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", от" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "... и всички сътрудници от Amarok" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 ден" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 песен" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 случайни песни" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Надградете към Premium сега" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Ако не е разрешено, Clementine ще се опита да запази Вашите рейтинги и други статистики само в отделна база данни и няма да променя файловете ви.

Ако е избрано, ще запазва статистики и в базата данни, и директно в файла всеки път, когато се променят.

Моля имайте предвид, че може да не работи във всеки формат и понеже няма стандарт за това как да се направи, други музикални плеъри може да не успеят да ги прочетат.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Сложете име на поле преди дума, за да ограничите търсенето към това поле, например artist:Bode търси всички изпълнители в библиотеката, съдържащи думата Bode.

Възможни полета: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Това ще запише рейтингите и статистиките на песни в етикетите на файловете от цялата ви библиотека.

Не е необходимо ако опцията "Запазване на рейтинги и статистики в етикетите на файловете" винаги е била активна.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Признаците започват с %, например: %artist %album %title

\n\n

Ако оградите част от текста, съдържаща признак, с къдрави скоби, тази част ще се скрива, ако признакът е празен.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Необходим е Spotify Premium акаунт." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Клиент може да се свърже само ако е въведен правилният код." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Умният списък е динамичен списък от песни, налични във Вашата библиотека. Има различни типове умни списъци с песни, които предлагат различни начини за избиране на песните." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Една песен ще бъде включена в списъка с песни, ако отговаря на тези критерии." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "А-Я" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "Славният хипножабок!" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Отхвърляне" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Относно %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Относно Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Относно QT..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Абосолютен" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Данни за акаунта" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Информация за акаунта (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Действие" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Действие" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Активно/неактивно WIIremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Поток от действия" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Добави подкаст" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Добавяне на поток" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Добавяне на нов ред ако се поддържа от типа известяване" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Добавяне на действие" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Добавяне на всички песни от папка и всичките й подпапки" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Добавяне на друг поток..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Добавяне на папка..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Добавяне на файл" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Добавяне на файл към прекодера" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Добавяне на файл(ове) към прекодера" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Добавяне на файл..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Добавяне на файлове за прекодиране" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Добавяне на папка" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Добавяне на папка..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Добавяне на нова папка..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Добавя движещ се текст" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Добавяне на подкаст..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Добавяне на аргумент за търсене" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Добавяне на етикет име на албум за песен" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Добавяне на етикет за изпълнител (албум) на песен" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Добавяне на етикет за изпълнител на песен" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Добавяне на автоматичен резултат за песен" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Добавяне на етикет за композитор на песен" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Добавяне на етикет за диск на песен" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Добави името на файла на песента" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Добавяне на етикет за жанр на песен" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Добавяне на етикет за групиране на песен" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Добавяне на етикет за продължителност на песен" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Добавяне на етикет за изпълнител на песен" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Добавяне на брой слушания" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Добавяне рейтинг на песен" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Добавяне брой пропускания на песента" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Добавяне на етикет за име на песен" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Добавяне на песента към кеш" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Добавяне на етикет за номер на песен" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Добавяне на етикет за година на песен" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Добавяне на песните в \"Моята музика\", когато се щракне на бутона \"Любима\"" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Добавяне на поток..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Добавяне в Моята музика" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Добавяне към списъците с песни от Spotify" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Добавяне към оценените песни от Spotify" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Добави в друг списък с песни" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Добавяне в отметки" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Добавяне към списъка с песни" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Добави към опашката" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Добавяне на потребител/група в отметки" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Добави Wiiremote действие" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Добавяне..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Добавени този месец" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Добавени тази седмица" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Добавени тази година" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Добавени днес" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Добавени през последните три месеца" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Разширено групиране..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "След " #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "След копиране..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Албум" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Албум (идеална сила на звука за всички песни)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Изпълнител на албума" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Обложка на албума" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Информация за албума на jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Албуми" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Албуми с обложки" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Албуми без обложки" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Всички" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Всички файлове (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "Славният хипножабок!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Всички албуми" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Всички изпълнители" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Всички файлове (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Всички списъци с песни (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Всички преводачи" #: library/library.cpp:98 msgid "All tracks" msgstr "Всички песни" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Позволяване на клиент да сваля музика от този компютър." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Позволяване на сваляния" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Позволи mid/side кодиране" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Заедно с оригиналите" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Винаги скриване на основния прозорец" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Винаги показвай основния прозорец" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Винаги започвай възпроизвеждането" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "За да използвате Spotify в Clementine е необходима допълнителна приставка. Иската ли да я свалите и инсталирате сега?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Възникна грешка при зареждането на базата данни на iTunes" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Получи се грешка при запис метаданните на '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Възникна неизвестна грешка." #: ui/about.cpp:85 msgid "And:" msgstr "И:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Ядосан" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Облик" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Добавяне на файлове/URL адреси към списъка с песни" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Добавяне към текущия списък с песни" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Добавяне към списъка с песни" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Прилагане на компресия за да се предотврати орязване" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Сигурни ли сте, че искате да изтриете \"%1\" настройката?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Сигурни ли сте, че искате да нулирате статистиката за тази песен?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Сигурни ли сте, че искате да запишете статистиките на песните във файловете на всички песни в библиотеката си?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Изпълнител" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Информация за изпълнителя" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Етикети за изпълнителя" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Инициали на изпълнителя" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Питай при запис" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Аудио формат" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Аудио изход" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Неуспешна идентификация" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Автор" #: ui/about.cpp:68 msgid "Authors" msgstr "Автори" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Автоматично" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Автоматично" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Автоматично обновяване" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Отвори автоматично единични категории от библиотечното дърво" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Налични" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Среден битов поток" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Среден размер на изображение" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "BBC подкасти" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "Темпо" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Фонови потоци" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Цвят на фона" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Фоново изображение" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Прозрачност на фона" #: core/database.cpp:648 msgid "Backing up database" msgstr "Архивиране на базата данни" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Баланс" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Колонков анализатор" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Основно синьо" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Обикновен тип на звука" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Поведение" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Най-добро" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Биография от %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Поток в битове" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Поток в битове" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Поток в битове" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Блоков анализатор" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Тип блок" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Количество на замъгляване" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Тяло" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Бум анализатор" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Избор…" #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Времетраене на буфера" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Буфериране" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Построявам Seafile индекс..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Но тези източници са забранени:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Бутони" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Поддръжка на CUE листове" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Път за кеширане:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Кеширам" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "Кеширам %1" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Отказ" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Откажи свалянето" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Необходима е Captcha.\nОпитайте да се логнете във Vk.com през браузера си, за да решите този проблем." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Смени обложката" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Смени размера на щрифта" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Смени режим повторение" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Промяна на бърз клавиш..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Смени режим разбъркване" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Промяна на езика" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Смяната на предпочитание за моно възпроизвеждане ще бъде ефективна за следващите възпроизведени песни" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Провери за нови епизоди" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Проверка за обновления" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Проверка за обновления..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Избор на Vk.com кеш папка" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Изберете име за вашият умен списък с песни" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Автоматичен избор" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Избиране на цвят..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Избор на шрифт..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Избор от списъка" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Изберете как ще е сортиран списъка и колко песни ще съдържа." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Избор на директория за сваляне на подкасти" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Изберете интернет услугите, които искате да бъдат показани." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Изберете уебсайтовете, които искате Clementine да използва за търсене на текстовете на песните." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Класически" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Почистване" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Изчистване" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Изчистване на списъка с песни" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Грешка в Clementine" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Портокал Clementine" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Clementine Визуализация" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine може автоматично да конвертира музиката, която копирате в това устройство във формата, в който то може да я изпълнява." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Clementine може да възпроизвежда музикални файлове, които сте качили в Amazon Cloud Drive" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine може да свири музика, която сте качили в Box" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine може да възпроизвежда музикални файлове, които сте качили в Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine може да възпроизвежда музикални файлове, които сте качили в Google Drive" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine може да възпроизвежда музикални файлове, които сте качили в OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine може да показва съобщение, когато се сменя песента" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine може да синхронизира Вашите списък с абонаменти и приложения за движещи се текстове между компютрите Ви. Създаване на акаунт." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine не можа да зареди никаква projectM визуализация. Проверете дали сте инсталирали Clementine правилно." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Clementine мениджър на изображения" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine не намери резултати за този файл" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine ще намери музика в:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Цъкнете тук за да добавите музика" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Щракнете тук, за да добавите списък с песни в любими, така че да бъде запазен и достъпен през панела \"Списъци с песни\" в лявата лента" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Цъкнете за да превключите между оставащо и пълно време" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Натискането на бутона Влизане ще отвори уеб браузер. Върнете се в Clementine след като влезете." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Затваряне" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Затвори плейлиста" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Затваря визуализацията" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Затварянето на този прозорец ще прекрати свалянето" #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Затварянето на този прозорец ще прекрати търсенето на обложки." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Клуб" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Цветове" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Разделен със запетаи списък с class:level, level (ниво) е 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Коментар" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Обществено радио" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Автоматично довършване на етикетите" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Автоматично довършване на етикетите..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Композитор" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Конфигурация на %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Настройване на Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Настройване на бързите клавиши" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Настройване на Spotify..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Конфигурация на Subsonic..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Настройка на Vk.com..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Конфигурирай глобално търсене" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Настройване на библиотека..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Конфигуриране на подкасти..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Настройване..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Свържете Wii дистанционни чрез действието активиране/деактивиране" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Свързване на устройство" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Свързване към Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Съвъра отказа връзката, проверете URL адреса на сървъра. Например: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Позволеното време за връзка изтече, проверете URL адреса на съвъра. Например: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Проблем при връзката, или аудиото е изключено от собственика" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Конзола" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Постоянен битов поток" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Конвертирай цялата музика" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Конвертиране само музиката, която това устройство не може да възпроизвежда" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Конвертира lossless аудио файлове преди да ги изпрати отдалечено." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Конвертиране на lossless файлове" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Копиране на url адреса за споделяне в буфера" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Копиране в буфера" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Копирай в устройство..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Копиране в библиотека..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Copyright" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Не можах да се свържа със Subsonic, проверете URL адреса на сървъра. Например: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Не мога да създам GStreamer елемент \"%1\" - уверете се, че всички необходими приставки на GStreamer са инсталирани" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Не можах да създам списък с песни." #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Не мога да намеря миксер за %1, проверете дали имате инсталирани правилните GStreamer плъгини." #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Не мога да намеря кодер за %1, проверете дали имате инсталирани правилните GSteamer плъгини." #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Не мога да отворя изходен файл %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Мениджър за обложки" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Обложка от изображение" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Обложката е заредена автоматично от %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Обложката е ръчно премахната" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Обложката не е зададена" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Обложката е зададена от %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Обложки от %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Плавен преход при автоматична смяна на песни" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Плавен преход при ръчна смяна на песни" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "По избор" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Потребителско изображение:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Настройки на потребителското съобщение" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Потребителски..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "Път то DBus" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Денс" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Забелязана е повреда в базата данни. Моля, вижте https://code.google.com/p/clementine-player/wiki/DatabaseCorruption за инструкции за възстановяването на Вашата база данни" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Дата на създаване" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Дата на променяне" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Дни" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "&По подразбиране" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Намаляване на звука с 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Намаляване на звука с процента" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Намаляване на звука" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Фоново изображение по подразбиране" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Устройство по подразбиране на %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Стандартни настройки" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Забавяне между визуализации" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Изтрий" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Изтрий свалените данни" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Изтриване на файлове" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Изтриване от устройство" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Изтриване от диска..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Изтрий показаните епизоди" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Изтриване на фиксираната настройка" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Изтриване на умен списък с песни" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Изтрий оригиналните файлове" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Изтриване на файлове" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Махни от опашката избраните парчета" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Махни от опашката парчето" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Местоположение" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Подробности..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Устройство" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Свойства на устройство" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Име на устройство" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Свойства на устройство..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Устройства" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Диалог" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Може би имахте предвид" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Парола за Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Потребителско име за Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Директна връзка към Интернет" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Папка" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Изключване на продължитеност" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Забраняване на генериране на ленти по настроение" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Изключено" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Изключено" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Диск" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Непрекъснато излъчване" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Настройки на показването" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Показване на екранно уведомление" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Пусни пълно повторно сканиране на библиотеката" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Пусни пълно повторно сканиране" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Пусни пълно повторно сканиране..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Не конвертирай никаква музика" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Не презаписвай съществуващи" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "Пълното повторно сканиране ще загуби всички метаданни, записани в Clementine: обложки на албуми, брой изпълнения, рейтинги. Clementine ще сканира наново всичката Ви музика в Google Drive, което може да отнеме известно време." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Без повторение" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Да не се показва в различни изпълнители" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Не показвай изслушани епизоди" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Не разбърквай" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Не спирай!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Дарете" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Двойно цъкване за отваряне" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Двойното цъкване върху песен ще..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Сваля %n епизода" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Папка за сваляне" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Свали епизодите в" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Членство за сваляне" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Сваляй автоматично новите епизоди" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Опашка на свалянето" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Настройки на сваляне" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Сваляне на Android приложението" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Сваляне на този албум" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Сваляне на този албум..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Свали този епизод" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Изтегляне..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Сваляне (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Сваляне на icecast директорията" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Сваляне на jamendo каталог" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Сваляне на каталог Magnatune" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Изтегляне на приставка за Spotify" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Сваляне на метаданни" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Влачете за позициониране" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Дъбстеп" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Продължителност" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Динамичния режим е включен" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Динамичен случаен микс" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Редактиране умен списък с песни..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Редактиране на етикет \"%1\"..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Редактиране на етикет..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Редактиране на етикети" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Редактиране на информацията за песента" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Редактиране на информацията за песента..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Редактиране на информация за песните..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Редактиране..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "Имейл" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Разреши подръжката на Wii Remote" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Разрешаване на автоматично кеширане" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Разреши еквалазйзера" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Разреши бързите клавиши, само когато Clementine е активен прозорец" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Позволи директна поправка на метаданните за песента при щракане" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Разрешете източници отдолу, за да ги включите в резултатите от търсенето. Резултатите ще бъдат показани в този ред." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Включване/изключване на Last.fm скроблинг" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Сложност на кодирането" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Качество на енджина на кодирането" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Режим на кодирането" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Въведете URL" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Въведете URL за да свалите обложката от Internet:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Въведете име на файла за експортирани обложки (без разширение):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Въведете ново име за този списък с песни" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Въведете критерии за търсене отгоре, за да намерите музика на Вашия компютър и в интернет" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Въведете по-долу термини за търсене в подкастите на iTunes Store" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Въведете по-долу термини за търсене в подкастите на gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Въведете критерий за търсене" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Въведете URL адрес на Интернет радио поток" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Въведете името на новата папка" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Въведето този IP в App за да се свържете с Clementine" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Цялата колекция" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Еквалайзер" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Еквивалентно на --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Еквивалентно на --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Грешка" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Грешка при печене на CD" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Грешка при свързването на MTP устройство" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Грешка при копиране на песни" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Грешка при изтриване на песни" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Грешка при изтеглянето на приставка за Spotify" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Грешка при зареждане на %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Грешка при зареждане на di.fm списък с песни" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Грешка при обработване на %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Грешка при зареждането на аудио CD" #: library/library.cpp:68 msgid "Ever played" msgstr "Някога пускана" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Всеки 10 минути" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Всеки 12 часа" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Всеки 2 часа" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Всеки 20 минути" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Всеки 30 минути" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Всеки 6 часа" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Всеки час" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Освен между песните в един и същи албум или в един и същи CUE лист" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Съществуващи обложки" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Разширяване" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Изтича на %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Експортиране на Обложки" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Експортиране на обложки" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Експортиране на свалени обложки" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Експортиране на вградени обложки" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Експортирането приключи" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Експортирах %1 обложки от %2 (прескочих %3)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Заглушаване при пауза / плавен преход при продължаване" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Заглушаване при спиране на песен" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Заглушаване" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Продължителност на заглушаване" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Не успях да прочета CD устройството" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Неуспех при извличане на директория" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Не успях да извлека подкасти" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Не успях да заредя подкаст" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Неуспешен разбор на XML за тази RSS хранилка" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Бързо" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Любими парчета" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Сваляне на липсващите обложки" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Автоматично изтегляне" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Изтеглянето завърши" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Извличане на Subsonic библиотека" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Грешка по време на свалянето на обложката" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Файлов формат" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Файлово разширение" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Файлови формати" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Име на файл" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Име на файл (без път)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Шаблон за име на файла:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Пътища към файл" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Размер на файла" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Тип на файла" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Име на файл" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Файлове" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Файлове за прекодиране" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Намери песни в библиотеката, които спазват вашият критерия" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Намиране на този изпълнител" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Подпечатване на песента" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Край" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Първо ниво" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Сместване на обложката в ширината" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Размер на шрифта" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Поради причини, свързани с лицензирането, поддръжката на Spotify е като отделна приставка." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Принудително кодиране в моно" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Забравяне на устройство" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Забравяне на устройство ще го премахне от списъка и Clementine ще трябва да сканира всички песни, когато го свържете отново." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Форма" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Формат" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Скорост" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Кадри за буфер" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Заледен" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Пълен бас" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Пълен бас + Високи" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Пълни високи" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Общи" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Общи настройки" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Жанр" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Вземете линк за споделяне на тази песен в Spotify" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Вземете линк за споделяне на този плейлист" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Получаване на канали" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Извличане на потоците" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Въведете име:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Давай" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Отиване към подпрозореца със следващия списък с песни" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Отиване към подпрозореца с предишния списък с песни" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Успешно изтегляне на %1 от общо %2 обложки (неуспешно на %3)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Посивяване на песните, които не съществуват в моят списък с песни" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Групиране на Библиотеката по..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Групиране по" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Групиране по Албум" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Групиране по Изпълнител" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Групиране по Изпълнител/Албум" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Групиране по Изпълнител/Година - Албум" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Групиране по Жанр/Албум" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Групиране по Жанр/Изпълнител/Албум" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Групиране" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "HTML страницата не съдържа никакви RSS хранилки" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "Кодът за състояние на HTTP 3xx получен без URL адрес, проверете конфигурацията на сървъра." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "HTTP сървър-посредник" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Щастлив" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Хардуерна информация" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Хардуерна информация е налична единствено когато устройството е свързано." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Високо" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Високо (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Високо (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "Хип Хоп" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Не можах да намеря хост, проверете URL адреса на съвъра. Например: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Часа" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Хипножабok" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Нямам регистрация в Magnatune" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Икона" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Иконите отгоре" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Идентифициране на песента" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Ако е активирано, щракането върху селектирана песен от плейлиста ще позволява директно модифициране на тага" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Ако продължите това устройство ще работи бавно и песните копирани в него може да не работят." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Ако знаете URL-а на подкаст, въведете го по-долу и цъкнете върху Давай." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Игнориране на \"The\" в имена на изпълнители" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Изображения (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Изображения (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Импорт..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "След %1 дни" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "След %1 седмици" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "В динамичен режим новите песни ще бъдат избирани и добавяни към списъка с песни всеки път, когато свърши песента." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Входящи" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Включване на обложката в известяването" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Включване на всички песни" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Несъвместима версия на Subsonic REST протокол. Клиентът трябва да я обнови." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Несъвместима версия на Subsonic REST протокол. Сървърът трябва да я обнови." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Непълна конфигурация, моля уверете се, че всички полета са запълнени." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Увеличаване на звука с 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Увеличаване на звука с процента" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Увеличаване на звука" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Индексиране %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Информация" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Входни настройки" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Вмъкване..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Инсталирани" #: core/database.cpp:585 msgid "Integrity check" msgstr "Проверка на интегритета" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Интернет" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Интернет доставчици" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Интернет услуги" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Невалиден API ключ" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Невалиден формат" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Невалиден метод" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Невалидни параметри" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Невалиден ресурс" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Невалидна услуга" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Невалиден ключ за сесия" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Обръщане на избраното" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Най-слушаните парчета в Jamendo" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Най-високо класираните парчета в Jamendo" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Най-високо класираните парчета в Jamendo този месец" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Най-високо класираните парчета в Jamendo тази седмица" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Jamendo база от данни" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Премини към предната песен веднага" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Отиване до песента, изпълнявана в момента" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Пази бутоните за %1 секундa..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Пази бутоните за %1 секунди..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Продължи ипзълнението и във фонов режим, дори когато прозореца е затворен" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Запази оригиналните файлове" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Котенца" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Език" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Лаптоп/Слушалки" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Голяма зала" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Голяма обложка" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Голяма обложка (подробности отдолу)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Голяма обложка (без подробности)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Голяма странична лента" #: library/library.cpp:80 msgid "Last played" msgstr "Последно изпълнение" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Последно изпълнение" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm е претоварен в момента, моля, опитайте след няколко минути" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Last.fm парола" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Брой пускания в Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Last.fm етикети" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Last.fm потребителско име" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Last.fm уики" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Най-малко любими песни" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Ляво" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Дължина" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Библиотека" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Разширено групиране на Библиотеката" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Известие за повторно сканиране на библиотеката" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Търсене в библиотеката" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Ограничения" #: ui/equalizer.cpp:137 msgid "Live" msgstr "На живо" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Зареди" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Зареди обложка от URL" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Зареди обложка от URL..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Зареждане на обложка от диск" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Зареждане на обложката от диска..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Зареждане на списък с песни" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Зареждане на списък с песни..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Зареждане на MTP устройство" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Зареждане на iPod база данни" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Зареждане на умен списък с песни" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Зареждане на песни" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Зареждане на поток..." #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Зареждане на песни" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Зареждане на информация за песните" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Зареждане…" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Зареждане на файлове/URL адреси, замествайки настоящият списък с песни" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Влизане" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Влизането не успя" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Излизане" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Long term prediction profile (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Любима" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Ниско (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Ниско (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Low complexity profile (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Текстове на песни" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Текстове на песни от %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Изтегляне от Magnatune" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Изтеглянето от Magnatune завършено" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Main profile (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Направи го така!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Нека бъде!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Списъкът с песни да е наличен в режим извън мрежа" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Грешка при отговора" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Ръчна настройка на сървъра-посредник" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Ръчно" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Производител" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Маркирай като чута" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Маркирай като нова" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Съвпадане всеки термин за търсене (И)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Съвпадане на един или повече терминала за търсене (ИЛИ)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Максимум на резултати от глобално търсене" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Максимален битов поток" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Медията се промени. Презареждам" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Средно (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Средно (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Тип членство" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Минимален битов поток" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Минимално запълване на буфера" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Липсват готови настройки за проектМ" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Модел" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Следи за промени в библиотеката" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Моно възпроизвеждане" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Месеца" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Статус" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Стил на лентата по настроение" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Ленти по настроение" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Още" #: library/library.cpp:84 msgid "Most played" msgstr "Най-пускани" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Точка на монтиране" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Точки за монтиране" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Преместване надолу" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Преместване в библиотека..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Преместване нагоре" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Музика" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Музикална Библиотека" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Без звук" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Мои Албуми" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Моята музика" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Моите Препоръки" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Име" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Име" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Опции за именуване" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Narrow band (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Мрежов сървър-посредник" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Дистанционно управление" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Никога" #: library/library.cpp:74 msgid "Never played" msgstr "Никога пускани" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Никога да не се пуска възпроизвеждането" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Нова папка" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Нов списък с песни" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Нов умен списък с песни..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Нови песни" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Нови парчета ще бъдат добавяни автоматично." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Най-нови парчета" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Следваща" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Следваща песен" #: core/utilities.cpp:151 msgid "Next week" msgstr "Следващата седмица" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Без анализатор" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Няма фоново изображение" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Няма обложки за експортиране." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "No long blocks" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Няма намерени съвпадения. Изтрийте текста, за да видите отново цялото съдържание." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "No short blocks" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Никаква" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Никоя от избраните песни бяха сподобни да бъдат копирани на устройството" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Нормално" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Normal block type" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Не е налично при използването на динамичен списък с песни" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Не е свързан" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Недостатъчно съдържание" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Недостатъчно почитатели" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Недостатъчно членове" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Недостатъчно съседи" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Не е инсталиран" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Не сте вписан" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Не е монтиран - двоен клик за монтиране" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Не намерих нищо" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Тип на известяване" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Известия" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "В момента се изпълнява" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Брой епизоди за показване" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "OSD Изглед" #: widgets/osd.cpp:173 msgid "Off" msgstr "Изключено" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "Включено" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Приемане на връзки само от клиенти в следните интервали на ip:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Позволяване само на връзки от локалната мрежа" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Покажи само първите" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Непрозрачност" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Отвори %1 в браузъра" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Отваряне на &аудио CD..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Отваряне на OPML файл" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Отваряне на OPML файл..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Отваряне на папка за импортиране на музика" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Отворено устройство" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Отваряне на файл..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Отвори в Google Drive" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Отворяне в нов списък с песни" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Отваряне в нов списък с песни" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Отвори в браузера" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Отваряне..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Неуспешна операция" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Оптимизиране на битов поток" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Оптимизиране за качество" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Настройки…" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Организиране на Файлове" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Организиране на файлове..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Файловете се организират" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Оригинални етикети" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Други настройки" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Изход" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Изходно устройство" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Изходни настройки" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Презаписване на всички съществуващи" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Презапис на съществуващите файлове" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Презаписване само на по-малките" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Собственик" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Претърсване на Jamendo каталога" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Парти" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Парола" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Пауза" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "На пауза" #: widgets/osd.cpp:156 msgid "Paused" msgstr "На пауза" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Изпълнител" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Пиксел" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Стандартна странична лента" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Възпроизвеждане" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Брой изпълнения" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Продължаване ако е спряно и обратно" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Възпроизвеждане, ако има песен, която вече се изпълнява" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Възпроизвеждане на тата песен от списъка с песни" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Възпроизвеждане/Пауза" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Възпроизвеждане" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Настройки на плеър" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Списък с песни" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Списъка с песни е завършен" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Настройки на списъка с песни" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Тип на списъка с песни" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Списъци с песни" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Моля изберете вашия браузър и се върнете към Clementine" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Състояние на приставката:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Подкасти" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Поп" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Врементраене на балончето" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Порт" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Предусилвател" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Настройка" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Настройки" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Настройки..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Предпочитани файлови разширения за обложките, разделени със запетайки." #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Предпочитан аудио формат" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Предпочитан битов поток" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Предпочитан формат" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Premium тип на звука" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Предварително зададени:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Натиснете клавишна комбинация, която да използвате за" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Натиснете клавиш" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Натиснете клавишна комбинация, която да използвате за %1..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Натискане на \"Предишна\" в плейъра ще..." #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Настройки на красиво OSD" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Преглед" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Предишна" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Предишна песен" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Показване на информация за версията" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Профил" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Напредък" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Напредък" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Психаделик" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Натиснете бутон на Wiiremote" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Подреди песните по случаен начин" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Качество" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Качество" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Заявящо устойство..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Мениджър на опашката" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Пратете избраните песни на опашката" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Прати избрана песен на опашката" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Радио (еднаква сила на звука за всички песни)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Дъжд" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Дъжд" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Произволна визуализация" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Задай рейтинг на текущата песен 0 звезди" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Задай рейтинг на текущата песен 1 звезда" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Задай рейтинг на текущата песен 2 звезди" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Задай рейтинг на текущата песен 3 звезди" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Задай рейтинг на текущата песен 4 звезди" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Задай рейтинг на текущата песен 5 звезди" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Рейтинг" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Наистина ли искаш да затвориш?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Лимита за пренасочвания надвишен, проверете конфигурацията на сървъра." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Презареди каталога" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Презареди каналите" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Презареди листа със станциите" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Обновяване на потоците" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Реге" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Релативен" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Запомни Wiiremote суинг" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Помни от предния път" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Помни изборът ми" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Премахване" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Премахване на действието" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Премахни дублиранията от плейлиста" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Премахване на папката" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Премахни от Моята музика" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Премахване от отметки" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Премахване от списъка с песни" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Премахване на списъка с песни" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Премахване на списъци с песни" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Премахни недостъпни песни от плейлиста" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Преименуване на списъка с песни" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Преименуване на списъка с песни..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Преномерирай песните в този ред..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Повтаряне" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Повтаряне на албума" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Повтаряне на списъка с песни" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Повтаряне на песента" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Заместване на текущия списък с песни" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Заместване на списъка с песни" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Заменя интервалите със символи" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Изравняване на усилването" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Режим Изравняване на усилването" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Ново попълване" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Изискване на код за удостоверение" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Възстановяване" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Изчистване на броя възпроизвеждания" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Започни песента отначало, после премини към предната, ако се натисне още веднъж" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Рестартиране на песента, или свирене на предишната песен, ако са минали по-малко от 8 секунди от началото й." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Само ASCII символи" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Продължаване на възпроизвеждането при стартиране" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Назад към Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Дясно" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Печене" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Печене на CD" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Печене на аудио CD" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Рок" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Стартирай" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "SOCKS сървър-посредник" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Грешка при SSL ръкостискането, проверете конфигурацията на съвъра. SSLv3 опцията отдолу може да се справи с някои проблеми." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Безопасно премахване на устройството" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Безопасно премахване на устройството след приключване на копирането" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Дискретизация" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Дискретизация" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Запазване на .mood файлове в музикалната Ви библиотека" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Запази обложката на албума" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Запази обложката на диска..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Запазване на изображение" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Запазване на списъка с песни" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Запазване на списъка с песни" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Запазване на списъка с песни..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Запис на фиксирани настройки" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Запазване на рейтинги в етикетите на файловете, когато е възможно" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Запазване на статистики в етикетите на файловете, когато е възможно" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Запази този поток в интернет таб" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Запазвам статистики за песните във файловете на песните" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Запазване на песните" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Scalable sampling rate profile (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Размер на омащабяването" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Резултат" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Запази песните, които слушам" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Търсене" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Търсене" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Търси Icecast станции" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Търси в jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Търси в Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Търсене в Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Автоматично търсене" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Търси за обложки" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Търсене из всички" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Търси в gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Търси в iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Режим \"Търсене\"" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Опции при търсене" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Резултати от търсенето" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Термини за търсене" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Второ ниво" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Придвижване назад" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Придвижване напред" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Следене на текущата песен с относително количество" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Следене на текущата песен с абсолютно позиция" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Избиране на всички" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Изчистване на избора" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Изберете цвета на фона:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Избор на фоново изображение" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Избери най-доброто съвпадение" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Изберете цвета на обекта:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Избери визуализации" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Избери визуализации..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Избиране..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Сериен номер" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Сървър" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "URL адрес на сървъра" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Подробности за сървъра" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Услугата е недостъпна" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Задай %1 да е %2\"..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Ниво на звука - процента" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Избери стойност за всички песни" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Настройки" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Бърз клавиш" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Бърз клавиш за %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Бързият клавиш за %1 вече съществува" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Показване" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Показване на OSD" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Показва светеща анимация на текущата песен" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Показване на лента по настроение в лентата за напредък на песента" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Показване подразбиращо се за системата известяване" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Показване на известяване при превключване между режим разбъркано/случайно" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Показване на известяване при промяна силата на звука" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Показване на известяване при пауза" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Покажи изкачащо прозорче в областа за уведомяване" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Показване на красиво OSD" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Покажи над status bar-а" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Показвай всички песни" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Покажи всичките песни" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Показвай обложки в библиотеката" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Покажи разделители" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Покажи в пълен размер..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Показване на групи в резултати от глобално търсене" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Покажи във файловия мениджър..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Показване в библиотеката..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Показване в смесени изпълнители" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Показване на лента по настроение" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Показвай само дубликати" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Показване само на неотбелязани" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Показване на песента, която свири, на страницата ти" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Покажи подсказвания при търсене" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Показване на бутона \"харесвам\"" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Показване на бутона скроблинг в главния прозорец" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Показване на икона в областта за уведомяване" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Покажи кои източници са разрешени и кои забранени" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Показване/скриване" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Случаен ред на изпълнение" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Случаен ред на албуми" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Случаен ред на изпълнение на всички" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Разбъркване на списъка с песни" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Случаен ред на песните в този алубм" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Записване" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Изход" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Вписване..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Подобни изпълнители" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Размер" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Размер:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ска" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Прескачане назад в списъка с песни" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Презключи броя" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Прескачане напред в списъка с песни" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Прескачане на избраните песни" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Прескачане на песента" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Малки обложки" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Малка странична лента" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Умен списък с песни" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Умни списъци с песни" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Лек" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Лек рок" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Информация за песен" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Информация за песен" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Сонограма" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Съжалявам" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Сортиране по жанр(азбучно)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Сортиране по жанр(по популярност)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Сортирай по име на станция" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Сортиране на песните по" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Сортиране" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Източник" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Източници" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Грешка в вписване в Spotify" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "URL на плейлист в Spotify" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Приставка за Spotify" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Приставката за Spotify не е инсталирана" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "Линк към песента в Spotify" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Стандартно" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Със звезда" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Започни печене" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Стартиране на текущо възпроизвеждания списък с песни" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Начало на прекодирането" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Започнете да пишете нещо в кутията за търсене отгоре, за да запълните списъка с резултати от търсенето" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Стартиране на %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Стартиране..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Спиране" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Спиране след" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Спри след тази песен" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Спиране на възпроизвеждането" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Спиране на възпроизвеждането след текущата песен" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Спри след песен: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Спрян" #: core/song.cpp:431 msgid "Stream" msgstr "Поток" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Слушане на живо от Subsonic сървър изисква валиден лиценз за сървъра след 30-дневния пробен период." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Членство за слушане" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Абонати" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Успешно!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "Успешно записан %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Предложени етикети" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Резюме" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Много високо (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Супер високо (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Поддържани формати" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Синхронизиране на статистиките към файловете сега" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Синхронизиране на входящата кутия на Spotify" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Синхронизиране на списъка с песни от Spotify" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Синхронизиране на оценените песни от Spotify" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Системни цветове" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Табовете отгоре" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Получаване на етикети" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Отбелязан битов поток" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Техно" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Настройки на текста" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Благодарности на" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Командата \"%1\" не може да бъде стартирана" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Обложката на албума на текущо звучащата песен" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "Директорията \"%1\" не е валидна" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "Втората стойност трябва да е по-голяма от първата!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Сайта, който предоставихте не съществува" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Сайта, който предоставихте не е изображение!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Пробния период на Subsonic сървъра изтече. Моля дайте дарение за да получите ключ за лиценз. Посетете subsonic.org за подробности." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Версията на Clementine, която току що обновихте изисква пълно повторно сканиране на библиотеката, заради следните нови функции:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "В този албум има други песни" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Имаше проблем в комуникацията с gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Имаше проблем с изтеглянето на метаданните от Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Имаше проблем в разбора на отговора от iTunes Store" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Имаше проблем с копирането на някои песни.Следните не можаха да бъдат копирани:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Имаше проблем с изтриването на някои песни.Следните не можаха да бъдат изтрити:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Тези файлове ще бъдат изтрити от устройството,сигурни ли сте че искате да продължите?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Тези файлове ще бъдат безвъзвратно изтрити от диска, сигурни ли сте, че искате да продължите?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Тези папки ще бъдат сканирани за музика за да направят вашата библиотека" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Тези настройки се използват в диалоговия прозорец \"Прекодиране на музика\" и когато се прекодира музика преди да се копира на устройство." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Трето ниво" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Това действие ще създаде база от данни с размер, който може да достигне 150 MB.\nСигурни ли сте че искате да продължите?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Този албум не е наличен в избраният формат" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Това може да се промени по-късно от предпочитанията" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Това устройство трябва да бъде свързано и отоворено преди Clementine да маоже да види какви файлови формати подържа." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Това устройство подържа следните формати:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Това устройство няма да работи както трябва." #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Това е MTP устройство,но вие сте компилирали Clementine без подръжка за libmtp." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Това е iPod, но вие сте компилирали Clementine без подръжка за libgpod" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Това е първият път,когато мушкате това устройство. Clementine сега ще сканира това устройство за да намери музикални файлове - това може да отнеме известно време." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Тази опция може да се промени от предпочитанията \"Поведение\"" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Този поток е само за платени регистрации." #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Този тип устройство не е подържано:%1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Заглавие" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Днес" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Вкл./Изкл. на красиво екранно меню" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Превключване на пълен екран" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Покажи статус на опашката" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Включаване на скроблинга" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Превключване видимостта на красиво екранно меню" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Утре" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Твърде много пренасочвания" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Топ песни" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Общо албуми:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Общо прехвърлени байта" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Общ брой направени мрежови заявки" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Песен" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Песни" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Прекодирай музиката" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Журнал на прекодирането" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Прекодиране" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Прекодиране на %1 файлове чрез %2 начина" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Настройки на прекодиране" #: core/song.cpp:426 msgid "TrueAudio" msgstr "Инстинско Аудио" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Турбина" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Изключване" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL-и" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Ultra wide band (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Не можах да се свържа" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Неуспешно сваляне %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Непознат" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Неизвестен тип съдържание" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Неизвестна грешка" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Махни обложката" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Не прескачай избраните песни" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Не прескачай песента" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Премахване абонамент" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Наближаващи концерти" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Обновяване" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Обнови всички подкасти" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Обнови папките с промени в библиотеката" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Обновяване на библиотеката при стартиране на Clementine" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Обнови този подкаст" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Обновяване" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Обновяване %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Обновяване %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Обновяване на библиотеката" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Използване" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Използване на етикет изпълнител на албума, когато го има" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Използване на клавишните комбинации на Гном" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Ако е възможно да се използват мета данни на Изравняване на усилването" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Използване на SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Използване на Wii дистанционно" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Използване на потребителски цветове" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Използване на потребителско съобщение за известията" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Използване на дистанционно за мрежа" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Използване на удостоверяване" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Използване на енджин за управление на битов поток" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Използвай динамичен режим" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Използвай известия за докладване на статуса на Wii Remote" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Използване на оформяне на звук по време" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Използвай подразбиращия се за систмета" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Използване на подразбиращите се за системата цветове" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Използване на системните настройки за сървър-посредник" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Използване на нормализация на звука" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Използван" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Потребителски интерфейс" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Потребителско име" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Използването на менюто за добавяне на песен ще..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Променлив битов поток" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Сборни формации" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Версия %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Изглед" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Режим \"Визуализация\"" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Визуализации" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Настройки на визуализациите" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Засичане на глас" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Сила на звука %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Стена" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Предупреди ме, преди да се затвори подпрозорец със списък от песни" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Уебсайт" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Седмици" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "При стартиране на Clementine" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Когато Clementine търси обложки първо ще потърси за картинки съдържащи една от тези думи.\nАко няма свъпадения тогава ще използва най-големите изображения в директорията," #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "При запис на списъци с песни, пътищата на файла трябва да са" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Когато списъка е празен" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Защо не опиташ..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Wide band (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: активирано" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: свързано" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: критично ниво на батериите (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: деактивирано" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: несвързано" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: ниско ниво на батерията (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Аудио — Windows Media" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Без обложка:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Искате ли да преместим другите песни от този албум в Различни изпълнители?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Искате ли да изпълните пълно повторно сканиране сега?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Записване на всички статистики за песните във файловете на песните" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Запиши метадата" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Грешно потребителско име или парола." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Година" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Година - Албум" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Години" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Вчера" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "На път сте да свалите следните албуми" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Така ще премахнете %1 плейлисти от любимите Ви, сигурни ли сте?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Искате да премахнете списък с песни, който не е част от Вашите любими списъци: списъкът ще бъде премахнат (действието не може да бъде отменено).\nСигурни ли сте, че искате да продължите?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Не сте вписан." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Вписани сте като %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Вписани сте." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Можете да промените начина, по-който песните в библиотеката са организирани." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Можете да слушате безплатно без регистрация, но с Premium регистрация можете да слушате потоци с по-високо качество и без реклами." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Можете да слушате песни от magnatune безплатно, без регистрация. Купуването на членство маха съобщенията в края на всяка песен." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Можете да слушате фонови потоци по същото време, когато слушате и музика." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Можете да използвате Wii Remote като дистанционно за Клементин.Вижте Wiki страницата на Clementine за повече информация.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Нямате Spotify Premium акаунт." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Нямате активен абонамент" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "Не е нужно да сте логнати, за да слушате музика от SoundCloud. Но е нужно за да имате достъп до плейлистите си и потока си." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Отписан сте от Spotify, моля въведете отново паролата си в Настройки." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Изписан сте от Spotify, моля въведете паролата си отново" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Харесвате тази песен" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "Трябва да влезете в Системните Настройки и да позволите на Clementine да \"контролира вашия компютър\" за да изпозлвате глобалните клавишни комбинации в Clementine." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Трябва да рестартирате Clementine, ако смените езика." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Вашият IP адрес:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Вашите Last.fm данни са грешни" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Вашите данни за достъп за Magnatune бяха грешни" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Вашата библиотека е празна!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Вашите радио потоци" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Вашите слушания: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "В системата Ви липсва OpenGL поддръжка, визуализациите са недостъпни." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Вашето потребителско име или парола не съвпада." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Я-А" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Нула" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "добавете %n песни" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "след" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "преди" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "и" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "автоматично" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "преди" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "между" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "Пъво най-големите" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "удари в минута" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "съдържа" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "изключено" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "диск %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "не съдържа" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "свършва с" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "равно" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "gpodder.net директория" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "по-голям от" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "iPod-и и USB устройства в момента не работят под Windows. Съжаляваме!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "в последните" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "килобита/сек" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "по-малко от" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "първо най-дългите" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "премести %n песни" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "първо най-новите" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "различно" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "не e в последните" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "не е на" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "първо най-старите" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "вкл." #: core/commandlineoptions.cpp:148 msgid "options" msgstr "опции" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "или сканирайте QR кода!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "натиснете enter" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "премахване на %n песни" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "първо най-късите" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "разбъркване на песните" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "първо най-малките" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "сортирай песните" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "започва с" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "Стоп" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "песен %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/bn.po000066400000000000000000004240041260417502300236420ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Enam Mijbah Noor , 2013,2015 # FIRST AUTHOR , 2011 # Ratul Minhaz , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Bengali (http://www.transifex.com/davidsansome/clementine/language/bn/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bn\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "দিন" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " কেবিপিএস" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " মিলিসেকেন্ড" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " পয়েন্ট" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " সেকেন্ড" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " গান" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 টি গান)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 অ্যালবামস" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 দিন" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 দিন পুরানো" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%2 এ %1" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 প্লে লিস্ট (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 সিলেক্ট অফ" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 গান" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 গান" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 গান পাওয়া গেছে" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 গান পাওয়া গেছে ( দৃশ্যমান %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 ট্রাকস" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 ট্রানসফারড" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1 উইমটে ডেভ মডউল" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 অন্য শ্রোতা" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 টোটাল প্লে" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n অসফল" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n সমাপ্ত" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n বাকি আছে" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&আল্যাইন টেক্সট" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&সেন্টার" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&কাস্টম" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "&অতিরিক্ত" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&সহায়িকা" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&গোপন %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&গোপন" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "বাঁদিকে (&ব)" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "কিছু &নয়" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "প্রস্থান করো" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "ডানদিকে (&ড)" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "& সামঞ্জস্য পূর্ণ প্রসারণ - উইন্ডো অনুপাতে" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&সরঞ্জামসমূহ" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "আনুপূর্বিক তফাৎ" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "এবং অন্য সমস্ত এমরক সহযোগকারি গন" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "" #: core/utilities.cpp:119 msgid "1 day" msgstr "১ দিন" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "১টি ট্র্যাক" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128 কেবিপিস এম পি থ্রী" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 অনবরত সঙ্গীত" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "এখনই প্রিমিয়ামে আপগ্রেড করুন" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "এক্ টি স্পটীফাই অ্যাকাউন্ট প্রয়োজন" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "এক টি স্মার্ট প্লে লিস্ট আপনার সঙ্গীত সংগ্রহ থেকে সৃষ্টি হয়। স্মার্ট প্লে লিস্ট আপনাকে বিভিন্ন ভাবে সঙ্গীত চয়ন করার সুবিধা দেয় ।" #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "এক টি সঙ্গীত প্লে লিস্ট এ অন্তর্ভুক্ত হয় যদি কিনা মান গুলি ঠিক পুরন করে।" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "এ থেকে জেড পর্যন্ত" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "এ এ সি" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "" #: core/song.cpp:422 msgid "AIFF" msgstr "এআইএফএফ" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "%1-এর সম্বন্ধে" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "ক্লেমেন্টাইন সন্মন্ধে" #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "কিউ টি সন্মন্ধে" #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "অ্যাকাউন্ট সন্মন্ধে" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "পদক্ষেপ" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "কার্যকরী / অকার্যকরী অয়্যারমোট" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "সঙ্গীত যোগ করুন" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "যদি নোটিফিকেশান টাইপ সাপোর্ট করে তাবে এক্ টি নতুন লাইন যোগ করুন" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "পদক্ষেপ গ্রহন করুন" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "অন্য এক্ টি সঙ্গীত যোগ করুন" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "ডাইরেকট রি যোগ করুন" #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "ফাইল যোগ করুন" #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "অনুবাদ এর জন্য ফাইল যোগ করুন" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "ফোল্ডার যোগ করুন" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "ফোল্ডার যুক্ত করুন..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "এক টি নতুন ফোল্ডার যোগ করুন" #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "খোঁজার বিষয় যোগ করুন" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "গান এর ট্যাগ গুলি যোগ করুন" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "গায়ক এর পরিচয় এর ট্যাগ লিপিবদ্ধ করুন" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "গায়ক এর পরিচয় লিপিবদ্ধ করুন" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "পরিচালক এর ট্যাগ যুক্ত করুন" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "সঙ্গীত এর ডিস্ক এর তথ্য লিপিবদ্ধ করুন" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "সঙ্গীত এর ধরন লিপিবদ্ধ করুন" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "সঙ্গীত এর সময় এর তথ্য লিপিবদ্ধ করুন" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "স্রুতসঙ্গীত এর সংখ্যা" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "অস্রুতসঙ্গীত এর সংখ্যা" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "সঙ্গীত টাইটল ট্যাগ যুক্ত করুন" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "সঙ্গীত এর ট্র্যাক ট্যাগ যুক্ত করুন" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "সঙ্গীত এর প্রকাশ কাল ট্যাগ যুক্ত করুন" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "সঙ্গীত এর ধারা যুক্ত করুন" #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "অন্য প্লে লিস্ট যুক্ত করুন" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "প্লে লিস্ট যোগ করুন" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "সঙ্গীত ধারাবাহিকতায় যুক্ত করুন" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "উইমোটেডেভ সংযুক্ত করুন" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "যোগ..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "এই মাসে প্রকাশিত" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "এই সপ্তাহে প্রকাশিত" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "এই বছর প্রকাশিত" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "আজ প্রকাশিত" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "বিগত তিন মাসে প্রকাশিত" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "অত্যাধুনিক সঞ্জুক্তিকরন" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "কপি হওয়ার পর" #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "অ্যালবাম" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "অ্যালবাম (পরিচ্ছন্ন আওয়াজ সমস্ত সঙ্গীত এর জন্য)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "অ্যালবাম শিল্পী" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "জামেন্দ.কম এর অ্যালবাম তথ্য..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "অ্যালবাম কভার" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "কভারবিহীন অ্যালবাম" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "সব ফাইল (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "সমস্ত অ্যালবাম গুলি" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "সমস্ত শিল্পীগণ" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "সর্বধরনের ফাইল (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "সমস্ত প্লে লিস্ট (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "সমস্ত অনুবাদকগন" #: library/library.cpp:98 msgid "All tracks" msgstr "সমস্ত ট্র্যাক গুলি" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "মধ্য/পার্শ্ববর্তী এনকোডিং অনুমোদন" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "আসল টি র সমান্তরাল ভাবে" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "স্থায়ী ভাবে মেন উইন্ডো সরিয়ে ফেলুন" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "স্থায়ী ভাবে মেন উইন্ডো বর্তমান রাখুন" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "স্থায়ী ভাবে সঙ্গীত চালু রাখুন" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "এক্ টি প্লাগ ইন প্রয়োজন। আপনি কি প্লাগ ইন টি ডাউনলোড করে ইন্সটল করতে ইচ্ছুক ?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "iTune ডাটাবেস লোডইং ত্রুটি র জন্য দুঃখিত ।" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "ত্রুটি পূর্ণ মেটা ডাটা সংযুক্তি %1" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:85 msgid "And:" msgstr "এবং" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "উপস্থিতি" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "ফাইল / ইউ আর এল প্লে লিস্ট এ সংযুক্তি করন" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "প্লে লিস্ট এ সংযুক্তি করন" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "প্লে লিস্ট এ সংযুক্তি করন" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "কম্প্রেসন যুক্ত করুন ।" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "আপনি কি স্থায়ী ভাবে %1 প্রেসেট টি ডিলিট করতে চান ?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "আপনি কি গান গুলি র পরিসংখ্যান রিসেট করতে চান ?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "শিল্পী" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "শিল্পী সম্পকিত তথ্য" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "শিল্পীর অদ্যাক্ষর" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "" #: ui/about.cpp:68 msgid "Authors" msgstr "গীতিকার" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "বিপিএম" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "" #: core/database.cpp:648 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "কিন্তু এই উৎসসমূহ নিষ্কিয় আছে:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "" #: core/song.cpp:428 msgid "CDDA" msgstr "" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "" #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "ক্লেমেন্টাইন যেসব ওয়েবসাইট থেকে লিরিক খুঁজবে সেগুলো নির্বাচন করুন।" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "যখন গান পরিবর্তন হয় তখন ক্লেমেন্টাইন বার্তা দেখাতে পারে।" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:114 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "কপিরাইট" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "আউটপুট ফাইল %1 খোলা যায়নি" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "প্রচ্ছদ সংগঠক" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "" #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "" #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "" #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "গানের তথ্য পরিবর্তন" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "গানের তথ্য পরিবর্তন..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "গানের তথ্য পরিবর্তন..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "" #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "খোঁজার বিষয়বস্তু এখানে লিখুন" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:68 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "তথ্য" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:585 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "ভুল তথ্য দেয়া হয়েছে" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "উইন্ডো বন্ধ করা হলেও পেছনে চলতে থাকুক" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "" #: library/library.cpp:80 msgid "Last played" msgstr "" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "দৈর্ঘ্য" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: ui/equalizer.cpp:137 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "" #: core/song.cpp:410 msgid "MPC" msgstr "" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "তাই হোক!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "সঙ্গীত" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "আমার সংগীত" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "" #: library/library.cpp:74 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:92 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "" #: core/utilities.cpp:151 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "" #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "" #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "" #: core/organise.cpp:73 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:139 msgid "Party" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "যদি বন্ধ থাকে তবে চালাও, যদি চালু থাকে তবে আটকাও" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "চালু কর যদি অন্য কিছু চালু না থাকে" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "পছন্দসমূহ" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "পছন্দসমূহ..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "সংস্করনের তথ্য ছাপুন" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "ক্রম সংগঠক" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "বৃষ্টি" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "আমার সংগীত থেকে মুছে ফেলুন" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "" #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "শব্দ মাত্র পরিবর্তন করলে বার্তা দেখাও" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "" #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "কোন উৎসগুলো সক্রিয় এবং নিষ্ক্রিয় তা দেখাও" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "গানের তথ্য" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "গানের তথ্য" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "উৎস" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "উৎসসমূহ" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "" #: core/song.cpp:431 msgid "Stream" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "" #: ui/about.cpp:74 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "শিরনাম" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "" #: core/song.cpp:426 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "" #: devices/giolister.cpp:157 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "যখন ক্লেমেন্টাইন চালু হয়" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "যখন তালিকা খালি..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/br.po000066400000000000000000005135611260417502300236550ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # arnaudbienner , 2011 # FIRST AUTHOR , 2010, 2011 # Gwenn M , 2013 # Gwenn M , 2011-2012 # Gwenn M , 2015 # Gwenn M , 2015 # Gwenn M , 2014-2015 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Breton (http://www.transifex.com/davidsansome/clementine/language/br/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: br\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nGallout a rit merkañ rolloù seniñ en ur glikañ war ar steredennig e-kichen anv ar roll seniñ\n\nAr rolloù seniñ merket a vo enrollet aze" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " devez" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kbde" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " me" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pik" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "s" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " eilenn" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " ton" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 a donioù)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 albom" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 a zevezhioù" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 a zevezhioù 'zo" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 war %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 roll seniñ (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 diuzet eus" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 ton" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 a donioù" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 a donioù kavet" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 a donioù kavet (%2 diskouezet)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 a roudoù" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 kaset" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1 : enlugellad wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 selaouer all" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "bet selaouet %L1 a wechoù" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n c'hwitet" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n echuet" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n a chom" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Steudañ an destenn" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "E K&reiz" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Personelaat" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "&Ouzhpenn" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Skoazell" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "K&uzhat %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "K&uzhat..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Kleiz" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "&Sonerezh" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Hini ebet" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "&Roll Seniñ" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Kuitaat" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Doare &adlenn" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Dehou" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Doare &meskañ" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Astenn ar bannoù evit klotañ gant ar prenestr" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Ostilhoù" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(disheñvel a-dreuz kanaouennoù liesseurt)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", gant" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "... Ha holl kenlabourerien Amarok" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 devezh" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 ton" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "MP3 128k" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192,000Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44,100Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48,000Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 ton dre zegouezh" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96,000Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Hizivaat da bPremium bremañ" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Ma n'eo ket diuzet, Clementine a glasko enrollañ ho notennoù hag ho stadegoù all en un diaz roadennoù disheñvel hep cheñch ho restroù.

Ma 'z eo diuzet, enrollañ a raio ho stadegoù en diaz roadennoù hag er restroù bep tro ma vo cheñchet.

N'ez a ket en-dro evit pep mentrezh ha dre ma n'eus reolenn ebet evit en ober, posupl eo ne vefe ket gouest d'al lennerien sonerezh all lenn ar restroù ken.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Lakait anv ur maezienn a-raok ur ger evit bevenniñ an enklask d'ar maezienn-se sk. arzour:Bode a glask er sonaoueg an holl arzourien gant ar ger Bode enno.

Maeziennoù a zo tu lakaat : %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Skriv a raio an dra-se notennoù ha stadegoù an ton er c'hlav evit kement ton en ho sonaoueg.

N'eus ket ezhomm m'eo an arventenn "Enrollañ an notennoù hag ar stadegoù e klav ar restr" atav bet gweredekaet.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Ar maeziennoù a grog gant %. Da skouer : %artist %album %title

\n

Ma lakait briataennoù tro-dro d'ul lodenn testenn gant ur maezienn, ne vo ket diskouezet ma n'eo ket resisaet endalc'had ar maezienn." #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Ret eo deoc'h kaout ur kont Spotify Premium." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Un arval ne c'hell kennaskañ nemet m'eo bet lakaet ar c'hod mat." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Ur roll seniñ speredek a zo ul listenn dinamek gant tonioù o tont eus ho sonaoueg. Bez ez eus doareoù listennoù speredek disheñvel, a ro an tu da ziuzañ an tonioù gant doareoù disheñvel." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Un ton a vo lakaet er roll seniñ ma glot gant an amplegadoù-mañ :" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ALL GLORY TO THE HYPNOTOAD" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Dilezel" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "A-zivout %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "A-zivout Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "A-zivout Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Absolut" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Titouroù ar gont" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Titouroù ar gont (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Oberiadenn" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Oberenn" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Gweredekaat/Diweredekaat Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Red obererezhioù" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Ouzhpennañ ar podkast" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Ouzhpennañ ul lanv" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Ouzhpennañ ul linenn nevez, mard eo skoret gant an doare kemenn" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Ouzhpennañ un oberiadenn" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Ouzhpennañ an holl roudoù adalek un doser hag an is-doseroù " #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Ouzhpennañ ul lanv all..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Ouzhpennañ un teuliad..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Ouzhpennañ ur restr" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Ouzhpennañ ur restr d'an treuzkemmer" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Ouzhpennañ ur restr pe muioc'h d'an treuzkemmer" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Ouzhpennañ ur restr..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Ouzhpennañ restroù da" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Ouzhpennañ un teuliad" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Ouzhpennañ un teuliad..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Ouzhpennañ un teuliad nevez..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Ouzhpennañ ar podkast" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Ouzhpennañ ur podkast..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Ouzhpennañ ur ger klask" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Ouzhpennañ klav albom an ton" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Ouzhpennañ klav arzour albom an ton" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Ouzhpennañ klav arzour an ton" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Ouzhpennañ poentoù emgefreek an ton" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Ouzhpennañ klav sonaozour an ton" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Ouzhpennañ klav pladenn an ton" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Ouzhpennañ anv restr an ton" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Ouzhpennañ klav doare an ton" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Ouzhpennañ klav rummad ar sonerezh" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Ouzhpennañ klav padelezh an ton" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Ouzhpennañ klav soner an ton" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Ouzhpennañ an niver a wech ma'z eo bet lennet an ton" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Ouzhpennañ notenn an ton" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Ouzhpennañ an niver a wech ma 'z eo bet lammet an ton" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Ouzhpennañ klav titl an ton" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Ouzhpennañ an ton d'ar grubuilh" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Ouzhpennañ klav niverenn an ton" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Ouzhpennañ klav bloavezh an ton" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Ouzhpennañ tonioù da \"Ma sonerezh\" p'eo kliket ar bouton \"Karout\"" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Ouzhpennan ul lanv..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Ouzhpennañ d'am sonerezh" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Ouzhpennañ d'am rolloù-seniñ Spotify" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Ouzhpennañ da tonioù karetañ Spotify" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Ouzhpennañ d'ur roll seniñ all" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Ouzhpennañ d'ar merkoù-pajenn" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Ouzhpennañ d'ar roll seniñ" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Ouzhpennañ d'al listenn c'hortoz" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Ouzhpennañ an implijer/strollad d'ar merkoù-pajenn" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Ouzhpennañ oberadennoù wiimotedev" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Ouzhpennañ..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Ouzhpennet ar miz-mañ" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Ouehpennet ar sizhun-mañ" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Ouzhpennet ar bloaz-mañ" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Ouzhpennet hiziv" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Ouzhpennet e-kerzh an tri miz diwezhañ" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Strolladur kemplez..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Goude " #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Goude an eiladur..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Albom" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Albom (Ampled peurvat evit an holl roud)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Arzour an albom" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Golo Albom" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Titouroù an albom war jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Albomoù" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Albomoù gant ur golo" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Albomoù hep golo" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Pep tra" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Holl restroù (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "All Glory to the Hypnotoad!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "An holl albomoù" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "An holl arzourien" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Holl restroù (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Holl rolloù seniñ (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "An holl troerien" #: library/library.cpp:98 msgid "All tracks" msgstr "An holl roudoù" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Aotren un arval da bellgargañ sonerezh adalek an urzhiataer-mañ." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Aotren ar pellgargadurioù" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Aotren an enkodiñ mid/side" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "E-kichen ar reoù orin" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Atav kuzhat ar prenestr pennañ" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Atav diskouez ar prenestr pennañ" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Atav kregin da lenn" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Stur Cloud Amazon" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Un enlugellad a zo ezhomm a-benn implij Spotify e-barzh Clementine. C'hoant ho peus pellgargañ ha staliañ anezhañ bremañ ?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Ur gudenn a zo savet en ur c'hargañ stlennvon iTunes" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Ur gudenn a zo savet e-pad enskrivadur ar metaroadennoù e-barzh '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Ur gudenn dianav a zo bet." #: ui/about.cpp:85 msgid "And:" msgstr "Ha(g) :" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Fuloret" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Neuz" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Ouzhpennañ restroù pe liammoù internet d'ar roll seniñ" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Ouzhpennañ d'ar roll seniñ lennet" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Ouzhpennañ d'ar roll seniñ" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Koazhañ a-benn mirout ouzh an troc'hadennoù" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Ha sur oc'h da gaout c'hoant diverkañ an talvoud raktermenet « %1 »" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Ha sur oc'h da gaout c'hoant da adderaouekaat statistikoù an ton-mañ ?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Ha sur oc'h da gaout c'hoant enrollañ an stadegoù an ton e-barzh restr an ton evit kement ton en ho sonaoueg ?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Arzour" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Arzour" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Klavioù an arzour" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Lizherennoù-tal an arzour" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Goulenn pa vez savetaet" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Mentrezh Aodio" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Ezkas son" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Dilesadur sac'het" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Aozer" #: ui/about.cpp:68 msgid "Authors" msgstr "Aozerien" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Emgefreek" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Ent emgefreek" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Hzivadurioù ent emgefreek" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Digeriñ ent emgefreek ar rummadoù o-unan e gwez ar sonaoueg" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Hegerz" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Fonnder keidennek" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Ment keidennek ar skeudenn" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "Podkastoù BBC" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Lanvioù drekleur" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Liv an drekleur" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Skeudenn drekleur" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Divoullder drekleur" #: core/database.cpp:648 msgid "Backing up database" msgstr "Enrolladenn ar stlennvon" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Kempouez ar son" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "Forbannañ (scrobbling Last.fm)" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Spektrogram dre varennoù" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Glas boutin" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Stumm audio boaz" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Emzalc'h" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Gwell" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Buhezskrid %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Fonnder" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Bitrate" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Fonnder bit" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Spektogram dre vloc'hoù" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Doare bloc'hoù" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Kementad a ruzed" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Korf" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Spektogram boom" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Furchal..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Padelezh ar stoker" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "O lakaat er memor skurzer" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "O sevel menegva Seafile..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Ar mamennoù-se a zo diweredekaet :" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Boutonoù" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Kemer e kont ar CUE sheet" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Hent ar c'hrubuilh :" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Krubulhiñ" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "Krubuilhiñ %1" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Nullañ" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Nullañ ar pellgargadur" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Ezhomm 'z eus eus ar c'haptcha.\nKlaskit kennaskañ dre Vk.com gant ho merdeer evit renkañ ar gudenn." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Kemmañ golo an albom" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Kemmañ ment ar font..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Cheñch an doare adlenn" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Kemmañ ar berradenn" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Cheñch an doare meskañ" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "O kemmañ an ton o vezañ lennet" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Kemmañ ar yezh" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "Arloet e vo ar c'hemmadennoù pa vo kroget da lenn an ton o tont" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Cheñchamantoù an doare lenn mono a vo gweredekaet evit an tonioù a zeu." #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Klask pennadoù nevez" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Gwiriekaat an hizivadennoù" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Klask hizivadurioù..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Dibab doser krubuilh Vk.com" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Choazit un anv evit ho roll seniñ spredek" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Choaz ent emgefreek" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Choaz ul liv..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Choaz ur font..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Choaz el listenn" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Choazit penaos emañ urzhiet ar roll seniñ hag an niver a donioù a zo e-barzh." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Choaz an teuliad pellgargañ podkastoù" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Dibabit ar servjioù internet ho 'peus c'hoant gwelet" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Lec'hiennoù web ho peus c'hoant implij evit klask komzoù" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Klasel" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "O naetaat" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Goullonderiñ" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Skarzhañ ar roll seniñ" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Kudenn gant Clementine" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Oranjez Clementine" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Skrammañ Clementine" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine a c'hell amdreiñ ar sonerezh eilet ganeoc'h war an drobarzhell-mañ d'ur mentrezh a c'hell lenn." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Gallout a ra Clementine lenn sonerezh bet kaset ganeoc'h betek Stur Cloud Amazon" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine a zo gouest da seniñ sonerezh bet karget war Box" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine a zo gouest da seniñ sonerezh bet karget war Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Gouest eo Clementine da lenn sonerezh bet lakaet war Google Drive." #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Gellout a ra Clementine seniñ sonerezh bet karget war OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine a c'hell diskouez ur gemennadenn pa gemm ar roud." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine a c'hell gourbediñ ho koumanantoù podkastoù gant urzhiataerioù ha poelladoù all. Krouiñ ur gont." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "N'eo ket bet gouest Clementine da gargañ diskwel projectM. Gwiriekait ez eo staliet mat Clementine." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Gweler skeudennoù Clementine" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "N'eo ket bet gouest Clementine da gavout disoc'hoù evit ar restr-mañ" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine a gavo ar sonerezh e :" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Klikit aze evit krouiñ ho levraoueg sonerezh" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Klikit aze evit merkañ ar roll seniñ-mañ evit ma vefe enrollet hag e vefe tu deoc'h adkavout anezhañ er rann \"Rolloù seniñ\" er varenn a-gleiz" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Klikit evit kemmañ etre an amzer a chom hag an amzer total" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Pouezhit war ar bouton Login evit digeriñ ur merdeer web. Ret e vo deoc'h distreiñ war Clementine ur wech kenasket." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Serriñ" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Serriñ ar roll seniñ" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Serriñ an hewelaat" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Serrin ar prenestr-mañ a paouezo ar pellgargadenn" #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Ma serrit ar prenestr-mañ e vo paouezet gant an enklask golo albom." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Klub" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Livioù" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Listenn dispartiet gant ur virgulenn eus klas:live, live etre 0 ha 3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Evezhiadenn" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Skingomz ar gumunelezh " #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Leuniañ ar c'hlavioù ent emgefreek" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Leuniañ ar c'hlavioù ent emgefreek..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Aozer" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Kefluniañ %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "KefluniañMagnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Kefluniañ ar Berradennoù" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Kefluniañ Spotify" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Kefluniañ Subsonic..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Keflunian Vk.com..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Kefluniañ an enklsak hollek..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Kefluniañ ar sonaoueg..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Kefluniañ ar podkastoù" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Kefluniañ..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Kennaskañ Wii Remote en ur implij an oberenn gweredekaat/diweredekaat" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "An drobarzhell a zo o kennaskañ" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "O kennaskañ da Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Kennask nac'het gant ar servijer, gwiriekait URL ar servijer. Da skouer : http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Ar c'hennask a lak re a amzer, gwiriekait URL ar servijer. Da skouer : http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Kudennoù kennaskañ pe diweredekaet eo bet ar son gant an implijer" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Letrin" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "CBR" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Treuzkemm an holl sonerezh" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Treuzkemm ar sonerezh ne c'hell ket an drobarzhell lenn" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Treuzkemm ar restroù son lossless a-raok kas anezhe d'ar pellurzhier." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Treuzkemm ar restroù lossless" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Kopiañ an url kenrannañ er golver" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Kopiañ d'ar golver" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Kopiañ war an drobarzhell" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Eilañ er sonaoueg..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Gwirioù arzour" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Dibosupl kennaskañ ouzh Subsonic, gwiriekait URL ar sevijer. Da skouer : http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Dibosubl eo krouiñ an elfenn GStreamer \"%1\" - gwiriekait ez eo staliet an enlugadelloù GStreamer diavaez" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "N'eus ket bet tu krouiñ ar roll-seniñ" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Dibosupl eo kavout ur multiplekser evit %1, gwiriekait ez eo staliet an enlugelladoù a-zere evit GStreamer" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Dibosupl eo kavout un enkoder evit %1, gwiriekait ez eo staliet ar enlugelladoù mat evit GStreamer" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Dibosubl eo digeriñ ar restr ec'hankañ %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Merour ar godeligoù" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Golo diwar ur skeudenn enframmet" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Golo karget ent emgefreek adalek %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Golo diweredekaet gant an dorn" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Golo nann diuzet" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Golo diuzet adalek %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Goloioù adalek %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Lakaat un treveuz pa vez kemmet ar roud ent emgefreek" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Lakaat un treveuz pa vez kemmet ar roudoù gant an dorn" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Personalaat" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Skeudenn personelaet :" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Kemennadenn arventennoù personelaet" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Personelaat..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "Hent DBus" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dañs" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Goubrenet eo ar stlennvon. Lennit https://code.google.com/p/clementine-player/wiki/DatabaseCorruption evit kaout titouroù a-benn adkavout ho stlennvon." #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Deizad krouadur" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Deizad kemmadur" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Deizioù" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "Dre &ziouer" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Digreskiñ an ampled eus 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Digreskiñ an ampled eus dre gant." #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Digreskiñ an ampled" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Skeudenn drekleur dre ziouer" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Trobarzhell dre ziouer war %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Dre ziouer" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Amzer etre ar heweladurioù" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Diverkañ" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Diverkañ ar roadennoù pellgarget" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Diverkañ restroù" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Diverkañ eus an drobarzhell" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Diverkañ eus ar bladenn" #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Diverkañ ar pennadoù lennet" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Diverkañ ar ragarventennoù" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Diverkañ ar roll seniñ speredek" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Diverkañ ar restroù orin" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "O tiverkañ restroù" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Dilemel ar roudoù diuzet diwar al listenn c'hortoz" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Dilemel ar roud-mañ diwar al listenn c'hortoz" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Pal" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Munudoù..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Trobarzhell" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Perzhioù an drobarzhell" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Anv an drobarzhell" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Oerzhioù an drobarzhell..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Trevnadoù" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Kendiviz" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "C'hoant ho poa lavar" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Ger-tremen Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Anv implijer Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Kennaskañ eeun da Internet" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Teuliad" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Diweredekaat ar padelezh" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Diweredekaat ar varenn-imor" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Diwederakaet" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Diwederakaet" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Pladenn" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Treuzkas digendalc'hus" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Dibarzhioù ar skrammañ" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Diskouez ar roll war ar skramm" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Ober un adc'hwilervadur eus ar sonaoueg a-bezh" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Ober un adc'hwilervadur a-bezh" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Ober un adc'hwilervadur a-bezh..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Chom hep treuzkemm ar sonerezh" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Chom hep skrivañ war-c'horre" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "Ober un adc'hwilervadur a-bezh a diverko an holl meta-roadennoù bet enrollet ganeoc'h e Clementine, evel ar golo, an niver a lennadennoù hag an notennoù. Clementine a adc'hwilervo holl ho sonerezh war ar Google Drive, ar pezh a c'hell kemer un nebeud amzer." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Chom hep adlenn" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Chom hep diskouez el lodenn \"arzourien liesseurt\"" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Chom hep diskouez ar rannoù selaouet" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Chom hep meskañ" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Chom hep paouez!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Reiñ arc'hant" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Daouglikañ evit digeriñ" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "Daou-glikañ un ton er roll seniñ a..." #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Daouglikañ war un ton..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Pellgargañ %n pennad" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Teuliad pellgargañ" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Pellgargañ ar pennadoù davet " #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Kevreañ d'ar pellgargadenn" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Pellgargañ pennadoù nevez ent emgefreek" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Pellgargadur e steuad" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Arventennoù pellgargañ" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Pellgargan ar poellad Android" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Pellgargañ an albom" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Pellgargañ an albom..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Pellgargañ ar pennad-mañ" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Pellgargañ" #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "O pellgargañ (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "O pellgargañ katalog Icecast" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "O pellgargañ katalog Jamendo" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "O pellgargañ katalog Magnatune" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "O pellgargañ enlugellad Spotify..." #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "O pellgargañ metadaveennoù" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Lakait da riklan avit adlakaat" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dubstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Padelezh" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Ar stumm dinamikel a zo aktivet" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Meskaj dargouezhek dialuskel" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Kemmañ ar roll seniñ speredek..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Cheñch an tag \"%1\"..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Cheñch ar c'hlav..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Cheñch ar c'hlavioù" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Cheñch deskrivadur ar roud" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Cheñch deskrivadur ar roud..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Cheñch deskrivadur ar roudoù..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Embann..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "Postel" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Aktivañ Wii Remote" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Gweredekaat ar c'hrubuilh emgefreek" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Aktivañ ar c'hevataler" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Aotren ar beradennoù pa vez enaouet prenestr Clementine nemetken" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Gweredekaat an embann meta-roadennoù eeun gant ur c'hlik" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Gweredekaat ar mammennoù dindan evit lakaat anezho e disoc'h an enklask. An disoc'h a vo diskouezet en urzh-mañ." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "(Di)gweredekaat scrobbling Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Kemplezh enkodiñ" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Perzhded al lusker enkodiñ" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Doare enkodiñ" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Lakait un URL" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Lakait un URL evit pellgargañ ur golo adalek internet" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Lakait anv ur restr evit ar goloioù ezporzhiet (askouezhadenn ebet) :" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Lakait un anv evit ar roll seniñ" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Skrivit gêrioù ho enklask aze evit kavout sonerezh war ho urzhiataer pe war an Internet." #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Lakait gerioù enklask dindan evit kavout podkastoù war an iTunes Store" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Lakait gerioù enklask dindan evit kavout podkastoù war gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Lakait amañ gerioù ho enklask" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Lakait chomlec'h red ur skingomz internet" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Skrivit anv an teuliad" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Lakait an IP-mañ er poellad evit kennaskañ da Clementine" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Dastumadeg hollek" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Kevataler" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Kenkoulz a --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Kenkoulz a --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Fazi" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Kudenn en ur eztennañ ar CD" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Ur gudenn a zo zo savet e-kerzh ar c'hennask gant an drobarzhell MTP" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Ur gudenn a zo savet e-kerzh kopiadur an tonioù" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Ur gudenn a zo savet e-kerzh dilamidigezh an tonioù" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Ur gudenn a zo savet o pellgargañ enlugellad Spotify" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Ur gudenn a zo savet e-pad kargadur %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Kudenn o kargañ roll seniñ di.fm" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Ur gudenn a zo savet e-pad treterezh %1 : %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Kudenn e-pad kargadenn ar CD audio" #: library/library.cpp:68 msgid "Ever played" msgstr "Bet lennet dija" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Bep 10 munutenn" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Bep 12 eurvezh" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Bep 2 eurvezh" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Bep 20 munutenn" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Bep 30 munutenn" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Bep 6 eurvezh" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Bep eurvezh" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "War-bouezh etre ar roudoù eus ar memes albom pe eus ar memes follenn CUE" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Goloioù a zo aze" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Brasaat" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Ne vo ket mat ken d'an %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Ezporzhiañ ar goloioù" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Ezporzhiañ ar goloioù" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Ezporzhiañ ar goloioù pellgarget" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Ezporzhiañ ar goloioù enlakaet" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Ezporzhiadur echuet" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Ezporzhiet %1 golo war %2 (%3 tremenet)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Izelaat ar son tamm-ha-tamm evit an ehan / Uhelat evit adkregiñ" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Echuiñ gant un treveuz pa vez paouezet ur roud" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Arveuz" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Padelezh an arveuz" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Kudenn en ul lenn ar CD" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "C'hwited eo bet adtapadenn an teuliad" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "C'hwitet eo bet gant tapadenn ar podkastoù" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "C'hwitet e bet gant kargadenn ar podkastoù" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "C'hwitet eo bet o lenn al lanv RSS" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Trumm" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Roudoù karetañ" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Tapout ar goloioù a vank" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Kerc'hat ent emgefreek" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Pellgargadur echu" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "O tapout sonaoueg Subsonic" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Ur gudenn a zo savet e-pad pellgargadur ar golo" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Mentrezh ar restr" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Askouzehadenn ar restr" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Mentrezhoù restroù" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Anv ar restr" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Anv ar restr (hep an hent)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Patrom anv ar restr :" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Treugoù ar restr" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Ment ar restr" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Stumm ar restr" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Anv ar restr" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Restroù" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Restroù da treuzkemmañ" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Kavout an tonioù e-barzh ho sonaoueg a glot gant an dezverkoù bet meneget ganeoc'h." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Kavout an arzour-mañ" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "O genel ar roud audio" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Echuiñ" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Live kentañ" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Klotañ ar golo gant al ledander" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Ment an nodrezh" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Dre abegoù lañvaz ez eo meret Spotify gant un enlugellad distag." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Forsiñ an enkodiñ mono" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Disonjal an drobarzhell" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Disoñjal un drobarzhell a denn anezhi eus al listenn-mañ ha rediet e vo Clementine da adklask an holl donioù a zo enni ar wech a zeu ma vo kennasket." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Form" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Mentrezh" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Skeudennoù dre eilenn" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Skeudennoù dre buffer" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Skornet" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Full Bass" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Fumm Bass + Treble" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Full Treble" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Hollek" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Arventennoù hollek" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Doare" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Kaout un URL evit rannañ an ton spotify mañ" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Kaout un URL evit rannañ ar roll-seniñ mañ" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "O taspugn ar c'hanolioù" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "O tegemer al lanvioù" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Reiñ un anv:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Go" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Mont d'ar roll seniñ o tont" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Mont d'ar roll seniñ a-raok" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Kavet %1 golo diwar %2 (%3 c'hwitet)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Grisaat an tonioù n'int ket mui em roll seniñ" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Strollañ al sonaoueg dre..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Strollad dre" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Strollañ dre Albom" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Strollañ dre Arzour" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Strollañ dre Arzour/Albom" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Strollañ dre Arzour/Bloaz - Albom" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Strollañ dre Zoare/Albom" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Strollañ dre Zoare/Arzour/Albom" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Strolladenn" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "Ar pajenn HTML a oa hep lanv RSS ebet." #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "Kod Statud HTTP 3xx resevet hep URL, gwiriekait kefluniadur ar servijer." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "Proksi HTTP" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Laouen" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Titouroù war an dafar" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Tu zo gwelout an titouroù war an dafar nemet ma 'z eo kennasket an drobarzhell." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Uhel" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Uhel (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Uhel (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "HipHop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "N'eo ket bet kavet an herberc'hier, gwiriekait URL ar servijer. Da skouer : http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Eurioù" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "N'am eus kont Magnatune ebet" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Arlun" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Arlunioù en uhelañ" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Anaoudadur an ton" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "M'eo gweredekaet e vo tu deoc'h embann klavioù an tonioù er roll-seniñ war-eeun" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Ma gendalc'hit, an drobarzhell a vo gorek hag an tonioù kopiet a c'hello chom hep mont en-dro." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Ma anavezit URL ur podkast, lakait anezhañ dindan ha pouezit war Go." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Ober hep ma vefe \"The\" e anvioù an arzourien" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Skeudennoù (*.png, *.jpg, *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Skeudennoù (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Enporzhiañ..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "A-benn %1 deizh" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "A-benn %1 sizhun" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "E stumm dinamek, roudoù nevez a vo choazet hag ouzhpennet e fin al roll seniñ bep taol ma vo echu gant un ton." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Boest degemer" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Diskouez an albom er gemenadenn" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Ouzhpennañ an holl tonioù" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Handelv protokol REST Subsonic digenglotus. Hizivait an arval." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Handelv protokol REST Subsonic digenglotus. Ret eo d'ar servijer hizivaat." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Kefluniadur diglok, bezit sur eo leuniet an holl maeziennoù." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Kreskiñ an ampled eus 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Kreskiñ an ampled eus dre gant" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Kreskiñ an ampled" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Menegeradur %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Titouroù" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Dibaboù enkas" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Enlakaat..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Staliaet" #: core/database.cpp:585 msgid "Integrity check" msgstr "O gwiriañ an anterinder" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Pourchaserien internet" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Servijoù internet" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "Roudennoù digeriñ" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Alc'hwez API didalvoudek" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Mentrezh didalvoudek" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Hentenn didalvoudek" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Arventennoù didalvoudek" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Loazioù erspizet didalvoudek" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Servij didalvoudek" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Kudenn gant alc'hwez an dalc'h" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Tuginañ an diuzad" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Roudoù Jamendo Selaouet an aliesañ" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Top roudoù Jamendo" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Top ar miz roudoù Jamendo" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Top ar sizhun roudoù Jamendo" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Stlennvon Jamendo" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Lammat diouzhtu d'an ton a-raok" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Mont d'ar roud lennet bremañ" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Pouezhit war ar bouton e-pad %1 eilenn..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Pouezhit war ar boutoñn e-pad %1 eilenn..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Leuskel da dreiñ pa 'z eo serret ar prenstr" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Dec'hel ar restroù orin" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Bisig" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Yezh" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Hezoug/Selaouegoù" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Sal bras" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Golo albom tev" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Golo albom ledan (munudoù dindan)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Golo albom ledan (munudoù ebet)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Barenn gostez ledan" #: library/library.cpp:80 msgid "Last played" msgstr "Selaouet e ziwezhañ" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Sonet e ziwezhañ" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm a zo ac'hubet, klaskit en-dro en un nebeut munutennoù" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Ger-tremen Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Niver a selaouadennoù Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Klavioù Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Anv implijer Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Wiki last.fm" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Roudoù an nebeutañ plijet" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Kleiz" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Padelezh" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Sonaoueg" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Strolladur ar sonaoueg kemplesoc'h" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Kemenn hizivadur ar sonaoueg" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Enklask ar sonaoueg" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Bevennoù" #: ui/equalizer.cpp:137 msgid "Live" msgstr "End-eeun" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Kargañ" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Kargañ ar golo adalek un url" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Kargañ ar golo adalek un url..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Kargañ ur golo adalek ar bladenn" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Kargañ ar golo adalek ur bladenn..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Kargañ ar roll seniñ" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Kargañ ar roll seniñ..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "O kargañ an drobarzhell MTP" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "O kargañ stlennvon iPod" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Kargañ ar roll seniñ speredek" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "O kargañ tonioù" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "O kargañ al lanv" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "O kargan roudoù" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "O kargañ titouroù ar roud" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "O kargañ..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Kargañ restroù pe liammoù internet, hag eilec'hiañ ar roll seniñ" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Kennaskañ" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "C'hwitet eo bet ar c'hennaskañ" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Digennaksañ" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Aelad Diougan Padus (ADP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Karout" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "Karout (scrobbling Last.fm)" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Izel (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Izel (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Aelad e Luzierezh Gwan (ALG)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Komzoù" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Komzoù eus %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Komzoù adalek ar c'hlav ID3v2" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Pellgargañ Magnatune" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Pellgargadenn Magnatune echuet" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Aelad pennañ (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Ober evel-se !" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Gra an dra-mañ !" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Lakaat ar roll seniñ da vezañ lennus ezlinenn" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Respont furmed fall" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Kefluniadur dornel ar proksi" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Gant an dorn" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Aozer" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Merkañ evel selaouet" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Merkañ evel nevez" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Implij an holl gerioù enklsask (HA)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Implij unan pe meur a gerioù enklask (PE)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Maks an disoc'hoù enklask hollek" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Fonnder uhelañ" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Kemmet eo bet ar media. Adkargadenn" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Etre (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Etre (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Doare emezeladur" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Fonnder izelañ" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Leuniadur minimum ar skurzer" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Ragarventennoù projectM a vank" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Patrom" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Evezhiañ cheñchamantoù ar sonaoueg" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Lenn e mono" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Mizioù" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Imor" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Doare ar varenn imor" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Barenn imor" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Muioc'h" #: library/library.cpp:84 msgid "Most played" msgstr "Lennet an aliesañ" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Poent staliañ" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Poentoù staliañ" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Dindan" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Dilec'hiañ davit ar sonaoueg..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "A-us" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Sonerezh" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Sonaoueg" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Mut" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Va albomoù" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Ma Sonerezh" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Ma erbedadennoù" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Anv" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Anv" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Dibarzhioù anv" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Bandenn strizh (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Proksi rouedad" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Rouedad pell" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Morse" #: library/library.cpp:74 msgid "Never played" msgstr "Morse sonet" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Morse kregiñ da lenn" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Teuliad nevez" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Roll seniñ nevez" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Roll seniñ speredek nevez..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Tonioù nevez" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Ar roudoù nevez a vo ouzhpennet ent emgefreek." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Roudoù nevesañ" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Da-heul" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Roud o tont" #: core/utilities.cpp:151 msgid "Next week" msgstr "Ar sizhun a-zeu" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Dezrannerez ebet" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Skeudenn drekleur ebet" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Golo ebet da ezporzhiañ" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Bloc'h hir ebet" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "N'eo bet kavet netra. Diverkañ ar boest enklask evit diskouez ar roll seniñ en e-bezh." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Bloc'h berr ebet" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Hini ebet" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Ton ebet eus ar reoù diuzet a oa mat evit bezañ kopiet war an drobarzhell" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Reizh" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Rizh bloc'h skoueriek" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "N'eus ket tu implij pa vez implijet ur roll seniñ dinamek" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Digennasket" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "N'eus ket trawalc'h a endalc'h" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "N'eus ket trawalc'h a fans" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "N'eus ket izili a-walc'h" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "N'eus ket trawalc'h a amezeizen" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "N'eo ket staliet" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "N'eo ket kennasket" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "N'est ket savet - daouglikañ evit sevel" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "N'eo bet kavet netra" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Doare kemenn" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Kemenadennoù" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "O seniñ" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Niver a rannoù da ziskouez" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Rakwel an OSD" #: widgets/osd.cpp:173 msgid "Off" msgstr "Off" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "On" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Asantiñ kennaskadennoù o tont eus an arvalien er rummadoù IP-se hepken :⏎ 10.x.x.x⏎ 172.16.0.0 - 172.31.255.255⏎ 192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Aotren ar c'hennaskoù eus ar rouedad lec'hel nemetken" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Diskouez an hini kentañ nemetken" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Demerez" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Digeriñ %1 er merdeer" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Lenn ur CD &audio" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Digeriñ ur restr OPML" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Digeriñ ur restr OPML..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Digeriñ ur c'havlec'h evit enporzhiañ ar sonerezh dioutañ" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Digeriñ an drobarzhell" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Digeriñ ur restr..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Digeriñ e-barzh Google Drive" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Digerin en ur roll seniñ nevez" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Digeriñ en ur roll-seniñ nevez" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Digeriñ en ho merdeer" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Digeriñ..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Oberiadenn c'hwitet" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Gwelladenn ar fonnder" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Gwelladenn ar perzhded" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Dibarzhioù..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Aozañ ar restroù" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Aozañ ar restroù..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Oc'h aozañ ar restroù" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Klavioù orin" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "Bloavezh orin" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "Bloavezh orin - albom" #: library/library.cpp:118 msgid "Original year tag support" msgstr "Skor ar c'hlav \"bloavezh orin\"" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Dibarzhioù all" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Ezkas" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Trobarzhell ezkas" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Dibarzhioù ezkas" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Skrivañ war pep tra" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Flastrañ ar restroù a vez diouto dija" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Skrivañ war ar re bihanoc'h nemetken" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Perc'henn" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "O tielfennañ katalog Jamendo" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Fest" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Ger-tremen" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Ehan" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Ehan al lenn" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Ehanet" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Soner" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Piksel" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Bareen gostez simpl" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Lenn" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Konter selaouadennoù" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Lenn pe ehan, hervez ar stad" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Lenn ma vez netra all o vezañ lennet" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Seniñ an vet roud eus ar roll seniñ" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Lenn/Ehan" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Lenn sonerezh" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Dibarzhioù al lenner" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Roll seniñ" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Roll seniñ echuet" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Dibarzhioù ar roll seniñ" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Doare ar roll seniñ" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Rolloù seniñ" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Klozit ho merdeer ha deuit en-dro war Clementine mar plij." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Stad an enlugellad" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podkastoù" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Padelezh ar popup" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Porzh" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Rak-ampled" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Gwellvezioù" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Gwellvezioù" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Gwellvezioù..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Anv ar goloioù karetañ (dispartiet gant virgulennoù)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Mentrezh audio karetañ" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Bitrate karetañ " #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Mentrezh karetañ" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Rizh audio premium" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Ragarventenn :" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Pouezhit war ur c'henaozadur touchennoù evit implij " #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Pouezit war un douchenn" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Pouezit war ur kombinadenn touchennoù evit implij %1" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Pouezañ \"A-raok' el lenner a..." #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Dibarzhioù an OSD brav" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Rakwel" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "A-raok" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Roud a-raok" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Diskouez titouroù an handelv" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Aelad" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Enraog" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Enraog" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psykedelik" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Pouezit war bouton ar Wiiremote" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Lakaat an tonioù en un urzh dre zegouezh" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Perzhded" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Perzhded" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Goulennadeg trobarzhell" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Merour listenn c'hortoz" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Lakaat ar roudoù da heul" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Lakaat ar roud da heul" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Skingomz (Ampled kevatal evit an holl roudoù)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Glav" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Glav" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Heweladur dargouezhek" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Lakaat 0 steredenn evit an ton lennet" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Lakaat 1 steredenn evit an ton lennet" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Lakaat 2 steredenn evit an ton lennet" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Lakaat 3 steredenn evit an ton lennet" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Lakaat 4 steredenn evit an ton lennet" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Lakaat 5 steredenn evit an ton lennet" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Notenn" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Sur oc'h da gaout c'hoant da nullañ" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Aet e biou ar vevenn adkas, gwiriekait kefluniadur ar servijer." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Hizivaat ar c'hatalog" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Hizivaat ar c'hanolioù" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Hizivat listenn ar savlec'hioù" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Hizivaat al lanvioù" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Relativel" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Kaout soñj eus fiñv ar Wii remote" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Kaout soñj eus ar wech diwezhañ" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Kaout soñj eus va dibab" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Tennañ" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Tennañ an oberiadenn" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Tennañ an tonioù doubl eus ar roll seniñ" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Tennañ an teuliad" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Tennañ eus va sonerezh" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Tennañ eus va merkoù-pajenn" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Tennañ kuit eus ar roll seniñ" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Tennañ ar roll seniñ" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Tennañ ar rolloù seniñ" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Tennañ an tonioù dihegerz eus ar roll-seniñ" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Adenvel ar roll seniñ" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Adenvel ar roll seniñ..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Adniverenniñ ar roudoù en urzh-mañ..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Adlenn" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Adlenn an albom" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Adlenn ar roll seniñ" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Adlenn an ton" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Eillec'hiañ ar roll seniñ lennet" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Eillec'hiañ ar roll seniñ" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Eillec'hiañ esaoù gant is-linennoù" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Doare Replay Gain" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Adpoblañ" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Ezhomm 'zo eus ur c'hod kennaskañ" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Adderaouiñ" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Adderaouiñ ar konter lennadennoù" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Adlenn an ton, ha lammat d'an hini a-raok ma vez adpouezet" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Adkregiñ ar roud, pe lenn ar roud a-raok m'eo kroget abaoe 8 eilenn pe nebeutoc'h." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Bevenniñ ouzh an arouezennoù ASCII" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Kenderc'hel da seniñ pa grog ar poellad" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Distreiñ war Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Dehou" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Eztennañ" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Eztennañ ar bladenn" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Eztennañ ar bladenn aodio" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Seveniñ" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "SOCKS proksi" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Kudenn er c'hennask SSL, gwiriekait kefluniadur ar servijer. An arventenn SSLv3 en traoñ a c'hell reizhañ kudennoù 'zo." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Tennañ an drobarzhell diarvar" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Tennañ an drobarzhell diarvar goude an eilañ" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Standilhonañ" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Standilhonañ" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Enrollit ho restroù .mood en ho sonaoueg" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Enrollañ golo an albom" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Enrollan ar golo war ar bladenn..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Enrollañ ar skeudenn" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Enrollañ ar roll-seniñ" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Enrollañ ar roll seniñ" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Enrollañ ar roll seniñ..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Enrollañ ar ragarventennoù" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Enrollañ an notennoù e klav ar restr pa 'z eo posupl" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Enrollañ ar stadegoù e klav ar restr pa 'z eo posupl" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Enrollañ al lanv-mañ en ivinell internet" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "O enrollañ stadegoù an tonioù e restr an tonioù" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Enrolladur an tonioù" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Aelad ar feur standilhonañ (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Cheñch ar ment" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Poentoù" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Scrobble ar roudoù selaouet ganin" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Klask" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Klask" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Klask war savlec'hioù Icecast" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Klask Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Klask Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Klask Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Klask ent emgefreek" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Klask goloioù albom..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Klask pep tra" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Klask war gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Klask war iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Doare klask" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Dibarzhioù klask" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Disoc'hoù an enklask" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Gerioù enklask" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "EIl live" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Mont war gil" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Mont war-raok" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Klask ar roud lennet gant ur sammad relativel" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Klask ar roud lennet gant ul lec'hiadur absolud" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "Klask gant ur verradenn klavier" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Diuzañ an holl" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Diuzañ hini ebet" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Diuzañ liv an drekleur" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Choaz ar skeudenn drekleur" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Diuzañ an disoc'h gwellañ" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Diuzañ liv ar c'hentañ renk" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Diuzañ heweladurioù" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Diuzañ heweladurioù..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Diuzañ..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Niver heuliad" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Servijer" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "URL ar servijer" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Munudoù ar servijer" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Servij ezlinenn" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Termeniñ %1 d'an talvoud %2..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Termeniñ an ampled da dre gant" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Lakaat un talvoud evit an holll roudoù diuzet" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Arventennoù" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Berradenn" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Berradenn evit %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Berradenn evit %1 a zo dija anezhañ" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Diskouez" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Diskouez OSD" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Lugerniñ ar roud o vezañ lennet" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Diskouez ar varenn imor el lenner" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Implij reizhad kemenadenn ar burev" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Diskouez ur gemennadenn pa cheñchan an doare adlenn/meskañ" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Diskouez ur gemennadenn pa cheñchan an ampled" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Diskouez ur gemennadenn pa ehanan ar sonadenn" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Diskouez ur popup e-kichen ar zonenn kemenadennoù" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Diskouez un OSD brav" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Diskouez a-us d'ar varenn stad" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Diskouez an holl tonioù" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Diskouez an holl tonioù" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Diskouez ar golo er sonaoueg" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Diskouez an dispartierien" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Diskouez er ment gwirion..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Diskouez ar strolladoù e disoc'hoù an enklask hollek" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Diskouez er merdeer retroù" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Diskouez er sonaoueg" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Diskouez e \"Arzourien Liesseurt\"" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Diskouez ar varenn imor" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Diskouez an doublennoù nemetken" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Diskouez an tonioù hep klav nemetken" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Diskouez an ton o vezañ lennet war ho bajenn" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Diskouez alioù enklask." #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Diskouez ar bouton \"karout\"" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Diskouez ar bouton scrobbling er prenestr pennañ" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Diskouez an ikon er zonenn kemenadennoù" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Diskouez peseurt mamenn a zo gweredekaet ha pe re a zo diweredekaet." #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "DIskouez/Kuzhañ" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Meskañ" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Meskañ an albomoù" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Meskañ an holl" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Meskañ ar roll seniñ" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Meskañ an tonioù war an albom-mañ" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Kennaskañ" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Digennaskañ" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "O kennaskañ..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Arzourien dammheñvel" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Ment" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Ment:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Mont a-drek er roll seniñ" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Konter tonioù lammet" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Mont dirak er roll seniñ" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Tremen ar roudoù diuzet" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Tremen ar roud" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Golo album bihan" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Barenn gostez bihan" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Roll seniñ speredek" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Rolloù seniñ speredek" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Titouroù an ton" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Ton" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Digarezit" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Urzhiañ dre doare (urzh lizherennek)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Urzhiañ dre doare (dre brud)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Urzhian dre anv savlec'h" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Urzhiañ an tonioù gant" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Urzhiañ" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Mammenn" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Mammennoù" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Kudenn kennaskañ gant Spotify" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "URL roll-seniñ Spotify" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Enlugellad Spotify" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Enlugellad Spotify n'eo ket staliet" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "URL ton Spotify" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Boaz" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Karetañ" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Kregiñ gant an eztennadenn" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Kregiñ ar roll seniñ" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Kregin an transkodiñ" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Krogit da skrivañ un dra bennak er boest enklask a-us evit leuniañ listenn an disoc'hoù." #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "O kregiñ %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "O kregiñ..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Paouez" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Paouez goude" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Paouez goude pep roudenn" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Paouez goude pep roudenn" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Paouez goude ar roud-mañ" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Paouez goude vefe lennet an ton" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Paouez goude ar roud lennet" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Paouez da lenn goude ar roud : %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Paouezet" #: core/song.cpp:431 msgid "Stream" msgstr "Lanv" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Evit implij ar streaming adalek ur servijer Subsonic goude an 30 devezh amprouiñ ho peus ezhomm eus ul lañvaz servijer reizh." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Izili streaming" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Koumananterien" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Berzh !" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "%1 skrivet" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Klavioù atizet" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Taolenn" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Uhel tre (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Bras-tre (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Mentrezhoù restr kemeret e kont" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Gourbediñ bremañ ar stadegoù er restroù" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Sinkronizadur ar boest degemer Spotify" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Sinkronizadur ar roll seniñ Spotify" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Sinkronizadur tonioù gwellañ Spotify" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Livioù ar reizhad" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Ivinelloù a-us" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Leunier klav" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Fonnder tizhet" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Tekno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Dibarzhioù an testenn" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Trugarez da" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "An urzh \"%1\" ne c'hell ket bezañ kroget." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Golo an albom o vezañ lennet" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "An teuliad %1 a zo direizh" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "An eil talvoud a rank bezañ uheloc'h eget an hini kentañ" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Ar lec'hienn goulennet n'eus ket dioutañ" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Al lec'hienn goulennet n'eo ket ur skeudenn" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Ar mare amprouiñ evit ar servijer Subsonic a zo echuet. Roit arc'hant evit kaout un alc'hwez lañvaz mar plij. KIt war subsonic.org evit ar munudoù." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Handelv nevez Clementine a c'houlenn ma vefe hizivaet ho sonaoueg evit kemer e kont an arc'hweladurioù a-zeu :" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Tonioù all a zo en album-mañ" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Ur gudenn a zo bet e-pad an eskemm gant gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Ur gudenn a zo savet evit kaout metaroadennoù adalek Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Ur gudenn a zo bet o lenn respont ar servij iTunes" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Ur gudenn a zo evit kopian tonioù 'zo. Ar restroù-mañ n'int ket bet kopiet :" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Ur gudenn a zo evit diverkan tonioù 'zo. Ar restroù-mañ n'int ket bet diverket :" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Ar restroù-mañ a vo diverket eus an drobarzhell, sur oc'h da gaout c'hoant kenderc'hel ?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Ar restroù-mañ a vo diverket da vat eus ar bladenn, sur oc'h kaout c'hoant kenderc'hel ?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "An teuliadoù-mañ a vo furchet enno evit klask sonerezh da lakaat e-barzh ho sonaoueg" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "An arventennoù-se a zo implijet e \"Transkodañ ar sonerezh\", ha pa vez treuzkemmet sonerezh a-raok lakaat anezhi war un drobarzhell." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Trede live" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Kement-se a krouo ur stlennvon 150Me tamm-pe-damm. Ha sur oc'h kenderc'hel ?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "N'ez eus ket eus an albom er mentrezh goulennet" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Tu vo deoc'h kemmañ an dra-se dre ar gwellvezioù " #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "An drobarzhell-mañ a rank bezañ liammet ha digoret a-raok ma c'hallfe Clementine gwelet ar mentrezhoù restroù a c'hell lenn." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "An drobarzhell a c'hell lenn ar mentrezhoù restroù mañ :" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "An drobarzhell ne ze ket en-dro evel ma zere" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Un drobarzhell MTP eo, met komplet eo bet Clementine hep al levraoueg libmtp." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Un iPod eo, met komplet eo bet Clementine hep al levraoueg libgpod." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Ar wech kentañ eo e liammit un drobarzhell-mañ. Clementine a skanno an drobarzhell a-benn kavout sonerezh - gellout a ra kemer amzer." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Ar arventenn-mañ a c'hell bezañ kemmet e rann \"Emzalc'h\" ar gwellvezioù" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Al lanv-mañ a zo evit an izili o deus paet." #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "An doare trobarzhell-mañ n'eo ket meret :%1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "Paz amzer" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Titl" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Hiziv" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Gweredekaat/Diweredekaat an OSD brav" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Tremen e skramm leun" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Cheñch stad al listenn c'hortoz" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Cheñch ar scrobbling" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Gweredekaat/Diweredekaat an OSD brav" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Warc'hoaz" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Bet adkaset re a wech " #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Top tonioù" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Hollad an albomoù:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Niver a eizhbit treuzkaset" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Niver a atersadennoù rouedad" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Roud" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Roudoù" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Treuzkodañ Sonerezh" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Renabl an transkoder" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Transkodiñ" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "O transkodiñ %1 restr oc'h implij %2 threads" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Dibarzhioù transkodiñ" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbin" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Lazhañ" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL(où)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Bandenn ledan tre (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Dibosupl kennaskañ" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "N'eus ket tu pellgargañ %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Dianav" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Doare endalc'h dianavezet" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Kudenn dianav" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Ar golo n'eo ket bet lakaet" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Nullañ tremen ar roudoù diuzet" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Nullañ tremen ar roud" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Digoumanantiñ" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Sonadegoù o-tont" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Hizivaat" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Hizivaat ar podkastoù" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Hizivaat teuliadoù kemmet ar sonaoueg" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Hizivaat ar sonaoueg pa grog Clementine" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Hizivaat ar podkast-mañ" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Hizivadur" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Hizivadenn %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Hizivadenn %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "O hizivaat ar sonaoueg" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Implij" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Implij klav arzour an albom pa vez tu" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Implij berradennoù Gnome" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Ober gant livioù psikedelek" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Implij metaroadenn Replay Gain ma 'z eo posubl" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Implijout SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Implij ar Wii Remote" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Implij ur roll livioù personelaet" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Implij ur kemenadennoù personelaet" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Implijout ur pellurzhier rouedad" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Implij ar c'jennaskañ" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Implij al lusker managment dre bitrate" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Implij mod dinamikel" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Implij ar c'hemennadennoù evit embann stad ar wiimote" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Implij ar mod kemmañ ar sonioù evit ur mare" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Implij yezh dre ziouer ar reizhad" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Implij roll livioù dre ziouer ar reizhad" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Implij arventenoù dre ziouer ar proksi" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Implij normalizadur an ampled" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Implijet" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Etrefas implijer" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Lezanv" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Implij ar roll evit ouzhpennañ un ton a..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Fonnder kemmus" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Arzourien Liesseurt" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Handelv %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Gwelout" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Doare heweladur" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Heweladurioù" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Arventennoù heweladurioù" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Dinoer aktivelezh mouezh" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Ampled %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Moger" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Gervel ac'hanon pa vez serret un ivinell roll seniñ" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Lec'hienn web" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Sizhunvezhioù" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Pa grog Clementine" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "E-pad ma klask Clementine goloioù, implij a raio e penn kentañ ar restroù gant unan eus an anvioù-se. Ma n'eus ket diouto, Clementine a implijo skeudenn brasañ an teuliad." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "Pa vez savetaet ur roll-seniñ, ar c'havlec'hioù a rank bezañ" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Pa 'z eo goullo al listenn..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Tu zo deoc'h klask..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Bandenn ledan (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wiimote %1: gweredekaet" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wiimote %1: Kennasket" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wiimote %1: energiezh kritikal (%2%)" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wiimote %1: diweredekaet" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wiimote %1: Digennasket" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wiimote %1: energiezh izel (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "ausio Windows Media" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Hep golo:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Ha c'hoant ho peus lakaat tonioù all an albom-mañ e Arzourien Liesseurt ?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "C'hoant ho peus d'ober ur c'hwilervadenn eus al levraoueg bremañ ?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Skrivañ stadegoù an holl tonioù e restroù an tonioù" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Skrivañ ar meta-roadennoù" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Anv-implijer pe ger-tremen fall." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Bloaz" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Bloaz - Albom" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Bloaz" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Dec'h" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Emaoc'h o vont da pellgargañ an albomoù-mañ" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Ha sur oc'h kaout c'hoant diverkañ %1 roll seniñ eus ho reoù karetañ ?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Emaoc'h o vont da dennañ ur roll seniñ a n'eo ket e-touez ar re merket: ar roll seniñ a vo diverket da vat.\nHa sur oc'h kaout c'hoant kenderc'hel ?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "N'oc'h ket kennasket." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Kennasket oc'h evel %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Kennasket oc'h." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Tu zo deoc'h kemman an doare ma vo renket an tonioù er sonaoueg." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Tu zo deoc'h selaou digoust hep kont, met an izili Premium a c'hell selaou gant ur berzhded uheloc'h hag hep bruderezh." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Tu zo deoc'h selaou digoust tonioù Magnatune hep kaout ur gont. Gant ur gont ez eus tu deoc'h tennañ ar gemennadenn e fin pep ton." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Tu zo deoc'h selaou al lanvioù drekleur d'ar memes koulz ha sonerezh all" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Tu zo deoc'h implijout ho Wii Remote evel ur pellurzhier evit Clementine, Sellit ar bajenn war wiki Clementine evit muioc'h a ditouroù.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "N'ho peus ket a kont Spotify Premium." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "N'ho peus ket a koumanant gweredekaet" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "N'oc'h eus ket ezhomm bezañ kennasket evit selaou ouzh sonerezh war SoundCloud. Hogen, tu zo deoc'h kennaskañ evit tizhout ho rolloù-seniñ hag ho red." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Digennasket oc'h bet diouzh Spotify, adskrivit ho ker-tremen e-barzh prenestr an arventennoù." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Digennasket oc'h bet diouzh Spotify, adskrivit ho ker-tremen mar plij." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Karout a rit ar roud-mañ" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "Ezhomm ho peus da lañsañ ar Gwellvezioù Reizhad ha aotren Clementine da \"kontroliñ ho urzhiataer\" evit implij berradennoù hollek e Clementine" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Ezhomm a vo adloc'hañ Clementine ma cheñchit ar yezh." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Ho chomlec'h IP a zo :" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Hoc'h aotreoù arveriad evit Last.fm a zo direizh." #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Hoc'h aotreoù arveriad evit Magnatune a zo direizh." #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Ho sonaoueg a zo goullo !" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Ho lanvioù skingomz." #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Ho skroble : %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "N'emañ ket OpenGl war ho reizhad, n'eus ket tu deoc'h kaout an heweladurioù." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Hoc'h anv implijer pe ho ger-tremen a zo direizh." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "ouzhpennañ %n ton" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "goude" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "'zo" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "ha" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "ent emgefreek" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "araok" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "etre" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "brasañ araok" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bdm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "en deus" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "diweredekaet" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "pladenn %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "n'en deus ket" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "a echu gant" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "zo kevatal da" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "Teuliad gpodder.net" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "brasoc'h eget" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "N'ez a ket en-dro an trobarzhelloù iPod hag USB war WIndows evit ar mare. Digarezit !" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "etrezek ar re ziwezhañ" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbde" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "nebeutoc'h eget" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "hirañ araok" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "diblasañ %n ton" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "nevesañ araok" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "disheñvel diouzh" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "a-raok ar re ziwezhañ" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "ket war" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "koshoc'h da gentañ" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "war" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "dibarzhioù" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "pe skannit ar c'hod QR !" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "pouezit war Enankañ" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "Tennañ %n ton" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "berrañ araok" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "Meskañ an tonioù" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "bihanañ araok" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "Urzhiañ an tonioù" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "a grog gant" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "paouez" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "roud %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/bs.po000066400000000000000000004140751260417502300236560ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # FIRST AUTHOR , 2011 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Bosnian (http://www.transifex.com/davidsansome/clementine/language/bs/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bs\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " sekundi" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " pjesama" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 albuma" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 dana" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "prije %1 dana" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 popisa pjesama (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 označeno od" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 pjesma" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 pjesama" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 pjesama pronađeno" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 pjesama pronađeno (prikazano %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 pjesama" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1 Wiimotedev modul" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n neuspjelo" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n završeno" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n ostalo" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Složij tekst" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Sredina" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Vlastito" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Pomoć" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&Sakrij %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Sakrij..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Lijevo" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Nijedan" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Izlaz" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Desno" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Razvuci red da odgovara veličini prozora" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(različito među više pjesama)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...i svim Amarok pomagačima" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 dan" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 pjesma" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 nasumičnih pjesama" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Pametna lista pjesama, je dinamička lista pjesama koja je nastala iz vaše kolekcije. Postoje različiti tipovi pametnih listi koji omogućavaju različite našine odabiranja pjesama." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Pjesma će biti uključena u listu pjesama ako zadovoljava ove uslove." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "SVA SLAVA HIPNOŽABI" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "O %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "O Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "O Qt-u..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Detalji o nalogu" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Akcija" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Pokreni/zaustavi Wii-daljinski" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Dodaj tok" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Dodaj akciju" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Dodaj još jedan tok..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Dodaj fasciklu..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Dodaj datoteku..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Dodaj datoteke za pretvorbu" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Dodaj fasciklu" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Dodaj fasciklu..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Dodaj novu fasciklu..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Unesi termin za pretraživanje" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Dodaj tok..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Dodaj drugoj listi pjesama" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Dodaj u listu pjesama" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Dodaj na listu čekanja" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Dodaj wiimotedev akciju" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Dodaj..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Dodano ovaj mjesec" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Dodano u ovoj sedmici" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Dodano ove godine" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Dodano danas" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Dodano u zadnja tri mjeseca" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Napredno grupiranje" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Poslije kopiranja..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Album (idealna jačina za sve pjesme)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Izvođač albuma" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Informacije o albumu na jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Albumi sa omotom" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Albumi bez omota" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Sve datoteke (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Svi albumi." #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Svi izvođači" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Sve datoteke (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Sve liste pjesama (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Svi prevodioci" #: library/library.cpp:98 msgid "All tracks" msgstr "Sve pjesme" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Pored orginala" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Uvjek sakrij glavni prozor" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Uvjek prikaži glavni prozor" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Uvjek počni sa slušanjem" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Desila se greška prilikom učitavanja iTunes baze podataka" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Desila se greška prilikom zapisivanja meta podataka na '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:85 msgid "And:" msgstr "I:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Izgled" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Dodaj datoteke/URL.ove listi pjesama" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Dodaj trenutnoj listi pjesama" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Primjeni kompresiju da bi sprječio smetnje" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Jeste li sigurni da želite obrisati \"%1\" podešavanje?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Jeste li sigurni da želite obrisati statistiku ove pjesme?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Izvođač" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Informacije o izvođaču" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Izvođačevi inicijali" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Audio format" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Autentifikacija nije prošla" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "" #: ui/about.cpp:68 msgid "Authors" msgstr "Autori" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Automatsko osvježavanje" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Dostupno" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Pozadinski tokovi" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Boja pozadine" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Providnost pozadine" #: core/database.cpp:648 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Osnovna plava" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Ponašanje" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Biografija od %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Protok bitova" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Pretraži..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Dugmad" #: core/song.cpp:428 msgid "CDDA" msgstr "" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "CUE lista podrška" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Promjeni omot" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Promjeni veličinu slova..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Promjeni način ponavljanja" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Promjeni kraticu..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Promjeni jezik" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Provjeri za nadogradnje..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Izaberite ime za svoju pametnu listu pjesama" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Izaberi automatski" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Izaberi boju..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Izaberi iz liste" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Izaberi kako će se lista pjesama sortirati, te koliko će pjesama da sadrži." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Izaberite web stranicu za koje želite da Clementine koristi prilikom pretrage za tekstom pjesme." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Klasična" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Čisto" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Isprazni listu pjesama" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Clementine Greška" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Clementine narandžasta" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Clementine vizualizacije" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine može automatski da pretvori muziku koju kopirate na ovaj uređaj u njemu podržani format." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine može prikazati poruku kada se promjeni pjesma." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementin nije mogao učitati projectM vizualizacije. Provjerite da li ste instalirali Clementine kako treba." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Clementine preglednik slika" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine nije mogao pronaci rezultate za ovu datoteku" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Kliknite ovjde da dodate neku muziku" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Kliknite da mjenjate između ukupnog i preostalog vremena" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Zatvorite vizualizacije" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Zatvarajući ovaj prozor, otkazat ćete preuzimanje." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Zatvarajući ovaj prozor, zaustavit ćete pretrzagu za omotima albuma." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Klubski" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Komentar" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Automatski završi oznake" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Automatski završi oznake..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Kompozitor" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Podesi Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Podesi prečice" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Podesi biblioteku..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Spoji Wii daljinski koristeći akciju aktivacija/de-aktivacija" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Spoji uređaj" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Pretvori svu muziku" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Pretvori svu muziku koju ovaj uređaje ne podržava" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Kopiraj na uređaj..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Kopiraj u biblioteku..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Nije moguće napraviti GStreamer element \"%1\" - provjerite da li imate sve potrebne GStreamer dodatke instalirane." #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Nemoguće pronaći muxer za %1, provjerite da li imate sve potrebne GStreamer dodatke instalirane." #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Nemoguće otvoriti izlaznu datoteku %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Menadžer omota" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Omoti sa uključene slike" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Omot učitan automatski sa %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Omot ručno poništen" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Omot nije podešen" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Omot podešen sa %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Glatki prelaz sa pjesme na pjesmu, prilikom automatskog prelaženja." #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Prilagođeno" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Posebno..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "DBus putanja" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dens" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Datum stvaranja" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Datum izmjenje" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "Uo&bičajena" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Smanji glasnost" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Podrazumijevano" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Razmak između vizualizacija" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Obriši datoteke" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Obriši sa uređaja" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Obriši sa diska..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Obriši postavke" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Obriši pametnu listu" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Obriši orginalne datoteke" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Brišem datoteke" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Makni sa liste čekanja označene pjesme" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Makni sa liste čekanja označenu pjesmu" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Odredište" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Detalji..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Uređaj" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Osobine uređaja" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Ime uređaja" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Osobine uređaja..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Uređaji" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Direktna internet veza" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Fascikla" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Disk" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Opcije prikazivanje" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Prikaži prikaz na ekranu" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Uradi ponovni pregled biblioteke" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Ne pretvaraj nikakvu muziku" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Ne ponavljaj" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Ne prikazuj u raznim izvođačima" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Ne mješaj" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Ne zaustavljaj!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Dupli klik za otvaranje" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Dupli klik na pjesmu će..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Preuzmi fasciklu" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Prezmi članstvo" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Preuzmi ovaj album" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Preuzmi ovaj album..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "" #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Preuzimam Icecast fasciklu" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Preuzimam Jamendo katalog" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Preuzimam Magnatune katalog" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "" #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:68 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:585 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "" #: library/library.cpp:80 msgid "Last played" msgstr "" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: ui/equalizer.cpp:137 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "" #: core/song.cpp:410 msgid "MPC" msgstr "" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "" #: library/library.cpp:74 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:92 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "" #: core/utilities.cpp:151 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "" #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "" #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "" #: core/organise.cpp:73 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:139 msgid "Party" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "" #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "" #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "" #: core/song.cpp:431 msgid "Stream" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "" #: ui/about.cpp:74 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "" #: core/song.cpp:426 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "" #: devices/giolister.cpp:157 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/ca.po000066400000000000000000005222651260417502300236360ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Adolfo Jayme Barrientos, 2014-2015 # Adolfo Jayme Barrientos, 2012-2013 # Adolfo Jayme Barrientos, 2015 # Adolfo Jayme Barrientos, 2013 # Adolfo Jayme Barrientos, 2014 # FIRST AUTHOR , 2010 # davidsansome , 2013 # Roger Pueyo Centelles , 2011-2014 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Catalan (http://www.transifex.com/davidsansome/clementine/language/ca/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nPodeu marcar llistes de reproducció com a favorites fent clic a la icona de l’estel corresponent\n\nLes vostres llistes favorites es desaran aquí" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " dies" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kb/s" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " segons" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " cançons" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 cançons)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 àlbums" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 dies" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "fa %1 dies" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 a %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 llistes de reproducció (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 seleccionades de" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 cançó" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 cançons" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 cançons trobades" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 cançons trobades (mostrant %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 temes" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 transferit" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1 mòdul Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 oients més" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 reproduccions en total" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n han fallat" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n han acabat" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n restants" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Alinea el text" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Centre" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Personalitzades" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "E&xtres" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Ajuda" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&Amaga «%1»" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Amaga…" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Esquerra" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "&Música" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Cap" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "&Llista de reproducció" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Surt" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Mode de repetició" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Dreta" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Mode aleatori" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Encabeix les columnes a la finestra" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Eines" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(diferents a les diverses cançons)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", per" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "… i tots aquells que han contribuït amb l’Amarok" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 dia" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 peça" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "MP3 de 128k" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40 %" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 peces a l’atzar" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Actualitzeu a Premium ara" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Si no s’activa, el Clementine intentarà desar les vostres valoracions i altres estadístiques en una base de dades separada, sense modificar els vostres fitxers.

Si s’activa, es desaran les estadístiques en la base de dades i directament en els fitxers, cada vegada que es modifiquen.

Tingueu en compte que això podria no funcionar amb tots els formats i, com no existeix un estàndard, altres reproductors de música podrien no ser capaces de llegir-los.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Això guardarà les valoracions i estadístiques en etiquetes que s’escriuran en els fitxers de la vostra col·lecció.

Això no és necessari si el paràmetre «Desa les valoracions i estadístiques en etiquetes de fitxer» sempre ha estat activat.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Les fitxes de reemplaçament comencen amb %, per exemple: %artist %album %title

\n\n

Si demarqueu entre claus una secció de text que contingui una fitxa de remplaçament, aquesta secció no es mostrarà si la fitxa de remplaçament es troba buida.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Us cal un compte Premium de l’Spotify." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Només es pot connectar un client si s’introdueix el codi correcte." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Una llista de reproducció intel·ligent és una llista dinàmica de cançons que es troben a la vostra col·lecció. Existeixen diferents tipus de llistes de reproducció intel·ligent que ofereixen formes diferents de seleccionar cançons." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "S’inclourà una cançó a la llista de reproducció si coincideix amb aquestes condicions." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A–Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "LLOEM L’HIPNOGRIPAU" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Interromp" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Quant al %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Quant al Clementine…" #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Quant al Qt…" #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Absoluts" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Detalls del compte" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Detalls del compte (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Acció" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Acció" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Habilita/inhabilita el Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Llista d’activitats" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Afegeix un podcast" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Afegeix un corrent de dades" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Afegeix una línia nova si és compatible amb el tipus de notificació" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Afegeix una acció" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Afegeix totes les peces des d’una carpeta y las seves subcarpetes" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Afegeix un altre flux…" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Afegeix un directori…" #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Afegeix un fitxer" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Afegeix un fitxer al convertidor" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Afegeix fitxer(s) al convertidor" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Afegeix un fitxer…" #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Afegeix fitxers per convertir-los" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Afegeix una carpeta" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Afegeix una carpeta…" #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Afegeix una carpeta nova…" #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Afegeix un podcast" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Afegeix un podcast…" #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Afegeix un terme de cerca" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Afegeix l’etiqueta d’àlbum a la cançó" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Afegeix l’etiqueta «albumartist» a la cançó" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Afegeix l’etiqueta d’artista a la cançó" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Afegeix valoració automàtica a la cançó" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Afegeix l’etiqueta de compositor a la cançó" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Afegeix l’etiqueta de disc a la cançó" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Afegeix el nom de fitxer de la cançó" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Afegeix l’etiqueta de gènere a la cançó" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Afegeix etiqueta d’agrupació de la cançó" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Afegeix l’etiqueta de durada a la cançó" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Afegeix etiqueta d’intèrpret de la cançó" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Afegeix el nombre de reproduccions" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Afegeix una valoració a la cançó" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Afegeix comptador de passades de cançó" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Afegeix l’etiqueta de títol a la cançó" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Afegeix la cançó a la memòria cau" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Afegeix l’etiqueta de número de peça a la cançó" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Afegeix l’etiqueta d’any a la cançó" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Afegeix cançons a La meva música en fer clic a «M’encanta»" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Afegeix un flux…" #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Afegeix a La meva música" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Afegeix a les llistes de l’Spotify" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Afegeix a les destacades de l’Spotify" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Afegeix a una altra llista de reproducció" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Afegeix als preferits" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Afegeix a la llista de reproducció" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Afegeix a la cua" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Afegeix l’usuari/grup als preferits" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Afegeix una acció del Wiimotedev" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Afegeix…" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Afegides aquest mes" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Afegides aquesta setmana" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Afegides aquest any" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Afegides avui" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Afegides els últims tres mesos" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Agrupament avançat…" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Després de" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Després de copiar…" #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Àlbum" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Àlbum (volum ideal per a totes les peces)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Artista de l’àlbum" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Caràtula de l’àlbum" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Informació de l’àlbum a jamendo.com…" #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Àlbums" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Àlbums amb caràtules" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Àlbums sense caràtules" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Tot" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Tots els fitxers (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "Lloem l’hipnogripau!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Tots els àlbums" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Tots els artistes" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Tots els fitxers (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Totes les llistes de reproducció (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Tots els traductors" #: library/library.cpp:98 msgid "All tracks" msgstr "Totes les peces" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Permetre que un client baixi música d’aquest equip." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Permet les baixades" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Permet la codificació centre/costats" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Al costat dels originals" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Oculta sempre la finestra principal" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Mostra sempre la finestra principal" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Comença sempre la reproducció" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon Cloud Drive" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Necessitareu un connector addicional per usar Spotify en el Clementine. Voleu baixar-ho i instal·lar-ho ara?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "S’ha produït un error en carregar la base de dades de l’iTunes" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "S’ha produït un error en escriure les metadades a «%1»" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "S’ha produït un error no especificat." #: ui/about.cpp:85 msgid "And:" msgstr "I:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Enfadat" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Aparença" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Afegeix fitxers/URL a la llista de reproducció" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Afegeix a la llista de reproducció actual" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Afegeix a la llista de reproducció" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Aplica compressió per evitar el «clipping»" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Esteu segur que voleu eliminar la predefinició «%1»?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Esteu segur que voleu restablir les estadístiques d’aquesta cançó?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Esteu segur que voleu escriure les estadístiques de les cançons en tots els fitxers de la vostra col·lecció?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Artista" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Inf.artista" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Etiquetes de l’artista" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Inicials de l’artista" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Pregunta-m’ho en desar" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Format d’àudio" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Sortida d'àudio" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Ha fallat l’autenticació" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Autor" #: ui/about.cpp:68 msgid "Authors" msgstr "Autors" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Auto" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Automàtic" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Actualització automàtica" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Expandeix automàticament les categories úniques en l’arbre de la col·lecció" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Disponible" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Velocitat de bits mitjà" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Mida d’imatge mitjà" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "Podcasts de la BBC" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "PPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Fluxes en segon pla" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Color de fons" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Imatge de fons" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Opacitat del fons" #: core/database.cpp:648 msgid "Backing up database" msgstr "S’està fent una còpia de seguretat de la base de dades" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Balanç" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Analitzador de barres" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Blau bàsic" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Tipus d’àudio bàsic" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Comportament" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Millor" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Biografia de %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Taxa de bits" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Taxa de bits" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Taxa de bits" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Analitzador de blocs" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Tipus de bloc" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Quantitat de difuminació" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Cos" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Analitzador de ressonància" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Explora…" #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Durada de la memòria intermèdia" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Emplenant la memòria intermèdia" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "S’està creant l’índex de Seafile…" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Però aquests orígens estan desactivats:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Botons" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Compatibilitat amb fulles CUE" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Ubicació de la memòria cau:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Emmagatzemant a la memòria cau" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "Emmagatzemant %1 a la memòria cau" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Cancel·la" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Cancel·la la baixada" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Cal emplenar el «captcha».\nProveu d’iniciar la sessió en el Vk.com des del navegador per corregir el problema." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Canvia la caràtula" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Canvia la mida de la lletra" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Canvia la manera de repetició" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Canvia la drecera…" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Canvia el mode aleatori" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Canvia l’idioma" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "El canvi en el paràmetre de reproducció monofònic serà efectiu per a les següents cançons en reproducció" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Comprova si hi ha nous episodis" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Comprova si hi ha actualitzacions" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Comprova si hi ha actualitzacions…" #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Trieu la carpeta de memòria cau del Vk.com" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Trieu un nom per a la llista de reproducció intel·ligent" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Tria automàticament" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Tria el color…" #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Tria el tipus de lletra…" #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Tria de la llista" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Trieu com ordenar la llista de reproducció i quantes cançons contindrà." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Escolliu el directori de baixada dels podcasts" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Trieu els serveis en Internet que voleu mostrar." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Trieu els llocs web que voleu que el Clementine usi per cercar lletres de cançons." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Clàssica" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "S’està netejant" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Neteja" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Neteja la llista de reproducció" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Error de Clementine" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Taronja de Clementine" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Visualització de Clementine" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "El Clementine pot convertir automàticament la música que copieu en aquest dispositiu a un format que pugui reproduir." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "El Clementine pot reproduir música que hàgiu penjat a l’Amazon Cloud Drive" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "El Clementine pot reproduir música que hàgiu penjat al Box" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "El Clementine pot reproduir música que hàgiu penjat al Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "El Clementine pot reproduir música que hàgiu penjat al Google Drive" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "El Clementine pot reproduir música que hàgiu penjat a l’OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "El Clementine pot mostrar un missatge cada vegada que la peça canvia." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine pot sincronitzar la vostra llista de subscripcions amb els vostres altres ordinadors i aplicacions de podcasts. Creeu un compte." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "El Clementine no ha pogut carregar cap visualització de projectM. Assegureu-vos que teniu el Clementine instal·lat correctament." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Visor d’imatges del Clementine" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "El Clementine no ha trobat resultats per a aquest fitxer" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "El Clementine trobarà música a:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Feu clic aquí per afegir música" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Feu clic aquí per marcar aquesta llista com a favorita i afegir-la al panell «Llestes de reproducció» de la barra lateral" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Feu clic aquí per alternar entre el temps de reproducció restant i total" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Premeu «Entra» i s’obrirà un navegador. Quan acabeu, torneu al Clementine." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Tanca" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Tanca la llista de reproducció" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Tanca la visualització" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Si tanqueu aquesta finestra es cancel·larà la baixada." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "En tancar aquesta finestra es detindrà la cerca de les caràtules dels àlbums." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Colors" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Llista separada per comes de classe:nivell, el nivell és 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Comentari" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Ràdio de la comunitat" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Completa les etiquetes automàticament" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Completa les etiquetes automàticament…" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Compositor" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Configura %1…" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Configura el Magnatune…" #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Configura les dreceres" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Configura l’Spotify…" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Configura Subsonic…" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Configura Vk.com..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Configura la cerca global…" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Configura la col·lecció…" #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Configura els podcasts…" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Configura…" #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Connetar els comandaments remot Wii amb l'acció activar/desactivar" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Connecta el dispositiu" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "S’està connectant amb l’Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "El servidor ha rebutjat la connexió, comproveu l’URL del servidor. Exemple: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "S’ha esgotat el temps d’espera de la connexió, comproveu l’URL del servidor. Exemple: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Hi ha un problema en la connexió o el propietari ha inhabilitat l’àudio" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Terminal" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Taxa de bits constant" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Converteix tota la música" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Convertir qualsevol música que el dispositiu no pugui reproduir" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Converteix els fitxers sense pèrdues abans d’enviar-los al comandament." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Converteix els fitxers sense pèrdues" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Copia l’URL per compartir en el porta-retalls" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Copia al porta-retalls" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Copia al dispositiu…" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Copia a la col·lecció…" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Copyright" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "No s’ha pogut connectar amb el Subsonic, comproveu l’URL del servidor. Exemple: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "No s’ha pogut crear l’element «%1» de GStreamer. Comproveu que teniu tots els connectors requerits de GStramer instal·lats" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "No s’ha pogut crear la llista de reproducció" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "No s’ha pogut trobar un muxer per %1. Comproveu que teniu els connectors adequats de GStreamer instal·lats" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "No s’ha pogut trobar un codificador per %1. Comproveu que teniu els connectors adequats de GStreamer instal·lats" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "No s’ha pogut obrir el fitxer de sortida %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Gestor de caràtules" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Imatge de la portada autocontinguda al fitxer" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "S’ha carregat la caràtula automàticament de %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "S’ha esborrat la imatge de la caràtula manualment" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "No s’ha definit la caràtula" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Imatge de portada establerta des de %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Caràtules de %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Fusiona el so quan es canviï la peça automàticament" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Fusiona el so quan es canviï la peça manualment" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Baix" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Maj+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Maj+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Maj+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Amunt" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Personalitzat" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Imatge personalitzada:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Configuració personalitzada dels missatges" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Personalitza..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "Camí del DBus" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dance" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "S’ha detectat un dany en la base de dades. Consulteu https://code.google.com/p/clementine-player/wiki/DatabaseCorruption per obtenir instruccions per recuperar la base de dades" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Data de creació" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Data de modificació" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Dies" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "Per de&fecte" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Redueix el volum un 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Redueix el volum per cent" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Redueix el volum" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Imatge de fons per defecte" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Dispositiu per defecte a %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Opcions per defecte" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Retard entre visualitzacions" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Eliminar" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Suprimeix les dades baixades" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Suprimeix els fitxers" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Suprimeix del dispositiu…" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Suprimeix del disc…" #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Suprimeix els episodis escoltats" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Elimina la predefinició" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Elimina la llista de reproducció intel·ligent" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Suprimeix els fitxers originals" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "S’estan suprimint els fitxers" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Treu de la cua les peces seleccionades" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Treu de la cua la peça" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Destí" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Detalls…" #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Dispositiu" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Propietats del dispositiu" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Nom de dispositiu" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Propietats del dispositiu…" #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Dispositius" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Diàleg" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Potser volíeu dir" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Contrasenya de Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Usuari de Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Connexió directa a Internet" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Directori" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Inhabilita la durada" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Desactiva la generació de barres d’ànim" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Inhabilitat" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Inhabilitat" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Disc" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Transmissió discontínua" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Opcions de visualització" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Mostrar la indicació-a-pantalla" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Analitza tota la col·lecció de nou" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Torna a analitzar tota la col·lecció" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Torna a analitzar tota la col·lecció…" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "No converteixis cap musica" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "No ho sobreescriguis" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "En fer l’anàlisi sencera es perdran les metadades desades al Clementine, com les caràtules, el nombre de reproduccions i les valoracions. El Clementine tornarà a analitzar tota la vostra música al Google Drive, la qual cosa pot trigar algun temps." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Sense repetició" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "No ho mostris a Artistes diversos" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "No hi mostris els episodis escoltats" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Sense mescla" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "No aturar!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Feu una donació" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Feu doble clic per obrir" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "En fer doble clic a una cançó..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Baixa %n episodis" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Directori de descàrregues" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Baixa els episodis a" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Membres de descarrega" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Baixa els episodis nous automàticament" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Baixada en la cua" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Paràmetres de baixades" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Baixeu l’aplicació per l’Android" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Baixa aquest àlbum" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Baixa aquest àlbum…" #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Baixa aquest episodi" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Baixa…" #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "S’està baixant (%1%)…" #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "S’està baixant el directori d’Icecast" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "S’està baixant el catàleg del Jamendo" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "S’està baixant el catàleg de Magnatune" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "S’està baixant el connector d’Spotify" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "S’estan baixant les metadades" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Arrossegueu per canviar de posició" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dubstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Durada" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "S’ha activat el mode dinàmic" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Mescla dinàmica aleatòria" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Edita la llista de reproducció intel·ligent" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Edita l’etiqueta «%1»…" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Edita l’etiqueta…" #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Edita les etiquetes" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Edita la informació de la peça" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Edita la informació de la peça…" #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Edita la informació de les peces..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Edita…" #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "Adreça electrònica" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Habilita el comandament a distància del Wii" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Habilita l’emmagatzematge automàtic en memòria cau" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Habilita l’equalitzador" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Activa les dreceres només quan el Clementine tingui el focus" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Edita les metadades d’una cançó amb un clic" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Activeu les fonts següents per incloure-les en els resultats de les cerques. Els resultats es mostraran en aquest ordre." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Activa/desactiva el «scrobbling» del Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Complexitat de la codificació" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Qualitat del motor de codificació" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Mode de codificació" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Introduïu un URL" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Introduïu l’URL per baixar una caràtula des d’Internet" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Introduïu un nom de fitxer per les caràtules exportades (sense extensió):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Introduïu un nom per aquesta llista de reproducció" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Escrigueu termes de cerca per trobar música al vostre ordinador i a la Internet" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Introduïu termes de cerca per trobar podcasts a iTunes Store" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Introduïu termes de cerca per trobar podcasts a gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Introduïu els termes de la cerca" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Introduïu l’URL d’un flux de ràdio per Internet:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Introduïu el nom de la carpeta" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Escriviu aquesta IP en l’aplicació per connectar amb Clementine." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Tota la col·lecció" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Equalitzador" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Equivalent a --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Equivalent a --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Error" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "S’ha produït un error en copiar des del CD" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Error connectant el dispositiu MTP" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "S’ha produït un error en copiar les cançons" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "S’ha produït un error en suprimir les cançons" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "S’ha produït un error en baixar el connector d’Spotify" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "S’ha produït un error en carregar %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "S’ha produït un error en carregar la llista de reproducció del di.fm" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "S’ha produït un error en processar %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "S’ha produït un error en carregar el CD d’àudio" #: library/library.cpp:68 msgid "Ever played" msgstr "Reproduïdes alguna vegada" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Cada 10 minuts" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Cada 12 hores" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Cada 2 hores" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Cada 20 minuts" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Cada 30 minuts" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Cada 6 hores" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Cada hora" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Excepte entre peces del mateix àlbum o del mateix full CUE" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Caràtules existents" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Expandeix" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Caduca el %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Exporta les caràtules" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Exporta les caràtules" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Exporta les caràtules baixades" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Exporta les caràtules incrustades" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Ha finalitzat l’exportació" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "S’han exportat %1 caràtules de %2 (s’han omès %3)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Atenua el volum en pausar i en reprendre" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Esvaeix el so en parar una peça" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Esvaïment" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Durada de l’esvaïment" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Ha fallat la lectura de la unitat de CD" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "No s'ha pogut obtenir el directori" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "No s'han pogut obtenir els podcasts" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "No s'ha pogut carregar el podcast" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "No s’ha pogut analitzar el codi XML d’aquest canal RSS" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Ràpid" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Peces favorites" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Recull les caràtules que falten" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Recull automàticament" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "S'han acabat d'obtenir les dades" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "S’està recollint la col·lecció de l’Subsonic" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "S’ha produït un error en obtenir la caràtula" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Format del fitxer" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Extensió del fitxer" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Format dels fitxers" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Nom del fitxer" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Nom del fitxer (sense camí)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Patró del nom del fitxer:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Camins dels fitxers" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Mida del fitxer" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Tipus de fitxer" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Nom de fitxer" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Fitxers" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Fitxers per convertir" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Troba cançons en la vostra col·lecció que coincideixen amb el criteri especificat." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Troba a aquest artista" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "S’està identificant la cançó" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Finalitzat" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Primer nivell" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Ajusta la caràtula a l’amplada" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "FLAC" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Mida de la lletra" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "A causa de la seva llicència, el suport per a Spotify es troba en un connector a part." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Força la codificació mono" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Oblida el dispositiu" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Oblidar un dispositiu l'eliminarà de la llista i Clementine haurà de tornar a examinar totes les cançons el proper cop que el connecti." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Formulari" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Format" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Taxa de mostreig" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Trames per espai de memòria intermèdia" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Congelat" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Baixos complets" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Baixos i aguts complets" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Aguts complets" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "General" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Configuració general" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Estil" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Obtingues l’URL per compartir aquesta cançó de l’Spotify" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Obtingues l’URL per compartir aquesta llista" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "S’estan obtenint els canals" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "S’estan obtenint els fluxos" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Doneu-li un nom:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Vés-hi" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Vés a la pestanya de la següent llista de reproducció" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Vés a la pestanya de l'anterior llista de reproducció" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "S’han trobat %1 caràtules de %2 (%3 han fallat)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Enfosqueix les cançons de les llistes de reproducció que no es puguin trobar" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Agrupa la col·lecció per…" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Agrupa per" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Agrupa per àlbum" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Agrupa per artista" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Agrupa per artista/àlbum" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Agrupa per artista/any–àlbum" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Agrupa per gènere/àlbum" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Agrupa per gènere/artista/àlbum" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Agrupació" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "La pàgina HTML no conté cap canal RSS" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "S’ha rebut el codi d’estat d’HTTP 3xx sense un URL, comproveu la configuració del servidor." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "Proxy HTTP" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Content" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Informació del maquinari" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "La informació del maquinari només està disponible mentre el dispositiu està endollat." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Alt" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Alta (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Alta (1024 × 1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "Hip hop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "No s’ha trobat l’amfitrió, comproveu l’URL del servidor. Exemple: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Hores" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hipnogripau" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "No tinc cap compte a Magnatune" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Icona" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Icones a la part superior" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "S’està identificant la cançó" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "En habilitar aquesta opció, podreu fer clic en la cançó seleccionada de la llista de reproducció i editar els valors directament" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Si continueu, aquest dispositiu funcionarà lentament i les cançons que hi copieu podrien no reproduïr-se." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Si coneixeu l’URL d’un podcast, escriviu-ho a continuació i feu clic a Vés-hi." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Ignora «The» als noms dels artistes" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Imatges (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Imatges (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Importa…" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "D’aquí a %1 dies" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "D’aquí a %1 setmanes" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "En el mode dinàmic, les peces noves s’escolliran i afegiran a la llista de reproducció cada vegada que acabi una cançó." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Safata d’entrada" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Incloure la caràtula a la notificació" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Inclou totes les cançons" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "La versió del protocol REST de Subsonic és incompatible. El client ha d’actualitzar-se." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "La versió del protocol REST de Subsonic és incompatible. El servidor ha d’actualitzar-se." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "La configuració està incompleta. Assegureu-vos que heu emplenat tots els camps." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Incrementa el volum un 4 %" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Augmenta el volum per cent" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Incrementa el volum" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "S’està indexant %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Informació" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Opcions d’entrada" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Insereix…" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Instal·lat" #: core/database.cpp:585 msgid "Integrity check" msgstr "Comprovació d’integritat" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Proveïdors d’Internet" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Serveis en Internet" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "La clau de l’API no és vàlida" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "El format no és vàlid" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "El mètode no és vàlid" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Els paràmetres no són vàlids" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "El recurs especificat no és vàlid" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "El servei no és vàlid" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "La clau de sessió no és vàlida" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Inverteix la selecció" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Peces més escoltades al Jamendo" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Les millors peces del Jamendo" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Les millors peces del mes al Jamendo" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Les millors peces de la setmana al Jamendo" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Base de dades del Jamendo" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Vés a la peça anterior" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Vés a la peça que s’està reproduïnt" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Premeu els botons per %1 segon…" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Premeu els botons per %1 segons…" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Conserva l’aplicació executant-se en segon pla quan tanqueu la finestra" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Conserva els fitxers originals" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Gatets" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Idioma" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Portàtil/auriculars" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Saló gran" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Caràtula de l’àlbum gran" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Caràtula de l’àlbum gran (detalls a sota)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Caràtula de l’àlbum gran (sense detalls)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Barra lateral gran" #: library/library.cpp:80 msgid "Last played" msgstr "Reproduïdes l’última vegada" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Darrera reproducció" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm esta actualment saturat, reintentau passats uns minuts" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Contrasenya de Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Recompte de reproduccions de Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Etiquetes de Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Usuari de Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Wiki de Last.fm" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Cançons menys preferides" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Esquerra" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Durada" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Col·lecció" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Agrupació avançada de la col·lecció" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Avís de reescaneig de la col·lecció" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Cerca a la col·lecció" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Límits" #: ui/equalizer.cpp:137 msgid "Live" msgstr "En directe" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Carregar" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Carrega la caràtula des de l’URL" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Carrega la caràtula des de l’URL…" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Carrega la portada des del disc dur" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Carrega la caràtula des del disc…" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Carrega la llista de reproducció" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Carrega la llista de reproducció..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "S’està carregant el dispositiu MTP" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "S’està carregant la base de dades de l’iPod" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "S’està carregant la llista de reproducció intel·ligent" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "S’estan carregant les cançons" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "S’està carregant el flux" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "S’estan carregant les peces" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "S’està carregant la informació de les peces" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "S’està carregant…" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Carregar fitxers/URLs, substituïnt l'actual llista de reproducció" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Entra" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Ha fallat l'inici de sessió" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Finalitza la sessió" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Perfil de predicció a llarg termini (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "M’encanta" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Baixa (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Baixa (256 × 256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Perfil de baixa complexitat (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Llletres" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Lletres des de %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Lletra de l’etiqueta ID3v2" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Baixada de Magnatune" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Baixada de Magnatune finalitzada" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Perfil principal (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Fes-ho doncs!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Fes-ho doncs!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Fes la llista de reproducció disponible fora de línia" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Resposta incorrecta" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Configuració manual del servidor intermediari" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Manualment" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Fabricant" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Marca com a escoltat" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Marca com a nou" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Tots els termes de cerca han de coincidir (AND)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Un o més termes de cerca han de coincidir (OR)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Resultats globals de cerca màxims" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Màxima taxa de bits" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "El suport ha canviat. S’està actualitzant" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Mitja (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Mitja (512 × 512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Tipus d’afiliació" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Taxa de bits mínima" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Valor mínim de memòria" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Falten les predefinicions del projectM" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Monitoritza els canvis a la col·lecció" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Reproducció monofònica" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Mesos" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Estat d’ànim" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Estil de barres d’ànim" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Barres d’ànim" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Més" #: library/library.cpp:84 msgid "Most played" msgstr "Més reproduïdes" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Punt de muntatge" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Punts de muntatge" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Mou cap avall" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Mou a la col·lecció…" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Mou cap amunt" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Música" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Col·lecció de música" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Silenci" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Els meus àlbums" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "La meva música" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Les meves recomanacions" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Nom" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Nom" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Opcions d'anomenat" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Banda estreta (BE)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Servidor intermediari de xarxa" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Control remot de xarxa" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Mai" #: library/library.cpp:74 msgid "Never played" msgstr "Mai reproduïdes" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Mai comencis a reproduir" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Carpeta nova" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Llista de reproducció nova" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Llista de reproducció intel·ligent nova…" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Cançons noves:" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Les peces noves s’afegiran automàticament." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Peces més noves" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Següent" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Peça següent" #: core/utilities.cpp:151 msgid "Next week" msgstr "La setmana vinent" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Sense analitzador" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Sense imatge de fons" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "No hi ha cap caràtula que exportar." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "No utilitzis blocs llargs" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "No s’han trobat coincidències. Netegeu el quadre de cerca per mostrar de nou la llista de reproducció completa." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "No utilitzis blocs curs" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Cap" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Cap de les cançons seleccionades són adequades per copiar-les a un dispositiu" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Normal" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Tipus de bloc normal" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "No està disponible mentre s'utilitza una llista de reproducció dinàmica" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "No connectat" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "No hi ha suficient contingut" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "No hi ha suficients ventiladors" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "No hi ha prous membres" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "No hi ha prous veïns" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "No instal·lat" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "No heu iniciat la sessió" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "No s’ha muntat. Feu doble clic per muntar-ho" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "No s’ha trobat cap resultat" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Tipus de notificació" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Notificacions" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Ara en reproducció" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Nombre d’episodis a mostrar" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Vista prèvia OSD" #: widgets/osd.cpp:173 msgid "Off" msgstr "Inactiu" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "Actiu" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Només accepta les connexions de clients dins del rang d’IP:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Permet només connexions provinents de la xarxa local" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Mostra només els primers" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Opacitat" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Obre %1 en un navegador" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Obre un &CD d’àudio…" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Obre un fitxer OPML" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Obre un fitxer OPML…" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Obriu una carpeta des d’on s’importarà la música" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Obrir dispositiu" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Obre un fitxer..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Obre-ho a Google Drive" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Obre en una llista de reproducció nova" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Obre en una llista nova" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Obre al navegador" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Obre…" #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Operació fallida" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Optimitza la taxa de bits" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Optimitza la qualitat" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Opcions…" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Organitza fitxers" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Organitza fitxers..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Organitzant fitxers" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Etiquetes originals" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Altres opcions" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Sortida" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Perifèric de sortida" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Opcions de sortida" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Sobreescriu-ho tot" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Sobreescriu els fitxers existents" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Sobreescriu només les més petites" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Propietari" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "S’està analitzant el catàleg del Jamendo" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Festa" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Contrasenya" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Pausa" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Pausa la reproducció" #: widgets/osd.cpp:156 msgid "Paused" msgstr "En pausa" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Intèrpret" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Píxel" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Barra lateral senzilla" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Reprodueix" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Comptador de reproduccions" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Reprodueix si esta parat, pausa si esta reproduïnt" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Reprodueix si encara no hi ha res reproduint-se" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Reprodueix la a cançó de la llista de reproducció" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Reprodueix/Pausa" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Reproducció" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Opcions del reproductor" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Llista de reproducció" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Llista de reproducció finalitzada" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Opcions de la llista de reproducció" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Tipus de llista de reproducció" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Llistes" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Tanqueu el navegador i torneu a Clementine." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Estat del connector" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcasts" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Duració de la finestra emergent" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Preamplificador" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Preferència" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Preferències" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Preferències…" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Noms de fitxer preferits per a les caràtules dels àlbums (separats per comes)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Format d’àudio preferit" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Taxa de bits preferida" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Format preferit" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Tipus d’àudio premium" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Predefinició:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Premeu una combinació de tecles per" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Premeu una tecla" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Premeu una combinació de tecles per utilitzar amb %1…" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "En fer clic al botó «Anterior» del reproductor…" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Opcions de l'OSD bonic" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Previsualitza" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Anterior" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Peça anterior" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Mostra la informació de la versió" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Perfil" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Progrés" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Progrés" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psicodèlic" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Premeu el botó del Wiiremote" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Posa les cançons en ordre aleatori" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Qualitat" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Qualitat" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "S’està consultant el dispositiu…" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Gestor de la cua" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Afegeix les peces seleccionades a la cua" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Afegeix la peça a la cua" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Ràdio (mateix volum per a totes les peces)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Pluja" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Pluja" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Visualització al·leatòria" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Puntua la cançó actual amb 0 estrelles" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Puntua la cançó actual amb 1 estrella" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Puntua la cançó actual amb 2 estrelles" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Puntua la cançó actual amb 3 estrelles" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Puntua la cançó actual amb 4 estrelles" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Puntua la cançó actual amb 5 estrelles" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Puntuació" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Realment voleu cancel·lar?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "S’ha excedit el límit de redireccions, comproveu la configuració del servidor." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Actualitzar catàleg" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Actualitzar canals" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Actualitza la llista d’emissores" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Refresca els fluxes" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Relatius" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Recorda el moviment del Wiimote" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Recorda de l'últim cop" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Recorda la meva elecció" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Suprimeix" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Elimina l’acció" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Esborra els duplicats de la llista de reproducció" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Suprimeix carpeta" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Esborra-ho de La meva música" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Suprimeix dels preferits" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Suprimeix de la llista de reproducció" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Esborra la llista de reproducció" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Suprimeix llestes de reproducció" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Elimina les peces no disponibles de la llista de reproducció" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Renombra de la llista de reproducció" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Renombra de la llista de reproducció..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Renumera les peces en aquest ordre…" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Repeteix" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Repeteix àlbum" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Repeteix la llista de reproducció" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Repeteix la peça" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Substitueix la llista de reproducció actual" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Substitueix la llista de reproducció" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Reemplaça els espais amb guions baixos" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Mode de l’Replay Gain" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Reomple" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Sol·licita un codi d’autenticació" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Posa a zero" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Posa a zero el comptador de reproduccions" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Reinicia la peça i salta a l’anterior en fer clic un altre cop" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Reinicia la peça, o canvia a l’anterior si no han transcorregut 8 segons des de l’inici." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Limitar als caràcters ASCII" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Reprèn la reproducció en l’inici" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Torna a Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Dreta" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Captura" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Captura un CD" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Captura CD d’àudio" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Executa" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "Proxy SOCKS" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "S’ha produït un error del protocol d’enllaç SSL, comproveu la configuració del servidor. El paràmetre de SSLv3 podria solucionar alguns errors temporalment." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Treure el dispositiu amb seguretat" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Treure el dispositiu amb seguretat després de copiar" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Freqüència de mostreig" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Freqüència de mostreig" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Desa fitxers .mood en la vostra col·lecció musical" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Desa la caràtula de l’àlbum" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Desa la caràtula al disc dur…" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Desa la imatge" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Desa la llista de reproducció" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Desa la llista de reproducció" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Desa la llista de reproducció..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Desa els valors" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Desa les valoracions en etiquetes de fitxers quan sigui possible" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Desa les estadístiques en etiquetes de fitxers quan sigui possible" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Salva aquest flux a la pestanya d'Internet" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "S’estan desant les estadístiques en els fitxers de les cançons" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "S’estan desant les peces" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Perfil de freqüència de mostreig escalable (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Mida de l’escala" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Puntuació" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Envia les peces que escolto" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Cerca" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Cerca" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Cerca emissores Icecast" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Cerca a Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Cerca al Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Cerca a Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Cerca automàticament" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Cerca la caràtula del àlbum…" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Cerca a tot arreu" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Cerca a gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Cerca a iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Mode de cerca" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Opcions de cerca" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Resultats de la cerca" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Termes de cerca" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Segon nivell" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Retrocedeix 10 segons" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Avança 10 segons" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Mou-te per la peça en reproducció a una posició relativa" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Mou-te per la peça en reproducció a una posició absoluta" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Seleccionar-ho tot" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "No selecciones res" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Seleccioneu el color de fons:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Seleccioneu la imatge de fons" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Selecciona la millor coincidència possible" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Seleccioneu el color de primer pla:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Seleccioneu visualitzacions" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Seleccioneu visualitzacions..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Navega…" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Número de sèrie" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Servidor" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "URL del servidor" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Detalls del servidor" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Servei fora de línia" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Estableix %1 a «%2»…" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Estableix el volum al percent" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Estableix valor per a totes les peces seleccionades…" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Paràmetres" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Drecera" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Drecera per a «%1»" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Ja existeix la drecera per a «%1»" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Mostrar" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Mostra l'OSD" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Mostra una animació destacant la peça actual" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Mostra una barra d’ànim en el progrés de la peça" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Mostra una notificació nativa d'escriptori" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Mostra una notificació quan canviï entre el modes de repetició i aleatori" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Mostra una notificació quan canvia el volum" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Mostra una notificació en aturar la reproducció" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Mostra una finestra emergent de la safata de sistema" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Mostra un OSD bonic" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Mostra sota la barra d'estat" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Mostra totes les cançons" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Mostra totes les cançons" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Mostra les caràtules a la col·lecció" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Mostra els separadors" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Mostra a mida completa..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Mostra grups en els resultats de la cerca global" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Mostra al gestor de fitxers" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Mostra a la col·lecció…" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Mostra en Artistes diversos" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Mostra les barres d’ànim" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Mostra només els duplicats" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Mostra només les peces sense etiquetar" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Mostra la cançó en reproducció a la pàgina personal" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Mostra suggeriments de cerca" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Mostra el botó «M’encanta»" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Mostra el botó de compartir a la finestra principal" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Mostrar la icona a la safata" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Mostra quins orígens estan activats i desactivats" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Mostra/amaga" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Aleatori" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Mescla els àlbums" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Mescla-ho tot" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Mescla la llista de reproducció" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Mescla les peces d’aquest àlbum" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Inicieu la sessió" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Finalitza la sessió" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "S’està iniciant la sessió…" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Artistes similars" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Mida" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Mida:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Salta enrere en la llista de reproducció" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Comptador d’omissions" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Salta endavant en la llista de reproducció" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Omet les peces seleccionades" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Omet la peça" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Caràtula petita" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Barra lateral petita" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Llista de reproducció intel·ligent" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Llistes de reproducció intel·ligents" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Suau" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Rock suau" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Informació de la cançó" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Inf. cançó" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonograma" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Ho lamentem" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Ordena per gènere (alfabèticament)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Ordena per gènere (segons la popularitat)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Ordena pel nom de l'emissora" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Ordena les cançons per" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Ordenació" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Font" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Fonts" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Error en iniciar sessió a Spotify" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "URL de llista de l’Spotify" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Connector d'Spotify" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "No s’ha instal·lat el connector de Spotify" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "URL de cançó de l’Spotify" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Estàndard" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Destacat" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Inicia la captura" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Inicia la llista de reproducció que s'està reproduint" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Inicia la conversió" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Comenceu a escriure quelcom al quadre de cerca de dalt per omplir-ne la llista de resultats" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "S’està començant %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "S’està iniciant…" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Atura" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Atura desprès" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Atura després d’aquesta peça" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Atura la reproducció" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Atura la reproducció després de la peça actual" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Atura la reproducció després de: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Aturat" #: core/song.cpp:431 msgid "Stream" msgstr "Flux de dades" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Per la transmissió de dades des d’un servidor de Subsonic es requereix una llicència de servidor vàlida, una vegada que transcorrin 30 dies." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Membresía per transmetre dades" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Subscriptors" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Correcte!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "Escrit satisfactòriament %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Etiquetes suggerides" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Resum" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Molt alta (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Molt alta (2048 × 2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Formats compatibles" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Sincronitza estadístiques als fitxers ara" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "S'està sincronitzant la safata d'entrada de Spotify" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "S'està sincronitzant la llista de reproducció de Spotify" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "S’estan sincronitzant les peces destacades de l’Spotify" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Colors del sistema" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Pestanyes a dalt de tot" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Recolector d'etiquetes" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Taxa de bits desitjada" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Opcions del text" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Agraïm a" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "No s’ha pogut iniciar l’ordre «%1»." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "La caràtula de l’àlbum de la cançó en reproducció" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "El directori %1 no es vàlid" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "El segon valor ha de ser major que el primer!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "L’adreça que heu sol·licitat no existeix." #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "L’adreça que heu sol·licitat no conté cap imatge." #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Ha acabat el període de prova del servidor de Subsonic. Fareu una donació per obtenir una clau de llicència. Visiteu subsonic.org para més detalls." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "La versió de Clementine a la que us acabeu d’actualitzar necessita tornar a analitzar tota la col·lecció perquè incorpora les següents funcions noves:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Hi ha altres cançons en aquest àlbum" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "S'ha produit un error en comunicar-se amb gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Hi ha hagut un problema rebent la meta-informació de Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "S'ha produit un error en analitzar la resposta de l'iTunes Store" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Hi ha hagut problemes en copiar algunes cançons. Els fitxers següents no s’han pogut copiar:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "S’han produït problemes en suprimir algunes cançons. No s’han pogut suprimir els fitxers següents:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Se suprimiran aquests fitxers del dispositiu, esteu segur que voleu continuar?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "S’eliminaran aquests fitxers del disc permanentment. Esteu segur que voleu continuar?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "S’analitzaran aquestes carpetes a la recerca de música per confeccionar la vostra col·lecció" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Aquesta configuració s’usa en el diàleg «Converteix música», i quan es converteix la música abans de copiar-la a un dispositiu." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Tercer nivell" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Aquesta acció crearà una base de dades que podria ser de fins a 150 MB.\nVoleu continuar de totes formes?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Aquest àlbum no està disponible en el format demanat" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Aquesta opció es pot modificar més tard a Preferències" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Aquest dispositiu ha de connectar-se i obrir-se abans que el Clementine pugui veure quins formats de fitxers admet." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Aquest dispositiu és compatible amb els següents formats de fitxers:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Aquest dispositiu no funcionarà correctament" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Aquest és un dispositiu MTP, però s’ha compilat el Clementine sense compatibilitat amb libmtp." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Aquest dispositiu és un iPod, però heu compilat el Clementine sense compatibilitat libgpod." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Aquest es el primer cop que connecteu aquest dispositiu. El Clementine analitzarà el dispositiu per trobar música. Això pot trigar un mica." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Podeu modificar aquesta opció a la pestanya «Comportament» a Preferències" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Aquest flux es sol per als subscriptors que paguen" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Aquest tipus de dispositiu no és compatible: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Títol" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Avui" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Activa la visualització per pantalla elegant" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Commuta a pantalla completa" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Commuta l’estat de la cua" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Commuta el «scrobbling»" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Canvia la visibilitat del OSD estètic" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Demà" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Massa redireccions" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Millors cançons" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Total d’àlbums:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Bytes totals transferits" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Total de sol·licituds de xarxa fetes" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Peça" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Peces" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Converteix música" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Registre del convertidor" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Conversió" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "S’estan convertint %1 fitxers emprant %2 fils" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Opcions de conversió" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbina" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Atura" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Banda ultra ampla (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "No s’ha pogut connectar" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "No es pot baixar %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Desconegut" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Tipus de contingut desconegut" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Error desconegut" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Esborra’n la caràtula" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "No ometis les peces seleccionades" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "No ometis la peça" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Canceleu la subscripció" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Propers concerts" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Actualitza" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Actualitza tots els podcasts" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Actualitza les carpetes de la col·lecció amb canvis" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Actualitza la col·lecció quan Clementine arranqui" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Actualitza aquest podcast" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "S’està actualitzant" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "S’està actualitzant %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "S’està actualitzant %1%…" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "S’està actualitzant la col·lecció" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Ús" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Utilitza l’etiqueta «Artista de l’àlbum» quan estigui disponible" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Utilitza les dreceres de teclat del Gnome" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Utilitza les metadades Replay Gain si estan disponibles" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Utilitza SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Utilitza el comandament remot Wii" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Empra un conjunt de colors personalitzat" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Utilitza un missatge personalitzat per les notificacions" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Usa un control remot de xarxa" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Empra autentificació" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Usa el motor de gestió de flux de bits" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Empra el mode dinàmic" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Utilitza les notificacions per informar sobre l'estat del Wiimote" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Usa el modelatge de soroll temporal" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Utilitza el valor per defecte del sistema" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Utilitza el conjunt de colors del sistema" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Utilitza la configuració de servidor intermediari del sistema" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Empra la normalització de volum" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Usat" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Interfície d’usuari" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Nom d’usuari" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "En emprar el menú per afegir una cançó…" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Taxa de bits variable" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Artistes diversos" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Versió %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Vista" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Mode de visualització" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Visualitzacions" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Paràmetres de visualització" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Detecció de veu" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Volumen %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Mur" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Avisa’m abans de tancar una pestanya de llista de reproducció" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Lloc web" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Setmanes" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Quan s’inicia el Clementine" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "En la cerca de caràtules d’àlbum, Clementine primer cercarà imatges que contenen una d’aquestes paraules.\nSi no hi ha resultats, s’usarà la imatge més gran en el directori." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "En desar una llista de reproducció, els camins dels fitxers han de ser" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Quan la llista sigui buida..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Perquè no proveu..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Banda ampla (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Comandament remot Wii %1: activat" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Comandament remot Wii %1: connectat" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Comandament remot Wii %1: bateria crítica (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Comandament remot Wii %1: desactivat" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Comandament remot Wii %1: desconnectat" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Comandament remot Wii %1: bateria baixa (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Audio Windows Media" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Sense caràtula:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Voleu moure també les altres cançons d’aquest àlbum a Artistes diversos?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Voleu fer de nou un escaneig complet ara?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Escriu totes les estadístiques en els fitxers de les cançons" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Escriu les metadades" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Nom d’usuari o contrasenya incorrectes." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Any" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Any - Àlbum" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Anys" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Ahir" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Sou a punt de baixar els següents àlbums" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Esteu segur que voleu suprimir %1 llistes de reproducció dels vostres preferits?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Sou a punt d’eliminar una llista de reproducció que no heu desat com a preferida: la llista de reproducció es suprimirà (aquesta acció és irreversible).\nEsteu segur que voleu continuar?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "No heu iniciat la sessió." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Heu iniciat la sessió com a %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Heu iniciat la sessió." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Podeu canviar la forma en la qual les cançons de la col·lecció estan organitzades" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Podeu escoltar gratuïtament sense un compte d’usuari, però els membres Premium poden escoltar transmissions de qualitat més alta sense publicitat." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Podeu escoltar cançons del Magnature gratuïtament i sense un compte. Compreu una afiliació per eliminar els missatges al final de cada peça." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Podeu escoltar so ambiental de fons mentre escolteu música." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Podeu usar el vostre Wii Remote com un control remot per Clementine. Visiteu la pàgina en el wiki de Clementine para més informació.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "No disposeu d’un compte Premium de l’Spotify." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "No teniu una subscripció activa" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "No cal iniciar sessió per cercar i escoltar música al SoundCloud. Però, heu d’iniciar sessió per accedir a les vostres llestes de reproducció i actualitzacions." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Ha finalitzat la vostra sessió de l’Spotify. Torneu a introduir la contrasenya al diàleg de configuració." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Ha finalitzat la vostra sessió de l’Spotify. Torneu a introduir la contrasenya." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Us encanta aquesta peça" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "Obriu Preferències del sistema i permeteu que el Clementine «controli l’equip» per utilitzar les dreceres globals al Clementine." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Si canvieu l'idioma haureu de reiniciar el Clementine." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "La vostra adreça IP:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Les teves credencials de Last.fm son incorrectes" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Les vostres credencials de Magnature eren incorrectes" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "La vostra col·lecció està buida." #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Els vostres fluxos de ràdio" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Els vostres «scrobblings»: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "El vostre sistema no és compatible amb OpenGL, les visualitzacions no estan disponibles." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "El vostre nom usuari o la contrasenya són incorrectes" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "afegeix %n cançons" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "després" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "fa" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "i" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "automàtic" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "abans" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "entre" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "els més grans primer" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "ppm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "conté" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "deshabilitat" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "disc %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "no conté" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "acaba amb" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "és igual a" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "Directori de gpodder.net" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "més gran que" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "Els iPod i els dispositius USB no funcionen sota Windows actualment. Disculpeu les molèsties." #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "en el últims" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kb/s" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "més petit que" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "el més llarg primer" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "mou %n cançons" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "els més recents primer" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "és diferent de" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "no en els últims" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "no pas a" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "els més antics primer" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "a" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "opcions" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "o escanegeu el codi QR" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "premeu retorn" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "elimina %n cançons" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "els més curts primer" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "barreja les cançons" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "els més petits primer" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "ordena les cançons" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "comença amb" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "atura" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "peça %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/cs.po000066400000000000000000005172341260417502300236600ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Jiří Vírava , 2012 # arnaudbienner , 2011 # arnaudbienner , 2011 # David Kolibáč , 2011 # David Kolibáč , 2011,2013 # fri, 2013 # Jiří Vírava , 2012 # mandarinki , 2011 # Pavel Fric , 2010 # Pavel Fric , 2004,2010 # fri, 2011-2012 # fri, 2013-2015 # fri, 2011-2012 # mandarinki , 2011 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Czech (http://www.transifex.com/davidsansome/clementine/language/cs/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cs\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nSeznamy skladeb můžete označit jako oblíbené klepnutím na hvězdičku vedle názvu seznamu skladeb\n\nOblíbené seznamy skladeb budou uloženy zde" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "dnů" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kb/s" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " bodů" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr " s" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " sekund" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " písně" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 písní)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 alb" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 dnů" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "před %1 dny" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 na %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 seznamů skladeb (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 vybráno z" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 píseň" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 písní" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "Bylo nalezeno %1 písní" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "Bylo nalezeno %1 písní (zobrazeno %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 skladeb" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 přeneseno" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: modul Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 jiných posluchačů" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 celkových přehrání" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "nepodařilo se %n" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "dokončeno %n" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "zůstávají %n" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Zarovnat text" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Na střed" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "Vl&astní" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "Doplňky" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "Nápo&věda" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "Skrýt %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "Skrýt..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Vlevo" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "Hudba" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "Žád&né" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "Seznam skladeb" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Ukončit" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Režim opakování" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Vpravo" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Režim míchání" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "Roztáhnout sloupce tak, aby se vešly do okna" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "Nástroje" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(liší se u jednotlivých písní)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", od" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...a všichni, kdo přispěli k vývoji přehrávače Amarok" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0 px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 den" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 stopa" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192,000 Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44,100 Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48,000 Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 náhodných skladeb" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96,000 Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Povýšit na Premium" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Není-li zaškrtnuto, Clementine se pokusí o uložení vašeho hodnocení a dalších statistik pouze v samostatné databázi a nebude měnit vaše soubory.

Je-li zaškrtnuto, Clementine uloží statistiku jak do databáze tak přímo do souboru pokaždé, když došlo ke změně.

Všimněte si, prosím, že to nemusí jít u každého formátu, jelikož pro to, jak to dělat, není žádný standard. Jiné hudební přehrávače tyto soubory nemusí být schopny přečíst.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Dejte před slovo název pole, aby se hledání omezilo na to pole , např. artist:Gott, sbírka je prohledána na jména umělců, jež obsahují slovo Gott.

Dostupná pole: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Toto bude zapisovat hodnocení písní a statistiky do značek písní u všech písní ve vaší sbírce.

Není to potřeba, pokud byla volba "Ukládat hodnocení písní a statistiky do značek písní"vždy zapnuta.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Symboly začínají %, například: %artist %album %title

\n\n

Pokud obklopíte části textu obsahující symbol složenými závorkami, tato část bude skryta, je-li symbol prázdný.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Je požadován účet Spotify Premium." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Klient se může připojit jen tehdy, když byl zadán správný kód." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Chytrý seznam skladeb je dynamický seznam písní, které pocházejí z vaší sbírky. Jsou různé druhy chytrých seznamů skladeb, jež nabízejí rozdílné způsoby výběru písní." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Píseň bude zařazena do seznamu skladeb, pokud bude odpovídat těmto podmínkám." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "VŠECHNU SLÁVU HYPNOŽÁBĚ" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Přerušit" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "O %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "O Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "O Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Absolutní" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Podrobnosti o účtu" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Podrobnosti k účtu (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Činnost" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Činnost" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Zapnout/Vypnout Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Proud činností" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Přidat zvukový záznam" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Přidat proud" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Přidat nový řádek, je-li to podporováno typem oznámení" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Přidat činnost" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Přidat všechny skladby z adresáři a všech jeho podadresářů" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Přidat další proud..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Přidat složku..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Přidat soubor" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Přidat soubor k překódování" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Přidat soubor(y) k překódování" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Přidat soubor..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Přidat soubory pro překódování" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Přidat složku" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Přidat složku..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Přidat novou složku..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Přidat záznam" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Přidat zvukový záznam..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Přidat hledaný výraz" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Přidat značku album písně" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Přidat značku umělec alba písně" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Přidat značku umělec písně" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Přidat automatický výsledek písně" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Přidat značku skladatel písně" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Přidat značku disk písně" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Přidat název souboru písně" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Přidat značku žánr písně" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Přidat značku seskupení písně" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Přidat značku délka písně" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Přidat značku účinkující písně" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Přidat počet přehrání písně" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Přidat hodnocení písně" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Přidat počet přeskočení písně" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Přidat značku název písně" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Přidat píseň do vyrovnávací paměti" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Přidat značku pořadí písně" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Přidat značku rok písně" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Přidat písně do Moje hudba, když je klepnuto na tlačítko Oblíbit" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Přidat proud..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Přidat do Moje hudba" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Přidat do seznamů skladeb Spotify" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Přidat do Spotify s hvězdičkou" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Přidat do jiného seznamu skladeb" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Přidat do záložek" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Přidat do seznamu skladeb" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Přidat do řady" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Přidat uživatele/skupinu do záložek" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Přidat činnost wiimotedev" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Přidat..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Přidána tento měsíc" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Přidána tento týden" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Přidána tento rok" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Přidána dnes" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Přidána během tří měsíců" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Pokročilé seskupování..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Po " #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Po zkopírování..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Album (ideální hlasitost pro všechny skladby)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Umělec alba" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Obal alba" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Informace o albu na jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Alba" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Alba s obaly" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Alba bez obalů" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Vše" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Všechny soubory (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "Všechnu slávu hypnožábě!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Všechna alba" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Všichni umělci" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Všechny soubory (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Všechny seznamy skladeb (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Všichni překladatelé" #: library/library.cpp:98 msgid "All tracks" msgstr "Všechny skladby" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Povolit klientu stahování hudby z tohoto počítače." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Povolit stahování" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Povolit kódování střed/kraj" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Vedle původních" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Vždy skrýt hlavní okno" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Vždy zobrazit hlavní okno" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Vždy začít přehrávat" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon Cloud Drive" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Pro používání Spotify v Clementine je vyžadován přídavný modul. Chcete jej stáhnout a nainstalovat nyní?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Při nahrávání databáze iTunes nastala chyba" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Při zápisu údajů do '%1' se vyskytla chyba" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Vyskytla se neznámá chyba." #: ui/about.cpp:85 msgid "And:" msgstr "A:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Rozlobený" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Vzhled" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Přidat soubory/adresy do seznamu skladeb" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Přidat do současného seznamu skladeb" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Přidat do seznamu skladeb" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Použít kompresi, aby se zabránilo ořezávání zvuku (clippingu)" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Opravdu chcete smazat nastavení \"%1\"?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Opravdu chcete nastavit statistiku této písně znovu?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Opravdu chcete ukládat statistiky písní do souboru písně u všech písní ve vaší sbírce?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Umělec" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Umělec" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Značky umělce" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Začáteční písmena umělce" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Zeptat se při ukládání" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Zvukový formát" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Zvukový výstup" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Ověření selhalo" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Autor" #: ui/about.cpp:68 msgid "Authors" msgstr "Autoři" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Automaticky" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Automaticky" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Automatická aktualizace" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Automaticky otevřít jednotlivé skupiny ve stromu sbírky" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Dostupné" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Průměrný datový tok" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Průměrná velikost obrázku" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "Záznamy BBC" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "ÚZM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Proudy na pozadí" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Barva pozadí" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Obrázek na pozadí" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Neprůhlednost pozadí" #: core/database.cpp:648 msgid "Backing up database" msgstr "Záloha databáze" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Vyvážení" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "Zakázat (odesílání informací o přehrávání na Last.fm)" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Proužkový analyzátor" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Jednoduchá modrá" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Základní typ zvuku" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Chování" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Nejlepší" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Životopis od %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Datový tok" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Datový tok" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Datový tok" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Blokový analyzátor" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Typ bloku" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Velikost rozmazání" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Tělo" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Růstový analyzátor" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Procházet…" #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Délka vyrovnávací paměti" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Ukládá se do vyrovnávací paměti" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Sestavuje se index Seafile..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Ale tyto zdroje jsou zakázány:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Tlačítka" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Podpora pro list CUE" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Cesta k vyrovnávací paměti:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Ukládá se do vyrovnávací paměti" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "%1 se ukládá do vyrovnávací paměti" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Zrušit" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Zrušit stahování" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Jsou potřeba písmenka a číslice, co se potom musejí opisovat (captcha).\nZkuste se se svým prohlížečem přihlásit k Vk.com, abyste opravili tento problém." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Změnit obal" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Změnit velikost písma..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Změnit režim opakování" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Změnit klávesovou zkratku..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Změnit režim míchání" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "Změnit nyní přehrávanou píseň" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Změnit jazyk" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "Změny se projeví, jakmile se začne přehrávat další píseň" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Změna nastavení jednokanálového přehrávání začne platit s dalšími přehrávanými skladbami" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Podívat se po nových dílech" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Podívat se po aktualizacích" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Zkontrolovat aktualizace" #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Vyberte adresář pro vyrovnávací paměť Vk.com" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Vyberte název pro svůj chytrý seznam skladeb" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Vybrat automaticky" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Vybrat barvu..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Vybrat písmo..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Vybrat ze seznamu" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Zvolte počet písní v seznamu skladeb a způsob jejich řazení." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Vyberte adresář pro stažení zvukového záznamu (podcastu)" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Vyberte internetové služby, jež chcete ukázat." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Vyberte stránky, na kterých má Clementine hledat texty písní." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Klasická" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Úklid" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Smazat" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Vyprázdnit seznam skladeb" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Chyba Clemetine" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Mandarinka klementina" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Vizualizace Clementine" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine může automaticky převést hudbu kopírovanou do tohoto zařízení do formátu, který dokáže přehrát." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Clementine může přehrávat hudbu vámi nahranou na Amazon Cloud Drive" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine může přehrávat hudbu nahranou vámi do úložiště služby Box (neboli krabice)" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine umí přehrát hudbu nahranou vámi do Dropboxu" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine může přehrávat hudbu, kterou jste nahráli na Google Drive" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine může přehrávat hudbu vámi nahranou na OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine může při změně skladby ukázat zprávu." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine může seřídit váš seznam s odběry s dalšími počítači a programy na přehrávání zvukových záznamů (podcastů). Vytvořit účet." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine se nepodařilo nahrát žádné vizualizace z projectM. Ověřte, že jste Clementine nainstalovali správně." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Prohlížeč obrázků pro Clementine" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine se pro tento soubor výsledky najít nepodařilo" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine bude hledat hudbu v:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Klepněte sem pro přidání nějaké hudby" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Klepněte zde pro označení tohoto seznamu skladeb jako oblíbeného, takže bude uložen a zůstane přístupný přes panel Seznamy skladeb v levém postranním pruhu" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Klepněte pro přepnutí mezi zbývajícím časem a celkovým časem" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Klepnutí na přihlašovací tlačítko otevře internetových stránek. Po přihlášení se vraťte do Clementine." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Zavřít" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Zavřít seznam skladeb" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Zavřít vizualizaci" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Zavření tohoto okna zruší stahování." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Zavření tohoto okna zastaví hledání obalů alb." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Klub" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Barvy" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Čárkou oddělený seznam class:level, level je 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Poznámka" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Společenské rádio" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Doplnit značky automaticky" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Doplnit značky automaticky..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Skladatel" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Nastavit %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Nastavit Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Nastavit klávesové zkratky" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Nastavit Spotify..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Nastavit Subsonic..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Nastavit Vk.com..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Nastavit celkové hledání..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Nastavit sbírku..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Nastavit záznamy..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Nastavit..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Připojit dálkový ovladač Wii pomocí činnosti zapnout/vypnout" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Připojit zařízení" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Připojuje se k Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Spojení odmítnuto serverem, prověřte adresu serveru (URL). Příklad: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Spojení vypršelo, prověřte adresu serveru (URL). Příklad: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Potíže se spojením nebo je zvuk vlastníkem zakázán" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Konzole" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Stálý datový tok" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Převést všechnu hudbu" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Převést veškerou hudbu, kterou zařízení nedokáže přehrát" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Převést zvukové soubory v bezztrátovém formátu, před jejich odesláním do vzdáleného úložiště." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Převést soubory v bezztrátovém formátu" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Kopírovat sdílenou adresu (URL) do schránky" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Kopírovat do schránky" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Zkopírovat do zařízení..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Zkopírovat do sbírky..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Autorské právo" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Nepodařilo se spojit se se Subsonicem, prověřte adresu serveru (URL). Příklad: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Nepodařilo se vytvořit prvek GStreamer \"%1\" - ujistěte se, že máte nainstalovány všechny požadované přídavné moduly GStreamer" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Nepodařilo se vytvořit seznam skladeb" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Nepodařilo se najít multiplexer pro \"%1\" - ujistěte se, že máte nainstalovány správné přídavné moduly GStreamer" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Nepodařilo se najít kodér \"%1\" - ujistěte se, že máte nainstalovány správné přídavné moduly GStreamer" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Nepodařilo se otevřít výstupní soubor %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Správce obalů" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Obal z vloženého obrázku" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Obal nahraný automaticky z %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Obal zrušený ručně" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Obal nenastaven" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Obal nastaven z %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Obaly od %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Prolínání při automatické změně skladby" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Prolínání při ruční změně skladby" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Vlastní" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Vlastní obrázek:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Nastavení vlastní zprávy" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Vlastní..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "Cesta k DBus" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Taneční hudba" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Zjištěno poškození databáze. Přečtěte si, prosím, https://code.google.com/p/clementine-player/wiki/DatabaseCorruption kvůli pokynům, kterak svou databázi obnovit" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Datum vytvoření" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Datum změny" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Dny" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "&Výchozí" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Snížit hlasitost o 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Snížit hlasitost o procent" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Snížit hlasitost" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Výchozí obrázek na pozadí" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Výchozí zařízení na %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Výchozí" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Prodleva mezi vizualizacemi" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Smazat" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Smazat stažená data" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Smazat soubory" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Smazat ze zařízení..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Smazat z disku..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Smazat přehrané díly" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Smazat předvolbu" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Smazat chytrý seznam skladeb" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Smazat původní soubory" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Probíhá mazání souborů" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Odstranit vybrané skladby z řady" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Odstranit skladbu z řady" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Cíl" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Podrobnosti..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Zařízení" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Vlastnosti zařízení" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Název zařízení" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Vlastnosti zařízení..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Zařízení" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Dialog" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Mysleli jste" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Heslo k Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Uživatelské jméno u Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Přímé připojení k internetu" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Složka" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Zakázat délku" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Zakázat tvoření náladového proužku" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Zakázáno" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Zakázáno" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Disk" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Nesouvislý přenos" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Volby zobrazení" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Zobrazovat informace na obrazovce (OSD)" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Znovu kompletně prohledat sbírku" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Znovu úplně prohledat" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Znovu úplně prohledat..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Nepřevádět žádnou hudbu" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Nepřepisovat" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "Úplné znovuprohledání povede ke ztrátě popisných dat uložených vámi v Clementine, např. obrázků obalů, počtů přehrání skladeb a hodnocení. Clementine znovu prohledá všechnu vaši hudbu v Google Drive, což může chvíli trvat." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Neopakovat" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Nezobrazovat pod různými umělci" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Neukazovat poslechnuté díly" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Nemíchat" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Nezastavovat!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Darovat" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Klepnout dvakrát pro otevření" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "Dvojité klepnutí na píseň v seznamu skladeb způsobí..." #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Dvojité klepnutí na píseň..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Stáhnout %n dílů" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Stáhnout složku" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Stáhnout díly do" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Stáhnout členství" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Stáhnout nové díly automaticky" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Stahování zařazeno" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Nastavení stahování" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Stáhnout aplikaci pro Android" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Stáhnout toto album" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Stáhnout toto album..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Stáhnout tento díl" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Stáhnout..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Stahuje se (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Stahuje se adresář Icecast" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Stahuje se katalog Jamendo" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Stahuje se katalog Magnatune" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Stahuje se přídavný modul Spotify" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Stahují se popisná data" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Tažením přemístěte" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dubstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Doba trvání" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Je zapnut dynamický režim" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Dynamický náhodný výběr" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Upravit chytrý seznam skladeb..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Upravit značku \"%1\"..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Upravit značku..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Upravit značky" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Upravit informace o skladbě" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Upravit informace o skladbě..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Upravit informace o skladbách..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Upravit..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "E-mail" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Povolit podporu dálkového ovládání Wii" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Povolit automatické ukládání do vyrovnávací paměti" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Povolit ekvalizér" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Povolit zkratky jen když je Clementine zaměřen" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Povolit upravování popisných dat písně klepnutím v řádku" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Povolit zdroje níže pro jejich zahrnutí ve výsledcích hledání. Výsledky budou zobrazeny v tomto pořadí" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Povolit/zakázat odesílání informací o přehrávání na Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Složitost kódování" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Kvalita kódovacího stroje" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Režim kódování" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Zadejte adresu (URL)" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Zadejte adresu (URL) ke stažení obalu z internetu:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Zadejte souborový název pro uložené obaly (bez přípony):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Zadejte název tohoto seznamu skladeb" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Zadejte hledané pojmy výše pro nalezení hudby ve vašem počítači a na internetu" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Zadejte hledané výrazy pro nalezení zvukových záznamů v obchodu iTunes" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Zadejte hledané výrazy pro nalezení zvukových záznamů na gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Zde zadejte hledané výrazy" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Zadejte adresu (URL) proudu internetového rádia:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Zadejte název složky" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Zadejte tuto adresu IP v programu pro spojení s Clementine." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Celá sbírka" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Ekvalizér" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Rovnocenné s --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Rovnocenné s --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Chyba" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Chyba při vytahování skladeb z CD" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Chyba při připojování zařízení MTP" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Chyba při kopírování písní" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Chyba při mazání písní" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Chyba při stahování přídavného modulu Spotify" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Chyba při nahrávání %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Chyba při nahrávání seznamu skladeb di.fm" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Chyba při zpracovávání %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Chyba při nahrávání zvukového CD" #: library/library.cpp:68 msgid "Ever played" msgstr "Přehrané skladby" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Každých 10 minut" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Každých 12 hodin" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Každé 2 hodiny" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Každých 20 minut" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Každých 30 minut" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Každých 6 hodin" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Každou hodinu" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Kromě mezistop na tom samém albu nebo v tom samém listu CUE" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Stávající obaly" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Rozbalit" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Vyprší %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Uložit obaly" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Uložit obaly" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Uložit stažené obaly" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Uložit vložené obaly" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Uložení dokončeno" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Uloženo %1 obalů z %2 (%3 přeskočeno)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Zeslabení při pozastavení/Zesílení při obnovení přehrávání" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Zeslabit při zastavování skladby" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Slábnutí" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Doba slábnutí" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Nepodařilo se číst z CD v mechanice" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Nepodařilo se natáhnout adresář" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Nepodařilo se natáhnout zvukové záznamy (podcasty)" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Nepodařilo se nahrát zvukový záznam (podcast)" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Nepodařilo se zpracovat XML pro tento kanál RSS" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Rychlý" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Oblíbené skladby" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Stáhnout chybějící obaly" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Stáhnout automaticky" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Stahování dokončeno" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Natahuje se knihovna Subsonic" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Chyba při stahování obalu" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Souborový formát" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Přípona souboru" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Formáty souborů" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Název souboru" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Název souboru bez cesty" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Vzor pro název souboru:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Souborové cesty" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Velikost souboru" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Typ souboru" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Název souboru" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Soubory" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Soubory k překódování" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Nalézt ve sbírce písně odpovídající vámi zadaným kritériím." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Najít tohoto umělce" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Určení písně" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Dokončit" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "První úroveň" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Přizpůsobit obal šířce" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "FLAC" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Velikost písma" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Z licenčních důvodů je podpora pro Spotify v odděleném přídavném modulu" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Vynutit jednokanálové kódování" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Zapomenout zařízení" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Zařízení bude odstraněno z tohoto seznamu. Po opětovném připojení je Clementine bude muset znovu celé prohledat." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Formulář" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Formát" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Počet snímků" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Snímků na vyrovnávací paměť" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Zmrzlý" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Plné basy" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Plné basy + výšky" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Plné výšky" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Obecné" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Obecná nastavení" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Žánr" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Získat adresu pro sdílení této písně Spotify" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Získat adresu pro sdílení tohoto seznamu skladeb" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Získávají se kanály" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Získávají se proudy" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Pojmenujte to:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Jít" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Jít na další kartu seznamu skladeb" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Jít na předchozí kartu seznamu skladeb" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Získáno %1 obalů z %2 (%3 nezískáno)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Nechat zešedivět neexistující písně v mých seznamech skladeb" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Seskupovat v hudební sbírce podle..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Seskupovat podle" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Seskupovat podle alba" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Seskupovat podle umělce" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Seskupovat podle umělce/alba" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Seskupovat podle umělce/roku - alba" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Seskupovat podle žánru/alba" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Seskupovat podle žánru/umělce/alba" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Seskupení" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "Stránka HTML neobsahuje žádný kanál RSS" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "Stavový kód HTTP 3xx přijat bez URL, ověřte nastavení serveru." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "Proxy HTTP" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Šťastný" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Informace o vybavení" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Informace o vybavení jsou dostupné pouze tehdy, když je zařízení připojeno." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Vysoká" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Vysoký (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Vysoké (1024 x 1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "Hip hop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Hostitel nenalezen, prověřte adresu serveru (URL). Příklad: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Hodiny" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnožába" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "U Magnatune nemám účet" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Ikona" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Ikony nahoře" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Určuje se píseň" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Pokud je zapnuto, po klepnutí na vybranou píseň v seznamu skladeb můžete upravit hodnotu značky přímo" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Budete-li pokračovat, toto zařízení bude pracovat pomalu a písně na něj kopírované nemusí fungovat." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Pokud znáte adresu (URL) zvukového záznamu, zadejte ji níže a stiskněte Jít." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Nevšímat si 'The' ve jménech umělců" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Obrázky (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Obrázky (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Zavést..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "Za %1 dny(ů)" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "Za %1 týdny(ů)" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "V dynamickém režimu budou nové skladby vybrány a přidány do seznamu skladeb pokaždé, když píseň skončí." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Doručená pošta" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Zahrnout obal alba do oznámení" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Zahrnout všechny písně" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Nevhodná verze protokolu Subsonic REST. Klient se musí zaktualizovat." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Nevhodná verze protokolu Subsonic REST. Server se musí zaktualizovat." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Neúplné nastavení. Zajistěte, prosím, že jsou všechna pole vyplněna." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Zvýšit hlasitost o 4 %" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Zvýšit hlasitost o procent" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Zvýšit hlasitost" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Rejstříkování %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Informace" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Vstupní volby" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Vložit..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Nainstalován" #: core/database.cpp:585 msgid "Integrity check" msgstr "Ověření celistvosti" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Internetoví poskytovatelé" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Internetové služby" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "Skladby úvodu" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Neplatný klíč API" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Neplatný formát" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Neplatná metoda" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Neplatné parametry" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Zadán neplatný zdroj" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Neplatná služba" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Neplatný klíč sezení" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Obrátit výběr" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Nejposlouchanější skladby na Jamendu" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Nejlepší skladby na Jamendu" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Nejlepší skladby měsíce na Jamendu" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Nejlepší skladby týdne na Jamendu" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Databáze Jamendo" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Skočit ihned na předchozí píseň" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Skočit na nyní přehrávanou skladbu" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Držet tlačítka po %1 sekundy..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Držet tlačítka po %1 sekund..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Při zavření okna nechat běžet na pozadí" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Zachovat původní soubory" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Koťátka" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Jazyk" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Přenosný počítač/Sluchátka" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Velký sál" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Velký obal alba" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Velký obal alba (podrobnosti níže)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Velký obal alba (žádné podrobnosti)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Velký postranní panel" #: library/library.cpp:80 msgid "Last played" msgstr "Naposledy hrané" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Naposledy hráno" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm je nyní zaneprázdněno, prosím, zkuste to za pár minut znovu" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Heslo k Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Počty přehrání na Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Značky Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Uživatelské jméno k Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Wiki pro Last.fm" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Nejméně oblíbené skladby" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Vlevo" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Délka" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Sbírka" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Pokročilé seskupování sbírky" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Zpráva o prohledání sbírky" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Hledání ve sbírce" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Omezení" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Živě" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Načíst" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Nahrát obal z adresy (URL)" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Nahrát obal z adresy (URL)..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Nahrát obal z disku" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Nahrát obal na disku..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Nahrát seznam skladeb" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Nahrát seznam skladeb..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Nahrává se zařízení MTP" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Nahrává se databáze iPod" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Nahrává se chytrý seznam skladeb" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Nahrávají se písně" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Nahrává se proud" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Nahrávají se skladby" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Nahrávají se informace o skladbě" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Nahrává se..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Nahraje soubory/adresy (URL), nahradí současný seznam skladeb" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Přihlášení" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Přihlášení se nezdařilo" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Odhlásit se" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Dlouhodobý předpověďní profil" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Oblíbit" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "Líbí se mi (odesílání informací o přehrávání na Last.fm)" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Nízký (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Nízké (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Nízkosložitostní profil" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Texty písní" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Texty písní z %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Texty písní ze značky ID3v2" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Stahování z Magnatune" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Stahování z Magnatune bylo dokončeno" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Hlavní profil" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Udělej to tak!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Udělej to tak!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Zajistit, že seznam skladeb bude dostupný, i když počítač nebude připojen k internetu" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Poškozená odpověď" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Ruční nastavení proxy" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Ručně" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Výrobce" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Označit jako poslechnuté" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Označit jako nové" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Porovnat všechny hledané výrazy (AND)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Porovnat jeden nebo více hledaných výrazů (OR)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Nejvíce výsledků celkového hledání" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Nejvyšší datový tok" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Médium se změnilo. Načítá se znovu." #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Střední (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Střední (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Druh členství" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Nejnižší datový tok" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Nejmenší naplnění vyrovnávací paměti" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Chybí přednastavení projectM" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Sledovat změny ve sbírce" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Jednokanálové přehrávání" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Měsíce" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Nálada" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Styl náladového proužku" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Náladové proužky" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Více" #: library/library.cpp:84 msgid "Most played" msgstr "Nejvíce hráno" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Přípojný bod" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Přípojné body" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Posunout dolů" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Přesunout do sbírky..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Posunout nahoru" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Hudba" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Hudební sbírka" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Ztlumit" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Moje alba" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Moje hudba" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Má doporučení" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Název" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Název" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Volby pro pojmenování" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Úzké pásmo" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Síťová proxy" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Síťové vzdálené ovládání" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Nikdy" #: library/library.cpp:74 msgid "Never played" msgstr "Nikdy nehráno" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Nikdy nezačít přehrávání" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Nová složka" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Nový seznam skladeb" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Nový chytrý seznam skladeb..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Nové písně" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Nové písně budou přidány automaticky." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Nejnovější skladby" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Další" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Další skladba" #: core/utilities.cpp:151 msgid "Next week" msgstr "Příští týden" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Žádný analyzátor" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Žádný obrázek na pozadí" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Žádné obaly k uložení" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Žádné dlouhé bloky" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Nebyly nalezeny žádné shody. Smažte obsah vyhledávacího pole, aby se znovu zobrazil celý seznam skladeb." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Žádné krátké bloky" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Žádná" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Žádná z vybraných písní nebyla vhodná ke zkopírování do zařízení" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Normální" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Běžný typ bloku" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Není dostupné během používání dynamického seznamu skladeb" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Nepřipojeno" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Nedostatek obsahu" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Nedostatek nadšených obdivovatelů" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Nedostatek členů" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Nedostatek sousedů" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Nenainstalován" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Nepřihlášen" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Nepřipojeno - dvojitým klepnutím připojíte" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Nic nebylo nalezeno" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Druh oznámení" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Oznámení" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Právě se přehrává" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Čísla dílů k ukázání" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Náhled OSD" #: widgets/osd.cpp:173 msgid "Off" msgstr "Vypnuto" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg FLAC" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "Zapnuto" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Přijmout spojení od klientů pouze v rozsazích IP:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Povolit spojení pouze z místní sítě" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Ukázat pouze první" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Neprůhlednost" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Otevřít %1 v prohlížeči" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Otevřít &zvukové CD..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Otevřít soubor OPML" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Otevřít soubor OPML..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Otevřít adresář a zavést hudbu v něm" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Otevřít zařízení" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Otevřít soubor" #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Otevřít v Google Drive" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Otevřít v novém seznamu skladeb" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Otevřít v novém seznamu skladeb" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Otevřít v prohlížeči" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Otevřít..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Operace se nezdařila" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Optimalizovat s ohledem na datový tok" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Optimalizovat s ohledem na kvalitu" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Volby..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Uspořádat soubory" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Uspořádat soubory..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Uspořádávají se soubory" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Původní značky" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "Původní rok" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "Původní rok - Album" #: library/library.cpp:118 msgid "Original year tag support" msgstr "Podpora pro značku Původní rok" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Další volby" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Výstup" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Výstupní zařízení" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Možnosti výstupu" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Přepsat vše" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Přepsat existující soubory" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Přepsat pouze menší" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Vlastník" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Zpracovává se katalog pro Jamendo" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Oslava" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Heslo" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Pozastavit" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Pozastavit přehrávání" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Pozastaveno" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Účinkující" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Pixel" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Prostý postranní panel" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Přehrát" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Počet přehrání" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Přehrát, pokud je zastaveno, pozastavit, pokud je přehráváno" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Hrát, pokud se již něco nepřehrává" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Přehrát . skladbu v seznamu se skladbami" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Přehrát/Pozastavit" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Přehrávání" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Nastavení přehrávače" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Seznam skladeb" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Seznam skladeb dokončen" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Nastavení seznamu skladeb" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Typ seznamu skladeb" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Seznamy" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Zavřete, prosím, svůj prohlížeč a vraťte se do Clementine." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Stav přídavného modulu:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Zvukové záznamy" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Doba zobrazení oznámení" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Předzesílení" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Nastavení" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Nastavení" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Nastavení..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Upřednostňované názvy souborů s obaly alb (oddělené čárkou)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Upřednostňovaný zvukový formát" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Upřednostňovaný datový tok" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Upřednostňovaný formát" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Typ zvuku Premium" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Předvolba:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Stiskněte klávesovou zkratku, která se použije pro" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Stiskněte klávesu" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Stiskněte klávesovou zkratku, která se použije pro %1..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Po stisknutí Předchozí v přehrávači nastane..." #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Možnosti vzhledu OSD" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Náhled" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Předchozí" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Předchozí skladba" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Vypsat informaci o verzi" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Průběh" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Postup" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psychedelický" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Stisknout tlačítko Wiiremote" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Seřadit skladby náhodně" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Kvalita" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Kvalita" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Dotazování se zařízení..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Správce řady" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Přidat vybrané skladby do řady" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Přidat skladbu do řady" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Rádio (shodná hlasitost pro všechny skladby)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Déšť" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Déšť" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Náhodná vizualizace" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Ohodnotit současnou píseň nulou hvězdiček" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Ohodnotit současnou píseň jednou hvězdičkou" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Ohodnotit současnou píseň dvěma hvězdičkami" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Ohodnotit současnou píseň třemi hvězdičkami" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Ohodnotit současnou píseň čtyřmi hvězdičkami" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Ohodnotit současnou píseň pěti hvězdičkami" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Hodnocení" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Opravdu zrušit?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Krajní mez na přesměrování překročena, ověřte nastavení serveru." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Obnovit katalog" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Obnovit kanály" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Obnovit seznam stanic" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Obnovit proudy" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Relativní" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Zapamatovat si výkyv vzdáleného ovládání Wii" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Obnovit předchozí stav" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Zapamatovat si moji volbu" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Odstranit" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Odstranit činnost" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Odstranit zdvojené ze seznamu skladeb" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Odstranit složku" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Odstranit z Moje hudba" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Odstranit ze záložek" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Odstranit ze seznamu skladeb" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Odstranit seznam skladeb" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Odstranit seznamy skladeb" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Odstranit nedostupné skladby ze seznamu skladeb" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Přejmenovat seznam skladeb" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Přejmenovat seznam skladeb..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Přečíslovat skladby v tomto pořadí..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Opakovat" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Opakovat album" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Opakovat seznam skladeb" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Opakovat skladbu" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Nahradit současný seznam skladeb" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Nahradit seznam skladeb" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Nahradí mezery podtržítky" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Zesílení přehrávaných skladeb" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Režim zesílení přehrávaných skladeb" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Znovu zaplnit" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Vyžadovat ověřovací kód" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Obnovit výchozí" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Vynulovat počty přehrání" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Spustit píseň znovu, potom, v případě že je tlačítko opět stisknuto, skočit na předchozí" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Spustit znovu přehrávání skladby, nebo přehrávat předchozí skladbu, jestliže ještě neuběhlo osm sekund od začátku skladby." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Omezit na znaky &ASCII" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Obnovit přehrávání při spuštění" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Návrat do Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Vpravo" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Vytáhnout" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Vytáhnout skladby z CD" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Vytáhnout skladby ze zvukového CD" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Spustit" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "Proxy SOCKS" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Chyba inicializace SSL, ověřte nastavení serveru. Volba SSLv3 níže může některé potíže dočasně vyřešit." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Bezpečně odebrat zařízení" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Po dokončení kopírování bezpečně odebrat zařízení" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Vzorkovací kmitočet" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Vzorkovací frekvence" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Uložit soubory .mood v hudební sbírce" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Uložit obal alba" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Uložit obal na disk..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Uložit obrázek" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Uložit seznam skladeb" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Uložit seznam skladeb" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Uložit seznam skladeb..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Uložit předvolbu" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Uložit hodnocení do souborových značek vždy, když je to možné" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Uložit statistiku do souborových značek vždy, když je to možné" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Uložit tento proud na kartě Internet" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Ukládání statistiky písní do souborů písní" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Ukládají se skladby" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Profil škálovatelného vzorkovacího kmitočtu" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Velikost měřítka" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Výsledek" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Odesílat informace o přehrávaných skladbách." #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Hledat" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Hledat" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Hledat stanice s Icecastem" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Hledat na Jamendu" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Hledat na Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Vyhledat Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Hledat automaticky" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Hledat obaly alb..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Hledat vše" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Hledat na gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Hledat na iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Režim vyhledávání" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Možnosti vyhledávání" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Hledat výsledky" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Hledané výrazy" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Druhá úroveň" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Přetočit zpět" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Přetočit vpřed" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Přetočit v nyní přehrávané skladbě" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Skočit v nyní přehrávané skladbě na určité místo" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "Posunování pomocí klávesové zkratky" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Vybrat vše" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Nevybrat žádnou skladbu" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Vybrat barvu pozadí:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Vybrat obrázek na pozadí" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Vyberte nejlepší možnou shodu" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Vybrat barvu popředí:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Vybrat vizualizace" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Vybrat vizualizace..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Vybrat..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Sériové číslo" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Server" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "Adresa serveru (URL)" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Podrobnosti o serveru" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Služba není dostupná" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Nastavit %1 na \"%2\"..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Nastavit hlasitost na procent" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Nastavit hodnotu pro vybrané skladby..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Nastavení" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Klávesová zkratka" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Klávesová zkratka pro %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Klávesová zkratka pro %1 již existuje" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Ukázat" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Ukázat OSD" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Ukazovat zářící animaci nyní přehrávané skladby" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Ukázat náladový proužek v ukazateli postupu přehrávání skladby" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Ukazovat systémová oznámení" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Ukazovat oznámení při změně režimu opakování/míchání" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Zobrazovat oznámení při změně hlasitosti" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Ukazovat oznámení při pozastavení přehrávání" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Ukazovat okno vyskakující z oznamovací části panelu" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Ukazovat OSD" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Ukazovat nad stavovým řádkem" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Ukázat všechny písně" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Ukázat všechny písně" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Ukazovat obal ve sbírce" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Ukazovat oddělovače" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Ukázat v plné velikosti..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Ukázat skupiny ve výsledcích celkového hledání" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Ukázat v prohlížeči souborů..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Ukazovat ve sbírce..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Ukázat pod různými umělci" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Ukázat náladový proužek" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Ukázat pouze zdvojené" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Ukázat pouze neoznačené" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Ukázat přehrávanou píseň na vaší stránce" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Ukázat návrhy hledání" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Zobrazovat tlačítko \"Oblíbit\"" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Ukazovat v hlavním okně tlačítko pro odesílání informací o přehrávání" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Ukazovat ikonu v oznamovací oblasti" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Ukázat, které zdroje jsou povoleny a které zakázány" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Ukázat/Skrýt" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Zamíchat" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Zamíchat alba" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Zamíchat vše" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Zamíchat seznam skladeb" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Zamíchat skladby na tomto albu" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Přihlásit se" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Odhlásit" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Přihlašuje se..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Podobní umělci" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Velikost" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Velikost:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Předchozí skladba v seznamu skladeb" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Počet přeskočení" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Další skladba v seznamu skladeb" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Přeskočit vybrané skladby" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Přeskočit skladbu" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Malý obal alba" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Malý postranní panel" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Chytrý seznam skladeb" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Chytré seznamy skladeb" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Měkké" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Informace o písni" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Píseň" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Promiňte" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Řadit podle žánru (abecedně)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Řadit podle žánru (podle oblíbenosti)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Řadit podle názvu stanice" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Řadit písně podle" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Řazení" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Zdroj" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Zdroje" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Chyba přihlášení k Spotify" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "Adresa seznamu skladeb Spotify" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Přídavný modul Spotify" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Přídavný modul Spotify není nainstalován" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "Adresa písně Spotify" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Obvyklý" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "S hvězdičkou" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Začít vytahovat" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Přehrát současnou skladbu v seznamu skladeb" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Převést" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Začněte něco psát do vyhledávacího pole výše, abyste naplnil tento seznam pro hledání výsledků." #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Spouští se %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Spouští se..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Zastavit" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Zastavit po" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Zastavit po každé skladbě" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Zastavit po každé skladbě" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Zastavit po této skladbě" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Zastavit přehrávání" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Zastavit po současné skladbě" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Zastavit přehrávání po skladbě: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Zastaveno" #: core/song.cpp:431 msgid "Stream" msgstr "Proud" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Posílání dat ze serveru Subsonic vyžaduje mít po uplynutí třicetidenní zkušební doby platnou licenci serveru." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "bez stahování (pouze přehrávání)" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Předplatitelé" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Úspěch" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "%1 úspěšně zapsán" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Navrhované značky" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Shrnutí" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Nadmíru vysoké (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Hodně velké (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Podporované formáty" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Seřídit statistiky se soubory nyní" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Synchronizuje se schránka Spotify" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Synchronizuje se seznam skladeb Spotify" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Synchronizují se skladby označené hvězdičkou na Spotify" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Systémové barvy" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Karty nahoře" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Stahování značek" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Cílový datový tok" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Volby pro text" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Poděkování" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Příkaz \"%1\" se nepodařilo provést." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Obal alba nyní přehrávané písně" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "Adresář \"%1\" je neplatný" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "Druhá hodnota musí být větší než první!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Požadovaná stránka neexistuje!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Požadovaná stránka není obrázek!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Lhůta na vyzkoušení serveru Subsonic uplynula. Dejte, prosím, dar, abyste dostali licenční klíč. Navštivte subsonic.org kvůli podrobnostem." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Verze Clementine, na kterou jste právě povýšili, vyžaduje z důvodu nových vlastností vypsaných níže úplné nové prohledání sbírky:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Na tomto albu jsou další písně" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Nastaly potíže se spojením s gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Při stahování popisných dat z Magnatune se vyskytly potíže." #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Nastaly potíže se zpracováním odpovědi od obchodu iTunes" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Při kopírování některých písní nastaly potíže. Nepodařilo se zkopírovat následující soubory:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Při mazání některých písní nastaly potíže. Nepodařilo se smazat následující soubory:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Tyto soubory budou smazány ze zařízení. Opravdu chcete pokračovat?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Tyto soubory budou trvale smazány z disku. Opravdu chcete pokračovat?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Clementine bude novou hudbu pro vaši sbírku hledat v těchto složkách" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Tato nastavení se používají v dialogu pro překódování hudby a když je hudba před kopírováním do zařízení převáděna." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Třetí úroveň" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Tento krok vytvoří databázi, která může být velká až 150 MB.\nPřesto chcete pokračovat?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Album není v požadovaném formátu dostupné" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Toto lze změnit později v nastavení" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Pro zjištění podporovaných formátů souborů je zařízení nejdřív nutno připojit a otevřít." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Toto zařízení podporuje následující formáty souborů:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Toto zařízení nebude pracovat správně" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Toto je zařízení MTP, ale Clementine byl sestaven bez podpory pro libmtp." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Toto je zařízení iPod, ale Clementine byl sestaven bez podpory pro libgpod." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Toto zařízení bylo připojeno poprvé. Clementine na něm nyní hledá hudební soubory - může to chvíli trvat." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Tuto volbu lze změnit v nastavení Chování" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Tento proud je pouze pro předplatitele" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Tento typ zařízení není podporován: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "Časový krok" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Název" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Dnes" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Přepnout OSD" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Zapnout/Vypnout zobrazení na celou obrazovku" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Přepnout stav řady" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Přepnout odesílání informací o přehrávání" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Přepnout viditelnost hezkých oznámení na obrazovce (OSD)" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Zítra" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Příliš mnoho přesměrování" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Nejlepší skladby" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Alb celkem:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Celkem přeneseno bajtů" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Celkem uskutečněno síťových požadavků" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Skladba" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Skladby" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Převést hudbu" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Záznam o převodu" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Překódování" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Převádí se %1 souborů s %2 procesy" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Volby překódování" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbína" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Vypnout" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "Adresa (URL)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Ultra široké pásmo" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Nelze se připojit" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Nepodařilo se stáhnout %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Neznámý" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Neznámý typ obsahu" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Neznámá chyba" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Odebrat obal" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Zrušit přeskočení vybraných skladeb" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Zrušit přeskočení skladby" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Zrušit odběr" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Připravované koncerty" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Aktualizovat" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Obnovit všechny zvukovové záznamy" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Obnovit změněné složky sbírky" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Při spuštění Clementine obnovit hudební sbírku" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Obnovit tento zvukový záznam" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Obnovuje se" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Obnovuje se %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Obnovuje se %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Obnovuje se hudební sbírka" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Zacházení" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Použít značku Umělec alba, když je dostupná" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Používat klávesové zkratky GNOME" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Použít pestré barvy" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Používat metadata pro zesílení přehrávaných skladeb, jsou-li dostupná" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Použít SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Použít dálkové ovládání Wii" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Použít vlastní sadu barev:" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Použít vlastní zprávu pro oznámení" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Použít síťové vzdálené ovládání" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Použít ověření" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Použít stroj na správu datového toku" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Použít dynamický režim" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Použít oznamování pro hlášení stavu dálkového ovládání Wii" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Použít časové tvarování šumu" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Použít výchozí nastavení systému" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Použít systémovou výchozí sadu barev:" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Použít systémové nastavení proxy" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Použít normalizaci hlasitosti" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Použito" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Uživatelské rozhraní" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Uživatelské jméno" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Použití nabídky pro přidání písně..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "Proměnlivý datový tok MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Proměnlivý datový tok" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Různí umělci" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Verze %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Pohled" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Režim vizualizací" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Vizualizace" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Nastavení vizualizací" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Zjištění hlasové činnosti" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Hlasitost %1 %" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Zeď" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Varovat při zavření karty se seznamem skladeb" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "WAV" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Stránky" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Týdny" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Při spuštění Clementine" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Při hledání obalu alba se Clementine nejprve podívá po obrázkových souborech, jež obsahují jedno z těchto slov.\nPokud nenajde žádné, které by se shodovaly, potom použije největší obrázek v adresáři." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "Při ukládání seznamu skladeb mají být cesty k souborům" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Když je seznam prázdný..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Proč nezkusit" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Široké pásmo" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: zapnuto" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: připojeno" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: vážný stav baterie (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: vypnuto" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: odpojeno" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: nízká hladina baterie (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media Audio" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Bez obalu:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Chcete další písně na tomto albu přesunout do Různí umělci?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Chcete spustit toto úplné nové prohledání hned teď?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Zapsat všechny statistiky písní do souborů písní" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Zapsat popisná data" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Nesprávné uživatelské jméno nebo heslo." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Rok" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Rok - Album" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Roky" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Včera" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Chystáte se stáhnout následující alba" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Chystáte se odstranit %1 seznamů skladeb z vašich oblíbených. Jste si jisti?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Chystáte se odstranit seznam skladeb, který není součástí vašich oblíbených seznamů skladeb: Seznam skladeb bude nenávratně odstraněn (tento krok nelze vrátit zpět). \nOpravdu chcete pokračovat?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Nejste přihlášen." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Jste přihlášen jako %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Jste přihlášen." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Můžete změnit způsob uspořádání písní v hudební sbírce." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Můžete poslouchat zdarma bez účtu, ale členové Premium mohou poslouchat proudy o vyšší kvalitě a bez reklam." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Poslouchat hudbu z Magnatune lze zdarma bez uživatelského účtu. Odstranění zprávy na koncích skladeb je možné zakoupením členství." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Proudy na pozadí můžete poslouchat současně s jinou hudbou." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Clementine lze ovládat dálkovým ovladačem od Wii. Pro více informací navštivte wiki Clementine.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Nemáte účet Spotify Premium." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Nemáte aktivní předplatné" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "Nemusíte být přihlášen, abyste mohl hledat a poslouchat hudbu na SoundCloud. Musíte ale být přihlášen, abyste mohl přistupovat ke svým seznamům skladeb a ke svým proudům." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Byl jste odhlášen ze Spotify. zadejte, prosím, své heslo v dialogu pro nastavení znovu." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Byl jste odhlášen ze Spotify. zadejte, prosím, své heslo znovu." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Tato skladba patří mezi vaše oblíbené" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "Aby bylo možné v Clementine používat globální klávesové zkratky, je nutné spustit Nastavení systému a povolit Clementine \"ovládat váš počítač\"." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Pokud změníte jazyk, budete muset Clementine spustit znovu." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Vaše adresa IP:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Vaše přihlašovací údaje k Last.fm byly nesprávné" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Vaše přihlašovací údaje k Magnatune byly nesprávné" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Vaše hudební sbírka je prázdná!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Vaše rozhlasové proudy" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Váš počet přehrání: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Ve vašem systém chybí podpora pro OpenGL. Vizualizace jsou nedostupné." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Uživatelské jméno nebo heslo bylo nesprávné." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Vynulovat" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "přidat %n písní" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "po" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "před" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "a" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "automaticky" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "před" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "mezi" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "nejprve největší" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "úzm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "obsahuje" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "zakázáno" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "disk %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "neobsahuje" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "končí na" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "rovná se" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "Adresář pro gpodder.net" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "větší než" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "Zařízení iPods a USB nyní na Windows nepracují. Promiňte!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "za posledních" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kb/s" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "méně než" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "nejprve nejdelší" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "Přesunout %n písní" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "nejprve nejnovější" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "nerovná se" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "ne za posledních" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "ne na" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "nejprve nejstarší" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "Na" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "volby" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "nebo sejmout QR kód!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "stiskněte Enter" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "odstranit %n písní" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "nejprve nejkratší" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "Zamíchat písně" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "nejprve nejmenší" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "Třídit písně" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "začíná na" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "zastavit" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "skladba %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/cy.po000066400000000000000000004023611260417502300236600ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # FIRST AUTHOR , 2010 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Welsh (http://www.transifex.com/davidsansome/clementine/language/cy/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cy\n" "Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr "" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "" #: core/utilities.cpp:119 msgid "1 day" msgstr "" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "" #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "" #: core/song.cpp:422 msgid "AIFF" msgstr "" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "" #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "" #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "" #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "" #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "" #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "" #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "" #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:80 msgid "All the translators" msgstr "" #: library/library.cpp:98 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:85 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "" #: ui/about.cpp:68 msgid "Authors" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "" #: core/database.cpp:648 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "" #: core/song.cpp:428 msgid "CDDA" msgstr "" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "" #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:114 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "" #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "" #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "" #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "" #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:68 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:585 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "" #: library/library.cpp:80 msgid "Last played" msgstr "" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: ui/equalizer.cpp:137 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "" #: core/song.cpp:410 msgid "MPC" msgstr "" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "" #: library/library.cpp:74 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:92 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "" #: core/utilities.cpp:151 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "" #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "" #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "" #: core/organise.cpp:73 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:139 msgid "Party" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "" #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "" #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "" #: core/song.cpp:431 msgid "Stream" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "" #: ui/about.cpp:74 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "" #: core/song.cpp:426 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "" #: devices/giolister.cpp:157 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/da.po000066400000000000000000004752201260417502300236350ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Anders J. Sørensen, 2013 # andersrh.arh , 2014 # FIRST AUTHOR , 2010 # Runkeldunk , 2014 # Runkeldunk , 2012 # Jens E. Jensen , 2012 # Joe Hansen , 2014 # Johan Olesen , 2013 # Morten Anton Bach Sjøgren , 2010 # Peter Jespersen , 2012-2015 # Tommy Carstensen , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Danish (http://www.transifex.com/davidsansome/clementine/language/da/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: da\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "dage" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " sekunder" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " sange" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 sange)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 album" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 dage" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 dage siden" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 på %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 playlister (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 valgt ud af" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 sang" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 sange" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 sange fundet" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 sange fundet (viser %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 numre" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 overført" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev modul" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 andre lyttere" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 totale afspilninger" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filnavn%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n fejlede" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n færdige" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n tilbage" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Juster tekst" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Centrer" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Brugervalgt" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "&Extra" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "Hjælp" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "Skjul %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "Skjul..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Venstre" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "Musik" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Ingen" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "Spilleliste" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Afslut" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Gentagelsestilstand" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Højre" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Tilfældig-tilstand" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Udvid søjler til at passe til vindue" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "Værktøjer" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(forskelligt over flere sange)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", af" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...og alle Amarok-bidragsyderne" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 dag" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 nummer" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192.000Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44.100Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48.000Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 tilfældige numre" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96.000Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Opgrader til Premium nu" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Variabler starter med %, for eksempel: %artist %album %title

\n\n

Hvis du angiver krøllede parenteser uden om en del af teksten, vil denne blive skjult hvis variablen er tom.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "En Spotify Premium konto er påkrævet." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "En klient kan kun oprette forbindelse, hvis en korrekt kode var indsat." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "En smart spilleliste er en dynamisk liste af sange fra dit bibliotek. Der findes forskellige typer af smarte spillelister der tilbyder forskellige måder at udvælge sange på." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "En sang bliver inkluderet i playlisten hvis den matcher disse krav." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Å" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "AL ÆRE TIL HYPNOTUDSEN" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Afbryd" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Om %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Om Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Om Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Absolut" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Kontodetaljer" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Kontodetaljer (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Handling" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Handling" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Aktiver/deaktiver Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Aktivitetsstrøm" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Tilføj Podcast" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Tilføj stream" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Tilføj en nye linie hvis det er undstøttet af notifikations typen" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Tilføj handling" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Tilføj alle numre fra en mappe og alle dens undermapper" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Henter streams" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Tilføj mappe..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Tilføj fil" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Tilføj fil til omkoder" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Tilføj filer til omkoder" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Tilføj fil..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Tilføj fil til omkodning" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Tilføj mappe" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Tilføj mappe..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Tilføj ny mappe..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Tilføj podcast" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Tilføj podcast..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Tilføj søgeterm" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Tilføj album-mærke" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Tilføj albumkunstner-mærke" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Tilføj kunstner-mærke" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Tilføj automatisk bedømmelse til sang" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Tilføj komponist-mærke" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Tilføj disc-mærke" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Tilføj sang filnavn" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Tilføj genre-mærke" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Tilføj gruppemærke til sang" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Tilføj sanglængde-mærke" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Tilføj kunstnermærke til sang" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Tilføj antal afspilninger" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Tilføj sang bedømmelse" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Tilføj antal overspringninger" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Tilføj sangtitel-mærke" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Tilføj sang til cache" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Tilføj sangnummer-mærke" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Tilføj sangår-mærke" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Tilføj sange til »Min musik« når knappen »Elsker« trykkes ned" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Genopfrisk streams" #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Tilføj til Min Musik" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Tilføj til Spotify-afspilnignslister" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Tilføj til en anden playliste" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Tilføj til bogmærker" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Føj til spilleliste" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Tilføj til køen" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Tilføj user/gruppe til bogmærker" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Tilføj wiimotedev handling" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Tilføj..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Tilføjet i denne måned" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Tilføjet i denne uge" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Tilføjet i år" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Tilføjet i dag" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Tilføjet indenfor de seneste tre måneder" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Avanceret gruppering..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Efter" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Efter kopiering..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Album (ideel lydstyrke for alle spor)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Albummets kunstner" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Pladeomslag" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Album info på jamendo.com" #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Album" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Albummer med omslag" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Albummer uden omslag" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Alle" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Alle Filer (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Alle albummer" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Alle kunstnere" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Alle filer (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Alle spillelister (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Alle oversætterne" #: library/library.cpp:98 msgid "All tracks" msgstr "Alle numre" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Tillad en klient at hente musik fra denne computer." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Tillad downloads" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Tillad mid/side kodning" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Ved siden af originalerne" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Skjul altid hovedvinduet" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Vis altid hovedvinduet" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Start altid afspilning" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon Cloud Drive" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "En yderligere tilføjelse er krævet for at bruge Spotify i Clementine. Ønsker du at hente og installere den nu?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "En fejl opstod under hentning af iTunes-databasen" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "En fejl opstod under skrivning af metadata til '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "En uspecifik fejl er opstået." #: ui/about.cpp:85 msgid "And:" msgstr "Og:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Vred" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Udseende" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Tilføj filer/URL'er til spillelisten" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Tilføj til nuværende playliste" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Tilføj til playlisten" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Påfør kompression for at undgå klipping" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Vil du slettet \"%1\"-forudindstilling?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Er du sikker på, at du ønsker at nulstille denne sangs statistik?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Er du sikker på, at du ønsker at skrive sangens statistik ind i sangfilen for alle sange i dit bibliotek?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Kunstner" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Kunstnerinfo" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Kunstner-mærker" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Kunstners initial" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Spørg når der gemmes" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Lydformat" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Lydudgang" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Autentificering mislykkedes" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Forfatter" #: ui/about.cpp:68 msgid "Authors" msgstr "Forfattere" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Auto" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Automatisk" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Automatisk opdatering" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Åbn automatisk enkelte kategorier i bibliotekstræet" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Til rådighed" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Gns. bitrate" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Gns. billedstørrelse" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "BBC Podcasts" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Du kan lytte gratis uden en konto, men Premium-medlemmer kan lytte til streams i højere kvalitet, og uden reklame." #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Baggrundsfarve" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Baggrundsbillede" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Baggrundsgennemsigtighed" #: core/database.cpp:648 msgid "Backing up database" msgstr "Sikkerhedskopierer database" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Balance" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Bar analytiker" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Basal blå" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Basal lydtype" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Adfærd" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Bedst" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Biografi fra %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Bitrate" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Bitrate" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Bitrate" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Blok-analyzer" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Blok type" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Krop" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Boom-analyzer" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Gennemse..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Buffervarighed" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Buffering" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Men disse kilder er slået fra:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Knapper" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Understøttelse af indeksark" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Annuller" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Afbryd download" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Skift omslag" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Skift størrelse på skrifttype" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Ændr gentagelsestilstand" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Ændrer smutvej..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Ændr blandingstilstand" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Skift sprog" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Ændring af mono afspilningspræference vil først træde i kraft for de næste afspillede sange" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Søg efter nye episoder" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Tjek for opdateringer" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Tjek efter opdateringer..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Vælg et navn til den smarte spilleliste" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Vælg automatisk" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Vælg farve..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Vælg skrifttype..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Vælg fra listen" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Vælg hvordan spillelisten er sorteret og hvor mange sange den vil indeholde." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Vælg podcast download bibliotek" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Vælg internettjenesterne du ønsker at vise." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Velg hjemmesiderne du vil have at Clementine skal bruge når der søges efter sangtekster." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Klassisk" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Rydder op" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Ryd" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Ryd spilleliste" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Clementine Fejl" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Klementin orange" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Clementine visualisering" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine kan automatisk konvertere musikken du kopierer til denne enhed til et format som den kan afspille." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine kan afspille musik du har uploadet til Box" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine kan afspille musik, som du har uploadet til Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine kan afspille musik, som du har uploadet til Google Drev" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine kan afspille musik du har overført til OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clemetine må vise en besked når spor skiftes." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine kan synkronisere dine abonnementslister med dine andre computere og podcast klienter. Opret en konto." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine kunne ikke indlæse projectM visualiseringer. Tjek at Clementine er korrekt installeret." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Clementine billedfremviser" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine kunne ikke finde resultater for denne fil" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine vil finde musik i:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Klik her for at tilføje musik" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Klik for at skifte mellem tilbageværende tid og total tid" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Hvis du klikker på knappen Log ind det åbne hjemmesidelæseren. Du bør vende tilbage til Clementine efter du har logget ind" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Luk" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Luk spilleliste" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Luk visualisering" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Lukning af dette vindue will aflyse hentningen." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Lukning af dette vindue vil stoppe søgen efter album omslag." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Farver" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Komma-separeret liste af klasse:level, level er 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Kommentar" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Fuldfør mærker automatisk" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Fuldfør mærker automatisk..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Komponist" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Konfigurer %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Konfigurér Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Konfigurér Genveje" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Indstil Spotify..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Konfigurér Subsonic..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Konfigurer Vk.com ..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Indstil Global søgning ..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Indstil bibliotek..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Konfigurer podcasts ..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Indstil..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Forbind til Wii Remotes med aktiver/deaktiver handling" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Forbind til enhed" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Forbinder til Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Forbindelse afvist af server, kontroller serveradresse. Eksempel: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Forbindelsen fik tidsudløb, kontroller serveradressen. Eksempel: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Forbindelsesproblem eller lyd er deaktiveret af ejeren" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Konsol" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Fast bitrate" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Konverter al musik" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Konverter musik som enheden ikke kan afspille" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Konvertér tabsfrie filer" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Kopier delingsadresse til udklipsholderen" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Kopier til udklipsholder" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Koper til enhed..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Kopiér til bibliotek..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Copyright" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Kunne ikke oprette forbindelse til Subsonic, check server URL'en. Eksempel: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Kunne ikke oprette GStreamer elementet \\\"%1\\\" - sørg for at du har alle de nødvendige GStreamer udvidelsesmoduler installeret" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Kunne ikke oprette afspilningsliste" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Kunne ikke finde muxer for %1, tjek at du har de rigtige GStreamer udvidelsesmoduler installeret" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Kunne ikke finde koder for %1, tjek at du har de rigtige GStreamer udvidelsesmoduler installeret" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Kunne ikke åbne output fil %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Omslagshåndtering" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Omslag fra indlejret billede" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Omslag blev indlæst automatisk fra %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Omslag manuelt fjernet" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Omslag er ikke angivet" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Omslag angivet fra %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Omslag fra %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Fade over når der automatisk skiftes spor" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Fade over når der manuelt skiftes spor" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Selvvalgt" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Brugerdefineret billede:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Selvvalgte meddelelsesindstillinger" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Tilpasset..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "DBus sti" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dance" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Database korruption opdaget. Læs https://code.google.com/p/clementine-player/wiki/DatabaseCorruption for at få instruktioner om, hvordan du gendanner din database" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Oprettelsesdato" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Ændringsdato" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Dage" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "Standard" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Sænk lydstyrken med 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Nedsæt lydstyrken med procent" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Dæmp lydstyrke" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Standard baggrundsbillede" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Standardenhed på %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Standarder" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Pause mellem visualiseringer" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Slet" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Sletter hentet data" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Slet filer" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Slet fra enhed..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Slet fra disk..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Slet afspillede episoder" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Slet forudindstilling" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Slet smart spilleliste" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Slet de originale filer" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Sletter filer" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Fjern valgte spor fra afspilningskøen" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Fjern sporet fra afspilningskøen" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Destination" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Detaljer..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Enhed" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Enhedsindstillinger" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Enhedsnavn" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Enhedsindstillinger..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Enhed" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Dialog" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Mente du" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Digitally Imported adgangskode" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Digitally Imported brugernavn" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Koblet direkte til internettet" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Bibliotek" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Slå varighed fra" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Deaktiver generering af stemningslinje" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Deaktiveret" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Deaktiver" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Disk" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Afbrudt transmission" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Visningsegenskaber" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Vis on-screen-display" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Genindlæs hele biblioteket" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Udfør en fuld genscanning" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Udfør en fuld genscanning ..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Konverter ikke noget musik" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Overskriv ikke" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Gentag ikke" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Vis ikke under diverse kunstnere" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Bland ikke" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Stop ikke" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Bidrag" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Dobbeltklik for at åbne" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Når jeg dobbeltklikker på en sang..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Hent %n episoder" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Hent bibliotek" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Hent episoder til" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Hent medlemskab" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Hent automatisk nye episoder" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Hent filer i downloadkø" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Hent Android app'en" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Hent dette album" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Hent dette album..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Hent denne episode" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Henter..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Henter (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Henter Icecast bibliotek" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Henter Jamendo katalog" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Henter Magnatune katalog" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Henter Spotify plugin" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Hent metadata" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Træk for at skifte position" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Varighed" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Dynamisk tilstand er aktiveret" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Dynamisk tilfældig mix" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Rediger smart spilleliste..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Rediger mærke »%1« ..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Redigér mærke..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Rediger mærker" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Redigér sporinformation" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Redigér sporinformation..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Rediger information om sporet" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Rediger..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "E-post" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Aktiver støtte for Wii Remote" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Aktivér equalizer" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Brug kun genveje når Clementine har fokus" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Aktiver kilder nedenfor til at medtage dem i søgeresultaterne. Resultaterne vil blive vist i denne rækkefølge." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Aktiver/deaktiver Last.fm scrobbling" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Indkodningskompleksitet" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Indkodningskvalitet" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Indkodningstilstand" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Indtast en URL" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Indtast en URL for at downloade omslag fra internettet:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Indtast et filnavn for eksporterede omslag (ingen udvidelse):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Giv denne spilleliste et nyt navn" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Indtast søgeord ovenfor for at finde musik på computeren og på internettet" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Indtast søgeord nedenfor for at finde podcasts i iTunes Store" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Indtast søgeord nedenfor for at finde podcasts på gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Indtast søgeudtryk her" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Indtast URL'en til en internetradiostream:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Indtast foldernavn" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Indtast denne IP i app'en for at forbinde til Clementine." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Hele samlingen" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Equalizer" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Svarende til --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Svarende til --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Fejl" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Fejl ved CD Ripning" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Kunne ikke koble til MTP-enhed" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Fejl ved kopiering af sang" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Fejl ved sletning af sang" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Fejl ved hentning af Spotify plugin" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Kunne ikke indlæse %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Kunne ikke indlæse spilleliste fra di.fm" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Kunne ikke behandle %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Kunne ikke indlæse lyd-CD" #: library/library.cpp:68 msgid "Ever played" msgstr "Nogensinde afspillet" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Hver 10 minut" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Hver 12 time" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Hver 2 time" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Hver 20 minut" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Hver 30 minut" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Hver 6 time" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Hver time" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Undtaget mellem spor fra samme album eller CUE-fil" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Eksisterende omslag" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Udvid" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Udløber den %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Eksporter omslag" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Eksporter omslag" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Eksporter hentede omslag" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Eksporter indlejrede omslag" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Eksport færdig" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Eksporterede %1 omslag ud af %2 (%3 sprunget over)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Fade ud ved pause/ fade ind ved genstart" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Fade ud når et spor stoppes" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Fading" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Varighed af fade" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Fejl ved læsning af CD-drev" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Kunne ikke hente bibliotek" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Kunne ikke hente podcasts" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Kunne ikke indlæse podcast" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Kunne fortolke XML til dette RSS-feed" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Hurtig" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Favoritspor" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Hent manglende omslag" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Hent automatisk" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Hentning fuldført" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Henter Subsonic bibliotek" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Kunne ikke hente omslag" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Filformat" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "File suffiks" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Filformater" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Filnavn" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Filnavn (uden sti)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Filnavnmønster:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Filstier" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Filstørrelse" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Filtype" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Filnavn" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Filer" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Filer som skal omkodes" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Find sange i biblioteket, baseret på de kriterier du opgiver." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Find denne kunstner" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Giver sangen fingeraftryk" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Afslut" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Første niveau" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Tilpas cover til i bredden" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Skriftstørrelse" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "På grund af licenshensyn er Spotify-understøttelsen en separat udvidelsesmodul." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Gennemtving monolyd-indkodning" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Glem enhed" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Hvis du glemmer enheden, forsvinder den fra denne liste, og Clementine må genindlæse alle sangene på enheden næste gang du kobler den til." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Formular" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Format" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Billedrate" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Billeder per buffer" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Frosset" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Fuld bas" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Fuld bas + diskant" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Fuld diskant" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Generelt" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Generelle indstillinger" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Genre" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Henter kanaler" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Henter strømme" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Giv det et navn:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Start" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Gå til næste faneblad på spillelisten" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Gå til forrige faneblad på spillelisten" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drev" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Hentede %1 af %2 omslag (%3 mislykkedes)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Giv ikke-eksisterende sange gråtone i mine spillelister" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Gruppér bibliotek efter..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Grupper efter" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Gruppér efter album" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Gruppér efter kunstner" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Gruppér efter kunstner/album" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Gruppér efter kunstner/år - album" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Gruppér efter genre/album" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Gruppér efter genre/kunstner/album" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Gruppering " #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "HTML-side indeholder ingen RSS-feeds" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "HTTP proxy" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Glad" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Hardwareinformation" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Hardwareinformation er kun tilgængelig når enheden er tilsluttet." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Høj" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Høj (%1 billeder/sekund)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Høj (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "HipHop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Vært ikke fundet, tjek serveradresse. Eksempel: http://localhost: 4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Timer" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnotudsen" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Jeg har ikke nogen Magnatune-konto" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Ikon" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Ikoner på toppen" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Identificerer sang" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Hvis du fortsætter, vil enheden blive langsom og du kan måske ikke afspille sange som er kopieret til den." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Hvis du kender URL-adressen på en podcast, skal du indtaste det nedenfor og tryk Start." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Ignorer \\\"The\\\" i kunstnernavn" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Billeder (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Billeder (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Import ..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "Om %1 dage" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "Om %1 uger" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "I dynamisk tilstand vil nye spor blive valgt og lagt til spillelisten hver gang en sang slutter." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Indboks" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Inkludér albumkunst i bekendtgørelsen" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Inkluder alle sange" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Inkompatibel Subsonic REST protokol version. Klienten skal opgraderes." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Inkompatibel Subsonic REST protokol version. Serveren skal opgraderes." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Ufuldstændig konfiguration, sikr dig at alle felter er udfyldt." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Forøg lydstyrken med 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Skru op for lyden med procent" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Forøg lydstyrke" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Indekserer %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Information" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Indsæt..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Installeret" #: core/database.cpp:585 msgid "Integrity check" msgstr "Integritetskontrol" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Internet udbydere" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Internettjenester" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Ugyldig API-nøgle" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Ugyldig format" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Ugyldig metode" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Ugyldige parametre" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Ugyldig resource angivet" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Ugyldig tjeneste" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Ugyldig sessionsnøgle" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Inverter Udvælgelse" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Mest afspillede på Jamendo" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Favoritlisten på Jamendo" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Månedens favoritter på Jamendo" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Ugens favoritter på Jamendo" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Jamendo database" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Gå til forrige sang nu" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Gå til sporet som afspilles nu" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Hold knappen nede i %1 sekund(er)..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Hold knappen nede i %1 sekund(er)..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Fortsæt i baggrunden selv om du lukker vinduet" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Behold de originale filer" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Sprog" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Bærbar/hovedtelefoner" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Stor sal" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Stort omslag" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Stort albumomslag (detaljer nedenfor)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Stort albumomslag (ingen detaljer)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Stort sidepanel" #: library/library.cpp:80 msgid "Last played" msgstr "Sidst afspillet" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Sidst afspillet" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm er optaget nu, prøv igen om et par minutter" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Last.fm-adgangskode" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Antal afspilninger fra Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Last.fm-mærker " #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Last.fm-brugernavn" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Spor med færreste stemmer" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Venstre" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Længde" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Bibliotek" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Avanceret bibliotektsgruppering" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Meddelelse om genindlæsning af biblioteket" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Søg i biblioteket" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Grænser" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Hent" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Hent omslag fra URL" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Hent omslag fra URL..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Hent omslag fra disk" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Hent omslag fra disk" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Åbn spilleliste" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Åbn spilleliste..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Åbner MTP-enhed" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Åbner iPod-database" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Åbner smart spilleliste" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Åbner sange" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Indlæser stream" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Åbner spor" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Henter information om spor" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Åbner..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Indlæser filer/URL'er og erstatter nuværende spilleliste" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Log ind" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Login mislykkedes" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Log ud" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Long term prediction-profil (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Elsker" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Lav (%1 billeder/sekund)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Lav (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Low complexity-profil (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Sangtekster" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Sangtekster fra %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Tekster fra ID3v2 mærket" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Download fra Magnatune" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Download fra Magnatune fuldført" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Main profile (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Sæt igang!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Gør spillelisten tilgængelig offline" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Misdannet svar" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Manuel proxy-indstilling" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Manuelt" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Fabrikant" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Marker som aflyttet" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Marker som ny" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Match alle søgeord (OG)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Match på hvilket som helst søgeord (ELLER)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Højeste bitrate" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Medie har ændret sig. Genindlæser" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Medium (%1 billeder/sekund)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Medium (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Medlemskabstype" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Minimal bitrate" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Manglende projectM-forvalg" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Overvåg ændringer i biblioteket" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Mono afspilning" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Måneder" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Humør" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Stemningslinje stil" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Stemningslinier" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Mere" #: library/library.cpp:84 msgid "Most played" msgstr "Mest afspillede" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Monteringspunkt" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Monteringspunkter" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Flyt ned" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Flyt til bibliotek..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Flyt op" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Musik" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Musikbibliotek" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Slå lyden fra" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Mine album" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Min Musik" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Mine anbefalinger" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Navn" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Navn" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Navnevalg" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Smalbånd (SB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Netværksproxy" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Netværks Remote" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Aldrig" #: library/library.cpp:74 msgid "Never played" msgstr "Aldrig afspillet" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Begynd aldrig afspilning" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Ny folder" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Ny spilleliste" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Ny smart spilleliste..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Nye sange" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Nye spor vil automatisk blive tilføjet." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Nyeste spor" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Næste" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Næste spor" #: core/utilities.cpp:151 msgid "Next week" msgstr "Næste uge" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Ingen analyzer" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Intet baggrundsbillede" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Ingen omslag at eksportere." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Ingen lange blokke" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Ingen matchende fundet. Ryd søgefeltet for at vise hele spillelisten igen." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Ingen korte blokke" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Ingen" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Kunne ikke kopiere nogen af de valgte sange til enheden" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Almindelig" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Normal bloktype" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Ikke tilgængelig sammen med dynamiske spillelister" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Ikke forbundet" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Ikke nok indhold" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Ikke nok fans" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Ikke nok medlemmer" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Ikke nok naboer" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Ikke installeret" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Ikke logget ind" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Ikke monteret - dobbeltklik for at montere" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Intet fundet" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Bekendtgørelsestype" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Bekendtgørelser" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Nu afspilles" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Antal episoder at vise" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Forhåndsvisning af OSD" #: widgets/osd.cpp:173 msgid "Off" msgstr "Fra" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg FLAC" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "Til" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Accepter kun forbindelser fra klienter med IP'erne:⏎ 10.x.x.x⏎ 172.16.0.0 - 172.31.255.255⏎ 192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Tillad kun forbindelser fra det lokale netværk" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Vis kun den første" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Uigennemsigtighed" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Åben %1 i web browser" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Åbn lyd-&CD" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Åben OPML fil" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Åben OPML fil" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Åbn en mappe hvor musik skal importeres fra" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Åbn enhed" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Åben fil..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Åbn på Google Drev" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Åbn i ny spilleliste" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Åbn i ny afspilningsliste" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Åben i netlæser" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Åben..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Operation mislykkedes" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Optimer for bitrate" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Optimer for kvalitet" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Indstillinger..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Organiser filer" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Organiser filer..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Organiserer filer" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Oprindelige mærker" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Andre valgmuligheder" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Udgang" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Udgangsenhed" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Output-indstillinger" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Overskriv alt" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Overskriv eksisterende filer" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Overskriv kun mindre" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Ejer" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Behandler Jamendo-kataloget" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Party" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Kodeord" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Pause" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Pause i afspilning" #: widgets/osd.cpp:156 msgid "Paused" msgstr "På pause" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Kunstner" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Pixel" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Simpelt sidepanel" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Afspil" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Antal gange afspillet" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Spil hvis der er stoppet, hold pause hvis der spilles" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Afspil hvis der ikke er noget andet som afspilles i øjeblikket" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Afspil det . spor i spillelisten" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Afspil/Pause" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Afspilning" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Afspiller indstillinger" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Spilleliste" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Spilleliste afsluttet" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Indstillinger for spilleliste" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Spillelistetype" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Afspilningslister" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Luk venligst din hjemmesidelæser, og returner til Clementine" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Status for udvidelsesmodulen" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcasts" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Popup varighed" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "For-forstærker" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Præference" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Indstillinger" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Indstillinger..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Foretrukne omslag-filnavn (separeret med komma)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Foretrukket lydformat" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Foretrukken bithastighed" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Foretrukket format" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Premium lydtype" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Forudindstilling:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Tryk på en tastekombination at bruge til" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Tryk på en tast" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Tryk på en tastekombination at bruge til %1..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Indstillinger for køn OSD" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Forhåndsvisning" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Forrige" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Forrige spor" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Vis versionsinformation" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Fremgang" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Status" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psykedelisk" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Tryk på Wiiremote-knap" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Sæt sange i tilfældig rækkefølge" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Kvalitet" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Kvalitet" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Forespørger enhed..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Køhåndterer" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Sæt valgte spor i kø" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Sæt spor i kø" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (samme loudness for alle spor)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Regn" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Regn" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Tilfældig visualisering" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Giv 0 stjerner til denne sang" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Giv 1 stjerne til denne sang" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Giv 2 stjerner til denne sang" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Giv 3 stjerner til denne sang" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Giv 4 stjerner til denne sang" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Giv 5 stjerner til denne sang" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Pointgivning" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Vil du virkelig afbryde?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Genopfrisk kataloget" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Genopfrisk kanaler" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Genopfrisk kanallisten" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Genopfrisk bakgrunnslyder" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Husk Wii-remote-bevægelse" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Husk fra sidste gang" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Husk mit valg" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Fjern" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Fjern handling" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Fjern dubletter fra afspilningsliste" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Fjern mappe" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Fjern fra Min Musik" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Fjern fra bogmærker" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Fjern fra spilleliste" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Fjern spilleliste" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Fjern spillelister" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Fjern utilgængelige numre fra afspilningsliste" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Giv spillelisten et nyt navn" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Giv spillelisten et nyt navn..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Omnummerér spor i denne rækkefølge..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Gentag" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Gentag album" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Gentag spilleliste" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Gentag spor" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Erstat nuværende spilleliste" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Erstat spillelisten" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Erstat mellemrum med understregninger" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Genudfyld" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Forlang autentificeringskode" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Nulstil" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Nulstil afspilningstæller" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Begræns til ASCII-tegn" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Genoptag afspilning ved programstart" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Retur til Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Højre" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Rip" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Rip CD" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Rip lyd-CD" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Kør" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "SOCKS proxy" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Sikker fjernelse af enhed" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Sikker fjernelse af enhed efter kopiering" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Samplingsrate" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Samplingsfrekvens" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Gem .mood filer i dit musikbibliotek." #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Gem omslag" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Gem omslag til disk..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Gem billede" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Gem afspilningsliste" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Gem spilleliste" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Gem spilleliste..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Gem forudindstilling" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Gem statistik i filmærker når muligt" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Gem denne kanal i et Internet-faneblad" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Gem sangstatistik i sangfiler" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Gemmer spor" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Skalerbar samplingsfrekvens-profil (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Skaler størrelse" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Karakter" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Scrobble-spor som jeg lytter til" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Søg" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Søg" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Søg i Icecast-kanaler" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Søg i Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Søg i Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Søg Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Søg automatisk" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Søg efter omslag" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Søg efter noget" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Søg på gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Søg på iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Søgetilstand" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Søgeindstillinger" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Søgeresultater" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Søgekriterier" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Andet niveau" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Spol tilbage" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Spol frem" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Søg med en relativ mængde i det spor der afspilles på nuværende tidspunkt" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Søg til en bestemt position i det spor der afspilles på nuværende tidspunkt" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Vælg alle" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Vælg ingen" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Vælg baggrundsfarve:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Vælg baggrundsbillede" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Vælg det bedste match" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Vælg forgrundsfarve:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Vælg visualiseringer" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Vælg visualiseringer..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Vælg..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Serienummer" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Server" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "Server-URL" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Server detaljer" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Tjeneste offline" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Sæt %1 til \"%2\"..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Sæt lydstyrken til percent" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Sæt værdi på alle valgte spor..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Indstillinger" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Genvejstast" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Genvejstast for %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Der findes allerede en genvejstast for %1" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Vis" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Vis OSD" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Vis en lysende animation på det nuværende spor" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Vis en moodbar i nummeret's fremskridts-bar." #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Vis en native skrivebordsbekendtgørelse" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Vis en meddelelse når jeg ændrer gentagelses- og blandings-tilstand" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Vis en bekendtgørelse når jeg skifter lydstyrke" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Vis en påmindelse når jeg sætter afspilning på pause" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Vis en pop-up fra statusområdet" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Vis en køn OSD" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Vis over statuslinjen" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Vis alle sange" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Vis alle sangene" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Vis omslag i biblioteket" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Vis adskillere" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Vis i fuld størrelse..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Vis i filbrowser" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Vis i biblioteket..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Vis under Diverse kunstnere" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Vis stemningslinie" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Vis kun dubletter" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Vis kun filer uden mærker" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Vis søgeforslag" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Vis knappen »elsker«" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Vis scrobble-knappen i hovedvinduet" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Vis statusikon" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Vis hvilke kilder der er aktiveret og deaktiveret" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Vis/skjul" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Bland" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Bland albummer" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Bland alle" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Bland spilleliste" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Bland spor i dette album" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Log ind" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Log ud" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Logger på..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Lignende kunstnere" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Størrelse" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Størrelse:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Skip tilbage i spillelisten" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Antal gange sprunget over" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Skip fremad i spillelisten" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Skip valgte spor" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Skip spor" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Lille omslagsbillede" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Lille sidepanel" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Smart spilleliste" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Smarte spillelister" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Information om sangen" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Info om sangen" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Beklager" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Sorter alfabetisk efter genre" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Sorter efter genrens popularitet" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Sorter efter kanalnavn" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Sorter sange efter" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Sortering" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Kilde" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Kilder" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Kunne ikke logge på Spotify" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Spotify-udvidelsesmodul" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Spotify-udvidelsesmodulet er ikke installeret" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Standard" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Har stjerner" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Start den spilleliste der afspiller nu" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Start omkodning" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Begynd med at skrive noget i søgeboksen ovenfor, for at fylde denne listen med søgeresultater" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Starter %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Starter…" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Stop" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Stop efter" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Stop efter hvert nummer" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Stop efter hvert spor" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Stop efter dette spor" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Stop afspilning" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Stop afspilning efter nuværende spor" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Stop afspilning efter spor: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Stoppet" #: core/song.cpp:431 msgid "Stream" msgstr "Stream" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Streaming fra en Subsonic server kræver en gyldig server licens, efter den første 30-dages prøveperiode." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Streaming-medlemskab" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Abonnenter" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Succes!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "Skrev %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Foreslåede mærker" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Sammendrag" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Super-høj (%1 billeder/sekund)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Super high (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Understøttede formater" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Synkroniser statistik til filer nu" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Synkroniserer Spotify indbox" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Synkroniser Spotify afspilningsliste" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Synkroniserer stjernemarkerede spor i Spotify" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Systemfarver" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Faneblade i toppen" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Mærke-henter" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Ønsket bitrate" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Tekst indstillinger" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Tak til" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Kunne ikke starte kommandoen \\\"%1\\\"" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Nuværende sangs pladeomslag" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "Biblioteket %1 er ugyldigt" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "Værdi nummer to skal være større end værdi nummer et!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Siden du søgte efter findes ikke!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Siden du søgte efter er ikke et billede!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Prøveperioden for Subsonic-serveren er ovre. Doner venligst for at få en licens-nøgle. Besøg subsonic.org for flere detaljer." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Da du har opdateret Clementine til en nyere version, skal hele biblioteket genindlæses på grund af følgende nye funktioner:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Der er andre sange i dette album" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Der var et kommunikationsproblem med gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Kunne ikke hente metadata fra Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Der var et fortolkningsproblem med svaret fra iTunes Store" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Der var et problem ved at kopiere nogle sange. Følgende filer kunne ikke kopieres:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Der var et problem ved at kopiere nogle sange. Følgende filer kunne ikke kopieres:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Disse filer vil blive slettet fra disken, er du sikker på at du vil fortsætte?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Disse filer vil blive slettet permanent fra disken, er du sikker?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Disse mapper vil blive scannet for musik til at opbygge dit bibliotek" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Disse innstillinger bruges i \\\"Omkod musik\\\"-dialogvinduet, og når musikken omkodes før kopiering til en enhed." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Tredje niveau" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Denne handling vil oprette en database der kan blive optil 150 MB.\nVil du stadig fortsætte?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Dette album er ikke tilgængelig i det format du bad om" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Dette kan ændres senere via præferencerne" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Enheden må sluttes til og åbnes før Clementine kan se hvilke filformater den understøtter." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Enheden understøtter følgende filformater:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Enheden vil ikke fungere korrekt" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Dette er en MTP-enhed, men Clementine blev kompileret uden libmtp-understøttelse." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Dette er en iPod, men Clementine blev kompileret uden libgpod-understøttelse." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Det er første gang du tilslutter denne enhed. Clementine gennemsøger nu enheden for at finde musikfiler. Dette kan tage noget tid" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Denne stream er kun for betalende abonnenter" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Denne enhedstype (%1) er ikke understøttet." #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Titel" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Idag" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Slå pæn OSD til/fra" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Slå fuldskærmstilstand til/fra" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Slå køstatus til/fra" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Slå scrobbling til/fra" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Klik for at justere synlighed på OSD" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "I morgen" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "For mange omdirigeringer" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Bedste musiknumre" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Totalt antal albums:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Totalt antal bytes overført" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Totalt antal forespørgsler over nettet" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Spor" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Spor" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Omkod musik" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Omkoder-log" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Omkodning" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Omkoder %1 filer i %2 tråde" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Indstillinger for omkodning" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Slå fra" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL'er" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Ultra wide band (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Kunne ikke oprette forbindelse" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Kunne ikke downloade %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Ukendt" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Ukendt indholdstype" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Ukendt fejl" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Fravælg omslag" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Skip valgte spor" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Skip ikke spor" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Opsig abonnement" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Kommende Koncerter" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Opdater" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Ajourfør alle podcasts" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Opdater ændrede bibliotekskataloger" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Opdater biblioteket når Clementine starter" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Ajourfør denne podcast" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Ajourfører" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Ajourfører %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Opdaterer %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Opdaterer bibliotek" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Brug" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Brug Album Artist mærke, når det er muligt" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Brug Gnome genvejstaster" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Brug psykedeliske farver" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Brug Replay Gain-metadata hvis tilgængelig" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Brug SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Brug Wii Remote" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Brug et brugerdefineret farvesæt" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Brug en selvvalgt meddelelse til beskeder" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Brug en netværksfjernbetjening" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Brug godkendelse" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Brug kontrolleret bitrate" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Brug dynamisk tilstand" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Vis meddelelser om Wii Remote-status" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Brug midlertidig larm formning" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Brug systemstandarder" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Brug systemets standard farvesæt" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Brug standard proxy-indstillinger" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Brug volumen normalisering" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Brugt" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Brugergrænseflade" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Brugernavn" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Brug af menuen for at tilføje en sang vil ..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Variabel bitrate" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Diverse kunstnere" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Version %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Vis" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Visualiseringstilstand" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Visualiseringer" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Indstilling af visualiseringer" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Stemmeaktivitet opdaget" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Lydstyrke %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Væg" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Advar ved nedlukning af en spillelistes fane" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Hjemmeside" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Uger" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Når Clementine starter" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Når Clementine leder efter et albumcover, vil Clementine først leder efter billedfiler, der indeholder et af disse søgeord.\nHvis der ikke findes et match, vil det største billede i biblioteket blive brugt." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Når listen er tom ..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Hvor ikke prøve..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Wide band (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: aktiveret" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: tilsluttet" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: kritisk batteristatus (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: deaktiveret" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: frakoblet" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: lavt batteri-niveau (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Uden omslag" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Vil du også flytte de andre sange i dette album til Diverse kunstnere?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Vil du genindlæse hele biblioteket nu?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Skriv metadata" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Forkert brugernavn og/eller password." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "År" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "År - Album" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Årstal" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "I går" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Du er ved at downloade følgende albums" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Du er ikke logget ind." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Du er logget på som %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Du er logget ind." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Du kan ændre den måde sange bliver organiseret i biblioteket." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Du kan lytte gratis uden en konto, men Premium-medlemmer kan lytte til streams i højere kvalitet og uden reklamer." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Du kan gratis lytte til Magnatune sange uden en konto. Ved køb af medlemskab forsvinder meddelelserne ved slutningen af hvert spor." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Du kan lytte til baggrundsmusik streams på samme tid som anden musik." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Du kan bruge din Wii fjernbetjening som en fjernbetjening til Clementine. Se Clementine wiki siden for yderligere information.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Du har ikke en Spotify Premium konto" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Du har ikke et aktivt abonnement" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "Du behøver ikke at være logget på for at søge og til at lytte til musik på SoundCloud. Men du nødt til at logge på for at få adgang til dine spillelister og din stream." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Du er blevet logget ud fra Spotify, genindtast venligst dit kodeord i Indstillingsdialogen." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Du er blevet logget ud fra Spotify, genindtast venligst dit kodeord." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Du elsker dette musiknummer" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "For at skifte sprog, skal du genstarte Clementine" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Din IP adresse:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Dine Last.fm login-oplysninger var forkerte" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Dine Magnatune legitimationsoplysninger var forkerte" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Dit bibliotek er tomt!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Dine radiostreams" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Dine scrobbles: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Systemet mangler OpenGL-understøttelse, visualiseringer er utilgængelige." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Dit brugernavn eller kodeord var ukorrekt." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Nul" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "tilføj %n sange" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "efter" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "siden" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "og" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "automatisk" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "før" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "imellem" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "største først" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "indeholder" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "slået fra" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "disk %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "indeholder ikke" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "slutter med" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "lig" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "gpodder.net bibliotek" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "større end" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "i den sidste" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "mindre end" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "længste først" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "flyt %n sange" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "nyeste først" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "er ikke lig med" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "ikke i den sidste" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "ikke på" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "ældste først" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "på" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "indstillinger" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "eller skan QR koden!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "tast retur" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "fjern %n sange" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "korteste først" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "bland sange" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "mindste først" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "sorter sange" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "starter med" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "stop" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "spor %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/de.po000066400000000000000000005234041260417502300236370ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Andreas Demmelbauer, 2014 # Andreas Demmelbauer, 2014 # Ankorath , 2013 # Asfaloth , 2013-2014 # Ankorath , 2013 # Mariaki , 2013 # burtek , 2013 # burtek , 2013 # Christian Sturm , 2011-2012 # Claudius Henrichs , 2011 # daschuer , 2012 # daschuer , 2012 # Eduard Braun , 2015 # El_Zorro_Loco , 2011-2012 # Ettore Atalan , 2014-2015 # FIRST AUTHOR , 2010 # geroldmittelstaedt , 2012 # geroldmittelstaedt , 2012 # Gregor S. , 2012 # Gregor S. , 2012 # janlaymann , 2012 # janlaymann , 2012 # jonas.mue , 2013 # jonas.mue , 2013 # Konrad , 2015 # Lenzitsch , 2013 # Lenzitsch , 2012 # Lenzitsch , 2012-2013 # Leon Scheid , 2015 # Mariaki , 2013 # Martin Brodbeck , 2013 # Martin Herkt , 2011 # Martin Herkt , 2010 # Mohamed Sakhri , 2013 # Mosley , 2011 # Paul E. <>, 2012 # Peter B. , 2014-2015 # Phillip Schichtel, 2013 # Phillip Schichtel, 2013 # robfloop , 2012 # robfloop , 2012 # Robin Cornelio Thomas , 2012 # Mosley , 2011 # El_Zorro_Loco , 2011, 2012 # Tobias Bannert , 2013 # Tobias Bannert , 2013-2015 # Vulgrim , 2013 # Wasilis Mandratzis , 2013 # Wasilis Mandratzis , 2013 # Wasilis , 2013 # Wilhelm Einstein <>, 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: German (http://www.transifex.com/davidsansome/clementine/language/de/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nSie können Wiedergabelisten zu ihren Favoriten hinzufügen, indem sie den Stern neben dem Namen der Wiedergabeliste anklicken\n\nFavorisierte Wiedergabelisten werden hier gespeichert" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " Tagen" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "kBit/s" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr " s" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " Sekunden" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "Titel" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 Titel)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 Alben" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 Tage" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "vor %1 Tagen" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 an %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 Wiedergabelisten (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 ausgewählt von" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 Titel" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 Titel" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 Titel gefunden" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 Titel gefunden (%2 werden angezeigt)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 Titel" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 übertragen" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev-Modul" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 andere Hörer" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "Insgesamt %L1 mal abgespielt" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n fehlgeschlagen" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n abgeschlossen" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n verbleibend" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Text ausrichten" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Zentriert" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Benutzerdefiniert" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "&Extras" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Hilfe" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "%1 &ausblenden" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Ausblenden …" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Links" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "&Musik" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Keine" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "&Wiedergabeliste" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Beenden" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "&Wiederholung" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Rechts" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "&Zufallsmodus" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Spalten an Fenstergröße anpassen" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "Werk&zeuge" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(unterschiedlich für mehrere Titel)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", von " #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "… und alle Amarok-Mitwirkenden" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 Tag" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 Titel" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192.000 Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44.100 Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48.000 Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 zufällige Titel" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96.000 Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Auf Premium erweitern" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Deaktiviert: Clementine wird versuchen, Bewertungen und andere Statistiken in einer separaten Datenbank zu speichern, ohne Ihre Dateien zu verändern.

Aktiviert: Statistiken werden bei jeder Änderung sowohl in einer Datenbank als auch direkt in der betreffenden Datei gespeichert.

Bitte beachten Sie, dass dies unter Umständen nicht mit jedem Format klappt; da es keinen Standard gibt, ist es möglich, dass ein anderer Musikspieler die Daten nicht lesen kann.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Ein Wort mit einem Feldnamen voranstellen, um die Suche auf dieses Feld zu beschränken, z.B. Interpret:Keks durchsucht die Bibliothek nach allen Interpreten, die das Wort Keks enthalten

Verfügbare Felder: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Das wird Bewertungen und Statistiken aller Titel ihrer Bibliothek in die Tags der Titeldateien schreiben.

Das ist nicht nötig, wenn die Option "Speichere alle Bewertungen und Statistiken in Titel-Tags" immer aktiviert war.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Schlüsselwörter beginnen mit %, zum Beispiel: %artist %album %title

\n\n

Steht ein Textbereich in geschweiften Klammern, wird dieser nicht angezeigt, falls das Schlüsselwort leer ist.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Ein Spotify-Premium-Konto ist erforderlich." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Ein Programm kann sich nur verbinden, falls der korrekte Code eingegeben wurde." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Eine intelligente Wiedergabeliste ist eine Liste von Titeln, die aus Ihrer Bibliothek stammen. Es gibt mehrere Arten von intelligenten Wiedergabelisten, die unterschiedliche Möglichkeiten bieten, eine Auswahl von Titeln zu treffen." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Ein Titel wird in die Wiedergabeliste aufgenommen, wenn er die folgenden Bedingungen erfüllt." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ALL GLORY TO THE HYPNOTOAD" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Abbrechen" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Über %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Über Clementine …" #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Über Qt …" #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Absolut" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Benutzerkonto" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Kontodetails (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Aktion" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Aktion" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Wii-Fernbedienung aktivieren/deaktivieren" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Aktivitätenstrom" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Podcast hinzufügen" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Datenstrom hinzufügen" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Zeilenumbruch (falls von der gewählten Art der Benachrichtigung unterstützt)" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Aktion hinzufügen" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Alle Titel aus einem Verzeichnis, inklusive Unterverzeichnisse, hinzufügen" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Einen weiteren Datenstrom hinzufügen …" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Verzeichnis hinzufügen …" #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Datei hinzufügen" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Datei zum Umwandler hinzufügen" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Datei(en) zum Umwandler hinzufügen" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Datei hinzufügen …" #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Dateien zum Umwandeln hinzufügen" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Ordner hinzufügen" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Ordner hinzufügen …" #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Neuen Ordner hinzufügen …" #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Podcast hinzufügen" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "&Podcast hinzufügen …" #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Suchbegriff hinzufügen" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Album des aktuellen Titels" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Albuminterpret des aktuellen Titels" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Interpret des aktuellen Titels" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Automatische Titelbewertung hinzufügen" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Titelkomponist hinzufügen" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Titelmedium hinzufügen" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Titeldateiname hinzufügen" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Titelgenre hinzufügen" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Titelgruppierung hinzufügen" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Titellänge hinzufügen" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Titelbesetzung hinzufügen" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Titelwiedergabezähler hinzufügen" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "TItelbewertung hinzufügen" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Titelübersprungzähler hinzufügen" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Titelname hinzufügen" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Titel zum Zwischenspeicher hinzufügen" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Titelnummer hinzufügen" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Titelerscheinungsjahr hinzufügen" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Titel zu »Meine Musik« hinzufügen, wenn »Lieben« geklickt wurde" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Datenstrom hinzufügen …" #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Zu »Meine Musik« hinzufügen" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Zur Spotify-Wiedergabeliste hinzufügen" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Markierte Titel von Spotify hinzufügen" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Zu anderer Wiedergabeliste hinzufügen" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Zu Lesezeichen hinzufügen" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Zur Wiedergabeliste hinzufügen" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "In die Warteschlange einreihen" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Nutzer/Gruppe zu Lesezeichen hinzufügen" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Aktion für Wii-Fernbedienung hinzufügen" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Hinzufügen …" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Diesen Monat hinzugefügt" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Diese Woche hinzugefügt" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Dieses Jahr hinzugefügt" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Heute hinzugefügt" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "In den letzten drei Monaten hinzugefügt" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Erweiterte Gruppierung …" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Nach " #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Nach dem Kopieren …" #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Album (idealer Pegel für alle Titel)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Album-Interpret" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Titelbild" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Albuminformationen auf jamendo.com …" #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Alben" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Alben mit Titelbildern" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Alben ohne Titelbilder" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Alle" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Alle Dateien (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "Aller Ruhm der Hypnosekröte!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Alle Alben" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Alle Interpreten" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Alle Dateien (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Alle Wiedergabelisten (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Alle Übersetzer" #: library/library.cpp:98 msgid "All tracks" msgstr "Alle Titel" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Programmen erlauben, Musik von diesem Rechner herunterzuladen." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Herunterladen erlauben" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Kodierung der Mitten/Seiten zulassen" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Neben den ursprünglichen Dateien" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Clementine immer verstecken" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Clementine immer anzeigen" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Immer mit der Wiedergabe beginnen" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon Cloud Drive" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Eine zusätzlich Erweiterung wird benötigt, um Spotify in Clementine zu benutzen. Möchten Sie es jetzt herunterladen und installieren?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Beim Laden der iTunes-Datenbank ist ein Fehler aufgetreten" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Beim Schreiben der Metadaten für '%1' trat ein Fehler auf" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Ein unspezifizierter Fehler ist aufgetreten." #: ui/about.cpp:85 msgid "And:" msgstr "Und:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Wütend" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Erscheinungsbild" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Dateien/Adressen an die Wiedergabeliste anhängen" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Zur aktuellen Wiedergabeliste hinzufügen" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Zur Wiedergabeliste hinzufügen" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Komprimieren um Übersteuerung zu vermeiden" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Sind Sie sicher, dass Sie die Voreinstellung »%1« wirklich löschen wollen?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Wollen Sie die Statistiken dieses Titels wirklich zurücksetzen?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Sind Sie sicher, dass Sie für alle Titel Ihrer Bibliothek, die Titelstatistiken in die Titeldatei schreiben wollen?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Interpret" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Künstlerinfo" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Stichworte zum Interpreten" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Initialen des Interpreten" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Beim Speichern nachfragen" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Tonformat" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Tonausgang" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Legitimierung fehlgeschlagen" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Autor" #: ui/about.cpp:68 msgid "Authors" msgstr "Autoren" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Automatisch" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Automatisch" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Automatisches Aktualisieren" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Im Bibliotheksbaum automatisch Einzelkategorien öffnen" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Verfügbar" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Durchschnittliche Bitrate" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Durchschnittliche Bildgröße" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "BBC Podcasts" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Hintergrunddatenströme" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Hintergrundfarbe:" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Hintergrundbild" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Deckkraft:" #: core/database.cpp:648 msgid "Backing up database" msgstr "Die Datenbank wird gesuchert" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Balance" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "Sperren (Last.fm Scrobbeln)" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Balken" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Standardblau" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Normaler Tontyp:" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Verhalten" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Optimal" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Biografie von %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Bitrate" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Bitrate" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Bitrate" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Blöcke" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Blocktyp" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Unschärfe" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Textkörper:" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Boom" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Durchsuchen …" #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Pufferdauer" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Puffern" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Seafile-Index wird erstellt …" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Aber diese Quellen sind deaktiviert" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Tasten" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Unterstützung von Cuesheets" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Zwischenspeicherpfad:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Zwischenspeichern" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "%1 wird zwischengespeichert" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Abbrechen" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Herunterladen abbrechen" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Anmeldung nur mit Captcha möglich.\nBitte melden Sie sich mit Ihrem Browser auf Vk.com an, um das Problem zu beheben." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Titelbilder ändern" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Schriftgröße ändern …" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Wiederholungsmodus ändern" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Tastenkürzel ändern …" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Zufallsmodus ändern" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "Den aktuell spielenden Titel ändern" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Sprache ändern" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "Änderungen werden beim Abspielen des nächsten Liedes wirksam" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Die Monowiedergabeeinstellung wird für den nächsten Titel wirksam." #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Nach neuen Episoden suchen" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Auf Aktualisierungen suchen" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Nach Aktualisierungen suchen …" #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Zwischenspeicherverzeichnis für Vk.com auswählen" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Wählen Sie einen Namen für Ihre intelligente Wiedergabeliste" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Automatisch auswählen" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Farbe wählen …" #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Schriftart wählen …" #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Von der Liste wählen" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Wählen Sie, wie die Wiedergabeliste sortiert wird und wie viele Titel sie enthalten soll." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Herunterladeverzeichnis für Podcasts auswählen" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Wählen Sie die Internetdienste aus, die Sie anzeigen möchten." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Internetseiten welche Clementine zur Liedtextsuche verwenden soll:" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Klassisch" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Bereinigen" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Leeren" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Wiedergabeliste leeren" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Clementine-Fehler" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Clementineorange" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Clementine-Visualisierung" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine kann die Musik, die Sie auf dieses Gerät kopieren, automatisch in ein Format umwandeln, welches das Gerät wiedergeben kann." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Clementine kann Musik, die Sie auf Amazon Cloud Drive hochgeladen haben, wiedergeben" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine kann Musik, die Sie auf Box hochgeladen haben, wiedergeben." #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine kann Musik, die Sie auf Dropbox hochgeladen haben, wiedergeben." #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine kann Musik, die Sie auf Google Drive hochgeladen haben, wiedergeben." #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine kann Musik, die Sie zu OneDrive hochgeladen haben, wiedergeben" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine kann Benachrichtigungen beim Titelwechsel anzeigen" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine kann die Liste Ihrer Abonnements mit Ihren anderen Rechnern und Podcast-Anwendungen abgleichen. Ein Konto erstellen." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine konnte keine projectM-Visualisierungen laden. Überprüfen Sie Ihre Installation." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Clementine-Bildbetrachter" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine konnte keine Ergebnisse für diese Datei finden." #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine wird Musik finden in:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Hier klicken, um Musik hinzuzufügen" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Hier klicken, um diese Wiedergabeliste zu speichern und sie dadurch in den »Wiedergabelisten« auf der linken Seitenleiste zugänglich zu machen" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Klicken Sie um zwischen verbleibender und Gesamtzeit zu wechseln" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Durch Klicken auf den Knopf wird ein Internet-Browser geöffnet. Bitte nach dem Anmelden zu Clementine zurückkehren." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Schließen" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Wiedergabeliste schließen" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Visualisierung schließen" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Das Schließen des Fensters bricht das Herunterladen ab." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Das Schließen dieses Fensters bricht das Suchen nach Titelbildern ab." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Farben" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Komma getrennte Liste mit »class:level«, Level zwischen 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Kommentar" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Gemeinschaftsradio" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Tags automatisch vervollständigen" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Schlagworte automatisch vervollständigen …" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Komponist" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "%1 konfigurieren …" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Magnatune einrichten …" #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Tastenkürzel einrichten" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Spotify konfigurieren …" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Subsonic wird konfiguriert …" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Vk.com konfigurieren …" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Globale Suche konfigurieren …" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Bibliothek einrichten …" #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Podcasts einrichten …" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Einrichten …" #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Wii-Fernbedienungen mittels Aktivieren/deaktivieren-Aktion verbinden" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Gerät verbinden" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Verbindung mit Spotify wird aufgebaut" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Verbindung vom Server verweigert, bitte Server-Adresse überprüfen. Beispiel: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Zeitüberschreitung, bitte überprüfen Sie die Server-Adresse. Beispiel: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Verbindungsproblem, oder der Ton wurde vom Besitzer deaktiviert" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Konsole" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Konstante Bitrate" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Gesamte Musik umwandeln" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Musik umwandeln, die das Gerät nicht wiedergeben kann" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Tondateien verlustfrei umrechnen, bevor sie zur Fernsteuerung gesendet werden." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Verlustfreie Dateien umwandeln" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Adresse zum freigeben in Zwischenablage kopieren" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Kopieren" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Auf das Gerät kopieren …" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Zur Bibliothek kopieren …" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Urheberrecht" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Mit Subsonic konnte nicht verbunden werden, bitte Server-Adresse überprüfen. Beispiel: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "GStreamer-Element »%1« konnte nicht erstellt werden. Stellen Sie sicher, dass alle nötigen GStreamer-Erweiterungen installiert sind." #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Wiedergabeliste konnte nicht erstellt werden" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Es konnte kein Multiplexer für %1 gefunden werden. Prüfen Sie ob die erforderlichen GStreamer-Erweiterungen installiert sind." #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Es konnte kein Kodierer für %1 gefunden werden. Prüfen Sie, ob die erforderlichen GStreamer-Erweiterungen installiert sind." #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Ausgabedatei %1 konnte nicht geöffnet werden" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Titelbildverwaltung" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Titelbild aus eingebettetem Bild" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Automatsch geladenes Titelbild von %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Titelbild manuell entfernt" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Titelbild nicht ausgewählt" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Das Titelbild wurde von %1 eingestellt" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Titelbild von %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Überblenden bei automatischem Titelwechsel" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Überblenden bei manuellem Titelwechsel" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Strg+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Strg+Unten" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Strg+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Strg+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Strg+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Strg+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Strg+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Strg+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Strg+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Strg+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Strg+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Strg+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Strg+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Strg+Umschalt+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Strg+Umschalt+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Strg+Umschalt+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Strg+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Strg+Oben" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Benutzerdefiniert" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Benutzerdefiniertes Bild:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Benutzerdefinierte Benachrichtigungseinstellungen" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Eigene …" #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "DBus Pfad" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dance" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Ihre Datenbank ist beschädigt. Bitte besuchen Sie https://code.google.com/p/clementine-player/wiki/DatabaseCorruption um zu erfahren, wie Sie Ihre Datenbank wiederherstellen können." #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Erstellt" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Geändert" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Tage" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "&Vorgabe" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Lautstärke um 4% verringern" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Lautstärke um Prozent verringern" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Lautstärke verringern" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Standard Hintergrundbild" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Standardgerät an %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Standard" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Verzögerung zwischen Visualisierungen" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Löschen" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Heruntergeladene Dateien löschen" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Dateien löschen" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Vom Gerät löschen …" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Vom Datenträger löschen …" #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Gehörte Episoden löschen" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Voreinstellung löschen" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Lösche intelligente Wiedergabeliste" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Ursprüngliche Dateien löschen" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Dateien werden gelöscht" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Titel aus der Warteschlange nehmen" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Titel aus der Warteschlange nehmen" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Ziel:" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Details …" #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Gerät" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Geräteeinstellungen" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Gerätename" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Geräteeinstellungen …" #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Geräte" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Dialog" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Meinten Sie" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Passwort:" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Benutzername:" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Direkte Verbindung zum Internet" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Verzeichnis" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Permanente Anzeige" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Erzeugung des Stimmungsbarometers deaktivieren" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Deaktiviert" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Deaktiviert" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "CD-Nr." #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Unterbrochene Übertragung" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Anzeigeoptionen" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Bildschirmanzeige anzeigen" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Bibliothek erneut einlesen" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Ein erneutes vollständiges einlesen durchführen" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Ein erneutes vollständiges einlesen durchführen …" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Nichts umwandeln" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Nicht überschreiben" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "Das durchführen eines vollständigen Neueinlesens führt zum Verlust aller gespeicherten Metadaten in Clementine, wie den Titelbildern, Abspielzählungen und Bewertungen. Clementine wird einen erneutes einlesen Ihrer Musik in Google-Drive durchführen, was etwas Zeit in Anspruch nehmen wird." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Wiederholung aus" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Nicht unter »Verschiedene Interpreten« anzeigen" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Gelistete Episoden nicht anzeigen" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Zufallsmodus aus" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Nicht anhalten!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Spende" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Zum Öffnen doppelklicken" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "Doppelt auf einen Titel in der Wiedergabeliste klicken wird …" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Beim Doppelklick auf einen Titel diesen …" #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "%n Episoden herunterladen" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Herunterladezerzeichnis" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Episoden herunterladen nach" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Herunterlademitgliedschaft" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Neue Episoden automatisch herunterladen" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Herunterladewarteschlange" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Herunterladeeinstellungen" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Android-App herunterladen" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Dieses Album herunterladen" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Album herunterladen …" #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Diese Episode herunterladen" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Herunterladen …" #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "(%1%) herunterladen …" #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Icecast-Verzeichnis herunterladen" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Jamendo-Katalog wird heruntergeladen" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Magnatune-Katalog wird heruntergeladen" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Spotify-Erweiterung wird heruntergeladen" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Metadaten werden heruntergeladen" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Klicken und ziehen um die Position zu ändern" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dubstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Dauer" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Dynamischer Modus ist an" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Dynamischer Zufallsmix" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Intelligente Wiedergabeliste bearbeiten …" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Schlagwort »%1« bearbeiten …" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Schlagwort bearbeiten …" #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Schlagworte bearbeiten" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Metadaten bearbeiten" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Metadaten bearbeiten …" #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Metadaten bearbeiten …" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Bearbeiten …" #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "E-Mail" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Unterstützung für Wii-Fernbedienungen aktivieren" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Automatisches Zwischenspeichern aktivieren" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Equalizer aktivieren" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Tastenkürzel nur aktivieren, wenn Clementine fokussiert ist" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Direktausgabe der Titelmetadaten mit Klick aktivieren" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Die unten stehenden Quellen aktivieren, um sie in den Suchergebnissen anzuzeigen. Ergebnisse werden in dieser Reihenfolge angezeigt." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Last.fm Scrobbling aktivieren/deaktivieren" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Kodierungkomplexität" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Kodierungsqualität" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Kodierungsmodus" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Adresse eingeben" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Geben Sie eine Adresse ein, um das Titelbild aus dem Internet herunterzuladen" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Dateiname für exportierte Titelbilder eingeben (ohne Dateierweiterung):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Neuer Name für diese Wiedergabeliste" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Geben Sie Suchbegriffe ein um Musik auf Ihrem Rechner und im Internet zu finden" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Geben Sie Suchbegriffe unten ein um Podcasts auf iTunes zu finden" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Geben Sie Suchbegriffe unten ein um Podcasts auf gpodder.net zu finden" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Sammlung durchsuchen" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Die Adresse eines Internetradios eingeben:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Geben Sie den Namen des Ordners ein" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Diese IP in der App eingeben, um mit Clementine zu verbinden." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Gesamte Sammlung" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Equalizer" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Äquivalent zu --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Äquivalent zu --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Fehler" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Fehler beim Auslesen der CD" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Fehler beim Verbinden zum MTP-Gerät" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Fehler beim Kopieren der Titel" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Fehler beim Löschen der Titel" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Fehler beim herunterladen der Spotify-Erweiterung" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Fehler beim Laden von %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Fehler beim Laden der di.fm-Wiedergabeliste" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Fehler bei %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Fehler beim Laden der Audio-CD" #: library/library.cpp:68 msgid "Ever played" msgstr "Irgendwann gespielt" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Alle 10 Minuten" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Alle 12 Stunden" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Alle 2 Stunden" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Alle 20 Minuten" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Alle 30 Minuten" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Alle 6 Stunden" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Stündlich" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Außer für Titel des gleichen Albums oder des gleichen Cuesheets." #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Existierende Titelbilder" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Erweitern" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Läuft aus am %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Titelbilder exportieren" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Titelbilder exportieren" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Heruntergeladene Titelbilder exportieren" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Eingebettete Titelbilder exportieren" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Export beendet" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "%1 von %2 Titelbildern exportiert (%3 übersprungen)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Ausblenden bei Pause / Einblenden beim Fortsetzen" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Ausblenden, wenn ein Titel angehalten wird" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Überblenden" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Dauer:" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "CD-Laufwerk kann nicht gelesen werden" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Das Abrufen des Verzeichnisses ist fehlgeschlagen" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Das Abrufen der Podcasts ist fehlgeschlagen" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Laden der Podcasts fehlgeschlagen" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Auslesen des XML für diesen RSS-Feed fehlgeschlagen" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Schnell" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Lieblingstitel" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Fehlende Titelbilder abrufen" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Automatisch abrufen" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Abrufen abgeschlossen" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Subsonic-Bibliothek wird abgerufen" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Abrufen des Titelbildes ist fehlgeschlagen" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Dateiformat" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Dateiendung" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Dateiformate" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Dateiname" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Dateiname (ohne Dateipfad)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Dateinamenmuster:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Dateipfade" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Dateigröße" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Dateityp" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Dateiname" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Dateien" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Dateien zum Umwandeln" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Titel in Ihrer Bibliothek finden, die den Kriterien entsprechen." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Diesen Interpret finden" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Titel wird analysiert" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Beenden" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Erste Stufe" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Titelbild an Breite anpassen" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "FLAC" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Schriftgröße" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Aus lizenzrechtlichen Gründen ist die Spotify-Unterstützung in einer separaten Erweiterung enthalten." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Monokodierung erzwingen" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Gerät vergessen" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Das Vergessen eines Geräts wird es aus dieser Liste entfernen und Clementine wird beim nächsten Verbinden alle Titel erneut erfassen müssen." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Formular" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Format" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Bildwiederholrate" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Frames pro Puffer" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Eingefroren" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Maximale Tiefen" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Maximale Tiefen und Höhen" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Maximale Höhen" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Allgemein" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Allgemeine Einstellungen" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Genre" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Eine Adresse erhalten, um diesen Spotify-Titel zu teilen" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Eine Adresse erhalten, um diese Wiedergabeliste zu teilen" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Kanäle laden" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Datenströme laden" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Namen angeben:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Start" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Zum nächsten Wiedergabelistenreiter wechseln" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Zum vorherigen Wiedergabelistenreiter wechseln" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "%1 Titelbilder von %2 wurden gefunden (%3 fehlgeschlagen)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Nicht vorhandene Titel in meinen Wiedergabelisten ausgrauen" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Bibliothek gruppieren nach …" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Gruppieren nach" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Album" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Nach Interpreten Sortieren" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Interpret/Album" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Interpret/Jahr" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Genre/Album" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Genre/Interpret/Album" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Gruppierung" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "Die angegebene HTML-Seite enthält keine RSS-Feeds" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "HTTP 3xx Statuscode ohne Adresse erhalten, bitte überprüfen Sie die Server-Einstellungen." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "HTTP Proxy" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Fröhlich" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Hardwareinformationen" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Die Hardwareinformationen sind nur verfügbar, solange das Gerät angeschlossen ist." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Hoch" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Hoch (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Hoch (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "Hip-Hop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Host nicht gefunden, überprüfen Sie bitte die Server-Adresse. Beispiel: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Stunden" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnosekröte" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Ich habe kein Magnatune-Konto" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Symbol" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Icons oben" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Titel werden erkannt" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Wenn aktiviert, können Sie mit einem Klick auf einen Titel in der Wiedergabeliste, die Schlagwortwerte direkt bearbeiten" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Wenn Sie fortfahren, wird das Gerät langsam arbeiten und kopierte Titel könnten nicht abspielbar sein." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Wenn Sie die Adresse eines Podcasts kennen, geben Sie sie unten ein und drücken Sie Start." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "»The« in den Künstlernamen ignorieren" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Bilder (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Bilder (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Importieren …" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "In %1 Tagen" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "In %1 Wochen" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "Im dynamischen Modus werden neue Titel automatisch ausgewählt und an die Wiedergabeliste angehängt, sobald ein Titel zu Ende ist." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Posteingang" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Titelbild in der Benachrichtigung anzeigen" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Alle Titel einbeziehen" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Inkompatible »Subsonic REST protocol version«. Das Programm braucht eine Aktualisierung." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Inkompatible »Subsonic REST protocol version«. Der Server braucht eine Aktualisierung." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Unvollständige Konfiguration stellen Sie bitte sicher, dass alle Felder ausgefüllt sind." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Lautstärke um 4% erhöhen" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Lautstärke um Prozent erhöhen" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Lautstärke erhöhen" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Indizierung %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Information" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Eingabeoptionen" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Einfügen …" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Installiert" #: core/database.cpp:585 msgid "Integrity check" msgstr "Integritätsprüfung" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Internetdienstanbieter" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Internetdienste" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "Einleitungstitel" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Ungültiger API-Schlüssel" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Ungültiges Format" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Ungültige Methode" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Ungültige Parameter" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Ungültige Quelle angegeben" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Ungültiger Dienst" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Ungültiger Sitzungsschlüssel" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Auswahl umkehren" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Jamendos beliebteste Titel" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Jamendos Top-Titel" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendos Top-Titel des Monats" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendos Top-Titel der Woche" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Jamendo-Datenbank" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Gleich zum vorherigen Titel springen" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Zum aktuellen Titel springen" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Knöpfe für %1 Sekunde halten …" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Knöpfe für %1 Sekunden halten …" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Im Hintergrund weiterlaufen, wenn das Fenster geschlossen wurde" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Ursprüngliche Dateien behalten" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Kätzchen" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Sprache" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Laptop/Kopfhörer" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Großer Raum" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Großes Titelbild" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Große Titelbilder (Details unten)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Große Titelbilder (ohne Details)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Große Seitenleiste" #: library/library.cpp:80 msgid "Last played" msgstr "Zuletzt gespielt" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Zuletzt wiedergegeben" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm ist zurzeit überlastet. Versuchen Sie es später noch einmal." #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Passwort:" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Last.fm-Wiedergabezähler" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Last.fm-Schlagworte" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Benutzername:" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Last.fm Wiki" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Am wenigsten gemochte Titel" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Links" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Länge" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Bibliothek" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Benutzerdefinierte Gruppierung der Bibliothek" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Hinweis beim erneuten durchsuchen der Bibliothek" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Bibliothek durchsuchen" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Begrenzungen" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Laden" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Titelbild von Adresse laden" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Titelbild von Adresse laden …" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Titelbild aus Datei laden" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Titelbild von Datenträger wählen …" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Wiedergabeliste laden" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Wiedergabeliste laden …" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Lade MTP-Gerät" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "iPod-Datenbank laden" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Intelligente Wiedergabeliste wird geladen" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Titel werden geladen" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Datenstrom wird geladen" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Lade Titel" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Lade Titelinfo" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Wird geladen …" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Dateien/Adressen laden und die Wiedergabeliste ersetzen" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Anmelden" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Anmeldung fehlgeschlagen" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Abmelden" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Langzeitvorhersageprofil (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Lieben" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "Lieben (Last.fm Scrobbeln)" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Niedrig (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Niedrig (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Geringes Komplexitätsprofil (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Liedtext" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Liedtext von %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Liedtext vom ID3v2-Schlagwort" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Magantune-Herunterladen" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Magnatune-Herunterladen beendet" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Hauptprofil (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Machen Sie es so!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Machen Sie es so!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Wiedergabeliste für die Offlinebenutzung verfügbar machen" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Ungültige Antwort" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Manuelle Vermittlungsserverkonfiguration" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Manuell" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Hersteller" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Als gehört markieren" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Als ungehört markieren" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Alle Suchbegriffe kommen vor (UND)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Mindestens ein Suchbegriff kommt vor (ODER)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Maximale globale Suchergebnisse" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Maximale Bitrate" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Medium wurde gewechselt. Es wird neu geladen." #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Mittel (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Mittel (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Art der Mitgliedschaft:" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Minimale Bitrate" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Mindestpufferfüllung" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "projectM-Voreinstellungen fehlen" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Modell" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Bibliothek auf Änderungen überwachen" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Monowiedergabe" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Monate" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Stimmung" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Stimmungsbarometerstil" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Stimmungsbarometer" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Mehr" #: library/library.cpp:84 msgid "Most played" msgstr "Meistgespielt" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Einhängepunkt" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Einhängepunkte" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Nach unten" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Zur Bibliothek verschieben …" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Nach oben" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Musik" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Musikbibliothek" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Stumm" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Meine Alben" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Meine Musik" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Meine Empfehlungen" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Name" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Name" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Benennungsoptionen" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Schmal-Band (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Netzwerkvermittlung" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Netzwerkfernsteuerung" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Niemals" #: library/library.cpp:74 msgid "Never played" msgstr "Nie gespielt" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Nie mit der Wiedergabe beginnen" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Neuer Ordner" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Neue Wiedergabeliste" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Neue intelligente Wiedergabeliste …" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Neue Titel" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Neue Musiktitel werden automatisch hinzugefügt." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Neueste Titel" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Weiter" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Nächstes Titel" #: core/utilities.cpp:151 msgid "Next week" msgstr "Nächste Woche" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Keine Visualisierung" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Kein Hintergrundbild" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Keine Titelbilder zum Exportieren." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Keine langen Blöcke" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Keine Treffer. Leeren Sie das Suchfeld, um wieder die gesamte Wiedergabeliste anzuzeigen." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Keine kurzen Blöcke" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Nichts" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Keiner der gewählten Titel war zum Kopieren auf ein Gerät geeignet." #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Standard" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Normaler Blocktyp" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Nicht verfügbar während eine dynamische Wiedergabeliste benutzt wird" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Nicht verbunden" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Nicht genug Inhalt" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Nicht genug Fans" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Nicht genug Mitglieder" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Nicht genug Nachbarn" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Nicht installiert" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Nicht angemeldet" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Nicht eingehängt – doppelklicken zum Einhängen" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Nichts gefunden" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Art der Benachrichtigung" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Benachrichtigungen" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Aktueller Musiktitel" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Anzahl an anzuzeigenden Episoden" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Vorschau der Bildschirmanzeige" #: widgets/osd.cpp:173 msgid "Off" msgstr "Aus" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "An" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Verbindungen, nur von Programmen, aus folgenden IP-Bereichen akzeptieren:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Nur Verbindungen aus dem lokalen Netzwerk" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Nur die ersten" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Deckkraft" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "%1 im Browser öffnen" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "&Audio-CD öffnen …" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "OPML-Datei öffnen" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "OPML-Datei öffnen …" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Verzeichnis öffnen, um Musik von dort zu importieren" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Gerät öffnen" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "&Datei öffnen …" #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "In Google Drive öffnen" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "In einer neuen Wiedergabeliste öffnen" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "In neuen Wiedergabeliste öffnen" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Im Browser öffnen" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Öffnen …" #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Aktion fehlgeschlagen" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Auf Bitrate optimieren" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Auf Qualität optimieren" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Optionen …" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Dateien organisieren" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Dateien organisieren …" #: core/organise.cpp:73 msgid "Organising files" msgstr "Dateien organisieren" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Ursprüngliche Schlagworte" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "Ursprüngliches Jahr" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "Ursprüngliches Jahr - Album" #: library/library.cpp:118 msgid "Original year tag support" msgstr "Ursprüngliches Jahr - Schlagwortunterstützung" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Weitere Optionen" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Ausgabe" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Ausgabegerät" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Ausgabeoptionen" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Alles überschreiben" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Bestehende Dateien überschreiben" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Nur kleinere überschrieben" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Besitzer" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Jamendo-Katalog wird eingelesen" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Party" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Passwort:" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Pause" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Wiedergabe pausieren" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Pausiert" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Besetzung" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Pixel" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Einfache Seitenleiste" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Wiedergabe" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Wiedergabezähler" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Wiedergeben wenn angehalten, pausieren bei Wiedergabe" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Mit der Wiedergabe beginnen, falls gerade nichts anderes abgespielt wird" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Spiele Titel Nummer der Wiedergabeliste" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Wiedergabe/Pause" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Wiedergabe" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Spielereinstellungen" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Wiedergabeliste" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Wiedergabeliste beendet" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Wiedergabeliste einrichten" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Art der Wiedergabeliste" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Wiedergabelisten" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Bitte Browser schließen und zu Clementine zurückkehren" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Erweiterungsstatus:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcasts" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Anzeigedauer" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Anschluss (Port)" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Vorverstärkung:" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Einstellung" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Einstellungen" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Einstellungen …" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Bevorzugte Dateinamen für Titelbilder (durch Komma getrennt):" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Bevorzugtes Tonformat:" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Bevorzugte Bitrate:" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Bevorzugtes Format" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Premium Tontyp:" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Voreinstellung:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Drücken Sie eine Knopfkombination für" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Taste drücken" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Eine Tastenkombination für %1 drücken …" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Im Spieler auf »Vorheriger« drücken, wird …" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Einstellungen für die Clementine-Bildschirmanzeige" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Vorschau" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Vorheriger" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Vorherigen Titel" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Versionsinformationen anzeigen" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Fortschritt" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Fortschritt" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psychedelisch" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Taste auf Wii-Fernbedienung drücken" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Zufällige Titelreihenfolge" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Qualität" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Qualität" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Gerät wird abgefragt …" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Warteschlangenverwaltung" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Titel in die Warteschlange einreihen" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Titel in die Warteschlange einreihen" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (gleicher Pegel für alle Titel)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Regen" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Regen" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Zufällige Visualisierung" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Den aktuellen Titel mit 0 Sternen bewerten" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Den aktuellen Titel mit 1 Stern bewerten" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Den aktuellen Titel mit 2 Sternen bewerten" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Den aktuellen Titel mit 3 Sternen bewerten" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Den aktuellen Titel mit 4 Sternen bewerten" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Den aktuellen Titel mit 5 Sternen bewerten" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Bewertung" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Wirklich abbrechen?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Die Umleitungsbegrenzung wurde überschritten, bitte überprüfen Sie die Servereinstellungen" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Katalog neu laden" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Kanäle aktualisieren" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Senderliste aktualisieren" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Datenströme auffrischen" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Relativ" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Bewegung der Wii-Fernbedienung merken" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Clementine so starten, wie es beendet wurde" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Meine Auswahl merken" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Entfernen" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Aktion entfernen" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Doppelte aus der Wiedergabeliste entfernen" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Ordner entfernen" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Aus »Meine Musik« entfernen" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Aus den Lesezeichen entfernen" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Aus der Wiedergabeliste entfernen" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Wiedergabeliste entfernen" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Wiedergabeliste entfernen" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Nicht verfügbare Titel von der Wiedergabeliste entfernen" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Wiedergabeliste umbenennen" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Wiedergabeliste umbenennen …" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Musiktitel in dieser Reihenfolge neu nummerieren …" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Wiederholung" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Album wiederholen" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Wiedergabeliste wiederholen" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Titel wiederholen" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Wiedergabeliste ersetzen" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Die Wiedergabeliste ersetzen lassen" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Leerzeichen mit Unterstrichen ersetzen" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Wiederholungsverstärker" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Wiederholungsverstärkermodus" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Neu bestücken" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Legitimierungscode erzwingen" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Zurücksetzen" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Wiedergabezähler zurücksetzen" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Titel neu starten, dann zum vorherigen Titel springen, wenn nochmal gedrückt" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Starten Sie den Titel oder den vorherigen Titel, wenn sie innerhalb von 8 Sekunden nach Beginn." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Nur ASCII-Zeichen benutzen" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Wiedergabe beim Start fortsetzten" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Zu Clementine zurückkehren" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Rechts" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Auslesen" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "CD auslesen" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Audio-CD auslesen" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Ausführen" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "SOCKS-Proxy" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "SSL-Handshake Fehler, überprüfen sie die Serverkonfiguration. Die SSLv3 Option unten kann die Lösung einiger Probleme sein." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Gerät sicher entfernen" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Das Gerät nach dem Kopiervorgang sicher entfernen" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Abtastrate" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Abtastrate" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr ".mood-Datei in Ihrer Bibliothek speichern" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Titelbild speichern" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Titelbild auf Datenträger speichern …" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Bild speichern" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Wiedergabeliste speichern" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Wiedergabeliste speichern" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Wiedergabeliste speichern …" #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Voreinstellung speichern" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Wenn möglich, Bewertungen in Dateischlagworten speichern" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Wenn möglich, Statistiken in Dateischlagworten speichern" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Diesen Datenstrom im Internetreiter sichern" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Titelstatistiken werden in die Titeldatei gespeichert" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Titel werden gespeichert" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Skalierbares Abtastratenprofil (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Bildgröße anpassen" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Punkte" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Titel, die ich höre, »scrobbeln«" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Suche" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Suche" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Suche nach Icecast-Sendern" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Suche in Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Magnatune durchsuchen" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Suche Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Automatisch suchen" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Nach Titelbild suchen …" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Suche in allen Quellen" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "gpodder.net durchsuchen" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "iTunes durchsuchen" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Suchmodus" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Suchoptionen" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Suchergebnisse" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Suchbegriffe" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Zweite Stufe" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Zurückspulen" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Vorspulen" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Im aktuellen Titel vorspulen" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Im aktuellen Titel zu einer Position springen" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "Mit Tastaturkürzel spulen" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Alle auswählen" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Auswahl aufheben" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Hintergrundfarbe:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Hintergrundbild wählen" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Wähle bestmögliche Übereinstimmung" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Schriftfarbe:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Visualisierungen auswählen" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Visualisierungen auswählen …" #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Auswählen …" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Seriennummer" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Server" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "Server-Adresse" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Server-Details" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Dienst nicht verfügbar" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "%1 zu »%2« einstellen …" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Setze Lautstärke auf %" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Wert für ausgewählte Titel einstellen …" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Einstellungen" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Tastenkürzel" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Tastenkürzel für %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Kürzel für %1 existiert bereits" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Anzeigen" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Bildschirmanzeige anzeigen" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Den aktuellen Titel mit einem animierten Glühen hervorheben" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Stimmungsbarometer im Fortschrittsbalken anzeigen" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Benachrichtigungen des Systems benutzen" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Eine Benachrichtigung, bei Änderung der Wiederholungsart bzw. des Zufallsmodus, anzeigen" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Benachrichtigung bei Änderung der Lautstärke anzeigen" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Eine Benachrichtigung anzeigen, wenn die Wiedergabe angehalten wird" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Blase aus dem Benachrichtigungsfeld" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Clementine-Bildschirmanzeige anzeigen" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Oberhalb der Statusleiste anzeigen" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Alle Titel anzeigen" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Alle Titel anzeigen" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Titelbilder in der Bibliothek anzeigen" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Trenner anzeigen" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "In Originalgröße anzeigen …" #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Gruppen in den globalen Suchergebnissen anzeigen" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "In Dateiverwaltung anzeigen …" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "In Bibliothek anzeigen …" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Unter »Verschiedene Interpreten« anzeigen" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Stimmungsbarometer anzeigen" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Nur Doppelte anzeigen" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Nur ohne Schlagworte anzeigen" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Aktuell wiedergegebenen Titel auf Ihrer Seite anzeigen" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Suchvorschläge anzeigen" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Den »Lieben«-Knopf anzeigen" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Das Scrobble-Zeichen im Hauptfenster zeigen" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Clementine im Benachrichtigungsfeld anzeigen" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Anzeigen, welche Quellen aktiviert und deaktiviert sind" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Anzeigen/Ausblenden" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Zufallsmodus" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Zufällige Albenreihenfolge" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Zufällige Titelreihenfolge" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Wiedergabeliste mischen" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Zufällige Titelreihenfolge innerhalb eines Albums" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Anmelden" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Abmelden" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Anmelden …" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Ähnliche Interpreten" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Größe" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Größe:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Vorherigen Titel in der Wiedergabeliste" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Übersprungzähler" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Nächsten Titel in der Wiedergabeliste" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Ausgewählte Titel überspringen" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Titel überspringen" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Kleines Titelbild" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Schmale Seitenleiste" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Intelligente Wiedergabeliste" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Intelligente Wiedergabelisten" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Titelinformationen" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Titelinfo" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogramm" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Sorry" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Sortiert nach Genre (alphabetisch)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Sortiert nach Genre (nach Popularität)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Sortiert nach Sendernamen" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Titel sortieren nach" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Sortierung" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Quelle" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Quellen" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Fehler beim Anmelden bei Spotify" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "Adresse der Spotify-Wiedergabeliste" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Spotify-Erweiterung" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Spotify-Erweiterung nicht installiert" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "Adresse des Spotify-Titels" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Standard" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Markiert" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Auslesen starten" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Spiele die aktuelle Wiedergabeliste ab" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Umwandeln starten" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Geben Sie etwas in die Suchleiste ein um diese Ergebnisliste zu füllen" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Starte %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Starten …" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Anhalten" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Anhalten nach" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Wiedergabe nach jedem Titel anhalten" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Wiedergabe nach jedem Titel anhalten" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Wiedergabe nach diesem Titel anhalten" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Wiedergabe anhalten" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Wiedergabe nach Titel anhalten" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Wiedergabe anhalten nach: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Angehalten" #: core/song.cpp:431 msgid "Stream" msgstr "Datenstrom" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Um von einem Subsonic-Server Übertragungen empfangen zu können, wird nach Ablauf der 30-tägigen Versuchsperiode eine gültige Serverlizenz benötigt." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Datenstrommitgliedschaft" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Abonnenten" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Erfolg!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "%1 erfolgreich geschrieben" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Vorgeschlagene Schlagworte" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Kopfzeile:" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Sehr hoch (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Sehr hoch (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Unterstützte Formate" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Jetzt die Statistiken mit den Dateien synchronisieren" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Spotify-Postfach wird synchronisiert" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Spotify-Wiedergabeliste wird synchronisiert" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Markierte Titel von Spotify werden synchronisiert" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Systemfarben" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Reiter oben" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Schlagwortsammler" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Ziel-Bitrate" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Texteinstellungen:" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Dank an" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Der Befehl »%1« konnte nicht ausgeführt werden." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Das Titelbild des gerade abgespielten Titels" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "Verzeichnis %1 ist ungültig" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "Der zweite Wert muss größer als der erste sein!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Die aufgerufene Seite existiert nicht!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Die angeforderte Seite ist kein Bild!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Die Versuchsperiode für den Subsonic-Server ist abgelaufen. Bitte machen Sie eine Spende, um einen Lizenzschlüssel zu erhalten. Details finden sich auf subsonic.org." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Die Clementine-Version, auf die Sie gerade aktualisiert haben, erfordert eine komplette Aktualisierung Ihrer Bibliothek, damit die folgenden neuen Funktionen genutzt werden können:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Dieses Album enthält auch andere Titel" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Bei der Kommunikation mit gpodder.net trat ein Fehler auf" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Beim Abrufen der Metadaten von Magnatune ist ein Fehler aufgetreten" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Es gab Probleme, die Antwort von iTunes auszulesen" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Beim Kopieren einiger Titel ist ein Fehler aufgetreten. Die folgenden Dateien konnten nicht kopiert werden:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Beim Löschen einiger Titel ist ein Fehler aufgetreten. Die folgenden Dateien konnten nicht gelöscht werden:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Diese Dateien werden vom Gerät gelöscht. Möchten Sie wirklich fortfahren?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Diese Dateien werden von der Festplatte gelöscht. Möchten Sie wirklich fortfahren?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Diese Ordner werden durchsucht, um Ihre Bibliothek zu erstellen" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Diese Einstellungen werden im »Musik umwandeln«-Dialog und beim Umwandeln von Musik vor der Übertragung auf ein Gerät verwendet." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Dritte Stufe" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Diese Aktion wird eine Datenbank erstellen, die ungefähr 150 MB einnehmen könnte." #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Das Album ist im gewünschten Format nicht verfügbar" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Das kann später in den Einstellungen geändert werden" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Dieses Gerät muss verbunden und geöffnet sein, bevor Clementine feststellen kann, welche Dateiformate es unterstützt." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Dieses Gerät unterstützt die folgenden Dateiformate:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Dieses Gerät wird nicht ordnungsgemäß funktionieren" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Dies ist ein MTP-Gerät, aber Clementine wurde ohne Unterstützung für libmtp kompiliert." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Dies ist ein iPod, aber Clementine wurde ohne Unterstützung für libgpod kompiliert." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Dieses Gerät wurde zum ersten Mal verbunden. Clementine wird es nun nach Musikdateien durchsuchen – dies kann einige Zeit dauern." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Diese Einstellung kann in den »Verhalten«-Einstellungen geändert werden" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Dieser Datenstrom ist nur für zahlende Kunden verfügbar" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Diese Geräteart wird nicht unterstützt: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "Zeitschritt" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Titel" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Heute" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Clementine-Bildschirmanzeige umschalten" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Vollbild an/aus" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Einreihungsstatus ändern" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Scrobbeln ein- oder ausschalten" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Sichtbarkeit der Clementine-Bildschirmanzeige anpassen" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Morgen" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Zu viele Umleitungen" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Top-Titel" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Gesamte Alben:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Insgesamt übertragene Bytes" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Insgesamt gestellte Netzwerkanfragen" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Titel-Nr." #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Titel" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Musik umwandeln" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Umwandlungsprotokoll" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Umwandlung" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "%1 Dateien werden mit %2 Prozessen umgewandelt" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Umwandlungsoptionen" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Ausschalten" #: devices/giolister.cpp:157 msgid "URI" msgstr "Adresse" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "Adresse(n)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Ulte Weit Band (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Verbindung nicht möglich" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Konnte %1 nicht herunterladen (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Unbekannt" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Unbekannter Inhalt" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Unbekannter Fehler" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Titelbild entfernen" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Überspringen der ausgewählten Titel aufheben" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Titel nicht überspringen" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Abonnement kündigen" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Nächste Konzerte" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Aktualisieren" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Alle Podcasts aktualisieren" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Geänderte Bibliotheksordner aktualisieren" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Bibliothek beim Programmstart aktualisieren" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Diesen Podcast aktualisieren" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Aktualisieren" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Aktualisiere %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "%1% aktualisieren …" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Bibliothek aktualisieren" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Benutzung" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Wenn verfügbar Album-Interpret benutzen" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Gnome-Tastenkürzel verwenden" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Psychedelische Farben verwenden" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Metadaten des Wiederholungsverstärkers verwenden, wenn verfügbar" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "SSLv3 verwenden" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Wii-Fernbedienung benutzen" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Ein benutzerdefiniertes Farbschema verwenden" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Einen benutzerdefinierten Text für Benachrichtigungen benutzen" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Eine Netzwerkfernsteuerung verwenden" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Legitimierung verwenden" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Bitratenverwaltung verwenden" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Dynamischen Modus benutzen" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Um den Status der Wii-Fernbedienung anzuzeigen, Benachrichtigungen benutzen" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Zeitliche Rauschformung verwenden" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Standardeinstellungen des Systems benutzen" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Das Farbschema des Systems verwenden" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Vermittlungsservereinstellungen des Betriebssystems verwenden" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Lautstärkepegel angleichen" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Belegt" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Benutzeroberfläche" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Benutzername:" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Beim Hinzufügen eines Titels über das Kontextmenü …" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Variable Bitrate" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Verschiedene Interpreten" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Version %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Ansicht" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Art der Visualisierung" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Visualisierungen" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Visualisierungseinstellungen" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Sprachaktivitätserkennung" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Lautstärke %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Pinnwand" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Hinweis beim Schließen eines Wiedergabelistenreiters anzeigen" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "WAV" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Internetseite" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Wochen" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Beim Programmstart" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Auf der Suche nach Titelbildern wird Clementine zuerst nach Bilddateien suchen, die eines dieser Wörter enthalten.\nFalls es keine Treffer gibt, wird das größte Bild aus dem Verzeichnis ausgewählt." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "Beim Speichern einer Wiedergabeliste sollte der Dateipfad folgendes sein" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Wenn die Liste leer ist …" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Versuchen Sie zum Beispiel …" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Breitband (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii-Fernbedienung %1 aktiviert" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii-Fernbedienung %1 verbunden" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii-Fernbedienung %1: Ladestand kritisch (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii-Fernbedienung %1 deaktiviert" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii-Fernbedienung %1 getrennt" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii-Fernbedienung %1: Ladestand niedirg (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media Audio" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Ohne Titelbild:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Möchten Sie die anderen Titel dieses Albums ebenfalls unter »Verschiedene Interpreten« anzeigen?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Möchten Sie jetzt Ihre Musiksammlung erneut einlesen?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Speichere alle Titel-Statistiken in die Titel-Dateien" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Metadaten schreiben" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Benutzername oder Passwort falsch." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Jahr" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Jahr – Album" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Jahre" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Gestern" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Die folgenden Alben werden jetzt heruntergeladen" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Wollen Sie %1 Wiedergabelisten löschen?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Sie entfernen eine nicht favorisierte Wiedergabeliste. Die Wiedergabeliste wird gelöscht (Diese Aktion kann nicht rückgängig gemacht werden).\nMöchten Sie wirklich fortfahren?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Sie sind nicht angemeldet." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Sie sind angemeldet als %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Sie sind angemeldet." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Sie können hier einstellen, wie Ihre Bibliothek sortiert wird." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Das Zuhören ist kostenlos ohne Anmeldung möglich, aber Premium-Mitglieder haben Zugriff auf werbefreie Datenströme mit höherer Tonqualität." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Sie können ohne Benutzerkonto Musik von Magnatune hören. Um die Hinweise am Ende der einzelnen Titel zu entfernen, müssen Sie eine Mitgliedschaft kaufen." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Sie können zur gleichen Zeit Hintergrunddatenströme und andere Musik hören." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Sie können Ihre Wii-Fernbedienung als Fernbedienung für Clementine benutzen. Mehr Informationen dazu gibt es auf der entsprechenden Seite im Clementine-Wiki.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Sie haben kein Spotify-Premium-Konto." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Sie haben kein aktives Abonnement." #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "Sie müssen angemeldet sein, um Musik auf SoundCloud zu suchen und zu hören. Ebenfalls müssen Sie sich anmelden, um auf Ihre Wiedergabelisten und Ihren Datenstrom zugreifen zu können." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Sie wurden von Spotify abgemeldet. Bitte geben Sie Ihr Passwort im Einstellungsdialog erneut ein." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Sie wurden von Spotify abgemeldet. Bitte geben Sie Ihr Passwort erneut ein." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Sie lieben diesen Titel" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "Sie müssen die Systemeinstellungen öffnen und »Zugriff für Hilfsgeräte aktivieren« in »Bedienhilfen« aktivieren, um Clementines Tastenkürzel zu benutzen." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Sie müssen Clementine nach dem Ändern der Sprache neu starten." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Ihre IP-Adresse:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Ihre Last.fm-Daten sind falsch" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Ihre Magnatune-Anmeldedaten sind falsch" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Ihre Bibliothek ist leer!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Meine Internetradios" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Ihre Scrobbles: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Ihr System enthält keine Unterstützung für OpenGL, Visualisierungen sind deshalb nicht verfügbar." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Ihr Benutzername und/oder Passwort sind ungültig." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Null" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "%n Titel hinzufügen" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "nach" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "vor" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "und" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "automatisch" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "vor" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "zwischen" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "größte zuerst" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "BPM" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "enthält" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "abgeschaltet" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "CD %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "enthält nicht" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "endet mit" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "entspricht" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "gpodder.net-Verzeichnis" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "größer als" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "iPods und USB-Geräte funktionieren derzeit nicht unter Windows. Entschuldigung!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "in den letzten" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "Kb/s" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "kleiner als" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "längste zuerst" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "Verschiebe %n Titel" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "neueste zuerst" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "keine Übereinstimmungen" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "nicht in den letzten" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "nicht auf" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "älteste zuerst" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "am" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "Einstellungen" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "oder den QR-Code einlesen!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "Drücken Sie die Eingabetaste" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "%n Titel entfernen" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "kürzeste zuerst" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "Titel mischen" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "kleinste zuerst" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "Titel sortieren" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "beginnt mit" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "Anhalten" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "Titel %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/el.po000066400000000000000000006133371260417502300236540ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Achilleas Pipinellis, 2014 # Antony_256 , 2011, 2012 # Achilleas Pipinellis, 2013 # Achilleas Pipinellis, 2012 # firewalker , 2013-2015 # firewalker , 2011-2012 # Nisok Kosin , 2012 # Wasilis Mandratzis , 2013 # Wasilis Mandratzis-Walz, 2015 # Wasilis Mandratzis-Walz, 2015 # Wasilis , 2013 # Xenophon Sp , 2014 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Greek (http://www.transifex.com/davidsansome/clementine/language/el/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: el\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nΜπορείτε να κανετε αγαπημένα τα playlists σας κάνοντας κλικ στο εικονίδιο του αστεριού δίπλα σε ένα όνομα λίστας αναπαραγωγής ⏎\n⏎\nΑγαπημένες λίστες αναπαραγωγής θα αποθηκεύονται εδώ" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " ημέρες" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " σημ" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " δευτερόλεπτα" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " τραγούδια" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 τραγούδια)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 άλμπουμ" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 ημέρες" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "Πριν %1 ημέρες" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 στο %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 λίστες αναπαραγωγής (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 επιλεγμένα από" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 τραγούδι" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 τραγούδια" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "βρέθηκαν %1 τραγούδια" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "βρέθηκαν %1 τραγούδια (εμφάνιση %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 κομμάτια" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 μεταφέρθηκε" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Άρθρωμα Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 άλλοι ακροατές" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 συνολικές ακροάσεις" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n απέτυχε" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n ολοκληρώθηκε" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n απομένει" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Στοίχιση κειμένου" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Κέντρο" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Προσωπική" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "&Extras" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "Βοήθεια" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "Απόκρυψη %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "Απόκρυψη..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Αριστερά" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "Μουσική" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Καμία" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "Λίστα αναπαραγωγής" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Έξοδος" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Λειτουργία &επανάληψης " #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Δεξιά" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Λειτουργία &ανακατέματος" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "Επέκταση των στηλών για να χωρέσει το παράθυρο" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "Εργαλεία" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(διαφορετικό ανάμεσα σε πολλαπλά τραγούδια)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", από" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...και σε όλους τους συνεισφέροντες του Amarok" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 ημέρα" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 κομμάτι" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 τυχαία τραγούδια" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Αναβάθμιση σε Premium τώρα" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Αν δεν είναι επιλεγμένο, ο Clementine θα προσπαθήσει να σώσει τις βαθμολογίες σας και άλλα στατιστικά σε μία ξεχωριστή βάση δεδομένων και δεν θα τροποποιήσει τα αρχεία σας.

Αν είναι επιλεγμένο, θα σώσει τα στατιστικά και στην βάση δεδομένων και σε κάθε αρχείο κάθε φορά που αλλά.

Παρακαλώ να έχετε υπόψιν πως μπορεί να μην λειτουργεί σε κάθε διαμόρφωση και, καθώς δεν υπάρχει στάνταρ τρόπος για αυτό, άλλα προγράμματα αναπαραγωγής ίσως να μην μπορούν να τα διαβάσουν.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Prefix a word with a field name to limit the search to that field, e.g. artist:Bode searches the library for all artists that contain the word Bode.

Available fields: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Αυτό θα εγγράψει τα στατιστικά σε αρχεία ετικέτας για όλα τα τραγούδια στην βιβλιοθήκη σας.

Αυτό δεν χρειάζεται αν η επιλογή "Αποθήκευση των στατιστικών των τραγουδιών στα αρχεία των τραγουδιών" ήταν πάντα ενεργή.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Λέξεις που αρχίζουν με %, για παράδειγμα:%καλλιτέχνης %άλμπουμ %τίτλος

\n\n

Αν κλείσεις ένα κείμενο που περιέχει λέξη με % σε άγκιστρα ({}), το τμήμα αυτό δεν θα είναι ορατό η λέξη λείπει

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Απαιτείται premium λογαριασμός Spotify." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Ένας πελάτης μπορεί να συνδεθεί, μόνο αν έχει εισαχθεί ο σωστός κωδικός." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Μια έξυπνη λίστα αναπαραγωγής είναι μία δυναμική λίστα τραγουδιών που προέρχεται από την βιβλιοθήκη σας. Υπάρχουν διαφορετικοί τύποι \"έξυπνης λίστα αναπαραγωγής\" που προσφέρουν διαφορετικούς τρόπους επιλογής τραγουδιών." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Το τραγούδι θα συμπεριληφθεί στην λίστα αναπαραγωγής αν πληρεί αυτές τις συνθήκες." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "Α-Ω" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ΟΛΗ Η ΔΟΞΑ ΣΤΟΝ HYPNOTOAD" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Ματαίωση" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Περί %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Περί του Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Περί του Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Απόλυτο" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Λεπτομέρειες λογαριασμού" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Λεπτομέρειες λογαριασμού (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Ενέργεια" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Ενέργεια" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Ενεργοποίηση/απενεργοποίηση Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Ροή δραστηριοτήτων " #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Προσθήκη Podcast" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Προσθήκη ροής" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Προσθήκη νέας γραμμής αν υποστηρίζεται από τον τύπο ειδοποιήσεων" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Προσθήκη ενέργειας" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Προσθήκη όλων των κομματιών από έναν κατάλογο και όλους τους υποκαταλόγους του" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Προσθήκη άλλης ροής..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Προσθήκη καταλόγου..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Προσθήκη αρχείου" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Προσθήκη αρχείου για επανακωδικοποίηση" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Προσθήκη αρχείου(ων) για επανακωδικοποίηση" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Προσθήκη αρχείου..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Προσθήκη αρχείων για επανακωδικοποίηση" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Προσθήκη φακέλου" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Προσθήκη φακέλου" #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Προσθήκη νέου φακέλου..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Προσθήκη podcast" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Προσθήκη podcast..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Προσθήκη όρου αναζήτησης" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Προσθήκη ετικέτας άλμπουμ του τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Προσθήκη ετικέτας άλμπουμ-καλλιτέχνη του τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Προσθήκη ετικέτας καλλιτέχνη του τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Προσθήκη αυτόματου σκορ τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Προσθήκη ετικέτας συνθέτη του τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Προσθήκη ετικέτας δίσκου του τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Προσθήκη ονόματος αρχείου τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Προσθήκη ετικέτας είδους του τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Προσθήκη ετικέτας ομαδοποίησης τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Προσθήκη ετικέτας μήκους του τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Προσθήκη ετικέτας εκτελεστή τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Προσθήκη ετικέτας σειράς του τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Προσθήκη βαθμολογίας τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Προσθήκη τραγουδιού για παράληψη της σειράς" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Προσθήκη ετικέτας τίτλου τραγουδιού" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Προσθήκη τραγουδιού στην προσωρινή αποθήκευση" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Προσθήκη ετικέτας αριθμού τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Προσθήκη ετικέτας χρονολογίας τραγουδιού" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Προσθέτει τραγούδια στο \"Η Μουσική μου\" όταν γίνεται \"κλικ\" στο κουμπί \"Αγάπη\"" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Προσθήκη ροής..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Προσθήκη στη Μουσική Μου" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Προσθήκη στην λίστα αναπαραγωγής Spotify" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Προσθήκη για Spotify πρωταγωνίστησε" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Προσθήκη σε άλλη λίστα" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Προσθήκη στους σελιδοδείκτες" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Προσθήκη στη λίστα" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Προσθήκη στην λίστα αναμονής" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Προσθήκη χρήστη/ομάδας στους σελιδοδείκτες" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Προσθήκη ενέργειας wiimotedev" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Προσθήκη..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Προστέθηκε αυτόν τον μήνα" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Προστέθηκε αυτή την εβδομάδα" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Προστέθηκε φέτος" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Προστέθηκε σήμερα" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Προστέθηκε εντός τριών μηνών" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Προχωρημένη ομαδοποίηση..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Μετά " #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Μετά την αντιγραφή..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Άλμπουμ" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Άλμπουμ (ιδανική ένταση για όλα τα κομμάτια)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Καλλιτέχνης άλμπουμ" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Εξώφυλλο άλμπουμ" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Πληρ. άλμπουμ στο jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Άλμπουμ" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Άλμπουμ με εξώφυλλα" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Άλμπουμ χωρίς εξώφυλλα" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "όλα" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Όλα τα αρχεία (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "Όλη η δόξα στον Hypnotoad!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Όλα τα άλμπουμ" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Όλοι οι καλλιτέχνες" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Όλα τα αρχεία (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Όλες οι λίστες αναπαραγωγής (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Όλοι οι μεταφραστές" #: library/library.cpp:98 msgid "All tracks" msgstr "Όλα τα κομμάτια" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Επιτρέψτε στον πελάτη να κατεβάσει μουσική από αυτόν τον υπολογιστή." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Επιτρέπονται λήψεις" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Επιτρέψτε μέση/πλάγια κωδικοποίηση" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Παράλληλα με τα πρωτότυπα" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Να κρύβεις πάντα το κύριο παράθυρο" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Να εμφανίζεις πάντα το κύριο παράθυρο" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Έναρξη αναπαραγωγής πάντα" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon Cloud μονάδα" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Απαιτείται ένα πρόσθετο για να χρησιμοποιήσετε το Spotify. Θέλετε να το κατεβάσετε και να το εγκαταστήσετε τώρα;" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Προέκυψε σφάλμα στην φόρτωση της βάσης δεδομένων iTunes" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Προέκυψε σφάλμα κατά την εγγραφή μεταδεδομένων στο '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Προκλήθηκε ένα μη διευκρινισμένο σφάλμα." #: ui/about.cpp:85 msgid "And:" msgstr "Και:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Angry" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Εμφάνιση" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Προσάρτηση αρχείων/URLs στην λίστα αναπαραγωγής" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Προσάρτηση στην τρέχουσα λίστα αναπαραγωγής" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Προσάρτηση στην λίστα αναπαραγωγής" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Εφαρμογή συμπίεσης για αποφυγή κολλημάτων" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Είστε σίγουροι πως θέλετε να διαγράψετε τη ρύθμιση \"%1\";" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Είστε σίγουροι πως θέλετε να επαναφέρετε τα στατιστικά του τραγουδιού;" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Είστε σίγουροι πως θέλετε να γράψετε τα στατιστικά των τραγουδιών στα αρχεία των τραγουδιών για όλα τα τραγούδια στη βιβλιοθήκη σας;" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Καλλιτέχνης" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Πληρ. καλλιτέχνη" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Ετικέτες Καλλιτέχνη" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Αρχικά του καλλιτέχνη" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Ρωτήστε κατά την αποθήκευση" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Διαμόρφωση ήχου (format)" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Έξοδος ήχου" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Η πιστοποίηση απέτυχε" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Συγγραφέας" #: ui/about.cpp:68 msgid "Authors" msgstr "Δημιουργοί" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Αυτόματα" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Αυτόματα" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Αυτόματη ενημέρωση" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Άνοιξε αυτόμα τις μόνες κατηγορίες του δέντρου της βιβλιοθήκης" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Διαθέσιμα" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Μέσος ρυθμός bit" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Μέσο μέγεθος εικόνας" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "BBC Podcasts" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Ροές Παρασκηνίου" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Χρώμα φόντου" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Εικόνα φόντου" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Διαφάνεια φόντου" #: core/database.cpp:648 msgid "Backing up database" msgstr "Αντίγραφο ασφαλείας της βάσης δεδομένων" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Ισορροπία" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "Ban (Last.fm scrobbling)" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Μπάρες" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Βασικό μπλε" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Βασικός τύπος ήχου" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Συμπεριφορά" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Βέλτιστος" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Βιογραφία από %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Ρυθμός bit" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Ρυθμός bit" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Ρυθμός bit" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Block" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Τύπος μπλοκ" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Ποσοστό θολώματος" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Σώμα" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Boom" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Αναζήτηση..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Διάρκεια του buffer" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Αποθήκευση" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Δημιουργια Seafile ευρετήριου..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Αλλά αυτές οι πηγές είναι απενεργοποιημένες:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Κουμπιά" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Υποστήριξη φύλλων CUE" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Διαδρομή προσωρινής αποθήκευσης" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Προσωρινή αποθήκευση" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "Προσωρινή αποθήκευση #1" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Άκυρο" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Ακύρωση λήψης" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Το CAPTCHA είναι αναγκαιο.\nΠροσπαθήστε για συνδεθείτε στο Vk.com με τον περιηγητή σας, για να διορθώσετε αυτό το πρόβλημα." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Αλλαγή εξώφυλλου καλλιτέχνη" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Αλλαγή μεγέθους γραμματοσειράς..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Αλλάξτε μέθοδο επανάληψης" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Αλλαγή συντόμευσης..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Αλλάξτε μέθοδο ανάμιξης" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Αλλαγή γλώσσας" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Η αλλαγή αναπαραγωγής mono θα ενεργοποιηθεί για τα επόμενα τραγούδια " #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Έλεγχος για νέα επεισόδια" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Έλεγχος για ενημερώσεις" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Έλεγχος για ενημερώσεις" #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Επιλογή του Vk.com κατάλογου προσωρινής μνήμης " #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Επιλέξτε ένα όνομα για την έξυπνη λίστα αναπαραγωγής" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Αυτόματη επιλογή" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Επέλεξε χρώμα..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Επιλογή γραμματοσειράς..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Επιλογή από τη λίστα" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Επιλέξτε πως θα ταξινομηθεί η λίστα αναπαραγωγής και πόσα τραγούδια θα περιέχει." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Επιλογή φακέλου για αποθήκευση του podcast" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Επιλογή υπηρεσιών διαδικτύου που θέλετε να εμφανίζονται" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Επιλέξτε τις ιστοσελίδες που θέλετε να χρησιμοποιεί ο Clementine όταν ψάχνει για στοίχους." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Κλασσική" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Καθάρισμα" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Καθαρισμός" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Καθαρισμός λίστας" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Σφάλμα του Clementine." #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Clementine πορτοκαλί" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Οπτικά εφέ Clementine" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Ο Clementine μπορεί να μετατρέψει αυτόματα την μουσική που αντιγράφετε σε αυτή την συσκευή σε μία μορφή που μπορεί να αναπαράγει." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Το Clementine μπορεί να αναπαράγει μουσική που έχετε μεταφορτώθει στο Google Drive" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Ο Clementine μπορεί να αναπαράγει μουσική που έχετε μεταφορτώσει στο Box" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Ο Clementine μπορεί να αναπαράγει μουσική που έχετε ανεβάσει στο Dropbox. " #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Ο Clementine μπορεί να αναπαράγει μουσική που έχετε μεταφορτώσει στο Google Drive" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Το Clementine μπορεί να παίξει μουσική που έχετε ανεβάσει στο OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Το Clementine μπορεί να δείχνει ένα μήνυμα όταν το κομμάτι αλλάζει." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Ο Clementine μπορεί να συγχρονίσει τις συνδρομές σας με άλλους υπολογιστές και εφαρμογές podcast. Create an account." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Ο Clementine δεν μπορεί να φορτώσει κάποιο projectM οπτικό εφέ. Βεβαιωθείτε πως έχετε εγκαταστήσει τον Clementine σωστά." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Προβολή εικόνων του Clementine" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Ο Clementine δεν μπόρεσε να βρει αποτελέσματα για αυτό το αρχείο" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Ο Clementine θα βρει μουσική στο:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Κλικ εδώ για να προσθέσετε μουσική" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Κάντε κλικ εδώ για να γινει αγαπημένο αυτό το playlist, έτσι θα σωθεί και θα παραμείνει προσβάσιμο μέσω του \"Playlists\" πίνακα στη δεξιά πλευρική ράβδο" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "\"Κλικ\" για εναλλαγή μεταξύ συνολικού και εναπομείναντα χρόνου" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Κάνοντας \"κλικ\" στο πλήκτρο Είσοδος θα ανοίξει ένας περιηγητής. Πρέπει να επιστρέψετε στον Clementine αφού συνδεθείτε." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Κλείσιμο" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Κλείσιμο της λίστας αναπαραγωγής" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Κλείσιμο οπτικών εφέ" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Το κλείσιμο του παραθύρου θα ακυρώσει το \"κατέβασμα\"." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Το κλείσιμο του παραθύρου θα σταματήσει την αναζήτηση για εξώφυλλα άλμπουμ." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Χρώματα" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Λίστα χωρισμένη με κόμμα από class:level, το level είναι 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Σχόλια" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Κοινοτικό Ραδιόφωνο" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Συμπλήρωση των ετικετών αυτόματα" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Συμπλήρωση των ετικετών αυτόματα..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Συνθέτης" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Ρύθμιση %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Ρύθμιση του Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Ρύθμιση συντομεύσεων" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Ρύθμιση του Spotify..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Ρύθμιση του Subsonic..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Διαμόρφωση του Vk.com..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Ρύθμιση καθολικής αναζήτησης..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Παραμετροποίηση της βιβλιοθήκης" #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Ρύθμιση των podcasts..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Παραμετροποίηση..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Σύνδεση των χειριστηρίων Wii χρησιμοποιώντας την ενέργεια ενεργοποίηση/απενεργοποίηση" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Σύνδεση συσκευής" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Σύνδεση στο Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Ο διακομιστής αρνήθηκε τη σύνδεση, ελέγξτε το URL του διακομιστή. Παράδειγμα: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Η σύνδεση διακόπηκε, ελέγξτε το URL του διακομιστή. Παράδειγμα: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Προβλήματα σύνδεσης ή ήχου έχουν απενεργοποιηθεί από τον ιδιοκτήτη" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Κονσόλα" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Σταθερός ρυθμός bit" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Μετατροπή όλης της μουσικής" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Μετατροπή κάθε μουσικής που η συσκευή δεν μπορεί να αναπαράγει" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Μετατροπή αρχείων ήχου χωρίς απώλειες πριν από την αποστολή τους στο απομακρυσμένο." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Μετατροπή χωρίς απώλειες αρχείων" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Αντιγραφή στο πρόχειρο" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Αντιγραφή στο πρόχειρο" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Αντιγραφή στην συσκευή..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Αντιγραφή στην βιβλιοθήκη..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Πνευματικά δικαιώματα" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Δεν μπορεί να γίνει σύνδεση με το Subsonic, ελέγξτε το URL του διακομιστή. Παράδειγμα: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Δεν μπόρεσε να δημιουργηθεί το στοιχείο \"%1\" του GStreamer - βεβαιωθείτε ότι έχετε όλα τα απαραίτητα πρόσθετα του GStreamer εγκατεστημένα" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Δεν ήταν δυνατή η δημιουργία λίστας αναπαραγωγής" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Δεν βρέθηκε κάποιος πολυπλέκτης (muxer) για %1, ελέγξτε πως έχετε τα σωστά πρόσθετα του GStreamer εγκατεστημένα" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Δεν βρέθηκε κάποιος κωδικοποιητής (encoder) για %1, ελέγξτε πως έχετε τα σωστά πρόσθετα του GStreamer εγκατεστημένα" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Δεν μπορεί να ανοίξει το αρχείο εξόδου %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Διαχείριση εξώφυλλων" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Εξώφυλλο από ενσωματωμένη εικόνα" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Το εξώφυλλο φορτώθηκε αυτόματα από %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Το εξώφυλλο αφαιρέθηκε χειροκίνητα" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Δεν έχει οριστεί εξώφυλλο" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Το εξώφυλλο ορίστηκε από %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Εξώφυλλα από %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Χρήση «Cross-Fade» κατά την αυτόματη αλλαγή του κομματιού" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Χρήση «Cross-Fade» κατά την χειροκίνητη αλλαγή του κομματιού" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Προσαρμοσμένο" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Προσωπική εικόνα:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Προσαρμοσμένες ρυθμίσεις μηνύματος" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Προσωπική..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "Διαδρομή του DBus" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dance" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Εντοπίστηκε κατακερματισμός στην βάση δεδομένων. Παρακαλώ διαβάστε το https://code.google.com/p/clementine-player/wiki/DatabaseCorruption για οδηγίες ανάκτησης της βάσης δεδομένων" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Ημερομηνία δημιουργίας" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Ημερομηνία τροποποίησης" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Ημέρες" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "Προ&επιλογή" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Μείωση της έντασης ήχου κατά 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Μείωση του ήχου κατά της εκατό" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Μείωση έντασης" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Προεπιλεγμένη εικόνα φόντου" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Προεπιλεγμένη συσκευή στο %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Προκαθορισμένα" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Καθυστέρηση μεταξύ οπτικών εφέ" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Διαγραφή" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Διαγραφή δεδομένων που έχουν \"κατέβει\"" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Διαγραφή αρχείων" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Διαγραφή από την συσκευή..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Διαγραφή από τον δίσκο..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Διαγραφή επεισοδίων που έχουν αναπαραχθεί" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Διαγραφή ρύθμισης" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Διαγραφή έξυπνης λίστας αναπαραγωγής" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Διαγραφή των αρχικών αρχείων" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Γίνεται διαγραφή αρχείων" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Αφαίρεση των επιλεγμένων κομματιών από την λίστα αναμονής" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Αφαίρεση του κομματιού από την λίστα αναμονής" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Προορισμός" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Λεπτομέρειες..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Συσκευή" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Ιδιότητες συσκευής" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Όνομα συσκευής" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Ιδιότητες συσκευής..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Συσκευές" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Διάλογος" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Εννοούσατε" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Ψηφιακά εισηγμένο" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Ψηφιακά εισηγμένο συνθηματικό" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Ψηφιακά εισηγμένο όνομα χρήστη" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Απευθείας σύνδεση στο διαδίκτυο" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Κατάλογος" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Απενεργοποίηση διάρκειας" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Απενεργοποίηση δημιουργίας moodbar " #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Απενεργοποιημένο" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Απενεργοποιημένο" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Δίσκος" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Διακεκομμένη μετάδοση" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Επιλογές απεικόνισης" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Απεικόνιση της «απεικόνισης στην οθόνη»" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Εκτελέστε μία πλήρη επανασάρωση της βιβλιοθήκης" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Πλήρη επανάληψη της σάρωσης" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Πλήρη επανάληψη της σάρωσης..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Μην μετατρέπεις την μουσική" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Να μην γίνει αντικατάσταση" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "Κάνοντας μια πλήρη επανάληψη της σάρωσης θα χάθουν κάθε μεταδεδομένα που έχετε αποθηκευμένα στο Clementine όπως εξώφυλλο, αναπαραγωγή και βαθμολογίες. Το Clementine θα σαρώσει ξανά όλη τη μουσική σας στο Google Drive που μπορεί να πάρει κάποιο χρόνο." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Χωρίς επανάληψη" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Αφαίρεση από τους διάφορους καλλιτέχνες" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Να μην εμφανίζονται ακουστα επεισόδια" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Χωρίς ανακάτεμα" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Μην σταματάς!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Δωρεά" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Διπλό «κλικ» για άνοιγμα" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Διπλό \"κλικ\" σε ένα τραγούδι θα..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Λήψη %n επεισοδίων" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Φάκελος λήψης" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Αποθήκευση επεισοδίων στο" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "\"Κατέβασμα\" συνδρομής" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Αυτόματη λήψη νέων επεισοδίων" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Η λήψη μπήκε στην αναμονή" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Ρυθμίσεις λήψεων" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Λήψη της Android εφαρμογής" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Λήψη αυτού του άλμπουμ" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Μεταφόρτωση αυτού του άλμπουμ..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Λήψη αυτού του επεισοδίου" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Λήψη..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Λήψη του (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Μεταφόρτωση καταλόγου Icecast" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Μεταφόρτωση καταλόγου Jamendo" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Μεταφόρτωση καταλόγου του Magnatune" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Λήψη πρόσθετου για το Spotify" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Λήψη μεταδεδομένων" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Σύρετε για μετακίνηση" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dubstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Διάρκεια" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Η δυναμική λειτουργία είναι ενεργή" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Δυναμική τυχαία ανάμιξη" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Τροποποίηση έξυπνης λίστας αναπαραγωγής" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Τροποποίηση ετικέτας \"%1\"..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Τροποποίηση ετικέτας..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Επεξεργασία ετικετών" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Τροποποίηση πληροφοριών κομματιού" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Τροποποίηση πληροφοριών κομματιού..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Επεξεργασία πληροφοριών των κομματιών..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Επεξεργασία..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "Email" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Ενεργοποίηση της υποστήριξης χειριστηρίων Wii" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Ενεργοποίηση αυτόματης προσωρινής αποθήκευσης " #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Ενεργοποίηση του ισοσταθμιστή" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Ενεργοποίηση των συντομεύσεων μόνο όταν ο Clementine είναι στο προσκήνιο" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Ενεργοποίηση τραγουδιού έκδοσης ενσωματωμένων μεταδεδομένων με κλικ" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Ενεργοποιήστε τις παρακάτω πηγές για να τις συμπεριλάβετε στα αποτελέσματα. Τα αποτελέσματα θα εμφανιστούν με αυτή την σειρά." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Ενεργοποίηση/απενεργοποίηση του Last.fm scrobbling" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Περιπλοκότητα κωδικοποίησης" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Ποιότητα μηχανής κωδικοποίησης" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Ρυθμός κωδικοποίησης" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Εισάγετε ένα URL" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Εισάγετε μία διεύθυνση για να μεταφορτώσετε ένα εξώφυλλο από το διαδίκτυο:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Εισάγετε όνομα για τα εξαγώγιμα εξώφυλλα (χωρίς επέκταση):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Εισαγωγή νέου ονόματος για την λίστα αναπαραγωγής" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Εισάγετε όρους αναζήτησης παραπάνω για να βρείτε μουσική στον υπολογιστή σας και στο Διαδίκτυο." #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Εισάγετε τους όρους αναζήτησης παρακάτω για να βρείτε podcasts στο iTunes" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Εισάγετε τους όρους αναζήτησης παρακάτω για να βρείτε podcasts στο gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Εισάγετε όρους αναζήτησης εδώ" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Εισαγωγή της διεύθυνσης μιας ροής ραδιοφώνου:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Εισάγεται το όνομα του φακέλου" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Εισάγετε αυτή την IP στο App για να συνδεθεί στον Clementine." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Ολόκληρη η συλλογή" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Ισοσταθμιστής" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Ισοδύναμο με --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Ισοδύναμο με --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Σφάλμα" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Σφάλμα Εξαγωγής CD" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Σφάλμα σύνδεσης συσκευής MTP" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Σφάλμα κατά την αντιγραφή τραγουδιών" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Σφάλμα κατά την διαγραφή τραγουδιών" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Σφάλμα στην λήψη του πρόσθετου του Spotify" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Σφάλμα φόρτωσης του %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Σφάλμα φόρτωσης λίστας από το di.fm" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Σφάλμα επεξεργασίας %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Σφάλμα κατά την φόρτωση CD ήχου" #: library/library.cpp:68 msgid "Ever played" msgstr "Ενίοτε έπαιξαν" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Κάθε 10 λεπτά" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Κάθε 12 ώρες" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Κάθε 2 ώρες" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Κάθε 20 λεπτά" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Κάθε 30 λεπτά" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Κάθε 6 ώρες" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Κάθε ώρα" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Εκτός μεταξύ δύο κομματιών στο ίδιο άλμπουμ ή στο ίδιο φύλλο CUE" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Υπάρχοντα εξώφυλλα" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Επέκταση" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Λίγει σε %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Εξαγωγή Εξώφυλλων" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Εξαγωγή εξώφυλλων" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Εξαγωγή μεταφορτωμένων εξώφυλλων" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Εξαγωγή ενσωματωμένων εξώφυλλων" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Η εξαγωγή ολοκληρώθηκε" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Εξαγωγή %1 εξώφυλλων από τα %2 (%3 παραλείφθηκαν)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Fade out κατά την παύση / fade in κατά τη συνέχιση" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "«Σβήσιμο» κατά την παύση του κομματιού" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "«Σβήσιμο»" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Διάρκειας «Σβησίματος»" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Αποτυχία ανάγνωσης της μονάδας CD" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Αποτυχία λήψης του καταλόγου" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Αποτυχία λήψης των podcasts" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Αποτυχία φόρτωσης podcast" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Αποτυχία ανάλυσης της XML από αυτό το RSS" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Γρήγορη" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Αγαπημένα κομμάτια" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Κατέβασμα εξώφυλλων που λείπουν" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Αυτόματο κατέβασμα" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Η ανάκτηση ολοκληρώθηκε" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Μεταφόρτωση καταλόγου Subsonic" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Σφάλμα στο κατέβασμα του εξώφυλλου" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Μορφή αρχείου" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Επέκταση αρχείου" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Μορφή αρχείων" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Όνομα αρχείου" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Όνομα αρχείου (χωρίς διαδρομή)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Αρχείο μοτίβου όνομα:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "διαδρομές των αρχείων" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Μέγεθος αρχείου" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Τύπος αρχείου" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Όνομα αρχείου" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Αρχεία" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Αρχεία για επανακωδικοποίηση" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Εύρεση τραγουδιών στην βιβλιοθήκη που πληρούν τα κριτήρια που ορίσατε." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Εύρεση αυτού του τραγουδιστή" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Αναγνώριση τραγουδιού" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Τέλος" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Πρώτο επίπεδο" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Τοποθετήστε το καπάκι για πλάτος" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Μέγεθος γραμματοσειράς" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Για λόγους αδειοδότησης η υποστήριξη για το Spotify γίνεται ξεχωριστά." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Επιβολή κωδικοποίησης mono" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "«Ξέχνα» την συσκευή" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Το «Ξέχνα» την συσκευή θα την αφαιρέσει από την λίστα και ο Clementine θα πρέπει να σαρώσει ξανά όλα τα τραγούδια την επόμενη φορά που θα την συνδέσετε." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Μορφή" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Μορφή" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Ρυθμός καρέ" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Πλαίσια ανά απομονωτή (buffer)" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Frozen" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Πλήρως μπάσα" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Πλήρως μπάσα και πρίμα" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Πλήρως πρίμα" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Γενικά" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Γενικές ρυθμίσεις" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Είδος" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Λήψη URL για να μοιραστείτε αυτο το Spotify τραγούδι" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Λήψη URL για να μοιραστείτε αυτή την λίστα αναπαραγωγής" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Λήψη καναλιών" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Λήψη ροών" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Δώστε του ένα όνομα:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Εκκίνηση" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Πήγαινε στην επόμενη πινακίδα της λίστας" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Πήγαινε στην προηγούμενη πινακίδα της λίστας" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Έγινε λήψη %1 εξώφυλλων από τα %2 (%3 απέτυχαν)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Σκίαση στην λίστα τραγουδιών που δεν υπάρχουν" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Ομαδοποίηση βιβλιοθήκης κατά..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Ομαδοποίηση κατά" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Ομαδοποίηση κατά Άλμπουμ" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Ομαδοποίηση κατά Καλλιτέχνη" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Ομαδοποίηση κατά Καλλιτέχνη/Άλμπουμ" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Ομαδοποίηση κατά Καλλιτέχνη/Έτος - Άλμπουμ" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Ομαδοποίηση κατά Είδος/Άλμπουμ" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Ομαδοποίηση κατά Είδος/Καλλιντέχνη/Άλμπουμ" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Ομαδοποίηση" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "Η σελίδα HTML δεν περιέχει RSS" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "Ο HTTP κωδικός κατάστασης 3xx ληφθεί χωρίς URL, βεβαιωθείτε για την διαμόρφωση του διακομιστή." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "Διαμεσολαβητής HTTP" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Happy" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Πληροφορίες υλικού" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Οι πληροφορίες υλικού είναι διαθέσιμες μόνο όταν η συσκευή είναι συνδεδεμένη." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Υψηλή" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Υψηλή (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Υψηλή (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "HipHop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "O Host δεν βρέθηκε, ελέγξτε το URL του διακομιστή. Παράδειγμα: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Ώρες" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Δεν έχω λογαριασμό Magnatune" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Εικονίδιο" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Εικονίδια στην κορυφή" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Ταυτοποίηση τραγουδιού" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Αν ενεργοποιηθεί, κάνοντας κλικ σε ένα επιλεγμένο τραγούδι στην όψη λίστα αναπαραγωγής θα σας επιτρέψει να επεξεργαστείτε άμεσα την τιμή της ετικέτας" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Αν συνεχίσετε, η συσκευή αυτή θα λειτουργεί αργά και τα τραγούδια που θα αντιγραφούν σε αυτή ίσως δεν παίζουν." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Αν γνωρίζετε το URL ενός podcast, εισάγετε το παρακάτω και πιέστε Εκκίνηση." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Αγνόηση του \"The\" στο όνομα των καλλιτεχνών" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Εικόνες (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Εικόνες (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Εισαγωγή..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "Σε %1 ημέρες" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "Σε %1 εβδομάδες" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "Στην δυναμική λειτουργία νέα κομμάτια θα επιλέγονται και τοποθετούνται στην λίστα κάθε φορά που ένα τραγούδι τελειώνει." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Εισερχόμενα" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Εμφάνιση του άλμπουμ (εικόνα) στην ειδοποίηση" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Συμπερίληψη όλων των τραγουδιών" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Ασύμβατη έκδοση πρωτοκόλλου REST. Η εφαρμογή πελάτη πρέπει να ενημερωθεί." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Ασύμβατη έκδοση πρωτοκόλλου REST. Ο διακομιστής πρέπει να ενημερωθεί." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Ατελής ρύθμιση, παρακαλώ βεβαιωθείτε πως όλα τα πεδία είναι συμπληρωμένα." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Αύξηση της έντασης ήχου κατά 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Αύξηση του ήχου κατά της εκατό" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Αύξηση έντασης" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Δημιουργία ευρετηρίου %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Πληροφορία" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Επιλογές εισόδου" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Εισαγωγή..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Εγκατεστημένο" #: core/database.cpp:585 msgid "Integrity check" msgstr "έλεγχος ακεραιότητας" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Διαδίκτυο" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Παροχείς Internet" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Υπηρεσίες Internet" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "Εισαγωγικά κομμάτια" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Εσφαλμένο κλειδί API" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Εσφαλμένη διαμόρφωση" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Εσφαλμένη μέθοδος" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Εσφαλμένοι παράμετροι" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Καθορίστηκε εσφαλμένη πηγή" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Εσφαλμένη υπηρεσία" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Εσφαλμένο κλειδί συνεδρίας" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Αντιστροφή επιλογής" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Τα ποιο διάσημα κομμάτια του Jamendo" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Τα κορυφαία κομμάτια του Jamendo" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Τα κορυφαία κομμάτια Jamendo του μήνα" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Τα κορυφαία κομμάτια Jamendo της εβδομάδας" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Βάση δεδομένων Jamendo" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Μετάβαση στο προηγούμενο τραγούδι αμέσως" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Μετάβαση στο τρέχον κομμάτι που παίζει" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Κράτημα των κουμπιών για %1 δευτερόλεπτα..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Κράτημα των κουμπιών για %1 δευτερόλεπτα..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Συνέχιση της εκτέλεσης στο παρασκήνιο όταν το παράθυρο κλείσει" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Διατήρηση των αρχικών αρχείων" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Γατάκια" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Γλώσσα" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Φορητός/ακουστικά" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Μεγάλη αίθουσα" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Μεγάλο εξώφυλλο άλμπουμ" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Μεγάλο εξώφυλλο του άλμπουμ (λεπτομέρειες παρακάτω)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Μεγάλο εξώφυλλο του άλμπουμ (χωρίς λεπτομέρειες)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Μεγάλη πλευρική μπάρα" #: library/library.cpp:80 msgid "Last played" msgstr "Τελευταία εκτέλεση" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Τελευταία εκτέλεση" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Το Last.fm είναι απασχολημένο, παρακαλώ δοκιμάστε σε λίγα λεπτά" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Last.fm συνθηματικό" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Αριθμός αναπαραγωγής Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Ετικέτες του Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Last.fm όνομα χρήστη" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Wiki του Last.fm" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Λιγότερο αγαπημένα κομμάτια" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Αριστερά" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Διάρκεια" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Βιβλιοθήκη" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Προχωρημένη ομαδοποίηση βιβλιοθήκης" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Ειδοποίηση σάρωσης βιβλιοθήκης" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Έρευνα βιβλιοθήκης" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Όρια" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Ζωντανά" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Φόρτωση" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Φόρτωμα εξώφυλλου από διεύθυνση (URL)" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Φόρτωμα εξώφυλλου από διεύθυνση (URL)..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Φόρτωση εξώφυλλου από τον δίσκο" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Φόρτωση εξώφυλλου από τον δίσκο..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Φόρτωση λίστας αναπαραγωγής" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Φόρτωση λίστας αναπαραγωγής..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Φόρτωση συσκευής MTP" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Φόρτωση της βάσης δεδομένων iPod" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Φόρτωση έξυπνης λίστας" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Φόρτωση τραγουδιού" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Φόρτωμα ροής (stream)" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Φόρτωση κομματιών" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Φόρτωση πληροφοριών κομματιού" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Φόρτωση..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Φορτώνει αρχεία/URLs, αντικαθιστώντας την τρέχουσα λίστα αναπαραγωγής" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Είσοδος" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Αποτυχία εισόδου" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Αποσύνδεση" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Προφίλ χρόνιας πρόβλεψης (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Αγάπη" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "Love (Last.fm scrobbling)" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Χαμηλή (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Χαμηλή (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Προφίλ χαμηλής πολυπλοκότητας (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Στίχοι" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Στίχοι από %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Στίχοι από την ετικέτα ID3v2" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Λήψη Magnatune" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Η λήψη Magnatune ολοκληρώθηκε" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Κύριο προφίλ (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Κάνε το!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Κάνε το!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Η λίστα να είναι διαθέσιμη και εκτός σύνδεσης" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Παραμορφωμένη απάντηση" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Χειροκίνητη ρύθμιση διαμεσολαβητή" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Χειροκίνητα" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Κατασκευαστής" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Επισήμανση ως έχει ακουστεί" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Επισήμανση ως νέο" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Ταίριασμα όλων των όρων αναζήτησης (λογικό ΚΑΙ)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Ταίριασμα ενός ή περισσότερων όρων αναζήτησης (λογικό Ή)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Μέγιστα αποτελέσματα παγκόσμιας αναζήτησης" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Μέγιστος ρυθμός bit" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Τα Μέσα μαζικής ενημέρωσης έχουν αλλάξει. Επαναφόρτωση" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Μέση (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Μέση (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Τύπος συνδρομής" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Ελάχιστος ρυθμός bit" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Ελάχιστο πλήρωσης ρυθμιστικό" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Απόντες projectM προεπιλογές" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Μοντέλο" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Έλεγχος της βιβλιοθήκης για αλλαγές" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Αναπαραγωγή Mono" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Μήνες" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Mood" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Στυλ moodbar" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Moodbars" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Περισσότερα" #: library/library.cpp:84 msgid "Most played" msgstr "Έπαιξαν περισσότερο" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Σημείο φόρτωσης (mount point)" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Σημεία φόρτωσης (mount points)" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Μετακίνηση κάτω" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Μετακίνηση στην βιβλιοθήκη..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Μετακίνηση πάνω" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Μουσική" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Μουσική βιβλιοθήκη" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Σίγαση" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Τα άλμπουμ μου" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Η Μουσική Μου" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Οι Προτάσεις μου" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Όνομα" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Όνομα" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Επιλογές ονομασίας" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Στενή ζώνη (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Διαμεσολαβητής Δικτύου" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Τηλεχειριστήριο Δικτύου" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Ποτέ" #: library/library.cpp:74 msgid "Never played" msgstr "Ποτέ δεν έπαιξαν" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Ποτέ μην ξεκινά η αναπαραγωγή" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Νέος φάκελος" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Νέα λίστα" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Νέα έξυπνη λίστα..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Νέα τραγούδια" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Νέα κομμάτια θα προστίθενται αυτόματα." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Νεότερα κομμάτια" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Επόμενο" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Επόμενο κομμάτι" #: core/utilities.cpp:151 msgid "Next week" msgstr "Την επόμενη εβδομάδα" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Χωρίς αναλυτή" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Χωρίς εικόνα φόντου" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Κανενα καβερ δεν επιλεχθηκε για εξαγωγη." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Όχι μακρά μπλοκς" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Δεν βρέθηκαν. Καθαρίστε το πλαίσιο αναζήτησης να να εμφανιστεί ολόκληρη η λίστα αναπαραγωγής." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Όχι βραχαία μπλοκς" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Κανένα" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Κανένα από τα επιλεγμένα τραγούδια δεν ήταν κατάλληλο για αντιγραφή σε μία συσκευή" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Normal" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Κανονικός τύπος μπλοκ" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Δεν είναι διαθέσιμο κατά την χρήση Δυναμικής λίστας" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Αποσυνδεμένο" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Δεν υπάρχει αρκετό περιεχόμενο" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Δεν υπάρχουν αρκετοί οπαδοί" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Δεν υπάρχουν αρκετά μέλη" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Δεν υπάρχουν αρκετοί γείτονες" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Μη εγκατεστημένο" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Δεν είστε συνδεδεμένος" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Δεν είναι φορτωμένο - διπλό \"κλικ\" για φόρτωση" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Τίποτα δεν βρέθηκε" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Τύπος ειδοποίησης" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Ειδοποιήσεις" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Τρέχουσα αναπαραγωγή" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Αριθμός επεισοδίων για προβολή" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Προ-επισκόπηση OSD" #: widgets/osd.cpp:173 msgid "Off" msgstr "Απενεργοποίηση" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "Ενεργοποίηση" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Αποδοχή συνδέσεων από πελάτες με διακύμανση ip:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Μόνο να επιτραπούν οι συνδέσεις από το τοπικό δίκτυο" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Εμφάνιση μόνο του πρώτου" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Αδιαφάνεια" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Άνοιγμα του %1 στον περιηγητή" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Άνοιγμα CD ή&χου..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Άνοιγμα αρχείου OPML" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Άνοιγμα αρχείου OPML..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Άνοιγμα ένος κατάλογου για εισάγωγη μουσικής από" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Άνοιγμα συσκευής" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Άνοιγμα αρχείου..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Άνοιγμα στο Google Drive" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Άνοιγμα σε νέα λίστα" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Άνοιγμα σε νέα λίστα" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Άνοιγμα στον περιηγητή" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Άνοιγμα..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Η λειτουργία απέτυχε" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Βελτιστοποίηση για ρυθμό bit" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Βελτιστοποίηση για ποιότητα" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Επιλογές..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Οργάνωση Αρχείων" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Οργάνωση αρχείων..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Γίνετε οργάνωση αρχείων" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Αρχικές ετικέτες" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "Αρχικό έτος" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "Αρχικό έτος - Άλμπουμ" #: library/library.cpp:118 msgid "Original year tag support" msgstr "Αρχικό έτος" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Άλλες επιλογές" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Έξοδος" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Συσκευή εξόδου" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Επιλογές εξόδου" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Αντικατάσταση όλων" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Εγγραφή και αντικατάσταση υπαρχόντων αρχείων" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Αντικατάσταση των μικρότερων μόνο" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Ιδιοκτήτης" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Ανάλυση του καταλόγου Jamendo" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Πάρτι" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Συνθηματικό" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Παύση" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Παύση αναπαραγωγής" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Σταματημένο" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Εκτελεστής" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Εικονοστοιχεία" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Απλή πλευρική μπάρα" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Αναπαραγωγή" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Μετρητής εκτελέσεων" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Αναπαραγωγή αν είναι σταματημένο, αλλιώς παύση" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Αναπαραγωγή εάν δεν παίζει κάτι άλλο" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Αναπαραγωγή του ου κομματιού της λίστας αναπαραγωγής" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Αναπαραγωγή/Παύση" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Αναπαραγωγή" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Επιλογές αναπαραγωγής" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Λίστα" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Η λίστα τελείωσε" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Επιλογές λίστας αναπαραγωγής" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Τύπος λίστας αναπαραγωγής" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Λίστες" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Παρακαλώ κλείστε τον περιηγητή σας και επιστρέψτε στον Clementine. " #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Κατάσταση πρόσθετου:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcasts" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Διάρκεια αναδυόμενου μηνύματος" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Πόρτα" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Προ-ενισχυμένο" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Προτιμήσεις" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Προτιμήσεις" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Προτιμήσεις..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Προτιμώμενα ονόματα αρχείων \"τέχνης\" (εξώφυλλα κ.τ.λ.) άλμπουμ (χωρισμένα με κόμμα)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Προτιμώμενη ηχητική διαμόρφωση" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Προτιμώμενος ρυθμός bit " #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Προτιμώμενη μορφή" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Τύπος ήχου Premium" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Ρυθμίσεις:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Πιέστε ένα συνδιασμό πλήκτρων για χρήση σε" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Πιέστε ένα πλήκτρο" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Πίεσε έναν συνδυασμό πλήκτρων για χρήση στο %1..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Πατώντας \"Προηγούμενο\" στο πρόγραμμα αναπαραγωγής θα..." #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Επιλογές Όμορφου OSD" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Προεπισκόπηση" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Προηγούμενο" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Προηγούμενο κομμάτι" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Εκτύπωση πληροφοριών έκδοσης" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Προφίλ" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Πρόοδος" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Πρόοδος" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psychedelic" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "πιέστε ένα πλήκτρο Wiiremote" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Τοποθέτηση τραγουδιών σΌροιε τυχαία σειρά" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Ποιότητα" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Ποιότητα" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Ερώτηση συσκευής..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Διαχειριστής λίστας αναμονής" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Τοποθέτηση στη λίστας αναμονής τα επιλεγμένα κομμάτια" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Τοποθέτηση στη λίστας αναμονής του κομματιού" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Ραδιόφωνο (ίση ένταση για όλα τα κομμάτια)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Βροχή" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Βροχή" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Τυχαίο οπτικό εφέ" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Βαθμολογία τρέχοντος τραγουδιού με 0 αστέρια" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Βαθμολογία τρέχοντος τραγουδιού με 1 αστέρια" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Βαθμολογία τρέχοντος τραγουδιού με 2 αστέρια" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Βαθμολογία τρέχοντος τραγουδιού με 3 αστέρια" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Βαθμολογία τρέχοντος τραγουδιού με 4 αστέρια" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Βαθμολογία τρέχοντος τραγουδιού με 5 αστέρια" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Βαθμολόγηση" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Ακύρωση στ' αλήθεια;" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Η ανακατεύθυνση υπέρβασης του ορίου, ελέγχει τη διαμόρφωση του διακομιστή." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Ανανέωση καταλόγου" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Ανανέωση καναλιών" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "ανανέωση της λίστας σταθμών" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Ανανέωση ροών" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Σχετικα" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Απομνημόνευσε την ταλάντευση του χειριστηρίου του Wii" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Υπενθύμιση από την τελευταία φορά" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Απομνημόνευση της επιλογής μου" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Αφαίρεση" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Αφαίρεση ενέργειας" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Αφαίρεση διπλότυπων από την λίστα" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Αφαίρεση φακέλου" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Αφαίρεση από την Μουσική Μου" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Κατάργηση από τους σελιδοδείκτες" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Αφαίρεση από την λίστα" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Αφαίρεση λίστας αναπαραγωγής" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Αφαίρεση λίστας αναπαραγωγής" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Αφαίρεση διαθέσιμων κομμάτιων από την λίστα αναπαραγωγής" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Μετονομασία λίστας αναπαραγωγής" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Μετονομασία λίστας αναπαραγωγής..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Επαναρίθμησε τα κομμάτια κατά αυτή την σειρά..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Επανάληψη" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Επανάληψη άλμπουμ" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Επανάληψη λίστας" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Επανάληψη κομματιού" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Αντικατάσταση της τρέχουσας λίστας αναπαραγωγής" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Αντικατάσταση της λίστας αναπαραγωγής" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Αντικαθιστά τα κενά με κάτω παύλα" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Λειτουργία Replay Gain" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Επανασυμπλήρωση" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Απαίτηση κωδικού επαλήθευσης" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Επαναφορά" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Επαναφορά μετρητή εκτελέσεων" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Επανεκκίνηση τραγουδιού, στη συνέχεια, μεταβαση στο προηγούμενο εάν πατήσετε ξανά" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Επανεκκίνηση του κομμάτιου, ή αναπαραγωγή του προηγούμενου κομματιού, εντός 8 δευτερολέπτων από την έναρξη." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Περιορισμός σε χαρακτήρες ASCII" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Συνέχιση της αναπαραγωγής στην εκκίνηση" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Επιστροφή στον Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Δεξιά" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Αντιγραφή" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Αντιγραφή CD" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Αντιγραφή CD ήχου" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Εκτέλεση" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "Διαμεσολαβητής SOCKS" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Σφάλμα SSL handshake, ελέγξτε την διαμόρφωση του διακομιστή. Η SSLv3 επιλογη μπορεί να λύση κάποια θέματα." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Ασφαλής αφαίρεση συσκευής" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Ασφαλής αφαίρεση συσκευής μετά την αντιγραφή" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Ρυθμός δειγματοληψίας" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Δειγματοληψία" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Αποθήκευση .mood αρχείων στην βιβλιοθήκη σας" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Αποθήκευση του εξώφυλλου του άλμπουμ" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Αποθ. εξώφυλλου στον δίσκο..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Αποθήκευση εικόνας" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Αποθήκευση λίστας αναπαραγωγής" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Αποθήκευση λίστας αναπαραγωγής" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Αποθήκευση λίστας αναπαραγωγής..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Αποθήκευση ρύθμισης" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Αποθήκευση βαθμολογίας σε αρχεία ετικετών όταν είναι εφικτό" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Αποθήκευση στατιστικών σε αρχεία ετικετών όταν είναι εφικτό" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Αποθήκευση της ροής στην καρτέλα Internet" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Αποθήκευση των στατιστικών των τραγουδιών στα αρχεία των τραγουδιών" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Αποθήκευση κομματιών" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Προφίλ κλιμακούμενου ρυθμού δειγματοληψίας (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Διαβάθμιση μεγέθους" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Σκορ" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Κάνε \"srobble\" τα κομμάτια που ακούω" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Αναζήτηση" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Αναζήτηση" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Αναζήτηση σταθμών Icecast" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Αναζήτηση Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Εύρεση στο Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Αναζήτηση στο Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Αναζήτηση αυτόματα" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Αναζήτηση για εξώφυλλο άλμπουμ..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Αναζήτηση για οτιδήποτε" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Αναζήτηση στο gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Αναζήτηση στο iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Λειτουργία αναζήτησης" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Επιλογές εύρεσης" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Εύρεση αποτελεσμάτων" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Όροι αναζήτησης" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Δεύτερο επίπεδο" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Αναζήτηση πίσω" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Αναζήτηση εμπρός" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Άλμα στο τρέχον κομμάτι κατά ένα σχετικό ποσό." #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Άλμα σε σε μια καθορισμένη θέση στο τρέχον κομμάτι." #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Επιλογή όλων" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Επιλογή κανενός" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Επιλογή χρώματος φόντου:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Επιλογή εικόνας φόντου" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Επιλέξτε το ποιο ταιριαστό" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Επιλογή χρώματος προσκήνιου:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Επιλογή οπτικών εφέ" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Επιλογή οπτικών εφέ..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Επιλογή..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Σειριακός αριθμός" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Διακομιστής" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "URL Εξυπηρετητή" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Λεπτομέρειες διακομιστή" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Υπηρεσία εκτός σύνδεσης" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Δώσε %1 στο \"%2\"..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Ρύθμιση της έντασης ήχου στο της εκατό" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Δώσε τιμή σε όλα τα επιλεγμένα κομμάτια..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Ρυθμίσεις" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Συντόμευση" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Συντόμευση για %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Η συντόμευση για το %1 υπάρχει" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Εμφάνιση" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Εμφάνιση OSD" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Εμφάνιση ενός φωτεινού σχεδίου στο τρέχον κομμάτι" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Εμφάνιση μίας moodbar στην μπάρα προόδου του κομματιού" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Εμφάνισε εγγενείς ειδοποιήσεις" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Εμφάνισε μία ειδοποίηση όταν αλλάζω την μέθοδο επανάληψης/ανάμιξης" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Εμφάνιση ειδοποίησης κατα την αλλαγή του ήχου" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Εμφάνιση ειδοποίησης όταν διακόψετε την αναπαραγωγή" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Εμφάνισε αναδυόμενα μηνύματα από το εικονίδιο συστήματος" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Εμφάνισε ένα όμορφο OSD" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Εμφάνιση πάνω από την μπάρα κατάστασης" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Εμφάνιση όλων των τραγουδιών" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Εμφάνιση όλλων των τραγουδιών" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Εμφάνιση του εξώφυλλου στην βιβλιοθήκη" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Εμφάνιση διαχωριστών" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Εμφάνισε σε πλήρες μέγεθος..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Εμφάνιση ομάδων με συνολικό αποτέλεσμα αναζήτησης" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Εμφάνιση στον περιηγητή αρχείων..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Εμφάνιση στην βιβλιοθήκη" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Εμφάνιση στους διάφορους καλλιτέχνες" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Εμφάνιση moodbar" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Εμφάνιση μόνο διπλότυπων" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Εμφάνιση μόνο μη επισημασμένων" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Εμφάνιση τραγούδιου που παίζει στη σελίδα σας" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Εμφάνιση προτάσεις αναζήτησης" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Εμφάνιση του κουμπιού \"αγάπη\"" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Εμφάνισε του κουμπιού scrobble στο κυρίως παράθυρο" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Εμφάνιση εικονιδίου συστήματος" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Εμφάνιση πηγών που είναι ενεργοποιημένες και απενεργοποιημένες" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Εμφάνιση/Απόκρυψη" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Ανακάτεμα" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Ανακάτεμα άλμπουμ" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Ανακάτεμα όλων" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Ανακάτεμα λίστας" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Ανακάτεμα των κομματιών σε αυτό το άλμπουμ" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Είσοδος" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Αποσύνδεση" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Γίνεται είσοδος..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Παρόμοιοι καλλιτέχνες" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Μέγεθος" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Μέγεθος:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Παράλειψη προς τα πίσω στη λίστα" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Μετρητής παραλήψεων" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Παράλειψη προς τα μπροστά στη λίστα" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Παράκαμψη επιλεγμένων κομματιών" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Παράκαμψη κομματιού" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Μικρό εξώφυλλο άλμπουμ" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Μικρή πλευρική μπάρα" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Έξυπνη λίστα αναπαραγωγής" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Έξυπνες λίστες αναπαραγωγής" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Απαλή" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Απαλή Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Πληρ. τραγουδιού" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Πληρ. τραγουδιού" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Συγνώμη" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Ταξινόμηση κατά γένος (αλφαβητικά)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Ταξινόμηση κατά γένος (κατά δημοτικότητα)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Ταξινόμηση κατά όνομα σταθμού" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Ταξινόμηση τραγουδιών κατά" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Ταξινόμηση" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Πηγή" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Πηγές" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Σφάλμα εισόδου στο Spotify" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "Spotify λίστα αναπαραγωγής" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Πρόσθετο Spotify" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Το πρόσθετο του Spotify μη εγκατεστημένο" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "URL Spotify τραγουδιού" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Κανονικό" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Με αστέρι" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Έναρξη αντιγραφής" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Εκκίνηση της λίστας αναπαραγωγής που παίζει τώρα" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Εκκίνηση επανακωδικοποίησης" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Ξεκίνα να γράφεις κάτι στο κουτί εύρεσης παραπάνω για να γεμίσει αυτή η λίστα εύρεσης αποτελεσμάτων" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Εκκίνηση %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Εκκίνηση..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Σταμάτημα" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Στοπ μετά" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Σταμάτημα μετά από κάθε κομμάτι" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Σταμάτημα μετά από κάθε κομμάτι" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Σταμάτημα μετά από αυτό το κομμάτι" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Διακοπή αναπαραγωγής" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Παύση αναπαραγωγής μετά το τρέχον κομμάτι" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Διακοπή αναπαραγωγής μετά από διαδρομή: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Σταματημένο" #: core/song.cpp:431 msgid "Stream" msgstr "Stream" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Η ροή από έναν εξυπηρετητή Subsonic απαιτεί μία έγκυρη άδεια μετά την περίοδο δοκιμής των 30 ημερών." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Συνδρομή ροής" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Συνδομητές" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Επιτυχία!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "Επιτυχία εγγραφής του %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Προτεινόμενες ετικέτες" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Σύνοψη" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Υπέρ υψηλή (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Υπέρ υψηλή (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Υποστηριζόμενες μορφές" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Συγχρονισμός των στατιστικών σε αρχεία τώρα" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Συγχρονισμός εισερχομένων του Spotify" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Συγχρονισμός λίστας του Spotify" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Συγχρονισμός κομματιών επισημασμένων με αστέρι του Spotify" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Χρώματα συστήματος" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Καρτέλες στην κορυφή" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Μεταφορτωτής ετικετών" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Ρυθμός bit στόχου" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Επιλογές κειμένου" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Ευχαριστίες σε" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Η εντολή \"%1\" δεν μπόρεσε να ξεκινήσει" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Το εξώφυλλο του άλμπουμ του τραγουδιού που παίζει" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "Ο κατάλογος %1 δεν είναι έγκυρος" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "Η δεύτερη τιμή πρέπει να είναι μεγαλύτερη από την πρώτη!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Η διεύθυνση που ζητήσατε δεν υπάρχει!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Η διεύθυνση που ζητήσατε δεν είναι εικόνα!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Η δοκιμαστική περίοδος του Subsonic τελείωσε. Παρακαλώ κάντε μια δωρεά για να λάβετε ένα κλειδί άδειας. Δείτε στο subsonic.org για λεπτομέρειες." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Η έκδοση του Clementine που μόλις ενημερώθηκε απαιτεί πλήρη επανασάρωση της βιβλιοθήκης λόγο της παρακάτω νέας λειτουργίας:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Δεν υπάρχουν πλέον τραγούδια σε αυτό το άλμπουμ" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Πρόβλημα επικοινωνίας με το gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Υπήρξε κάποιο σφάλμα κατά την μεταφορά των μετα-δεδομένων από το Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Πρόβλημα κατά την ανάλυση της απάντησης από το iTunes" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Υπήρξαν προβλήματα κατά την αντιγραφή κάποιων τραγουδιών. Τα ακόλουθα αρχεία δεν μπόρεσαν να αντιγραφούν:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Υπήρξαν προβλήματα κατά την διαγραφή κάποιων τραγουδιών. Τα ακόλουθα αρχεία δεν μπόρεσαν να διαγραφούν:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Αυτά τα αρχεία θα διαγραφούν από την συσκευή, θέλετε σίγουρα να συνεχίσετε;" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Αυτά τα αρχεία θα διαγραφούν για πάντα από τον δίσκο, θέλετε σίγουρα να συνεχίσετε;" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Οι φάκελοι αυτοί θα σαρωθούν για μουσικά αρχεία για την βιβλιοθήκη σας" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Αυτές οι ρυθμίσεις χρησιμοποιούνται στον διάλογο \"Επανακωδικοποίηση Μουσικής\" όταν γίνεται μετατροπή της μουσικής πριν την αντιγραφή της σε μια συσκευή." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Τρίτο επίπεδο" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Αυτή η ενέργεια θα δημιουργήσει μία βάση δεδομένων μεγέθους έως 150 MB.\nΘέλετε να συνεχίσετε;" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Αυτό το άλμπουμ δεν είναι διαθέσιμο στην ζητούμενη μορφή" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Αυτό μπορεί να αλλάξει αργότερα με τις προτιμήσεις" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Η συσκευή αυτή πρέπει να συνδεθεί και να ενεργοποιηθεί πριν ο Clementine μπορέσει να δει τι μορφές υποστηρίζει." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Η συσκευή αυτή υποστηρίζει τις ακόλουθες μορφές:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Η συσκευή αυτή δεν θα λειτουργήσει σωστά" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Αυτή είναι μία συσκευή MTP, αλλά φτιάξατε τον Clementine χωρίς υποστήριξη της libmtp." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Αυτό είναι iPod, αλλά φτιάξατε τον Clementine χωρίς υποστήριξη της libgpod." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Αυτή είναι η πρώτη φορά που συνδέετε αυτή την συσκευή. Ο Clementine θα σαρώσει την συσκευή για να βρει αρχεία μουσικής. Αυτό ίσως διαρκέσει λίγο παραπάνω." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Η επιλογή αυτή μπορεί να αλλάξει από τις προτιμήσεις \"Συμπεριφορά\"" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Η ροή (stream) αυτή είναι μόνο για συνδρομητές" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Αυτού του τύπου η συσκευή δεν υποστηρίζετε %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Τίτλος" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Σήμερα" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Εναλλαγή Όμορφου OSD" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Εναλλαγή πλήρης οθόνης" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Εναλλαγή της κατάστασης της λίστας αναμονής" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Εναλλαγή του scrobbling" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Εναλλαγή ορατότητας της όμορφης «απεικόνισης στην οθόνη»" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Αύριο" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Πάρα πολλές ανακατευθύνσεις" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Κορυφαία κομμάτια" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Συνολικά άλμπουμ:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Συνολικά bytes που μεταφέρθηκαν" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Συνολικές αιτήσεις δικτύου που πραγματοποιήθηκαν" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Κομμάτι" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Κομμάτια" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Επανακωδικοποίηση Μουσικής" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Αρχείο καταγραφής επανακωδικοποίησης" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Κωδικοποίηση" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Επανακωδικοποίηση %1 αρχείων χρησιμοποιώντας %2 νήματα" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Επιλογές επανακωδικοποίησης" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Απενεργοποίηση" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Άκρα ευρεία ζώνη (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Αδυναμία σύνδεσης" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Αδυναμία \"κατεβάσματος\" του %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Άγνωστο" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Άγνωστος τύπος περιεχομένου" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Άγνωστο σφάλμα" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Αφαίρεση εξώφυλλου" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Καταργήση της παράλειψης επιλεγμένων κομματιών" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Καταργήση της παράλειψης τροχιάς" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Ακύρωση συνδρομής" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Προσεχής Συναυλίες" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Ενημέρωση" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Ενημέρωση όλων των podcasts" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Ενημέρωση φακέλων βιβλιοθήκης που άλλαξαν" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Ενημέρωση της βιβλιοθήκης κατά την εκκίνηση του Clementine" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Ενημέρωσε αυτό το podcast" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Ενημέρωση" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Ενημέρωση %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Ενημέρωση %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Ενημέρωση λίστας" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Χρήση" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Χρήση ετικέτας Άλμπουμ Καλλιτέχνη όταν είναι διαθέσιμα" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Χρήση πλήκτρων συντόμευσης του Gnome" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Χρήση Ψυχεδελικών Χρψμάτων " #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Χρήση των μετα δεδομένων Replay Gain αν είναι διαθέσημα" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Χρησιμοποιήστε SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Χρήση χειριστηρίου Wii" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Χρήση τροποποιημένου χρώματος" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Χρήση προσαρμοσμένου μηνύματος για τις ειδοποιήσεις" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Χρήση Τηλεχειριστηρίου" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Χρήση πιστοποίησης" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Χρήση μηχανής διαχείρισης ρυθμού μετάδοσης" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Χρήση Δυναμικής λίστας" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Χρήση των ειδοποιήσεων για την αναφορά της κατάστασης του χειριστηρίου Wii" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Χρήση προσωρινής διαμόρφωση θορύβου" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Χρήση προκαθορισμένου του συστήματος" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Χρήση χρώματος του συστήματος" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Χρήση ρυθμίσεων του διαμεσολαβητή του συστήματος" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Χρήση κανονικοποίησης ήχου" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Σε χρήση" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Διασύνδεση χρήστη" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Όνομα χρήστη" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Η χρήση του μενού για την προσθήκη ενός τραγουδιού θα..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Μεταβαλλόμενος ρυθμός bit" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Διάφοροι καλλιτέχνες" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Έκδοση %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Προβολή" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Τρόπος λειτουργίας οπτικών εφέ" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Οπτικά εφέ" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Ρυθμίσεις οπτικών εφέ" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Ανίχνευση δραστηριότητας φωνής" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Ένταση %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Τοίχος" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Προειδοποίηση κατά το κλείσιμο μίας λίστας αναπαραγωγής" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Website" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Εβδομάδες" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Όταν ξεκινά το Clementine" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Όταν ο Clementine ψάχνει για \"τέχνη του άλμπουμ\" (εικόνες κ.τ.λ.) θα ψάξει πρώτα για αρχεία εικόνων που περιέχουν μία από αυτές τις λέξεις. \nΑν δεν ταιριάζει κάποιο θα χρησιμοποιηθεί η μεγαλύτερη εικόνα που υπάρχει μέσα στον φάκελο." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "Κατά την αποθήκευση μιας λίστας αναπαραγωγής, διαδρομές αρχείων θα πρέπει να είναι" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Όταν η λίστα είναι κενή..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Γιατί να μην δοκιμάσετε..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Ευρεία ζώνη (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Χειριστήριο Wii %1: ενεργοποιήθηκε" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Χειριστήριο Wii %1: συνδέθηκε" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Χειριστήριο Wii %1: μπαταρια σε κρίσιμο σημείο (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Χειριστήριο Wii %1: απενεργοποιήθηκε" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Χειριστήριο Wii %1: αποσυνδέθηκε" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Χειριστήριο Wii %1: χαμηλή μπαταρία (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Χωρίς εξώφυλλο:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Θα θέλατε να μετακινήσετε και τα άλλα τραγούδια σε αυτό το άλμπουμ στο Διάφοροι Καλλιτέχνες;" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Θέλετε να εκτελέσετε μία πλήρη επανασάρωση αμέσως τώρα;" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Εγγραφή όλων των στατιστικών των τραγουδιών στα αρχεία τραγουδιών" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Εγγραφή μεταδεδομένων" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Λάθος όνομα χρήστη ή συνθηματικό" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Έτος" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Έτος - Άλμπουμ" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Έτη" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Χθες" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Πρόκειτε να \"κατεβάσετε\" τα παρακάτω άλμπουμ" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Πρόκειται να διαγράψετε %1 λίστες, είστε σίγουροι;" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Η λίστα αυτή θα αφαιρεθεί, (η πράξη αυτή δεν μπορεί να αναιρεθεί). Είστε σίγουροι πως θέλετε να συνεχίσετε;" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Δεν έχετε συνδεθεί." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Έχετε συνδεθεί ως %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Έχετε συνδεθεί." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Μπορείς να αλλάξεις τον τρόπο οργάνωσης των τραγουδιών στην βιβλιοθήκη." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Μπορείτε να ακούσετε μουσική με έναν δωρεάν λογαριασμό, αλλά τα Premium μέλη μπορούν να ακούσουν ροές καλύτερης ποιότητας χωρίς διαφημίσεις." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Μπορείτε να ακούσετε τραγούδια δωρεάν από το Magnatune χωρίς λογαριασμό. Η αγορά μιας συνδρομής αφαιρεί το μήνυμα από το τέλος κάθε κομματιού." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Μπορείτε να ακούτε τις ροές παρασκηνίου ταυτόχρονα με άλλη μουσική." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Μπορείτε να χρησιμοποιήσετε χειριστήριο Wii σαν τηλεχειριστήριο για τον Clementine. Δείτε την σχετική σελίδα στο wiki του Clementine για περισσότερες πληροφορίες.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Δεν έχετε Premium λογαριασμό στο Spotify." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Δεν έχετε κάποια ενεργή συνδρομή" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "Δεν χρειάζεται να συνδεθείτε για να αναζητήσετε και για ακούσετε μουσική στο SoundCloud. Ωστόσο, θα πρέπει για συνδεθείτε για αποκτήσετε πρόσβαση σε λιστών αναπαραγωγής σας και ροή σας." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Έχετε εξέλθει από το Spotify, παρακαλώ εισάγετε πάλι τον κωδικό σας στις ρυθμίσεις." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Έχετε εξέλθει από το Spotify, παρακαλώ εισάγετε πάλι τον κωδικό σας." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Λατρεύεις αυτό το κομμάτι" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "Θα πρέπει για την έναρξη System Preferences και να επιτρέψει Clementine για \" τον έλεγχο του υπολογιστή σας \" για χρησιμοποιήσει την παγκόσμια συντομεύσεις σε Clementine." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Πρέπει να ξεκινήσετε πάλι τον Clementine αν αλλάξετε την γλώσσα." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Η IP διεύθυνση σας:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Τα στοιχεία σας στο Last.fm ήταν εσφαλμένα" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Τα διαπιστευτήρια σας του Magnatune δεν ήταν σωστά" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Η βιβλιοθήκη σας είναι άδεια!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Οι ροές ραδιοφώνου σας" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Τα scrobbles σου: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Το σύστημα σας δεν έχει υποστήριξη OpenGL, τα οπτικά εφέ δεν είναι διαθέσιμα." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Το όνομα χρήστη ή το συνθηματικό ήταν λανθασμένο." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Ω-Α" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "προσθήκη %n τραγουδιών" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "μετά" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "πριν" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "και" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "αυτόματα" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "πριν" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "μεταξύ" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "το μεγαλύτερο πρώτα" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "περιέχει" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "ανενεργο" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "δίσκος %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "δεν περιέχει" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "τελειώνει με" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "ισούται" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "κατάλογος gpodder.net" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "μεγαλύτερο από" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "iPods και συσκευές USB σήμερα δεν λειτουργούν στα Windows. Συγγνώμη!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "εντός των τελευταίων" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "λιγότερο από" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "το μακρύτερο πρώτα" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "μετακίνηση %n τραγουδιών" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "το νεότερο πρώτα" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "άνισα" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "όχι εντός των τελευταίων" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "όχι στο" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "το παλαιότερο πρώτα" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "σε" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "επιλογές" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "ή σάρωση του QR κώδικα!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "πιέστε enter" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "αφαίρεση %n τραγουδιών" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "το ποιο σύντομο πρώτα" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "ανακάτεμα τραγουδιών" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "το μικρότερο πρώτα" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "ταξινόμηση τραγουδιών" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "αρχίζει με" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "διακοπή" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "κομμάτι %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/en.po000066400000000000000000001325331260417502300236500ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # David Sansome , 2010. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-04-09 10:24+0000\n" "PO-Revision-Date: 2010-12-25 04:49+0000\n" "Last-Translator: David Sansome \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" "X-Launchpad-Export-Date: 2011-06-27 04:53+0000\n" "X-Generator: Launchpad (build 13168)\n" msgid " kbps" msgstr "" msgid " ms" msgstr "" msgid " pt" msgstr "" msgid " seconds" msgstr "" msgid " songs" msgstr "" #, qt-format msgid "%1 albums" msgstr "" #, qt-format msgid "%1 days" msgstr "" #, qt-format msgid "%1 days ago" msgstr "" #, qt-format msgid "%1 playlists (%2)" msgstr "" #, qt-format msgid "%1 selected of" msgstr "" #, qt-format msgid "%1 song" msgstr "" #, qt-format msgid "%1 songs" msgstr "" #, qt-format msgid "%1 songs found" msgstr "" #, qt-format msgid "%1 songs found (showing %2)" msgstr "" #, qt-format msgid "%1 tracks" msgstr "" #, qt-format msgid "%1 transferred" msgstr "" #, qt-format msgid "%1: Wiimotedev module" msgstr "" #, qt-format msgid "%L1 other listeners" msgstr "" #, qt-format msgid "%L1 total plays" msgstr "" #, c-format msgid "%n failed" msgstr "" #, c-format msgid "%n finished" msgstr "" #, c-format msgid "%n remaining" msgstr "" msgid "&Align text" msgstr "" msgid "&Center" msgstr "" msgid "&Custom" msgstr "" msgid "&Help" msgstr "" #, qt-format msgid "&Hide %1" msgstr "" msgid "&Hide..." msgstr "" msgid "&Left" msgstr "" msgid "&None" msgstr "" msgid "&Quit" msgstr "" msgid "&Right" msgstr "" msgid "&Stretch columns to fit window" msgstr "" msgid "&Tools" msgstr "" msgid "(different across multiple songs)" msgstr "" msgid "..." msgstr "" msgid "...and all the Amarok contributors" msgstr "" msgid "0:00:00" msgstr "" msgid "1 day" msgstr "" msgid "1 track" msgstr "" msgid "128K MP3" msgstr "" msgid "128k MP3" msgstr "" msgid "50 random tracks" msgstr "" msgid "Upgrade to Premium now" msgstr "" msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, " "that section will be hidden if the token is empty.

" msgstr "" msgid "A Grooveshark Anywhere account is required." msgstr "" msgid "A Spotify Premium account is required." msgstr "" msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "" msgid "A song will be included in the playlist if it matches these conditions." msgstr "" msgid "A-Z" msgstr "" msgid "AAC" msgstr "" msgid "AAC 128k (Premium only)" msgstr "" msgid "AAC 32k" msgstr "" msgid "AAC 64k (Premium only)" msgstr "" msgid "AIFF" msgstr "" msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #, qt-format msgid "About %1" msgstr "" msgid "About Clementine..." msgstr "" msgid "About Qt..." msgstr "" msgid "Account details" msgstr "" msgid "Account details (Premium)" msgstr "" msgid "Action" msgstr "" msgid "Active/deactive Wiiremote" msgstr "" msgid "Add Stream" msgstr "" msgid "Add a new line if supported by the notification type" msgstr "" msgid "Add action" msgstr "" msgid "Add and play now" msgstr "" msgid "Add another stream..." msgstr "" msgid "Add directory..." msgstr "" msgid "Add file..." msgstr "" msgid "Add files to transcode" msgstr "" msgid "Add folder" msgstr "" msgid "Add folder..." msgstr "" msgid "Add media" msgstr "" msgid "Add new folder..." msgstr "" msgid "Add search term" msgstr "" msgid "Add song album tag" msgstr "" msgid "Add song albumartist tag" msgstr "" msgid "Add song artist tag" msgstr "" msgid "Add song composer tag" msgstr "" msgid "Add song disc tag" msgstr "" msgid "Add song genre tag" msgstr "" msgid "Add song length tag" msgstr "" msgid "Add song play count" msgstr "" msgid "Add song skip count" msgstr "" msgid "Add song title tag" msgstr "" msgid "Add song track tag" msgstr "" msgid "Add song year tag" msgstr "" msgid "Add stream..." msgstr "" msgid "Add to another playlist" msgstr "" msgid "Add to playlist" msgstr "" msgid "Add to the queue" msgstr "" msgid "Add wiimotedev action" msgstr "" msgid "Add..." msgstr "" msgid "Added this month" msgstr "" msgid "Added this week" msgstr "" msgid "Added this year" msgstr "" msgid "Added today" msgstr "" msgid "Added within three months" msgstr "" msgid "Advanced grouping..." msgstr "" msgid "After copying..." msgstr "" msgid "Album" msgstr "" msgid "Album (ideal loudness for all tracks)" msgstr "" msgid "Album artist" msgstr "" msgid "Album info on jamendo.com..." msgstr "" msgid "Albumartist" msgstr "" msgid "Albums with covers" msgstr "" msgid "Albums without covers" msgstr "" msgid "All Files (*)" msgstr "" msgid "All Glory to the Hypnotoad!" msgstr "" msgid "All albums" msgstr "" msgid "All artists" msgstr "" msgid "All files (*)" msgstr "" #, qt-format msgid "All playlists (%1)" msgstr "" msgid "All the translators" msgstr "" msgid "All tracks" msgstr "" msgid "Allow mid/side encoding" msgstr "" msgid "Alongside the originals" msgstr "" msgid "Always hide the main window" msgstr "" msgid "Always show the main window" msgstr "" msgid "Always start playing" msgstr "" msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" msgid "An error occurred copying the iTunes database from the device" msgstr "" msgid "An error occurred copying the iTunes database onto the device" msgstr "" msgid "An error occurred loading the iTunes database" msgstr "" #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #, qt-format msgid "An unknown last.fm error occurred: %1" msgstr "" msgid "And:" msgstr "" msgid "Appearance" msgstr "" msgid "Append files/URLs to the playlist" msgstr "" msgid "Append to current playlist" msgstr "" msgid "Append to the playlist" msgstr "" msgid "Apply compression to prevent clipping" msgstr "" #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" msgid "Are you sure you want to reset this song's statistics?" msgstr "" msgid "Artist" msgstr "" msgid "Artist info" msgstr "" msgid "Artist radio" msgstr "" msgid "Artist tags" msgstr "" msgid "Artist's initial" msgstr "" msgid "Audio format" msgstr "" msgid "Audio type" msgstr "" msgid "Authenticating..." msgstr "" msgid "Authentication failed" msgstr "" msgid "Authors" msgstr "" msgid "Auto" msgstr "" msgid "Automatic updating" msgstr "" msgid "Automatically open single categories in the library tree" msgstr "" msgid "Available" msgstr "" msgid "Average bitrate" msgstr "" msgid "Average image size" msgstr "" msgid "BPM" msgstr "" msgid "Background Streams" msgstr "" msgid "Background color" msgstr "" msgid "Background opacity" msgstr "" msgid "Ban" msgstr "" msgid "Bar analyzer" msgstr "" msgid "Basic Blue" msgstr "" msgid "Behavior" msgstr "" msgid "Best" msgstr "" #, qt-format msgid "Biography from %1" msgstr "" msgid "Bit rate" msgstr "" msgid "Bitrate" msgstr "" msgid "Block analyzer" msgstr "" msgid "Block type" msgstr "" msgid "Bluetooth MAC Address" msgstr "" msgid "Body" msgstr "" msgid "Boom analyzer" msgstr "" msgid "Browse..." msgstr "" msgid "Buffer duration" msgstr "" msgid "Buttons" msgstr "" msgid "CDDA" msgstr "" msgid "CUE sheet support" msgstr "" msgid "Cancel" msgstr "" msgid "Change cover art" msgstr "" msgid "Change font size..." msgstr "" msgid "Change repeat mode" msgstr "" msgid "Change shortcut..." msgstr "" msgid "Change shuffle mode" msgstr "" msgid "Change the language" msgstr "" msgid "Check for updates..." msgstr "" msgid "Choose a name for your smart playlist" msgstr "" msgid "Choose automatically" msgstr "" msgid "Choose color..." msgstr "" msgid "Choose font..." msgstr "" msgid "Choose from the list" msgstr "" msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" msgid "Choose manual cover" msgstr "" msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" msgid "Classical" msgstr "" msgid "Clear" msgstr "" msgid "Clear playlist" msgstr "" msgid "Clementine" msgstr "" msgid "Clementine Error" msgstr "" msgid "Clementine Orange" msgstr "" msgid "Clementine Visualization" msgstr "" msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" msgid "" "Clementine can be controlled remotely by an Android phone. To enable this " "feature log in with the same Google account that is configured on your phone." msgstr "" msgid "Clementine can show a message when the track changes." msgstr "" msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" msgid "" "Clementine couldn't fetch your subscription status since there are problems " "with your connection. Played tracks will be cached and sent later to Last.fm." msgstr "" msgid "Clementine image viewer" msgstr "" msgid "Clementine was unable to find results for this file" msgstr "" msgid "Click here to add some music" msgstr "" msgid "Click to toggle between remaining time and total time" msgstr "" msgid "Close" msgstr "" msgid "Close visualization" msgstr "" msgid "Closing this window will cancel the download." msgstr "" msgid "Closing this window will stop searching for album covers." msgstr "" msgid "Club" msgstr "" msgid "Color" msgstr "" msgid "Comma separated list of class:level, level is 0-3" msgstr "" msgid "Comment" msgstr "" msgid "Complete tags automatically" msgstr "" msgid "Complete tags automatically..." msgstr "" msgid "Composer" msgstr "" msgid "Configure Grooveshark..." msgstr "" msgid "Configure Last.fm..." msgstr "" msgid "Configure Magnatune..." msgstr "" msgid "Configure Shortcuts" msgstr "" msgid "Configure Spotify..." msgstr "" msgid "Configure library..." msgstr "" msgid "Configure..." msgstr "" msgid "Connect Wii Remotes using active/deactive action" msgstr "" msgid "Connect device" msgstr "" msgid "Connecting to Spotify" msgstr "" msgid "Constant bitrate" msgstr "" msgid "Convert all music" msgstr "" msgid "Convert any music that the device can't play" msgstr "" msgid "Copy to device..." msgstr "" msgid "Copy to library..." msgstr "" msgid "Copying iPod database" msgstr "" #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" msgid "Couldn't load the last.fm radio station" msgstr "" #, qt-format msgid "Couldn't open output file %1" msgstr "" msgid "Cover Manager" msgstr "" msgid "Cover art from embedded image" msgstr "" #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" msgid "Cover art manually unset" msgstr "" msgid "Cover art not set" msgstr "" #, qt-format msgid "Cover art set from %1" msgstr "" #, qt-format msgid "Covers from %1" msgstr "" msgid "Cross-fade when changing tracks automatically" msgstr "" msgid "Cross-fade when changing tracks manually" msgstr "" msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" msgid "Ctrl+B" msgstr "Ctrl+B" msgid "Ctrl+Down" msgstr "Ctrl+Down" msgid "Ctrl+E" msgstr "Ctrl+E" msgid "Ctrl+H" msgstr "Ctrl+H" msgid "Ctrl+J" msgstr "Ctrl+J" msgid "Ctrl+K" msgstr "Ctrl+K" msgid "Ctrl+L" msgstr "Ctrl+L" msgid "Ctrl+M" msgstr "Ctrl+M" msgid "Ctrl+N" msgstr "Ctrl+N" msgid "Ctrl+O" msgstr "Ctrl+O" msgid "Ctrl+P" msgstr "Ctrl+P" msgid "Ctrl+Q" msgstr "Ctrl+Q" msgid "Ctrl+S" msgstr "Ctrl+S" msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" msgid "Ctrl+T" msgstr "Ctrl+T" msgid "Ctrl+Up" msgstr "Ctrl+Up" msgid "Custom" msgstr "" msgid "Custom message settings" msgstr "" msgid "Custom radio" msgstr "" msgid "Custom..." msgstr "" msgid "DBus path" msgstr "" msgid "Dance" msgstr "" msgid "Date created" msgstr "" msgid "Date modified" msgstr "" msgid "Days" msgstr "" msgid "De&fault" msgstr "" msgid "Decrease the volume by 4%" msgstr "" msgid "Decrease volume" msgstr "" msgid "Defaults" msgstr "" msgid "Delay between visualizations" msgstr "" msgid "Delete files" msgstr "" msgid "Delete from device..." msgstr "" msgid "Delete from disk..." msgstr "" msgid "Delete preset" msgstr "" msgid "Delete smart playlist" msgstr "" msgid "Delete the original files" msgstr "" msgid "Deleting files" msgstr "" msgid "Dequeue selected tracks" msgstr "" msgid "Dequeue track" msgstr "" msgid "Destination" msgstr "" msgid "Details..." msgstr "" msgid "Device" msgstr "" msgid "Device Properties" msgstr "" msgid "Device name" msgstr "" msgid "Device properties..." msgstr "" msgid "Devices" msgstr "" msgid "Dialog" msgstr "" msgid "Did you mean" msgstr "" msgid "Digitally Imported" msgstr "" msgid "Digitally Imported password" msgstr "" msgid "Digitally Imported username" msgstr "" msgid "Direct internet connection" msgstr "" msgid "Directory" msgstr "" msgid "Disable duration" msgstr "" msgid "Disabled" msgstr "" msgid "Disc" msgstr "" msgid "Discontinuous transmission" msgstr "" msgid "Display options" msgstr "" msgid "Display the global search popup" msgstr "" msgid "Display the on-screen-display" msgstr "" msgid "Do a full library rescan" msgstr "" msgid "Do not convert any music" msgstr "" msgid "Don't repeat" msgstr "" msgid "Don't show in various artists" msgstr "" msgid "Don't shuffle" msgstr "" msgid "Don't stop!" msgstr "" msgid "Double click to open" msgstr "" msgid "Double clicking a song will..." msgstr "" msgid "Download directory" msgstr "" msgid "Download membership" msgstr "" msgid "Download this album" msgstr "" msgid "Download this album..." msgstr "" msgid "Download..." msgstr "" msgid "Downloading Icecast directory" msgstr "" msgid "Downloading Jamendo catalogue" msgstr "" msgid "Downloading Magnatune catalogue" msgstr "" msgid "Downloading Spotify plugin" msgstr "" msgid "Downloading metadata" msgstr "" msgid "Drag to reposition" msgstr "" msgid "Drive letter" msgstr "" msgid "Dynamic mode is on" msgstr "" msgid "Dynamic random mix" msgstr "" msgid "Edit smart playlist..." msgstr "" #, qt-format msgid "Edit tag \"%1\"..." msgstr "" msgid "Edit tag..." msgstr "" msgid "Edit tags" msgstr "" msgid "Edit track information" msgstr "" msgid "Edit track information..." msgstr "" msgid "Edit tracks information..." msgstr "Edit track information..." msgid "Edit..." msgstr "" msgid "Enable Wii Remote support" msgstr "" msgid "Enable equalizer" msgstr "" msgid "Enable playlist background image" msgstr "" msgid "Enable shortcuts only when Clementine is focused" msgstr "" msgid "Enable/disable Last.fm scrobbling" msgstr "" msgid "Encoding complexity" msgstr "" msgid "Encoding engine quality" msgstr "" msgid "Encoding mode" msgstr "" msgid "Enter a URL to download a cover from the Internet:" msgstr "" msgid "Enter a new name for this playlist" msgstr "" msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "" msgid "Enter search terms here" msgstr "" msgid "Enter the URL of an internet radio stream:" msgstr "" msgid "Entire collection" msgstr "" msgid "Equalizer" msgstr "" msgid "Equivalent to --log-levels *:1" msgstr "" msgid "Equivalent to --log-levels *:3" msgstr "" msgid "Error" msgstr "" msgid "Error connecting MTP device" msgstr "" msgid "Error copying songs" msgstr "" msgid "Error deleting songs" msgstr "" msgid "Error downloading Spotify plugin" msgstr "" #, qt-format msgid "Error loading %1" msgstr "" msgid "Error loading di.fm playlist" msgstr "" #, qt-format msgid "Error processing %1: %2" msgstr "" msgid "Error while loading audio CD" msgstr "" msgid "Ever played" msgstr "" msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" msgid "&Extras" msgstr "" msgid "F1" msgstr "" msgid "F2" msgstr "" msgid "F5" msgstr "" msgid "F6" msgstr "" msgid "F7" msgstr "" msgid "F8" msgstr "" msgid "FLAC" msgstr "" msgid "Fade out when stopping a track" msgstr "" msgid "Fading" msgstr "" msgid "Fading duration" msgstr "" msgid "Fast" msgstr "" msgid "Favourite tracks" msgstr "" msgid "Fetch Missing Covers" msgstr "" msgid "Fetch automatically" msgstr "" msgid "Fetch completed" msgstr "" msgid "Fetching cover error" msgstr "" msgid "File extension" msgstr "" msgid "File formats" msgstr "" msgid "File name" msgstr "" msgid "File name (without path)" msgstr "" msgid "File size" msgstr "" msgid "File type" msgstr "" msgid "Filename" msgstr "" msgid "Files" msgstr "" msgid "Files to transcode" msgstr "" msgid "Filesystem name" msgstr "" msgid "Filesystem serial number" msgstr "" msgid "Filesystem type" msgstr "" msgid "Find songs in your library that match the criteria you specify." msgstr "" msgid "Fingerprinting song" msgstr "" msgid "Finish" msgstr "" msgid "First level" msgstr "" msgid "Flac" msgstr "" msgid "Font size" msgstr "" msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" msgid "Force mono encoding" msgstr "" msgid "Forget device" msgstr "" msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "" msgid "Form" msgstr "" msgid "Format" msgstr "" msgid "Framerate" msgstr "" msgid "Frames per buffer" msgstr "" msgid "Friends" msgstr "" msgid "Full Bass" msgstr "" msgid "Full Bass + Treble" msgstr "" msgid "Full Treble" msgstr "" msgid "GStreamer audio engine" msgstr "" msgid "General settings" msgstr "" msgid "Genre" msgstr "" msgid "Getting channels" msgstr "" msgid "Getting streams" msgstr "" msgid "Give it a name:" msgstr "" msgid "Global search" msgstr "" msgid "Go to next playlist tab" msgstr "" msgid "Go to previous playlist tab" msgstr "" msgid "Google password" msgstr "" msgid "Google username" msgstr "" #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" msgid "Grey out non existent songs in my playlists" msgstr "" msgid "Grooveshark" msgstr "" msgid "Grooveshark login error" msgstr "" msgid "Group Library by..." msgstr "" msgid "Group by" msgstr "" msgid "Group by Album" msgstr "" msgid "Group by Artist" msgstr "" msgid "Group by Artist/Album" msgstr "" msgid "Group by Artist/Year - Album" msgstr "" msgid "Group by Genre/Album" msgstr "" msgid "Group by Genre/Artist/Album" msgstr "" msgid "HTTP proxy" msgstr "" msgid "Hardware information" msgstr "" msgid "Hardware information is only available while the device is connected." msgstr "" msgid "High" msgstr "" #, qt-format msgid "High (%1 fps)" msgstr "" msgid "High (1024x1024)" msgstr "" msgid "High (35 fps)" msgstr "" msgid "Hours" msgstr "" msgid "Hypnotoad" msgstr "" msgid "I don't have a Magnatune account" msgstr "" msgid "Icon" msgstr "" msgid "Icons on top" msgstr "" msgid "Identifying song" msgstr "" msgid "" "If you continue, this device will work slowly and songs copied to it may not " "work." msgstr "" msgid "" "If you use the remote on more than one computer, this name will help you " "choose which one to connect to on your phone." msgstr "" msgid "Ignore \"The\" in artist names" msgstr "" msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" msgid "Inbox" msgstr "" msgid "Include album art in the notification" msgstr "" msgid "Include all songs" msgstr "" msgid "Increase the volume by 4%" msgstr "" msgid "Increase volume" msgstr "" msgid "Information" msgstr "" msgid "Insert..." msgstr "" msgid "Installed" msgstr "" msgid "Internet" msgstr "" msgid "Invalid API key" msgstr "" msgid "Invalid SKY.fm username or password" msgstr "" msgid "Invalid di.fm username or password" msgstr "" msgid "Invalid format" msgstr "" msgid "Invalid method" msgstr "" msgid "Invalid parameters" msgstr "" msgid "Invalid resource specified" msgstr "" msgid "Invalid service" msgstr "" msgid "Invalid session key" msgstr "" msgid "Invalid username and/or password" msgstr "" msgid "Jamendo" msgstr "" msgid "Jamendo Most Listened Tracks" msgstr "" msgid "Jamendo Top Tracks" msgstr "" msgid "Jamendo Top Tracks of the Month" msgstr "" msgid "Jamendo Top Tracks of the Week" msgstr "" msgid "Jamendo database" msgstr "" msgid "Jump to the currently playing track" msgstr "" #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" msgid "Keep running in the background when the window is closed" msgstr "" msgid "Keep the original files" msgstr "" msgid "Kittens" msgstr "" msgid "Language" msgstr "" msgid "Laptop/Headphones" msgstr "" msgid "Large Hall" msgstr "" msgid "Large album cover" msgstr "" msgid "Large sidebar" msgstr "" msgid "Last played" msgstr "" msgid "Last.fm" msgstr "" #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #, qt-format msgid "Last.fm Library - %1" msgstr "" #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "" #, qt-format msgid "Last.fm Radio Station - %1" msgstr "" #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "" #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "" msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" msgid "Last.fm password" msgstr "" msgid "Last.fm play counts" msgstr "" msgid "Last.fm tags" msgstr "" msgid "Last.fm username" msgstr "" msgid "Last.fm wiki" msgstr "" msgid "Least favourite tracks" msgstr "" msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" msgid "Length" msgstr "" msgid "Library" msgstr "" msgid "Library advanced grouping" msgstr "" msgid "Library rescan notice" msgstr "" msgid "Library search" msgstr "" msgid "Limits" msgstr "" msgid "Live" msgstr "" msgid "Load" msgstr "" msgid "Load cover from URL" msgstr "" msgid "Load cover from URL..." msgstr "" msgid "Load cover from disk..." msgstr "" msgid "Load playlist" msgstr "" msgid "Load playlist..." msgstr "" msgid "Loading Last.fm radio" msgstr "" msgid "Loading MTP device" msgstr "" msgid "Loading Windows Media device" msgstr "" msgid "Loading iPod database" msgstr "" msgid "Loading smart playlist" msgstr "" msgid "Loading songs" msgstr "" msgid "Loading stream" msgstr "" msgid "Loading tracks" msgstr "" msgid "Loading tracks info" msgstr "" msgid "Loading..." msgstr "" msgid "Loads files/URLs, replacing current playlist" msgstr "" msgid "Login" msgstr "" msgid "Long term prediction profile (LTP)" msgstr "" msgid "Love" msgstr "" #, qt-format msgid "Low (%1 fps)" msgstr "" msgid "Low (15 fps)" msgstr "" msgid "Low (256x256)" msgstr "" msgid "Low complexity profile (LC)" msgstr "" msgid "Lyrics" msgstr "" #, qt-format msgid "Lyrics from %1" msgstr "" msgid "MP3" msgstr "" msgid "MP3 256k (Premium only)" msgstr "" msgid "MP3 96k" msgstr "" msgid "MP4 AAC" msgstr "" msgid "MPC" msgstr "" msgid "Magnatune" msgstr "" msgid "Magnatune Download" msgstr "" msgid "Magnatune download finished" msgstr "" msgid "Main profile (MAIN)" msgstr "" msgid "Make playlist available offline" msgstr "" msgid "Malformed response" msgstr "" msgid "Manual proxy configuration" msgstr "" msgid "Manufacturer" msgstr "" msgid "Match every search term (AND)" msgstr "" msgid "Match one or more search terms (OR)" msgstr "" msgid "Maximum bitrate" msgstr "" #, qt-format msgid "Medium (%1 fps)" msgstr "" msgid "Medium (25 fps)" msgstr "" msgid "Medium (512x512)" msgstr "" msgid "Membership type" msgstr "" msgid "Minimum bitrate" msgstr "" msgid "Missing projectM presets" msgstr "" msgid "Model" msgstr "" msgid "Monitor the library for changes" msgstr "" msgid "Months" msgstr "" msgid "Most played" msgstr "" msgid "Mount point" msgstr "" msgid "Mount points" msgstr "" msgid "Move down" msgstr "" msgid "Move to library..." msgstr "" msgid "Move up" msgstr "" msgid "&Music" msgstr "" msgid "Music (*.mp3 *.ogg *.flac *.mpc *.m4a *.aac *.wma *.mp4 *.spx *.wav)" msgstr "" msgid "Music Library" msgstr "" msgid "Mute" msgstr "" msgid "My Last.fm Library" msgstr "" msgid "My Last.fm Mix Radio" msgstr "" msgid "My Last.fm Neighborhood" msgstr "" msgid "My Last.fm Recommended Radio" msgstr "" msgid "My Mix Radio" msgstr "" msgid "My Neighborhood" msgstr "" msgid "My Radio Station" msgstr "" msgid "My Recommendations" msgstr "" msgid "Name" msgstr "" msgid "Naming options" msgstr "" msgid "Narrow band (NB)" msgstr "" msgid "Neighbors" msgstr "" msgid "Network" msgstr "" msgid "Network Proxy" msgstr "" msgid "Never" msgstr "" msgid "Never played" msgstr "" msgid "Never start playing" msgstr "" msgid "New playlist" msgstr "" msgid "New smart playlist..." msgstr "" msgid "New songs" msgstr "" msgid "New tracks will be added automatically." msgstr "" msgid "Newest tracks" msgstr "" msgid "Next" msgstr "" msgid "Next track" msgstr "" msgid "No analyzer" msgstr "" msgid "No long blocks" msgstr "" msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" msgid "No short blocks" msgstr "" msgid "None" msgstr "" msgid "None of the selected songs were suitable for copying to a device" msgstr "" msgid "Normal block type" msgstr "" msgid "Not available while using a dynamic playlist" msgstr "" msgid "Not connected" msgstr "" msgid "Not enough content" msgstr "" msgid "Not enough fans" msgstr "" msgid "Not enough members" msgstr "" msgid "Not enough neighbors" msgstr "" msgid "Not installed" msgstr "" msgid "Not mounted - double click to mount" msgstr "" msgid "Notification type" msgstr "" msgid "Notifications" msgstr "" msgid "Now Playing" msgstr "" msgid "OSD Preview" msgstr "" msgid "Ogg Flac" msgstr "" msgid "Ogg Speex" msgstr "" msgid "Ogg Vorbis" msgstr "" msgid "Only show the first" msgstr "" #, qt-format msgid "Open %1 in browser" msgstr "" msgid "Open &audio CD..." msgstr "" msgid "Open device" msgstr "" msgid "Open dir.xiph.org in browser" msgstr "" msgid "Open in new playlist" msgstr "" msgid "Open jamendo.com in browser" msgstr "" msgid "Open magnatune.com in browser" msgstr "" msgid "Open media..." msgstr "" msgid "Open somafm.com in browser" msgstr "" msgid "Open..." msgstr "" msgid "Operation failed" msgstr "" msgid "Optimize for bitrate" msgstr "" msgid "Optimize for quality" msgstr "" msgid "Options..." msgstr "" msgid "Organise Files" msgstr "" msgid "Organise files..." msgstr "" msgid "Organising files" msgstr "" msgid "Original tags" msgstr "" msgid "Other options" msgstr "" msgid "Output device" msgstr "" msgid "Output options" msgstr "" msgid "Output plugin" msgstr "" msgid "Overwrite existing files" msgstr "" msgid "Parsing Jamendo catalogue" msgstr "" msgid "Party" msgstr "" msgid "Password" msgstr "" msgid "Password Protected" msgstr "" msgid "Pause" msgstr "" msgid "Pause playback" msgstr "" msgid "Paused" msgstr "" msgid "Plain sidebar" msgstr "" msgid "Play" msgstr "" msgid "Play Artist or Tag" msgstr "" msgid "Play artist radio..." msgstr "" msgid "Play count" msgstr "" msgid "Play custom radio..." msgstr "" msgid "Play from my Library" msgstr "" msgid "Play if stopped, pause if playing" msgstr "" msgid "Play if there is nothing already playing" msgstr "" msgid "Play last.fm artist radio" msgstr "" msgid "Play last.fm tag radio" msgstr "" msgid "Play tag radio..." msgstr "" msgid "Play the th track in the playlist" msgstr "" msgid "Play/Pause" msgstr "" msgid "Playback" msgstr "" msgid "Player name" msgstr "" msgid "Player options" msgstr "" msgid "&Playlist" msgstr "" msgid "Playlist finished" msgstr "" msgid "Playlist options" msgstr "" msgid "Playlist search" msgstr "" msgid "Playlist type" msgstr "" msgid "Plugin status:" msgstr "" msgid "Pop" msgstr "" msgid "Popup duration" msgstr "" msgid "Port" msgstr "" msgid "Pre-amp" msgstr "" msgid "Preferences" msgstr "" msgid "Preferences..." msgstr "" msgid "Preferred album art filenames (comma separated)" msgstr "" msgid "Preferred audio format" msgstr "" msgid "Preferred format" msgstr "" msgid "Preset:" msgstr "" msgid "Press a button combination to use for" msgstr "" msgid "Press a key" msgstr "" #, qt-format msgid "Press a key combination to use for %1..." msgstr "" msgid "Pretty OSD options" msgstr "" msgid "Preview" msgstr "" msgid "Previous" msgstr "" msgid "Previous track" msgstr "" msgid "Print out version information" msgstr "" msgid "Profile" msgstr "" msgid "Progress" msgstr "" msgid "Push Wiiremote button" msgstr "" msgid "Put songs in a random order" msgstr "" msgid "Quality" msgstr "" msgid "Querying device..." msgstr "" msgid "Queue Manager" msgstr "" msgid "Queue selected tracks" msgstr "" msgid "Queue track" msgstr "" msgid "Radio (equal loudness for all tracks)" msgstr "" msgid "Rain" msgstr "" msgid "Random visualization" msgstr "" msgid "Rate the current song 0 stars" msgstr "" msgid "Rate the current song 1 star" msgstr "" msgid "Rate the current song 2 stars" msgstr "" msgid "Rate the current song 3 stars" msgstr "" msgid "Rate the current song 4 stars" msgstr "" msgid "Rate the current song 5 stars" msgstr "" msgid "Rating" msgstr "" msgid "Really cancel?" msgstr "" msgid "Refresh catalogue" msgstr "" msgid "Refresh channels" msgstr "" msgid "Refresh friends list" msgstr "" msgid "Refresh station list" msgstr "" msgid "Refresh streams" msgstr "" msgid "Reggae" msgstr "" msgid "Remember Wii remote swing" msgstr "" msgid "Remember from last time" msgstr "" msgid "Remote Control" msgstr "" msgid "Remove" msgstr "" msgid "Remove action" msgstr "" msgid "Remove folder" msgstr "" msgid "Remove from playlist" msgstr "" msgid "Remove playlist" msgstr "" msgid "Rename playlist" msgstr "" msgid "Rename playlist..." msgstr "" msgid "Renumber tracks in this order..." msgstr "" msgid "Repeat" msgstr "" msgid "Repeat album" msgstr "" msgid "&Repeat mode" msgstr "" msgid "Repeat playlist" msgstr "" msgid "Repeat track" msgstr "" msgid "Replace and play now" msgstr "" msgid "Replace current playlist" msgstr "" msgid "Replace the playlist" msgstr "" msgid "Replaces spaces with underscores" msgstr "" msgid "Replay Gain" msgstr "" msgid "Replay Gain mode" msgstr "" msgid "Repopulate" msgstr "" msgid "Reset" msgstr "" msgid "Reset play counts" msgstr "" msgid "Restrict to ASCII characters" msgstr "" msgid "Rock" msgstr "" msgid "SOCKS proxy" msgstr "" msgid "Safely remove device" msgstr "" msgid "Safely remove the device after copying" msgstr "" msgid "Sample rate" msgstr "" msgid "Samplerate" msgstr "" msgid "Save album cover" msgstr "" msgid "Save cover to disk..." msgstr "" msgid "Save image" msgstr "" msgid "Save playlist" msgstr "" msgid "Save playlist..." msgstr "" msgid "Save preset" msgstr "" msgid "Save this stream in the Internet tab" msgstr "" msgid "Saving tracks" msgstr "" msgid "Scalable sampling rate profile (SSR)" msgstr "" msgid "Score" msgstr "" msgid "Scrobble tracks that I listen to" msgstr "" msgid "Search" msgstr "" msgid "Search Grooveshark" msgstr "" msgid "Search Grooveshark (opens a new tab)" msgstr "" msgid "Search Icecast stations" msgstr "" msgid "Search Jamendo" msgstr "" msgid "Search Magnatune" msgstr "" msgid "Search Spotify" msgstr "" msgid "Search Spotify (opens a new tab)" msgstr "" msgid "Search Spotify (opens a new tab)..." msgstr "" msgid "Search for album covers..." msgstr "" msgid "Search mode" msgstr "" msgid "Search options" msgstr "" msgid "Search terms" msgstr "" msgid "Second level" msgstr "" msgid "Seek backward" msgstr "" msgid "Seek forward" msgstr "" msgid "Seek the currently playing track by a relative amount" msgstr "" msgid "Seek the currently playing track to an absolute position" msgstr "" msgid "Select All" msgstr "" msgid "Select None" msgstr "" msgid "Select best possible match" msgstr "" msgid "Select visualizations" msgstr "" msgid "Select visualizations..." msgstr "" msgid "Serial number" msgstr "" msgid "Service offline" msgstr "" #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" msgid "Set the volume to percent" msgstr "" msgid "Set value for all selected tracks..." msgstr "" msgid "Settings" msgstr "" msgid "Shortcut" msgstr "" #, qt-format msgid "Shortcut for %1" msgstr "" #, qt-format msgid "Shortcut for %1 already exists" msgstr "" msgid "Show" msgstr "" msgid "Show Global Search Popup" msgstr "" msgid "Show OSD" msgstr "" msgid "Show a glowing animation on the current track" msgstr "" msgid "Show a native desktop notification" msgstr "" msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" msgid "Show a notification when I change the volume" msgstr "" msgid "Show a popup from the system tray" msgstr "" msgid "Show a pretty OSD" msgstr "" msgid "Show above status bar" msgstr "" msgid "Show all songs" msgstr "" msgid "Show all the songs" msgstr "" msgid "Show cover art in library" msgstr "" msgid "Show dividers" msgstr "" msgid "Show fullsize..." msgstr "" msgid "Show in file browser..." msgstr "" msgid "Show in various artists" msgstr "" msgid "Show only duplicates" msgstr "" msgid "Show only untagged" msgstr "" #, qt-format msgid "Show results from %1" msgstr "" msgid "Show the \"love\" and \"ban\" buttons" msgstr "" msgid "Show the scrobble button in the main window" msgstr "" msgid "Show tray icon" msgstr "" msgid "Show/Hide" msgstr "" msgid "Shuffle" msgstr "" msgid "Shuffle all" msgstr "" msgid "Shuffle by album" msgstr "" msgid "&Shuffle mode" msgstr "" msgid "Shuffle playlist" msgstr "" msgid "Sign out" msgstr "" msgid "Signing in..." msgstr "" msgid "Similar artists" msgstr "" msgid "Ska" msgstr "" msgid "Skip backwards in playlist" msgstr "" msgid "Skip count" msgstr "" msgid "Skip forwards in playlist" msgstr "" msgid "Small album cover" msgstr "" msgid "Small sidebar" msgstr "" msgid "Smart playlist" msgstr "" msgid "Smart playlists" msgstr "" msgid "Soft" msgstr "" msgid "Soft Rock" msgstr "" msgid "Song Information" msgstr "" msgid "Song info" msgstr "" msgid "Sonogram" msgstr "" msgid "Sorry" msgstr "" msgid "Sort by genre (alphabetically)" msgstr "" msgid "Sort by genre (by popularity)" msgstr "" msgid "Sort by station name" msgstr "" msgid "Sort songs by" msgstr "" msgid "Sorting" msgstr "" msgid "Speex" msgstr "" msgid "Spotify" msgstr "" msgid "Spotify login error" msgstr "" msgid "Spotify plugin" msgstr "" msgid "Spotify plugin not installed" msgstr "" msgid "Standard" msgstr "" msgid "Starred" msgstr "" msgid "Start the playlist currently playing" msgstr "" msgid "Start transcoding" msgstr "" msgid "Start typing in the search box above to find music on Grooveshark." msgstr "" msgid "Start typing in the search box above to find music on Spotify." msgstr "" #, qt-format msgid "Starting %1" msgstr "" msgid "Starting..." msgstr "" msgid "Stop" msgstr "" msgid "Stop after" msgstr "" msgid "Stop after this track" msgstr "" msgid "Stop playback" msgstr "" msgid "Stop playing after current track" msgstr "" msgid "Stopped" msgstr "" msgid "Stream" msgstr "" msgid "Streaming membership" msgstr "" #, qt-format msgid "Successfully written %1" msgstr "" msgid "Suggested tags" msgstr "" msgid "Summary" msgstr "" #, qt-format msgid "Super high (%1 fps)" msgstr "" msgid "Super high (60 fps)" msgstr "" msgid "Supported formats" msgstr "" msgid "Switch provider" msgstr "" msgid "Syncing Spotify inbox" msgstr "" msgid "Syncing Spotify playlist" msgstr "" msgid "Syncing Spotify starred tracks" msgstr "" msgid "Tabs on top" msgstr "" msgid "Tag" msgstr "" msgid "Tag fetcher" msgstr "" msgid "Tag radio" msgstr "" msgid "Target bitrate" msgstr "" msgid "Techno" msgstr "" msgid "Text options" msgstr "" msgid "Thanks to" msgstr "" #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #, qt-format msgid "The directory %1 is not valid" msgstr "" #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" msgid "The second value must be greater than the first one!" msgstr "" msgid "The site you requested does not exist!" msgstr "" msgid "The site you requested is not an image!" msgstr "" msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "" msgid "There was a problem fetching the metadata from Magnatune" msgstr "" msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "" msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "" msgid "" "These files will be deleted from disk, are you sure you want to continue?" msgstr "" msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" msgid "These folders will be scanned for music to make up your library" msgstr "" msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "" msgid "Third level" msgstr "" msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" msgid "This album is not available in the requested format" msgstr "" msgid "" "This device must be connected and opened before Clementine can see what file " "formats it supports." msgstr "" msgid "This device supports the following file formats:" msgstr "" msgid "This device will not work properly" msgstr "" msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "" msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "" msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "" msgid "" "This playlist will be removed; the action can't be undone. Are you sure you " "want to continue?" msgstr "" msgid "This stream is for paid subscribers only" msgstr "" #, qt-format msgid "This type of device is not supported: %1" msgstr "" msgid "Timeout" msgstr "" msgid "Timezone" msgstr "" msgid "Title" msgstr "" msgid "Today" msgstr "" msgid "Toggle Pretty OSD" msgstr "" msgid "Toggle fullscreen" msgstr "" msgid "Toggle queue status" msgstr "" msgid "Toggle scrobbling" msgstr "" msgid "Toggle visibility for the pretty on-screen-display" msgstr "" msgid "Total bytes transferred" msgstr "" msgid "Total network requests made" msgstr "" msgid "Track" msgstr "" msgid "Transcode Music" msgstr "" msgid "Transcoder Log" msgstr "" msgid "Transcoding" msgstr "" #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" msgid "Transcoding options" msgstr "" msgid "TrueAudio" msgstr "" msgid "Turbine" msgstr "" msgid "Turn off" msgstr "" msgid "URI" msgstr "" msgid "URL(s)" msgstr "" msgid "Ultra wide band (UWB)" msgstr "" #, qt-format msgid "Unable to download %1 (%2)" msgstr "" msgid "Unknown" msgstr "" msgid "Unknown error" msgstr "" msgid "Unset cover" msgstr "" msgid "Update changed library folders" msgstr "" msgid "Update the library when Clementine starts" msgstr "" #, qt-format msgid "Updating %1" msgstr "" #, qt-format msgid "Updating %1%..." msgstr "" msgid "Updating library" msgstr "" msgid "Usage" msgstr "" msgid "Use Gnome's shortcut keys" msgstr "" msgid "Use Replay Gain metadata if it is available" msgstr "" msgid "Use Wii Remote" msgstr "" msgid "Use a custom message for notifications" msgstr "" msgid "Use authentication" msgstr "" msgid "Use bitrate management engine" msgstr "" msgid "Use dynamic mode" msgstr "" msgid "Use notifications to report Wii Remote status" msgstr "" msgid "Use temporal noise shaping" msgstr "" msgid "Use the system default" msgstr "" msgid "Use the system proxy settings" msgstr "" msgid "Used" msgstr "" #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" msgid "Username" msgstr "" msgid "Using the menu to add a song will..." msgstr "" msgid "VBR MP3" msgstr "" msgid "Variable bit rate" msgstr "" msgid "Various Artists" msgstr "" msgid "Various artists" msgstr "" #, qt-format msgid "Version %1" msgstr "" msgid "View" msgstr "" msgid "Visualization mode" msgstr "" msgid "Visualizations" msgstr "" msgid "Visualizations Settings" msgstr "" msgid "Voice activity detection" msgstr "" #, qt-format msgid "Volume %1%" msgstr "" msgid "Volume name" msgstr "" msgid "Vorbis" msgstr "" msgid "WAV" msgstr "" msgid "WMA" msgstr "" msgid "Wav" msgstr "" msgid "Weeks" msgstr "" msgid "When Clementine starts" msgstr "" msgid "" "When looking for album art Clementine will first look for picture files that " "contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "" msgid "WiFi MAC Address" msgstr "" msgid "Wide band (WB)" msgstr "" #, qt-format msgid "Wii Remote %1: actived" msgstr "" #, qt-format msgid "Wii Remote %1: connected" msgstr "" #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" msgid "Wiimotedev" msgstr "" msgid "Windows Media 128k (Premium only)" msgstr "" msgid "Windows Media 40k" msgstr "" msgid "Windows Media 64k (Premium only)" msgstr "" msgid "Windows Media audio" msgstr "" msgid "Would you like to run a full rescan right now?" msgstr "" msgid "Year" msgstr "" msgid "Year - Album" msgstr "" msgid "Years" msgstr "" msgid "Yesterday" msgstr "" msgid "You are about to download the following albums" msgstr "" msgid "You are not signed in." msgstr "" #, qt-format msgid "You are signed in as %1." msgstr "" msgid "You are signed in." msgstr "" msgid "You can change the way the songs in the library are organised." msgstr "" msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a " "membership removes the messages at the end of each track." msgstr "" msgid "You can listen to background streams at the same time as other music." msgstr "" msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from Clementine." msgstr "" msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the Clementine " "wiki for more information.\n" msgstr "" msgid "You do not have a Grooveshark Anywhere account." msgstr "" msgid "You do not have a Spotify Premium account." msgstr "" msgid "" "You have selected a Premium-only audio type but do not have any account " "details entered" msgstr "" msgid "You have selected an invalid audio type setting" msgstr "" msgid "You love this track" msgstr "" msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" msgid "You will need to restart Clementine if you change the language." msgstr "" msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm " "subscriber." msgstr "" #, qt-format msgid "You're logged in as %1" msgstr "" msgid "Your Google credentials were incorrect" msgstr "" msgid "Your Last.fm credentials were incorrect" msgstr "" msgid "Your Magnatune credentials were incorrect" msgstr "" msgid "" "Your gstreamer installation is missing the 'ofa' plugin. This is required " "for automatic tag fetching. Try installing the 'gstreamer-plugins-bad' " "package." msgstr "" msgid "Your library is empty!" msgstr "" msgid "Your radio streams" msgstr "" #, qt-format msgid "Your scrobbles: %1" msgstr "" msgid "Your username or password was incorrect." msgstr "" msgid "Z-A" msgstr "" msgid "Zero" msgstr "" #, c-format msgid "add %n songs" msgstr "" msgid "after" msgstr "" msgid "ago" msgstr "" msgid "and" msgstr "" msgid "automatic" msgstr "" msgid "before" msgstr "" msgid "between" msgstr "" msgid "biggest first" msgstr "" msgid "bpm" msgstr "" msgid "contains" msgstr "" msgid "disabled" msgstr "" #, qt-format msgid "disc %1" msgstr "" msgid "does not contain" msgstr "" msgid "ends with" msgstr "" msgid "equals" msgstr "" msgid "greater than" msgstr "" msgid "in the last" msgstr "" msgid "kbps" msgstr "" msgid "less than" msgstr "" msgid "longest first" msgstr "" msgid "move songs" msgstr "" msgid "newest first" msgstr "" msgid "not equals" msgstr "" msgid "not in the last" msgstr "" msgid "not on" msgstr "" msgid "oldest first" msgstr "" msgid "on" msgstr "" msgid "options" msgstr "" msgid "press enter" msgstr "" #, c-format msgid "remove %n songs" msgstr "" msgid "shortest first" msgstr "" msgid "smallest first" msgstr "" msgid "starts with" msgstr "" msgid "stop" msgstr "" #, qt-format msgid "track %1" msgstr "" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/en_CA.po000066400000000000000000004314251260417502300242150ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # FIRST AUTHOR , 2010 # Fiodar Maroźka , 2012 # Luke Hollins , 2015 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: English (Canada) (http://www.transifex.com/davidsansome/clementine/language/en_CA/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: en_CA\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nYou can favourite playlists by clicking the star icon next to a playlist name\n\nFavourited playlists will be saved here" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " days" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr "pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " seconds" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "songs" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 songs)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 albums" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 days" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 days ago" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 on %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 playlists (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 selected of" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 song" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 songs" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 songs found" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 songs found (showing %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 tracks" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 transferred" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev module" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 other listeners" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 total plays" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n failed" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n finished" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n remaining" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Align text" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Centre" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Custom" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "&Extras" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "Help" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&Hide %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Hide..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Left" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "Music" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&None" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "Playlist" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Quit" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Repeat mode" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Right" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Shuffle mode" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Stretch columns to fit window" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Tools" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(different across multiple songs)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", by " #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...and all the Amarok contributors" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 day" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 track" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 random tracks" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Upgrade to Premium now" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

If not checked, Clementine will try to save your ratings and other statistics only in a separate database and don't modify your files.

If checked, it will save statistics both in database and directly into the file each time they changed.

Please note it might not work for every format and, as there is no standard for doing so, other music players might not be able to read them.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Prefix a word with a field name to limit the search to that field, e.g. artist:Bode searches the library for all artists that contain the word Bode.

Available fields: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

This will write songs' ratings and statistics into files tags for all your library's songs.

This is not needed if the "Save ratings and statistics in file tags" option has always been activated.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Tokens start with %, for example: %artist %album %title

\n\n

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "A Spotify Premium account is required." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "A client can connect only, if the correct code was entered." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "A smart playlist is a dynamic list of songs that come from your library. There are different types of smart playlist that offer different ways of selecting songs." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "A song will be included in the playlist if it matches these conditions." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "About %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "About Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Add Podcast" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Add Stream" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Add a new line if supported by the notification type" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Add action" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Add all tracks from a directory and all its subdirectories" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Add another stream..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Add directory..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Add file" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Add file to transcoder" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Add file(s) to transcoder" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Add file..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Add files to transcode" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Add folder" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Add folder..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Add new folder..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Add podcast" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Add podcast..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Add search term" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Add song album tag" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Add song albumartist tag" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Add song artist tag" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Add song auto score" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Add song composer tag" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Add song disc tag" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Add song filename" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Add song genre tag" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Add song grouping tag" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Add song length tag" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Add song performer tag" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Add song play count" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Add song rating" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Add song skip count" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Add song title tag" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Add song to cache" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Add song track tag" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Add song year tag" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Add songs to \"My Music\" when the \"Love\" button is clicked" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Add stream..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Add to My Music" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Add to Spotify playlists" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Add to Spotify starred" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Add to another playlist" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Add to bookmarks" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Add to playlist" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Add to the queue" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Add user/group to bookmarks" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Add wiimotedev action" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Add..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Added this month" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Added this week" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Added this year" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Added today" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Added within three months" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Advanced grouping..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "After " #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "After copying..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Album (ideal loudness for all tracks)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Album artist" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Album cover" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Album info on jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Albums" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Albums with covers" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Albums without covers" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "All" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "All Files (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "All Glory to the Hypnotoad!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "All albums" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "All artists" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "All files (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "All playlists (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "All the translators" #: library/library.cpp:98 msgid "All tracks" msgstr "All tracks" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Allow a client to download music from this computer." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Allow downloads" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Allow mid/side encoding" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Alongside the originals" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Always hide the main window" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Always show the main window" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Always start playing" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "An additional plugin is required to use Spotify in Clementine. Would you like to download and install it now?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "An error occurred loading the iTunes database" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "An error occurred writing metadata to '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "An unspecified error occurred." #: ui/about.cpp:85 msgid "And:" msgstr "And:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Angry" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Appearance" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Append files/URLs to the playlist" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Append to current playlist" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Append to the playlist" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Apply compression to prevent clipping" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Are you sure you want to delete the \"%1\" preset?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Are you sure you want to reset this song's statistics?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Are you sure you want to write song's statistics into song's file for all the songs of your library?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Artist" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Artist info" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Artist tags" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Artist's initial" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Ask when saving" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Audio format" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Audio output" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Authentication failed" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Author" #: ui/about.cpp:68 msgid "Authors" msgstr "Authors" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Auto" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Automatic" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Automatic updating" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Automatically open single categories in the library tree" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Available" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Average bitrate" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Average image size" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "BBC Podcasts" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Background Streams" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Background colour" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Background image" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Background opacity" #: core/database.cpp:648 msgid "Backing up database" msgstr "Backing up database" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Balance" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Bar analyzer" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Basic Blue" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Basic audio type" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Behaviour" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Best" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Biography from %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Bit rate" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Bitrate" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Bitrate" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Block analyzer" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Block type" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Blur amount" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Body" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Boom analyzer" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Browse..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Buffering" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Building Seafile index..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "But these sources are disabled:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Buttons" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "CUE sheet support" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Cache path:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "Caching %1" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Cancel" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Cancel download" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Captcha is needed.\nTry to login into Vk.com with your browser,to fix this problem." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Change cover art" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Change font size..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Change repeat mode" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Change shortcut..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Change shuffle mode" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Change the language" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Check for updates" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Check for updates..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Choose Vk.com cache directory" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Choose a name for your smart playlist" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Choose automatically" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Choose colour..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Choose font..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Choose from the list" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Choose podcast download directory" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Choose the internet services you want to show." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Choose the websites you want Clementine to use when searching for lyrics." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Classical" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Cleaning up" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Clear" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Clear playlist" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Clementine Error" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Clementine Orange" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Clementine Visualisation" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine can automatically convert the music you copy to this device into a format that it can play." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine can play music that you have uploaded to Box" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine can play music that you have uploaded to Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine can play music that you have uploaded to Google Drive" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine can play music that you have uploaded to OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine can show a message when the track changes." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine can synchronize your subscription list with your other computers and podcast applications. Create an account." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Clementine image viewer" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine was unable to find results for this file" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine will find music in:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Click here to add some music" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Click here to favorite this playlist so it will be saved and remain accessible through the \"Playlists\" panel on the left side bar" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Click to toggle between remaining time and total time" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Close visualisation" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:114 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Colours" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Comment" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Composer" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Configure Shortcuts" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Configure library..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Copy to library..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Could not create the GStreamer element \"%1\" - make sure you have all the required GStreamer plugins installed" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Cover Manager" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Cross-fade when changing tracks automatically" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Cross-fade when changing tracks manually" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Custom..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dance" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Date created" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Date modified" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "De&fault" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Decrease the volume by 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Decrease volume" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Delay between visualisations" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Delete preset" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Destination" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Details..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Directory" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Disc" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Display options" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Display the on-screen-display" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Don't repeat" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Don't show in various artists" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Don't shuffle" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "" #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "" #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "" #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Downloading Magnatune catalogue" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Drag to reposition" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Edit tag..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Edit track information" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Edit track information..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Edit track information..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Edit..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Enable equalizer" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Enter a new name for this playlist" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Enter search terms here" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Enter the URL of an internet radio stream:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Entire collection" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Equalizer" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Error processing %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:68 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Fade out on pause / fade in on resume" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Fade out when stopping a track" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Fading" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Fading duration" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Failed reading CD drive" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Failed to fetch directory" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Failed to fetch podcasts" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Failed to load podcast" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Failed to parse the XML for this RSS feed" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Fast" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Favourite tracks" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Fetch Missing Covers" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Fetch automatically" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Fetch completed" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Fetching Subsonic library" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Fetching cover error" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "File Format" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "File extension" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "File formats" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "File name" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "File name (without path)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "File name pattern:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "File paths" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "File size" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "File type" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Filename" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Files" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Files to transcode" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Find songs in your library that match the criteria you specify." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Find this artist" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Fingerprinting song" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Finish" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "First level" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Fit cover to width" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Font size" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "For licensing reasons Spotify support is in a separate plugin." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Force mono encoding" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Forget device" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Forgetting a device will remove it from this list and Clementine will have to rescan all the songs again next time you connect it." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Form" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Format" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Framerate" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Frames per buffer" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Frozen" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Full Bass" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Full Bass + Treble" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Full Treble" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "General" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "General settings" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Genre" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Getting channels" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Give it a name:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Group Library by..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Group by" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Group by Album" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Group by Artist" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Group by Artist/Album" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Group by Artist/Year - Album" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Group by Genre/Album" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Group by Genre/Artist/Album" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Include album art in the notification" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Increase the volume by 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Increase volume" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:585 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Invalid API key" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Invalid format" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Invalid method" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Invalid parameters" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Invalid resource specified" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Invalid service" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Invalid session key" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Jump to the currently playing track" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Laptop/Headphones" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Large Hall" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "" #: library/library.cpp:80 msgid "Last played" msgstr "" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm is currently busy, please try again in a few minutes" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Last.fm password" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Last.fm username" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Length" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Library" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Library advanced grouping" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Load" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Load playlist" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Load playlist..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Loading stream" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Loads files/URLs, replacing current playlist" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Love" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Malformed response" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Move to library..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Music Library" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Mute" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "My Recommendations" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Name" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "" #: library/library.cpp:74 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "New playlist" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:92 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Next track" #: core/utilities.cpp:151 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "No analyzer" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "No matches found. Clear the search box to show the whole playlist again." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "None" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Not enough content" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Not enough fans" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Not enough members" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Not enough neighbours" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Notification type" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Notifications" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "OSD Preview" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "" #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Open..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Operation failed" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "" #: core/organise.cpp:73 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Other options" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Output options" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Party" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Pause" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Pause playback" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Paused" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Play" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Play if stopped, pause if playing" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Play the th track in the playlist" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Play/Pause" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Playback" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Player options" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Playlist" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Playlist finished" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Playlist options" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Popup duration" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Pre-amp" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Preset:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Press a key" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Press a key combination to use for %1..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Pretty OSD options" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Previous track" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Progress" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (equal loudness for all tracks)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Random visualisation" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Refresh catalogue" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Refresh channels" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Remember from last time" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Remove" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Remove folder" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Remove from playlist" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Rename playlist" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Rename playlist..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Renumber tracks in this order..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Repeat" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Repeat album" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Repeat playlist" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Repeat track" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Sample rate" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Save playlist..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Save preset" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Save this stream in the Internet tab" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Scrobble tracks that I listen to" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Search Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Second level" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Seek backward" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Seek forward" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Seek the currently playing track by a relative amount" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Seek the currently playing track to an absolute position" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Select visualisations" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Select visualisations..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Service offline" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Set %1 to \"%2\"..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Set the volume to percent" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Set value for all selected tracks..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Shortcut" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Shortcut for %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Show" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Show a native desktop notification" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Show a notification when I change the volume" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Show a popup from the system tray" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Show a pretty OSD" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Show fullsize..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Show in various artists" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Show tray icon" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Shuffle" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Shuffle all" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Shuffle playlist" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Sign out" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Skip backwards in playlist" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Skip forwards in playlist" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Start the playlist currently playing" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Start transcoding" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Starting %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Stop" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Stop after this track" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Stop playback" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Stop playing after current track" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Stopped" #: core/song.cpp:431 msgid "Stream" msgstr "Stream" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "Successfully written %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Thanks to" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "The \"%1\" command could not be started." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "These folders will be scanned for music to make up your library" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Third level" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "This stream is for paid subscribers only" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Title" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Track" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Transcode Music" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Transcoder Log" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Transcoding %1 files using %2 threads" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "" #: devices/giolister.cpp:157 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Unknown" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Unknown error" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Unset cover" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Update the library when Clementine starts" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Updating library" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Usage" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Use Gnome's shortcut keys" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Use Replay Gain metadata if it is available" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Various artists" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Version %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "View" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Visualisation mode" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Visualisations" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Visualisations Settings" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Volume %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "When Clementine starts" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Year" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Year - Album" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "You can change the way the songs in the library are organised." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Your Last.fm credentials were incorrect" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Your library is empty!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Your radio streams" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "add %n songs" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "disc %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "options" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "remove %n songs" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "track %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/en_GB.po000066400000000000000000004772351260417502300242330ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Andi Chandler , 2015 # davidsansome , 2010 # Luke Hollins , 2015 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: English (United Kingdom) (http://www.transifex.com/davidsansome/clementine/language/en_GB/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: en_GB\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nYou can favourite playlists by clicking the star icon next to a playlist name\n\nFavourited playlists will be saved here" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " days" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr " s" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " seconds" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " songs" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 songs)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 albums" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 days" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 days ago" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 on %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 playlists (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 selected of" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 song" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 songs" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 songs found" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 songs found (showing %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 tracks" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 transferred" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev modul" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 other listeners" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 total plays" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n failed" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n finished" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n remaining" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Align text" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Centre" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Custom" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "&Extras" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "Help" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&Hide %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Hide..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Left" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "Music" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&None" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "Playlist" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Quit" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Repeat mode" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Right" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Shuffle mode" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Stretch columns to fit window" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Tools" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(different across multiple songs)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", by " #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...and all the Amarok contributors" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 day" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 track" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192,000Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44,100Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48,000Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 random tracks" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96,000Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Upgrade to Premium now" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

If not checked, Clementine will try to save your ratings and other statistics only in a separate database and won't modify your files.

If checked, it will save statistics both in database to the file each time they change.

Please note it might not work for every format and as there is no standard for doing so, other music players may not be able to read them.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Prefix a word with a field name to limit the search to that field, e.g. artist:Bode searches the library for all artists that contain the word Bode.

Available fields: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

This will write songs' ratings and statistics into file's tags for all your library's songs.

This is not needed if the "Save ratings and statistics in file tags" option has always been activated.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Tokens start with %, for example: %artist %album %title

\n\n

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "A Spotify Premium account is required." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "A client can connect only if the correct code was entered." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "A smart playlist is a dynamic list of songs that come from your library. There are different types of smart playlist that offer different ways of selecting songs." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "A song will be included in the playlist if it matches these conditions." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ALL GLORY TO THE HYPNOTOAD" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Abort" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "About %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "About Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "About Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Absolute" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Account details" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Account details (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Action" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Action" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Activate/deactivate Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Activities stream" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Add Podcast" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Add Stream" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Add a new line if supported by the notification type" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Add action" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Add all tracks from a directory and all its subdirectories" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Add another stream..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Add directory..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Add file" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Add file to transcoder" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Add file(s) to transcoder" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Add file..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Add files to transcode" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Add folder" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Add folder..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Add new folder..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Add podcast" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Add podcast..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Add search term" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Add song album tag" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Add song albumartist tag" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Add song artist tag" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Add song auto score" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Add song composer tag" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Add song disc tag" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Add song filename" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Add song genre tag" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Add song grouping tag" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Add song length tag" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Add song performer tag" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Add song play count" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Add song rating" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Add song skip count" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Add song title tag" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Add song to cache" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Add song track tag" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Add song year tag" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Add songs to \"My Music\" when the \"Love\" button is clicked" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Add stream..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Add to My Music" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Add to Spotify playlists" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Add to Spotify starred" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Add to another playlist" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Add to bookmarks" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Add to playlist" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Add to the queue" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Add user/group to bookmarks" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Add wiimotedev action" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Add..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Added this month" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Added this week" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Added this year" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Added today" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Added within three months" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Advanced grouping..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "After " #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "After copying..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Album (ideal loudness for all tracks)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Album artist" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Album cover" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Album info on jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Albums" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Albums with covers" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Albums without covers" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "All" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "All Files (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "All Glory to the Hypnotoad!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "All albums" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "All artists" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "All files (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "All playlists (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "All the translators" #: library/library.cpp:98 msgid "All tracks" msgstr "All tracks" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Allow a client to download music from this computer." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Allow downloads" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Allow mid/side encoding" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Alongside the originals" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Always hide the main window" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Always show the main window" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Always start playing" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon Cloud Drive" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "An additional plugin is required to use Spotify in Clementine. Would you like to download and install it now?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "An error occurred loading the iTunes database" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "An error occurred writing metadata to '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "An unspecified error occurred." #: ui/about.cpp:85 msgid "And:" msgstr "And:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Angry" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Appearance" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Append files/URLs to the playlist" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Append to current playlist" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Append to the playlist" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Apply compression to prevent clipping" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Are you sure you want to delete the \"%1\" preset?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Are you sure you want to reset this song's statistics?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Are you sure you want to write song statistics to file for all the songs in your library?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Artist" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Artist info" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Artist tags" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Artist's initial" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Ask when saving" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Audio format" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Audio output" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Authentication failed" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Author" #: ui/about.cpp:68 msgid "Authors" msgstr "Authors" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Auto" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Automatic" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Automatic updating" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Automatically open single categories in the library tree" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Available" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Average bitrate" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Average image size" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "BBC Podcasts" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Background Streams" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Background colour" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Background image" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Background opacity" #: core/database.cpp:648 msgid "Backing up database" msgstr "Backing up database" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Balance" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "Ban (Last.fm scrobbling)" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Bar analyzer" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Basic Blue" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Basic audio type" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Behaviour" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Best" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Biography from %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Bit rate" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Bitrate" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Bitrate" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Block analyzer" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Block type" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Blur amount" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Body" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Boom analyzer" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Browse…" #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Buffer duration" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Buffering" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Building Seafile index..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "But these sources are disabled:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Buttons" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "CUE sheet support" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Cache path:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Caching" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "Caching %1" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Cancel" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Cancel download" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Captcha is needed.\nTry to login into Vk.com with your browser to fix this problem." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Change cover art" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Change font size..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Change repeat mode" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Change shortcut..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Change shuffle mode" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "Change the currently playing song" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Change the language" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "Changes will take place when the next song starts playing" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Changing mono playback preference will be effective for the next playing songs" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Check for new episodes" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Check for updates" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Check for updates..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Choose Vk.com cache directory" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Choose a name for your smart playlist" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Choose automatically" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Choose colour..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Choose font..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Choose from the list" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Choose how the playlist is sorted and how many songs it will contain." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Choose podcast download directory" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Choose the internet services you want to show." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Choose the websites you want Clementine to use when searching for lyrics." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Classical" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Cleaning up" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Clear" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Clear playlist" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Clementine Error" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Clementine Orange" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Clementine Visualisation" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine can automatically convert the music you copy to this device into a format that it can play." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Clementine can play music that you have uploaded to Amazon Cloud Drive" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine can play music that you have uploaded to Box" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine can play music that you have uploaded to Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine can play music that you have uploaded to Google Drive" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine can play music that you have uploaded to OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine can show a message when the track changes." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine can synchronise your subscription list with your other computers and podcast applications. Create an account." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine could not load any projectM visualisations. Check that you have installed Clementine properly." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Clementine image viewer" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine was unable to find results for this file" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine will find music in:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Click here to add some music" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Click here to favourite this playlist so it will be saved and remain accessible through the \"Playlists\" panel on the left side bar" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Click to toggle between remaining time and total time" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Clicking the Login button will open a web browser. You should return to Clementine after you have logged in." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Close" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Close playlist" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Close visualisation" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Closing this window will cancel the download." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Closing this window will stop searching for album covers." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Colours" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Comma separated list of class:level, level is 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Comment" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Community Radio" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Complete tags automatically" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Complete tags automatically..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Composer" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Configure %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Configure Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Configure Shortcuts" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Configure Spotify..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Configure Subsonic..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Configure Vk.com..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Configure global search..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Configure library..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Configure podcasts..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Configure..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Connect Wii Remotes using activate/deactivate action" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Connect device" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Connecting to Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Connection refused by server, check server URL. Example: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Connection timed out, check server URL. Example: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Connection trouble or audio is disabled by owner" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Console" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Constant bitrate" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Convert all music" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Convert any music that the device can't play" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Convert lossless audiofiles before sending them to the remote." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Convert lossless files" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Copy share URL to clipboard" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Copy to clipboard" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Copy to device..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Copy to library..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Copyright" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Could not connect to Subsonic, check server URL. Example: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Could not create the GStreamer element \"%1\" - make sure you have all the required GStreamer plugins installed" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Couldn't create playlist" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Couldn't find a muxer for %1, check you have the correct GStreamer plugins installed" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Couldn't find an encoder for %1, check you have the correct GStreamer plugins installed" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Couldn't open output file %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Cover Manager" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Cover art from embedded image" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Cover art loaded automatically from %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Cover art manually unset" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Cover art not set" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Cover art set from %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Covers from %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Cross-fade when changing tracks automatically" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Cross-fade when changing tracks manually" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Custom" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Custom image:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Custom message settings" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Custom..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "DBus path" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dance" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Database corruption detected. Please read https://code.google.com/p/clementine-player/wiki/DatabaseCorruption for instructions on how to recover your database" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Date created" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Date modified" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Days" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "De&fault" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Decrease the volume by 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Decrease the volume by percent" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Decrease volume" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Default background image" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Default device on %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Defaults" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Delay between visualisations" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Delete" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Delete downloaded data" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Delete files" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Delete from device..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Delete from disk..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Delete played episodes" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Delete preset" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Delete smart playlist" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Delete the original files" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Deleting files" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Dequeue selected tracks" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Dequeue track" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Destination" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Details..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Device" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Device Properties" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Device name" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Device properties..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Devices" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Dialog" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Did you mean" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Digitally Imported password" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Digitally Imported username" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Direct internet connection" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Directory" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Disable duration" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Disable moodbar generation" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Disabled" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Disabled" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Disc" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Discontinuous transmission" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Display options" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Display the on-screen-display" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Do a full library rescan" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Do a full rescan" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Do a full rescan..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Do not convert any music" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Do not overwrite" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "Doing a full rescan will lose any metadata you've saved in Clementine such as cover art, play counts and ratings. Clementine will rescan all your music in Google Drive which may take some time." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Don't repeat" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Don't show in various artists" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Don't show listened episodes" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Don't shuffle" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Don't stop!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Donate" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Double click to open" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "Double clicking a song in the playlist will..." #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Double clicking a song will..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Download %n episodes" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Download directory" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Download episodes to" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Download membership" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Download new episodes automatically" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Download queued" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Download settings" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Download the Android app" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Download this album" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Download this album..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Download this episode" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Download..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Downloading (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Downloading Icecast directory" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Downloading Jamendo catalogue" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Downloading Magnatune catalogue" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Downloading Spotify plugin" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Downloading metadata" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Drag to reposition" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dubstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Duration" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Dynamic mode is on" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Dynamic random mix" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Edit smart playlist..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Edit tag \"%1\"..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Edit tag..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Edit tags" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Edit track information" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Edit track information..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Edit track information..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Edit..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "Email" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Enable Wii Remote support" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Enable automatic caching" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Enable equalizer" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Enable shortcuts only when Clementine is focused" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Enable song metadata inline edition with click" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Enable sources below to include them in search results. Results will be displayed in this order." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Enable/disable Last.fm scrobbling" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Encoding complexity" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Encoding engine quality" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Encoding mode" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Enter a URL" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Enter a URL to download a cover from the Internet:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Enter a filename for exported covers (no extension):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Enter a new name for this playlist" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Enter search terms above to find music on your computer and on the internet" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Enter search terms below to find podcasts in the iTunes Store" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Enter search terms below to find podcasts on gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Enter search terms here" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Enter the URL of an internet radio stream:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Enter the name of the folder" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Enter this IP in the App to connect to Clementine." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Entire collection" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Equalizer" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Equivalent to --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Equivalent to --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Error" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Error Ripping CD" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Error connecting MTP device" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Error copying songs" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Error deleting songs" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Error downloading Spotify plugin" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Error loading %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Error loading di.fm playlist" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Error processing %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Error while loading audio CD" #: library/library.cpp:68 msgid "Ever played" msgstr "Ever played" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Every 10 minutes" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Every 12 hours" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Every 2 hours" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Every 20 minutes" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Every 30 minutes" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Every 6 hours" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Every hour" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Except between tracks on the same album or in the same CUE sheet" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Existing covers" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Expand" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Expires on %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Export Covers" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Export covers" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Export downloaded covers" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Export embedded covers" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Export finished" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Exported %1 covers out of %2 (%3 skipped)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Fade out on pause / fade in on resume" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Fade out when stopping a track" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Fading" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Fading duration" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Failed reading CD drive" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Failed to fetch directory" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Failed to fetch podcasts" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Failed to load podcast" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Failed to parse the XML for this RSS feed" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Fast" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Favourite tracks" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Fetch Missing Covers" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Fetch automatically" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Fetch completed" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Fetching Subsonic library" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Fetching cover error" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "File Format" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "File extension" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "File formats" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "File name" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "File name (without path)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "File name pattern:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "File paths" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "File size" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "File type" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Filename" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Files" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Files to transcode" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Find songs in your library that match the criteria you specify." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Find this artist" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Fingerprinting song" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Finish" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "First level" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Fit cover to width" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Font size" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "For licensing reasons Spotify support is in a separate plugin." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Force mono encoding" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Forget device" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Forgetting a device will remove it from this list and Clementine will have to rescan all the songs again next time you connect it." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Form" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Format" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Framerate" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Frames per buffer" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Frozen" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Full Bass" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Full Bass + Treble" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Full Treble" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "General" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "General settings" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Genre" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Get a URL to share this Spotify song" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Get a URL to share this playlist" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Getting channels" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Getting streams" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Give it a name:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Go" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Go to next playlist tab" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Go to previous playlist tab" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Got %1 covers out of %2 (%3 failed)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Grey out nonexistent songs in my playlists" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Group Library by..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Group by" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Group by Album" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Group by Artist" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Group by Artist/Album" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Group by Artist/Year - Album" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Group by Genre/Album" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Group by Genre/Artist/Album" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Grouping" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "HTML page did not contain any RSS feeds" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "HTTP 3xx status code received without URL, verify server configuration." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "HTTP proxy" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Happy" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Hardware information" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Hardware information is only available while the device is connected." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "High" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "High (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "High (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "HipHop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Host not found, check server URL. Example: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Hours" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "I don't have a Magnatune account" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Icon" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Icons on top" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Identifying song" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "If activated, clicking a selected song in the playlist view will let you edit the tag value directly" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "If you continue, this device will work slowly and songs copied to it may not work." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "If you know the URL of a podcast, enter it below and press Go." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Ignore \"The\" in artist names" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Import..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "In %1 days" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "In %1 weeks" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "In dynamic mode new tracks will be chosen and added to the playlist every time a song finishes." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Inbox" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Include album art in the notification" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Include all songs" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Incompatible Subsonic REST protocol version. Client must upgrade." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Incompatible Subsonic REST protocol version. Server must upgrade." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Incomplete configuration, please ensure all fields are populated." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Increase the volume by 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Increase the volume by percent" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Increase volume" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Indexing %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Information" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Input options" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Insert..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Installed" #: core/database.cpp:585 msgid "Integrity check" msgstr "Integrity check" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Internet providers" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Internet services" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "Intro tracks" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Invalid API key" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Invalid format" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Invalid method" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Invalid parameters" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Invalid resource specified" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Invalid service" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Invalid session key" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Invert Selection" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Jamendo Most Listened Tracks" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Jamendo Top Tracks" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo Top Tracks of the Month" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo Top Tracks of the Week" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Jamendo database" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Jump to previous song right away" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Jump to the currently playing track" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Keep buttons for %1 second..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Keep buttons for %1 seconds..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Keep running in the background when the window is closed" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Keep the original files" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Kittens" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Language" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Laptop/Headphones" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Large Hall" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Large album cover" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Large album cover (details below)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Large album cover (no details)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Large sidebar" #: library/library.cpp:80 msgid "Last played" msgstr "Last played" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Last played" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm is currently busy, please try again in a few minutes" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Last.fm password" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Last.fm play counts" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Last.fm tags" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Last.fm username" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Least favourite tracks" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Left" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Length" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Library" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Library advanced grouping" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Library rescan notice" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Library search" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Limits" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Load" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Load cover from URL" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Load cover from URL..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Load cover from disk" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Load cover from disk..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Load playlist" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Load playlist..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Loading MTP device" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Loading iPod database" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Loading smart playlist" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Loading songs" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Loading stream" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Loading tracks" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Loading tracks info" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Loading..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Loads files/URLs, replacing current playlist" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Login" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Login failed" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Logout" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Long term prediction profile (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Love" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "Love (Last.fm scrobbling)" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Low (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Low (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Low complexity profile (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Lyrics" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Lyrics from %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Lyrics from the ID3v2 tag" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Magnatune Download" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Magnatune download finished" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Main profile (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Make it so!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Make it so!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Make playlist available offline" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Malformed response" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Manual proxy configuration" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Manually" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Manufacturer" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Mark as listened" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Mark as new" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Match every search term (AND)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Match one or more search terms (OR)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Max global search results" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Maximum bitrate" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Media has changed. Reloading" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Medium (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Medium (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Membership type" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Minimum bitrate" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Minimum buffer fill" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Missing projectM presets" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Monitor the library for changes" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Mono playback" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Months" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Mood" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Moodbar style" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Moodbars" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "More" #: library/library.cpp:84 msgid "Most played" msgstr "Most played" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Mount point" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Mount points" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Move down" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Move to library..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Move up" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Music" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Music Library" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Mute" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "My Albums" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "My Music" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "My Recommendations" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Name" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Name" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Naming options" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Narrow band (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Network Proxy" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Network Remote" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Never" #: library/library.cpp:74 msgid "Never played" msgstr "Never played" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Never start playing" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "New folder" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "New playlist" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "New smart playlist..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "New songs" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "New tracks will be added automatically." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Newest tracks" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Next" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Next track" #: core/utilities.cpp:151 msgid "Next week" msgstr "Next week" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "No analyzer" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "No background image" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "No covers to export." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "No long blocks" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "No matches found. Clear the search box to show the whole playlist again." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "No short blocks" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "None" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "None of the selected songs were suitable for copying to a device" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Normal" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Normal block type" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Not available while using a dynamic playlist" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Not connected" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Not enough content" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Not enough fans" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Not enough members" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Not enough neighbours" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Not installed" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Not logged in" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Not mounted - double click to mount" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Nothing found" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Notification type" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Notifications" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Now Playing" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Number of episodes to show" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "OSD Preview" #: widgets/osd.cpp:173 msgid "Off" msgstr "Off" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "On" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Only accept connections from clients within the ip ranges:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Only allow connections from the local network" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Only show the first" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Opacity" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Open %1 in browser" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Open &audio CD..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Open OPML file" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Open OPML file..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Open a directory to import music from" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Open device" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Open file..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Open in Google Drive" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Open in new playlist" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Open in new playlist" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Open in your browser" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Open..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Operation failed" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Optimize for bitrate" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Optimize for quality" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Options..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Organise Files" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Organise files..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Organising files" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Original tags" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "Original year" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "Original year - Album" #: library/library.cpp:118 msgid "Original year tag support" msgstr "Original year tag support" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Other options" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Output" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Output device" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Output options" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Overwrite all" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Overwrite existing files" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Overwrite smaller ones only" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Owner" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Parsing Jamendo catalogue" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Party" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Password" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Pause" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Pause playback" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Paused" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Performer" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Pixel" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Plain sidebar" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Play" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Play count" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Play if stopped, pause if playing" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Play if there is nothing already playing" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Play the th track in the playlist" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Play/Pause" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Playback" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Player options" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Playlist" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Playlist finished" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Playlist options" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Playlist type" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Playlists" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Please close your browser and return to Clementine." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Plugin status:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcasts" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Popup duration" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Pre-amp" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Preference" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Preferences" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Preferences..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Preferred album art filenames (comma separated)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Preferred audio format" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Preferred bitrate" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Preferred format" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Premium audio type" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Preset:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Press a button combination to use for" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Press a key" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Press a key combination to use for %1..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Pressing \"Previous\" in player will..." #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Pretty OSD options" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Preview" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Previous" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Previous track" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Print out version information" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Profile" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Progress" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Progress" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psychedelic" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Push Wiiremote button" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Put songs in a random order" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Quality" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Quality" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Querying device..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Queue Manager" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Queue selected tracks" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Queue track" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (equal loudness for all tracks)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Rain" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Rain" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Random visualisation" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Rate the current song 0 stars" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Rate the current song 1 star" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Rate the current song 2 stars" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Rate the current song 3 stars" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Rate the current song 4 stars" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Rate the current song 5 stars" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Rating" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Really cancel?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Redirect limit exceeded, verify server configuration." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Refresh catalogue" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Refresh channels" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Refresh station list" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Refresh streams" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Relative" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Remember Wii remote swing" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Remember from last time" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Remember my choice" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Remove" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Remove action" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Remove duplicates from playlist" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Remove folder" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Remove from My Music" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Remove from bookmarks" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Remove from playlist" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Remove playlist" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Remove playlists" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Remove unavailable tracks from playlist" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Rename playlist" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Rename playlist..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Renumber tracks in this order..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Repeat" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Repeat album" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Repeat playlist" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Repeat track" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Replace current playlist" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Replace the playlist" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Replaces spaces with underscores" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Replay Gain mode" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Repopulate" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Require authentication code" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Reset" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Reset play counts" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Restart song, then jump to previous if pressed again" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Restart the track, or play the previous track if within 8 seconds of start." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Restrict to ASCII characters" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Resume playback on start" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Return to Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Right" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Rip" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Rip CD" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Rip audio CD" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Run" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "SOCKS proxy" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "SSL handshake error, verify server configuration. SSLv3 option below may workaround some issues." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Safely remove device" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Safely remove the device after copying" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Sample rate" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Samplerate" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Save .mood files in your music library" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Save album cover" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Save cover to disk..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Save image" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Save playlist" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Save playlist" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Save playlist..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Save preset" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Save ratings in file tags when possible" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Save statistics in file tags when possible" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Save this stream in the Internet tab" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Saving song statistics into songs' files" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Saving tracks" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Scalable sampling rate profile (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Scale size" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Score" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Scrobble tracks that I listen to" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Search" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Search" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Search Icecast stations" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Search Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Search Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Search Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Search automatically" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Search for album covers..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Search for anything" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Search gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Search iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Search mode" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Search options" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Search results" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Search terms" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Second level" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Seek backward" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Seek forward" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Seek the currently playing track by a relative amount" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Seek the currently playing track to an absolute position" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "Seeking using a keyboard shortcut" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Select All" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Select None" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Select background colour:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Select background image" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Select best possible match" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Select foreground colour:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Select visualisations" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Select visualisations..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Select..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Serial number" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Server" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "Server URL" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Server details" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Service offline" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Set %1 to \"%2\"..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Set the volume to percent" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Set value for all selected tracks..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Settings" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Shortcut" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Shortcut for %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Shortcut for %1 already exists" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Show" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Show OSD" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Show a glowing animation on the current track" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Show a moodbar in the track progress bar" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Show a native desktop notification" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Show a notification when I change the repeat/shuffle mode" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Show a notification when I change the volume" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Show a notification when I pause playback" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Show a popup from the system tray" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Show a pretty OSD" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Show above status bar" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Show all songs" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Show all the songs" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Show cover art in library" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Show dividers" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Show fullsize..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Show groups in global search result" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Show in file browser..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Show in library..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Show in various artists" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Show moodbar" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Show only duplicates" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Show only untagged" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Show playing song on your page" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Show search suggestions" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Show the \"love\" button" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Show the scrobble button in the main window" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Show tray icon" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Show which sources are enabled and disabled" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Show/Hide" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Shuffle" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Shuffle albums" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Shuffle all" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Shuffle playlist" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Shuffle tracks in this album" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Sign in" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Sign out" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Signing in..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Similar artists" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Size" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Size:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Skip backwards in playlist" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Skip count" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Skip forwards in playlist" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Skip selected tracks" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Skip track" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Small album cover" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Small sidebar" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Smart playlist" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Smart playlists" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Song Information" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Song info" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Sorry" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Sort by genre (alphabetically)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Sort by genre (by popularity)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Sort by station name" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Sort songs by" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Sorting" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Source" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Sources" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Spotify login error" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "Spotify playlist's URL" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Spotify plugin" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Spotify plugin not installed" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "Spotify song's URL" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Standard" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Starred" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Start ripping" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Start the playlist currently playing" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Start transcoding" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Start typing something on the search box above to fill this search results list" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Starting %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Starting..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Stop" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Stop after" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Stop after each track" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Stop after every track" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Stop after this track" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Stop playback" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Stop playing after current track" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Stop playing after track: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Stopped" #: core/song.cpp:431 msgid "Stream" msgstr "Stream" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Streaming from a Subsonic server requires a valid server license after the 30-day trial period." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Streaming membership" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Subscribers" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Success!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "Successfully written %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Suggested tags" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Summary" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Super high (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Super high (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Supported formats" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Synchronize statistics to files now" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Syncing Spotify inbox" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Syncing Spotify playlist" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Syncing Spotify starred tracks" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "System colours" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Tabs on top" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Tag fetcher" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Target bitrate" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Text options" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Thanks to" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "The \"%1\" command could not be started." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "The album cover of the currently playing song" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "The directory %1 is not valid" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "The second value must be greater than the first one!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "The site you requested does not exist!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "The site you requested is not an image!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "The trial period for the Subsonic server is over. Please donate to get a license key. Visit subsonic.org for details." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "The version of Clementine you've just updated to requires a full library rescan because of the new features listed below:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "There are other songs in this album" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "There was a problem communicating with gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "There was a problem fetching the metadata from Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "There was a problem parsing the response from the iTunes Store" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "There were problems copying some songs. The following files could not be copied:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "There were problems deleting some songs. The following files could not be deleted:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "These files will be deleted from the device, are you sure you want to continue?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "These files will be permanently deleted from disk, are you sure you want to continue?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "These folders will be scanned for music to make up your library" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "These settings are used in the \"Transcode Music\" dialog, and when converting music before copying it to a device." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Third level" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "This action will create a database which could be as big as 150 MB.\nDo you want to continue anyway?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "This album is not available in the requested format" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "This can be changed later through the preferences" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "This device must be connected and opened before Clementine can see what file formats it supports." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "This device supports the following file formats:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "This device will not work properly" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "This is an MTP device, but you compiled Clementine without libmtp support." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "This is an iPod, but you compiled Clementine without libgpod support." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "This is the first time you have connected this device. Clementine will now scan the device to find music files - this may take some time." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "This option can be changed in the \"Behaviour\" preferences" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "This stream is for paid subscribers only" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "This type of device is not supported: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "Time step" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Title" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Today" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Toggle Pretty OSD" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Toggle fullscreen" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Toggle queue status" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Toggle scrobbling" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Toggle visibility for the pretty on-screen-display" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Tomorrow" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Too many redirects" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Top tracks" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Total albums:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Total bytes transferred" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Total network requests made" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Track" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Tracks" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Transcode Music" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Transcoder Log" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Transcoding" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Transcoding %1 files using %2 threads" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Transcoding options" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Turn off" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Ultra wide band (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Unable to connect" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Unable to download %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Unknown" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Unknown content-type" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Unknown error" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Unset cover" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Unskip selected tracks" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Unskip track" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Unsubscribe" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Upcoming Concerts" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Update" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Update all podcasts" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Update changed library folders" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Update the library when Clementine starts" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Update this podcast" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Updating" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Updating %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Updating %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Updating library" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Usage" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Use Album Artist tag when available" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Use Gnome's shortcut keys" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Use Psychedelic Colours" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Use Replay Gain metadata if it is available" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Use SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Use Wii Remote" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Use a custom colour set" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Use a custom message for notifications" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Use a network remote control" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Use authentication" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Use bitrate management engine" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Use dynamic mode" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Use notifications to report Wii Remote status" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Use temporal noise shaping" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Use the system default" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Use the system default colour set" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Use the system proxy settings" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Use volume normalisation" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Used" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "User interface" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Username" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Using the menu to add a song will..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Variable bit rate" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Various artists" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Version %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "View" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Visualisation mode" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Visualisations" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Visualisations Settings" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Voice activity detection" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Volume %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Wall" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Warn me when closing a playlist tab" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Website" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Weeks" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "When Clementine starts" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "When looking for album art Clementine will first look for picture files that contain one of these words.\nIf there are no matches then it will use the largest image in the directory." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "When saving a playlist, file paths should be" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "When the list is empty..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Why not try..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Wide band (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: activated" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: connected" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: critical battery (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: deactivated" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: disconnected" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: low battery (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Without cover:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Would you like to move the other songs in this album to Various Artists as well?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Would you like to run a full rescan right now?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Write all songs statistics into songs' files" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Write metadata" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Wrong username or password." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Year" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Year - Album" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Years" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Yesterday" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "You are about to download the following albums" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "You are about to remove %1 playlists from your favourites, are you sure?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "You are about to remove a playlist which is not part of your favourite playlists: the playlist will be deleted (this action cannot be undone). \nAre you sure you want to continue?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "You are not signed in." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "You are signed in as %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "You are signed in." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "You can change the way the songs in the library are organised." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "You can listen for free without an account, but Premium members can listen to higher quality streams without advertisements." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "You can listen to Magnatune songs for free without an account. Purchasing a membership removes the messages at the end of each track." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "You can listen to background streams at the same time as other music." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "You can use your Wii Remote as a remote control for Clementine. See the page on the Clementine wiki for more information.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "You do not have a Spotify Premium account." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "You do not have an active subscription" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "You don't need to be logged in to search and to listen to music on SoundCloud. However, you need to login to access your playlists and your stream." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "You have been logged out of Spotify, please re-enter your password in the Settings dialog." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "You have been logged out of Spotify, please re-enter your password." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "You love this track" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global shortcuts in Clementine." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "You will need to restart Clementine if you change the language." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Your IP address:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Your Last.fm credentials were incorrect" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Your Magnatune credentials were incorrect" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Your library is empty!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Your radio streams" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Your scrobbles: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Your system is missing OpenGL support, visualisations are unavailable." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Your username or password was incorrect." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "add %n songs" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "after" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "ago" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "and" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "automatic" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "before" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "between" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "biggest first" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "contains" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "disabled" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "disc %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "does not contain" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "ends with" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "equals" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "gpodder.net directory" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "greater than" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "iPods and USB devices currently don't work on Windows. Sorry!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "in the last" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "less than" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "longest first" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "move %n songs" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "newest first" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "not equals" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "not in the last" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "not on" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "oldest first" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "on" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "options" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "or scan the QR code!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "press enter" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "remove %n songs" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "shortest first" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "shuffle songs" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "smallest first" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "sort songs" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "starts with" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "stop" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "track %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/eo.po000066400000000000000000004067221260417502300236550ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Adolfo Jayme Barrientos, 2014 # Adolfo Jayme Barrientos, 2015 # Adolfo Jayme Barrientos, 2014 # FIRST AUTHOR , 2010 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Esperanto (http://www.transifex.com/davidsansome/clementine/language/eo/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: eo\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "tagoj" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " sekundoj" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "kantoj" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 albumoj" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 tagoj" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 ludlistoj (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 elektitaj el" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 kantaĵo" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 kantaĵoj" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 trakoj" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev-modulo" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n malsukcesis" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n finiĝis" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n restas" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "Propra" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Helpo" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "&Musiko" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Nenio" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "&Ludlisto" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "Eliri" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "... kaj ĉiuj Amarok-kontribuintoj" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0 px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 tago" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 trako" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "" #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ĈIUJ GLORON AL LA HIPNOBUFO" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Pri %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Pri Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Pri Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Kontodetaloj" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Kontodetaloj (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Ago" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Agado" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Ŝalti Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Aldoni fluon" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Aldoni agon" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Aldoni plian fluon..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Aldoni dosierujon..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Aldoni dosieron..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Aldoni dosierojn transkodigotajn" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Aldoni dosierujon" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Aldoni dosierujon..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Aldoni novan dosierujon..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Aldoni fluon..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Aldoni al ludlisto" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Aldoni wiimotedev-agon" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Aldoni..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Aldonita(j) ĉi-monate" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Aldonita(j) ĉi-semajne" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Aldonita(j) ĉi-jare" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Aldonita(j) hodiaŭ" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Aldonita(j) en la lastaj tri monatoj" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Detala grupigado..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Post kopiado..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Albumo" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Albumo (ideala laŭteco por ĉiuj sonaĵoj)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Albumverkinto" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Kovrilo de la albumo" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "" #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Albumoj kun kovriloj" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Albumoj sen kovriloj" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Ĉiuj dosieroj (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "Ĉiuj gloron al la Hipnobufo!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Ĉiuj albumoj" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Ĉiuj verkintoj" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Ĉiuj dosieroj (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Ĉiuj ludlistoj (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Ĉiuj tradukistoj" #: library/library.cpp:98 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Apud la originaloj" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Ĉiam kaŝi la ĉeffenestron" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Ĉiam montri la ĉeffenestron" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Eraro okazis dum ŝargado de la iTunes-datumbazo" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:85 msgid "And:" msgstr "Kaj:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Aspekto" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Aldoni dosierojn/URL al la ludlisto" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Verkinto" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Informoj pri la verkinto" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Aŭtoro" #: ui/about.cpp:68 msgid "Authors" msgstr "Aŭtoroj" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Desponeblaj" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "" #: core/database.cpp:648 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "" #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Klazika" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:114 msgid "Club" msgstr "Klubo" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Koloroj" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Komento" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Kopirajto" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Kovriloj de %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+↓" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Maj+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Maj+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Maj+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+↑" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Tagoj" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Forigi" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Detaloj…" #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Dialogujo" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Disko" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "" #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "" #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "" #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Daŭro" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Redakti…" #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "Retpoŝto" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Egalizilo" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Eraro" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:68 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Ekzistantaj kovriloj" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Dosierformo" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Dosiernomo" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Dosiernomo" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Dosieroj" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Formato" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Horoj" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hipnobufo" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Ikono" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Informoj" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:585 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Interreto" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Katidoj" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Lingvo" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "" #: library/library.cpp:80 msgid "Last played" msgstr "" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Markoj de Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Vikio de Last.fm" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Maldekstro" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Kolekto" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: ui/equalizer.cpp:137 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Ensaluti" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Elsaluti" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Modelo" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Monatoj" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Pli" #: library/library.cpp:84 msgid "Most played" msgstr "" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Muziko" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Silentigi" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Nomo" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Nomo" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "" #: library/library.cpp:74 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:92 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "" #: core/utilities.cpp:151 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Sciigoj" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Opakeco" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "" #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "" #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "" #: core/organise.cpp:73 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:139 msgid "Party" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Pasvorto" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Paŭzigi" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Bildero" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Ludi" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Ludi/paŭzigi" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Ludado" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Ludlisto" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Ludlistoj" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podkastoj" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Popo" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Pordo" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Antaŭagordo:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Progreso" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Progreso" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psikedela" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Kvalito" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Kvalito" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Pluvo" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Pluvo" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Regeo" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Reŝargi" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Dekstro" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Roko" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Serĉi" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Serĉi" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Serĉi gpodder.net-n" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Serĉa modo" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Serĉaj agordoj" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Serĉrezultoj" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Serĉesprimoj" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "" #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "" #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Ensaluti" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Grandeco" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Grandeco:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Fontoj" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "" #: core/song.cpp:431 msgid "Stream" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "" #: ui/about.cpp:74 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Titolo" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Hodiaŭ" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Morgaŭ" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Kanto" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "" #: core/song.cpp:426 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI-o" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL-o(j)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Uzado" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Fasado" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Uzulnomo" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Retejo" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Semajnoj" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Sen kovrilo:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Jaro" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Jaroj" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Hieraŭ" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Nulo" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "kaj" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/es.po000066400000000000000000005226751260417502300236670ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Coroccotta , 2012 # Adolfo Jayme Barrientos, 2014 # Adolfo Jayme Barrientos, 2012-2013 # Adolfo Jayme Barrientos, 2015 # Adolfo Jayme Barrientos, 2013 # Adolfo Jayme Barrientos, 2014 # Adrián José Prado Castro , 2013 # Adrián Ramirez Escalante , 2012 # Andrés Manglano , 2014 # Andres Sanchez <>, 2012 # Andres Sanchez , 2015 # aritzh , 2014 # Carolina Pérez Garrido , 2011-2012 # ceal105 , 2011 # Ezequiel Pochiero , 2015 # felipeacsi , 2014 # felipeacsi , 2012 # Fernando Torres , 2012 # José Antonio Moray , 2013-2014 # Roony Alvarez , 2012 # LeonimuZ , 2011 # davidsansome , 2013 # Xavier Barrachina Civera , 2012 # Ricardo Andrés , 2012 # Robin Cornelio Thomas , 2012 # Roger Pueyo Centelles , 2012 # costesito , 2012 # zeth , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Spanish (http://www.transifex.com/davidsansome/clementine/language/es/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nPuede marcar listas de reproducción como favoritas al pulsar en el icono de la estrella correspondiente\n\nSus listas favoritas se guardarán aquí" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " días" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kb/s" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr " s" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " segundos" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " canciones" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 canciones)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 álbumes" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 días" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "hace %1 días" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 en %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 listas de reproducción (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 seleccionadas de" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 canción" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 canciones" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "Se encontraron %1 canciones" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "Se encontraron %1 canciones (%2 visibles)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 pistas" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 transferido" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: módulo Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 oyentes más" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 reproducciones totales" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n falló" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n completados" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n pendientes" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Alinear el texto" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Centro" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Personalizado" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "&Extras" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "Ay&uda" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&Ocultar «%1»" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Ocultar…" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Izquierda" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "&Música" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Ninguno" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "&Lista de reproducción" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Salir" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Modo de &repetición" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Derecha" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Modo &aleatorio" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Ajustar columnas a la ventana" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Herramientas" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(diferentes a través de las canciones)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", por" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "… y a todos los colaboradores de Amarok" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 día" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 pista" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "MP3 a 128k" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192,000Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40 %" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44,100Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48,000Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 pistas al azar" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96,000Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Actualizar a Premium ahora" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Si no se activa, Clementine intentará guardar sus valoraciones y otras estadísticas en una base de datos separada, sin modificar sus archivos.

Si se activa, se guardarán las estadísticas en la base de datos y directamente en los archivos, cada vez que se modifican.

Tome en cuenta que esto podría no funcionar en todos los formatos y, como no existe un estándar, otros reproductores de música podrían no ser capaces de leerlos.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Añada un nombre de campo como prefijo para filtrar la búsqueda. P.ej., artist:Bode busca todos los artistas de la colección que contienen la palabra «Bode».

Campos disponibles: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Esto escribirá las valoraciones y estadísticas en etiquetas de archivos para todas las canciones de su colección.

Esto no es necesario si siempre se activó la opción «Guardar valoraciones y estadísticas en etiquetas de archivos».

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Las fichas de reemplazo empiezan con «%», por ejemplo: %artist %album %title

\n\n

Si marca una sección de texto que contenga una ficha de reemplazo entre llaves, esa sección no se mostrará si la ficha de reemplazo se encuentra vacía.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Se necesita una cuenta Premium de Spotify." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Solo se puede conectar un cliente si se introduce el código correcto." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Una lista de reproducción inteligente es una lista dinámica de canciones en su colección. Existen diferentes tipos de listas de reproducción inteligentes que ofrecen distintas formas de elegir canciones." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Se incluirá una canción en la lista de reproducción si coincide con estas condiciones." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A–Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ALABEMOS TODOS AL HIPNOSAPO" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Interrumpir" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Acerca de %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Acerca de Clementine" #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Acerca de Qt" #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Absolutas" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Detalles de la cuenta" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Detalles de la cuenta (premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Acción" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Acción" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Activar/desactivar Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Lista de actividades" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Añadir un podcast" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Añadir una transmisión" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Añadir una línea nueva si la permite el tipo de notificación" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Añadir una acción" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Añada todas las canciones de una carpeta y todas sus carpetas" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Añadir otra transmisión…" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Añadir una carpeta…" #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Añadir archivo" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Añadir un archivo al convertidor" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Añadir archivo(s) al convertidor" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Añadir un archivo…" #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Añadir archivos para convertir" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Añadir una carpeta" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Añadir una carpeta…" #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Añadir carpeta nueva…" #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Añadir un podcast" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Añadir un podcast…" #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Añadir término de búsqueda" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Añadir etiqueta de álbum a la canción" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Añadir etiqueta de artista del álbum a la canción" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Añadir etiqueta de artista a la canción" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Añadir valoración automática de canción" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Añadir etiqueta de compositor a la canción" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Añadir etiqueta de disco a la canción" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Añadir nombre de archivo de la canción" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Añadir etiqueta de género a la canción" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Añadir etiqueta de conjunto de la canción" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Añadir etiqueta de duración de la canción" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Añadir etiqueta de intérprete de la canción" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Añadir conteo de reproducciones de la canción" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Añadir valoración de canción" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Añadir conteo de omisiones de la canción" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Añadir etiqueta de título a la canción" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Añadir canción a la caché" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Añadir etiqueta de pista a la canción" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Añadir etiqueta de año a la canción" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Añadir canciones a Mi música al pulsar en el botón «Me encanta»" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Añadir una transmisión…" #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Añadir a Mi música" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Añadir a listas de Spotify" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Añadir a las destacadas de Spotify" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Añadir a otra lista de reproducción" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Añadir a marcadores" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Añadir a la lista de reproducción" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Añadir a la cola" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Añadir usuario/grupo a marcadores" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Añadir acción de wiimotedev" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Añadir…" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Añadidas este mes" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Añadidas esta semana" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Añadidas este año" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Añadidas hoy" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Añadidas en los últimos tres meses" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Agrupamiento avanzado…" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Después de " #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Después de copiar…" #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Álbum" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Álbum (volumen ideal para todas las pistas)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Artista del álbum" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Carátula de álbum" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Información del álbum en jamendo.com…" #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Álbumes" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Álbumes con carátulas" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Álbumes sin carátulas" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Todo" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Todos los archivos (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "¡Alabemos todos al hipnosapo!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Todos los álbumes" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Todos los artistas" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Todos los archivos (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Todas las listas de reproducción (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Todos los traductores" #: library/library.cpp:98 msgid "All tracks" msgstr "Todas las pistas" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Permitir que un cliente descargue música de este equipo." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Permitir descargas" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Permitir codificación mid/side" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Junto a los originales" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Siempre ocultar la ventana principal" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Siempre mostrar la ventana principal" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Siempre empezar a reproducir" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon Cloud Drive" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Se requiere un complemento adicional para usar Spotify en Clementine. ¿Quiere descargarlo e instalarlo ahora?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Ocurrió un error al cargar la base de datos de iTunes" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Ocurrió un error al escribir los metadatos en «%1»" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Ocurrió un error no especificado." #: ui/about.cpp:85 msgid "And:" msgstr "Y a:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Furioso" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Apariencia" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Añadir archivos/URL a la lista de reproducción" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Añadir a la lista de reproducción actual" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Añadir a la lista de reproducción" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Aplicar compresión para evitar cortes" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "¿Está seguro de que quiere eliminar la predefinición «%1»?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "¿Está seguro de que quiere restablecer las estadísticas de esta canción?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "¿Está seguro de que quiere almacenar las estadísticas en todos los archivos de su colección?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Artista" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Inf. artista" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Etiquetas del artista" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Iniciales del artista" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Preguntar al guardar" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Formato de audio" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Salida de audio" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Falló la autenticación" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Autor" #: ui/about.cpp:68 msgid "Authors" msgstr "Autores" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Auto." #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Automático" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Actualización automática" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Expandir automáticamente las categorías únicas en el árbol de la colección" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Disponible:" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Tasa de bits promedio" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Tamaño promedio de imagen" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "Podcasts de BBC" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "PPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Flujos de fondo" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Color de fondo" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Imagen de fondo" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Opacidad del fondo" #: core/database.cpp:648 msgid "Backing up database" msgstr "Respaldando la base de datos" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Balance" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "Vetar (envío a Last.fm)" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Analizador de barras" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Azul básico" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Tipo de audio básico" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Comportamiento" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Mejor" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Biografía de %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Tasa de bits" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Tasa de bits" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Tasa de bits" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Analizador de bloques" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Tipo de bloque" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Cantidad de desenfoque" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Cuerpo" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Analizador de resonancia" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Examinar…" #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Duración del búfer" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Guardando en búfer" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Creando el índice de Seafile…" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Pero estas fuentes están desactivadas:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Botones" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Compatibilidad con hojas CUE" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Ruta de la caché:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Almacenamiento en caché" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "Almacenando %1 en caché" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Cancelar" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Cancelar la descarga" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Se necesita el «captcha».\nPruebe a iniciar sesión en Vk.com en el navegador para corregir el problema." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Cambiar la carátula" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Cambiar tamaño de letra…" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Cambiar modo de repetición" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Cambiar atajo…" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Cambiar modo aleatorio" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "Cambiar la pista actualmente en reproducción" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Cambiar el idioma" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "Los cambios surtirán efecto al reproducirse la próxima canción" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "La reproducción monoaural será efectiva para las siguientes canciones en reproducción:" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Comprobar episodios nuevos" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Buscar actualizaciones" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Buscar actualizaciones…" #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Elija la carpeta de caché de Vk.com" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Elija un nombre para la lista de reproducción inteligente" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Elegir automáticamente" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Elegir color…" #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Elegir tipo de letra…" #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Elegir de la lista" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Elija cómo ordenar la lista de reproducción y cuantas canciones contendrá." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Elegir directorio de descarga de podcasts" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Elija los servicios de Internet que quiera mostrar." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Elija los sitios web que quiere que Clementine use para buscar letras de canciones." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Clásica" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Limpieza" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Vaciar" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Vaciar la lista de reproducción" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Error de Clementine" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Naranja de Clementine" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Visualización de Clementine" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine puede convertir automáticamente la música que copie a este dispositivo en un formato que pueda reproducir." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Clementine puede reproducir música que haya cargado a Amazon Cloud Drive" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine puede reproducir música que haya cargado a Box" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine puede reproducir música que haya cargado a Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine puede reproducir música que haya cargado a Google Drive" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine puede reproducir música que haya cargado a OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine puede mostrar un mensaje cuando la pista cambie." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine puede sincronizar su lista de suscripciones con sus otros equipos y aplicaciones de podcasts. Cree una cuenta." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine no pudo cargar ninguna visualización de projectM. Asegúrese de que tiene instalado Clementine adecuadamente." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Visor de imágenes de Clementine" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine no encontró resultados para este archivo" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine buscará música en:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Pulse aquí para añadir música" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Pulse aquí para marcar esta lista como favorita y añadirla al panel «Listas de reproducción» de la barra lateral" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Pulse para cambiar entre tiempo restante y tiempo total" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Al pulsar Iniciar sesión se abrirá un navegador web. Una vez que inicie sesión, regrese a Clementine." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Cerrar" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Cerrar lista de reproducción" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Cerrar la visualización" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Si cierra esta ventana, se cancelará la descarga." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Si cierra esta ventana, se detendrá la búsqueda de carátulas para los álbumes." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Colores" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Lista separada por comas de la clase:nivel, el nivel es 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Comentario" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Radio de la comunidad" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Completar etiquetas automáticamente" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Completar etiquetas automáticamente…" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Compositor" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Configurar %1…" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Configurar Magnatune…" #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Configurar atajos" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Configurar Spotify…" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Configurar Subsonic…" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Configurar Vk.com…" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Configurar búsqueda global…" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Configurar colección…" #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Configurar podcasts…" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Configurar…" #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Conectar Wii Remotes usando acción de activar/desactivar" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Conectar dispositivo" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Conectando con Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "El servidor rechazó la conexión. Compruebe el URL del servidor. Ejemplo: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Se agotó el tiempo de espera de la conexión. Compruebe el URL del servidor. Ejemplo: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Hay un problema de conexión o el propietario desactivó el audio" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Consola" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Tasa de bits constante" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Convertir toda la música" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Convertir cualquier música que el dispositivo no pueda reproducir" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Convertir archivos de audio sin perdidas antes de enviarlos al control remoto." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Convertir archivos de audio sin pérdidas" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Copiar URL para compartir en portapapeles" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Copiar en el portapapeles" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Copiar en un dispositivo…" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Copiar en la colección…" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Copyright" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "No se pudo conectar a Subsonic. Compruebe el URL del servidor. Ejemplo: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "No se pudo crear el elemento «%1» de GStreamer. Asegúrese de tener instalados todos los complementos necesarios de GStreamer." #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "No se pudo crear la lista de reproducción" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "No se pudo encontrar un muxer para %1, compruebe que tiene instalados los complementos correctos de GStreamer" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "No se pudo encontrar un codificador para %1, compruebe que tiene instalados los complementos de GStreamer correctos" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "No se pudo abrir el archivo de salida %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Gestor de carátulas" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Carátula desde imagen incrustada" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Carátula cargada automáticamente desde %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Carátula eliminada manualmente" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Carátula no definida" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Carátula definida desde %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Carátulas de %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Fundido encadenado al cambiar pistas automáticamente" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Fundido encadenado al cambiar pistas manualmente" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Abajo" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Mayús+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Mayús+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Mayús+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Arriba" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Personalizado" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Imagen personalizada:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Configuración de mensaje personalizado" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Personalizado…" #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "Ruta de DBus" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dance" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Se detectó un daño en la base de datos. Lea https://code.google.com/p/clementine-player/wiki/DatabaseCorruption para instrucciones para recuperar su base de datos" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Fecha de creación" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Fecha de modificación" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Días" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "Pre&determinado" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Disminuir el volumen un 4 %" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Reducir el volumen en %" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Disminuir volumen" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Imagen de fondo predeterminada" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Dispositivo predeterminado en %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Valores predeterminados" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Retardo entre visualizaciones" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Eliminar" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Eliminar datos descargados" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Eliminar archivos" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Eliminar del dispositivo…" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Eliminar del disco…" #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Eliminar episodios reproducidos" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Eliminar predefinición" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Eliminar lista de reproducción inteligente" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Eliminar los archivos originales" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Eliminando los archivos" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Quitar las pistas seleccionadas de la cola" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Quitar la pista de la cola" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Destino" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Detalles…" #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Dispositivo" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Propiedades del dispositivo" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Nombre del dispositivo" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Propiedades del dispositivo…" #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Dispositivos" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Diálogo" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Quiso decir" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Contraseña de Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Nombre de usuario de Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Conexión directa a Internet" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Directorio" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Desactivar duración" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Desactivar generación de barras de ánimo" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Desactivado" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Desactivado" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Disco" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Transmisión discontinua" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Opciones de visualización" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Mostrar el mensaje en pantalla (OSD)" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Volver a analizar toda la colección" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Volver a analizar toda la colección" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Volver a analizar toda la colección..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "No convertir ninguna pista" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "No sobrescribir" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "Al realizar el análisis completo se perderán los metadatos guardados en Clementine, como las carátulas, el número de reproducciones y las valoraciones. Clementine volverá a analizar toda su música en Google Drive, lo que puede llevar algún tiempo." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "No repetir" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "No mostrar en Varios artistas" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "No mostrar episodios escuchados" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "No mezclar" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "No detener" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Donar" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Pulse dos veces para abrir" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "Al pulsar dos veces sobre una canción en la lista de reproducción..." #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Al pulsar dos veces sobre una canción…" #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Descargar %n episodios" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Carpeta de descargas" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Descargar episodios en" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Membresía para descarga" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Descargar episodios nuevos automáticamente" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Descarga en cola" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Configuración de descargas" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Descargue la aplicación para Android" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Descargar este álbum" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Descargar este álbum…" #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Descargar este episodio" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Descargar…" #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Descargando (%1%)…" #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Descargando el directorio de Icecast" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Descargando el catálogo de Jamendo" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Descargando el catálogo de Magnatune" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Descargando el complemento de Spotify" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Descargando los metadatos" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Arrastre para reposicionar" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dubstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Duración" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Modo dinámico activado" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Mezcla dinámica aleatoria" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Editar lista de reproducción inteligente…" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Editar la etiqueta «%1»…" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Editar etiqueta…" #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Editar etiquetas" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Editar información de la pista" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Editar información de la pista…" #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Editar información de las pistas…" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Editar…" #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "Correo electrónico" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Activar compatibilidad con Wii Remote" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Activar almacenamiento en caché automático" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Activar el ecualizador" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Activar atajos solo cuando Clementine tenga el foco" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Editar metadatos de canciones directamente" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Active los siguientes orígenes para incluirlos en los resultados de búsqueda. Los resultados se mostrarán en este orden." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Activar/desactivar scrobbling de Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Complejidad de codificación" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Calidad del motor de codificación" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Modo de codificación" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Escriba un URL" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Escriba un URL para descargar una carátula de la Internet:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Escriba un nombre de archivo para las carátulas exportadas (sin extensión):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Escriba un nombre nuevo para esta lista de reproducción" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Escriba términos de búsqueda arriba para encontrar música en su equipo y en la Internet" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Escriba términos de búsqueda para encontrar podcasts en la tienda iTunes" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Escriba términos de búsqueda para encontrar podcasts en gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Escriba términos de búsqueda aquí" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Escriba el URL de un flujo de radio por Internet:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Escriba el nombre de la carpeta" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Escriba esta IP en la aplicación para conectarse con Clementine." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Colección completa" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Ecualizador" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Equivalente a --log-levels*:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Equivalente a --log-levels*:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Error" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Error al copiar desde CD" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Error al conectar al dispositivo MTP" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Error al copiar las canciones" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Error al eliminar canciones" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Error al descargar el complemento de Spotify" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Error al cargar %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Error al cargar la lista de reproducción de di.fm" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Error al procesar %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Error al cargar el CD de audio" #: library/library.cpp:68 msgid "Ever played" msgstr "Reproducidas alguna vez" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Cada 10 minutos" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Cada 12 horas" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Cada 2 horas" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Cada 20 minutos" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Cada 30 minutos" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Cada 6 horas" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Cada hora" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Excepto entre pistas del mismo álbum, o en la misma hoja CUE" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Carátulas existentes" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Expandir" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Caduca el %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Exportar carátulas" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Exportar carátulas" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Exportar carátulas descargadas" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Exportar carátulas incrustadas" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Exportación finalizada" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Se exportaron %1 carátulas de %2 (se omitieron %3)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Fundido al pausar y al reanudar" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Desvanecer al detener una pista" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Fundido" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Duración del fundido" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Falló la lectura de la unidad de CD" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "No se pudo obtener el directorio" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "No se pudieron obtener los podcasts" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "No se pudo cargar el podcast" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "No se pudo analizar el XML de este canal RSS" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Rápida" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Pistas favoritas" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Descargar las carátulas faltantes" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Obtener automáticamente" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Descarga completada" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Obteniendo biblioteca de Subsonic" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Error al obtener la carátula" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Formato de archivo" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Extensión del archivo" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Formatos de archivo" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Nombre del archivo" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Nombre del archivo (sin ruta)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Patrón de nombre de archivo:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Rutas de archivos" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Tamaño del archivo" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Tipo de archivo" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Nombre del archivo" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Archivos" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Archivos para convertir" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Encontrar canciones en su colección que coinciden con el criterio que especificó." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Encontrar este artista" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Identificando la canción" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Finalizar" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Primer nivel" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Ajustar carátula a anchura" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Tamaño de letra" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Por motivos de la licencia, para usar Spotify se necesita un complemento separado." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Forzar la codificación monoaural" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Olvidar dispositivo" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Olvidar un dispositivo lo eliminará de la lista y Clementine tendrá que volver a examinar todas las canciones la próxima vez que lo conecte." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Formulario" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Formato" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Tasa de muestreo" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Cuadros por búfer" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Congelado" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Graves completos" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Graves y agudos completos" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Agudos completos" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "General" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Configuración general" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Género" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Obtener un URL para compartir esta canción de Spotify" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Obtener un URL para compartir esta lista de reproducción" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Obteniendo canales" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Obteniendo transmisiones" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Dele un nombre:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Ir" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Ir a la siguiente lista de reproducción" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Ir a la lista de reproducción anterior" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Se obtuvieron %1 carátulas de %2 (%3 fallaron)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Oscurecer canciones inexistentes de mis listas de reproducción" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Agrupar colección por…" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Agrupar por" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Agrupar por álbum" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Agrupar por artista" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Agrupar por artista/álbum" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Agrupar por artista/año - álbum" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Agrupar por género/álbum" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Agrupar por género/artista/álbum" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Conjunto" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "La página HTML no contiene ningún canal RSS" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "Se recibió el código de estado de HTTP 3xx sin un URL. Compruebe la configuración del servidor." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "Proxy HTTP" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Alegre" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Información del hardware" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "La información del hardware solo está disponible cuando el dispositivo se encuentra conectado." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Alto" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Alta (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Alta (1024 × 1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "Hip hop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "No se encontró el equipo, compruebe el URL del servidor. Ejemplo: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Horas" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hipnosapo" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "No tengo una cuenta en Magnatune" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Icono" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Iconos en la parte superior" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Identificando la canción" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Al activar esta opción, podrá pulsar en la canción seleccionada de la lista de reproducción y editar los valores directamente" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Si continúa, este dispositivo funcionará con lentitud y las canciones que se copien a él podrían no funcionar." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Si conoce el URL de un podcast, escríbalo a continuación y pulse en Ir." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Ignorar «The» en los nombres de artistas" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Imágenes (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Imágenes (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Importar…" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "En %1 días" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "En %1 semanas" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "En el modo dinámico las canciones nuevas se elegirán y añadirán a la lista de reproducción cada vez que termine una canción." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Bandeja de entrada" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Incluir carátula en la notificación" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Incluir todas las canciones" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Versión del protocolo REST de Subsonic incompatible. El cliente debe actualizarse." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Versión del protocolo REST de Subsonic incompatible. El servidor debe actualizarse." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "La configuración está incompleta. Asegúrese de que ha rellenado todos los campos." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Incrementar el volumen en 4 %" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Aumentar el volumen en %" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Aumentar volumen" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Indizando %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Información" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Opciones de entrada" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Insertar…" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Instalado" #: core/database.cpp:585 msgid "Integrity check" msgstr "Comprobación de integridad" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Proveedores en Internet" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Servicios en Internet" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "Pistas de introducción" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Clave API no válida" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Formato no válido" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Método no válido" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Parámetros no válidos" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Se especificó un recurso no válido" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Servicio no válido" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Clave de sesión no válida" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Invertir la selección" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Pistas más escuchadas de Jamendo" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Mejores pistas de Jamendo" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Mejores pistas del mes en Jamendo" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Mejores pistas de la semana en Jamendo" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Base de datos de Jamendo" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Ir a la pista anterior" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Saltar a la pista en reproducción" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Oprima los botones por %1 segundo…" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Oprima los botones por %1 segundos…" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Seguir ejecutando el programa en el fondo al cerrar la ventana" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Mantener los archivos originales" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Gatitos" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Idioma" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Portátil/auriculares" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Salón grande" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Carátula de álbum grande" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Carátula de álbum grande (detalles abajo)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Carátula de álbum grande (sin detalles)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Barra lateral grande" #: library/library.cpp:80 msgid "Last played" msgstr "Últimas reproducidas" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Última reproducción" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm está saturado en este momento, inténtelo de nuevo en unos minutos" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Contraseña de Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "N.º de reproducciones en Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Etiquetas de Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Nombre de usuario de Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Wiki de Last.fm" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Pistas menos favoritas" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Izquierda" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Duración" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Colección" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Agrupamiento avanzado de la colección" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Aviso de reanálisis de la colección" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Buscar en la colección" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Límites" #: ui/equalizer.cpp:137 msgid "Live" msgstr "En vivo" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Cargar" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Cargar carátula desde un URL" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Cargar carátula desde un URL…" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Cargar carátula desde el disco" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Cargar carátula desde disco…" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Cargar lista de reproducción" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Cargar lista de reproducción…" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Cargando el dispositivo MTP" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Cargando la base de datos del iPod" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Cargando lista de reproducción inteligente" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Cargando las canciones" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Cargando el flujo" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Cargando las pistas" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Cargando información de pistas" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Cargando…" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Carga archivos/URL, reemplazando la lista de reproducción actual" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Acceder" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Falló el inicio de sesión" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Salir" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Perfil de predicción a largo plazo (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Me encanta" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "Marcar como preferida (envío a Last.fm)" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Baja (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Baja (256 × 256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Perfil de baja complejidad (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Letra" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Letra de %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Letra de la etiqueta ID3v2" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "MP4 AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Descarga de Magnatune" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Descarga de Magnatune finalizada" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Perfil principal (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Así sea" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Así sea" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Hacer disponible la lista de reproducción sin conexión" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Respuesta con formato incorrecto" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Configuración manual del proxy" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Manualmente" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Fabricante" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Marcar como escuchado" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Marcar como nuevo" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Coincide cualquier término de búsqueda (Y)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Coincide uno o más términos de búsqueda (O)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Resultados de búsqueda globales máximos" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Tasa de bits máxima" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "El soporte ha cambiado. Cargando de nuevo" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Media (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Media (512 × 512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Tipo de membresía" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Tasa de bits mínima" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Valor mínimo de memoria" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Faltan las predefiniciones de projectM" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Modelo" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Monitorizar cambios en la colección" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Reproducción monoaural" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Meses" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Ánimo" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Estilo de barra de ánimo" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Barras de ánimo" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Más" #: library/library.cpp:84 msgid "Most played" msgstr "Más reproducidas" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Punto de montaje" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Puntos de montaje" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Mover hacia abajo" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Mover a la colección…" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Mover hacia arriba" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Música" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Colección musical" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Silenciar" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Mis álbumes" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Mi música" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Mis recomendaciones" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Nombre" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Nombre" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Opciones de nombrado" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Banda estrecha (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Proxy de la red" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Control remoto de red" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Nunca" #: library/library.cpp:74 msgid "Never played" msgstr "Nunca reproducidas" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Nunca comenzar la reproducción" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Carpeta nueva" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Lista de reproducción nueva" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Lista de reproducción inteligente nueva…" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Canciones nuevas:" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Las pistas nuevas se añadirán automáticamente." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Pistas más recientes" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Siguiente" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Pista siguiente" #: core/utilities.cpp:151 msgid "Next week" msgstr "Próxima semana" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Sin analizador" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Sin imagen de fondo" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "No hay ninguna carátula que exportar." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Sin bloques largos" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "No se encontraron coincidencias. Limpie el cuadro de búsqueda para mostrar la lista completa de nuevo." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Sin bloques cortos" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Ninguno" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Ninguna de las canciones seleccionadas fue apta para copiarse en un dispositivo" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Normal" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Tipo de bloque normal" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "No disponible al utilizar una lista de reproducción dinámica" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "No conectado" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "No hay contenido suficiente" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "No hay seguidores suficientes" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "No hay miembros suficientes" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "No hay vecinos suficientes" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "No instalado" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "No inició sesión" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Sin montar. Pulse dos veces para montar" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "No se encontró ningún resultado" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Tipo de notificación" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Notificaciones" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "En reproducción" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Cantidad de episodios que mostrar" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Previsualización del OSD" #: widgets/osd.cpp:173 msgid "Off" msgstr "Desactivado" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "Activado" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Solo aceptar conexiones de clientes en los rangos de IP:\n10.x.x.x\n172.16.0.0 – 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Solo permitir conexiones provenientes de la red local" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Solo mostrar el primero" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Opacidad" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Abrir %1 en el navegador" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Abrir un &CD de sonido…" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Abrir un archivo OPML" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Abrir un archivo OPML…" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Abra una carpeta de la que importar música" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Abrir dispositivo" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Abrir un archivo…" #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Abrir en Google Drive" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Abrir en una lista de reproducción nueva" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Abrir en una lista nueva" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Abrir en el navegador" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Abrir…" #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Falló la operación" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Optimizar para tasa de bits" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Optimizar para calidad" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Opciones…" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Organizar archivos" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Organizar archivos…" #: core/organise.cpp:73 msgid "Organising files" msgstr "Organizando los archivos" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Etiquetas originales" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "Año original" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "Año original - Álbum" #: library/library.cpp:118 msgid "Original year tag support" msgstr "Compatibilidad con etiqueta de año original" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Otras opciones" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Salida" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Dispositivo de salida" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Opciones de salida" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Sobreescribir todo" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Sobreescribir los archivos existentes" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Sobreescribir solo las más pequeñas" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Propietario" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Analizando el catálogo de Jamendo" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Fiesta" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Contraseña" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Pausar" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Pausar la reproducción" #: widgets/osd.cpp:156 msgid "Paused" msgstr "En pausa" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Intérprete" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Píxel" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Barra lateral simple" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Reproducir" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "N.º de reproducciones" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Reproducir si está detenida, pausar si se está reproduciendo" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Reproducir si no hay nada en reproducción" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Reproducir la .ª pista de la lista de reproducción" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Reproducir/pausar" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Reproducción" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Opciones del reproductor" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Lista de reproducción" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Lista de reproducción finalizada" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Opciones de la lista de reproducción" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Tipo de lista de reproducción" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Listas" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Cierre el navegador y regrese a Clementine." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Estado del complemento:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcasts" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Duración de la notificación" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Puerto" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Preamp." #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Preferencia" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Preferencias" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Preferencias…" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Nombres de archivo preferidos para las carátulas (separados por comas)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Formato de audio preferido" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Tasa de bits preferida" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Formato preferido" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Tipo de audio premium" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Predefinición:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Pulse una combinación de botones que usar para" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Pulse una tecla" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Oprima una combinación de teclas para usar con %1…" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Al pulsar en el botón «Anterior» del reproductor…" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Opciones del OSD estético" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Previsualización" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Anterior" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Pista anterior" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Mostrar información de versión" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Perfil" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Progreso" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Progreso" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psicodélico" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Pulse el botón del Wiiremote" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Poner canciones en un orden aleatorio" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Calidad" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Calidad" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Consultando dispositivo…" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Gestor de la cola" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Añadir las pistas seleccionadas a la cola" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Añadir a la cola de reproducción" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (volumen igual para todas las pistas)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Lluvia" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Lluvia" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Visualización al azar" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Valorar la canción actual con 0 estrellas" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Valorar la canción actual con 1 estrella" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Valorar la canción actual con 2 estrellas" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Valorar la canción actual con 3 estrellas" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Valorar la canción actual con 4 estrellas" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Valorar la canción actual con 5 estrellas" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Clasificación" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "¿Realmente quiere cancelar?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Se excedió el límite de redirecciones, compruebe la configuración del servidor." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Actualizar el catálogo" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Actualizar los canales" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Actualizar lista de estaciones" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Actualizar transmisiones" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Relativas" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Recordar el movimiento del Wii Remote" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Recordar la última vez" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Recordar mi elección" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Quitar" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Eliminar acción" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Eliminar duplicados de la lista de reproducción" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Quitar carpeta" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Quitar de Mi música" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Quitar de marcadores" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Eliminar de la lista de reproducción" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Eliminar lista de reproducción" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Eliminar listas de reproducción" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Quitar pistas no disponibles de la lista de reproducción" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Renombrar lista de reproducción" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Renombrar lista de reproducción…" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Reenumerar pistas en este orden…" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Repetir" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Repetir álbum" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Repetir lista de reproducción" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Repetir pista" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Reemplazar lista de reproducción actual" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Reemplazar la lista de reproducción" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Reemplazar espacios con guiones bajos" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Modo de regulación de volumen" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Rellenar" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Solicitar un código de autenticación" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Restablecer" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Reiniciar contador de reproducciones" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Reiniciar la pista e ir a la anterior si se pulsa de nuevo" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Reiniciar la pista, o cambiar a la anterior si no han transcurrido 8 segundos desde el inicio." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Restringir a caracteres ASCII" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Reanudar la reproducción al iniciar" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Volver a Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Derecha" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Extraer" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Extraer CD" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Extraer CD de sonido" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Ejecutar" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "Proxy para SOCKS" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Error del protocolo de enlace SSL, compruebe la configuración del servidor. La opción de SSLv3 podría solucionar algunos errores temporalmente." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Quitar dispositivo con seguridad" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Quitar dispositivo con seguridad después de copiar" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Tasa de muestreo" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Tasa de muestreo" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Guardar archivos .mood en la colección musical" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Guardar la carátula del álbum" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Guardar la carátula en el disco…" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Guardar imagen" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Guardar lista de reproducción" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Guardar lista de reproducción" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Guardar lista de reproducción…" #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Guardar la predefinición" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Guardar valoraciones en las etiquetas de los archivos si es posible" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Guardar estadísticas en las etiquetas de los archivos si es posible" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Guardar este flujo en la pestaña de Internet" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Guardando las estadísticas en los archivos de las canciones" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Guardando las pistas" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Perfil de tasa de muestreo escalable (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Tamaño de escala" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Valoración" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Enviar las pistas que reproduzco" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Buscar" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Buscar" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Buscar estaciones Icecast" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Buscar en Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Buscar en Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Buscar en Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Buscar automáticamente" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Buscar la carátula del álbum…" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Buscar cualquier cosa" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Buscar en gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Buscar en iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Modo de búsqueda" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Opciones de búsqueda" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Resultados de búsqueda" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Términos de búsqueda" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Segundo nivel" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Retroceder" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Avanzar" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Moverse en la pista actual hacia una posición relativa" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Moverse en la pista actual hacia una posición absoluta" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "Moverse en la pista usando un atajo" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Seleccionar todo" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "No seleccionar nada" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Elija el color de fondo:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Elija la imagen de fondo" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Seleccionar la mejor coincidencia posible" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Elija el color de frente:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Elegir visualizaciones" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Elegir visualizaciones…" #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Seleccionar..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "N.º de serie" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Servidor" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "URL del servidor" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Detalles del servidor" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Servicio fuera de línea" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Establecer %1 a «%2»…" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Establecer el volumen en por ciento" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Establecer valor para todas las pistas seleccionadas…" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Configuración" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Atajo" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Atajo para %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Ya existe un atajo para %1" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Mostrar" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Mostrar OSD" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Mostrar una animación de brillo en la pista actual" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Mostrar barra de ánimo en la barra de progreso de reproducción" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Mostrar la notificación propia del escritorio" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Mostrar una notificación al cambiar entre los modos repetir/aleatorio" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Mostrar una notificación al cambiar el volumen" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Mostrar una notificación al pausar la reproducción" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Mostrar un mensaje emergente en el área de notificación" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Mostrar OSD estético" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Mostrar sobre la barra de estado" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Mostrar todas las canciones" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Mostrar todas las canciones" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Mostrar las carátulas en la colección" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Mostrar divisores" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Mostrar a tamaño completo…" #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Mostrar grupos en los resultados de la búsqueda global" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Mostrar en el gestor de archivos…" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Mostrar en colección..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Mostrar en Varios artistas" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Mostrar barra de ánimo" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Mostrar solo los duplicados" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Solo mostrar no etiquetadas" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Mostrar la canción en reproducción en la página personal" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Mostrar sugerencias de búsquedas" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Mostrar el botón «Me encanta»" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Mostrar el botón para hacer scrobbling en la ventana principal" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Mostrar icono en el área de notificación" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Mostrar cuáles fuentes están activadas y desactivadas" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Mostrar/ocultar" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Aleatorio" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Mezclar álbumes" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Mezclar todo" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Mezclar lista de reproducción" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Mezclar canciones de este álbum" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Iniciar sesión" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Cerrar sesión" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Iniciando sesión…" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Artistas similares" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Tamaño" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Tamaño:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Saltar hacia atrás en la lista de reproducción" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "N.º de omisiones" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Saltar hacia adelante en la lista de reproducción" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Omitir pistas seleccionadas" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Omitir pista" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Carátula de álbum pequeña" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Barra lateral pequeña" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Lista de reproducción inteligente" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Listas de reproducción inteligentes" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Información de la canción" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Inf. canción" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonograma" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Lo sentimos" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Ordenar por género (alfabéticamente)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Ordenar por género (popularidad)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Ordenar por nombre de estación" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Ordenar canciones por" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Ordenación" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Origen" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Orígenes" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Error de inicio de sesión de Spotify" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "URL de lista de Spotify" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Complemento de Spotify" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "El complemento de Spotify no está instalado" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "URL de canción de Spotify" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Estándar" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Destacado" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Iniciar extracción" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Iniciar la lista de reproducción actualmente en reproducción" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Iniciar la conversión" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Comience a escribir en el cuadro de búsqueda anterior para obtener resultados en esta lista" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Iniciando %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Iniciando…" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Detener" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Detener después de" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Detener reproducción al finalizar cada pista" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Detener reproducción al finalizar cada pista" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Detener reproducción al finalizar la pista" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Detener reproducción" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Detener la reproducción después de la pista actual" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Detener reproducción tras la pista: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Detenido" #: core/song.cpp:431 msgid "Stream" msgstr "Transmisión" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Se necesita una licencia válida para hacer streaming desde un servidor de Subsonic después del período de prueba de 30 días." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Membresía para streaming" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Suscriptores" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Exitoso" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "%1 se ha escrito correctamente" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Etiquetas sugeridas" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Resumen" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Muy alta (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Muy alta (2048 × 2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Formatos admitidos" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Sincronizar estadísticas a los archivos ahora" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Sincronizando bandeja de entrada de Spotify" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Sincronizando lista de reproducción de Spotify" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Sincronizando canciones destacadas de Spotify" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Colores del sistema" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Pestañas en la parte superior" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Obtener etiquetas" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Tasa de bits de destino" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Tecno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Opciones del texto" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Agradecimientos" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "No se pudo iniciar la orden «%1»." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "La carátula del álbum de la canción en reproducción" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "La carpeta %1 no es válida" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "El segundo valor debe ser mayor al primero." #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "El sitio que indicó no existe." #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "El sitio que indicó no es una imagen." #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Ha terminado el período de prueba del servidor de Subsonic. Haga una donación para obtener una clave de licencia. Visite subsonic.org para más detalles." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "La versión de Clementine a la que se acaba de actualizar necesita volver a analizar la colección debido a las nuevas funciones que se listan a continuación:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Hay otras canciones en este álbum" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Hubo un problema al comunicarse con gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Hubo un problema al obtener los metadatos desde Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Hubo un problema al analizar la respuesta de la tienda iTunes" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Hubo problemas al copiar algunas canciones. No se pudieron copiar los siguientes archivos:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Hubo problemas al eliminar algunas canciones. No se pudieron eliminar los siguientes archivos:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Se eliminarán estos archivos del dispositivo, ¿está seguro de que quiere continuar?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Se eliminarán estos archivos del disco permanentemente. ¿Está seguro de que quiere continuar?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Estas carpetas se analizarán en busca de música para crear su colección" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Esta configuración se usa en la ventana «Convertir música» y al convertir música antes de copiarla en un dispositivo." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Tercer nivel" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Esto creará una base de datos que podría llegar hasta los 150 MB.\n¿Quiere continuar de todas formas?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Este álbum no está disponible en el formato solicitado" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Esta opción puede modificarse luego en Preferencias" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Este dispositivo debe conectarse y abrirse antes de que Clementine pueda ver qué formatos de archivo admite." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Este dispositivo admite los formatos de archivo siguientes:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Este dispositivo no funcionará correctamente" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Este es un dispositivo MTP, pero se compiló Clementine sin la compatibilidad con libmtp." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Este es un iPod, pero se compiló Clementine sin la compatibilidad con libgpod." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Esta es la primera vez que conecta este dispositivo. Clementine analizará el dispositivo ahora para encontrar archivos de música; esto podría tomar algo de tiempo." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Puede modificar esta opción en la pestaña «Comportamiento» en Preferencias" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Este flujo es solo para los suscriptores de pago" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "No se admite este tipo de dispositivo: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "Salto en el tiempo" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Título" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Hoy" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Conmutar OSD estético" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Pantalla completa" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Cambiar estado de la cola" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Activar o desactivar scrobbling" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Cambiar visibilidad del OSD estético" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Mañana" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Demasiadas redirecciones" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Mejores pistas" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Álbumes totales:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Total de bytes transferidos" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Total de solicitudes hechas a la red" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Pista" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Pistas" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Convertir música" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Registro del convertidor" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Conversión" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Convirtiendo %1 archivos usando %2 procesos" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Opciones de conversión" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbina" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Apagar" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Banda ultraancha (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Falló la conexión" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "No se puede descargar %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Desconocido" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Tipo de contenido desconocido" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Error desconocido" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Eliminar la carátula" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "No omitir pistas seleccionadas" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "No omitir pista" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Cancelar suscripción" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Próximos conciertos" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Actualizar" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Actualizar todos los podcasts" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Actualizar carpetas de la colección modificadas" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Actualizar la colección cuando inicie Clementine" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Actualizar este podcast" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Actualización" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Actualizando %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Actualizando… (%1%)" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Actualizando la colección" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Uso" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Usar etiqueta Artista del álbum cuando esté disponible" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Usar las combinaciones de teclas de Gnome" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Usar colores psicodélicos" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Usar metadatos de Replay Gain si están disponibles" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Utilizar SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Usar Wii Remote" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Usar un conjunto de colores personalizado" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Usar un mensaje personalizado para las notificaciones" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Usar un control remoto de red" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Utilizar autenticación" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Usar el motor de gestión de flujo de bits" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Usar modo dinámico" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Usar notificaciones para informar del estado del Wii Remote" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Usar modelado de ruido temporal" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Usar los ajustes predeterminados del sistema" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Utilizar el conjunto de colores del sistema" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Utilizar la configuración de proxy del sistema" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Usar normalización de volumen" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "En uso:" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Interfaz de usuario" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Nombre de usuario" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Al usar el menú para añadir una canción…" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Tasa de bits variable" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Varios artistas" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Versión %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Ver" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Modo de visualización" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Visualizaciones" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Configuración de visualizaciones" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Detección de actividad de voz" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Volumen al %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Muro" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Avisarme antes de cerrar una pestaña de lista de reproducción" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Sitio web" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Semanas" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Cuando Clementine inicia" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "En la búsqueda de carátulas, Clementine buscará primero imágenes que contienen una de estas palabras.\nSi no hay resultados, entonces se usará la imagen más grande en la carpeta." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "Al guardar una lista de reproducción, las rutas de archivo deben ser" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Cuando la lista esté vacía…" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Por qué no intenta…" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Banda ancha (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: activo" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: conectado" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: batería en estado crítico (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: desactivado" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: desconectado" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: batería baja (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Audio de Windows Media" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Sin carátula:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "¿Le gustaría mover también las otras canciones de este álbum a Varios artistas?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "¿Quiere ejecutar un reanálisis completo ahora?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Escribir las estadísticas de todas las canciones en los archivos" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Guardar los metadatos" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Nombre de usuario o contraseña incorrectos." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Año" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Año–álbum" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Años" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Ayer" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Está a punto de descargar los álbumes siguientes" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "¿Está seguro de que quiere eliminar %1 listas de reproducción de sus favoritos?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Está a punto de eliminar permanentemente una lista de reproducción que no está entre sus favoritas.\n¿Está seguro de que quiere continuar?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "No ha iniciado sesión." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Ha iniciado sesión como %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Ha iniciado sesión." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Puede modificar el modo en que se organizan las canciones en la colección." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Puede escuchar gratuitamente sin cuenta de usuario, pero los miembros Premium pueden escuchar transmisiones de calidad más alta sin publicidad." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Puede escuchar canciones de Magnatune gratis sin la necesidad de una cuenta. Comprar una cuenta elimina el mensaje al final de cada canción." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Puede escuchar flujos de fondo al mismo tiempo que a otra música." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Puede usar su Wii Remote como un mando a distancia para Clementine. Visite la página en el wiki de Clementine para más información.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "No tiene una cuenta Premium de Spotify." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "No tiene una suscripción activa" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "No es necesario iniciar sesión para buscar y escuchar música de SoundCloud. Sin embargo, debe iniciar sesión para acceder a sus listas de reproducción y actualizaciones." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Ha cerrado la sesión de Spotify. Vuelva a escribir su contraseña en el diálogo de Configuración." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Ha cerrado la sesión de Spotify. Vuelva a escribir su contraseña." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Esta canción es una de sus favoritas" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "Abra Preferencias del sistema y permita que Clementine «controle el equipo» para utilizar los atajos globales en Clementine." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Necesitará reiniciar Clementine si cambia el idioma." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Su dirección IP:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Las credenciales de Last.fm son incorrectas" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Las credenciales de Magnatune son incorrectas" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "La colección está vacía." #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Sus flujos de radio" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Sus envíos: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "El sistema no es compatible con OpenGL. Las visualizaciones no están disponibles." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Su nombre de usuario o contraseña es incorrecta." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z–A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Cero" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "añadir %n pistas" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "después" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "atrás" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "y" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "automático" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "antes" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "entre" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "más grande primero" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "ppm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "contiene" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "desactivado" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "disco %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "no contiene" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "termina con" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "es igual a" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "Directorio de gpodder.net" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "mayor que" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "Los iPod y los dispositivos USB no funcionan en Windows actualmente. Disculpe las molestias." #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "en los últimos" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kb/s" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "menor que" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "más largo primero" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "mover %n canciones" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "más nuevo primero" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "no es igual a" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "no en los últimos" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "no en" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "más antiguo primero" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "en" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "opciones" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "o escanee el código QR" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "oprima intro" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "quitar %n canciones" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "más corto primero" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "canciones aleatorias" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "más pequeño primero" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "ordenar canciones" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "comienza con" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "detener" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "pista %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/et.po000066400000000000000000004173131260417502300236600ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # FIRST AUTHOR , 2010 # Rivo Zängov , 2011, 2012 # spil , 2013 # Руслан , 2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Estonian (http://www.transifex.com/davidsansome/clementine/language/et/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: et\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " msek" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " punkti" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " sekundit" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " laulu" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 albumit" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 päeva" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 päeva tagasi" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 плейлист (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "выбрано %1 из" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 lugu" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 lugu" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "Leiti %1 lugu" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "Найдено %1 записей (показано %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 pala" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: moodul Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n ebaõnnestus" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n lõpetatud" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "jäänud %n" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Keskele" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Kohandatud" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "Lisad" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "Abi" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "Peida %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "Peida..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Vasakule" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "Muusika" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Puudub" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "Lugude nimekiri" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Välju" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Kordav režiim" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Paremale" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Segatud režiim" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "Растянуть столбцы по размеру окна" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "Töövahendid" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "..ja kõik Amaroki toetajad" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 päev" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 lugu" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 случайных треков" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Купить Премиум" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Интеллектуальный плейлист - это динамический список аудиозаписей, который приходит из вашей бибилиотеки. Существуют разные типы интеллектуальных плейлистов с различными способами выбора записей." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "%1 info" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Clementine info..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Qt info..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Konto üksikasjad" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Банковские реквизиты (Премиум)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Toiming" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Aktiveeri/deaktiveeri Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Raadiovoo lisamine" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Lisa tegevus" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Lisa kaust..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Lisa fail..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Lisa failid Transkodeerimisele" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Lisa kaust" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Lisa kaust..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Lisa uus kaust..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Lisa raadiovoog..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Lisa esitusnimekirja" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Lisa wiimotedev tegevus" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Lisa..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Lisatud sel kuul" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Lisatud sel nädalal" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Lisatud sel aastal" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Lisatud täna" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Lisatud kolme kuu jooksul" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Pärast kopeerimist..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Album (kõigil radadel ideaalne valjus)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Albumi esitaja" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "" #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Album koos kaanega" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Kõik failid (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Kõik albumid" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Kõikesitajad" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Kõik failid (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:80 msgid "All the translators" msgstr "Kõik tõlkiad" #: library/library.cpp:98 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:85 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Väljanägemine" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Esitaja" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Esitaja info" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Artisti sildipilv" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Heli vorming" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Autentimine ebaõnnestus" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "" #: ui/about.cpp:68 msgid "Authors" msgstr "Autorid" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Auto" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Automaatne uuendamine" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Saadaolevad" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Taustavärv" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Tausta läbipaistvus" #: core/database.cpp:648 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Paas sinine" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Käitumine" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Parim" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Bitikiirus" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Sirvi..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Nupud" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Loobu" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Muuda kirja suurust..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Muuda keelt" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Kontrolli uuendusi..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Vali automaatselt" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Vali värv..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Vali nimekirjast" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Klassikaline" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Puhasta" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Esitusloendi puhastamine" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Klikka siin et lisada muusikat" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Sulge" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Sulge visualiseerimine" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:114 msgid "Club" msgstr "Klubi" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Märkus" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Helilooja" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Kiirklahvide seadistamine" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Seadista..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Ühenda seade" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Kopeeri seadmesse..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Ei suuda avada väljund faili %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Kaanepildi haldur" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Kohanda" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Kohandatud..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Tantsumuusika" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Loomise kuupäev" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Muutmise kuupäev" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "päeva" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "&Vaikeväärtus" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Vähenda helitugevust 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Heli vaiksemaks" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Vaikeväärtused" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Kustuta failid" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Kustuta seadmest..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Kustuta kettalt..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Kustuta valmisseadistus." #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Kustuta originaal failid" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Failide kustutamine" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Sihtkoht" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Üksikasjad..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Seade" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Seadme seadistus" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Seadme nimi" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Seadme omadused..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Seadmed" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Kataloog" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Näita kestust" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Ketas" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Ekraani seaded" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Ära korda" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Ära sega" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Ära peata!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Avamiseks tee topeltklikk" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "" #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Lae kaust alla" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Lae liikmelisus" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Lae see album alla" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Lae see album..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "" #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Lohista asukoha muutmiseks" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Muuda silti..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Muuda loo infot" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Muuda loo infot..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Muuda lugude infot" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Muuda..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Luba Wii kaugjuhtimine" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Luba ekvalaiser" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Sisesta siia otsingusõnad" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Ekvalaiser" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Viga" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Viga laulude kopeerimisel" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:68 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Heli sumbumine loo peatamisel" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Hajumine" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Lemmiklood" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Tõmba puuduvad kaanepildid" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Faililaiend" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Faili vormingud" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Faili nimi" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Failinimi (ilma rajata)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Faili suurus" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Faili tüüp" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Faili nimi" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Failid" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Transkodeerida failid" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Esimene tase" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Kirja suurus" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Unusta seade" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Seadme unustamine eemaldab selle siit loendist, mistõttu Clementine'il tuleb järgmisel ühendamisel kõik lood uuesti sirvida." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Vorm" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Vorming" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Kaadrisagedus" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Kaadreid puhvri kohta" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Täisbass" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Üldised seadistused" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Žanr" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Anna sellele nimi:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Rühmitamise alus" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Rühmita albumite järgi" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Rühmita esitajate järgi" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Grupeeri esitaja/albumi järgi" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Grupeeri esitaja/aasta albumi järgi" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Grupeeri zanri/albumi järgi" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Grupeeri zanri/esitaja/albumi järgi" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "HTTP-puhverserver" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Riistvara info" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Riistvara info on ainult siis saadaval, kui seade on ühendatud." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Kõrge (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Mul pole Magnatune kontot" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Ikoon" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "ikoonid üleval" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "\"The\" ignoreerimine Esitajate nimedes" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Sisendkaust" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Heli valjemaks" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Informatsioon" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Lisa..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Paigaldatud" #: core/database.cpp:585 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Vigane API võti" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Sobimatu formaat" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Vigane meetod" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Vigased parameetrid" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Vigane teenus" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Vigane sessiooni võti" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Jamendo andmebaas" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Säiilita originaalfailid" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Keel" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Rüpperaal/Kõrvikud" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Suur ruum" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Suur albumi kaanepilt" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Suur külgriba" #: library/library.cpp:80 msgid "Last played" msgstr "Viimati esitatud" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Last.fm parool" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Last.fm sildipilv" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Last.fm kasutajanimi" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Vähim kuulatud lood" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Kestvus" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Helikogu" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Rajad" #: ui/equalizer.cpp:137 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Laadi" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Lae ümbris URL-ilt---" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Lae ümbris plaadilt..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Laadi esitusnimekiri" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Lae esitusnimekiri..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Voo laadimine" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Laadimine..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Logi sisse" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Meeldib" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Madal (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Madal (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Laulusõnad" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Laulusõnad saidilt %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Vigane vastus" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Puhvri käsitsiseadistus" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Tootja" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Keskmine (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Keskmine (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Vähim bitikiirus" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Mudel" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "kuud" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "Enim mängitud" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Haakepunkt" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Enim punkte" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Liiguta alla" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Liiguta üles" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Muusika kogu" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Vaigista" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Nimi" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Nimetamise valikud" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "kitsasribaühendus (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Võrguproksi" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Mitte kunagi" #: library/library.cpp:74 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Uus esitusnimekiri" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Uued laulud" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:92 msgid "Newest tracks" msgstr "Uusimad lood" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Järgmine" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Järgmine lugu" #: core/utilities.cpp:151 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Vasteid ei leitud. Puhasta otsingukast, et näha kogu nimekirja." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Puudub" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Pole ühendatud" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Pole piisavalt sisu" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Pole piisavalt fänne" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Pole piisavalt liikmeid" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Pole piisavalt naabreid" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Teavitused" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Hetkel mängib" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Ava %1 brauseris" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Ava &audio CD..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Ava seade" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "" #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Ava..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Operatsioon ebaõnnestus" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Valikud..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Organiseeri faile" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Organiseeri faile..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Organiseerin faile" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Muud valikud" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Väljundi valikud" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Kirjuta olemasolev fail üle" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Pidu" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Parool" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Paus" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Peata esitus" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Peatatud" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Täielik külgriba" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Mängi" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Esitamiste arv" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Mängi, kui on peatatud, paus, kui mängitakse" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Esita/paus" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Taasesitus" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Esitaja valikud" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Lugude nimekiri" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Esitusnimekiri läbi" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Esitusnimekirja valikud" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Eelmoonutus" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Seadistused" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Seadistused..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Eelistatud heli vorming" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Eelistatud vorming" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Valmisvalik:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Eelvaade" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Eelmine" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Eelmine lugu" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Profiil" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Progress" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Järjekorrahaldur" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Lisa järjekorda" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Raadio (kõigil paladel võrdne valjus)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Vihm" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Hinnang" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Regemuusika" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Eemalda" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Eemalda toiming" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Eemalda kaust" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Eemalda esitusnimekirjast" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Nimeta lugude nimekiri ümber" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Korda" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rokk" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "SOCKS proxy" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Diskreetimissagedus" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Diskreetimissagedus" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Pildi salvestamine" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Salvesta esitusnimekiri..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Eelmääratluse salvestamine" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Otsing" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Otsingu valikud" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Teine tase" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Vali kõik" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Tühista valik." #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "" #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Seerianumber" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Kiirklahv" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Näita" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Näita ekraanimenüüd" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Näita kõiki laule" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "" #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Paneeliikooni näitamine" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Näita/peida" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Sega" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Sega kõik" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Sega esitusnimistu" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Logi välja" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Sarnased esitajad" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Lugude nimekirjas tagasi hüppamine" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Lugude nimekirjas edasi" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Väike külgriba" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Mahe" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Laulu andmed" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogramm" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Sorteerimine" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Käivitatakse %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Alustamine..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Peata" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Esitamise lõpetamine" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Peatatud" #: core/song.cpp:431 msgid "Stream" msgstr "Voog" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Tellijad" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Toetatud vormingud" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Tehno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Tänud" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Kolmas tase" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Pealkiri" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Täna" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Lülita täisekraani" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Rada" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Transkodeeri muusikat" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Transkodeerimis logi" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "" #: core/song.cpp:426 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbiin" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Tundmatu" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Tundmatu viga" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Kasutus" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Kasutuses" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Kasutajanimi" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Erinevad esitajad" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Versioon %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Vaade" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Visualiseeringud" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Virtualiseerimise seaded" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Aasta" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Aasta - Album" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Eile" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Null" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "lisa %n laulu" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "pärast" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "enne" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "sisaldab" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "suurem kui" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "vähem kui" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "valikud" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "peata" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/eu.po000066400000000000000000004702631260417502300236640ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # FIRST AUTHOR , 2010 # isolus , 2013 # isolus , 2013 # Mikel Iturbe Urretxa , 2012 # Mikel Iturbe Urretxa , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Basque (http://www.transifex.com/davidsansome/clementine/language/eu/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: eu\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "egun" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " segundu" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " abesti" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 album" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 egun" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "duela %1 egun" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 %2-tik" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 erreprodukzio-zerrenda (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 aukeraturik" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 abestia" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 abesti" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 abesti aurkiturik" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 abesti aurkiturik (%2 erakusten)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 pista" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 transferitua" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev modulua" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 gainontzeko entzule" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 erreprodukzio guztira" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n-(e)k huts egin du" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n amaituta" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n egiteke" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Alineatu testua" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Zentratu" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Pertsonalizatua" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "&Gehigarriak" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Laguntza" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&Ezkutatu %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Ezkutatu..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "Ez&kerrera" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "&Musika" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Bat ere ez" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "&Erreprodukzio-zerrenda" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Itxi" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "E&rrepikatze-modua" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "E&skuinera" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Au&sazko modua" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Tiratu zutabeak leihoan egokitzeko" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Tresnak" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(desberdinak zenbait abestien zehar)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...eta Amarok-eko laguntzaile guztiei" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "Egun 1" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "Pista 1" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 ausazko pista" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Eguneratu Premium-era orain" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Tokenak %-rekin hasten dira, adibidez: %artista %albuma %titulua

\n\n

Tokena duten testu zatiak giltzekin inguratzen badituzu, zati hori ezkutaturik egongo da tokena hutsik badago.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Beharrezkoa da Spotify Premium kontua izatea." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Erreprodukzio-zerrenda adimenduna, zure bildumatik hartutako abestien zerrenda dinamikoa da. Erreprodukzio-zerrenda inteligenteen zenbait mota desberdin daude, abestiak aukeratzeko era desberdinak ematen dituztenak." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Abestia zerrendan sartuko da baldintza hauek betetzen baditu." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64K" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "LORIA OSOA HIPNOAPOARENTZAT" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "%1-(r)i buruz" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Clementine-ri buruz..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Qt-ri buruz..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Kontuaren xehetasunak" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Kontuaren xehetasunak (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Ekintza" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Wiiremote-a aktibatu/desaktibatu" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Podcast-a gehitu" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Gehitu jarioa" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Lerro berria gehitu jakinarazpen motak onartzen badu" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Gehitu ekintza" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Gehitu beste jario bat..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Gehitu direktorioa..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Gehitu fitxategia" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Gehitu fitxategia..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Gehitu transkodetzeko fitxategiak" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Gehitu karpeta" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Gehitu karpeta..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Gehitu karpeta berria..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Podcast-a gehitu" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Podcast-a gehitu..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Gehitu bilaketa-terminoa" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Gehitu album etiketa abestiari" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Gehitu bildumaren artista etiketa abestiari" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Gehitu artista etiketa abestiari" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Gehitu konpositore etiketa kantari" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Gehitu diska etiketa kantari" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Gehitu kantaren fitxategi-izena" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Gehitu generoa etiketa kantari" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Gehitu iraupena etiketa kantari" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Gehitu kantaren erreprodukzio-kontagailua" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Gehitu kantaren jauzi-kontagailua" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Gehitu titulua etiketa kantari" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Gehitu pista etiketa kantari" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Gehitu urtea etiketa kantari" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Gehitu jarioa..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Gehitu beste erreprodukzio-zerrenda batera" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Gehitu erreprodukzio-zerrendara" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Gehitu ilarara" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Gehitu wiimotedev ekintza" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Gehitu..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Hilabete honetan gehitua" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Aste honetan gehitua" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Aurten gehitua" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Gaur gehitua" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Azken hiru hilabeteetan gehitua" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Taldekatze aurreratua..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Ondoren" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Kopiatu ondoren..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Albuma" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Albuma (pista guztientzako bolumen ideala)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Albumeko artista" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Albumeko azala" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Albumeko informazioa jamendo.com-en..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Azaldun albumak" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Azal gabeko albumak" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Fitxategi guztiak (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Album guztiak" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Artista guztiak" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Fitxategi guztiak (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Erreprodukzio-zerrenda guztiak (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Itzultzaile guztiak" #: library/library.cpp:98 msgid "All tracks" msgstr "Pista guztiak" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Mid/side kodeketa baimendu" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Jatorrizkoekin batera" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Leiho nagusia beti ezkutatu" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Leiho nagusia beti erakutsi" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Beti hasi erreproduzitzen" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Plugin gehigarri bat beharrezkoa da Spotify Clementine-en erabiltzeko. Orain deskargatu eta instalatzea nahi duzu?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Errorea gertatu da iTunes datu-basea kargatzerakoan" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Errorea gertatu da '%1'-(e)ra metadatuak idazterakoan" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Errore ezezagun bat gertatu da." #: ui/about.cpp:85 msgid "And:" msgstr "Eta:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Haserre" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Itxura" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Erantsi Fitxategiak/URL-ak erreprodukzio-zerrendari" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Erantsi oraingo erreprodukzio-zerrendari" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Erantsi erreprodukzio-zerrendari" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Konpresioa aplikatu laburketak ekiditeko" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "\"%1\" aurrezarpena ezabatu?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Abesti honen estatistikak berrezarri?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Artista" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Artis. infor." #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Artistaren etiketak" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Artistaren inizialak" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Audio formatua" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Autentifikazioak huts egin du..." #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Egilea" #: ui/about.cpp:68 msgid "Authors" msgstr "Egileak" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Automatikoa" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Eguneratze automatikoa" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Bilduma-zuhaitzean automatikoki ireki banako kategoriak" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Eskuragarri" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Batez besteko bit-tasa" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Batez besteko irudi-tamaina" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "BBC-ko podcast-ak" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Hondo-jarioak" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Atzeko planoko kolorea" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Atzeko planoko irudia" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Atzeko planoko opakotasuna" #: core/database.cpp:648 msgid "Backing up database" msgstr "Datu-basearen babeskopia burutzen" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Barra-analizatzailea" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Oinarrizko urdina" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Oinarrizko audio mota" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Portaera" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Onena" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "%1-ko biografia" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Bit-tasa" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Bit-tasa" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Bloke-analizatzailea" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Bloke-mota" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Gorputza" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Boom analizatzailea" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Arakatu..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Bufferra betetzen" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Baina iturri hauek desgaiturik daude:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Botoiak" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "CUE orriaren euskarria" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Utzi" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Aldatu azala" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Aldatu letra-tipo tamaina..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Aldatu errepikatze-modua" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Aldatu laster-tekla..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Aldatu ausazko modua" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Aldatu hizkuntza" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Mono erreprodukzioa hurrengo erreprodukzioetan izango da erabilgarri" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Atal berriak bilatu" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Eguneraketak bilatu..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Erreprodukzio-zerrenda adimendunaren izena hautatu" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Automatikoki hautatu" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Hautatu kolorea..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Hautatu letra-tipoa..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Hautatu zerrendatik" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Hautatu zerrendaren ordena eta izango duen abesti kopurua." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Podcast-a deskargatzeko direktorioa aukeratu" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Hautatu Clementine-k abestien letrak bilatzeko erabiliko dituen webguneak" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Klasikoa" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Garbiketa" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Garbitu" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Erreprodukzio-zerrenda garbitu" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Clementine-ren errorea" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Clementine laranja" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Clementine-ren bistaratzea" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine-k automatikoki bihurtu dezake gailura kopiatzen den musika honek erreproduzitu ahal izango duen formatu batera" #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine-k Dropbox-era igo duzun musika erreproduzitu dezake" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine-k Google Drive-ra igo duzun musika erreproduzitu dezake" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine-k mezua erakutsi dezake pista aldatzen denean." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine-k zure beste ordenagailu edo podcast aplikazioetako harpidetza listak sinkronizatu ditzake. Kontu bat sortu." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine-k ezin izan du projectM bistaratzerik kargatu. Clementine ondo instalatuta dagoen begiratu." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Clementine irudi-ikustailea" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine-k ezin izan du fitxategi honetarako emaitzak erakutsi" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Hemen bilatuko du musika Clementine-k:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Egin klik hemen musika gehitzeko" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Egin klik geratzen den denbora eta denbora osoaren artean txandakatzeko" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Saio-hasiera botoiak nabigatzailea irekiko du. Behin saioa hasita itzuli Clementine-ra." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Itxi" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Erreprodukzio-zerrenda itxi" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Itxi bistaratzea" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Leiho hau ixteak deskarga bertan-behera utziko du." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Leiho hau ixteak albumen azalen bilaketa geldituko du." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Club-a" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Koloreak" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Komaz banaturiko klase-zerrenda:maila, maila 0-3 da" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Iruzkina" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Bete etiketak automatikoki" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Bete etiketak automatikoki..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Konpositorea" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "%1 konfiguratu..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Konfiguratu Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Konfiguratu laster-teklak" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Konfiguratu Spotify..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Subsonic konfiguratu" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Bilaketa globala konfiguratu..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Konfiguratu bilduma..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Podcast-ak konfiguratu" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Konfiguratu..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Konektatu Wii urruneko kontrola aktibatu/desaktibatu botoia erabiliz" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Konektatu gailua" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Konektatu Spotify-ra" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Kontsola" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Bit-tasa konstantea" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Musika guztia bihurtu" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Gailuak erreproduzitu ezin dezakeen musika bihurtu" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Kopiatu arbelean" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Kopiatu gailura..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Kopiatu bildumara..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Copyright" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Ezin izan da GStreamer \"%1\" elementua sortu - beharrezko GStreamer plugin guztiak instalatuta dauden begiratu" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Ezin izan da %1-(r)entzako multiplexadorea aurkitu, begiratu GStreamer plugin egokiak instalatuta dauden" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Ezin izan da %1-(r)entzako kodetzailea aurkitu, begiratu GStreamer plugin egokiak instalatuta dauden" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Ezin izan da %1 irteera-fitxategia ireki" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Azal-kudeatzailea" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Irudi txertatu bateko azalak" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "%1-(e)tik automatikoki kargaturiko azalak" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Eskuz berrezarritako azalak" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Ezarri gabeko azalak" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "%1-(e)tik ezarritako azalak" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "%1-(e)ko azalak" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Iraungi automatikoki kantak aldatzen direnean" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Iraungi eskuz kantak aldatzen direnean" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Behera" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Maius+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Maius+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Gora" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Pertsonalizatua" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Irudi pertsonalizatua:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Mezu-ezarpen pertsonalizatuak" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Pertsonalizatua..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "DBus bide-izena" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dance" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Datu-basea usteldurik dago. Datu-basea nola berreskuratu daitekeen jakiteko, irakurri mesedez https://code.google.com/p/clementine-player/wiki/DatabaseCorruption." #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Sorrera-data" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Aldatze-data" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Egun" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "&Lehenetsia" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Bolumena % 4 jaitsi" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Bolumena jaitsi" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Atzeko planoko irudi lehenetsia" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Lehenetsiak" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Bistaratzeen arteko atzerapena" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Ezabatu" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Ezabatu deskargatutako datuak" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Ezabatu fitxategiak" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Ezabatu gailutik..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Ezabatu diskotik..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Erreproduzitutako atalak ezabatu" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Ezabatu aurre-ezarpena" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Ezabatu erreprodukzio-zerrenda adimenduna" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Ezabatu jatorrizko fitxategiak" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Fitxategiak ezabatzen" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Atera aukeraturiko pistak ilaratik" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Atera pista ilaratik" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Helmuga" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Xehetasunak..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Gailua" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Gailuaren propietateak" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Gailuaren izena" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Gailuaren propietateak..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Gailuak" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Esan nahi zenuen" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Digitally Imported-eko pasahitza" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Digitally Imported-eko erabiltzaile-izena" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Internet-konexio zuzena" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Direktorioa" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Iraupena desgaitu" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Aldarte-barren sortzea desgaitu" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Diska" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Transmisio ez-jarraitua" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Erakutsi aukerak" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Erakutsi pantailako bistaratzailea" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Bildumaren berreskaneo osoa egin" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Ez bihurtu musikarik" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Ez errepikatu" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Ez erakutsi hainbat artista" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Ez nahastu" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Ez gelditu!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Klik bikoitza irekitzeko" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Abesti batean klik bikoitza eginez gero..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "%n atal deskargatu" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Direktorioa deskargatu" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Atalak hemen deskargatu" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Deskargarako bazkidetza" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Atal berriak automatikoki deskargatu" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Deskarga zerrendaren zain" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Deskargatu album hau" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Deskargatu album hau..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Atal hau deskargatu" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Deskargatu..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Deskargatzen (%%1)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Icecast direktorioa deskargatzen" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Jamendo katalogoa deskargatzen" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Magnatune katalogoa deskargatzen" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Spotify plugina deskargatzen" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Metadatuak deskargatzen" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Arrastatu birkokatzeko" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Modu dinamikoa aktibaturik" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Ausazko nahasketa dinamikoa" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Editatu erreprodukzio-zerrenda adimenduna..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Editatu etiketa..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Editatu etiketak" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Editatu pistaren informazioa" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Editatu pistaren informazioa..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Editatu pisten informazioa..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Editatu..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Gaitu Wii urruneko kontrolaren euskarria" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Gaitu ekualizadorea" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Gaitu lasterbideak Clementine fokaturik dagoenean bakarrik" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Gaitu beheko iturriak bilaketa emaitzetan aurkezteko. Erantzunak orden berdinean erakutsiko dira." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Gaitu/desgaitu Last.fm-ko partekatzea" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Kodeketaren konplexutasuna" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Kodeketa-motorearen kalitatea" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Kodetze modua" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "URL bat sartu" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Sartu URL bat Internetetik azala jaisteko:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Sartu izen berria erreprodukzio-zerrenda honentzat" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Sartu bilaketa terminoak musika zure ordenagailuan eta interneten bilatzeko" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Sartu bilaketa terminoak iTunes dendan podcast-ak bilatzeko" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Sartu bilaketa terminoak gpodder.net-en podcast-ak bilatzeko" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Sartu bilaketa-terminoak hemen" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Sartu interneteko irratiko jarioaren URLa:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Sartu karpetaren izena" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Bilduma osoa" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Ekualizadorea" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "--log-levels *:1-en baliokidea" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "--log-levels *:3-en baliokidea" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Errorea" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Errorea MTP gailua konektatzean" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Errorea abestiak kopiatzean" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Errorea abestiak ezabatzean" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Errorea Spotify plugin-a deskargatzean" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Errorea %1 kargatzean" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Errorea di.fm erreprodukzio-zerrenda kargatzean" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Errorea %1 prozesatzean: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Errorea audio CDa kargatzean" #: library/library.cpp:68 msgid "Ever played" msgstr "Inoiz erreproduzitutakoak" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "10 minuturo" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "12 orduro" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "2 orduro" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "20 minuturo" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "30 minuturo" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "6 orduro" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Orduro" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Album edo CUE orri bereko pisten artean izan ezik" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Zabaldu" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "%1-(e)an iraungitzen da" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Pista gelditzerakoan iraungitu" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Iraungitzea" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Iraungitzearen iraupena" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Direktorioa ezin izan da eskuratu" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Podcast-ak ezin izan dira lortu" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Podcast-a ezin izan da kargatu" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "RSS kanal honen XML ezin izan da parseatu" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Azkarra" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Pista gogokoenak" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Falta diren azalak eskuratu" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Automatikoki eskuratu" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Eskuraketa eginda" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Errorea azalak eskuratzean" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Fitxategi-luzapena" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Fitxategi-formatuak" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Fitxategi-izena" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Fitx.-izena (bidea gabe)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Fitxategi-tamaina" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Fitxategi-mota" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Fitxategi-izena" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Fitxategiak" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Transkodetzeko fitxategiak" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Ezarritako irizpideak betetzen dituzten bildumako abestiak bilatu." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Abestiaren hatz-marka eskuratzen" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Amaitu" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Lehen maila" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Letra-tipoaren tamaina" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Lizentzia arrazoiengatik Spotify-ren euskarria aparteko plugin batean dago." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Mono kodeketa behartu" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Gailua ahaztu" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Gailua ahazteak berau zerrenda honetatik ezabatuko du eta Clementine-k abesti guztiak berreskaneatu beharko ditu gailua konektatzen den hurrengoan" #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Inprimakia" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Formatua" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Laginketa-abiadura" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Koadroak buffer-eko" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Izoztuta" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Baxu osoak" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Baxu osoak + Altua" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Altu osoak" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Orokorra" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Ezarpen orokorrak" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Generoa" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Kateak eskuratzen" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Jarioak eskuratzen" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Izendatu:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Joan" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Hurrengo erreprodukzio-zerrendara joan" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Aurreko erreprodukzio-zerrendara joan" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "%2-(e)tik %1 azal eskuratu dira (%3-(e)k huts egin dute)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Existitzen ez diren abestiak ilundu erreprodukzio-zerrendetan" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Bilduma taldekatu honela..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Taldekatu" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Taldekatu albumaren arabera" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Taldekatu artistaren arabera" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Taldekatu artista/albumaren arabera" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Taldekatu artista/urtea - albumaren arabera" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Taldekatu genero/albumaren arabera" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Taldekatu generoa/artista/albumaren arabera" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "HTML orriak ez du inongo RSS kanalik" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "HTTP proxy-a" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Pozik" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Hardware-informazioa" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Hardware-informazioa gailua konektaturik dagoenean bakarrik dago eskuragarri." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Altua" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Altua (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Altua (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Orduak" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hipnoapoa" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Ez daukat Magnatune-ko konturik" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Ikonoa" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Ikonoak goian" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Abestia identifikatzen" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Aurrera jarraitzen bada, gailua astiro arituko da eta bertara kopiatutako abestiak baliteke ez erreproduzitzea" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Podcast-aren URLa jakinez gero, sartu eta sakatu joan" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Artisten izenetako \"The\"-ak ezikusi" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Irudiak (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Irudiak (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "%1 egunetan" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "%1 asteetan" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "Modu dinamikoan pista berriak aukeratu eta gehituko dira erreprodukzio-zerrendara abesti bat amaitzen den bakoitzean." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Sarrera-ontzia" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Jakinarazpenean albumaren azala gehitu" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Kanta guztiak erantsi" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Bolumena % 4 igo" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Bolumena igo" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Indexatzen: %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Informazioa" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Txertatu" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Instalatuta" #: core/database.cpp:585 msgid "Integrity check" msgstr "Osotasunaren egiaztapena" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Internet hornitzaileak" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "API gako baliogabea" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Formatu baliogabea" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Metodo baliogabea" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Parametro baliogabeak" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Baliabide baliogabea zehaztua" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Zerbitzu baliogabea" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Sesio-gako baliogabea" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Jamendo-ko pista entzunenak" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Jamendo-ko kantarik onenak" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo-ko hilabeteko kantarik onenak" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo-ko asteko kantarik onenak" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Jamendo datu-basea" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Erreproduzitzen ari den pistara jauzi egin" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Sakatu botoiak segundu %1-ez..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Sakatu botoiak %1 segunduz..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Jarraitu atzealdean exekutatzen leihoa ixten denean" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Jatorrizko fitxategiak mantendu" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Hizkuntza" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Eramangarria/Aurikularrak" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Areto handia" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Albumeko azal handia" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Albo-barra handia" #: library/library.cpp:80 msgid "Last played" msgstr "Erreproduzitutako azkena" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm lanpetuta dago, saiatu minutu batzuk barru" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Last.fm-ko pasahitza" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Last.fm erreprodukzio kontagailua" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Last.fm etiketak" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Last.fm-ko erabiltzaile-izena" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Last.fm-ko wikia" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Gutxien gogoko diren pistak" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Iraupena" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Bilduma" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Bildumaren taldekatze aurreratua" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Bildumaren berreskaneoaren abisua" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Bilatu bilduman" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Limiteak" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Zuzenean" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Kargatu" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Kargatu azala URLtik" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Kargatu azala URLtik..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Kargatu azala diskotik" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Kargatu azala diskotik..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Kargatu erreprodukzio-zerrenda" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Kargatu erreprodukzio-zerrenda..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "MTP gailua kargatzen" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "iPod-eko datu-basea kargatzen" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Erreprodukzio-zerrenda adimenduna kargatzen" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Abestiak kargatzen" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Jarioa kargatzen" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Pistak kargatzen" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Pisten informazioa kargatzen" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Kargatzen..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Fitxategiak/URLak kargatzen ditu, momentuko erreprodukzio-zerrenda ordezkatuz" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Saio-hasiera" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Saio hasieraren huts egitea" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Epe luzerako predikzio profila (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Oso gustukoa" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Baxua (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Baxua (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Konplexutasun baxuko profila (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Letrak" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "%1-eko letrak" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Magnatune deskarga" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Magnatune deskarga eginda" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Profil nagusia (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Egin ezazu!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Erreprodukzio-zerrenda eskuragarri egin lineaz-kanpo" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Gaizki eratutako erantzuna" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Eskuzko proxy konfigurazioa" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Eskuz" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Fabrikatzailea" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Entzunda bezala markatu" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Berri bezala markatu" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Bilaketa-termino guztiak parekatu (AND)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Bilaketa-termin bat edo gehiago parekatu (OR)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Bit-tasa maximoa" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Ertaina (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Ertaina (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Bazkidetza mota" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Bit-tasa minimoa" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "projectM-ko aurre-ezarpenak falta dira" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Modeloa" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Bildumako aldaketen segimendua egin" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Mono erreprodukzioa" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Hilabete" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Aldarte" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Aldarte-barraren itxura" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Aldarte-barra" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "Gehien erreproduzitutakoak" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Muntatze-puntua" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Muntatze-puntuak" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Eraman behera" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Eraman bildumara..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Eraman gora" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Musika" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Musika-bilduma" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Mututu" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Nire Musika" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Nire gomendioak" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Izena" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Izendapen-aukerak" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Banda estua (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Sareko proxy-a" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Sareko urruneko kontrola" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Inoiz ez" #: library/library.cpp:74 msgid "Never played" msgstr "Inoiz ez erreproduzituak" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Inoiz ez hasi erreproduzitzen" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Karpeta berria" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Erreprodukzio-zerrenda berria" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Adimendun erreprodukzio-zerrenda berria" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Abesti berriak" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Abesti berriak automatikoki gehituko dira." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Pista berrienak" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Hurrengoa" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Hurrengo pista" #: core/utilities.cpp:151 msgid "Next week" msgstr "Hurrengo astea" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Analizatzailerik ez" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Atzeko planoko irudirik ez" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Bloke luzerik ez" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Ez da bat-etortzerik aurkitu. Garbitu bilaketa-laukia erreprodukzio-zerrenda osoa erakusteko berriro." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Bloke laburrik ez" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Bat ere ez" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Aukeraturiko abestietako bat ere ez zen aproposa gailu batera kopiatzeko" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Arrunta" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Bloke-mota normala" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Ez dago eskuragarri erreprodukzio-zerrenda dinamikoa erabiltzean" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Konektatu gabe" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Ez dago eduki nahikorik" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Zale nahikorik ez" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Kide nahikorik ez" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Auzokide nahikorik ez" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Ez dago instalatua" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Saioa hasi gabe" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Muntatu gabe - klik bikoitza egin muntatzeko" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Jakinarazpen mota" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Jakinarazpenak" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Orain erreproduzitzen" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "OSD aurrebista" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Lehena bakarrik erakutsi" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "%1 nabigatzailean ireki" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Ireki &audio CDa..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "OPML fitxategia ireki" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "OPML fitxategia ireki" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Ireki gailua" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Ireki fitxategia..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Google Drive-n iriki" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Ireki erreprodukzio-zerrenda berrian" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Ireki..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Eragiketak huts egin du" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Bit-tasarako optimizatu" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Kalitaterako optimizatu" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Aukerak..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Antolatu fitxategiak" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Antolatu fitxategiak..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Fitxategiak antolatzen" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Jatorrizko etiketak" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Bestelako aukerak" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Irteerako aukerak" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Existitzen diren fitxategiak gainidatzi" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Jabea" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Jamendoko katalogoa analizatzen" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Jaia" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Pasahitza" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Pausarazi" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Erreprodukzioa pausatu" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Pausatua" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Albo-barra sinplea" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Erreproduzitu" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Erreprodukzio kopurua" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Erreproduzitu pausatua badago, pausarazi erreproduzitzen ari bada" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Erreproduzitu ez badago ezer aurretik erreproduzitzen" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Erreproduzitu erreprodukzio-zerrendako . pista" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Erreproduzitu/Pausarazi" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Erreprodukzioa" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Erreproduzitzailearen aukerak" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Erreprodukzio-zerrenda" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Erreprodukzio-zerrenda amaituta" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Erreprodukzio-zerrendaren aukerak" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Erreprodukzio-zerrenda mota" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Erreprodukzio-zerrendak" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Mesedez, itxi nabigatzailea eta itzuli Clementine-ra." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Pluginaren egoera:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcast-ak" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Laster-leihoaren iraupena" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Ataka" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Aurre-anplifikadorea" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Hobespenak" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Hobespenak..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Hobetsitako album-azalen fitxategi-izenak (komaz bereizita)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Hobetsitako audio-formatua" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Hobetsitako bit-tasa" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Hobetsitako formatua" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Audio-mota premium-a" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Aurre-ezarpena:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Sakatu erabiliko den tekla-konbinazioa" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Sakatu edozein tekla" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Sakatu %1 egiteko erabiliko den tekla-konbinazioa..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "OSD itxurosoaren aukerak" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Aurrebista" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Aurrekoa" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Aurreko pista" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Bertsio-informazioa erakutsi" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Profila" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Aurrerapena" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Wiiremote botoia sakatu" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Abestiak ausazko ordenan jarri" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Gailua galdekatzen..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Ilara-kudeatzailea" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Aukeraturiko pistak ilaran jarri" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Pista ilaran jarri" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Irratia (ozentasun berdina pista denentzat)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Euria" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Ausazko bistaratzea" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Oraingo kantari 0 izarretako balioa eman" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Oraingo kantari izar 1eko balioa eman" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Oraingo kantari 2 izarretako balioa eman" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Oraingo kantari 3 izarretako balioa eman" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Oraingo kantari 4 izarretako balioa eman" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Oraingo kantari 5 izarretako balioa eman" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Balioztatzea" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Benetan utzi?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Katalogoa freskatu" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Kateak freskatu" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Irrati-zerrenda freskatu" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Jarioak freskatu" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Wiimote-aren mugimendua gogoratu" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Azken alditik gogoratu" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Kendu" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Kendu ekintza" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Abesti bikoiztuak kendu erreprodukzio-zerrendatik " #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Kendu karpeta" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Nire Musikatik kendu" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Kendu erreprodukzio-zerrendatik" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Berrizendatu erreprodukzio-zerrenda" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Berrizendatu erreprodukzio-zerrenda..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Zenbakitu berriro pistak ordena honetan..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Errepikatu" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Errepikatu albuma" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Errepikatu erreprodukzio-zerrenda" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Errepikatu pista" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Ordeztu oraingo erreprodukzio-zerrenda" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Ordeztu erreprodukzio-zerrenda" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Zuriuneak azpimarrekin ordezten ditu" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Errepikatze-irabazia" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Birpopulatu" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Berrezarri" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Berrezarri erreprodukzio kopurua" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Mugatu ASCII karaktereetara" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Clementine-ra itzuli" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Exekutatu" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "SOCKS proxy-a" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Kendu gailua arriskurik gabe" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Kopiatu ondoren kendu gailua arriskurik gabe" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Lagintze-tasa" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Lagintze-tasa" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr ".mood fitxategiak musika-bilduman gorde" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Gorde albumeko azala" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Gorde azala diskoan..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Gorde irudia" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Gorde erreprodukzio-zerrenda..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Gorde aurre-ezarpena" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Gorde jario hau Internet fitxan" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Pistak gordetzen" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Lagintze-tasa eskalagarriaren profila (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Puntuazioa" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Entzuten ditudan pistak partekatu" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Bilatu" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Bilatu Icecast irratiak" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Bilatu Jamendo-n" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Bilatu Magnatune-n" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Subsonic-en bilatu" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Bilatu albumetako azalak" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Bilatu edozer" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "gpodder.net-en bilatu" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "iTunes-en bilatu" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Bilaketa-modua" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Bilaketa-aukerak" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Bilaketaren emaitzak" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Bilaketa terminoak" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Bigarren maila" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Atzera egin" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Aurrera egin" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Oraingo pistan mugitu posizio erlatibo baten arabera" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Oraingo pistan mugitu posizio absolutu baten arabera" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Hautatu dena" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Ez hautatu ezer" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Hautatu atzeko planoaren kolorea:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Hautatu atzeko planoko irudia" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Hautatu bat-etortze posiblerik onena" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Aukeratu aurreko planoaren kolorea:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Hautatu bistaratzeak" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Hautatu bistaratzeak..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Serie-zenbakia" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Zerbitzariaren xehetasunak" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Zerbitzua lineaz kanpo" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Ezarri %1 \"%2\"-(e)ra..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Ezarri bolumena ehuneko -ra" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Ezarri balioa aukeratutako pista guztiei..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Lasterbidea" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "%1-(r)en laster-tekla" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "%1-(r)en laster-tekla existitzen da jada" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Erakutsi" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Erakutsi OSD" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Erakutsi oraingo pistaren animazio distiratsua" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Aldarte-barra erakutsi aurrerapen barran" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Erakutsi mahaigaineko jakinarazpen jatorrizkoa" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Erakutsi jakinarazpena errepikapen/ausazko modua aldatzean" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Erakutsi jakinarazpena bolumena aldatzean" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Erakutsi laster-leihoa sistema-erretiluan" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Erakutsi OSD itxurosoa" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Erakutsi egoera-barraren gainean" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Erakutsi abesti guztiak" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Erakutsi abesti guztia" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Erakutsi azalak bilduman" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Erakutsi zatitzaileak" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Erakutsi tamaina osoan..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Erakutsi fitxategi arakatzailean..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Erakutsi hainbat artista" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Aldarte-barra erakutsi" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Erakutsi bakarrik errepikapenak" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Erakutsi etiketa gabeak bakarrik" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Bilaketaren iradokizunak erakutsi" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Erakutsi partekatu botoia leiho nagusian" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Erakutsi erretilu-ikonoa" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Erakutsi zein iturri dauden gaiturik/desgaiturik" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Erakutsi/Ezkutatu" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Ausazkoa" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Albumak nahastu" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Dena nahastu" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Erreprodukzio-zerrenda nahastu" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Album honetako pistak nahastu" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Saioa hasi" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Saioa itxi" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Saioa hasten..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Antzeko artistak" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Saltatu atzerantz erreprodukzio-zerrendan" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Saltatu kontagailua" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Saltatu aurrerantz erreprodukzio-zerrendan" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Albumaren azal txikia" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Albo-barra txikia" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Erreprodukzio-zerrenda adimenduna" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Erreprodukzio-zerrenda adimendunak" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Abestiaren informazioa" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Abes. infor." #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonograma" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Barkatu" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Ordenatu generoaren arabera (alfabetikoki)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Ordenatu generoaren arabera (ospearen arabera)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Ordenatu irrati izenaren arabera" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Ordenatu abestiak honen arabera" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Ordenatzen" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Iturria" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Iturriak" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Spotify-ko saio-hasiera errorea" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Spotify plugina" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Spotify plugina ez dago instalatuta" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Estandarra" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Izarduna(k)" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Hasi oraingo erreprodukzio-zerrenda" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Hasi transkodetzen" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Hasi idazten aurreko bilaketa eremuan emaitzak jaso ahal izateko" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "%1 hasten" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Hasten..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Gelditu" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Ondoren gelditu" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Gelditu pista honen ondoren" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Gelditu erreprodukzioa" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Gelditu oraingo pistaren ondoren" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Geldituta" #: core/song.cpp:431 msgid "Stream" msgstr "Jarioa" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Streaming bazkidetza" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Harpidetzak" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Eginda!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "%1 ondo idatzi da" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Etiketa gomendatuak" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Laburpena" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Oso altua (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Oso altua (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Onartutako formatuak" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Spotify-ko sarrera-ontzia sinkronizatzen" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Spotify-ko erreprodukzio-zerrenda sinkronizatzen" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Spotify-ko pista izardunak sinkronizatzen" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Sistemako koloreak" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Fitxak goian" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Etiketa eskuratzailea" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Helburu bit-tasa" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Testu-aukerak" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Eskerrak hauei" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "\"%1\" komandoa ezin izan da hasi." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Orain erreproduzitzen ari den kantaren albumaren azala" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "%1 direktorioa ez da baliagarria" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "Bigarren balioak lehenak baino handiagoa izan behar du!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Adierazitako helbidea ez da existitzen!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Adierazitako helbidea ez da irudi bat" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Clementine-ren bertsio berriak bildumaren berreskaneo osoa egin behar du, ondorengo ezaugarri berri hauek direla-eta" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Album honetan beste abesti batzuk daude" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Arazo bat gertatu da gpodder.net-ekin komunikatzerakoan" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Arazo bat egon da Magnatune-ko metadatuak eskuratzean" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Arazo bat gertatu da iTunes dendako erantzuna aztertzerakoan" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Arazoak egon dira abesti batzuk kopiatzean. Hurrengo fitxategiak ezin izan dira kopiatu:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Arazoak egon dira abesti batzuk ezabatzean. Hurrengo fitxategiak ezin izan dira ezabatu:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Fitxategi hauek gailutik ezabatuko dira, jarraitu nahi duzu?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Karpeta hauetan bilatuko da musika zure bilduma osatzeko" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Ezarpen hauek \"Transkodetu musika\" elkarrizketan eta musika gailu batera kopiatu baino lehen bihurtzeko erabiltzen dira." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Hirugarren maila" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Ekintza honek 150 MB-erainokoa izan daitekeen datu-basea sortuko du. \n Jarraitu nahi duzu?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Album hau ez dago adierazitako formatuan" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Gailu hau konektatu eta ireki behar da zein fitxategi-formatu onartzen dituen ikusi ahal izateko" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Gailu honek hurrengo fitxategi-formatuak onartzen ditu:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Gailu hau ez da era egokian ibiliko" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Hau MTP gailua da, baina Clementine libmtp euskarri gabe konpilatua dago." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Hau iPod bat da, baina Clementine libgpod euskarri gabe konpilatua dago." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Gailu hau konektatzen duzun lehen aldia da. Clementine-k gailua eskaneatuko du musika fitxategiak aurkitzeko - honek denbora pixka bat har dezake." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Jario hau ordainpeko harpidedunentzat da bakarrik" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Gailu mota hau ez da onartzen :%1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Izenburua" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Gaur" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Txandakatu OSD itxurosoa" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Txandakatu pantaila-osoa" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Txandakatu ilara-egoera" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Txandakatu partekatzea" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Txandakatu pantailako bistaratze itxurosoaren ikuspena" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Bihar" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Redirekzio gehiegi" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Pista gogokoenak" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Transferituriko byte-ak guztira" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Eginiko sareko eskaerak guztira" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Pista" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Transkodetu musika" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Transkodetzearen loga" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Transkodeketa" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "%1 fitxategi %2 hari erabiliz transkodetzen" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Transkodetze-aukerak" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbina" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Itzali" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URLa(k)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Banda ultra zabala (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Ezin izan da %1 deskargatu (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Ezezaguna" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Eduki-mota ezezaguna" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Errore ezezaguna" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Ezarri gabeko azala" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Harpidetza kendu" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Hurrengo Kontzertuak" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Eguneratu podcast guztiak" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Eguneratu bildumako aldatutako karpetak" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Eguneratu bilduma Clementine abiaraztean" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Podcast hau eguneratu" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Eguneratzen" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "%1 eguneratzen" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "%1 eguneratzen..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Bilduma eguneratzen" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Erabilera" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Bildumaren artista etiketa erabili erabilgarri bada" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Erabili Gnome-ren laster-teklak" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Erabili errepikatze-irabaziaren metadatuak eskuragarri daudenean" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Erabili Wii-aren urruneko kontrola" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Erabili kolore-multzo pertsonalizatua" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Erabili mezu pertsonalizatua jakinarazpenetan" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Erabili autentifikazioa" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Erabili bit-tasaren kudeaketa motorea" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Erabili modu dinamikoa" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Erabili jakinarazpenak Wii-ko urruneko kontrolaren egoera jakinarazteko" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Erabili zarata karrakaketa behin-behinekoa" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Erabili sistemako lehenetsia" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Erabili sistemako kolore-multzo lehenetsia" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Erabili sistemaren proxy-ezarpenak" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Erabili bolumenaren normalizazioa" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Erabilia" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Erabiltzaile-interfazea" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Erabiltzaile-izena" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Abesti bat gehitzeko menua erabiltzeak ondorengoa egingo du..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Bit-tasa aldakorra" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Hainbat artista" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "%1 bertsioa" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Ikusi" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Bistaratze-modua" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Bistaratzeak" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Bistarate-ezarpenak" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Ahotsaren jardueraren detekzioa" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "%1 bolumena" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Webgunea" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Aste" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Clementine abiaraztean" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Albumetako azalen bilatzean, Clementine-k aurretik honako hitzetako bat duten irudi fitxategiak begiratuko ditu.\n Ez badago bat-etortzerik, direktorioko irudirik handiena erabiliko du orduan." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Zerrenda hutsik dagoenean..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Zergatik ez probatu..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Banda zabala (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "%1 Wii urruneko kontrola: aktibaturik" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "%1 Wii urruneko kontrola: konektaturik" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "%1 Wii urruneko kontrola: bateria oso gutxi (% %2) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "%1 Wii urruneko kontrola: desaktibaturik" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "%1 Wii urruneko kontrola: deskonektaturik" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "%1 Wii urruneko kontrola: bateria gutxi (% %2)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Beste abestiak ere Hainbat artistara mugitzea nahi duzu?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Berreskaneo osoa orain egitea nahi duzu?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Erabiltzailea edo pasahitza ez da zuzena." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Urtea" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Urtea - Albuma" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Urte" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Atzo" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Ondorengo albumak deskargatzekotan zaude" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Ez duzu saioa hasi" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "%1 modura hasi duzu saioa" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Saioa hasi duzu." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Bildumako abestiak antolaturik dauden era alda dezakezu." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Doan entzun dezakezu kontua izan gabe, baina Premium bazkideek kalitate altuagoko jarioak entzun ditzakete iragarkirik gabe." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Magnatune-ko abestiak doan entzun ditzakezu kontua izan gabe. Bazkidetza erosteak pista bakoitzaren ondoreko mezuak ezabatzen ditu." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Beste musikarekin batera hondoko-jarioak entzun ditzakezu." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Zure Wii urruneko kontrola erabili dezakezu Clementine kontrolatzeko. Ikus Clementine-ren wikiko orria informazio gehiagorako. \n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Ez daukazu Spotify Premium konturik." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Ez duzu harpidetza aktiborik" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Spotify-ko saioa itxi egin da, sar ezazu pasahitza berriro ezarpenetako elkarrizketan." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Spotify-ko saioa itxi egin da, sar ezazu pasahitza berriro." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Pista hau oso gustukoa duzu" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Hizkuntzaz aldatuz gero, Clementine berrabiarazi behar da." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Last.fm-ko egiaztagiriak ez ziren egokiak" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Magnatuneko egiaztagiriak ez ziren egokiak" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Bilduma hutsik dago!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Irrati-jarioak" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Partekatzeak: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Zure sistema ez da bateragarria OpenGL-rekin, bistaratzeak erabilezinak daude." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Erabiltzaile-izena edo pasahitza ez zen zuzena." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "Gehitu %n abesti" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "ondoren" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "orain dela" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "eta" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "automatikoa" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "aurretik" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "tartean" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "handienak aurretik" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "honakoa du" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "desgaituta" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "%1 diskoa" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "ez du honakoa" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "honakoarekin amaitzen da" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "berdin" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "gpodder.net direktorioa" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "handiagoa baino" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "azkenean" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "gutxiago baino" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "luzeenak arinago" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "%n abesti mugitu" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "berrienak arinago" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "ez berdin" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "azkenean ez" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "honetan ez" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "zaharrenak arinago" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "honen barruan" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "aukerak" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "enter sakatu" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "%n abesti ezabatu" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "laburrenak arinago" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "abestiak nahastu" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "txikienak arinago" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "abestiak ordenatu" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "honekin hasten da" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "gelditu" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "%1 pista" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/fa.po000066400000000000000000005323111260417502300236320ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # FIRST AUTHOR , 2011 # mehdioa , 2013 # mehdioa , 2012 # Mohammad Azam Rahmanpour , 2012 # saeed zeyghami , 2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Persian (http://www.transifex.com/davidsansome/clementine/language/fa/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa\n" "Plural-Forms: nplurals=1; plural=0;\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " روز" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " ک.ب.د.ث" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " م.ث" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " پوینت" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " ثانیه" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " آهنگ‌ها" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 آلبوم" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 روز" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 روز پیش" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 در %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 لیست‌پخش (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 گزیده از" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 آهنگ" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 آهنگ" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 آهنگ پیدا شد" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 آهنگ پیدا شد (نمایش %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 ترک" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 ترابرده شد" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: پیمانه‌ی ویموتدو" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 شنوندگان دیگر" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 همه‌ی پخش‌ها" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n ناکام ماند" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n پایان یافت" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n بازمانده" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&چیدمان متن" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&میانه" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&سفارشی‌" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "ا&فزونه‌ها" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&راهنما" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&پنهاندن %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&پنهاندن..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&چپ‌" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "آ&هنگ" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&هیچ‌کدام‌" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "&لیست‌پخش" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&برونرفتن" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "سبک &تکرار" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&راست‌" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "سبک &درهم" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&کشیدن ستون‌ها برای پرکردن پنجره" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&ابزارها‌" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(متفاوت میان چند آهنگ)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...و دیگر گسترش‌دهنده‌های آماروک" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "۱ روز" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "۱ ترک" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "٪۴۰" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "۵۰ ترک تصادفی" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "هم‌اکنون به اکانت برتر پیشرفت بده" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

اگر تیک نباشد، کلمنتاین تلاش می‌کند که پایه‌های و آمار شما را تنها در پرونده‌ی جدای پایگاه‌داده ذخیره کند و پرونده‌های شما را دگرش نمی‌دهد.

اگر تیک باشد، دگرش‌ها را در پرونده‌ها و پایگاه‌داده همزمان ذخیره می‌کند.

خواهشمندم آگاه باشید که این کار شاید برای هر سبک پرونده‌ای کارا نباشد، و از آنجا که استانداردی برای انجام این کار دردست نیست، دیگر پخش‌کننده‌ها شاید نتوانند آنها را بخوانند.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

نشان‌ها با % شروع می‌شود، به عنوان مثال: %هنرمند %آلبوم %عنوان

\n\n

اگر قسمتی از متن را احاطه کنید که دارای نشان‌هایی درون آکولاد باش، آن نشان‌ها پنهان می‌شوند اگر نشان تهی باشد.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "نیاز به اکانت برتر اسپاتیفای دارد." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "یک مشتری می‌تواند بپیوندد تنها زمانی که کد درست وارد شود." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "یک لیست‌پخش هوشمند، لیستی پویا از آهنگ‌هایی است که از کتابخانه‌ی شما می‌آیند. گونه‌های مختلفی از لیست‌پخش‌های هوشمند وجود دارند که به شما امکان گزینش آهنگ‌ها را به روشهای گوناگون می‌دهند." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "آهنگ‌هایی به این لیست‌پخش افزوده می‌شوند که این ویژگیها را داشته باشند." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "الف-ی" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "همه‌ی افتخار برای HYPNOTOAD" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "درباره‌ی %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "درباره‌ی کلمنتاین..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "درباره‌ی کیو‌ت..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "ویژگی‌های اکانت" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "ویژگی‌های اکانت (برتر)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "کنش" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "پویا/ناپویا سازی وای‌ریموت" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "افزودن پادکست" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "افزودن جریان" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "افزودن خط نو اگر توسط آگاه‌ساز پشتیبانی شود" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "افزودن کنش" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "افزودن جریان دیگر..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "افزودن پوشه..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "افزودن پرونده" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "افزودن پرونده..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "افزودن پرونده‌ها به تراکد" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "افزودن پوشه" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "افزودن پوشه..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "افزودن پوشه‌ی نو..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "افزودن پادکست" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "افزودن پادکست..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "افزودن عبارت جستجو" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "افزودن برچسب آلبوم آهنگ" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "افزودن برچسب هنرمند آلبوم آهنگ" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "افزودن برچسب هنرمند آهنگ" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "افزودن نمره خودکار آهنگ" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "افزودن برچسب تنظیم‌کننده‌ی آهنگ" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "افزودن برچسب دیسک آهنگ" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "افزودن نام‌پرونده‌ی آهنگ" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "افزودن برچسب ژانر آهنگ" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "افزودن برچسب زمان آهنگ" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "افزودن شماره‌ی پخش آهنگ" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "افزودن پایه آهنگ" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "افزودن شماره‌ی پرش آهنگ" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "افزودن برچسب عنوان آهنگ" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "افزودن برچسب ترک آهنگ" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "افزودن برچسب سال آهنگ" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "افزودن جریان..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "افزودن به لیست‌پخش دیگر" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "افزودن به لیست‌پخش" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "افزودن به صف" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "افزودن کنش ویموتدو" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "افزودن..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "افزوده شده در ماه جاری" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "افزوده شده در هفته‌ی جاری" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "افزوده شده در سال جاری" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "افزوده شده در امروز" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "افزوده شده در سه ماه گذشته" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "دسته‌بندی پیشرفته..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "پس از" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "پس از کپی‌کردن..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "آلبوم" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "آلبوم (بلندی صدای ایده‌آل برای همه‌ی ترک‌ها)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "هنرمند آلبوم" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "جلد آلبوم" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "دانستنی‌های آلبوم در جامندو..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "آلبوم‌های با جلد" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "آلبوم‌های بدون جلد" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "همه‌ی پرونده‌ها(*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "همه‌ی آلبوم‌ها" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "همه‌ی هنرمندان" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "همه‌ی پرونده‌ها (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "همه‌ی لیست‌پخش‌ها (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "همه‌ی برگردانان" #: library/library.cpp:98 msgid "All tracks" msgstr "همه‌ی ترک‌ها" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "کدگذاری میانه/کنار" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "در کنار اصلی‌ها" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "پنجره اصلی را همواره بپنهان" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "پنجره اصلی را همواره بنمایان" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "همواره آغاز به پخش می‌کند" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "کلمنتاین به افزونه‌ی دیگری برای استفاده‌ی اسپاتیفای نیاز دارد. آیا می‌خواهید این افزونه را بارگیری و نصب نمایید؟" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "مشکلی هنگام فراخوانی پایگاه داده‌ی آی‌تیون پیش آمد" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "مشکلی در نوشتن ابرداده در '%1' پیش آمد" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "خطای ناشناخته‌ای پدید آمد." #: ui/about.cpp:85 msgid "And:" msgstr "و:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "خشمگین" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "شمایل" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "پیوست پرونده/نشانی اینترنتی به لیست‌پخش" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "پیوست به لیست‌پخش جاری" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "پیوست به لیست‌پخش" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "فشرده‌سازی برای چیده نشدن" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "آیا مطمئنید که می‌خواهید پیش‌نشانده‌ی «%1» را پاک کنید؟" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "آیا مطمئنید که می‌خواهید آماره‌ی این آهنگ را پاک کنید؟" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "هنرمند" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "اطلاعات هنرمند" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "برچسب هنرمند" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "حرف اول هنرمند" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "گونه‌ی آوا" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "ناکامی در شناسایی" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "نویسنده" #: ui/about.cpp:68 msgid "Authors" msgstr "نویسندگان‌" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "خودکار" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "به‌روز رسانی خودکار" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "رسته‌های تنها را خودکار در درخت کتابخانه باز کن" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "در دسترس" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "میانگین ضرباهنگ" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "میانگین اندازه‌ی فرتور" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "پادکست بی‌بی‌سی" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "ض.د.د" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "جریان پس‌زمینه" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "رنگ پس‌زمینه" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "فرتور پس‌زمینه" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "تاری پس‌زمینه" #: core/database.cpp:648 msgid "Backing up database" msgstr "پشتیبان‌گیری از پایگاه داده" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "آنالیزور میله‌ای" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "آبی ابتدایی" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "گونه‌ی ابتدایی آوا" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "رفتار" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "بهترین" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "بیوگرافی از %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "ضرب آهنگ" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "ضرباهنگ" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "آنالیزور بلوکی" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "گونه‌ی بلوک" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "اندازه تیرگی" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "بدنه" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "آنالیزور نرده‌ای" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "باکس" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "مرور..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "میان‌گیری" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "اما این سرچشمه‌ها ناپویا هستند:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "دکمه‌ها" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "پشتیبانی از سیاهه" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "کنسل" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "تغییر جلد هنری" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "تغییر اندازه‌ی قلم..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "تغییر سبک تکرار" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "تغییر میانبر..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "تغییر سبک درهم" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "تغییر زبان" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "تغییر ترجیح‌های بازپخش مونو برای آهنگ‌های پسین کاراست" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "بررسی برای داستان‌های تازه" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "بررسی به‌روز رسانی..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "گزینش نام برای لیست‌پخش هوشمند" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "گزینش خودکار" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "گزینش رنگ..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "گزینش قلم..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "گزینش از لیست" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "گزینش روش مرتب‌سازی لیست و تعداد آهنگهای آن" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "گزیدن پوشه‌ی بارگیری پادکست" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "پایگاه اینترنتی را برگزینید که می‌خواهید کلمنتاین متن آهنگ‌ها را بارگیری کند" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "کلاسیک" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "پالایش" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "پاک کن" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "پاک کردن لیست‌پخش" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "کلمنتاین" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "خطای کلمنتاین" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "پرتقالی کلمنتاین" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "فرتورسازی کلمنتاین" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "کلمنتاین می‌تواند خودکار، آهنگ‌هایی را که روی این دستگاه ذخیره می‌کنید به سبکی پخش‌پذیر در دستگاه تبدیل کند." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "کلمنتاین می‌تواند آهنگ‌های را پخش کند که شما در باکس بارگذاشته‌اید" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "کلمنتاین می‌تواند آهنگ‌های را پخش کند که شما در دراپ‌باکس بارگذاشته‌اید" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "کلمنتاین می‌تواند آهنگ‌های را پخش کند که شما در درایو گوگل بارگذاشته‌اید" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "کلمنتاین می‌تواند پیامی در صورت تغییر ترک بنمایاند." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "کلمنتاین می‌تواند لیست هموندی‌های شما را با رایانه‌های دیگر و کاربری‌های پادکست همگام کند. یک اکانت بسازید." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "کلمنتاین نمی‌تواند هیچ فرتورسازی projectM را بارگذاری کند. درستی نصب کلمنتاین را بررسی کنید." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "نمایشگر فرتور کلمنتاین" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "کلمنتاین نتوانست دستاوردهای این پرونده را بیابد" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "پوشه‌ای که کلمنتاین در آن به دنبال آهنگ می‌گردد:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "برای افزودن آهنگ‌ها، اینجا را بفشارید" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "برای سویچ بین زمان رفته و زمان باقیمانده، اینجا را کلیک کنید" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "با فشردن دکمه‌ی لاگین یک مرورگر گشوده می‌شود. پس از لاگین باید به کلمنتاین بازگردید." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "بستن" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "بستن لیست‌پخش" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "بستن فرتورسازی" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "بستن این پنجره، بارگیری را کنسل می‌کند." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "بستن این پنجره، جستجوی جلد آلبوم‌ها را کنسل می‌کند." #: ui/equalizer.cpp:114 msgid "Club" msgstr "باشگاه" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "رنگ" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "لیست مجزا بوسیله‌ی ویرگول از کلاس:طبقه، طبقه ۰-۳ است" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "توضیح" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "تکمیل خودکار برچسب‌ها" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "تکمیل خودکار برچسب‌ها..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "تنظیم‌کننده" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "پیکربندی %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "پیکربندی مگناتیون..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "پیکربندی میان‌برها" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "پیکربندی اسپاتیفای..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "پیکربندی ساب‌سونیک..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "پیکربندی جستجوی سراسری..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "پیکربندی کتابخانه..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "پیکربندی پادکست..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "پیکربندی..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "کنترل Wii را با استفاده از کنش پویا/ناپویا وصل کنید" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "اتصال دستگاه" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "اتصال به اسپاتیفای" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "پیشانه" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "ضرباهنگ ثابت" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "برگرداندن تمام آهنگ‌ها" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "برگردان تمام آهنگ‌هایی که دستگاه نمی‌تواند پخش کند" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "کپی به کلیپ‌بورد" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "کپی‌کردن در دستگاه..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "کپی‌کردن در کتابخانه..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "کپی‌رایت" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "نمی‌توانم به ساب‌سونیک بپیوندم، نشانی سرور را بررسی کنید. نمونه: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "نمی‌توانم عنصر «%1» از GStream را بسازم - مطمئن شوید که همه‌ی افزونه‌های مورد نیاز GStream را نصب کرده‌اید" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "نمی‌توانم موکسر را برای %1 پیدا کنم، بررسی کنید که افزونه‌ی مناسب GStream را نصب کرده‌اید" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "نمی‌توانم رمزگذاری برای %1 پیدا کنم، بررسی کنید که افزونه‌ی مناسب GStream را نصب کرده‌اید" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "نمی‌توانم پرونده‌ی بروندادی %1 را باز کنم" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "مدیریت جلد" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "جلد هنری را از فرتور نشانده شده بردار" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "جلد هنری از %1 خودکار فراخوانی شد" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "جلد هنری دستی بازنشانده شد" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "جلد هنری نشانده نشد" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "جلد هنری از %1 نشانده شد" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "جلدها از %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "پژمردن آهنگ زمانی که ترک‌ها خودکار تغییر می‌کنند" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "پژمردن آهنگ زمانی که ترک‌ها دستی تغییر می‌کنند" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "سفارشی" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "فرتور دلخواه:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "تنظیم پیام سفارشی" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "سفارشی..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "مسیر DBus" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "رقص" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "خرابی در پایگاه داده شناسایی شد. خواهشمندم دستور کار زدودن این خطا را در این نشانی بخوانید: https://code.google.com/p/clementine-player/wiki/DatabaseCorruption" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "تاریخ ساخت" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "تاریخ بازسازی" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "روز" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "پیش‌&فرض" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "کاهش صدا ۴٪" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "صدا را درصد کاهش بده" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "کاهش صدا" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "فرتور پس‌زمینه‌ی پیشفرض" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "پیش‌نشان‌ها" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "تأخیر بین فرتورسازیها" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "پاک‌کردن" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "پاک‌کردن دانستنی‌های بارگیری شده" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "پاک کردن پرونده‌ها" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "پاک کردن از دستگاه..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "پاک کردن از دیسک..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "پاک‌کردن داستانهای پخش‌شده" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "پاک کردن پیش‌نشانده" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "پاک کردن لیست‌پخش هوشمند" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "پاک کردن اصل پرونده‌ها" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "پاک کردن پرونده‌ها" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "صف‌بندی دوباره‌ی ترک‌های برگزیده" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "صف‌بندی دوباره‌ی ترک" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "مقصد" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "جزئیات..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "دستگاه" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "ویژگی‌های دستگاه" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "نام دستگاه" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "ویژگی‌های دستگاه..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "‌دستگاه‌ها" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "منظورت این بود که" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "واردات دیجیتالی" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "گذرواژه‌های وارداتی دیجیتالی" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "نام‌های کاربری وارداتی دیجیتالی" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "ارتباط مستقیم اینترنت" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "فهرست راهنما" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "مدت ناپویا‌سازی" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "ناپویا کردن ساخت میله‌ی مود" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "دیسک" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "ارسال ناپیوسته" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "گزینه‌های نمایش" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "نمایش نمایش پرده‌ای" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "انجام وارسی دوباره‌ی کامل کتابخانه" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "هیچ آهنگی را تبدیل نکن" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "تکرار نکن" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "در هنرمندان گوناگون نشان نده" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "پخش مرتب" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "نایست!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "برای گشودن دو بار کلیک کنید" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "دو بار کلیک یک آهنگ باعث..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "بارگیری %n داستان" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "بارگیری پوشه" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "بارگیری داستان‌های تا" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "بارگیری هموندی" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "بارگیری خودکار داستان‌های تازه" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "صف بارگیری" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "بارگیری این آلبوم" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "بارگیری این آلبوم..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "بارگیری این داستان" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "بارگیری..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "درحال بارگیری (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "بارگیری پوشه‌ی آیس‌کست" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "بارگیری کاتالوگ جامندو" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "بارگیری کاتالوگ مگناتیون" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "بارگیری افزونه‌ی اسپاتیفای" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "بارگیری ابرداده" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "برای مکان‌گذاری دوباره بکشید" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "دراپ‌باکس" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "سبک دینامیک پویاست" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "درهم‌ریختن تصادفی دینامیک" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "ویرایش لیست‌پخش هوشمند..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "ویرایش برچسب..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "ویرایش برچسب‌ها" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "ویرایش دانستنی‌های ترک" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "ویرایش دانستنی‌های ترک..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "ویرایش دانستنی‌های ترک‌ها..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "ویرایش...." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "پویا‌سازی پشتیبانی کنترل Wii" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "پویاسازی برابرساز" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "پویاسازی میان‌برها تنها زمانی که کلمنتاین در کانون است" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "در پایین سرچشمه‌ها را پویا کنید تا در جستجو منظور شوند. دستاوردها به این ترتیب نمایانده می‌شوند." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "پویا/ناپویاسازی واکشی لست‌‌اف‌ام" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "پیچیدگی رمزینه" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "کیفیت موتور رمزینه" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "سبک رمزینه" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "یک نشانی اینترنتی وارد کنید" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "برای بارگیری جلد از اینترنت، یک نشانی اینترنتی وارد کنید:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "نامی برای این لیست‌پخش وارد کنید" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "برای یافتن آهنگ در رایانه و اینترنت، عبارت جستجو را در بالا وارد کنید" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "برای یافتن پادکست در فروشگاه آی‌تیون، عبارت جستجو را در پایین وارد کنید" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "برای یافتن پادکست در gpodder.net، عبارت جستجو را در پایین وارد کنید" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "واژه‌های جستجو را در اینجا وارد کنید" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "نشانی اینترنتی یک ایستگاه رادیویی اینترنتی را وارد کنید:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "نام پوشه را وارد کنید" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "همه‌ی مجموعه" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "برابرساز" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "برابر است با --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "برابر است با --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "خطا" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "خطا در اتصال به دستگاه MTP" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "خطا در کپی کردن آهنگ‌ها" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "خطا در پاک کردن آهنگ‌ها" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "خطا در بارگیری افزونه‌ی Spotify" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "خطا در فراخوانی %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "خطا در بارگیری لیست پخش di.fm" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "خطای پردازش %1:%2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "خطا هنگام فراخوانی سی‌دی آوایی" #: library/library.cpp:68 msgid "Ever played" msgstr "همواره پخش‌شده" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "هر ۱۰ دقیقه" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "هر ۱۲ دقیقه" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "هر ۲ ساعت" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "هر ۲۰ دقیقه" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "هر ۳۰ دقیقه" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "هر ۶ ساعت" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "هر ساعت" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "به جز بین ترک‌ها یک آلبوم یا یک سیاهه" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "گسترش" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "در %1 انقضا می‌یابد" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "پژمردن هنگام ایست یک ترک" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "پژمردن" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "زمان پژمردن" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "ناتوان در واکشی پوشه" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "ناتوان در واکشی پادکست" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "ناتوان در بارگذاری پادکست" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "ناتوان در موشکافی XML برای خوراک RSS" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "تند" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "ترک‌های برگزیده" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "واکشی جلدهای ناموجود" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "واکشی خودکار" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "واکشی کامل شد" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "واکشی کتابخانه‌ی ساب‌سونیک" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "خطای واکشی جلد" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "پسوند پرونده" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "گونه‌ی پرونده" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "نام پرونده" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "نام پرونده (بدون مسیر)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "اندازه پرونده" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "گونه‌ی پرونده" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "نام‌پرونده" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "پرونده‌ها" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "پرونده‌های برای تراکد" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "یافتن آهنگ‌های در کتابخانه که با معیارهای شما همخوانی دارند." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "انگشت‌نگاری آهنگ" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "پایان" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "طبقه‌ی اول" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "اندازه‌ی قلم" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "به دلایل اجازه‌نامه، پشتیبانی اسپاتیفای در افزونه‌ای جداگانه است." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "واداشتن به رمزینه‌ی مونو" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "فراموشیدن دستگاه" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "انصراف یک دستگاه آن را از این لیست پاک می‌کند و بار دیگر که دستگاه را وصل کردید، کلمنتاین باید همه‌ی آهنگهای آن را دوباره جستجو کند." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "فرم" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "قالب" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "آهنگ فریم" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "فریم در هر بافر" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "منجمد" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "باس کامل" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "باس کامل + لرزش" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "لرزش کامل" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "عمومی" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "تنظیم‌های عمومی" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "ژانر" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "دریافت کانال" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "گرفتن جریان‌ها" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "نامی به آن دهید:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "برو" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "برو به نوار پسین لیست‌پخش" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "برو به نوار پیشین لیست‌پخش" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "درایو گوگل" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "%1 از %2 جلدها دریافت شد (%3 ناموفق)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "آهنگ‌های ناموجود لیست‌پخش‌های من را خاکستری کن" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "کتابخانه را گروه‌بندی کن برپایه‌ی..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "گروه‌بندی برپایه‌ی" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "آلبوم" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "هنرمند" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "هنرمند/آلبوم" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "هنرمند/سال - آلبوم" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "ژانر/آلبوم" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "ژانر/هنرمند/آلبوم" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "برگه‌ی اچ‌تی‌ام‌ال بدون هیچ‌گونه خوراک آراس‌اس است" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "پراکسی HTTP" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "خوشحال" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "دانستنی‌های سخت‌افزاری" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "اطلاعات سخت‌افزاری تنها در صورتی در دسترس است که دستگاه متصل باشد." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "زیاد" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "زیاد (%1 ف.د.ث)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "زیاد (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "ساعت" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "اکانت مگناتیون ندارم" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "آیکون" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "آیکون در بالا" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "تشخیص آهنگ" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "اگر ادامه دهید، این دستگاه آهسته کار خواهد کرد و آهنگهای کپی شده روی آن ممکن است پخش نشوند." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "اگر نشانی اینترنتی یک پادکست را می‌دانید، آن را در پایین وارد کنید و «برو» را فشار دهید." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "صرف نظر از «The» در نام هنرمندان" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "تصاویر (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "تصاویر (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "در %1 روز " #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "در %1 هفته" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "در سبک دینامیک پس از پایان هر آهنگ، ترک‌های تازه برگزیده و به لیست‌پخش افزوده می‌شوند." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "صندوق ورودی" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "آلبوم هنری را در آگاه‌ساز قرار بده" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "دربر داشتن همه‌ی آهنگها" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "ویرایش پروتکل REST ناسازگار است. مشتری باید پیشرفت کند. " #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "ویرایش پروتکل REST ناسازگار است. سرور باید پیشرفت کند." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "بلندی صدا را ٪۴ بیفزا" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "افزایش بلندی درصد" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "افزایش صدا" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "نمایه‌گذاری %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "اطلاعات" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "قرار دادن..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "نصب شد" #: core/database.cpp:585 msgid "Integrity check" msgstr "بررسی درستی" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "اینترنت" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "فراهم‌کنندگان اینترنت" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "کلید API نامعتبر" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "قالب نامعتبر" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "روش نامعتبر" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "پارامترهای نامعتبر" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "منابع مشخص‌شده نامعتبرند" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "سرویس نامعتبر" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "کلید جلسه‌ی نامعتبر" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "جامندو" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "ترک‌های بیشتر شنیده شده‌ی جامندو" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "ترک‌های برتر جامندو" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "ترک‌های برتر ماه جامندو" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "ترک‌های برتر هفته‌ی جامندو" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "پایگاه داده‌ی جامندو" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "پرش به ترک در حال پخش" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "دکمه‌ها را %1 ثانیه نگه دار..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "دکمه‌ها را %1 ثانیه نگه دار..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "پخش را در پس‌زمینه ادامه بده زمانی که پنجره بسته می‌شود" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "اصل پرونده‌ها را نگه دار" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "زبان" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "لپتاپ/هدفون" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "سالن بزرگ" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "جلد آلبوم بزرگ" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "میله‌ی کناری بزرگ" #: library/library.cpp:80 msgid "Last played" msgstr "پخش پایانی" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "لست‌‌اف‌ام" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "لست‌‌اف‌ام در حال پخش است، پس از چند دقیقه دوباره تلاش کنید" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "گذرواژه‌ی لست‌‌اف‌ام" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "لست‌‌اف‌ام شمارش پخش‌شده‌ها" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "برچسب لست‌‌اف‌ام" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "شناسه‌ی لست‌‌اف‌ام" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "ویکی لست‌‌اف‌ام" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "ترک‌های کمتر برگزیده" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "طول" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "کتابخانه" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "گروه‌بندی پیشرفته‌ی کتابخانه" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "آگاه‌سازی پویش دوباره‌ی کتابخانه" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "جستجوی کتابخانه" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "محدودیت‌ها" #: ui/equalizer.cpp:137 msgid "Live" msgstr "زنده" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "بارگیری" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "بارگیری جلدها از اینترنت" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "بارگیری جلدها از اینترنت..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "بارگیری جلد از دیسک" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "بارگیری جلدها از دیسک" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "بارگیری لیست‌پخش" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "بارگیری لیست‌پخش..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "بارگیری دستگاه MTP" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "بارگیری پایگاه داده‌ی آی‌پاد" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "بارگیری لیست‌پخش هوشمند" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "بارگیری آهنگ‌ها" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "بارگیری جریان" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "بارگیری ترک" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "بارگیری اطلاعات ترک‌ها" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "در حال بارگیری..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "بارگیری پرونده‌ها/نشانی‌ها، جانشانی دوباره‌ی لیست‌پخش جاری" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "ورود به سیستم" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "ورود شکست خورد" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "نمایه‌ی پیش‌بینی بلندمدت" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "عشق" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "پایین (%1 ف.د.ث)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "پایین (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "نمایه‌ی با پیچیدگی کم (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "متن آهنگ" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "متن آهنگ از %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "مگناتیون" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "بارگیری مگناتیون" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "بارگیری مگناتیون پایان یافت" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "نمایه‌ی اصلی (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "همین‌جوریش کن!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "لیست‌پخش را بیرون‌خط در دسترس بگذار" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "پاسخ ناهنجار" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "پیکربندی دستی پراکسی" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "دستی" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "تولید‌کننده" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "نشان‌گذاری شنیده شده" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "نشان‌گذاری تازه" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "همخوانی همه‌ی واژه‌های جستجو (و)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "همخوانی یک یا بیشتر از یک واژه‌ی جستجو (یا)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "بیشترین ضرباهنگ" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "میانه (%1 ف.د.ث)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "میانه (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "گونه‌ی هموندی" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "کمترین ضرباهنگ" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "نبود پیش‌نشان‌های projectM" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "مدل" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "رسد کتابخانه برای تغییرات" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "پخش مونو" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "ماه" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "مود" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "شمایل میله‌ی مود" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "میله‌های مود" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "بیشترین پخش‌شده‌ها" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "سوارگاه" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "سوارگاه‌ها" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "پایین بردن" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "جابه‌جایی به کتابخانه..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "بالا بردن" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "آهنگ" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "کتابخانه‌ی آهنگ" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "بی‌صدا" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "آهنگ‌های من" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "پیشنهادهای من" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "نام" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "گزینه‌های نام‌گذاری" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "نوار باریک (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "پیشکار پراکسی" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "کنترل از راه دور شبکه " #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "هرگز" #: library/library.cpp:74 msgid "Never played" msgstr "هرگز پخش‌نشده" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "هرگز آغاز به پخش نمی‌کند" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "پوشه‌ی تازه" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "لیست‌پخش تازه" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "لیست‌پخش هوشمند تازه..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "آهنگ‌‌های تازه" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "ترک‌های تازه خودکار اضافه می‌شوند." #: library/library.cpp:92 msgid "Newest tracks" msgstr "تازه‌ترین ترک‌ها" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "پسین" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "ترک پسین" #: core/utilities.cpp:151 msgid "Next week" msgstr "هفته‌ی پسین" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "بدون آنالیزور" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "بدون فرتور پس‌زمینه" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "بدون بلوک‌های بلند" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "همخوانیی پیدا نشد. جعبه‌های جستجو را پاک کنید تا همه‌ی لیست‌پخش‌ها دوباره نمایش داده شوند." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "بدون بلوک‌های کوتاه" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "هیچ‌کدام" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "هیچ‌کدام از آهنگ‌های برگزیده مناسب کپی کردن در دستگاه نیستند" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "نرمال" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "گونه‌ی بلوک نرمال" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "مهیا نیست زمانی که از یک لیست‌پخش دینامیک استفاده می‌کنید" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "متصل نیست" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "بدون محتوای کافی" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "بدون هوادار کافی" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "بدون عضو کافی" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "بدون همسایه‌ی کافی" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "نصب نشده" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "وارد نشده‌اید" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "سوار نشده است - دو بار فشار دهید تا سوار شود" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "گونه‌ی آگاه‌سازی‌ها" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "آگاه‌سازی‌ها" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "در حال پخش" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "پیش‌مشاهده‌ی OSD" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "اجازه دسترسی به آی پی هایی ار بازه: \n 10.x.x.x \n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "تنها ابتدا را نمایش بده" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "تاری" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "گشودن %1 در مرورگر" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "گشودن &سی‌دی آوایی..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "گشودن پرونده‌ی اوپی‌ام‌ال" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "گشودن پرونده‌ی اوپی‌ام‌ال..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "گشودن دستگاه" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "گشودن پرونده..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "گشوده در درایو گوگل" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "گشودن در لیست‌پخش تازه شود" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "گشودن..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "شکست عملیات" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "بهینه‌سازی ضرباهنگ" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "بهینه‌سازی کیفیت" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "گزینه‌ها..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "سازماندهی پرونده‌ها" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "سازماندهی پرونده‌ها..." #: core/organise.cpp:73 msgid "Organising files" msgstr "پرونده‌های سازماندهی شونده" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "برچسب‌های اصلی" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "گزینه‌های دیگر" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "گزینه‌های بروندادی" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "رونویسی پرونده‌های موجود" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "دارنده" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "بررسی کاتالوگ جامندو" #: ui/equalizer.cpp:139 msgid "Party" msgstr "مهمانی" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "گذرواژه" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "درنگ" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "درنگ پخش" #: widgets/osd.cpp:156 msgid "Paused" msgstr "درنگ‌شده" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "میله‌کنار ساده" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "پخش" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "شمار پخش" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "پخش در صورت ایست، درنگ در صورت پخش" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "آغاز به پخش می‌کند اگر چیزی در حال پخش نیست" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "ترک -ام در لیست‌پخش را پخش کن" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "پخش/درنگ" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "بازپخش" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "گزینه‌های پخش‌کننده" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "لیست‌پخش" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "لیست‌پخش پایان یافت" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "گزینه‌های لیست‌پخش" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "سبک لیست‌پخش" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "لیست‌های پخش" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "خواهشمندم مرورگر را ببندید و به کلمنتاین بازگردید." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "وضعیت افزونه" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "پادکست" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "پاپ" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "پنجرک" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "درگاه" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "پیش‌تقویت" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "تنظیم‌ها" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "تنظیم‌ها..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "پرونده‌های جلد هنری دلخواه (جداشده با ویرگول)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "فرمت آوایی دلخواه" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "ضرباهنگ برگزیده" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "فرمت دلخواه" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "سبک آوایی برتر" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "پیش‌نشانده:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "یک ترکیب از دکمه‌ها را فشار دهید برای استفاده در" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "کلیدی را فشار دهید" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "یک ترکیب از دکمه‌ها را فشار دهید برای استفاده در %1..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "گزینه‌های زیبای OSD" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "پيش‌نمايش" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "پیشین" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "ترک پیشین" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "اطلاعات ویرایش را چاپ کن" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "نمایه" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "پیشرفت" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "دکمه‌ی کنترل Wii را فشار دهید" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "آهنگ‌ها را به طور تصادفی بچین" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "جستجوی دستگاه..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "مدیر به‌خط کردن" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "به‌خط کردن ترک‌های گزیده" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "به‌خط کردن ترک" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "رادیو (بلندی یکسان برای همه‌ی ترک‌ها)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "باران" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "فرتورسازی تصادفی" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "رتبه‌ی آهنگ جاری را صفر ستاره کن" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "رتبه‌ی آهنگ جاری را یک ستاره کن" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "رتبه‌ی آهنگ جاری را دو ستاره کن" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "رتبه‌ی آهنگ جاری را سه ستاره کن" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "رتبه‌ی آهنگ جاری را چهار ستاره کن" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "رتبه‌ی آهنگ جاری را پنج ستاره کن" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "رتبه‌بندی" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "واقعا کنسل شود؟" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "بازخوانی کاتالوگ" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "بازخوانی کانالها" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "بازخوانی لیست ایستگاه‌ها" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "نوسازی جریان‌ها" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "رگه" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "دورکنترل تابی Wii را به‌یاد بیاور" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "از بار پایانی به‌یاد بیاور" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "پاک کردن" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "پاک کردن عملیات" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "پاک‌کردن تکراری‌ها از لیست‌پخش" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "پاک کردن پوشه" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "پاک‌کردن از آهنگ‌های من" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "از لیست‌پخش پاک کن" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "لیست‌پخش را دوباره نامگذاری کن" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "لیست‌پخش را دوباره نامگذاری کن..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "ترک‌ها را به این ترتیب دوباره شماره‌گذاری کن..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "تکرار" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "تکرار آلبوم" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "تکرار لیست‌پخش" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "تکرار ترک" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "دوباره جانشانی لیست‌پخش جاری" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "دوباره جانشانی لیست‌پخش شود" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "فاصله‌ها را با زیرخط جانشانی کن" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "پخش دوباره‌ی دستاورد" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "ساکن شدن دوباره" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "بازنشانی" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "بازنشانی شمار پخش" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "محدود به حروف اَسکی کن" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "برگشتن به کلمنتاین" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "راک" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "انجام" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "پراکسی ساکس" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "دستگاه را با امنیت پاک کن" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "دستگاه را پس از کپی، با امنیت پاک کن" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "الگوی ضرباهنگ" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "ضرباهنگ‌الگو" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "ذخیره‌ی پرونده‌ی .mod در کتابخانه‌ی آهنگ‌های شما" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "ذخیره‌ی جلد آلبوم" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "در حال ذخیره‌ی جلد در دیسک" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "ذخیره‌ی فرتور" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "ذخیره‌ی لیست‌پخش..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "ذخیره‌ی بازنشانده" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "ذخیره‌ی این جریان در باریکه‌ی اینترنت" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "ذخیره‌ی ترک‌ها" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "نمایه‌ی الگوی ضرباهنگ سنجه‌پذیر (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "امتیاز" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "وارانی ترک‌هایی که گوش می‌دهم" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "جستجو" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "جستجوی ایستگاه‌های آیس‌کست" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "جستجوی جامندو" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "جستجوی مگناتیون" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "جستجوی ساب‌سونیک" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "جستجوی جلد آلبوم..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "جستجو برای هرچیزی" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "جستجوی جی‌پادر (gpodder.net)" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "جستجوی آی‌تیون" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "سبک جستجو" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "گزینه‌های جستجو" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "دستاورد جستجو" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "عبارات جستجو" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "مرتبه‌ی دوم" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "جستجوی پس‌گرد" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "جستجوی پیش‌گرد" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "جستجوی ترک در حال پخش بوسیله‌ی مقداری نسبی" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "جستجوی ترک در حال پخش به یک جایگاه ویژه" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "گزینش همه" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "برگزیدن هیچ‌کدام" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "رنگ پس‌زمینه را برگزینید:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "فرتور پس‌زمینه را برگزینید" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "گزینش بهترین تطبیق ممکن" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "گزینش رنگ پیش‌زمینه:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "گزینش فرتورسازها" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "گزینش فرتورسازها..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "شماره سریال" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "نشانی سرور" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "جزئیات سرور" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "سرویس برون‌خط" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "%1 را برابر \"%2‌\"قرار بده..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "بلندی صدا را برابر درصد قرار بده" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "این مقدار را برای همه‌ی ترک‌های گزیده قرار بده..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "میان‌بر" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "میان‌بر برای %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "میان‌بر برای %1 از پیش وجود دارد" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "نمایش" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "نمایش OSD" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "انیمیشنی درخشان در ترک جاری نمایش بده" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "نمایش یک میله‌مود در میله‌ی پیشرفت ترک" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "یک آگاه‌سازی ذاتی میزکار نمایش بده" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "یک آگاه‌سازی نمایش بده زمانی که سبک تکرار/برزدن را تغییر می‌دهم" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "نمایش یک آگاه‌سازی زمانی بلندی صدا را تغییر می‌دهم" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "نمایش یک پنجرک در سینی سیستم" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "نمایش یک OSD زیبا" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "نمایش در بالای میله‌ی وضعیت" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "نمایش همه‌ی آهنگ‌ها" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "نمایش همه‌ی آهنگ‌ها" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "نمایش جلد هنری در کتابخانه" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "نمایش جداسازها" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "نمایش اندازه‌ی کامل..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "نمایش در مرورگر پرونده..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "نمایش در هنرمندان گوناگون" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "نمایش میله‌مود" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "نمایش تنها تکراری‌ها" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "نمایش تنها بی‌برچسب‌ها" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "نمایش پیشنهادهای جستجو" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "نمایش دکمه‌ی واکشی در پنجره اصلی" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "نمایش آیکون سینی" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "نمایش سرچشمه‌های پویا و ناپویا" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "آشکار/پنهان" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "پخش درهم" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "برزدن آلبوم‌ها" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "پخش درهم همه" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "پخش درهم لیست‌پخش" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "برزدن ترک‌های این آلبوم" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "راه‌یابی" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "برونرفت از سیستم" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "ورود به ..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "هنرمندان مشابه" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "پرش پس در لیست‌پخش" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "پرش شمار" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "پرش پیش در لیست‌پخش" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "جلد آلبوم کوچک" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "میله‌ی کنار کوچک" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "لیست‌پخش هوشمند" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "لیست‌پخش‌های هوشمند" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "ملایم" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "راک ملایم" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "اطلاعات آهنگ" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "اطلاعات آهنگ" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "سونوگرام" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "شرمنده" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "مرتب‌سازی برپایه‌ی ژانر (الفبایی)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "مرتب‌سازی برپایه‌ی ژانر ( برپایه‌ی محبوبیت)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "مرتب‌سازی برپایه‌ی نام ایستگاه" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "مرتب‌سازی آهنگ‌ها برپایه‌ی" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "مرتب‌سازی" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "سرچشمه" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "سرچشمه‌ها" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "اسپاتیفای" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "خطای ورود به سیستم اسپاتیفای" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "افزونه‌ی اسپاتیفای" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "افزونه‌ی اسپاتیفای نصب نیست" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "استاندارد" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "ستاره‌دار" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "شروع لیست‌پخش در حال پخش" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "آغاز تراکد" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "چیزی در جعبه‌ی جستجوی بالا بنویسید تا این لیست دستاوردهای جستجو را پرکنید" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "شروع %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "شروع..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "ایست" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "ایست پس از" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "ایست پس از این آهنگ" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "ایست پخش" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "ایست پخش پس از ترک جاری" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "ایست‌شده" #: core/song.cpp:431 msgid "Stream" msgstr "جریان" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "جریان‌گیری از یک سرور ساب‌سونیک نیازمند لیسانس معتبر پس از ۳۰ روز دوره‌ی آزمایشی است." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "هموندی جریان" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "هموندی‌ها" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "ساب‌سونیک" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "کامیاب!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "%1 با موفقیت نوشته شد" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "برچسب‌های پیشنهادی" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "چکیده" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "بسیار بالا (%1 ف.د.ث)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "ابربالا (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "فرمت‌های قابل پشتیبانی" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "همگام‌سازی صندوق ورودی اسپاتیفای" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "همگام‌سازی لیست‌پخش اسپاتیفای" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "همگام‌سازی ترک‌های ستاره‌دار اسپاتیفای" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "رنگ سیستم" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "باریکه‌ها در بالا" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "واکش برچسب‌ها" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "ضرباهنگ هدف" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "تکنو" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "گزینه‌های متن" #: ui/about.cpp:74 msgid "Thanks to" msgstr "تشکر از" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "فرمان «%1» نمی‌تواند شروع شود." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "جلد آلبوم آهنگ درحال پخش" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "پرونده‌ی «%1» معتبر نیست" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "مقدار دوم باید بزرگتر از مقدار اول باشد!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "پایگاه درخواستی وجود ندارد!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "پایگاه درخواستی فرتور نیست!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "زمان آزمایشی سرور ساب‌سونیک پایان یافته است. خواهش می‌کنیم هزینه‌ای را کمک کنید تا کلید پروانه را دریافت کنید. برای راهنمایی انجام کار تارنمای subsonic.org را ببینید." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "ویرایشی زا کلمنتاین که هم‌اکنون به‌روز کردید، به خاطر ویژگیهای زیر، نیاز به بررسی کامل کتابخانه دارد:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "آهنگ‌های دیگری در این آلبوم وجود دارند" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "مشکلی در گفتگو با gpodder.net پدیدار شد" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "مشکلی در واکشی ابرداده‌ها از مگناتیون پیش آمد" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "مشکلی در موشکافی پاسخ فروشگاه آی‌تیون پدید آمد" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "مشکلی در کپی کردن تعدادی از آهنگ‌‌ها وجود داشت. پرونده‌های زیر کپی نشدند:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "مشکلی در پاک کردن تعدادی از آهنگ‌ها وجود داشت. پرونده‌های زیر پاک نشدند:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "این پرونده‌ها از دستگاه پاک خواهند شد، آیا مطمئنید که می‌خواهید ادامه دهید؟" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "برای درست کردن کتابخانه، این پوشه‌ها بررسی خواهند شد" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "این تنظیم‌ها در دیالوگ «آهنگ‌های تراکد»، و همچنین زمان تبدیل آهنگ پیش از کپی در دستگاه، استفاده شده‌اند." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "طبقه‌ی سوم" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "این عمل پایگاه داده‌ای به بزرگی ۱۵۰ مگابایت درست می‌کند.\nآیا ادامه می‌دهید؟" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "این آلبوم در فرمت درخواست‌شده در دسترس نیست." #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "این دستگاه باید متصل و باز شده باشد پیش از اینکه کلمنتاین ببیند چه فرمت‌هایی پشتیبانی می‌شوند." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "این دستگاه از فرمت‌های زیر پشتیبانی می‌کند:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "این دستگاه درست کار نخواهد کرد" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "این یک دستگاه MTP است، اما شما کلمنتاین را بدون پشتیبانی libmtp پردازش کرده‌اید." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "این یک آی‌پاد است، اما شما کلمنتاین را بدون پشتیبانی libgpod پردازش کرده‌اید." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "این اولین باری است که این دستگاه را وصل کرده‌اید. کلمنتاین حالا دستگاه را برای یافتن پرونده‌های آهنگ جستجو می‌کند - این کار ممکن است کمی طول بکشد." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "این جریان تنها برای مشترکان پولی است" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "این گونه از دستگاه پشتیبانی نمی‌شود: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "عنوان" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "امروز" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "تبدیل به OSD زیبا" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "تبدیل به تمام‌صفحه" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "تبدیل به وضعیت صف" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "تبدیل به وارانی" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "تبدیل به پدیداری برای نمایش‌برصفحه‌ی زیبا" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "فردا" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "بیش از اندازه بازگردانی‌ها" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "ترک‌های برتر" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "همه‌ی بایت‌های ارسال شده" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "همه‌ی درخواست‌های شبکه انجام شد" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "ترک" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "آهنگ‌های تراکد" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "صورت عملیات تراکدگر" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "تراکدکردن" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "تراکدکردن فایلهای %1 با استفاده از سرنخ‌های %2" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "گزینه‌های تراکد" #: core/song.cpp:426 msgid "TrueAudio" msgstr "آوای واقعی" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "توربین" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "خاموش" #: devices/giolister.cpp:157 msgid "URI" msgstr "نشانی" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "نشانی" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "نوار ابرپهن (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "ناکام در باگیری %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "ناشناخته" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "سبک محتوای ناشناخته" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "خطای ناشناخته" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "قرار ندادن جلد" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "لغو هموندی" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "کنسرت‌های پیش‌رو" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "به‌روز رسانی همه‌ی پادکست‌ها" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "تغییرات پوشه‌های کتابخانه را به‌روز برسان" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "زمانی که کلمنتاین شروع می‌شود کتابخانه را به‌روز کن" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "به‌روز رسانی این پادکست" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "به‌روز رسانی" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "به‌روز رسانی %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "به‌روز رسانی %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "به‌روز رسانی کتابخانه" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "کاربرد" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "بکاربردن برچسب «هنرمند آلبوم» زمانی که وجود داشته باشد" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "بکار بردن کلیدهای میان‌بر گنوم" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "در صورت وجود، از ابرداده‌ی Replay Gain استفاده کن" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "بکار بردن دورکنترل Wii" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "بکاربردن یک دسته دلخواه رنگ" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "بکار بردن پیام پیشنهادی برای آگاه‌سازی‌ها" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "بکار بردن سندیت" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "بکار بردن موتور مدیریتی ضرباهنگ" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "بکار بردن روش دینامیک" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "بکاربردن آگاه‌سازی برای گزارش وضعیت دور Wii" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "بکاربردن شکل زمانی پارازیت" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "بکاربردن پیش‌نشان‌های سیستم" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "بکاربردن دسته‌ی رنگ پیش‌نشان سیستم" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "بکاربردن تنظیم‌های پراکسی سیستم" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "استفاده از نرمال‌سازی صدا" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "استفاده‌شده" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "رابط کاربری" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "شناسه" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "بکاربردن منو برای افزودن آهنگ..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "آهنگ ضرب متغیر" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "هنرمندان گوناگون" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "ویرایش %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "نما" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "روش فرتورسازی" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "فرتورسازی‌ها" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "تنظیم‌های فرتورسازی‌ها" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "تشخیص پویایی صدا" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "حجم %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "تارنما" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "هفته" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "زمانی که کلمنتاین شروع می‌شود" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "زمانی که کلمنتاین بدنبال آلبوم هنری می‌گردد، ابتدا بدنبال پرونده‌های فرتوری می‌گردد که شامل یکی از کلمات زیر باشد.\nاگر چیزی پیدا نشد، آنگاه بزرگترین فرتور در پوشه را بکار می‌برد." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "زمانی که سیاهه تهی است..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "چرا این را نمی‌آزمایید:..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "باند پهن (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "دورکنترل Wii %1: پویا است" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "دورکنترل Wii %1: وصل است" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "دورکنترل Wii %1: باتری بحرانی است (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "دورکنترل Wii %1: ناپویا است" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "دورکنترل Wii %1: نصب نیست" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "دورکنترل Wii %1: باتری اندک (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "ویموتدو" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "فرمت آوایی مدیای ویندوز" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "آیا می‌خواهید آهنگ‌های دیگر در این آلبوم را به «هنرمندان گوناگون» تراببرید؟" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "آیا مایل هستید که الان بازبینی کامل انجام دهید؟" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "شناسه و گذرواژه‌ی نادرست" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "سال" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "سال - آلبوم" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "سال" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "دیروز" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "هم‌اکنون آلبوم‌های زیر بارگیری خواهند شد" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "هنوز وارد نشده‌اید." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "با نام %1 وارد شده‌اید." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "وارد شده‌اید." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "روشی را که آهنگ‌ها در کتابخانه سازماندهی می‌شوند، می‌توانید تغییر دهید." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "بدون اکانت می‌توانید رایگان بشنوید، اما عضوهای برجسته می‌توانند با کیفیت بالا و بدون تبلیغ جریان‌ها را بشنوند." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "بدون داشتن شناسه می‌توانید به آهنگ‌های مگناتیون گوش دهید. با پرداخت حق هموندی از شر پیام انتهای هر ترک راحت می‌شوید." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "به جریان پس‌زمینه همزمان با دیگر آهنگ‌ها می‌توانید گوش دهید." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "می‌توانید کنترل Wii خود را برای کنترل از راه دور کلمنتاین بکار برید. برای اطلاعات بیشتر به صفحه‌ی ویکی کلمنتاین مراجعه کنید.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "شما اکانت برجسته‌ی اسپاتیفای ندارید." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "شما هیچ هموندی پویایی ندارید" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "از اسپاتیفای بیرون آمده‌اید، خواهشمندم دوباره گذرواژه‌ی خود را در گفتگوی «تنظیم‌ها» وارد کنید." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "از اسپاتیفای بیرون آمده‌اید، خواهشمندم دوباره گذرواژه‌ی خود را وارد کنید." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "عاشق این آهنگ هستید" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "اگر زبان را تغییر دهید باید کلمنتاین را دوباره بارگذاری کنید." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "اعتبار لست‌‌اف‌ام شما نادرست بود" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "اعتبار مگناتیون شما نادرست بود" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "کتابخانه‌ی شما تهی است!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "جریان‌های رادیویی شما" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "برونکشی‌های شما: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "سیستم شما دارای OpenGL نیست، فرتورگری‌ها در دسترس نیستند." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "شناسه یا گذرواژه نادرست است." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "ی-ا" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "صفر" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "افزودن %n آهنگ" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "پس از" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "پیش" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "و" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "خودکار" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "پیش از" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "بین" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "بزرگترین اول" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "ض.د.د" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "شامل‌" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "ناپویا" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "دیسک %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "شامل نیست" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "پایان می‌یابد با" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "برابر است با" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "جی‌پادر (gpodder.net)" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "پوشه‌ی جی‌پادر (gpodder.net)" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "بزرگتر است از" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "در پایان" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "ک.ب.د.ث" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "کمتر است از" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "ابتدا بلندترین" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "ترابری %n آهنگ" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "ابتدا تازه‌ترین" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "برابر نیست با" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "در انتها نیست" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "نه در" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "ابتدا قدیمی‌ترین" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "در" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "گزینه‌ها" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "ورود را فشار دهید" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "پاک‌کردن %n آهنگ" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "ابتدا کوتاه‌ترین" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "برزدن آهنگ‌ها" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "ابتدا کوچک‌ترین" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "سامانیدن آهنگ‌ها" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "شروع شود با" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "ایست" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "ترک %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/fi.po000066400000000000000000005102341260417502300236420ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # FIRST AUTHOR , 2010 # Jiri Grönroos , 2012-2015 # J. S. Tuomisto , 2013-2014 # J. S. Tuomisto , 2013 # Lasse Liehu , 2014 # Moonwrist , 2011, 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:11+0000\n" "Last-Translator: Jiri Grönroos \n" "Language-Team: Finnish (http://www.transifex.com/davidsansome/clementine/language/fi/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nVoit lisätä soittolistan suosikkeihin napsauttamalla tähteä soittolistan nimen vierestä\n\nSuosikkeihin lisätyt soittolistat tallennetaan tänne" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " päivää" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr " s" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " sekuntia" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " kappaletta" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 kappaletta)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 albumia" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 päivää" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 päivää sitten" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1-soittolistat (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "valittuna %1 /" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 kappale" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 kappaletta" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 kappaletta löytyi" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 kappaletta löytyi (näytetään %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 kappaletta" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 siirretty" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev-moduuli" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 muuta kuuntelijaa" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 soittokertaa yhteensä" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n epäonnistui" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n valmistui" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n jäljellä" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Tasaa teksti" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Keskelle" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Oma" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "&Extrat" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "O&hje" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "Piilota %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "Piilota..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Vasemmalle" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "&Musiikki" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Ei mitään" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "&Soittolista" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Lopeta" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Kertaa" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Oikealle" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Sekoita" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Sovita sarakkeet ikkunan leveyteen" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Työkalut" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(erilainen kaikille kappaleille)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...ja kaikki Amarokin kehitykseen osallistuneet" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 päivä" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 kappale" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192 000 Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40 %" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44 100 Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48 000 Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 satunnaista kappaletta" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96 000 Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Päivitä Premium-tunnukseksi nyt" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Jos ei valittuna, Clementine yrittää tallentaa arvosanasi sekä muut tiedot erilliseen tietokantaan muokkaamatta tiedostojasi.

Jos valittuna, Clementine tallentaa tiedot sekä tietokantaan että tiedostoihisi joka kerta kun tiedot muuttuvat.

Huomaa, että tämä ei välttämättä toimi kaikkien formaattien kanssa, ja koska asiasta ei ole olemassa standardeja, muut soittimet eivät ehkä osaa lukea niitä.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Tämä kirjoittaa kappaleiden arvosanat ja tilastot suoraan tiedostoihisi.

Tätä ei tarvita jos "Tallenna arvostelut ja tilastot tiedostojen tageihin" on valittuna.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Tietueet alkavat %-merkillä, esimerkiksi: %artist %album %title

\n\n

Jos ympäröit tietueen sisältävän tekstin aaltosulkeilla, se piilotetaan, jos tietue on tyhjä.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Spotify Premium -tili vaaditaan." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Asiakas voi yhdistää vain oikealla koodilla." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Älykäs soittolista on dynaaminen lista kirjastossasi olevista kappaleista. Älykkäät soittolistat mahdollistavat kappaleiden valinnan usein eri tavoin." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Kappale sisällytetään soittolistaan, jos se vastaa näitä ehtoja." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Ö" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "KAIKKI KUNNIA HYPNOTOADILLE" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Keskeytä" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Tietoja - %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Tietoja - Clementine" #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Tietoja - Qt" #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Absoluuttisia" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Tilin tiedot" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Tilitiedot (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Toiminto" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Toiminto" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Ota käyttöön / poista käytöstä Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Lisää podcast" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Lisää suoratoisto" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Lisää uusi rivi, jos ilmoitustyyppi sen sallii" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Lisää toiminto" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Lisää kaikki kappaleet kansiosta ja sen alakansioista" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Lisää toinen suoratoisto..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Lisää kansio..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Lisää tiedosto" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Lisää tiedosto muuntajaan" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Lisää tiedosto(ja) muuntajaan" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Lisää tiedosto..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Lisää tiedostoja muunnettavaksi" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Lisää kansio" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Lisää kansio..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Lisää uusi kansio..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Lisää podcast" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Lisää podcast..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Lisää hakutermi" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Lisää tunniste levyn nimi" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Lisää tunniste levyn esittäjä" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Lisää tunniste kappaleen esittäjä" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Lisää kappaleen automaattipisteytys" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Lisää tunniste kappaleen säveltäjä" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Lisää levyn numeron tunniste" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Lisää kappaleen tiedostonimi" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Lisää tunniste kappaleen kategoria" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Lisää tunniste kappaleen ryhmitys" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Lisää tunniste kappaleen kesto" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Lisää tunniste kappaleen esittäjä" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Lisää kappaleen toistolaskuri" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Lisää kappaleelle arvosana" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Lisää kappaleen keskeyttämislaskuri" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Lisää tunniste kappaleen nimi" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Lisää kappale välimuistin" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Lisää tunniste " #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Lisää kappaleen levytysvuoden tunniste" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "LIsää kappale \"Omaan musiikkiin\", kun \"Tykkää\"-painiketta napsautetaan" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Lisää suoratoisto..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Lisää omaan musiikkiin" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Lisää Spotify-soittolistoihin" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Lisää Spotifyn tähdellä varustettuihin" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Lisää toiseen soittolistaan" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Lisää kirjanmerkkeihin" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Lisää soittolistaan" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Lisää jonoon" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Lisää käyttäjä/ryhmä kirjanmerkkeihin" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Lisää wiimotedev-toiminto" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Lisää..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Lisätty tässä kuussa" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Lisätty tällä viikolla" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Lisätty tänä vuonna" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Lisätty tänään" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Lisätty kolmen kuukauden sisään" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Kirjaston tarkempi järjestely..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Jälkeen" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Kopioinnin jälkeen..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Albumi" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Albumi (ihanteellinen voimakkuus kaikille kappaleille)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Albumin esittäjä" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Kansikuva" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Albumin tiedot jamendo.comissa..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Albumit" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Albumit kansikuvineen" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Albumit vailla kansikuvia" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Kaikki" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Kaikki tiedostot (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "Kaikki kunnia Hypnotoadille!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Kaikki albumit" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Kaikki esittäjät" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Kaikki tiedostot (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Kaikki soittolistat (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Kaikki kääntäjät" #: library/library.cpp:98 msgid "All tracks" msgstr "Kaikki kappaleet" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Salli asiakkaan ladata musiikkia tältä tietokoneelta." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Salli lataukset" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Yhteen alkuperäisten kanssa" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Piilota aina pääikkuna" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Näytä pääikkuna aina" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Aloita aina toisto" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon Cloud Drive" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Spotifyn käyttö Clementinessä vaatii lisäosan. Haluatko ladata ja asentaa sen nyt?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "iTunes-tietokantaa ladatessa tapahtui virhe" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Virhe kirjoittaessa metatietoja kohteeseen '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Tapahtui määrittämätön virhe." #: ui/about.cpp:85 msgid "And:" msgstr "Ja:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Vihainen" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Ulkoasu" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Lisää tiedostoja/verkko-osoitteita soittolistalle" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Lisää nykyiselle soittolistalle" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Lisää soittolistalle" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Lisää vaimennusta äänisignaalin leikkautumisen estämiseksi" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Haluatko varmasti poistaa asetuksen \"%1\"?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Haluatko varmasti nollata tämän kappaleen tilastotiedot?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Oletko varma että haluat kirjoittaa kaikkien kirjastosi kappleiden tilastot suoraan kirjastosi tiedostoihin?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Esittäjä" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Esittäjätiedot" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Esittäjän tunnisteet" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Esittäjän nimen ensimmäinen kirjain" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Kysy tallennettaessa" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Äänimuoto" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Äänen ulostulo" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Tunnistautuminen epäonnistui" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Tekijä" #: ui/about.cpp:68 msgid "Authors" msgstr "Tekijät" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Auto" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Automaattinen" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Automaattinen päivitys" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Laajenna automaattisesti yhden alitason sisältävät kohteet kirjaston puunäkymässä" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Käytettävissä" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Keskimääräinen bittinopeus" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Kuvatiedoston koko keskimäärin" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "BBC-podcastit" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Taustaäänet" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Taustaväri" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Taustakuva" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Taustan läpinäkyvyys" #: core/database.cpp:648 msgid "Backing up database" msgstr "Varmuuskopioidaan tietokantaa" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Tasapaino" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "En tykkää (Last.fm-scrobblaus)" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Taajuusjakauma" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Perussininen" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Äänityyppi, perus" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Toiminta" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Paras" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Biografian tarjoaa %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Bittivirta" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Bittinopeus" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Bittinopeus" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Block analyzer" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Lohkotyyppi" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Sumennuksen määrä" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Sisältö" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Boom analyzer" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Selaa..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Puskurin kesto" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Puskuroidaan" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Rakennetaan Seafile-indeksiä..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Mutta nämä lähteet ovat pois käytöstä:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Painikkeet" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "CUE-tiedostojen tuki" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Välimuistin polku:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Välimuistin käyttö" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "Asetetaan välimuistiin %1" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Peru" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Peru lataaminen" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Captcha vaaditaan.\nYritä kirjautua Vk.comiin selaimella korjataksesi tämän ongelman." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Vaihda kansikuvaa" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Vaihda kirjasinkokoa..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Vaihda toiston tilaa" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Vaihda pikanäppäin..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Vaihda sekoituksen tilaa" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "Vaihda parhaillaan toistettavaa kappaletta" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Vaihda kieltä" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "Muutokset tulevat voimaan, kun seuraava kappale alkaa" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Mono-toistoasetuksen tilan vaihtaminen tulee voimaan seuraavassa kappaleessa" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Tarkista uudet jaksot" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Tarkista päivitykset" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Tarkista päivitykset..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Valitse Vk.comin välimuistikansio" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Anna nimi älykkäälle soittolistalle" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Valitse automaattisesti" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Valitse väri..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Valitse kirjasin..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Valitse listalta" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Valitse kuinka soittolista lajitellaan ja kuinka monta kappaletta se sisältää." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Valitse podcastien latauskansio" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Valitse näytettävät verkkopalvelut." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Valitse sivustot, joilta haluat Clementinen etsivän sanoituksia." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Classical" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Siivoaminen" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Tyhjennä" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Tyhjennä soittolista" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Clementine-virhe" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Klementiinin oranssi" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Clementinen visualisointi" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine voi automaattisesti muuntaa tähän laitteeseen kopioitavan musiikin sen ymmärtämään muotoon." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Clementine voi soittaa Amazon Cloud Driveen lähettämääsi musiikkia" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine voi toistaa Boxiin lähetettyä musiikkia" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine voi toistaa Dropboxiin lähettämääsi musiikkia" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine voi toistaa Google Driveen lataamaasi musiikkia" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine voi toistaa OneDriveen tallennettua musiikkia" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine voi ilmoittaa, kun kappale vaihtuu." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine voi synkronoida tilauksesi muiden tietokoneiden ja podcast-sovellusten kanssa. Luo tunnus." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine epäonnistui projectM-visualisoinnin esittämisessä. Varmista Clementine-asennuksen toimivuus." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Clementine-kuvakatselin" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine ei löytänyt tuloksia tälle tiedostolle" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine etsii musiikkia kohteista:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Napsauta tästä lisätäksesi musiikkia" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Napsauta tästä lisätäksesi soittolistan suosikkeihisi, jolloin se tallennetaan ja on käytettävissä vasemman laidan \"Soittolistat\"-kohdassa." #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Napsauta vaihtaaksesi näkymää: aikaa jäljellä / kokonaisaika" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Kirjaudu-painikkeen napsauttaminen avaa selaimen. Palaa Clementineen, kun olet kirjautunut sisään." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Sulje" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Sulje soittolista" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Sulje visualisointi" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Tämän ikkunan sulkeminen peruu latauksen." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Tämän ikkunan sulkeminen lopettaa albumikansien etsimisen." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Värit" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Pilkuin erotettu lista luokka:taso -määritteitä, jossa taso on väliltä 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Kommentti" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Yhteisöradio" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Täydennä tunnisteet automaattisesti" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Täydennä tunnisteet automaattisesti..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Säveltäjä" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "%1 - asetukset..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Magnatune-asetukset..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Pikanäppäinten asetukset" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Muokkaa Spotifya..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Subsonicin asetukset..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Vk.com-asetukset..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Muokkaa hakua..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Kirjaston asetukset..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Muokkaa podcasteja..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Asetukset..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Yhdistä Wii Remote käyttämällä aktivoi/deaktivoi toimintoa" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Yhdistä laite" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Yhdistetään Spotifyyn" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Palvelin hylkäsi yhteyden, tarkista palvelimen osoite. Esimerkki: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Yhteys aikakatkaistiin, tarkista palvelimen osoite. Esimerkki: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Yhteysongelma tai omistaja on poistanut äänen käytöstä" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Konsoli" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Pysyvä bittinopeus" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Muunna kaikki musiikki" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Muuta musiikki, jota laite ei voi muuten toistaa" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Muunna häviöttömät äänitiedostot ennen niiden etäpäähän lähettämistä." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Muunna häviöttömät tiedostot" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Kopioi jakamisosoite leikepöydälle" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Kopioi leikepöydälle" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Kopioi laitteelle..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Kopioi kirjastoon" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Tekijänoikeus" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Yhteys Subsonic-palvelimeen epäonnistui, tarkista palvelimen osoite. Esimerkki: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "GStreamer-elementin \"%1\" luonti epäonnistui - varmista, että kaikki vaaditut GStreamer-liitännäiset on asennettu" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Soittolistan luominen epäonnistui" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Ei löydetty %1 -multiplekseriä, tarkista että sinulla on oikeat GStreamer-liitännäiset asennettuna" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Ei löydetty %1 -enkooderia, tarkista että sinulla on oikeat GStreamer-liitännäiset asennettuna" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Ei voitu avata kohdetiedostoa %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Kansikuvaselain" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Kansikuva sulautetusta kuvasta" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Kansikuva ladattu automaattisesti kohteesta %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Levynkansi poistettu" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Kansikuvaa ei ole asetettu" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Kansikuva asetettu kohteesta %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Kansikuvat kohteesta %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Ristiinhäivytä kappaleet, kun kappale vaihtuu automaattisesti" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Ristiinhäivytä kappaleet, kun käyttäjä vaihtaa kappaletta" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Oma" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Omavalintainen kuva:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Omavalintaisen viestin asetukset" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Mukautettu..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "DBus-polku" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dance" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Tietokannan korruptio havaittu. Lue https://code.google.com/p/clementine-player/wiki/DatabaseCorruption saadaksesi ohjeet tietokannan palauttamiseksi." #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Luotu" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Muokattu" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Päivää" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "&Oletus" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Vähennä ääntä - 4 %" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Vähennä äänenvoimakkuutta prosentilla" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Vähennä äänenvoimakkuutta" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Oletustaustakuva" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Oletusasetukset" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Viive visualisointien välillä" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Poista" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Poista ladattu data" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Poista tiedostot" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Poista laitteelta..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Poista levyltä..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Poista soitetut jaksot" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Poista asetus" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Poista älykäs soittolista" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Poista alkuperäiset tiedostot" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Poistetaan tiedostoja" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Poista valitut kappaleet jonosta" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Poista kappale jonosta" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Kohde" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Tiedot..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Laite" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Laitteen ominaisuudet" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Laitteen nimi" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Laitteen ominaisuudet..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Laitteet" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Tarkoititko" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Digitally Imported -salasana" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Digitally Imported -käyttäjätunnus" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Suora internetyhteys" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Kansio" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Kytke kesto pois päältä" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Poista mielialan luominen käytöstä" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Ei käytössä" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Poissa käytöstä" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Levy" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Keskeytyvä siirto" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Näkymäasetukset" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Näytä kuvaruutunäyttö" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Tee kirjaston täydellinen läpikäynti" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Tee kirjaston täydellinen läpikäynti" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Tee kirjaston täydellinen läpikäynti..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Älä muunna mitään musiikkia" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Älä korvaa" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "Kirjaston täydellinen läpikäynti aiheuttaa sen, että Clementinessä tallennetut metatiedot, kuten kansikuvat, toistokerrat ja arvostelut poistuvat. Clementine käy läpi kaiken musiikin Google Drivessasi, joten läpikäynnissä saattaa kestää hetki." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Älä kertaa" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Älä näytä kohdassa \"Useita esittäjiä\"" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Älä näytä kuunneltuja jaksoja" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Älä sekoita" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Älä lopeta!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Lahjoita" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Kaksoisnapsauta avataksesi" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "Soittolistalla olevaa kappaletta kaksoisnapsauttaessa..." #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Kappaleen kaksoisnapsautus..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Poista %n jaksoa" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Latauskansio" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Lataa jaksot sijaintiin" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Latausjäsenyys" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Lataa uudet jaksot automaattisesti" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Lataus asetettu jonoon" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Latausasetukset" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Lataa Android-sovellus" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Lataa tämä albumi" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Lataa tämä albumi..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Lataa tämä jakso" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Lataa..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Ladataan (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Ladataan Icecast-hakemistoa" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Ladataan Jamendo-luetteloa" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Ladataan Magnatune-luetteloa" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Ladataan Spotify-liitännäistä" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Noudetaan metatietoja" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Vaihda sijaintia vetämällä" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dubstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Kesto" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Dynaaminen tila päällä" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Dynaaminen satunnainen sekoitus" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Muokkaa älykästä soittolistaa..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Muokkaa tunnistetta \"%1\"..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Muokkaa tunnistetta..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Muokkaa tunnisteita" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Muokkaa kappaleen tietoja" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Muokkaa kappaleen tietoja..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Muokkaa kappaleen tietoja..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Muokkaa..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "Sähköposti" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Käytä Wii-ohjainta" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Käytä automaattista välimuistia" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Käytä taajuuskorjainta" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Käytä pikanäppäimiä vain Clementinen ollessa avoinna" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Käytä kappaleen metadatan muokkausta napsautuksella" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Kytke lähteitä päälle, jos haluat niiden näkyvän hakutuloksissa. Tulokset näytetään tässä järjestyksessä." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Päälle / pois Last.fm scrobbling" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Enkoodauksen kompleksisuus" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Koodausmoottorin laatu" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Koodaustila" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Anna verkko-osoite" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Kirjoita URL-osoite kansikuvien lataamiseen Internetistä:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Syötä tiedostonimi kansille (ei tiedostopäätettä):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Anna uusi nimi tälle soittolistalle" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Anna hakuehdot yläpuolelle, niin löydät musiikkia tietokoneeltasi ja internetistä" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Kirjoita alle hakuehdot, joilla etsitään podcasteja iTunes Storesta" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Kirjoita alle hakuehdot, joilla etsitään podcasteja gpodder.net-sivustolta" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Etsi tästä" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Anna suoratoiston osoite:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Anna kansion nimi" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Kirjoita tämä IP sovellukseen yhdistääksesi Clementineen." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Koko kokoelma" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Taajuuskorjain" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Vastaa --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Vastaa --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Virhe" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Virhe CD:tä kopioitaessa" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Virhe yhdistäessä MTP-laitteeseen" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Virhe kappaleita kopioidessa" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Virhe kappaleita poistaessa" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Virhe ladatessa Spotify-liitännäistä" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Virhe ladattaessa %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Virhe ladattaessa di.fm soittolistaa" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Virhe käsitellessä %1:%2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Virhe ladattaessa CD" #: library/library.cpp:68 msgid "Ever played" msgstr "Aina soitetut" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "10 minuutin välein" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "12 tunnin välein" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "2 tunnin välein" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "20 minuutin välein" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "30 minuutin välein" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "6 tunnin välein" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Joka tunti" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Älä käytä ristihäivytystä samalla albumilla tai samassa CUE-tiedostossa oleville kappaleille" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Olemassa olevat kansikuvat" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Laajenna" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Vanhenee %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Vie kansikuvat" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Vie kansikuvat" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Vie ladatut kansikuvat" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Vie upotetut kansikuvat" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Vienti valmistui" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Vietiin %1/%2 kansikuvaa (%3 ohitettu)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Häivytä keskeyttäessä ja palauttaessa kappaleen toisto" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Häivytä, kun kappale pysäytetään" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Häivytys" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Häivytyksen kesto" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "CD-aseman lukeminen epäonnistui" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Kansion nouto epäonnistui" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Podcastien nouto epäonnistui" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Podcastin lataus epäonnistui" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Tämän RSS-syötteen XML:n jäsennys epäonnistui" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Nopea" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Suosikkikappaleet" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Nouda puuttuvat kansikuvat" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Nouda automaattisesti" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Nouto suoritettu" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Noudetaan Subsonic-kirjastoa" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Virhe kansikuvan noudossa" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Tiedostomuoto" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Tiedostopääte" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Tiedostomuodot" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Tiedoston nimi (ja polku)" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Tiedostonimi" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Tiedostonimen kaava:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Tiedostopolut" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Tiedostokoko" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Tiedostotyyppi" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Tiedostonimi" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Tiedostot" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Muunnettavat tiedostot" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Etsi kirjastosta kappaleet, jotka sopivat hakuehtoihisi." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Etsi tätä esittäjää" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Luodaan sormenjälkeä kappaleesta..." #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Valmis" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Ensimmäinen taso" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Sovita kansi leveyteen" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Kirjasinkoko" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Lisenssisyistä Spotify-tuki on erillinen liitännäinen." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Pakota monokoodaus" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Unohda laite" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Laitteen unohtaminen poistaa sen listalta. Clementine joutuu käydä laitteen kaikki kappaleet uudelleen läpi, kun laite seuraavan kerran yhdistetään." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Lomake" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Muoto" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Kuvanopeus" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Kehyksiä per puskuri" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Jäätynyt" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Täysi basso" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Täysi basso ja diskantti" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Täysi diskantti" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Yleiset" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Yleiset asetukset" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Tyylilaji" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Hanki osoite jakaaksesi tämän Spotify-kappaleen" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Hanki osoite jakaaksesi tämä soittolista" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Haetaan kanavia" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Haetaan suoratoisto kanavia" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Anna nimi:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Mene" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Siirry seuraavaan soittolistaan" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Siirry edelliseen soittolistaan" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Löydetty %1 / %2 kansikuvaa (%3 epäonnistui)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Muuta poistetut kappaleet harmaan värisiksi soittolistalla" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Järjestä kirjasto..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Järjestä" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Järjestä albumin mukaan" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Järjestä esittäjän mukaan" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Järjestä esittäjän/albumin mukaan" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Järjestä esittäjän/vuoden - albumin mukaan" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Järjestä tyylin/albumin mukaan" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Järjestä tyylin/esittäjän/albumin mukaan" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Ryhmittely" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "HTML-sivu ei sisältänyt minkäänlaista RSS-syötettä" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "Vastaanotettiin HTTP 3xx -tilakoodi ilman URL-osoitetta. Tarkista palvelimen asetukset." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "HTTP-välityspalvelin" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Iloinen" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Laitetiedot" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Laitetiedot on saatavilla vain laitteen ollessa yhdistettynä." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Korkea" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Nopea (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Korkea (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Palvelinta ei löytynyt, tarkista palvelimen osoite. Esimerkki: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Tuntia" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Minulla ei ole Magnatune-tunnusta" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Kuvake" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Kuvakkeet ylhäällä" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Tunnistetaan kappaletta" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Jos käytössä, kappaleen napsauttaminen soittolistanäkymässä sallii tunnistearvon muokkauksen suoraan." #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Jos jatkat, laite toimii hitaasti ja sille kopioidut kappaleet eivät välttämättä toimi." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Jos tiedät podcastin verkko-osoitteen, kirjoita se alle ja napsauta Mene." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Älä huomioi sanaa \"The\" esiintyjien nimissä" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Kuvat (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Kuvat (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Tuo..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "%1 päivässä" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "%1 viikossa" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "Dynaamisessa tilassa uusia kappaleita valitaan ja lisätään soittolistaan joka kerta kun yksi kappale on soitettu." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Saapuneet" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Näytä kansikuva ilmoituksen yhteydessä" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Sisällytä kaikki kappaleet" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Yhteensopimaton Subsonicin REST-protokollaversio. Asiakasohjelmisto on päivitettävä." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Yhteensopimaton Subsonicin REST-protokollaversio. Palvelin on päivitettävä." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Puutteelliset asetukset, varmista että kaikki kentät on täytetty." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Lisää ääntä - 4 %" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Lisää äänenvoimakkuutta prosentilla" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Lisää äänenvoimakkuutta" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Indeksoidaan %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Tiedot" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Sisääntulon valinnat" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Lisää..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Asennettu" #: core/database.cpp:585 msgid "Integrity check" msgstr "Eheystarkistus" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Palvelutarjoajat" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Verkkopalvelut" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Virheellinen API-avain" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Virheellinen muoto" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Virheellinen menetelmä" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Virheelliset parametrit" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Virheellinen resurssien määrittely" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Virheellinen palvelu" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Virheellinen istuntoavain" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Käänteinen valinta" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Jamendon eniten kuunnellut kappaleet" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Jamendon suosituimmat kappaleet" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendon kuukauden suosituimmat kappaleet" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendon viikon suosituimmat kappaleet" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Jamendo-tietokanta" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Siirry edelliseen kappaleeseen välittömästi" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Näytä parhaillaan soiva kappale" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Paina painikkeita %1 sekunti..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Paina painikkeita %1 sekuntia..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Pidä käynnissä taustalla, kun ikkuna suljetaan" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Säilytä alkuperäiset tiedostot" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Kissanpentuja" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Kieli" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Kannettava/kuulokkeet" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Suuri halli" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Suuri kansikuva" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Suuri kansikuva (tiedot alla)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Suuri kansikuva (ei tietoja)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Suuri sivupalkki" #: library/library.cpp:80 msgid "Last played" msgstr "Viimeksi soitettu" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Viimeksi toistettu" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm on parhaillaan varattu, yritä uudelleen hetken kuluttua" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Last.fm-salasana" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Last.fm-soittokerrat" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Last.fm-tunnisteet" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Last.fm-tunnus" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Last.fm-wiki" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Vähiten pidetyt kappaleet" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Vasen" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Kesto" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Kirjasto" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Kirjaston tarkennettu ryhmittely" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Ilmoitus kirjaston läpikäynnistä" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Kirjastohaku" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Rajat" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Lataa" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Lataa kansikuva osoitteesta" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Lataa kansikuva osoitteesta..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Lataa kansikuva levyltä" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Lataa kansikuva levyltä..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Lataa soittolista" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Lataa soittolista..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Ladataan MTP-laitetta" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Ladataan iPod-tietokantaa" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Ladataan älykästä soittolistaa" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Ladataan kappaleita" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Ladataan suoratoistoa" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Ladataan kappaleita" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Lataa kappaleen tietoja" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Ladataan..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Lataa tiedostoja tai verkko-osoitteita, korvaa samalla nykyinen soittolista" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Kirjaudu sisään" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Kirjautuminen epäonnistui" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Kirjaudu ulos" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Long term prediction -profiili (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Tykkää" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "Tykkää (Last.fm-scrobblaus)" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Hidas (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Matala (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Low complexity -profiili (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Sanoitukset" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Sanoitukset tarjoaa %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Sanoitukset ID3v2-tunnisteesta" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256K" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Magnatune-lataus" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Magnatune-lataus valmistui" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Oletusprofiili (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Toteuta!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Toteuta!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Aseta soittolista käytettäväksi yhteydettömässä tilassa" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Virheellinen vastaus" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Määritä välityspalvelin itse" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Käsin" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Valmistaja" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Merkitse kuunnelluksi" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Merkitse uudeksi" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Täyttää jokaisen hakuehdon (AND)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Täyttää yhden tai useampia hakuehtoja (OR)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Suurin bittinopeus" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Media vaihtui, ladataan uudelleen" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Keskitaso (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Keskinkertainen (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Jäsenyyden tyyppi" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Pienin bittinopeus" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Puskurin vähimmäistäyttö" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Puuttuvat projectM-asetukset" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Malli" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Tarkkaile kirjastoa muutosten varalta" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Mono-toisto" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Kuukautta" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Mieliala" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Mielialapalkin tyyli" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Mielialapalkit" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Lisää" #: library/library.cpp:84 msgid "Most played" msgstr "Eniten soitetut" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Liitoskohta" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Liitoskohdat" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Siirrä alas" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Siirrä kirjastoon..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Siirrä ylös" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Musiikki" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Musiikkikirjasto" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Vaimenna" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Omat albumit" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Musiikkikirjasto" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Omat suositukseni" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Nimi" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Nimi" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Nimeämisvalinnat" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Kapeakaistainen (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Verkon välityspalvelin" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Verkkokaukosäädin" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Ei koskaan" #: library/library.cpp:74 msgid "Never played" msgstr "Ei koskaan soitettu" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Älä koskaan aloita toistoa" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Uusi kansio" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Uusi soittolista" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Uusi älykäs soittolista..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Uudet kappaleet" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Uudet kappaleet lisätään automaattisesti." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Uusimmat kappaleet" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Seuraava" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Seuraava kappale" #: core/utilities.cpp:151 msgid "Next week" msgstr "Ensi viikolla" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Ei visualisointia" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Ei taustakuvaa" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Ei kansikuvia vietäväksi." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Ei pitkiä lohkoja" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Ei osumia haulle. Tyhjennä hakukenttä näyttääksesi koko soittolistan uudelleen." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Ei lyhyitä lohkoja" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Ei mitään" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Yksikään valitsemistasi kappaleista ei sovellu kopioitavaksi laitteelle" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Normaali" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Normaalilohkotyyppi" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Ei saatavilla, kun käytössä on dynaaminen soittolista" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Ei yhdistetty" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Ei riittävästi sisältöä" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Ei riittävästi faneja" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Ei riittävästi jäseniä" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Ei tarpeeksi naapureita" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Ei asennettu" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Ei kirjautunut" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Ei liitetty - kaksoisnapsauta liittääksesi" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Mitään ei löytynyt" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Ilmoituksen tyyppi" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Ilmoitukset" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Nyt soi" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Näytettävien jaksojen määrä" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Kuvaruutunäytön esikatselu" #: widgets/osd.cpp:173 msgid "Off" msgstr "Pois" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "Päällä" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Hyväksy yhteydet vain seuraavilta verkkoalueilta:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Salli yhteydet vain paikallisverkosta" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Näytä vain ensimmäinen" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Läpinäkyvyys" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Avaa %1 selaimessa" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Avaa &ääni-CD..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Avaa OPML-tiedosto" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Avaa OPML-tiedosto..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Avaa kansio, josta musiikki tuodaan" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Avaa laite" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Avaa tiedosto..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Avaa Google Drivessa" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Avaa uudessa soittolistassa" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Avaa uudessa soittolistassa" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Avaa selaimessa" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Avaa..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Toiminto epäonnistui" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Optimoi bittinopeuteen" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Optimoi laatuun" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Valinnat..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Hallitse tiedostoja" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Hallitse tiedostoja..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Hallinnoidaan tiedostoja" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Alkuperäiset tunnisteet" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "Alkuperäinen vuosi" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "Alkuperäinen vuosi - albumi" #: library/library.cpp:118 msgid "Original year tag support" msgstr "Alkuperäisen vuoden tunnisteen tuki" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Muut valinnat" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Ulostulo" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Äänentoistolaite" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Muunnoksen asetukset" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Korvaa kaikki" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Korvaa olemassa olevat tiedostot" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Korvaa vain pienemmät" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Omistaja" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Käydään läpi Jamendo-luetteloa" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Party" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Salasana" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Keskeytä" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Keskeytä toisto" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Keskeytetty" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Esittäjä" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Pikseli" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Pelkistetty sivupalkki" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Toista" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Soittokertoja" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Aloittaa tai pysäyttää soittamisen" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Aloita toisto, jos mikään ei soi parhaillaan" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Soita soittolistan . kappale" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Toista/Keskeytä" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Toisto" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Soittimen asetukset" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Soittolista" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Soittolista soitettiin loppuun" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Soittolistan valinnat" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Soittolistan tyyppi" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Soittolistat" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Sulje selain ja palaa Clementineen." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Liitännäisen tila:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcastit" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Ponnahdusikkunan kesto" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Portti" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Esivahvistus" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Asetukset" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Asetukset..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Ensisijainen tiedostonimi albumikuvitukselle (pilkuin eroteltu)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Ensisijainen äänimuoto" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Ensisijainen bittinopeus" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Ensisijainen muoto" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Äänityyppi, premium" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Asetus:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Paina näppäinyhdistelmää käyttääksesi" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Paina näppäintä" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Paina näppäinyhdistelmää käyttääksesi %1 ..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Soittimen \"Edellinen\"-painiketta painettaessa..." #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Kuvaruutunäytön valinnat" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Esikatselu" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Edellinen" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Edellinen kappale" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Tulosta versiotiedot" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Profiili" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Edistyminen" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Edistyminen" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psykedeelinen" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Paina Wii Remoten nappia" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Aseta kappaleet satunnaiseen järjestykseen" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Laatu" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Laatu" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Kysytään tietoja laitteelta..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Jonohallinta" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Aseta valitut kappaleet jonoon" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Aseta kappale jonoon" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (sama äänenvoimakkuus kaikille kappaleille)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Sadetta" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Sadetta" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Satunnainen visualisointi" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Arvostele nykyinen kappale 0:n arvoiseksi" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Arvostele nykyinen kappale 1:n arvoiseksi" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Arvostele nykyinen kappale 2:n arvoiseksi" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Arvostele nykyinen kappale 3:n arvoiseksi" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Arvostele nykyinen kappale 4:n arvoiseksi" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Arvostele nykyinen kappale 5:n arvoiseksi" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Arvostelu" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Haluatko todella perua?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Uudelleenohjausraja on ylitetty, tarkista palvelimen asetukset." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Päivitä luettelo" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Päivitä kanavat" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Päivitä asemalista" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Päivitä suoratoistokanavat" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Suhteellisia" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Muista Wii Remoten heilautus" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Muista viime kerrasta" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Muista valintani" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Poista" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Poista toiminto" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Poista kaksoiskappaleet soittolistasta" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Poista kansio" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Poista musiikkikirjastosta" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Poista kirjanmerkeistä" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Poista soittolistalta" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Poista soittolista" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Poista soittolistat" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Poista soittolistasta kappaleet, jotka eivät ole käytettävissä" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Nimeä soittolista uudelleen" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Nimeä soittolista uudelleen..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Numeroi kappaleet tässä järjestyksessä ..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Kertaa" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Kertaa albumi" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Kertaa soittolista" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Kertaa kappale" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Korvaa nykyinen soittolista" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Korvaa soittolista" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Korvaa välilyönnit alaviivoilla" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Replay Gain -tila" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Täytä uudelleen" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Vaadi varmistuskoodi" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Oletukset" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Nollaa soittokerrat" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Käynnistä kappale uudelleen, siirry edelliseen jos painetaan uudellaan" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Toista kappale uudelleen, tai toista edellinen kappale, jos alle 8 sekunnin päästä alusta." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Rajoita ASCII-merkkeihin" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Jatka toistoa sovelluksen käynnistyttyä" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Palaa Clementineen" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Oikea" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Kopioi levy" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Kopioi CD:n sisältö" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Kopioi ääni-CD:n sisältö" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Aja" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "SOCKS-välityspalvelin" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "SSL-käsittelyvirhe, tarkista palvelimen asetukset. SSLv3-valinta alla saattaa auttaa joissain tapauksissa." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Poista laite turvallisesti" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Poista laite turvallisesti kopioinnin jälkeen" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Näytteenottotaajuus" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Näytteenottotaajuus" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Tallenna .mood-tiedostot musiikkikirjastoon" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Tallenna albumin kansikuva" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Tallenna levyn kansikuva kiintolevylle..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Tallenna kuva" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Tallenna soittolista" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Tallenna soittolista" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Tallenna soittolista..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Tallenna asetus" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Tallenna arvosana tiedostoon, jos mahdollista" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Tallenna tilastot tiedostoon, jos mahdollista" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Tallenna tämä suoratoisto Internet-osioon" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Tallennetaan kappaleiden tilastoja kappaletiedostoihin" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Tallennetaan kappaleita" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Scalable sampling rate -profiili (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Skaalaa koko" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Pisteet" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Lähetä kappaletiedot kuuntelemistani kappaleista" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Etsi" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Haku" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Etsi Icecast-asemia" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Etsi Jamendosta" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Etsi Magnatunesta" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Etsi Subsonicista" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Etsi automaattisesti" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Etsi kansikuvia..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Etsi mitä tahansa" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Etsi gpodder.netistä" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Etsi iTunesista" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Hakutapa" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Haun asetukset" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Hakutulokset" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Hakusanat" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Toinen taso" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Siirry taaksepäin" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Siirry eteenpäin" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Siirry nykyisessä kappaleessa suhteellinen määrä" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Siirry nykyisessä kappaleessa tiettyyn kohtaan" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "Siirtyminen pikanäppäimiä käyttäen" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Valitse kaikki" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Poista valinnat" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Valitse taustaväri:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Valitse taustakuva" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Valitse paras mahdollinen vaihtoehto" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Valitse edustaväri:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Valitse visualisoinnit" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Valitse visualisoinnit..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Valitse..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Sarjanumero" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Palvelin" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "Palvelimen osoite" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Palvelimen tiedot" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Ei yhteyttä palveluun" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Aseta %1 %2:een" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Säädä äänenvoimakkuus prosenttia" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Aseta arvo kaikille valituille kappaleille..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Asetukset" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Pikanäppäin" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Pikanäppäin toiminnolle %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Pikanäppäin toiminnolle %1 on jo olemassa" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Näytä" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Näytä kappaletiedot näytöllä" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Korosta soiva kappale hohtavalla animaatiolla" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Näytä mieliala kappaleen edistysmispalkissa" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Näytä järjestelmälle ominainen ilmoitus" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Näytä ilmoitus, kun vaihdan toiston tai sekoituksen tilaa" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Näytä ilmoitus, kun vaihdan äänenvoimakkuutta" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Näytä ilmoitus, kun keskeytän toiston" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Näytä ponnahdus tehtäväpalkista" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Näytä kuvaruutunäyttö" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Näytä tilapalkin yläpuolella" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Näytä kaikki kappaleet" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Näytä kaikki kappaleet" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Näytä kansikuva kirjastossa" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Näytä erottimet" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Näytä oikeassa koossa..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Näytä tiedostoselaimessa..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Näytä kirjastossa..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Näytä kohdassa \"Useita esittäjiä\"" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Näytä mielialapalkki" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Näytä vain kaksoiskappaleet" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Näytä vain vailla tunnistetta olevat" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Näytä toistettava kappale sivullasi" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Näytä hakuehdotukset" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Näytä \"Tykkää\"-painike" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Näytä lähetyspainike (scrobble) pääikkunnassa" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Näytä ilmoitusalueen kuvake" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Näytä mitkä lähteet ovat käytössä ja pois käytöstä" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Näytä/piilota" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Sekoita" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Sekoita albumit" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Sekoita kaikki" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Sekoita soittolista" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Sekoita tämän albumin kappaleet" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Kirjaudu" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Kirjaudu ulos" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Kirjautuu sisään..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Samankaltaisia esittäjiä" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Koko" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Koko:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Siirry soittolistan edelliseen kappaleeseen" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Ohituskerrat" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Siirry soittolistan seuraavaan kappaleeseen" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Ohita valitut kappaleet" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Ohita kappale" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Pieni kansikuva" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Pieni sivupalkki" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Älykäs soittolista" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Älykkäät soittolistat" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Kappaletiedot" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Kappaletiedot" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogrammi" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Pahoittelut" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Järjestä tyylin mukaan (aakkosjärjestyksessä)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Järjestä tyylin mukaan (Järjestä suosion mukaan)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Järjestä aseman nimen mukaan" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Järjestä kappaleet" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Järjestys" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Lähde" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Lähteet" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Spotify-kirjautumisvirhe" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "Spotify-soittolistan osoite" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Spotify-liitännäinen" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Spotify-liitännäistä ei ole asennettu" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "Spotify-kappaleen osoite" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Normaali" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Tähdellä merkitty" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Aloita levyn kopiointi" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Aloita muunnos" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Kirjoita jotain yllä olevaan hakukenttään täyttääksesi tämän hakutuloslistan" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Aloittaa %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Aloittaa ..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Pysäytä" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Lopeta jälkeen" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Pysäytä toistettavan kappaleen jälkeen" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Pysäytä toisto" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Lopeta soitto nykyisen kappaleen jälkeen" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Lopeta toisto kappaleen jälkeen: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Pysäytetty" #: core/song.cpp:431 msgid "Stream" msgstr "Suoratoisto" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Suoratoisto Subsonic-palvelimelta vaatii kelvollisen palvelinlisenssin 30 päivän kokeilujakson jälkeen." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Suoratoistojäsenyys" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Tilaajat" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Onnistui!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "Onnistuneesti kirjoitettu %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Ehdotetut tunnisteet" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Yhteenveto" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Erittäin nopea (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Erittäin suuri (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Tuetut muodot" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Synkronoi tilastot tiedostoihin nyt" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Synkronoi Spotify saapuneet" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Synkronoi Spotify soittolistan" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Synkronoi Spotify arvostellut kappaleet" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Järjestelmävärit" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Välilehdet ylhäällä" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Tunnistenoutaja" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Tavoiteltava bittinopeus" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Tekstivalinnat" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Kiitokset" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "\"%1\"-komentoa ei voitu suorittaa." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Parhaillaan soivan kappaleen albumin kansikuva" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "Kansio %1 ei ole kelvollinen" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "Toisen arvo pitää olla suurempi kuin ensimmäinen!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Hakemaasi sivua ei ole olemassa!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Hakemasi sivu ei ole kuva!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Subsonic-palvelimen kokeiluaika on ohi. Lahjoita saadaksesi lisenssiavaimen. Lisätietoja osoitteessa subsonic.org." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Versio, johon juuri päivitit Clementinen, vaatii kirjaston täydellisen läpikäynnin alla listattujen uusien ominaisuuksien vuoksi:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Albumilla on muita kappaleita" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Virhe yhteydessä gpodder.netiin" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Metatietojen hakemisessa Magnatune palvelusta ilmeni virhe" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Virhe jäsennettäessä vastausta iTunes Storesta" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Kappaleita kopioitaessa ilmeni virheitä. Seuraavien kappaleiden kopiointi epäonnistui:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Kappaleita poistaessa ilmeni virheitä. Seuraavien kappaleiden poisto epäonnistui:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Nämä tiedostot poistetaan laitteelta, haluatko varmasti jatkaa?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Nämä tiedostot poistetaan levyltä pysyvästi, haluatko varmasti jatkaa?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Seuraavista kansioista lisätään musiikkia kirjastoa varten" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Nämä asetukset ovat käytössä \"Muunna eri muotoon\"-ikkunassa, ja muunnettaessa musiikkia ennen laitteelle kopiointia." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Kolmas taso" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Tämä toiminto luo tietokannan, jonka koko voi olla jopa 150 megatavua.\nHaluatko silti jatkaa?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Tämä albumi ei ole saatavilla haluamassasi muodossa" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Tämän voi muuttaa myöhemmin asetuksista" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Laitteen tulee olla yhdistettynä ja avattuna, jotta Clementine voi tarkistaa, mitä tiedostomuotoja laite tukee." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Laite tukee seuraavia tiedostomuotoja:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Laite ei tule toimimaan kunnolla" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Kyseessä on MTP-laite, mutta Clementine on käännetty ilman libmtp-tukea." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Kyseessä on iPod, mutta Clementine on käännetty ilman libgpod-tukea." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Kytkit tämän laitteen tähän tietokoneeseen ensimmäistä kertaa. Clementine etsii musiikkitiedostoja laitteesta - tämä saattaa kestää hetken." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Tämän valinnan voi vaihtaa asetuksien kohdasta \"Toiminta\"." #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Suoratoisto on tarjolla vain maksaville asiakkaille" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Tämän tyyppinen laite ei ole tuettu: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "Aikasiirtymä" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Nimi" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Tänään" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Kuvaruutunäyttö päälle / pois" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Koko näytön tila" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Vaihda jonon tila" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Valitse scrobbling" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Kuvaruutunäyttö päälle / pois" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Huomenna" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Liian monta uudelleenohjausta" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Suosituimmat kappaleet" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Albumeja yhteensä:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Yhteensä tavuja siirretty" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Yhteensä verkko pyyntöjä tehty" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Kappale" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Kappaleet" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Muunna eri muotoon" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Muunnosloki" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Muunnos" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Muunnetaan %1 tiedostoa käyttäen %2 säiettä" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Muunnosvalinnat" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Sammuta" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "Osoite/osoitteet" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Yhdistäminen epäonnistui" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Kohteen %1 lataus epäonnistui (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Tuntematon" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Tuntematon sisältötyyppi" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Tuntematon virhe" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Poista kansikuva" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Poista tilaus" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Tulevat konsertit" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Päivitä" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Päivitä kaikki podcastit" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Päivitä muuttuneet kirjastokansiot" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Päivitä kirjasto Clementine käynnistyessä" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Päivitä tämä podcast" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Päivittäminen" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Päivitetään %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Päivitetään %1 %..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Päivitetään kirjastoa" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Käyttötaso" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Käytä 'Album Artist' -tietuetta, jos mahdollista" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Käytä Gnomen pikanäppäimiä" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Käytä psykedeelisiä värejä" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Käytä Replay Gainin metatietoja, jos saatavilla" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Käytä SSLv3:a" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Käytä Wii-ohjainta" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Käytä omia värimäärityksiä" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Käytä omaa viestiä ilmoituksissa" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Käytä verkkokaukosäädintä" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Käytä tunnistatumista" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Käytä bittinopeuden hallintakonetta" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Käytä dynaamista tilaa" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Käytä ilmoituksia Wii-ohjaimen tilan raportoimiseen" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Käytä väliaikaista melun muokkausta" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Käytä järjestelmän oletusta" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Käytä järjestelmän oletusvärejä" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Käytä järjestelmän välityspalvelinasetuksia" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Käytä äänen normalisointia" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Käytetty" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Käyttöliittymä" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Käyttäjätunnus" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Valikon avulla kappaleen lisäys..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Muuttuva bittinopeus" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Useita esittäjiä" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Versio %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Näkymä" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Visualisointitila" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Visualisoinnit" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Visualisointiasetukset" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Äänen havaitseminen" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Äänenvoimakkuus %1 %" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Seinä" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Varoita suljettaessa soittolistan sisältävää välilehteä" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Verkkosivu" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Viikkoa" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Clementinen käynnistyessä" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Albumikuvitusta etsiessä Clementine etsii kuvatiedostoja, jotka sisältävät yhden näistä sanoista.\nJos vastaavia tiedostoja ei löydy, Clementine käyttää suurinta kansiossa olevaa kuvaa." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "Soittolistoja tallennettaessa tiedostopolkujen tulee olla" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Kun lista on tyhjä..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Voisit kokeilla..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Laajakaistainen (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii-ohjain %1: aktivoitu" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii-ohjain %1: yhdistetty" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii-ohjain %1: kriittinen lataustaso (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii-ohjain %1: kytketty pois" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii-ohjain %1: yhteys katkaistu" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii-ohjain %1: matala lataustaso (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media -ääni" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Ilman kansikuvaa:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Haluatko siirtä albumin muut kappaleet luokkaan \"Useita esittäjiä\"?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Haluatko suorittaa kirjaston läpikäynnin nyt?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Kirjoita kaikki kappaletilastot kappaletiedostoihin" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Kirjoita metatiedot" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Väärä käyttäjätunnus tai salasana." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Vuosi" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Vuosi - Albumi" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Vuotta" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Eilen" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Olet aikeissa ladata seuraavat albumit" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Haluatko varmasti poistaa %1 soittolistaa suosikeistasi?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Olet aikeissa poistaa soittolistan, joka ei ole osa suosikkisoittolistojasi: soittolista poistetaan (toimintoa ei voi perua.) \nHaluatko varmasti jatkaa?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Et ole kirjautunut sisään" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Olet kirjautunut tunnuksella %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Olet kirjautunut sisään." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Voit vaihtaa tapaa, miten kappaleet järjestetään kirjastossa." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Voit kuunnella ilmaiseksi ilman käyttäjätunnusta, mutta Premium-jäsenet voivat kuunnella paremmalla äänenlaadulla ilman mainoksia." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Voit kuunnella Magnatune-kappaleita ilmaiseksi ilman tunnusta. Jäsenyyden osto poistaa viestit kappaleiden lopusta." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Voit kuunnella taustaääniä samalla kun kuuntelet haluamaasi kappaletta." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Voit käyttää Wii-ohjainta kauko-ohjaimena Clementinen hallintaan. Lisätietoja wiki-sivulla.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Sinulla ei ole Spotify Premium tiliä." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Käytössäsi ei ole aktiivista tilausta" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "Sinun ei tarvitse kirjautua sisään etsiäksesi ja kuunnellaksesi musiikkia SoundCloudista. Omien soittolistojen ja suoratoiston käyttäminen vaatii kuitenkin kirjautumisen." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Sinut on kirjattu ulos Spotifysta. Anna salasanasi uudelleen Asetukset-ikkunassa." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Sinut on kirjattu ulos Spotifysta. Anna salasanasi uudelleen." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Tykkäät tästä kappaleesta" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "Avaa Järjestelmän asetukset ja salli Clementinen \"hallita tietokonettasi\" käyttääksesi Clementinen yleisiä pikanäppäimiä." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Clementine tulee käynnistää uudelleen, jos vaihdat kieltä." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "IP-osoitteesi:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Last.fm-tunnustietosi eivät olleet oikein" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Tunnus tai salasana Magnatuneen oli väärin" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Kirjasto on tyhjä!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Omat radioasemat" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Lähetyksesi: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Järjestelmästäsi puuttuu OpenGL-tuki, joten visualisoinnit eivät ole käytettävissä." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Käyttäjätunnus tai salasana oli virheellinen." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Ö-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "lisää %n kappaletta" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "jälkeen" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "sitten" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "ja" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "automaattinen" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "ennen" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "välillä" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "suurin ensin" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "sisältää" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "pois käytöstä" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "levy %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "ei sisällä" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "päättyy" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "yhtä kuin" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "gpodder.net-kansio" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "enemmän kuin" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "iPodit ja USB-laitteet eivät toimi tällä hetkellä Windowsissa, pahoittelut!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "viimeisenä" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kb/s" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "vähemmän kuin" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "pisin ensin" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "siirrä %n kappaletta" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "uusin ensin" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "ei yhtä kuin" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "ei viimeisenä" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "pois päältä" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "vanhin ensin" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "päällä" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "valinnat" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "tai skannaa QR-koodi!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "paina enter näppäintä" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "poista %n kappaletta" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "lyhin ensin" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "sekoita kappaleet" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "pienin ensin" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "järjestä kappaleet" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "alkaa" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "pysäytä" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "kappale %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/fr.po000066400000000000000000005272541260417502300236650ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Adam Tahri , 2015 # arnaudbienner , 2013 # arnaudbienner , 2013-2015 # arnaudbienner , 2011-2012 # Gwenn M , 2011 # Brice , 2011 # Brice , 2011 # Chaopale Lamecarlate , 2015 # Clément Jonglez , 2015 # djabal , 2013 # djabal , 2013 # Etienne G , 2013 # evangeneer , 2012 # Faketag Fakenick <>, 2012 # Fl0w3D , 2013 # Fl0w3D , 2013 # Gabriel Cossette , 2012 # hiveNzin0 , 2011 # Gwenn M , 2011 # hiveNzin0 , 2011 # Irizion , 2012 # jb78180 , 2012 # jb78180 , 2014 # jb78180 , 2012 # Jikan , 2015 # jipux, 2014-2015 # Le Gall Nicolas , 2014 # Marco Tulio Costa , 2012 # evangeneer , 2012 # matlantin , 2012 # matlantin , 2012 # mberta , 2012 # mberta , 2012 # Marco Tulio Costa , 2012 # Poutre Maicosuel <>, 2012 # Tubuntu , 2013-2015 # Irizion , 2012 # werdeil , 2012 # werdeil , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: French (http://www.transifex.com/davidsansome/clementine/language/fr/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nVous pouvez ajouter les listes de lecture aux favoris en cliquant sur l'icône à côté de leur nom\n\nLes listes de lecture favorites seront sauvegardées ici" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " jours" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "s" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " secondes" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " morceaux" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 morceaux)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 albums" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 jours" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "Il y a %1 jours" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 sur %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 listes de lecture (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 sélectionnés de" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 morceau" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 morceaux" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 morceaux trouvés" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 morceaux trouvés (%2 affichés)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 pistes" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 transférés" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1 : Module wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 autres auditeurs" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 écoutes au total" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n échoué" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n terminé" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n manquant" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Aligner le texte" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Centrer" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Personnaliser" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "&Extras" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Aide" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "Masquer %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "Masquer..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Gauche" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "&Musique" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "Aucu&n" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "&Liste de lecture" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Quitter" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Mode répétition" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Droite" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Mode aléatoire" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "Étirer les &colonnes pour s'adapter à la fenêtre" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Outils" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(différent pour plusieurs morceaux)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", par " #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "et tous les contributeurs de Amarok" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 jour" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "Une piste" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "MP3 128k" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192000 Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40 %" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44100 Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48000 Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 pistes aléatoires" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96000 Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Mettre à jour vers la version Premium" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Par défaut, Clementine sauvegarde les notes et les autres statistiques de vos morceaux dans une base de données séparée et ne modifiera pas vos fichiers.

Si cette option est sélectionnée, Clementine sauvegardera ces informations à la fois dans cette base de données et directement dans le fichier écouté, chaque fois qu'elles changeront.

Cela peut ne pas fonctionner pour tout les formats, car il n'existe pas de standard pour ça. De plus, les autres lecteurs de musique ne savent pas tous lire ces données.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Préfixe un mot par un nom de champ pour limiter la recherche à ce champ, ex. artiste:Bode recherche tous les artistes contenant le mot Bode dans la bibliothèque.

Champs disponibles: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Cela va enregistrer les notes et statistiques des morceaux dans les tags des fichiers pour tous les morceaux de votre bibliothèque.

Ce n'est pas nécessaire si l'option « Enregistrer les notes dans les tags du fichier si possible » a déjà été activée.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Les champs ont pour préfixe %. Exemples : %artist %album %title

\n\n

Si vous placez des accolades autour d'une portion de texte contenant un champ, celle-ci ne sera pas affichée si le contenu du champ n'est pas renseigné.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Un compte Spotify Premium est nécessaire." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Un client peut se connecter seulement si un code correct a été saisi." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Une liste de lecture intelligente est une liste dynamique de morceaux provenants de votre bibliothèque. Il y a différents types de listes de lecture intelligentes, offrant différentes façons de sélectionner des morceaux." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Un morceau sera inclus dans la liste de lecture s'il correspond à ces conditions." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "GLOIRE AU CRAPAUD HYPNOTIQUE !" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Abandonner" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "À propos de %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "À propos de Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "À propos de Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Absolu" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Détails du compte" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Informations sur le compte (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Action" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Action" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Activer/désactiver Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Flux des activités" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Ajouter un Podcast" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Ajouter un flux" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Ajouter un saut de ligne, si cela est supporté par le type de notification" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Ajouter une action" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Ajouter toutes les pistes d'un répertoire et de tous ses sous-répertoires" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Ajouter un autre flux..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Ajouter un dossier..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Ajouter un fichier" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Ajouter un fichier à transcoder" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Ajouter des fichiers à transcoder" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Ajouter un fichier..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Ajouter des fichiers à transcoder" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Ajouter un dossier" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Ajouter un dossier..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Ajouter un nouveau dossier..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Ajouter un podcast" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Ajouter un podcast..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Ajouter un terme de recherche" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Ajouter le tag album du morceau" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Ajouter le tag artiste de l'album du morceau" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Ajouter le tag artiste du morceau" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Ajouter le score du morceau" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Ajouter le tag compositeur du morceau" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Ajouter le tag numéro de disque du morceau" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Ajouter le nom de fichier du morceau" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Ajouter le tag genre du morceau" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Ajouter un tag de groupement de morceaux" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Ajouter la durée du morceau" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Ajouter un tag interprète" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Ajouter le compteur d'écoutes du morceau" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Ajouter la note du morceau" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Ajouter le compteur de sauts du morceau" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Ajouter le tag titre du morceau" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Ajouter le morceau au cache" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Ajouter le tag piste du morceau" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Ajouter le tag année du morceau" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Ajoute les pistes à « Ma musique » lorsque le bouton « j'aime » est cliqué" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Ajouter un flux..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Ajouter à Ma musique" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Ajouter aux listes de lecture Spotify" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Ajouter aux préférés de Spotify" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Ajouter à une autre liste de lecture" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Ajouter aux favoris" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Ajouter à la liste de lecture" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Ajouter à la liste d'attente" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Ajoute l'utilisateur ou le groupe au favoris" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Ajouter des actions wiimote" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Ajouter..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Ajouté ce mois" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Ajouté cette semaine" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Ajouté cette année" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Ajouté aujourd'hui" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Ajouté au cours des 3 derniers mois" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Groupement avancé..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Après " #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Après avoir copié..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Album (volume idéal pour toutes les pistes)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Artiste de l'album" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Pochette d'album" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Informations de l'album sur jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Albums" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Albums ayant une pochette" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Albums sans pochette" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Tout" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Tous les fichiers (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "Gloire au crapaud hypnotique!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Tous les albums" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Tous les artistes" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Tous les fichiers (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Toutes les listes de lecture (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Tous les traducteurs" #: library/library.cpp:98 msgid "All tracks" msgstr "Toutes les pistes" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Autoriser un client à télécharger de la musique à partir de cet ordinateur." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Autoriser les téléchargements" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Autoriser l'encodage mid/side" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "A côté des originaux" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Toujours cacher la fenêtre principale" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Toujours afficher la fenêtre principale" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Toujours commencer à lire" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon Cloud Drive" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Un module externe est requis pour pouvoir utiliser Spotify. Voulez-vous le télécharger et l'installer maintenant ?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Une erreur est survenue lors du chargement de la base de données iTunes" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Une erreur est survenue pendant l'écriture des métadonnées dans « %1 »" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Une erreur inconnue est survenue." #: ui/about.cpp:85 msgid "And:" msgstr "Et :" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "En colère" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Apparence" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Ajouter des fichiers/URLs à la liste de lecture" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Ajouter à la liste de lecture actuelle" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Ajouter à la liste de lecture" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Appliquer une compression pour prévenir les coupures" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Êtes-vous sûr de vouloir supprimer la valeur prédéfinie « %1 »" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Êtes vous sûr de vouloir réinitialiser les statistiques de ce morceau ?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Êtes-vous sûr de vouloir enregistrer les statistiques du morceau dans le fichier du morceau pour tous les morceaux de votre bibliothèque ?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Artiste" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Info artiste" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Mots-clés de l'artiste" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Initiale de l'artiste" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Demander lors de la sauvegarde" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Format audio" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Sortie audio" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Échec de l'authentification" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Auteur" #: ui/about.cpp:68 msgid "Authors" msgstr "Auteurs" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Auto" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Automatique" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Mise à jour automatique" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Ouvrir automatiquement les catégories seules dans l'arbre de la bibliothèque" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Disponible" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Débit moyen" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Taille moyenne de l'image" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "Podcasts BBC" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Bruits de fond" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Couleur de l'arrière-plan" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Image d'arrière-plan" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Opacité de l'arrière-plan" #: core/database.cpp:648 msgid "Backing up database" msgstr "Sauvegarde de la base de données" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Balance" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "Bannir (scrobbling Last.fm)" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Spectrogramme à barres" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Bleu standard" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Type audio basique" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Comportement" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Meilleur" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Biographie de %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Débit" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Débit" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Débit binaire" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Spectrogramme avec blocs" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Type de bloc" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Niveau de flou" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Corps" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Spectrogramme « Boom »" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Parcourir..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Durée du tampon" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Mise en mémoire tampon" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Construction du fichier d'indexation Seafile..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Mais ces sources sont désactivées :" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Boutons" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Support des CUE sheet." #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Emplacement du cache :" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Mise en cache" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "Mise en cache %1" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Annuler" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Annuler le téléchargement" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Captcha est nécessaire.\nEssayez de vous connecter à Vk.com avec votre navigateur pour régler le problème." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Changer la couverture de l'album" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Changer la taille de la police..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Changer le mode de répétition" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Changer le raccourci..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Changer le mode aléatoire" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "Changer la piste courante" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Changer la langue" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "Les changements seront appliqués à la lecture de la prochaine piste" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Le changement de la préférence de lecture monophonique sera effectif pour les prochains morceaux joués." #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Chercher de nouveaux épisodes" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Vérifier les mises à jour" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Vérifier les mises à jour" #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Choisissez le répertoire de cache Vk.com" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Choisissez un nom pour votre liste de lecture intelligente" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Choisir automatiquement" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Choisir une couleur..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Choisir une police de caractères..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Choisir depuis la liste" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Choisissez comment la liste de lecture est triée et combien de morceaux elle contient." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Choisir le répertoire de téléchargement des podcasts" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Choisissez les services internet à afficher." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Sites web que vous voulez utiliser pour la recherche de paroles." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Classique" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Nettoyage en cours" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Effacer" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Vider la liste de lecture" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Erreur de Clementine" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Orange Clémentine" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Visualisation Clementine" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine peut automatiquement convertir la musique que vous copiez sur ce périphérique dans un format qu'il peut lire." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Clementine peut jouer les morceaux que vous avez envoyé sur Amazon Cloud Drive" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine peut jouer les morceaux que vous avez envoyé sur Box" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine peut jouer les morceaux que vous avez envoyé sur Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine peut jouer les morceaux que vous avez envoyé sur Google Drive" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine peut jouer les morceaux que vous avez envoyé sur OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine peut afficher un message lors des changements de pistes." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine peut synchroniser vos abonnements de podcasts avec d'autres ordinateurs et applications. Créer un compte." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine n'a pu charger les visualisations projectM. Vérifiez que Clementine est installé correctement." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Visionneur d'images de Clementine" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine n'a pu trouver aucun résultat pour ce fichier" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine trouvera de la musique dans :" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Cliquez ici pour créer votre bibliothèque musicale" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Cliquez ici pour ajouter cette liste de lecture aux favoris et elle sera sauvegardée dans l'onglet « Listes de lecture » de la barre latérale" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Cliquez pour basculer entre le temps restant et le temps total" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Cliquer sur le bouton « Se connecter » pour ouvrir votre navigateur web. Vous devriez retourner dans Clementine une fois connecté." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Fermer" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Fermer la liste de lecture" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Fermer la visualisation" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Fermer cette fenêtre annulera le téléchargement." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Fermer cette fenêtre arrêtera la recherche de pochette d'albums." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Couleurs" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Liste séparée par une virgule des classes:niveau, le niveau étant entre 1 et 3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Commentaire" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Radio communautaire" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Compléter les tags automatiquement" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Compléter les tags automatiquement..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Compositeur" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Configurer %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Configurer Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Configurer les raccourcis clavier" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Configurer Spotify…" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Configurer Subsonic..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Configuration de Vk.com..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Configurer la recherche globale..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Configurer votre bibliothèque..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Configurer les podcasts..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Configurer..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Connecter Wii Remote en utilisant l'action activer/désactiver" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Connexion du périphérique" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Connexion à Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Connexion refusée par le serveur. Vérifiez son URL. Exemple : http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Connexion expirée. Vérifiez l'URL du serveur. Exemple : http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Problème de connexion ou audio désactivé par le propriétaire" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Console" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Débit constant" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Convertir toutes les musiques" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Convertir la musique que le périphérique ne peut pas lire" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Convertir les fichiers audio sans perte avant de les envoyer au serveur distant." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Convertir les fichiers sans perte" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Copier l'URL partagée dans le presse-papier" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Copier dans le presse papier" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Copier sur le périphérique" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Copier vers la bibliothèque..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Droit d'auteur" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Impossible de se connecter à Subsonic ; vérifiez l'URL du serveur. Par exemple : http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Impossible de créer l'élément GStreamer « %1 » - vérifier que les modules externes GStreamer nécessaires sont installés." #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "La liste de lecture n'a pas pu être créée" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Impossible de trouver un multiplexeur pour %1, vérifiez que les bons modules externes GStreamer sont installés." #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Impossible de trouver un encodeur pour %1, vérifiez que les bons modules externes GStreamer sont installés." #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Impossible d'ouvrir le fichier de sortie %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Gestionnaire de pochettes" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Pochette depuis une image embarquée" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Pochette automatiquement chargée depuis %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Pochette désactivée manuellement" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Pochette non définie" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Pochette définie depuis %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Pochettes depuis %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Appliquer un fondu lors des changements de piste automatiques" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Appliquer un fondu lors des changements de piste manuels" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Personnalisé" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Image personnalisée :" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Paramètres de message personnalisé" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Personnalisée..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "Chemin DBus" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Danse" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Une corruption de la base de données a été détectée. Veuillez lire https://code.google.com/p/clementine-player/wiki/DatabaseCorruption pour obtenir des informations sur la restauration de votre base de données." #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Date de création" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Date de modification" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Jours" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "Dé&faut" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Baisser le volume de 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Diminuer le volume de pour-cent" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Diminuer le volume" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Image d'arrière-plan par défaut" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Périphérique par défaut à %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Par défaut" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Délai entre les visualisations" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Supprimer" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Effacer les données téléchargées" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Supprimer les fichiers" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Supprimer du périphérique..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Supprimer du disque..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Effacer les épisodes lus" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Effacer le pré-réglage" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Supprimer la liste de lecture intelligente" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Supprimer les fichiers originaux" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Suppression des fichiers" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Enlever les pistes sélectionnées de la file d'attente" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Enlever cette piste de la file d'attente" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Destination" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Détails..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Périphérique" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Propriétés du périphérique" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Nom du périphérique" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Propriétés du périphérique..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Périphériques" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Boîte de dialogue" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Essayez avec cette orthographe" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Mot de passe Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Nom d'utilisateur Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Connexion directe à Internet" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Dossier" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Désactiver la durée" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Désactiver la génération des barres d'humeur" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Désactivé" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Désactivé" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "CD" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Transmission discontinue" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Options d'affichage" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Afficher le menu à l'écran" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Refaire une analyse complète de la bibliothèque" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Faire une nouvelle analyse complète" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Faire une nouvelle analyse complète..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Ne pas convertir la musique" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Ne pas écraser" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "Faire une nouvelle analyse complète supprimera toutes les métadonnées que vous avez sauvegardées dans Clementine, tels que les pochettes, les compteurs de lecture et notes. Clementine refera une analyse de toute votre musique sur Google Drive, ce qui peut prendre un certain temps." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Ne pas répéter" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Ne pas classer dans la catégorie « Compilations d'artistes »" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Ne pas afficher les épisodes écoutés" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Aléatoire : désactivé" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Ne pas arrêter !" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Faire un don" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Double-cliquer pour ouvrir" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "Double cliquer sur une musique dans la playlist va..." #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Double-cliquer sur un morceau..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Télécharger %n épisodes" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Dossier de téléchargement" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Télécharger les épisodes vers" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Adhésion au téléchargement" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Télécharger les nouveaux épisodes automatiquement" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Téléchargement en file" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Télécharger paramètres" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Télécharger l'application Android" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Télécharger cet album" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Télécharger cet album..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Télécharger cet épisode" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Télécharger..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Téléchargement (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Téléchargement du catalogue d'Icecast" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Téléchargement du catalogue de Jamendo" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Téléchargement du catalogue Magnatune" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Téléchargement du module Spotify" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Téléchargement des métadonnées" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Déplacer pour repositionner" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dubstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Durée" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Le mode dynamique est activé" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Mix aléatoire dynamique" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Éditer la liste de lecture intelligente..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Modifier le tag « %1 »..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Modifier le tag..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Modifier les tags" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Modifier la description de la piste" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Modifier la description de la piste..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Modifier la description des pistes..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Éditer..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "Courriel" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Activer le support Wii Remote" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Activer la mise en cache automatique" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Activer l'égaliseur" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Autoriser les raccourcis uniquement lorsque la fenêtre de Clementine est active" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Permettre d'éditer les tags en cliquant sur un morceau, dans la liste de lecture" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Activer les sources ci-dessous pour les inclure dans les résultats de la recherche.\nLes résultats seront affichés dans cet ordre." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Activer/désactiver le scrobbling Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Complexité de l’encodage" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Qualité du moteur d’encodage" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Mode d’encodage" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Saisissez une URL" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Saisissez une URL pour télécharger une pochette depuis Internet" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Entrez un nom de fichier pour les pochettes exportées (sans extension) :" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Saisissez un nom pour la liste de lecture" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Saisissez des mots dans le champ de recherche ci-dessus pour trouver de la musique sur votre ordinateur et sur Internet" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Saisissez un mot-clé ci-dessous pour trouver des podcasts sur l'Itunes Store" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Saisissez un mot-clé ci-dessous pour trouver des podcasts sur gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Saisissez les termes à rechercher ici" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Saisissez l'adresse du flux d'une radio internet :" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Saisissez le nom du dossier" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Saisissez cette adresse IP dans l'application pour vous connecter à Clementine." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Collection complète" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Égaliseur" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Equivalent à --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Equivalent à --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Erreur" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Erreur de copie du CD" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Erreur durant la connexion au périphérique MTP" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Erreur lors de la copie des morceaux" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Erreur lors de la suppression des morceaux" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Erreur lors du téléchargement du module Spotify" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Erreur lors du chargement de %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Erreur du chargement de la liste de lecture di.fm" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Erreur lors du traitement de %1 : %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Erreur durant le chargement du CD audio" #: library/library.cpp:68 msgid "Ever played" msgstr "Déjà joués" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Toutes les 10 minutes" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Toutes les 12 heures" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Toutes les 2 heures" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Toutes les 20 minutes" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Toutes les 30 minutes" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Toutes les 6 heures" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Toutes les heures" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Excepté entre les pistes d'un même album ou d'une même CUE sheet" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Pochettes existantes" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Agrandir" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Expire au %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Exporter les pochettes" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Exporter les pochettes" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Exporter les pochettes téléchargées" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Exporter les pochettes intégrées" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Export terminé" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "%1 pochettes exportées sur %2 (%3 ignorées)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Fondu lors de la mise en pause et de la reprise" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Terminer par un fondu quand une piste s'arrête" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Fondu" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Durée du fondu" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Échec lors de la lecture du CD" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "La récupération du répertoire a échoué" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "La récupération des podcasts a échoué" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Le chargement du podcast a échoué" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "La lecture du flux RSS a échoué" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Rapide" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Pistes favorites" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Récupérer les pochettes manquantes" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Récupérer automatiquement" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Téléchargement terminé" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Récupération de la bibliothèque Subsonic" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Erreur lors de la récupération de la pochette" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Format de fichier" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Extension de fichier" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Formats de fichier" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Fichier" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Fichier (sans l'emplacement)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Schéma du nom de fichier :" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Chemins des fichiers" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Taille du fichier" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Type de fichier" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Nom du fichier" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Fichiers" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Fichiers à convertir" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Trouve les morceaux dans votre bibliothèque qui correspondent aux critères que vous spécifiez." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Trouver cet artiste" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Génération de l'empreinte audio" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Terminer" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Premier niveau" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Ajuster la pochette sur la largeur" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Taille de la police" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Pour des raisons de licence, le support de Spotify est dans un module séparé." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Forcer l’encodage en mono" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Oublier ce périphérique" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "« Oublier un périphérique » va supprimer le périphérique de cette liste et obligera Clementine à rechercher à nouveau tous les morceaux qu'il contient la prochaine fois que vous le connecterez." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Form" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Format" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Images par seconde" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Images par tampon" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Gelé" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Graves Max." #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Graves + Aigus Max." #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Aigus Max." #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Général" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Configuration générale" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Genre" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Obtenir une URL pour partager ce morceau Spotify" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Obtenir une URL pour partager cette liste de lecture" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Récupération des canaux" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Réception des flux" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Donner un nom" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Go" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Aller à la liste de lecture suivante" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Aller à la liste de lecture précédente" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "%1 pochettes récupérées sur %2 (%3 échecs)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Griser les morceaux qui n'existent plus dans mes listes de lecture" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Grouper la Bibliothèque par..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Grouper par" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Grouper par Album" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Grouper par Artiste" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Grouper par Artiste/Album" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Grouper par Artiste/Année - Album" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Grouper par Genre/Album" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Grouper par Genre/Artiste/Album" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Groupement" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "La page HTML ne contenait pas de flux RSS" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "Code de statuts HTTP 3xx reçu sans URL, vérifiez la configuration serveur." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "Serveur mandataire HTTP" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Heureux" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Informations sur le matériel" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Les informations sur le matériel sont disponibles uniquement lorsque le périphérique est connecté." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Élevé" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Élevé (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Élevé (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "Hip-hop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Serveur introuvable. Vérifiez son URL. Exemple : http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Heures" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Crapaud hypnotique" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Je ne possède pas de compte Magnatune" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Icône" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Icônes au dessus" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Identification du morceau" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Si cette option est activée, cliquer sur un morceau sélectionné dans la liste de lecture vous permettra d'éditer directement la valeur du tag" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Si vous continuez, ce périphérique fonctionnera lentement et les morceaux que vous y copiez pourraient ne pas fonctionner." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Si vous connaissez l'adresse d'un podcast, saisissez-la ci-dessous et appuyez sur Go." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Ignorer « The » dans les noms d'artiste" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Importation..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "Dans %1 jours" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "Dans %1 semaines" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "En mode dynamique, de nouvelles pistes seront choisies et ajoutées à la fin de la liste de lecture chaque fois qu'un morceau se terminera." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Boîte de réception" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Inclure la pochette de l'album à la notification" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Inclure tous les morceaux" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Incompatibilité du protocole Subsonic REST. Le client doit être mis à jour." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Incompatibilité du protocole Subsonic REST. Le serveur doit être mis à jour." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Configuration incomplète. Veuillez vérifier que tous les champs sont remplis." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Augmenter le volume de 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Augmenter le volume de pour-cent" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Augmenter le volume" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Indexation de %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Information" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Réglages d'entrée" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Insérer..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Installé" #: core/database.cpp:585 msgid "Integrity check" msgstr "Vérification de l'intégrité" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Services de musique" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Services internet" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "Introduction des pistes" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "API key invalide" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Format invalide" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Méthode invalide" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Paramètres invalides" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Ressource spécifiée invalide" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Service invalide" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Clé de session invalide" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Inverser la sélection" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Morceaux les plus écoutés de Jamendo" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Meilleurs morceaux Jamendo" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Meilleurs morceaux Jamendo du mois" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Meilleurs morceaux Jamendo de la semaine" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Base de données Jamendo" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Aller tout de suite à la piste précédente" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Aller à la piste jouée actuellement" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Pressez le bouton pendant %1 seconde..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Pressez le bouton pendant %1 secondes..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Laisser tourner en arrière plan lorsque la fenêtre est fermée" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Conserver les fichiers originaux" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Chatons" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Langue" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Portable/Écouteurs" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Large Salle" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Grande pochette d'album" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Grande pochette d'album (détails en dessous)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Grande pochette d'album (pas de détails)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Barre latérale large" #: library/library.cpp:80 msgid "Last played" msgstr "Dernière écoute" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Dernière écoute" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm est actuellement indisponible, veuillez réessayer dans quelques minutes" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Mot de passe" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Nombre d'écoutes Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Tags Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Nom d'utilisateur" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Wiki Last.fm" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Pistes les moins aimées" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Gauche" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Durée" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Bibliothèque" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Groupement avancé de la bibliothèque" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Avertissement de mise à jour de la bibliothèque" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Rechercher dans la bibliothèque" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Limites" #: ui/equalizer.cpp:137 msgid "Live" msgstr "En direct" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Charger" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Charger une pochette à partir d'une URL" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Charger une pochette à partir d'une URL..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Charger la pochette depuis le disque" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Charger la pochette depuis le disque..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Charger une liste de lecture" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Charger une liste de lecture..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Chargement du périphérique MTP" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Chargement de la base de données iPod" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Chargement de la liste de lecture intelligente" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Chargement des morceaux" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Chargement du flux" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Chargement des pistes" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Chargement des info des pistes" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Chargement..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Charger des fichiers/URLs, et remplacer la liste de lecture actuelle" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Se connecter" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Erreur lors de la connexion" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Déconnexion" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Profil de prédiction à long terme (PLT)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "J'aime" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "Recommander (scrobbling Last.fm)" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Faible (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Faible (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Profile à faible complexité (FC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Paroles" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Paroles récupérées depuis %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Paroles récupérées depuis le tag ID3v2" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Télécharger Magnatune" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Téléchargement Magnatune terminé" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Profil principal (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Voilà!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Ainsi soit-il!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Rendre la liste de lecture accessible hors ligne" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Réponse mal formatée" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Configuration manuelle du serveur mandataire" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Manuellement" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Fabricant" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Marquer comme lu" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Marquer comme nouveau" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Utiliser tous les termes de recherche (ET)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Utiliser un ou plusieurs termes de recherche (OU)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Maximum pour les résultats globaux de recherche" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Débit maximum" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Le média à changé. Rechargement" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Moyen (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Moyen (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Type d'adhésion" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Débit minimum" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Remplissage minimum du tampon" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Pré-réglages projectM manquants" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Modèle" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Surveiller les modifications de la bibliothèque" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Lecture monophonique" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Mois" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Humeur" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Style de la barre d'humeur" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Barre d'humeur" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Plus" #: library/library.cpp:84 msgid "Most played" msgstr "Les plus jouées" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Point de montage" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Points de montage" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Déplacer vers le bas" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Déplacer vers la bibliothèque..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Déplacer vers le haut" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Musique" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Bibliothèque musicale" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Sourdine" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Mes albums" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Ma musique" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Mes suggestions" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Nom" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Nom" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Options de nommage" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Bande étroite (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Serveur mandataire (proxy)" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Contrôle à distance" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Jamais" #: library/library.cpp:74 msgid "Never played" msgstr "Jamais joués" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Ne jamais commencer à lire" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Nouveau dossier" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Nouvelle liste de lecture" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Nouvelle liste de lecture intelligente..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Nouveaux morceaux" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "De nouvelles pistes seront ajoutées automatiquement." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Nouvelles pistes" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Suivant" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Piste suivante" #: core/utilities.cpp:151 msgid "Next week" msgstr "La semaine prochaine" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Désactiver le spectrogramme" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Pas d'image d'arrière-plan" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Aucune pochette à exporter." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Pas de bloc long" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Aucune correspondance trouvée. Videz le champ de recherche pour afficher à nouveau la totalité de la liste de lecture." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Pas de bloc court" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Aucun" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Aucun des morceaux sélectionnés n'était valide pour la copie vers un périphérique" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Normal" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Type de bloc normal" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Indisponible durant l'utilisation d'une liste de lecture dynamique" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Déconnecté" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Pas assez de contenu" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Pas assez de fans" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Pas assez de membres" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Voisins insuffisants" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Non installé" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Non connecté" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Non monté – double-cliquez pour monter" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Rien trouvé" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Notifications" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Notifications" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Lecture en cours" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Nombre d'épisodes à afficher" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Prévisualisation de l'affichage à l'écran (OSD)" #: widgets/osd.cpp:173 msgid "Off" msgstr "Désactivé" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "Activé" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Accepter seulement les connexions de clients dont l'IP est dans les blocs :\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Autoriser uniquement les connexions depuis le réseau local" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Afficher seulement le premier" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Opacité" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Ouvrir %1 dans le navigateur" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Lire un CD &audio" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Ouvrir un fichier OPML" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Ouvrir un fichier OPML..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Ouvrir un répertoire pour en importer la musique" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Ouvrir le périphérique" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Ouvrir un fichier..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Ouvrir dans Google Drive" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Ouvrir dans une nouvelle liste de lecture" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Ouvrir dans une nouvelle liste de lecture" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Ouvrir dans votre navigateur" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Ouvrir..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Opération échouée" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Optimisation du débit" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Optimisation de la qualité" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Options..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Organiser les fichiers" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Organisation des fichiers..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Organisation des fichiers" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Tags originaux" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "Année d'origine" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "Année d'origine - Album" #: library/library.cpp:118 msgid "Original year tag support" msgstr "Support des tags d'année d'origine" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Autres options" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Sortie" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Périphérique de sortie" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Options de sortie" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Tout écraser" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Écraser les fichiers existants" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Écraser uniquement les plus petits" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Propriétaire" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Analyse du catalogue Jamendo" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Soirée" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Mot de passe" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Pause" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Mettre la lecture en pause" #: widgets/osd.cpp:156 msgid "Paused" msgstr "En pause" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Interprète" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Pixel" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Barre latérale simple" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Lecture" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Compteur d'écoutes" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Lire ou mettre en pause, selon l'état courant" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Lire s'il n'y a rien d'autre en cours de lecture" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Jouer la ème piste de la liste de lecture" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Lecture/Pause" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Lecture sonore" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Options du lecteur" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Liste de lecture" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Liste de lecture terminée" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Options de la liste de lecture" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Type de liste de lecture" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Listes de lecture" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Merci de fermer votre navigateur et de retourner dans Clementine." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "État du module externe :" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcasts" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Durée d'affichage de la fenêtre" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Pré-ampli" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Préférences" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Préférences" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Préférences..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Noms de pochette préférés (liste séparée par des virgules)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Format audio préféré" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Débit préféré" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Format préféré" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Type audio premium" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Préréglage :" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Appuyez sur une combinaison de touches à utiliser pour" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Appuyez sur une touche" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Appuyez sur une combinaison de touches à utiliser pour %1..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Appuyer sur « Précédent » du lecteur aura comme effet de..." #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Options de l'affichage à l'écran (OSD)" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Aperçu" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Précédent" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Piste précédente" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Afficher la version" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Progression" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Progression" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psychédélique" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Appuyez sur le bouton Wiiremote" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Mettre les morceaux dans un ordre aléatoire" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Qualité" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Qualité" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Interrogation périphérique" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Gestionnaire de file d'attente" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Mettre les pistes sélectionnées en liste d'attente" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Mettre cette piste en liste d'attente" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (volume égalisé pour toutes les pistes)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Pluie" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Pluie" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Visualisation aléatoire" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Noter ce morceau 0 étoile" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Noter ce morceau 1 étoile" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Noter ce morceau 2 étoiles" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Noter ce morceau 3 étoiles" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Noter ce morceau 4 étoiles" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Noter ce morceau 5 étoiles" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Note" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Êtes-vous sûr de vouloir annuler ?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Limite de redirection excédée, vérifiez la configuration serveur." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Mettre à jour le catalogue" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Mettre à jour les canaux" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Mettre à jour la liste des stations" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Actualiser les flux" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Relatif" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Mémoriser le mouvement de la Wiimote" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Se souvenir de la dernière fois" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Se souvenir de mon choix" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Supprimer" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Effacer l'action" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Supprimer les doublons de la liste de lecture" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Supprimer un dossier" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Supprimer de ma musique" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Supprimer des favoris" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Supprimer de la liste de lecture" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Supprimer la liste de lecture" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Supprimer les listes de lecture" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Supprimer les pistes indisponibles dans la liste de lecture" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Renommer la liste de lecture" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Renommer la liste de lecture..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Renuméroter les pistes dans cet ordre..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Répéter" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Répéter l'album" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Répéter la liste de lecture" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Répéter la piste" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Remplacer la liste de lecture actuelle" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Remplacer la liste de lecture" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Remplace les espaces par des tiret-bas" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Mode du Replay Gain" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Repeupler" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Exiger un code d'authentification" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Réinitialiser" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Réinitialiser le compteur de lecture" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Redémarrer le morceau, puis aller au précédent si appuyé à nouveau" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Redémarre le morceau ou lit le morceau précédent si utilisé durant les 8 premières secondes." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Limiter aux caractères ASCII" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Redémarrer la lecture au démarrage" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Retourner dans Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Droite" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Extraire" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Extraire le CD" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Extraire le CD audio" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Lancer" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "Serveur mandataire SOCKS" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Erreur dans l'échange SSL. Vérifiez la configuration serveur. L'option SSLv3 ci-dessous peut résoudre certains problèmes." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Enlever le périphérique en toute sécurité" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Enlever le périphérique en toute sécurité à la fin de la copie" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Échantillonnage" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Échantillonnage" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Enregistrez les fichiers .mood dans la bibliothèque" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Sauvegarder les couvertures d'albums" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Enregistrer la pochette sur le disque..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Enregistrer l'image" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Sauvegarder la liste de lecture" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Sauvegarder la liste de lecture" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Enregistrer la liste de lecture..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Enregistrer pré-réglages" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Enregistrer les notes dans les tags du fichier si possible" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Enregistrer les statistiques dans les tag du fichier si possible" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Sauvegarder ce flux dans l'onglet Internet" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Enregistrement des statistiques dans les fichiers des morceaux" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Sauvegarde des pistes" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Profil du taux d'échantillonnage" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Taille redimensionnée" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Score" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Envoyer les titres des pistes que j'écoute (scrobble)" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Recherche" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Recherche" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Rechercher des stations Icecast" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Recherche Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Recherche Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Recherche Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Rechercher automatiquement" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Chercher des pochettes pour cet album..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Recherche globale" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Rechercher sur gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Rechercher iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Mode de recherche" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Options de recherche" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Résultats de recherche" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Termes de recherche" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Deuxième niveau" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Reculer" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Avancer" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Déplacer la lecture de la piste courante par une quantité relative" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Déplacer la lecture de la piste courante à une position absolue" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "Chercher avec un raccourci clavier" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Tout sélectionner" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Ne rien sélectionner" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Sélectionner la couleur d'arrière-plan :" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Sélectionner une image d'arrière-plan" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Sélectionner le meilleur résultat possible" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Sélectionner la couleur d'avant-plan :" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Sélectionner visualisation" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Sélectionner visualisation..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Sélectionner..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Numéro de série" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Serveur" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "URL du serveur" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Détails du serveur" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Service hors-ligne" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Définir %1 à la valeur « %2 »..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Définir le volume à pourcents" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Définir une valeur pour toutes les pistes sélectionnées..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Paramètres" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Raccourci" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Raccourci pour %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Le raccourci pour %1 existe déjà" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Afficher" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Afficher l'OSD" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Mettre en surbrillance la piste en lecture" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Afficher une barre d'humeur dans la barre de progression" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Utiliser le système de notification du bureau" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Afficher une notification quand je change le mode répétition/aléatoire" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Afficher une notification lorsque je change le volume" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Afficher une notification lorsque je mets la lecture en pause" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Afficher une pop-up à côté de la zone de notification" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Utiliser l'affichage à l'écran (OSD)" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Afficher au dessus de la barre d'état" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Afficher tous les morceaux" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Afficher tous les morceaux" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Afficher les pochettes des albums dans la bibliothèque" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Afficher les séparateurs" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Afficher en taille réelle..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Afficher les groupes dans le résultat global de recherche" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Afficher dans le navigateur de fichiers" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Afficher dans la bibliothèque..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Classer dans la catégorie « Compilations d'artistes »" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Afficher la barre d'humeur" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Afficher uniquement les doublons" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Afficher uniquement les morceaux sans tag" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Afficher le morceau en cours de lecture sur votre page" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Afficher les suggestions de recherche" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Afficher le bouton « J'aime »" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Montrer le bouton de scrobbling dans la fenêtre principale" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Afficher l'icône dans la zone de notifications" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Afficher quelles sources sont activées et désactivées" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Afficher/Masquer" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Aléatoire" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Aléatoire : albums" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Aléatoire : tout" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Mélanger la liste de lecture" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Aléatoire : pistes de cet album" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "S'inscrire" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Se déconnecter" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Connexion..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Artistes similaires" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Taille" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Taille :" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Lire la piste précédente" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Compteur de morceaux sautés" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Lire la piste suivante" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Passer les pistes sélectionnées" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Passer la piste" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Petite pochette d'album" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Petite barre latérale" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Liste de lecture intelligente" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Listes de lecture intelligentes" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Informations sur le morceau" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Info morceau" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogramme" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Désolé" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Trier par genre (ordre alphabétique)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Trier par genre (par popularité)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Trier par nom de station" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Trier les morceaux par" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Tri" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Source" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Sources" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Erreur lors de la connexion à Spotify" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "URL de la liste de lecture Spotify" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Module externe Spotify" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Le module externe de Spotify n'est pas installé" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "URL du morceau Spotify" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Standard" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Sélection" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Démarrer l'extraction" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Commencer la liste de lecture jouée actuellement" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Démarrer transcodage" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Commencer à écrire dans le champ de recherche ci-dessus pour remplir cette liste de résultats" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Lancement de %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Démarrage..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Stop" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Arrêter après" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Arrêter après chaque piste" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Arrêter après chaque piste" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Arrêter la lecture après cette piste" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Arrêter la lecture" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Arrêter la lecture après ce morceau" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Arrêter la lecture après la piste : %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Interrompu" #: core/song.cpp:431 msgid "Stream" msgstr "Flux" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "La diffusion depuis un serveur Subsonic nécessite une clef de licence valide après la période d'essai de 30 jours." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Membres de streaming" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Abonnés" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Succès !" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "%1 écrit avec succès" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Tags suggérés" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Résumé" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Très élevé (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Très élevé (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Formats supportés" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Synchroniser les statistiques vers les fichiers maintenant" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Synchronisation de la boîte de réception Spotify" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Synchronisation de la liste de lecture Spotify" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Synchronisation des morceaux Spotify préférés" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Couleurs du système" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Onglets au dessus" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Compléteur de balises" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Débit cible" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Options du texte" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Merci à" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "La commande « %1 » n'a pas pu être démarrée." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "La pochette d'album de la piste courante" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "Le répertoire %1 est invalide" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "La seconde valeur doit être plus grande que la première !" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Le site demandé n'existe pas !" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Le site demandé n'est pas une image !" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "La période d'essai pour le serveur Subsonic est terminée. Merci de faire un don pour avoir un clef de licence. Visitez subsonic.org pour plus d'informations." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "La nouvelle version de Clementine nécessite une mise à jour de votre bibliothèque pour supporter les nouvelles fonctionnalités suivantes :" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Il y a d'autres morceaux dans cet album" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Problème lors de la communication avec gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Il y a un problème pour obtenir les métadonnées à partir de Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Problème lors de la lecture de la réponse du service iTunes Store" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Il y a eu un problème pour copier certains morceaux. Les fichiers suivant n'ont pas pu être copiés :" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Il y a eu un problème pour supprimer certains morceaux. Les fichiers suivant n'ont pas pu être supprimés :" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Ces fichiers vont être supprimés du périphérique, êtes-vous sûr de vouloir continuer ?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Ces fichiers seront supprimés définitivement du disque. Êtes-vous sûr de vouloir continuer ?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Ces dossiers seront analysés pour trouver les fichiers qui constitueront votre bibliothèque musicale" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Ces paramètres sont utilisés dans la boîte de dialogue « Transcoder de la musique » ou lors de la conversion de musique, avant de la copier sur un périphérique." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Troisième niveau" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Ceci va créer un base de données d'environ 150 Mo.\nÊtes-vous sûr de vouloir continuer ?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Cet album n'est pas disponible dans le format demandé" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Ceci peut être modifié plus tard dans les préférences" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Ce périphérique doit être connecté et ouvert pour que Clementine puisse voir les formats de fichier qu'il gère." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Ce périphérique supporte les formats suivant :" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Ce périphérique ne fonctionne pas correctement" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Ceci est un périphérique MTP, mais vous avez compilé Clementine sans le support libmtp." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Ceci est un iPod, mais vous avez compilé Clementine sans le support libgpod." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "C'est la première fois que vous connectez ce périphérique. Clementine va scanner le périphérique pour trouver des fichiers musicaux - Ceci peu prendre un certain temps." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Cette option peut être modifiée dans les préférences de « Comportement »" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Ce flux n'est accessible qu'aux abonnés ayant payé" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Ce type de périphérique n'est pas supporté : %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "Pas temporel" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Titre" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Aujourd'hui" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Basculer l'affichage de l'OSD" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Basculer en mode plein écran" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Basculer l'état de la file d'attente" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Basculer le scrobbling" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Basculer la visibilité de l'OSD" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Demain" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Trop de redirections" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Top titres" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Total albums :" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Nombre total d'octets transférés" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Nombre total de requêtes réseau effectuées" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Piste" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Pistes" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Transcoder de la musique" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Journal du transcodeur" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Transcodage" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Transcodage de %1 fichiers en utilisant %2 threads" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Option de transcodage" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Spectrogramme « Turbine »" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Éteindre" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Très large bande (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Impossible de se connecter" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Impossible de télécharger %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Inconnu" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Type de contenu inconnu" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Erreur de type inconnu" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Enlever cette pochette" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Ne pas passer les pistes sélectionnées" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Ne pas passer la piste" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Se désinscrire" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Concerts à venir" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Mise à jour" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Mettre à jour tous les podcasts" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Mettre à jour les dossiers de la bibliothèque" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Mettre à jour la bibliothèque quand Clementine démarre" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Mettre à jour ce podcast" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Mise à jour" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Mise à jour %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Mise à jour %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Mise à jour de la bibliothèque" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Usage" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Utiliser le tag Album Artist lorsqu'il est disponible" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Utiliser les raccourcis de touches de Gnome" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Utiliser des couleurs psychédéliques" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Utiliser la métadonnée Replay Gain si disponible" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Utiliser SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Utiliser Wii Remote" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Utiliser un assortiment de couleurs personnalisé" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Utiliser un message personnalisé pour les notifications" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Utiliser le contrôle à distance" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Utiliser l'authentification" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Utiliser le moteur de gestion du débit" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Utiliser le mode dynamique" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Utiliser des notifications pour signaler l'état de la Wiimote" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Utiliser le mode de changement temporaire du bruit" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Utiliser la langue par défaut du système" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Utiliser l'assortiment de couleurs du système" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Utiliser les paramètres du système pour le serveur mandataire" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Utiliser la normalisation de volume" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Utilisé" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Interface utilisateur" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Nom d'utilisateur" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Utiliser le menu pour ajouter un morceau va..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "MP3 VBR" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Débit variable" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Compilations d'artistes" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Version %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Vue" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Mode de visualisation" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Visualisations" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Paramètres de Visualisations" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Détecteur d’activité vocale" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Volume %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Mur" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "M'avertir lors de la fermeture d'un onglet de liste de lecture" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Site Web" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Semaines" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Quand Clementine démarre" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Pendant la recherche de pochettes Clementine utilisera d'abord les fichiers qui contiennent un de ces mots.\nS'il n'en existe pas alors Clementine utilisera la plus grande images du dossier." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "Emplacement des fichiers lors de la sauvegarde d'une liste de lecture" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Quand la liste est vide..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Pourquoi ne pas essayer..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Large bande (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wiimote %1 : activée" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wiimote %1 : connectée" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wiimote %1 : pile critique (%2 %) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wiimote %1 : désactivée" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wiimote %1 : déconnectée" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wiimote %1 : pile faible (%2 %)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "audio Windows Media" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Sans pochette :" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Voulez-vous aussi déplacer les autres morceaux de cet album dans la catégorie « Compilations d'artistes » ?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Voulez-vous effectuer une analyse complète de la bibliothèque maintenant ?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Enregistrer toutes les statistiques dans les fichiers des morceaux" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Écrire les métadonnées" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Nom d'utilisateur et/ou mot de passe invalide." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Année" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Année - Album" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Années" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Hier" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Vous êtes sur le point de télécharger les albums suivants" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Vous allez supprimer %1 listes de lecture de vos favoris. Êtes-vous sûr ?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Vous êtes sur le point de fermer une liste de lecture qui ne fait pas partie de vos favoris : cette liste de lecture va être supprimée (cette action ne peut pas être annulée).\nÊtes-vous sûr de vouloir continuer ?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Vous n'êtes pas connecté." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Vous êtes connecté en tant que %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Vous êtes connecté." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Vous pouvez changer la manière dont les morceaux de la bibliothèque sont organisés." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Vous pouvez écouter gratuitement sans compte mais les membres premiums peuvent écouter avec une meilleure qualité et sans publicité." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Vous pouvez écouter gratuitement les morceaux de Magnatune sans avoir de compte. L'achat d'un abonnement supprime le message à la fin de chaque piste." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Vous pouvez écouter les bruits de fond en même temps qu'une autre musique." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Vous pouvez utiliser votre Wii Remote comme télécommande pour Clementine. Voir la page sur le wiki de Clementine pour plus d'information.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Vous n'avez pas de compte Spotify Premium." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Vous n'avez pas d'abonnement actif" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "Il n'est pas nécessaire d'être connecté à votre compte pour effectuer une recherche ou écouter de la musique sur SoundCloud. Par contre, vous devez être connecté pour accéder à vos listes de lecture et votre flux." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Vous avez été déconnecté de Spotify, merci de ressaisir votre mot de passe dans la fenêtre des Préférences." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Vous avez été déconnecté de Spotify, merci de ressaisir votre mot de passe." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Vous aimez cette piste" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "Vous devez lancer les Préférences Système et permettre à Clementine de « contrôler votre ordinateur » pour utiliser les raccourcis globaux de Clementine." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Vous devez redémarrer Clementine si vous changez de langue." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Votre adresse IP :" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Vos identifiants Last.fm sont incorrects" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Vos identifiants Magnatune sont incorrects" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Votre bibliothèque est vide !" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Vos flux radio" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Vos scrobbles : %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Votre système n'est pas compatible avec OpenGL, les visualisations ne sont pas disponibles." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Votre nom d'utilisateur ou mot de passe est incorrect." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Zéro" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "ajouter %n morceaux" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "après" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "il y a" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "et" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "automatique" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "avant" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "compris entre" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "le plus gros en premier" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "contient" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "désactivé" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "CD %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "ne contient pas" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "se termine par" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "est égal à" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "Répertoire gpodder.net" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "supérieur à" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "Les iPods et les périphériques USB ne fonctionnent pas actuellement sous Windows. Désolé !" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "parmi les derniers" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "inférieur à" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "le plus long en premier" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "déplacer %n morceaux" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "le plus récent en premier" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "différent de" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "avant les derniers" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "pas sur" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "le plus ancien en premier" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "sur" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "options" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "ou scanner le code QR !" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "appuyer sur Entrée" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "enlever %n morceaux" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "le plus court en premier" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "mélanger les morceaux" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "le plus petit en premier" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "trier les morceaux" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "commence par" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "stop" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "piste %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/ga.po000066400000000000000000004273521260417502300236430ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Seanán Coistín <>, 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Irish (http://www.transifex.com/davidsansome/clementine/language/ga/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ga\n" "Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "lá" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr "soicindí" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "amhráin" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 albaim" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 lá" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 lá ó shin" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 ar %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 roghnaithe de" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 amhrán" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 amhráin" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 amhráin aimsithe" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 amhráin aimsithe (ag taispeáint %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 rianta" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 aistrithe" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 éisteoirí eile" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%comhadainm%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n teipthe" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n críochnaithe" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n fágtha" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Ailínigh téacs" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Lár" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Saincheaptha" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "&Breiseáin" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Cabhair" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&Folaigh %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Folaigh..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Clé" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "&Ceol" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Dada" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Scoir" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Deas" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Sín colúin chun an fhuinneog a líonadh" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Uirlisí" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(éagsúil trasna iliomad amhráin)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 lá" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 rian" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 rianta fánacha" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "" #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Maidir le %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Maidir le Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Maidir le Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Sonraí an chuntais" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Sonraí an chuntais (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Gníomh" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Gníomhachtaigh/díghníomhachtaigh Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Cuir podchraoladh leis" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Cuir sruth leis" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Cuir gníomh leis" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Cuir sruth eile leis..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Cuir comhadlann leis..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Cuir comhad leis" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Cuir comhad leis..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Cuir fillteán leis" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Cuir fillteán leis..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Cuir fillteán nua leis..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Cuir podchraoladh leis" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Cuir podchraoladh leis..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Cuir ní cuardaigh leis" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Cuir sruth leis..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Cuir leis an scuaine" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Cuir leis..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Curtha leis an mhí seo" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Curtha leis an tseachtain seo" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Curtha leis i mbliana" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Curtha leis inniu" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Curtha leis laistigh de trí mhí" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "I ndiaidh" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "I ndiaidh macasamhlú..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Albam" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Ealaíontóir an albaim" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Clúdach an Albaim" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Faisnéis an albaim ar jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Albaim le clúdaigh" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Albaim gan clúdaigh" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Gach Comhad (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Gach albam" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Gach ealaíontóir" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Gach comhad (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:80 msgid "All the translators" msgstr "Na haistritheoirí uile" #: library/library.cpp:98 msgid "All tracks" msgstr "Gach rian" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Folaigh an phríomhfhuinneog i gcónaí" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Taispeáin an phríomhfhuinneog i gcónaí" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Tosaigh ag seinm i gcónaí" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:85 msgid "And:" msgstr "Agus:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Cuma" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Ealaíontóir" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Theip ar an bhfíordheimhniú" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Údar" #: ui/about.cpp:68 msgid "Authors" msgstr "Údair" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Uathoibríoch" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Nuashonrúchán uaithoibríoch" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Ar fáil" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "Podchraoltaí an BBC" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Sruthanna sa chúlra" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Dath an chúlra" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Íomhá an chúlra" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Teimhneacht an chúlra" #: core/database.cpp:648 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Iompar" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Is Fearr" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Beathaisnéis ó %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Corp" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Siortaigh..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Cnaipí" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Cealaigh" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Athraigh ealaíon an chlúdaigh" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Athraigh méid na clófhoirne" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Athraigh an t-aicearra" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Athraigh an teanga" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Lorg cláir nua" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Lorg nuashonruithe..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Roghnaigh go huathoibríoch" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Roghnaigh dath..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Roghnaigh clófhoireann..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Ag glanadh" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Glan" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Botún Clementine" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Clementine Orange" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Amharcléiriú Clementine" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Tig le Clementine teachtaireacht a thaispeáint nuair a athraítear an rian." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Amharcóir íomhánna Clementine" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Níor éirigh le Clementine torthaí a aimsiú don gcomhad seo" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Brúigh anseo chun ceol a chuir leis" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Dún" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Cealófar an t-íosluchtú má dhúntar an fhuinneog seo" #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:114 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Dathanna" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Trácht" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Críochnaigh clibeanna go huathoibríoch" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Críochnaigh clibeanna go huathoibríoch" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Cumadóir" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Cumraigh Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Cumraigh Aicearraí" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Cumraigh Spotify..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Cumraigh leabharlann..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Cumraigh podchraoltaí..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Cumraigh..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Nasc gléas" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Ag nascadh le Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Tiontaigh gach ceol" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Tiontaigh ceol ar bith nach féidir leis an ngléas a sheinm" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Macasamhlaigh go dtí an ngearrthaisce" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Macasamhlaigh go gléas..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Macasamhlaigh go leabharlann..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Cóipcheart" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Clúdaithe ó %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Síos" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Iomlaoid+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Saincheaptha" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Íomhá shaincheaptha:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Saincheaptha..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Damhsa" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Dáta ar a chruthaíodh é" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Dáta ar a athraíodh é" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Lá" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "Réamhshocrú" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Laghdaigh an airde" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Íomhá réamhshocraithe an chúlra" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Réamhshocruithe" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Scrios sonraí íosluchtaithe" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Scrios comhaid" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Scrios ón ngléas..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Scrios ón ndiosca..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Scrios eagráin a seinneadh" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Scrios na comhaid bhunaidh" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Ag scriosadh comhaid" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Bain an rian as an scuaine" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Sprioc" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Sonraí..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Gléas" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Airíonna an ghléis" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Ainm an ghléis" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Airíonna an ghléis..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Gléasanna" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "An é seo a bhí ar intinn agat" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Comhadlann" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Diosca" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Roghanna taispeána" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Ná tiontaigh ceol ar bith" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Ná déan arís" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Ná stad!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Brúigh faoi dhó chun é a oscailt" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "" #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Íosluchtaigh %n eagráin" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Íosluchtaigh an chomhadlann" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Íosluchtaigh eagráin chuig" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Íosluchtaigh eagráin nua go huathoibríoch" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Tá an t-íosluchtú i scuaine" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Íosluchtaigh an t-albam seo" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Íosluchtaigh an t-albam seo..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Íosluchtaigh an t-eagrán seo" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Íosluchtaigh..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Ag íosluchtú (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Ag íosluchtú an breiseán do Spotify" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Ag íosluchtú meiteashonraí" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Cuir clib in eagar..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Eagar..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Cumasaigh cothromóir" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Cuir isteach URL" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "An cnuasach ar fad" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Cothromóir" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Botún" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:68 msgid "Ever played" msgstr "A seinneadh riamh" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Gach 10 nóiméid" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Gach 12 uair" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Gach 2 uaire" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Gach 20 nóiméid" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Gach 30 nóiméid" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Gach 6 uair" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Gach uair" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Fairsingigh" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Éagann sé ar an %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Theip air an podchraoladh a luchtú" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Gasta" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Na rianta is fearr leat" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Iarmhír comhadainm" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Comhadainm" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Méid comhaid" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Cineál comhad" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Comhadainm" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Comhaid" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Aimsigh amhráin i do leabharlann a chomhoireann leis an slat tomhais a shonraíonn tú." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Críochnaigh" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "An chéad airde" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Méid na clófhoirne" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Déan dearmad faoin ngléas" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Foirm" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Formáid" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Dord iomlán" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Coiteann" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Socruithe coiteann" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Ag fáil bealaí" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Ag fáil sruthanna" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Tabhair ainm dó:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Téigh" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Aicmigh an leabharlann de réir..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Aicmigh de réir" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Aicmigh de réir albam" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Aicmigh de réir ealaíontóir" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Aicmigh de réir ealaíontóir/albam" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Aicmigh de réir ealaíontóir/bliain - albam" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "Seachfhreastalaí HTTP" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Faisnéis an innealra" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Ard" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Ard (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Ard (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Uair" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Níl cuntas Magnatune agam" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Deilbhín" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Deilbhíní ar barr" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Ag aithint an t-amhrán" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Íomhánna (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Íomhánna (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Bosca Isteach" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Iniaigh gach amhrán" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Méadaigh an airde" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Eolas" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Ionsáigh..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Suiteáilte" #: core/database.cpp:585 msgid "Integrity check" msgstr "Dearbháil sláine" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Idirlíon" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Soláthraithe idirlín" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Bunachar sonraí Jamendo" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Léim chuig an rian atá á seinm faoi láthair" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Coinnigh na comhaid bhunaidh" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Teanga" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Ríomhaire glúine/Cluasáin" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Halla mór" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Clúdach albaim mór" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "" #: library/library.cpp:80 msgid "Last played" msgstr "An ceann deiridh a seinneadh" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Focal faire Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Clibeanna Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Aga" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Leabharlann" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Cuardach leabharlainne" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Teorainneacha" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Beo" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Luchtaigh" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Luchtaigh clúdach ó URL" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Luchtaigh clúdach ó URL..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Ag luchtú gléas MTP" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Ag luchtú bunachar sonraí iPod" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Ag luchtú amhráin" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Ag luchtú sruth" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Ag luchtú rianta" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Ag luchtú..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Síniú isteach" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Grá" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Íseal (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Liricí ó %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Íosluchtú Magnatune" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Chríochnaigh an t-íosluchtú Magnatune" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Bíodh sé mar sin!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "De láimh" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Déantúsóir" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Rianaigh mar éiste" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Rianaigh mar nua" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Meánach (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Samhail" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Míonna" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "Na cinn is mó a seinneadh" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Bog síos" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Bog go dtí an leabharlann..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Bog suas" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Ceol" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Leabharlann cheoil" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Balbhaigh" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Mo Mholtaí" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Ainm" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Roghanna aimniúcháin" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Choíche" #: library/library.cpp:74 msgid "Never played" msgstr "Nár seinneadh riamh" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Ná tosaigh ag seinm riamh" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Amhráin nua" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Cuirfear rianta nua leis go huathoibríoch" #: library/library.cpp:92 msgid "Newest tracks" msgstr "Na rianta is nuaí" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Ar aghaidh" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Rian ar aghaidh" #: core/utilities.cpp:151 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Gan anailíseoir" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Gan íomhá sa chúlra" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Dada" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Gan cheangail" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Níl dóthain comhaltaí ann" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Níl sé suiteáilte" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Níl tú sínithe isteach" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Cineál fógra" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Fógraí" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Ag seinm anois" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Taispeáin an chéad cheann amháin" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Oscail %1 i líonléitheoir" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Oscail gléas" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Oscail comhad..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Oscail..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Theip ar an oibríocht" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Barrfheabhsaigh i gcomhair caighdeán" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Roghanna" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Eagraigh comhaid" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Eagraigh comhaid..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Ag eagrú comhaid" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Clibeanna bunaidh" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Roghanna eile" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Roghanna aschuir" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Forscríobh ar chomhaid atá ann cheana" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Sealbhóir" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Cóisir" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Focal faire" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Cuir ar sos" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Cuir athsheinm ar sos" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Curtha ar sos" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Seinn" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Seinn mura bhfuil aon rud eile ag seinm cheana féin" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Seinn/Cuir ar sos" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Athsheinm" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Roghanna an tseinnteora" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podchraoltaí" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Sainroghanna" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Sainroghanna..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Réamhshocraithe:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Brúigh cnaipe" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Réamhamharc" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Roimhe" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "An rian roimhe" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Clóbhuail eolas an leagain" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Dul chun cinn" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Cuir na hamhráin in eagar fánach" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Bainisteoir na Scuaine" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Cuir na rianta roghnaithe i scuaine" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Cuir an rian i scuaine" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Báisteach" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Amharcléiriú fánach" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Cealaigh i ndáiríre?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Athnuaigh na bealaí" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Athnuaigh na sruthanna" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Bain" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Bain gníomh" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Bain fillteán" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Athsheinn" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Athsheinn an t-albam" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Athsheinn an rian" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Athshocraigh" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rac" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Bain an gléas go sábháilte" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Cuir an íomhá i dtaisce" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Cuardaigh" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Cuardaigh Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Cuardaigh Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Cuardaigh i gcomhair aon rud" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Cuardaigh gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Cuardaigh iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Roghanna cuardaithe" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "An dara airde" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Aimsigh siar" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Aimsigh ar aghaidh" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Roghnaigh uile" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Ná roghnaigh ceann ar bith" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Roghnaigh dath an chúlra:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Roghnaigh íomhá don cúlra" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Roghnaigh dath an tulra:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Roghnaigh amharcléirithe" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Roghnaigh amharcléirithe..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Sraithuimhir" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Socraigh %1 go \"%2\"..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Socraigh an airde chuig faoin gcéad" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Socraigh luach do gach rian roghnaithe..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Aicearra" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Aicearra do %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Tá an t-aicearra do %1 ann cheana" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Taispeáin" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Taispeáin fógra nuair a athraím an airde" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Taispeáin gach amhrán" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Taispeáin na hamhráin ar fad" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Taispeáin roinnteoirí" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Taispeáin lánmhéid..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Taispeáin i siortaitheoir na gcomhad..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Taispeáin na cinn nach bhfuil clib orthu amháin" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Táispeáin deilbhín an tráidire" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Taispeáin/Folaigh" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Seinn go fánach" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Seinn na halbaim go fánach" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Seinn uile go fánach" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Seinn go fánach na rianta san albam seo" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Sínigh isteach" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Scoir" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Ag síniú isteach..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Ealaíontóirí cosúla" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Clúdach albaim beag" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Bog" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Rac bog" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Faisnéis an amhráin" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Faisnéis an amhráin" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Is dona linn" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Togh na hamhráin de réir" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Foinse" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Foinsí" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Breiseán Spotify" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Níl an breiseán Spotify suiteáilte" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Caighdeánach" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Réalt curtha leis" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Ag tosú %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Ag tosú..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Stad" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Stad i ndiaidh" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Stad i ndiaidh an rian seo" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Stad an athsheinm" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Stad ag seinm i ndiaidh an rian reatha" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Stadtha" #: core/song.cpp:431 msgid "Stream" msgstr "Sruth" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Clibeanna molta" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Achoimre" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Sár-ard (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Clibeanna ar barr" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Roghanna téacs" #: ui/about.cpp:74 msgid "Thanks to" msgstr "A bhuí le" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Clúdadh an albaim den amhrán atá á seinm faoi láthair" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "Ní comhadlann bailí í %1" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "Ní mór don dara luach a bheith níos mó ná an chéad cheann!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Níl an láithreán ar iarr tú air ann!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Ní íomhá é an láithreán a iarr tú air!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Tá amhráin san albam seo" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Tharla fadhbanna ag scriosadh cuid de na hamhráin. Níorbh fhéidir na comhaid a leanas a scriosadh:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Scriosfar na comhaid seo ón ngléas, an bhfuil tú cinnte gur mian leat leanúint ar aghaidh?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "An triú airde" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Níl an gléas ag feidhmiú i gceart" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Teideal" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Inniu" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Scoránaigh lánscáileán" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Líon iomlán na bearta aistrithe" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Rian" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "" #: core/song.cpp:426 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Múch" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL(anna)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Níorbh fhéidir %1 a íosluchtú (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Anaithnid" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Botún anaithnid" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Díshocraigh an clúdach" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Nuashonraigh gach podchraoladh" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Nuashonraigh an podchraoladh seo" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Ag nuashonrú" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Ag nuashonrú %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Ag nuashonrú %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Ag nuashonrú an leabharlann" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Úsáid" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Bain feidhm as Wii Remote" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Bain feidhm as tacair dhathanna shaincheaptha" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Bain feidhm as réamhshocrú an chórais" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Caite" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Comhéadan" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Ainm úsáideora" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Ealaíontóirí éagsúla" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Leagan %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Amharc" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Amharcléirithe" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Socruithe amharcléirithe" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Airde %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Láithreán gréasáin" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Seachtainí" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Nuair a thosaíonn Clementine" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: gníomhachtaithe" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: nasctha" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: dínasctha" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: cadhnra íseal (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Fuaim Windows Media" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Bliain" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Bliain - Albam" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Bliain" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Inné" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Tá tú ar tí na halbaim seo a leanas a íosluchtú" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Níl tú sínithe isteach." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Tá tú sínithe isteach mar %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Tá tú sínithe isteach." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Tig leat an dóigh a eagraítear na hamhráin sa leabharlann a athrú." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Níl cuntas Spotify Premium agat." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Is aoibhinn leat an rian seo" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Caithfear Clementine a atosú chun an teanga a athrú." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Níl faic i do leabharlann!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Do bhí d'ainm úsáideora nó focal faire mícheart." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "A náid" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "cuir %n amhráin leis" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "i ndiaidh" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "ó shin" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "agus" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "uathoibríoch" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "roimh" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "idir" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "an ceann is mó ar dtús" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "ina bhfuil" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "díchumasaithe" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "diosca %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "nach bhfuil ann" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "a chríochnaíonn le" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "cothrom le" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "comhadlann gpodder.net" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "níos mó ná" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "níos lú ná" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "na cinn is faide ar dtús" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "na cinn is nuaí ar dtús" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "ní ar an" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "na cinn is sine ar dtús" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "ar" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "roghanna" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "brúigh enter" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "bain %n amhráin" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "na cinn is giorra ar dtús" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "na cinn is lú ar dtús" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "a thosaíonn le" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "stad" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "rian %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/gl.po000066400000000000000000005050351260417502300236510ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Adrián Chaves Fernández , 2012-2013 # FIRST AUTHOR , 2010 # eununcasereiyo , 2012 # Óscar Pereira Rial , 2013 # Rodrigo Rega , 2014 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Galician (http://www.transifex.com/davidsansome/clementine/language/gl/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: gl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nPode marcar listas de reprodución como favoritas ao pulsar na icona da estrela correspondente\n\nAs súas listas favoritas gardaranse aquí" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " días" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr "pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " segundos" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " cancións" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 álbums" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 días" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "hai %1 días" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 en %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 listas de reprodución (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 escollidas de" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 canción" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 cancións" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 canción encontrada" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 cancións atopada (amosando %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 canción" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 descargado." #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Módulo Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 outros oíntes" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 reproducións totais" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n fallou" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n completado(s)" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n restante" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Aliñar Texto" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Centrar" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Personalizado" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "&Complementos" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Axuda" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "Esconder %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "Esconder..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Esquerda" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "&Música" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Ningunha" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "&Lista de reprodución" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Saír" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "&Modo de repetición" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Direita" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "&Modo aleatorio" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Axustar as columnas á xanela" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Ferramentas" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...e a todos os que contribuíron con Amarok" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 día" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 pista" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 pistas aleatorias" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Pasarse a preferente" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Si non está seleccionado, Clementine tentará gardar as súas puntuacións e outras estadísticas solo en unha base de datos separada e non modificará os seus arquivos.

Si está seleccionado, gardará as estadísticas na base de datos e tamén directamente en cada arquivo cada vez que se modifiquen.

Teña en conta que pode que non funcione con tódolos formatos, e que non hai un estándar para facelo, así que outros reprodutores de música poden non ser capaces de reelas.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Isto escribirá as valoracións e estatísticas das cancións nas etiquetas dos arquivos para as cancións de toda a súa biblioteca.

Isto non é necesario si a opción &Gardar as puntuacións nas etiquetas de ficheiro cando sexa posible" foi activada.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

As marcas de substitución comezan con %. Por exemplo: %artist %album %title.

\n

Se rodea seccións de texto que conteñen unha marca de substitución, esa sección non se amosará se a marca de substitución estará baleira.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Precisas ter unha conta Premium en Spotify" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Os clientes só poden conectarse introducindo o código correcto." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Unha lista de reproducións intelixente é unha lista dinámica de cancións extraídas da túa colección. Ela ofréceche distintos xeitos de seleccionar as cancións." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Unha canción será incluída na lista de reprodución se reúne estas condicións" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "Toda a gloria ao Hipnosapo" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Cancelar" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Acerca do %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Acerca de Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Acerca Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Detalles da conta" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Detalles da conta (preferente)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Acción" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Activar/desactivar Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Engadir un podcast" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Engadir un fluxo" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Engade unha nova liña se é suportado polo padrón de notificación" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Engadir acción" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Engadir outro fluxo…" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Engadir un cartafol…" #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Engadir un ficheiro" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Engadir arquivo ó transcodificador" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Engadir arquivo(s) ó transcodificador" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Engadir ficheiro..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Engadir ficheiros para converter" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Engadir cartafol" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Engadir cartafol..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Engadir novo cartafol" #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Engadir un podcast" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Engadir un podcast…" #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Engade un termo de busca" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Engadir a etiqueta de álbum" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Engadir a etiqueta de autor do álbum" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Engadir a etiqueta de intérprete" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Engadir autopuntuaxe da canción" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Engadir a etiqueta de compositor" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Engadir a etiqueta de disco" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Engadir a ruta do ficheiro" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Engadir a etiqueta do xénero" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Engadir etiqueta de grupo á canción" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Engadir a etiqueta da duración" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Engada etiqueta de intérprete de canción" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Engadir a etiqueta das escoitas" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Engadir puntuación á canción" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Engadir a etiqueta dos saltos" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Engadir a etiqueta do título" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Engadir a etiqueta da pista" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Engadir a etiqueta do ano" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Engadir fluxo..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Engadir a outra lista de reprodución" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Engadir á lista" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Engadir á cola" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Engadir acción wiimotedev" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Engadir..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Engadido o último mes" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Engadido esta semana" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Engadido o derradeiro ano" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Engadido hoxe" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Engadido os derradeiros tres meses" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Agrupamento avanzado…" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Despois de " #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Despóis de copiar..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Álbum" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Álbum (sonoridade ideal para todas as pistas)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Autor do álbum" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Portada" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Información do Álbum en Jamendo.com" #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Álbums con portada" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Álbums sen portada" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Todos os ficheiros" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Todos os álbums" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Todos os intérpretes" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Todos os ficheiros (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Todas as listas (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Todos os tradutores" #: library/library.cpp:98 msgid "All tracks" msgstr "Todas as cancións" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Permita a un cliente descargar música dende este ordenador." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Permitir descargas" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Permitir a codificación de centro e lado." #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Xunto aos orixináis" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Sempre ocultar a xanela principal" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Sempre amosar a xanela principal" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Sempre comezar reproducindo" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "É preciso un engadido adicional para usar Spotify en Clementine. Queres baixalo e instalalo agora?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Produciuse un erro ao cargar a base de datos de iTunes." #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Un erro aconteceu escrebendo metadados a '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Produciuse un erro non especificado." #: ui/about.cpp:85 msgid "And:" msgstr "E:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Anoxado" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Aparencia" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Engadir ficheiros/URL á lista de reprodución" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Engadir á lista actual" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Engadir á lista" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Aplicar compresión para evitar clipping" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Está certo que quer apagar o \"%1\" predefinido?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Está seguro de que quere restablecer as estatísticas da canción?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Seguro que quere escribir as estadísticas das cancións nos ficheiros para tódalas cancións na biblioteca?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Intérprete" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Información do intérprete" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Etiquetas do intérprete" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Iniciais do intérprete" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Formato do son" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Autenticazón fallida" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Autor" #: ui/about.cpp:68 msgid "Authors" msgstr "Autores/as" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Automático" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Actualización automática" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Expandir automaticamente as categorías únicas na árbore da colección." #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Dispoñíbel" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Taxa de bits media" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Tamaño medio das imaxes" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "Podcasts da BBC" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Fluxos ambientais" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Cor de fondo" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Imaxe de fondo" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Opacidad de fondo" #: core/database.cpp:648 msgid "Backing up database" msgstr "Gardando unha copia de seguranza da base de datos…" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Equilibrio" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Analisador da barra" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Azul básico" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Tipo de son básico" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Comportamento" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Mellor" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Biografía de %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Taxa de bits" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Taxa de bits" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Analisador de blocos" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Tipo de bloque" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Cantidade de blur" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Corpo" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Analisador de Boom" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Examinar..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Duración de almacenado en búfer" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Almacenando no búfer…" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Pero as seguintes orixes están desactivadas:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Botóns" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Compatibilidade con follas CUE" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Cancelar" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Cambiar a portada" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Cambiar o tamaño da letra…" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Cambiar o modo de repetición" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Cambiar combinación de teclas" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Cambiar o modo aleatorio" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Cambiar o idioma" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Se cambia a opción sobre a reprodución nunha única canle, o cambio será efectivo a partir da seguinte canción." #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Buscar novos episodios" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Verificar se há actualizazóns..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Escolla un nome para a súa lista intelixente" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Elixir automaticamente" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Elixir unha cor…" #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Escolla o tipo de letra…" #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Elixir da lista" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Escolla o criterio polo que se ordenará a lista, e a cantidade de cancións que a conformarán." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Escolla o cartafol no que descargar os podcasts" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Escolla os sitios web nos que se buscarán as letras das cancións." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Clásica" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Facendo limpeza…" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Limpar" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Baleirar a lista de reprodución" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Erro de Clementine" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Naranxa Clementine" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Visualización de Clementine" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine pode converter automaticamente a música que copie a este dispositivo nun formato que poida reproducir." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine pode reproducir música subida por vostede ao servizo Box." #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine pode reproducir a súa música subida a Dropbox." #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine pode reproducir a súa música subida a Google Drive." #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine pode amosar unha mensaxe cando a pista cambie." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine pode sincronizar as súas listas de subscrición con resto dos seus computadores e outros aplicativos de podcast. Cree unha conta." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine non puido cargar ningunha visualización projectM. Asegúrese de que Clementine foi instalado correctamente." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Visor de imaxes de Clementine" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine non puido atopar resultados para este ficheiro." #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine atopará música en:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Prema aquí para engadir música" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Pulse aquí para marcar esta lista de reprodución como favorita e engadila ao panel «Listas de reprodución» da barra lateral" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Prema aquí para cambiar entre o tempo restante e o tempo total." #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Ao premer no botón de «Acceder» abrirase un navegador web. Debe volver a Clementine despois de identificarse." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Pechar" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Pechar a lista" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Cerrar visualización" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Se pecha esta xanela deterase a descarga." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Se pecha esta xanela deterase a busca de portadas de álbums." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Clube" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Cores" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Lista separada por comas de :, onde o nivel será un valor do 0 ao 3." #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Comentario" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Completar as etiquetas automaticamente." #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Completar as etiquetas automaticamente…" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Compositor" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Configurar %1…" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Configura Maganatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Configura atallos " #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Configura Spotify" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Configurar Subsonic…" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Configurar a busca global…" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Configurar a biblioteca..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Configurar os podcasts…" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Configurar..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Conecte controis de Wii mediante as accións de activar e desactivar." #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Conectar dispositivo" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Conectado con Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Conexión rexeitada polo servidor, comprobe o URL do servidor. Por exemplo: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Conexión fora de tempo, comprobe o URL do servidor. Por exemplo: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Consola" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Taxa de bits constante" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Converter toda a música" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Converter calquera música que este dispositivo non poda reproducir" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Copiar no portapapeis" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Copiar para o dispositivo" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Copiar para a biblioteca" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Dereitos de explotación" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Non foi posíbel conectar con Subsonic, comprobe o URL do servidor. Por exemplo, «http://localhost:4040/»." #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Non podes crear o elemento GStreamer «%1». Asegúrese de que ten instalados os complementos GStreamer." #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Non é posíbel atopar un multiplexor para %1. Asegúrese de que ten instalado os complementos GStreamer necesarios." #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Non é posíbel atopar un codificador para %1. Asegúrese de que ten instalado os complementos GStreamer necesarios." #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Non se puido abrir o arquivo externo %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Xestor de portadas" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Covert art da imaxen incorporada" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "As portadas cargáronse automaticamente de %1." #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Covert art desmontado manualmente" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Covert art non montado" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Covert art montado de %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Portadas de %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Desvanecer ao cambiar de canción automaticamente." #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Desvanecer ao cambiar de canción manualmente." #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Personalizado" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Imaxe personalizada:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Configuración de mensaxes personalizada" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Personalizado…" #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "Ruta a DBus" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dance" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Detectáronse irregularidades na base de datos. Para informarse sobre como recuperar a súa base de datos, infórmese en https://code.google.com/p/clementine-player/wiki/DatabaseCorruption (en inglés)." #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Data de criazón" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Data de alterazón" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Dias" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "&Predeterminado" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Diminuír o volume nun 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Diminuír o volume nun por cento" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Diminuír o volume" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Imaxe de fondo predeterminada" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Restablecer" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Atraso entre as visualizacións" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Eliminar" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Eliminar os datos descargados" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Eliminar arquivos " #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Eliminar do dispositivo" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Eliminar do disco" #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Eliminar os episodios vistos" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Eliminar predefinido" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Elimminar lista de reprodución intelixente" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Eliminar os ficheiros orixinais" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Eliminando os ficheiros…" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Quitar as pistas seleccionadas da cola" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Quitar da cola" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Destino" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Detalles…" #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Dispositivo" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Propiedades do dispositivo" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Nome do dispositivo" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Propiedades do dispositivo…" #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Dispositivos" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Quixo dicir" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Importación dixital" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Contrasinal da importación dixital" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Nome de usuario da importación dixital" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Conexión directa a internet" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Cartafol" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Desactivar a duración" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Desactivar a xeración da barra do ánimo." #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Disco" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Transmisión entrecortada" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Opcións de visualización" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Amosar a mensaxe en pantalla" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Analizar completamente a biblioteca" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Non converter nada" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Non sobrescribir" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Non repetir" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Non amosar en varios intérpretes" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Non desordenar" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Non deter!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Doar" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Prema dúas veces para abrir" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Ao premer dúas veces unha canción…" #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Descargar %n episodios…" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Cartafol de descargas" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Descargar os episodios en" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Grupo da descarga" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Descargar novos episodios automaticamente" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Cola de descarga" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Descargar o programa para Android" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Descargar o álbum" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Descargar o álbum…" #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Descargar o episodio" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Descargar…" #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Descargando (%1%)…" #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Descargando o cartafol de Icecast…" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Descargando o catálogo de Jamendo…" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Descargando o catálogo de Magnatune…" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Descargando o complemento de Spotify…" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Descargando metadatos…" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Arrastre para cambiar de posición" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "O modo dinámico está activado" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Mestura aleatoria dinámica" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Editar a lista intelixente…" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Editar etiqueta \"%1\"..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Editar etiqueta..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Editar etiquetas" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Editar información da pista" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Editar información da pista..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Editar informacións das pistas..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Editar..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Activar a compatibilidade con controis de Wii." #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Activar o ecualizador." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Activar os atallos unicamente cando Clementine teña o foco." #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Activar as seguintes orixes para incluílas nos resultados das buscas. Os resultados amosaranse na orde indicada." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Activar a sincronización con Last.fm." #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Complexidade da codificación" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Calidade do motor de codificación" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Modo de codificación" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Escriba un enderezo URL" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Escriba un enderezo URL para descargar a imaxe da portada de internet:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Escriba un nome de arquivo para as portadas exportadas (sen extensión):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Escriba un novo nome para a lista" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Introduza uns criterios de busca na parte de arriba para atopar música no seu computador ou en internet." #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Introduza uns criterios de busca abaixo para atopar podcasts en iTunes Store." #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Introduza uns criterios de busca abaixo para atopar podcasts en gpodder.net." #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Introduza aquí os criterios de busca." #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Escriba o enderezo URL dunha radio de internet:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Escriba o nome do cartafol" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Introducir esta IP na App para conectar con Clementine." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Colección completa" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Ecualizador" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Equivalente a «--log-levels *:1»." #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Equivalente a «--log-levels *:3»." #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Erro" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Erro conectando dispositivo MTP" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Erro ao copiar as cancións" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Erro ao eliminar as cancións" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Erro ao baixar o engadido de Spotify" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Non foi posíbel cargar %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Erro ao cargar a lista de reprodución di.fm" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Erro ao procesarr %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Non foi posíbel cargar o CD de son." #: library/library.cpp:68 msgid "Ever played" msgstr "Reproducidas algunha vez" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Cada 10 minutos" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Cada 12 horas" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Cada 2 horas" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Cada 20 minutos" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Cada 30 minutos" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Cada 6 horas" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Cada hora" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Agás entre pistas do mesmo álbum ou na mesma folla CUE." #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Portadas existentes" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Expandir" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Caduca o %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Exportar portadas" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Exportar portadas" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Exportar portadas descargadas" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Exportar portadas incrustadas" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Exportación acabada" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Exportada %1 portada de %2 (%3 saltada/s)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Esvaecer gradualmente ó pausar / aparecer gradualmente ó reanudar" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Desvanecer ao deter unha pista." #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Desvanecendo" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Duración do desvanecimento" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Non foi posíbel descargar o directorio." #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Non foi posíbel descargar os podcasts." #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Non foi posíbel cargar o podcast." #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Non foi posíbel analizar o XML da fonte RSS." #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Rápido" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Pistas favoritas" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Obter as portadas que falten" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Descargar automaticamente" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Completouse a descarga" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Descargando a biblioteca de Subsonic" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Produciuse un erro ao descargar a portada" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Extensión do ficheiro" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Formatos de ficheiro" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Nome do ficheiro" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Nome do ficheiro (sen camiño)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Tamaño do ficheiro" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Tipo de ficheiro" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Ruta" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Ficheiros" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Ficheiros a converter" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Atope cancións na súa biblioteca que coincidan cos criterios indicados." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Obtendo un identificador para a canción…" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Rematar" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Primeiro nivel" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "FLAC" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Tamaño da letra" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Por cuestións legais, para a compatibilidade con Spotify debe instalar un complemento que se distribúe por separado." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Forzar a codificación dunha canle." #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Esquecer o dispositivo" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Ao esquecer un dispositivo, desaparecerá desta lista, e Clementine terá que volver analizar todas as súas cancións a próxima vez que o conecte." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Formulario" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Formato" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Taxa de fotogramas" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Fotogramas por búfer" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Conxelado" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Full Bass" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Full Bass + Treble" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Full Treble" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Xeral" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Configuración xeral" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Xénero" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Descargando as canles…" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Descargando os fluxos…" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Noméeo:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Ir" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Ir á seguinte lapela de lista" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Ir á lapela anterior de lista" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Descargáronse %1 das %2 portadas (quedaron %3 por descargar)." #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Marcar en gris as cancións da lista que non existan." #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Agrupar a biblioteca por…" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Agrupar por" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Agrupar por álbum" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Agrupar por intérprete" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Agrupar por intérprete/álbum" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Agrupar por intérprete/ano" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Agrupar por Xénero/Álbum" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Agrupar por xénero/intérprete/álbum" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Agrupación" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "A páxina web non contiña ningunha fonte RSS." #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "Recibiuse o código de estado de HTTP 3xx sen un URL. Comprobe a configuración do servidor." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "HTTP proxy" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Contento" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Información do hardware" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "A información do hardware está somente disponíbel cando o dispositivo está conectado" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Alto" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Alto(%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Alto (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Anfitrión non atopado, comprobe o URL do servidor. Por exemplo: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Horas" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hipnosapo" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Non teño unha conta Magnatune" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Ícone" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Ícones na cima" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Identificando a canción…" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Se continúas, o dispositivo poderá traballar moi amodo e as cancións copiadas poderían non ser reproducidas" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Se coñece o enderezo URL dun podcast, introdúzao a continuación e prema «Ir»." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Ignorar o artigo inglés, «The», no nome dos intérpretes." #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Imaxes(*.png *.jpg *.jpeg *.bmp *.gif *xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Imaxes(*.png *.jpg *.jpeg *.bmp *xpm *.pbm *.pgm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "En %1 días" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "En %1 semanas" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "No modo dinámico, engadiranse novas pistas á lista a medida que se reproduzan as que hai." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Inbox" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Incluír a portada do álbum na notificación." #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Incluír todas as cancións" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "A versión do protocolo REST de Subsonic é incompatíbel. Debe anovar o cliente." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "A versión do protocolo REST de Subsonic é incompatíbel. Debe anovar o servidor." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "A configuración está incompleta. Asegúrese de que encheu todos os campos." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Incrementar o volume ao 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Incrementar o volume nun por cento" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Incrementar o volume" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Indexando %1…" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Información" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Inserir" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Instalado" #: core/database.cpp:585 msgid "Integrity check" msgstr "Comprobación da integridade" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Fornecedores de internet" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Chave non válida da API" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Formato inválido" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Método inválido" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Parámetros inválidos" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Recurso inválido especificado" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Servizo Inválido" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Chave de sesón non válida" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Pistas máis escoitadas de Jamendo" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Os máis en Jamendo" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo Top neste mes" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo Top nesta semana" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Base de dados de Jamendo" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Ir á pista que se está a reproducir" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Gardar botóns para %1 second..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Gardar botóns para %1 seconds..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Continuar a execución en segundo plano ao pechar a xanela." #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Gardar os arquivos orixinais" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Idioma" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Portátil/Auscultadores" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Large Hall" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Portada grande do álbum" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Barra lateral larga" #: library/library.cpp:80 msgid "Last played" msgstr "Últimos en soar" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm está ocupada neste momento, por favor tente mais tarde en breve" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Contrasinal de Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Número de escoitas de Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Etiquetas de Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Nome de usuario de Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Wiki de Last.fm" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Pistas en peor estima" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Esquerda" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Duración" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Biblioteca" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Agrupamento avanzado da biblioteca" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Nota de análise da biblioteca" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Busca na biblioteca" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Límites" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Ao Vivo" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Cargar" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Cargar a portada dun URL" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Cargar a portada dun URL…" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Cargar a portada do computador" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Cargar a portada do computador…" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Cargar unha lista" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Cargar unha lista…" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Cargando o dispositivo MTP…" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Cargando a base de datos do iPod…" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Cargando a lista intelixente…" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Cargando as cancións…" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Cargando o fluxo…" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Cargando as pistas…" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Cargando a información das pistas…" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Cargando…" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Carga ficheiros ou enderezos URL, substituíndo a lista actual." #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Acceder" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Non se puido acceder." #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Perfil de predición a longo prazo (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Gústame" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Baixa (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Baixa (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Perfil de pouca complexidade (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Letras" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Letra de %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Descarga de Magnatune" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Rematou a descarga de Magnatune." #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Perfil principal (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Que así sexa!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Descargar a lista para usala sen internet" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Resposta mal formada" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Configuración manual do proxy." #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Manualmente" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Fabricante" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Marcar como escoitada" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Marcar como nova" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Coincidencia con todos os termos (AND)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Coincidencia con algúns termos (OR)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Taxa de bits máxima" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Medio (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Medio (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Tipo de asociación" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Taxa de bits mínima" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Predefinicións de Missing projectM" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Modelo" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Vixiar is cambios na colección." #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Reprodución nunha única canle." #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Meses" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Ánimo" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Estilo da barra do ánimo" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Barras do ánimo" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "Máis tocados" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Ponto de montaxe" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Pontos de montaxe" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Mover para abaixo" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Mover para a biblioteca..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Mover para acima" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Música" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Colección de música" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Silencio" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Música persoal" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "As miñas recomendazóns" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Nome" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Opcións de nomenclatura" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Banda estreita (BE)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Proxy de rede" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Mando por rede" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Nunca" #: library/library.cpp:74 msgid "Never played" msgstr "Nunca Reproducido" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Nunca comezar reproducindo" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Novo cartafol" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Nova lista de reprodución" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Nova lista de reprodución intelixente" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Novas cancións" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Engadir as novas pistas automaticamente." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Últimas pistas" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Próximo" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Seguinte pista" #: core/utilities.cpp:151 msgid "Next week" msgstr "A vindeira semana" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Sen analisador" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Non hai imaxe de fondo." #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Non se exportaron portadas." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Non hai bloques grandes." #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Non se atoparon resultados. Baleira a caixa de busca para volver amosar a lista de reprodución enteira." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Non hai bloques pequenos." #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Nengún" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Nengunha das cancións seleccionadas é axeitada para sera copiada a un dispositivo " #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Normal" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Tipo de bloque normal" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Non dispoñíbel encanto se use unha lista de reprodución dinámica" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Non conectado" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Conteúdo insuficiente" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Fans insuficientes" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Membros insuficientes" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Non ten veciños dabondo." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Non instalado" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Desconectado do servizo." #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Desmontado. Faga dobre clic para montalo." #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Tipo de notificación" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Notificacións" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Agora sonando" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Pré-visualizar no OSD" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Só aceptar conexións de clientes dentro dos intervalos de enderezos IP:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Admitir soamente conexións dende a rede local" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Amosar só o primeiro" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Opacidade" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Abrir %1 no navegador" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Abrir un CD de &son…" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Abrir un ficheiro OPML" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Abrir un ficheiro OPML…" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Abrir o dispositivo" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Abrir un ficheiro…" #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Abrir en Google Drive" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Abrir nunha nova lista" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Abrir…" #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "A operazón fallou" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Optimizar en prol da taxa de bits" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Optimizar en prol da calidade" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Configuración…" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Organizar os ficheiros" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Organizar os ficheiros…" #: core/organise.cpp:73 msgid "Organising files" msgstr "Organizando os ficheiros…" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Etiquetas orixinais" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Outras opcións" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Saída" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Dispositivo de saída" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Opcións de saída" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Sobrescribir todo" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Substituír os ficheiros existentes" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Sobrescriba os máis pequenos soamente" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Dono" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Analizando o catálogo de Jamendo" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Festa" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Contrasinal" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Pausa" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Pausa" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Pausado" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Intérprete" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Pixel" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Barra lateral simple" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Reproducir" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Escoitas" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Reproducir se está detido, pausar se está a reproducir" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Reproducir se non hai nada reproducíndose aínda." #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Reproducir a ª pista da lista" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Reproducir/Pausa" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Reprodución" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Opczóns do player" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Lista de reprodución" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Lista de músicas terminada" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Opcións da lista de reprodución" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Tipo de lista" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Listas de reprodución" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Peche o navegador web e volva a Clementine." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Estado do complemento:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcasts" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Duración do diálogo" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Porto" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Preeamplificazón" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Configuración" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Configuración…" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Rutas as ficheiros da portada, separados por comas e en orde de preferencia." #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Formato de son preferido" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Taxa de bits preferida" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Formato preferido" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Tipo de son preferente" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Preestablecido:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Prema unha combinación de botóns a empregar para" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Prema unha tecla" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Prema unha combinación de teclas a empregar para %1…" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Opcións da pantalla xeitosa" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Vista previa" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Anterior" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Pista anterior" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Imprime a información da versión" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Perfil" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Progreso" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Preme o botón Wiremote" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Pon as cancións aleatoriamente" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Investigando no dispositivo" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Xestor da fila" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Engadir á lista" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Engadir á lista" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (mesmo volume para todas as pistas)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Chuvia" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Visualización aleatoria" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Califica a canción actual 0 estrelas" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Califica a canción actual 1 estrela" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Califica a canción actual 2 estrelas" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Califica a canción actual 3 estrelas" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Califica a canción actual 4 estrelas" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Califica a canción actual 5 estrelas" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Avaliación" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Cancelar mesmo?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Excedeuse o límite de redireccións, comprobe a configuración do servidor." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Actualizar o catálogo" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Actualizar as canles" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Actualizar a lista de emisoras" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Actualizar os fluxos" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Lembrar o movemento do control de Wii" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Lembrar por derradeira vez" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Remover" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Eliminar acción" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Eliminar as entradas duplicadas da lista" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Eliminar cartafol" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Quitar da música persoal" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Eliminar da lista de reprodución" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Eliminar lista de reproducción" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Eliminar listas de reprodución" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Renomear lista de reprodución" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Renomear lista de reprodución" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Volver numerar as pistas na seguinte orde…" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Repetir" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Repetir álbum" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Repetir lista de reprodución" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Repetir a pista" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Substituír a actual lista de reprodución" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Substituír lista de reprodución" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Substituír espacios con barras-baixas" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Repetir mellora" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Modo Replay Gain" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "preencher novamente" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Requerir código de autenticación" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "reestablelecer" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Restabelecer conta de reproducións" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Reiniciar a pista, ou cambiar a anterior se non transcorreron 8 segundos dende o inicio." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Limitado a caracteres ASCII" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Retomar a reprodución ó inicio" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Volver a Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Dereita" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Executar" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "Proxy SOCKS" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Erro do protocolo de enlace SSL, comprobe a configuración do servidor. A opción de SSLv3 podería solucionar algúns erros temporalmente." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Retirar o dispositivo de maneira segura." #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Retirar o dispositivo de maneira segura tras a copia." #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Frecuencia de mostraxe" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Frecuencia de mostraxe" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Gardar os ficheiros .mood na súa biblioteca de música." #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Gardar a portada do álbum" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Almacenar a portada…" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Gardar imaxe" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Gardar lista de reprodución..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Salvar os axustes" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Gardar as puntuacións nas etiquetas de ficheiro cando sexa posible" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Gardar as estadísticas nas etiquetas de ficheiro cando sexa posible" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Gardar esta emisión na lapela Internet" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Gardando as estadísticas nos ficheiros" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Gardando cortes" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Perfil de taxa de mostra escalábel (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Tamaño de escala" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Puntuación" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Enviar as miñas escoitas" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Buscar" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Buscar nas emisoras Icecast" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Buscar en Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Buscar en Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Buscar en Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Buscar portadas de álbums…" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Buscar calquera cousa" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Buscar en gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Buscar en iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Modo búsqueda" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Opcións de búsqueda" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Resultados da busca" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Termos de búsqueda" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Segundo nível" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Atrasar" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Avanzar" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Avanzar ou atrasar unha cantidade de tempo a pista actual." #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Situar o punto de reprodución da pista actual nunha posición determinada." #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Seleccionalo todo" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Non seleccionar nengún" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Escoller a cor de fondo:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Escoller a imaxe de fondo" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Escoller a posíbel mellor correspondencia" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Escoller a cor principal:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Seleccionar as visualizacións" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Seleccionar as visualuzacións..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Número de serie" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "URL do servidor" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Detalles do servidor" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Servizo Inválido" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Colocar %1 para \"%2\"..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Axusta o volume a por cento" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Axusta o volume para todos os cortes seleccionados" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Configuración" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Atallo" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Atallo para %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Atallo para %1 xa existe" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Mostrar" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Mostrar OSD" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Mostrar unha animación escintilante no actual corte" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Amosar unha barra do ánimo na barra de progreso da pista." #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Amosar unha notificación nativa do ambiente de escritorio." #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Mostrar unha notificación ao mudar o modo repetición/aleatorio" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Mostrar unha notificación ao mudar o volume" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Mostrar unha xanela emerxente da bandexa do sistema " #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Amosar unha pantalla xeitosa" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Mostrar" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Amosar todas as cancións" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Mostrar todas as cancións" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Amosar as portadas da biblioteca" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Amosar as divisións" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Mostrar tamaño completo " #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Mostrar no buscador de arquivos" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Amosar en varios intérpretes" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Amosar a barra do ánimo." #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Mostrar somente os duplicados" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Só amosar o que non estea etiquetado." #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Fornecer suxestións para a busca." #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Amosar o botón para enviar as escoitas na xanela principal." #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Amosar unha icona na área de notificación." #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Indicar que orixes están activas e cales están inactivas." #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Amosar/agochar" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Desordenar" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Desordenar os álbums" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Desordenalo todo" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Desordenar a lista" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Desordenar as pistas do álbum actual" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Acceder" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Saír" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Accedendo…" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Intérpretes semellantes" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Tamaño" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Tamaño:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Saltar para trás na lista de músicas" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Saltar a conta" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Saltar cara adiante na lista de reprodución" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Portada pequena do álbum" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Barra lateral pequena" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Lista de reprodución intelixente" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Listas de reprodución intelixentes" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Información da canción" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Información" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Espectrograma" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Lamentámolo" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Ordenar polo nome do xénero" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Ordenar pola popularidade do xénero" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Ordenar polo nome da emisora" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Ordenar as cancións por:" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Orde" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Orixe" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Orixes" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Produciuse un erro ao intentar acceder a Spotify." #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Complemento de Spotify" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "O complemento de Spotify non está instalado." #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Estándar" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Vixiado" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Reproducir a playlist actualmente reproducindo" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Iniciar a conversión" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Comece a escribir algo na caixa de busca da parte superior para ir enchendo esta lista de resultados." #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Iniciando %1…" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Iniciando…" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Deter" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Deter tras" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Deter a reprodución despois da pista actual" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Deter" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Deter despois da pista actual" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Detido" #: core/song.cpp:431 msgid "Stream" msgstr "Fluxo" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Necesitará unha licenza válida para continuar usando o servidor de Subsonic pasado o período de proba de 30 días." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Relación co fluxo:" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Subscritores" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Accedeuse correctamente." #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "%1 almacenouse correctamente." #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Etiquetas suxeridas" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Resumo" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Moi alta (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Moi alta (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Formatos dispoñíbeis" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Sincronizar as estadísticas nos ficheiros agora" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Sincronizando coa caixa de entrada de Spotify" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Sincronizando coa lista de reprodución de Spotify" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Sincronizando cos cortes mais exitosos en Spotify" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Cores do sistema" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Abas na cima" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Buscador de etiquetas" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Taxa de bits de destino" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Tecno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Opcións do texto" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Agradecimentos a" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "O \"%1\" comando non pode ser iniciado" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Portada do álbum da canción actual" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "O directorio %1 non é valido" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "O valor segundo debería ser maior que o primeiro" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "O sitio que procuras non existe" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "O sitio que procuras non é unha imaxe!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Acabou o período de proba do servidor de Subsonic. Faga unha doazón para conseguir unha chave de acceso. Visite subsonic.org para máis información." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "A súa nova versión de Clementine require volver analizar a súa biblioteca debido ás seguintes novas funcionalidades:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Hai outras cancións neste álbum" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Houbo un problema de comunicación con gpodder.net." #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Houbo un problema coa descarga de datos de Magnatune." #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Houbo un problema coa análise dos datos enviados por iTunes Store." #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Houbo problemas copiando algunhas cancións. Os seguintes arquivos non puderon ser copiados:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Houbo problemas eliminando algunhas cancións. Os seguintes arquivos non puderon ser eliminados:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Estes arquivos serán eliminados do dispositivo, estás seguro de querer continuar?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Estes arquivos serán borrados permanentemente do disco, está seguro de querer continuar?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Estes cartafoles serán escaneados para compor a túa libraría" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Esta configuración emprégase para toda conversión de música." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Terceiro nivel" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "A acción xerará unha base de datos que podería chegar aos 150 MiB.\nQuere continuar?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Esta portada non está dispoñíbel no formato solicitado." #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "O dispositivo debe conectarse e abrirse para que Clementine poida saber que formatos de ficheiro permite." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "O ficheiro é compatíbel cos seguintes formatos de ficheiro:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "O dispositivo non vai funcionar correctamente." #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Trátase dun dispositivo MTP. A súa copia de Clementine construíuse sen compatibilidade con este tipo de dispositivos." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Trátase dun iPod. A súa copia de Clementine construíuse sen compatibilidade con este tipo de dispositivos." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "É a primeira vez que conecta o dispositivo. Clementine analizará o seu contido para buscar ficheiros de música; pode tardar." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Esta opción pode ser cambiada nas preferencias de \"Comportamento\"" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "O fluxo só está dispoñíbel para subscritores de pago." #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Clementine non é compatíbel con este tipo de dispositivo: %1." #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Título" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Hoxe" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Alternar o OSD xeitoso" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Pantalla completa" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Alternar o estado da cola" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Alternar o envío de escoitas" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Alternar a visibilidade da pantalla xeitosa." #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Mañá" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Demasiadas redireccións" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Mellores pistas" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Álbums totais:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Bytes enviados" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Solicitudes de rede" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Pista" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Conversión de música" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Rexistro de conversión" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Convertendo…" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Convertendo %1 ficheiro empregando %2 fíos." #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Opcións de conversión" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Apagar" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Banda ultralarga (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Non é posíbel descargar %1 (%2)." #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Descoñecido" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Tipo de contido descoñecido" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Erro descoñecido" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Anular a escolla da portada" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Anular a subscrición" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Vindeiros concertos" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Actualizar todos os podcasts" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Actualizar os cartafoles da biblioteca con cambios" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Actualizar a biblioteca ao iniciar Clementine." #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Actualizar o podcast" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Actualizando…" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Actualizando %1…" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Actualizando (%1%)…" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "A actualizar a biblioteca" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Utilizazón" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Empregar a etiqueta do autor do álbum cando estea dispoñíbel." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Empregar os atallos de Gnome." #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Empregar os datos de reprodución da ganancia cando estean dispoñíbeis." #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Usar SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Empregar un mando de Wii." #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Empregar unha combinación de cores personalizada." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Empregar unha mensaxe personalizada para as notificación." #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Utilice un telecontrol de rede" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Empregar autenticación." #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Empregar o motor de xestión da taxa de bits." #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Empregar o modo dinámico." #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Empregar notificacións para informar do estado do mando de Wii." #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Empregar unha redución temporal do ruído." #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Empregar a configuración do sistema." #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Empregar a combinación de cores do sistema." #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Empregar a configuración do proxy do sistema." #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Empregar a normalización do volume." #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Empregado" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Interface de usuario" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Usuario" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Ao empregar o menú para engadir unha canción…" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "MP3 VBR" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Taxa de bits variábel" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Varios intérpretes" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Versón %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Vista" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Modo de visualización" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Visualizacións" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Configuración das visualizacións" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Detección da voz" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Volume %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Advírtame ao pechar unha pestana de lista de reprodución" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Sitio web" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Semanas" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Ao iniciar Clementine" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Ao buscar a portada dun álbum, Clementine comezará polas imaxes que conteñan as seguintes palabras.\nSe non hai coincidencias, empregarase a imaxe máis grande do directorio." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Cando a lista estea baleira…" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Por que non intenta con…" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Banda larga (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Mando %1 da Wii: activado." #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Mando %1 da Wii: conectado." #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Mando %1 da Wii: batería nas últimas (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Mando %1 da Wii: desactivado." #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Mando %1 da Wii: desconectado." #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Mando %1 da Wii: batería baixa (%2%)." #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Son de Windows Media" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Sin portada:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Quere mover tamén o resto das cancións do álbum a «Varios Intérpretes»?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Quere realizar unha análise completa agora?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Escribir as estadísticas de tódalas cancións nos ficheiros" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "O nome de usuario ou contrasinal non son correctos." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Ano" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Ano - Álbum" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Anos" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Onte" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Está a piques de descargar os seguintes álbums:" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Está a piques de eliminar %1 lista/s de reprodución dos seus favoritos, está seguro?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Está a punto de eliminar permanentemente unha lista de reprodución que non está entre as súas favoritas.: a lista eliminarase (esta acción non pode ser desfeita). \nEstá seguro de querer continuar?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Desconectado do servizo." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Accedeu ao servizo como %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Conectado ao servizo." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Pode modificar a forma en que se organizan as cancións da biblioteca." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Pode escoitar de balde sen unha conta, pero os membros preferentes poden escoitar fluxos de maior calidade sen publicidade." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Pode escoitar de balde as cancións de Magnatune sen ter unha conta. Se adquire unha conta non terá que escoitar as mensaxes ao final de cada pista." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Pode escoitar fluxos ambientais e outro tipo de música ao mesmo tempo." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Pode empregar os mandos da Wii para controlar Clementine. Para máis información, consulte o wiki de Clementine.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Carece vostede dunha conta preferente de Spotify." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Carece vostede dunha subscrición activa." #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Desconectouse do servizo Spotify, volva introducir o contrasinal no diálogo de configuración." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Desconectouse do servizo Spotify, volva introducir o contrasinal." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Gústalle esta pista." #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Terá que reiniciar Clementine para que o cambio de idioma teña efecto." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "A túa dirección IP:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "A súas credenciais da Last.fm son incorrectas." #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "A súas credenciais da Magnatune son incorrectas." #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "A biblioteca está baleira!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Fluxos de radio persoais" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Escoitas: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "O seu sistema non é compatíbel con OpenGL, así que as visualizacións non estarán dispoñíbeis." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "O usuario ou contrasinal non eran correctos." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Cero" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "engadir %n cancións" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "despois de" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "hai" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "e" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "automático" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "antes de" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "entre" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "primeiro o meirande" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "contén" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "desactivado" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "disco %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "non contén" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "remata en" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "é igual a" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "Directorio de gpodder.net" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "maior que" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "na última" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "menor que" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "primeiro o máis longo" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "mover %n cancións" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "primeiro o máis novo" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "distinto de" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "non na última" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "non en" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "primeiro o máis vello" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "en" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "opcións" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "ou escanear o código QR!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "prema Intro" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "retirar %n cancións" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "primeiro o máis curto" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "desordenar as cancións" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "primeiro o máis pequeno" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "ordenar as cancións" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "comeza por" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "deter" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "pista %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/he.po000066400000000000000000005164371260417502300236530ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Chen Kasirer , 2015 # Elia Shreidler , 2013 # FIRST AUTHOR , 2010 # matanya , 2012 # onespace , 2014 # thristle666 , 2014 # Uri Damsker , 2013 # Yaron Shahrabani , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Hebrew (http://www.transifex.com/davidsansome/clementine/language/he/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: he\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "ימים" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "קילו בתים לשניה" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " מילישניות" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " נק׳" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " שניות" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " שירים" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 שירים)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 אלבומים" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 ימים" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "לפני %1 ימים" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 על %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 רשימות השמעה (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "נבחרו %1 מתוך" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "שיר אחד (%1)" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 שירים" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "נמצאו %1 שירים" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "נמצאו %1 שירים (מוצגים %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 רצועות" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 הועברו" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: המודול Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 מאזינים אחרים" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 השמעות" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n נכשלו" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n הושלמו" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n נותרו" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "יישור &טקסט" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "מ&רכז" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "ה&תאמה אישית" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "תוספות" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "ע&זרה" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "הסתרת %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "ה&סתרה..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&שמאל" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "מוזיקה" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&ללא" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "רשימת השמעה" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "י&ציאה" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "מצב חזרה" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&ימין" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "מצב ערבוב" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&מתיחת עמודות בהתאמה לחלון" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&כלים" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(באופן שונה על פני מספר שירים)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "וכל התורמים ל־Amarok" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "יום אחד" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "רצועה אחת" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 רצועות אקראיות" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "שדרוג לגרסת הפרמיום כעת" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

מילים שמורות מתחילות ב־%, לדוגמה: %artist %album %title

\n\n

סגירת טקסט בסוגריים מסולסלות משני צדיו תגרום להסתרתו במקרה שהטקסט מכיל מילה שמורה אשר לא מכילה כלום.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "נדרש חשבון פרימיום של Spotify." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "לקוח יכול להתחבר רק אם הוזן הקוד הנכון." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "רשימת השמעה חכמה היא רשימה דינמית של שירים שמגיעים מספריית המוזיקה שלך. ישנם סוגים שונים של רשימות השמעה חכמות המציעות דרכים שונות לבחירת שירים." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "שיר יכלל ברשימת ההשמעה אם הוא עומד בתנאים אלו." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "הללו את ה־Hypnotoad!" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "בטל" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "בערך %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "על אודות Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "על אודות Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "פרטי החשבון" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "פרטי חשבון (פרימיום)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "פעולה" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "פעולה" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "הפעלה/כיבוי של Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "הוספת פודקאסט" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "הוספת תזרים" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "הוספת שורה חדשה אם נתמכת בסוג ההתרעה" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "הוספת פעולה" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "הוסף את כל הרצועות מהתיקייה ומתתי התיקיות שלה " #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "הוספת תזרים אחר..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "הוספת תיקייה..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "הוספת קובץ" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "הוסף קובץ לממיר" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "הוסף קבצים לממיר" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "הוספת קובץ..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "הוספת קובצי מוזיקה להמרה" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "הוספת תיקייה" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "הוספת תיקייה..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "הוספת תיקייה חדשה..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "הוספת פודקאסט" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "הוספת פודקאסט..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "הוספת מונח לחיפוש" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "הוספת תג אלבום לשיר" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "הוספת תג אמן האלבום לשיר" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "הוספת תג אמן לשיר" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "הוספת ניקוד אוטומאטי לשיר" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "הוספת תג מלחין לשיר" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "הוספת תג דיסק לשיר" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "הוספת שם קובץ לשיר" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "הוספת תג סגנון לשיר" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "הוסף תגית קיבוץ לשיר" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "הוספת תג משך לשיר" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "הוספת תיוג מבצע" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "הוספת מספר השמעות לשיר" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "הוספת רייטינג לשיר" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "הוספת מספר דילוגים לשיר" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "הוספת תג כותרת לשיר" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "הוסף שיר למטמון" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "הוספת תג פסקול לשיר" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "הוספת תג שנה לשיר" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "הוסף שירים ל-\"שירים שלי\" אם כפתור ה-\"אוהב\" נלחץ" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "הוספת תזרים" #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "הוסף לשירים שלי" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "הוסף לרשימת ההשמעה של Spotify" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "הוסף למועדפים של Spotify" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "הוספה לרשימת השמעה אחרת" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "הוסף לסימניות" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "הוספה לרשימת ההשמעה" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "הוספה לתור" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "הוסף משתמש\\קבוצה לסימניות" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "הוספת פעולת wiimotedev" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "הוספה..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "נוסף בחודש זה" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "נוסף בשבוע זה" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "נוסף בשנה זו" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "התווסף היום" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "התווסף בשלושה החודשים האחרונים" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "קיבוץ מתקדם..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "לאחר " #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "אחרי העתקה..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "אלבום" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "אלבום (עצמת שמע אידאלית לכל הרצועות)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "אמן אלבום" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "עטיפת אלבום" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "מידע על האלבום ב־jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "כל האלבומים" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "אלבומים עם עטיפה" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "אלבומים ללא עטיפה" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "הכל" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "כל הקבצים (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "כל האלבומים" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "כל האמנים" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "כל הקבצים (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "כל רשימות ההשמעה (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "כל המתרגמים" #: library/library.cpp:98 msgid "All tracks" msgstr "כל הרצועות" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "מתן האפשרות לקידוד mid/side" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "צמוד למקוריים" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "תמיד יש להסתיר את החלון המרכזי" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "תמיד יש להציג את החלון המרכזי" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "תמיד להתחיל לנגן" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "תוסף נדרש על מנת להשתמש ב־Spotify. האם להוריד ולהתקין אותו כעת?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "אירעה שגיאה בטעינת מסד הנתונים של iTunes" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "אירעה שגיאה בכתיבת המידע הנוסף לתוך '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "אירעה שגיאה לא מוגדרת" #: ui/about.cpp:85 msgid "And:" msgstr "וגם:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "כָּעוּס" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "מראה" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "הוסף קבצים/כתובות לסוף רשימת ההשמעה" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "הוספה לרשימת ההשמעה הנוכחית" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "הוספת לרשימת ההשמעה" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "הפעלת כיווץ כדי למנוע חיתוך" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "האם למחוק את האפשרות הקבועה „%1“?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "האם לאפס את סטטיסטיקות השיר?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "אמן" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "מידע על האמן" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "תגיות אמן" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "ראשי תיבות של האמן" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "להמיר לתבנית" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "האימות נכשל" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "יוצר" #: ui/about.cpp:68 msgid "Authors" msgstr "יוצרים" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "אוטומטי" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "עידכונים אוטומטיים" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "פתיחה אוטומטית של קטגוריות בודדות בעץ הספרייה" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "פנוי" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "קצב סיביות ממוצע" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "גודל תמונה ממוצע" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "BBC פודקאסט" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "מספר פעימות לדקה" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "תזרימי הרקע" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "צבע הרקע" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "תמונת רקע" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "שקיפות הרקע" #: core/database.cpp:648 msgid "Backing up database" msgstr "מסד הנתונים מגובה" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "איזון" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "אנלייזר עמודות" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "כחול בסיסי" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "סוג שמע בסיסי" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "התנהגות" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "מיטבי" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "ביוגרפיה מתוך %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "קצב הסיביות" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "קצב סיביות" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "אנלייזר מקטעים" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "סוג בלוק" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "כמות טשטוש" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "גוף" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "אנלייזר בום" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "קופסא" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "עיון..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "משך הבאפר (buffer)" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "באגירה" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "מקורות אלו מושבתים:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "לחצנים" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "תמיכה ב־CUE sheet" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "ביטול" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "בטל הורדה" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "שינוי עטיפת האלבום" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "שינוי גודל גופן..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "שינוי מצב חזרה" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "שינוי קיצור הדרך..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "שינוי מצב ערבוב" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "שינוי השפה" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "שינוי העדפת השמעת מונו יהיה יעיל לניגון השירים הבאים" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "בדיקת פרקים חדשים" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "בדוק עדכונים" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "בדיקת עדכונים..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "נא לבחור בשם עבור רשימת ההשמעה החכמה" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "בחירה אוטומטית" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "בחירת צבע..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "בחירת גופן..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "בחירה מהרשימה" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "נא לבחור כיצד רשימת ההשמעה תסודר וכמה שירים יהיו בה" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "בחירת תיקיית יעד להורדת פודקאסט" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "בחר שירות אינטרנט להצגה" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "ניתן לבחור באתרים שבהם Clementine יחפש אחר מילים לשירים." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "קלסית" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "מנקה" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "ניקוי" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "ניקוי רשימת ההשמעה" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "שגיאה ב־Clementine" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "כתום קלמנטינה" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "אפקטים חזותיים של Clementine" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "באפשרות Clementine להמיר אוטומטית כל מוזיקה המעותקת להתקן לתבנית שההתקן מסוגל לנגן." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine מאפשר לנגן מוזיקה שהעלאת ל-Box" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine יאפשר נגינת מוסיקה שהעלית ל " #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine מאפשר נגינת מוסיקה שהעלית ל Google Drive" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "באפשרות Clementine להציג הודעה כשהרצועה משתנה." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "יש ל־Clementine אפשרות לסנכרן את ההרשמות שלך עם מחשבים אחרים ויישומי פודקאסט אחרים. יצירת חשבון." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "אין באפשרות Clementine לטעון אפקטים חזותיים של projectM. נא לוודא שהתקנת את Clementine כמו שצריך." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "מציג התמונות של Clementine" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine נכשל במציאת תוצאות לקובץ זה" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine ימצא מוסיקה ב:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "יש ללחוץ כאן כדי להוסיף מוזיקה" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "יש ללחוץ כאן על מנת לעבור בין הצגת הזמן הנותר לזמן הכולל" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "לחיצה על כפתור רישום תפתח דף בדפדפן האינטרנט. לאחר הרישום, יש לחזור Clementine." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "סגירה" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "סגירת רשימת השמעה" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "סגירת האפקטים החזותיים" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "סגירת חלון זה תבטל את ההורדה." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "סגירת חלון זה תבטל את החיפוש אחר עטיפות אלבום." #: ui/equalizer.cpp:114 msgid "Club" msgstr "קלאב" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "צבעים" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "רשימה מופרדת בפסיקים של class:level,level יכול להיות 0-3 " #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "הערה" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "השלמת תג אוטומטית" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "השלמת תגים אוטומטית..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "מלחין" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "הגדרת " #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "הגדרת Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "הגדרת קיצורי מקשים" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "הגדרת Spotify..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "הגדרת תת קולי" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "מגדיר חיפוש " #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "הגדרת הספרייה..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "הגדרת פודקאסטים..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "הגדרה..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "חיבור Wii Remotes בעזרת פעולת הפעלה/כיבוי" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "חיבור התקן" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "בהתחברות אל Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "קונסול" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "קצב סיביות קבוע" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "המרת כל המוזיקה" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "המרת כל המוזיקה שהתקן זה לא מסוגל לנגן" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "העתקה אל הלוח" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "העתקה להתקן.." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "העתקה לספרייה..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "זכויות יוצרים" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "לא ניתן להתחבר ל Subsonic, נא לבדוק כתובת שרת. לדוגמא: " #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "לא ניתן ליצור את רכיב ה־GStreamer „%1“ - יש לוודא שכל תוספי ה־GStreamer מותקנים כראוי" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "לא ניתן למצוא מרבב עבור %1, נא לוודא שתוספי ה־GStreamer הנכונים מותקנים כראוי" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "לא ניתן למצוא מקודד עבור %1, נא לוודא שתוספי ה־GStreamer הנכונים מותקנים כראוי" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "לא ניתן לפתוח את קובץ הפלט %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "מנהל העטיפות" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "עטיפת אלבום מתוך תמונה שבקובץ" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "עטיפת האלבום נטענה אוטומטית מתוך %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "עטיפת אלבום הוסרה ידנית" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "לא נבחרה עטיפת אלבום" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "עטיפת אלבום נבחרה מתוך %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "עטיפות מ־%1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "מעבר באמצעות עמעום בין רצועות, בהחלפה אוטומטית של רצועות" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "מעבר באמצעות עמעום בין רצועות, בהחלפה ידנית של רצועות" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "התאמה אישית" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "תמונה מותאמת אישית:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "הגדרות מותאמות אישית להודעות" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "התאמה אישית..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "נתיב DBus" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "דאנס" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "זוהתה השחתה במסד הנתונים. נא לקרוא את ההוראות מהכתובת https://code.google.com/p/clementine-player/wiki/DatabaseCorruption לקבלת כיצד לשחזר את מסד הנתונים" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "תאריך יצירה" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "תאריך שינוי" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "ימים" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "בררת מח&דל" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "הנמכת עוצמת השמע ב־4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "הנמך את עוצמת השמע ב־ אחוזים" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "הנמכת עצמת השמע" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "תמונת בררת המחדל לרקע" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "בררות מחדל" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "הפסקה בין אפקטים חזותיים" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "מחיקה" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "מחיקת מידע שהתקבל" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "מחיקת קבצים" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "מחיקה מתוך התקן..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "מחיקה מתוך דיסק..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "מחיקת פרקים שנוגנו" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "מחיקת אפשרות מוגדרת מראש" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "מחיקת רשימת השמעה חכמה" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "מחיקת הקבצים המקוריים" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "הקבצים נמחקים" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "הסרת הרצועות הנבחרות מהתור" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "הסרת הרצועה מהתור" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "יעד" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "פרטים..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "התקן" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "מאפייני ההתקן" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "שם ההתקן" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "מאפייני ההתקן..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "התקנים" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "האם כוונתך" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "ססמת Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "שם המשתמש ב־Digitally Imported " #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "חיבור ישיר לאינטרנט" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "תיקייה" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "משך הנטרול" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "מניעת יצירת סרגל האווירה" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "דיסק" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "תמסורת רציפה" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "הגדרות תצוגה" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "הצגת חיווי מסך" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "ביצוע סריקה חוזרת לכל הספרייה" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "אין להמיר שום מוזיקה" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "אל תדרוס" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "ללא חזרה" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "לא להציג באמנים שונים" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "ללא קפיצות" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "לא להפסיק!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "לתרום" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "לחיצה כפולה לפתיחה" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "לחיצה כפולה על שיר לביצוע..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "ירדו %n פרקים" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "הורדת תיקייה" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "הורדת פרקים אל" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "חברות המאפשרת הורדה" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "הורדת פרקים חדשים אוטומטית" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "ההורדה נכנסה לתור" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "הורדת אפליקציית אנדרויד" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "הורדת האלבום הזה" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "הורדת האלבום הזה..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "הורדת הפרק הזה" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "בהורדה..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "בהורדה (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "תיקיית Icecast בהורדה" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "הקטלוג של Jamendo מתקבל" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "הקטלוג של Magnatune מתקבל" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "התוסף של Spotify מתקבל" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "נתוני העל מתקבלים" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "נא לגרור למיקום הרצוי" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "דרופבוקס" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "מצב דינמי פעיל" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "מיקס דינמי אקראי" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "עריכת רשימת השמעה חכמה..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "עריכת תגית..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "עריכת תגיות" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "עריכת פרטי הרצועה" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "עריכת פרטי הרצועה..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "עריכת פרטי רצועות..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "עריכה..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "הפעלת תמיכה ב־Wii Remote" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "הפעלת אקולייזר" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "הפעלת קיצורי מקלדת רק כאשר המיקוד הוא על Clementine" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "אפשור המקורות להלן כדי לכלול אותם בתוצאות חיפוש. תוצאות יוצגו בסדר זה." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "הפעלה/נטרול Last.fm scrobbling" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "מורכבות הקידוד" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "איכות מנוע הקידוד" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "מצב הקידוד" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "נא להזין כתובת" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "הכנסת כתובת להורדת עטיפה מהאינטרנט:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "הכנס שם קובץ לייצוא עטיפות (ללא סיומת):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "שם חדש לרשימת השמעה זו" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "הזנה למעלה ביטויי חיפוש כדי למצוא מוסיקה במחשבך ובאינטרנט" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "יש להזין ביטוי לחיפוש על מנת למצוא פודקאסטים ב־iTunes Store" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "יש להזין ביטוי לחיפוש על מנת למצוא פודקאסטים ב־gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "ניתן להזין כאן מונחים לחיפוש" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "כתובת תחנת הרדיו האינטרנטית:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "הזנת שם התיקייה" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "הכנס כתובת IP באפליקציה על מנת להתחבר ל-Clementine" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "כל האוסף" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "אקולייזר" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "זהה לאפשרות --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "זהה לאפשרות--log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "שגיאה" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "שגיאה בחיבור להתקן מולטימדיה" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "שגיאה בהעתקת שירים" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "שגיאה במחיקת שירים" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "שגיאה בהורדת תוסף Spotify" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "שגיאה בטעינת %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "שגיאה בטעינת רשימת ההשמעה של di.fm" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "שגיאה בעיבוד %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "שגיאה בטעינת דיסק מוזיקה" #: library/library.cpp:68 msgid "Ever played" msgstr "לא נוגן אף פעם" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "בכל 10 דקות" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "בכל 12 שעות" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "בכל שעתיים" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "בכל 20 דקות" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "בכל חצי שעה" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "בכל 6 שעות" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "בכל שעה" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "מלבד בין שירים באותו אלבום או אותו CUE sheet" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "עטיפות קיימות" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "הרחבה" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "התפוגה היא ב־%1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "ייצא עטיפות" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "ייצא עטיפות" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "ייצא עטיפות שהורדו" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "ייצא עטיפות שהוטמעו" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "ייצא %1 עטיפות מתוך %2(%3 דולגו)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "עמעום המוזיקה בעצירת רצועה" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "עמעום מוזיקה" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "משך זמן עמעום המוזיקה" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "אחזור התיקייה נכשל" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "אחזור הפודקאסטים נכשל" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "בטעינת הפודקאסט נכשלה" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "ניתוח קובץ ה־XML להזנת ה־RSS נכשל" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "מהר" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "רצועות מועדפות" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "הורדת העטיפות החסרות" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "אחזור אוטומטי" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "אחזור המידע הושלם" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "טעינת ספרית Subsonic" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "שגיאה באחזור המידע על העטיפה" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "סיומת הקובץ" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "סוג הקובץ" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "שם הקובץ" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "שם הקובץ (ללא נתיב)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "גודל הקובץ" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "סוג הקובץ" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "שם הקובץ" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "קבצים" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "קובצי מוזיקה להמרה" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "חיפוש שירים בספרייה על פי קריטריונים מוגדרים." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "ניתוח טביעת האצבע של השיר" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "סיום" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "רמה ראשונה" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "גודל הגופן" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "עקב בעיות רישוי, התמיכה ב־Spotify נמצאת בתוסף נפרד" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "אילוץ קידוד mono" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "התעלמות מההתקן" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "„התעלמות מההתקן“ יסיר את ההתקן מרשימה זו וכאשר ההתקן יחובר שוב, יהיה עלי Clementine לסרוק אותו שוב." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "טופס" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "תבנית" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "קצב מסגרות" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "מסגרות לאגירה" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "קפוא" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "בס מלא" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "בס מלא + טרבל" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "טרבל מלא" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "כללי" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "הגדרות כלליות" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "סגנון" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "ערוצים מתקבלים" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "הזרמות מתקבלות" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "שם עבור הפריט:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "מעבר" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "מעבר ללשונית רשימת ההשמעה הבאה" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "מעבר ללשונית רשימת ההשמעה הקודמת" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "גוגל דרייב" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "נמצאו %1 עטיפות מתוך %2 (%3 נכשלו)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "ברשימת ההשמעה, סימון שירים שאינם קיימים באפור" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "קיבוץ ספרייה על פי..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "קיבוץ על פי" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "קיבוץ על פי אלבום" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "קיבוץ על פי אמן" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "קיבוץ על פי אמן/אלבום" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "קיבוץ על פי אמן/שנת אלבום" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "קיבוץ על פי סגנון/אלבום" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "קיבוץ על פי סגנון/אמן/אלבום" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "קיבוץ" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "דף ה־HTML לא כלל שום הזנת RSS" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "מתווך HTTP" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "שמח" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "מידע על החומרה" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "מידע על החומרה זמין רק כאשר ההתקן מחובר." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "גבוה" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "גבוה (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "גבוה (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "שעות" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "אין לי חשבון Magnatune" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "צלמית" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "צלמיות למעלה" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "מזהה שיר" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "אם בחירתך תהיה להמשיך, ההתקן יעבוד לאט וייתכן ששירים שיועתקו אליו לא יעבדו." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "אם כתובת ההפודקאסט ידועה לך, נא להכניס אותה וללחוץ על מעבר." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "התעלמות מה־\"The\" בשם האמן" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "קובצי תמונה (‎*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "קובצי תמונה (‎*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "בעוד %1 ימים" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "בעוד %1 שבועות" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "במצב דינמי שירים חדשים יבחרו ויתווספו לרשימת ההשמעה בכל פעם ששיר יסתיים" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "תיבת נכנסת" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "אומנות אלבום בתוך ההתרעה" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "הכללת כל השירים" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "גרסת סותרת של פרוטוקול Subsonic REST . לקוח חייב שדרוג." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "גרסת סותרת של פרוטוקול Subsonic REST . שרת חייב שדרוג." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "הגברת עצמת השמע ב־4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "הגבר את עוצמת השמע ב־ אחוזים" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "הגברת עוצמת השמע" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "יצירת מפתחות " #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "מידע" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "הוספה..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "הותקן" #: core/database.cpp:585 msgid "Integrity check" msgstr "בדיקת שלמות" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "אינטרנט" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "ספקי אינטרנט" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "מפתח API לא תקין" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "תבנית לא תקינה" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "שיטה לא תקינה" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "פרמטרים לא תקינים" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "צויין משאב לא תקין" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "שירות לא תקין" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "מפתח הפעלה לא תקין" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "הרצועות הכי מושמעות ב־Jamendo" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "הרצועות המדורגות ביותר ב־Jamendo" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "הרצועות החמות ביותר החודש ב-־amendo" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "הרצועות החמות ביותר השבוע ב־Jamendo" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "מסד הנתונים של Jamendo" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "קפיצה לרצועה המתנגנת כעת" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "השארת הלחצנים ל־%1 שניות..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "השארת הלחצנים ל-%1 שניות..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "להמשיך ולהריץ ברקע כאשר החלון סגור" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "שמירה על הקבצים המקוריים" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "שפה" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "מחשב נייד/אוזניות" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "חלל גדול" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "עטיפת אלבום גדולה" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "סרגל צד גדול" #: library/library.cpp:80 msgid "Last played" msgstr "השמעה אחרונה" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm עסוק כרגע, מומלץ לנסות שוב מאוחר יותר" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "ססמת Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "מונה השמעות של Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "תגיות מ־Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "שם המשתמש ב־Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "הוויקי של Last.fm" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "הרצועות הכי פחות אהובות" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "שמאל" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "אורך" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "ספרייה" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "קיבוץ מתקדם של הספרייה" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "הודעה על סריקה מחודשת של הספרייה" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "חיפוש בספרייה" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "הגבלות" #: ui/equalizer.cpp:137 msgid "Live" msgstr "חי" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "טעינה" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "טעינת עטיפה מכתובת" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "טעינת עטיפה מכתובת..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "טעינת עטיפה מדיסק" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "טעינת עטיפה מהדיסק..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "טעינת רשימת השמעה" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "טעינת רשימת השמעה..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "התקן המולטימדיה נטען" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "מסד נתונים של ה־iPod נטען" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "רשימת השמעה חכמה נטענת" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "השירים נטענים" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "מדיה זורמת בטעינה" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "הרצועות נטענות" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "נטען מידע אודות השירים" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "בטעינה..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "טעינת קבצים/כתובות, תוך החלפת רשימת ההשמעה הנוכחית" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "כניסה" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "ההתחברות נכשלה" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "פרופיל תחזית ארוכת טווח(LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "אהוב" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "נמוך (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "‏נמוך (‎256x256‎)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "פרופיל מורכבות נמוכה (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "מילות השיר" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "מילות השיר מתוך %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "הורדה מ־Magnatune" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "ההורדה מ־Magnatune הסתיימה" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "הפרופיל הראשי (ראשי)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "ביצוע!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "הפיכת רשימת ההשמעה לזמינה גם ללא חיבור רשת" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "תגובה שגויה" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "הגדרה ידנית של שרת מתווך" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "ידני" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "יצרן" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "סימון כהושמע" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "סימון כחדש" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "הכללת כל נתוני החיפוש (AND)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "הכללת נתון אחד או יותר מנתוני החיפוש (OR)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "קצב סיביות מירבי" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "בינוני (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "בינוני (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "סוג חברות" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "קצב סיביות מזערי" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "חסרות אפשרויות קבועות של projectM" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "דגם" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "מעקב אחר שינויים בספרייה" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "השמעת מונו" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "חודשים" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "מצב רוח" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "סגנון סרגל האווירה" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "סרגלי אווירה" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "הכי מושמעים" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "נקודת עגינה" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "נקודות עגינה" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "הזזה מטה" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "העברה לספרייה..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "הזזה מעלה" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "מוזיקה" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "ספריית המוזיקה" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "השתקה" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "המוסיקה שלי" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "ההמלצות שלי" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "שם" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "אפשרויות הקצאת שם" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "פס צר (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "מתווך רשת" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "רשת מרוחקת" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "לעולם לא" #: library/library.cpp:74 msgid "Never played" msgstr "לא נוגן אף פעם" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "אין להתחיל להשמיע אף פעם" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "תיקייה חדשה" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "רשימת השמעה חדשה" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "רשימת השמעה חכמה חדשה..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "שירים חדשים" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "רצועות חדשות יצורפו באופן אוטומטי." #: library/library.cpp:92 msgid "Newest tracks" msgstr "הרצועות הכי חדשות" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "הבא" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "הרצועה הבאה" #: core/utilities.cpp:151 msgid "Next week" msgstr "השבוע הבא" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "ללא אנלייזר" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "ללא תמונת רקע" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "אין עטיפות לייצא." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "ללא מקטעים ארוכים" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "לא נמצא פריט תואם. יש לנקות את תיבת החיפוש על מנת לראות את כל רשימת ההשמעה שוב." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "ללא מקטעים קצרים" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "אין" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "אף אחד מהשירים הנבחרים לא היה ראוי להעתקה להתקן" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "נורמאלי" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "סוג מקטע רגיל" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "לא זמין בזמן שימוש ברשימת השמעה דינמית" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "לא מחובר" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "אין מספיק תוכן" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "אין מספיק מעריצים" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "אין מספיק חברים" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "אין מספיק שכנים" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "לא מותקן" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "לא מחובר" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "לא מעוגן - יש ללחוץ לחיצה כפולה כדי לעגן" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "סוג התרעות" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "התרעות" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "מתנגן עכשיו" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "תצוגה מקדימה של חיווי המסך" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "קבלת חיבורים רק מלקוח בתוך טווחי ה-IP:⏎\n10.x.x.x⏎\n172.16.0.0 - 172.31.255.255⏎\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "הצגת הראשון בלבד" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "שקיפות" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "פתיחת %1 בדפדפן" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "פתיחת &דיסק שמע..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "פתיחת קובץ " #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "פתיחת קובץ " #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "פתיחת התקן" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "פתיחת קובץ..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "פתיחה ב " #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "פתיחה ברשימת השמעה חדשה" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "פתיחה..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "הפעולה נכשלה" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "מיטוב לקצב סיביות" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "מיטוב לאיכות" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "אפשרויות" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "ארגון קבצים" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "ארגון קבצים..." #: core/organise.cpp:73 msgid "Organising files" msgstr "הקבצים מאורגנים" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "תגים מקוריים" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "אפשרויות נוספות" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "פלט" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "התקן פלט" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "אפשרויות פלט" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "דריסת קבצים קיימים" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "בעלים" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "הקטלוג של Jamendo מפוענח" #: ui/equalizer.cpp:139 msgid "Party" msgstr "מסיבה" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "ססמה" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "השהייה" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "השהיית הנגינה" #: widgets/osd.cpp:156 msgid "Paused" msgstr "מושהה" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "מבצע" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "פיקסל" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "סרגל צד פשוט" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "נגינה" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "מונה השמעות" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "ניגון אם מושהה, השהייה אם מנגן" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "השמעה אם אין שום שמושמע כרגע" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "נגן הרצועה ה־ מרשימת ההשמעה" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "ניגון/השהייה" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "השמעה" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "אפשרויות נגן" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "רשימת השמעה" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "רשימת ההשמעה הסתיימה" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "אפשרויות רשימת ההשמעה" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "סוג רשימת ההשמעה" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "רשימות השמעה" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "נא לסגור את הדפדפן ולחזור ל Clementine" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "מצב התוסף:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "פודקאסטים" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "פופ" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "משך זמן חלונית קופצת" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "פתחה" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "הגברה טרומית" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "מאפיינים" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "מאפיינים..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "שמות קבצים מועדפים לתמונות אלבום (מופרדים בפסיק)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "תבנית שמע מועדפת" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "קצב סיביות מועדף" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "תבנית מועדפת" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "סוג אודיו מיטבי" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "אפשרות מוגדרת מראש:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "יש ללחוץ על צירוף לחצנים שיוקצה עבור" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "יש ללחוץ על מקש כלשהו" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "יש ללחוץ על צירוף מקשים שיוקצה עבור %1..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "אפשרויות חיווי המסך" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "תצוגה מקדימה" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "הקודם" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "רצועה קודמת" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Print out version information" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "פרופיל" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "התקדמות" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "יש ללחוץ על הלחצן ב־Wiiremote" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "הוספת שירים ברצף אקראי" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "התקן מתושאל..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "מנהל התור" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "הוספת הרצועות הנבחרות" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "הוספת הרצועה לתור" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "רדיו (עצמה זהה לכל הרצועות)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "גשם" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "אפקטים חזותיים אקראיים" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "דירוג השיר הנוכחי ללא כוכבים" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "דירוג השיר הנוכחי עם כוכב אחד" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "דירוג השיר הנוכחי עם 2 כוכבים" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "דירוג השיר הנוכחי עם 3 כוכבים" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "דירוג השיר הנוכחי עם 4 כוכבים" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "דירוג השיר הנוכחי עם 5 כוכבים" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "דירוג" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "האם לבטל?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "רענון הקטלוג" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "רענון הערוצים" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "רענון רשימת התחנות" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "רענון ההזרמות" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "רגאיי" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "שמירת הנפת ה־Wii remote" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "שמירה מהפעם הקודמת" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "הסרה" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "הסרת הפעולה" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "הסרת כפילויות מרשימת ההשמעה" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "הסרת תיקייה" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "הסרה מהמוסיקה שלי" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "הסרה מרשימת ההשמעה" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "הסר רשימת השמעה" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "הסר רשימות השמעה" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "שינוי שם רשימת ההשמעה" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "שינוי שם רשימת ההשמעה..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "מספור הרצועות מחדש על פי הסדר הנוכחי..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "חזרה" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "חזרה על האלבום" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "חזרה על רשימת ההשמעה" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "חזרה על הרצועה" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "החלפת רשימת ההשמעה הנוכחית" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "החלפת רשימת ההשמעה" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "החלפת רווחים עם קו תחתון" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "הגברת ניגון חוזר" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "איכלוס מחדש" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "איפוס" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "איפוס מונה ההשמעות" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "הגבלה לתווי ASCII" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "חזרה ל Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "ימינה" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "רוק" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "הרצה" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "מתווך SOCKS" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "הסרת התקן באופן בטוח" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "הסרת ההתקן באופן בטוח לאחר סיום ההעתקה" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "קצב הדגימה" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "קצב דגימה" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "שמירת קבצי .מַצַב רוּחַ בספרית המוסיקה שלך" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "שמירת עטיפת האלבום" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "שמירת עטיפת האלבום לכונן..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "שמירת התמונה" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "שמירת רשימת ההשמעה..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "שמירה כאפשרות מוגדרת מראש" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "שמור רייטינגד לתוך תגיות קובץ כשמתאפשר" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "שמור תגיות סטטיסטיקות בתוך קובץ כשמתאפשר" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "שמירת המדיה הזורמת הזו בלשונית האינטרנט" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "שומר סטטיסטיקת שירים לתוך קובץ שירים" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "שמירת רצועות" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "פרופיל קצב דגימה משתנה (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "ניקוד" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "עדכון הפרופיל עם הרצועות הנשמעות" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "חיפוש" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "חיפוש תחנות Icecast" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "חיפוש ב־Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "חיפוש ב־Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "חיפוש Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "חיפוש אחר עטיפות אלבום..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "חיפוש הכול" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "חיפוש ב־gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "חיפוש ב־iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "מצב חיפוש" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "אפשרויות חיפוש" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "תוצאות החיפוש" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "מונחי חיפוש" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "שלב שני" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "דילוג אחורה" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "דילוג קדימה" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "דילוג בתוך הרצועה המתנגנת כעת למיקום יחסי" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "דילוג בתוך הרצועה המתנגנת כעת למיקום מוחלט" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "בחירת הכול" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "ביטול הבחירה" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "בחירת צבע הרקע:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "בחירת תמונת הרקע" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "בחירת ההתאמה המיטבית" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "בחירת צבע החזית:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "בחירת אפקטים חזותיים" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "בחירת אפקטים חזותיים..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "מספר סידורי" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "כתובת שרת" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "פרטי שרת" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "שירות לא מקוון" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "הגדרת %1 בתור „%2“..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "הגדרת עצמת השמע ל־ אחוזים" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "הגדרת הערך לכל הרצועות הנבחרות..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "קיצור דרך" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "קיצור דרך עבור %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "קיצור דרך עבור %1 קיים כבר" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "הצגה" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "הצגת חיווי המסך" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "הנפשה זוהרת על הרצועה הנוכחית" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "הצגת סרגל אווירה בסרגל התקדמות הנתיב" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "הצגת התרעות של שולחן העבודה" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "הצגת התרעה על שינוי מצב חזרה/ערבוב" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "הצגת התרעה על שינוי עצמת השמע" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "הצגת חלונית קופצת ממגשית המערכת" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "הצגת חיווי מסך נאה" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "הצגה מעל לשורת המצב" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "הצגת כל השירים" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "הצגת כל השירים" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "הצגת עטיפת אלבום בספרייה" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "הצגת חוצצים" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "הצגה על מסך מלא..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "הצגה בסייר הקבצים..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "הצגה תחת אמנים שונים" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "הצגת סרגל האווירה" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "הצגת כפילויות בלבד" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "הצגת לא מתוייגים בלבד" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "הצגת הצעות חיפוש" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "הצגת הכפתור scrobble בחלון הראשי" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "הצגת סמל באזור הדיווחים" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "הצגת מקורות מאופשרים ובלתי מאופשרים" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "הצגה/הסתרה" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "ערבוב" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "ערבוב אלבומים" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "ערבוב עם הכול" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "ערבוב רשימת ההשמעה" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "ערבוב שירים באלבום זה" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "כניסה" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "ניתוק" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "כניסה..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "אמנים דומים" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "גודל" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "גודל:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "סקא" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "דילוג אחורה ברשימת ההשמעה" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "מונה דילוגים" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "דילוג קדימה ברשימת ההשמעה" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "עטיפת אלבום קטנה" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "סרגל צד קטן" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "רשימת השמעה חכמה" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "רשימות השמעה חכמות" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "רך" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "רוק קל" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "מידע על השיר" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "מידע על השיר" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "סונוגרמה" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "עמך הסליחה" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "מיון על פי סגנון (א״ב)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "מיון על פי סגנון (פופולריות)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "מיון על פי שם התחנה" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "מיון שירים על פי" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "מיון" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "מקור" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "מקורות" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "שגיאה בהתחברות ל־Spotify" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "תוסף Spotify" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "תוסף Spotify אינו מותקן" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "סטנדרטי" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "מסומן בכוכב" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "התחלת רשימת ההשמעה המתנגנת כעת" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "התחלת ההתמרה" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "נא להקליד משהו בתיבת החיפוש למעלה כדי למלא את רשימת תוצאות חיפוש זה" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "התחלת המרת %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "מופעל..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "הפסקה" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "הפסקה אחרי" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "הפסקה אחרי רצועה זו" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "הפסקת הנגינה" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "הפסקת הנגינה אחרי הרצועה הנוכחית" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "בעצירה" #: core/song.cpp:431 msgid "Stream" msgstr "מדיה זורמת" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "השידור משרת Subsonic דורש חשבון פעיל לאחר תום תקופת נסיון של 30 יום" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "חברות המאפשרת הזרמת מדיה" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "מנויים" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "הצלחה!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "נכתב בהצלחה %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "תגים מוצעים" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "סיכום" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "סופר גבוה (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "סופר גבוה (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "תבניות נתמכות" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "מסנכרן סטטיסטיות לתוך קובץ" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "התיבה הנכנסת ב־Spotify מסונכרנת" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "רשימת ההשמעה מ־Spotify מסונכרנת" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "השירים המסומנים בכוכב ב‏־Spotify מסונכרנים" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "צבעי המערכת" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "לשוניות למעלה" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "משיג תגים" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "קצב הסיביות של היעד" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "טכנו" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "אפשרויות טקסט" #: ui/about.cpp:74 msgid "Thanks to" msgstr "תודתנו נתונה לבאים" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "לא ניתן להפעיל את הפקודה „%1“." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "עטיפת האלבום של השיר המתנגן כעת" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "התיקייה %1 לא חוקית" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "הערך השני חייב להיות גדול יותר מהערך הראשון!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "האתר שביקשת לא קיים!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "האתר אותו ביקשת אינו תמונה!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "תמה תקופת הניסיון לשרת Subsonic. נא תרומתך לקבלת מפתח רישיון. לפרטים, נא לבקר ב subsonic.org " #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "הגרסה החדשה של Clementine אליה שדרגת דורשת סריקה חוזרת של הספרייה בגלל התכונות החדשות הבאות:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "אין שירים נוספים באלבום זה" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "אירעה תקלה בתקשורת עם gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "אירעה תקלה בקבלת המידע הנוסף מתוך Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "אירעה תקלה בניתוח התגובה מ־iTunes " #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "אירעה תקלה בהעתקת חלק מהשירים. הקבצים הבאים לא הועתקו:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "אירעה תקלה במחיקת חלק מהשירים. הקבצים הבאים לא נמחקו:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "קבצים אלו ימחקו מההתקן, האם להמשיך?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "תיקיות אלו ייסרקו לאיתור מוזיקה שתרכיב את ספריית המוזיקה" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "אפשרויות אלו בשימוש במסך \"המרת מוזיקה\", ובהמרת מוזיקה לפני העתקתה להתקן." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "רמה שלישית" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "פעולה זו עשויה ליצור בסיס נתונים שעלול להיות בגודל של 150 מגה-בייט.\nהאם להמשיך בכל זאת?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "אלבום זה לא זמין בפורמט המבוקש" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "ההתקן הזה חייב להיות מחובר ופתוח על מנת ש-Clementine יוכל לבדוק באילו פורמטים הוא תומך." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "ההתקן הזה תומך בפורמטים הבאים:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "ההתקן הזה לא יעבוד כראוי" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "התקן זה הוא התקן מסוג MTP, אולם Clementine לא קומפל עם תמיכה ב-libmtp." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "זהו iPod, אולם Clementine לא קומפל עם תמיכה ב-libgpod." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "זוהי הפעם הראשונה שחיברת את ההתקן הזה. Clementine יסרוק כעת את ההתקן אחר קבצי מוזיקה - ייתכן ופעולה זו תיקח זמן מה." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "המדיה הזורמת הזו היא עבור חברות בתשלום בלבד" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "סוג התקן זה לא נתמך: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "כותרת" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "היום" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "החלפה ל/ממצב חיווי נאה" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "הפעלה או כיבוי של מסך מלא" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "החלף מצב התור" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "החלפה לscrobbling" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "הפעלה או כיבוי נראות ההצגה היפה על המסך" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "מחר" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "הפניות רבות מדי" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "מסלול עליון" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "סך הכל אלבומים:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "סך הכל בתים שהועברו" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "סך הכל בקשות שנשלחו" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "רצועה" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "ממיר קבצי המוזיקה" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "יומן ממיר קבצי המוזיקה" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "ממיר" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "התחלת המרת %1 קבצים בעזרת %2 תהליכים" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "אפשרויות המרה" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "כבה" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Ultra wide band (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "לא ניתן להוריד %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "לא ידוע" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "סוג התוכן לא ידוע" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "שגיאה לא ידועה" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "הסרת עטיפה" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "הסרת מינוי" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "קונצרטים צפויים" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "עדכון כל הפודקאסטים" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "עדכון תיקיות שהשתנו בספרייה" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "עדכון הספרייה בזמן הפעלת Clementine" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "עדכון פודקאסט זה" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "מתבצע עדכון" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "עדכון %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "עדכון %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "הספרייה בעדכון" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "בשימוש" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "שימוש בתג אלבום אמן כאשר זמין" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "השתמש בקיצורי המקלדת של גנום" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "שימוש במידע נוסף על הגברת ניגון חוזר אם זמין" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "שימוש ב־Wii Remote" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "שימוש בערכת צבעים מותאמת אישית" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "שימוש בהודעות מותאמות אישית להתרעות" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "שימוש באימות" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "שימוש במנוע ניהול קצב סיביות" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "שימוש במצב דינמי" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "שימוש בהתרעות לדיווח על מצב ה־Wii Remote" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "שימוש בתצורת רעשים טמפורלית" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "שימוש בבררת המחדל של המערכת" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "שימוש בערכת הצבעים שמשמשת כבררת המחדל של המערכת" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "שימוש בהגדרות המתווך של המערכת" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "שימוש בנורמליזציה של עצמת השמע" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "בשימוש" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "מנשק משתמש" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "שם משתמש" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "שימוש בתפריט להוספת שיר יגרום ל..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "קצב סיביות משתנה" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "אמנים שונים" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "גרסה %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "הצגה" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "מצב אפקטים חזותיים" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "אפקטים חזותיים" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "הגדרת אפקטים חזותיים" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "זיהוי פעולות קול" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "עצמת שמע %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "אתר" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "שבועות" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "בהפעלת Clementine" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "בחיפוש אחר תמונות אלבום, Clementine יחפש קודם קבצי תמונה המכילים אחת המילים האלו.\nאם לא נמצאו קבצים מתאימים, אז תיבחר התמונה הגדולה ביותר בתיקייה." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "כאשר הרשימה ריקה..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "מדוע לא לנסות..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "פס רחב (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: מופעל" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: מחובר" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: סוללה קריטית (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: כבוי" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: מנותק" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: סוללה חלשה (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "שמע של Windows Media" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "ללא עטיפה:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "האם ברצונך להעביר גם את שאר השירים באלבום לאמנים שונים?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "האם ברצונך לבצע סריקה חוזרת כעת?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "רשום את כל הסטטיסטיקות עבור השירים לתוך קבצי שירים" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "שם משתמש או סיסמא שגויים" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "שינוי" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "שינוי - אלבום" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "שנים" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "אתמול" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "האלבומים הבאים מועמדים להורדה" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "לא נכנסת." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "כבר נכנסת בשם %1" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "מחובר" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "ניתן לשנות את הדרך שבה השירים מסודרים בספרייה שלך." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "ניתן להאזין בחינם ללא חשבון, אך בעלי חשבון פרימיום יכולים להאזין להזרמות באיכות גבוהה יותר וללא פרסומות." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "ניתן להאזין לשירים מ־Magnatune בחינם ללא חשבון משתמש. רכישת חברות מורידה את ההודעות שבסוף כל רצועה." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "ניתן להאזין למוזיקת רקע תוך כדי האזנה למוזיקה אחרת." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "ניתן להשתמש ב־Wii Remote כשלט רחוק ל־Clementine. ניתן לקרוא את העמוד בוויקי של Clementine לקבלת מידע נוסף.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "אין לך חשבון פרימיום ב־Spotify." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "אינך בעל מנוי פעיל" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "נותקת מ־Spotify, נא להכניס מחדש את הססמה בחלון ההגדרות." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "נותקת מ־Spotify, נא להכניס מחדש את הססמה." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "רצועה זו מוצאת חן בעיניך" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "יש להפעיל מחדש את Clementine לאחר שינוי השפה." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "כתובת ה-IP שלך:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "הפרטים שהוקלדו עבור Last.fm אינם נכונים" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "פרטי החיבור שלך ל־Magnatune שגויים." #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "הספרייה שלך ריקה!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "רדיו המדיות הזורמות שלך" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "ה־scrobbles שלך: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "למערכת שלך חסרה תמיכה ב־OpenGL, אפקטים חזותיים אינם זמינים." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "שם המשתמש או הססמה שגויים" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "אפס" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "הוספת %n שירים" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "אחרי" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "לפני" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "וגם" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "אוטומטי" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "לפני" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "בין" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "הכי גדול קודם" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "פעימות לדקה" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "מכיל" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "מנוטרל" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "דיסק %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "אינו מכיל" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "מסתיים ב־" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "שווה ל־" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "ספריית gpodder.net " #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "גדול מ־" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "באחרון" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "קילוסיביות לשניה" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "קטן מ־" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "הארוך ביותר ראשון" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "העברת %n שירים" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "החדש ביותר ראשון" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "לא שווה" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "לא באחרון" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "לא ב־" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "הישן ביותר ראשון" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "ב־" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "אפשרויות" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "נא להיכנס" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "הסרת %n שירים" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "הקצר ביותר ראשון" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "ערבול שירים" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "הקטן ביותר ראשון" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "מיון שירים" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "מתחיל ב־" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "הפסקה" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "רצועה %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/he_IL.po000066400000000000000000004020651260417502300242260ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Hebrew (Israel) (http://www.transifex.com/davidsansome/clementine/language/he_IL/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: he_IL\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr "" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "" #: core/utilities.cpp:119 msgid "1 day" msgstr "" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "" #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "" #: core/song.cpp:422 msgid "AIFF" msgstr "" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "" #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "" #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "" #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "" #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "" #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "" #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "" #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:80 msgid "All the translators" msgstr "" #: library/library.cpp:98 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:85 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "" #: ui/about.cpp:68 msgid "Authors" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "" #: core/database.cpp:648 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "" #: core/song.cpp:428 msgid "CDDA" msgstr "" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "" #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:114 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "" #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "" #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "" #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "" #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:68 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:585 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "" #: library/library.cpp:80 msgid "Last played" msgstr "" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: ui/equalizer.cpp:137 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "" #: core/song.cpp:410 msgid "MPC" msgstr "" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "" #: library/library.cpp:74 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:92 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "" #: core/utilities.cpp:151 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "" #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "" #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "" #: core/organise.cpp:73 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:139 msgid "Party" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "" #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "" #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "" #: core/song.cpp:431 msgid "Stream" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "" #: ui/about.cpp:74 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "" #: core/song.cpp:426 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "" #: devices/giolister.cpp:157 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/header000066400000000000000000000004321260417502300240510ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # David Sansome , 2010. # #, fuzzy msgid "" msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/hi.po000066400000000000000000004043521260417502300236470ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # ahmed mirza , 2012 # FIRST AUTHOR , 2010 # utkarsh , 2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Hindi (http://www.transifex.com/davidsansome/clementine/language/hi/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr "ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr "pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr "सेकंड्स" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "गाने" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 एल्बम " #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 दिन" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 दिन पहले " #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 प्लेलिस्ट (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 चयन किया " #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 गाना " #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 gane" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 गाने mile" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 गाने मिले ( %2 प्रदर्शित है )" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 tracks" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 hastantarit" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1 Wiimotedev modul" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 अन्य shrota" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "कुल %L1 बार चलाया" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n असफल " #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n samapt" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n शेष hain" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&संरेखित lipi" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&kendra" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&anukul" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&saha" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&chipaye %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&chipaye" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&baye" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&कोई nahi" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&बंद" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&dayen" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&खीचे कॉलम विंडो फिट करने के लिए" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&upkaran" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(कई गानो में विभिन्नता)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "और बाकि सारे आमरोक सहयोगि.." #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 din" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 giit" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k एमपी3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 यादृच्छिक giit" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "आज ही परीमियम मे उननयन करे" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Spotify Premium khaate ke zaroorat hai" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "" #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "" #: core/song.cpp:422 msgid "AIFF" msgstr "" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "" #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "" #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "" #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "" #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "" #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "" #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "" #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Saare kalakaar" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:80 msgid "All the translators" msgstr "" #: library/library.cpp:98 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:85 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Kalakar" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "" #: ui/about.cpp:68 msgid "Authors" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "" #: core/database.cpp:648 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "" #: core/song.cpp:428 msgid "CDDA" msgstr "" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "" #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:114 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "" #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "" #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "" #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "" #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:68 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:585 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "" #: library/library.cpp:80 msgid "Last played" msgstr "" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: ui/equalizer.cpp:137 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "" #: core/song.cpp:410 msgid "MPC" msgstr "" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "" #: library/library.cpp:74 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:92 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "" #: core/utilities.cpp:151 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "" #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "" #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "" #: core/organise.cpp:73 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:139 msgid "Party" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "" #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "" #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "" #: core/song.cpp:431 msgid "Stream" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "" #: ui/about.cpp:74 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "" #: core/song.cpp:426 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "" #: devices/giolister.cpp:157 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/hr.po000066400000000000000000005131561260417502300236630ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # gogo , 2010 # gogo , 2010 # PyroCMS HR , 2013 # gogo , 2013-2015 # gogo , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Croatian (http://www.transifex.com/davidsansome/clementine/language/hr/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hr\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nMožete dodati popise izvođenja u omiljene popise izvođenja klikom na ikonu zvijezdice koja se nalazi pokraj naziva popisa izvođenja\n\nOmiljeni popisi izvođenja biti će spremljeni ovdje" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " dana" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " msek" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " točka" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr " s" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " sekundi" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " pjesme" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 pjesma)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 albuma" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 dana" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 dana prije" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 na %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 popisi izvođenja (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 odabranih od" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 pjesma" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 pjesme" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 pronađenih pjesma" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 pronađenih pjesama (prikazuje %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 pjesama" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 preuzeto" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: module Wiimote uređaja" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 drugih slušatelja" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 ukupno izvođenja" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n nije uspjelo" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n završeno" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n preostalo" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Poravnaj tekst" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Centriraj" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Podešeno" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "Dodaci" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "Pomoć" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&Sakrij %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Sakrij..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Lijevo" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "Glazba" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Nijedan" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "Popis izvođenja" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Zatvorite Clementine" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Način ponavljanja" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Desno" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Način naizmjeničnog sviranja" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Rastegni stupce da stanu u prozor" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "Alati" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(različito kroz više pjesama)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", od " #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...i svi Amarokovi suradnici" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0 piksela" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 dan" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 pjesma" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192,000Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40 %" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44,100Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48,000Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 naizmjeničnih pjesama" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96,000Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Nadogradite odmah na Premium račun" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Ako nije odabrano, Clementine će pokušati spremiti vaše ocjene i ostalu statistiku u odvojenu bazu podataka bez promjene vaših datoteka.

Ako je odabrano, Clementine će spremiti statistiku u oboje, u bazu podataka i izravno u datoteku svaki puta kada je datoteka izmjenjena.

Imajte na umu da to možda neće raditi sa svakim formatom i ako ne postoji standard za to izvođenje ostali glazbeni svirači možda ih neće moći pročitati.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Prefiks riječi s nazivom polja za ograničavanje pretraživanja na tom polju, npr. izvođač:Bode pretražuje fonoteku za sve izvođače koji sadrže riječ Bode.

Dostupna polja: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Ovo će zapisati ocjene i statistike pjesama u oznaku datoteke za sve pjesme u vašoj fonoteci.

Ovo nije potrebno ako je "Spremi ocjene i statistiku u datoteku oznaka" mogućnost uvijek aktivirana.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Znakovi započeti s %, npr: %izvođač %album %pjesma

\n\n

Ako imate dijelove teksta koji sadrže znakove sa vitičastom zagradom, taj dio će biti sakriven ako su oznake prazne.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Spotify Premium račun je obvezan." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Klijent se može povezati samo ako je ispravan kôd upisan." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Pametni popis izvođenja je dinamični popis pjesama koje dolaze iz vaše fonoteke. Ima različitih vrsta popisa izvođenja koje nude drugačiji način izbora pjesama." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Pjesma će biti odabrana u popisu izvođenja ako se podudara s ovim uvjetima" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "SVA SLAVA HYPNOTOADU!" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Prekini" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "O %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "O Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "O Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Apsolutne" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Pojedinosti računa" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Pojedinosti računa (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Radnja" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Radnja" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Aktiviraj/deaktiviraj Wii Daljinski upravljač" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Aktivnosti streama" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Dodajte podcast" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Dodajte stream" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Dodaj novu liniju ako je podržana od vrste obavijesti" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Dodajte radnju" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Dodaj sve pjesme iz direktorija i svih njegovih poddirektorija" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Dodajte novi stream..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Dodajte direktorij..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Dodaj datoteku" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Dodaj datoteku u enkôder" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Dodaj datoteku(e) u enkôder" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Dodajte datoteku..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Dodajte datoteku za transkôdiranje..." #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Dodajte mapu" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Dodajte mapu..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Dodajte novu mapu" #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Dodajte podcast" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Dodajte podcast..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Dodajte izraz za traženje" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Dodajte oznaku albuma pjesme" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Dodajte oznaku izvođača albuma" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Dodajte oznaku izvođača pjesme" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Dodaj auto pogodak pjesme" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Dodajte oznaku skladatelja pjesme" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Dodajte oznaku diska pjesme" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Dodajte oznaku naziva pjesme" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Dodajte oznaku žanra pjesme" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Dodajte oznaku grupiranja pjesme" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Dodajte oznaku duljine pjesme" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Dodajte oznaku izvođača pjesme" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Dodajte oznaku brojeva izvođenja pjesme" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Dodaj ocjenu pjesme" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Dodajte oznaku brojeva preskakanja pjesme" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Dodajte oznaku naziva pjesme" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Dodaj pjesmu u priručnu memoriju" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Dodajte oznaku broja pjesme" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Dodajte oznaku godine pjesme" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Dodaj pjesmu u \"Moja glazba\" kada je \"Sviđa mi se\" tipka kliknuta" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Dodajte stream..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Dodaj u Moja glazba" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Dodaj na Spotify popis izvođenja" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Dodaj u Spotify ocjenjeno" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Dodajte na drugi popis izvođenja" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Dodaj u zabilješku" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Dodajte u popis izvođenja" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Se odabrati za reprodukciju i dodati na popis izvođenja" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Dodaj korisnika/grupu u zabilješku" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Dodajte radnju Wiimote uređaja" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Dodajte..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Dodano ovaj mjesec" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Dodano ovaj tjedan" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Dodano ove godine" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Dodano danas" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Dodano tijekom tri mjeseca" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Napredno grupiranje..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Nakon " #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Nakon kopiranja..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Album (idealna glasnoća za sve pjesme)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Izvođač albuma" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Omot albuma" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Album info na jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Albumi" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Albumi s omotima" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Albumi bez omota" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Svi" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Sve datoteke" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "Sva slava Hypnotoadu!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Svi albumi" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Svi izvođači" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Sve datoteke (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Svi popisi izvođenja (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Svi prevoditelji" #: library/library.cpp:98 msgid "All tracks" msgstr "Sve pjesme" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Dopusti klijentu da preuzme glazbu s ovog računala." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Dopusti preuzimanja" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Dopusti mid/side enkôdiranje" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Pokraj orginala" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Uvijek sakrij glavni prozor" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Uvijek prikaži glavni prozor" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Uvijek započinji reprodukciju glazbe" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon Cloud disk" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Dodatni dodatak je potreban za korištenje Spotify-a u Clementineu. Želite li dodatak preuzeti i odmah ga instalirati?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Greška je nastala tijekom učitavanja iTunes baze podataka" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Greška je nastala zapisivanjem metapodataka '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Dogodila se neodređena greška." #: ui/about.cpp:85 msgid "And:" msgstr "I:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Bijesan" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Izgled" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Dodajte datoteku/URL u popis izvođenja" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Dodajte na trenutni popis izvođenja" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Biti dodana na popis izvođenja" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Primjenite kompresiju da spriječite isječak" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Sigurno želite izbrisati \"%1\" postavke?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Sigurno želite resetirati statistiku pjesama?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Sigurno želite zapisati statistiku pjesama u datoteke pjesama za sve pjesme u vašoj fonoteci?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Izvođač" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Info izvođača" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Vrsta glazbe izvođača" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Prvi izvođač" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Pitaj prilikom spremanja" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Format zvuka" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Zvučni izlaz" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Provjera autentičnosti nije uspjela" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Autor" #: ui/about.cpp:68 msgid "Authors" msgstr "Autori" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Auto" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Automatske" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Automatsko ažuriranje" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Automatski otvori pojedine kategorije u stablu fonoteke" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Dostupno" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Prosječna brzina prijenosa" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Prosječna veličina slike" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "BBC podcasti" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Stream pozadine" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Boja pozadine" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Slika pozadine" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Prozirnost pozadine" #: core/database.cpp:648 msgid "Backing up database" msgstr "Sigurnosno kopiranje baze podataka" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Balansiranje" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "Zabrani (Last.fm skroblanje)" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Bar analizator" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Osnovno plava" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Osnovni zvučni format" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Ponašanje" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Najbolje" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Životopis s %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Brzina prijenosa" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Brzina prijenosa" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Brzina prijenosa" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Blok analizator" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Vrsta bloka" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Zamućenje" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Pojedinosti" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Boom analizator" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Pogledaj..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Trajanje međuspremnika" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Međupohrana" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Izgradnja Seafile rasporeda..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Ovi izvori su onemogućeni:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Tipke" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Podrška za CUE listu" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Putanja priručne memorije:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Priručna memorija" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "Priručna memorija %1" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Otkaži" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Prekini preuzimanje" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Captcha je potrebna.\nProbajte se prijaviti na Vk.com s vašim preglednikom, za popravak problema." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Promijenite omot albuma" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Promijeni veličinu slova..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Promjenu načina ponavljanja" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Promijeni prečac..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Promijenite naizmjenični mod" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "Promijeniti trenutno reproduciranu pjesmu" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Promijeni jezik" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "Promjena će nastupiti pri početku reprodukcije sljedeće pjesme" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Promjena postavke mono reprodukcije imati će učinka na sljedeće reproducirane pjesme" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Provjeri za nove nastavke" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Provjeri ažuriranja" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Provjeri ima li nadogradnja" #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Odaberite Vk.com direktorij priručne memorije" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Izaberite naziv za svoj pametni popis izvođenja" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Automatski odabir" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Odaberite boju..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Odaberite slova..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Odaberite s popisa" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Odaberite kako je popis izvođenja razvrstan i koliko pjesama sadrži." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Odaberi direktorij preuzimanja podcasta" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Odaberite internet usluge koje želite imati prikazane." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Odaberite web stranice koje će Clementine koristit za pretragu teksta pjesama." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Klasičan" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Brisanje" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Isprazni" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Ispraznite popis izvođenja" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Clementine greška" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Clementine narančasto" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Clementine vizualizacija" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine može automatski konvertirati glazbu koju kopirate na ovaj uređaj u format koji može reproducirati." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Clementine može reproducirati glazbu koju ste spremili na Amazon Cloud Drive" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine može reproducirati glazbu koju ste spremili na Box" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine može reproducirati glazbu koju ste spremili na Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine može reproducirati glazbu koju ste spremili na Google Disk" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine može reproducirati glazbu koju ste spremili na OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine može prikazati poruku kada se pjesma mijenja." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine može uskladiti vaš popis pretplate s vašim ostalim računalima i podcast aplikacijama. Napravite račun." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine ne može učitati nijednu projektM vizualizaciju. Provjerite da li je Clementine instaliran ispravno." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Clementine preglednik slika" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine nije pronašao rezultate za ovu datoteku" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine će potražiti glazbu u:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Kliknite ovdje kako biste dodali glazbu!" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Kliknite ovdje za dodavanje ovog popis izvođenja u omiljeno, popis izvođenja će biti spremljen i dostupan kroz \"Popis izvođenja\" okvir na lijevoj bočnoj traci" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Kliknite za odabir između preostalog vremena reprodukcije i ukupnog vremena reprodukcije" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Klikom na tipku prijave otvorit će se web preglednik. Nakon prijave vratite se u Clementine." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Zatvori" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Zatvori popis izvođenja" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Zatvorite vizualizaciju" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Zatvaranje ovog prozora poništit će download." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Zatvaranje ovog prozora zaustavit će pretragu omota albuma" #: ui/equalizer.cpp:114 msgid "Club" msgstr "Klub" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Boje" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Zarezom odvojen popis klasa:razina, razina je 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Komentar" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Društveni radio" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Završi oznake automatski" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Završite oznake automatski..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Skladatelj" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Konfiguracija %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Podesi Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Podesi prečace" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Podesite Spotify ..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Podesi Subsonic..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Podesite Vk.com..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Podesite globalno pretraživanje..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Podesi fonoteku..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Podesite podcaste..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Podesi..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Spoji Wii Daljinski upravljač koristeći aktiviraj/deaktiviraj naredbu" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Spoji uređaj" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Spajanje Spotify-a" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Veza je odbijena od strane poslužitelja, provjerite URL poslužitelja. Npr. http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Veza je istekla, provjerite URL poslužitelja. Npr. http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Poteškoće s povezivanjem ili je zvuk onemogućio vlasnik" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Konzola" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Konstantna brzina prijenosa" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Konvertiraj svu glazbu" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Konvertiraj svu glazbu koju uređaj može reproducirati" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Konvertiraj lossless zvučne datoteke prije slanja na mrežni daljinski upravljač." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Konvertiraj lossless datoteke" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Kopiraj dijeljeni URL u međuspremnik" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Kopiraj u međuspremnik" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Kopirajte na uređaj..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Kopirajte u fonoteku..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Autorsko pravo" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Nemoguće se povezati na Subsonic, provjerite URL poslužitelja. Npr; http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Nije moguče stvoriti GStreamer element \"%1\" - provjerite imate li sve GStreamer pluginove instalirane" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Nemoguće stvaranje popisa izvođenja" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Nije moguče pronaći muxer %1, provjerite imate li sve GStreamer pluginove instalirane" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Nije moguće pronaći enkôder za %1, provjerite imate li ispravne GStreamer pluginove instalirane" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Nije moguće otvoriti izlaznu datoteku %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Upravljanje omotima" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Omot albuma iz ugrađene slike" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Omot albuma učitan automatski iz %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Omot albuma ručno uklonjen" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Omot albuma nije postavljen" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Omot albuma postavljen iz %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Omoti s %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Postepeno utišaj kada se pjesma mijenja automatski" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Postepeno utišaj kada se pjesma mijenja ručno" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Prilagođeno" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Odaberite sliku pozadine:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Prilagođene postavke poruka" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Prilagođeno..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "DBus putanja" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dance" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Baza podataka je oštećena. Pročitajte na https://code.google.com/p/clementine-player/wiki/DatabaseCorruption upute kako obnoviti bazu podataka" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Izrađeno datuma" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Izmjenjeno datuma" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Dani" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "Za&dano" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Smanji glasnoću zvuka za 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Smanji glanoću zvuka za posto" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Smanji glasnoću zvuka" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Uobičajena slika pozadine" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Zadani uređaj na %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Zadano" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Pauza između vizualizacija" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Izbriši" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Obriši preuzete podatke" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Izbrišite datoteku" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Izbrišite s uređaja..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Izbrišite s diska..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Obriši reproducirane nastavke" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Izbrišite predložak" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Izbrišite pametni popis izvođenja" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Izbriši orginalne datoteke" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Brisanje datoteka" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Uklonite označenu pjesmu s reprodukcije" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Uklonite označenu pjesmu za reprodukciju" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Odredište" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Pojedinosti..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Uređaj" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Mogućnosti uređaja" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Naziv uređaja" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Mogućnosti uređaja..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Uređaji" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Dijalog" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Jeste li možda mislili" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Lozinka" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Korisničko ime" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Direktna internet veza" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Direktorij" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Onemogućite vrijeme trajanja" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Onemogući generiranje traka tonaliteta" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Onemogućeno" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Onemogućeno" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Disk" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Isprekidani prijenos" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Mogućnosti zaslona" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Prikaži zaslonski prikaz (OSD)" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Pretražite ponovno cijelu fonoteku" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Pokreni potpuno ponovno pretraživanje" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Pokreni potpuno ponovno pretraživanje..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Ne konvertiraj glazbu" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Nemoj prepisati" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "Pokretanjem potpunog ponovnog pretraživanja izgubit ćete sve meta podatke spremljene u Clementine poput omota albuma, brojeva reproduciranja i ocjena. Clementine će potpuno pretražiti svu vašu glazbu u Google Disku, to može potrajati neko vrijeme." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Ne ponavljaj" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Ne prikazuj u različitim izvođačima" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Ne prikazuj odslušane nastavke" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Ne sviraj naizmjenično" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Ne zaustavljaj!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Donirajte" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Za otvaranje kliknite dva puta" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "Dvostruk klik na pjesmu u popisu izvođenja će..." #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Dvostrukim klikom pjesma će..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Preuzeto %n nastavaka" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Preuzmi direktorij" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Preuzmi nastavke u" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Učlani se" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Preuzmi automatski nove nastavke" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Zahtjev preuzimanja" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Postavke preuzimanja" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Preuzmite Android aplikaciju" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Preuzmi ovaj album" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Preuzmi ovaj album..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Preuzmi ovaj nastavak" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Preuzmi..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Preuzimanje (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Preuzimanje Icecast direktorija" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Preuzimanje Jamendo kataloga" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Preuzimanje Magnatune kataloga" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Preuzimanje Spotify dodatka" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Preuzimanje metapodataka" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Promijenite položaj pomicanjem mišem" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Udvostručen korak" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Trajanje" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Dinamičan način je uključen" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Dinamičan naizmjeničan mix" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Uredite pametni popis izvođenja..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Uredi oznaku \"%1\"..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Uredite oznake..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Uredite oznake" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Uredite informacije o pjesmi" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Uredite informacije o pjesmi..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Uredite informacije pjesama..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Uredite ..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "E-pošta" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Omogući podršku Wii Daljinskog upravljanja" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Omogući automatsku priručnu memoriju" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Omogući ekvalizator" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Omogući prečac samo ako je Clementine fokusiran" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Omogući uređivanje meta podataka pjesme u redku s klikom" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Omogućite izvore ispod da bi ih uključili u rezultate pretraživanja. Rezultati će biti prikazani ovim redosljedom." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Omogući/Onemogući Last.fm scrobblanje" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Složenost enkôdiranja" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Kvaliteta pogona enkôdiranja" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Način enkôdiranja" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Upišite URL" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Upišite URL za preuzimanje omota s interneta:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Upišite naziv za izvezene omote (bez vrste datoteke):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Upišite novi naziv za popis izvođenja" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Upišite iznad zahtjev za pretraživanje glazbe na vašem računalu i internetu" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Upišite uvjete pretraživanja ispod za pronalaženje podcasta u iTunes trgovini" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Upišite uvjete pretraživanja ispod za pronalaženje podcasta na " #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Upišite zahtjev za pretraživanje ovdje" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Upišite URL internet radio streama:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Upišite naziv mape" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Upišite ovu IP adresu u aplikaciju za spajanje na Clementine." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Cijelu kolekciju" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Ekvalizator" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Odgovara --log-levels *: 1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Odgovara --log-levels *: 3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Greška" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Greška pri ripanju CD-a" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Greška pri spajanju na MTP uređaj" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Greška u kopiranju pjesama" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Greška u brisanju pjesama" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "greška pri preuzimanju Spotify dodatka" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Greška pri učitavanju %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Greška pri učitavanju di.fm popisa izvođenja" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Greška pri obradi %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Greška pri učitavanju glazbenog CD-a" #: library/library.cpp:68 msgid "Ever played" msgstr "Ikada reproducirano" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Svakih 10 minuta" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Svakih 12 sati" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Svaka 2 sata" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Svakih 20 minuta" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Svakih 30 minuta" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Svakih 6 sati" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Svakih sat vremena" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Osim između pjesama na istom albumu ili na istom CUE popisu" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Postojeći omoti" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Proširi" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Istječe %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Izvezi omote" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Izvoz omota" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Izvezi preuzete omote" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Izvezi umetnute omote" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Izvoz završen" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Izvezeno %1 omota od ukupno %2 (%3 preskočena)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Postepeno utišaj pri pauziranju reprodukcije / postepeno pojačaj pri ponovnom pokretanju reprodukcije" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Utišaj kada se zaustavlja pjesma" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Utišavanje" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Trajanje utišavanja" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Nemoguće čitanje CD uređaja" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Neuspjelo dohvaćanje direktorija" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Neuspjelo preuzimanje podcasta" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Neuspjelo učitavanje podcasta" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Neuspjela raščlamba XML-a za ovaj RSS izvor" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Brzo" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Omiljene pjesme" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Preuzmi prazne omote" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Preuzmi automatski" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Preuzimanje završeno" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Dohvaćanje Subsonic fonoteke" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Greška pri preuzimanju omota" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Format datoteke" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Ekstenzija datoteke" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Format datoteke" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Naziv datoteke" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Naziv datoteke (bez putanje)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Naziv datoteke uzorka:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Putanje datoteke" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Veličina datoteke" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Vrsta datoteke" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Naziv datoteke" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Datoteke" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Datoteke za enkôdiranje" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Pronađite pjesme u svojoj fonoteci koji se poklapa sa zadanim uvjetom." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Potraži ovog izvođača" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Prepoznavanje pjesme" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Kraj" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Prva razina" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Raširi omot" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Veličina slova" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Zbog razloga licenciranja Spotify-a podrška je u posebnom dodatku." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Forsiraj mono enkôdiranje" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Zaboravi uređaj" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Zaboravljanje uređaja uklonit će ga s ovog popisa i Clementine će morati ponovno pretražiti sve pjesme sljedeći put kada ga spojite." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Oblik" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Format" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Broj sličica" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Okvira po međuspremniku" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Smrznt" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Pun Bas" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Pun Bas + Treble" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Pun Treble" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Općenito" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Opće postavke" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Vrsta glazbe" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Nabavi URL za dijeljenje ove Spotify pjesme" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Nabavi URL za dijeljenje ovog popisa izvođenja" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Pribavljanje kanala" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Pribavljanje streamova" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Upišite naziv streama:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Idi" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Idi na sljedeću karticu popisa izvođenja" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Idi na prijašnju karticu popisa izvođenja" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Disk" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Preuzeto %1 omota od %2 (%3 nije preuzeto)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Posivi pjesme kojih nema na popisu izvođenja" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Grupiraj fonoteku po..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Grupiraj po" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Grupiraj po Albumu" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Grupiraj po Izvođaču" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Grupiraj po Izvođaču/Albumu" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Grupiraj po Izvođaču/Godini-Albumu" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Grupiraj po Vrsti glazbe/Albumu" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Grupiraj po Vrsti glazbe/Izvođaču/Albumu" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Grupiranje" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "HTML stranica ne sadrži niti jedan RSS izvor" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "HTTP 3xx status kôd je primljen bez URL-a, potvrdite podešavanje poslužitelja." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "HTTP proxy" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Sretan" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Informacije o hardveru" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Informacije o hardveru samo su dostupne dok je uređaj spojen" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Najbrže" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Puno (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Visoka (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "Hip Hop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Udaljeno računalo nije pronađeno, provjerite URL poslužitelja. Npr. http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Sati" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Nemam Magnatune račun" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Ikona" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Ikona na vrh" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Prepoznavanje pjesme" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Ako je aktivirano, klikom na odabranu pjesmu u popisu izvođenja dopustit će vam izravno uređivanje oznake" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Ako nastavite, ovaj uređaj će raditi sporo i pjesme kopirane na njega neće raditi." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Ako vam je poznat URL podcasta, upišite ga ispod i pritisnite Idi." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Ignoriraj \"The\" u nazivu izvođača" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Slike (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Slike (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Uvezi..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "Za %1 dana" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "Za %1 tjedna" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "U dinamičkom modu nove pjesme će biti izabrane i dodane u popis izvođenja svaki puta kada je pjesma odsvirana." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Pristigle poruke" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Prikaži omot albuma u obavijesti" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Obuhvati sve pjesme" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Nekompatibilna Subsonic REST protokol inačica. Klijent se mora nadograditi." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Nekompatibilna Subsonic REST protokol inačica. Poslužitelj se mora nadograditi." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Nepotpuno podešavanje, pobrinite se da su sva polja popunjena." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Pojačaj glasnoću zvuka za 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Povećaj glanoću zvuka za posto" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Pojačaj glasnoću zvuka" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Indeksiranje %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Informacije" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Ulazne mogućnosti" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Umetni..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Instaliran" #: core/database.cpp:585 msgid "Integrity check" msgstr "Provjera integriteta" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Internet usluge" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Internet usluge" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "Uvodne pjesme" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Neispravan API ključ" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Neispravan format" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Neispravna metoda" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Neispravni parametri" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Neispravan izvor naveden" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Neispravna usluga" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Neispravan ključ sesije" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Obrni odabir" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Jamendo najslušanija pjesma" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Jamendo top pjesma" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo top pjesma mjeseca" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo top pjesma tjedna" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Jamendo baza podataka" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Skočiti odmah na prijašnju pjesmu" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Prebaci na trenutno reproduciranu pjesmu" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Držite tipke za %1 sekundu..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Držite tipke za %1 sekundu..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Nastavi izvođenje u pozadini kada je prozor zatvoren" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Zadrži orginalne datoteke" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Mačići" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Jezik" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Laptop/Slušalice" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Velika dvorana" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Veliki omot albuma" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Veliki omot albuma (s pojedinostima ispod)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Veliki omot albuma (bez pojedinosti)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Velika bočna traka" #: library/library.cpp:80 msgid "Last played" msgstr "Zadnje reproducirano" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Zadnje reproducirano" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm je trenutno zauzet, pokušajte ponovno za nekoliko minuta" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Last.fm lozinka" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Last.fm broj izvođenja" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Last.fm preporuke" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Last.fm korisničko ime" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Najmanje omiljene pjesme" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Lijevo" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Trajanje" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Fonoteka" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Napredno grupiranje fonoteke" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Obavijest o ponovnom pretraživanju fonoteke" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Pretraživanje fonoteke" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Granice" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Učitaj" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Učitajte omot s URL-a" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Učitajte omot sa URL-a..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Učitaj omot s diska" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Učitajte omot s diska..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Otvorite popis izvođenja" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Otvorite popis izvođenja..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Učitaj MTP uređaj" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Učitaj iPod bazu podataka" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Učitaj pametni popis izvođenja" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Učitavanje pjesama" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Učitaj stream" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Učitavanje pjesama" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Učitavanje informacija o pjesmi" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Učitavanje..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Učitaj Datoteke/URL, zamijeni trenutni popis izvođenja" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Prijava" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Neuspjela prijava" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Odjava" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Profil dugoročnog predviđanja (DP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Sviđa mi se" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "Sviđa mi se (Last.fm skroblanje)" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Malo (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Niska (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Profil niske složenosti (NS)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Tekstovi pjesama" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Tekstovi pjesama sa %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Tekst pjesme s ID3v2 oznake" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Magnatune preuzimanje" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Magnatune preuzimanje završeno" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Glavni profil (GLAVNI)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Učinite tako!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Učinite tako!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Učini popis izvođenja dostupnim kada je veza prekinuta" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Neispravan odgovor" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Ručno proxy podešavanje" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Ručno" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Proizvođač" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Označi kao preslušano" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Označi kao novo" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Svaki uvjet za pretragu se mora podudarati (AND)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Jedan ili više uvjeta za pretragu se mora podudarati (OR)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Maksimalno rezultata globalne pretrage" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Maksimalna brzina prijenosa" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Medij je promijenjen. Ponovno učitavanje" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Srednje (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Srednja (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Vrsta članstva" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Minimalna brzina prijenosa" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Minimalan ispun međuspremnika" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Nedostaju projectM predložci" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Nadziri fonoteku radi promjena" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Mono reprodukcija" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Mjeseci" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Tonalitet" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Stil trake tonaliteta" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Traka tonaliteta" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Više" #: library/library.cpp:84 msgid "Most played" msgstr "Najviše reproducirano" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Točka montiranja" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Točka montiranja" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Pomakni dolje" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Premjesti u fonoteku..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Pomakni gore" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Glazba" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Fonoteka" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Utišaj" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Moji albumi" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Moja glazba" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Moje preporuke" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Naziv" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Naziv" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Mogućnosti promjene naziva" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Uskopojasni (UP)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Mrežni Proxy" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Mrežno upravljanje" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Nikada" #: library/library.cpp:74 msgid "Never played" msgstr "Nikada reproducirano" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Nikada ne započinji reprodukciju glazbe" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Nova mapa" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Novi popis izvođenja" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Novi pametni popis izvođenja" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Nove pjesme" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Nova pjesma bit će automatski dodana." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Najnovija pjesma" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Sljedeća pjesma" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Sljedeća pjesma" #: core/utilities.cpp:151 msgid "Next week" msgstr "Sljedeći tjedan" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Bez analizatora" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Bez slike pozadine" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Nema omota za izvoz." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Bez dugih blokova" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Nema pronađenih podudaranja. Ispraznite okvir za pretraživanje da bi se ponovno pokazao popis izvođenja." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Bez kratkih blokova" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Ništa" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Nijedna od odabranih pjesama nije prikladna za kopiranje na uređaj" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Normalan" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Normalna vrsta blokova" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Nije dostupno tijekom korištenja dinamičkog popis izvođenja" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Nije spojeno" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Nema dovoljno sadržaja" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Nema dovoljno obožavatelja" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Nema dovoljno članova" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Nema dovoljno susjeda" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Nije instaliran" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Niste prijavljeni" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Nije montirano - dva put klikni za montiranje" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Ništa pronađeno" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Vrsta obavijesti" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Obavijesti" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Sada se reproducira" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Broj prikazanih nastavaka" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "OSD Prikaz" #: widgets/osd.cpp:173 msgid "Off" msgstr "Isključi" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "Uključi" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Prihvati samo povezivanje s klijentima unutar IP raspona:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Samo dopusti povezivanje s lokalne mreže" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Samo prikaži prvi" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Zasjenjenost" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Otvori %1 u pregledniku" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Otvorite &glazbeni CD..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Otvori OPML datoteku" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Otvori OPML datoteku..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Otvori direktorij za uvoz glazbe iz" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Otvorite uređaj" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Otvorite datoteku..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Otvori u Google Disku" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Otvorite u novom popisu izvođenja" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Se otvoriti u novom popisu izvođenja" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Otvori u svojem pregledniku" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Otvorite..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Radnja nije izvršena" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Podesite brzinu prijenosa" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Podesite kvalitetu" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Mogućnosti..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Organizirajte datoteke" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Organizirajte datoteke..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Organiziranje datoteka" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Orginalne oznake" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "Izvorna godina" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "Izvorna godina - Album" #: library/library.cpp:118 msgid "Original year tag support" msgstr "Podrška oznake izvorne godine" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Druge mogućnosti" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Izlaz" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Izlazni uređaj" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Izlazne mogućnosti" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Prepiši sve" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Prekopiraj preko postojeće datoteke" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Prepiši samo manje" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Vlasnik" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Raščlanjivanje Jamendo kataloga" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Party" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Lozinka" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Pauziraj reprodukciju" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Pauziraj reprodukciju" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Reprodukcija pauzirana" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Izvođač" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Piksela" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Jednostavna bočna traka" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Pokreni reprodukciju" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Broj izvođenja" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Reproduciraj ako se zaustavi, pauziraj ako svira" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Reproduciraj glazbu ako se trenutno ništa ne reproducira" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Reproduciraj pjesmu iz popisa izvođenja" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Pokreni reprodukciju/Pauziraj" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Reprodukcija" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Mogućnosti preglednika" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Popis izvođenja" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Popis izvođenja je završen" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Mogućnosti popisa izvođenja" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Vrsta popisa izvođenja" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Popis izvođenja" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Odaberite vaš preglednik i vratite se u Clementine." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Status dodatka:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcasti" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Trajanje skočnog prozora, obavijesti ili ljepšeg OSD-a" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Ulaz" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Pred-pojačanje" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Osobitost" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Mogućnosti" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Mogućnosti..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Prioritetni nazivi omota albuma (odvojeno zarezom)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Željeni zvučni format" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Poželjna brzina prijenosa" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Željeni format" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Premium zvučni format" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Predložci:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Pritisni kombinaciju tipka za korištenje" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Pritisni tipku" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Pritisni kombinaciju tipka za korištenje %1..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Pritiskom na \"Prijašnja pjesma\" reproduktor će..." #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Mogućnosti ljepšeg OSD-a" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Prikaz" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Prijašnja pjesma" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Prijašnja pjesma" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Ispiši podatke o verziji" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Napredak" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Napredak" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psihodelično" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Pritisni Wiiremote tipku" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Stavi pjesmu u naizmjenični redosljed" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Kvaliteta" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Kvaliteta" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Tražim uređaj..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Upravljanje odabranim pjesmama za reprodukciju" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Odaberite označenu pjesmu za reprodukciju" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Odaberite pjesmu za reprodukciju" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (jednaka glasnoća za sve pjesme)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Kiša" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Kiša" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Naizmjenična vizualizacija" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Ocjenite trenutnu pjesmu s 0 zvijezdica" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Ocjenite trenutnu pjesmu s 1 zvijezdicom" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Ocjenite trenutnu pjesmu s 2 zvijezdice" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Ocjenite trenutnu pjesmu s 3 zvijezdice" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Ocjenite trenutnu pjesmu s 4 zvijezdice" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Ocjenite trenutnu pjesmu s 5 zvijezdica" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Ocjena" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Stvarno želite prekinuti?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Ograničenje preusmjeravanja je premašeno, potvrdite podešavanje poslužitelja." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Osvježi katalog" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Osvježi kanale" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Osvježi popis stanica" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Osvježi streamove" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Relativne" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Zapamti wiiremote zamah" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Zapamti od prošlog pokretanja" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Zapamti moj izbor" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Uklonite" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Uklonite radnju" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Ukloni duplikate iz popisa izvođenja" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Uklonite mapu" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Ukoni iz Moje glazbe" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Ukloni iz zabilješki" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Uklonite iz popisa izvođenja" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Ukloni popis izvođenja" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Ukloni popise izvođenja" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Ukloni nedostupne pjesme s popisa izvođenja" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Preimenujte popis izvođenja" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Preimenujte popis izvođenja..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Promjenite redosljed pjesama ovim redosljedom..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Ponovi" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Ponovi album" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Ponovi popis izvođenja" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Ponovi pjesmu" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Zamijenite trenutni popis izvođenja" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Zamijeniti popis izvođenja" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Zamijeni razmake s podcrtama" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Ponavljanje pojačanja" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Način pred-pjačanja" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Izmješajte pjesme" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Potreban je kôd autentifikacije" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Poništite" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Poništite broj izvođenja" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Ponovno pokreni pjesmu, zatim skoči na prijašnju ako je pritisnuto ponovno" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Ponovno pokreni pjesmu ili sviraj prijašnju pjesmu unutar 8 sekundi od početka reprodukcije." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Ograniči na ASCII znakove" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Nastavi reprodukciju od prošloga pokretanja" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Povratak u Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Desno" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Ripaj" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Ripaj CD" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Ripaj glazbeni CD" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Pokreni" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "SOCKS proxy" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Greška SSL sigurnog povezivanja, provjerite podešavanja poslužitelja. SSLv3 mogućnost ispod može zaobići neke probleme." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Sigurno ukloni uređaj" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Sigurno ukloni uređaj nakon kopiranja" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Frekvencija" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Frekvencija" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Spremi .mood datoteke u vašu fonoteku" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Spremite omot albuma" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Spremite omot na disk..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Preuzmi sliku" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Spremite popis izvođenja" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Spremite popis izvođenja" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Spremite popis izvođenja..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Spremite predložak" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Spremi ocjene u datoteku oznaka kada je moguće" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Spremi statistiku u datoteku oznaka kada je moguće" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Spremite ovaj stream u internet kartici" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Spremanje statistike pjesama u datoteke pjesama" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Spremam pjesme" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Profil skalabilne brzine uzorkovanja (SBU)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Promijeni veličinu" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Pogodci" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Scrobblaj pjesmu koju slušam" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Traži" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Traži" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Pretražite Icecast stanice" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Icecast Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Pretražite Magnatune stanice" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Subsonic pretraživanje" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Pretraži automatski" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Pretražite omote albuma..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Upišite pretragu" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Pretraži gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Pretraži iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Način pretraživanja" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Mogućnosti pretraživanja" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Rezultati pretrage" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Uvjeti pretraživanja" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Druga razina" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Traži unatrag" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Traži unaprijed" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Traži pjesmu koja se tranutno izvodi po ralativnom broju" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Traži pjesmu koja se tranutno izvodi po apsolutnom položaju" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "Premotavanje pomoću prečaca tipkovnice" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Odaberi sve" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Odaberi ništa" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Odaberite boju pozadine:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Odaberite sliku pozadine" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Odaberite najbolju moguću podudarnost" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Odaberite boju slova:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Odaberite vizualizaciju" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Odaberite vizualizaciju..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Odaberi..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Serijski broj" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Poslužitelj" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "URL poslužitelja" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Pojedinosti poslužitelja" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Usluga nedostupna" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Postavite %1 na \"%2\"..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Postavi glasnoću zvuka na posto" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Postavi vrijednosti za sve odabrane pjesme..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Postavke" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Prečac" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Prečac za %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Prečac za %1 već postoji" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Prikaži" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Prikaži OSD" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Prikaži sjajnu animaciju za trenutnu pjesmu" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Prikaži traku tonaliteta u traci napretka pjesme" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Prikaži izvornu obavijest radne površine" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Prikaži obavijest kada promijenim način ponavljanja ili naizmjenični način" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Prikaži obavijest kada mijenjate glasnoću zvuka" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Prikaži obavijest prilikom pauziranja reprodukcije" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Prikažite skočni prozor iz trake sustava" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Prikaži ljepši OSD" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Prikaži iznad statusne trake" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Prikaži sve pjesme" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Prikaži sve pjesme" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Prikaži omot albuma u fonoteci" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Prikaži razdjelnike u stablu fonoteke" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Prikaži u punoj veličini..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Prikaži grupe u rezultatima globalne pretrage" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Prikaži u pregledniku datoteka..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Prikaži u fonoteci..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Prikaži u različitim izvođačima" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Prikaži traku tonaliteta" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Prikaži samo duplicirane pjesme" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Prikaži samo neoznačene pjesme" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Prikaži pjesmu koja se reproducira na svojoj stranici" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Prikaži prijedloge pretraživanja" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Prikaži \"Sviđa mi se\" tipku" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Prikaži tipku scrobblanja u glavnom prozoru" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Prikaži ikonu u traci sustava" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Prikaži omogućene i onemogućene izvore" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Prikaži/Sakrij" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Sviraj naizmjenično" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Sviraj naizmjenično albume" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Sviraj naizmjenično sve" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Izmješajte popis izvođenja" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Sviraj naizmjenično pjesme u ovom albumu" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Prijava" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Odjavi se" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Prijavljivanje..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Srodni izvođači" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Veličina" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Razlučivost:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Preskoči unatrag u popisu izvođenja" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Preskoči računanje" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Preskoči unaprijed u popisu izvođenja" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Preskoči odabrane pjesme" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Preskoči pjesmu" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Mali omot albuma" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Mala bočna traka" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Pametni popis izvođenja" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Pametni popisi izvođenja" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Informacije o pjesmi" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Info pjesme" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Isprika" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Razvrstaj po vrsti glazbe (abecednim redosljedom)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Razvrstaj po vrsti glazbe (po popularnosti)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Razvrstaj po nazivu stanica" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Razvrstaj pjesmu po" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Razvrstavanje" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Izvor" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Izvori" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Spotify greška prijave" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "URL Spotify popisa izvođenja" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Spotify dodatak" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Spotify dodatak nije instaliran" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "URL Spotify pjesama" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Standardno" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Sa zvjezdicom" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Pokreni ripanje" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Pokrenite popis izvođenja koji se trenutno izvodi" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Započni enkôdiranje" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Počnite tipkati nešto iznad u okvir za pretragu da bi ispunili taj popis rezultata pretraživanja" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Započinjem %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Započinjem..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Zaustavi reprodukciju" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Zaustavi nakon" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Zaustavi reprodukciju nakon pojedine pjesme" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Zaustavi reprodukciju nakon svake pjesme" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Zaustavi reprodukciju nakon ove pjesme" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Zaustavi reprodukciju" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Zaustavi reprodukciju nakon trenutne pjesme" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Zaustavi reprodukciju nakon pjesme: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Reprodukcija zaustavljena" #: core/song.cpp:431 msgid "Stream" msgstr "Stream" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Streamanje sa Subsonic poslužitelja zahtijeva valjanu licencu poslužitelja nakon 30-dnevnog probnog razdoblja." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Streaming račun" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Pretplatnici" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Uspješno!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "Uspješno zapisano %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Predložene oznake" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Sažetak" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Super visoko (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Super visoka (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Podržani formati" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Uskaldi statistiku s datotekama odmah" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Sinkronizacija Spotify ulaznog spremnika" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Sinkroniziranje Spotify popisa izvođenja" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Sinkronizacija Spotify pjesama označenim zvjezdicama" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Boje sustava" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Kartice pri vrhu" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Preuzimanje oznaka" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Ciljana brzina prijenosa" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Mogućnosti teksta" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Zahvaljujemo" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "\"%1\" naredba se ne može pokrenuti." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Omot albuma trenutno reproducirane pjesme" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "Direktorij %1 nije valjan" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "Druga vrijednost mora biti veća od prve!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Stranica koju ste zatražili ne postoji!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Stranica koju ste zatražli nije slika!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Probno razdoblje za Subsonic poslužitelj je završeno. Molim, donirajte za dobivanje ključa licence. Posjetite subsonic.org za više pojedinosti." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Inačica Clementinea koju ste upravo ažurirali zahtjeva ponovnu pretragu cijele fonoteke zbog novih mogućnosti navedenih ispod:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Postoje i druge pjesme u ovom albumu" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Dogodio se problem u komunikaciji s gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Dogodio se problem u preuzimanju metapodataka iz Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Dogodio se problem pri raščlambi odgovora iz iTunes trgovine" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Dogodio se problem u kopiranju nekih pjesama. Sljedeće datoteke ne mogu biti kopirane:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Dogodio se problem u brisanju nekih pjesama. Sljedeće datoteke ne mogu biti obrisane:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Ove datoteke bit će obrisane sa uređaja, sigurno želite nastaviti?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Ove datoteke će biti trajno obrisane sa diska. Sigurno želite nastaviti?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Ove mape će biti pretražene, pronađena glazba će biti dodana fonoteci!" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Ove postavke se koriste u dijalogu \"Enkôdiranje glazbe\" i kada enkôdirate glazbu prije kopiranja na uređaj." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Treća razina" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Ova radnja stvorit će bazu podataka koja može biti velika oko 150 MB.\nŽelite li svejedno nastaviti?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Ovaj album nije dostupan u zadanom formatu" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Ovo možete promijeniti kasnije u Mogućnostima" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Ovaj uređaj mora biti spojen i otvoren prije nego što Clementine vidi koji je format datoteke podržan." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Uređaj podržava sljedeće formate datoteka:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Uređaj neće raditi ispravno" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Ovo je MTP uređaj, kompajlirali ste Clementine bez libmtp potpore." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Ovo je iPod uređaj, kompajlirali ste Clementine bez libgpod potpore." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Ovo je prvi put da ste spojeni na ovaj uređaj. Clementine će sada pretražiti ima li glazbenih datoteka na uređaju - Ovo može potrajati neko vrijeme." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Ova mogućnost se može promijeniti u \"Ponašanje\" osobitostima" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Ovaj stream je samo za pretplaćene korisnike" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Ova vrst uređaja nije podržana: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "Vrijeme preskoka" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Naziv" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Danas" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Uključi/Isključi ljepši OSD" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Cijelozaslonski prikaz" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Uključi/isključi stanje reda čekanja" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Uključi/Isključi skrobblanje" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Uključi/Isključi vidljivost za ljepši OSD" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Sutra" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Previše preusmjeravanja" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Najpopularnije pjesme" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Ukupno albuma:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Ukupno preuzeto bajtova" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Ukupno mrežnih zahtjeva" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Broj" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Pjesme" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Enkôdiranje glazbe" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Log enkôdiranja" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Enkôdiranje" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Enkôdiranje %1 datoteka koristeći %2 zadana" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Mogućnosti enkôdiranja" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbina" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Isključivanje" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL(ovi)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Ultra širokopojasni (UŠP)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Nemoguće povezivanje" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Nije moguće preuzeti %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Nepoznato" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Nepoznata vrsta sadržaja" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Nepoznata greška" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Uklonite omot" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Ukloni preskakanje odabrane pjesme" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Ukloni preskakanje pjesme" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Otkažite pretplatu" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Nadolazeći koncerti" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Ažuriranje" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Ažuriraj sve podcaste" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Ažurirajte promjene u mapi fonoteke" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Ažuriraj fonoteku kada se Clementine pokrene" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Ažuriraj ovaj podcast" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Ažuriranje" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Ažuriranje %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Ažuriranje %1..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Ažuriranje fonoteke" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Upotreba" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Koristi oznaku izvođača albuma kada je dostupna" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Koristi Gnome prečace" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Koristi psihodelične boje" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Koristi ponovno dobivene metapodatake ako su dostupni" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Koristi SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Koristi Wii Daljinski upravljač" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Koristi prilagođene boje" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Koristi prilagođene poruke za obavijesti" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Koristi mrežni daljinski upravljač" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Koristite autentifikaciju" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Koristi pogon upravitelja brzine prijenosa" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Koristi dinamički mod" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Koristi obavijesti za prijavu statusa Wii Daljinskog upravljača" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Koristi vremensko oblikovanje šuma" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Koristi zadano sustavom" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Koristi boje zadane sustavom" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Koristi proxy postavke sustava" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Koristi normalizaciju glasnoće zvuka" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Iskorišteno" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Korisničko sučelje" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Korisničko ime" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Korištenje izbornika pri dodavanju pjesme će..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Promjenjiva brzina prijenosa" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Razni izvođači" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Inačica %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Pogled" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Način vizualizacije" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Vizualizacija" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Mogućnosti vizualizacije" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Detekcija govorne aktivnosti" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Glasnoća zvuka %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Zid" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Upozori me pri zatvaranju kartice popisa izvođenja" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Web stranica" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Tjedni" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Kada je Clementine pokrenut" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Kada Clementine traži omot albuma prvo će potražiti slike koje sadrže ove riječi. \nAko rezultati pretrage nisu pronađeni onda će se koristiti najveća slika iz direktorija." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "Prilikom spremanja popisa izvođenja, putanje datoteke trebale bi biti" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Kada je popis prazan..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Mogli biste još poslušati..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Širokopojasni (ŠP)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Daljinski upravljač %1: aktiviran" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Daljinski upravljač %1: spojen" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Daljinski upravljač %1: baterija kritično (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Daljinski upravljač %1: deaktiviran" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Daljinski upravljač %1: odspojen" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Daljinski upravljač %1: slaba baterija (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimote uređaj" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Bez omota:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Želite li preseliti druge pjesme s ovog albuma u razne izvođače?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Želite li pokrenuti ponovnu potpunu prtetragu odmah?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Zapiši svu statistiku pjesama u datoteke pjesama" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Zapiši metapodatke" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Pogrešno korisničko ime ili lozinka." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Godina" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Godina - Album" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Godine" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Jučer" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Preuzeti ćete sljedeće albume" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Uklonit ćete %1 popisa izvođenja iz omiljenih, sigurno želite nastaviti?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Ukloniti ćete popis izvođenja koji nije dio vaših omiljenih popisa izvođenja, popis izvođenja će biti obrisan (ova radnja se ne može poništiti). \nSigurno želite nastaviti?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Niste prijavljeni." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Prijavljeni ste kao %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Prijavljeni ste." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Možete promijeniti način na koji su pjesme organizirane u fonoteci." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Možete slušati besplatno bez računa dok Premium članovi mogu slušati streamove u većoj kvaliteti bez reklama." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Možete slušati Magnatune pjesme besplatno bez računa. Učlanjenjem uklanjate poruku na kraju pjesama." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Možete slušati streamove u pozadini u isto vrijeme kao i ostalu glazbu." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Možete koristiti vaš Wii Daljinski upravljač za daljinsko upravljanje Clementineom. Za više informacija pogledajte Clementine wiki stranicu.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Nemate Spotify Premium račun." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Nemate aktivnu pretplatu" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "Za pretraživanje i slušanje glazbe ne morate biti prijavljeni na SoundCloud. Međutim, ipak se morate prijaviti za pristup vašim popisima izvođenja i streamovima." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Odjavljeni ste iz Spotify-a, ponovno upišite vašu lozinku u mogućnostima." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Odjavljeni ste iz Spotify-a, ponovno upišite vašu lozinku." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Sviđa vam se ova pjesma" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "Morate pokrenuti Osbitosti sustava i dopustiti Clementinu da \"upravlja vašim računalom\" za korištenje globalnih prečaca u Clementinu." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Morate ponovno pokrenuti Clementine ako mijenjate jezik." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Vaša IP adresa:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Vaši Last.fm pristupni podaci su neispravni" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Vaši Magnatune pristupni podaci su neispravni" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Vaša fonoteka je prazna!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Vaši radio streamovi" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Vaši scrobbles: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Vašem sustavu nedostaje OpenGL podrška, vizualizacija je nedostupna." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Vaše korisničko ime ili lozinka su neispravni." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Nula" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "dodajte %n pjesama" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "nakon" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "prije" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "i" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "automatski" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "prije" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "Između" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "najveći prvi" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "sadrži" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "onemogućeno" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "disk %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "ne sadrži" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "završetak s" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "jednak" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "gpodder.net direktorij" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "veći od" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "iPod-ovi i USB uređaji trenutno ne rade na Windowsu. Naša isprika!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "u posljednjih" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "manje od" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "najduži prvi" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "premjesti %n pjesama" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "najnovije prvo" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "nije jednako" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "nije u posljednjih" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "nije na" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "najstarije prvo" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "na" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "mogućnosti" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "ili skenirajte QR kôd!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "pritisnite tipku ENTER" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "premjesti %n pjesama" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "najkraći prvi" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "naizmjenične pjesme" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "najmanji prvi" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "razvrstaj pjesme" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "započnite s" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "zaustavi" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "pjesma %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/hu.po000066400000000000000000005201011260417502300236520ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # andrewtranslates , 2014 # Balázs Meskó , 2015 # FIRST AUTHOR , 2010 # Bendegúz Gyönki , 2012 # lukibeni , 2012 # Márk Lutring , 2012 # miku84, 2015 # Péter Polonkai , 2012 # ricsipontaz , 2012 # Sándor Balikó , 2011 # ulysses , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Hungarian (http://www.transifex.com/davidsansome/clementine/language/hu/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hu\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nA lejátszási lista kedvenccé tételéhez klikkelj a list melletti csillagra" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " napok" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kbit/s" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "s" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " másodperc" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " számok" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 számok)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 album" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 nap" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 nappal ezelőtt" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1, %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 lejátszási lista (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 kiválasztva" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 szám" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 szám" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 szám megtalálva" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 szám megtalálva (mutatva %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 szám" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 átküldve" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev modul" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 hallgató" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 összes lejátszás" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%fájlnév%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n meghiúsult" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n befejezve" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n hátralévő" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Szöveg igazítása" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Középre" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Egyéni" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "Extrák" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Súgó" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&%1 elrejtése" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Elrejtés..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Balra" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "Zene" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Egyik sem" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "Lejátszási lista" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Kilépés" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Ismétlési mód" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Jobbra" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Véletlenszerű lejátszási mód" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Oszlopszélességek igazítása az ablakhoz" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "Eszközök" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(különbözik több számnál)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", " #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...és az összes Amarok közreműködő" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 nap" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 szám" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192,000Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44,100Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48,000Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 véletlen szám" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96,000Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Válts Prémiumra most" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Ha nincs bejelölve, akkor a Clementine mindig külön adatbázisba próbálja elmenteni az értékeléseket és statisztikákat.

Ha be van jelölve, akkor az adatbázisba és a fájlokba is elmenti őket.

Vedd figyelembe, hogy nem biztos, hogy minden formátummal működni fog és minden lejátszó fogja tudni olvasni őket.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Írj be egy szót a mezőbe a kereséshez, pl.:előadó:Bode rákeres minden Bode nevű előadóra.

Elérhető mezők: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Minden szám értékelést és statisztikát elment a fájlokba.

Ez nem szükséges, ha az "Értékelés és a statisztikák mentése a fájlokba" beállítás mindig aktiválva van.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

A száminformációk behelyettesítéséhez a címkék % jellel kezdődnek és a megfelelő angol szavak alkotják, pl.: %artist %album %title

\n\n

Ha egy szövegrészt kapcsos zárójelekkel fog közre, akkor az rejtve marad, ha a benne lévő címke helyére nem helyettesíthető semmi.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Spotify prémium fiók szükséges" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "A kliens csak a helyes kóddal tud csatlakozni" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Az intelligens lejátszási listák dinamikusan jönnek létre a zenetáradból. Többféle ilyen lista létezik, melyek különféle módon nyújtanak lehetőséget a számok rendezésére." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Egy szám fel lesz véve a listára, ha kielégíti az alábbi feltételeket." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "MINDEN DICSŐSÉG A HYPNOTOADÉ!" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Megállít" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "A(z) %1 névjegye" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "A Clementine névjegye" #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Qt névjegye…" #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Abszolút" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Fiók részletek" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Fiók részletek (prémium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Esemény" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Esemény" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Wiiremote aktiválása/deaktiválása" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Stream események" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Podcast hozzáadása" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Adatfolyam hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Sortörés hozzáadása ha az értesítés támogatja" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Esemény felvétele" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Minden szám hozzáadása a mappából és almappáiból" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Új adatfolyam hozzáadása" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Mappa hozzáadása" #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Új fájl" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Fájl hozzáadása az átkódoláshoz" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Fájl(ok) hozzáadása az átkódoláshoz" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Fájl hozzáadása" #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Fájlok felvétele átkódoláshoz" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Mappa hozzáadása" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Mappa hozzáadása..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Új mappa hozzáadása…" #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Podcast hozzáadása" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Podcast hozzáadása..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Keresési feltétel megadása" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Album címke hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Album előadó hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Előadó címke hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Automatikus szám pontozás hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Zeneszerző címke hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Lemezsorszám címke hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "A szám fájlnevének hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Műfaj címke hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Szám csoportosítás hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Számhossz hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "A szám előadó címkéjének létrehozása " #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Lejátszásszámláló hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Szám értékelés hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Számkihagyás számláló hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Számcím címke hozzáadása" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Szám hozzáadása a gyorsítótárhoz" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Szám sorszámának hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Szám évének hozzáadása" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Szám hozzáadása a Zenéimhez a \"Szeret\" gombot megnyomásakor" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Adatfolyam hozzáadása…" #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Hozzáadás a Zenéimhez" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Hozzáadás a Spotify lejtszási listához" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Hozzáadás a Spotify csillagozottakhoz" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Hozzáadás másik lejátszási listához" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Add a könyvjelzőkhöz" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Hozzáadás a lejátszási listához" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Sorbaállít" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Felhasználó/ csoport hozzáadása a könyvjelzőkhöz" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Wiimotedev esemény hozzáadása" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Hozzáadás.." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Hozzáadva ebben a hónapban" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Hozzáadva ezen a héten" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Hozzáadva ebben az évben" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Hozzáadva ma" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Hozzáadva három hónapon belül" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Egyedi csoportosítás…" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Utána" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Másolás után…" #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Album (ideális hangerő minden számhoz)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Album-előadó" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Albumborító" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Album információ a jamendo.com-ról…" #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Albumok" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Albumok borítóval" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Albumok bórító nélkül" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Mind" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Minden fájl (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "Minden Dicsőség a Hypnotoadnak!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Minden album" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Minden előadó" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Minden fájl (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Minden lejátszási lista (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Minden fordító" #: library/library.cpp:98 msgid "All tracks" msgstr "Minden szám" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "A kliens tölthet le zenét erről a számítógépről" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Letöltések engedélyezése" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Mid/side kódolás engedélyezése" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Az eredetiek mellett" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Mindig rejtse a főablakot" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Mindig mutassa a főablakot" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Mindig indítja a lejátszást" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon Cloud Drive" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "A Spotify használatához külön beépülő szükséges. Szeretnéd most letölteni és telepíteni?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Hiba történt az iTunes adatbázis betöltése közben" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Hiba történt '%1' metaadatainak írása közben" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Ismeretlen hiba történt" #: ui/about.cpp:85 msgid "And:" msgstr "És:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Mérges" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Megjelenés" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Fájlok/URL-ek hozzáadása a lejátszási listához" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Hozzáfűz az aktuális listához" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Hozzáadja a lejátszási listához" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Tömörítés engedélyezése a túlvezérlés elkerülése érdekében" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Biztos benne, hogy törli a \"%1\" beállítást?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Biztos vagy benne, hogy visszaállítod ennek a számnak a statisztikáit?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Biztos, hogy a szám statisztikákat bele akarod írni az összes fájlba?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Előadó" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Előadó infó" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Előadó címkék" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Előadó kezdése" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Mentéskor rákérdez" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Hang formátum" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Hang kimenet" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "A hitelesítés meghiúsult" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Szerző" #: ui/about.cpp:68 msgid "Authors" msgstr "Szerzők" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Automatikus" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Automatikus" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Automatikus frissítés" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Egyelemű kategóriák automatikus listázása a zenetárban" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Elérhető" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Átlagos bitráta" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Átlagos képméret" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "BBC podcastok" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Háttér adatfolyamok" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Háttérszín" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Háttérkép" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Háttér áttetszősége" #: core/database.cpp:648 msgid "Backing up database" msgstr "Adatbázis biztonsági mentése" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Bal - jobb egyensúly" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "Last.fm scrobbling tiltása" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Oszlop" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Egyszerű kék" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Alap audió típus" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Viselkedés" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Legjobb" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Életrajz innen: %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Bitráta" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Bitráta" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Bitráta" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Blokk" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Blokk típus" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Elhalványítási érték" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Törzs" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Fellendülés" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Tallózás…" #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Puffer hossza" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Pufferelés" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Seafile index építése..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "De ezek a források le vannak tiltva:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Gombok" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "CUE fájl támogatás" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "A gyorsítótár elérése:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Gyorsítótárazás" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "Gyorsítótárazás %1" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Mégsem" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Letöltés abbahagyása" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "CAPTCHA azonosítás szükséges.\nPróbálj belépni a böngészőben a Vk.com -ra a probléma megoldásához." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Albumborító módosítása" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Betűméret megváltoztatása..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Ismétlési mód megváltoztatása" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Billentyűparancs módosítása..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Véletlenszerű lejátszási mód megváltoztatása" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "Az éppen játszott szám váltása" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Nyelv váltása" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "A változtatások a következő zeneszámnál kerülnek beállításra" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "A mono lejátszás bekapcsolása csak a következő zeneszámnál lesz érvényes" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Új epizódok keresése" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Frissítések keresése" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Frissítés keresése..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Vk.com gyorsítótár mappa" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Válassz egy nevet az intelligens lejátszási listádnak" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Automatikus választás" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Szín választása..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Betűtípus választása..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Választás a listáról" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Válaszd ki, hogy a lejátszási lista hogyan legyen rendezve és hány számot tartalmazzon." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Válassza ki podcastok letöltési helyét" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Választd ki a megjelenítendő internet szolgáltatásokat." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Válaszd ki a weboldalakat, amelyekről a Clementine dalszövegeket kereshet." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Klasszikus" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Tisztítás" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Kiürít" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Lejátszási lista űrítése" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Clementine hiba" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Clementine Narancs" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Clementine Megjelenítés" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine automatikusan az eszköz által is támogatott formátumba tudja konvertálni a számokat másolás előtt." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "A Clementine képes lejátszani a számait amit feltöltött az Amazon Cloud Drive- ba" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "A Clementine képes lejátszani a számait amiket feltöltött a Box- ba" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "A Clementine képes lejátszani a számait amit ön feltöltött a Dropboxba" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "A Clementine képes lejátszani a számait amit ön feltöltött a Google Drive-ba" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "A Clementine képes lejátszani a számait amiket feltöltött a OneDrive- ba" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "A Clementine felbukkanó üzenetben tudja jelezni, ha számot vált." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "A Clementine képes szinkronizálni feliratkozásait más számítógépekkel és podcast alkalmazásokkal. Készítsen egy felhasználót." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "A Clementine egy projectM megjelenítést sem tud betölteni. Ellenőrizze, hogy megfelelően telepítette a Clementinet." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Clementine képmegjelenítő" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Nincsenek találatok ehhez a fájlhoz" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "A Clementine ezen források között fog zenéket keresni:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Zene felvételéhez kattintson ide" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "A lejátszási lista kedvenccé tételéhez kattints ide. A lista elérhető lesz a bal oldali panelen." #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Kattintásra vált a hátralévő és a teljes idő kijelzése között" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "A Bejelentkezés gombra kattintva egy oldal nyílik meg a böngészőjében. Bejelentkezés után visszatérhet a Clementine-ba." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Bezár" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Lejátszólista bezárása" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Megjelenítés bezárása" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Ezen ablak bezárása megszakítja a letöltést." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Ezen ablak bezárása megszakítja az albumborítók keresését." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Színek" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Vesszővel tagolt lista az osztály:szint pároknak, a szintek 0-3 értékeket vehetnek fel" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Megjegyzés" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Közösségi rádió" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Címkék automatikus kiegészítése" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Címkék automatikus kiegészítése" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Zeneszerző" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "%1 beállítása..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Magnatune beállítása..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Billentyűkombinációk beállítása" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Spotify beállítása..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Subsonic beállítása..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Vk.com beállítása..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Globális keresés beállítása..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Zenetár beállítása..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Podcastok beállítása…" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Beállítás..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Wii távvezérlő csatlakoztatása az aktiválás/deaktiválás esemény használatával" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Eszköz csatlakoztatása" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Csatlakozás a Spotifyhoz" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "A szerver elutasította a kapcsolódást, ellenőrizd a linket. Példa: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Kapcsolat időtúllépés, ellenőrizd a linket. Példa: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Kapcsolat hiba, vagy a felhasználó kikapcsolta az audiót" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Konzol" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Állandó bitráta" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Minden szám tömörítése" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Az eszköz által nem támogatott számok konvertálása" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Veszteségmentes fájlok kovertálása a távoli szerverre való küldés előtt." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Veszteségmentes fájlok kovertálása" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Megosztott URL másolása a vágólapra" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Másolás vágólapra" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Másolás eszközre..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Másolás a zenetárba..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Szerzői jog" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Nem lehet csatlakozni a Subsonic- hoz, ellenőrizd a linket. Példa: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Nem hozható létre a \"%1\" GStreamer objektum. Ellenőrizze, hogy telepített minden szükséges GStreamer modult." #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Nem lehet létrehozni a lejátszási listát" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "%1 kódolásához nem található muxer, ellenőrizze, hogy telepítve van-e a megfelelő GStreamer beépülő" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Nem található megfelelő kódoló %1 tömörítéséhez. Ellenőrizze, hogy a GStreamer beépülők megfelelően vannak-e telepítve" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "A %1 célfájl megnyitása sikertelen" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Borítókezelő" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Albumborító a beágyazott képből" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Az albumborítót %1 helyről automatikusan betölti" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Az albumborító manuálisan eltávolítva" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Albumborító nincs beállítva" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Albumborító beállítva %1 helyről" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Borítók %1 helyről" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Átúsztatás használata számok automatikus váltásánál" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Átúsztatás használata számok manuális váltásánál" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Egyéni" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Egyéni kép:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Egyedi üzenetbeállítások" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Egyéni..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "DBus elérési útvonal" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dance" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Adatbázis sérülés található. Kérjük olvassa el a https://code.google.com/p/clementine-player/wiki/DatabaseCorruption honlapot további információkért, hogy hogyan állítsa vissza adatbázisát." #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Létrehozás dátuma" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Módosítás dátuma" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Nap" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "&alapértelmezés" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Hangerő csökkentése 4%-kal" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Hangerő csökkentése százalékra" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Hangerő csökkentése" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Alapértelmezett háttérkép" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Alapértelmezett eszköz a következőn: %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Alapértelmezések" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Megjelenítések között váltás ideje" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Törlés" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Letöltött adatok törlése" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Fájlok törlése" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Törlés az eszközről..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Törlés a lemezről..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Lejátszott epizódok törlése" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Beállítás törlése" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Intelligens lejátszási lista törlése" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Az eredeti fájlok törlése" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Fájlok törlése" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Kiválasztott számok törlése a sorból" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Szám törlése a sorból" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Cél" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Részletek…" #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Eszköz" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Eszköztulajdonságok" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Eszköznév" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Eszköztulajdonságok..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Eszközök" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Párbeszéd" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Talán erre gondoltál:" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Digitally Imported jelszó" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Digitally Imported felhasználónév" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Közvetlen internetkapcsolat" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Mappa" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Időtartam letiltása" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Hangulatsáv generáció letiltása" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Letiltva" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Letiltva" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Lemez" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Szakaszos átvitel" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Beállítások megtekintése" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "OSD mutatása" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Teljes zenetár újraolvasása" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Teljes zenetár újraolvasása" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Teljes zenetár újraolvasása..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Ne konvertáljon egy számot sem" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Ne írja felül" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "A teljes újraolvasással minden metaadat (borító, lejátszási statisztika) törölve lesz. A Clementine újraolvassa az összes zenédet a Google Drive- ból, ami eltart egy kis ideig." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Ne ismételjen" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Ne mutassa a különböző előadók között" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Ne mutassa a meghallgatott epizódokat" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Ne keverje össze" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Ne álljon meg!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Adakozás" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Dupla kattintás a megnyitáshoz" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "Dupla kattintásra egy számon..." #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Dupla kattintásra egy számon..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "%n epizód letöltése" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Letöltési mappa" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Epizódok letöltése ide" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Tagsági információk betöltése" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Új epizódok automatikus letöltése" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Letöltés sorba állítva" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Letöltési beálíltások" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Android app letöltése" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Album letöltése" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Album letöltése..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Epizód letöltése" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Letöltés…" #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Letöltés (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Icecast könyvtár letöltése" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Jamendo katalógus letöltése" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Magnatune katalógus letöltése" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Spotify beépülő letöltése" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Metaadat letöltése" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Fogja meg az áthelyezéshez" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dubstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Időtartam" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Dinamikus mód bekapcsolva" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Dinamikus véletlenszerű mix" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Intelligens lejátszási lista szerkesztése..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "\"%1\" címke szerkesztése..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Címke módosítása..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Címkék szerkesztése" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Száminformációk szerkesztése" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Száminformációk szerkesztése..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Száminformációk szerkesztése" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Szerkesztés..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "Email" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Wii távvezérlő támogatás engedélyezése" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Automatikus gyorsítótárazás engedélyezése" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Hangszínszabályzó engedélyezése" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Gyorsbillentyűk engedélyezése csak akkor, ha a Clementine fókuszba kerül" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "A szám belső metaadatainak endegélyezése kattintáskor" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Engedélyezze a forrásokat, hogy bevegye őket a keresési eredmények közé. Az eredmények ebben a sorrendben fognak megjelenni." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Last.fm scrobbling engedélyezése/tiltása" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Átkódolás komplexitása" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Átkódolás minősége" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Kódolási mód" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Adjon meg egy URL-t" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Albumborító letöltése az alábbi URL-ről:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Add meg az exportálandó borítók nevét (kiterjesztés nélkül):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Adjon meg új nevet ennek a lejátszási listának" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Adjon meg egy keresési kifejezést zeneszámok kereséséhez a számítógépén és az interneten" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Adjon meg egy keresési kifejezést podcastok kereséséhez az iTunes Store-ban" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Adjon meg egy keresési kifejezést podcastok kereséséhez a gpodder.neten" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Adja meg a keresési kifejezést" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Adja meg egy rádió adatfolyam URL címét:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Adja meg a mappa nevét" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Írd be a megadott IP -t a Clementine kapcsolódásához" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "A teljes kollekció" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Hangszínszabályzó" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Megegyezik a --log-levels *:1 kapcsolóval" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Megegyezik a --log-levels *:3 kapcsolóval" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Hiba" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Hiba CD beolvasáskor" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Hiba történt az MTP eszközhöz való csatlakozás közben" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Hiba történt a számok másolása közben" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Hiba történt a számok törlése közben" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Hiba a Spotify beépülő letöltése közben" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Hiba %1 betöltésekor" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Hiba a di.fm lejátszólista letöltésekor" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Hiba %1: %2 feldolgozásakor" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Hiba az hang CD betöltése közben" #: library/library.cpp:68 msgid "Ever played" msgstr "Valaha játszott" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Minden 10. percben" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Minden 12. órában" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Minden 2." #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Minden 20. percben" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Minden 30. percben" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Minden 6. órában" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Minden órában" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Kivéve az azonos albumon vagy azonos CUE fájlban lévő számok között" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Meglévő borítók" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Kibontás" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Lejár ekkor: %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Borítók exportálása" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Borítók exportálása" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Letöltött borítók exportálása" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Beépített borítók exportálása" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Eportálás befejezve" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "%1 borító a %2-ból/ből exportálva (%3 sikertelen)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Áttünés szünet megnyomásakor és a folytatáskor" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Elhalkulás szám megállításakor" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Elhalkulás" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Elhalkulás hossza" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Nem lehet olvasni a CD meghajtót" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "A mappa lekérése meghiúsult" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Nem sikerült letölteni a podcastot" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Nem sikerült betölteni a podcastot" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Nem sikerült feldolgozni az XML fájlt ehhez az RSS hírforráshoz" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Gyors" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Kedvenc számok" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "A hiányzó borítók letöltése" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Letöltés automatikusan" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Letöltés sikeres" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "A Subsonic könyvtár letöltése" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Hiba a borító betöltése közben" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Fájl formátum" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Fájlkiterjesztés" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Fájl formátumok" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Fájlnév" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Fájlnév (útvonal nélkül)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Fájlnév minta" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Fájl útvonalak" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Fájlméret" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Fájltípus" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Fájlnév" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Fájlok" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Átkódolandó fájlok" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Azon számok megkeresése, melyek kielégítik az általad megadott feltételeket." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Előadó keresése" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Ujjlenyomat generálása a számhoz" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Befejez" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Első szinten" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Album méretezése szélességre" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "FLAC" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Betűméret" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Licencelési okok miatt a Spotify támogatást külön beépülőben kell telepíteni." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Mono kódolás kényszerítése" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Eszköz elfelejtése" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Egy eszköz elfelejtésekor a Clementine törli erről a listáról és újra be kell olvasnia róla minden számot, ha legközelebb csatlakoztatja." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Űrlap" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Formátum" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Frissítési gyakoriság" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Képkockák pufferenként" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Fagyos" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Teljes basszus" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Teljes basszus + Magas" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Teljes magas" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Általános" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Általános beállítások" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Műfaj" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "URL lekérése ezen Grooveshark szám megosztásához" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "URL lekérése a lejátszási lista megosztásához" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Csatornák betöltése" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Adatfolyamok lekérése" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Adjon meg egy nevet:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Ugrás" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Váltás a következő lejátszási lista lapra" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Váltás az előző lejátszási lista lapra" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "%1 borító a %2-ból/ből letöltve (%3 sikertelen)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Nem létező számok szürke színnel jelölése a lejátszási listákon" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Zenetár csoportosítása..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Csoportosítás" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Album szerint" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Előadó szerint" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Előadó/Album szerint" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Előadó/Év - Album szerint" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Műfaj/Album szerint" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Műfaj/Előadó/Album szerint" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Csoportosítás" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "A HTML oldal nem tartalmaz RSS forrást" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "HTTP 3xx státusz kód fogadva URL nélkül, elenőrizd a szerver beállításokat." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "HTTP proxy" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Boldog" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Hardverjellemzők" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "A hardverjellemzők csak csatlakoztatott eszköz esetén tekinthetők meg." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Magas" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Magas (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Magas (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "HipHop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "A gazda szerver nem található, ellenőrizd a linket. Példa: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Óra" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Nincs Magnatune fiókom" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Ikon" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Ikonok felül" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Zeneszám azonosítása" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Aktiválásakor a kiválasztott szám címkéje szerkeszthető lesz kiválasztáskor" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Ha folytatja, az eszköz lassan fog működni és a rá másolt számok használhatatlanok lehetnek." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Ha tudja a podcast URL-jét, akkor írja be és nyomja meg az Ugrás gombot." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "A \"The\" mellőzése előadó nevekben" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Képek (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Képek (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Importálás..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "%1 napon belül" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "%1 héten belül" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "Dinamikus módban új számok lesznek kiválasztva és hozzáadva a lejátszási listához, amikor egy zeneszám véget ér." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Beérkezett üzenetek" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Albumborító megjelenítése az értesítésben" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Vegyen bele minden számot" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Nem kompatibilis Subsonic REST protokoll verzió. A klienst frissíteni kell." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Nem kompatibilis Subsonic REST protokoll verzió. A szervert frissíteni kell." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "A beállítás nem teljes, ellenőrizd, hogy minden mező ki van- e töltve!" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Hangerő növelése 4%-kal" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Hangerő növelése százalékra" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Hangerő növelése" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "%1 indexelése" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Információ" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Bemenet beállításai" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Beszúrás..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Telepítve" #: core/database.cpp:585 msgid "Integrity check" msgstr "Integritás ellenőrzése" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Internet szolgáltatók" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Internet szolgáltatások" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "A számokhoz" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Érvénytelen API kulcs" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Érvénytelen formátum" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Érvénytelen eljárás" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Érvénytelen paraméterek" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Hibás eszközspecifikáció" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Érvénytelen szolgáltatás" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Érvénytelen munkafolyamat kulcs" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Kijelölés megfordítása" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Legtöbbet hallgatott számok a Jamendon" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Legnépszerűbb számok a Jamendon" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "A hónap legnépszerűbb számai a Jamedon" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "A Jamendo legnépszerűbb számai a héten" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Jamendo adatbázis" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Azonnal ugorj az előző számra" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Ugrás a most lejátszott számra" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Tartsa nyomva a gombokat %1 másodpercig" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Tartsa nyomva a gombokat %1 másodpercig" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Futás a háttérben bezárt ablak esetén is" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Eredeti fájlok megőrzése" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Kismacskák" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Nyelv" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Laptop/Fejhallgató" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Nagy terem" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Nagy albumborító" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Nagy albumborító (részletek alább)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Nagy albumborító (részletek nélkül)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Nagy oldalsáv" #: library/library.cpp:80 msgid "Last played" msgstr "Utoljára lejátszva" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Utoljára lejátszva" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "A Last.fm nem elérhető, kérlek próbáld később" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Last.fm jelszó" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Last.fm lejátszás számláló" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Last.fm címkék" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Last.fm felhasználói név" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Legkevésbé kedvelt számok" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Balra" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Időtartam" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Zenetár" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Zenetár egyedi csoportosítása" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Zenetár újraolvasási figyelmeztetés" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Keresés a zenetárban" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Szűrések" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Élő" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Betöltés" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Borító letöltése URL-ről" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Borító letöltése URL-ről..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Borító betöltése lemezről" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Borító betöltése lemezről..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Lejátszási lista betöltése" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Lejátszási lista betöltése..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "MTP eszköz beolvasása" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "iPod adatbázis betöltése" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Inteligens lejátszási lista betöltése" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Számok betöltése" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Adatfolyam betöltése" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Számok betöltése" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Szám információk betöltése" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Töltés..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Fájlok/URL-ek betöltése, lejátszási lista cseréje" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Bejelentkezés" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Sikertelen bejelentkezés" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Kijelentkezés" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Hosszú távú előrejelzésen alapuló profil (LTP" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Kedvenc" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "Last.fm scrobbling engedélyezése" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Alacsony (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Alacsony (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Alacsony komplexitású profil (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Dalszövegek" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "%1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Dalszöveg az ID3v2 címkéből" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "MP4 AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Magnatune Letöltés" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Letöltés a Magnatuneról befejezve" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Fő profil (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Csináld!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Csináld!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Lejátszólista elérhetővé tétele offline módban is" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Hibásan formázott válasz" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Kézi proxybeállítás" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Manuálisan" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Gyártó" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Megjelölés meghallgatottként" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Megjelölés újként" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Illeszkedés minden keresési feltételre (ÉS)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Illeszkedés legalább egy keresési feltételre (VAGY)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Maximum globális keresési eredmény" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Maximális bitráta" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "A média megváltozott. Újratöltés" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Közepes (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Közepes (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Tagság típusa" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Minimális bitráta" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Minimum puffer" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Hiányzó projectM beállítások" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Modell" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Zenetár figyelése változások után" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Mono lejátszás" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Hónap" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Hangulat" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Hangulatsáv stílus" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Hangulatsávok" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Több" #: library/library.cpp:84 msgid "Most played" msgstr "Gyakran játszott" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Csatolási pont" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Csatolási pontok" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Mozgatás lefelé" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Áthelyezés a zenetárba..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Mozgatás felfelé" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Zene" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Zenetár" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Némítás" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Saját albumok" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Zenéim" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Ajánlásaim" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Név" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Név" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Elnevezési opciók" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Keskenysávú (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Hálózati Proxy" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Távoli hálózat" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Soha" #: library/library.cpp:74 msgid "Never played" msgstr "Sohasem játszott" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Soha ne indítsa el a lejátszást" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Új mappa" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Új lejátszási lista" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Új intelligens lejátszási lista..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Új számok" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Az új számok automatikusan fel lesznek véve." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Legújabb számok" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Következő" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Következő szám" #: core/utilities.cpp:151 msgid "Next week" msgstr "Következő héten" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Kikapcsolva" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Nincs háttérkép" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Nincsenek exportálandó boírtók" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Hosszú blokkok nélkül" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Nincs egyezés. Törölje a keresési feltételeket, hogy újra lássa a teljes lejátszási listát." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Rövid blokkok nélkül" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Egyik sem" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Egy kiválasztott szám sem alkalmas az eszközre való másoláshoz" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Normális" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Normál blokkok" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Nem elérhető dinamikus lejátszási lista használatakor" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Nincs kapcsolat" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Nincs elég tartalom" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Nincs elég rajongó" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Nincs elég tag" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Nincs elég szomszédja" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Nincs telepítve" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Nem vagy bejelentkezve" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Nincs csatolva - kattintson duplán a csatoláshoz" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Nem talált semmit" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Értesítés módja" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Értesítések" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Most játszott" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Megjelenítendő epizódok száma" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "OSD Előnézet" #: widgets/osd.cpp:173 msgid "Off" msgstr "Kikapcsolás" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "OGG FLAC" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "Bekapcsolás" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Csak a következő IP címek közöttiek elfogadottak:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Csak a helyi kapcsolatok engedélyezése" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Csak a legelsőt mutassa" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Átlátszóság" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "%1 megnyitása a böngészőben" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "&Hang CD megnyitása..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "OPML-fájl megnyitása" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "OPML-fájl megnyitása..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Mappa megnyitása zene importáláshoz" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Eszköz megnyitása" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Fájl megnyitása..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Google Drive megnyitása" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Megnyitás új lejátszási listán" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Megnyitás új lejátszási listán" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Megnyitás böngészőben" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Megnyitás..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "A művelet sikertelen" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Optimalizálás bitrátára" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Optimalizálás minőségre" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Beállítások..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Fájlok rendezése" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Fájlok rendezése..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Fájlok rendezés alatt" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Eredeti címkék" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "Eredeti megjelenés" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "Eredeti megjelenés - Album" #: library/library.cpp:118 msgid "Original year tag support" msgstr "Eredeti megjelenés címke támogatás" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Egyéb beállítások" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Kimenet" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Kimeneti eszköz" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Kimenet beállításai" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Mindet felülírja" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Létező fájlok felülírása" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Csak a kisebbeket írja felül" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Tulajdonos" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Jamendo katalógus feldolgozása" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Party" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Jelszó" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Szünet" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Lejátszás szüneteltetése" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Szüneteltetve" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Előadó" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Pixel" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Egyszerű oldalsáv" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Lejátszás" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Lejátszások száma" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Lejátszás, ha le van állítva, különben szünet" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Lejátszás, ha nincs lejátszás folyamatban" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "A(z) . szám lejátszása a listában" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Lejátszás/Szünet" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Lejátszás" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Lejátszó beállítások" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Lejátszási lista" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "A lejátszási lista befejezve" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Lejátszási lista beállítások" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Lejátszási lista típus" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Lejátszási lista" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Zárja be a böngészőjét, és térjen vissza a Clementine-be" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Beépülő állapot:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcastok" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Értesítés időtartama" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Előerősítő" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Beállítás" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Beállítások" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Beállítások..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Előnyben részesített albumborító fájlnevek (vesszővel tagolt)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Előnyben részesített hangformátum" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Kedvelt bitráta" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Előnyben részesített formátum" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Prémium audió típus" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Beállítás:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Nyomja meg a használni kívánt billentyűkombinációt" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Nyomjon meg egy billentyűt" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Nyomjon meg egy billentyű kombinációt a %1 használatához..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Az \"Előző\" gomb megnyomásakor..." #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Pretty OSD beállítások" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Előnézet" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Előző" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Előző szám" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Verzió információ mutatása..." #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Folyamat" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Folyamat" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Pszichedelikus" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Nyomja meg a Wiiremote gombot" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Számok felvétele véletlenszerű rendezésben" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Minőség" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Minőség" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Eszköz lekérdezése..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Sorkezelő" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Sorba állítja a kiválasztott számokat" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Szám sorba állítása" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Rádió (egyenlő hangerő minden számhoz)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Eső" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Eső" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Véletlenszerű megjelenítés" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "A most játszott szám értékelése 0 csillaggal" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "A most játszott szám értékelése 1 csillaggal" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "A most játszott szám értékelése 2 csillaggal" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "A most játszott szám értékelése 3 csillaggal" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "A most játszott szám értékelése 4 csillaggal" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "A most játszott szám értékelése 5 csillaggal" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Értékelés" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Tényleg mégse?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Az átirányítási limit elérve, elenőrizd a szerver beállításokat." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Katalógus frissítése" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Csatornák frissítése" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Állomáslista frissítése" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Adatfolyamok frissítése" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Relatív" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Emlékezzen a Wii távvezérlő mozdulatra" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Ahogy legutoljára volt" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Választás megjegyzése" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Eltávolítás" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Esemény eltávolítása" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Duplikációk eltávolítása a lejátszási listáról" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Mappa eltávolítása" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Eltávolítás a Zenéimből" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Eltávolítás a kedvencekből" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Eltávolítás a lejátszási listáról" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Lejátszási lista eltávolítása" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Lejátszási lista eltávolítása" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Az elérhetetlen számok törlése a lejátszási listáról" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Lejátszási lista átnevezése" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Lejátszási lista átnevezése..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Számok újraszámozása ebben a sorrendben..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Ismétlés" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Album ismétlése" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Lejátszási lista ismétlése" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Szám ismétlése" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Az aktuális lista cseréje" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Lejátszási lista cseréje" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Szóközök alulvonásokkal való helyettesítése" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Lejátszás újra hangosság kiegyenlítő módban" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Újbóli feltöltés" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Hitelesítő kód kérése" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Visszaállítás" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Lejátszás számlálók visszaállítása" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Szám újraindítása és újboli megnyomáskor ugrás az előzőre" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Szám újraindítása, vagy az előző szám lejátszása, ha 8 msp- en belül elindul." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Korlátozás ASCII karakterekre" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Lejátszás folytatása induláskor" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Visszatérés a Clementine-be" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Jobbra" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Beolvasás" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "CD beolvasása" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Audio CD beolvasása" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Futtatás" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "SOCKS proxy" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "SSL hiba, ellenőrizd a szerver beállításait. SSLv3 opció bekapcsolása megoldhatja a gondokat." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Eszköz biztonságos eltávolítása" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Eszköz biztonságos eltávolítása másolás után" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Mintavételi sűrűség" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Mintavétel" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "A .mood fájlok mentés a zenekönyvtárba" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Albumborító mentése" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Borító mentése lemezre..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Kép mentése" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Lejátszási lista mentése" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Lejátszási lista mentése" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Lejátszási lista mentése..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Beállítás mentése" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Értékelés mentése a fájlba, ha lehetséges" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Értékelés mentése a fájlba, ha lehetséges" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Adatfolyam mentése az Internet fül alá" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Számok statisztikájának mentése a zenefájlokba" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Számok mentése" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Skálázható mintavételezési profil (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Skála méret" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Pontszám" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Az általam hallgatott számok Scrobble funkcióval történő figyelése" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Keresés" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Keresés" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Icecast állomások keresése" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Keresés Jamendo-n" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Keresés a Magnatune-on" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Keresés Subsonic-ban" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Automatikus keresés" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Albumborítók keresése..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Keresés bármire" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Keresés gpodder.neten" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Keresés iTunes-on" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Keresési mód" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Keresési beállítások" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Találatok" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Keresési feltételek" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Második szinten" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Léptetés hátra" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Léptetés előre" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Léptetés hátra" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "A lejátszott szám adott pozícióra léptetése" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "Keresés billentyűparanccsal" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Összes kiválasztása" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Kiválasztás megszüntetése" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Válassz háttérszínt:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Háttérkép kiválasztása" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "A legjobban illeszkedő találatot választja" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Válassz előtéri színt:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Megjelenítések kiválasztása" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Megjelenítések kiválasztása..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Kiválaszt..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Sorozatszám" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Szerver" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "Szerver URL" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Szerver részletek" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "A szolgáltatás nem üzemel" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "%1 beállítása \"%2\"-ra/re..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Hangerő beállítása százalékra" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Érték beállítása minden kiválasztott számnak..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Beállítások" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Billentyűparancs" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "%1 billentyűparancsa" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "%1 billentyűparancsa már létezik" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Megjelenítés" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "OSD megjelenítése" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Ragyogás animáció megjelenítése a játszott számon a lejátszási listában" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Hangulatsáv megjelenítése a pozíciójelző csúszkában" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Rendszer alapértelmezett értesítés mutatása" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Értesítés mutatása, ha megváltoztatom az ismétlési/véletlenszerű lejátszási módot" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Hangerő változtatásakor értesítés megjelenítése" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Szünet megnyomásakor értesítés megjelenítése" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Értesítés megjelenítése a rendszertálcán" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Pretty OSD megjelenítése" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Jelenítse meg az állapotsáv fölött" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Minden szám mutatása" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Minden számot mutasson" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Albumborító megjelenítése a zenetárban" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Elválasztók mutatása" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Jelenítse meg teljes méretben..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Csoportok mutatása a globális keresési eredmények között" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Mutassa a fájlböngészőben..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Mutasd a zenetárban" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Jelenítse meg a különböző előadók között" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Hangulatsáv megjelenítése" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Csak az ismétlődések mutatása" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Csak a címke nélküliek mutatása" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "A lejátszott szám mutatása" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Keresési javaslatok megjelenítése" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Jelenítse meg a \"szeret\" gombot" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Scrobble gomb mutatása a főablakban" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Tálcaikon megjelenítése" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Mutassa melyik forrás van engedélyezve vagy letiltva" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Megjelenítés/Elrejtés" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Keverés" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Albumok összekeverése" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Az összes véletlenszerűen" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Lejátszási lista véletlenszerűen" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Zeneszámok összekeverése az albumokban" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Bejelentkezés" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Kijelentkezés" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Belépés..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Hasonló előadók" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Méret" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Méret:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Visszalépés a lejátszási listában" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Kihagyások száma" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Léptetés előre a lejátszási listában" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Kiválasztott számok kihagyása" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Szám kihagyása" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Kis albumborító" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Kis oldalsáv" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Intelligens lejátszási lista" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Intelligens lejátszási listák" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Lágy" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Lágy Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Száminformációk" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Szám infó" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Szonográfia" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Bocsánat" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Rendezés műfaj szerint (abc sorrendben)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Rendezés műfaj szerint (népszerűség alapján)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Rendezés állomásnév alapján" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Számok rendezése" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Rendezés" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Forrás" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Forrás" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Hiba a Spotifyra való bejelentkezéskor" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "Spotify lejátszási lista URL" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Spotify beépülő" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "A Spotify beépülő nincs telepítve" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "Spotify szám URL" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Normál" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Kedvenc" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Beolvasás indítása" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Az éppen lejátszott lista indítása" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Átkódolás indítása" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Kezdjen el írni valamit a keresési mezőbe, hogy kitöltse ezt a keresési eredmény listát" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "%1 indítása" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Indítás…" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Leállít" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Megállít utána" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Leállítás a minden egyes szám után" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Leállítás minden szám után" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Leállítás az aktuális szám után" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Lejátszás leállítása" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Leállítás az aktuális szám után" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Leállítás a következő szám után: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Leállítva" #: core/song.cpp:431 msgid "Stream" msgstr "Adatfolyam" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "A Subsonic szerverről való streamelés érvényes szerver licenszt igényel a 30 napos próbaidő után." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Adatfolyam tagság" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Feliratkozók" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Siker!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "%1 sikeresen írva" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Javasolt címkék" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Összegzés" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Nagyon magas (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Nagyon magas (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Támogatott formátumok" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Statisztikák mentése a fájlokba" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Spotify üzenetek szinkronizálása" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Spotify lejátszási lista szinkronizálása" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Spotify csillagozott számok szinronizálása" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Rendszer színek" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Lapfülek felül" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Címke letöltő" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Cél bitráta" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Szövegopciók" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Köszönet" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "A \"%1\" parancs nem végrehajtható." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "A jelenleg játszott szám albumborítója" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "A %1 mappa érvénytelen" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "A második éréknek nagyobbnak kell lennie, mint az elsőnek!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "A kért oldal nem létezik!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "A kért oldal nem egy kép!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "A Subsonic szerver próbaideje lejárt. Adakozáshoz, vagy licensz vásárlásához látogasd meg a subsonic.org oldalt." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "A Clementine most frissült verziójának szüksége van a teljes zenetár újraolvasására az alább sorolt új funkciók használatához:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Vannak más zeneszámok is ebben az albumban" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Probléma lépett fel a gpodder.nettel való kommunikálás közben" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Hiba lépett fel az adatok Magnatuneról való letöltése közben" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Hiba történt az iTunes Store-ból érkező adatok feldolgozásakor" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Néhány szám másolása közben hiba lépett fel. Az alábbi fájlokat nem sikerült másolni:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Néhány szám törlése közben hiba lépett fel. Az alábbi fájlokat nem sikerült törölni:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Ezek a fájlok törölve lesznek az eszközről. Biztos benne, hogy folytatja?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Ezek a fájlok törölve lesznek a lemezről. Biztos vagy benne, hogy folytatod?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Ezek a mappák lesznek figyelve a zenetár feltöltéséhez" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Ezek a beállítások a „Zene átkódolása” ablakban lesznek használva, és amikor zenéket konvertál mielőtt egy eszközre másolná azokat." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Harmadik szinten" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Ez a művelet létrehoz egy adatbázist, amely akár 150 MB méretű is lehet.\nEnnek ellenére is folytatod?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Ez az album nem elérhető a kért formátumban" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Ez a beállítás változtatható később a beállításokban" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "A Clementine csak az eszköz csatlakoztatása és megnyitása után képes megállapítani, hogy az milyen fájl formátumokat kezel." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Ez az eszköz az alábbi fájlformátumokat támogatja:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Az eszköz nem fog megfelelően működni" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Ez egy MTP eszköz, de a Clementine libmtp támogatás nélkül lett fordítva." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Ez az eszköz egy iPod, de a Clementine libgpod támogatás nélkül lett fordítva." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Ez az első alkalom, hogy csatlakoztatta ezt az eszközt. A Clementine átvizsgálja zenefájlok után, ami kis időbe telhet." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Ez a beállítás változtatható a \"Viselkedés\" menüben" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Ez az adatfolyam csak előfizetőknek érhető el" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "A %1 eszköztípus nem támogatott" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "Idő lépés" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Cím" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Ma" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "OSD ki-bekapcsolása" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Teljes képernyő" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Sorállapot megjelenítése" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Scrobble funkció váltása" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "OSD láthatóság bekapcsolása" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Holnap" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Túl sok átirányítás" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Népszerű számok" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Összes album:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Összes átküldött bájt" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Összes hálózati kérés" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Szám" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Számok" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Zene átkódolása" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Átkódolási napló" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Átkódolás" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Átkódolás %1 fájlt %2 folyamatban" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Kódolási opciók" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbina" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Kikapcsolás" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL(-ek)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Ultra szélessávú (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Nem lehet kapcsolódni" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "%1 (%2) nem letölthető" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Ismeretlen" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Ismeretlen tartalom" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Ismeretlen hiba" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Borító törlése" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "A kiválasztott számok lejátszása" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Szám lejátszása" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Leiratkozás" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Következő koncertek" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Frissítés" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Összes podcast frissítése" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Megváltozott zenetárbeli könyvtárak frissítése" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Zenetár frissítése a Clementine indításakor" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Podcast frissítése" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Frissítés" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "%1 frissítése" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "%1 frissítése..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Zenetár frissítése" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Kihasználtság" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Album előadója címke használata (ha elérhető)" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Gnome gyorsbillentyűk használata" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Pszichedelikus színek használata" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Replay Gain adatok használata, ha elérhetőek" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "SSSLv3 használata" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Wii távvezérlő használata" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Saját színkészlet használata" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Egyéni üzenet használata értesítésnél" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Távoli hálózati irányítás használata" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Hitelesítés használata" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Bitráta menedzselés használata" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Dinamikus mód használata" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Értesítések használata a Wii távvezérlő állapotváltozásaihoz" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Átmeneti zajszűrő alkalmazása" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Rendszer alapértelmezés használata" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Rendszer alapértelmezett színkészletének használata" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "A rendszer proxy beállításainak használata" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Hangerő normalizálása" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Használt" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Kezelőfelület" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Felhasználónév" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Szám felvételéhez a menü használatával..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Változó bitráta" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Különböző előadók" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "%1 Verzió" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Nézet" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Megjelenítés módja" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Megjelenítések" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Megjelenítések Beállításai" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Hangtevékenység felismerése" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Hangerő %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Fal" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Figyelmeztessen a lejátszási lista bezárásakor" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "WAV" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Weboldal" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Hét" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Amikor a Clementine elindul" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Amikor a Clementine albumborítót keres, először azokat a fájlokat ellenőrzi, melyek neve tartalmazza az alábbi szavakat.\nHa nincs egyezés, akkor a legnagyobb képet veszi a könyvtárból." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "A lejátszási lista mentésekor a fájl elérési útvonal" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Amikor a lista üres..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Miért nem próbálja..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Széles sávú (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii távvezérlő %1: aktiválva" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii távvezérlő %1: kapcsolódva" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii távvezérlő %1: kritikus teleptöltés (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii távvezérlő %1: deaktiválva" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii távvezérlő %1: lekapcsolódva" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii távvezérlő %1: alacsony teleptöltés (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Borító nélkül:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Szeretné a többi számot ebből az albumból áthelyezni a Vegyes előadók közé is?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Akarsz futtatni egy teljes újraolvasást most?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Minde szám statisztikájának mentése zenefájlokba" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Metaadatok írása" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Érvénytelen felhasználói név vagy jelszó." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Év" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Év - Album" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Év" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Tegnap" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "A következő albumokat készül letölteni" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Biztos, hogy törölni szeretnéd a(z) %1 lejátszólistát a kedvencek közül?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "A lejátszási lista nem tartozik a kedvencek közé, a törléssel a listát nem lehet visszaállítani.\nBiztos, hogy folytatod?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Nem vagy bejelentkezve." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Be vagy jelentkezve, mint %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Be vagy jelentkezve." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Megváltoztathatja a számok zenetárban való rendezésének módját." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Felhasználói fiók nélkül is hallgathat zenéket, de a prémium tagok ezt jobb minőségben és reklámok nélkül tehetik." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Hallgathat Magnatune számokat ingyen, előfizetés nélkül. Előfizetés vásárlása esetén a számvégi üzenetek eltávolításra kerülnek." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Háttér adatfolyamatokat hallgathatsz egy időben más számokkal is." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "A Clementine távvezérléshez használhat Wii távvezérlőt is. Részletekért tekintse meg a Clementine wiki oldalát.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Nincs Spotify prémium fiókod." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Nincs aktív feliratkozása" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "Számok kereséséhez és hallgatásához nem kell bejelentkezni a SoundCloud- ra, viszont a lejátszási listád és streamed eléréséhez bejelentkezés szükséges." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Kijelentkezett a Spotify-ből, kérem írja be még egyszer a jelszavát a Beállítások ablakban." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Kijelentkezett a Spotify-ből, kérem írja be még egyszer a jelszavát." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Kedveled ezt a számot" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "A Rendszerbeállításokban engedélyezned kell a \"számítógép irányítása\" opciót a globális billentyűparancsok használatához." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "A nyelv megváltoztatásához újra kell indítania a Clementinet." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "IP címed:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "A Last.fm előfizetési adatai hibásak" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "A Magnatune bejelentkezési adataid nem megfelelőek" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Az ön zenetára üres!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Az ön rádió adatfolyamai" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Scrobblejaid: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Az ön rendszeréről hiányzik az OpenGL támogatás. A vizualizációk nem lesznek elérhetőek" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "A felhasználóneved vagy a jelszavad hibás." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Nulla" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "%n szám felvétele" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "után" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "óta" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "és" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "automatikus" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "előtt" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "között" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "nagyobb először" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "tartalmazza" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "letiltva" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "%1. lemez" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "nem tartalmazza" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "végződik" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "egyenlő" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "gpodder.net mappa" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "nagyobb mint" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "Az Ipod USB- vel nem működik Windows- on. Sajnáljuk!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "az utóbbi" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "kevesebb mint" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "hosszabb először" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "%n szám mozgatása" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "újabb először" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "nem egyezik meg" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "nem az utóbbi" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "nincs bekapcsolva" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "régebbi először" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "ezen" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "beállítások" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "vagy olvasd be a QR kódot!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "nyomja meg az entert" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "%n szám eltávolítása" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "rövidebb először" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "zeneszámok keverése" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "kisebb először" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "rövid számok" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "kezdődik" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "leállítás" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "%1. szám" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/hy.po000066400000000000000000004031021260417502300236570ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # FIRST AUTHOR , 2011 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Armenian (http://www.transifex.com/davidsansome/clementine/language/hy/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hy\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " վայրկյան" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " երգ" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 ալբոմ" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 օր" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 օր առաջ" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 երգ" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 երգ" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 երգ գտավ" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 երգ գտավ (ցույց տրվում է %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n ավարտված" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n մնացած" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Կենտրոն" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Օգնություն" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Ձախ" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Դուրս գալ" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Աջ" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 օր" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "" #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "" #: core/song.cpp:422 msgid "AIFF" msgstr "" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ՏՎԵՔ ԲՈԼՈՐ ՓԱՌՔ «ՀԻՊՆՈՍԻ ԵՆԹԱՐԿՎԱԾ ՄԱՐԴ ԴՈԴՈՇ»" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "" #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Գործողություն" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "" #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "" #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "" #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "" #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "" #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "" #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:80 msgid "All the translators" msgstr "" #: library/library.cpp:98 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:85 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "" #: ui/about.cpp:68 msgid "Authors" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "" #: core/database.cpp:648 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "" #: core/song.cpp:428 msgid "CDDA" msgstr "" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "" #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:114 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "" #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "" #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "" #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "" #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:68 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:585 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "" #: library/library.cpp:80 msgid "Last played" msgstr "" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: ui/equalizer.cpp:137 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "" #: core/song.cpp:410 msgid "MPC" msgstr "" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "" #: library/library.cpp:74 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:92 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "" #: core/utilities.cpp:151 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "" #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "" #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "" #: core/organise.cpp:73 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:139 msgid "Party" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "" #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "" #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "" #: core/song.cpp:431 msgid "Stream" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "" #: ui/about.cpp:74 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "" #: core/song.cpp:426 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "" #: devices/giolister.cpp:157 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/ia.po000066400000000000000000004031321260417502300236330ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Emilio Sepúlveda , 2011 # Funkin, 2012 # FIRST AUTHOR , 2011 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Interlingua (http://www.transifex.com/davidsansome/clementine/language/ia/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ia\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " dies" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " secundas" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 dies" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 dies retro" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Adjuta" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "&Musica" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "Instrumen&tos" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "" #: core/utilities.cpp:119 msgid "1 day" msgstr "" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "" #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "" #: core/song.cpp:422 msgid "AIFF" msgstr "" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "" #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "" #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "" #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "" #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "" #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "" #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "" #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:80 msgid "All the translators" msgstr "" #: library/library.cpp:98 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:85 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "" #: ui/about.cpp:68 msgid "Authors" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "" #: core/database.cpp:648 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "" #: core/song.cpp:428 msgid "CDDA" msgstr "" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "" #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:114 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "" #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "" #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "" #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "" #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:68 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:585 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "" #: library/library.cpp:80 msgid "Last played" msgstr "" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: ui/equalizer.cpp:137 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "" #: core/song.cpp:410 msgid "MPC" msgstr "" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "" #: library/library.cpp:74 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:92 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "" #: core/utilities.cpp:151 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "" #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "" #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "" #: core/organise.cpp:73 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:139 msgid "Party" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Preferentias" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Preferentias..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "" #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "" #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Information de canto" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "" #: core/song.cpp:431 msgid "Stream" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "" #: ui/about.cpp:74 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "" #: core/song.cpp:426 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "" #: devices/giolister.cpp:157 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Incognite" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Error Incognite" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "De-subscriber" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Actualisar omne podcasts" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Actualisar le bibliotheca quando initia Clementine" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Actualisar iste podcast" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Actualisante" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Usage" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Usar authentication" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Usate" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Interfacie de usator" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Nomine de usator" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Varie artistas" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/id.po000066400000000000000000005064101260417502300236410ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Andre Mata Ludji <>, 2012 # nurissalamali , 2013 # FIRST AUTHOR , 2011 # Hassan Aly , 2014 # L1Nus , 2014 # La Ode Muh. Fadlun Akbar , 2014 # La Ode Muh. Fadlun Akbar , 2014 # Muhammad Iqbal , 2013 # L1Nus , 2014 # nix.Lilium , 2012 # nix.Lilium , 2012 # nurissalamali , 2013 # Rendiyono Wahyu Saputro , 2015 # Rizki Aulia Rachman , 2013 # Tjung Steven , 2012-2013 # Tjung Steven , 2013 # Tjung Steven , 2013-2014 # wantoyo , 2014 # wantoyo , 2014 # wantoyo , 2014 # zk , 2015 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Indonesian (http://www.transifex.com/davidsansome/clementine/language/id/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: id\n" "Plural-Forms: nplurals=1; plural=0;\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nAnda dapat memfavoritkan daftar putar dengan mengklik ikon bintang di sebelah nama daftar putar\n\nDaftar putar yang difavoritkan akan disimpan di sini" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " hari" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " md" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr " s" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " detik" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " lagu" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 lagu)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 album" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 hari" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 hari yang lalu" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 pada %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 daftar putar (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 terpilih dari" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 lagu" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 lagu" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 lagu ditemukan" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 lagu ditemukan (menampilkan %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 trek" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 telah ditransfer" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: modul Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 pendengar lainnya" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 total pemutaran" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%nama berkas%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n gagal" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n telah selesai" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n tersisa" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "Sej&ajarkan teks" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Tengah" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Ubahsuai" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "&Ekstra" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Bantuan" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&Sembunyikan %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Sembunyikan..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Kiri" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "&Musik" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Nihil" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "Daftar &Putar" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Keluar" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Mode pe&rulangan" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Kanan" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Mode &Karau" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Regang kolom agar pas dengan jendela" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Perkakas" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(berbeda diantara berbagai lagu)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", oleh" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...dan semua kontributor Amarok" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 hari" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 trek" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192,000Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44,100Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48,000Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 trek acak" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96,000Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Tingkatkan ke Premium sekarang" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Jika tidak dicentang, Clementine akan mencoba untuk menyimpan data peringkat anda dan statistik lainya hanya dalam sebuah basis data terpisah dan tidak mengubah berkas anda.

Jika dicentang, Clementine akan menyimpan statistik baik di basis data dan secara langsung ke dalam berkas setiap berkas itu berubah.

Tolong catat bahwa hal tersebut mungkin tidak bekerja pada setiap format, dan tidak ada anjuran untuk melakukan hal tersebut, pemutar musik lain mungkin tidak akan bisa membacanya.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Awali kata dengan nama ruas untuk membatasi pencarian ke ruas tersebut, mis. artist:Bode mencari pustaka untuk semua artis yang mengandung kata Bode..

Ruas yang tersedia: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Ini akan menulis peringkat lagu dan statistik ke dalam berkas tag untuk semua lagu di dalam anda.

Hal ini tidak diperlukan jika opsi "Simpan peringkat dan statistik ke dalam tag berkas" telah diaktifkan.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Token dimulai dengan %, sebagai contoh: %artis %album %title

\n\n

Jika anda mengurung bagian dari teks yang mengandung token dengan kurung kurawal, maka bagian tersebut akan disembunyikan jika token tersebut kosong.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Akun Premium Spotify dibutuhkan." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Aplikasi hanya dapat tersambung jika kode yang dimasukkan benar." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Daftar putar cerdas adalah daftar lagu dinamis yang diambil dari pustaka lagu anda. Ada beberapa jenis daftar putar cerdas yang menawarkan cara yang berbeda dalam memilih lagu." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Lagu akan dimasukkan ke dalam daftar putar jika memenuhi syarat berikut." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "KEMENANGAN UNTUK SANG HYPNOTOAD" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Batal" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Tentang %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Tentang Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Tentang Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Absolut" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Detail akun" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Detail akun (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Tindakan" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Tindakan" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Aktifkan/Nonaktifkan Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Strim aktivitas" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Tambah Podcast" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Tambah Strim" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Tambah baris baru jika didukung oleh tipe notifikasi" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Tambah tidakan" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Tambah semua trek dari sebuah direktori dan semua subdirektorinya" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Tambah strim lainnya..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Tambah direktori..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Tambah berkas" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Tambah berkas ke transkoder" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Tambah berkas ke transkoder" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Tambah berkas..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Tambah berkas untuk ditranskode" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Tambah folder" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Tambah folder..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Tambah folder baru..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Tambah podcast" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Tambah podcast..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Tambah lema pencarian" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Tambahkan nama album" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Tambahkan nama album artis" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Tambahkan nama artis" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Tambahkan nilai otomatis" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Tambahkan nama komposer" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Tambahkan nomor cakram" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Tambahkan nama berkas" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Tambahkan jenis musik" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Tambahkan kelompok" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Tambahkan durasi lagu" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Tambahkan nama penampil" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Tambahkan jumlah pemutaran" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Tambahkan peringkat" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Tambahkan jumlah lewatan" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Tambahkan judul lagu" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Tambah lagu ke tembolok" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Tambahkan nomor trek" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Tambahkan tahun rilis" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Tambahkan lagu ke \"Musikku\" ketika tombol \"Cinta\" diklik" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Tambah strim..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Tambahkan ke Musikku" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Tambahkan ke daftar putar Spotify" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Tambahkan ke bintang Spotify" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Tambahkan ke daftar putar lainnya" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Tambahkan ke penanda buku" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Tambahkan ke daftar putar" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Tambahkan ke antrean" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Tambahkan pengguna/grup ke penanda buku" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Tambah tindakan wiimotedev" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Tambah..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Ditambahkan bulan ini" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Ditambahkan minggu ini" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Ditambahkan tahun ini" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Ditambahkan hari ini" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Ditambahkan pada tiga bulan terakhir" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Pengelompokkan lanjut..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Setelah " #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Setelah menyalin..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Album (kenyaringan ideal untuk semua trek)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Album artis" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Sampul album" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Info album di jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Album" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Album dengan sampul" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Album tanpa sampul" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Semua" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Semua Berkas (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "Seluruh Kejayaan untuk Sang Hypnotoad!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Semua album" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Semua artis" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Semua berkas (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Semua daftar putar (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Semua penerjemah" #: library/library.cpp:98 msgid "All tracks" msgstr "Semua trek" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Izinkan aplikasi untuk mengunduh musik dari komputer ini." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Izinkan unduhan" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Izinkan enkode tengah/sisi" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Bersama dengan yang asli" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Selalu sembunyikan jendela utama" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Selalu tampilkan jendela utama" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Selalu mulai memutar" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon Cloud Drive" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Plugin tambahan dibutuhkan untuk menggunakan Spotify di Clementine. Apakah anda ingin mengunduh dan memasangnya sekarang?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Sebuah galat terjadi saat memuat basis data iTunes" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Sebuah galat terjadi saat menulis metadata ke '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Telah terjadi galat tidak dikenal." #: ui/about.cpp:85 msgid "And:" msgstr "Dan:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Marah" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Penampilan" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Tambahkan berkas/URL ke daftar putar" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Tambahkan ke daftar putar saat ini" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Tambahkan ke daftar putar" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Terapkan kompresi untuk mencegah clipping" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Apakah anda yakin ingin menghapus prasetel \"%1\"?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Apakah anda yakin ingin mengatur ulang statistik lagu ini?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Apakah anda yakin ingin menulis statistik lagu ke dalam berkas lagu untuk semua lagu di pustaka anda?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Artis" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Info artis" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Tag artis" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Inisial artis" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Tanya ketika menyimpan" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Format audio" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Keluaran audio" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Otentikasi gagal" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Penulis" #: ui/about.cpp:68 msgid "Authors" msgstr "Penulis" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Auto" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Otomatis" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Pembaruan otomatis" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Secara otomatis membuka kategori tunggal di pohon pustaka" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Tersedia" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Laju bit rerata" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Ukuran gambar rerata" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "Podcast BBC" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Strim Latar Belakang" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Warna latar belakang" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Gambar latar belakang" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Kelegapan latar belakang" #: core/database.cpp:648 msgid "Backing up database" msgstr "Membuat cadangan basis data" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Seimbang" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "Cekal (Last.fm scrobbling)" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Penganalisis bilah" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Biru Dasar" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Tipe audio dasar" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Perilaku" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Terbaik" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Biografi dari %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Laju bit" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Lajubit" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Lajubit" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Penganalisis blok" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Tipe blok" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Besaran kekaburan" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Badan" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Penganalisis dentuman" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Ramban..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Durasi Bufer" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Membufer..." #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Membuat indeks Seafile..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Tetapi sumber ini telah dinonfungsikan:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Tombol" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Dukungan lembar CUE" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Lokasi tembolok:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Tembolok" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "Tembolok %1" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Batal" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Batalkan unduhan" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Captcha dibutuhkan.\nCoba masuk ke Vk.com dengan peramban anda untuk menyelesaikan masalah ini." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Ubah sampul album" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Ubah ukuran huruf..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Ubah mode ulang" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Ubah pintasan..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Ubah mode karau" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "Ganti lagu yang diputar saat ini" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Ubah bahasa" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "Ubahan akan terdampak saat lagu berikutnya mulai diputar" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Mengubah preferensi pemutaran mono akan berlaku untuk lagu selanjutnya" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Periksa episode baru" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Periksa pembaruan" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Periksa pembaruan..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Pilih direktori tembolok Vk.com" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Pilih sebuah nama untuk daftar putar cerdas anda" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Pilih secara otomatis" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Pilih warna..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Pilih huruf..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Pilih dari daftar" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Pilih bagaimana daftar putar diurutkan dan berapa banyak lagu di dalamnya." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Pilih direktori unduhan podcast" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Pilih layanan internet yang anda ingin tampilkan." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Pilih situs web yang anda ingin Clementine gunakan saat mencari lirik." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Klasik" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Pembersihan" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Bersihkan" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Bersihkan daftar putar" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Galat Clementine" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Oranye Clementine" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Visualisasi Clementine" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine dapat secara otomatis mengonversi musik yang anda salin ke perangkat ini ke dalam format yang dapat diputar." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Clementine dapat memutar musik yang telah anda unggah ke Amazon Cloud Drive" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine dapat memutar musik yang telah anda unggah ke Box" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine dapat memutar musik yang telah anda unggah ke Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine dapat memutar musik yang telah anda diunggah ke Google Drive" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine dapat memutar musik yang telah anda unggah ke OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine dapat menampilkan pesan ketika trek berubah." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine dapat menyelaraskan daftar langganan anda dengan komputer anda yang lain dan aplikasi podcast. Buat akun." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine tidak dapat memuat visualisasi projectM. Periksa bahwa anda telah memasang Clementine dengan benar." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Penampil gambar Clementine" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine tidak dapat menemukan hasil untuk berkas ini" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine akan mencari musik di:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Klik di sini untuk menambahkan musik" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Klik di sini untuk memfavoritkan daftar putar ini sehingga akan disimpan dan tetap dapat diakses melalui panel \"Daftar Putar\" di bilah sisi kiri" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Klik untuk beralih antara waktu tersisa dan total waktu" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Mengklik tombol Masuk akan membuka peramban web. Anda harus kembali ke Clementine setelah anda masuk." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Tutup" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Tutup daftar putar" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Tutup visualisasi" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Menutup jendela ini akan membatalkan pengunduhan." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Menutup jendela ini akan menghentikan pencarian sampul album." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Klub" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Warna" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Daftar yang dipisahkan koma dari kelas:level, level adalah 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Komentar" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Radio Komunitas" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Lengkapi tag secara otomatis" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Lengkapi tag secara otomatis..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Komposer" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Konfigurasi %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Konfigurasi Magnature..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Konfigurasi Pintasan" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Konfigurasi Spotify..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Konfigurasi Subsonic..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Konfigurasi Vk.com..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Konfigurasi pencarian global..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Konfigurasi pustaka..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Konfigurasi podcast..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Konfigurasi..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Sambungkan Wii Remote menggunakan tindakan aktif/nonaktif" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Sambungkan perangkat" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Menyambung ke Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Koneksi ditolak oleh server, periksa URL server. Contoh: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Koneksi melewati batas waktu, periksa URL server. Contoh: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Koneksi bermasalah atau audio dinonaktifkan oleh pemiliknya" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Konsol" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Lajubit konstan" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Konversi semua musik" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Konversi semua musik yang tidak dapat diputar oleh perangkat." #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Konversi berkas audio nirsusut sebelum mengirim mereka ke rajuh." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Konversi berkas nirsusut" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Salin url berbagi ke papan klip" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Salin ke papan klip" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Salin ke perangkat..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Salin ke pustaka..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Hak cipta" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Tidak dapat menyambung ke Subsonic, periksa URL server. Contoh:\nhttp://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Tidak dapat membuat elemen GStreamer \"%1\" - pastikan anda memiliki semua plugin GStreamer yang dibutuhkan terpasang" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Tidak bisa membuat daftar putar" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Tidak dapat menemukan muxer untuk %1, periksa apakah anda memiliki plugin GStreamer yang benar terpasang" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Tidak dapat menemukan enkoder untuk %1, periksa apakah anda memiliki plugin GStreamer yang benar terpasang" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Tidak dapat membuka berkas keluaran %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Pengelola Sampul" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Sampul dari gambar tertanam" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Sampul dimuat secara otomatis dari %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Sampul tidak diset secara manual" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Sampul tidak diset" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Sampul diset dari %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Sampul dari %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Lesap-silang ketika mengubah trek secara otomatis" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Lesap-silang ketika mengubah trek secara manual" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Ubahsuai" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Gambar ubahsuai:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Pengaturan pesan ubahsuai" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Ubahsuai..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "Jalur DBus" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dansa" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Kerusakan basis data terdeteksi. Mohon baca https://code.google.com/p/clementine-player/wiki/DatabaseCorruption untuk petunjuk bagaimana cara untuk memulihkan basis data anda" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Tanggal dibuat" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Tanggal diubah" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Hari" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "De&fault" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Kurangi volume 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Kurangi volume persen" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Kurangi volume" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Gambar latar belakang bawaan" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Perangkat bawaan pada %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Bawaan" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Tundaan diantara visualisasi" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Hapus" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Hapus data yang sudah diunduh" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Hapus berkas" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Hapus dari perangkat..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Hapus dari diska..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Hapus episode yang sudah diputar" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Hapus prasetel" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Hapus daftar putar cerdas" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Hapus berkas yang asli" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Menghapus berkas" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Buang antrean trek terpilih" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Buang antrean trek" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Tujuan" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Detail..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Perangkat" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Properti Perangkat" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Nama perangkat" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Properti perangkat..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Perangkat" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Dialog" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Maksud anda" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Sandi Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Nama pengguna Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Sambungan internet langsung" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Direktori" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Nonfungsikan durasi" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Nonfungsikan pembuatan moodbar" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Nonfungsi" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Nonfungsi" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Cakram" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Transmisi putus-putus" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Opsi tampilan" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Tampilkan tampilan-pada-layar" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Lakukan pemindaian ulang pustaka menyeluruh" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Lakukan pemindaian ulang menyeluruh" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Lakukan pemindaian ulang menyeluruh..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Jangan konversi musik apapun" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Jangan timpa" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "Melakukan pemindaian ulang menyeluruh akan kehilangan semua metadata yang telah anda simpan di Clementine, seperti sampul album, jumlah pemutaran, dan peringkat. Clementine akan memindai ulang semua musik anda di Google Drive yang mungkin memakan waktu." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Jangan ulang" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Jangan tampilkan di artis beragam" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Jangan tampilkan episode yang didengarkan" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Jangan karau" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Jangan berhenti!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Donasi" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Kilk ganda untuk membuka" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "Klik ganda pada lagu dalam daftar putar akan..." #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Klik ganda pada lagu akan..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Mengunduh %n episode" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Direktori unduh" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Unduh episode ke" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Anggota unduh" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Unduh episode baru secara otomatis" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Antrean unduh" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Pengaturan unduhan" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Unduh apl Android" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Unduh album ini" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Unduh album ini..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Unduh episode ini" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Unduh..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Mengunduh (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Mengunduh direktori Icecast" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Mengunduh katalog Jamendo" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Mengunduh katalog Magnatune" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Mengunduh plugin Spotify" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Mengunduh metadata" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Seret untuk reposisi" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dubstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Durasi" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Mode dinamis nyala" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Miks acak dinamis" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Sunting daftar putar cerdas..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Sunting tag \"%1\"..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Sunting tag..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Sunting tag" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Sunting informasi trek" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Sunting informasi trek..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Sunting informasi trek..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Sunting..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "Surel" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Fungsikan dukungan Wii Remote" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Fungsikan tembolok otomatis" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Fungsikan ekualiser" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Fungsikan pintasan hanya ketika Clementine difokuskan" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Fungsikan edisi metadata lagu sebaris dengan mengkliknya" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Fungsikan sumber di bawah untuk menyertakannya di dalam hasil pencarian. Hasil akan ditampilkan dalam urutan ini." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Fungsi/Nonfungsikan Last.fm scrobbling" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Kompleksitas enkode" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Kualitas mesin enkode" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Mode enkode" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Masukkan URL" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Masukkan URL untuk mengunduh sampul dari Internet:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Masukkan nama berkas untuk sampul yang diekspor (tanpa ekstensi):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Masukkan nama baru untuk daftar putar ini" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Masukkan lema pencarian di atas untuk mencari musik di komputer dan di internet" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Masukkan lema pencarian di bawah untuk mencari podcast di Toko iTunes" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Masukkan lema pencarian di bawah untuk mencari podcast di gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Masukkan lema pencarian di sini" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Masukkan URL strim radio internet:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Masukkan nama folder" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Masukan IP ini dalam Apl untuk menyambung ke Clementine." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Semua koleksi" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Ekualiser" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Setara dengan --log-level *: 1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Setara dengan --log-level *: 3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Galat" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Galat Merabit CD" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Galat menyambung perangkat MTP" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Galat menyalin lagu" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Galat menghapus lagu" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Galat mengunduh plugin Spotify" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Galat memuat %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Galat memuat daftar putar di.fm" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Galat memroses %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Galat saat memuat CD audio" #: library/library.cpp:68 msgid "Ever played" msgstr "Pernah diputar" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Setiap 10 menit" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Setiap 12 jam" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Setiap 2 jam" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Setiap 20 menit" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Setiap 30 menit" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Setiap 6 jam" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Setiap jam" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Kecuali antara trek pada album yang sama atau di lembar CUE yang sama" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Sampul yang tersedia" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Perluas" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Kedaluwarsa pada %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Ekspor Sampul" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Ekspor sampul" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Ekspor sampul yang sudah diunduh" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Ekspor sampul yang tertanam" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Ekspor selesai" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Mengekspor %1 sampul dari %2 (%3 dilewati)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Lesap senyap saat jeda / lesap jelma saat melanjutkan" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Lesap senyap saat menghentikan trek" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Melesap" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Durasi lesap" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Gagal membaca penggerak CD" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Gagal mengambil direktori" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Gagal mengambil podcast" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Gagal memuat podcast" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Gagal mengurai XML untuk umpan RSS ini" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Cepat" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Trek favorit" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Ambil Sampul yang Hilang" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Ambil secara otomatis" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Pengambilan selesai" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Mengambil pustaka Subsonic" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Galat pengambilan sampul" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Format Berkas" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Ekstensi berkas" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Format berkas" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Nama berkas" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Nama berkas (tanpa jalur)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Pola nama berkas:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Lokasi berkas" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Ukuran berkas" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Jenis berkas" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Nama berkas" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Berkas" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Berkas untuk ditranskode" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Temukan lagu di pustaka anda yang sesuai dengan kriteria yang anda tetapkan." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Temukan artis ini" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Sidik jari lagu" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Selesai" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Level pertama" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Paskan sampul ke lebar" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Ukuran huruf" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Karena alasan lisensi, dukungan Spotify tersedia dalam plugin terpisah." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Paksa enkode mono" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Lupakan perangkat" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Melupakan perangkat akan membuangnya dari daftar ini dan Clementine harus memindai ulang semua lagu ketika anda menyambungkannya lagi." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Form" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Format" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Lajubingkai" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Bingkai per bufer" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Beku" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Bass Penuh" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Bass + Treble Penuh" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Treble Penuh" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Umum" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Pengaturan umum" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Genre" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Dapatkan sebuah URL untuk membagikan lagu Spotify ini" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Dapatkan sebuah URL untuk membagikan daftar putar ini" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Mendapatkan saluran" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Mendapatkan strim" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Berikan nama:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Jalankan" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Buka tab daftar putar selanjutnya" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Buka tab daftar putar sebelumnya" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Mendapatkan %1 sampul dari %2 ( %3 gagal)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Pudarkan lagu yang sudah tidak ada dalam daftar putar saya" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Grup Pustaka berdasarkan..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Grup berdasarkan" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Grup berdasarkan Album" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Grup berdasarkan Artis" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Grup berdasarkan Artis/Album" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Grup berdasarkan Artis/Tahun - Album" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Grup berdasarkan Genre/Album" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Grup berdasarkan Genre/Artis/Album" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Pengelompokan" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "Halaman HTML tidak mengandung umpan RSS apapun" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "Kode status HTTP 3xx diterima tanpa URL, verifikasi konfigurasi server." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "Proxy HTTP" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Bahagia" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Informasi perangkat keras" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Informasi hardware hanya tersedia ketika perangkat tersambung." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Tinggi" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Tinggi (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Tinggi (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "HipHop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Tidak bisa menemukan hos, periksa URL server. Contoh: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Jam" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Saya tidak memiliki akun Magnatune" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Ikon" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Ikon di atas" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Mengidentifikasi lagu" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Jika diaktifkan, mengklik lagu yang dipilih di dalam tampilan daftar putar memperbolehkan anda menyunting nilai tag secara langsung" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Jika anda lanjutkan, perangkat ini akan bekerja lambat dan lagu-lagu yang disalin mungkin tidak bekerja." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Jika anda tahu URL podcast, masukkan dan tekan Jalankan." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Abaikan \"The\" di dalam nama artis" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Gambar (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Gambar (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Impor..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "Dalam %1 hari" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "Dalam %1 minggu" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "Dalam mode dinamis, trek baru akan dipilih dan ditambahkan ke daftar putar setiap lagu selesai." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Kotak Masuk" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Sertakan sampul album di dalam pemberitahuan" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Sertakan semua lagu" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Versi protokol REST Subsonic tidak kompatibel. Aplikasi harus dimutakhirkan." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Versi protokol REST Subsonic tidak kompatibel. Server harus dimutakhirkan." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Konfigurasi tidak lengkap, mohon pastikan semua ruas dicatat." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Naikkan volume 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Naikkan volume persen" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Naikkan volume" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Mengindeks %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Informasi" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Opsi masukan" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Sisipkan..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Terpasang" #: core/database.cpp:585 msgid "Integrity check" msgstr "Periksa integritas" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Penyedia internet" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Layanan internet" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "Trek intro" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Kunci API tidak valid" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Format tidak valid" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Metode tidak valid" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Parameter tidak valid" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Sumber daya tidak valid disebut" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Layanan tidak valid" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Kunci sesi tidak valid" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Balikkan Pilihan" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Trek Jamendo yang Paling Sering Didengar" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Trek Jamendo Terpopuler" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Trek Jamendo Terpopuler Bulan Ini" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Trek Jamendo Terpopuler Minggu Ini" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Basis data Jamendo" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Lompat ke lagu sebelumnya sesegera" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Lompat ke trek yang sedang diputar" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Jaga tombol selama %1 detik..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Jaga tombol selama %1 detik..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Tetap jalankan di belakang layar ketika jendela ditutup" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Simpan berkas yang asli" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Anak kucing" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Bahasa" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Laptop/Fonkepala" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Balai Besar" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Sampul album besar" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Sampul album besar (detail di bawah)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Sampul album besar (tanpa detail)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Bilah sisi besar" #: library/library.cpp:80 msgid "Last played" msgstr "Terakhir diputar" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Terakhir diputar" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm sedang sibuk, cobalah beberapa menit lagi" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Sandi Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Jumlah pemutaran Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Tag Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Nama pengguna Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Wiki Last.fm" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Trek favorit tersedikit" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Kiri" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Durasi" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Pustaka" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Pengelompokan pustaka lanjutan" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Pemberitahuan pemindaian ulang pustaka" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Pencarian pustaka" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Batas" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Langsung" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Muat" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Muat sampul dari URL" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Muat sampul dari URL..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Muat sampul dari diska" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Muat sampul dari diska..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Muat daftar putar" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Muat daftar putar..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Memuat perangkat MTP" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Memuat basis data iPod" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Memuat daftar putar cerdas" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Memuat lagu" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Memuat strim" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Memuat trek" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Memuat info trek" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Memuat..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Muat berkas/URL, menggantikan daftar putar saat ini" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Masuk" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Gagal masuk" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Keluar" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Profil prediksi jangka panjang (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Suka" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "Suka (Last.fm scrobbling)" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Rendah (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Rendah (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Profil kompleksitas rendah (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Lirik" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Lirik dari %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Lirik dari tag ID3v2" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Pengunduhan Magnatune" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Pengunduhan Magnatune telah selesai" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Profil utama (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Buatlah begitu!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Buatlah begitu!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Buat daftar putar tersedia luring" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Respons cacat" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Konfigurasi proxy manual" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Secara manual" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Produsen" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Tandai sudah didengar" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Tandai sebagai baru" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Cocok setiap lema pencarian (AND)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Cocok satu atau lebih lema pencarian (OR)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Hasil pencarian global maks" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Lajubit maksimum" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Media telah diubah. Memuat ulang" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Sedang (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Sedang (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Tipe keanggotaan" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Lajubit minimum" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Minimum pengisian bufer" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Kehilangan prasetel projectM" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Monitor perubahan pustaka" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Pemutaran mono" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Bulan" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Mood" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Gaya moodbar" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Moodbar" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Lebih banyak" #: library/library.cpp:84 msgid "Most played" msgstr "Paling sering diputar" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Titik kait" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Titik kait" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Pindah turun" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Pindah ke pustaka..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Pindah naik" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Musik" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Pustaka Musik" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Bisu" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Albumku" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Musikku" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Rekomendasiku" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Nama" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Nama" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Opsi penamaan" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Pita sempit (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Proxy Jaringan" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Remote Jaringan" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Tidak Pernah" #: library/library.cpp:74 msgid "Never played" msgstr "Tidak pernah diputar" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Jangan mulai memutar" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Folder baru" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Daftar putar baru" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Daftar putar cerdas baru..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Lagu baru" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Trek baru akan ditambahkan secara otomatis." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Trek terbaru" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Lanjut" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Trek selanjutnya" #: core/utilities.cpp:151 msgid "Next week" msgstr "Minggu depan" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Tidak ada penganalisis" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Tidak ada gambar latar belakang" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Tidak ada sampul untuk diekspor." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Tanpa blok panjang" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Tidak ada yang cocok. Kosongkan kotak pencarian untuk menampilkan lagi seluruh daftar putar." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Tanpa blok pendek" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Nihil" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Tidak satu pun dari lagu yang dipilih cocok untuk disalin ke perangkat" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Normal" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Tipe blok normal" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Tidak tersedia saat menggunakan daftar putar dinamis" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Tidak terhubung" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Konten tidak cukup" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Tidak cukup penggemar" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Tidak cukup anggota" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Tidak cukup tetangga" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Tidak terpasang" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Belum masuk" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Tidak terkait - klik ganda untuk mengait" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Tidak menemukan apapun" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Tipe notifikasi" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Notifikasi" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Sekarang Diputar" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Jumlah episode untuk ditampilkan" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Pratinjau OSD" #: widgets/osd.cpp:173 msgid "Off" msgstr "Mati" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "Nyala" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Hanya menerima koneksi dari klien dalam rentang ip:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Hanya izinkan koneksi dari jaringan lokal" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Hanya tampilkan yang pertama" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Kelegapan" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Buka %1 di peramban" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Buka CD &audio..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Buka berkas OPML" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Buka berkas OPML..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Buka sebuah direktori untuk mengimpor musik dari" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Buka perangkat" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Buka berkas..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Buka di Google Drive" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Buka di daftar putar baru" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Buka di daftar putar baru" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Buka di peramban anda" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Buka..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Proses gagal" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Optimalkan untuk lajubit" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Optimalkan untuk kualitas" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Opsi..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Atur Berkas" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Atur berkas..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Mengatur berkas" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Tag asli" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "Tahun asli" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "Tahun asli - Album" #: library/library.cpp:118 msgid "Original year tag support" msgstr "Dukungan tag tahun asli" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Opsi lainnya" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Keluaran" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Perangkat keluaran" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Opsi keluaran" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Timpa semua" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Timpa berkas yang ada" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Hanya timpa yang lebih kecil" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Pemilik" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Mengurai katalog Jamendo" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Pesta" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Sandi" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Jeda" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Jeda pemutaran" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Jeda" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Penampil" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Piksel" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Bilah sisi polos" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Putar" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Jumlah putar" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Putar jika berhenti, jeda jika berputar" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Putar jika tidak ada yang sedang diputar" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Putar trek ke dalam daftar putar" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Putar/Jeda" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Pemutaran" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Opsi pemutar" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Daftar putar" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Daftar putar selesai" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Opsi daftar putar" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Tipe daftar putar" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Daftar putar" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Mohon tutup peramban anda dan kembali ke Clementine." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Status plugin:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcast" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Durasi popup" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Pre-amp" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Preferensi" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Preferensi" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Preferensi..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Nama berkas sampul album yang diinginkan (dipisahkan koma)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Format audio yang diinginkan" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Lajubit yang diinginkan" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Format yang diinginkan" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Tipe audio premium" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Prasetel:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Tekan kombinasi tombol untuk menggunakan" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Tekan tombol" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Tekan kombinasi tombol untuk menggunakan %1..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Menekan \"Sebelumnya\" pada pemutar akan..." #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Opsi Pretty OSD" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Pratinjau" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Sebelumnya" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Trek sebelumnya" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Cetak informasi versi" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Kemajuan" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Kemajuan" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psychedelic" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Tekan tombol Wiiremote" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Tempatkan lagu dalam urutan acak" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Kualitas" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Kualitas" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Meminta perangkat..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Pengelola antrean" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Antre trek terpilih" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Antre trek" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (kenyaringan sama untuk semua trek)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Hujan" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Hujan" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Visualisasi acak" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Nilai lagu saat ini 0 bintang" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Nilai lagu saat ini 1 bintang" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Nilai lagu saat ini 2 bintang" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Nilai lagu saat ini 3 bintang" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Nilai lagu saat ini 4 bintang" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Nilai lagu saat ini 5 bintang" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Penilaian" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Benar-benar membatalkan?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Pengalihan melampaui batas, verifikasi konfigurasi server." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Segarkan katalog" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Segarkan saluran" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Segarkan daftar stasiun" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Segarkan strim" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Relatif" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Ingat ayunan remote Wii" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Ingat dari waktu terakhir" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Ingat pilihan saya" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Buang" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Buang tindakan" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Buang duplikat dari daftar putar" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Buang folder" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Buang dari Musikku" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Buang dari penanda buku" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Buang dari daftar putar" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Buang daftar putar" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Buang daftar putar" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Buang trek yang tidak tersedia dari daftar putar" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Ubah nama daftar putar" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Ubah nama daftar putar.." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Beri nomor baru trek dalam urutan ini..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Ulang" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Ulang album" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Ulang daftar pitar" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Ulang trek" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Ganti daftar putar saat ini" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Ganti daftar putar" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Ganti spasi dengan garis bawah" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Mode Replay Gain" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Populasi ulang" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Membutuhkan kode otentikasi" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Set Ulang" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Set ulang jumlah putar" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Mulai ulang lagu, lalu lompat ke yang sebelumnya jika ditekan lagi" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Mulai ulang trek, atau putar trek sebelumnya jika masih dalam 8 detik sejak mulai." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Batasi ke karakter ASCII" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Lanjutkan pemutaran saat memulai Clementine" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Kembali ke Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Kanan" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Rabit" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Rabit CD" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Rabit CD audio" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Jalankan" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "Proxy SOCKS" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Galat jabat tangan SSL, verifikasi konfigurasi server. Opsi SSLv3 di bawah mungkin solusi beberapa masalah." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Secara aman melepas perangkat" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Secara aman melepas perangkat setelah menyalin" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Laju sampel" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Lajusampel" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Simpan berkas .mood ke dalam pustaka musik anda" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Simpan sampul album" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Simpan sampul ke diska..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Simpan gambar" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Simpan daftar putar" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Simpan daftar putar" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Simpan daftar putar..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Simpan prasetel" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Simpan nilai di dalam berkas tag jika memungkinkan" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Simpan statistik di dalam berkas tag jika memungkinkan" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Simpan strim ini di tab Internet" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Menyimpan statistik lagu ke dalam berkas lagu" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Menyimpan trek" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Profil laju sampel terukur (LST)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Ukuran skala" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Nilai" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Scrobble trek yang saya dengar" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Cari" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Cari" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Cari stasiun Icecast" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Cari Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Cari Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Cari Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Cari secara otomatis" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Cari sampul album..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Cari apapun" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Cari gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Cari iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Mode pencarian" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Opsi pencarian" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Hasil pencarian" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Lema pencarian" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Level kedua" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Jangkau mundur" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Jangkau maju" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Jangkau trek yang sedang diputar berdasarkan nilai relatif" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Jangkau yang sedang diputar ke posisi absolut" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "Jangkau menggunakan kombinasi tombol papan ketik" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Pilih Semua" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Pilih Tidak Ada" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Pilih warna latar belakang:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Pilih gambar latar belakang" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Pilih kecocokan yang terbaik" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Pilih warna latar depan:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Pilih visualisasi" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Pilih visualisasi..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Pilih..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Nomor seri" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Server" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "URL Server" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Detail server" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Layanan luring" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Tetapkan %1 ke \"%2\"..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Tetapkan volume ke persen" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Tetapkan nilai untuk semua trek terpilih..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Pengaturan" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Pintasan" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Pintasan untuk %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Pintasan untuk %1 sudah ada" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Tampilkan" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Tampilkan OSD" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Tampilkan animasi bersinar di trek saat ini" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Tampilkan moodbar dalam bilah kemajuan trek" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Tampilkan notifikasi desktop yang asli" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Tampilkan notifikasi ketika saya mengubah mode ulang/karau" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Tampilkan notifikasi ketika saya mengubah volume" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Tampilkan sebuah notifikasi ketika saya jeda pemutaran" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Tampilkan popup dari baki sistem" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Tampilkan OSD cantik" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Tampilkan di atas bilah status" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Tampilkan semua lagu" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Tampilkan semua lagu" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Tampilkan sampul di pustaka" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Tampilkan pembagi" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Tampilkan ukuran penuh" #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Tampilkan grup di dalam hasil pencarian global" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Tampilkan di peramban berkas..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Tampilkan di pustaka..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Tampilkan di artis beragam" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Tampilkan moodbar" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Tampilkan hanya duplikat" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Tampilkan hanya tidak bertag" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Tampilkan lagu yang diputar di halaman anda" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Tampilkan saran pencarian" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Tampilkan tombol \"love\"" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Tampilkan tombol scrobble di jendela utama" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Tampilkan ikon baki" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Tampilkan sumber mana yang difungsikan dan dinonfungsikan" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Tampilkan/Sembunyikan" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Karau" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Karau album" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Karau semua" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Karau daftar putar" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Karau trek di dalam album ini" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Masuk" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Keluar" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Sedang masuk..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Artis serupa" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Ukuran" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Ukuran:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Lewati mundur di dalam daftar putar" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Lewati hitungan" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Lewati maju di dalam daftar putar" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Lewati trek yang dipilih" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Lewati trek" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Sampul album kecil" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Bilah sisi kecil" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Daftar putar cerdas" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Daftar putar cerdas" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Informasi Lagu" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Info lagu" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Maaf" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Urut berdasarkan genre (abjad)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Urut berdasarkan genre (popularitas)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Urut berdasarkan nama stasiun" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Urut lagu berdasarkan" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Mengurutkan" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Sumber" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Sumber" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Galat masuk Spotify" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "URL daftar putar Spotify" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Plugin Spotify" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Plugin Spotify tidak terpasang" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "URL lagu Spotify" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Standar" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Berbintang" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Mulai merabit" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Mulai daftar putar yang diputar saat ini" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Mulai transkode" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Mulai mengetik sesuatu di kotak pencarian di atas untuk mengisi daftar hasil pencarian ini" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Memulai %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Memulai..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Berhenti" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Berhenti setelah" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Berhenti setelah masing-masing trek" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Berhenti setelah setiap trek" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Berhenti setelah trek ini" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Hentikan pemutaran" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Berhenti memutar setelah trek saat ini" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Berhenti memutar setelah trek: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Berhenti" #: core/song.cpp:431 msgid "Stream" msgstr "Strim" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Strim dari server Subsonic membutuhkan lisensi server yang valid setelah 30 hari masa uji coba." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Anggota strim" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Pelanggan" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Sukses!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "Berhasil menulis %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Tag yang disarankan" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Ringkasan" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Sangat tinggi (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Sangat tinggi (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Format yang didukung" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Selasarkan statistik ke berkas sekarang" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Melaraskan kotak masuk Spotify" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Melaraskan daftar putar Spotify" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Melaraskan trek bintang Spotify" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Warna sistem" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Tab di puncak" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Pengambil tag" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Target lajubit" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Tekno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Opsi teks" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Terima kasih kepada" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Perintah \"%1\" tidak dapat dimulai." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Sampul album dari lagu yang diputar saat ini" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "Direktori %1 tidak valid" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "Nilai kedua harus lebih besar dari yang pertama!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Situs yang anda minta tidak ada!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Situs yang anda minta bukan sebuah gambar!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Masa uji coba untuk server Subsonic telah berakhir. Mohon donasi untuk mendapatkan kunci lisensi. Kunjungi subsonic.org untuk lebih perinci." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Versi Clementine yang baru saja anda perbarui membutuhkan pemindaian ulang pustaka menyeluruh karena fitur baru yang tercantum di bawah ini:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Ada lagu lainnya di dalam album ini" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Ada masalah komunikasi dengan gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Ada masalah pengambilan metadata dari Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Ada masalah dalam mengurai respons dari Toko iTunes" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Ada masalah penyalinan pada beberapa lagu. Berkas-berkas berikut tidak dapat disalin:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Ada masalah dalam menghapus beberapa lagu. Berkas-berkas berikut tidak dapat dihapus:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Berkas-berkas ini akan dihapus dari perangkat, apakah anda yakin ingin melanjutkan?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Berkas-berkas ini akan dihapus secara permanen dari diska, apakah anda yakin ingin melanjutkan?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Folder berikut akan dipindai untuk musik untuk membuat pustaka anda" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Pengaturan ini digunakan dalam dialog \"Transkode Musik\", dan ketika mengonversi musik sebelum menyalinnya ke perangkat." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Level ketiga" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Tindakan ini akan membuat basis data yang besarnya bisa mencapai 150 MB. \nApakah anda tetap ingin melanjutkan?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Album ini tidak tersedia dalam format yang diminta" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Ini dapat diubah kemudian melalui preferensi" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Perangkat ini harus tersambung dan dibuka sebelum Clementine dapat melihat format berkas apa yang didukungnya." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Perangkat ini mendukung format berkas berikut:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Perangkat ini tidak akan bekerja dengan baik" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Ini adalah perangkat MTP, tetapi anda mengompilasi Clementine tanpa dukungan libmtp." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Ini adalah iPod, tetapi anda mengompilasi Clementine tanpa dukungan libgpod." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Ini adalah pertama kalinya anda menyambungkan perangkat ini. Clementine sekarang akan memindai perangkat untuk mencari berkas musik - ini mungkin memakan waktu." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Opsi ini dapat diubah di pengaturan \"Perilaku\"" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Strim ini hanya untuk pelanggan berbayar" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Tipe perangkat ini tidak didukung: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "Selang waktu" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Judul" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Hari Ini" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Jungkit Pretty OSD" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Jungkit layar penuh" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Jungkit status antrean" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Jungkit scrobbling" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Jungkit kenampakan tampilan-pada-layar cantik" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Besok" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Terlalu banyak pengalihan" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Trek populer" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Total album:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Jumlah byte yang ditransfer" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Total permintaan jaringan yang dibuat" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Trek" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Trek" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Transkode Musik" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Log Transkoder" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Transkode" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Transkode berkas %1 menggunakan %2 thread" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Opsi transkode" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbin" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Matikan" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Pita ultra lebar (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Tidak dapat menyambung" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Tidak dapat mengunduh %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Tidak diketahui" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Tipe-muatan tidak diketahui" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Galat tidak diketahui" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Takset sampul" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Taklewati trek yang dipilih" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Taklewati trek" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Taklangganan" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Konser Mendatang" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Perbarui" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Perbarui semua podcast" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Perbarui perubahan folder pustaka " #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Perbarui pustaka ketika memulai Clementine" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Perbarui podcast ini" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Memperbarui" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Memperbarui %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Memperbarui %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Memperbarui pustaka" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Penggunaan" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Gunakan tag Album Artis ketika tersedia" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Gunakan tombol pintasan Gnome" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Gunakan Warna Psychedelic" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Gunakan metadata Replay Gain jika tersedia" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Gunakan SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Gunakan Wii Remote" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Gunakan set warna ubahsuai" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Gunakan pesan ubahsuai untuk pemberitahuan" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Gunakan pengendali jaringan rajuh" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Gunakan otentikasi" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Gunakan mesin pengelolaan lajubit" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Gunakan mode dinamis" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Gunakan notifikasi untuk melaporkan status Wii Remote" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Gunakan pengasah derau temporal" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Gunakan bawaan sistem" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Gunakan set warna bawaan sistem" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Gunakan pengaturan proxy sistem" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Gunakan normalisasi volume" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Bekas" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Antarmuka" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Nama pengguna" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Menggunakan menu untuk menambah lagu akan..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Laju bit beragam" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Artis beraga" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Versi %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Tampilan" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Mode visualisasi" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Visualisasi" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Pengaturan Visualisasi" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Deteksi aktivitas suara" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Volume %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Dinding" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Peringatkan saya ketika menutup tab daftar putar" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Situs web" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Mingguan" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Saat Clementine mulai" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Ketika mencari sampul album, Clementine akan lebih dulu mencari berkas gambar yang mengandung satu dari kata berikut.\nJika tidak ada yang cocok maka akan menggunakan gambar terbesar dalam direktori." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "Ketika menyimpan daftar putar, lokasi berkas sebaiknya" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Ketika daftar kosong..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Kenapa tidak coba..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Pita lebar (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: aktif" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: tersambung" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: baterai kritis (%2%)" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: nonaktif" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: terputus" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: baterai lemah (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Tanpa sampul:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Apakah anda ingin memindahkan lagu lainnya di dalam album ini ke Artis Beragam?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Apakah anda ingin menjalankan pemindaian ulang menyeluruh sekarang?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Tulis semua statistik lagu ke dalam berkas lagu" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Menulis metadata" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Nama pengguna dan sandi salah." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Tahun" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Tahun - Album" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Tahun" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Kemarin" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Anda akan mengunduh album berikut" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Anda akan membuang %1 daftar putar dari favorit anda, apakah anda yakin?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Anda akan membuang daftar putar yang bukan bagian dari daftar putar favorit anda: daftar putar akan dihapus (tindakan ini tidak dapat diurungkan). \nApakah anda yakin ingin melanjutkan?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Anda belum masuk." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Anda masuk sebagai %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Anda sudah masuk." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Anda dapat mengubah cara pengaturan lagu dalam pustaka." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Anda dapat mendengarkan secara gratis tanpa akun, tetapi anggota Premium dapat mendengarkan strim berkualitas tinggi tanpa iklan." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Anda dapat mendengarkan lagu Magnatune secara gratis tanpa akun. Membeli keanggotaan membuang pesan pada akhir setiap trek." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Anda dapat mendengarkan strim latar belakang dan musik lainnya pada saat yang bersamaan." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Anda dapat menggunakan Wii Remote sebagai pengendali rajuh untuk Clementine. Lihat halaman pada wiki Clementine untuk informasi lebih lanjut.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Anda tidak memiliki akun Spotify Premium." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Anda tidak memiliki langgan yang aktif" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "Anda tidak perlu masuk untuk mencari dan mendengarkan musik di SoundCloud. Namun, anda perlu masuk untuk mengakses daftar putar dan strim anda." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Anda sudah keluar dari Spotify, mohon masukkan kembali sandi anda di dialog Pengaturan." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Anda sudah keluar dari Spotify, mohon masukkan kembali sandi anda." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Anda menyukai trek ini" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "Anda perlu meluncurkan Preferensi Sistem dan mengizinkan Clementine untuk \"mengendalikan komputer anda\" untuk menggunakan pintasan global di Clementine." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Anda perlu memulai ulang Clementine jika anda mengubah bahasa." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Alamat IP anda:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Kredensial Last.fm anda tidak benar" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Kredensial Magnatune anda tidak benar" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Pustaka anda kosong!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Strim radio anda" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Scrobble anda: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Sistem anda kehilangan dukungan OpenGL, visualisasi tidak tersedia." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Username atau sandi anda salah." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Nol" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "tambahkan %n lagu" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "setelah" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "yang lalu" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "dan" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "otomatis" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "sebelum" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "antara" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "terbesar dulu" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "mengandung" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "nonfungsi" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "cakram %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "tidak mengandung" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "berakhir dengan" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "sama" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "Direktori gpodder.net" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "lebih besar dari" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "iPod dan perangkat USB saat ini tidak bekerja pada Windows. Maaf!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "di yang terakhir" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "kurang dari" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "terpanjang dulu" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "pindah %n lagu" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "terbaru dulu" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "tidak sama" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "tidak di yang terakhir" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "tidak pada" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "terlama dulu" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "pada" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "opsi" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "atau pindai kode QR!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "tekan enter" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "buang %n lagu" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "terpendek dulu" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "karau lagu" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "terkecil dulu" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "urutkan lagu" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "dimulai dengan" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "berhenti" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "trek %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/is.po000066400000000000000000004071451260417502300236650ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Atli Mills , 2012 # FIRST AUTHOR , 2011 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Icelandic (http://www.transifex.com/davidsansome/clementine/language/is/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: is\n" "Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " sekúndur" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " lög" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 plötur" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 dagar" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 dögum síðan" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 lagalistar (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 valið af" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 lag" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 lög" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 lög fundin" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 lög fundin (sýni %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 lög" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimodedev eining" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n misheppnaðist" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n lokið" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n eftir" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Samstilla texta" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Miðjað" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Sérsnið" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Hjálp" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&Fela %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Fela" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Vinstri" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Ekkert" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Hætta" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Hægri" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Teygja á dálkum til að koma glugga fyrir" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(breytilegt yfir mörg lög)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...og allir Amarok stuðningsaðilar" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 dagur" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 lag" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 slembin lög" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "" #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Lag birtist á lagalista að ákveðnum skilyrðum uppfylltum" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Um %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Um Clementine" #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Um Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Nánar um notanda" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Virkt/óvirkt Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Bæta við straumi" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Bæta við aðgerð" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Bæta við öðrum straumi" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Bæta við möppu..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Bæta við skrá..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Bæta við skrá til að millikóða" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Bæta við möppu" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Bæta við möppu..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Bæta við nýrri möppu..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Bæta við leitarorði" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Bæta við straumi..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Bæta við lagalista" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Bæta við biðröð" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Bæta við wiimotedev ferli" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Bæta við..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Bætt við í þessum mánuði" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Bætt við í þessari viku" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Bætt við á þessu ári" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Bætt við í dag" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Bætt við innan síðustu þriggja mánaða" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Þróuð flokkun" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Eftir afritun..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Plata" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Plata (kjörstyrkur hljóðs fyrir öll lög)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Listamenn á plötu" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Plötuupplýsingar á jamendo.com" #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Plötur með plötuumslagi" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Plötur án plötuumslaga" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Allar skrár (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Allar plötur" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Allir listamenn" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Allar skrár (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Allir lagalistar (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Allir þýðendur" #: library/library.cpp:98 msgid "All tracks" msgstr "Öll lög" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Samhliða upprunalegum" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Alltaf að fela aðalglugga" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Alltaf að sýna aðalglugga" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Alltaf hefja spilun" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Villa kom upp við hleðslu iTunes gagnagrunns" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Villa kom upp við skrifun lýsigagna á %1" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:85 msgid "And:" msgstr "Og:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Útlit" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Bætar við skrám/URL í lagalista" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Bæta við núverandi lagalista" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Bæta við lagalistann" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Ertu viss um að þú viljir eyða \"%1\" forstillingunni?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Flytjandi" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Upplýsingar um höfund" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Auðkenning mistókst" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "" #: ui/about.cpp:68 msgid "Authors" msgstr "Höfundar" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Sjálfvirk uppfærsla" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Tiltækt" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Straumar í bakgrunni" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Bakgrunnslitur" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Gegnsæi bakgrunns" #: core/database.cpp:648 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "" #: core/song.cpp:428 msgid "CDDA" msgstr "" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "" #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:114 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Eyða upprunalegum skrám" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Eyði gögnum" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Áfangastaður" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Meintirðu" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Ekki endurtaka" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Ekki hætta!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Tvíklikka til að opna" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Tvíklikka á lag mun..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Niðurhalsskrá" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Niðurhala þessari plötu" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Niðurhala þessari plötu..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Niðurhala..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Niðurhala Spotify viðbót" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Dragðu til að endurstaðsetja" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Breyta upplýsingum um lag" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Breyta upplýsingum um lag..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Breyta upplýsingum um lög..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Breyta..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Tónjafnari" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Villa" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Villa við afritun laga" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Villa við eyðingu laga" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Villa kom upp við niðurhal á Spotify viðbót" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:68 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Hratt" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Uppáhalds lög" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Skráarnafn" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Skráarstærð" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Tegund skráar" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Gögn" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Lokið" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Leturstærð" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:585 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "" #: library/library.cpp:80 msgid "Last played" msgstr "" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: ui/equalizer.cpp:137 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "" #: core/song.cpp:410 msgid "MPC" msgstr "" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "" #: library/library.cpp:74 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:92 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "" #: core/utilities.cpp:151 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "" #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "" #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "" #: core/organise.cpp:73 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:139 msgid "Party" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "" #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "" #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "" #: core/song.cpp:431 msgid "Stream" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "" #: ui/about.cpp:74 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "" #: core/song.cpp:426 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "" #: devices/giolister.cpp:157 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/it.po000066400000000000000000005145631260417502300236710ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # arnaudbienner , 2011 # davidsansome , 2010 # Saverio , 2014-2015 # Vincenzo Reale , 2011, 2012 # Vincenzo Reale , 2010 # Vincenzo Reale , 2012-2015 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Italian (http://www.transifex.com/davidsansome/clementine/language/it/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nPuoi creare scalette preferite facendo clic sulla stella accanto al nome della scaletta\n\nLe scalette preferite saranno salvate qui" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "giorni" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " punti" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr " s" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " secondi" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " brani" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 brani)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 album" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 giorni" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 giorni fa" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 di %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 scalette (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 selezionate di" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 brano" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 brani" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 brani trovati" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 brani trovati (mostrati %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 tracce" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 trasferiti" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: modulo Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 altri ascoltatori" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 riproduzioni totali" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n non riusciti" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n completati" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n rimanenti" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Allinea il testo" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Centrato" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Personalizzata" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "&Extra" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "Aiuto" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "Nascon&di %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "Nascon&di..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "A &sinistra" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "&Musica" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Nessuna" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "Scale&tta" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Esci" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Modalità di &ripetizione" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "A dest&ra" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Modalità di me&scolamento" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "Allunga le colonne per adattarle alla fines&tra" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "S&trumenti" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(differente tra diversi brani)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", di" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...e tutti i collaboratori di Amarok" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "un giorno" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "una traccia" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "MP3 128k" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192.000Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44.100Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48.000Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 tracce casuali" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96.000Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Aggiorna subito a Premium" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Se non marcata, Clementine proverà a salvare le valutazioni e le altre statistiche in un database separato senza modificare i tuoi file.

Se marcata, salverà le statistiche sia nel database che direttamente nei file ad ogni modifica.

Nota che potrebbe non funzionare per ogni formato e, dato che non esiste uno standard, altri lettori musicali potrebbero non essere in grado di leggerli.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Anteponi una parola con un nome di campo per limitare la ricerca a quel campo, ad es. artist:Bode cerca nella raccolta tutti gli artisti che contengono la parola Bode.

Campi disponibili: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Scriverà le valutazioni e le statistiche nei tag dei brani della tua raccolta di brani.

Non è necessaria se l'opzione "Salva le valutazioni e le statistiche nei tag dei brani" è sempre stata attiva." #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Le variabili iniziano con %, ad esempio: %artist %album %title

\n\n

Se racchiudi sezioni di testo che contengono una variabile tra parentesi \ngraffe, queste sezioni saranno nascoste se la variabile non contiene alcun \nvalore.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "È richiesto un account Premium di Spotify" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Un client può connettersi solo se viene digitato il codice corretto." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Una scaletta veloce è un elenco dinamico di brani che deriva dalla tua raccolta. Ci sono diversi tipi di scaletta veloce che offrono modi diversi per selezionare un brano." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Un brano sarà incluso nella scaletta se verifica queste condizioni." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "128k AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "GLORIA ALL'IPNOROSPO" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Interrompi" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Informazioni su %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Informazioni su Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Informazioni su Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Assoluti" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Dettagli dell'account" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Dettagli dell'account (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Azione" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Azione" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Attiva/disattiva Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Flussi di attività" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Aggiungi podcast" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Aggiungi flusso" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Aggiungi una nuova riga se supportato dal tipo di notifica" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Aggiungi azione" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Aggiungi tutte le tracce da una cartella e da tutte le sue sottocartelle" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Aggiungi un altro flusso..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Aggiungi cartella..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Aggiungi file" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Aggiungi file al transcodificatore" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Aggiungi file al transcodificatore" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Aggiungi file..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Aggiungi file da transcodificare" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Aggiungi cartella" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Aggiungi cartella..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Aggiungi nuova cartella..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Aggiungi podcast" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Aggiungi podcast..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Aggiungi termine di ricerca" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Aggiungi il tag album al brano" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Aggiungi il tag albumartista al brano" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Aggiungi il tag artista al brano" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Aggiungi punteggio automatico del brano" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Aggiungi il tag compositore al brano" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Aggiungi il tag disco al brano" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Aggiungi il nome file del brano" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Aggiungi il tag genere al brano" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Aggiungi tag del gruppo del brano" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Aggiungi il tag durata al brano" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Aggiungi tag del musicista del brano" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Aggiungi il tag contatore di riproduzione al brano" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Aggiungi valutazione del brano" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Aggiungi contatore salti al brano" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Aggiungi il tag titolo al brano" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Aggiungi brano alla cache" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Aggiungi il tag traccia al brano" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Aggiungi il tag anno al brano" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Aggiungi i brani a \"La mia musica\" quando viene premuto il pulsante \"Mi piace\"" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Aggiungi flusso..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Aggiungi alla mia musica" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Aggiungi alle scalette di Spotify" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Aggiungi ai preferiti di Spotify" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Aggiungi a un'altra scaletta" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Aggiungi ai segnalibri" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Aggiungi alla scaletta" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Aggiungi alla coda" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Aggiungi utente/gruppo ai segnalibri" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Aggiungi azione wiimotedev" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Aggiungi..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Aggiunti questo mese" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Aggiunti questa settimana" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Aggiunti quest'anno" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Aggiunti oggi" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Aggiunti negli ultimi tre mesi" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Raggruppamento avanzato..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Dopo " #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Dopo la copia..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Album (volume ideale per tutte le tracce)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Artista dell'album" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Copertina dell'album" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Informazioni album su jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Album" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Album con copertina" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Album senza copertina" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Tutto" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Tutti i file (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "Gloria, gloria all'ipnorospo!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Tutti gli album" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Tutti gli artisti" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Tutti i file (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Tutte le scalette (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Tutti i traduttori" #: library/library.cpp:98 msgid "All tracks" msgstr "Tutte le tracce" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Permetti a un client di scaricare musica da questo computer." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Consenti gli scaricamenti" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Consenti codifica mid/side" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Insieme agli originali" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Nascondi sempre la finestra principale" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Mostra sempre la finestra principale" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Inizia sempre la riproduzione" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon Cloud Drive" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Un plugin aggiuntivo è richiesto per utilizzare Spotify in Clementine. Vuoi scaricarlo e installarlo subito?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Si è verificato un errore durante la il caricamento del database di iTunes" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Si è verificato un errore durante la scrittura dei metadati su '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Si è verificato un errore non specificato." #: ui/about.cpp:85 msgid "And:" msgstr "E:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Arrabbiato" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Aspetto" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Aggiungi file/URL alla scaletta" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Aggiungi alla scaletta attuale" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Aggiungi alla scaletta" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Applica la compressione per evitare il fruscio" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Sei sicuro di voler eliminare la preimpostazione \"%1\"?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Sei sicuro di voler azzerare le statistiche del brano?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Sei sicuro di voler scrivere le statistiche nei file dei brani della tua scaletta?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Artista" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Info artista" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Tag Artista" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Iniziale dell'artista" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Chiedi durante il salvataggio" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Formato audio" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Uscita audio" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Autenticazione non riuscita" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Autore" #: ui/about.cpp:68 msgid "Authors" msgstr "Autori" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Automatica" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Automatici" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Aggiornamento automatico" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Apri automaticamente categorie singole nell'albero della raccolta" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Disponibile" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Bitrate medio" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Dimensione immagine media" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "Podcast BBC" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Flussi sullo sfondo" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Colore di sfondo" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Immagine di sfondo" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Opacità dello sfondo" #: core/database.cpp:648 msgid "Backing up database" msgstr "Copia di sicurezza del database" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Bilanciamento" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "Vieta (scrobble di Last.fm)" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Analizzatore a barre" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Blu di base" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Tipo audio Base" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Comportamento" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Migliore" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Biografia da %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Bitrate" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Bitrate" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Bitrate" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Analizzatore a blocchi" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Tipo di blocco" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Sfocatura" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Corpo" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Analizzatore Boom" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Sfoglia..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Durata del buffer" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Riempimento buffer in corso" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Creazione indice Seafile..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Queste fonti sono disabilitate:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Pulsanti" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Supporto CUE sheet" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Percorso della cache:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Memorizzazione in cache" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "Memorizzazione in cache di %1" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Annulla" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Annulla lo scaricamento" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Il captcha è necessario.\nProva ad accedere a Vk.com con il browser, per risolvere il problema." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Cambia copertina" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Cambia dimensione dei caratteri..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Cambia la modalità di ripetizione" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Cambia la scorciatoia..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Cambia la modalità di mescolamento" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "Cambierà la traccia in riproduzione" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Cambia la lingua" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "I cambiamenti saranno applicati all'esecuzione della prossima canzone" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "La modifica dell'impostazione di riproduzione mono avrà effetto per i prossimi brani riprodotti" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Verifica la presenza di nuove puntate" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Controllo aggiornamenti" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Controlla aggiornamenti..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Scegli la cartella della cache di Vk.com" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Scegli un nome per la scaletta veloce" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Scegli automaticamente" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Scegli colore..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Scegli carattere..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Scegli dall'elenco" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Scegli l'ordinamento della scaletta e quanti brani conterrà." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Scegli la cartella di destinazione dei podcast" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Scegli i servizi Internet che vuoi mostrare." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Scegli i i siti web che Clementine utilizzerà durante la ricerca dei testi." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Classica" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Svuota" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Svuota" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Svuota la scaletta" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Errore di Clementine" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Arancione clementino" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Visualizzazioni di Clementine" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine può convertire automaticamente la musica che copi sul dispositivo in un formato riproducibile." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Clementine può riprodurre la musica che hai caricato su Amazon Cloud Drive" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine può riprodurre la musica che hai caricato su Box" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine può riprodurre la musica che hai caricato su Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine può riprodurre la musica che hai caricato su Google Drive" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine può riprodurre musica che hai caricato su OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine può mostrare un messaggio al cambiamento di traccia." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine può sincronizzare l'elenco delle tue sottoscrizioni con altri tuoi computer e applicazioni di gestione dei podcast. Crea un account." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine non può caricare alcuna visualizzazione projectM. Controlla che Clementine sia installato correttamente." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Visualizzatore immagini di Clementine" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine non ha trovato risultati per questo file" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine troverà la musica in:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Fai clic qui per aggiungere della musica" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Fai clic qui per aggiungere questa scaletta alle preferite in modo da salvarla e renderla accessibile dal pannello \"Scalette\" nella barra di sinistra" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Clic per passare dal tempo rimanente al tempo totale" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Un clic sul pulsante Accedi aprirà un browser web. Torna a Clementine dopo aver effettuato l'accesso." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Chiudi" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Chiudi la scaletta" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Chiudi la visualizzazione" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "La chiusura di questa finestra annullerà lo scaricamento." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "La chiusura di questa finestra fermerà la ricerca delle copertine." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Colori" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Elenco separato da virgole di classe:livello, livello è 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Commento" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Radio della comunità" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Completa automaticamente i tag" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Completa automaticamente i tag..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Compositore" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Configura %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Configura Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Configura scorciatoie" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Configura Spotify..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Configura Subsonic..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Configura Vk.com..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Configura la ricerca globale..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Configura raccolta..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Configura podcast..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Configura..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Connetti i Wii Remote utilizzando l'azione attiva/disattiva" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Connetti dispositivo" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Connessione a Spotify in corso" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Connessione rifiutata dal server, controlla l'URL del server. Esempio: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Connessione scaduta, controlla l'URL del server. Esempio: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Problemi di connessione o l'audio è disabilitato dal proprietario" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Console" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Bitrate costante" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Converti tutta la musica" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Converti qualsiasi musica che il dispositivo non può riprodurre" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Converti i file audio senza perdita di informazione prima di inviarli alla destinazione remota." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Converti i file senza perdita di informazione" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Copia l'URL di condivisione negli appunti" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Copia negli appunti" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Copia su dispositivo..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Copia nella raccolta..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Copyright" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Impossibile connettersi a Subsonic, controlla l'URL del server. Esempio: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Impossibile creare l'elemento «%1» di GStreamer - assicurati che tutti i plugin necessari siano installati" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Impossibile creare la scaletta" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Impossibile trovare un multiplatore per %1, verifica l'installazione del plugin GStreamer corretto" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Impossibile trovare un codificatore per %1, verifica l'installazione del plugin GStreamer corretto" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Impossibile aprire il file di uscita %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Gestore delle copertine" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Copertina da immagine integrata" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Copertina caricata automaticamente da %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Copertina rimossa manualmente" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Copertina non impostata" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Copertina impostata da %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Copertine da %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Dissolvenza incrociata al cambio automatico di traccia" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Dissolvenza incrociata al cambio manuale di traccia" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Maiusc+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Maiusc+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Maiusc+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Personalizzato" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Immagine personalizzata:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Impostazioni messaggio personalizzato" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Personalizzato..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "Percorso DBus" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dance" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Il database risulta danneggiato. Leggi https://code.google.com/p/clementine-player/wiki/DatabaseCorruption per le istruzioni su come ripristinare il database" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Data di modifica" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Data di creazione" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Giorni" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "Prede&finita" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Riduci il volume del 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Riduci il volume del percento" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Riduci il volume" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Immagine di sfondo predefinita" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Dispositivo predefinito su %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Valori predefiniti" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Ritardo tra le visualizzazioni" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Elimina" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Elimina i dati scaricati" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Elimina i file" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Elimina da dispositivo..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Elimina dal disco..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Elimina le puntate scaricate" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Elimina la preimpostazione" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Elimina la scaletta veloce" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Elimina i file originali" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Eliminazione dei file" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Rimuovi le tracce selezionate dalla coda" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Rimuovi tracce dalla coda" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Destinazione" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Dettagli..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Dispositivo" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Proprietà del dispositivo" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Nome del dispositivo" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Proprietà del dispositivo..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Dispositivi" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Finestra" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Forse cercavi" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Password di Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Nome utente di Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Connessione diretta a Internet" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Cartella" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Disabilita la durata" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Disabilita la creazione della barra dell'atmosfera" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Disabilitata" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Disabilitata" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Disco" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Trasmissione discontinua" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Opzioni di visualizzazione" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Visualizza l'on-screen-display" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Esegui una nuova scansione completa della raccolta" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Esegui una nuova scansione completa" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Esegui una nuova scansione completa..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Non convertire qualsiasi musica" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Non sovrascrivere" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "Con l'esecuzione di una nuova scansione completa si perderanno tutti i metadati salvati in Clementine, come copertine, numero di riproduzioni e valutazioni. Clementine analizzerà nuovamente tutta la tua musica in Google Drive e ciò potrebbe richiedere del tempo." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Non ripetere" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Non mostrare in artisti vari" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Non mostrare le puntate ascoltate" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Non mescolare" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Non fermare!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Donazione" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Doppio clic per aprire" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "Il doppio clic su un brano nella scaletta..." #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Al doppio clic su un brano..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Scarica %n puntate" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Cartella degli scaricamenti" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Scarica le puntate in " #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Scaricamento" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Scarica automaticamente le nuove puntate" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Scaricamento accodato" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Impostazioni di scaricamento" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Scarica l'applicazione per Android" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Scarica questo album" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Scarica questo album..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Scarica questa puntata" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Scarica..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Scaricamento in corso (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Scaricamento directory Icecast in corso" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Scaricamento catalogo Jamendo in corso" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Scaricamento catalogo Magnatune" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Scarica il plugin di Spotify" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Scaricamento metadati in corso" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Trascina per riposizionare" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dubstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Durata" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "La modalità dinamica è attiva" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Misto casuale dinamico" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Modifica la scaletta veloce..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Modifica tag \"%1\"..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Modifica tag..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Modifica i tag" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Modifica informazioni della traccia" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Modifica informazioni sulla traccia..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Modifica le informazioni sulle tracce..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Modifica..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "Email" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Abilita il supporto del Wii Remote" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Abilita la memorizzazione automatica in cache" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Abilita equalizzatore" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Abilita le scorciatoie solo quando Clementine è in primo piano" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Abilita la modifica in linea dei metadati di un brano con un clic" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Abilita le fonti seguenti per includerle nei risultati di ricerca. I risultati saranno visualizzati in questo ordine." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Abilita/Disabilita lo scrobble di Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Complessità della codifica" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Qualità del motore di codifica" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Modalità di codifica" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Inserisci un URL" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Inserisci un URL per scaricare una copertina da Internet:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Digita un nome file per le copertine esportate (nessuna estensione):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Inserisci un nuovo nome per questa scaletta" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Inserisci sopra i termini di ricerca per trovare musica sul tuo computer e su Internet" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Digita i termini di ricerca qui sotto per trovare podcast sull'iTunes Store" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Digita i termini di ricerca qui sotto per trovare podcast su gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Inserisci qui i termini di ricerca" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Inserisci l'URL di flusso radio in Internet:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Digita il nome della cartella" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Digita questo IP nell'applicazione per connetterti a Clementine." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Collezione completa" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Equalizzatore" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Equivalente a --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Equivalente a --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Errore" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Errore estrazione CD" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Errore in fase di collegamento del dispositivo MTP" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Errore durante la copia dei brani" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Errore durante l'eliminazione dei brani" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Errore di scaricamento del plugin di Spotify" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Errore durante il caricamento di %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Errore durante il caricamento della scaletta di.fm" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Errore durante l'elaborazione di %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Errore nel caricamento del CD audio" #: library/library.cpp:68 msgid "Ever played" msgstr "Mai riprodotte" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Ogni 10 minuti" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Ogni 12 ore" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Ogni 2 ore" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Ogni 20 minuti" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Ogni 30 minuti" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Ogni 6 ore" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Ogni ora" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Ad eccezione delle tracce dello stesso album o dello stesso CUE sheet" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Copertine esistenti" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Espandi" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Scade il %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Esporta copertine" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Esporta le copertine" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Esporta le copertine scaricate" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Esporta le copertine integrate" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Esporta completate" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Esportate %1 copertine di %2 (%3 saltate)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Dissolvenza in uscita in pausa / dissolvenza in entrata al ripristino" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Dissolvenza all'interruzione di una traccia" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Dissolvenza" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Durata della dissolvenza" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Lettura del CD non riuscita" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Recupero della cartella non riuscito" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Recupero del podcast non riuscito" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Caricamento del podcast non riuscito" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Analisi XML non riuscita per questa fonte RSS" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Veloce" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Tracce preferite" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Scarica copertine mancanti" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Scarica automaticamente" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Scaricamento completato" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Scaricamento della libreria di Subsonic" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Errore di scaricamento della copertina" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Formato file" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Estensione file" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Formati dei file" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Nome file" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Nome file (senza percorso)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Modello di nome del file:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Percorsi dei file" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Dimensione file" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Tipo file" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Nome file" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "File" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "File da transcodificare" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Trova i brani nella tua raccolta che corrispondono ai criteri specificati." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Trova questo artista" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Creazione impronta del brano" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Fine" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Primo livello" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Adatta la copertina alla larghezza" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Dimensione del carattere" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Per motivi di licenza, il supporto di Spotify è in un plugin separato." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Forza codifica mono" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Elimina dispositivo" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "L'eliminazione di un dispositivo lo rimuoverà da questo elenco e Clementine dovrà effettuare una nuova scansione di tutti i brani al successivo collegamento." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Modulo" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Formato" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Velocità fotogrammi" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Struttura per buffer" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Gelido" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Bassi al massimo" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Bassi e alti al massimo" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Alti al massimo" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Generale" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Impostazioni generali" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Genere" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Ottieni un URL per condividere questo brano di Spotify" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Ottieni un URL per condividere questa scaletta" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Recupero dei canali" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Recupero flussi" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Dagli un nome:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Vai" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Vai alla scheda della scaletta successiva" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Vai alla scheda della scaletta precedente" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Ottenute %1 copertine di %2 (%3 non riuscito)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Colora di grigio i brani della scaletta non esistenti" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Raggruppa raccolta per..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Raggruppa per" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Raggruppa per album" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Raggruppa per artista" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Raggruppa per artista/album" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Raggruppa per artista/anno - album" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Raggruppa per genere/album" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Raggruppa per genere/artista/album" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Gruppo" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "La pagina HTML non contiene alcuna fonte RSS" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "Ricevuto codice di stato HTTP 3xx senza URL, verifica la configurazione del server." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "Proxy HTTP" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Felice" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Informazioni hardware" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Le informazioni hardware sono disponibili solo quando il dispositivo è connesso." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Alto" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Alto (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Alta (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "HipHop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Host non trovato, controlla l'URL del server. Esempio: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Ore" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Ipnorospo" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Non ho un account Magnatune" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Icona" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Icone in alto" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Identificazione del brano in corso" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Se attivata, il clic su un brano selezionato nella vista della scaletta ti consentirà di modificare direttamente il valore di un tag" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Se continui, il dispositivo funzionerà lentamente e i brani copiati su di esso potrebbero non essere riproducibili." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Se conosci l'URL di un podcast, digitalo qui sotto e premi Vai." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Ignora \"The\" nei nomi degli artisti" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Immagini (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Immagini (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Importa..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "Tra %1 giorni" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "Tra %1 settimane" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "Nella modalità dinamica le nuove tracce saranno scelte e aggiunte alla scaletta al termine di ogni brano." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "In arrivo" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Includi copertina nella notifica" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Includi tutti i brani" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Versione del protocollo REST di Subsonic incompatibile. Aggiornare il client." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Versione del protocollo REST di Subsonic incompatibile. Aggiornare il server." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Configurazione incompleta, assicurati che tutti i campi siano popolati." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Aumenta il volume del 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Aumenta il volume del percento" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Aumenta il volume" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Indicizzazione di %1 in corso..." #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Informazioni" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Opzioni di ingresso" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Inserisci..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Installati" #: core/database.cpp:585 msgid "Integrity check" msgstr "Controllo d'integrità" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Fornitori Internet" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Servizi internet" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "Tracce di introduzione" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Chiave API non valida" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Formato non valido" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Metodo non valido" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Parametri non validi" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Risorsa specificata non valida" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Servizio non valido" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Chiave di sessione non valida" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Inverti la selezione" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Tracce più ascoltate di Jamendo" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Tracce preferite di Jamendo" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Tracce preferite del mese di Jamendo" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Tracce preferite della settimana di Jamendo" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Database di Jamendo" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Salta subito al brano precedente" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Salta alla traccia in riproduzione" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Trattieni i pulsanti per %1 secondo..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Trattieni i pulsanti per %1 secondi..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Mantieni l'esecuzione sullo sfondo quando la finestra è chiusa" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Mantieni i file originali" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Gattini" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Lingua" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Portatile/Cuffie" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Sala grande" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Copertina grande" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Copertina grande dell'album (sotto i dettagli)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Copertina grande dell'album (senza dettagli)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Pannello laterale grande" #: library/library.cpp:80 msgid "Last played" msgstr "Ultima riproduzione" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Ultima riproduzione" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Al momento Last.fm non è disponibile, prova ancora tra qualche minuto" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Password di Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Contatore riproduzioni di Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Etichette di Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Nome utente di Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Wiki di Last.fm" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Tracce meno apprezzate" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Sinistra" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Durata" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Raccolta" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Raggruppamento avanzato della raccolta" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Notifica nuova scansione della raccolta" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Cerca nella raccolta" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Limiti" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Carica" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Carica copertina da URL" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Carica copertina da URL..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Carica copertina dal disco" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Carica copertina da disco..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Carica la scaletta" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Carica la scaletta..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Caricamento del dispositivo MTP" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Caricamento database dell'iPod" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Caricamento scaletta veloce" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Caricamento brani in corso" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Caricamento flusso" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Caricamento delle tracce" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Caricamento informazioni della traccia" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Caricamento in corso..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Carica file/URL, sostituendo la scaletta attuale" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Accedi" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Accesso non riuscito" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Disconnetti" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Profilo con predizione di lungo termine (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Mi piace" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "Mi piace (scrobble di Last.fm)" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Basso (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Bassa (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Profilo a bassa complessità (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Testi" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Testi da %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Testi dal tag ID3v2" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Scaricamento di Magnatune" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Scaricamento di Magnatune completato" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Profilo principale (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Procedi" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Procedi" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Rendi la scaletta disponibile non in linea" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Risposta non corretta" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Configurazione manuale del proxy" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Manualmente" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Produttore" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Marca come ascoltata" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Marca come nuova" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Verifica ogni termine di ricerca (AND)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Verifica uno o più termini di ricerca (OR)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Numero massimo di risultati della ricerca globale" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Bitrate massimo" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Il media è cambiato. Aggiornamento in corso" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Medio (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Media (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Tipo d'iscrizione" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Bitrate minimo" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Valore minimo buffer" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Preimpostazioni projectM mancanti" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Modello" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Controlla i cambiamenti alla raccolta" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Riproduzione mono" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Mesi" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Atmosfera" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Stile della barra dell'atmosfera" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Barre dell'atmosfera" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Altro" #: library/library.cpp:84 msgid "Most played" msgstr "Più riprodotti" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Punto di mount" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Punti di mount" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Sposta in basso" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Sposta nella raccolta..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Sposta in alto" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Musica" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Raccolta musicale" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Silenzia" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "I miei album" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "La mia musica" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "I miei consigli" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Nome" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Nome" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Opzioni di assegnazione dei nomi" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Banda stretta (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Proxy di rete" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Telecomando di rete" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Mai" #: library/library.cpp:74 msgid "Never played" msgstr "Mai riprodotte" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Non iniziare mai la riproduzione" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Nuova cartella" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Nuova scaletta" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Nuova scaletta veloce..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Nuovi brani" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Le nuove tracce saranno aggiunte automaticamente." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Tracce più recenti" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Successivo" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Traccia successiva" #: core/utilities.cpp:151 msgid "Next week" msgstr "Settimana prossima" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Nessun analizzatore" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Nessuna immagine di sfondo" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Nessuna copertina da esportare." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Nessun blocco lungo" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Nessuna corrispondenza trovata. Svuota il campo di ricerca per mostrare nuovamente la scaletta completa." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Nessun blocco corto" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Nessuna" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Nessuna delle canzoni selezionate era adatta alla copia su un dispositivo" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Normale" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Tipo di blocco normale" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Non disponibile mentre si utilizza una scaletta dinamica" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Non connesso" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Contenuti non sufficienti" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Non ci sono abbastanza ammiratori" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Membri non sufficienti" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Vicini non sufficienti" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Non installati" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Accesso non effettuato" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Non montato - doppio clic per montare" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Nessun risultato" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Tipo di notifica" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Notifiche" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "In riproduzione" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Numero di puntate da mostrare" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Anteprima OSD" #: widgets/osd.cpp:173 msgid "Off" msgstr "Spento" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "Acceso" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Accetta connessioni da client all'interno degli intervalli di IP: 10.x.x.x 172.16.0.0 - 172.31.255.255 192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Consenti solo connessioni dalla rete locale" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Mostra solo la prima" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Opacità" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Apri %1 nel browser" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Apri CD &audio..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Apri file OPML" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Apri file OPML..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Apri una cartella da cui importare la musica" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Apri dispositivo" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Apri file..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Apri in Google Drive" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Apri in nuova scaletta" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Apri in una nuova scaletta" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Apri nel browser" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Apri..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Operazione non riuscita" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Ottimizza per bitrate" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Ottimizza per qualità" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Opzioni..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Organizza file" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Organizza file..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Organizzazione file" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Tag originali" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "Anno originale" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "Anno originale - Album" #: library/library.cpp:118 msgid "Original year tag support" msgstr "Supporto tag Anno originale" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Altre opzioni" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Uscita" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Dispositivo di uscita" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Opzioni di uscita" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Sovrascrivi tutte" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Sovrascrivi i file esistenti" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Sovrascrivi solo le più piccole" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Proprietario" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Analisi del catalogo di Jamendo" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Festa" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Password" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Pausa" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Sospendi riproduzione" #: widgets/osd.cpp:156 msgid "Paused" msgstr "In pausa" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Musicista" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Pixel" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Barra laterale semplice" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Riproduci" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Contatore di riproduzione" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Riproduci se fermata, sospendi se in riproduzione" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Riproduci se non c'è altro in riproduzione" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Riproduci la traccia numero della scaletta" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Riproduci/Pausa" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Riproduzione" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Opzioni del lettore" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Scaletta" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Scaletta terminata" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Opzioni della scaletta" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Tipo di scaletta" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Scalette" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Chiudi il browser e ritorna a Clementine." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Stato del plugin:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcast" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Durata del fumetto" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Porta" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Preamplificazione" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Preferenza" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Preferenze" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Preferenze..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Nomi dei file di copertina preferiti (separati da virgola)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Formato audio preferito" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Bitrate preferito" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Formato preferito" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Tipo di audio Premium" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Preimpostazione:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Premi una combinazione da utilizzare per" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Premi un tasto" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Premi una combinazione di tasto da utilizzare per %1..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "La pressione di \"Precedente\" nel lettore..." #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Opzioni OSD gradevole" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Anteprima" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Precedente" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Traccia precedente" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Mostra le informazioni di versione" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Profilo" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Avanzamento" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Avanzamento" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psichedelica" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Premi pulsante del Wiiremote" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Metti i brani in ordine casuale" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Qualità" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Qualità" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Interrogazione dispositivo..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Gestore della coda" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Accoda le tracce selezionate" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Accoda la traccia" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (volume uguale per tutte le tracce)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Pioggia" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Pioggia" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Visualizzazione casuale" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Valuta il brano corrente con 0 stelle" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Valuta il brano corrente con 1 stella" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Valuta il brano corrente con 2 stelle" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Valuta il brano corrente con 3 stelle" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Valuta il brano corrente con 4 stelle" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Valuta il brano corrente con 5 stelle" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Valutazione" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Vuoi davvero annullare?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Limite di redirezioni superato, verifica la configurazione del server." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Aggiorna catalogo" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Aggiorna i canali" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Aggiorna l'elenco delle stazioni" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Aggiorna i flussi" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Relativi" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Ricorda il movimento del Wii remote" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Ricorda l'ultima sessione" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Ricorda la mia scelta" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Rimuovi" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Rimuovi azione" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Rimuovi duplicati dalla scaletta" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Rimuovi cartella" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Rimuovi dalla mia musica" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Rimuovi dai segnalibri" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Rimuovi dalla scaletta" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Rimuovi la scaletta" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Rimuovi scalette" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Rimuovi tracce non disponibili dalla scaletta" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Rinomina la scaletta" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Rinomina la scaletta..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Ricorda l'ordine delle tracce..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Ripeti" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Ripeti album" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Ripeti scaletta" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Ripeti traccia" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Sostituisci la scaletta attuale" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Sostituisci la scaletta" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Sostituisci gli spazi con trattini bassi" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Guadagno di riproduzione" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Modalità guadagno di riproduzione" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Ripopolamento" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Richiedi il codice di autenticazione" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Azzera" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Azzera i contatori" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Riavvia il brano, poi salta alla precedente se premuto ancora" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Riavvia la traccia, o riproduci la traccia precedente se entro 8 secondi dall'avvio." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Limita ai caratteri ASCII" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Riprendi la riproduzione all'avvio" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Torna a Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Destra" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Estrai" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Estrai CD" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Estrai CD audio" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Esegui" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "Proxy SOCKS" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Errore di handshake SSL, verifica la configurazione del server. L'opzione SSLv3 seguente potrebbe risolvere alcuni problemi." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Rimuovi il dispositivo in sicurezza" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Rimuovi il dispositivo in sicurezza al termine della copia" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Campionamento" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Campionamento" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Salva i file .mood nella raccolta" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Salva la copertina dell'album" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Salva la copertina su disco..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Salva l'immagine" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Salva la scaletta" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Salva la scaletta" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Salva la scaletta..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Salva la preimpostazione" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Salva le valutazioni nei tag dei file quando è possibile" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Salva le statistiche nei tag dei file quando è possibile" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Salva questo flusso nella scheda Internet" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Salvare le statistiche dei brani nei file" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Salvataggio tracce in corso" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Profilo con campionamento scalabile (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Riscala le dimensioni" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Punteggio" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Scrobbling delle tracce ascoltate" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Cerca" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Cerca" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Cerca le stazioni Icecast" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Cerca in Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Cerca in Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Cerca su Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Cerca automaticamente" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Cerca copertine degli album..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Cerca qualsiasi cosa" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Cerca in gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Cerca in iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Modalità di ricerca" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Opzioni di ricerca" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Cerca risultati" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Termini di ricerca" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Secondo livello" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Scorri indietro" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Scorri in avanti" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Sposta la traccia in riproduzione di una quantità relativa" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Sposta la traccia in riproduzione su una posizione assoluta" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "Posizionamento utilizzando una scorciatoia da tastiera" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Seleziona tutto" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Selezione nulla" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Seleziona il colore di sfondo:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Seleziona l'immagine di sfondo" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Seleziona le migliori corrispondenze possibili" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Seleziona il colore di primo piano:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Seleziona visualizzazioni" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Seleziona visualizzazioni..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Seleziona..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Numero seriale" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Server" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "URL del server" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Dettagli del server" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Servizio non in linea" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Imposta %1 a \"%2\"..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Imposta il volume al percento" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Imposta valore per tutte le tracce selezionate..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Impostazioni" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Scorciatoia" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Scorciatoia per %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "La scorciatoia per %1 esiste già" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Mostra" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Mostra OSD" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Mostra un'animazione luminosa sulla traccia corrente" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Mostra una barra dell'atmosfera nella barra di avanzamento della traccia" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Mostra una notifica nativa del desktop" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Mostra una notifica quando cambio la modalità di ripetizione/mescolamento" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Mostra una notifica quando regolo il volume" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Mostra una notifica quando sospendo la riproduzione " #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Mostra un fumetto dal vassoio di sistema" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Mostra un OSD gradevole" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Mostra la barra di stato superiore" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Mostra tutti i brani" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Mostra tutti i brani" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Mostra le copertine nella raccolta" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Mostra separatori" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Mostra a dimensioni originali..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Mostra i gruppo nei risultati della ricerca globale" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Mostra nel navigatore file..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Mostra nella raccolta..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Mostra in artisti vari" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Mostra la barra dell'atmosfera" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Mostra solo i duplicati" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Mostra solo i brani senza tag" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Mostra il brano in riproduzione nella tua pagina" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Mostra i suggerimenti di ricerca" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Mostra il pulsante \"Mi piace\"" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Mostra il pulsante di scrobble nella finestra principale" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Mostra icona nel vassoio" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Mostra le fonti abilitate e disabilitate" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Mostra/Nascondi" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Mescola" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Mescola gli album" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Mescola tutto" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Mescola la scaletta" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Mescola le tracce di questo album" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Registrati" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Disconnetti" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Registrazione in corso..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Artisti simili" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Dimensioni" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Dimensioni:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Salta indietro nella scaletta" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Salta il conteggio" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Salta in avanti nella scaletta" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Salta le tracce selezionate" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Salta la traccia" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Copertine piccole" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Pannello laterale piccolo" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Scaletta veloce" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Scalette veloci" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Leggere" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Rock leggero" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Informazioni brano" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Info brano" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogramma" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Spiacente" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Ordina per genere (alfabetico)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Ordina per genere (popolarità)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Ordina per nome della stazione" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Ordina i brani per" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Ordinamento" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Fonte" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Fonti" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Errore di accesso a Spotify" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "URL della scaletta di Spotify" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Plugin di Spotify" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Plugin di Spotify non installato" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "URL del brano di Spotify" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Standard" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Preferiti" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Avvia l'estrazione" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Avvia la scaletta attualmente in riproduzione" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Avvia transcodifica" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Inizia a scrivere qualcosa nella casella di ricerca per riempire l'elenco dei risultati di ricerca." #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Avvio di %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Avvio in corso..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Ferma" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Ferma dopo" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Ferma dopo ogni traccia" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Ferma dopo tutte le tracce" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Ferma dopo questa traccia" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Ferma riproduzione" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Ferma la riproduzione dopo la traccia corrente" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Ferma la riproduzione dopo la traccia: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Fermato" #: core/song.cpp:431 msgid "Stream" msgstr "Flusso" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "La trasmissione da un server Subsonic richiede una licenza server valida dopo il periodo di prova di 30 giorni." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Trasmissione" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Sottoscrittori" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Successo!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "%1 scritto correttamente" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Tag consigliati" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Riepilogo" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Molto alto (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Molto alta (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Formati supportati" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Sincronizza le statistiche nei file ora" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Sincronizzazione inbox di Spotify" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Sincronizzazione scaletta di Spotify" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Sincronizzazione tracce preferite di Spotify" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Colori di sistema" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Schede in alto" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Strumento di recupero dei tag" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Bitrate finale" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Opzioni testo" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Grazie a" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Il comando \"%1\" non può essere avviato." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "La copertina dell'album del brano in riproduzione" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "La cartella %1 non è valida" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "Il secondo valore deve essere più grande del primo!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Il sito richiesto non esiste!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Il sito richiesto non è un'immagine!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Il periodo di prova per il server Subsonic è scaduto. Effettua una donazione per ottenere una chiave di licenza. Visita subsonic.org per i dettagli." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "La versione di Clementine appena aggiornata richiedere una scansione completa della raccolta, a causa delle nuove funzionalità elencate in seguito:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Ci sono altri brani in questo album" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Si è verificato un problema durante la comunicazione con gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Si è verificato un problema durante il recupero dei dati aggiuntivi da Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Si è verificato un problema di elaborazione della risposta dall'iTunes Store" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Si sono verificati dei problemi durante la copia di alcuni brani. I seguenti file potrebbero non essere copiati:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Si sono verificati dei problemi durante l'eliminazione di alcuni brani. I seguenti file potrebbero non essere eliminati:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Questi file saranno eliminati dal dispositivo, sei sicuro di voler continuare?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Questi file saranno eliminati definitivamente dal disco, sei sicuro di voler continuare?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Queste cartelle saranno analizzate alla ricerca di musica per creare la tua raccolta" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Queste impostazioni sono utilizzate nella finestra \"Transcodifica musica\", e quando è necessario convertire musica prima di copiarla su un dispositivo." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Terzo livello" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Questa azione creerà un database che potrebbe arrivare fino a 150 MB.\nVuoi continuare comunque?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "L'album non è disponibile nel formato richiesto" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Può essere cambiata successivamente tramite le preferenze" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Il dispositivo deve essere collegato e aperto prima che Clementine possa rilevare i formati supportati." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Questo dispositivo utilizza i seguenti formati file:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Il dispositivo non funzionerà correttamente" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Questo è un dispositivo MTP, ma hai compilato Clementine senza il supporto a libmtp." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Questo è un iPod, ma hai compilato Clementine senza il supporto a libgpod." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "È la prima volta che si connette questo dispositivo. Clementine effettuerà una scansione del dispositivo alla ricerca di file musicali - l'operazione potrebbe richiedere del tempo." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Questa opzione può essere modificata nelle preferenze di \"Comportamento\"" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Questo flusso è riservato ai soli abbonati" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Questi tipo di dispositivo non è supportato: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "Intervallo di tempo" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Titolo" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Oggi" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Commuta Pretty OSD" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Attiva la modalità a schermo intero" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Cambia lo stato della coda" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Commuta lo scrobbling" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Commuta la visibilità di Pretty OSD" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Domani" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Troppe redirezioni" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Tracce preferite" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Album totali:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Totale byte trasferiti" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Totale richieste di rete effettuate" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Traccia" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Tracce" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Transcodifica musica" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Log di transcodifica" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Transcodifica" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Transcodifica di %1 file utilizzando %2 thread" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Opzioni di transcodifica" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbina" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Spegni" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Banda ultra larga (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Impossibile connettersi" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Impossibile scaricare %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Sconosciuto" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Tipo di contenuto sconosciuto" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Errore sconosciuto" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Rimuovi copertina" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Ripristina le tracce selezionate" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Ripristina la traccia" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Rimuovi sottoscrizione" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Prossimi concerti" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Aggiorna" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Aggiorna tutti i podcast" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Aggiorna le cartelle modificate della raccolta" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Aggiorna la raccolta all'avvio di Clementine" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Aggiorna questo podcast" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Aggiornamento in corso" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Aggiornamento di %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Aggiornamento %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Aggiornamento raccolta" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Utilizzo" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Usa il tag Artista dell'album se disponibile" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Utilizza le scorciatoie di Gnome" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Usa colori psichedelici" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Utilizza i metadati del guadagno di riproduzione se disponibili" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Utilizza SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Utilizza Wii Remote" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Usa un insieme di colori personalizzato" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Usa un messaggio personalizzato per le notifiche" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Usa un telecomando in rete" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Usa autenticazione" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Usa il motore di gestione del bitrate" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Usa la modalità dinamica" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Utilizza le notifiche per segnalare lo stato del Wii Remote" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Usa modellazione temporale del rumore" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Usa i valori predefiniti di sistema" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Usa i colori predefiniti di sistema" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Utilizza le impostazioni di sistema del proxy" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Usa la normalizzazione del volume" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Utilizzato" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Interfaccia utente" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Nome utente" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "L'utilizzo del menu per aggiungere un brano..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "MP3 VBR" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Bitrate variabile" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Artisti vari" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Versione %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Visualizza" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Modalità di visualizzazione" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Visualizzazioni" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Impostazioni di visualizzazione" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Rilevazione attività vocale" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Volume %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Muro" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Avvisami alla chiusura di una scheda della scaletta" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Sito web" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Settimane" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "All'avvio di Clementine" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Quando cercherà la copertina di un album, Clementine analizzerà prima le immagini che contengono di una queste parole nel nome del file.\nSe non ci saranno corrispondenze, utilizzerà l'immagine più grande che si trova nella cartella." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "Quando salvi una scaletta, i percorsi dei file dovrebbero essere" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Quando l'elenco è vuoto..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Perché non provi..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Banda larga (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: attivato" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: connesso" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: livello batteria critico (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: disattivato" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: disconnesso" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: livello batteria basso (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Senza copertina:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Vuoi spostare anche gli altri brani di questo album in Artisti vari?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Vuoi eseguire subito una nuova scansione completa?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Scrivi le statistiche dei brani nei file" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Scrivi i metadati" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Nome utente o password non validi." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Anno" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Anno - Album" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Anni" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Ieri" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Stai per scaricare i seguenti album" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Stai per rimuovere %1 scalette dai preferiti, sei sicuro?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Stai per rimuovere una scaletta che non fa parte delle tue scalette preferite: la scaletta sarà eliminata (questa azione non può essere annullata).\nSei sicuro di voler continuare?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Non sei registrato." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Sei registrato come %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Sei registrato." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Puoi modificare l'organizzazione dei brani nella raccolta." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Puoi ascoltare gratuitamente senza un account, ma i membri Premium possono ascoltare i flussi di alta qualità senza pubblicità." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Puoi ascoltare i brani di Magnatune gratuitamente e senza avere un account. Il versamento della quota d'iscrizione rimuove i messaggi alla fine di ogni traccia." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Puoi ascoltare sullo sfondo i flussi mentre ascolti altra musica" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Puoi utilizzare un Wii Remote come telecomando per Clementine. Vedi la pagina sul wiki di Clementine per ulteriori informazioni.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Non hai un account Premium Spotify." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Non hai una sottoscrizione attiva" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "Non è necessario effettuare l'accesso per cercare e ascoltare musica su SoundCloud. Tuttavia, bisogna autenticarsi per accedere alle scalette e al flusso." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Ti sei disconnesso da Spotify, reinserisci la password nella finestra Impostazioni." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Ti sei disconnesso da Spotify, reinserisci la password." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Ti piace questa traccia" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "Devi eseguire le preferenze di sistema e consentire a Clementine di \"controllare il tuo computer\" per utilizzare le scorciatoie globali in Clementine." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Dovrai riavviare Clementine se cambi la lingua." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Il tuo indirizzo IP:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Le credenziali Last.fm non sono corrette" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Le credenziali fornite per Magnatune non erano corrette" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "La raccolta è vuota!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "I tuoi flussi radio" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "I tuoi scrobble: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Supporto OpenGL mancante sul sistema, le visualizzazioni non sono disponibili." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Nome utente o password non corretta." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "aggiungi %n brani" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "dopo il" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "fa" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "e" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "automatica" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "prima del" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "compreso tra" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "prima i più grandi" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "contiene" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "disabilitata" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "disco %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "non contiene" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "finisce con" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "uguale a" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "gpodder.net directory" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "maggiore di" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "Gli iPod e i dispositivi USB non funzionano attualmente su Windows. Ci spiace." #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "negli ultimi" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "minore di" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "prima i più lunghi" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "sposta %n brani" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "prima i più recenti" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "diverso" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "non negli ultimi" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "non in" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "prima i più datati" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "il" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "opzioni" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "o la scansione del codice QR!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "premi invio" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "rimuovi %n brani" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "prima i più corti" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "mescola i brani" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "prima i più piccoli" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "ordina i brani" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "comincia con" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "ferma" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "traccia %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/ja.po000066400000000000000000005322241260417502300236410ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # davidsansome , 2010 # monorod , 2014 # Masaki , 2013 # Masaki , 2011-2012 # PowerGeefo, 2014 # SATOH Fumiyasu, 2014 # 0bytetest_green , 2014-2015 # Yoshihito YOSHINO , 2012-2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Japanese (http://www.transifex.com/davidsansome/clementine/language/ja/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ja\n" "Plural-Forms: nplurals=1; plural=0;\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nプレイリスト名の横にある星アイコンをクリックするとプレイリストをお気に入りにできます。\n\nお気に入りにしたプレイリストはここに保存されます" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " 日" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ミリ秒" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " 秒" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " 曲" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 曲)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 枚のアルバム" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 日" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 日前" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 プレイリスト (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 個選択中" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 曲" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 曲" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 曲見つかりました" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 曲見つかりました (%2 曲を表示中)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 トラック" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 転送済み" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wii リモコンデバイスモジュール" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 人のリスナー" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "合計 %L1 回再生" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n 曲失敗しました" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n が完了しました" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n 曲残っています" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "テキストの配置(&A)" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "中央揃え(&C)" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "カスタム(&C)" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "おまけ(&E)" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "ヘルプ(&H)" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "%1 を非表示にする(&H)" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "非表示にする(&H)..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "左揃え(&L)" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "ミュージック(&M)" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "なし(&N)" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "プレイリスト(&P)" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "終了(&Q)" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "リピートモード(&R)" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "右揃え(&R)" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "シャッフルモード(&S)" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "列の幅をウィンドウに合わせる(&S)" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "ツール(&T)" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(複数の曲で一致しません)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "... そして Amarok に貢献したすべての方々" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 日" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 トラック" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192,000Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44,100Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48,000Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "ランダムな 50 トラック" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96,000Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "今すぐプレミアム版へアップグレードする" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

チェックなしの場合, Clementine はあなたの評価や統計情報を独立したデータベースだけに保存し、ファイルは変更しません。

チェックありの場合は、変更があるたびにデータベースとファイルの両方に保存します。

標準の方式がないため、すべての形式で動作するわけではありません。ほかのプレイヤーは読み込めない可能性があります。

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

トークンは % で始まります (例: %artist %album %title)。

\n\n

トークンを含むテキストの一部を「{ }」で囲むと、トークンが空の場合、{ } で選択した部分が非表示になります。

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Spotify のプレミアムアカウントが必要です。" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "正しいコードを入力したクライアントだけ接続できます。" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "スマートプレイリストは、ライブラリから一定の条件に従って抽出されるプレイリストです。さまざまな選曲方法を提供する様々なスマートプレイリストがあります。" #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "条件に一致する曲がプレイリストに含まれます。" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ALL GLORY TO THE HYPNOTOAD" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "中止" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "%1 について" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Clementine について..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Qt について..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "絶対的" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "アカウントの詳細" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "アカウントの詳細 (プレミアム版)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "アクション" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "アクション" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Wii リモコンのアクティブ・非アクティブを切り替える" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "ポッドキャストの追加" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "ストリームを追加" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "改行を追加 (通知形式が対応している場合)" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "アクションの追加" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "別のストリームを追加..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "ディレクトリを追加..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "ファイルを追加" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "ファイルをトランスコーダーに追加する" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "ファイルをトランスコーダーに追加する" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "ファイルを追加..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "変換するファイルを追加" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "フォルダーを追加" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "フォルダーを追加..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "新しいフォルダーを追加..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "ポッドキャストを追加" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "ポッドキャストを追加..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "検索条件を追加" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "曲にアルバムタグを追加" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "曲にアルバムアーティストタグを追加" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "曲にアーティストタグを追加" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "曲に作曲者タグを追加" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "曲にディスクタグを追加" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "曲のファイル名を追加" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "曲にジャンルタグを追加" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "曲の分類タグを追加する" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "曲に曲の長さのタグを追加" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "曲の出演者タグを追加する" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "曲の再生回数を追加" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "曲の評価を追加する" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "曲のスキップ回数を追加" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "曲のタイトルタグを追加" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "曲をキャッシュに追加する" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "曲のトラックタグを追加" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "曲の年タグを追加" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "「Love」ボタンをクリックしたときに「マイミュージック」に曲を追加する" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "ストリームを追加..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "マイミュージックに追加する" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Spotify のプレイリストに追加する" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "別のプレイリストに追加する" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "ブックマークに追加する" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "プレイリストに追加する" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "キューに追加する" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "ユーザー/グループをブックマークに追加する" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Wii リモコンデバイスのアクションの追加" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "追加..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "今月追加されたもの" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "今週追加されたもの" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "今年追加されたもの" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "今日追加されたもの" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "3 ヶ月以内に追加されたもの" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "高度なグループ化..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "後" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "コピー後..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "アルバム" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "アルバム (すべてのトラックで最適な音量)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "アルバムアーティスト" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "アルバムカバー" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "jamendo.com のアルバム情報..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "アルバム" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "カバー付きのアルバム" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "カバーなしのアルバム数" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "すべてのファイル (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "すべてのアルバム" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "すべてのアーティスト" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "すべてのファイル (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "すべてのプレイリスト (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "すべての翻訳者" #: library/library.cpp:98 msgid "All tracks" msgstr "すべてのトラック" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "クライアントがこのコンピューターから曲をダウンロードするのを許可する" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "ダウンロードを許可する" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "M/S エンコードを許可" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "元と同じ" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "メインウィンドウを常に隠す" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "メインウィンドウを常に表示する" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "常に再生を開始する" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Clementine で Spotify を利用するには追加のプラグインが必要です。今すぐダウンロードしてインストールしますか?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "iTunes のデータベースを読み込み中にエラーが発生しました" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "メタデータを '%1' へ書き込み中にエラーが発生しました" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "原因不明のエラーが発生しました。" #: ui/about.cpp:85 msgid "And:" msgstr "そして:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "怒り" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "外観" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "ファイル・URL をプレイリストに追加する" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "現在のプレイリストに追加する" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "プレイリストに追加する" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "クリップ防止のために音量を制限する" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "プリセット「%1」を削除してもよろしいですか?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "この曲の統計をリセットしてもよろしいですか?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "ライブラリーのすべての曲の統計情報を曲ファイルに保存してもよろしいですか?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "アーティスト" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "アーティストの情報" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "アーティストタグ" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "アーティストの頭文字" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "保存時に尋ねる" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "オーディオ形式" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "オーディオ出力" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "認証に失敗しました" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "作者" #: ui/about.cpp:68 msgid "Authors" msgstr "作者" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "自動" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "自動" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "自動更新中" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "下位カテゴリが 1 つしかないときは、ライブラリツリーを自動で開く" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "空き" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "平均ビットレート" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "平均画像サイズ" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "BBC ポッドキャスト" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "バックグラウンドストリーム" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "背景色" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "背景画像" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "背景の不透明度" #: core/database.cpp:648 msgid "Backing up database" msgstr "データベースをバックアップ中" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "バランス" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "バー表示" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "標準のブルー" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "基本のオーディオの種類" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "動作" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "良" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "%1 からのバイオグラフィ" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "ビットレート" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "ビットレート" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "ビットレート" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "ブロック表示" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "ブロックタイプ" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "ぼかし量" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "本文" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "ブームアナライザー" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "参照..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "バッファーの長さ" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "バッファ中" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "ただし次のソースは無効になっています:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "ボタン" #: core/song.cpp:428 msgid "CDDA" msgstr "オーディオ CD" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "CUE シートのサポート" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "キャッシュのパス:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "キャッシュ中" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "%1 キャッシュ中" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "キャンセル" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Captcha (キャプチャ) が必要です。\nブラウザーで Vk.com にログインして問題を修正してください。" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "カバーアートの変更" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "フォントサイズの変更..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "リピートモードの変更" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "ショートカットの変更..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "シャッフルモードの変更" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "言語の変更" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "モノラル再生の設定変更は次に再生する曲から反映されます" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "新しいエピソードのチェック" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "更新の確認" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "更新のチェック..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Vk.com のキャッシュディレクトリーを選択する" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "スマートプレイリストの名前を選択してください" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "自動的に選択する" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "色の選択..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "フォントの選択..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "一覧から選択する" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "プレイリストの並び順と、プレイリスト内に何曲含めるかを選択してください。" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "ポッドキャストのダウンロードディレクトリを選択してください" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "歌詞の検索時に Clementine が使用する Web サイトを選択してください。" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "クラシック" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "整理" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "クリア" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "プレイリストをクリア" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Clementine のエラー" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Clementine オレンジ" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Clementine ビジュアライゼーション" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine はこのデバイスへコピーする際、このデバイスで再生可能な形式に自動で変換できます。" #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine は Box にアップロードしたミュージックを再生できます" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine は Dropbox にアップロードしたミュージックを再生できます" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine は Google Drive にアップロードしたミュージックを再生できます" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine は OneDrive にアップロードしたミュージックを再生できます" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine はトラックの変更時にメッセージを表示できます。" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine は購読リストを他のコンピューターやポッドキャストアプリケーションと同期できます。 アカウントを作成する" #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine は projectM のビジュアライゼーションを読み込めませんでした。Clementine が正しくインストールされているか確認してください。" #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Clementine 画像ビューアー" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "このファイルの検索結果を見つけられませんでした。" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine は次にあるミュージックを検索します:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "ミュージックを追加するにはここをクリックします" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "プレイリストをお気に入りにするにはクリックしてください。サイドバーの「プレイリスト」パネルからアクセスできるようになります。" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "ここをクリックすると、残り時間と合計時間の表示を切り替えます" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "ログインボタンをクリックするとウェブブラウザーが開きます。ログインした後に Clementine に戻る必要があります。" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "閉じる" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "プレイリストを閉じる" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "ビジュアライゼーションを閉じる" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "このウィンドウを閉じるとダウンロードをキャンセルします。" #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "このウィンドウを閉じるとアルバムカバーの検索を中止します。" #: ui/equalizer.cpp:114 msgid "Club" msgstr "クラブ" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "色" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "コンマ区切りの クラス:レベル のリスト、レベルは 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "コメント" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "コミュニティラジオ" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "タグの自動補完" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "タグを自動補完..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "作曲者" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "%1 の設定..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Magnatune の設定..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "ショートカットの設定" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Spotify の設定..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Subsonic を設定..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "VK.com の設定..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "全体検索の設定..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "ライブラリの設定..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "ポッドキャストの設定..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "設定..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "アクティブ・非アクティブの切り替えアクションを使用して Wii リモコンを接続する" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "デバイスの接続" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Spotify に接続中" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "接続がサーバーに拒否されました。サーバーの URL を確認してください。例: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "接続がタイムアウトしました。サーバーの URL を確認してください。例: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "接続の問題またはオーディオが所有者により無効化されています" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "コンソール" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "固定ビットレート" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "すべての曲を変換する" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "デバイスが再生できないすべての曲を変換する" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "URL をクリップボードにコピーする" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "クリップボードにコピー" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "デバイスへコピー..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "ライブラリへコピー..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "著作権" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Subsonic に接続できませんでした。サーバーの URL を確認してください。例: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "GStreamer 要素「%1」を作成できませんでした。必要な GStreamer プラグインがすべてインストールされていることを確認してください" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "プレイリストを作成できません" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "%1 のミュクサーを見つけることができませんでした。正しい GStreamer プラグインがインストールされていることをチェックしてください" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "%1 のエンコーダーを見つけることができませんでした。正しい GStreamer プラグインがインストールされていることをチェックしてください" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "出力ファイル %1 を開けませんでした" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "カバーマネージャー" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "埋め込み画像からのカバーアート" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "%1 から自動的に読み込まれたカバーアート" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "カバーアートは手動で未設定にされています" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "カバーアートが設定されていません" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "%1 からのカバーアートセット" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "%1 からのカバー" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "トラックが自動で変更するときにクロスフェードする" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "トラックを手動で変更したときにクロスフェードする" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "カスタム" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "カスタム画像:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "カスタムメッセージの設定" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "カスタム..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "DBus のパス" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "ダンス" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "データベースの破損が見つかりました。データベースの復旧方法については https://code.google.com/p/clementine-player/wiki/DatabaseCorruption をお読みください" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "作成日時" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "更新日時" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "日" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "既定(&F)" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "音量を 4% 下げます" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "音量を % 下げる" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "音量を下げる" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "既定の背景画像" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "デフォルトのデバイス %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "既定" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "ビジュアライゼーションの間の遅延" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "削除" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "ダウンロード済みデータを削除" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "ファイルの削除" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "デバイスから削除..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "ディスクから削除..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "再生したエピソードの削除" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "プリセットの削除" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "スマートプレイリストを削除" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "元のファイルを削除する" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "ファイルの削除中" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "選択されたトラックをキューから削除する" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "トラックをキューから削除" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "フォルダー" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "詳細..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "デバイス" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "デバイスのプロパティ" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "デバイス名" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "デバイスのプロパティ..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "デバイス" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "ダイアログ" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "もしかして" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Digitally Imported のパスワード" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Digitally Imported のユーザー名" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "インターネットに直接接続する" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "ディレクトリ" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "長さを無効にする" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "ムードバーを生成しない" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "無効" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "無効" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "ディスク" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "不連続送信 (DTX)" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "画面のオプション" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "OSD を表示する" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "ライブラリ全体を再スキャン" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "完全再スキャンの実行" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "完全再スキャンの実行…" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "すべてのミュージックを変換しない" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "上書きしない" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "完全再スキャンを行なうと、Clementine 中に保存されているカバーアート、再生数、評価などのメタデータは失なわれます。Clementine は Google ドライブにあるあなたの曲を再スキャンしますが、これには時間がかかります。" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "リピートしない" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "さまざまなアーティストに表示しない" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "シャッフルしない" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "中止しないでください!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "寄付する" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "ダブルクリックで開く" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "曲をダブルクリックした際の動作..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "%n 個のエピソードをダウンロード" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "ダウンロードディレクトリ" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "エピソードのダウンロード先" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "メンバーシップのダウンロード" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "新しいエピソードを自動的にダウンロードする" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "ダウンロードがキューに追加されました" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Android アプリをダウンロードする" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "このアルバムのダウンロード" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "このアルバムをダウンロード..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "このエピソードをダウンロード" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "ダウンロード..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "ダウンロード中 (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Icecast ディレクトリをダウンロード中" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Jamendo カタログをダウンロード中" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Magnatune カタログをダウンロード中" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Spotify のプラグインをダウンロード中" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "メタデータをダウンロード中" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "位置を変更するにはドラッグします" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "ダブステップ" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "長さ" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "ダイナミックモードはオンです" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "ダイナミックランダムミックス" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "スマートプレイリストの編集..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "タグ「%1」を編集..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "タグの編集..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "タグの編集" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "トラック情報の編集" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "トラック情報の編集..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "トラック情報の編集..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "編集..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "Eメール" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Wii リモコンサポートを有効にする" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "自動的にキャッシュを有効にする" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "イコライザーを有効にする" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Clementine にフォーカスがあるときのみショートカットを有効にする" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "クリックによる曲のメタデータの直接編集を有効にする" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "下のソースを有効にすると検索結果に含まれます。結果はこの並び順で表示されます。" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Last.fm の scrobbling を有効・無効にする" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Complexity エンコーディング" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "エンコーディングエンジンの品質" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "エンコーディングモード" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "URL を入力" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "インターネットからカバーアートをダウンロードする URL を入力してください:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "エクスポートするカバーのファイル名を入力してください (拡張子なし):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "このプレイリストの名前を入力してください" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "コンピューター上およびインターネット上のミュージックを検索するには、上に検索条件を入力してください" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "iTunes Store のポッドキャストを検索するには、下に検索条件を入力してください" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "gpodder.net 上のポッドキャストを検索するには、下に検索条件を入力してください" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "ここに検索条件を入力してください" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "インターネットラジオストリームの URL を入力してください:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "フォルダ名を入力してください" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "この IP アドレスをアプリケーションに入力して Clementine に接続してください。" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "コレクション全体" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "イコライザー" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "--log-levels *:1 と同じ" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "--log-levels *:3 と同じ" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "エラー" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "CD リッピングのエラー" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "MTP デバイスの接続エラー" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "曲のコピーエラー" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "曲の削除エラー" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Spotify プラグインのダウンロードエラー" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "%1 の読み込みエラー" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "di.fm プレイリストの読み込みエラー" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "%1 の処理エラー: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "音楽 CD を読み込み中にエラーが発生しました" #: library/library.cpp:68 msgid "Ever played" msgstr "再生したことがある" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "10 分おき" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "12 時間おき" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "2 時間おき" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "20 分おき" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "30 分おき" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "6 時間おき" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "1 時間おき" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "同じアルバムもしくはキューシートのトラック同士の場合は除外する" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "既存のカバー" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "広げる" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "期限: %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "カバーをエクスポート" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "カバーをエクスポートする" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "ダウンロードしたカバーをエクスポートする" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "埋め込みカバーをエクスポートする" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "エクスポートが完了しました" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "%2 個中 %1 個のカバーをエクスポートしました (%3 個スキップしました)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "一時停止/再開時にフェードアウト/インする" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "トラックの停止時にフェードアウトする" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "フェード" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "フェードの長さ" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "CD ドライブの読み込みが失敗しました" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "ディレクトリの取得に失敗しました" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "ポッドキャストの取得に失敗しました" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "ポッドキャストの読み込みに失敗しました" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "この RSS フィードの XML の分析に失敗しました" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "速" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "お気に入りのトラック" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "足りないカバーの取得" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "自動的に取得する" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "取得完了" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Subsonic ライブラリーを取得" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "カバーの取得エラー" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "ファイル形式" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "ファイル拡張子" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "ファイル形式" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "ファイル名" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "ファイル名 (パスなし)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "ファイル名パターン:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "ファイルのパス" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "ファイルサイズ" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "ファイルの種類" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "ファイル名" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "ファイル" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "トランスコードするファイル" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "指定する条件に一致するライブラリから曲を検索します。" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "このアーティストを検索する" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "曲の特徴を検出しています" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "完了" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "第 1 階層" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "カバーの大きさを幅に合わせる" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "フォントサイズ" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "ライセンス上の理由で Spotify サポートは別プラグインになっています。" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "モノラルエンコーディングを強制する" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "デバイスを忘れる" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "デバイスを忘れるとこの一覧から削除して Clementine は次回接続時に再びすべての曲を再スキャンします。" #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "フォーム" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "形式" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "フレームレート" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "バッファーあたりのフレーム数" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "冷淡" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Full Bass" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Full Bass + Treble" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Full Treble" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "全般" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "全般設定" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "ジャンル" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "チャンネルの取得中" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "ストリームの取得中" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "名前を入力してください:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "進む" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "次のプレイリストタブへ" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "前のプレイリストタブへ" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "%2 個中 %1 個のカバーを取得しました (%3 個失敗しました)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "プレイリスト上の存在しない曲をグレーで表示する" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "ライブラリのグループ化..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "グループ化" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "アルバムでグループ化" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "アーティストでグループ化" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "アーティスト/アルバムでグループ化" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "アーティスト/年 - アルバムでグループ化" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "ジャンル/アルバムでグループ化" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "ジャンル/アーティスト/アルバムでグループ化" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "分類" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "HTML ページに RSS フィードが含まれていませんでした" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "HTTP ステータスコード 3XX を URL なしで受信しました。サーバーの設定を確認してください。" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "HTTP プロキシ" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "幸せ" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "ハードウェアの情報" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "ハードウェアの情報はデバイス接続中のみ利用できます。" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "高" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "高 (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "高 (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "ホストが見つかりません。サーバーの URL を確認してください。例: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "時間" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Magnatune アカウントなし" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "アイコン" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "アイコンを上に配置" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "曲の識別中" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "有効にすると、プレイリストの選択された曲をクリックすることでタグの値を直接編集できるようになります" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "続行すると、このデバイスは低速で動作しコピーされた曲は動作しなくなる可能性があります。" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "ポッドキャストの URL がある場合は、下に入力して進むを押してください。" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "アーティスト名の「The」を無視する" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "画像 (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "画像 (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "インポート..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "%1 日以内" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "%1 週以内" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "ダイナミックモードでは、新しいトラックは曲が終わるたびにプレイリストに選択・追加されます。" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "受信箱" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "通知にアルバムアートを含める" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "すべての曲を含める" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Subsonic REST プロトコルバージョンの互換性がありません。クライアントをアップグレードする必要があります。" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Subsonic REST プロトコルバージョンの互換性がありません。サーバーをアップグレードする必要があります。" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "設定は完了していません。すべての入力欄を埋めてください。" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "音量を 4% 上げます" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "音量を % 上げる" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "音量を上げる" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "%1 のインデックスを作成しています。" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "情報" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "入力オプション" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "挿入..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "インストール済み" #: core/database.cpp:585 msgid "Integrity check" msgstr "整合性の検査" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "インターネット" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "インターネットプロバイダ" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "インターネットサービス" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "不正な API キーです" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "不正な形式です" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "不正なメソッドです" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "不正なパラメーターです" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "不正なリソースが指定されました" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "不正なサービスです" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "不正なセッションキーです" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "選択を反転する" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Jamendo の最も聴かれているトラック" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Jamendo のトップトラック" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo の今月のトップトラック" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo の今週のトップトラック" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Jamendo のデータベース" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "現在再生中のトラックへジャンプ" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "ボタンを %1 秒長押し..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "ボタンを %1 秒長押し..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "ウィンドウを閉じたときバックグラウンドで起動し続ける" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "元のファイルを保持する" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Kittens" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "言語" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "ノートパソコン・ヘッドフォン" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "広間" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "大きいアルバムカバー" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "大きいアルバムカバー (詳細は以下)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "大きいサイドバー" #: library/library.cpp:80 msgid "Last played" msgstr "最終再生" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "最後に再生" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm は現在混雑しています。数分後にやり直してください" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Last.fm のパスワード" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Last.fm の再生回数" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Last.fm タグ" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Last.fm のユーザー名" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "嫌いなトラック" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "左" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "長さ" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "ライブラリ" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "ライブラリの高度なグループ化" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "ライブラリー再スキャン通知" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "ライブラリ検索" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "制限" #: ui/equalizer.cpp:137 msgid "Live" msgstr "ライブ" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "読み込み" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "URL からカバーの読み込み" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "URL からカバーの読み込み..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "ディスクからカバーの読み込み" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "ディスクからカバーの読み込み..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "プレイリストの読み込み" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "プレイリストの読み込み..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "MTP デバイスの読み込み中" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "iPod データベースの読み込み中" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "スマートプレイリストの読み込み中" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "曲の読み込み中" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "ストリームの読み込み中" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "トラックの読み込み中" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "トラック情報の読み込み中" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "読み込んでいます..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "ファイル・URL を読み込んで、現在のプレイリストを置き換えます" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "ログイン" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "ログインは失敗しました" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "ログアウト" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Long Term Prediction プロファイル (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Love" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "低 (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "低 (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Low Complexity プロファイル (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "歌詞" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "%1 からの歌詞" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Magnatune ダウンロード" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Magnatune ダウンロードが完了しました" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Main プロファイル (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Make it so!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Make it so!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "プレイリストをオフラインで利用可能にする" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "不正な応答です" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "プロキシの手動構成" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "手動" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "製造元" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "視聴済みマークを付ける" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "新曲マークを付ける" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "すべての検索条件に一致する (AND)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "1 つ以上の検索条件に一致する (OR)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "検索結果の最大件数" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "最高ビットレート" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "メディアが交換されました。読み込み中" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "中 (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "中 (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "メンバーシップの種類" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "最低ビットレート" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "projectM プリセットがありません" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "モデル" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "ライブラリの変更を監視する" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "モノラル再生" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "ヶ月" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "ムード" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "ムードバーの形式" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "ムードバー" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "もっと" #: library/library.cpp:84 msgid "Most played" msgstr "最も再生している" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "マウントポイント" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "マウントポイント" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "下へ移動" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "ライブラリへ移動..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "上へ移動" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "ミュージック" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "ミュージックライブラリ" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "ミュート" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "マイミュージック" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "おすすめ" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "名前" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "名前" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "名前のオプション" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "低速回線 (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "ネットワークプロキシ" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Network Remote" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "なし" #: library/library.cpp:74 msgid "Never played" msgstr "再生したことがない" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "再生を開始しない" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "新しいフォルダー" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "新しいプレイリスト" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "新しいスマートプレイリスト..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "新しい曲" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "新しいトラックは自動的に追加されます。" #: library/library.cpp:92 msgid "Newest tracks" msgstr "最新のトラック" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "次へ" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "次のトラック" #: core/utilities.cpp:151 msgid "Next week" msgstr "次週" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "アナライザーなし" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "背景画像なし" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "エクスポートしたカバーはありません" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "長いブロックなし" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "見つかりません。再びプレイリスト全体を表示するには検索ボックスをクリアします。" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "短いブロックなし" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "なし" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "デバイスへのコピーに適切な曲が選択されていません" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "ふつう" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "通常ブロックタイプ" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "ダイナミック プレイリストの使用中は利用できません" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "接続されていません" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "内容が足りません" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "ファンが足りません" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "メンバーが足りません" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "ご近所さんが足りません" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "未インストール" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "ログインしていません" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "マウントされていません - マウントするにはダブルクリックします" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "該当なし" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "通知の種類" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "通知" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "再生中" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "OSD のプレビュー" #: widgets/osd.cpp:173 msgid "Off" msgstr "オフ" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "オン" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "以下の IP アドレス範囲のクライアントからのみ接続を受け付けます:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "ローカルネットワークからのみ接続を許可する" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "先頭のみ表示する" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "不透明度" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "%1 をブラウザーで開く" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "オーディオ CD を開く(&A)..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "OPML ファイルを開く" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "OPML ファイルを開く..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "デバイスを開く" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "ファイルを開く..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Google Drive で開く" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "新しいプレイリストで開く" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "新しいプレイリストで開く" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "ブラウザーで開く" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "開く..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "操作が失敗しました" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "ビットレートを最適化" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "品質を最適化" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "オプション..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "ファイルの整理" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "ファイルの整理..." #: core/organise.cpp:73 msgid "Organising files" msgstr "ファイルの整理中" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "元のタグ" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "その他のオプション" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "出力" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "出力デバイス" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "出力のオプション" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "すべて上書きする" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "既存のファイルを上書きする" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "小さいサイズの場合のみ上書きする" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "所有者" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Jamendo カタログの分析中" #: ui/equalizer.cpp:139 msgid "Party" msgstr "パーティー" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "パスワード" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "一時停止" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "再生を一時停止します" #: widgets/osd.cpp:156 msgid "Paused" msgstr "一時停止中" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "出演者" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "ピクセル" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "プレーンサイドバー" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "再生" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "再生回数" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "停止中は再生し、再生中は一時停止します" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "再生中の曲がない場合は再生する" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "プレイリストの 番目のトラックを再生する" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "再生・一時停止" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "再生" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "プレーヤーのオプション" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "プレイリスト" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "プレイリストが完了しました" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "プレイリストのオプション" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "プレイリストの種類" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "プレイリスト" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "ブラウザーを閉じて Clementine に戻ってください。" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "プラグインの状態:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "ポッドキャスト" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "ポップアップの長さ" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "ポート" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "プリアンプ" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "設定" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "設定" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "設定..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "優先するアルバムアートのファイル名 (コンマ区切り)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "優先するオーディオ形式" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "優先するビットレート" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "優先する形式" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "プレミアムのオーディオの種類" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "プリセット:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "使用するボタンの組み合わせを押してください:" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "キーを押してください" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "%1 に使用するキーの組み合わせを押してください..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Pretty OSD のオプション" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "プレビュー" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "前へ" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "前のトラック" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "バージョン情報を出力" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "プロファイル" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "進行状況" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "進行状況" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "サイケデリック" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Wii リモコンのボタンを押してください" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "曲をランダムに並び替える" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "品質" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "品質" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "デバイスを照会しています..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "キューマネージャー" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "選択されたトラックをキューに追加" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "トラックをキューに追加" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "ラジオ (すべてのトラックで均一の音量)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Rain" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Rain" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "ランダムなビジュアライゼーション" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "現在の曲を星 0 つと評価する" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "現在の曲を星 1 つと評価する" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "現在の曲を星 2 つと評価する" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "現在の曲を星 3 つと評価する" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "現在の曲を星 4 つと評価する" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "現在の曲を星 5 つと評価する" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "評価" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "本当に取り消しますか?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "リダイレクト回数制限を超えました。サーバーの設定を確認してください。" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "カタログの更新" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "チャンネルの更新" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "局の一覧の更新" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "ストリームの更新" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "レゲエ" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "相対的" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Wii リモコンのスイングを記憶する" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "最後から記憶する" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "削除" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "アクションの削除" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "重複するものをプレイリストから削除" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "フォルダーの削除" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "マイミュージックから削除する" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "ブックマークから削除する" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "プレイリストから削除" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "プレイリストを削除する" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "プレイリストを削除する" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "無効なトラックをプレイリストから削除" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "プレイリストの名前の変更" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "プレイリストの名前の変更..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "この順序でトラック番号を振る..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "リピート" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "アルバムをリピート" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "プレイリストをリピート" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "トラックをリピート" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "現在のプレイリストを置き換える" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "プレイリストを置き換える" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "スペースをアンダースコアに置換する" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "リプレイゲイン" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "リプレイゲインモード" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "再装着" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "認証コードを要求する" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "リセット" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "再生回数のリセット" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "トラックを再開 (開始8秒以内なら前のトラックを再生)" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "ASCII 文字に限定する" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "起動時に再生を再開する" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Clementine に戻る" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "右" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "リッピングする" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "CD をリンピングする" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "ロック" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "実行" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "SOCKS プロキシ" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "SSL ハンドシェークエラーです。サーバーの設定を確認してください。下の SSLv3 オプションで問題を回避できるかもしれません。" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "デバイスを安全に取り外す" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "コピー後にデバイスを安全に取り外す" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "サンプルレート" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "サンプルレート" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "ミュージックライブラリーに .mood ファイルを保存する" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "カバーアートの保存" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "カバーをディスクに保存..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "画像の保存" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "プレイリストを保存する" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "プレイリストを保存する" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "プレイリストの保存..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "プリセットの保存" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "可能であれば評価をファイルのタグに保存する" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "可能であれば統計情報をファイルのタグに保存する" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "このストリームを [インターネット] タブに保存する" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "曲の統計情報を曲ファイルに保存中" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "トラックの保存中" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Scalable Sampling Rate プロファイル (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "サイズを調整する" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "スコア" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "聴取するトラックを Scrobble する" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "検索" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "検索" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Icecast 局の検索" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Jamendo の検索" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Magnatune の検索" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Subsonic を検索する" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "自動的に検索する" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "アルバムカバーの検索..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "何かを検索" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "gpodder.net を検索" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "iTunes を検索" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "検索モード" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "検索オプション" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "検索結果" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "検索条件" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "第 2 階層" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "後方へシーク" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "前方へシーク" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "現在再生中のトラックを相対値でシークする" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "現在再生中のトラックの絶対的な位置へシークする" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "すべて選択" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "選択しない" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "背景色の選択:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "背景画像の選択" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "前景色の選択:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "ビジュアライゼーションの選択" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "ビジュアライゼーションの選択..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "選択..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "シリアル番号" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "サーバー" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "サーバー URL" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "サーバーの詳細" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "サービスがオフラインです" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "%1 を「%2」に設定します..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "音量を パーセントへ設定しました" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "すべての選択されたトラックの音量を設定しました..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "設定" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "ショートカット" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "%1 のショートカット" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "%1 のショートカットは既に存在します" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "表示" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "OSD の表示" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "現在のトラックを光らせるアニメーションを表示する" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "進行状況バーにムードバーを表示する" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "ネイティブのデスクトップ通知を表示する" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "リピート・シャッフルモードの変更時に通知を表示する" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "音量の変更時に通知を表示する" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "システムトレイからポップアップを表示する" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Pretty OSD を表示する" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "ステータスバーの上に表示" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "すべての曲を表示する" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "すべての曲を表示する" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "ライブラリにカバーアートを表示する" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "区切りを表示する" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "原寸表示..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "検索結果にグループを表示する" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "ファイルブラウザーで表示..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "ライブラリーに表示..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "さまざまなアーティストに表示" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "ムードバーを表示する" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "重複するものだけ表示" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "タグのないものだけ表示" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "検索のおすすめを表示する" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "\"Love\"ボタンを表示する" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "scrobble ボタンをメインウィンドウに表示する" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "トレイアイコンを表示する" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "有効および無効になっているソースを表示する" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "表示・非表示の切り替え" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "シャッフル" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "アルバムをシャッフル" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "すべてシャッフル" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "プレイリストをシャッフル" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "このアルバムのトラックをシャッフル" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "サインイン" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "サインアウト" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "サインインしています..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "テイストの似たアーティスト" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "サイズ" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "サイズ:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "プレイリストで後ろにスキップ" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "スキップ回数" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "プレイリストで前にスキップ" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "選択したトラックをスキップする" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "トラックをスキップする" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "小さいアルバムカバー" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "小さいサイドバー" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "スマートプレイリスト" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "スマートプレイリスト" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "曲の情報" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "曲の情報" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "申し訳ありません" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "ジャンルで整列 (アルファベット順)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "ジャンルで整列 (人気順)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "局名で整列" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "曲の並べ替え" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "並べ替え中" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "ソース" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "ソース" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Spotify ログインエラー" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Spotify プラグイン" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Spotify プラグインはインストールされていません" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "標準" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "星付き" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "リッピングを開始する" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "現在再生中のプレイリストを開始する" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "トランスコードの開始" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "この検索結果のリストを補完するには、上の検索ボックスに何か入力してください。" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "%1 の開始中" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "開始しています..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "停止" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "次で停止" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "このトラック後に停止" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "再生の停止" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "現在のトラック後に停止" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "現在のトラック後に停止: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "停止しました" #: core/song.cpp:431 msgid "Stream" msgstr "ストリーム" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Subsonic サーバーのストリーミング再生は 30日のお試し期間後はサーバーライセンスを取得する必要があります。" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "ストリーミングのメンバーシップ" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "購読者" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "成功!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "%1 の書き込みに成功しました" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "お薦めのタグ" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "要約" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "最高 (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "最高 (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "サポートされている形式" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "統計情報をいますぐ同期する" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Spotify の受信箱を同期中" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Spotify のプレイリストを同期中" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Spotify の星付きトラックを同期中" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "システムの色" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "タブを上に配置" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "タグ取得ツール" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "目標ビットレート" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "テクノ" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "文字のオプション" #: ui/about.cpp:74 msgid "Thanks to" msgstr "謝辞" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "コマンド「%1」を開始できませんでした。" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "再生中の曲のアルバムカバー" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "ディレクトリ %1 は不正です" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "2 つ目の値は 1 つ目より大きくする必要があります!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "指定されたサイトは存在しません!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "指定されたサイトは画像ではありません!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Subsonic サーバーのお試し期間は終了しました。寄付してライセンスキーを取得してください。詳細は subsonic.org を参照してください。" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "更新したこのバージョンの Clementine は、次の新機能によりライブラリ全体の再スキャンが必要です。" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "このアルバムにはほかの曲があります" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "gpodder.net との通信に問題がありました" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Magnatune からのメタデータ取得に問題がありました" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "iTunes Store からの応答の分析に問題がありました" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "曲のコピーに問題がありました。次のファイルはコピーできませんでした:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "曲の削除に問題がありました。次のファイルは削除できませんでした:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "これらのファイルはデバイスから削除されます。続行してもよろしいですか?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "これらのファイルは完全にディスクから削除されます。継続しますか?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "これらのフォルダーはライブラリを作成するためにスキャンされます" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "以下の設定は「ミュージックのトランスコード」ダイアログや、音楽を変換してデバイスへコピーする前に使われます。" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "第 3 階層" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "この操作は 150 メガバイト以上のデータベースを作る可能性があります。\n操作を続行しますか?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "このアルバムは要求されたフォーマットでは利用できません" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Clementine がこのデバイスのサポートするファイル形式を認識する前にデバイスが接続されて開かれている必要があります。" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "このデバイスは次のファイル形式をサポートしています:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "このデバイスは適切に動作しません" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "これは MTP デバイスですが、Clementine は libmtp サポートなしでコンパイルされています。" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "これは iPod ですが、Clementine は libgpod サポートなしでコンパイルされています。" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "このデバイスに初めて接続しました。Clementine はミュージックファイルを検索するためにデバイスをスキャンします - これには時間がかかる可能性があります。" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "このオプションは設定の「動作」で変更できます。" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "このストリームは有料会員専用です" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "この種類のデバイスはサポートされていません: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "タイトル" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "今日" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Pretty OSD の切り替え" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "全画面表示の切り替え" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "キュー状態の切り替え" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "scrobbling の切り替え" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "pretty OSD 表示の切り替え" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "明日" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "リダイレクトが多すぎます" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "上位のトラック" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "全アルバム数:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "合計転送バイト数" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "合計ネットワーク要求回数" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "トラック" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "トラック" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "ミュージックのトランスコード" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "トランスコーダーのログ" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "トランスコード" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "%2 個のスレッドを使用して %1 個のファイルをトランスコードしています" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "トランスコードのオプション" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "オフにする" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "超高速回線 (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "接続できません" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "%1 をダウンロードできません (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "不明" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "不明なコンテンツタイプ" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "不明なエラー" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "カバーを未設定にする" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "選択したトラックをスキップしない" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "トラックをスキップしない" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "購読解除" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "次のコンサート" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "更新" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "すべてのポッドキャストを更新" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "変更されたライブラリフォルダーを更新" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Clementine の起動時にライブラリを更新する" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "このポッドキャストを更新" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "更新" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "%1 の更新中" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "更新しています %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "ライブラリの更新中" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "使用量" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "利用可能ならアルバムアーティストタグを使用する" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Gnome のショートカットキーを使用する" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "利用可能ならリプレイゲインのメタデータを使用する" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "SSLv3 を使用する" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Wii リモコンの使用" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "カスタム色設定を使用する" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "通知にカスタムメッセージを使用する" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "ネットワークリモコンを使用する" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "認証を使用する" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "ビットレート管理エンジンを使用する" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "ダイナミックモードを使用する" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Wii リモコンの状態の報告に通知を使用する" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Temporal Noise Shaping (TNS) を使用する" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "システム既定を使用する" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "システム既定の色設定を使用する" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "システムのプロキシ設定を使用する" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "音量の正規化を使用する" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "使用中" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "ユーザーインターフェース" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "ユーザー名" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "メニューから曲を追加した場合..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "可変ビットレート" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "さまざまなアーティスト" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "バージョン %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "表示" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "ビジュアライゼーションモード" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "ビジュアライゼーション" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "ビジュアライゼーションの設定" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "有音/無音検出 (VAD)" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "音量 %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "プレイリストタブを閉じるときに警告する" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "ウェブサイト" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "週" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Clementine の起動時" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "アルバム アートの検索時に Clementine はまずこれらの単語の 1 つを含む画像ファイルを探します。\n一致するものがない場合はディレクトリにある最も大きいイメージを使用します。" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "リストが空のとき..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "おすすめの検索..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "高速回線 (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii リモコン %1: アクティブになりました" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii リモコン %1: 接続されました" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii リモコン %1: バッテリーがありません (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii リモコン %1: 非アクティブになりました" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii リモコン %1: 切断されました" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii リモコン %1: バッテリーが少なくなりました (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wii リモコンデバイス" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media オーディオ" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "カバーなし:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "このアルバムにある他の曲も さまざまなアーティスト に移動しますか?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "全体の再スキャンを今すぐ実行しますか?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "すべての曲の統計情報を曲ファイルに書き込む" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "メタデータの書き込み" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "ユーザー名またはパスワードが違います。" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "年" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "年 - アルバム" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "年" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "昨日" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "次のアルバムをダウンロードしようとしています" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "プレイリスト「%1」をお気に入りから削除します。よろしいですか?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "お気に入りに含まれていないプレイリストを削除しようとしています。このプレイリストは削除されます(この操作は元に戻せません)。\n削除してもよろしいですか?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "サインインしていません。" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "%1 でサインインしています。" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "サインインしています。" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "ライブラリの曲を整理する方法を変更できます。" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "アカウントがなくても無料で聴くことができますが、プレミアムメンバーは広告なしでより高音質で聴くことができます。" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Magnatune の曲はアカウントなしで無料で聴くことができます。メンバーシップを購入すると各トラック最後のメッセージを削除できます。" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "バックグラウンドストリームを別のミュージックとして同時に聴くことができます。" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Clementine のリモートコントロールとして Wii リモコンを使用できます。詳細はClementine wiki のページをご覧ください。\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Spotify のプレミアムアカウントがありません。" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "有効なサブスクリプションがありません" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "SoundCloud の曲の検索と視聴にログインは必要ありません。プレイリストとストリームにアクセスするにはログインする必要があります。" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Spotify からログアウトしました。設定ダイアログでパスワードを再入力してください。" #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Spotify からログアウトしました。パスワードを再入力してください。" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "このトラックは Love されています" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "言語を変更するには Clementine の再起動が必要です。" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "あなたの IP アドレス:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Last.fm の認証情報が間違っています" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Magnatune の認証情報が間違っています" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "ライブラリは空です!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "ラジオストリーム" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Scrobble 回数: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "システムが OpenGL をサポートしていないため、ビジュアライゼーションを利用できません。" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "ユーザー名またはパスワードが間違っています。" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "%n 曲の追加" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "が次の日付以後" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "前" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "と" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "自動" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "が次の日付以前" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "が次の時間範囲内" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "大きい順" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "が次を含む" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "無効" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "ディスク %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "が次を含まない" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "が次で終わる" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "が次に一致する" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "gpodder.net ディレクトリ" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "が次より大きい" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "iPod と USB デバイスは現在のところ Windows では動作しません。すみません!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "が次の時間以内" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "が次より小さい" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "長い順" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "%n 曲の移動" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "新しい順" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "が次と異なる" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "が次の時間以前" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "が次の日付でない" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "古い順" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "が次の日付" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "オプション" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "または QR コードをスキャン!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "enter を押してください" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "%n 曲の削除" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "短い順" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "曲のシャッフル" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "小さい順" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "曲の並び替え" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "が次で始まる" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "停止" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "トラック %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/ka.po000066400000000000000000004234741260417502300236500ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # FIRST AUTHOR , 2011 # George Machitidze , 2012-2014 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Georgian (http://www.transifex.com/davidsansome/clementine/language/ka/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ka\n" "Plural-Forms: nplurals=1; plural=0;\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " კბწმ" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " მწმ" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " წამი" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " სიმღერა" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 ალბომი" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 დღე" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 დღის წინ" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 რეპერტუარი (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "არჩეულია %1 სიმღერა" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1-დან" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1-დან" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "ნაპოვნია %1 სიმღერა" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "ნაპოვნია %1 სიმღერა (ნაჩვენებია %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 ჩანაწერი" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev მოდული" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "დარჩა %n" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&ცენტრირება" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "დამა&ტებითი" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&დახმარება" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&დამალვა %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "მარ&ცხენა" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "&მუსიკა" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&ხელსაწყოები" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 დღე" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "%n ჩანაწერი" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 შემთხვევითი ჩანაწერი" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Spotify-ის Premium ანგარიში აუცილებელია." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "" #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "დიდება ჰიპნოგომბეშოს" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "%1-ის შესახებ" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Clementine-ის შესახებ..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Qt-ის შესახებ..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "ანგარიშის დეტალები" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "მოქმედება" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Wiiremote-ის აქტივაცია/დეაქტივაცია" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "პოდკასტის დამატება" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "ნაკადის დამატება" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "მოქმედების დამატება" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "სხვა ნაკადის დამატება..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "დირექტორიის დამატება..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "ფაილის დამატება..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "გადასაკოდირებელი ფაილების დამატება" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "დასტის დამატება" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "დასტის დამატება..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "ახალი დასტის დამატება..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "პოდკასტის დამატება" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "პოდკასტის დამატება..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "ნაკადის დამატება..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "სხვა რეპერტუარში დამატება" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "რეპერტუარში დამატება" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "რიგში დამატება" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "დამატება..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "დაემატა ამ თვეში" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "დაემატა ემ კვირაში" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "დაემატა ამ წელს" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "დაემატა დღეს" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "დაემატა სამი თვის მანძილზე" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "კოპირების შემდეგ..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "ალბომი" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "ალბომი (იდეალური ხმის სიმაღლე ყველა ჩანაწერისთვის)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "ალბომის შემსრულებელი" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "ინფორმაცია ალბობის შესახებ jamendo.com-ზე..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "ალბომები ყდებით" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "ალბომები ყდების გარეშე" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "ყველა ფაილი (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "ყველა ალბომი" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "ყველა შემსრულებელი" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "ყველა ფაილი (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "ყველა რეპერტუარი (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "ყველა თარჯიმანი" #: library/library.cpp:98 msgid "All tracks" msgstr "ყველა ჩანაწერი" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "მთავარი ფანჯრის ყოველთვის დამალვა" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "მთავარი ფანჯრის ყოველთვის ჩვენება" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "ყოველთვის დაიწყე დაკვრა" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:85 msgid "And:" msgstr "და:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "იერსახე" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "შემსრულებელი" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "შემსრულებლის ინფო" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "შემსრულებლის ჭდეები" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "შემსრულებლის ინიციალი" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "აუდიოფორმატი" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "ავტენრიფიკაცი ვერ მოხერხდა" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "" #: ui/about.cpp:68 msgid "Authors" msgstr "ავტორები" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "ავტომატური" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "ავტომატურად განახლება" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "ხელმისაწვდომი" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "საშუალო ბიტური სიჩქარე" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "BBC-ის პოდკასტები" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "ფონური ნაკადები" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "ფონის ფერი" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "ფონის გაუმჭვირვალობა" #: core/database.cpp:648 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "ქცევა" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "საუკეთესო" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "ბიტური სიჩქარე" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "ბიტური სიჩქარე" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "ბლოკის ტიპი" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "ნუსხა..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "ღილაკები" #: core/song.cpp:428 msgid "CDDA" msgstr "" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "CUE sheet-ის მხარდაჭერა" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "გაუქმება" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "ალბომის ყდის შეცვლა" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "შრიფტის ზომის შეცვლა..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "გამეორების რეჯიმის შეცვლა" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "მალმხმობის შეცვლა..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "შემთხვევითი რეჟიმის შეცვლა" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "ენის შეცვლა" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "განახლებებზე შემოწმება..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "ავტომატურად არჩევა" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "აირჩიეთ ფერი..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "აირჩიეთ შრიფტი..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "აირჩიეთ სიიდან" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "კლასიკური" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "გასუფთავება" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "რეპერტუარის გასუფთავება" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Clementine-ის შეცდომა" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Clementine-ის ფორთოხალი" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Clementine-ის ვიზუალიზაცია" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "დაკეტვა" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "ვიზუალიზაციის დაკეტვა" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:114 msgid "Club" msgstr "კლუბი" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "კომენტარი" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "ჭდეების ავტომატური შევსება" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "ჭდეების ავტომატური შევსება..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "კომპოზიტორი" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Magnatune-ის გამართვა..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "მალმხმობების გამართვა" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Spotify-ის გამართვა..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "ბიბლიოთეკის გამართვა..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "გამართვა..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "ცეკვა" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "შექმნის თარიღი" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "ცვლილების თარიღი" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "დღე" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "ხმის 4%-ით შემცირება" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "ხმის შემცირება" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "ნაგულისხმები" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "დაყოვნება ვიზუალიზაციებს შორის" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "ფაილების წაშლა" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "მოწყობილობიდან წაშლა..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "დისკიდან წაშლა..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "ორიგინალი ფაილების წაშლა" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "ფაილების წაშლა" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "დეტალები..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "მოწყობილობა" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "მოწყობილობის პარამეტრები" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "მოწყობილობის სახელი" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "მოწყობილობის პარამეტრები..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "მოწყობილობები" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "თქვენ გულისხმობდით" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "ციფრულად შემოტანილი" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "ციფრულად შემოტანილი პაროლი" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "პირდაპირი ინტერნეტკავშირი" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "დირექტორია" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "ხანგრძლივობის გათიშვა" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "დისკი" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "პარამეტრების ჩვენება" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "არ გაიმეორო" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "არ შეურიო" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "არ გაჩერდე!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "" #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "ამ ალბომის ჩამოტვირთვა" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "ამ ალბომის ჩამოტვირთვა..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "ჩამოტვირთვა..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "მეტამონაცემების ჩამოტვირთვა" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "ჭდის რედაქტირება..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "ჭდეების რედაქტირება" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "რედაქტირება..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "ეკვალაიზერის ჩართვა" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "კოდირების ძრავის ხარისხი" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "კოდირების რეჟიმი" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "მთელი კოლექცია" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "ეკვალაიზერი" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "შეცდომა" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "შეცდომა სიმღერების კოპირებისას" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "შეცდომა სიმღერების წაშლისას" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:68 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "ფაილები" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:585 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "ინტერნეტი" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "" #: library/library.cpp:80 msgid "Last played" msgstr "" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "ბიბლიოთეკა" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: ui/equalizer.cpp:137 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "შეყვარება" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "" #: core/song.cpp:410 msgid "MPC" msgstr "" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "მუსიკა" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "გაჩუმება" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "" #: library/library.cpp:74 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:92 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "შემდეგი ჩანაწერი" #: core/utilities.cpp:151 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "&აუდიო CD-ის გახსნა..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "ფაილის გახსნა..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "" #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "ფაილების ორგანიზება" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "ფაილების ორგანიზება..." #: core/organise.cpp:73 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "არსებული ფაილების შეცვლა" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:139 msgid "Party" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "დაკვრა" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "რეპერტუარი" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "რეპერტუარი დასრულდა" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "წინა ჩანაწერი" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "ძებნა" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "ძებნის რეჟიმი" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "" #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "" #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "ინფორმაცია სიმღერაზე" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "ინფორმაცია" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "გაჩერება" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "" #: core/song.cpp:431 msgid "Stream" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "" #: ui/about.cpp:74 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "" #: core/song.cpp:426 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "" #: devices/giolister.cpp:157 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "ყველა პოდკასტის განახლება" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "გაჩერერება" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/kk.po000066400000000000000000004135471260417502300236620ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # FIRST AUTHOR , 2010 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Kazakh (http://www.transifex.com/davidsansome/clementine/language/kk/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: kk\n" "Plural-Forms: nplurals=1; plural=0;\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " күн" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " мсек" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " сек" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 күн" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n сәтсіз" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n аяқталған" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n қалды" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "Мә&тін туралануы" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "Ор&тасы" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "Таң&дауыңызша" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Көмек" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "%1 жасыру" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "Жа&сыру..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Сол жақ" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "Му&зыка" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Ешнәрсе" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Шығу" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Оң жақ" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "Са&ймандар" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 күн" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 трек" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "" #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "%1 туралы" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "" #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Qt туралы..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Әрекет" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "" #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Файлды қосу" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Файлды қосу..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Буманы қосу" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Буманы қосу..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "" #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "" #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Қосу..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Кейін" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "" #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Альбом" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Альбом әртісі" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "" #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Барлық файлдар (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Барлық файлдар (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:80 msgid "All the translators" msgstr "" #: library/library.cpp:98 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:85 msgid "And:" msgstr "Және:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Ашулы" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Сыртқы түрі" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Орындайтын" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Аутентификация сәтсіз" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Авторы" #: ui/about.cpp:68 msgid "Authors" msgstr "Авторлары" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Авто" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Қолжетерлік" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Фон түсі" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Фон суреті" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "" #: core/database.cpp:648 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Мінез-құлығы" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Шолу..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Батырмалар" #: core/song.cpp:428 msgid "CDDA" msgstr "" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Бас тарту" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Қарiп өлшемiн өзгерту..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Жаңа эпизодтарға тексеру" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Жаңартуларға тексеру..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Қаріпті таңдау..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Классикалық" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Тазарту" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Жабу" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:114 msgid "Club" msgstr "Клубтық" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Түстер" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Түсіндірме" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Композитор" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "%1 баптау..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Баптау..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Алмасу буферіне көшіру" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Copyright" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Таңдауыңызша" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Таңдауыңызша..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Билеу" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Жасалған күні" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Түзетілген күні" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Күн" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "Ба&стапқы" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Өшіру" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Файлдарды өшіру" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Ойналған эпизодтарды өшіру" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Файлдарды өшіру" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Мақсаты" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Көбірек..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Құрылғы" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Құрылғы аты" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Құрылғылар" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Тікелей интернет байланысы" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Бума" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Диск" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "" #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "%n эпизодты жүктеп алу" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "" #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Жүктеп алу..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Жүктелуде (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Түзету..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Эквалайзер" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Қате" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:68 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Жаю" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Жылдам" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Файл кеңейтілуі" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Файл аты" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Файл өлшемі" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Файл түрі" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Файл аты" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Файлдар" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Аяқтау" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Бiрiншi деңгей" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Қаріп өлшемі" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Форма" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Пішімі" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Жалпы" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Жалпы баптаулары" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Жанры" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Өту" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Қалайша топтау" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Бақытты" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Жоғары" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Сағат" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Таңбаша" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Ақпарат" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Кірістіру..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Орнатылған" #: core/database.cpp:585 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Интернет" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Пішімі қате" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Тіл" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "" #: library/library.cpp:80 msgid "Last played" msgstr "" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Ұзындығы" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Жинақ" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: ui/equalizer.cpp:137 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Жүктеу" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Ойнату тізімін жүктеу" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Ойнату тізімін жүктеу..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Жүктелуде..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Кіру" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Қолмен" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Шығарушы" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Жаңа етіп белгілеу" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Модель" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Көңіл-күй" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Тіркеу нүктесі" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Төмен жылжыту" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Жоғары жылжыту" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Музыка" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Дыбысын басу" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Аты" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Ешқашан" #: library/library.cpp:74 msgid "Never played" msgstr "Бұрын ойналмаған" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Жаңа бума" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Жаңа ойнату тізімі" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:92 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Келесі" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "" #: core/utilities.cpp:151 msgid "Next week" msgstr "Келесі аптада" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Жоқ" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Қалыпты" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Хабарламалар" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Қазір ойналуда" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Мөлдірсіздік" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Файлды ашу..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Ашу..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Әрекет сәтсіз" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Опциялар..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "" #: core/organise.cpp:73 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Басқа опциялар" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Иесі" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:139 msgid "Party" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Пароль" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Аялдату" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Ойнатуды аялдату" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Аялдатылған" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Орындайтын" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Ойнату" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Ойнату үрдісі" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Подкасттар" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Поп" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Порт" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Баптаулар" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Баптаулар..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Алдын-ала қарау" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Алдыңғы" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Профиль" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Барысы" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Рейтинг" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Регги" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Өшіру" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Буманы өшіру" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Ойнату тізімінің атын ауыстыру" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Ойнату тізімінің атын ауыстыру..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Қайталау" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Тастау" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Рок" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Орындау" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Дискреттеу жиілігі" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Суретті сақтау" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Ойнату тізімін сақтау..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Баптауды сақтау" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Нәтиже" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Іздеу" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Барлығын таңдау" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Ештеңе таңдамау" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Фон суретін таңдаңыз" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "" #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Жарлық" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Көрсету" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "" #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Альбомдарды араластыру" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Кіру" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Шығу" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ска" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Сұрыптау" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Қайнар көзі" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Қайнар көздер" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Қалыпты" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "%1 іске қосылу" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Іске қосылу..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Тоқтату" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Ойнатуды тоқтату" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Тоқтатылған" #: core/song.cpp:431 msgid "Stream" msgstr "Ағындық" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Сәтті!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Ақпарат" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Техно" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Алғыстар" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Аталуы" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Бүгін" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Толық экранға өту/шығу" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Ертең" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Трек" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Сөндіру" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "%1 (%2) жүктеп алу мүмкін емес" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Белгісіз" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Белгісіз қате" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Жазылудан бас тарту" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Жаңартуда" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "%1 жаңарту" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "%1% жаңарту..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Жинақты жаңарту" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Қолданылуы" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Аутентификацияны қолдану" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Жүйе негізгілерін қолдану" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Қолдануда" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Пайдаланушы интерфейсі" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Пайдаланушы аты" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "%1 нұсқасы" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Түрі" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "%1% бөлімі" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Веб сайт" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Шығ. жылы" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Кеше" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Нөл" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "кейін" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "бұрын" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "және" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "автоматты түрде" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "дейін" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "құрамында бар" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "сөндірулі" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "диск %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "опциялар" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/ko.po000066400000000000000000005102511260417502300236540ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # 며소 <>, 2012 # 사월 <>, 2012 # orange2141 , 2014 # 현구 임 , 2012 # 현구 임 , 2012 # FIRST AUTHOR , 2011 # 현구 임 , 2012 # Ji yul Kim , 2015 # 박정용 , 2013 # 박정용 , 2014-2015 # Thomas Min , 2013 # whdgmawkd , 2014-2015 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Korean (http://www.transifex.com/davidsansome/clementine/language/ko/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ko\n" "Plural-Forms: nplurals=1; plural=0;\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\n재생목록 왼쪽에 별모양 아이콘을 클릭해서 즐겨찾기에 추가할 수 있습니다.\n\n즐겨찾기는 여기에 저장됩니다." #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "일" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " 초" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " 노래" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 곡)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1개 앨범" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1일" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1일 전" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%2의 %1" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 재생목록 (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "다음 중 %1개 선택됨" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1개 노래" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1개 노래" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1개 노래 찾음" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1개 노래 찾음 (%2개 표시 중)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1개 트랙" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 이동됨" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wii 리모컨 모듈" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "다른 청취자 %L1명" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "총 %L1번 재생" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n 실패" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n 끝냄" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n 남음" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "글자 정렬(&A)" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "가운데(&C)" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "사용자 정의(&C)" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "효과음(&E)" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "도움말(&H)" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "%1 숨김(&H)" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "숨기기(&H)..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "왼쪽(&L)" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "음악(&M)" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "없음(&N)" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "재생목록(&P)" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "종료(&Q)" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "반복 모드(&R)" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "오른쪽(&R)" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "셔플 모드(&S)" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "창 크기에 맞게 글자열 넓히기(&S)" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "도구(&T)" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(전반적으로 다양한 곡)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...그리고 Amarok에 기여해 주신 모든 분들" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1일" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1개 트랙" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192,000Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44,100Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48,000Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "무작위 50개 트랙" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96,000Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "프리미엄으로 업그레이드하기" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

활성화하면 Clementine은 별점이나 기타 통계를 독립된 데이터베이스에만 저장하며 파일을 수정하지 않습니다.

비활성화하면 통계를 파일과 데이터베이스 모두에 저장합니다.

이 기능은 비표준이므로 모든 형식과 호환되지 않고, 다른 플레이어가 이 정보를 읽지 못할 수 있습니다.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

토큰은 %로 시작하니다, 예제: %artist %album %title

⏎\n⏎\n

만약 중괄호를 포함하고 있는 토큰을 포함한 텍스트 단원을 감싸고 있고 토큰이 비어 있다면, 그 단원은 감춰질 것입니다.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Spotify 프리미엄 계정이 필요합니다." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "올바른 코드가 입력 되었을 때에만 클라이언트가 연결할 수 있습니다." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "스마트 재생 목록은 라이브러리에서 불러온 음악의 다이나믹 목록입니다. 다른 방식으로 노래를 선택할 수 있는 스마트 재생 목록의 또 다른 형태입니다." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "노래가 이러한 조건과 일치하면 재생 목록에 포함됩니다." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "HYPNOTOAD에 모든 영광을" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "중단" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "%1 정보" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Clementine 정보" #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Qt 정보" #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "절대경로" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "계정 정보" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "계정 상세정보 (프리미엄)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "동작" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "동작" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Wii 리모컨 사용/중지" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "활동 스트림" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "팟케스트 추가" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "스트림 추가" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "알림 형식이 지원한다면 새로운 줄 추가" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "동작 추가" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "디렉토리와 모든 하위 디렉토리의 모든 트랙을 추가합니다" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "다른 스트림 추가..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "디렉토리 추가..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "파일 추가" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "transcoder에 파일 추가" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "transcoder 파일(들) 추가" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "파일 추가..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "변환할 파일 추가" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "폴더 추가" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "폴더 추가..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "새로운 폴더 추가..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "팟케스트 추가" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "팟케스트 추가..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "검색 조건 추가" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "앨범 태그 추가" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "앨범 가수 태그 추가" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "가수 태그 추가" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "자동 점수 추가" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "작곡가 태그 추가" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "음악 디스크 태그 추가" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "음악 파일명 추가" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "장르 태그 추가" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "음악 그룹화 태그 추가" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "노래 길이 태그 추가" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "음악 연주가 태그 추가" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "재생 횟수 추가" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "음악 등급 추가" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "무시 횟수 추가" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "제목 태그 추가" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "캐시에 음악 추가" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "트랙 태그 추가" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "연도 태그 추가" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "\"좋아요\" 버튼을 클릭하면 노래가 \"내 음악\"에 추가됩니다." #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "스트림 추가..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "내 음악에 추가" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Spotify 재색목록에 추가" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Spotify 별점에 추가" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "다른 재생목록에 추가" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "북마크에 추가" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "재생목록에 추가" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "대기열에 추가" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "북마크에 사용자/그룹 추가" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Wii 리모컨 동작 추가" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "추가..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "이번 달에 추가됨" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "이번 주에 추가됨" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "올해 추가됨" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "오늘 추가됨" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "3개월 이내에 추가됨" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "고급 그룹화..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "이후" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "복사 한 후...." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "앨범" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "앨범 (모든 트랙에 이상적인 음량)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "앨범 가수" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "앨범 표지" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr " jamendo.com 앨범 정보..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "앨범(들)" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "앨범 표지가 있는 앨범" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "앨범 표지가 없는 앨범" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "전체" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "모든 파일 (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "Hypnotoad에 모든 영광을!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "모든 앨범" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "모든 음악가" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "모든 파일 (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "전체 재생목록 (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "모든 번역가" #: library/library.cpp:98 msgid "All tracks" msgstr "모든 트랙" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "클라이언트가 이 PC에서 음악을 다운로드 하도록 허가합니다." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "다운로드 허용" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "미드/사이드 인코딩 적용" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "원본과 함께" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "항상 메인 창 숨기기" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "항상 메인 창 표시함" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "항상 재생 시작" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon 클라우드 드라이브" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Clementine에서 Spotify를 이용하시려면 추가 플러그인이 있어야 합니다. 지금 설치하시겠습니까?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "iTunes 데이터베이스를 불러오는 중 오류 발생" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "'%1'에 메타데이터를 쓰던 중 오류 발생" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "지정되지 않은 에러가 발생" #: ui/about.cpp:85 msgid "And:" msgstr "그리고:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "화난" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "외형" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "재생목록에 파일/URL 추가" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "현재 재생목록에 추가" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "재생목록에 추가" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "클리핑 방지를 위한 압축 적용" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "\"%1\" 프리셋을 정말 지우시겠습니까?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "이 곡의 통계를 초기화하시겠습니까?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "라이브러리의 모든 곡의 해당하는 음악 파일에 음악 통계를 작성 하시겠습니까?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "음악가" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "음악가 정보" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "음악가 태그" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "음악가 이니셜" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "저장할 때 묻기" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "오디오 형식" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "오디오 출력" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "인증 실패" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "작성자" #: ui/about.cpp:68 msgid "Authors" msgstr "작성자" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "자동" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "자동" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "자동 업데이트" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "라이브러리 트리에 자동으로 하나의 카테고리로 열기" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "이용 가능" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "평균 비트 전송률" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "평균 이미지 크기" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "BBC 팟케스트" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "백그라운드 스트림" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "배경 색상" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "배경 그림" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "배경 투명도" #: core/database.cpp:648 msgid "Backing up database" msgstr "데이터베이스 백업" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "밸런스" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "막대" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "기본 파랑" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "기본 오디오 형식" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "행동" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "최고" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "%1의 바이오그래피" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "비트 전송률" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "비트 전송률" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "비트레이트" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "블록" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "블록 형식" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "블러 정도" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "본문" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "붐" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "찾아보기..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "버퍼 시간" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "버퍼링" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Seafile 목차 생성 중..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "하지만 다음 출처는 사용할 수 없습니다:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "버튼" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "큐 시트 지원" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "캐시 경로:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "캐시 중" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "%1 캐시 중" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "취소" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "다운로드 취소" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Captcha 가 필요합니다.\n이 문제의 해결하려면 브라우저에서 Vk.com로 접속하여 로그인을 시도하세요. " #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "커버 아트 바꾸기" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "글꼴 크기 바꾸기..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "반복 모드 " #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "단축키 바꾸기..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "셔플 모드 " #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "언어 변경" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "변경사항은 다음곡부터 적용됩니다." #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "모노 재생 옵션 변경은 다음곡부터 적용됩니다." #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "새로운 에피소드 확인" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "업데이트 확인" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "업데이트 확인..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Vk.com 캐시 디렉터리 선택" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "스마트 재생목록에 이름 추가" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "자동 선택" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "색상 선택..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "글꼴 선택..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "목록에서 선택" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "재생목록의 정렬 방식과 최대 곡수를 선택하세요." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "팟케스트 다운로드 경로를 선택하세요" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "당신이 보기 원하는 인터넷 서비스들을 선택하세요." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Clementine이 가사를 찾기위해 이용할 사이트를 선택하세요." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "클래식" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "자동 정리" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "비우기" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "재생목록 비우기" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Clementine 오류" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Clementine 오렌지" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Clementine 시각화" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine은 이 장치에서 복사한 곡을 재생 가능한 형식으로 자동 변환할 수 있습니다." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Clementine은 당신이 Amazon Cloud에 업로드한 음악을 재생할 수 있습니다." #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine은 당신이 Box에 업로드한 음악을 재생할 수 있습니다." #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine은 당신이 Dropbox에 업로드한 음악을 재생할 수 있습니다." #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine은 당신이 Google Drive에 업로드한 음악을 재생할 수 있습니다." #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "클레멘타인은 당신이 One드라이브에 업로드한 음악을 재생할 수 있습니다." #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine은 트랙이 변할 때 메시지를 표시할 수 있습니다." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine은 당신의 다른 컴퓨터와 팟케스트 어플리케이션과 당신의 구독 목록을 동기화 할 수 있습니다. 계정을 만드세요." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine이 projectM 시각화를 불러올 수 없습니다. Clementine이 제대로 설치되었는지 확인해 보세요." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Clementine 이미지 뷰어" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine은 이 파일의 결과를 검색할 수 없습니다" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine이 음악을 찾을 수 있습니다." #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "음악을 추가하려면 여기를 클릭하세요" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "여기를 클릭하여 즐겨찾기에 추가하세요, 창 왼쪽 \"재생목록\"에서 쉽게 찾을 수 있습니다." #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "남은 시간과 전체 시간을 바꾸려면 클릭하세요" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "로그인 버튼을 클릭하면 웹 브라우저가 열립니다. 당신이 로그인을 한 후에 Clementine으로 되돌아 와야 합니다." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "닫기" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "재생목록 닫기" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "시각화 닫기" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "이 창을 닫으면 다운로드가 취소됩니다." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "이 창을 닫으면 앨범 표지 검색이 중지됩니다." #: ui/equalizer.cpp:114 msgid "Club" msgstr "클럽" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "색상" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "콤마로 클래스:단계의 목록을 나눔, 단계는 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "설명" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "커뮤니티 라디오" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "자동으로 태그 저장" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "자동으로 태그 저장..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "작곡가" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "%1 설정..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Magnatune 설정..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "단축키 설정" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Spotify 설정..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Subsonic 설정" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Vk.com 설정..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "글로벌 검색 설정..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "라이브러리 설정..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "팟케스트 설정..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "설정..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "사용/중지 실행으로 Wii 리모컨 연결" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "장치 연결" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Spotify에 연결 중" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "서버에서 연결을 거부하였습니다. 서버의 주소를 확인하세요. 예)http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "연결 시간이 초과되었습니다. 서버의 주소를 확인하세요. 예)http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "연결 문제 또는 오디오가 사용자에 의한 비활성화" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "콘솔" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "순간 비트 전송률" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "모든 곡 변환" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "장치가 재생할 수 없는 곡 변환" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "원격에 전송하기 전에 오디오 파일들을 무손실로 변환합니다." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "무손실 파일 변환" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "공유 URL 복사" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "클립보드로 복사" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "장치에 복사..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "라이브러리에 복사..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "저작권" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Subsonic에 접속할 수 없습니다. 서버 URL을 확인 하세요. 예시:http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "GStreamer 요소 \"%1\"를 찾을 수 없습니다 - 필요한 모든 GStreamer 플러그인이 설치되어 있는지 확인하세요" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "재생목록을 생성할수 없습니다." #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "%1 먹서를 찾을 수 없습니다, GStreamer 플러그인이 올바르게 설치되어 있는지 확인하세요" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "%1 인코더를 찾을 수 없습니다, GStreamer 플러그인이 올바르게 설치되어 있는지 확인하세요" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "출력 파일 %1를 열 수 없습니다" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "커버 관리자" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "내장된 이미지로부터 커버 아트 사용" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "%1에서 자동으로 커버 아트를 불러옴" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "커버 아트를 수동으로 설정하지 않음" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "커버 아트를 설정하지 않음" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "%1에서 커버 아트를 설정함" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "%1에서 커버" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "트랙을 자동으로 바꿀 때 크로스-페이드" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "트랙을 직접 바꿀 때 크로스-페이드" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "사용자 정의" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "사용자 정의 이미지:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "사용자 정의 메시지 설정" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "사용자 정의..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "DBus 경로" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "댄스" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "데이터베이스 손상이 감지되었습니다. 데이터베이스를 복구하는 방법에 대한 지침 https://code.google.com/p/clementine-player/wiki/DatabaseCorruptiond 을 읽어 보시기 바랍니다" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "생성한 날짜" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "수정한 날짜" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "일" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "기본값(&f)" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "4% 단위로 음량 줄이기" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "% 단위로 음량 줄이기" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "음량 줄이기" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "기본 배경 그림" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "%1를 기본 장치로 설정" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "기본값" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "시각화 사이의 시간 간격" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "삭제" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "다운로드된 데이터 삭제" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "파일 삭제" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "장치에서 삭제..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "디스크에서 삭제..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "재생된 에피소드 삭제" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "프리셋 삭제" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "스마트 재생목록 지우기" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "원본 파일 삭제" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "파일 삭제 중" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "선택한 트랙을 대기열에서 해제" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "트랙을 대기열에서 해제" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "대상" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "세부 내용..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "장치" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "장치 속성" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "장치 이름" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "장치 속성..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "장치" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "다이얼로그" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "이것을 원하셨습니까" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Digitally Imported 비밀번호" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Digitally Imported 사용자명" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "직접 인터넷 연결" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "디렉토리" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "지속 해제" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "분위기 막대 생성 " #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "사용 안함" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "사용 안함" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "디스크" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "불연속적인 전송" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "옵션 표시" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "OSD 표시" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "전체 라이브러리 다시 읽기" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "전체 재탐색" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "전체 재탐색..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "어떤 곡도 변환하지 않기" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "덮어쓸 수 없음" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "전체 재탐색은 앨범아트, 재생회수, 별점 등 모든 정보가 손실됩니다. Clementine은 Google Drive에 있는 모든 음악을 재탐색 할 것이며, 수분이 소요될 수 있습니다." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "반복하지 않기" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "다양한 음악가에 표시하지 않기" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "이미 들은 에피소드 보이지 않기" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "섞지 않기" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "멈추지 마세요!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "기부" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "열려면 더블클릭하세요" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "노래를 더블클릭하면..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "에피소드 %n 다운로드" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "디렉토리 다운로드" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "에피소드 다운로드" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "멤버십 다운로드" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "자동으로 새로운 에피소드 다운로드" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "다운로드 대기열 추가됨" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "다운로드 설정" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Android 앱 다운로드" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "이 앨범 다운로드" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "이 앨범 다운로드..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "이 에피소드 다운로드" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "다운로드..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "다운로드 중 (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Icecast 디렉토리 다운로드 중" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Jamendo 카탈로그 다운로드 중" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Magnatune 카탈로그 다운로드 중" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Spotify 플러그인 다운로드 중" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "메타데이터 다운로드 중" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "재배치하려면 드래그하세요" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "덥스탭" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "지속" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "다이나믹 모드가 켜졌습니다" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "다이나믹 랜덤 믹스" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "스마트 재생목록 편집..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "태그 수정 \"%1\"..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "태그 편집..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "태그 편집" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "트랙 정보 편집" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "트랙 정보 편집..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "트랙 정보 편집..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "편집..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "이메일" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Wii 리모컨 모드 사용" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "자동 캐싱 허용" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "이퀄라이저 사용" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Clementine이 활성화 되었을 때에만 단축키 허용" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "클릭으로 음악 메타데이터 인라인판 사용" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "검색 결과에 아래의 소스들을 포함시킵니다. 검색 결과는 다음의 순서대로 표시됩니다." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Last.fm 스크로블 켜기/끄기" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "인코딩 복잡도" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "인코딩 엔진 품질" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "인코딩 모드" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "URL 입력" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "인터넷에서 다운로드할 커버의 URL 주소를 입력하세요" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "내보낼 커버의 파일이름을 입력(확장자 제외):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "새로운 재생목록 이름을 입력하세요" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "당신의 컴퓨터와 인터넷에서 음악을 찾기위한 검색 조건을 입력하세요." #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "iTunes 스토어에서 팟케스트를 찾기 위한 검색 조건을 아래에 입력하세요." #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "gpodder.net에서 팟케스트를 찾기 위한 검색 조건을 아래에 입력하세요." #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "여기에 검색할 단어를 입력하세요" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "인터넷 라디오 스트림 URL 주소를 입력하세요" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "폴더의 이름 입력" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Clementine에 연결하기 위한 앱에서 다음의 IP를 입력하세요." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "전체 선택" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "이퀄라이저" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "동등한 --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "동등한 --log-level *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "오류" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "CD 추출 중 에러" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "MTP 장치에 연결 오류" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "노래 복사 오류" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "노래 삭제 오류" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Spotify 플러그인 다운로드 오류" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "%1 불러오기 오류" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "dl.fm 재생목록 불러오기 오류" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "%1: %2 처리 오류" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "오디오 CD 불러오기 오류" #: library/library.cpp:68 msgid "Ever played" msgstr "재생한 적 있음" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "매 10분" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "매 12시간" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "매 2시간" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "매 20분" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "매 30분" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "매 6시간" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "매 시간" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "같은 앨범이나 같은 큐 시트의 트랙 사이에선 제외" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "존재하는 커버" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "확장" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "만료 일자: " #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "커버 내보내기" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "커버 내보내기" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "다운로드된 커버 내보내기" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "내장된 커버 내보내기" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "내보내기 완료" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "%2개의 앨범 표지중 %1개 내보냄. (%3개 건너뜀)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "일시정지시 페이드 아웃/ 다시시작시 페이드 인" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "트랙 정지 시 페이드 아웃" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "페이드 아웃" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "페이드 아웃 시간" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "CD 드라이브 읽기 실패" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "폴더 가져오기 실패" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "팟케스트 가져오기 실패" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "팟케스트 열기 실패" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "RSS 피드를 위한 XML 파싱이 실패되었습니다." #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "빠른" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "좋아하는 트랙" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "누락된 커버 가져오기" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "자동으로 가져오기" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "가져오기 완료" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Subsonic 라이브러리 가져오기" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "커버 가져오기 오류" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "파일 형식" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "파일 확장자" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "파일 " #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "파일 " #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "파일 이름 (경로 제외)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "파일 명 규칙:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "파일 경로" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "파일 크기" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "파일 형태" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "파일 " #: ui/mainwindow.cpp:239 msgid "Files" msgstr "파일" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "변환할 파일들" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "라이브러리에서 지정한 기준과 일치하는 노래를 찾습니다." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "이 음악가 찾기" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "노래 " #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "마침" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "첫 단계" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "앨범 커버를 너비에 맞춤" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "글꼴 크기" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "라이선스 문제로 인하여 Spotify 는 별도의 플러그인에서 지원합니다." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "강제 모노 인코딩" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "장치를 잃어버림" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "장치를 잃어버렸을 경우 목록에서 제거하고 Clementine이 다음 연결할 때 모든 음악을 다시 스캔합니다." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "형식" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "형태" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "프레임레이트" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "프레임/" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "얼음" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "베이스 강화" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "베이스+고음 강화" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "고음 강화" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "일반 " #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "일반 " #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "장르" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "이 Spotify 음악을 공유하기 위한 URL 얻기" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "이 재생목록을 공유하기 위한 URL 얻기" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "채널 " #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "스트림 " #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "이름 지정:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Go" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "다음 재생목록 탭으로 가기" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "이전 재생목록 탭으로 가기" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "%2 중 %1개 커버 가져옴 (%3 실패 됨)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "내 재생목록에서 존재하지 않는 음악 회색화" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "그룹 라이브러리..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "그룹" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "앨범에 의한 그룹" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "음악가에 의한 그룹" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "음악가/앨범에 의한 그룹" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "음악가/년도에 의한 그룹 - 앨범" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "장르/앨범에 의한 그룹" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "장르/음악가/앨범에 의한 그룹" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "그룹화" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "HTML 페이지가 어떠한 RSS 피드를 포함하지 않습니다." #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "URL이 없이 HTTP 3XX 상태코드가 수신 되었습니다. 서버 설정을 확인하세요." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "HTTP " #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "행복" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "하드웨어 " #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "하드웨어 정보는 장치가 연결되어있는 동안에만 가능합니다." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "높음" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "높음 (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "높음 (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "힙합" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "호스트가 발견되지 않았습니다. 서버의 주소를 확인하세요. 예)http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "시간" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "최면 두꺼비 대왕" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Magnatune 계정을 가지고 있지 않습니다." #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "아이콘" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "상단에 아이콘" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "음악을 식별하는 " #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "이 기능을 활성화 하면 재생목록에서 음악을 선택하는 것으로 음악정보를 직접 수정할 수 있습니다." #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "계속 한다면, 이 장치는 느리고 복사된 음악들이 작동 되지 않을 수 있습니다." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "팟케스트에 URL을 알고 있다면, 아래에 입력하고 버튼을 누르세요." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "음악가 이름에서 \"The\" 제거" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "그림 (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "가져오기..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "%1 일 안에 " #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "%1 주 안에" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "다이나믹 모드에서는 곡이 끝날 때마다 자동으로 재생목록에 곡이 추가됩니다." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "수신함" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "알림에 앨범 아트 포함" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "모든 음악 포함" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "호환되지 않는 Subsonic REST 프로토콜 버전입니다. 클라이언트를 업그레이드 해야만 합니다." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "호환되지 않는 Subsonic REST 프로토콜 버전입니다. 서버를 업그레이드 해야만 합니다." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "설정이 완료되지 않았습니다. 모든 필드가 정상적으로 입력되었는지 확인하세요." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "4% 단위로 음량 올리기" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "% 단위로 음량 올리기" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "음량 올리기" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "색인 %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "정보" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "옵션 " #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "추가..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "설치 됨" #: core/database.cpp:585 msgid "Integrity check" msgstr "무결성 검사" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "인터넷" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "인터넷 " #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "인터넷 서비스" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "잘못된 API " #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "잘못된 형식" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "잘못된 방법" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "잘못된 매개변수" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "잘못된 리소스가 지정되었습니다." #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "잘못된 서비스" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "잘못된 세션 키" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "선택 반전" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Jamendo 가장 많이 들은 트랙" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Jamendo 최고의 트랙" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo 이 달의 최고 트랙" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo 금주의 최그 트랙" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Jamendo 데이터베이스" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "바로 이전 곡으로 이동" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "현재 재생 중인 트랙 건너뛰기" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "%1 초 동안 버튼 유지..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "%1 초 동안 버튼 유지..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "창을 닫을 때 백그라운드에서 계속 실행" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "원본 파일들 " #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "고양이" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "쿠두루" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "언어" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "노트북/헤드폰" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "거대한 홀" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "큰 앨범 표지" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "큰 앨범 표지 (자세한 내용은 아래에)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "큰 앨범 표지 (자세한 내용 없음)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "큰 사이드바" #: library/library.cpp:80 msgid "Last played" msgstr "마지막으로 재생됨" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "마지막으로 재생됨" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm 이 현재 바쁩니다. 잠시 후 다시 시도해 주세요." #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Last.fm 비밀번호" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Last.fm 재생 횟수" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Last.fm 태그" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Last.fm 사용자명" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Last.fm 위키" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Last.fm 좋아하는 트랙" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "왼쪽" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "길이" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "라이브러리 " #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "향상된 그룹 " #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "라이브러리 재탐색 알림" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "라이브러리 " #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "제한" #: ui/equalizer.cpp:137 msgid "Live" msgstr "라이브" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "열기" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "URL로 부터 커버 열기" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "URL로 부터 커버 열기..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "디스크로부터 커버 열기" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "디스크로부터 커버열기..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "재생목록 불러오기" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "재생목록 불러오기..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "MTP 장치 여는 중" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "iPod 데이터베이스 여는 중" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "스마트 재생목록 불러오기 중" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "음악 여는 중" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "스트림 여는 중" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "트랙 여는 중" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "트랙 정보 불러오는중" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "여는 중..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "현재 재생목록을 교체할 파일/URL 불러오기" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "로그인" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "로그인 실패" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "로그아웃" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "장기 예측 프로파일(LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "좋아요" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "낮음 (%1fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "낮음 (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "저복잡도 프로파일(LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "가사" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "%1 의 가사" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "ID3v2 태그의 가사" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "MP4 AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Magnatune 다운로드" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Magnatune 다운로드 완료 됨" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "메인 프로필 (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Make it so!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Make it so!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "재생목록을 오프라인에서 재생 가능하도록 설정" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "잘못된 응답" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "수동 프록시 설정" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "수동적" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "제조회사" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "들음으로 기록" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "새로 기록" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "모든 검색조건 일치 (AND)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "하나 이상의 검색조건 일치 (OR)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "전역 검색 결과의 최대 개수" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "최고 비트 전송률" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "미디어가 변경되었습니다. 다시 불러옵니다." #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "중간 (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "중간 (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "멤버쉽 유형" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "최저 비트 전송률" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "최소 버퍼량" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "projectM 프리셋들이 누락되었습니다" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "모형" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "라이브러리의 변화를 감지" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "모노 재생" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "개월" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "분위기" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "분위기 막대 " #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "분위기 막대" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "더 " #: library/library.cpp:84 msgid "Most played" msgstr "자주 재생됨" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "마운트 지점" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "마운트 지점" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "아래로 이동" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "라이브러리로 이동..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "위로 이동" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "음악" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "음악 라이브러리" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "음소거" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "나의 앨범" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "내 음악" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "내 추천목록" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "이름" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "이름" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "명명 옵션" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "협대역(NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "네트워크 프록시" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "네트워크 리모콘" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "없음" #: library/library.cpp:74 msgid "Never played" msgstr "재생한 적 없음" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "재생을 시작하지 않음" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "새 폴더" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "새로운 재생목록" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "새 스마트 재생목록" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "새로운 음악" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "새로운 음악을 자동으로 추가함" #: library/library.cpp:92 msgid "Newest tracks" msgstr "새로운 트랙" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "다음" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "다음 트랙" #: core/utilities.cpp:151 msgid "Next week" msgstr "다음 주" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "없음" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "배경 그림 없음" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "내보낼수 있는 커버가 없습니다." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "긴 블록 " #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "일치하는 결과를 찾을 수 없습니다. 검색창을 비우시면 전체 재생목록을 보실 수 있습니다." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "짧은 블록 " #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "없음" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "선택된 음악들이 장치에 복사되기 적합하지 않음" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "일반" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "일반 블록 형식" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "다이나믹 재생목록을 사용 중일 때는 사용할 수 없습니다." #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "연결되지 않음" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "내용이 충분하지 않습니다." #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "팬이 충분하지 않습니다." #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "회원이 충분하지 않습니다." #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "이웃이 충분하지 않습니다." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "설치되지 않음" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "로그인 되지 않음" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "마운트 되지 않음 - 마운트 하려면 더블클릭" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "찾을 수 없음" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "알림 형태" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "알림" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "지금 재생중" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "에피소드의 수를 표시" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "OSD 미리보기" #: widgets/osd.cpp:173 msgid "Off" msgstr "꺼짐" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "OGG Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "켜짐" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "One드라이브" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "다음의 ip 대역에 포함된 클라이언트의 연결만 받아들입니다 :\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "로컬 네트워크로 부터의 연결만 허용" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "처음에만 보이기" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "투명도" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "브라우저에서 %1 열기" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "오디오 CD 열기(&a)..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "OPML 파일 열기" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "OPML 파일 열기" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "음악을 불러올 폴더를 선택하세요." #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "장치 열기" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "파일 열기..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Google Drive에서 열기" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "새로운 재생목록에서 열기" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "새로운 재생목록에서 열기" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "브라우저에서 열기" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "열기..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "작업이 실패됨" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "비트 전송률 최적화" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "음질 최적화" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "옵션..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "파일 정리" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "파일 정리..." #: core/organise.cpp:73 msgid "Organising files" msgstr "파일 정리 중..." #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "원본 태그" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "그 외 옵션" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "출력" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "출력 장치" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "저장 옵션" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "모두 덮어쓰기" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "기존 파일들 " #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "작은 것들만 덮어 쓰기" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "소유자" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Jamendo 목록 구성 중" #: ui/equalizer.cpp:139 msgid "Party" msgstr "파티" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "비밀번호" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "일시중지" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "재생 일시중지" #: widgets/osd.cpp:156 msgid "Paused" msgstr "일시중지됨" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "연주가" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "픽셀" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "일반 사이드바" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "재생" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "재생 횟수" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "중지중일때 재생, 재생중일때 중지" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "이미 재생되는 곡이 없다면 재생" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "재생목록 번째의 곡 재생" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "재생/일시중지" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "재생" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "플레이어 옵션" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "재생목록" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "재생목록 끝남" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "재생목록 옵션" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "재생목록 종류" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "재생목록" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "브라우저를 닫고 Clementine으로 돌아오세요" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "플러그인 상태:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "팟케스트" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "팝" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "팝업 시간" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "포트" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "프리-엠프" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "설정" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "환경설정" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "환경설정..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "선호하는 앨범 아트 파일명 (쉼표로 구분)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "선호하는 오디오 형식" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "선호하는 비트 전송률" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "선호하는 형식" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "프리미엄 오디오 형식" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "프리셋:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "을 사용하기 위한 조합 키를 누르세요" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "a키를 누르세요" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "%1에 사용하기 위한 키조합을 누르세요..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "예쁜 OSD 옵션" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "미리보기" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "이전" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "이전 트랙" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "출력 버전 정보" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "프로필" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "진행" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "진행" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "사이키델릭" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Wii 리모콘 버튼을 누르세요" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "무작위 순서에 곡을 " #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "음질" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "해상도" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "장치 질의..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "대기열 관리자" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "선택한 트랙을 큐에 추가" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "대기열 트랙" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "라디오 (모든 트랙을 같은 볼륨으로)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "빗소리" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "빗소리" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "랜덤 시각화" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "현재 음악에 별점 0점 평가" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "현재 음악에 별점 1점 평가" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "현재 음악에 별점 2점 평가" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "현재 음악에 별점 3점 평가" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "현재 음악에 별점 4점 평가" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "현재 음악에 별점 5점 평가" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "등급" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "정말 취소 하시겠습니까?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "리디렉트 제한을 초과하였습니다. 서버 설정상태를 확인하세요." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "목록 새로고침" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "채널 새로고침" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "방송국 목록 새로고침" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "스트림 새로고침" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "레게" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "상대경로" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Wii 리모콘 스윙 기억하기" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "마지막 기억" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "나의 선택을 기억" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "제거" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "제거 행동" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "재생목록에서 중복 제거" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "폴더 제거" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "내 음악에서 제거" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "북마크에서 제거" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "재생목록에서 제거" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "재생목록 삭제" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "재생목록 제거" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "재생목록에서 재생 불가능한 트랙 제거" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "재생목록 이름 바꾸기" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "재생목록 이름 바꾸기..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "이 순서에서 트랙 번호를 다시 부여..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "반복" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "앨범 " #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "재생 목록 반복" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "한 곡 반복" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "현재 재생목록 교체" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "재생목록 교체" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "공백을 및줄로 대체" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "리플레이 게인" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "리플레이 게인 모드" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "다시 채우기" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "인증 코드 " #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "초기화" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "재생 횟수 초기화" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "ASCII 문자로 제한" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "시작할 때 재생목록 일시정지" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Clementine으로 되돌아가기" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "오른쪽" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "추출" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "CD 추출" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "오디오 CD 추출" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "록" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "실행" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "SOCKS 프록시" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "안전하게 장치 제거" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "복사 후 안전하게 장치 제거" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "샘플 레이트" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "샘플 레이트" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "음악 라이브러리에 .mood 파일 저장" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "앨범 표지 저장" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "커버를 디스크에 저장..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "그림 저장" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "재생목록 저장" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "재생목록 저장" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "재생목록 저장..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "프리셋 저장" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "가능하면 파일 태그에 등급을 저장" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "가능하면 파일 태그에 통계를 저장" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "인터넷 탭에 이 스트림을 저장" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "음악 통계를 음악 파일 내부에 저장" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "트랙 저장 중" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "확장 가능한 샘플링 속도 프로파일 (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "축척 크기" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "점수" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "내가 들은 청취 기록 트랙" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "검색" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "검색" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Icecast 방송국 검색" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Jamendo 검색" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Magnature 검색" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Subsonic 검색" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "자동적으로 찾기" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "앨범 표지 검색..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "검색" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "gpodder.net 검색" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "iTunes 검색" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "모드 검색" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "옵션 검색" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "검색 결과" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "검색 조건" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "두 번째 단계" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "뒤로 탐색" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "앞으로 탐색" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "현재 재생중인 트랙을 상대 양으로 탐색" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "현재 재생중인 트랙을 절대 위치로 탐색" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "모두 선택" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "선택 없음" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "배경 색상 선택" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "배경 그림 선택" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "가장 유사한 일치 선택" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "전경 색상 선택" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "시각화 선택" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "시각화 선택..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "선택..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "시리얼 넘버" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "서버" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "서버 URL" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "서버 자세히" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "서비스 오프라인" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "%1을 \"%2\"로 설정..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "음량을 퍼센트로 설정" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "모든 선택 트랙의 값을 설정..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "설정" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "단축키" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "단축키: %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "%1위한 단축키가 이미 존재합니다." #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "보기" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "OSD 보기" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "현재 트랙에서 빛나는 애니메이션 보기" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "트랙 진행 막대에 분위기 막대 표시" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "네이티브 데스크탑 알림 보기" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "반복/섞기 모드 변경 시 알림 보기" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "볼륨 변경시 알림 보기" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "재생/일시정지 할 때 알림 보기" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "시스템 트레이에서 팝업 보기" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "예쁜 OSD 보기" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "상태 표시 줄 위에 보기" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "모든 음악 보기" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "모든 음악 보기" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "라이브러리에서 커버아트 보기" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "분할 표시" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "전체화면 보기..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "글로벌 검색 결과에서 그룹 보기" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "파일 브라우져에서 보기..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "라이브러리에서 보기..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "다양한 음악가에서 보기" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "분위기 막대 " #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "복사본만 보기" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "태그되지 않은 것만 보기" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "검색 제안 표시" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "\"좋아요\" 버튼 보기" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "메인 창에서 청취기록 버튼 보이기" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "트레이 아이콘 보기" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "출처의 사용가능 여부 보기" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "보기/숨기기" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "섞기" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "앨범 섞기" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "전부 " #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "재생 목록 섞기" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "이 앨범에 있는 곡 섞기" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "로그인" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "로그아웃" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "로그인..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "유사한 음악가" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "크기" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "크기:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "스카" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "재생목록에서 뒤로 넘기기" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "넘긴 회수" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "재생목록에서 앞으로 넘기기" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "선택된 트랙들 " #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "트랙 " #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "작은 앨범 표지" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "작은 사이드바" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "스마트 재생목록" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "스마트 재생목록" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "소프트" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "소프트 록" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "음악 정보" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "음악 정보" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "소노그래프" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "죄송합니다" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "장르에 의한 정렬(철자순)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "장르에 의한 정렬(인기순)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "방송국 이름으로 정렬" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "음악 정렬" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "정렬" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "출처" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "출처" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Spotify 로그인 에러" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "Spotify 재생목록 URL" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Spotify 플러그인" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Spotify 플러그인이 설치되지 않았습니다." #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "Spotify 음악 URL" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "표준" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "별점" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "추출 시작" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "현재 재생중인 재생목록 시작" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "변환 시작" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "%1 시작중" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "시작중..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "중지" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "이후 정지" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "이번 트랙 이후 정지" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "재생 " #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "현재 트랙 이후 재생 정지" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "%1 트랙 재생 후 정지" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "중지됨" #: core/song.cpp:431 msgid "Stream" msgstr "스트림" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "스트리밍 멤버쉽" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "구독자" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "성공!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "%1 작성 완료" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "제안된 태그" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "요약" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "아주 높음 (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "아주 높음 (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "지원가능한 형식" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "지금 파일들의 통계들을 동기화" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Spotify inbox와 동기화 중" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Spotify 재생목록 동기화중" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Sportify 별점 트랙 동기화 중" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "시스템 색상" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "상단 탭" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "태그 가져오기" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "목표 비트 전송률" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "테크노" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "문자 옵션" #: ui/about.cpp:74 msgid "Thanks to" msgstr "감사합니다" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "\"%1\" 명령이 시작 되지 않았습니다." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "재생 중인 음악의 앨범 표지" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "디렉터리 %1 이 유효하지 않습니다." #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "두 번재 값이 반드시 첫 번째 값 보다 커야 합니다!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "요청한 사이트가 존재하지 않습니다!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "요청하신 사이트는 이미지가 아닙니다!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Subsonic의 시험 기간이 끝났습니다. 라이센스 키를 얻기위한 기부를 해주세요. 자세한 사항은 subsonic.org 에서 확인하세요." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "아래의 새 기능이 추가되었기 때문에, 전체 라이브러리 재탐색이 필요합니다." #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "이 앨범과 다른 음악" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "gpodder.net과 통신하는데 문제가 발생하였습니다." #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Magnatune 으로부터 메타데이터를 가져오는데 문제가 발생했습니다" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "iTunes 스토어로부터 응답을 처리하는데 문제가 발생했습니다." #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "음악을 복사하는 도중 문제가 발생하였습니다. 복사에 실패한 파일 :" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "음악을 삭제하는 도중 문제가 발생하였습니다. 삭제에 실패한 파일 :" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "파일들이 장치로 부터 삭제 될 것 입니다. 계속 진행 하시겠습니까?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "파일들이 디스크에서 완전히 제거됩니다. 계속하시겠습니까?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "이 폴더들은 라이브러리를 생성하기 위하여 음악이 검색됩니다." #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "여기 있는 설정들은 \"음악 변환\" 대화상자에서 사용되며, 장치에 음악을 복사하기전 변환에서도 사용됩니다." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "세 번째 단계" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "이 행동은 150MB 보다 큰 데이터 베이스를 생성할 것입니다.\n계속 진행하시겠습니까?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "이 앨범은 요청된 형식이 아닙니다." #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "이 환경설정들을 나중에 변경할 수 있습니다." #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "이 장치는 다음의 파일 형식을 지원합니다:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "이 기기는 완벽하게 작동하지 않을 수 있음." #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "MTP 장치이지만 libmtp 지원을 하지 않도록 Clementine이 컴파일 되었습니다." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "iPod 장치이지만 libgpod 지원을 하지 않도록 Clementine이 컴파일 되었습니다." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "이 장치는 처음 연결 되었습니다. Clementine은 지금 장치에서 음악 파일들을 탐색할 것 입니다. - 시간이 조금 걸릴수 도 있습니다." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "이 옵션은 환경설정의 \"행동\" 에서 변경할 수 있습니다." #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "이 스트림은 유료 subscribers만 사용할 수 있습니다" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "이 장치의 형태는 지원되지 않습니다: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "제목" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "오늘" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "예쁜 OSD 토글" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "전체화면 토글" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "대기열 상황 토글" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "청취 기록 토글" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "예쁜 OSD 표시를 보이기 선택" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "내일" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "너무 많은 리다이렉트" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "상위 트랙" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "총 앨범수:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "전송된 총 바이트" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "트랙" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "트랙" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "음악 변환" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "변환 기록" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "변환" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "%2개의 쓰레드를 이용하여 %1 파일을 변환 중" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "변환 옵션" #: core/song.cpp:426 msgid "TrueAudio" msgstr "트루오디오" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "터빈" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "끄기" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL(들)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "초광대역 (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "연결할 수 없음" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "%1(%2)를 다운로드 할 수 없습니다" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "알 수 없는" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "알 수 없는 content-type" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "알 수 없는 오류" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "커버 해제" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "선택된 트랙들 넘기기 " #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "트랙 넘기기 " #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "구독 안함" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "다가오는 콘서트" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "갱신" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "모든 팟케스트 업데이트" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "변경된 라이브러리 폴더 업데이트" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Clementine이 시작될 때 라이브러리 업데이트" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "이 팟케스트 업데이트" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "업데이트 중" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "업데이트 중 %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "업데이트 중 %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "라이브러리 업데이트 중" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "사용" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "가능 하면 앨범 아티스트 태그 사용" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Gnome의 단축키를 사용합니다." #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "가능하면 리플레이 게인 메타데이터를 사용" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "SSL 버전 3 사용" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Wii 리모컨 모드 사용" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "사용자 정의 색상 사용" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "알림을 위한 사용자 정의 메시지 설정" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "네트워크 리모콘 사용" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "인증 사용" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "비트 전송률 관리 엔진 사용" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "다이나믹 모드 사용" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Wii 리모콘 상태 보고를 위한 알림 사용" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "시스템 기본 값 사용" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "시스템 기본 색상 사용" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "시스템 프록시 설정 사용" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "음량 표준화 사용" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "사용 됨" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "사용자 인터페이스" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "사용자명" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "음악 추가를 하였을 때..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "가변 비트 전송률" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "다양한 음악가" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "버전 %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "보기" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "시각화 모드" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "시각화" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "시각화 설정" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "음성 활성도 감지" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "음량 %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "재생목록 탭을 닫으면 알림" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "웹 사이트" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "주" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Clementine이 시작할 때" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "재생목록을 저장할 때, 파일경로 처리 방식" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "목록이 비었을 때..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "다음의 검색어는 어떠시나요..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "광대역 (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii 리모콘 %1: 활성화" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii 리모콘 %1: 연결됨" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii 리모콘 %1: 배터리 위험(%2%)" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii 리모콘 %1: 비 활성화" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii 리모콘 %1: 연결 끊김" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii 리모콘 %1: 낮은 배터리(%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "윈도우 미디어 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "윈도우 미디어 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "윈도우 미디어 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "윈도우 미디어 오디오" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "커버 제외:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "지금 전부 다시 검색해도 좋습니까?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "모든 음악에 통계를 작성" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "메타데이터 작성" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "잘못된 사용자명 또는 비밀번호 입니다." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "년도" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "년도 - 앨범" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "년도" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "어제" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "즐겨찾기에서 재생목록 %1(을)를 제거합니다. 계속하시겠습니까?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "즐겨찾기 목록에 없는 재생목록을 삭제하려 합니다. 이 작업은 되돌릴 수 없습니다. 계속하시겠습니까?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "로그인 하지 않았습니다." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "%1 로 로그인 하였습니다." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "로그인 되었습니다." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "계정과 관계 없이 무료로 들을 수 있지만 프리미엄 회원은 광고 없이 고음질 스트림으로 들을 수 있습니다." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "계정이 없이 무료로 Magnatune의 음악을 들을 수 있습니다. 회원권을 구입하면 각 트랙의 마지막의 메시지를 지웁니다." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "다른 음악과 동시에 배경 음악을 들을 수 있습니다. " #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Clementine에서 Wii 리모콘을 사용할 수 있습니다. 더 알고 싶으면 Clementine 위키의 페이지를 확인 하세요.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "당신은 Spotify 프리미엄 계정이 아닙니다." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "활성화된 구독이 없습니다." #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "SoundCloud에 있는 노래를 듣기위해 로그인할 필요는 없습니다. 하지만 당신의 플레이리스트와 음악을 스트리밍 하기 위해서는 로그인이 필요합니다." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Spotify에서 로그아웃 되셨습니다. 설정에서 비밀번호를 재입력하여 주십시오." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Spotify에서 로그아웃 되셨습니다. 비밀번호를 재입력하여 주십시오." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "이 트랙을 좋아합니다." #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "언어를 변경을 하였다면 Clementine을 재시작 해야합니다." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "당신의 IP 주소:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "당신의 Last.fm 계정정보가 부정확 합니다." #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Magnatune의 계정정보가 잘 못 되었습니다." #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "라이브러리가 비었습니다!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "당신의 라디오 스트림" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "당신의 청취 기록: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "당신의 시스템은 OpenGL을 지원하지 않아서, 시각화를 사용할 수 없습니다." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "사용자명 또는 비밀번호가 틀렸습니다." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "제로" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "%n 곡 추가" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "이후" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "전에" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "그리고" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "자동" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "이전" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "사이" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "큰 순서" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "포함" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "사용 안함" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "%1 디스크" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "포함 되지 않음" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "으로 끝남" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "같음" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "gpodder.net 디렉토리" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "보다 큼" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "죄송합니다. iPods 과 USB 장치가 현재 Windows 에서 작동하지 않습니다. " #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "마지막으로" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "보다 작음" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "긴것을 먼저" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "%n 곡 이동" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "최신 순서" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "같지 않음" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "오래된것을 먼저" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "옵션" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "또는 QR 코드를 스캔하세요!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "엔터를 누르세요" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "%n 곡 제거" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "짧은 순서" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "섞인 노래들" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "작은 순서" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "음악 정렬" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "으로 시작" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "중지" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "트랙 %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/lt.po000066400000000000000000005132161260417502300236660ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # FIRST AUTHOR , 2010 # Kiprianas Spiridonovas , 2012 # Liudas Ališauskas , 2012-2014 # Moo, 2014-2015 # pencininkas4 , 2012 # pencininkas4 , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Lithuanian (http://www.transifex.com/davidsansome/clementine/language/lt/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: lt\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nGalite įvertinti grojaraščius spaudžiant žvaigždės piktogramą šalia pavadinimo\n\nĮvertinti grojaraščiai bus išsaugoti čia" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "dienos" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr " s" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " sek." #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " dainos" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 dainos)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 albumų" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 dienų" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "prieš %1 dienų" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 šaltinyje %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 grojaraščiai (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 pažymėta iš" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 daina" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 dainos" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 rasta dainų" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 rasta dainų (rodoma %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 takeliai" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 perkelta" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wii pulto modulis" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 kitų klausytojų" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 viso perklausymų" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%failovardas%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n nepavyko" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n baigta" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n pervadinama" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Lygiuoti tekstą" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Centras" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Pasirinktinas" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "P&apildomai" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Pagalba" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&Slėpti %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Paslėpti..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Kairė" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "Muzika" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Nieko" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "Grojaraštis" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Baigti" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Kartojimo režimas" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Dešinė" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Maišymo veiksena" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Ištempti stulpelius, kad užpildytų langą" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "Įrankiai" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(skirtinga daugelyje dainų)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", pagal " #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...ir visiems prisidėjusiems prie Amarok" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 diena" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 daina" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192,000Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44,100Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48,000Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 atsitiktinių dainų" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96,000Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Naujinti į Premium dabar" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Jei nepažymėta, Clementine bandys išsaugoti jūsų vertinimus ir statistiką kitoje duomenų bazėje ir nekeis jūsų failų.

Jei pažymėta, statistika bus saugoma duomenų bazėje ir pačiame faile.

Turėkite omeny jog tai gali neveikti su kai kuriais formatais, nėra standarto kaip tai daryti, nekurie grotuvai gali nesugebėti perskaityti tų duomenų.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Naudokite lauko pavadinimą kaip priešdelį, norėdami apriboti paiešką to lauko reikšme, pvz., artist:Bode ieškos fonotekoje visų atlikėjų, su žodžiu Bode.

Prieinami laukai: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Tai įrašys dainos įvertinimą ir statistiką į failo žymes visoms jūsų fonotekos dainoms.

Tai nereikalinga jei "Saugoti įvertinimus ir statistiką failo žymėse" pasirinkti visada buvo įjungta.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Atpažinimo ženklas prasideda iš %, pav.: %albumas %pavadinimas

\n\n

Jei bus teksto skyriai, kurie turi atpažinimo ženklą su riestiniais skliausteliais, tas skyrius bus paslėptas, jei atpažinimo ženklas yra tuščias.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Reikalingas mokamas Spotify vartotojas" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Klientas gali prisijungti tik tada jei įvestas teisingas kodas." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Išmanusis grojaraštis yra dinaminis sąrašas sudaromas iš jūsų fonotekos. Išmaniųjų grojaraščių yra keli tipai kurie siūlo skirtingai atrinkti dainas." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Daina bus įtraukta į grojaraštį jei atitiks šias sąlygas" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "Šlovė HYPNOTOAD'ui" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Nutraukti" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Apie %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Apie Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Apie Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Absoliutūs" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Paskyros informacija" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Paskyros informacija (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Veiksmas" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Veiksmas" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Aktyvuoti/Deaktyvuoti Wii pultą" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Aktyvumo srautas" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Pridėti srautą" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Pridėti srautą" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Jeigu pranešimo tipas palaiko, tai pridedama nauja eilutė" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Pridėti veiksmą" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Pridėti visus takelius iš katalogo ir visų jo vidinių katalogų" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Pridėti kitą srautą..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Pridėti nuorodą..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Pridėti failą" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Pridėti failą perkodavimui" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Pridėti failus perkodavimui" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Pridėti failą..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Pridėti failus perkodavimui" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Pridėti aplankalą" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Pridėti aplanką..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Pridėti naują aplankalą..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Pridėti srautą" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Pridėti srautą..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Pridėti paieškos frazę" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Pridėti žymę kūrinio albumui" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Pridėti žymę kūrinio albumui" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Pridėti žymę kūrinio atlikėjui" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Pridėti dainai automatinį įvertinimą" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Pridėti žymę kūrinio kompozitoriui" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Pridėti žymę kūrinio diskui" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Pridėti dainai failo vardą" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Pridėti žymę kūrinio žanrui" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Pridėti dainos grupavimo žymę" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Pridėti žymę kūrinio ilgiui" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Pridėti dainos atlikėjo žymę" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Nustatyi kūrinio perklausymų skaičių" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Pridėti dainos vertinimą" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Nustatyti kūrinio prametimų skaičių" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Pridėti žymę kūrinio pavadinimui" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Pridėti dainą į talpyklą" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Pridėti žymę kūrinio numeriui" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Pridėti žymę kūrionio metams" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Pridėti dainas į Mano Muziką, kai paspaudžiamas mygtukas \"Myliu\"" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Pridėti srautą..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Pridėti į Mano Muziką" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Pridėti į Spotify grojaraščius" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Pridėti į Spotify pažymėtus" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Pridėti prie kito grojaraščio" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Pridėti į adresyną" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Įdėti į grojaraštį" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Įdėti į eilę" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Pridėti vartotoją/grupę į adresyną" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Pridėti Wii pulto veiksmą" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Pridėti..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Pridėta šį mėnesį" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Pridėta šią savaitę" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Pridėta šiais metais" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Pridėta šiandien" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Pridėta tryjų mėnesių tarpe" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Platesnis grupavimas..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Po" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Po kopijavimo..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Albumas" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Albumas (idealus garsumas visoms dainoms)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Albumo atlikėjas" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Albumo viršelis" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Albumo info iš jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Albumai" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Albumai su viršeliais" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Albumai be viršelių" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Visi" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Visi Failai (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "Visa šlovė Hypnotoad'ui!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Visi albumai" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Visi atlikėjai" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Visi failai (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Visi grojaraščiai (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Visi vertėjai" #: library/library.cpp:98 msgid "All tracks" msgstr "Visos dainos" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Leisti klientui atsisiųsti muziką iš šio kompiuterio." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Leisti atsiuntimus" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Įgalinti vidurinį/šoninį kodavimą" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Kartu su originalais" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Visada slėpti pagrindinį langą" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Visada rodyti pagrindinį langą" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Visada pradėti grojant" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon Cloud Diskas" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Kad naudotumėte Spotify Clementine grotuve, jums reikia papildomo išplėtimo. Ar parsiųsti ir įdiegti jį dabar?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Iškilo klaida įkeliant iTunes duomenų bazę" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Klaida rašant meta duomenis į '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Įvyko nežinoma klaida." #: ui/about.cpp:85 msgid "And:" msgstr "Ir:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Piktas" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Išvaizda" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Įterpti failus/URL į grojaraštį" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Įterpti į esamą grojaraštį" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Įterpti į grojaraštį" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Pritaikyti suspaudimą, kad išvengti nukirtimų" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Ar tikrai norite ištrinti \"%1\" šabloną?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Ar tikrai norite atstatyti šios dainos statistiką?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Ar tikrai norite įrašyti dainos statistiką į dainos failą visoms dainoms Jūsų fonotekoje?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Atlikėjas" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Atlikėjo info" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Atlikėjo žymės" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Atlikėjo inicialai" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Klausti išsaugant" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Audio formatas" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Audio išvestis" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Autorizacija nepavyko" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Autorius" #: ui/about.cpp:68 msgid "Authors" msgstr "Autoriai" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Automatiškai" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Automatiniai" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Automatinis atnaujinimas" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Automatiškai atverti pavienias kategorijas fonotekos sąraše" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Galimas" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Vidutinis bitų dažnis" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Vidutinis paveikslo dydis" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "BBC srautas" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Fono srautai" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Fono spalva" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Fono pavaikslėlis" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Fono nepermatomumas" #: core/database.cpp:648 msgid "Backing up database" msgstr "Daroma duomenų bazės atsarginė kopija" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Balansas" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Barograma" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Įprasta mėlyna" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Paprastas audio tipas" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Elgsena" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Geriausias" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Biografija iš %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Bitų greitis" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Bitų dažnis" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Pralaidumas" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Blokograma" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Bloko tipas" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Suliejimo kiekis" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Turinys" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Bumograma" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "„Box“" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Naršyti..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Buferio trukmė" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Kaupiamas buferis" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Kuriamas Seafile indeksas..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Bet šie šaltiniai yra išjungti" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Mygtukai" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "\"CUE sheet\" palaikymas" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Talpyklos vieta:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Talpinama" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "Talpinama %1" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Atšaukti" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Atšaukti atsiuntimą" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Reikalingas saugos kodas.\nKad išspręsti šią problemą, pabandykite prisijungti prie Vk.com per savo naršyklę." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Keisti viršelio paveikslėlį" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Keisti šrifto dydį..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Keisti kartojimo režimą" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Keisti greituką..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Keisti maišymo režimą" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Keisti kalbą" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "Pakeitimai įsigalios, pradėjus groti kitai dainai" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Mono perklausos nustatymų keitimas suveiks kitoms grojamoms dainoms." #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Tikrinti, ar nėra naujų epizodų" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Tikrinti ar yra atnaujinimų" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Atnaujinimų tikrinimas..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Pasirinkite Vk.com talpyklos katalogą" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Parinkite pavadinimą išmaniajam grojaraščiui" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Automatiškai parinkti" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Parinkti spalvą..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Pasirinkite šifrą..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Parinkti iš sąrašo" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Pasirinkite kaip grojaraštis bus rikiuojamas ir kiek dainų turės" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Pasirinkite srauto siutimo vietą" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Pasirinkite internetines paslaugas, kurias norite rodyti." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Parinkite tinklapius, kuriuose „Clementine“ galėtų ieškoti lyrikos." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Klasika" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Valoma" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Išvalyti" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Išvalyti grojaraštį" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "„Clementine“" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "„Clementine“ klaida" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "„Clementine“ Oranžinė" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "„Clementine“ vizualizacija" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Į šį įrenginį „Clementine“ gali automatiškai konvertuoti kopijuojamą muziką formatu, kurį įrenginys palaiko." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Clementine gali groti jūsų, į Amazon Cloud diską įkeltą, muziką" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine gali groti muziką, kurią įkėlėte į „Box“" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine gali groti jūsų, į Dropbox įkeltą, muziką" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine gali groti jūsų, į Google diską įkeltą, muziką" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine gali groti muziką, kurią išsiuntėte į OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "„Clementine“ gali rodyti pranešimą besikeičiant dainoms" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine gali sinchronizuoti jūsų fonoteką su kitais jūsų kompiuteriais ir srauto aplikacijomis. Sukurti sąskaitą." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "„Clementine“ negalėjo įkelti jokios „projectM“ vizualizacijos. Įsitikinkite ar tinkamai įdiegėte „Clementine“." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "„Clementine“ nuotraukų peržiūra" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "„Clementine“ nepavyko rasti rezultatų šiam failui" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine ras muziką:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Paspauskite čia, kad pridėti muziką" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Spauskite, kad pažymėti šį grojaraštį, tam kad jis būtų išsaugotas ir pasiekiamas per „Grojaraščiai“ kortelę kairėje šoninėje juostoje" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Spustelėkite, kad perjungti tarp likusio laiko ir viso laiko" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Spaudžiant prisijungimo mygtuką atsivers interneto naršyklė. Jūs turėtumėte grįžti į Clementine po prisijungimo." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Uždaryti" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Užverti grojaraštį" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Uždaryti vizualizacijas" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Uždarant šį langą bus atšaukti atsisiuntimai." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Uždarant šį langą bus sustabdyta albumo viršelių paieška." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Klubinė" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Spalvos" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Kableliais išskirtas sąrašas iš klasės:lygio, lygis yra nuo 0 iki 3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Komentaras" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Bendruomeninis Radijas" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Užbaigti žymes automatiškai" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Pabaigti žymes automatiškai..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Kompozitorius" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Konfigūruoti %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Konfigūruoti „Magnatune“..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Konfigūruoti sparčiuosius klavišus" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Konfigūruoti Spotify..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Konfigūruoti subsonix" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Konfigūruoti Vk.com..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Nustatyti visuotinę paiešką..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Konfigūruoti fonoteką..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Konfigūruojamas srautas... " #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Konfigūruoti..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Prijungti Wii pultą naudojant aktyvuoti/deaktyvuoti veiksmą" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Prijungti įrenginį" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Jungiamasi prie Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Ryšį serveris atmetė, patikrinkite serverio URL. Pvz.: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Baigėsi prisijungimo laikas, patikrinkite serverio URL. Pavyzdys: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Ryšio problemos arba savininkas išjungė garso įrašą" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Pultas" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Pastovus bitų dažnis" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Konvertuoti visą muziką" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Konvertuoti visą įrenginio nepalaikomą muziką" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Konvertuoti nenuostolingus garso įrašų failus prieš išsiunčiant juos į nuotolinę vietą." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Konvertuoti nenuostolingus failus" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Kopijuoti dalinimosi url į iškarpinę" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Kopijuoti į atmintinę" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Kopijuoti į įrenginį..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Kopijuoti į fonoteką..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Teisės" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Prisijungti prie subsonic nepavyko, patikrinkite serverio URL. Pavyzdys: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Nepavyko sukurti „GStreamer“ elemento \"%1\" - įsitikinkite ar įdiegti visi reikalingi „GStreamer“ plėtiniai" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Nepavyko sukurti grojaraščio" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Nepavyko rasti maišytuvo %1, įsitikinkite ar įdiegti visi reikalingi „GStreamer“ plėtiniai" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Nepavyko rasti koduotuvo %1, įsitikinkite ar įdiegti visi reikalingi „GStreamer“ plėtiniai" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Nepavyko atverti išvesties failo %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Viršelių tvarkytuvė" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Viršelio paveikslėlis iš įdėtos nuotraukos" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Viršelio paveikslėlis įkeltas automatiškai iš %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Viršelio paveikslėlis savarankiškai pašalintas" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Viršelio paveikslėlis nenustatytas" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Viršelio paveikslėlis nustatytas iš %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Viršeliai iš %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Naudoti „Cross-fade“ funkciją kai takeliai keičiami automatiškai" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Naudoti „Cross-fade“ funkciją kai takeliai keičiami savarankiškai" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Pasirinktinis" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Pasirinktinis paveikslėlis" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Specifiniai žinutės nustatymai" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Pasirinktinis..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "„DBus“ kelias" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Šokių" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Aptikta duomenų bazės klaida. Prašome skaityti https://code.google.com/p/clementine-player/wiki/DatabaseCorruption esančias instrukcijas kaip atstatyti Jūsų duomenų bazę" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Sukūrimo data" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Pakeitimo data" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Dienos" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "Numatytas" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Sumažinti garsą per 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Patildyti procentais" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Sumažinti garsą" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Numatytasis fono paveikslėlis" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Numatytas įrenginys esantis %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Numatyti" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Delsa tarp vizualizacijų" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Trinti" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Naikinti atsiųstus duomenis" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Ištrinti failus" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Ištrinti iš įrenginio..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Ištrinti iš disko..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Ištrinti atliktus epizodus" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Ištrinti šabloną" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Ištrinti išmanųjį grojaraštį" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Ištrinti originalius failus" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Trinami failai" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Iš eilės pažymėtus takelius" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Iš eilės takelį" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Kopijuoti į aplanką" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Detalės..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Įrenginys" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Įrenginio savybės" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Įrenginio pavadinimas" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Įrenginio savybės..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Įrenginiai" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Dialogas" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Ar turėjote omenyje" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Digitally Imported slaptažodis" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Digitally Imported naudotojo vardas" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Tiesioginis interneto ryšys" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Aplankas" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Išjungti trukmę" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Išjungti moodbar generavimą" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Išjungta" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Išjungta" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Diskas" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Nevientisa transliacija" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Rodymo nuostatos" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Rodyti OSD" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Pilnai perskenuoti fonoteką" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Atlikti pilną perskenavimą" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Atlikti pilną perskenavimą..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Nekonvertuoti jokios muzikos" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Ne perrašyti" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "Atlikę pilną perskenavimą, prarasite visus meta duomenis, kuriuos išsaugojote Clementine, tokius kaip viršelio paveikslėliai, grojimo skaitiklis ir įvertinimai. Clementine iš naujo perskenuos visą jūsų muziką Google Drive, o tai gali užtrukti kažkiek laiko." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Nekartoti" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Nerodyti įvairiuose atlikėjuose" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Nerodyti klausytų epizodų" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Nemaišyti" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Nesustoti!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Paremti pinigais" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Du kart spustelėkite norėdami atverti" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Du kartus spūstelėjus dainą..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Atsiųsti %n epizodus" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Atsisiuntimų aplankas" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Atsiųsti epizodus į" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Atsiųsti narystę" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Atsisiųsti naujus epizodus automatiškai" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Atsiuntimas eilėje" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Atsisiųsti nustatymus" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Atsisiųsti Android programą" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Atsisiųsti šį albumą" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Atsisiunčiamas šis albumas" #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Atsiųsti šį epizodą" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Atsisiųsti..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Atsiunčiama (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Atsiunčiamas Icecast aplankas" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Atsiunčiamas Jamendo katalogas" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Atsiunčiamas Magnatune katalogas" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Siunčiamas Spotify plėtinys" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Atsiunčiami metaduomenys" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Temkite, kad pakeisti poziciją" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dubstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Trukmė" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Dinaminė veiksena yra įjungta" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Dinaminis atsitiktinis maišymas" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Taisyti išmanųjį grojaraštį..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Redaguoti žymę \"%1\"..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Taisyti žymę..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Taisyti žymes" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Taisyti takelio informaciją" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Taisyti takelio informaciją..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Taisyti takelių informaciją..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Keisti..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "El. paštas" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Įgalinti Wii nuotolinio pulto palaikymą" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Įjungti automatinį talpinimą" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Įjungti glodintuvą" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Įgalinti kombinacijas tik tada kai Clementine yra aktyvus" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Spustelėjimu įjungti tiesioginį dainos meta duomenų redagavimą" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Įjunkite žemiau esančius šaltinius, kad įtraukti juos į paieškos rezultatus. Rezultatai bus rodomi šia tvarka." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Įjungti/Išjungti „Last.fm scrobbling“" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Kodavimo sudėtingumas" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Kodavimo varikliuko kokybė" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Kodavimo režimas" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Įrašykite URL" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Įveskite URL, kad atsisiųsti viršelį iš interneto:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Įrašykite failo vardą eksportuotiems viršeliams (be plėtinio):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Įveskite naują pavadinimą šiam grojaraščiui" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Įrašykite paieškos kriterijus žemiau, kad rasti muziką kompiuteryje ar internete" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Įrašykite paieškos kriterijus žemiau, kad rasti transliacijas itunes parduotuvėje" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Įrašykite paieškos kriterijus žemiau, kad rasti transliacijas gpodder.net svetainėje" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Įveskite paieškos žodžius čia" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Įveskite internetinio radijo srauto URL:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Įveskite naujo aplanko pavadinimą" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Programoje įveskite šį adresą ir prisijungsite prie Clementine." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Visa kolekcija" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Glodintuvas" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Tai atitinka --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Tai atitinka --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Klaida" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Klaida Perrašant CD" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Klaida prijungiant MTP įrenginį" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Klaida kopijuojant dainas" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Klaida trinant dainas" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Klaida siunčiant Spotify plėtinį" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Klaida įkeliant %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Klaida įkeliant di.fm grojaraštį" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Klaida apdorojant %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Klaida įkeliant audio CD" #: library/library.cpp:68 msgid "Ever played" msgstr "Bet kada grota" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Kas 10 minučių" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Kas 12 valandų" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Kas 2 valandas" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Kas 20 minučių" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Kas 30 minučių" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Kas 6 valandas" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Kiekvieną valandą" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Išskyrus tarp takelių tame pačiame albume arba tame pačiame CUE lape" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Esantys viršeliai" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Išplėsti" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Baigsis galiojimas %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Eksportuoti viršelius" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Eksportuoti viršelius" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Eksportuoti atsisiųstus viršelius" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Eksportuoti įterptus viršelius" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Eksportavimas baigtas" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Eksportuota %1 viršelių iš %2 (%3 praleista)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Laipsniškai tildyti pristabdant / garsinti tęsiant" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Palaipsniui nutilti kai stabdomas takelis" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Pradingimas" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Suliejimo trukmė" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Nepavyko perskaityti CD disko" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Nepavyko atsiųsti direktorijos" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Nepavyko atsiųsti garso prenumeratos" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Nepavyko įkelti garso prenumeratos" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Nepavyko apdoroti XML šiam RSS srautui" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Greitai" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Megstami takeliai" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Gauti trūkstamus albumų viršelius" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Gauti automatiškai" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Parsiuntimas baigtas" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Gaunama Subsonic biblioteka" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Viršelio atsiuntimo klaida" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Failo Formatas" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Failo plėtinys" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Failų formatai" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Failo vardas" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Failo vardas (be kelio)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Failo pavadinimo šablonas:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Failų keliai" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Failo dydis" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Failo tipas" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Failopavadinimas" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Failai" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Failai perkodavimui" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Rasti fonotekoje dainas, kurios atitinka jūsų nurodytus kriterijus." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Rasti šį atlikėją" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Skenuojama daina" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Baigti" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Pirmas lygis" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Pritaikyti viršelį prie pločio" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Šrifto dydis" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Dėl licencijavimo priežasčių Spotify palaikymas yra įjungiamas per atskirą plėtinį." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Įjungti tik mono kodavimą" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Pamiršti įrenginį" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Pamirštant, įrenginys bus pašalintas iš šio sąrašo ir Clementine turės vėl skenuoti visas dainas kai kitą kartą prijungsite šį įrenginį." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Forma" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Formatas" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Kadrų dažnis" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Kadrai per buferį" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Užšaldyta" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Visi žemi tonai" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Visi žemi ir aukšti tonai" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Visi aukšti tonai" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Bendri" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Pagrindiniai nustatymai" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Žanras" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Gauti URL, kad dalintis šia Spotify daina" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Gauti URL, kad dalintis šiuo grojaraščiu" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "gaunami kanalai" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Gaunami srautai" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Suteikti pavadinimą" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Eiti" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Eiti į sekančią grojaraščių kortelę" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Eiti į praeitą grojarasčių kortelę" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google diskas" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "VaizdasGauta %1 viršelių iš %2 (%3 nepavyko)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Pažymėti pilkai neegzistuojančias dainas mano grojaraštyje" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Grupuoti fonoteką pagal..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Grupuoti pagal" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Grupuoti pagal Albumą" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Grupuoti pagal Atlikėją" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Grupuoti pagal Atlikėją/Albumą" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Grupuoti pagal Atlikėją/Metus - Albumą" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Grupuoti pagal Žanrą/Albumą" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Grupuoti pagal Žanrą/Atlikėją/Albumą" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Grupavimas" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "HTML puslapis neturėjo jokio RSS srauto" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "HTTP 3xx būsenos kodas gautas be URL, patikrinkite serverio konfigūraciją." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "HTTP įgaliotasis serveris" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Laimingas" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Įrangos informacija" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Aparatūros informacija prieinama tik kai įrenginys yra prijungtas." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Aukšta" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Aukšta (%1 kps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Aukšta (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "HipHop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Mazgas nerastas, patikrinkite serverio URL. Pavyzdys: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Valandos" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnotoad'as" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Aš neturiu Magnatune paskyros" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Piktograma" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Piktogramos viršuje" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Nustatoma daina" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Jei aktyvuota, spustelėjimas ant dainos grojarašyje, leis jums tiesiogiai redaguoti žymių reikšmes" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Jei tęsite, šis įrenginys dirbs lėtai ir nukopijuotos dainos gali nedirbti." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Jei žinote garso prenumeratos URL, įveskite jį ir spauskite „Eiti“." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Nepaisyti \"The\" atlikėjų varduose" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Paveikslai (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Paveikslai (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Importuoti..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "Po %1 d." #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "Po %1 sav." #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "Dinamiškame režime nauji kūriniais bus parinkti ir pridėti į grojaraštį kaskart, kai dabar grojamas kūrinys baigsis." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Gautieji" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Rodyti albumo paveikslus pranešime" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Įtraukti visas dainas" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Nesuderinama Subsonic REST protokolo versija. Reikia atnaujinti klientą." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Nesuderinama Subsonic REST protokolo versija. Serveris turi atsinaujinti." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Nepilna konfigūracija, įsitikinkite kad visi laukai užpildyti." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Pagarsinti 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Pagarsinti procentais" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Pagarsinti" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Indeksuojama %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Informacija" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Įvesties parinktys" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Įterpti..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Įdiegta" #: core/database.cpp:585 msgid "Integrity check" msgstr "Vientisumo tikrinimas" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internetas" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Interneto tiekėjai" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Internetinės paslaugos" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "Įžangos takeliai" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Netinkamas API raktas" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Netinkamas formatas" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Netinkamas metodas" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Netinkami parametrai" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Nurodytas netinkamas šaltinis" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Netinkama paslauga" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Netinkamas sesijos raktas" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Invertuoti Pasirinkimą" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Jamendo Daugiausia klausyti takeliai" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Jamendo Top takeliai" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo mėnesio Top takeliai" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo savaitės Top takelia" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Jamendo duomenų bazė" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Iš karto perjungiama į ankstesnį takelį" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Peršokti prie dabar grojamo takelio" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Laikykite mygtukus %1 sek." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Laikyti mygtukus %1 sekundžių..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Veikti fone kai langas uždaromas" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Palikti originialius failus" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Kačiukai" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Kalba" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Nešiojamojo kompiuterio kolonėlės/ausinės" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Didelė salė" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Didelis albumo viršelio paveikslėlis" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Dideli albumų viršeliai (išsamiau žr. žemiau)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Didelis albumo viršelis (be detalių)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Didelė juosta" #: library/library.cpp:80 msgid "Last played" msgstr "Vėliausiai grota" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Paskiausiai grota" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm šiuo metu užimtas, prašome pamėginti po kelių minučių" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Last.fm slaptažodis" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Last.fm grojimų skaitliukas" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Last.fm žymės" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Last.fm naudotojo vardas" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Mažiausiai populiarūs takeliai" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Kairė" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Trukmė" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Fonoteka" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Sudėtingesnis fonotekos grupavimas" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Fonotekos perskenavimo žinutė" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Fonotekos paieška" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Apribojimai" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Gyvai" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Įkelti" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Įkelti viršelį iš URL" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Įkelti viršelį iš URL..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Įkelti viršelį iš disko" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Įkelti viršelį iš disko..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Įkelti grojaraštį" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Įkelti grojaraštį..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Įkeliamas MTP įrenginys" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Įkeliama iPod duomenų bazė" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Įkeliamas išmanusis grojaraštis" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Keliamos dainos" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Įkeliamas srautas" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Įkeliami takeliai" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Užkraunama kūrinio informacija" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Įkeliama..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Įkelia failus/URL, pakeičiant esamą sąrašą" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Prisijungti" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Prisijungimas nepavyko" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Atsijungti" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Ilgalaikio nuspėjimo profilis (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Myliu" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Žema (%1 kps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Žema (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Žemo sudėtingumo profilis (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Dainų žodžiai" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Žodžiai iš %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Dainos žodžiai iš ID3v2 žymės" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Magnatune atsiuntimas" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Magnatune atsiuntimas baigtas" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Pagrindinis profilis" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Padaryti tai taip!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Padaryti tai taip!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Padaryti šį grojaraštį prieinamą atsijungus" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Netinkamas atsakymas" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Rankinis tarpinės stoties konfigūravimas" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Rankiniu būdu" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Gamintojas" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Pažymėti kaip klausytą" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Pažymėti kaip naują" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Atitikti kiekvieną paieškos frazę (IR)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Atitinka vieną ar daugiau paieškos frazių (ARBA)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Maksimalus visuotinės paieškos rezultatų skaičius" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Maksimalus bitrate" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Media pasikeitė. Įkeliama iš naujo" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Vidutinė (%1 kps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Vidutinė (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Narystės tipas" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Minimalus bitrate" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Minimalus buferio užpildas" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Trūksta projectM šablonų" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Modelis" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Stebėti fonoteką dėl pasikeitimų" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Mono grojimas" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Mėnesiai" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Nuotaika" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Nuotaikos juostos stilius" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Nuotaikos juostos" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Daugiau" #: library/library.cpp:84 msgid "Most played" msgstr "Dažniausiai grota" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Prijungimo vieta" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Prijungimo vietos" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Perkelti žemyn" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Perkelti į fonoteką" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Perkelti aukštyn" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Muzika" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Fonoteka" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Nutildyti" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Mano Albumai" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Mano muzika" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Mano rekomendacijos" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Veiksmas" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Pavadinimas" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Pavadinimų nustatymai" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Siauras dažnis (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Tinklo įgaliotasis serveris" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Nutolęs tinklas" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Naujesni" #: library/library.cpp:74 msgid "Never played" msgstr "Niekada negrota" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Niekada nepradėti groti" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Naujas aplankas" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Naujas grojaraštis" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Naujas išmanusis grojaraštis..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Naujos dainos" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Nauji takeliai bus pridėti automatiškai." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Naujausi takeliai" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Toliau" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Kitas takelis" #: core/utilities.cpp:151 msgid "Next week" msgstr "Kitą savaitę" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Jokio analizatoriaus" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Išjungti fono paveikslėlį" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Nėra eksportuotinų viršelių." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Jokių ilgų blokų" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Nieko nerasta. Išvalykite paieškos laukelį, kad vėl matyti visą sąrašą." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Jokių trumpų blokų" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Nėra" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Nei viena iš pažymėtų dainų netinka kopijavimui į įrenginį" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Normalus" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Normalus bloko tipas" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Negalimas naudojant dinaminį grojaraštį" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Neprisijungus" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Nepakanka turinio" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Nepakanka gerbėjų" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Nepakanka narių" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Nepakanka kaimynų" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Neįdiegta" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Neprisijungęs" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Neprijungtas - du kartus spragtelėkite, kad prijungti" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Nieko nerasta" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Pranešimo tipas" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Pranešimai" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Dabar leidžiama" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Rodytinų epizodų skaičius" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "OSD peržiūra" #: widgets/osd.cpp:173 msgid "Off" msgstr "Išjungta" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "Įjungta" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Priimti tik klientus iš šio IP ruožo:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Leisti tik ryšius iš vietinio tinklo" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Rodyti tik pirmą" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Permatomumas" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Atverti %1 naršyklėje" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Atverti &audio CD..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Atverti OPML failą" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Atverti OPML failą..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Atidaryti katalogą, iš kurio importuoti muziką" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Atverti įrenginį" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Atverti failą..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Atverti Google diske" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Atverti naujame grojaraštyje" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Atidaryti naujame grojaraštyje" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Atidaryti naršyklėje" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Atverti..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Operacija nepavyko" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Optimizuoti pralaidumui" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Optimizuoti kokybei" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Pasirinktys..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Tvarkyti failus" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Tvarkyti failus..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Tvarkomi failai" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Originalios žymės" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Kitos parinktys" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Išvestis" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Išvesties įrenginys" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Išvesties parinktys" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Perrašyti viską" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Perrašyti egzistuojančius failus" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Perrašyti tik mažesnius" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Savininkas" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Apdorojamas Jamendo katalogas" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Vakarėlis" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Slaptažodis" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Pristabdyti" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Sulaikyti grojimą" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Pristabdyta" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Atlikėjas" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Pikselis" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Paprasta juosta" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Groti" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Grojimo skaitiklis" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Groti jei sustabdyta, Pristabdyti jei grojama" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Groti jei jau kas nors negroja" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Groti takelį grojaraštyje" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Groti/Pristabdyti" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Grojimas" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Leistuvo parinktys" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Grojaraštis" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Grojaraštis baigtas" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Grojaraščio parinktys" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Grojaraščio tipas" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Grojaraščiai" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Prašome uždaryti Jūsų naršyklę, kad grįžti į Clementine." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Plėtinio būklė:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcast" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Pranešino rodymo trukmė" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Prievadas" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Sustiprinti" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Nustatymas" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Nustatymai" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Nustatymai..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Pageidaujamas viršelio paveikslėlio failo pavadinimas (atskirta kableliais)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Pageidaujamas audio formatas" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Pageidautinas pralaidumas" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Pageidaujamas formatas" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Premium audio tipas" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Šablonas:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Spauskite mygtukų kombinaciją panaudojimui" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Paspauskite klavišą" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Spauskite mygtukų kombinaciją panaudojimui %1..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Spaudžiant grotuve mygtuką \"Ankstesnis Takelis\" bus..." #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Gražus OSD" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Peržiūra" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Atgal" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Ankstesnis takelis" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Išvesti versijos informaciją" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Profilis" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Progresas" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Eiga" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psichodelinis" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Spauskite Wii pulto mygtuką" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Dėti dainas atsitiktine tvarka" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Kokybė" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Kokybė" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Pateikiama užklausa įrenginiui..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Eilės tvarkytuvė" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "į eilę pažymėtus takelius" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "į eilę takelį" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Radijas (vienodas garsumas visiems takeliams)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Lietus" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Lietus" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Atsitiktinis vaizdinys" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Įvertinti šią dainą 0 žvaigždžių" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Įvertinti šią dainą 1 žvaigžde" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Įvertinti šią dainą 2 žvaigždėmis" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Įvertinti šią dainą 3 žvaigždėmis" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Įvertinti šią dainą 4 žvaigždėmis" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Įvertinti šią dainą 5 žvaigždėmis" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Įvertinimas" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Tikrai atšaukti?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Pasiekta nukreipimo riba, patikrinkite serverio konfigūraciją." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Atnaujinti katalogus" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Atnaujinti kanalus" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Atnaujinti stočių sąrašą" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Atnaujinti srautus" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Regis" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Susijęs" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Prisiminti Wii pulto pasukimą" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Prisiminti paskutinio karto būseną" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Įsiminti mano pasirinkimą" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Pašalinti" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Pašalinti veiksmą" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Pašalinti dublikatus iš grojaraščio" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Pašalinti aplanką" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Pašalinti iš Mano muzika" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Pašalinti iš adresyno" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Ištrinti iš grojaraščio" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Pašalinti grojaraštį" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Pašalinti grojaraščius" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Pašalinti neprieinamus takelius iš grojaraščio" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Pervadinti grojaraštį" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Pervadinti grojaraštį..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Pernumeruoti takelius šia tvarka..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Kartoti" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Kartoti albumą" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Kartoti grojaraštį" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Kartoti takelį" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Pakeisti esamą griojaraštį" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Pakeisti grojaraštį" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Pakeisti tarpus pabraukimo simboliais" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Garsumo suvienodinimas" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Garsumo suvienodinimo veiksena" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Užpildyti naujai" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Reikalauti atpažinimo kodo" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Atstatyti" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Atstatyti perklausų skaičių" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Iš naujo grojama daina, o jei nuspaudžiama dar kartą, perjungiama į ankstesnį takelį" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Paleisti takelį, arba groti ankstesnį per 8 sekundes po paleidimo." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Naudoti tik SCII simbolius" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Paleidžiant pratęsti atkūrimą" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Grįžti į Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Dešinė" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Perrašyti" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Perrašyti CD" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Perrašyti garso įrašų CD" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rokas" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Vykdyti" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "SOCKS įgaliotasis serveris" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "SSL komunikacijos klaida, patikrinkite serverio konfigūraciją. SSLv3 nustatymas žemiau gali padėti išspręsti kai kurias problemas." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Saugiai pašalinti įrenginį" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Saugiai pašalinti įrenginį po kopijavimo" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Išrankos dažnis" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Išrankosdažnis" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Saugoti .mood failus Jūsų fonotekoje" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Išsaugoti albumo viršelį" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Išsaugoti albumo viršelį į diską..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Išsaugoti paveikslėlį" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Išsaugoti grojaraštį" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Išsaugoti grojaraštį" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Įrašyti grojaraštį..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Išsaugoti šabloną" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Jei įmanoma, įvertinimus ir failo žymes saugoti" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Jei įmanoma, statistiką saugoti failo žymėse" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Išsaugoti šį srautą interneto kortelėje" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Dainų statistika saugoma dainų failuose" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Išsaugomi takeliai" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Besikeičiantis kodavimo dažnio profilis (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Keisti dydį" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Įvertinimas" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Pateikti klausomų takelių informaciją" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Ieškoti" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Paieška" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Ieškoti Icecast stočių" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Ieškoti Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Ieškoti Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Ieškoti subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Ieškoti automatiškai" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Ieškoti albumo viršelių..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Ieškoti bet ko" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Ieškoti gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Ieškoti iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Paieškos veiksena" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Paieškos parinktys" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Paieškos rezultatai" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Paieškos terminai" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Antras lygis" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Sukti atgal" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Sukti į priekį" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Rasti dabar grojamą takelį pagal santykinį kiekį" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Rasti dabar grojamą takelį į absoliučiąją poziciją" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Pažymėti visus" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "N" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Pasirinkite fono spalvą:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Pasirinkti fono paveikslėlį" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Pažymėti geriausią galimą atitikimą" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Pasirinkite priekinio plano spalvą:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Pasirinkti vaizdinius" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Parinkti vaizdinius" #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Pasirinkti..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Serijos numeris" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Serveris" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "Serverio URL" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Serverio detalės" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Servisas nepasiekiamas" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Nustatyti %1 į \"%2\"..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Nustatyti garsumą iki procentų" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Nustatyti vertę visiems pažymėtiems takeliams..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Nustatymai" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Kombinacija" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Kombinacija veiksmui: %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Kombinacija veiksmui %1 jau egzistuoja" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Rodyti" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Rodyti OSD" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Švytėjimo efektas ant dabar grojamo takelio" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Rodyti nuotaikos juostą progreso slankiklyje" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Rodyti numatytą darbastalio pranešimą" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Rodyti pranešimą kai aš keičiu kartojimo/išmėtymo veikseną" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Rodyti pranešimą kai keičiu garsumą" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Rodyti pranešimą, kai aš pristabdau grojimą" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Rodyti iššokantį langą iš sistemos dėklo" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Rodyti gražų OSD" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Rodyti virš būsenos juostos" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Rodyti visas dainas" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Rodyti visas dainas" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Rodyti albumo viršelius fonotekoje" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Rodyti skirtukus" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Rodyti viso dydžio..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Rodyti grupes visuotinės paieškos rezultatuose" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Rodyti failų naršyklėje..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Rodyti fonotekoje..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Rodyti įvairiuose atlikėjuose" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Rodyti nuotaikos juostą" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Rodyti tik duplikatus" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Rodyti tik be žymių" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Rodyti grojamą dainą jūsų puslapyje" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Rodyti paieškos pasiūlymus" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Rodyti mygtuką \"myliu\"" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Rodyti „scrobble“ mygtuką pagrindiniame lange" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Rodyti piktogramą sistemos dėkle" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Rodyti kurie šaltiniai yra įjungti ar išjungti" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Rodyti/Slėpti" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Maišyti" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Maišyti albumus" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Maišyti viską" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Maišyti grojaraštį" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Maišyti takelius šiame albume" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Prisijungti" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Atsijungti" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Jungiamasi..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Panašūs atlikėjai" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Dydis" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Dydis:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Ankstesnis kūrinys grojaraštyje" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Praleisti skaičiavimą" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Kitas grojaraščio kūrinys" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Praleisti pasirinktus takelius" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Praleisti takelį" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Mažas albumo viršelio paveikslėlis" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Maža juosta" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Išmanusis grojaraštis" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Išmanūs grojaraščiai" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Rami" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Ramus rokas" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Dainos informacija" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Dainos info" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonograma" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Atleiskite" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Rikiuoti pagal žanrą (alfabetiškai)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Rikiuoti pagal žanrą (pagal populiarumą)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Rikiuoti stoties pavadinimą" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Rikiuoti dainas pagal" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Rikiavimas" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Šaltinis" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Šaltiniai" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Spotify prisijungimo klaida" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "Spotify grojaraščio URL" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Spotify plėtinys" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Spotify plėtinys neįdiegtas" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "Spotify dainos URL" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Standartinis" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Su žvaigždute" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Pradėti perrašymą" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Pradėti grajaraštį nuo dabar grojančio" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Perkoduoti" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Pradėkite rašyti paieškos laukelyje žemiau, kad užpildyti šį paieškos rezultatų sąrašą" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Paleidžiama %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Pradedama..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Stabdyti" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Stabdyti po" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Stabdyti po kiekvieno takelio" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Stabdyti po kiekvieno takelio" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Sustabdyti po šio takelio" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Stabdyti grojimą" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Sustoti po grojamo takelio" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Stabdyti grojimą po takelio: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Sustabdyta" #: core/song.cpp:431 msgid "Stream" msgstr "Srautas" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Po 30 dienų bandomojo laikotarpio, transliuoti iš subsonic serverio reikia licencijos." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Transliavimo narystė" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Prenumeratoriai" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Pavyko!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "Sėkmingai įrašyta %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Siūlomos žymės" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Santrauka" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Super aukšta (%1 kps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Super aukšta (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Palaikomi formatai" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Sinchronizuoti statistiką į failus dabar" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Atnaujinama Spotify dėžutė" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Atnaujinama Spotify grojaraštis" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Atnaujinama Spotify pažymėti kūriniai" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Sistemos spalvos" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Kortelės viršuje" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Žymių gavėjas" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Numatomas bitrate" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Teksto nustatymai" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Dėkojame" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Komanda \"%1\" negalėjo būti paleista." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Viršelis iš šiuo metu atliekamos dainos albumo" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "Aplankas %1 yra netinkamas" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "Antroji reikšmė turi būti didesnė nei pirmoji!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Puslapis, kurio prašėte neegzistuoja" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Puslapis, kurio prašėte nėra paveikslas" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Bandomasis subsonic laikotarpis baigėsi. Paaukokite ir gaukite licenciją. Norėdami sužinoti daugiau aplankykite subsonic.org." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Clementine versija, į kurią atsinaujinote reikalauja pilno fonotekos perskenavimo dėl savybių išdėstytų žemiau:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Čia yra kitų dainų iš šio albumo" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Problema jungiantis su gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Įvyko klaida gaunant meta duomenis iš Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Problema apdorojant iTunes parduotuvės atsakymą" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Iškilo problemų kopijuojant failus. Šie failai negalėjo būti nukopijuoti:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Iškilo problemų trinant dainas. Šie failai negalėjo būti ištrinti:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Šie failai bus ištrinti iš įrenginio, ar tikrai norite tęsti?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Šie failai bus ištrinti iš disko, ar tikrai norite tęsti?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Šie aplankai bus skenuojami formuojant fonoteką" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Šie nustatymai yra naudojami \"Muzikos perkodavimas\" lange, o taip pat konvertuojant muziką, prieš kopijuojant ją į įrenginį." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Trečias lygis" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Šis veiksmas sukurs duomenų bazę, kuri gali būti 150 MB dydžio.\nAr vistiek norite tęsti?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Albumas yra negalimas prašomu formatu" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Vėliau tai gali būti pakeista per nustatymus" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Įrenginys privalo būti prijungtas ir atidarytas, kad Clementine matytų kokius formatus jis palaiko." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Šis įrenginys palaiko šiuos formatus:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Šis įrenginys neveiks tinkamai" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Tai yra MTP įrenginys, bet jūs sukompiliavę Clementine be libmtp palaikymo." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Tai yra iPod įrenginys, bet jūs sukompiliavę Clementine be libgpod palaikymo." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Tai pirmas kartas kai prijungėte šį įrenginį. Clementine dabar nuskenuos įrenginį, kad rastų muzikinius failus - tai gali šiek tiek užtrukti." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Ši pasirinktis gali būti pakeista „Elgsena“ dalyje" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Šis srautas yra tik apmokamiems prenumeratoriams" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Šio tipo įrenginys yra nepalaikomas: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Pavadinimas" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Šiandien" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Išjungti gražųjį OSD" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Visame ekrane" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Perjungti eilės statusą" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Perjungti „scrobbling“ būseną" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Keisti ekrano pranešimų (OSD) matomumą" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Rytoj" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Per daug peradresavimų." #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Top takeliai" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Viso albumų:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Viso baitų perkelta" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Viso tinklo užklausų padaryta" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Takelis" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Takeliai" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Perkoduoti muziką" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Perkodavimo logas" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Perkoduojama" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Perkoduojami %1 failai naudojant %2 gijų" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Perkodavimo pasirinktys" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbina" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Išjungti" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Ultra platus dažnis (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Nepavyko prisijungti" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Nepavyko atsiųsti %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Nežinomas" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Nežinomas turinio tipas" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Nežinoma klaida" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Pašalinti viršelį" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Nepraleisti pasirinktų takelių" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Nepraleisti takelio" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Nebeprenumeruoti" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Artėjantys koncertai" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Atnaujinti" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Atnaujinti visas garso prenumeratas" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Atnaujinti pakeistus fonotekos katalogus" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Atnaujinti fonoteką paleidžiant Clementine" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Atnaujinti šią garso prenumeratą" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Atnaujinama" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Atnaujinama %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Atnaujinama %1..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Atnaujinama biblioteka" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Naudojimas" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Naudoti albumo artisto žymę, jei galima" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Naudoti Gnome klavišų kombinacijas" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Naudoti psichodelines spalvas" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Naudoti garsumo suvienodinimo meta duomenimis jei tai yra prieinama" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Naudoti SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Naudoti Wii valdymo pultą" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Naudoti pasirinktų spalvų rinkinį" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Naudoti savo žinutę pranešimams" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Naudoti tinklo nuotolinį valdymą" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Naudoti tapatybės patvirtinimą" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Naudoti bitrate valdymo varikliuklą" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Naudoti dinaminę veikseną" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Naudoti pranešimus Wii pulto būsenos rodymui" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Naudoti laikinąjį triukšmų formavimą" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Naudoti sistemos numatytus" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Naudoti sistemos numatytą spalvų rinkinį" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Naudoti sistemos tarpinio serverio nustatymus" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Naudoti garso normalizavimą" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Panaudota" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Naudotojo sąsaja" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Naudotojo vardas" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Naudojant meniu pridėti dainai..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Kintamas bitrate" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Įvairūs atlikėjai" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Versija %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Rodymas" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Vaizdinio veiksena" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Vaizdiniai" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Vaizdinio nustatymai" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Balso aktyvumo aptikimas" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Garsumas %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Siena" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Perspėti mane, kai uždaroma grojaraščio kortelė." #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Svetainė" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Savaitės" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Kai Clementine paleidžiamas" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Ieškant albumo viršelių Clementine pirmiausia ieško paveikslėlių failų, kuriuose yra vienas iš šių žodžių.\nJei nėra atitikmens tada bus naudojamas didžiausias paveikslas kataloge." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "Išsaugant grojaraštį, failų keliai turėtų būti" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Kai sąrašas yra tuščias..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Kodėl nepabandžius..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Platus dažnis (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii pultas %1: aktyvuotas" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii pultas %1: prijungtas" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii pultas %1: kritinė baterija (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii pultas %1: dezaktyvuotas" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii pultas %1: atjungtas" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii pultas %1: išsekusi baterija (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media Audio" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Be viršelių:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Ar norėtumėte perkelti kitas dainas į šio atlikėjo albumą?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Ar norite paleisti pilną perskenavimą dabar?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Rašyti visą dainų statistiką į dainų failus" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Įrašyti meta duomenis" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Netinkamas naudotojo vardas ar slaptažodis." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Metai" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Metai - Albumas" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Metai" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Vakar" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Jūs ketinate atsisiųsti šiuos albumus" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Jūs ruošiatės pašalinti %1 grojaraščius iš savo mėgstamiausių, ar esate tikri?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Jūs ketinate pašalinti grojaraštį, kuris nėra jūsų mėgstamuose grojaraščiuose: grojaraštis bus pašalintas (šis veiksmas neatstatomas).\nAr tikrai norite tęsti?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Jūs nesate prisijungęs." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Jūs esate prisijungęs kaip %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Jūs esate prisijungęs." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Galite nustatyti kaip organizuoti dainas fonotekoje" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Jūs galite klausytis nemokamai be paskyros, bet Premium nariai gali klausyti aukštesnės kokybės srautų be reklamų." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Galite klausyti Magnatune dainų nemokamai be abonento. Nupirkta narystė pašalina žinutes iš kiekvieno takelio pabaigos." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Galite klausyti foninių garsų kartu su kita muzika." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Galite naudoti Wii pultą nuotoliniam Clementine valdymui. Daugiau informacijos apie Wii pulto panaudojimą galite rasti Clementine wiki puslapyje.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Jūs neturite Spotify Premium paskyros." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Jūs neturite aktyvios prenumeratos" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "Jums nebūtina prisijungti, norint ieškoti ir klausytis muzikos sistemoje SoundCloud. Tačiau, norėdami pasiekti savo grojaraščius ir savo srautą, privalote prisijungti." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Jūs atsijungėte iš Spotify, prašome įvesti savo slaptažodį nustatymų dialogo lange dar kartą. " #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Jūs atsijungėte iš Spotify, prašome įvesti savo slaptažodį dar kartą." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Jūs mylite šį takelį" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "Norėdami visuotinai naudoti Clementine sparčiuosius klavišus, privalote paleisti Sistemos Nuostatas ir leisti Clementine \"valdyti jūsų kompiuterį\"." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Reikės paleisti iš naujo Clementine, kad pasikeistų kalba." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Jūsų IP adresas:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Jūsų Last.fm duomenys buvo neteisingi" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Jūsų Magnatune prisijungimo duomenys buvo neteisingi" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Jūsų fonoteka yra tuščia!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Tavo radijo srautai" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Jūsų pateikta informacija: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Jūsų sistemoje nėra OpenGL palaikymo, vizualizacijos negalimos." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Jūsų naudotojo vardas arba slaptažodis yra neteisingi." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Nulis" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "pridėti %n dainų" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "po" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "prieš" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "ir" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "automatinis" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "anksčiau" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "tarp" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "Didžiausi pirmiausia" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "dpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "susideda iš" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "išjungta" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "diskas %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "neturi" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "baigiasi iš" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "lygus" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "gpodder.net direktorija" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "daugiau nei" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "Šiuo metu iPod ir USB įrenginiai Windows operacinėje sistemoje neveikia. Atsiprašome!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "per paskutines" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "mažiau nei" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "Ilgiausi pirmiausia" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "perkelti %n dainų" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "naujausi pirmiausia" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "nelygu" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "ne per paskutines" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "ne esantis" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "seniausi pirmiausia" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "iš" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "parinktys" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "arba nuskenuokite QR kodą!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "paspauskite enter" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "pašalinti %n dainas" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "trumpiausi pirmiausia" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "Maišyti dainas" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "mažiausi pirmiausia" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "Rikiuoti dainas" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "prasideda iš" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "stabdyti" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "takelis %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/lv.po000066400000000000000000004576601260417502300237020ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # FIRST AUTHOR , 2011 # Gatis Kalniņš <>, 2014 # Kristaps, 2012 # uGGa , 2011 # Uģis , 2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Latvian (http://www.transifex.com/davidsansome/clementine/language/lv/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: lv\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "dienām" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kb/s" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " punkti" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " sekundes" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " dziesmas" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 albumi" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 dienas" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 dienas atpakaļ" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 dziesmu listes (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 izvēlēti no" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 dziesma" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 dziesmas" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "atrastas %1 dziesmas" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "atrastas %1 dziesmas (redzamas %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 dziesmas" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev modulis" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 citu klausītāju" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n neizdevās" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n pabeigti" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n atlicis" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&līdzināt tekstu" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Centrs" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Izvēles" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "Ekstras" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Palīdzība" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&Paslēpt %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "%Paslēpt..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "Pa &kreisi" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "Mūzika" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Nav" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "Dziesmu liste" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Iziet" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Atkārtošanas režīms" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Pa labi" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Jaukšanas režīms" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&mainīt stabu lielumu" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Rīki" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(dažādām dziesmām atšķiras)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "... un visiem Amarok atbalstītājiem" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 diena" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 dziesma" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 nejaušas dziesmas" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Elementi sākas ar %, piemēram: %artist %album %title

\n\n

Ja jūs teksta daļas iekļausiet figūriekavās, tās tiks paslēptas, ja elementi būs tukši.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Nepieciešams Spotify Premium konts." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Smart Playlist ir aktīva dziesmu liste no jūsu bibliotēkas. Ir vairāku veidu Smart Playlist, kas piedāvā dažādus dziesmu izvēles veidus." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Dziesma tiks iekļauta dziesmu listē, ja tā atbildīs šiem nosacījumiem." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "Hypnotoad krupis no Futurama" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Par %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Par Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Par Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Konta informācija" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Darbība" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Aktivizēt/deaktivizēt Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Pievienot podraidi" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Pievienot straumi" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Pievienot darbību" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Pievienot citu straumi..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Pievienot mapi..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Pievienot datni" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Pievienot failu..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Pievienot failus pārkodēšanai" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Pievienot mapi" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Pievienot mapi..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Pievienot jaunu mapi..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Pievienot podraidi" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Pievienot podraidi..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Pievienot meklēšanas vienumu" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Pievienot dziesmas albuma birku" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Pievienot dziesmas albuma mākslinieka birku" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Pievienot dziesmas mākslinieka birku" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Pievienot dziesmas komponista birku" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Pievienot dziesmas diska birku" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Pievienot dziesmas žanra birku" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Pievienot dziesmas ilguma birku" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Pievienot dziesmas nosaukumu birku" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Pievienot dziesmas numura birku" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Pievienot dziesmas gada birku" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Pievienot straumi..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Pievienot citai dziesmu listei" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Pievienot dziesmu listei" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Pievienot rindai" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Pievienot wiimotedev darbību" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Pievienot..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Pievienots šomēnes" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Pievienots šonedēļ" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Pievienots šogad" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Pievienots šodien" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Pievienots pēdējos 3 mēnešos" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Advancēta grupēšana..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Pēc" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Pēc kopēšanas..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Albums" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Albums (ideāls skaļums visiem celiņiem)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Albuma izpildītājs" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Albuma vāks" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Albuma info iekš jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Albumi ar vāka attēlu" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Albumi bez vāka attēla" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Visi faili (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Visi albumi" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Visi izpildītāji" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Visi faili (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Visas dziesmu listes (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Visi tulkotāji" #: library/library.cpp:98 msgid "All tracks" msgstr "Visas dziesmas" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Atļaut lejupielādes" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Atļaut centrs/sāni kodēšanu" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Blakus oriģināliem" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Vienmēr slēpt galveno logu" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Vienmēr rādīt galveno logu" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Vienmēr sākt atskaņošanu" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Lai lietotu Spotify, nepieciešams papildus spraudnis. Vai jūs vēlaties to lejupielādēt un instalēt?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Kļūda ielādējot iTunes datubāzi" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Kļūda ievadot matadatus '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:85 msgid "And:" msgstr "Un:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Dusmīgs" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Izskats" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Pievienot failus/saites dziesmu listei" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Papildināt pašreizējo dziesmu listi" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Papildināt dziesmu listi" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Saspiest, lai izvairītos no izgriešanas" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Vai esat pārliecināts, ka vēlaties izdzēst \"%1\"?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Vai esat pārliecināt, ka vēlaties no jauna uzsākt dziesmas statistiku?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Izpildītājs" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Izpildītāja info" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Izpildītāja birkas" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Izpildītājā iciāļi" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Audio formāts" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Autentifikācija neizdevās" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Autors" #: ui/about.cpp:68 msgid "Authors" msgstr "Autori" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Automātiski" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Automātiskā atjaunināšana" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Meklējot automātiski atvērt kategorijas biblotēkas sarakstā" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Pieejams" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Vidējais bitu pārraides ātrums" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Vidējais attēlu izmērs" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "BBC podraides" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "Sitieni minūtē" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Fona Straumes" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Fona krāsa" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Fona attēls" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Fona caurlaidība" #: core/database.cpp:648 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Balanss" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Gabalveida analizators" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Pamata zils" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Uzvedība" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Labākais" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Biogrāfija no %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Bitreits" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Bitreits" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Bloku analizators" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Bloku tips" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Pārlūkot..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Pogas" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Atcelt" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Mainīt vāka attēlu" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Mainīt fontu izmēru..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Mainīt atkārtošanas režīmu" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Mainīt īsceļu..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Mainīt jaukšanas režīmu" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Mainīt valodu" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "BBC podraides" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Pārbaudīt atjauninājumus..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Izvēlieties nosaukumu gudrajai dziesmu listei" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Izvēlēties automātiski" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Izvēlēties krāsu..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Izvēlēties burtrakstu..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Izvēlēties no saraksta" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Izvēlies, kādā veidā kārtot dziesmu listi un no cik daudz dziesmām tā sastāvēs." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Izvēlieties podraides lejuplādes direktoriju" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Izvēlies mājas lapas, ko izmantot dziesmu vārdu meklēšanai." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Klasisks" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Attīrīt" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Attīrīt dziesmu listi" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Clementine Kļūda" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Oranžs Clementine" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Clementine vizualizācija" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine spēj automātiski konvertēt kopējamo mūziku formātā, ko ierīce var atskaņot." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine var atskaņot mūziku no jūsu Dropbox konta" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine var rādīt paziņojumu, kad mainās dziesma." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine nespēj ielādēt projectM vizualizācijas. Pārbaudiet, vai Clementine ir pareizi uzstādīts." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Clementine attēlu atveidotājs" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine nespēja atrast rezultātus šim failam" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Spiediet te lai pievienotu mūziku" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Spiediet, lai pārslēgtos no atlikušā uz pilno garumu" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Aizvērt" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Aizvērt dziesmu listi" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Aizvērt vizualizāciju" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Aizverot programmu, tiks atcelta failu lejupielāde." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Aizverot programu, tiks apturēta albūmu vāku meklēšana." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Klubu mūzika" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Krāsas" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Piezīmes" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Noformēt tagus automātiski" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Noformēt tagus automātiski..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Komponists" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Konfigurēt %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Konfigurēt Magnatune" #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Konfigurēt īsceļus" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Konfigurēt Spotify..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Konfigurēju Subsonic..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Konfigurēt bibliotēku..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Konfigurēt podraides..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Konfigurēt" #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Pieslēdziet Wii tālvadību izmantojot aktivizēt/deaktivizēt" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Pieslēgt ierīci" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Pieslēdzos Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Konsole" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Konstants bitreits" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Konvertēt visu mūziku" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Konvertēt mūziku, ko ierīce nespēj atskaņot" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Kopēt starpliktuvē" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Kopēt uz ierīci..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Kopēt uz bibliotēku..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Autortiesības" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Nespēj izveidot GStreamer elementu \"%1\" - pārbaudiet, vai ir uzstādīti visi nepieciešami GStreamer spraudņi" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Nevar atrast jaucēju priekš %1, pārbaudiet vai jums ir uzstādīti pareizi GStreamer spraudņi" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Nevar atrast kodeku priekš %1, pārbaudiet vai jums ir uzstādīti pareizi GStreamer spraudņi" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Nevar atvērt izejas failu %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Vāka attēlu pārvaldnieks" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Vāka attēls no iekļautā attēla" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Vāka attēls ielādēts automātiski no %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Vāka attēls manuāli noņemts" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Vāka attēls nav uzstādīts" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Vāka attēls uzstādīts no %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Izmantot laidenu pāreju, kad dziesmas pārslēdzas automātiski" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Izmantot laidenu pāreju, kad dziesmas pārslēdz lietotājs" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Pielāgots" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Pielāgots..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "DBus ceļš" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dance" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Izveides datums" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Pārveides datums" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Dienas" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "Nok&lusētais" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Samazināt skaļumu par 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Samazināt skaļumu par %" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Samazināt skaļumu" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Noklusējuma fona attēls" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Noklusētie" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Aizture starp vizualizācijām" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Dzēst" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Dzēst lejuplādētos datus" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Dzēst failus" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Dzēst no ierīces..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Dzēst no diska..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Dzēst uzstādījumu" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Dzēst Smart Playlist" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Dzēst oriģinālos failus" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Dzēš failus" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Izņemt dziesmas no rindas" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Izņemt dziesmu no rindas" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Galamērķis" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Detaļas..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Ierīce" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Ierīces īpašības" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Ierīces nosaukums" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Ierīces īpašības..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Ierīces" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Vai jūs domājāt" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Digitally Imported parole" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Tiešs interneta pieslēgums" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Mape" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Disks" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Displeja opcijas" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Rādīt displeju-uz-ekrāna" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Veikt pilnu bibliotēkas skenēšanu" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Nekonvertēt mūziku" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Neatkārtot" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Nerādīt pie dažādiem izpildītājiem" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Nejaukt" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Neapstāties" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Ziedot" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Dubultklikšķis lai atvērtu" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Dubultklikšķis uz dziesmas..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Lejuplādēt %n sērijas" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Lejupielādēt mapi" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Lejupielādēt epizodes uz" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Lejupielādēt dalību" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Automātiski lejuplādēt jaunās sērijas" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Lejupielādēt Android aplikāciju" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Lejupielādēt šo albumu" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Lejupielādēt šo albumu..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Lejuplādēt šo sēriju" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Lejupielādēt..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Lejuplādē (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Lejupielādē Icecast mapi" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Lejupielādē Jamendo katalogu" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Lejupielādē Magnatude katalogu" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Lejupielādē Spotify spraudni" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Lejupielādē metadatus" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Velciet, lai pārpozicionētu" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Dinamiskais režīms ieslēgts" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Dinamisks nejaušs mikss" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Rediģēt gudro dziesmu listi..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Rediģēt birku" #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Rediģēt birkas" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Rediģēt dziesmas informāciju" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Rediģēt dziesmas informāciju..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Rediģēt dziesmu informāciju..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Rediģēt..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Atļaut Wii tālvadības atbalstu" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Ieslēgt ekvalaizeru" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Lietot saīsnes tikai tad, kad izvēlēts Clementine" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Ieslēgt/izslēgt Last.fm skroblēšanu" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Kodēšanas sarežģītība" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Kodēšanas dzinēja kvalitāte" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Kodēšanas režīms" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Ievadiet URL" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Ievadiet jaunu nosakumu šai dziesmu listei" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Ievadiet meklējamo tekstu šeit" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Ievadiet interneta radio straumes adresi (URL):" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Visa kolekcija" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Ekvalaizers" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Vienāds ar --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Vienāds ar --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Kļūda" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Kļūda pieslēdzoties MTP ierīcei" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Kļūda kopējot dziesmas" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Kļūda dzēšot dziesmas" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Kļūda lejupielādējot Spotify spraudni" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Kļūda ielādējot %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Kļūda ielādējot di.fm atskaņošanas sarakstu" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Kļūda apstrādājot %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Kļūda nolasot audio CD" #: library/library.cpp:68 msgid "Ever played" msgstr "Vispār atskaņots" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Katras 10 minūtes" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Katras 12 stundas" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Katras 2 stundas" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Katras 20 minūtes" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Katras 30 minūtes" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Katras 6 stundas" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Katru stundu" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Paplašināt" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Eksportēšana pabeigta" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Laideni noklusināt apturot dziesmu" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Pāreja" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Pārejas garums" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Ātri" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Mīļākās dziesmas" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Meklēt trūkstošos vāku attēlus" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Piemeklēt automātiski" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Kļūda piemeklējot vāku attēlus" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Faila tips" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Failu formāti" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Faila nosaukums" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Faila nosaukums (bez atrašanās vietas)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Faila izmērs" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Faila tips" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Faila nosaukums" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Faili" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Faili kodēšanai" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Meklējiet savā bibliotēkā dziesmas, kas atbilst jūsu meklēšanas kritērijiem" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Meklēju dziesmas \"pirkstu nospiedumus\"" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Pabeigt" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Pirmais līmenis" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Fonta izmērs" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Licencēšanas nolūkā Spotify atbalsts pieejams kā atsevišķs spraudnis" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Forsēt mono kodēšanu" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Aizmirst ierīci" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Forma" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Formāts" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Kadrātrums" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Kadri buferī" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Pilns bass" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Pilns bass un augšas" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Pilnas augšas" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Pamatuzstādījumi" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Pamata iestatījumi" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Žanrs" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Ielādēju kanālus" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Dodiet tam vārdu:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Aiziet" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Iet uz nākamās dziesmu listes cilni" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Iet uz iepriekšējās dziesmu listes cilni" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Iegūti %1 vāku attēli no %2 (%3 neizdevās)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Padarīt pelēkas neeksistējošās dziesmas manās dziesmu listēs" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Grupēt Bibliotēku pēc..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Grupēt pēc" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Grupēt pēc Albumiem" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Grupēt pēc Izpildītāja" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Grupēt pēc Izpildītāja/Albuma" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Grupēt pēc Izpildītāja/Gada - Albuma" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Grupēt pēc Stils/Albums" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Grupēt pēc Stila/Izpildītāja/Albuma" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Grupēšana" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "HTML lapa nesatur RSS barotnes" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "HTTP starpniekserveris" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Priecīgs" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "\"Dzelžu\" informācija" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "\"Dzelžu\" informācija ir pieejama tikai pieslēdzot ierīci." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Augsts" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Augsts (%1 kadri/s)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Augsta (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Stundas" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnotoad krupis" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Man nav Magnatune konta" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Ikona" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Ikonas pa virsu" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Identificēju dziesmu" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Ja jūs turpināsiet, šī ierīce var darboties lēni un dziesmu kopēšana var nedarboties." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Ignorēt \"The\" izpildītāju nosaukumos" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Attēli (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Attēli (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "%1 nedēļās" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Ienākošie" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Iekļaut vāku attēlus paziņojumos" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Iekļaut visas dziesmas" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Palielināt skaļumu par 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Palielināt skaļumu par %" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Palielināt skaļumu" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Indeksēju %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Informācija" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Ievietot..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Uzstādīts" #: core/database.cpp:585 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internets" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Nepareiza API atslēga" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Nepareizs formāts" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Nepareiza metode" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Nepareizi parametri" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Norādīts nederīgs resurss" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Nepareizs serviss" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Nepareiza sesijas atslēga" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Jamendo klausītākās dziesmas" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Jamendo populārākās dziesmas" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo populārākās mēneša dziesmas" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo populārākās nedēļas dziesmas" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Jamendo datubāze" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Pārslēgties uz šobrīd skanošo dziesmu" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Turiet pogas %1 sekundi..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Turiet pogas %1 sekundes..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Darboties fonā, kad logs ir aizvērts" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Atstāt oriģinālos failus" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Valoda" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Laptops/Austiņas" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Liela zāle" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Liels vāka attēls" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Liela sānjosla" #: library/library.cpp:80 msgid "Last played" msgstr "Pēdējo reizi atskaņots" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm šobrīd nespēj apstrādāt pieprasīju, pēc brītiņa mēģiniet vēlreiz" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Last.fm parole" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Last.fm atskaņojumu skaits" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Last.fm birkas" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Last.fm lietotājvārds" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Visnemīļākās dziesmas" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Pa kreisi" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Ilgums" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Bibliotēka" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Advancēta Bibliotēkas grupēšana" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Bibliotēkās skenēšanas paziņojums" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Meklēt Bibliotēkā" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Limiti" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Dzīvais" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Ielādēt" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Ielādēt vāka attēlu no adreses" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Ielādēt vāka attēlu no adreses..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Ielādēt vāku no diska." #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Ielādēt vāka attēlu no diska..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Ielādēt dziesmu listi" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Ielādēt dziesmu listi..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Ielādē MTP ierīci" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Ielādē iPod datubāzi" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Ielādē gudro dziesmu listi" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Ielādē dziesmas" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Ielādē straumi" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Ielādē dziesmas" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Ielādē dziesmas info" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Ielādē..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Ielādē failus/adreses, aizstājot pašreizējo dziesmu listi" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Pieslēgties" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Ilga termiņa paredzēšanas profils (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Patīk" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Zems (%1 kadri/s)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Zema (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Zemas sarežģītības profils (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Dziesmas vārdi" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Dziesmas vārdi no %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatude" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Magnatude Lejupielāde" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Magnatude lejupielāde pabeigta" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Galvenais profils (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Padarīt atskaņošanas sarakstu pieejamu nesaistē" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Izkropļota atbilde" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Manuāla starpniekservera konfigurācija" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Ražotājs" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Atzīmēt kā dzirdētu" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Atzīmēt kā jaunu" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Atbilst visiem meklēšanas nosacījumiem (UN)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Atbilst vienam vai vairākiem meklēšanas nosacījumiem (VAI)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Maksimālais bitreits" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Vidējs (%1 kadri/s)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Vidēja (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Dalības tips" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Minimālais bitreits" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Pazuduši projectM preseti" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Modelis" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Pārlūkot izmaiņas bibliotēkā" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Mono atskaņošana" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Mēneši" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Noskaņojums" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "Visvairāk atskaņotie" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Montēšanas punkts" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Montēšanas punkti" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Pārvietot uz leju" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Pārvietot uz bibliotēku..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Pārvietot uz augšu" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Mūzikas bibliotēka" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Klusums" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Mana Mūzika" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Mani ieteikumi" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Nosaukums" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Nosaukšanas opcijas" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Šaura josla (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Tīkla starpniekserveris" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Nekad" #: library/library.cpp:74 msgid "Never played" msgstr "Nekad nav atskaņotas" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Nekad Nesākt atskaņot" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Jauna mape" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Jauna dziesmu liste" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Jauna gudrā dziesmu liste..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Jaunas dziesmas" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Jaunas dziesmas tiks pievienotas automātiski" #: library/library.cpp:92 msgid "Newest tracks" msgstr "Jaunākās dziesmas" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Uz priekšu" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Nākamā" #: core/utilities.cpp:151 msgid "Next week" msgstr "Nākamnedēļ" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Bez analizatora" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Nav fona attēla" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Bez gariem blokiem" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Nekas netika atrasts. Izdzēsiet meklēšanas aili, lai parādītu visu sarakstu." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Bez īsiem blokiem" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Nekas" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Neviena no izvēlētajām dziesmām nav piemērota kopēšanai uz ierīci" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Normāls bloku tips" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Nav pieejams izmantojot dinamiskās dziesmu listes" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Nav pieslēgts" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Nepietiekošs saturs" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Nepietiek fanu" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Nepietiek dalībnieku" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Nepietiek kaimiņu" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Nav uzstādīta" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Nav uzmontēts - dubultklikšķis lai uzmontētu" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Paziņojumu tips" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Paziņojumi" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Tagad atskaņo" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Paziņojumu loga piemērs" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Atļaut savienojumus tikai no lokālā tīkla" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Rādīt tikai pirmo" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Atvērt %1 pārlūkā" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Atvērt &audio CD..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Atvērt OPML failu" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Atvērt OPML failu..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Atvērt ierīci" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Atvērt datni..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Atvērt jaunā skaņsarakstā" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Atvērt pārlūkprogrammā" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Atvērt..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Darbība neizdevās" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Optimizēts bitreitam" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Optimizēts kvalitātei" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Opcijas..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Organizēt Failus" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Organizēt failus..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Kārtoju failus" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Oriģinālās birkas" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Citas opcijas" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Atskaņošanas opcijas" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Pārrakstīt esošos failus" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Īpašnieks" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Pārsē Jamendo katalogu" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Ballīte" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Parole" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Pauze" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Pauzēt atskaņošanu" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Nopauzēts" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Parasta sānjosla" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Atskaņot" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Atskaņošanu skaits" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Atskaņot, ja apturēts, pauzēt, ja atskaņo" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Atskaņot, ja nekas netiek atskaņots" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Atskaņot dziesmu no dziesmu listes" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Atskaņot/Pauzēt" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Atskaņošana" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Atskaņotāja opcijas" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Dziesmu liste" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Dziesmu liste beigusies" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Dziesmu listes opcijas" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Dziesmu listes tips" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Atskaņošanas saraksti" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Lūdzu, aizveriet pārlūku un atgriezieties Clementine." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Spraudņa statuss:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podraides" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Popmūzika" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Paziņojuma ilgums" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Ports" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Priekšpastiprinājums" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Uzstādījumi" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Iestatījumi..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Izvēlētie vāka attēlu failu nosaukumi (atdala ar komatu)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Vēlamais audio formāts" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Vēlamais bitu pārraides ātrums" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Vēlamais formāts" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Presets:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Nospiediet taustiņu kombināciju lai izmantotu par" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Nospiediet taustiņu" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Nospiediet taustiņu kombināciju lai izmantotu par %1..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Priekšskatīt" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Iepriekšējais" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Iepriekšējā" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Profils" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Virzība" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Piespiediet Wiiremote pogu" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Sakārtot dziesmas nejaušā secībā" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Ierindoju ierīci..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Rindas pārvaldnieks" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Ierindot izvēlētās dziesmas" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Ierindot dziesmu" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (ekvivalents skaļums visiem celiņiem)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Lietus" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Nejauša vizualizācija" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Novērtēt dziesmu ar 0 zvaigznēm" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Novērtēt ar 1 zvaigzni" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Novērtēt ar 2 zvaigznēm" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Novērtēt ar 3 zvaigznēm" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Novērtēt ar 4 zvaigznēm" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Novērtēt ar 5 zvaigznēm" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Vērtējums" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Tiešām atcelt?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Atjaunot katalogu" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Atjaunot kanālus" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Atjaunot staciu sarakstu" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Regejs" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Atcerēties no pēdējās reizes" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Izņemt" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Noņemt darbību" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Aizvākt mapi" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Azivākt no dziesmu listes" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Dzēst atskaņošanas sarakstu" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Pārdēvēt dziesmu listi" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Pārdēvēt dziesmu listi..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Pārkārtot šādā secībā..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Atkartot" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Atkārtot albumu" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Atkārtot dziesmu listi" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Atkārtot dziesmu" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Aizstāt pašreizējo dziesmu listi" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Aizstāt dziesmu listi" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Aizstāj atstarpes ar pasvītrojumiem" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Atskaņošanas skaļums" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Atjaunot" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Nepieciešams autentifikācijas kods" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Atiestatīt" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Atstatīt atskaņošanu skaitu" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Atļaut tikai ASCII simbolus" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Turpināt atskaņošanu, kad ieslēdzat Clementine" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Atgriezties uz Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Pa labi" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Roks" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "SOCKS starpniekserveris" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Saudzīgi atvienot ierīci" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Saudzīgi atvienot ierīci pēc kopēšanas" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Nolašu ātrums" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Nolašu ātrums" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Saglabāt vāka attēlu" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Saglabāt vāka attēlu uz disku..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Salgabāt bildi" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Saglabāt dziesmu listi..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Saglabāt presetu" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Saglabāt šo straumi Interneta cilenē" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Salgabā dziesmas" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Maināms semplreita profils (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Vērtējums" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Skroblēt dziesmas, ko klausos" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Meklēt" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Meklēt Icecast stacijas" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Meklēt Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Meklēt Magnatude" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Meklēt Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Meklēt albumu vāciņus..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Meklējiet jebko" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Meklēt gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Meklēt iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Meklēšanas režīms" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Meklēšanas opcijas" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Meklēšanas rezultāti" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Meklēšanas nosacījumi" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Otrais līmenis" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Patīt atpakaļ" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Patīt uz priekšu" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Patīt skanošo dziesmu par relatīvu attālumu" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Patīt skanošo dziesmu par absolūtu attālumu" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Iezīmēt visu" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Neiezīmēt neko" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Izvēlieties fona krāsu:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Izvēlēties fona attēlu" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Izvēlēties labāko atbilstību" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Izvēlēties vizualizācijas" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Izvēlēties vizualizācijas..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Sērijas numurs" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Serviss atslēgts" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Uzstādīt %1 uz \"%2\"..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Uzstādīt skaļumu uz procentiem" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Saglabāt vērtību izvēlētajām dziesmām..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Iestatījumi" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Īsceļš" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Isceļš priekš %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Īsceļš priekš %1 jau eksistē" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Parādit" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Parādīt paziņojumu" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Rādīt kvēlojošu animāciju pašreizējai dziesmai." #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Rādīt vienkāršu darbvirsmas paziņojumu" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Mainīt paziņojumu, kad es mainu atkārtošanas/jaukšanas režīmu" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Rādīt paziņojumu, kad es mainu skaļumu" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Rādīt paziņojumu nu sistēmas joslas" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Rādīt skaistu paziņojumu logu" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Rādīt virs statusa joslas" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Rādīt visas dziesmas" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Rādīt visas dziesmas" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Rādīt vāka attēlus bibliotēkā" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Rādīt atdalītājus" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Radīt pa visu ekrānu..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Rādīt failu pārlūkā..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Rādīt pie dažādiem izpildītājiem" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Rādīt tikai dublikātus" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Rādīt tikai bez birkām" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Rādīt skroblēšanas pogu galvenajā logā" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Rādīt paneļa ikonu" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Rādīt/slēpt" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Jaukt" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Jaukt visu" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Jaukt dziesmu listi" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Atslēgties" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Līdzīgi izpildītāji" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Izmērs" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Izmērs:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Izlaist atpakaļejot dziesmu listē" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Izlaista" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Izlaist turpinot dziesmu listē" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Mazs vāka attēls" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Maza sānjosla" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Gudrā dziesmu liste" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Gudrās dziesmu listes" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Viegla" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Vieglais roks" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Dziesmas informācija" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Dziesmas info" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogramma" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Atvainojiet" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Kārtot pēc stila (alfabētiski)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Kārtot pēc stila (pēc popularitātes)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Kārtot pēc staciju nosaukumiem" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Kārtot pēc" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Kārtošana" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Avots" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Avoti" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Spotify pieslēgšanās kļūda" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Spotify spraudnis" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Spotify spraudnis nav uzstādīts" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Standarts" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Novērtēts ar zvaigzni" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Sākt pašreiz atskaņoto dziesmu listi" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Sākt kodēšanu" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Palaiž %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Palaiž..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Apturēt" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Apturēt pēc" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Apturēt pēc šīs dziesmas" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Apturēt atskaņošanu" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Apturēt atskaņošanu pēc šīs dziesmas" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Apturēts" #: core/song.cpp:431 msgid "Stream" msgstr "Straume" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Straumējuma dalība" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Abonenti" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Izdevās!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "Veiksmīgi ierakstīts %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Ieteiktās birkas" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Kopsavilkums" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Ļoti augsts (%1 kadri/s)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Ārkārtīgi augsta (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Atbalstītie formāti" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Systēmas krāsas" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Cilnes pa virsu" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Birku meklētājs" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Mērķa bitreits" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Tehno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Pateicoties" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Nevar startēt \"%1\" komandu" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Pašlaik atskaņotās dziesmas albuma vāks" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "Nederīga mape %1" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "Otrajai vērtībai jābūt lielākai par pirmo!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Pieprasītā adrese neeksistē!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Pieprasītā adrese nav attēls!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Jaunā Clementine versija pieprasa pilnu bibliotēkas skenēšanu šādu funkciju dēļ:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Problēma meklējot metadatus iekš Magnatude" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Kļuda kopējot dažas dziesmas. Nevar pārkopēt sekojošos failus:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Kļuda dzēšot dažas dziesmas. Nevar izdzēst sekojošos failus:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Šie faili tiks dzēsti no ierīces. Vai jūs tiešām vēlaties turpināt?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Šajās mapēs tiks meklēta mūzika tavai bibliotēkai" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "\"Sie uzstādījumi tiek izmantoti iekš \"Kodēt Mūziku\" dialoga un tad, kad tiek konvertēta mūzika pirms kopēšanas uz ierīci." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Trešais līmenis" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Šīs darbības rezultātā tiks izveidota datubāze, kas var būt līdz pat 150 MB liela.\nVai jūs vēlaties turpināt?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Albums nav pieejams pieprasītajā formātā" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Šai ierīcei jābūt pieslēgtai un atvērtai pirms Clementine var noteikt, kādus failu formātus tā atbalsta." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Ierīce atbalsta šādus failu formātus:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Šī ierīce nedarbosies pareizi" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Šī ir MTP ierīce, bet jūs esat nokompilējis Clementine bez libmtp atbalsta." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Šis ir iPods, bet jūs esat nokompilējis Clementine bez libgpod atbalsta." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Šī ierīce ir pieslēgta pirmo reizi. Tagad Clementine tajā meklēs mūzikas failus. Tas var aizņemt kādu laiku." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Šī straume ir pieejama tikai maksas lietotājiem" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Šī tipa ierīce netiek atbalstīta: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Nosaukums" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Šodien" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Ieslēgt pilnu ekrānu" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Ieslēgt rindas statusu" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Ieslēgt skroblēšanu" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Rīt" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Par daudz pāradresāciju" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Kopā albumi:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Dziesma" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Kodēt Mūziku" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Kodēšanas piezīmes" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Pārkodēšana" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Kodēšanas opcijas" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Izslēgt" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "Adreses (URL)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Ultra plata josla (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Nevar lejupielādēt %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Nezināms" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Nezināma kļūda" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Noņemt vāka attēlu" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Atabonēt" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Tuvākie koncerti" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Atjaunot mainītās bibliotēkas mapes" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Atjaunot bibliotēku ieslēdzot Clementine" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Atjaunot šo podraidi" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Atjaunoju %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Atjaunoju %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Atjaunoju bibliotēku" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Pielietojums" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Pieejamības gadījumā izmantot albuma mākslinieka birku" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Izmantot Gnome saīšņu taustiņus" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Izmantot atskaņošanas skaļuma datus, ja pieejami" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Izmantot SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Izmantot Wii Tālvadību" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Lietot autentifikāciju" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Lietot dinamisko režīmu" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Izmantot paziņojumus Wii Tālvadības statusa atskaitēm" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Lietotot sistēmas uzstādījumus" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Lietot sistēmas starpniekservera uzstādījumus" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Izmantots" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Lietotāja saskarne" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Lietotājvārds" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Izmantojot izvēlni lai pievienotu dziesmu..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Mainīgs bitreits" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Dažādi izpildītāji" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Versija %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Skats" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Vizualizāciju režīms" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Vizualizācijas" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Vizualizāciju Iestatījumi" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Balss aktivitātes noteikšana" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Skaļums %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Tīmekļa vietne" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Nedēļas" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Kad startējas Clementine" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Meklējot vāka attēlu Clementine vispirms apskatīs failus, kas satur šos vārdus.\nJa nekas netiks atrasts, tad tiks izmantots lielākais attēls mapē." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Plaša josla (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Tālvadība %1: aktivizēta" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Tālvadība %1: savienots" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Tālvadība %1: ļoti vāja baterija (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Tālvadība %1: deaktivizēta" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Tālvadība %1: atvienots" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Tālvadība %1: vāja baterija (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Vai jūs vēlaties palaist pilnu skenēšanu?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Gads" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Gads - Albums" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Gadi" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Vakar" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Jūs gatavojaties lejupielādēt sekojošus albumus" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Jūs esat pierakstījies." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Jūs varat mainīt veidu, kā dziesmas tiek izkārtotas bibliotēkā." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Jūs varat klausīties Magnatude dziesmas par brīvu bez lietotāja konta. Apmāksājot dalību tiks novākti paziņojumi katras dziesmas beigās." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Papildus mūzikai, jūs varat ieslēgt arī kādu no fona skaņām." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Jūs varat izmantot Wii tālvadību lai kontrolētu Clementine.Apskatīt Clementine wiki lai uzzinātu vairāk.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Jums nav aktīva abonementa." #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Jūs mīlat šo dziesmu" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Ja jūs mainīsiet valodu, jums nāksies restartēt Clementine." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Jūsu IP adrese:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Jūsu Last.fm dati ir nepareizi" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Jūsu Magnatude dati ir nepareizi" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Jūsu bibliotēka ir tukša!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Jūsu radio straumes" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Jūsu skrobli: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Jūsu lietotājvārds vai parole bija nederīgi." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Nulle" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "pievienot %n dziesmas" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "pēc" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "atpakaļ" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "un" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "automātisks" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "pirms" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "starp" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "lielākais vispirms" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "sitieni minūtē" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "satur" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "izslēgts" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "disks %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "nesatur" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "beidzas ar" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "vienāds" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "lielāks par" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "pēdējās" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kb/s" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "mazāks par" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "garākais vispirms" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "jaunākais vispirms" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "nav vienāds" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "ne pēdējajā" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "nav uz" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "vecākais vispirms" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "uz" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "opcijas" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "vai nolasi šo QR kodu!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "piespiediet enter" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "aizvākt %n dziesmas" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "īsākais vispirms" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "jaukt dziesmas" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "mazākais vispirms" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "kārtot dziesmas" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "sākas ar" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "apturēt" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "dziesma %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/mk_MK.po000066400000000000000000004105701260417502300242440ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Gjorge Mihailov , 2013 # kanaifu , 2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Macedonian (Macedonia) (http://www.transifex.com/davidsansome/clementine/language/mk_MK/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: mk_MK\n" "Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr "ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr "pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr "секунди" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "песни" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 албуми" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 денови" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "пред %1 денови" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 плејлисти (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 избрани од" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 песна" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 песни" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 песни се пронајдени" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 песни се пронајдени (прикажувам %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 нумера" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 пренесено" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev модул" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%1 други слушатели" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 вкупно преслушано" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n неуспешно" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n завршено" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n преостанува" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Порамни текст" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "%Центрирај" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Прилагодено" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Помош" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "%Скриено %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Сокриј..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Лево" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Без" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Излези" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Десно" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Истегни ги колоните за да го пополнат прозорецот" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Алатки" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(различно за различни песни)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "..и сите оние кои допринесоа за Amarok" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 ден" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 песна" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 песни по случаен избор" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Премини на платена верзија" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "" #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "А-Ш" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "СЛАВА И НА ХИПНОЖАБАТА" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Околу %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "За Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "За Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Детали за сметката" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Детали за сметката (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Акција" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Активирај/Деактивирај Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Додади акција" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Додади уште еден извор..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Додади директориум..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Додади датотека..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Додади датотеки за транскодирање" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Додади папка" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Додади папка..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Додади нова папка..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Додади поим за пребарување" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Додади поле за албум на песна" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Додади поле за автор на слика на албум на песна" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Додади поле за автор/музичар на песна" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Додади поле за композитор на песна" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Додади поле за диск на песна" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Додади поле за жанр на песна" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Додади поле за должина на песна" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Додади бројач за пуштање на песна" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Додади бројач за прескокнување на песна" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Додади поле за наслов на песна" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Додади поле за песна" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Додади поле за песна на годината" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Додади извор..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Додади на друга плејлиста" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Додади на плејлистата" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Додади на редот" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Додади wiimotedev акција" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Додади..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Додено овој месец" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Додадено оваа недела" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Додадено оваа година" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Додадено денеска" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Додадено во последните три месеци" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Напредно групирање..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "После копирањето..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Албум" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Албум (идеална гласност за сите песни)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Музичар на албумот" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Податоци за албумот на jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Албуми со насловни слики" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Албуми без насловни слики" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Сите Датотеки (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Сите албуми" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Сите музичари" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Сите датотеки (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Сите плејлисти (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Сите преведувачи" #: library/library.cpp:98 msgid "All tracks" msgstr "Сите песни" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Дозволи mid/side енкодирање" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:85 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "" #: ui/about.cpp:68 msgid "Authors" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "" #: core/database.cpp:648 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "" #: core/song.cpp:428 msgid "CDDA" msgstr "" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "" #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:114 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Донирај" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "" #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "" #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "" #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "" #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:68 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:585 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "" #: library/library.cpp:80 msgid "Last played" msgstr "" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Лево" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: ui/equalizer.cpp:137 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "" #: core/song.cpp:410 msgid "MPC" msgstr "" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "" #: library/library.cpp:74 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:92 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "" #: core/utilities.cpp:151 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "" #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "" #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "" #: core/organise.cpp:73 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:139 msgid "Party" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Десно" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "" #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "" #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "" #: core/song.cpp:431 msgid "Stream" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "" #: ui/about.cpp:74 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "" #: core/song.cpp:426 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "" #: devices/giolister.cpp:157 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/mr.po000066400000000000000000004026741260417502300236720ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # FIRST AUTHOR , 2011 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Marathi (http://www.transifex.com/davidsansome/clementine/language/mr/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: mr\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " सेकंद" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " गाणी" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 दिवस" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 दिवसांपुर्वी" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 गाणे" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 गाणी सापडली" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 गाणी सापडली (%2 दाखवत आहे )" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n बाकी" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "%1 &लपवा" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&लपवा...." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "" #: core/utilities.cpp:119 msgid "1 day" msgstr "" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "" #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "" #: core/song.cpp:422 msgid "AIFF" msgstr "" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "" #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "" #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "" #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "" #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "" #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "" #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "" #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:80 msgid "All the translators" msgstr "" #: library/library.cpp:98 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:85 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "" #: ui/about.cpp:68 msgid "Authors" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "" #: core/database.cpp:648 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "" #: core/song.cpp:428 msgid "CDDA" msgstr "" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "" #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:114 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "" #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "" #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "" #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "" #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:68 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:585 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "" #: library/library.cpp:80 msgid "Last played" msgstr "" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: ui/equalizer.cpp:137 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "" #: core/song.cpp:410 msgid "MPC" msgstr "" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "" #: library/library.cpp:74 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:92 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "" #: core/utilities.cpp:151 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "" #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "" #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "" #: core/organise.cpp:73 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:139 msgid "Party" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "" #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "" #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "" #: core/song.cpp:431 msgid "Stream" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "" #: ui/about.cpp:74 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "" #: core/song.cpp:426 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "" #: devices/giolister.cpp:157 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/ms.po000066400000000000000000005054041260417502300236660ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # abuyop , 2014-2015 # Deo Favente , 2013 # FIRST AUTHOR , 2011 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Malay (http://www.transifex.com/davidsansome/clementine/language/ms/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ms\n" "Plural-Forms: nplurals=1; plural=0;\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nAnda jadikan senarai main kegemaran dengan mengklik ikon bintang disebelah nama senarai main\n\nSenarai main kegemaran akan disimpan di sini" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "hari" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr " s" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " saat" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " lagu" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 lagu)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 album" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 hari" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 hari lalu" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 pada %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 senarai main (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "dipilih dari %1" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 lagu" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 lagu" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 lagu ditemui" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 lagu ditemui (memaparkan %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 trek" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 dipindahkan" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Modul Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 pendengar lain" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 jumlah dimainkan" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n gagal" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n telah selesai" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n tinggal" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Jajarkan tulisan" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Tengah" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "Ekstra" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Bantuan" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&Sembunyikan %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Sembunyikan..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Kiri" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "Muzik" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Tiada" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "Senarai main" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Keluar" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Mod ulang" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Kanan" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Mod kocok" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Regangkan kolum-kolum untuk dimuat mengikut tetingkap" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Alatan" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(berbeza dengan pelbagai lagu)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", oleh" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...dan semua penyumbang Amarok" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 hari" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 trek" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192,000Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44,100Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48,000Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 trek rawak" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96,000Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Tatar ke Premium sekarang" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Jika tidak ditanda, Clementine akan cuba menyimpan penarafan anda dan lain-lain statistik hanya dalam pangkalan data berasingan dan tidak mengubahsuai fail anda.

Jika ditanda, ia akan menyimpan statistik kedua-dua dalam pangkalan data dan secara terus ke dalam setiap fail setiap kali ia berubah.

Perhatian, ia mungkin tidak berfungsi untuk setiap format dan, tiada piawaian untuk membuatnya, lain-lain pemain muzik mungkin tidak dapat membacanya.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Kata awalan dengan nama medan untuk hadkan penggelintaran pada medan tersebut, contohnya. artis:Iwan menggelintar pustaka untuk semua artis yang mengandungi perkataan Iwan.

Medan tersedia: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Tindakan ini akan menulis penarafan dan statistik lagu ke dalam tag fail untuk semua lagu pustaka anda.

Ia tidak diperlukan jika pilihan "Simpan penarafan dan statistik dalam tag fail" sentiasa diaktifkan.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Token bermula dengan %, contohnya: %artist %album %title

\n\n

Jika anda lihat seksyen teks yang mengandungi dengan tanda kurungan-kerinting, seksyen tersebut akan tersembunyi jika token kosong.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Akaun Spotify Premium diperlukan" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Hanya satu klien boleh disambungkan, jika kod yang betul dimasukkan." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Senarai main pintar ialah senarai dinamik lagu-lagu dari pustaka anda. Terdapat pelbagai jenis senarai main pintar yang menawarkan cara yang berbeza dalam memilih lagu-lagu." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Sesuatu lagu akan disertakan ke dalam senarai main sekiranya ia berpadanan dengan keadaan-keadaan ini." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "HIDUP HYPNOTOAD" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Henti Paksa" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Perihal %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Perihal Clementine" #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Perihal Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Mutlak" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Butir-butir akaun" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Perincian akaun (Perdana)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Tindakan" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Tindakan" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Aktif/nyahaktif Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Strim aktiviti" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Tambah Podcast" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Tambah Strim" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Tambah baris baru jika disokong oleh jenis pemberitahuan" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Tambah tindakan" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Tambah semua trek dari direktori dan semua subdirektorinya" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Tambah strim lain..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Tambah direktori..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Tambah fail" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Tambah fail ke transkoder" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Tambah fail ke transkoder" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Tambah fail..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Tambah fail-fail untuk transkod" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Tambah folder" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Tambah folder..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Tambah folder baharu..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Tambah podcast" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Tambah podcast..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Tambah terma carian" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Tambah tag album lagu" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Tambah tag artisalbum lagu" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Tambah tag artis lagu" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Tambah skor auto-lagu" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Tambah tag penggubah lagu" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Tambah tag cakera lagu" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Tambah nama fail lagu" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Tambah tag genre lagu" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Tambah tag pengelompokan lagu" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Tambah tag panjang lagu" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Tambah tag penyampai lagu" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Tambah bilangan main lagu" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Tambah penarafan lagu" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Tambahkan kiraan langkau lagu" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Tambah tag tajuk lagu" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Tambah lagu untuk dicache" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Tambah tag trek lagu" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Tambah tag tahun lagu" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Tambah lagu ke \"Muzik Saya\" bila butang \"Suka\" diklik" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Tambah stream..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Tambah ke Muzik Saya" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Tambah ke senarai main Spotify" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Tambah ke Spotify dibintangi" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Tambahkan ke senarai main lain" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Tambah ke tanda buku" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Tambahkan ke senarai main" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Tambah ke dalam senarai" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Tambah pengguna/kumpulan ke tanda buku" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Tambahkan tindakan wiimotedev" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Tambah..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Ditambah pada bulan ini" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Ditambah pada minggu ini" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Ditambah pada tahun ini" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Ditambah pada hari ini" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Ditambah dalam tiga bulan" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Pengelompokan lanjutan..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Selepas" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Selepas menyalin..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Album (kelantangan ideal untuk semua trek)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Artis album" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Kulit album" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Info album di jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Album" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Album dengan kulit muka" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Album tanpa kulit muka" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Semua" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Semua Fail (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "All Glory to the Hypnotoad!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Semua album" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Semua artis" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Semua fail (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Semua senarai main (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Semua penterjemah" #: library/library.cpp:98 msgid "All tracks" msgstr "Semua trek" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Benarkan klien memuat turun muzik dari komputer ini." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Benarkan muat turun" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Benarka pengekodan mid/sisi" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Bersama-sama yang asal" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Sentiasa sembunyikan tetingkap utama" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Sentiasa tunjukkan tetingkap utama" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Sentiasa mula bermain" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Peranti Awan Amazon" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Satu plugin tambahan diperlukan untuk menggunakan Spotify dalam Clementine. Inginkah anda memuat turun dan memasangnya sekarang?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Ralat berlaku semasa memuat pangkalan data iTunes" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Ralat berlaku semasa menulis metadata ke '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Satu ralat tidak dinyatakan berlaku." #: ui/about.cpp:85 msgid "And:" msgstr "Dan:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Marah" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Penampilan" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Tambah fail/URL ke senarai main" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Tambah ke senarai main semasa" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Tambah ke senarai main" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Laksana pemampatan untuk hindari pengeratan" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Anda pasti mahu memadam praset \"%1\"?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Anda pasti mahu menetap semula statistik lagu ini?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Anda pasti mahu menulis statistik lagu ke dalam fail lagu untuk semua lagu dalam pustaka anda?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Artis" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Info artis" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Tag artis" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Nama awal artis" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Tanya bila menyimpan" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Format audio" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Output audio" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Pengesahan gagal" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Pengarang" #: ui/about.cpp:68 msgid "Authors" msgstr "Pengarang-pengarang" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Auto" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Automatik" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Pengemaskinian automatik" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Buka satu kategori secara automatik di dalam pepohon pustaka" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Ada" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Kadar bit purata" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Saiz imej purata" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "Podcast BBC" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Strim Di Belakang" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Warna latar belakang" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Imej latar belakang" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Kelegapan latar belakang" #: core/database.cpp:648 msgid "Backing up database" msgstr "Menyandar pangkalan data" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Imbangan" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "Ban (Last.fm scrobbling)" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Penganalisis palang" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Biru Asasi" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Jenis audio asas" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Kelakuan" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Terbaik" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Biografi dari %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Kadar bit" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Kadar bit" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Kadar bit" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Penganalisis blok" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Jenis blok" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Amaun kabur" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Badan" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Penganalisis boom" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Layar..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Jangkamasa penimbal" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Menimbal" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Membina indeks Seafile..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Tetapi sumber ini telah dilumpuhkan:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Bebutang" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Sokongan lembar CUE" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Laluan cache:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Membuat cache" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "Membuat cache %1" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Batal" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Batal muat turun" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Captcha diperlukan.\nCuba daftar masuk ke Vk.com dengan pelayar anda, untuk membaiki masalah ini." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Ubah seni kulit muka" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Ubah saiz fon..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Ubahkan mod ulang" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Ubah pintasan..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Ubah mod kocok" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "Ubah lagu yang kini dimainkan" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Ubah bahasa" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "Perubahan akan berlaku bila lagu berikutnya mula dimainkan" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Perubahan keutamaan main balik mono akan berkesan pada lagu seterusnya yang dimainkan" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Periksa episod baharu" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Periksa kemaskini" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Periksa kemaskini..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Pilih direktori cache Vk.com" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Pilih satu nama untuk senarai main pintar anda" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Pilih secara automatik" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Pilih warna..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Pilih fon..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Pilih dari senarai" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Pilih bagaimana senarai main diisih dan berapa banyak lagu akan diisi." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Pilih direktori muat turun podcast" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Pilih perkhidmatan internet yang anda mahu tunjukkan." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Pilih laman sesawang yang anda mahu Clementine gunakan semasa mencari lirik-lirik." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Klasik" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Membersihkan" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Kosongkan" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Kosongkan senarai main" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Ralat Clementine" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Clementine Jingga" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Pengvisualan Clementine" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine boleh menukar secara automatik muzik yang anda salin ke peranti ini kepada format yang ia boleh mainkan." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Clementine boleh mainkan muzik yang anda muat naik ke dalam Amazon Cloud Drive" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine boleh mainkan muzik yang anda muat naik dalam Box" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine boleh mainkan muzik yang anda muat naik dalam Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine boleh mainkan muzik yang anda muat naik dalam Google Drive" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine boleh mainkan muzik yang anda muat naik dalam OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine boleh paparkan mesej apabila trek berubah." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine boleh menyegerak senarai langganan anda dengan komputer lain dan juga aplikasi podcast anda. Cipta satu akaun." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine tidak dapat muatkan mana-mana penvisualan projectM. Periksa sama ada anda telah memasang Clementine dengan baik." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Pemapar imej Clementine" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine tidak dapat mencari keputusan untuk fail ini" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine akan mencari muzik di dalam:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Klik di sini untuk menambah muzik" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Klik di sini untuk jadikan sebagai senarai main kegemaran supaya ia akan disimpan dan kekal boleh dicapai menerusi panel \"Senarai Main\" pada palang sisi kiri" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Klik untuk togol diantara masa berbaki dengan jumlah masa" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Mengklik butang Daftar Masuk akan membuka pelayar sesawang. Anda patut kembali ke Clementine selepas anda mendaftar masuk." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Tutup" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Tutup senarai main" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Tutup pengvisualan" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Menutup tetingkap ini akan membatalkan muat turun." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Menutup tetingkap ini akan hentikan penggelintaran kulit album." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Kelab" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Warna" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Senarai kelas dipisah dengan tanda koma: aras, aras diantara 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Komen" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Radio Komuniti" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Lengkapkan tag secara automatik" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Lengkapkan tag secara automatik..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Penggubah" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Konfigur %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Konfigur Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Tetapkan Pintasan" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Konfigur Spotify..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Konfigur Subsonic..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Konfigur Vk.com..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Konfigure gelintar sejagat..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Konfigur pustaka..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Konfigur podcast..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Konfigur..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Sambung Wii Remotes melalui tindakan aktif/nyahaktif" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Sambung peranti" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Menyambung ke Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Sambungan dinafi oleh pelayan, periksa URL pelayan. Contoh: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Sambungan tamat masa, periksa URL pelayan. Contoh: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Sambungan bermasalah atau audio dilumpuhkan oleh pemilik" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Konsol" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Kadar bit malar" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Tukar semua muzik" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Tukar mana-mana muzik yang tidak boleh dimainkan oleh peranti" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Tukar fail audio tak hilang sebelum menghantarnya ke jauh." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Tukar fail tak hilang" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Salin url kongsi ke papan keratan" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Salin ke papan keratan" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Salin ke peranti..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Salin ke pustaka..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Hakcipta" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Tidak dapat sambung ke Subsonic, periksa URL pelayan. Contoh: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Tidak dapat cipta unsur GStreamer \"%1\" - pastikan anda telah mempunyai semua pemalam GStreamer yang diperlukan terpasang" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Tidak dapat cipta senarai main" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Tidak dapat cari muxer untuk %1. Periksa sama ada anda mempunyai pemalam GStreamer yang betul dipasang" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Tidak dapat cari pengekod untuk %1. Periksa sama ada anda mempunyai pemalam GStreamer yang betul dipasang" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Tidak dapat buka fail output %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Pengurus Kulit Muka" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Seni kulit muka dari imej terbenam" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Seni kulit muka dimuat secara automatik dari %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Seni kulit muka dinyatetap secara manual" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Seni kulit muka tidak ditetapkan" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Seni kulit muka ditetap dari %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Kulit muka dari %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Resap-silang bila mengubah trek secara automatik" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Resap-silang bila mengubah trek secara manual" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Suai" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Imej suai:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Tetapan mesej suai" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Suai..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "Laluan DBus" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dance" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Kerosakan pangkalan data dikesan. Sila rujuk https://code.google.com/p/clementine-player/wiki/DatabaseCorruption untuk ketahui cara memulih kembali pangkalan data anda" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Tarikh dicipta" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Tarikh diubahsuai" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Hari" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "&Lalai" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Kurangkan volum sebanyak 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Kurangkan volum mengikut peratus" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Kurangkan volum" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Imej latar belakang lalai" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Peranti lalai pada %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Lalai" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Lengah diantara pengvisualan" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Padam" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Padam data dimuat turun" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Padam fail" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Padam dari peranti..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Padam dari cakera..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Padam episod telah dimain" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Padam praset" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Padam senarai main pintar" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Padam fail asal" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Memadam fail-fail" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Nyahbaris gilir trek terpilih" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Nyahbaris gilir trek" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Destinasi" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Perincian..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Peranti" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Sifat Peranti" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Nama peranti" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Ciri-ciri peranti..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Peranti-peranti" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Dialog" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Adakah anda maksudkan" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Diimport Secara Digital" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Kata laluan Diimport secara Digital" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Nama pengguna Diimport secara Digital" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Sambungan internet terus" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Direktori" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Lumpuhkan jangkamasa" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Lumpuhkan penjanaan palang suasana" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Dilumpuhkan" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Dilumpuhkan" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Cakera" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Penghantaran terputus" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Pilihan paparan" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Papar paparan-atas-skrin" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Buat imbas semula pustaka penuh" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Buat imbas semula penuh" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Buat imbas semula penuh..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Jangan tukar mana-mana muzik" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Jangan tulis-ganti" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "Membuat imbas semula penuh akan kehilangan mana-mana data meta yang anda simpan galam Clementine seperti seni kulit muka, kiraan main dan penarafan. Clementine akan imbas semula semua muzik anda dalam Google Drive yang akan mengambil sedikit masa." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Jangan ulang" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Jangan tunjuk dalam artis pelbagai" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Jangan tunjuk episod yang telah didengari" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Jangan kocok" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Jangan berhenti!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Derma" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Dwi klik untuk buka" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "Dwi klik satu lagu dalam senarai main akan..." #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Dwi klik sesuatu lagu akan..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Muat turun %n episod" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Direktori muat turun" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Muat turun episod ke" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Keahlian muat turun" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Muat turun episod baharu secara automatik" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Muat turun dibaris gilir" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Tetapan muat turun" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Muat turun apl Android" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Muat turun album ini" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Muat turun album ini..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Muat turun episod ini" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Muat Turun..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Memuat turun (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Memuat turun direktori Icecast" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Memuat turun katalog Jamendo" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Memuat turun katalog Magnatune" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Memuat turun pemalam Spotify" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Memuatturun data meta" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Seret untuk betulkan kedudukan" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dubstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Jangkamasa" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Mod dinamik hidup" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Campuran rawak dinamik" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Sunting senarai main pintar..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Sunting tag \"%1\"..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Sunting tag..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Sunting tag" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Sunting maklumat trek" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Sunting maklumat trek..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Sunting maklumat trek..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Sunting..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "Emel" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Bbenarkan sokongan Wii Remote" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Benarkan cache automatik" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Benarkan penyama" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Benarkan pintasan hanya apabila Clementine difokus" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Benarkan data meta lagu edisi inline dengan klik" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Benarkan sumber di bawah untuk sertakannya dalam keputusan gelintar. Keputusan akan dipapar dalam tertib ini." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Benar/lumpuhkan scrobbling Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Kekompleksan pengekodan" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Kualiti enjin pengekodan" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Mod pengekodan" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Masukkan URL" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Masukkan URL untuk muat turun kuli muka dari Internet:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Masukkan nama fail untuk kulit muka dieksport (tiada sambungan):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Masukkan nama baharu bagi senarai main ini" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Masukkan terma gelintar di atas untuk cari muzik dalam komputer anda dan juga dalam internet" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Masukkan terma gelintar di bawah untuk cari podcast dalam Kedai iTunes" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Masukkan terma gelintar di bawah untuk cari podcast dalam gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Masukkan terma gelintar di sini" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Masukkan URL satu strim radio internet:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Masukkan nama folder" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Masukkan IP ini dalam Apl untuk menyambung ke Clementine." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Kesemua koleksi" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Penyama" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Sama dengan --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Sama dengan --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Ralat" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Ralat Meretas CD" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Ralat menyambung peranti MTP" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Ralat menyalin lagu" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Ralat memadam lagu" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Ralat memuat turun pemalam Spotify" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Ralat memuatkan %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Ralat memuatkan senarai main di.fm" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Ralat memproses %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Ralat ketika memuatkan CD audio" #: library/library.cpp:68 msgid "Ever played" msgstr "Pernah dimainkan" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Setiap 10 minit" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Setiap 12 jam" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Setiap 2 jam" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Setiap 20 minit" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Setiap 30 minit" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Setiap 6 jam" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Setiap jam" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Kecuali di antara trek-trek dalam album yang sama atau dalam lembaran CUE yang sama" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Kulit muka sedia ada" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Kembang" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Luput pada %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Eksport Kulit Muka" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Eksport kulit muka" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Eksport kulit muka dimuat turun" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Eksport kulit muka terbenam" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Eksport selesai" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "%1 kulit muka dieksport dari %2 (%3 dilangkau)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Resap lenyap bila di jeda / resap masuk bila sambung semula" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Resap keluar bila menghentikan trek" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Peresapan" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Jangkamasa peresapan" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Gagal membaca pemacu CD" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Gagal mendapakan direktori" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Gagal mendapatkan podcast" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Gagal memuatkan podcast" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Gagal menghurai XML untuk suapan RSS ini" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Pantas" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Trek-trek kegemaran" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Dapatkan Kulit Muka yang Hilang" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Pengambilan secara automatik" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Pengambilan selesai" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Mendapatkan pustaka Subsonic" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Mendapatkan ralat kulit muka" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Format Fail" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Sambungan fail" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Format fail" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Nama fail" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Nama fail (tanpa laluan)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Corak nama fail:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Laluan fail" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Saiz fail" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Jenis fail" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Namafail" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Fail" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Fail untuk ditranskod" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Cari lagu-lagu dalam pustaka anda yang berpadanan dengan kriteria yang anda tetapkan." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Cari artis ini" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Pengecapan jari lagu" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Selesai" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Aras pertama" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Suai muat kulit muka mengikut lebar" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Saiz fon" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Atas sebab-sebab perlesenan sokongan Spotify berada dalam pemalam berasingan." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Paksa pengekodan mono" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Lupakan peranti" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Melupakan peranti akan membuangnya dari senarai dan Clementine perlu mengimbas semula semula lagu apabila anda menyambungkannya di lain waktu." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Bentuk" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Format" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Kadar bingkai" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Bingkai per penimbal" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Kaku" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Bass Penuh" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Bass Penuh + Trebel" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Trebel Penuh" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Am" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Tetapan am" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Genre" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Dapatkan URL untuk kongsikan lagu Spotify ini" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Dapatkan URL untuk kongsikan senarai main ini" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Mendapatkan saluran" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Mendapatkan strim" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Berikan ia nama" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Pergi" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Pergi ke tab senarai main berikutnya" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Pergi ke tab senarai main sebelumnya" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Dapat %1 kulit muka dari %2 (%3 gagal)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Malapkan lagu yang tidak wujud dalam senarai main saya" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Kumpulkan Pustaka mengikut..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Kumpulkan mengikut" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Kumpulkan mengikut Album" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Kumpulkan mengikut Artis" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Kumpulkan mengikut Artis/Album" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Kumpulkan mengikut Artis/Tahun - Album" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Kumpulkan mengikut Genre/Album" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Kumpulkan mengikut Genre/Artis/Album" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Pengelompokan" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "Halaman HTML tidak mengandungi mana-mana suapan RSS" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "Kod status HTTP 3xx diterima tanpa URL, sahkan konfigurasi pelayan." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "Proksi HTTP" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Happy" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Maklumat perkakasan" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Maklumat perkakasan hanya tersedia ketika peranti disambungkan." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Tinggi" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Tinggi (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Tinggi (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "HipHop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Hos tidak ditemui, periksa URL pelayan. Contoh: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Jam" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Saya tidak mempunyai akaun Magnatune" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Ikon" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Ikon di atas" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Mengenalpasti lagu" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Jika diaktifkan, mengklik lagu terpilih dalam paparan senarai main akan benarkan anda sunting nilai tag secara langsung" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Jika anda teruskan, peranti ini akan berfungsi dengan perlahan dan lagu-lagu yang disalin ke dalamnya mungkin tidak akan dapat dimainkan." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Jika anda tahu URL podcast, masukkannya di bawah dan tekan Go." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Abaikan \"The\" dalam nama artis" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Imej (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Imej (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Import..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "Dalam %1 hari" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "Dalam %1 minggu" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "Dalam mod dinamik trek baharu akan dipilih dan ditambah ke senarai main setiap kali lagu selesai." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Peti Masuk" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Sertakan hasil seni album dalam pemberitahuan" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Sertakan semua lagu" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Versi protokol Subsonic REST tidak serasi. Klien mesti ditatar." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Versi protokol Subsonic REST tidak serasi. Pelayan mesti ditatar." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Konfigurasi tidak lengkap, sila pastikan semua medan diisi." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Naikkan kadar bunyi sebanyak 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Tingkatkan volum mengikut peratus" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Naikkan kadar bunyi" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Mengindeks %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Maklumat" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Pilihan input" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Sisip..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Terpasang" #: core/database.cpp:585 msgid "Integrity check" msgstr "Semakan integriti" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Penyedia Internet" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Perkhidmatan Internet" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "Trek pengenalan" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Kunci API tidak sah" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Format tidak sah" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Kaedah tidak sah" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Parameter tidak sah" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Sumber dinyatakan tidak sah" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Perkhidmatan tidak sah" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Kunci sesi tidak sah" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Songsang Pemilihan" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Trek Jamendo Paling Kerap Didengar" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Trek Terbaik Jamendo" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Trek Terbaik Bulanan Jamendo" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Trek Terbaik Mingguan Jamendo" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Pangkalan data Jamendo" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Lompat ke lagu terdahulu sekarang jua" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Lompat ke trek semasa dimainkan" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Kekalkan butang dalam tempoh %1 saat..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Kekalkan butang dalam tempoh %1 saat..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Kekal berjalan di balik tabir bila tetingkap ditutup" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Kekalkan fail asal" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Kittens" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Bahasa" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Komputer Riba/Fon Kepala" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Dewan Besar" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Muka album besar" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Kulit album besar (perincian di bawah)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Kulit album besar (tiada perincian)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Palang sisi besar" #: library/library.cpp:80 msgid "Last played" msgstr "Terakhir dimainkan" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Terakhir dimainkan" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm sedang sibuk, sila cuba lagi setelah beberapa minit" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Kata laluan Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Kiraan main Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Tag Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Kata laluan Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Wiki Last.fm" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Trek kurang digemari" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Kiri" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Jangkamasa" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Pustaka" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Pengelompokan lanjutan pustaka" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Notis imbas semula pustaka" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Gelintar pustaka" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Had" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Langsung" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Muat" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Muat kulit muka dari URL" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Muat kulit muka dari URL..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Muat kulit muka dari cakera" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Muat kulit muka dari cakera..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Muat senarai main" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Muat senarai main..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Memuatkan peranti MTP" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Memuatkan pangkalan data iPod" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Memuatkan senarai main pintar" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Memuatkan lagu" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Memuatkan strim" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Memuatkan trek" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Memuatkan maklumat trek" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Memuatkan..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Memuat fail/URL, menggantikan senarai main semasa" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Daftar masuk" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Daftar masuk gagal" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Daftar keluar" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Profil jangkaan jangka panjang (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Suka" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "Love (Last.fm scrobbling)" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Rendah (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Rendah (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Profil kerumitan rendah (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Lirik" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Lirik dari %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Lirik dari tag ID3v2" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Muat Turun Magnatune" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Muat turun Magnatune selesai" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Profil utama (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Make it so!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Make it so!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Buatkan senarai main tersedia di luar talian" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Respon cacat" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Konfigurasi proksi manual" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Secara manual" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Pengeluar" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Tanda sebagai didengar" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Tanda sebagai baharu" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Padan setiap terma gelintar (AND)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Padan satu atau lebih terma gelintar (OR)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Keputusan gelintar sejagat maks" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Kadar bit maksimum" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Media telah berubah. Memuat semula" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Sederhana (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Sederhana (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Jenis keahlian" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Kadar bit minimum" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Isian penimbal minimum" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Praset projectM hilang" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Pantau pustaka untuk perubahan" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Main balik mono" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Bulan" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Suasana" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Gaya palang suasana" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Palang suasana" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Lagi" #: library/library.cpp:84 msgid "Most played" msgstr "Terbanyak dimain" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Titik lekap" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Titik lekap" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Alih ke bawah" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Alih ke pustaka..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Alih ke atas" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Muzik" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Pustaka Muzik" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Senyap" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Album Saya" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Muzik Saya" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Cadangan Saya" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Nama" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Nama" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Pilihan penamaan" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Jalur sempit (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Proksi Rangkaian" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Jauh Rangkaian" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Tidak Sesekali" #: library/library.cpp:74 msgid "Never played" msgstr "Tidak pernah dimainkan" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Tidak sesekali mula dimainkan" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Folder baharu" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Senarai main baharu" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Senarai main pintar baharu..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Lagu baharu" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Trek baharu akan ditambah secara automatik" #: library/library.cpp:92 msgid "Newest tracks" msgstr "Trek terbaharu" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Seterusnya" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Trek seterusnya" #: core/utilities.cpp:151 msgid "Next week" msgstr "Minggu seterusnya" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Tiada penganalisis" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Tiada imej latar belakang" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Tiada kulit muka dieksport." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Tiada blok panjang" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Tiada padanan ditemui. Kosongkan kotak carian untuk paparkan seluruh senarai main semula." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Tiada blok pendek" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Tiada" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Tiada satupun lagu yang dipilih sesuai untuk disalin ke peranti" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Biasa" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Jenis blok biasa" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Tidak tersedia bila menggunakan senarai main dinamik" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Tidak disambung" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Tidak cukup kandungan" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Tidak cukup peminat" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Tidak cukup ahli" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Kejiranan tidak mencukupi" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Tidak dipasang" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Tidak mendaftar masuk" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Tidak dilekap - dwi-klik untuk lekap" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Tiada ada ditemui" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Jenis pemberitahuan" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Pemberitahuan" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Sekarang Dimainkan" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Bilangan episod yang ditunjukkan" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Pratonton" #: widgets/osd.cpp:173 msgid "Off" msgstr "Mati" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Flac Ogg" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Speex Ogg" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Vorbis Ogg" #: widgets/osd.cpp:173 msgid "On" msgstr "Hidup" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Hanya terima sambungan daripada klien dengan jula ip:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Hanya benarkan sambungan dari rangkaian setempat" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Hanya tunjuk yang pertama" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Kelegapan" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Buka %1 dalam pelayar" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Buka CD &audio..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Buka fail OPML" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Buka fail OPML..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Buka satu direktori untuk mengimport muzik darinya" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Buka peranti" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Buka fail..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Buka dalam Google Drive" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Buka dalam senarai main baharu" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Buka dalam senarai main baharu" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Buka dalam pelayar anda" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Buka..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Operasi gagal" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Optimumkan untuk kadar bit" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Optimumkan untuk kualiti" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Pilihan..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Aturkan Fail" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Urus fail..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Mengatur fail" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Tag asal" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "Tahun asal" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "Tahun asal - Album" #: library/library.cpp:118 msgid "Original year tag support" msgstr "Sokongan tag tahun asal" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Pilihan lain" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Output" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Peranti output" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Pilihan output" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Tulis-ganti semua" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Tulis-ganti fail sedia ada" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Tulis-ganti yang lebih kecil sahaja" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Pemilik" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Menghurai katalog Jamendo" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Parti" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Kata laluan" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Jeda" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Jeda main balik" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Dijeda" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Penyampai" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Piksel" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Palang sisi biasa" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Main" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Kiraan main" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Main sekiranya telah dihenti, jeda sekiranya dimainkan" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Main sekiranya tiada apa yang tersedia dimainkan" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Mainkan trek ke- dalam senarai main" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Main/Jeda" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Main balik" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Pilihan pemain" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Senarai main" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Senarai main selesai" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Pilihan senarai main" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Jenis senarai main" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Senarai main" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Sila tutup pelayar anda dan kembali ke Clementine." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Status pemalam:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcats" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Jangkamasa timbul" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Pra-amp" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Keutamaan" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Keutamaan" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Keutamaan..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Nama fail seni album dikehendaki (dipisah dengan tanda koma)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Format audio dikehendaki" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Kad bit dikehendaki" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Format dikehendaki" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Jenis audio perdana" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Praset:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Tekan satu gabungan butang untuk digunakan bagi" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Tekan satu kekunci" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Tekan satu gabungan kekunci untuk digunakan bagi %1..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Menekan \"Terdahulu\" di pemain akan..." #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Pilihan OSD menarik" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Pratonton" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Sebelum" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Trek sebelumnya" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Cetak maklumat versi" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Kemajuan" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Kemajuan" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psikedelik" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Tolak butang Wiiremote" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Letak lagu dalam tertib rawak" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Kualiti" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Kualiti" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Menanya peranti..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Pengurus Baris Gilir" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Baris gilir trek terpilih" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Baris gilir trek" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (sama kelantangan untuk semua trek)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Rain" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Rain" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Penvisualan rawak" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Tarafkan populariti lagu semasa 0 bintang" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Tarafkan populariti lagu semasa 1 bintang" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Tarafkan populariti lagu semasa 2 bintang" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Tarafkan populariti lagu semasa 3 bintang" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Tarafkan populariti lagu semasa 4 bintang" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Tarafkan populariti lagu semasa 5 bintang" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Penarafan" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Betul batalkan?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Had arah semula dilampaui, sahkan konfigurasi pelayan." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Segar semula katalog" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Segar semula saluran" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Segar semula senarai stesen" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Segar semula strim" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Relatif" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Ingat ayunan Wii remote" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Ingat dari kedudukan terakhir" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Ingat pilihan saya" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Buang" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Buang tindakan" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Buang pendua dari senarai main" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Buang folder" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Buang dari Muzik Saya" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Buang dari tanda buku" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Buang dari senarai main" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Buang senarai main" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Buang senarai main" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Buang trek tidak tersedia dari senarai main" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Namakan semula senarai main" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Namakan semula senarai main..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Nomborkan semula trek mengikut tertib ini..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Ulang" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Ulang album" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Ulang senarai main" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Ulang trek" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Ganti senarai main semasa" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Ganti senarai main" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Ganti jarak dengan underscore" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Gandaan Main Semula" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Mod Gandaan Main Semula" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Diami semula" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Perlukan kod pengesahihan" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Tetap semula" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Tetap semula kiraan main" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Memulakan semula lagu, kemudian lompat ke kedudukan terdahulu jika ditekan sekali lagi" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Mula semula trek, atau mainkan trek sebelum ini jika dalam tempoh 8 saat bermula." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Hadkan aksara ASCII" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Sambung semula main balik ketika mula" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Kembali ke Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Kanan" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Retas" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Retas CD" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Retas CD audio" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Jalan" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "Proksi SOCKS" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Ralat jabat tangan SSL, sahkan konfigurasi pelayan. Pilihan SSLv3 di bawah mungkin menjana beberapa masalah." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Tanggal peranti secara selamat" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Tanggal peranti secara selamat selepas menyalin" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Kadar sampel" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Kadarsampel" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Simpan fail .mood dalam pustaka muzik anda" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Simpan kulit album" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Simpan kulit album ke cakera..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Simpan imej" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Simpan senarai main" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Simpan senarai main" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Simpan senarai main..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Simpan praset" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Simpan penarafan dalam tag fail jika boleh" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Simpan statistik dalam tag fail jika boleh" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Simpan strim ini dalam tab Internet" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Menyimpan statistik lagu dalam fail lagu" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Menyimpan trek" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Profil kadar persampelan boleh diskala (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Saiz skala" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Skor" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Scrobble trek yang saya dengari" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Gelintar" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Gelintar" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Gelintar stesen Icecast" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Gelintar Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Gelintar Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Gelintar Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Gelintar secara automatik" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Gelintar kulit album..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Gelintar apa saja" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Gelintar gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Gelintar iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Mod gelintar" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Pilihan gelintar" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Keputusan gelintar" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Terma gelintar" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Aras kedua" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Jangkau mengundur" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Jangkau maju" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Jangkau trek semasa dimainkan mengikut amaun relatif" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Jangkau trek semasa dimainkan ke kedudukan mutlak" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "Penjangkauan menggunakan pintasan papan kekunci" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Pilih semua" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Pilih Tiada" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Pilih warna latar belakang:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Pilih imej latar belakang" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Pilih padanan terbaik" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Pilih warna latar hadapan:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Pilih pengvisualan" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Pilih pengvisualan..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Pilih..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Nombor siri" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Pelayan" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "URL pelayan" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Perincian pelayan" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Perkhidmatan di luar talian" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Tetapkan %1 ke \"%2\"..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Tetapkan volum ke peratus" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Tetapkan nilai untuk semua trek terpilih..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Tetapan" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Pintasan" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Pintasan untuk %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Pintasan untuk %1 sudah wujud" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Tunjuk" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Tunjuk OSD" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Tunjuk animasi bersinar pada trek semasa" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Tunjuk palang suasana dalam palang kemajuan trek" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Tunjuk pemberitahuan dekstop tabii" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Tunjuk pemberitahuan bila saya ubah mod ulang/kocok" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Tunjuk pemberitahuan bila saya mengubah volum" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Tunjuk pemberitahuan bila saya jeda main balik" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Tunjukan dialog timbul dari talam sistem" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Tunjuk OSD menarik" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Tunjuk di atas palang status" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Tunjuk semua lagu" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Tunjuk semua lagu" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Tunjuk seni kulit muka dalam pustaka" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Tunjuk pembahagi" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Tunjuk saiz penuh..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Tunjuk kumpulan dalam keputusan gelintar sejagat" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Tunjuk dalam pelayar fail..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Tunjuk dalam pustaka...." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Tunjuk dalam artis pelbagai" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Tunjuk palang suasana" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Hanya tunjuk pendua" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Tunjuk hanya tidak ditag" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Tunjuk lagu dimainkan dalam halaman anda" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Tunjuk cadangan gelintar" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Tunjuk butang \"suka\"" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Tunjuk butang scrobble dalam tetingkap utama" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Tunjuk ikon talam" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Tunjuk sumber yang manakah dibenarkan dan dilumpuhkan" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Tunjuk/Sembunyi" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Kocok" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Kocok album" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Kocok semua" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Kocok senarai main" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Kocok trek dalam album ini" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Daftar masuk" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Daftar keluar" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Mendaftar masuk..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Artis serupa" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Saiz" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Saiz:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Langkau mengundur dalam senarai main" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Kiraan langkau" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Langkau maju dalam senarai main" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Langkau trek terpilih" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Langkau trek" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Kulit album kecil" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Palang sisi kecil" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Senarai main pintar" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Senarai main pintar" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Maklumat Lagu" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Maklumat lagu" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Maaf" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Isih mengikut genre (secara berabjad)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Isih mengikut genre (mengikut populariti)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Isih mengikut nama stesen" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Isih lagu mengikut" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Pengisihan" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Sumber" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Sumber" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Ralat daftar masuk Spotify" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "URL senarai main Spotify" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Pemalam Spotify" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Pemalam Spotify tidak dipasang" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "URL lagu Spotify" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Piawai" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Disukai" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Mula meretas" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Mulakan senarai main semasa dimainkan" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Mulakan transkod" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Mula menaip sesuatu pada kotak gelintar di ata untuk mengisi senarai keputusan gelintar ini" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Memulakan %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Memulakan..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Henti" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Henti selepas" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Henti selepas setiap trek" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Henti selepas setiap trek" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Henti selepas trek ini" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Henti main balik" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Henti main selepas trek semasa" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Henti main selepas trek: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Dihentikan" #: core/song.cpp:431 msgid "Stream" msgstr "Strim" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Penstriman dari pelayan Subsonic memerlukan lesen pelayan yang sah selepas tempoh percubaan 30-hari." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Keahlian penstriman" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Pelanggan" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Berjaya" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "Berjaya menulis %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Tag dicadangkan" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Ringkasan" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Tinggi lampau (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Tinggi lampau (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Format disokong" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Segerak statistik ke fail sekarang" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Menyegerak kotak masuk Spotify" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Menyegerak senarai main Spotify" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Menyegerak trek terbintang Spotify" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Warna sistem" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Tab di atas" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Pengambil tag" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Kadar bit sasaran" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Tekno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Pilihan teks" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Terima kasih kepada" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Perintah \"%1\" tidak dapat dimulakan." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Kulit album lagu yang kini dimainkan" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "Direktori %1 tidak sah" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "Nilai kedua mesti lebih besar daripada nilai pertama!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Laman yang anda pinta tidak wujud!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Laman yang anda pinta bukan imej!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Tempoh percubaan pelayan Subsonic telah tamat. Sila beri derma untuk dapatkan kunci lesen. Lawati subsonic untuk perincian." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Versi Clementine yang anda telah kemaskini memerlukan imbas semula pustaka penuh kerana terdapat beberapa fitur baharu yang tersenarai di bawah:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Terdapat lagu lain di dalam album ini" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Terdapat masalah komunikkasi dengan gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Terdapat masalah mengambil data meta dari Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Terdapat masalah menghurai respon dari Kedai iTunes" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Terdapat masalah menyalin beberapa lagu. Fail berikut tidak boleh disalin:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Terdapat masalah memadam beberapa lagu. Fail berikut tidak boleh dipadam:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Fail ini akan dipadam dari peranti, anda pasti untuk meneruskan?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Fail ini akan dipadam secara kekal dari cakera, anda pasti mahu teruskan?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Folder ini akan diimbas untuk muzik yang memenuhi pustaka anda" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Tetapan ini akan digunakan dalam dialog \"Transkod Muzik\", dan bila menukar muzik sebelum disalin ke sesuatu peranti." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Aras ketiga" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Tindakan ini akan mencipta pangkalan data yang mungkin sebesar 150 MB.\nAdakah anda ingin meneruskan juga?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Album ini tidak tersedia dalam format yang dipinta" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Ia boleh diubah kemudian melalui keutamaan" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Peranti ini mesti disambung dan dibuka sebelum Clementine boleh lihat format fail yang ianya sokong." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Peranti ini menyokong format fail berikut:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Peranti ini tidak akan berfungsi dengan baik" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Ini ialah peranti MTP, tapi anda telah mengkompil Clementine tanpa sokongan libmtp." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Ini ialah iPod, tapi anda telah mengkompil Clementine tanpa sokongan libgpod." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Ini kali pertama anda menyambung ke peranti ini. Sekarang Clementine akan mengimbas peranti ini untuk mencari fail muzik - ia mungkin mengambil masa." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Pilihan ini boleh diubah dalam keutamaan \"Kelakuan\"" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Strim ini untuk pelanggan berbayar sahaja" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Peranti jenis ini tidak disokong: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "Langkah masa" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Tajuk" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Hari ini" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Togol OSD Menarik" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Togol skrin penuh" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Togol status baris gilir" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Togol scrobble" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Togol ketampakan paparan-atas-skrin menarik" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Esok" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Terlalu banyak arah semula" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Trek terbaik" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Jumlah album:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Jumlah bait dipindah" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Jumlah permintaan rangkaian dibuat" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Trek" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Trek" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Transkod Muzik" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Log Transkoder" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Membuat transkod" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Membuat transkod %1 fail menggunakan bebenang %2" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Pilihan transkod" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Matikan" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Jalur lebar ultra (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Tidak boleh sambung" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Tidak boleh muat turun %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Tidak diketahui" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Jenis-kandungan tidak diketahui" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Ralat tidak diketahui" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Nyahtetap kulit muka" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Jangan langkau trek terpilih" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Jangan langkau trek" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Jangan langgan" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Konsert Akan Datang" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Kemaskini" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Kemaskini semua podcast" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Kemaskini folder pustaka yang berubah" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Kemaskini pustaka bila Clemetine bermula" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Kemaskini podcast ini" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Mengemaskini" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Mengemaskini %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Mengemaskini %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Mengemaskini pustaka" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Penggunaan" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Guna tag Artis Album bila tersedia" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Guna kekunci pintasan Gnome" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Guna Warna Psikedelik" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Guna data meta Gandaan Main Semula jika tersedia" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Guna SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Guna Wii Remote" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Guna set warna suai" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Guna mesej suai untuk pemberitahuan" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Guna kawalan jauh rangkaian" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Guna pengesahihan" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Guna enjin pengurusan kadar bit" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Guna mod dinamik" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Guna pemberitahuan untuk laporkan status Wii Remote" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Guna pembentukan hingar sementara" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Guna lalai sistem" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Guna set warna lalai sistem" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Guna tetapan proksi sistem" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Guna penormalan volum" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Digunakan" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Antaramuka pengguna" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Nama pengguna" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Menggunakan menu untuk tambah lagu akan..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "MP3 VBR" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Kadar bit pembolehubah" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Pelbagai artis" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Versi %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Lihat" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Mod pengvisualan" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Pengvisualan" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Tetapan pengvisualan" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Pengesanan aktiviti suara" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Volum %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Dinding" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Beri amaran bila menutup tab senarai main" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Laman Sesawang" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Minggu" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Bila Clementine bermula" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Apabila mencari hasil seni album Clementine akan terlebih dahulu mencari fail gambar yang mengandungi salah satu dari perkataan ini. \nSekiranya tiada padanan ia akan menggunakan imej terbesar dalam direktori." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "Bila menyimpan senarai main, laluan fail sepatutnya" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Bila senarai kosong..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Kenapa tidak cuba..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Jalur lebar (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: diaktifkan" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: bersambung" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: bateri kritikal (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: dinyahaktif" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: terputus" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: bateri rendah (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Audio Windows Media" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Tanpa kulit muka:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Anda mahu alih lagu lain dalam album ini ke Artis Pelbagai juga?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Anda mahu jalankan imbas semula penuh sekarang?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Tulis semua statistik lagu ke dalam fail lagu" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Tulis data meta" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Nama pengguna atau kata laluan salah" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Tahun" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Tahun - Album" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Tahun" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Semalam" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Anda akan memuat turun album berikut" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Anda akan membuang senarai main %1 dari kegemaran anda, anda pasti?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Anda akan buang senarai main yang bukan bahagian dari senarai main kegemaran anda: senarai main akan dipadam (tindakan ini tidak boleh diundur). \nAnda pasti hendak teruskan?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Anda tidak mendaftar masuk." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Anda mendaftar masuk sebagai %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Anda telah mendaftar masuk." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Anda boleh ubah cara lagu disusun dalam pustaka." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Anda boleh dengar secara percuma tanpa akaun, tetapi ahli Perdana dapat mendengar strim berkualiti tinggi tanpa periklanan." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Anda boleh mendengar lagu Magnatune secara percuma tanpa akaun. Pembelian keahlian akan membuang mesej di akhir setiap trek." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Anda boleh dengar strim latar belakang pada masa yang sama dengan muzik lain." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Anda boleh guna Wii Remote anda sebagai kawalan jauh untuk Clementine. Sila rujuk wiki Clementine untuk maklumat lanjut.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Anda tidak mempunyai akaun Perdana Spotify." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Anda tidak mempunyai langganan aktif" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "Anda tidak perlu mendaftar masuk untuk gelintar dan dengar muzik dalam SoundCloud. Walaubagaimanapun, anda perlu daftar masuk untuk capai senarai main dan strim anda." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Anda telah mendaftar keluar dari Spotify, sila masuk-semula kata laluan anda dalam dialog Tetapan." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Anda telah mendaftar keluar dari Spotify, sila masuk-semula kata laluan anda." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Anda suka trek ini" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "Anda perlu lancar Keutamaan Sistem dan membolehkan Clementine untuk \"kawal komputer anda\" untuk guna pintasan sejagat dalam Clementine." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Anda perlu mulakan semula Clementine jika anda ubah bahasa." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Alamat IP anda:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Kelayakan Last.fm anda tidak betul" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Kelayakan Magnatune anda tidak betul" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Pustaka anda kosong!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Strim radio anda" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Scrobble anda: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Sistem anda tiada sokongan OpenGL, pengvisualan tidak tersedia." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Nama pengguna atau kata laluan anda tidak betul." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Sifar" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "tambah %n lagu" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "selepas" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "yang lalu" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "dan" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "automatik" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "sebelum" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "antara" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "terbesar dahulu" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "mengandungi" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "dilumpuhkan" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "cakera %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "tidak mengandungi" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "berakhir dengan" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "sama dengan" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "direktori gpodder.net" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "lebih besar dari" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "Peranti iPods dan USB buat masa ini tidak berfungsi dalam Windows. Maaf!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "ditempat terakhir" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "kurang dari" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "terpanjang dahulu" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "alih %n lagu" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "terbaharu dahulu" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "tidak sama" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "bukan ditempat terakhir" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "tidak hidup" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "paling lama dahulu" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "hidup" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "pilihan" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "atau imbas kod QR!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "tekan enter" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "buang %n lagu" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "terpendek dahulu" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "kocok lagu" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "terkecil dahulu" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "isih lagu" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "bermula dengan" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "henti" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "trek %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/my.po000066400000000000000000006733401260417502300237010ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Yhal Htet Aung , 2013-2014 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Burmese (http://www.transifex.com/davidsansome/clementine/language/my/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: my\n" "Plural-Forms: nplurals=1; plural=0;\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\nသီချင်းစာရင်းနာမည်ဘေးရှိကြယ်ပံုစံသင်္ကေတကိုနှိပ်ခါအနှစ်သက်ဆုံးသီချင်းစာရင်းများကိုလုပ်ဆောင်နိုင်\n\nအနှစ်သက်ဆံုးသီချင်းစာရင်းများကိုယခုနေရာတွေမှတ်သားထား" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "နေ့များ" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "တစ်စက္ကန့်ကီလိုဘိုက်နှုန်း" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr "မိုက်ခရိုစက္ကန့်" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr "ပွိုင့်ပမာဏ" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr "စက္ကန့်များ" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "သီချင်းများ" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 သီချင်းများ)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 အယ်လဘမ်များ" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 နေ့များ" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 လွန်ခဲ့သောနေ့များ" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 မှအပေါ် %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 သီချင်းစာရင်းများ (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 ကိုရွေးချယ်ခဲ့" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 သီချင်း" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 သီချင်းများ" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 သီချင်းများရှာတွေ့" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 သီချင်းများရှာတွေ့ (%2 ပြသနေ)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 တေးသံလမ်းကြောများ" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 ကူးပြောင်း" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: ဝီမိုတ်ဒပ်မော်ဂျူး" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 အခြားနားဆင်သူများ" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 စုစုပေါင်းတင်ဆက်မှုများ" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n ဖွင့်မရ" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n ပြီးဆံုး" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n လက်ကျန်" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "စာသားတန်းညှိ(&A)" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "အလယ်(&C)" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "စိတ်ကြိုက်(&C)" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "အပိုများ(&E)" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "အကူအညီ(&H)" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "ဖုံးကွယ်(&H) %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "ဖုံးကွယ်(&H)... " #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "ဘယ်(&L)" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "ဂီတ(&M)" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "တစ်ခုမျှ(&N)" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "သီချင်းစာရင်း(&P)" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "ထွက်(&Q)" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "စနစ်ပြန်ဆို(&R)" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "ညာ(&R)" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "ကုလားဖန်ထိုးစနစ်(&S)" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "ဝင်းဒိုးနဲ့အံကိုက်ကော်လံများကိုဆွဲဆန့်(&S)" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "ကိရိယာများ(&T)" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(အမျိုးမျိုးသောသီချင်းများပေါင်းစုံဖြတ်၍)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...နှင့်အမာရော့ခ်ကူညီသူများအားလံုး" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "၀" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "၀:၀၀:၀၀" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "၀ပီအိတ်စ်" #: core/utilities.cpp:119 msgid "1 day" msgstr "တစ်နေ့" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "တေးသံလမ်းကြောတစ်ခု" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "၁၂၈ကီလိုအမ်ပီသရီး" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "၄၀%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "ကျပန်းတေးသံလမ်းကြောများ၅၀" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "အရစ်ကျစနစ်သို့အခုအဆင့်မြှင့်" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

မစစ်ဆေးပါကကလီမန်တိုင်းသည်အဆင့်သတ်မှတ်ချက်များနှင့်အခြားစာရင်းဇယားများကိုသီးခြားအချက်အလက်အစုတွင်မှတ်သားပြီးဖိုင်များကိုပြုပြင်မွမ်းမံမှုမလုပ်။

စစ်ဆေးပါကစာရင်းဇယားများကိုအချက်အလက်အစုသာမကဖိုင်များတွင်တိုက်ရိုက်မှတ်သား

ပံုစံတိုင်းတွင်အလုပ်လုပ်မည်မဟုတ်သကဲ့သို့သတ်မှတ်ချက်မရိုကာတစ်ခြားဂီတဖွင့်စက်များဖတ်ရှုနိုင်လိမ့်မည်မဟုတ်။

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

စာလုံးရိုက်သွင်းကာရှာဖွေပါ ဥပမာ။အနုပညာရှင်:ဇော်ပိုင် sဇော်ပိုင်ပါဝင်သောအရာများကိုရှာဖွေ

ရယူနိုင်သောနယ်ပယ်များ: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

သီချင်းတိုက်သီချင်းများအားလံုးအတွက်သီချင်းများအဆင့်သတ်မှတ်ချက်များနှင့်ကိန်းဂဏန်းများကိုဖိုင်များအမည်များသို့ရေးလိမ့်မည်။

"အဆင့်သတ်မှတ်ချက်များနှင့်ကိန်းဂဏန်းများကိုဖိုင်အမည်များ"ရွေးပိုင်ခွင့်ကိုအမြဲတမ်းအသက်သွင်းထားပါကမလိုအပ်ပါ။

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

နှင့်အတူတိုကင်များစတင် %, ဥပမာ: %artist %album %title

⏎ ⏎

အကယ်၍သင်တွန့်လိမ်တွန့်ကွင်းများနှင့်တိုကင်ပါဝင်သောစာသားအပိုင်းများကိုဝိုင်းလျှင်၊ အကယ်၍တိုကင်ကအလွတ်ဖြစ်နေလျှင်အဲဒီအပိုင်းကိုဖုံးကွယ်။

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "စပေါ့တီဖိုင်းအရစ်ကျစနစ်စာရင်းတစ်ခုလိုအပ်။" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "မှန်ကန်သောကုဒ်ထည့်သွင်းနိုင်မှသာအသံုးပြုသူဆက်သွယ်နိုင်။" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "ချက်ချာသီချင်းစာရင်းသည်သင့်ရဲ့သီချင်းတိုက်မှသီချင်းများကိုပြောင်းလဲနိုင်ပါသည်။ သီချင်းများကိုရွေးချယ်ခြင်းနည်းလမ်းအမျိုးမျိုးပါဝင်သောချက်ချာသီချင်းစာရင်းအမျိုးမျိုးလည်းရှိပါသည်။" #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "သီချင်းသည်လိုအပ်ချက်များနှင့်ပြည့်စံုပါကသီချင်းစာရင်းတွင်ထည့်သွင်းပါဝင်ပါလိမ့်မည်။" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "အေ-ဇီး" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "အေအေစီ" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "အေအေစီ၁၂၈ကီလို" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "အေအေစီ၃၂ကီလို" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "အေအေစီ၆၄ကီလို" #: core/song.cpp:422 msgid "AIFF" msgstr "အေအိုင်အက်ဖ်အက်ဖ်" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "အံ့မခန်းဖွယ်အားလံုးကိုဟိုက်ဖ်နိုဖားသို့" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "ဖျက်သိမ်း" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "ခန့် %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "ကလီမန်တိုင်းအကြောင်း" #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "ကျူတီအကြောင်း..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "အကြွင်းမဲ့" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "စာရင်းအသေးစိတ်အကြောင်းအရာများ" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "စာရင်းအသေးစိတ်အကြောင်းအရာများ(အရစ်ကျစနစ်)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "လုပ်ဆောင်ချက်" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "လုပ်ဆောင်ချက်" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "ဝိုင်ယာမုတ်သက်ဝင်လှုပ်ရှား/သက်ဝင်မလှုပ်ရှား" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "လှုပ်ရှားမှုများသီချင်းစီးကြောင်း" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "ပို့စ်ကဒ်ထည့်" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "သီချင်းစီးကြောင်းထည့်" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "သတိပေးချက်ပုံစံလက်ခံပါကလိုင်းအသစ်ထည့်" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "လုပ်ဆောင်ချက်ထည့်ပါ" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "သီချင်းစီးကြောင်းနောက်တစ်ခုထည့်..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "ဖိုင်လမ်းညွှန်ထည့်..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "ဖိုင်ထည့်" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "ဖိုင်များကိုပံုစံပြောင်းလဲသူသို့ထည့်ပါ" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "ဖိုင်(များ)ကိုပံုစံပြောင်းလဲသူသို့ထည့်ပါ" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "ဖိုင်ထည့်..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "ဖိုင်များကိုပံုစံပြောင်းလဲရန်ထည့်ပါ" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "ဖိုင်တွဲထည့်" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "ဖိုင်တွဲထည့်..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "ဖိုင်တွဲအသစ်ထည့်..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "ပို့စ်ကဒ်ထည့်" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "ပို့စ်ကဒ်ထည့်..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "ရှာဖွေစကားရပ်ထည့်ပါ" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "သီချင်းတေးသံအမည်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "သီချင်းတေးသံအနုပညာရှင်အမည်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "သီချင်းအနုပညာရှင်အမည်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "အလိုအလျောက်သီချင်းရမှတ်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "သီချင်းတေးရေးအမည်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "သီချင်းချပ်ပြားဝိုင်းအမည်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "သီချင်းဖိုင်အမည်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "သီချင်းအမျိုးအစားအမည်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "သီချင်းအုပ်စုခြင်းအမည်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "သီချင်းအရှည်အမည်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "တင်ဆင်သူအုပ်စုခြင်းအမည်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "သီချင်းဖွင့်သံအရေအတွက်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "သီချင်းအဆင့်သတ်မှတ်ချက်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "သီချင်းကျော်သံအရေအတွက်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "သီချင်းခေါင်းစဉ်အမည်ထည့်" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "မှတ်ဉာဏ်ဝှက်ထဲသို့သီချင်းထည့်" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "သီချင်းတေးသံလမ်းကြောအမည်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "သီချင်းနှစ်အမည်ထည့်" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "\"အချစ်\" ခလုပ်ကိုနှိပ်လိုက်သောအခါ \"ငါ့သီချင်း\" ထဲသို့သီချင်းများထည့်" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "သီချင်းစီးကြောင်းထည့်..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "\"ငါ့သီချင်း\" ထဲသို့ထည့်" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "သီချင်းစာရင်းနောက်တစ်ခုသို့ထည့်" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "မှတ်သားခြင်းစာရင်းများသို့ထည့်" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "သီချင်းစာရင်းသို့ထည့်" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "စီတန်းထဲသို့ထည့်ပါ" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "မှတ်သားခြင်းစာရင်းများသို့အသုံးပြုသူထည့်" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "ဝီမိုတ်ဒပ်လုပ်ဆောင်ချက်ကိုထည့်" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "ထည့်..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "ယခုလကိုထည့်သွင်းပြီး" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "ယခုအပတ်ကိုထည့်သွင်းပြီး" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "ယခုနှစ်ကိုထည့်သွင်းပြီး" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "ယခုနေ့ကိုထည့်သွင်းပြီး" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "၃လအတွင်းထည့်သွင်းပြီး" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "အဆင့်မြင့်အုပ်စုဖွဲ့ခြင်း..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "ပြီးနောက်" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "ကူးယူပြီးနောက်..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "အယ်လဘမ်" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "အယ်လဘမ် (တေးသံလမ်းကြောများအားလံုးအတွက်အကောင်းဆုံးအသံကျယ်ကျယ်)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "အယ်လဘမ်အနုပညာရှင်" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "အယ်လဘမ်အဖုံး" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "ဂျမန်ဒို.ကွမ်းမှအယ်လဘမ်အချက်အလက်..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "အဖုံးများနဲ့အယ်လဘမ်များ" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "အဖုံးများနဲ့အယ်လဘမ်များ" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "ဖိုင်များအားလံုး(*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "အံ့မခန်းဖွယ်အားလံုးကိုဟိုက်ဖ်နိုဖားသို့!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "အယ်လဘမ်များအားလံုး" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "အနုပညာရှင်များအားလံုး" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "ဖိုင်များအားလံုး(*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "သီချင်းစာရင်းများအားလံုး(%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "ဘာသာပြန်များအားလံုး" #: library/library.cpp:98 msgid "All tracks" msgstr "တေးသံလမ်းကြောများအားလံုး" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "ယခုကွန်ပျုတာမှသီချင်းကူးဆွဲရန်အသုံးပြုသူကိုခွင့်ပြု။" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "ကူးဆွဲများခွင့်ပြု" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "အလယ်/ဘေးကုဒ်ပြောင်းခွင့်ပြု" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "မူရင်းများနှင့်အတူ" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "အဓိကဝင်းဒိုးအမြဲတမ်းဖုံးကွယ်" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "အဓိကဝင်းဒိုးအမြဲတမ်းပြသ" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "သီချင်းအမြဲတမ်းစတင်ဖွင့်" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "စပေါ့တီဖိုင်ကိုကလီမန်တိုင်းတွင်အသံုးပြုရန်နောက်ထပ်ဖြည့်စွက်ပရိုဂရမ်လိုအပ်။ သင်ကူးဆွဲပြီးယခုသွင်းလိုပါသလား?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "အိုင်ကျွန်းအချက်အလက်အစုထည့်သွင်းနေစဉ်အမှားပြ" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "'%1' သို့အချက်အလက်ဖွဲ့စည်းမှုရေးနေစဉ်အမှားပြ" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "အမှားသေချာမသိဖြစ်ပေါ်။" #: ui/about.cpp:85 msgid "And:" msgstr "နှင့်:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "ဒေါသထွက်" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "ပုံပန်းသဏ္ဎာန်" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "ဖိုင်များ/ယူအာအလ်များသီချင်းစာရင်းသို့ဖြည့်စွက်" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "ယခုသီချင်းစာရင်းသို့ဖြည့်စွက်" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "သီချင်းစာရင်းသို့ဖြည့်စွက်" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "ဖြတ်ညှပ်ခံရခြင်းကာကွယ်ရန်ချုံ့" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "ယခု \"%1\" ကြိုတင်ထိန်းညှိပယ်ဖျက်မှာသေချာသလား?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "ယခုသီချင်းစာရင်းဇယားပြန်လည်ထိန်းညှိမှာသေချာသလား?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "သီချင်းတိုက်သီချင်းများအားလံုးအတွက်သီချင်းကိန်းဂဏန်းအချက်အလက်များကိုသီချင်းဖိုင်အဖြစ်ရေးလိုပါသလား?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "အနုပညာရှင်" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "အနုပညာရှင်အချက်အလက်" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "အနုပညာရှင်အမည်များ" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "အနုပညာရှင်အမည်၏အစ" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "အသံပုံစံ" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "အသံထွက်အား" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "အထောက်အထားစစ်ဆေးခြင်းမမှန်" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "စာဆို" #: ui/about.cpp:68 msgid "Authors" msgstr "စာဆိုများ" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "အလိုအလျောက်" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "အလိုအလျောက်" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "အလိုအလျောက်မွမ်းမံခြင်း" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "သီချင်းတိုက်ဖွဲ့စည်းပံုမှာတစ်ခုတည်းအတန်းအစားများအလိုအလျောက်ဖွင့်" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "ရနိုင်" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "ပျမ်းမျှဘစ်နှုန်း" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "ပျမ်းမျှပုံအရွယ်အစား" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "ဘီဘီစီပို့စ်ကဒ်များ" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "ဘီပီအမ်" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "နောက်ခံသီချင်းစီးကြောင်းများ" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "နောက်ခံအရောင်" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "နောက်ခံပုံ" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "နောက်ခံအလင်းပိတ်" #: core/database.cpp:648 msgid "Backing up database" msgstr "အချက်အလက်အစုအရန်မှတ်သိမ်း" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "ချိန်ညှိချက်" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "တိုင်စိစစ်သူ" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "အခြေခံအပြာရောင်" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "အခြေခံအသံအမျိုးအစား" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "လုပ်ဆောင်ပုံ" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "အကောင်းဆုံး" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "%1 မှအတ္ထုပ္ပတ္တိ" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "ဘစ်နှုန်း" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "ဘစ်နှုန်း" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "ဘစ်နှုန်း" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "ဘလောက်စိစစ်သူ" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "ဘလောက်အမျိုးအစား" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "မှုန်ဝါးပမာဏ" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "စာကိုယ်" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "မြည်ဟိန်းသံစိစစ်သူ" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "သေတ္တာ" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "လျှောက်ကြည့်..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "ကြားခံကြာချိန်" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "ကြားခံ" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "သို့သော်ရင်းမြစ်များမလုပ်ဆောင်နေ:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "ခလုတ်များ" #: core/song.cpp:428 msgid "CDDA" msgstr "စီဒီဒီအေ" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "ကယူးအပြားအထောက်အကူ" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "မှတ်ဉာဏ်ဝှက်လမ်းကြောင်း:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "မှတ်ဉာဏ်ဝှက်ခြင်း" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "မှတ်ဉာဏ်ဝှက်ခြင်း %1" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "ပယ်ဖျက်" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "အနုပညာအဖုံးပြောင်းလဲ" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "ဖွန်အရွယ်ပြောင်းလဲ" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "ပြန်ဆိုစနစ်ပြောင်းလဲ" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "အတိုကောက်ပြောင်းလဲ..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "ကုလားဖန်ထိုးစနစ်ပြောင်းလဲ" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "ဒီဘာသာစကားပြောင်းလဲ" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "ပြန်ဖွင့်လိုလားချက်များပြောင်းလဲခြင်းသည်နောက်ဖွင့်ဆဲသီချင်းများတွင်သက်ရောက်မှုရှိ" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "တွဲအသစ်များစစ်ဆေးခြင်း" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "မွမ်းမံများစစ်ဆေးခြင်း" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "မွမ်းမံများစစ်ဆေးခြင်း..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Vk.com မှတ်ဉာဏ်ဝှက်ဖိုင်လမ်းညွှန်ရွေးချယ်" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "သင့်ရဲ့ချက်ချာသီချင်းစာရင်းအတွက်နာမည်တစ်ခုရွေး" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "အလိုအလျောက်ရွေးချယ်ခြင်း" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "အရောင်ရွေးချယ်..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "ဖွန်ရွေးချယ်..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "စာရင်းမှရွေး" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "သီချင်းစာရင်းကိုဘယ်သို့မျိုးတူစုမည်၊ ပြီးနောက်သီချင်းဘယ်နှစ်ပုဒ်ပါဝင်မည်ဟုရွေးချယ်ပါ" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "ပို့စ်ကဒ်ကူးဆွဲဖိုင်လမ်းညွှန်ရွေးချယ်" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "သီချင်းစာသားများရှာဖွေရန်ကလီမန်တိုင်းအသံုးချ၍ဝက်ဘ်ဆိုက်များရွေးချယ်" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "ဂန္တဝင်" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "ရှင်းထုတ်ဖြစ်" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "ဖယ်ထုတ်" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "သီချင်းစာရင်းဖယ်ထုတ်" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "ကလီမန်တိုင်း" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "ကလီမန်တိုင်းအမှားပြ" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "ကလီမန်တိုင်းလိမ္မော်" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "ကလီမန်တိုင်းပုံဖော်ကြည့်ခြင်း" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "လက်ရိုပစ္စည်းသို့ကူးယူကာပစ္စည်းမှဖွင့်နိုင်သောပုံစံသို့ကလီမန်တိုင်းသည်ဂီတကိုအလိုအလျောက်ကူးပြောင်းနိုင်" #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "ဘောက်စ်သို့ကူးတင်ပြီးဂီတများကိုကလီမန်တိုင်းဖွင့်နိုင်" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "တရော့ဘောက်စ်သို့ကူးတင်ပြီးဂီတများကိုကလီမန်တိုင်းဖွင့်နိုင်" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "ဂူဂယ်ဒရိုက်ဗ်သို့ကူးတင်ပြီးဂီတများကိုကလီမန်တိုင်းဖွင့်နိုင်" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "တေးသံလမ်းကြောင်းပြောင်းလဲသွားသောအခါကလီမန်တိုင်းသည်မှာကြားချက်ပြသနိုင်" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "ကလီမန်တိုင်းသည်မှာယူခြင်းစာရင်းရှိတစ်ခြားကွန်ပျုတာများနှင့်ပို့စ်ကဒ်လုပ်ငန်းသုံးပရိုဂရမ်များနှင့်တစ်သားတည်းလုပ်ဆောင်နိုင်။စာရင်းဖန်တီးပါ." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "ပရောဂျက်အမ်ပုံဖော်ကြည့်ခြင်းများတစ်ခုမျှကလီမန်တိုင်းမထည့်သွင်းနိုင်။ ကလီမန်တိုင်းသေချာစွာသွင်းပြီးကြောင်းစစ်ဆေးပါ။" #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "ကလီမန်တိုင်းပုံကြည့်ကိရိယာ" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "ယခုဖိုင်အတွက်ရလဒ်များကလီမန်တိုင်းမရှာဖွေနိုင်။" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "ကလီမန်တိုင်းသည်ဂီတကိုဤတွင်ရှာဖွေ: " #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "ဂီတအနည်းငယ်ထည့်ရန်ဒီမှာကလစ်နှိပ်ပါ" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "မှတ်သားသိမ်းဆည်းရန်ယခုသီချင်းစာရင်းကိုအနှစ်သက်ဆံုးလုပ်ရန်ယခုနေရာတွင်ကလစ်နှိပ်ပြီးဘယ်ဘက်ရှိဘားတွင်ရှိသီချင်းစာရင်းများမှတစ်ဆင့်သံုးစွဲနိုင်" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "လက်ကျန်အချိန်နှင့်စုစုပေါင်းအချိန်အကြားဖွင့်ပိတ်လုပ်ရန်ကလစ်နှိပ်" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "ဖွင့်ဝင်ခလုတ်ကိုနှိပ်လျှင်ဝက်ဘ်ဘရောက်ဇာဖွင့်။ ဖွင့်ဝင်ပြီးနောက်ကလီမန်တိုင်းသို့သွားပါ။" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "ပိတ်" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "သီချင်းစာရင်းပိတ်" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "ပုံဖော်ကြည့်ခြင်းပိတ်" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "ယခုဝင်းဒိုးပိတ်လျှင်ကူးဆွဲပယ်ဖျက်သွားလိမ့်မည်။" #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "ယခုဝင်းဒိုးပိတ်လျှင်အယ်လဘမ်အဖုံးများရှာဖွေခြင်းရပ်သွားလိမ့်မည်။" #: ui/equalizer.cpp:114 msgid "Club" msgstr "ကလပ်" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "အရောင်များ" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "အမျိုးအစားစာရင်းခွဲခြားရန်ပုဒ်ရပ်: အမျိုးအစား, အမျိုးအစားက ၀-၃" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "ထင်မြင်ချက်" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "အသိုင်းအဝိုင်းရေဒီယို" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "အမည်များအလိုအလျောက်ဖြည့်" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "အမည်များအလိုအလျောက်ဖြည့်..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "တေးရေး" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "ပုံစံပြင် %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "မက်နာကျွန်းပုံစံပြင်..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "အတိုကောက်များပုံစံပြင်" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "စပေါ့တီဖိုင်ပုံစံပြင်..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "ဆပ်ဆိုးနစ်ပုံစံပြင်..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Vk.com ပုံစံပြင်..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "အနှံ့ရှာဖွေပုံစံပြင်..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "သီချင်းတိုက်ပုံစံပြင်..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "ပို့စ်ကဒ်များပုံစံပြင်..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "ပုံစံပြင်..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "သက်ဝင်လှုပ်ရှား/သက်ဝင်မလှုပ်ရှားလုပ်ဆောင်ချက်သံုး၍ဝီအဝေးထိန်းကိုချိတ်ဆက်" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "ပစ္စည်းချိတ်ဆက်" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "စပေါ့တီဖိုင်သို့ချိတ်ဆက်" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "ဆာဗာမှဆက်သွယ်ခြင်းငြင်းပယ်၊ဆာဗာယူအာအယ်ပြန်စစ်ဆေးပါ။ ဥပမာ: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "ဆက်သွယ်ချိန်ကုန်ဆံုး၊ ဆာဗာယူအာအယ်ပြန်စစ်ဆေးပါ။ ဥပမာ: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "ခလုတ်ခုံ" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "ကိန်းသေဘစ်နှုန်း" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "ဂီတအားလံုးကူးပြောင်း" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "ယခုပစ္စည်းမဖွင့်နိုင်သောဂီတမျိုးစံုကူးပြောင်း" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "အောက်ခံကတ်ပြားသို့ကူးယူ" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "ပစ္စည်းသို့ကူးယူ" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "သီချင်းတိုက်သို့ကူးယူ..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "မူပိုင်ခွင့်" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "ဆပ်ဆိုးနစ်သို့မဆက်သွယ်နိုင်၊ ဆာဗာယူအာအယ်ပြန်စစ်ဆေးပါ။ ဥပမာ: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "ဂျီသီချင်းစီးကြောင်းအစိတ်အပိုင်းမဖန်တီးနိင် \"%1\" - လိုအပ်သောဂျီသီချင်းစီးကြောင်းဖြည့်စွက်ပရိုဂရမ်များအားလံုးသွင်းပြီးပါစေ" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "%1 အတွက်မြုစာမရှာဖွေနိင်၊ ဂျီသီချင်းစီးကြောင်းလိုအပ်သောဖြည့်စွက်ပရိုဂရမ်များသွင်းပြီးမပြီးစစ်ဆေး" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "%1 အတွက်သီချင်းပြောင်းသူမရှာဖွေနိင်၊ ဂျီသီချင်းစီးကြောင်းလိုအပ်သောဖြည့်စွက်ပရိုဂရမ်များသွင်းပြီးမပြီးစစ်ဆေး" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "ပေးပို့ဖိုင်ဖွင့်မရ %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "အဖုံးမန်နေဂျာ" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "ပုံမြှပ်မှအနုပညာအဖုံး" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "%1 မှအနုပညာအဖုံးအလိုအလျောက်ထည့်သွင်း" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "အနုပညာအဖုံးလက်အားသံုးမသတ်မှတ်" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "အနုပညာအဖုံးသတ်မှတ်မထား" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "%1 မှအနုပညာအဖုံးသတ်မှတ်" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "%1 မှအဖုံးများ" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "တေးသံလမ်းကြောများအလိုအလျောက်ပြောင်းလဲသွားသောအခါအရောင်မှိန်ဖြတ်သန်း" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "တေးသံလမ်းကြောများလက်အားသံုးပြောင်းလဲသွားသောအခါအရောင်မှိန်ဖြတ်သန်း" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "ကွန်+အော်+ဗီ" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "ကွန်+အောက်" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "ကွန်+အီး" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "ကွန်+အိပ်ရ့်ှ" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "ကွန်+ဂျေ" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "ကွန်+ကေ" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "ကွန်+အယ်လ်" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "ကွန်+အမ်" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "ကွန်+အန်" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "ကွန်+အို" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "ကွန်+ပီ" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "ကွန်+ကျူ" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "ကွန်+အက်စ်" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "ကွန်+ရှစ်ပ်+အေ" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "ကွန်+ရှစ်ပ်+အို" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "ကွန်+တီ" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "ကွန်+အပေါ်" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "စိတ်ကြိုက်" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "စိတ်ကြိုက်ပုံ:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "စိတ်ကြိုက်မှာကြားချက်ချိန်ညှိချက်" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "စိတ်ကြိုက်..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "ဒီဘတ်စ်လမ်းကြောင်း" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "အက" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "အချက်အလက်အစုပျက်ဆီးနေမှုတွေ့ရှိ။ https://code.google.com/p/clementine-player/wiki/DatabaseCorruption အချက်အလက်အစုမည်သို့ပြန်ယူရန်ဤတွင်ဖတ်ရှု" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "ရက်စွဲဖန်တီးပြီး" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "ရက်စွဲမွမ်းမံပြီး" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "နေ့များ" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "မူလအခြေအနေ(&f)" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "အသံပမာဏ၄%ခန့်လျှော့ချ" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "အသံပမာဏ ရာခိုင်နှုန်းခန့်လျှော့ချ" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "အသံပမာဏလျှော့ချ" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "မူလပံုစံနောက်ခံပုံ" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "မူလပံုစံများ" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "ပုံဖော်ကြည့်ခြင်းများအကြားနှောင့်နှေး" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "ပယ်ဖျက်" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "ကူးဆွဲပြီးအချက်အလက်ပယ်ဖျက်" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "ဖိုင်များပယ်ဖျက်" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "ပစ္စည်းမှပယ်ဖျက်..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "ဓာတ်ပြားမှပယ်ဖျက်..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "ဖွင့်ပြီးတွဲများပယ်ဖျက်" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "ကြိုတင်ထိန်းညှိပယ်ဖျက်" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "ချက်ချာသီချင်းစာရင်းပယ်ဖျက်" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "မူရင်းဖိုင်များပယ်ဖျက်" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "ဖိုင်များပယ်ဖျက်နေ" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "ရွေးချယ်တေးသံလမ်းကြောများမစီတန်း" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "တေးသံလမ်းကြောမစီတန်း" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "သွားမည့်နေရာ" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "အသေးစိတ်အကြောင်းအရာများ..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "ပစ္စည်း" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "ပစ္စည်းဂုဏ်သတ္တိများ" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "ပစ္စည်းနာမည်" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "ပစ္စည်းဂုဏ်သတ္တိများ..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "ပစ္စည်းများ" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "စကားပြော" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "သင်ဆိုလိုခဲ့သလား" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "ကွန်ပျုတာစနစ်ဖြင့်တင်သွင်း" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "စကားဝှက်ကွန်ပျုတာစနစ်ဖြင့်တင်သွင်း" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "အသင်းဝင်အမည်ကွန်ပျုတာစနစ်ဖြင့်တင်သွင်း" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "အင်တာနက်တိုက်ရိုက်ဆက်သွယ်မှု" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "ဖိုင်လမ်းညွှန်" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "ကြာချိန်မလုပ်ဆောင်စေ" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "စိတ်နေစိတ်ထားဘားမျဉ်းတိုးတက်လာမှုမလုပ်ဆောင်စေ" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "မလုပ်ဆောင်စေ" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "မလုပ်ဆောင်စေ" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "ချပ်ပြားဝိုင်း" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "ဆက်လက်မထုတ်လွှင့်ခြင်း" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "ပြသခြင်းရွေးပိုင်ခွင့်များ" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "ဖန်သားပြင်ပေါ်ပံုရိပ်ပြသခြင်း" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "သီချင်းတိုက်အပြည့်ပြန်လည်ဖတ်ရှု" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "ဂီတတစ်ခုမှမကူးပြောင်း" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "အစားထိုးမရေး" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "မပြန်ဆို" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "အနုပညာရှင်များအမျိုးမျိုးမပြသ" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "ကုလားဖန်မထိုး" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "မရပ်ဆိုင်းနဲ့!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "လှုဒါန်း" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "ဖွင့်ရန်ကလစ်နှစ်ခါနှိပ်" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "ကလစ်နှစ်ခါနှိပ်ခြင်းဖြင့်သီချင်းဟာ..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "တွဲများ %n ကူးဆွဲ" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "ဖိုင်လမ်းညွှန်ကူးဆွဲ" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "သို့တွဲများကူးဆွဲ" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "အသင်းဝင်ကူးဆွဲ" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "တွဲအသစ်များအလိုအလျောက်ကူးဆွဲ" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "စီတန်းပြီးကူးဆွဲ" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "စက်ရုပ်အပ်များကူးဆွဲ" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "ဒီအယ်လဘမ်ကူးဆွဲ" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "ဒီအယ်လဘမ်ကူးဆွဲ..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "ဒီတွဲကူးဆွဲ" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "ကူးဆွဲ..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "ကူးဆွဲ(%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "အိုင့်ကက်စ်ဖိုင်လမ်းညွှန်ကူးဆွဲနေ" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "ဂျမန်တိုစာရင်းကူးဆွဲနေ" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "မက်နကျွန်းစာရင်းကူးဆွဲနေ" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "စပေါ့တီဖိုင်ဖြည့်စွက်ပရိုဂရမ်ကူးဆွဲနေ" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "အချက်အလက်ဖွဲ့စည်းမှုကူးဆွဲနေ" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "ပြန်လည်နေရာချထားရန်တရွတ်တိုက်ဆွဲ" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "တရော့ဘောက်စ့်" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "ကြာချိန်" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "စနစ်အရှင်ဖွင့်ထား" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "ကျပန်းရောသမမွှေအရှင်" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "ချက်ချာသီချင်းစာရင်းပြင်ဆင်..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "အမည်ပြင်ဆင် \"%1\"..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "အမည်ပြင်ဆင်..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "အမည်များပြင်ဆင်..." #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "တေးသံလမ်းကြောအချက်အလက်ပြင်ဆင်" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "တေးသံလမ်းကြောအချက်အလက်ပြင်ဆင်..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "တေးသံလမ်းကြောများအချက်အလက်ပြင်ဆင်..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "ပြင်ဆင်..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "အီးမေးလ်" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "ဝီအဝေးထိန်းအထောက်အကူလုပ်ဆောင်စေ" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "အသံထိန်းညှိသူလုပ်ဆောင်စေ" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "ကလီမန်တိုင်းအလုပ်လုပ်နေစဉ်အတိုကောက်များလုပ်ဆောင်စေ" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "ရှာဖွေရလဒ်များတွင်ပါဝင်စေရန်အောက်ရှိရင်းမြစ်များကိုလုပ်ဆောက်စေ။ ရလဒ်များအစဉ်အလိုက်ပြသလိမ့်မည်။" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "လက်စ်.အက်ဖ်အမ်အလိုအလျောက်သီချင်းနာမည်ပေးပို့ခြင်းလုပ်ဆောင်စေ/မလုပ်ဆောင်စေ" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "ရှုပ်ထွေးမှုကုဒ်ပြောင်း" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "အင်ဂျင်အရည်အသွေးကုဒ်ပြောင်း" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "စနစ်ကုဒ်ပြောင်း" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "ယူအာအလ်ထည့်" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "အင်တာနက်မှအဖံုးများကူးဆွဲရန်ယူအာအလ်ထည့်ပါ:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "တင်ပို့ပြီးအဖံုးများအတွက်ဖိုင်နာမည်ထည့်(နောက်ဆက်တွဲမပါ):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "ဒီသီချင်းစာရင်းအတွက်နာမည်အသစ်တစ်ခုရွေး" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "ကွန်ပျုတာနှင့်အင်တာနက်ပေါ်တွင်ဂီတရှာဖွေရန်ရှာဖွေရလဒ်များကိုအပေါ်တွင်ထည့်သွင်းပါ" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "အိုင်ကျွန်းစတိုးထဲရှိပို့စ်ကဒ်များကိုရှာဖွေရန်ရှာဖွေစကားရပ်များကိုအောက်တွင်ထည့်သွင်းပါ" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "ဂျီပေါ့တာ.နက်ထဲရှိပို့စ်ကဒ်များကိုရှာဖွေရန်ရှာဖွေစကားရပ်များကိုအောက်တွင်ထည့်သွင်းပါ" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "ရှာဖွေစကားရပ်များဒီမှာထည့်သွင်း" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "အင်တာနက်ရေဒီယိုသီချင်းစီးကြောင်းယူအာအလ်ထည့်:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "ဒီဖိုင်တွဲအတွက်နာမည်အသစ်တစ်ခုရွေး" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "ကလီမန်တိုင်းသို့ချိတ်ဆက်ရန်ယခုအပ်တွင်အိုင်ပီထည့်သွင်းပါ။" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "စုပေါင်းမှုတစ်ခုလုံး" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "အသံထိန်းညှိသူ" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "--log-levels *:1တူညီ" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Equivalent to --log-levels *:3တူညီ" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "အမှားပြ" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "အမ်တီပီပစ္စည်းချိတ်ဆက်မှုအမှားပြ" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "သီချင်းများကူးယူမှုအမှားပြ" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "သီချင်းများပယ်ဖျက်မှုအမှားပြ" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "စပေါ့တီဖိုင်ဖြည့်စွက်ပရိုဂရမ်ကူးဆွဲမှုအမှားပြ" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "ထည့်သွင်းခြင်းအမှားပြ %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "ဒီအိုင်.အက်ဖ်အမ်သီချင်းစာရင်းထည့်သွင်းအမှားပြ" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "ဆောင်ရွက်ခြင်းအမှားပြ %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "အသံဓာတ်ပြားထည့်သွင်းနေခြင်းအမှားပြ" #: library/library.cpp:68 msgid "Ever played" msgstr "သီချင်းဖွင့်ခဲ့သမျှ" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "၁၀မိနစ်တိုင်း" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "၁၂နာရီတိုင်း" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "၂နာရီတိုင်း" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "မိနစ်၂၀တိုင်း" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "မိနစ်၃၀တိုင်း" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "၆နာရီတိုင်း" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "နာရီတိုင်း" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "အယ်လဘမ်တူသို့ကယူးအပြားပေါ်မှတေးသံလမ်းကြောများအကြားမှလွဲ၍" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "တည်ရှိပြီးအဖံုးများ" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "ချဲ့တွင်" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "%1 တွင်သက်တမ်းကုန်" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "အဖံုးများတင်ပို့" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "အဖံုးများတင်ပို့" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "ကူးဆွဲပြီးအဖံုးများတင်ပို့" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "အဖံုးမြှပ်များတင်ပို့" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "တင်ပို့ခြင်းပြီးဆံုး" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "တင်ပို့ပြီး %1 အဖံုးများရရှိ %2 မှ (%3 ခုန်ကျော်)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "အက်ဖ်၁" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "အက်ဖ်၂" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "အက်ဖ်၅" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "အက်ဖ်၆" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "အက်ဖ်၇" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "အက်ဖ်၈" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "အက်ဖ်အယ်အေစီ" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "ရပ်တန့်နေစဥ်အပြင်သို့အရောင်မှိန်၊ပြန်စလျှင်အတွင်းသို့အရောင်မှိန်" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "တေးသံလမ်းကြောရပ်နေစဉ်အပြင်သို့အရောင်မှိန်" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "အရောင်မှိန်" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "အရောင်မှိန်ကြာချိန်" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "ဖိုင်လမ်းညွှန်များယူဆောင်ခြင်းမရ" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "ပို့စ်ကဒ်များယူဆောင်ခြင်းမရ" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "ပို့စ်ကဒ်များထည့်သွင်းခြင်းမရ" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "အာအက်စ်အက်စ်ဖိဒ်များအတွက်အိက်စ်အမ်အယ်ကိုမရယူနိင်" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "မြန်သော" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "အနှစ်သက်ဆုံးတေးသံလမ်းကြောများ" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "ပျောက်နေသောအဖံုးများယူဆောင်" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "အလိုအလျောက်ယူဆောင်ခြင်း" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "ယူဆောင်ခြင်းပြီးဆံုး" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "ဆပ်ဆိုးနစ်သီချင်းတိုက်ယူဆောင်နေ" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "အဖုံးအမှားယူဆောင်နေ" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "ဖိုင်ပုံစံ" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "ဖိုင်နောက်ဆက်တွဲ" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "ဖိုင်ပုံစံများ" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "ဖိုင်နာမည်" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "ဖိုင်နာမည် (လမ်းကြောင်းနှင့်မဟုတ်)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "ဖိုင်နာမည်အညွှန်း:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "ဖိုင်ပမာဏ" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "ဖိုင်အမျိုးအစား" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "ဖိုင်နာမည်" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "ဖိုင်များ" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "ဖိုင်များကိုပံုစံပြောင်းလဲ" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "သတ်မှတ်ထားသောစံဟပ်စပ်သောသီချင်းများသီချင်းတိုက်တွင်ရှာဖွေ" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "လက်ဗွေနှိပ်သီချင်း" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "ပြီးဆုံး" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "ပထမဆံုးအဆင့်" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "အက်ဖ်အယ်အေစီ" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "ဖွန်ပမာဏ" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "လိုင်စင်အကြောင်းများကြောင့်စပေါ့တီဖိုင်အထောက်အကူသည်ဖြည့်စွက်ပရိုဂရမ်တွင်ပါဝင်။" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "အတင်းမိုနိကုဒ်ပြောင်း" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "ပစ္စည်းမေ့ပြစ်" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "ပစ္စည်းကိုမေ့ပြစ်ခြင်းသည်ပစ္စည်းကိုစာရင်းမှဖယ်ရှားနောင်တစ်ချိန်ချိတ်ဆက်သောအခါကလီမန်တိုင်းသည်သီချင်းများအားလံုးကိုပြန်လည်ဖတ်ရှုလိမ့်မည်။ " #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "ပုံစံ" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "ပုံစံချ" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "ဘောင်နှုန်း" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "ကြားခံတစ်ခုမှဘောင်များ" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "လှုပ်မရ" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "ဘက်စ်အပြည့်" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "ဘက်စ်အပြည့် + အမြင့်သံ" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "အမြင့်သံအပြည့်" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "အထွေထွေ" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "အထွေထွေချိန်ညှိချက်" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "အမျိုးအစား" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "လေလှိုင်းများရယူခြင်း" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "သီချင်းစီးကြောင်းများရယူခြင်း" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "ဒီဟာကိုနာမည်ပေး:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "သွား" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "နောက်သီချင်းစာရင်းမျက်နှာစာသို့သွား" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "ယခင်သီချင်းစာရင်းမျက်နှာစာသို့သွား" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "ဂူဂယ်ဒရိုက်ဗ်" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "%1 အဖံုးများရရှိ %2 မှ (%3 ) ဖွင့်မရ" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "သီချင်းစာရင်းများတွင်မရှိနေသောသီချင်းများကိုမီးခိုးရောင်ပြ" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "သီချင်းတိုက်အုပ်စုအလိုက်" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "အုပ်စုအလိုက်" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "အယ်လဘမ်အုပ်စုအလိုက်" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "အနုပညာရှင်အုပ်စုအလိုက်" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "အနုပညာရှင်/အယ်လဘမ်အုပ်စုအလိုက်" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "အနုပညာရှင်/နှစ် - အယ်လဘမ်အုပ်စုအလိုက်" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "အမျိုးအစား/အယ်လဘမ်အုပ်စုအလိုက်" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "အမျိုးအစား/အနုပညာရှင်/အယ်လဘမ်အုပ်စုအလိုက်" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "အုပ်စုအလိုက်စုခြင်း" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "အာအက်စ်အက်စ်ဖိဒ်တစ်ခုမှဟိတ်စ်တီအမ်အယ်စာမျက်နှာတွင်မရှိပါ" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "ယူအာအယ်မရှိပဲအိတ်ပ်တီတီပီ ၃XX အချက်အလက်ပြကုဒ်ကိုလက်ခံရရှိ၊ ဆာဗာပုံစံပြင်ခြင်းကိုလုပ်ပါ။" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "အိပ်စ်တီတီပီပရောက်ဇီ" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "ပျော်ရွှင်" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "ဟက်တ်ဝဲအချက်အလက်" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "ပစ္စည်းဆက်သွယ်နေစဉ်မှသာဟက်တ်ဝဲအချက်အလက်ရနိုင်" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "မြင့်" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "မြင့် (%1 အက်ဖ်ပီအက်စ်)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "မြင့် (၁၀၂၄x၁၀၂၄)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "လက်ခံရှာမတွေ့၊ဆာဗာယူအာအယ်ပြန်စစ်ဆေးပါ။ ဥပမာ: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "နာရီများ" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "ဟိုက်ဖ်နိုဖား" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "ငါ့ဆီမှာမက်နာကျွန်းစာရင်းမရှိပါ" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "သင်္ကေတ" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "သင်္ကေတများကိုအပေါ်သို့" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "သီချင်းများစစ်ရွေးနေ" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "ဆက်လက်လုပ်လျှင်ယခုပစ္စည်းသည်နှေးကွေးစွာအလုပ်လုပ်ပြီးကူးယူပြီးသီချင်းများအလုပ်မလုပ်နိုင်။" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "ပို့စ်ကဒ်ယူအာအယ်ကိုသိပါကအောက်တွင်ထည့်သွင်းပြီးသွားကိုကလစ်နှိပ်ပါ။" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "အနုပညာရှင်နာမည်များတွင်\"ဒီ\"ကိုအလေးမပေး" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "ပုံများ (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "ပုံများ (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "%1 နေ့များအတွင်း" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "%1 အပတ်များအတွင်း" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "စနစ်အရှင်ထဲတွင်တေးသံလမ်းကြောများရွေးချယ်ပြီးသီချင်းတစ်ပုဒ်ပြီးတိုင်းတေးသံလမ်းကြောထဲသို့ထည့်သွင်း။" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "စာတိုက်ပံုး" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "သတိပေးချက်တွင်အယ်လဘမ်အနုပညာထည့်သွင်းစေ" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "သီချင်းများအားလံုးထည့်သွင်းစေ" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "ဆပ်ဆိုးနစ်အပ်စ်ပရိုတိုကောပံုစံအံဝင်ခွင်မဖြစ်။ အသံုးပြုသူများအဆင့်မြှင့်သင့်။" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "ဆပ်ဆိုးနစ်အပ်စ်ပရိုတိုကောပံုစံအံဝင်ခွင်မဖြစ်။ ဆာဗာများအဆင့်မြှင့်သင့်။" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "ပံုစံပြင်ခြင်းမပြီးဆံုးသေး၊လိုအပ်သောနယ်ပယ်များကိုပြီးအောင်ဖြည့်ပါ။" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "အသံပမာဏ၄%ခန့်တိုးမြင့်" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "အသံပမာဏ ရာခိုင်နှုန်းခန့်တိုးမြင့်" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "အသံပမာဏတိုးမြင့်" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "ရည်ညွှန်းခြင်း %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "အချက်အလက်" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "ထည့်သွင်း..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "သွင်းပြီး" #: core/database.cpp:585 msgid "Integrity check" msgstr "ခိုင်မြဲမှုစစ်ဆေး" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "အင်တာနက်" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "အင်တာနက်ပံ့ပိုးသူများ" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "အေပီအိုင်သော့မမှန်" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "ပုံစံမမှန်" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "နည်းလမ်းမမှန်" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "သတ်မှတ်ချက်များမမှန်" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "သတ်မှတ်အရင်းအမြစ်မမှန်" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "ဝန်ဆောင်မှုမမှန်" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "စစ်ဆေးခြင်းသော့မမှန်" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "ဂျမန်တို" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "ဂျမန်တိုနားအထောင်ဆံုးတေးသံလမ်းကြောများ" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "ဂျမန်တိုထိပ်တန်းတေးသံများ" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "ဂျမန်တိုယခုလထိပ်တန်းတေးသံများ" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "ဂျမန်တိုယခုအပတ်ထိပ်တန်းတေးသံများ" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "ဂျမန်တိုအချက်အလက်အစု" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "လက်ရှိဖွင့်ဆဲတေးသံလမ်းကြောသို့" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "ခလုတ်များကို %1 စက္ကန့်ကြာထိန်းထား..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "ခလုတ်များကို %1 စက္ကန့်များကြာထိန်းထား..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "ဝင်းဒိုးပိတ်နေစဉ်နောက်ခံအလုပ်လုပ်စေခြင်း" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "မူရင်းဖိုင်များထိန်းထား" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "ကြောင်ပေါက်စများ" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "ဘာသာစကား" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "လက်ဆွဲကွန်ပျူတာ/နားကြပ်များ" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "ခန်းမကြီး" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "အယ်လဘမ်အဖုံးကြီး" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "ဘေးတိုင်ကြီး" #: library/library.cpp:80 msgid "Last played" msgstr "နောက်ဆံုးသီချင်းဖွင့်ခဲ့သမျှ" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "လက်စ်.အက်ဖ်အမ်" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "လက်စ်.အက်ဖ်အမ်အလုပ်ရှုပ်နေ၊ မကြာမီမိနစ်အနည်းငယ်အတွင်းထပ်စမ်းကြည့်" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "လက်စ်.အက်ဖ်အမ်စကားဝှက်" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "လက်စ်.အက်ဖ်ဖွင့်သံအရေအတွက်များ" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "လက်စ်.အက်ဖ်အမ်အမည်များ" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "လက်စ်.အက်ဖ်အမ်အသင်းဝင်အမည်" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "လက်စ်.အက်ဖ်အမ်ဝီကီ" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "အနှစ်သက်ဆုံးတေးသံလမ်းကြောများအနည်းဆုံး" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "ဘယ်" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "အလျား" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "သီချင်းတိုက်" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "သီချင်းတိုက်အဆင့်မြင့်အုပ်စုဖွဲ့ခြင်း" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "သီချင်းတိုက်ပြန်လည်ဖတ်ရှုအကြောင်းကြားစာ" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "သီချင်းတိုက်ရှာဖွေ" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "ကန့်သတ်ချက်များ" #: ui/equalizer.cpp:137 msgid "Live" msgstr "တိုက်ရိုက်ထုတ်လွှင့်မှု" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "ထည့်သွင်း" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "ယူအာအလ်မှအဖုံးထည့်သွင်း" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "ယူအာအလ်မှအဖုံးထည့်သွင်း..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "ဓာတ်ပြားမှအဖုံးထည့်သွင်း" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "ဓာတ်ပြားမှအဖုံးထည့်သွင်း..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "သီချင်းစာရင်းထည့်သွင်း" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "သီချင်းစာရင်းထည့်သွင်း..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "အမ်တီပီပစ္စည်းထည့်သွင်းနေ" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "အိုင်ပေါ့အချက်အလက်အစုထည့်သွင်းနေ" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "ချက်ချာသီချင်းစာရင်းထည့်သွင်းနေ" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "သီချင်းများထည့်သွင်းနေ" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "သီချင်းစီးကြောင်းထည့်သွင်းနေ" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "တေးသံလမ်းကြောများထည့်သွင်းနေ" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "တေးသံလမ်းကြောအချက်အလက်များထည့်သွင်းနေ" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "ထည့်သွင်းနေ..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "ဖိုင်များ/ယူအာအလ်များထည့်သွင်း၊ ယခုသီချင်းစာရင်းအစားထိုး" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "ဖွင့်ဝင်" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "ဖွင့်ဝင်၍မရ" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "ထွက်ခွာ" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "ကာလရှည်ခန့်မှန်းအကြောင်း (အယ်တီပီ)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "နှစ်သက်" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "နိမ့် (%1 အက်ဖ်ပီအက်စ်)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "နိမ့် (၂၅၆x၂၅၆)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "ရှုပ်ထွေးမှုအနည်းဆံုးအကြောင်း (အယ်စီ)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "သီချင်းစာသားများ" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "%1 မှသီချင်းစာသားများ" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "MP4 AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "အမ်ပီသရီး" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "အမ်ပီသရီး၂၅၆ကီလို" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "အမ်ပီသရီး၉၆ကီလို" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "အမ်ပီဖိုးအေအေစီ" #: core/song.cpp:410 msgid "MPC" msgstr "အမ်ပီစီ" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "မက်နကျွန်း" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "မက်နကျွန်းကူးဆွဲ" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "မက်နကျွန်းကူးဆွဲပြီးဆံုး" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "အဓိကအကြောင်း(အဓိက)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "အဲဒီကဲ့သို့လုပ်" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "အဲဒီကဲ့သို့လုပ်" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "သီချင်းစာရင်းအောဖ့်လိုင်းသုံးလုပ်" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "တုံ့ပြန်မှုပုံမမှန်" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "ပရောက်ဇီပုံစံလက်အားသံုးပြင်ခြင်း" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "လက်အားသံုး" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "ထုတ်လုပ်သူ" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "နားထောင်ပြီးကဲ့သို့မတ်သား" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "အသစ်ကဲ့သို့မတ်သား" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "ရှာဖွေစကားရပ်တိုင်းဟပ်စပ် (နှင့်)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "ရှာဖွေစကားရပ်များတစ်ခုသို့အများဟပ်စပ် (သို့)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "အများသုံးရလဒ်များရှာဖွေမှုအများဆုံး" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "အများဆုံးဘစ်နှုန်း" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "လယ် (%1 အက်ဖ်ပီအက်စ်)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "လယ် (၅၁၂x၅၁၂)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "အသင်းဝင်အမျိုးအစား" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "အနည်းဆုံးဘစ်နှုန်း" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "ပရောဂျက်အမ်ကြိုတင်ထိန်းညှိများလိုနေ" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "ပုံစံ" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "သီချင်းတိုက်ပြောင်းလဲမှုများစောင့်ကြည့်" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "မိုနိတစ်ခုတည်း" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "လများ" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "စိတ်နေစိတ်ထား" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "စိတ်နေစိတ်ထားဘားမျဉ်းပုံစံ" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "စိတ်နေစိတ်ထားဘားမျဉ်းများ" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "နောက်ထပ်" #: library/library.cpp:84 msgid "Most played" msgstr "အများဆံုးဖွင့်ခဲ့သမျှ" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "အမှတ်စီစဉ်" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "အမှတ်များစီစဉ်" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "အောက်သို့ရွှေ့" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "သီချင်းတိုက်သို့ရွှေ့..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "အပေါ်သို့ရွှေ့" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "ဂီတ" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "ဂီတတိုက်" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "အသံအုပ်" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "ငါ့ဂီတ" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "ငါ့ထောက်ခံချက်များ" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "နာမည်" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "နာမည်" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "နာမည်ပေးခြင်းရွေးပိုင်ခွင့်များ" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "ရေဒီယိုလှိုင်းကျဉ်း (အန်ဘီ)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "ကွန်ရက်ပရောက်ဇီ" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "ကွန်ရက်အဝေးထိန်း" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "ဘယ်သောအခါမှ" #: library/library.cpp:74 msgid "Never played" msgstr "သီချင်းမဖွင့်ခဲ့သမျှ" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "သီချင်းလုံးဝစတင်မဖွင့်" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "ဖိုင်တွဲအသစ်" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "သီချင်းစာရင်းအသစ်" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "ချက်ချာသီချင်းစာရင်းအသစ်..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "သီချင်းအသစ်များ" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "တေးသံလမ်းကြောများအလိုအလျောက်ထည့်။" #: library/library.cpp:92 msgid "Newest tracks" msgstr "တေးသံလမ်းကြောအသစ်ဆုံးများ" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "နောက်တစ်ခု" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "နောက်တေးသံလမ်းကြော" #: core/utilities.cpp:151 msgid "Next week" msgstr "နောက်အပတ်" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "စိစစ်သူမရှိ" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "နောက်ခံပုံမသံုး" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "တင်ပို့ရန်အဖံုးများမရှိ" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "ဘလောက်ရှည်များမရှိ" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "ဟပ်စပ်များရှာမတွေ့။ သီချင်းစာရင်းတစ်ခုလံုးနောက်တစ်ချိန်ပြသရန်ရှာဖွေနေရာကိုဖယ်ရှင်းပါ။ " #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "ဘလောက်တိုများမရှိ" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "ဘယ်တစ်ခုမျှ" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "ရွေးချယ်ပြီးသီချင်းများတစ်ခုမှပစ္စည်းသို့ကူးယူရန်မသင့်တော်" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "သာမန်" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "သာမန်ဘလောက်အမျိုးအစား" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "သီချင်းစာရင်းအရှင်သံုးနေစဉ်မရနိုင်" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "မဆက်သွယ်ထား" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "အကြောင်းအရာလုံလောက်မှုမရှိ" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "အားပေးသူများလုံလောက်မှုမရှိ" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "အသင်းဝင်များလုံလောက်မှုမရှိ" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "အိမ်နီးနားချင်းများလုံလောက်မှုမရှိ" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "မသွင်းထား" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "မဖွင့်ဝင်ရသေး" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "မစီစဉ်ထား - စီစဉ်ရန်ကလစ်နှစ်ခါနှိပ်" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "သတိပေးချက်ပုံစံ" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "သတိပေးချက်များ" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "ယခုသီချင်းဖွင့်ဆဲ" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "ဖန်သားပြင်ပေါ်ပံုရိပ်ကြိုတင်ကြည့်ရှု" #: widgets/osd.cpp:173 msgid "Off" msgstr "ပိတ်" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "အောဖ့်အက်ဖ်အယ်အေစီ" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "အောဖ့်တေး" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "အောဖ့်စဖိစ်" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "အောဖ့်ဗော်ဘစ်စ်" #: widgets/osd.cpp:173 msgid "On" msgstr "ဖွင့်" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "အိုင်ပီအတွင်းရှိအသံုးပြုသူများဆက်သွယ်မှုများကိုသာလက်ခံ:⏎ ၁၀.x.x.x⏎ ၁၇၂.၁၆.၀.၀ - ၁၇၂.၃၁.၂၅၅.၂၅၅⏎ ၁၉၂.၁၆၈.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "ကွန်ယက်တွင်းရှိဆက်သွယ်ချက်များကိုသာခွင့်ပြု" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "ပထမဦးဆုံးကိုသာပြသ" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "အလင်းပိတ်မှု" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "ဘရောက်ဇာထဲတွင် %1 ဖွင့်" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "အသံဓာတ်ပြားဖွင့်(&a)..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "အိုပီအမ်အယ်ဖိုင်ဖွင့်" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "အိုပီအမ်အယ်ဖိုင်ဖွင့်..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "ပစ္စည်းဖွင့်" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "ဖိုင်ဖွင့်..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "ဂူဂယ်ဒရိုက်ဗ်တွင်ဖွင့်" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "သီချင်းစာရင်းအသစ်တွင်ဖွင့်" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "ဘရောက်ဇာထဲတွင်ဖွင့်" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "ဖွင့်..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "လည်ပတ်မှုလုပ်မရ" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "ဘစ်နှုန်းအတွက်ဆောင်ရွက်" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "အရည်အသွေးအတွက်ဆောင်ရွက်" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "ရွေးပိုင်ခွင့်များ..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "တေး" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "ဖိုင်များစုစည်း" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "ဖိုင်များစုစည်း..." #: core/organise.cpp:73 msgid "Organising files" msgstr "ဖိုင်များစုစည်းနေ" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "မူရင်းအမည်များ" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "အခြားရွေးပိုင်ခွင့်များ" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "ပေးပို့" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "ပေးပို့ပစ္စည်း" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "ပေးပို့ရွေးပိုင်ခွင့်များ" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "အားလံုးအစားထိုးရေး" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "တည်ရှိဆဲဖိုင်များထပ်မံဖြည့်သွင်း" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "အသေးစားများကိုသာအစားထိုးရေး" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "ပိုင်ရှင်" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "ဂျမန်တိုစာရင်းစစ်ထုတ်ခြင်း" #: ui/equalizer.cpp:139 msgid "Party" msgstr "အဖွဲ့" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "စကားဝှက်" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "ရပ်တန့်" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "ပြန်ဖွင့်ရပ်တန့်" #: widgets/osd.cpp:156 msgid "Paused" msgstr "ရပ်တန့်ပြီး" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "တင်ဆင်သူ" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "အစက်အပြောက်" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "ဘေးတိုင်ရိုးရိုး" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "ဖွင့်" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "ဖွင့်သံအရေအတွက်" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "ရပ်တန့်ပြီးလျှင်ဖွင့်၊ ဖွင့်ပြီးလျှင်ရပ်တန့်" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "ဘယ်သီချင်းမှဖွင့်မနေလျှင်စတင်ဖွင့်" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "သီချင်းစာရင်းတွင်တေးသံလမ်းကြော စတင်ဖွင့်" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "ဖွင့်/ရပ်တန့်" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "ပြန်ဖွင့်" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "ဖွင့်စက်ရွေးပိုင်ခွင့်များ" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "သီချင်းစာရင်း" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "သီချင်းစာရင်းပြီးဆံုး" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "သီချင်းစာရင်းရွေးပိုင်ခွင့်များ" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "သီချင်းစာရင်းအမျိုးအစား" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "သီချင်းစာရင်းများ" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "ဘရောက်ဇာကိုပိတ်ပြီးကလီမန်တိုင်းသို့သွားပါ။" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "ဖြည့်စွက်ပရိုဂရမ်အခြေအနေ:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "ပို့စ်ကဒ်များ" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "ပေါ့ဂီတ" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "ထွက်ပေါ်ကြာချိန်" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "နံပါတ်ပေါက်" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "အသံချဲ့အကြို" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "လိုလားချက်" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "လိုလားချက်များ" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "လိုလားချက်များ..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "နှစ်သက်သောအယ်လဘမ်အနုပညာဖိုင်နာမည်များ (ပုဒ်ရပ်ခွဲခြား)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "နှစ်သက်သောအသံပုံစံ" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "နှစ်သက်သောဘစ်နှုန်း" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "နှစ်သက်သောပုံစံ" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "အရစ်ကျစနစ်အသံအမျိုးအစား" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "ကြိုတင်ထိန်းညှိ:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "အသုံးပြုရန်ခလုတ်များပေါင်းခေါက်" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "စာတစ်လံုးခေါက်" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "%1 အတွက်အသုံးပြုရန်ခလုတ်များပေါင်းခေါက်..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "ဖန်သားပြင်ပေါ်ပံုရိပ်လှလှရွေးပိုင်ခွင့်များ" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "ကြိုတင်ကြည့်ရှု" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "ယခင်" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "ယခင်တေးသံလမ်းကြော" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "ပုံစံအချက်အလက်ဖော်ပြ" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "အကြောင်း" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "အခြေအနေ" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "အခြေအနေ" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "ဝိုင်ယာမုတ်ခလုတ်နှိပ်" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "သီချင်းများကိုကျပန်းစီစဉ်ကာထားပါ" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "အရည်အသွေး" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "အရည်အသွေး" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "ပစ္စည်းမေးမြန်းခြင်း..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "စီတန်းမန်နေဂျာ" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "ရွေးချယ်တေးသံလမ်းကြောများစီတန်း" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "တေးသံလမ်းကြောစီတန်း" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "ရေဒီယို (တေးသံလမ်းကြောများအားလံုးအတွက်တူညီအသံကျယ်ကျယ်)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "မိုး" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "မိုး" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "ကျပန်းပုံဖော်ကြည့်ခြင်း" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "လက်ရှိသီချင်း၀ကြယ်တန်ဖိုးဖြတ်" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "လက်ရှိသီချင်း၁ကြယ်တန်ဖိုးဖြတ်" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "လက်ရှိသီချင်း၂ကြယ်တန်ဖိုးဖြတ်" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "လက်ရှိသီချင်း၃ကြယ်တန်ဖိုးဖြတ်" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "လက်ရှိသီချင်း၄ကြယ်တန်ဖိုးဖြတ်" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "လက်ရှိသီချင်း၅ကြယ်တန်ဖိုးဖြတ်" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "အဆင့်သတ်မှတ်ချက်များ" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "တကယ်ပယ်ဖျက်?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "ဦးတည်ရာပြောင်းကန့်သတ်ကျော်လွန်၊ ဆာဗာပုံစံပြင်ခြင်းလုပ်ပါ။" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "စာရင်းပြန်လည်" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "လေလှိုင်းများပြန်လည်" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "ထုတ်လွှင့်မှုဌာနစာရင်းပြန်လည်" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "သီချင်းစီးကြောင်းများပြန်လည်" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "ရက်ပ်ဂယ်" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "အဆက်အစပ်" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "ဝီအဝေးထိန်းပြောင်းလဲခြင်းမှတ်သား" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "နောက်ဆံုးအချိန်မှမှတ်သား" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "ဖယ်ရှား" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "လုပ်ဆောင်ချက်ဖယ်ရှား" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "သီချင်းစာရင်းမှပုံတူများဖယ်ရှား" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "ဖိုင်တွဲဖယ်ရှား" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "ငါ့ဂီတမှဖယ်ရှား" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "မှတ်သားခြင်းစာရင်းများမှဖယ်ရှား" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "သီချင်းစာရင်းမှဖယ်ရှား" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "သီချင်းစာရင်းဖယ်ရှား" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "သီချင်းစာရင်းများဖယ်ရှား" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "သီချင်းစာရင်းနာမည်ပြန်ရွေး" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "သီချင်းစာရင်းနာမည်ပြန်ရွေး..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "တေးသံလမ်းကြောများယခုအစဉ်အလိုက်နံပါတ်ပြန်ပြောင်းပါ..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "ပြန်ဆို" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "အယ်လဘမ်ပြန်ဆို" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "သီချင်းစာရင်းပြန်ဆို" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "တေးသံလမ်းကြောပြန်ဆို" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "ယခုသီချင်းစာရင်းအစားထိုး" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "သီချင်းစာရင်းအစားထိုး" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "ကွက်လပ်များကိုအောက်မျဉ်းများနှင့်အစားထိုး" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "ရီပလေးဂိမ်း" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "ဂိမ်းစနစ်ပြန်ဖွင့်" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "ပြန်လည်ရွှေ့ပြောင်း" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "အထောက်အထားစစ်ဆေးခြင်းကုဒ်လိုအပ်" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "ပြန်လည်ထိန်းညှိ" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "ဖွင့်သံအရေအတွက်များပြန်လည်ထိန်းညှိ" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "တေးသံလမ်းကြောပြန်လည်စတင်(သို့)ယခင်တေးသံလမ်းကြောကိုစတင်ချိန်မှ၈စက္ကန့်အတွင်းပြန်ဖွင့်။" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "အက်စ်စီအက္ခရာများသို့ကန့်သတ်" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "ပြန်ဖွင့်ကိုစသံုးတိုင်းပြန်စ" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "ကလီမန်တိုင်းသို့ပြန်သွား" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "ညာ" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "တင်သွင်း" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "စီဒီတင်သွင်း" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "ရော့ခ်" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "စတင်" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "ဆော့ပရောက်ဇီ" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "အက်စ်အက်စ်အယ်အမှားပြနေ၊ဆာဗာပံုစံပြင်ခြင်းအတည်ပြု။ အက်စ်အက်စ်အယ်ဗီ၃ရွေးပိုင်ခွင့်တွင်ပြသနာများရှိနေ။" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "ပစ္စည်းလုံလုံခြုံခြုံဖယ်ရှား" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "ကူးယူပြီးနောက်ပစ္စည်းလုံလုံခြုံခြုံဖယ်ရှား" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "နမူနာနှုန်း" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "နမူနာနှုန်း" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "ဂီတတိုက်တွင်.moodဖိုင်များမှတ်သား" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "အယ်လဘမ်အဖုံးမှတ်သား" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "ဓာတ်ပြားသို့အဖံုးမှတ်သား..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "ပုံမှတ်သား" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "သီချင်းစာရင်းမှတ်သား" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "သီချင်းစာရင်းမှတ်သား" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "သီချင်းစာရင်းမှတ်သား..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "ကြိုတင်ထိန်းညှိမှတ်သား" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "ဖြစ်နိုင်ပါကဖိုင်အမည်များထဲတွင်အဆင့်သတ်မှတ်ချက်များမှတ်သား" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "ဖြစ်နိုင်ပါကဖိုင်အမည်များထဲတွင်စာရင်းဇယားများမှတ်သား" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "အင်တာနက်မျက်နှာစာထဲတွင်ယခုသီချင်းစီးကြောင်းမှတ်သား" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "သီချင်းဖိုင်များထဲသို့သီချင်းကိန်းဂဏန်းအချက်အလက်များမှတ်သား" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "တေးသံလမ်းကြောများမှတ်သားနေ" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "သတ်မှတ်နမူနာနှုန်းအကြောင်း (အက်စ်အက်စ်အာ)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "အတိုင်းအတာပမာဏ" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "ရမှတ်" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "နားဆင်နေကြတေးသံလမ်းကြောများလိုလျှောက်နာမည်ပေးပို့" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "ရှာဖွေ" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "ရှာဖွေ" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "အိုင့်ကက်စ်ထုတ်လွှင့်မှုဌာနများရှာဖွေ" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "ဂျမန်တိုရှာဖွေ" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "မက်နကျွန်းရှာဖွေ" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "ဆပ်ဆိုးနစ်ရှာဖွေ" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "အလိုအလျောက်ရှာဖွေ" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "အယ်လဘမ်အဖုံးများအားရှာဖွေ..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "တစ်စုံတစ်ရာဖြစ်ဖြစ်ရှာဖွေ" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "ဂျီပေါ့တာ.နက်ရှာဖွေ" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "အိုင်ကျွန်းရှာဖွေ" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "စနစ်ရှာဖွေ" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "ရှာဖွေရွေးပိုင်ခွင့်များ" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "ရလဒ်များရှာဖွေ" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "စကားရပ်များရှာဖွေ" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "ဒုတိယအဆင့်" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "နောက်ပြန်ရှာဖွေ" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "ရှေ့သို့ရှာဖွေ" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "လက်ရှိဖွင့်ဆဲတေးသံလမ်းကြောအတိုင်းအတာနှိုင်းယှဉ်ချက်အားဖြင့်ရှာဖွေ" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "လက်ရှိဖွင့်ဆဲတေးသံလမ်းကြောမှပကတိနေရာသို့ရှာဖွေ" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "အားလံုးရွေးချယ်" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "တစ်ခုမျှမရွေးချယ်" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "နောက်ခံအရောင်ရွေးချယ်:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "နောက်ခံပုံရွေးချယ်" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "အကောင်းဆံုးဟပ်စပ်ဖြစ်နိုင်ခြေရွေးချယ်" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "ရှေ့ခံအရောင်ရွေးချယ်:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "ပုံဖော်ကြည့်ခြင်းများရွေးချယ်" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "ပုံဖော်ကြည့်ခြင်းများရွေးချယ်..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "ရွေးချယ်..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "အမှတ်စဉ်" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "ဆာဗာ" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "ဆာဗာယူယူအာအလ်" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "ဆာဗာအသေးစိတ်အကြောင်းအရာများ" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "အောဖ့်လိုင်းဝန်ဆောင်မှု" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "%1 မှ \"%2\" ထိန်းညှိ..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "အသံပမာဏ ရာခိုင်နှုန်းခန့်ထိန်းညှိ" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "ရွေးချယ်တေးသံလမ်းကြောများအားလံုးအတွက်တန်ဖိုးထိန်းညှိ..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "ချိန်ညှိချက်" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "အတိုကောက်" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "%1 အတွက်အတိုကောက်" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "%1 အတွက်အတိုကောက်တည်ရှိပြီး" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "ပြသ" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "ဖန်သားပြင်ပေါ်ပံုရိပ်ပြသ" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "လက်ရှိတေးသံလမ်းကြောပေါ်ခပ်မှိန်မှိန်အန်နီမေးရှင်းပြသ" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "တေးသံလမ်းကြောအခြေအနေပြဘားမျဉ်းတွင်စိတ်နေစိတ်ထားဘားမျဉ်းပြသ" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "စက်ရှိအလုပ်ခုံသတိပေးချက်ပြသ" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "စနစ်ပြန်ဆို/ကုလားဖန်ထိုးတိုင်းသတိပေးချက်ပြသ" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "အသံပမာဏပြောင်းလဲတိုင်းသတိပေးချက်ပြသ" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "စနစ်အသေးမှထွက်ပေါ်ပြသ" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "ဖန်သားပြင်ပေါ်ပံုရိပ်လှလှတစ်ခုပြသ" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "အခြေအနေပြတိုင်အပေါ်မှာပြသ" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "သီချင်းများအားလံုးပြသ" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "သီချင်းများအားလံုးကိုပြသ" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "သီချင်းတိုက်ထဲအနုပညာအဖုံးပြသ" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "ခွဲခြားမှုများပြသ" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "အရွယ်အပြည့်ပြသ..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "ဖိုင်ဘရောက်ဇာထဲမှာပြသ..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "အနုပညာရှင်များအမျိုးမျိုးပြသ" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "စိတ်နေစိတ်ထားဘားမျဉ်းပြသ" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "ပုံတူများသာပြသ" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "အမည်မရှိများသာပြသ" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "ရှာဖွေအကြံပြုချက်များပြသ" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "အဓိကဝင်းဒိုးထဲတွင်လိုလျှောက်နာမည်ပေးပို့ခလုတ်ပြသ" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "စနစ်သင်္ကေတပြသ" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "မည်သည့်ရင်းမြစ်များလုပ်ဆောင်စေမလုပ်ဆောင်စေပြသ" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "ပြသ/ဖုံးကွယ်" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "ကုလားဖန်ထိုး" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "အယ်လဘမ်များကုလားဖန်ထိုး" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "ကုလားဖန်အားလံုးထိုး" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "သီချင်းစာရင်းကုလားဖန်ထိုး" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "ယခုအယ်လဘမ်တွင်တေးသံလမ်းကြောများကုလားဖန်ထိုး" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "အတွင်းသို့ဝင်" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "အပြင်သို့ထွက်" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "အတွင်းသို့ဝင်..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "တူညီအနုပညာရှင်များအားလံုး" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "ပမာဏ" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "ပမာဏ:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "စကာဂီတ" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "စာရင်းရှိနောက်ပြန်များခုန်ကျော်" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "အရေအတွက်ခုန်ကျော်" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "စာရင်းရှိရှေ့သို့များခုန်ကျော်" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "အယ်လဘမ်အဖုံးသေး" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "ဘေးတိုင်ငယ်" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "ချက်ချာသီချင်းစာရင်း" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "ချက်ချာသီချင်းစာရင်းများ" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "ပျော့" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "ပျော့ရော့ခ်ဂီတ" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "သီချင်းအချက်အလက်" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "သီချင်းအချက်အလက်" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "အသံလှိုင်းသံုးကျွန်ပျုတာရိုက်ယူပံု" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "တောင်းပန်" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "အမျိုးအစားအားဖြင့်မျိုးတူစု (အက္ခရာစဉ်အတိုင်း)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "အမျိုးအစားအားဖြင့်မျိုးတူစု (ရေပန်းစားမှုဖြင့်)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "ထုတ်လွှင့်မှုဌာနနာမည်အားဖြင့်မျိုးတူစု" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "သီချင်းများအားဖြင့်မျိုးတူစု" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "မျိုးတူစုခြင်း" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "ရင်းမြစ်" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "ရင်းမြစ်များ" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "စဖိစ်" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "စပေါ့တီဖိုင်" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "စပေါ့တီဖိုင်းဖွင့်ဝင်အမှားပြ" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "စပေါ့တီဖိုင်ဖြည့်စွက်ပရိုဂရမ်" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "စပေါ့တီဖိုင်ဖြည့်စွက်ပရိုဂရမ်မသွင်းထား" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "အဆင့်အတန်း" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "ကြည့်ခဲ့ပြီး" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "လက်ရှိဖွင့်ဆဲသီချင်းစာရင်းစတင်" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "ပံုစံပြောင်းလဲခြင်းစတင်" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "ရှာဖွေရလဒ်များစာရင်းများကိုဖြည့်ရန်ရှာဖွေနေရာတွင်တစ်ခုခုရိုက်ထည့်ပါ" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "%1 စတင်နေ" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "စတင်နေ..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "ရပ်" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "ပြီးနောက်ရပ်" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "ဒီတေးသံလမ်းကြောပြီးနောက်ရပ်" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "ပြန်ဖွင့်ရပ်" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "လက်ရှိတေးသံလမ်းကြောပြီးနောက်သီချင်းဖွင့်ခြင်းရပ်" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "ရပ်တန့်ပြီး" #: core/song.cpp:431 msgid "Stream" msgstr "သီချင်းစီးကြောင်း" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "ရက်၃၀အစမ်းသံုးကာလပြီးဆံုးပြီးနောက်သီချင်းစီးကြောင်းလွှင့်ရန်ဆပ်ဆိုးနစ်ဆာဗာမှတရားဝင်ဆာဗာလိုင်စစ်လိုအပ်။" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "အသင်းဝင်စီးကြောင်းလွှင့်" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "မှာယူသူများ" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "ဆပ်ဆိုးနစ်" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "ရရိုသွားပြီ!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "%1 အောင်အောင်မြင်မြင်ဖြည့်သွင်းပြီး" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "အကြံပြုအမည်များ" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "အကျဉ်းချုပ်" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "ထိပ်တန်းမြင့် (%1 အက်ဖ်ပီအက်စ်)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "ထိပ်တန်းမြင့် (၂၀၄၈x၂၀၄၈)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "လက်ခံပုံစံများ" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "ယခုကိန်းဂဏန်းအချက်အလက်များကိုဖိုင်များသို့လိုက်လျောညီထွေဖြစ်ရန်လုပ်" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "စပေါ့တီဖိုင်စာတိုက်ပံုးညီတူညှိ" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "စပေါ့တီဖိုင်သီချင်းစာရင်းညီတူညှိ" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "စပေါ့တီဖိုင်ကြည့်ခဲ့ပြီးတေးသံလမ်းကြောများညီတူညှိ" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "စနစ်အရောင်များ" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "မျက်နှာစာများကိုအပေါ်သို့" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "အမည်ခေါ်ယူ" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "ရည်မှန်းချက်ဘစ်နှုန်း" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "အီလက်ထရွန်နစ်အက" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "စာသားရွေးပိုင်ခွင့်များ" #: ui/about.cpp:74 msgid "Thanks to" msgstr "သို့ကျေးဇူးတင်ခြင်း" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "\"%1\" ညွှန်ကြားခြင်းမစတင်နိုင်။" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "လက်ရှိဖွင့်ဆဲသီချင်းအယ်လဘမ်အဖုံး" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "%1 ယခုဖိုင်လမ်းညွှန်မမှန်" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "ဒုတိယတန်ဖိုးသည်ပထမတန်ဖိုးထက်ကြီးရမည်!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "တောင်းဆိုသောဝက်ဘ်ဆိုက်မတည်ရှိ!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "တောင်းဆိုသောဝက်ဘ်ဆိုက်သည်ပံုမဟုတ်!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "ဆပ်ဆိုးနစ်ဆာဗာအစမ်းသံုးကာလပြီးဆံုး။ လိုင်စင်ကီးရယူရန်ငွေလှုပါ။ အသေးစိတ်အကြောင်းအရာများအတွက် subsonic.org သို့လည်ပတ်ပါ။" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "အောက်ဖော်ပြပါအင်္ဂါရပ်အသစ်များကြောင့်မွမ်းမံပြီးကလီမန်တိုင်းပံုစံသည်သီချင်းတိုက်အပြည့်ပြန်လည်ဖတ်ရှုရန်လိုအပ်: " #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "ယခုအယ်လဘမ်တွင်အခြားသီချင်းများရှိနေ" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "ဂျီပေါ့တာ.နက်နှင့်ဆက်သွယ်ရန်ပြသနာတွေ့" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "မက်နကျွန်းမှအချက်အလက်ဖွဲ့စည်းမှုယူဆောင်ရန်ပြသနာတွေ့" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "အိုင်ကျွန်းစတိုးမှတုံ့ပြန်မှုယူဆောင်ရန်ပြသနာတွေ့" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "တစ်ချို့သီချင်းများကူးယူရန်ပြသနာတွေ့။ အောက်ဖော်ပြပါဖိုင်များမကူးယူနိုင်: " #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "တစ်ချို့သီချင်းများပယ်ဖျက်ရန်ပြသနာတွေ့။ အောက်ဖော်ပြပါဖိုင်များမပယ်ဖျက်နိုင်: " #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "ပစ္စည်းမှယခုဖို်င်များအားလံုးပယ်ဖျက်မည်၊ လုပ်ဆောင်မည်လား?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "ဓာတ်ပြားမှယခုဖို်င်များအားလံုးထာဝရပယ်ဖျက်မည်၊ လုပ်ဆောင်မည်လား?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "သီချင်းတိုက်တွင်ဂီတအတွက်မွမ်းမံရန်ယခုဖိုင်တွဲများဖတ်ရှုမည်" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "\"ဂီတပံုစံပြောင်းလဲခြင်း\"အရေးအသားထဲတွင်ပစ္စည်းထဲသို့မကူးယူခင်ဂီတကူးပြောင်းချိန်ယခုချိန်ညှိချက်များအသုံးပြုပြီး။" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "တတိယအဆင့်" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "၁၅၀မီဂါဘိုက်ရှိအချက်အလက်အစုဖန်တီးမည်။ ⏎ လုပ်ဆောင်မည်လား?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "တောင်းဆိုသောပုံစံထဲတွင်ယခုအယ်လဘမ်မရနိုင်" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "မည်သည့်ပံုစံလက်ခံကြောင်းကလီမန်တိုင်းသိရန်ယခုပစ္စည်းချိတ်ဆက်ပြီးဖွင့်ထားရမည်။" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "အောက်ဖော်ပြပါဖိုင်ပံုစံများကိုယခုပစ္စည်းလက်ခံ:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "ဒီပစ္စည်းသေချာစွာအလုပ်လုပ်မည်မဟုတ်" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "ယခုသည်အမ်တီပီပစ္စည်း၊ ကလီမန်တိုင်းကိုအယ်အိုင်ဘီအမ်တီပီအထောက်အကူမပါဘဲသင်အသုံးပြုထား။" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "ယခုသည်အိုင်ပေါ့ပစ္စည်း၊ ကလီမန်တိုင်းကိုအယ်အိုင်ဘီဂျီပီအိုဒီအထောက်အကူမပါဘဲသင်အသုံးပြုထား။" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "ယခုပစ္စည်းကိုပထမဆံုးအကြိမ်ချိတ်ဆက်ခြင်းဖြစ်။ ကလီမန်တိုင်းသည်ဂီတဖိုင်များကိုရှာဖွေရန်ယခုပစ္စည်းကိုဖတ်ရှုမည် - အချိန်အနည်းငယ်ကြာမြင့်လိမ့်မည်။" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "ယခုရွေးပိုင်ခွင့်ကိုလုပ်ဆောင်ပုံလိုလားချက်များတွင်ပြန်ပြောင်းနိုင်" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "ယခုသီချင်းစီးကြောင်းသည်အခကြေးပေးမှာယူသူများအတွက်သာ" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "ယခုပစ္စည်းအမျိုးအစားမလက်ခံ: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "ခေါင်းစဉ်" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "ယနေ့" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "ဖန်သားပြင်ပေါ်ပံုရိပ်လှလှဖွင့်ပိတ်လုပ်" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "ဖန်သားပြင်အပြည့်ဖွင့်ပိတ်လုပ်" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "စီတန်းအခြေအနေဖွင့်ပိတ်လုပ်" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "သီချင်းနာမည်ပေးပို့ခြင်းဖွင့်ပိတ်လုပ်" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "ဖန်သားပြင်ပေါ်ပံုရိပ်လှလှမြင်ကွင်းပေါ်ရန်ဖွင့်ပိတ်လုပ်" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "မနက်ဖြန်" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "ဦးတည်ရာပြောင်းများများပြား" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "ထိပ်တန်းတေးသံများ" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "စုစုပေါင်းအယ်လဘမ်များ:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "ဘိုက်စုစုပေါင်းများကူးပြောင်းပြီး" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "ကွန်ရက်တောင်းခံချက်စုစုပေါင်းများပြုလုပ်ပြီး" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "တေးသံလမ်းကြော" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "တေးသံလမ်းကြော" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "ဂီတပံုစံပြောင်းလဲခြင်း" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "ပံုစံပြောင်းလဲခြင်းမှတ်တမ်း" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "ပံုစံပြောင်းလဲခြင်း" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "%2 ပရိုဂရမ်များအသံုးပြုပြီး %1 ဖိုင်များပြောင်းလဲခြင်း" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "ပံုစံပြောင်းလဲခြင်းရွေးပိုင်ခွင့်များ" #: core/song.cpp:426 msgid "TrueAudio" msgstr "တီတီအေ" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "တာဗိုင်" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "လှည့်ပိတ်" #: devices/giolister.cpp:157 msgid "URI" msgstr "ယူအာအိုင်" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "ယူအာအလ်(များ)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "အက်တရာလှိုင်းကျယ် (ယူဒဗလူဘီ)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "မကူးဆွဲနိုင် %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "အမည်မသိ" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "မသိအကြောင်းအရာအမျိုးအစား" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "အမည်မသိအမှားပြ" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "အဖုံးမသတ်မှတ်" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "မမှာယူ" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "လာမည့်ဂီတဖြေဖျော်ပွဲများ" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "မွမ်းမံ" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "ပို့စ်ကဒ်များစစ်ဆေးခြင်း" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "ပြောင်းလဲပြီးသီချင်းတိုက်ဖိုင်တွဲများမွမ်းမံ" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "ကလီမန်တိုင်းစတင်သောအခါသီချင်းတိုက်မွမ်းမံ" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "ဒီပို့စ်ကဒ်စစ်ဆေးခြင်း" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "မွမ်းမံနေ" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "မွမ်းမံနေ %1 " #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "မွမ်းမံနေ %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "သီချင်းတိုက်မွမ်းမံနေ" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "သုံးစွဲမှု" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "ရနိုင်သောအခါအယ်လဘမ်အနုပညာရှင်အမည်အသုံးပြု" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "ဂျီနှုန်းအတိုကောက်ကီးများသံုး" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "ရနိုင်ခဲ့ပါကရီပလေးဂိမ်းအချက်အလက်ဖွဲ့စည်းမှုသံုး" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "အက်စ်အက်စ်အယ်ဗီ၃သံုး" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "ဝီအဝေးထိန်းအသုံးပြု" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "စိတ်ကြိုက်အရောင်သတ်မှတ်သံုး" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "သတိပေးချက်များအတွက်စိတ်ကြိုက်မှာကြားချက်သံုး" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "ကွန်ရက်အဝေးထိန်းတစ်ခုအသုံးပြု" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "အထောက်အထားစစ်ဆေးခြင်းအသုံးပြု" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "ဘစ်နှုန်းစီမံခန့်ခွဲမှုအင်ဂျင်သံုး" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "စနစ်အရှင်အသုံးပြု" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "ဝီအဝေးထိန်းအခြေအနေအစီရင်ခံရန်သတိပေးချက်များသံုး" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "ယာယီအနှောက်အယှက်ပံုသဏ္ဎာန်သံုး" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "မူလစနစ်ပံုစံသံုး" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "မူလစနစ်ပံုစံအရောင်သတ်မှတ်သံုး" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "စနစ်ပရောက်ဇီချိန်ညှိချက်သံုး" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "အသံပမာဏပုံမှန်ပြုလုပ်မှုအသုံးပြု" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "အသုံးပြုပြီး" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "အသံုးပြုသူမျက်နှာပြင်" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "အသင်းဝင်အမည်" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "သီချင်းထည့်ရန်ဇယားကိုသံုးခြင်းသည်..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "ဗီဘီအာအမ်ပီသရီး" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "ဘစ်နှုန်းကိန်းရှင်" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "အနုပညာရှင်များအမျိုးမျိုး" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "ပုံစံ %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "ကြည့်ရှု" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "ပုံဖော်ကြည့်ခြင်းစနစ်" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "ပုံဖော်ကြည့်ခြင်းများ" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "ပုံဖော်ကြည့်ခြင်းချိန်ညှိချက်များ" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "အသံလှုပ်ရှားမှုရှာဖွေတွေ့ရှိခြင်း" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "အသံပမာဏ %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "ဗော်ဘစ်စ်" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "တပလူအေဗီ" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "တပလူအမ်အေ" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "သီချင်းစာရင်းမျက်နှာစာကိုပိတ်နေတုန်းသတိပေး" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "တပလူအေဗီ" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "ဝက်ဘ်ဆိုက်" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "အပတ်များ" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "ကလီမန်တိုင်းစတင်သောအခါ" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "အယ်လဘမ်အနုပညာကိုရှာဖွေသောအခါကလီမန်တိုင်းသည်စကားလံုးပါဝင်သောပံုများကိုအရင်ရှာဖွေ။⏎ ဟက်စပ်မှုမရှိပါကဖိုင်လမ်းညွှန်ထဲရှိအကြီးဆံုးပံုကိုသံုး။" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "စာရင်းအလွတ်ဖြစ်သောအခါ..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "ဘာလို့မစမ်းကြည့်..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "ရေဒီယိုလှိုင်းကျယ် (ဒဗလူဘီ)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "ဝီအဝေးထိန်း %1: အသက်သွင်းပြီး" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "ဝီအဝေးထိန်း %1: ဆက်သွယ်ပြီး" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "ဝီအဝေးထိန်း %1: ဓာတ်ခဲအကျပ်အတည်း (%2%)" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "ဝီအဝေးထိန်း %1: အသက်မသွင်းပြီး" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "ဝီအဝေးထိန်း %1: မဆက်သွယ်ပြီး" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "ဝီအဝေးထိန်း %1: ဓာတ်ခဲအားနည်း (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "ဝီမိုတ်ဒပ်" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "ဝင်းဒိုးမီဒီယာ၁၂၈ကီလို" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "ဝင်းဒိုးမီဒီယာ၄၀ကီလို" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "ဝင်းဒိုးမီဒီယာ၆၄ကီလို" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "ဝင်းဒိုးမီဒီယာအသံ" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "အဖံုးမပါ:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "အနုပညာရှင်များအမျိုးမျိုးသို့ယခုအယ်လဘမ်မှတစ်ခြားသီချင်းများကိုရွှေ့" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "ယခုနောက်တစ်ချိန်အပြည့်ပြန်လည်ဖတ်ရှု?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "သီချင်းဖိုင်များထဲသို့သီချင်းများကိန်းဂဏန်းအချက်အလက်များရေးသား" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "အသင်းဝင်အမည်နှင့်/သို့စကားဝှက်မမှန်" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "နှစ်" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "နှစ် - အယ်လဘမ်" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "နှစ်များ" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "မနေ့က" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "အောက်ဖော်ပြပါအယ်လဘမ်များကိုကူးဆွဲတော့မည်" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "%1 အနှစ်သက်ဆံုးများမှသီချင်းစာရင်းများဖယ်ရှားမှာသေချာသလား?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "အနှစ်သက်ဆုံးသီချင်းစာရင်းများတွင်မပါဝင်သောသီချင်းစာရင်းကိုသင်ဖယ်ရှားတော့မည်: သီချင်းစာရင်းကိုပယ်ဖျက်မည်(လုပ်ပြီးပါကအပြီးဖျက်သွားမည်)။\nဆက်လုပ်ရန်သေချာ?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "သင်မဝင်ရောက်သေးပါ။" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "%1 ကဲ့သို့သင်ဝင်ရောက်ပြီး။" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "သင်ဝင်ရောက်ပြီး။" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "သီချင်းတိုက်ထဲရှိသီချင်းများစုစည်းမှုပံုစံကိုပြောင်းလဲနိုင်။" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "သင်စာရင်းတစ်ခုမှမရှိဘဲအလကားနားဆင်နိုင်ပါသည်၊ သို့သော်အရစ်ကျစနစ်အဖွဲ့ဝင်များသည်ကြော်ငြာများမပါဘဲပို၍အရည်အသွေးကောင်းမွန်သောသီချင်းစီးကြောင်းများကိုနားဆင်နိုင်ပါသည်။" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "မက်နကျွန်းသီချင်းများကိုစာရင်းမရှိဘဲအခမဲ့နားဆင်နိုင်။ အသင်းဝင်ခြင်းဝယ်ယူခြင်းကတေးသံလမ်းကြောတစ်ခုအဆံုးတွင်ရှိမှာကြားချက်များကိုဖယ်ရှား။" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "တခြားဂီတကဲ့သို့နောက်ခံသီချင်းစီးကြောင်းများကိုတစ်ချိန်တည်းနားထောင်နိုင်။" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "ဝီအဝေးထိန်းကိုကလီမန်တိုင်းတွင်အဝေးထိန်းချုပ်ကိရိယာကဲ့သို့အသံုးပြုနိုင်။ ကလီမန်တိုင်းဝီကီစာမျက်နှာတွင်ကြည့်ရှုပါအချက်အလက်များအတွက် ⏎\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "သင့်ဆီမှာစပေါ့တီဖိုင်းအရစ်ကျစနစ်စာရင်းတစ်ခုမရှိပါ။" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "သင့်ဆီတွင်မှာယူနေခြင်းမရှိပါ" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "စပေါ့တီဖိုင်းမှထွက်ပြီးဖြစ်၍ချိန်ညှိချက်အရေးအသားတွင်စကားဝှက်ပြန်ထည့်ပါ။" #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "စပေါ့တီဖိုင်းမှထွက်ပြီးဖြစ်၍စကားဝှက်ပြန်ထည့်ပါ။" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "သင်ဒီတေးသံလမ်းကြောကိုနှစ်သက်" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "ဘာသာစကားပြောင်းလဲပါကကလီမန်တိုင်းကိုပြန်လည်စတင်ပါ။" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "သင့်ရဲ့အိုင်ပီလိပ်စာ:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "သင့်ရဲ့လက်စ်.အက်ဖ်အမ်အထောက်အထားများမမှန်ပါ" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "သင့်ရဲ့မက်နကျွန်းအထောက်အထားများမမှန်ပါ" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "သင့်သီချင်းတိုက်မှာဘာမှမရှိ!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "သင့်ရေဒီယိုသီချင်းစီးကြောင်းများ" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "သင့်လိုလျှောက်နာမည်ပေးပို့ခြင်း: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "အိုးပန်းဂျီအယ်အထောက်အကူသင့်စနစ်တွင်မရှိပုံဖော်ကြည့်ခြင်းများမရနိုင်။" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "သင့်အသင်းဝင်အမည်သို့စကားဝှက်မမှန်" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "ဇက်-အေ" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "သုည" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "%n သီချင်းများထည့်သွင်း" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "ပြီးနောက်" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "အချိန်တွင်" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "နှင့်" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "အလိုအလျောက်" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "မတိုင်မီ" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "အကြား" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "အကြီးဆုံးဦးစားပေး" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "ဘီပီအမ်" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "ပါဝင်" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "မလုပ်ဆောင်စေ" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "ချပ်ပြားဝိုင်း %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "မပါဝင်" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "ဖြင့်အဆုံး" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "ညီမျှ" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "ဂျီပေါ့တာ.နက်" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "ဂျီပေါ့တာ.နက်ဖိုင်လမ်းညွှန်" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "ပို၍ကြီးမား" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "နောက်ဆံုးမှာ" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "တစ်စက္ကန့်ကီလိုဘိုက်နှုန်း" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "ပို၍သေးငယ်" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "အရှည်ဆုံးဦးစားပေး" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "သီချင်းများ %n ရွှေ့" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "အသစ်ဆုံးဦးစားပေး" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "မညီမျှ" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "နောက်ဆံုးမှာမဟုတ်" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "အပေါ်မှာမဟုတ်" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "အအိုဆုံးဦးစားပေး" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "အပေါ်မှာ" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "ရွေးပိုင်ခွင့်များ" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "(သို့)ကျုအာကုဒ်ကိုဖတ်" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "ဝင်ရောက်ကီးခေါက်" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "%n သီချင်းများဖယ်ရှား" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "အတိုဆုံးဦးစားပေး" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "သီချင်းများကုလားဖန်ထိုး" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "အသေးဆံုးဦးစားပေး" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "သီချင်းများမျိုးတူစု" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "နှင့်စတင်" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "ရပ်" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "တေးသံလမ်းကြော %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/nb.po000066400000000000000000005027431260417502300236510ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Arno Teigseth , 2011-2015 # Arno Teigseth , 2011 # Åsmund Haugestøl , 2014 # FIRST AUTHOR , 2010 # Harald , 2014-2015 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Norwegian Bokmål (http://www.transifex.com/davidsansome/clementine/language/nb/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nb\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nDu kan merke en spilleliste som favoritt ved å klikke på stjerneikonet nær listenavnet.⏎\n\nFavoritt-spillelister vil lagres her" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "dager" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr "Normaliseringsmodus" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr "pkt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " sekunder" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " sanger" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 sanger)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 album" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 dager" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 dager siden" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 på %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 spillelister (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 valgte av" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 sang" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 sanger" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "fant %1 sanger" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "fant %1 sanger (viser %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 spor" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "overført %1" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: modulen Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 andre lyttere" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "av %L1 ganger" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filnavn%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "kunne ikke: %n" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n ferdige" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n gjenstående" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Still opp tekst" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "Sentr&er" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Egendefinert" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "&Ekstra" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "Hjelp" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "Skjul %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "Skjul..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Venstre" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "Musikk" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Ingen" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "&Spilleliste" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Avslutt" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Repeteringsmodus" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Høyre" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "&Stokkemodus" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "Fyll &kolonner i vinduet" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "Verktøy" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(varierer mellom sanger)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", av" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "... og til alle som har bidratt til Amarok" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 dag" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 spor" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192,000Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44,100Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48,000Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 tilfeldige spor" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96,000Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Oppgradér til Premium nå" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Hvis ikke valgt vil Clementine prøve å lagre poeng og andre statistikker i en separat database, og ikke endre filene dine.

Hvis valgt, vil statistikkene lagres både i database og direkte i filen hver gang de endres.

Vennligst merk at dette kanskje ikke fungerer for alle formater, og at andre musikkavspillere kanskje ikke forstår dem, siden det ikke finnes noen standard for dette.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Bruk feltnavn som søkeprefiks for å søke bare i dét feltet, f.eks.artist:Bode søker gjennom biblioteket og finner artistnavn inneholdende ordet Bode.

Felt du kan bruke: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Dette skriver poeng, tagger og statistikker til filene, for alle sangene i biblioteket.

Ikke nødvendig hvis "Lagre poeng og statistikk i filene"-opsjonen alltid har vært aktiv.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Kodene begynner med %, for eksempel: %artist %album %title

⏎ ⏎

Hvis du setter klammeparanteser rundt tekst som inneholder en kode, vil teksten skjules om koden er tom.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Til dette trenger du en Spotify Premium-konto." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Klienter kan kun koble til hvis de oppgir riktig kode." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "En smart spilleliste er en dynamisk liste av sanger som kommer fra ditt bibliotek. Det er forskjellige typer av smart spillelister som tilbyr forskjellige måter å velge sanger." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Sanger som passer med disse kriteriene blir med på spillelista." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "Ære være Hypnotoad" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Avbryt" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Om %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Om Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Om Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Absolutt" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Kontodetaljer" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Kontodetaljer (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Aksjon" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Handling" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Aktiver/deaktiver Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Aktivitets-strøm" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Legg til Podcast" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Legg til strøm" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Legg til en linje, hvis varslingstypen støtter det" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Legg til handling" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Legg til alle filene i en katalog dennes underkataloger" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Legg til enda en strøm..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Legg til katalog..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Legg til fil" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Legg fil til konvertering" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Legg fil(er) til konvertering" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Legg til fil..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Legg filer til i konverterer" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Legg til katalog" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Legg til katalog..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Legg til katalog..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Legg til Podcast" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Legg til Podcast..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Legg til søke term" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Legg til album-tagg" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Legg til albumartist-tagg" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Legg til artist-tagg" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Legg til poeng automatisk" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Legg til komponist-tagg" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Legg til spor/disk-tagg" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Legg til fil" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Legg til sang-sjanger-tagg" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Legg til sanggruppe-tagg" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Legg til sporlengde-tagg" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Legg til utøver-tagg" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Legg til antall avspillinger" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Legg til poeng" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Legg til antall hoppet over" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Legg til sportittel-tagg" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Legg til sang i hurtiglageret" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Legg til spornummer-tagg" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Legg til årstall-tagg" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Legg sanger til i «Musikk» når «Elsker»-knappen klikkes" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Legg til strøm..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Legg til i Musikk" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Legg til Spotify-spilleliste" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Legg til stjernemerkede fra Spotify" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Legg til en annen spilleliste" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Legg til i bokmerker" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Legg til på spilleliste" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Legg i kø" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Legg bruker/gruppe til i bokmerker" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Legg til wiimotedev-handlig" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Legg til..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Lagt til denne måneden" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Lagt til denne uken" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Lagt til i år" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Lagt til idag" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Lagt til innen tre måneder" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Avansert gruppering..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Etter" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Etter kopiering..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Album (ideell lydstyrke for alle spor)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Album artist" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Albumgrafikk" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Album info på jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Albumer" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Album med cover" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Album uten cover" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Alle" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Alle filer (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "Ære være Hypnotoad!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Alle album" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Alle artister" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Alle filer (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Alle spillelister (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Alle oversetterne" #: library/library.cpp:98 msgid "All tracks" msgstr "Alle spor" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Tillat at andre kan laste ned musikk fra denne datamaskinen." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Tillat nedlastinger" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Tillat midt/side-koding" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Sammen med originalene" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Alltid gjem hovedvinduet" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Alltid vis hovedvinduet" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Alltid start avspilling" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon Cloud Drive" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Det trengs et programtillegg for å bruke Spotify i Clementine. Ønsker du å laste ned og installere den nå?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "En feil oppsto med lasting av iTunes databasen" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Det oppstod en feil når metadata skulle skrives til '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Det oppstod en udefinert feil" #: ui/about.cpp:85 msgid "And:" msgstr "Og" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Sint" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Utseende" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Tilføy filer/URLer til spillelista" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Legg til i gjeldende spilleliste" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Legg til i spilleliste" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Legg til kompressor, for å unngå klipping" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Er du sikker på at du vil slette \"%1\" innstillingen?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Er du sikker på at du ønsker å nullstille denne sangens statistikk?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Er du sikker på at du ønsker å skrive statistikken for sangene til filene, for alle sangene i biblioteket?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Artist" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Artist info" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Artist etiketter" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Artistens initial" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Spør ved lagring" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Lydformat" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Lyd-utenhet" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Autentiseringen feilet" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Forfatter" #: ui/about.cpp:68 msgid "Authors" msgstr "Forfattere" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Automatisk" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Automatisk" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Automatisk oppdatering" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Automatisk åpne enkeltkategorier i bibliotektreet" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Tilgjengelig" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Gjennomsnittlig bitrate" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Gjennomsittlig bildestørrelse" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "BBC-Podcast" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Bakgrunnsstrømmer" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Bakgrunnsfarge" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Bakgrunnsbilde" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Bakgrunnsgjennomsiktighet" #: core/database.cpp:648 msgid "Backing up database" msgstr "Tar sikkerhetskopi av databasen" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Balanse" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Stolpeanalyse" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Blå" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Grunnleggende lydtype" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Atferd" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Best" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Biografi fra %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Bitrate" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Bitrate" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Bitrate" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Blokkanalyse" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Blokktype" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Mengde slør" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Innhold" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Boomanalysator" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Bla gjennom..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Bufferlengde" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Mellomlagring" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Bygger Seafile-indeks..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Men disse kildene er slått av:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Knapper" #: core/song.cpp:428 msgid "CDDA" msgstr "CD-audio" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Støtte for CUE-filer" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Hurtiglager-plassering" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Hurtiglagring" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "Hurtiglagrer %1" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Avbryt" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Avbryt nedlasting" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Trenger Captcha.\nPrøv å logge inn på Vk.com med nettleseren din for å ordne dette." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Endre omslagsbilde" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Endre font størrelse..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Endre repetisjonsmodus" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Endre snarvei..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Endre stokke-modus" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "Bytte sangen som spilles" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Endre språket" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "Endringer vil utføres når neste sang begynner å spille" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Når du endrer innstillingen for mono-avspilling, vil dette bli tatt i bruk for neste sanger" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Se etter nye episoder" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Se etter oppdateringer" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Sjekk for oppdateringer..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Velg Vk.com-hurtiglagerplassering" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Sett et navn på den smarte spillelisten" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Velg automatisk" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Velg farge..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Velg skrifttype..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Velg fra listen" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Velg hvordan spillelisten er sortert og hvor mange sanger den vil inneholde." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Velg katalog for podcastene" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Velg internettjenestene du vil vise." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Velg websidene du vil at Clementine skal bruke under søking for lyrikk." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Klassisk" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Rydder" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Tøm" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Tøm spillelisten" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Clementine feil" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Oransje" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Clementine visualisering" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine kan automatisk konvertere musikken du kopierer til denne enheten til en format som den kan spille." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Clementine kan spille musikk som du har lastet opp til Amazon Cloud Drive" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine kan spille musikk som du har lastet opp til Box" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine kan spille musikk som du har lastet opp til Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine kan spille musikk som du har lastet opp til Google Disk" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine kan spille musikk som du har lastet opp til OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine kan vise en melding ved sporendring" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine kan synkronisere abonnementslistene dine mot andre maskiner og podcast-programmer. Opprett konto." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine klarte ikke å laste projectM visualiseringer. Sjekk at Clementine er korrekt installert." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Clementine bildevisning" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine klarte ikke å finne resultater for denne filen" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine leter etter musikk i:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Klikk her for å legge til musikk" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Klikk her for å merke spillelisten som favoritt, så den lagres og blir tilgjengelig via Spillelister-panelet i venstre sidefelt." #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Klikk for å bytte mellom gjenværende tid og total tid" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Når du trykker Login-knappen vil du bli sendt til en nettleser. Du går tilbake til Clementine etter å ha logget inn." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Lukk" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Lukk spillelista" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Lukk visualisering" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Lukking av dette vinduet vil kansellere nedlastingen." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Lukking av dette vinduet vil stoppe søking for album kover." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Klubbmusikk" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Farger" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Komma-separert liste av klasse:level, level er 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Kommentar" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Community Radio" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Fullfør tags automatisk" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Fullfør tags automatisk..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Komponist" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Konfigurér %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Konfigurer Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Oppsett av hurtigtaster" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Konfigurere Spotify..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Konfigurere Subsonic.." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Konfigurér Vk.com..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Konfigurér globalt søk..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Sett opp bibliotek..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Konfigurere podcasts..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Innstillinger..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Koble til Wii Remotes med aktiver/de-aktiver aksjon" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Koble til enhet" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Kobler til Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Tjeneren nektet tilkobling; sjekk tjener-URL. For eksempel: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Tidsavbrudd i tilkoblingen; sjekk tjener-URL. For eksempel: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Tilkoblingsproblem, eller eieren har slått av lyden" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Konsoll" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Konstant bitrate" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Konverter all musikk" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Konverter musikk som enheten ikke kan spille" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Konvertér tapsfrie lydfiler før du sender dem." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Konvertér tapsfrie filer" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Kopiér delingslink til utklippstavlen" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Kopiér til utklippstavla" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Kopier til enhet..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Kopier til bibliotek..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Copyright" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Kunne ikke koble til Subsonic; sjekk server-URLen. Eksempel: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Kunne ikke lage GStreamer element \"%1\" - sørg for at du har alle de nødvendige GStreamer programutvidelsene installert" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Kunne ikke opprette spilleliste" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Kunne ikke finne multiplekser for %1, sjekk at du har de riktige GStreamer programutvidelsene installert" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Kunne ikke finne noen koder for %1, kontrollér at du har de riktige GStreamer-modulene installert" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Kunne ikke åpne output fil %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Behandling av plateomslag" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Omslagsgrafikk fra innebygget bilde" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Omslagsgrafikk ble lastet inn automatisk fra %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Fjernet omslagsgrafikk manuelt" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Har ikke omslagsgrafikk" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Omslagsgrafikk satt fra %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Omslag fra %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Mikse overgang når spor skiftes automatisk" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Mikse overgang når du skifter spor selv" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Skift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Egendefinert" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Egendefinert bilde:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Egendefinerte meldingsinnstillinger" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Egendefinert..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "DBus sti" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dansemusikk" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Oppdaget feil i databasen. Vennligst les https://code.google.com/p/clementine-player/wiki/DatabaseCorruption for å finne ut hvordan du kan gjenoprette den." #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Laget dato" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Endringsdato" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Dager" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "S&tandard" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Demp volum med 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Demp lydstyrken med prosent" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Demp volumet" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Standard bakgrunnsbilde" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Standerd enhet på %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Standard" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Pause mellom visualiseringer" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Slett" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Slett nedlastede data" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Slett filer" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Slett fra enhet..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Slett fra harddisk..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Slett avspilte episoder" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Slett forhåndsinnstilling" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Slett smart spilleliste" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Slett de originale filene" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Sletter filer" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Fjern valgte spor fra avspillingskøen" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Fjern sporet fra avspillingskøen" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Destinasjon" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Detaljer" #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Enhet" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Egenskaper for enhet" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Enhetsnavn" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Egenskaper for enhet..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Enheter" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Dialog" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Mente du" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "passord for Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "brukernavn for Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Koblet direkte til internett" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Katalog" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Slå av varighet" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Slå av opprettelse av stemningsstolper" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Deaktivert" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Deaktivert" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Disk" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Uregelmessig overførsel" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Visningsegenskaper" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Vis overlegg-display" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Sjekk hele biblioteket" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Gjør et fullstendig nysøk" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Gjør et fullstendig nysøk ..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Ikke konverter musikk" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Ikke skriv over" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "Gjøres et fullstendig nysøk vil alle metadata du har lagret i Clementine bli fjernet, dette inkluderer albumbilder, avspillingsantall og rangeringer. Clementine vil søke gjennom all musikken din i Google Drive på nytt, hvilket kan ta noe tid." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Ikke repetér" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Ikke vis under Diverse Artister" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Ikke vis allerede spilte episoder" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Ikke stokk" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Ikke stopp!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Donér" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Dobbelklikk for å åpne" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "Dobbeltklikke på en sang i spillelisten vil ..." #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Når jeg dobbelklikker en sang, ..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Last ned %n episoder" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Last ned katalog" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Last ned episodene til" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Last ned medlemskap" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Last ned nye episoder automatisk" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Lagt til i nedlastingskøen" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Last ned innstillinger" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Last ned Android-appen" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Last ned dette albumet" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Last ned dette albumet..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Last ned denne episoden" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Last ned..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Laster ned (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Laster ned Icecast-katalogen" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Laster ned Jamendo-katalogen" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Laster ned Magnatune-katalogen" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Laster ned Spotify-modul" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Laster ned metadata" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Dra for å endre posisjon" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbo" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dubstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Varighet" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Dynamisk modus er på" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Dynamisk tilfeldig miks" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Rediger smart spilleliste..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Redigér taggen \"%1\"..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Endre merkelapp..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Rediger tagger" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Redigér informasjon om sporet" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Rediger informasjon om sporet..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Rediger sporinformasjon..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Rediger..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "E-post" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Slå på støtte for Wii-fjernkontroll" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Slå på automatisk hurtiglagring" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Slå på equalizer" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Bruk hurtigtaster bare når Clementine har fokus" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Slå på direkteredigering med ett klikk" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Slå på kilder under for å inkludere dem i søkeresultater. Resultatene vises i denne rekkefølgen." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Slå av/på scrobbling mot Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Koder-kompleksitet" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Koder-kvalitet" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Kodermodus" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Skriv inn en URL" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Skriv inn en URL for å laste ned albumgrafikk fra internett:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Skriv inn et filnavn for eksportert albumgrafikk (uten filetternavn):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Gi denne spillelista et nytt navn" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Skriv inn søkeord over for å finne musikk på din datamaskin og på internet." #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Skriv inn søkeord under for å finne podcaster i iTunes Store" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Skriv inn søkeord under for å finne podcaster på gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Skriv inn søkeord her" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Skriv adressen (URL) til en internett radiostrøm" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Skriv inn navn på mappa" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Skriv in denne IPen i Appen for å koble til Clementine." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Hele samlingen" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Lydbalanse" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Tilsvarer --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Tilsvarer --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Feil" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Feil ved kopiering av CD" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Kunne ikke koble til MTP-enhet" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Kunne ikke kopiere sanger" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Kunne ikke slette sanger" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Kunne ikke laste ned Spotify-modul" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Kunne ikke laste inn %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Kunne ikke laste ned spillelista fra di.fm" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Kunne ikke behandle %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Kunne ikke laste lyd-CD" #: library/library.cpp:68 msgid "Ever played" msgstr "Noensinne spilt av" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Hvert 10. minutt" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Hver 12. time" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Hver 2. time" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Hvert 20. minut" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Hver halvtime" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Hver 6. time" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Hver time" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Unntatt mellom spor fra samme album eller CUE-fil" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Eksisterende omslag" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Utvid" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Utgår den %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Eksportér omslag" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Eksportér omslag" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Eksportér nedlastede omslag" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Eksportér innebygde omslag" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Eksport fullført" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Esportert %1 av %2 omslag (hoppet over %3)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Fade ut/inn ved pause/start" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Ton ut når sporet stoppes" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Ton inn/ut" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Toning-varighet" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Kunne ikke lese av CD ROMen" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Kunne ikke hente katalogen" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Kunne ikke laste ned podcast" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Kunne ikke laste inn podcast" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Kunne ikke lese XML-beskrivelsen av denne RSS-feeden." #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Rask" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Favorittspor" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Hent manglende omslag" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Hent automatisk" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Henting fullført" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Henter Subsonic-bibliotek" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Kunne ikke hente albumgrafikk" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Fil format" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Filetternavn" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Filformat" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Filnavn" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Filnavn (uten sti)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Filnavnsmønster:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Filplasseringe" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Filstørrelse" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Filtype" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Filnavn" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Filer" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Filer som skal kodes" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Finn sanger i biblioteket, basert på kriteriene du oppgir" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Finn denne artiste" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Vannmerker sangen" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Ferdig" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Første nivå" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Tilpass cover til bredden" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "FLAC" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Skriftstørrelse" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Av lisenshensyn er Spotify-støtte en egen innstikksmodul." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Tving monolyd-koding" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Glem enhet" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Hvis du glemmer enheten, forsvinner den fra denne listen, og Clementine må lete gjennom alle sangene på enheten neste gang du kobler den til." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Skjema" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Format" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Bilder/sekund" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Bilder per buffer" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Dypfry" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Full Bass" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Full Bass + Lys lyd" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Full lys lyd" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Generelt" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Generelle innstillinger" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Sjanger" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Lag en link å dele denne Spotify-sangen med" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Lag en link å dele denne spillelisten med" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Henter kanaler" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Henter strømmer" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Gi den et navn:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Gå" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Gå til neste flik på spillelista" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Gå til forrige flik på spillelista" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Disk" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Hentet %1 av %2 albumbilder (%3 feilet)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Merk ikke-eksisterende sanger med grått i mine spillelister" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Gruppér biblioteket etter..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Grupper etter" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Gruppér på albumtittel" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Gruppér på artistnavn" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Gruppér på artist og album" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Gruppér etter Artist/År - Albumnavn" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Gruppér etter Sjanger/Album" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Gruppér etter Sjanger/Artist/Album" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Gruppering" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "HTML-siden inneholdt ingen RSS-feeder." #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "Fikk til svar HTTP-kode 3xx , men uten URL. Sjekk serverkonfigurasjonen." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "Mellomtjener for HTTP" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Glad" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Informasjon om maskinvare" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Informasjon om maskinvaren er bare tilgjengelig når enheten er tilkoblet." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Høy" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Høy (%1 bilder/sekund)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Høy (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "HipHop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Fant ikke tjeneren; sjekk tjener-URL. For eksempel: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Timer" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Jeg har ikke noen Magnatune-konto" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Ikon" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Ikoner øverst" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Identifiserer sangen" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Klikk på en valgt sang i spilleliste-visningen lar deg redigere verdien direkte." #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Hvis du fortsetter, vil enheten bli treg, og du kan kanskje ikke spille av sanger kopiert til den." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Hvis du vet URLen til en podcast, skriv den inn under og trykk Gå." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Ignorér \"The\" i artistnavn" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Bilder (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Bilder (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Importér..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "Om %1 dager" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "Om %1 uker" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "I dynamisk modus vil nye spor bli valgt og lagt til spillelista hver gang en sang tar slutt." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Innboks" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Inkludér cover i meldingen" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Inkluder alle sanger" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Ikke-kompatibel Subsonic REST-protokollversjon. Klienten må oppgraderes." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Ikke-kompatibel Subsonic REST-protokollversjon. Tjeneren må oppgraderes." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Ufullstendig oppsett. Sjekk at du har fylt ut alle feltene." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Øk lydstyrken 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Øk lydstyrken med prosent" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Øk lydstyrken" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Indekserer %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Informasjon" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Inngangsvalg" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Sett inn..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Installert" #: core/database.cpp:585 msgid "Integrity check" msgstr "Integritetskontrol" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internett" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Internettilbydere" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Internettjenester" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Ugyldig API-nøkkel" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Ugyldig format" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Ukjent metode" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Ugyldige parametere" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Ugjyldig ressurs" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Ukjent tjeneste" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Ugyldig sesjonsnøkkel" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Omvendt utvalg" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Mest spilte på Jamendo" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Favorittlista på Jamendo" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Månedens favoritter på Jamendo" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Ukas favoritter på Jamendo" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Jamendo-database" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Gå til forrige sang nå" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Gå til sporet som spilles av nå" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Hold nede knappen i %1 sekund(er)..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Hold nede knappen i %1 sekund(er)..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Fortsett i bakgrunnen selv om du lukker vinduet" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Belhold originalfiler" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Småpus" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Språk" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Laptop/Hodetelefoner" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Storsal" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Stort albumbilde" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Stort cover (detaljer under)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Stort cover (uten detaljer)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Stort sidefelt" #: library/library.cpp:80 msgid "Last played" msgstr "Sist spilt" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Sist spilt" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm er opptatt, vennligst prøv igjen om et par minutter" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Last.fm-passord" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Antall avspillinger fra Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Tagger fra Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Last.fm-brukernavn" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Last.fm-wiki" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Spor med minst stemmer" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Venstre" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Lengde" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Bibliotek" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Avansert biblioteksgruppering" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Melding om gjennomsyn av biblioteket" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Søk i biblioteket" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Grenser" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Hent" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Hent albumgrafikk fra URL" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Hent albumgrafikk fra URL..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Hent albumbilde fra disk" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Hent albumgrafikk fra disk..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Åpne spilleliste" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Åpne spilleliste..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Åpner MTP-enhet" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Åpner iPod-database" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Åpner smart spilleliste" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Åpner sanger" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Lader lydstrøm" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Åpner spor" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Henter informasjon om spor" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Åpner..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Åpne filer/URLer; erstatt gjeldende spilleliste" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Innlogging" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Login feilet" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Logg u" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Long term prediction-profil (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Elsker" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Lav (%1 bilder/sekund)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Lav (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Low complexity-profil (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Sangtekst" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Sangtekst fra %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Sangtekst fra ID3v2-taggen" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3, 96kbps" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4, AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Magnatune-nedlasting" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Magnatune-nedlasting fullført" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Hovedprofil (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Kjør på!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Make it so!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Gjør spillelista tilgjengelig online" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Ugyldig svar" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Manuell proxy-innstilling" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Manuelt" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Fabrikant" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Merk som hørt" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Merk som ny" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Krev treff på alle søkeord (OG)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Treff på hvilket som helst søkeord (ELLER)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Maksimalt antall søketreff" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Høyeste bitrate" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Mediet er byttet ut. Laster inn på nytt" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Medium (%1 bilder/sekund)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Medium (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Type medlemskap" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Minimal bitrate" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Minimum bufferfyll" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Manglende projectM-forhåndsinnstillinger" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Modell" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Følg med på endringer i biblioteket" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Spill av i mono" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Måneder" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Stemning" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Type stemningsstolpe" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Stemningsstolper" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Mer" #: library/library.cpp:84 msgid "Most played" msgstr "Mest spilt" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Monteringspunkt" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Monteringspunkter" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Flytt ned" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Flytt til bibliotek..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Flytt opp" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Musikk" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Musikkbibliotek" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Demp" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Mine album" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Musikk" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Mine anbefalinger" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Navn" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Navn" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Navnevalg" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Smalbånd (SB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Mellomtjener" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Tjener på nettet" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Aldri" #: library/library.cpp:74 msgid "Never played" msgstr "Aldri spilt" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Begynn aldri avspilling" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Ny mappe" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Ny spilleliste" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Ny smart spilleliste..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Nye sanger" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Nye spor vil automatisk bli lagt til." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Nyeste spor" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Neste" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Neste spor" #: core/utilities.cpp:151 msgid "Next week" msgstr "Neste uke" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Ingen analyse" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Slå av bagrunnsbilde" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Ingen omslag å eksportere." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Ingen lange blokker" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Ingen treff. Visk ut søkefeltet for å vise hele spillelisten igjen." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Ikke korte blokker" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Ingen" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Kunne ikke kopiere noen av de valgte sangene til enheten" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Normal" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Normal blokktype" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Ikke tilgjengelig sammen med dynamiske spillelister" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Ikke tilkoblet" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Ikke nok innhold" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Ikke nok tilhengere" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Ikke nok medlemmer" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Ikke nok naboer" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Ikke installert" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Ikke pålogget" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Ikke montert - dobbelklikk for å montere" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Fant ingenting" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Meldingstype" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Meldinger" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Nå spilles" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Antall episoder å vise" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Forhåndsvisning av notifikasjon" #: widgets/osd.cpp:173 msgid "Off" msgstr "Av" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "OGG FLAC" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "På" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Aksepter kun tilkoblinger fra klienter i IP-rangene:⏎\n10.x.x.x⏎\n172.16.0.0 - 172.31.255.255⏎\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Tillat kun tilkoblinger fra det lokale nettverket" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Bare vis første" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Dekkevne" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Åpne %1 i nettleser" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Åpne lyd-&CD" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Åpne OPML-fil" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Åpne OPML-fil..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Importér musikk fra en katalog" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Åpne enhet" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Åpne fil..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Åpne i Google Disk" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Åpne i ny spilleliste" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Åpne i ny spilleliste" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Åpne i nettlese" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Åpne..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Operasjonen feilet" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Optimalisert for bitrate" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Optimalisert for kvalitet" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Innstillinger..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Organisér filer" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Organisér filer..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Organiserer filer" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Opprinnelige tagger" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Andre innstillinger" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Ut" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Ut-enhet" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Utputt-innstillinger" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Skriv over alle" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Skriv over eksisterende filer" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Skriv over bare mindre ~" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Eier" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Behandler Jamendo-katalogen" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Fest" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Passord" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Pause" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Pause" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Pauset" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Utøver" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Pixel" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Enkelt sidefelt" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Spill" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Antall ganger spilt av" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Hvis stoppet: spill av. Hvis spiller: pause" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Spill hvis det ikke er noe annet som spilles av for øyeblikket" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Spill av ende spor i spillelista" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Spill av/Pause" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Avspilling" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Innstillinger for avspiller" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Spilleliste" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Spillelisten er ferdigspilt" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Innstillinger for spilleliste" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Type spilleliste" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Spillelister" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Vennligst lukk nettleseren og gå tilbake til Clementine." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Modulens status:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcaster" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Hvor lenge skal informasjonsvinduet vises" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Portnummer" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Lydforsterkning" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Innstillinger" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Innstillinger" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Innstillinger …" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Foretrukne albumbilde-filnavn (separert med komma)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Foretrukket lydformat" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Foretrukket bitrate" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Foretrukket format" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Premium-lydtype" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Forhåndsinnstillinger:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Trykk en tastkombinasjon å bruke til" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Trykk en tast" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Trykk en tastekombinasjon å bruke til %1..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Når du trykker \"Forrige\" i spilleren, …" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Skrivebordsmeldinginnstillinger" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Forhåndsvisning" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Forrige" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Forrige spor" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Vis versjonsinformasjon" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Fremgang" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Fremgang" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psykedelisk" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Trykk Wiiremote-knapp" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Sett sangene i tilfeldig rekkefølge" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Kvalitet" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Kvalitet" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Spør enhet..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Kø behandler" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Legg valgte spor i kø" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Legg spor i kø" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (lik loudness for alle spor)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Regn" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Regn" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Tilfeldig visualisering" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Gi 0 stjerner til sangen" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Gi 1 stjerne til sangen" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Gi 2 stjerner til sangen" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Gi 3 stjerner til sangen" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Gi 4 stjerner til sangen" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Gi 5 stjerner til sangen" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Poenggiving" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Vil du virkelig avbryte?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "For mange omdirigeringer. Sjekk serverkonfigurasjonen." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Oppfrisk katalogen" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Hent kanaler på ny" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Oppfrisk kanallista" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Oppfrisk bakgrunnslyder" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Relativ" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Husk Wii-fjernkontroll-bevegelse" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Husk fra forrige gang" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Husk valg" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Fjern" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Fjern handling" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Fjern duplikater fra spillelisten" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Fjern katalog" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Fjern fra Musikk" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Fjern i fra bokmerker" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Fjern fra spillelisten" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Fjern spilleliste" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Fjern spillelister" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Fjern utilgjengelige spor fra spilleliste" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Gi nytt navn til spillelista" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Gi nytt navn til spillelista..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Renummerér sporene i denne rekkefølgen..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Repetér" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Repetér album" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Gjenta spilleliste" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Repetér spor" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Erstatt gjeldende spilleliste" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Erstatt spillelista" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Erstatt mellomrom med understrek" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Normalisering" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Replay Gain-modus" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Fyll lista igjen" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Krev tilgangskode" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Resett" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Resett avspillingsteller" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Start om sangen, gå så til forrige hvis du trykker én gang til" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Start sporet igjen, eller spill forrige spor hvis du er innen de første 8 sekundene av sporet" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Begrens til ASCII-tegn" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Gjenoppta avspilling etter oppstart" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Returnér til Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Høyre" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Rip" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Rip CD" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Kopiér lyd-CD" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Kjør" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "Mellomtjener for SOCKS" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Feil i SSL-handshake, sjekk tjenerkonfigurasjon. SSLv3-valget under kan ordne noen problemer." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Trygg fjerning av enhet" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Kjør trygg fjerning av enhet etter kopiering" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Samplingsrate" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Samplingsrate" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Lagre .mood-filer i musikkbiblioteket ditt" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Lagre albumbilde" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Lagre bilde til disk..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Lagre bilde" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Lagre spilleliste" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Lagre spilleliste" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Lagre spillelista..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Lagre forhåndsinnstilling" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Lagre poeng i tagger når mulig" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Lagre statistikk i filtagger når mulig" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Lagre denne kanalen i en Internett-flik" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Lagrer sangstatistikk til filene" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Lagrer spo" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Skalerbar samplingrate-profil (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Skalér til størrelse" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Karakte" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Fortell last.fm om (\"scrobble\") sangene jeg har lyttet til" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Søk" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Søk" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Søk i Icecast-stasjoner" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Søk i Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Søk i Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Søk i Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Automatisk søk" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Søk etter albumbilder..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Søk etter hva som helst" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Søk på gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Søk iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Søkemodus" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Søkeinnstillinger" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Søkeresultater" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Søkekriterier" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Andre nivå" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Gå bakover" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Gå fremove" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Gå frem-/bakover en viss tidsperiode i sporet" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Gå til et bestemt tidspunkt i sporet" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Velg alle" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Velg ingen" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Velg bakgrunnsfarge:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Velg bakgrunnsbilde" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Velg det beste treffet" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Velg forgrunnsfarge:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Velg visualiseringer" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Velg visualiseringer..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "velg..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Serienummer" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Tjener" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "Tjener-URL" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Tjenerdetaljer" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Tjenesten er utilgjengelig" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Sett %1 to \"%2\"..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Sett lydstyrken til prosent" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Sett verdi for alle de valgte sporene..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Innstillinger" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Hurtigtast" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Hurtigtast for %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Det finnes allerede en hurtigtast for %1" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Vis" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Vis display" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Vis aura rundt gjeldende spor" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Vis stemningsstolper i panelet for avspillingsfremgang." #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Vis en skrivebordsmelding som passer til ditt operativsystem" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Vis en melding når jeg endrer gjentakelses- og stokke-modus" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Vis informasjonsvinsu når jeg endrer lydstyrke" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Vis melding når jeg pauser avspillingen" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Popp opp informasjon fra systemskuffa" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Vis en Clementine-spesifikk skrivebordsmelding" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Vis over statuslinja" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Vis alle sanger" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Vis alle sangene" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Vis albumbilder i biblioteket" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Vis delere" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Vis i fullskjerm..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Gruppér søkeresultatet" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Vis i filbehandler..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Vis i bibliotek ..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Vis under Diverse Artister" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Vis Stemningsstolpe" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Vis bare duplikate" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Vis bare filer uten tagger" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Vis sangen du spiller av, på siden din" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Vis søkeforslag" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Vis «elsker»-knappen" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Vis scrobble-knappen i hovedvinduet" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Vis systemkurvikon" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Vis hvilke kilder som er på og hvilke som er av" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Vis/skjul" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Stokk om" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Stokk om album" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Stokk alle" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Stokk om spillelista" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Stokk om dette albumet" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Logg in" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Logg ut" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Logger på..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Lignende artister" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Størrelse" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Størrelse:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Gå bakover i spillelista" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Antall ganger hoppet over" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Gå fremover i spillelista" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Hopp over valgte spor" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Hopp over spor" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Lite albumbilde" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Lite sidefelt" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Smart spilleliste" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Smarte spillelister" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Myk" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Informasjon om sange" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Info om sangen" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Beklager" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Sorter alfabetisk etter sjanger" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Sorter etter sjangerens popularitet" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Sorter etter kanalnavn" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Sorter sanger etter" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Sortering" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Kilde" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Kilder" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Kunne ikke logge på Spotify" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "Link til Spotify-spillelisten" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Spotify-modul" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Har ikke installert Spotify-modul" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "Link til Spotify-sangen" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Standard" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Har stjerner" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Start ripping" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Begynn på spillelista nå" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Start koding" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Skriv noe i søkeboksen over for å fylle denne resultatlisten" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Starter %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Starter …" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Stopp" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Stopp etter" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Stopp etter hvert spor" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Stopp etter hvert spor" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Stopp etter denne sangen" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Stopp avspilling" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Stopp avspilling etter gjeldende spor" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Stopp avspilling etter spor: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Stoppet" #: core/song.cpp:431 msgid "Stream" msgstr "Strøm" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Streaming fra en Subsonic-server krever en gyldig tjenerlisens etter prøveperioden på 30 dager." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Streaming-medlemskap" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Abonnente" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subson" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Lykkes!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "Skrev %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Foreslåtte tagger" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Sammendrag" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Super-høy (%1 bilder/sek)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Superhøy (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Støttede formater" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Synkronisér statistikk til filene nå" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Synkroniserer Spotify-innboksen" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Synkroniserer Spotify-spillelista" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Synkroniserer spor med sterner mot Spotify" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Systemfarger" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Fliker på toppen" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Tagg-henter" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Ønsket bitrate" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Tekno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Tekstinnstillinger" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Takk til" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Kunne ikke starte kommandoen \"%1\"" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Albumgrafikken til sangen som spilles av i øyeblikket" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "Katalogen %1 er ikke gyldig" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "Den andre verdien må være større enn den første!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Siden du spesifiserte, finnes ikke!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Stedet du spesifiserte, er ikke et bilde!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Prøveperioden for Subsonic er over. Vennligst gi en donasjon for å få en lisensnøkkel. Besøk subsonic.org for mer informasjon." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Fordi du har oppdatert Clementine til en nyere versjon, må hele lydbiblioteket sees gjennom på nytt. Grunnen er følgende nye funksjoner:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Ingen andre sanger i dette albumet" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Kommunikasjonsproblemer med gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Kunne ikke hente metadata fra Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Forstod ikke svaret fra iTunes Store" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Fikk problemer med å kopiere enkelte sanger. Følgende kunne ikke kopieres:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Fikk problemer med å slette enkelte sanger. Følgende kunne ikke slettes:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Filene vil bli slettet fra enheten. Er du sikker?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Disse filene vil bli slettet helt fra disken, er du sikker?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Disse katalogene vil skannes for musikk som kan legges til biblioteket ditt" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Disse innstillingene brukes i \"Kode musikk\"-dialogvinduet, og når musikken kodes før kopiering til en enhet." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Tredje nivå" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Dette oppretter en database som kan bli inntil 150MB stor.\nEr du sikker?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Dette albumet er ikke tilgjengelig i formatet du bad om" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Dette kan endres i instillingene senere" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Enheten må kobles til og åpnes før Clementine kan se hvilke filformater den støtter." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Denne enheten støtter følgende filformat:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Enheten vil ikke fungere ordentlig" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Dette er en MTP-enhet, men Clementine ble kompilert uten libmtp-støtte." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Dette er en iPod, men Clementine ble kompilert uten libgpod-støtte." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Det er første gang du kobler til denne enheten. Clementine ser nå gjennom enheten for å finne musikkfiler. Dette kan ta noe tid." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Dette valget kan endres under innstillinger for \"Oppførsel\"" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Denne tjenesten er kun for betalende kunder" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Denne enhetstypen (%1) støttes ikke." #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Tittel" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "I dag" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Slå av/på Pent Display" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Slå av/på fullskjerm-modus" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Slå av/på køstatus" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Slå av/på deling av lyttevaner" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Slå av/på Pent Display" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "I morgen" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "For mange videresendinger" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Favorittspor" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Totalt antall album:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Totalt overført, bytes" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Totalt antall forespørsler over nettet" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Spor" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Spor" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Bytt musikk format" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Logg for omkoder" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Omkoding" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Koder om %1 filer i %2 tråder" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Innstillinger for omkoding" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbin" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Slå av" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL(er)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Ultrabredt bånd (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Klarte ikke å koble til" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Kunne ikke laste ned %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Ukjent" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Ukjent innholdstype" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Ukjent feil" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Fjern omslaget" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Ikke hopp over de valgte sporene" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Ikke hopp over sporet" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Avmeld" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Fremtidige konserter" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Oppdater" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Oppdater alle podcaster" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Oppdater endringer i bibliotek mapper" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Oppdater biblioteket når Clementine starte" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Oppdater denne podcasten" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Oppdaterer" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Oppdaterer %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Oppdaterer %1% …" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Oppdaterer bibliotek" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Bruk" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Bruk Albumartist-taggen når tilgjengelig" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Bruk hurtigtaster fra Gnome" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Bruk psykedeliske farger" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Bruk normaliserings-metadata hvis tilgjengelig" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Bruk SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Bruk Wii-fjernkontroll" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Bruk egendefinert fargedrakt" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Bruk egendefinert meldingstype for beskjeder" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Bruk nettverksfjernkontroll" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Bruk autentisering" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Bruk kontrollert bitrate" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Bruk dynamisk modus" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Vis meldinger om Wii-fjernkontrollen" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Bruk \"temporal noise shaping\"" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Bruk systemstandard" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Bruk systemets fargedrakt" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Bruk standard proxy-innstillinger" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Bruk normalisering" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Brukt" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Brukergrensesnit" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Brukernavn" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Hvis du bruker menyen for å legge til en sang..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Variabel bitrate" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Diverse artister" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Versjon %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Vis" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Visualiseringsmodus" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Visualiseringer" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Innstillinger for visualisering" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Taledeteksjon" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Volum %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Vegg" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Advarsel når jeg lukker en spilleliste-flik" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "WAV" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Webside" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Uker" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Når Clementine starter" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Clementine søker først etter albumbilder som inneholder et av disse ordene.\nHvis ingen ord passer, blir det største bildet i katalogen brukt." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "Når du lagrer spillelisten, skal filplasseringen" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Når listen er tom..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Hvorfor ikke prøve..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Bredbånd (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii-fjernkontroll %1: aktivert" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii-fjernkontroll %1: tilkoblet" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii-fjernkontroll %1: lavt batteri (%2%)" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii-fjernkontroll %1: deaktivert" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii-fjernkontroll %1: frakoblet" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii-fjernkontroll %1: lavt batteri (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media, 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Uten omslag:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Ønsker du å flytte også resten av sangene i dette albumet til Diverse Artister?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Vil du se gjennom hele biblioteket på ny nå?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Skriv all statistikk til sangfilene" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Skriv metadata" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Ugyldig brukernavn og/eller passord" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "År" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "År - Album" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "År" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "I går" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Du kommer nå til å laste ned følgende album" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Du sletter nå %1 spillelister fra favorittene dine, er du sikker?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Du er i ferd med å slette en spilleliste som ikke er lagret i Favoritter. Denne spillelisten vil bli slettet (og du kan ikke angre). \nEr du sikker?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Du har ikke logget på." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Du er pålogget som %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Du er pålogget" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Du kan velge hvordan sangene i biblioteket er organisert." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Du kan lytte gratis uten konto, men Premium-medlemmer kan lytte til strømmer i høyere kvalitet, og uten reklame." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Du kan lytte til Magnatune-sanger gratis, uten konto. Hvis du kjøper medlemskap, forsvinner reklamen på slutten av hvert spor." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Du kan lytte til bakgrunnsstrømmer samtidig med annen musikk." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Du kan bruke Wii-fjernkontrollen som fjernkontroll for Clementine. Se wiki-siden for Clementine for mer informasjon.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Du har ikke noen Spotify Premium-konto." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Du har ikke noe aktivt abonnement" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "Du trenger ikke være pålogget for å søke etter og lytte til musikk på SoundCloud. Men du må logge inn for å få tilgang til spillelistene og strømmen din." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Du har logget ut av Spotify; skriv inn ditt passord i dialogvinduet \"Innstillinger\"." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Du har logget ut av Spotify; skriv inn dit passord igjen." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Du elsker dette sporet" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "Du må åpne Systemvalg og gi Clementine tilgang til \"styre datamaskinen din\" for å bruke globale snarveier i Clementine." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Du må starte Clementine på nytt for å bytte språk." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Din IP-adresse:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Din Last.fm-brukerinformasjon var ikke riktig" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Feil med din Magnatune-brukerinformasjon" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Ditt bibliotek er tomt!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Dine radiokanaler" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Dine delte lyttevaner (\"scrobbles\"): %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Systemet ditt har ikke OpenGL-støtte, og kan derfor ikke kjøre visualiseringer." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Feil med din brukerinformasjon" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Å-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Null" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "legg til %n sanger" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "etter" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "siden" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "og" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "automatisk" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "før" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "mellom" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "største først" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "slag per minutt" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "inneholder" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "slått av" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "disk %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "inneholder ikke" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "slutter med" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "er lik" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "gpodder.net-katalog" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "større enn" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "iPod'er og USB-enheter fungerer dessverre ikke i Windows for øyeblikket." #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "i de siste" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "mindre en" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "lengste først" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "flytt %n sanger" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "nyeste først" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "ikke lik" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "ikke i de siste" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "ikke den" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "eldste først" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "de" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "innstillinger" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "eller scan QR-koden!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "trykk Enter" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "fjern %n sange" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "korteste først" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "Stokkemodus" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "minste først" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "Sortér sanger" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "begynner me" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "stopp" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "spor %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/nl.po000066400000000000000000005126171260417502300236640ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # arnaudbienner , 2011 # dragnadh , 2015 # FIRST AUTHOR , 2010 # Sparkrin , 2013 # Sparkrin , 2011-2012 # TheLastProject, 2012 # Senno Kaasjager , 2014 # Senno Kaasjager , 2014-2015 # PapaCoen , 2012 # valorcurse , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Dutch (http://www.transifex.com/davidsansome/clementine/language/nl/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nU kunt afspeellijsten aan uw favorieten toevoegen door te klikken op het ster icoon naast de naam van de afspeellijst.\n\nFavoriete afspeellijsten zullen hier opgeslagen worden." #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " dagen" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " msec" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr " s" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " seconden" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " nummers" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 nummers)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 albums" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 dagen" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 dagen geleden" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 op %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 afspeellijsten (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 geselecteerd van" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 nummer" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 nummers" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 nummers gevonden" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 nummers gevonden (%2 worden weergegeven)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 nummers" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 overgezet" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev-module" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 andere luisteraars" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "In totaal %L1 keer afgespeeld" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n mislukt" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n voltooid" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n resterend" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "Tekst &uitlijnen" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Centreren" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "Aan&gepast" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "&Extra's" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Hulp" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "%1 &verbergen" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Verbergen…" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Links" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "&Muziek" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "Gee&n" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "&Afspeellijst" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Afsluiten" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "&Herhaalmodus" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Rechts" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "&Willekeurige modus" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "Kolommen &uitstrekken totdat ze het venster vullen" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Hulpmiddelen" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(niet bij alle nummers hetzelfde)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", door" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "... en allen die aan Amarok hebben bijgedragen" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 dag" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 nummer" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192.000Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44.100Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48.000Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 willekeurige nummers" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96.000Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Nu opwaarderen naar Premium" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Wanneer niet aangevinkt, zal Clementine uw waarderingen en andere statistieken opslaan in de clementine database en uw bestanden niet bewerken.

Wanneer aangevinkt, zal Clementine waarderingen en andere statistieken opslaan in de database en ook in uw bestanden.

Het opslaan in bestanden zal niet voor alle bestandsformaten correct werken om dat hiervoor geen standaard methode bestaat en niet alle programma's het lezen van deze statistieken ondersteunen.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Voeg een veldnaam toe voor een woord om de zoekopdracht te beperken tot dat veld, bijv. artist:Bode doorzoekt de bibliotheek naar alle artiesten waar het woord Bode in voorkomt.

Beschikbare velden: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Dit zal alle waarderingen en statistiek wegschrijven in de bestanden van uw muziekbibliotheek.

Dit is niet nodig als de optie "Sla waarderingen op in bestand, indien mogellijk" altijd aan gestaan heeft.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Tokens beginnen met %, Bijvoorbeeld: %artist %album %title

\n\n

Als u tekstgedeelten die tokens bevatten tussen accolades zet, zal dat gedeelte verborgen worden als het token leeg is.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Een Spotify Premium account is vereist." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Een apparaat kan alleen verbinden als de juiste code ingevoerd is." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Een slimme afspeellijst is een dynamische lijst van nummers uit uw bibliotheek. Er zijn verschillende types, die elk op een andere manier nummers selecteren." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Een nummer wordt in de afspeellijst opgenomen als het aan deze voorwaarden voldoet." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128K" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64K" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ALL GLORY TO THE HYPNOTOAD" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Afbreken" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Over %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Over Clementine…" #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Over Qt…" #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Absoluut" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Account gegevens" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Account gegevens (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Actie" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Actie" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Activeer/deactiveer Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Activiteitenstream" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Voeg podcast toe" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Radiostream toevoegen" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Een nieuwe regel toevoegen, als dit door het notificatie-type ondersteund wordt" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Actie toevoegen" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Voeg alle nummers van een pad en alle onderliggende paden toe" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Nog een radiostream toevoegen…" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Map toevoegen…" #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Bestand toevoegen" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Bestand toevoegen voor conversie." #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Bestand(en) toevoegen voor conversie." #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Bestand toevoegen…" #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Te converteren bestanden toevoegen" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Map toevoegen" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Map toevoegen…" #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Nieuwe map toevoegen…" #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Voeg podcast toe" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Voeg podcast toe..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Zoekterm toevoegen" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Album-label toevoegen" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Albumartiest-label toevoegen" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Artiest-label toevoegen" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Score toevoegen" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Componist-label toevoegen" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Schijf-label toevoegen" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Bestandsnaam toevoegen" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Genre-label toevoegen" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Groepering-label toevoegen" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Lengte toevoegen" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Uitvoerend artiest-label toevoegen" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Aantal maal afgespeeld toevoegen" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Waardering toevoegen" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Aantal maal overgeslagen toevoegen" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Titel-label toevoegen" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Nummer toevoegen aan cache" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Nummer-label toevoegen" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Jaar-label toevoegen" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Nummers toevoegen aan \"Mijn Muziek\" als de \"Mooi\" knop is aangeklikt" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Radiostream toevoegen…" #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Toevoegen aan Mijn Muziek" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Aan Spotify afspeellijsten toevoegen" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Aan favoriete Spotify-nummers toevoegen" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Aan een andere afspeellijst toevoegen" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Toevoegen aan bladwijzers" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Aan afspeellijst toevoegen" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Aan de wachtrij toevoegen" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Voeg gebruiker/groep toe aan bladwijzers" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Wiimotedev-actie toevoegen" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Toevoegen…" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Deze maand toegevoegd" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Deze week toegevoegd" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Dit jaar toegevoegd" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Vandaag toegevoegd" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Afgelopen drie maanden toegevoegd" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Geavanceerd groeperen…" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Na" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Na het kopiëren…" #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Album (ideaal volume voor alle nummers)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Albumartiest" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Albumhoes" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Albuminfo op jamendo.com…" #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Albums" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Albums met albumhoes" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Albums zonder albumhoes" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Alle" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Alle bestanden (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "All Glory to the Hypnotoad!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Alle albums" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Alle artiesten" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Alle bestanden (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Alle afspeellijsten (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Alle vertalers" #: library/library.cpp:98 msgid "All tracks" msgstr "Alle nummers" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Sta een client toe om muziek van deze computer te downloaden." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Downloads toestaan" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Sta mid/side-encoding toe" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Bij het origineel" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Hoofdscherm altijd verbergen" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Hoofdscherm altijd weergeven" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Altijd afspelen" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon Cloud Drive" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Een extra plug-in is vereist om Spotify in Clementine te gebruiken. Wilt u deze nu downloaden en installeren?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Er is een fout opgetreden tijdens het laden van de iTunes-database" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Er is een fout opgetreden bij het wegschrijven van metadata naar ‘%1’" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Er deed zich een onbekende fout voor" #: ui/about.cpp:85 msgid "And:" msgstr "En:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Boos" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Uiterlijk" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Bestanden/URLs aan afspeellijst toevoegen" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Aan huidige afspeellijst toevoegen" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Aan de afspeellijst toevoegen" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Compressie toepassen om vervorming te voorkomen" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Weet u zeker dat u voorinstelling ‘%1’ wilt wissen?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Weet u zeker dat u de statistieken van dit nummer wilt wissen?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Weet u zeker dat u de waarderingen en statistieken in alle bestanden van uw muziekbibliotheek wilt opslaan?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Artiest" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Artiestinfo" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Artiestlabels" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Artiest's initiaal" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Vraag bij opslaan" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Audioformaat" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Audiouitvoer" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Aanmelden mislukt" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Auteur" #: ui/about.cpp:68 msgid "Authors" msgstr "Auteurs" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Automatisch" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Automatisch" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Automatisch updaten" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Automatisch enkelvoudige categorieën in bibliotheekboom openen" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Beschikbaar" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Gemiddelde bitrate" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Gemiddelde afbeeldinggrootte" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "BBC Podcasts" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Achtergrondstreams" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Achtergrondkleur" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Achtergrondafbeelding" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Achtergrond-doorzichtigheid" #: core/database.cpp:648 msgid "Backing up database" msgstr "Bezig met het maken van een backup van de database" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Balans" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "Ban (Last.fm scrobblen)" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Balkweergave" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Basic Blue" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Standaard audio formaat" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Gedrag" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Beste" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Biografie van %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Bitrate" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Bitrate" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Bitrate" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Blokweergave" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Bloktype" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Vervagen" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Body" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Boomweergave" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Bladeren…" #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Buffer duur" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Bufferen" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Seafile indexering bouwen..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Maar deze bronnen zijn uitgeschakeld:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Knoppen" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "CUE-sheet ondersteuning" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Cachepad:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Bezig met cachen" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "Bezig met %1 cachen" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Annuleren" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Download annuleren" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Captcha is nodig.\nProbeer in te loggen bij Vk.com met je browser om dit probleem op te lossen." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Albumhoes wijzigen" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Lettergrootte wijzigen…" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Herhaalmodus wijzigen" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Sneltoets wijzigen…" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Shuffle-modus wijzigen" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "Verander het huidige nummer" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "De taal wijzigen" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "Veranderingen worden doorgevoerd als het volgende nummer begint te spelen" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Het aanpassen naar mono afspelen zal actief worden bij het afspelen van het volgende nummer" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Zoek naar nieuwe afleveringen" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Zoek naar updates" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Zoeken naar updates..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Kies Vk.com cachemap" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Kies een naam voor uw slimme-afspeellijst" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Automatisch kiezen" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Kleur kiezen…" #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Lettertype kiezen…" #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Kies uit de lijst" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Kies hoe de afspeellijst gesorteerd wordt en hoeveel nummers de afspeellijst mag bevatten." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Kies map waarnaar podcasts gedownload worden" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Kies de internet-diensten, die je wilt tonen" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Kies de websites die Clementine mag gebruiken om songteksten op te zoeken." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Klassiek" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Bezig met opschonen" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Wissen" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Afspeellijst wissen" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Clementine fout" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Clementine oranje" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Clementine visualisatie" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine kan de muziek die u naar dit apparaat kopieert automatisch converteren zodat het apparaat het af kan spelen." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Clementine kan muziek afspelen, die u op Amazon Cloud Drive opgeslagen hebt" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine kan muziek afspelen die u op Box opgeslagen hebt" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine kan muziek afspelen die u op Dropbox opgeslagen hebt" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine kan muziek afspelen die u op Google Drive opgeslagen hebt" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine kan muziek afspelen die u op OneDrive opgeslagen hebt" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine kan een bericht weergeven zodra het nummer wijzigt." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine kan uw abonnementen synchroniseren met andere computers en podcast programma's. Maak een account." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine kon geen projectM visualisaties laden. Controleer of u Clementine correct hebt geïnstalleerd." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Clementine afbeeldingen weergeven" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine heeft geen resultaten voor dit bestand gevonden" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine zal zoeken in:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Klik hier om muziek toe te voegen" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Klik hier om een afspeellijst aan uw favorieten toe te voegen, hierdoor worden z bewaard en getoond in het \"Afspeellijsten\" panel in de linker zijbalk." #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Klik om te schakelen tussen resterende duur en totale duur" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Door te klikken op de Inloggen knop opent er een nieuw venster in een webbrowser. Als u ingelogd bent komt u automatisch terug in Clementine" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Sluiten" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Afspeellijst sluiten" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Visualisatie sluiten" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "De download wordt afgebroken als u dit venster sluit." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Het zoeken naar albumhoezen wordt afgebroken als u dit venster sluit." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Kleuren" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Door komma's gescheiden lijst van van klasse:niveau, het niveau is 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Opmerking" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Community Radio" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Labels automatisch voltooien" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Labels automatisch voltooien…" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Componist" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Configureren %1" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Magnatune configureren…" #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Sneltoetsen instellen" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Configureer Spotify..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Subsonic configureren..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Configureer Vk.com..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Globaal zoeken instellen..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Bibliotheek configureren…" #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Podcasts configureren" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Configureer..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Wii Remotes met activeer/deactiveer-actie verbinden" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Apparaat verbinden" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Met Spotify verbinden" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Verbinding geweigerd door server, controleer de URL van de server. Bijvoorbeeld: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Time-out van verbinding, controleer de URL van de server. Bijvoorbeeld: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Connetieprobleem of audio is uitgeschakeld door eigenaar" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Console" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Constante bitrate" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Alle muziek converteren" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Alle muziek die het apparaat niet kan afspelen converteren" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Converteer audiobestanden gecomprimeerd zonder kwaliteitsverlies voor ze naar de Remote te sturen." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Converteer bestanden gecomprimeerd zonder kwaliteitsverlies" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Kopieer url om te delen naar klembord" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Kopieer naar klembord" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Naar apparaat kopiëren…" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Naar bibliotheek kopiëren…" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Copyright" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Kon niet verbinden met Subsonic, controleer de URL van de server. Bijvoorbeeld: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Kan GStreamer element ‘%1’ niet aanmaken - zorg ervoor dat u alle vereiste GStreamer plug-ins geïnstalleerd heeft" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Kon afspeellijst niet maken" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Kan muxer voor %1 niet vinden, controleer of u de juiste GStreamer plug-ins geïnstalleerd heeft" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Kan geen encoder voor %1 vinden, controleer of u de juiste GStreamer plug-ins geïnstalleerd heeft" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Kan uitvoerbestand %1 niet openen" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Albumhoesbeheerder" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Albumhoes van toegevoegde afbeelding" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Albumhoes automatisch van %1 geladen" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Albumhoes handmatig teruggezet" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Albumhoes niet ingesteld" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Albumhoes ingesteld van %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Albumhoes van %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Cross-fade wanneer automatisch van nummer veranderd wordt" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Cross-fade wanneer handmatig van nummer veranderd wordt" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Aangepast" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Aangepaste afbeelding:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Instellingen voor aangepaste berichten" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Aangepast…" #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "DBus-pad" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dance" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "De database lijkt corrupt. Instructies om om de database te herstellen staan op: https://code.google.com/p/clementine-player/wiki/DatabaseCorruption" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Aanmaakdatum" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Wijzigingsdatum" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Dagen" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "Stan&daard" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Volume met 4% verlagen" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Verlaag het volume met procent" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Volume verlagen" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Standaard achtergrondafbeelding" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Standaard apparaat op %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Standaardinstellingen" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Vertraging tussen visualisaties" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Verwijderen" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Verwijder gedownloadde gegevens" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Bestanden verwijderen" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Van apparaat verwijderen…" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Van schijf verwijderen…" #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Verwijder afgespeelde afleveringen" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Voorinstelling verwijderen" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Slimme-afspeellijst verwijderen" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Oorspronkelijke bestanden verwijderen" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Bestanden worden verwijderd" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Geselecteerde nummers uit wachtrij verwijderen" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Nummer uit wachtrij verwijderen" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Bestemming" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Details…" #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Apparaat" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Apparaateigenschappen" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Apparaatnaam" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Apparaateigenschappen…" #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Apparaten" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Dialoog" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Bedoelde u" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Digitally Imported wachtwoord" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Digitally Imported gebruikersnaam" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Directe internetverbinding" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Map" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Notificatie permanent weergeven" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Schakel het aanmaken van de stemmingsbalk uit" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Uitgeschakeld" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Uitgeschakeld" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Schijf" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Overdracht onderbreken" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Weergaveopties" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Infoschermvenster weergeven" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "De volledige database opnieuw scannen" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Opnieuw volledig scannen" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Opnieuw volledig scannen..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Geen muziek converteren" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Niet overschrijven" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "TIjdens het opnieuw volledig scannen, zal alle metadata, die in Clementine is opgeslagen, verloren gaan, zoals albumhoezen, afspeelstatistieken en waarderingen. Clementine zal al je muziek in Google Drive opnieuw volledig scannen. Dit kan even duren." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Niet herhalen" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Niet in diverse artiesten weergeven" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Beluisterde afleveringen niet tonen" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Niet willekeurig afspelen" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Niet stoppen!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Doneer" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Dubbeklik om te openen" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "Dubbelkilikken op een afspeellijst zal..." #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Dubbelklikken op een nummer zal…" #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Download %n afleveringen" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Download map" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Download afbeeldingen naar" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Lidmaatschap downloaden" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Download nieuwe afleveringen automatisch" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Download in wachtrij gezet" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Download instellingen" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Download de Android app" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Dit album downloaden" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Dit album downloaden…" #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Download deze aflevering" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Downloaden…" #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Bezig met downloaden (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Icecast-map aan het downloaden" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Jamendo-catalogus downloaden" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Magnatune-catalogus downloaden" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "De Spotify plug-in aan het downloaden" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Metadata ophalen" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Sleep om te verplaatsen" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dubstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Duur" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Dynamische-modus ingeschakeld" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Dynamische random mix" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Slimme-afspeellijst bewerken…" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Label ‘%1’ bewerken…" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Label bewerken…" #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Labels bewerken" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Nummerinformatie bewerken" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Nummerinformatie bewerken…" #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Nummerinformatie bewerken…" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Bewerken…" #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "E-mail" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Ondersteuning voor Wii Remote inschakelen" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Automatisch cachen inschakelen" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Equalizer inschakelen" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Sneltoetsen alleen inschakelen wanneer Clementine de focus heeft" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Schakel direct bewerken van metadata in bij klik" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Activeer de onderstaande bronnen om ze te tonen in de zoek resultaten. De resultaten worden weergegeven deze volgorde." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Last.fm scrobbling in-/uitschakelen" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Coderingscomplexiteit" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Kwaliteit encoding-engine" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Coderings-modus" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Voer een URL in" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Voeg een URL toe om een albumhoes van het internet te downloaden:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Geef een bestandsnaam voor de geëxporteerde albumhoezen (geen extensie)" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Voer een nieuwe naam voor deze afspeellijst in" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Typ hierboven om muziek op uw computer en het internet te zoeken" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Voer hieronder uw zoektermen in om podcasts in de iTunes Store te vinden" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Voer hieronder uw zoektermen in om podcasts op gpodder.net te vinden" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Voer hier een zoekterm in" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Voer de URL van een internetradios-tream in:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Geef de naam van de map" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Geef in de App dit IP-adres op om verbinding met Clementine te maken" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Gehele verzameling" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Equalizer" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Gelijkwaardig aan --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Gelijkwaardig aan --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Fout" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Fout tijdens rippen van CD" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Fout tijdens het verbinden met het MTP-apparaat" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Fout tijdens het kopiëren van de nummers" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Fout tijdens het verwijderen van de nummers" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Fout bij het downloaden van de Spotify plug-in" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Fout bij laden van %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Fout bij laden di.fm afspeellijst" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Fout bij verwerken van %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Fout bij het laden van audio-cd" #: library/library.cpp:68 msgid "Ever played" msgstr "Ooit afgespeeld" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Elke 10 minuten" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Elke 12 uur" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Elke 2 uur" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Elke 20 minuten" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Elke 30 minuten" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Elke 6 uur" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Elk uur" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Behalve tussen nummers van hetzelfde album of in dezelfde CUE-sheet" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Bestaande albumhoezen" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Aanvullen" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Verloopt op %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Albumhoezen Exporteren" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Albumhoezen exporteren" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Exporteer gedownloade albumhoezen" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Exporteer albumhoezen in mediabestanden" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Klaar me exporteren" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "%1 van %2 albumhoezen geëxporteerd (%3 overgeslagen)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Uitvagen bij pauze / Invagen bij hervatten" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Uitvagen bij stoppen van een nummer" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Uitvagen" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Uitvaagduur" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "CD-station lezen mislukt" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Ophalen van de map is mislukt" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Ophalen van podcasts mislukt" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Laden van podcast mislukt" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Het laden van het XML bestand voor deze RSS-feed is mislukt" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Snel" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Favoriete nummers" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Ontbrekende albumhoezen ophalen" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Automatisch ophalen" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Ophalen voltooid" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Ophalen van Subsonic bibliotheek" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Fout bij ophalen albumhoes" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Bestandsformaat" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Bestandsextensie" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Bestandsformaten" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Bestandsnaam" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Bestandsnaam (zonder pad)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Bestandsnaampatroon:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Bestandspaden" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Bestandsgrootte" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Bestandstype" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Bestandsnaam" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Bestanden" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Te converteren bestanden" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Vind nummers in uw bibliotheek die met de opgegeven criteria overeenkomen." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Vind deze artiest" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Uniek patroon uit nummer halen" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Voltooien" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Eerste niveau" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Albumhoes aan breedte aanpassen" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Tekengrootte" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Vanwege licenties is Spotify-ondersteuning alleen via een plug-in beschikbaar." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Mono-encodering forceren" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Apparaat vergeten" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Het vergeten van een apparaat zal het uit deze lijst verwijderen en zodra u het de volgende keer aansluit, zal Clementine alle nummers opnieuw moeten inlezen." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Formulier" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Formaat" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Framerate" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Frames per buffer" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Bevroren" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Maximale bas" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Maximale bas + hoge tonen" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Maximale hoge tonen" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Algemeen" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Algemene instellingen" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Genre" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Haal URL op van dit Spotify nummer" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "URL ophalen om deze afspeellijst te delen" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Kanalen ophalen" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Radiostream ophalen" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Geef het een naam:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Ga" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Ga naar het volgende afspeellijst tabblad" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Ga naar het vorige afspeellijst tabblad" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "%1 van de %2 albumhoezen opgehaald (%3 mislukt)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Niet-bestaande nummer in de afspeellijst vervagen" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Bibliotheek groeperen op…" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Groeperen op" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Groeperen op album" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Groeperen op artiest" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Groeperen op artiest/album" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Groeperen op artiest/jaar - album" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Groeperen op genre/album" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Groeperen op genre/artiest/album" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Groepering" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "HTML-pagina bevat geen RSS-feed" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "HTTP 3xx statuscode ontvangen zonder URL, controleer server configuratie." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "HTTP-proxy" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Blij" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Hardware-informatie" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Hardware-informatie is alleen beschikbaar wanneer het apparaat aangesloten is." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Hoog" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Hoog (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Hoog (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "HipHop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Host niet gevonden, controleer de URL van de server. Bijvoorbeeld: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Uur" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Ik heb geen Magnatune-account" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Pictogram" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Pictogrammen bovenaan" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Nummer identificeren" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Indien geactiveerd, zal door het aanklikken van een geselecteerd nummer in de afspeellijst je de labelwaarde direct kunnen bewerken." #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Als u verder gaat zal dit apparaat traag zijn en de nummers die ernaar gekopieerd werden zullen mogelijk niet meer werken." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Als u de URL van een podcast weet, typ deze hieronder en klik op Ga" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "\"The\" in artiestennamen negeren" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Afbeeldingen (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Afbeeldingen (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Importeer..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "In %1 dagen" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "In %1 weken" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "In ‘dynamische modus’ worden nieuwe nummers gekozen en aan de afspeellijst toegevoegd op het moment dat een nummer eindigt." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Inbox" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Albumhoes in de notificatie weergeven" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Voeg alles toe" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Incompatibele Subsonic REST protocol versie. Client moet upgraden. " #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Incompatibele Subsonic REST protocol versie. Server moet upgraden. " #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Configuratie incompleet, controleer dat alle velden ingevuld zijn." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Volume met 4% verhogen" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Verhoog het volume met procent " #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Volume verhogen" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Indexeren %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Informatie" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Invoeropties" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Invoegen…" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Geïnstalleerd" #: core/database.cpp:585 msgid "Integrity check" msgstr "Integriteits check" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Internet bronnen" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "internet-diensten" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "Intro nummers" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Ongeldige API-sleutel" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Ongeldig formaat" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Ongeldige methode" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Ongeldige parameters" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Ongeldige bron opgegeven" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Ongeldige service" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Ongeldige sessiesleutel" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Selectie omkeren" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Jamendo, meestbeluisterde nummers" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Jamendo, beste nummers" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo, beste nummers van de maand" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo, beste nummers van de week" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Jamendo database" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Meteen naar vorige nummer springen" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Spring naar het huidige nummer" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Hou de toetsen voor %1 seconde ingedrukt…" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Hou de toetsen voor %1 seconden ingedrukt…" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "In de achtergrond laten draaien als het venter gesloten wordt" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "De originele bestanden behouden" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Poesjes" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Taal" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Laptop/koptelefoon" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Grote hal" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Grote albumhoes" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Grote albumhoes (details eronder)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Grote albumhoes (geen details)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Grote zijbalk" #: library/library.cpp:80 msgid "Last played" msgstr "Laast afgespeeld" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Laast afgespeeld" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm is momenteel bezet, probeer het over een paar minuten nogmaals" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Last.fm wachtwoord" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Last.fm statistieken" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Last.fm labels" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Last.fm gebruikersnaam" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Nummers met laagste waardering" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Links" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Duur" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Bibliotheek" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Bibliotheek geavanceerd groeperen" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Database herscan-melding" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Database doorzoeken" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Grenzen" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Laden" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Albumhoes van URL laden" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Albumhoes van URL laden…" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Albumhoes van schijf laden" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Albumhoes van schijf laden…" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Afspeellijst laden" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Afspeellijst laden…" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "MTP-apparaat laden" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "iPod-database laden" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Slimme afspeellijst laden" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Nummers laden" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Radiostream laden" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Nummers laden" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Nummerinformatie laden" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Laden…" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Bestanden/URLs laden, en vervangt de huidige afspeellijst" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Inloggen" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Inloggen mislukt" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Uitloggen" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Lange termijn voorspellingsprofiel (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Mooi" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "Love (Last.fm scrobblen)" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Laag (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Laag (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Lage complexiteit profiel (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Songteksten" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Songtekst van %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Songteksten van de ID3v2 tag" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256K" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Magnatune-download" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Magnatune-download voltooid" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Normaal profiel (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Voer uit!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Voer uit!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Afspeellijst offline beschikbaar maken" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Foutieve respons" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Handmatige proxyconfiguratie" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Handmatig" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Fabrikant" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Markeer als beluisterd" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Markeer als nieuw" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Match op alle zoektermen (EN)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Match op een of meer zoektermen (OF)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Max aantal zoekresultaten" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Maximale bitrate" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Media is veranderd. Bezig met herladen." #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Gemiddeld (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Gemiddeld (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Type lidmaatschap" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Minimale bitrate" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Minimale buffervulling" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Ontbrekende projectM voorinstellingen" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "De bibliotheek op wijzigingen blijven controleren" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Mono afspelen" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Maanden" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Stemming" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Stemmingsbalk stijl" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Stemmingsbalken" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Meer" #: library/library.cpp:84 msgid "Most played" msgstr "Meest afgespeeld" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Koppelpunt" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Koppelpunten" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Omlaag verplaatsen" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Naar bibliotheek verplaatsen…" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Omhoog verplaatsen" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Muziek" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Muziekbibliotheek" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Dempen" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Mijn Albums" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Mijn Muziek" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Mijn aanbevelingen" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Naam" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Naam" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Benoemingsopties" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Langzaam internet" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Netwerk Proxy" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Netwerk Remote" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Nooit" #: library/library.cpp:74 msgid "Never played" msgstr "Nooit afgespeeld" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Nooit afspelen" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Nieuwe map" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Nieuwe afspeellijst" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Nieuwe slimme afspeellijst…" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Nieuwe nummers" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Nieuwe nummers worden automatisch toegevoegd." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Nieuwste nummers" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Volgende" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Volgend nummer" #: core/utilities.cpp:151 msgid "Next week" msgstr "Volgende week" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Geen weergave" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Geen achtergrondafbeelding" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Geen albumhoezen om te exporteren." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Geen lange blokken" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Geen overeenkomsten gevonden. Maak het zoekveld leeg om de gehele lijst opnieuw weer te geven." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Geen korte blokken" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Geen" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Geen van de geselecteerde nummers waren geschikt voor het kopiëren naar een apparaat" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Normaal" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Normaal blok type" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Niet beschikbaar tijdens het gebruik van een dynamische afspeellijst" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Niet verbonden" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Onvoldoende inhoud" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Onvoldoende fans" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Onvoldoende leden" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Onvoldoende buren" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Niet geïnstalleerd" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Niet ingelogd" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Niet aangekoppeld - dubbelklik om aan te koppelen" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Niets gevonden" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Notificatietype" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Notificaties" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Nu aan het afspelen" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Aantal aflevering om te tonen" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Voorbeeld infoschermvenster" #: widgets/osd.cpp:173 msgid "Off" msgstr "Uit" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "Aan" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Alleen verbindingen accepteren van apparaten met ip-ranges:⏎\n10.x.x.x⏎\n172.16.0.0 - 172.31.255.255⏎\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Alleen verbindingen van het lokale netwerk toestaan" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Alleen de eerste tonen" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Doorzichtigheid" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "%1 in de browser openen" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "&Audio-CD openen…" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "OML bestand openen" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "OML bestand openen..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Open een pad om muziek uit te importeren" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Apparaat openen" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Bestand openen..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "In Google Drive openen" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "In een nieuwe afspeellijst openen" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Openen in een nieuwe afspeellijst" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Open in je browser" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Openen..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Bewerking is mislukt" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Optimaliseer voor bitrate" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Optimaliseer voor kwaliteit" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Opties…" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Bestanden sorteren" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Bestanden sorteren..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Bestanden sorteren" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Originele labels" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "Oorspronkelijk jaar" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "Oorspronkelijk jaar - Album" #: library/library.cpp:118 msgid "Original year tag support" msgstr "Tag ondersteuning oorspronkelijk jaar" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Overige opties" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Output" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Uitvoer apparaat" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Uitvoeropties" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Alles overschrijven" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Overschrijf bestaande bestanden" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Overschrijf alleen kleinere" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Eigenaar" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Jamendo-catalogus verwerken" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Party" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Wachtwoord" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Pauze" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Afspelen pauzeren" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Gepauzeerd" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Uitvoerend artiest" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Pixel" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Normale zijbalk" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Afspelen" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Aantal maal afgespeeld" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Afspelen indien gestopt, pauzeren indien afgespeeld" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Afspelen wanneer niets aan het afspelen is" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "De de/ste track in de afspeellijst afspelen" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Afspelen/pauzeren" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Weergave" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Speler-opties" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Afspeellijst" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Afspeellijst voltooid" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Afspeellijst-opties" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Afspeellijst type" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Afspeellijsten" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Sluit uw browser en keer terug naar Clementine." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Plug-in status:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcasts" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Pop-up duur" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Poort" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Voorversterking" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Voorkeur" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Voorkeuren" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Voorkeuren..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Eerste keuze voor bestandsnamen van albumshoezen (gescheiden door komma's)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Audioformaat-voorkeur" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Bitrate voorkeur" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Voorkeursformaat" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Premium audio formaat" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Voorinstelling:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Druk een toetstencombinatie om te gebruiken" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Druk een toets" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Druk een toetsencombinatie om voor %1 te gebruiken..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Op \"Vorige\" drukken in de speler zal..." #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Opties mooi infoschermvenster" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Voorbeeld" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Vorige" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Vorig nummer" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Versie-informatie uitprinten" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Profiel" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Voortgang" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Voortgang" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psychedelisch" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Klik op Wiiremote-knop" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Plaats nummers in willekeurige volgorde" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Kwaliteit" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Kwaliteit" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "apparaat afzoeken..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Wachtrijbeheer" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Geselecteerde nummers in de wachtrij plaatsen" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Nummer in de wachtrij plaatsen" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (gelijk volume voor alle nummers)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Regen" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Regen" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Willekeurige visualisatie" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Waardeer huidig nummer met 0 sterren" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Waardeer huidig nummer met 1 ster" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Waardeer huidig nummer met 2 sterren" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Waardeer huidig nummer met 3 sterren" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Waardeer huidig nummer met 4 sterren" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Waardeer huidig nummer met 5 sterren" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Waardering" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Werkelijk annuleren?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Omleidingslimiet overschreden, controleer server configuratie." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Catalogus verversen" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Kanalen verversen" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Lijst met stations verversen" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Lijst met radiostreams verversen" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Relatief" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Onthou Wii remote zwaai" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Laatste instelling onthouden" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Onthoud mijn keuze" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Verwijderen" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Actie verwijderen" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Verwijder dubbelen uit afspeellijst" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Map verwijderen" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Verwijder uit Mijn Muziek" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Verwijder uit bladwijzers" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Uit afspeellijst verwijderen" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Afspeellijst verwijderen" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Afspeellijsten verwijderen" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Verwijder niet beschikbare nummers van de afspeellijst" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Afspeellijst hernoemen" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Afspeellijst hernoemen..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Nummers in deze volgorde een nieuw nummer geven…" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Herhalen" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Album herhalen" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Afspeellijst herhalen" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Nummer herhalen" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Huidige afspeellijst vervangen" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Afspeellijst vervangen" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Vervangt spaties door underscores" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Replay Gain modus" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Opnieuw vullen" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Autorisatiecode vereist" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Herstel" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Reset afspeelstatistieken" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Nummer herstarten, daarna naar vorige springen bij weer indrukken" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Herstart het afspelen van track, of speel het vorige nummer af bij 8 seconden van start." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Beperken tot ASCII karakters" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Afspelen hervatten bij opstarten" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Keer terug naar Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Rechts" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Rip" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Rip CD" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Rip audio CD" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Uitvoeren" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "SOCKS proxy" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Foout bij SSL handshake, controleer server instellingen. De SSLv3 optie hieronder zou sommige problemen kunnen oplossen." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Apparaat veilig verwijderen" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Apparaat veilig verwijderen na het kopiëren" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Samplerate" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Samplerate" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Bewaar .mood bestanden in u muziekbibliotheek" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Albumhoes opslaan" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Albumhoes op schijf bewaren…" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "plaatje opslaan" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Afspeellijst opslaan" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Afspeellijst opslaan" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Afspeellijst opslaan..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Voorinstelling opslaan" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Sla waarderingen op in bestand, indien mogellijk" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Sla statistieken op in bestand, indien mogellijk" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Deze radiostream in het ‘Internet’-tabblad opslaan" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Opslaan van statistieken in muziekbestanden" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Nummers opslaan" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Schaalbare samplerateprofiel (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Groote schalen" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Score" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Scrobble de nummers waar ik naar luister" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Zoeken" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Zoeken" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Icecast stations doorzoeken" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Jamendo doorzoeken" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Zoeken op Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Subsonic doorzoeken" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Automatisch zoeken" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Naar albumhoezen zoeken…" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Naar iets zoeken" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Doorzoek gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Doorzoek iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Zoekmodus" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Zoekopties" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Zoekresultaten" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Zoek voorwaarden" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Tweede niveau" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Achterwaarts zoeken" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Voorwaarts zoeken" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Spoel momenteel spelende nummer met een relatieve hoeveelheid door" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Spoel het momenteel spelende nummer naar een absolute positie door" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "Zoeken met behulp van een toetsenbordsnelkoppeling" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Alles selecteren" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Niets selecteren" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Selecteer achtergrond kleur" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Kies achtergrondafbeelding" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Selecteer best passende match" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Selecteer voorgrond kleur" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Visualisaties kiezen" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Visualisaties kiezen..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Selecteer..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Serienummer" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Server" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "Server URL" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Server gegevens" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Service offline" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Stel %1 in op \"%2\"..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Zet het volume op procent" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Waarde voor alle geselecteerde nummers instellen…" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Instellingen" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Sneltoets" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Sneltoets voor %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Sneltoets voor %1 bestaat reeds" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Weergeven" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Infoschermvenster weergeven" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Een oplichtende animatie weergeven op het huidige nummer" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Toon een stemmingsbalk in de voortgangsbalk" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Standaardsysteemnotificatie tonen" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Toon een mededeling als ik de herhaal/shuffle modus wijzig" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Notificatie weergeven als ik het volume wijzig" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Notificatie weergeven wanneer ik het afspelen pauzeer" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Pop-up van systeemvak weergeven" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Mooi infoschermvenster weergeven" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Boven statusbalk weergeven" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Alle nummers weergeven" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Alle nummers weergeven" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Albumhoezen in bibliotheek tonen" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Verdelers tonen" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Volledig weergeven..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Toon groepen in globale zoekresultaat" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "In bestandsbeheer tonen…" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Tonen in bibliotheek..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "In diverse artiesten weergeven" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Toon stemmingsbalk" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Alleen dubbelen tonen" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Nummers zonder labels tonen" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Toon nummer dat wordt afgespeeld op je pagina" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Toon zoek sugesties" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Knop \"love\" weergeven" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Toon de scrobble knop in het hoofdvenster" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Systeemvakpictogram weergeven" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Toon welke bronnen wel en niet beschikbaar zijn" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Tonen/verbergen" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Willekeurig" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Albums willekeurig afspelen" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Alles willekeurig" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Afspeellijst schudden" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Nummers van dit album willekeurig" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Log in" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Afmelden" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Bezig met inloggen...." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Vergelijkbare artiesten" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Groote" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Groote:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Terug in afspeellijst" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Aantal maal overgeslagen" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Vooruit in afspeellijst" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Geselecteerde nummers overslaan" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Nummer overslaan" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Kleine albumhoes" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Kleine zijbalk" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Slimme afspeellijst" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Slimme afspeellijsten" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Zacht" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Nummerinformatie" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Nummerinfo" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Helaas" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Sorteren op genre (alfabetisch)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Sorteren op genre (populariteit)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Sorteren op stationsnaam" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Nummers sorteren op" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Sorteren" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Bron" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Bronnen" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Spotify inlogfout" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "Spotify afspeellijst URL" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Spotify plug-in" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Spotify plug-in niet geïnstalleerd" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "Spotify nummer URL" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Standaard" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Met ster" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Begin met rippen" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Momenteel spelende afspeellijst starten" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Converteren starten" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Typ iets in de bovenstaande zoekbalk om de lijst met zoekresultaten te zien" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "%1 wordt gestart" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Starten…" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Stoppen" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Stop na" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Na ieder nummer stoppen" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Na ieder nummer stoppen" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Na dit nummer stoppen" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Afspelen stoppen" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Na dit nummer stoppen met afspelen" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Stoppen met afspelen na nummer: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Gestopt" #: core/song.cpp:431 msgid "Stream" msgstr "Radiostream" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Streamen vanaf een Subsonic server vereist een geldige licentie na de proefperiode van 30 dagen." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Streaming lidmaatschap" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Volgers" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Succes!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "%1 met succes weggeschreven" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Gesuggereerde labels" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Samenvatting" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Superhoog (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Zeer hoog (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Ondersteunde formaten" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Nu statistieken naar bestanden synchoriseren" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Spotify inbox synchroniseren" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Spotify afspeellijst synchroniseren" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Favoriete Spotify-nummers synchroniseren" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Systeemkleuren" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Tabs bovenaan" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Labels ophalen" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Doelbitrate" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Tekstopties" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Met dank aan" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Het commando \"%1\" kon niet worden gestart." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Albumhoes van het momenteel spelende nummer" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "De map %1 is niet geldig" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "De tweede waarde moet groter zijn dan de eerste!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "De site die u aanvroeg bestaat niet!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "De site die u aanvroeg is geen afbeelding!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "De proefperiode voor de Subsonic server is afgelopen. Doneer om een licentie sleutel te krijgen. Ga naar subsonic.org voor details." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "De versie van Clementine die u zojuist heeft ge-updated vereist vanwege de nieuwe onderdelen die hieronder staan een volledige herscan van de database:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Er zijn andere nummers in dit album" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Er is een fout opgetreden tijdens het communiceren met gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Er is een probleem opgetreden bij het ophalen van de metadata van Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Er was een probleem met het het verwerken van het antwoord van de iTunes Store" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Er waren problemen tijdens het kopiëren van bepaalde nummers. De volgende bestanden konden niet gekopieerd worden:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Er waren problemen tijdens het verwijderen van bepaalde nummers. De volgende bestanden konden niet verwijderd worden:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Deze bestanden zullen definitief van het apparaat verwijderd worden. Weet u zeker dat u door wilt gaan?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Deze bestanden zullen definitief van de schijf verwijderd worden, weet u zeker dat u door wil gaan?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Deze mappen zullen op muziek doorzocht worden om uw bibliotheek te vullen" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Deze instellingen worden gebruikt in het dialoogvenster \"Muziek converteren\" en bij het converteren van muziek voor het kopiëren naar een apparaat." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Derde niveau" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Deze actie creëert een database die 150 MB groot kan worden.\nWilt u toch doorgaan?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Dit album is niet in het gevraagde formaat beschikbaar" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Dit kan aangepast worden in de instellingen" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Dit apparaat dient verbonden te zijn en geopend vooraleer Clementine kan zien welke bestandsformaten het ondersteunt." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Dit apparaat ondsteunt de volgende bestandsformaten:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Dit apparaat zal niet correct werken" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Dit is een MTP apparaat maar u hebt Clementine gecompileerd zonder libmtp ondersteuning." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Dit is een iPod maar u hebt Clementine gecompileerd zonder libgpod ondersteuning." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Dit is de eerste keer dat u dit apparaat hebt verbonden. Clementine zal nu het apparaat op muziekbestanden doorzoeken - dit kan even duren." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Deze optie kan aangepast worden bij de \"Gedrag\" instellingen" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Deze stream is alleen voor betalende abonnees" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Dit type apparaat wordt niet ondersteund: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "TIjdstap" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Titel" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Vandaag" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Mooi infoschermvenster aan/uit" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Volledig scherm aan/uit" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Wachtrijstatus aan/uit" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Zet scrobbling aan/uit" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Zichtbaarheid voor het mooie infoschermvenster aan/uit" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Morgen" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Te veel doorverwijzingen" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Top nummers" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Totaal aantal albums:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Totaal aantal verzonden bytes" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Totaal aantal netwerk-verzoeken" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Nummer" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Nummers" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Muziek converteren" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Conversielog" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Converteren" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Converteren van %1 bestanden m.b.v. %2 threads" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Conversieopties" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Uitzetten" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Zeer snel internet" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Kan geen verbinding maken" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Kan %1 niet downloaden (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Onbekend" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Onbekend inhoudstype" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Onbekende fout" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Albumhoes wissen" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Geselecteerde nummers niet overslaan" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Nummer niet overslaan" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Uitschrijven" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Komende concerten" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Bijwerken" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Vernieuw alle podcasts" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Aangepaste databasemappen updaten" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Bibliotheek bijwerken zodra Clementine gestart wordt" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Vernieuw deze podcast" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Bezig met bijwerken" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "%1 bijwerken" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Bijwerken, %1%…" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Bibliotheek wordt bijgewerkt" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Gebruik" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Gebruik Albumartiest label indien beschikbaar" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Gnome-sneltoetsen gebruiken" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Gebruik psychedelische kleuren" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Replay Gain-metadata gebruiken, als deze beschikbaar is" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Gebruik SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Wii Remote gebruiken" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Gebruik een aangepaste kleuren set" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Een aangepast bericht voor notificaties gebruiken" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Gebruik een netwerkafstandsbediening" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Authenticatie gebruiken" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Bitrate management engine gebruiken" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Dynamische modus gebruiken" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Gebruik notificaties om de status van de Wii Remote weer te geven" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Gebruik tijdelijke ruisvervorming" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "De systeemstandaard gebruiken" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Gebruik de standaard kleuren set" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Globale proxy-instellingen gebruiken" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Volume normalisatie gebruiken" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Gebruikt" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Gebruikersinterface" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Gebruikersnaam" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Het menu gebruiken om een nummer toe te voegen zal…" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "MP3 (variabele bitrate)" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Variabele bitrate" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Diverse artiesten" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Versie %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Weergave" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Visualisatiemodus" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Visualisaties" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Visualisatie-instellingen" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Voice activity detection" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Volume %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Muur" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Waarschuw mij wanneer een afspeellijst tab wordt gesloten" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Website" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Weken" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Zodra Clementine wordt gestart" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Bij het zoeken naar albumhoezen zoekt Clementine eerst naar bestandsnamen die een van de volgende woorden bevatten.\nAls er geen match is wordt de grootste afbeelding uit de map gebruikt." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "Wanneer een afspeellijst wordt opgeslagen, zijn de paden" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Als de lijst leeg is..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Probeer eens...." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Snel internet" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: geactiveerd" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: verbonden" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: kritieke accuspanning (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: gedeactiveerd" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: verbinding verbroken" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: lage accuspanning (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128K" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64K" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media-audio" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Zonder albumhoes:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Wilt u de andere nummers van dit album ook verplaatsen naar Diverse Artiesten?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Wilt u op dit moment een volledige herscan laten uitvoeren?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Sla alle statistieken op in muziekbestanden" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Sla metadata op" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Verkeerde gebruikersnaam of wachwoord." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Jaar" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Jaar - Album" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Jaar" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Gisteren" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "U staat op het punt de volgende albums te downloaden" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "U staat op het punt om %1 afspeellijsten uit uw favorieten te verwijderen, weet u het zeker?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Je staat op het punt een afspeellijst te verwijderen, die geen deel uitmaakt van je favoriete afspeellijsten: de afspeellijst zal worden verwijderd (dit kan niet ongedaan gemaakt worden).\nWeet je zeker dat je verder wilt gaan?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "U bent niet ingelogd." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "U bent ingelogd als %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "U bent ingelogd." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "U kunt de manier waarop de nummers in de bibliotheek gesorteerd worden aanpassen." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "U kunt zonder account gratis luisteren, maar met een Premium account kunt u luisteren in hogere kwaliteit en zonder advertenties." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "U kunt zonder account gratis naar Magnatunes nummers luisteren. Bij lidmaatschap worden de berichten aan aan het eind van elk nummer verwijderd." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "U kunt achtergrondgeluiden tegelijk met andere muziek beluisteren." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "U kunt uw Wii Remote als afstandsbediening voor Clementine gebruiken. Neem een kijkje op de Clementine wikipagina (Engelstalig) voor meer informatie.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "U heeft geen Spotify Premium account." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "U heeft geen actief abonnement" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "Je hoeft niet ingelogd te zijn om naar muziek op SoundCloud te zoeken en te luisteren. Maar, je moet inloggen voor toegang tot je afspeellijsten en stream." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "U bent uitgelogd bij Spotify, voer in het voorkeuren venster nogmaals uw wachtwoord in." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "U bent uitgelogd bij Spotify, voer nogmaals uw wachtwoord in." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "U vindt dit nummer mooi" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "U moet Systeemvoorkeuren openen en Clementine toestaan om \"uw computer te bedienen\" om globale sneltoetsen te gebruiken in Clementine." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Clementine moet herstart worden als u de taal veranderd." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Uw IP-adres:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Uw Last.fm inloggegevens zijn onjuist" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Uw Magnatune inloggegevens zijn onjuist" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Uw bibliotheek is leeg!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Uw radiostreams" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Uw scrobbles: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Uw systeem heeft geen ondersteuning voor OpenGL, visualisaties kunnen niet weergegeven worden." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Uw gebruikersnaam of wachtwoord is niet correct." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Nul" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "%n nummers toevoegen" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "na" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "geleden" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "en" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "automatisch" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "ervoor" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "tussen" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "grootste eerst" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "bevat" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "uitgeschakeld" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "schijf %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "bevat niet" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "eindigt op" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "is gelijk aan" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "gpodder.net map" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "is groter dan" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "iPods en USB apparaten werken momenteel niet in Windows. Sorry!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "in de laatste" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "minder dan" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "langste eerst" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "Verplaats %n nummers" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "nieuwste eerst" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "niet gelijk" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "niet in de laatste" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "niet op" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "oudste eerst" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "aan" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "opties" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "of scan de QR code!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "druk op enter" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "%n nummers verwijderen" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "kortste eerst" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "nummers schudden" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "kleinste eerst" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "nummers sorteren" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "begint met" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "stoppen" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "nummer %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/oc.po000066400000000000000000004060511260417502300236460ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # FIRST AUTHOR , 2010 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Occitan (post 1500) (http://www.transifex.com/davidsansome/clementine/language/oc/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: oc\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " mseg" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " segondas" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Personalizat" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Ajuda" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "Amagar « %1 »" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "Amagar..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "Musica" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Pas cap" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "Lista de lectura" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Quitar" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Lectura en bocla" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Mòde aleatòri" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "Aisinas" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "" #: core/utilities.cpp:119 msgid "1 day" msgstr "" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "" #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "A prepaus de « %1 »" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "A prepaus de Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Apondre un flux" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "" #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Seleccionar un fichièr vidèo..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Apondre un dorsièr" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "" #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Apondre un flux..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Apondre a la lista de lecturas" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Apondre..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "" #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "" #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Totes los albums" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Totes los fichièrs (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:80 msgid "All the translators" msgstr "" #: library/library.cpp:98 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:85 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Artista" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "L'autentificacion a fracassat" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "" #: ui/about.cpp:68 msgid "Authors" msgstr "Autors" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Color del rèire plan" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "" #: core/database.cpp:648 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Espectrograma de barras" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Blau estandard" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Compòrtament" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Debit binari" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "" #: core/song.cpp:428 msgid "CDDA" msgstr "" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "" #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Causir automaticament" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Classic" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Voidar la lista de lectura" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Irange Clementina" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:114 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Comentari" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Compositor" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Configurar los acorchis de clavièr" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Gestionari de pochetas" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Personalizat..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dance" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Data de modificacion" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "Per d&efaut" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Reduire lo volum" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Escafar un prereglatge" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Destinacion" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Detalhs..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Dorsièr" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Disc" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "" #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "" #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "" #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "" #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Egalizador" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:68 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Fondut" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Nom del fichièr" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Talha del fichièr" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Tipe de fichièr" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Nom del fichièr" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Fichièrs" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Primièr nivèl" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Formulari" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Full Bass" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Full Treble" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Paramètres generals" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Genre" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Augmentar lo volum" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:585 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Sus Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Clau API pas valabla" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Format incorrècte" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Paramètres invalids" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Clau de sesilha invalida" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Large Hall" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "" #: library/library.cpp:80 msgid "Last played" msgstr "" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Longor" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Bibliotèca" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Cargar" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Cargament del flux" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "M'agrada fòrça" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Discotèca" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Mut" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Nom" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "" #: library/library.cpp:74 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:92 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Pista seguenta" #: core/utilities.cpp:151 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Desactivar l'espectrograma" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Pas cap" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Notificacions" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Notificacions" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "" #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Dobrir..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "L'operacion a fracassat" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "" #: core/organise.cpp:73 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Autras opcions" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Opcions de creacion" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Fèsta" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Pausa" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Metre en pausa la lectura" #: widgets/osd.cpp:156 msgid "Paused" msgstr "En pausa" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Lectura" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Lectura / pausa" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Sortida" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Opcions del lector" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Lista de lectura" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Lista de lectura acabada" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Pre-amp" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Prereglatge :" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Pista precedenta" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Progression" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Suprimir" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Repetir" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Repetir la lista de lectura" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Enregistrar un prereglatge" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "" #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Acorchi" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Afichar" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "" #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Afichar l'icòna dins la bóstia de miniaturas" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Lectura aleatòria" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonograma" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Arrestar" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Arrestar la lectura" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Arrestat" #: core/song.cpp:431 msgid "Stream" msgstr "Flux" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Mercés a" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Títol" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Pista" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "" #: devices/giolister.cpp:157 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Desconegut" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Error desconeguda" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Utilizacion" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Version %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Afichatge" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Volum %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Quand Clementine avia" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Annada" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Annada - Album" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Zèro" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "CD %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "opcions" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "pista %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/pa.po000066400000000000000000004023341260417502300236450ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # FIRST AUTHOR , 2011 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Panjabi (Punjabi) (http://www.transifex.com/davidsansome/clementine/language/pa/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pa\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr "" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "" #: core/utilities.cpp:119 msgid "1 day" msgstr "" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "" #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "" #: core/song.cpp:422 msgid "AIFF" msgstr "" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "" #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "" #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "" #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "" #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "" #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "" #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "" #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:80 msgid "All the translators" msgstr "" #: library/library.cpp:98 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:85 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "" #: ui/about.cpp:68 msgid "Authors" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "" #: core/database.cpp:648 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "" #: core/song.cpp:428 msgid "CDDA" msgstr "" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "" #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:114 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "" #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "" #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "" #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "" #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:68 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:585 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "" #: library/library.cpp:80 msgid "Last played" msgstr "" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: ui/equalizer.cpp:137 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "" #: core/song.cpp:410 msgid "MPC" msgstr "" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "" #: library/library.cpp:74 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:92 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "" #: core/utilities.cpp:151 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "" #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "" #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "" #: core/organise.cpp:73 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:139 msgid "Party" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "" #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "" #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "" #: core/song.cpp:431 msgid "Stream" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "" #: ui/about.cpp:74 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "" #: core/song.cpp:426 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "" #: devices/giolister.cpp:157 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "ਰੋਕੋ" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/pl.po000066400000000000000000005075171260417502300236710ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Adrian Grzemski , 2015 # burtek , 2013 # Daniel Krawczyk , 2014 # Daniel Krawczyk , 2014 # jan , 2014 # Kacper Banasik , 2012-2014 # Kacper Banasik , 2012 # Michał G, 2011 # Michał Ziąbkowski , 2010 # M T , 2013 # Patryk Wychowaniec , 2011 # Patryk Wychowaniec <>, 2012 # Szymon Mróz , 2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Polish (http://www.transifex.com/davidsansome/clementine/language/pl/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pl\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nMożesz dodać playlisty do ulubionych klikając ikonę gwiazdki obok nazwy playlisty\n\nUlubione playlisty będą zapisane tutaj" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " dni" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kb/s" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pkt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " sekundy" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " utwory" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 utworów)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 albumów" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 dni" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 dni temu" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 na %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 list odtwarzania (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 zaznaczonych z" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 utwór" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 utwory" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "znaleziono %1 utworów" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "znaleziono %1 utworów (pokazywane %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 ścieżek" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 przesłanych" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: moduł Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 innych słuchaczy" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 odtworzeń" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n nieudane" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n zakończone" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "pozostało %n" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "Wyrówn&anie tekstu" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "Wyśrodkowanie" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Własny" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "Dodatki" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "Pomoc" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "Ukryj %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "Ukryj..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "Do &lewej" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "Muzyka" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Brak" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "Lista odtwarzania" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Zakończ" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Tryb powtarzania" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "Do p&rawej" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Tryb losowy" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Rozciągaj kolumny, aby dopasować do okna" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "Narzędzia" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(w zależności od utworu)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...i wszystkich osób mających wkład w rozwój Amaroka" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 dzień" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 ścieżka" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 losowych ścieżek" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Ulepsz do konta premium" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Jeśli nie jest zaznaczone, Celementine spróbuje zapisać Twoje oceny i inne statystyki tylko w odrębnej bazie danych i nie zmodyfikuje plików.

Jeśli pole jest zaznaczone, Clementine zapisze informacje zarówno w bazie danych jak i w plikach, każdorazowo gdy zajdzie potrzeba uaktualnienia statystyk.

Prosimy wziąć pod uwagę, że nie każdy format plików jest wspierany, a także nie ma żadnego standardu określającego sposób zapisu, więc inne odtwarzacze muzyczne mogą nie być w stanie odczytać tak zmodyfikowanego pliku.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Oceny i statystyki wszystkich twoich utworów zostaną zapisane w plikach muzycznych.

Nie jest to konieczne jeżeli opcja "Zapisz oceny i statystyki w plikach muzycznych" została aktywowana.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Tokeny rozpoczynają się od %, na przykład: %artist %album %title

\n\n

Jeżeli otoczysz fragmenty tekstu, które zawierają token nawiasami klamrowymi, ta sekcja będzie niewidoczna, jeśli token będzie pusty.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Musisz posiadać konto Spotify Premium." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Klient może się połączyć tylko wtedy, jeśli został wpisany poprawny kod." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Inteligentna lista odtwarzania to dynamiczna lista utworów pochodzących z twojej biblioteki. Istnieją różne rodzaje inteligentnych list odtwarzania oferujące różne sposoby wyboru utworów." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Utwór zostanie uwzględniony w liście odtwarzania, jeśli spełni następujące kryteria." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "CHWAŁA TOBIE HYPNOROPUCHO" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Przerwij" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "O programie %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "O Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "O Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Szczegóły konta" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Detale konta (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Akcja" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Akcja" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Aktywuj/deaktywuj Wiiremote'a" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Strumień aktywności" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Dodaj podcast" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Dodaj URL" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Dodaj nową linię jeśli dany typ powiadomień pozwala" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Dodaj akcję" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Dodaj wszystkie utwory z podanego katalogu i wszystkich jego sub-katalogów." #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Dodaj następny strumień..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Dodaj katalog..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Dodaj plik" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Dodaj plik do transkodera" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Dodaj plik(i) do transkodera" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Dodaj plik..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Dodaj pliki to transkodowania" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Dodaj katalog" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Dodaj katalog..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Dodaj nowy katalog..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Dodaj podcast" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Dodaj podcast..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Dodaj kryterium wyszukiwania" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Dodaj tag albumu" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Dodaj tag wykonawcy albumu" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Dodaj tag wykonawcy" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Dodaj automatyczny wynik piosenki" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Dodaj tag kompozytora" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Dodaj tag numeru płyty" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Dodaj nazwę pliku utworu" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Dodaj tag rodzaju muzyki" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Dodaj tag grupowania" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Dodaj tag długości utworu" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Dodaj tag wykonawcy" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Dodaj ilość odtworzeń utworu" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Dodaj ocenę piosenki" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Dodaj licznik pominięć" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Dodaj tag tytułu" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Dodaj utwór do cache" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Dodaj tag numeru utworu" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Dodaj tag roku" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Dodaj utwory do \"Mojej Muzyki\" przyciskiem \"Dodaj do Ulubionych\"" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Dodaj strumień..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Dodaj do Mojej Muzyki" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Dodaj do list odtwarzania Spotify" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Dodaj do śledzonych w Spotify" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Dodaj do innej listy odtwarzania" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Dodaj do zakładek" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Dodaj do listy odtwarzania" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Kolejkuj ścieżkę" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Dodaj użytkownika/grupę do zakładek" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Dodaj akcję wiimotedeva" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Dodaj..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Dodane w tym miesiącu" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Dodane w tym tygodniu" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Dodane w tym roku" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Dodane dzisiaj" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Dodane przez trzy ostatnie miesiące" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Zaawansowane grupowanie..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Po następującej ilości dni:" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Po skopiowaniu..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Według albumów (najlepsza głośność dla wszystkich ścieżek)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Wykonawca albumu" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Okładka albumu" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Informacje o albumie na jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Albumy" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Albumy z okładkami" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Albumy bez okładek" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Wszystkie" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Wszystkie pliki (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "Chwała Tobie Hypnoropucho!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Wszystkie albumy" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Wszyscy wykonawcy" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Wszystkie pliki (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Wszystkie listy odtwarzania (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Tłumacze" #: library/library.cpp:98 msgid "All tracks" msgstr "Wszystkie ścieżki" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Zezwól klientowi pobrać muzykę z tego komputera" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Zezwól na pobieranie" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Pozwól na kodowanie mid/side" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Wraz z oryginałami" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Zawsze ukrywaj główne okno" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Zawsze wyświetlaj główne okno" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Odtwarzaj automatycznie" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Aby korzystać ze Spotify przy użyciu Clementine, wymagany jest dodatkowy skrypt. Czy chcesz go teraz pobrać?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Wystąpił błąd podczas ładowania bazy danych iTunes" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Wystąpił błąd podczas zapisu metadanych do '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Wystąpił niespodziewany błąd" #: ui/about.cpp:85 msgid "And:" msgstr "I:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Zdenerwowany" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Wygląd" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Dodaj pliki/adresy URL do listy odtwarzania" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Dołącz do aktualnej listy odtwarzania" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Dołącz do listy odtwarzania" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Skompresuj, aby zapobiec przesterowaniu" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Na pewno chcesz usunąć ustawienie \"%1\"?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Na pewno wyzerować statystyki tego utworu?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Czy na pewno chcesz zapisać w plikach wszystkie statystyki każdego utworu z twojej biblioteki?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Wykonawca" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "O artyście" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Tagi wykonawcy" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Inicjały wykonawcy" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Zapytaj przy zapisywaniu" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Format audio" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Wyjście audio" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Błąd uwierzytelniania" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Autor" #: ui/about.cpp:68 msgid "Authors" msgstr "Autorzy" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Automatycznie" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Automatyczne" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Automatyczna aktualizacja" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Automatycznie rozwiń pojedyncze kategorie w drzewie biblioteki" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Dostępny" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Średnia szybkość transmisji" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Przeciętny rozmiar grafiki" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "Podcasty BBC" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "Uderzenia na minutę" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Strumienie tła" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Kolor tła" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Obrazek tła" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Nieprzezroczystość tła" #: core/database.cpp:648 msgid "Backing up database" msgstr "Tworzenie kopii zapasowej bazy danych" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Balans" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Analizator słupkowy" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Prosty niebieski" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Podstawowy typ audio" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Tryb" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Najlepsza" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Biografia z %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Bitrate" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Bitrate" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Bitrate" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Analizator blokowy" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Typ bloku" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Ilość rozmycia" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Treść" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Analizator słupkowy 2" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Przeglądaj..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Długość bufora" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Buforowanie" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Zbuduj indeks Seafile" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Lecz ominie poniższe źródła:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Przyciski" #: core/song.cpp:428 msgid "CDDA" msgstr "CD-Audio" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "obsługa arkuszy CUE" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Ścieżka cache:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Anuluj" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Anuluj pobieranie" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Zmień okładkę" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Zmień wielkość czcionki..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Zmień tryb powtarzania utworów" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Zmień skrót..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Zmień tryb losowania utworów" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Zmień język" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Zmiana trybu odtwarzania na tryb mono nastąpi dopiero od następnej odtworzonej ścieżki" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Sprawdzaj, czy są nowe audycje" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Sprawdź aktualizacje" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Sprawdź aktualizacje..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Wprowadź nazwę dla inteligentnej listy odtwarzania" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Wybierz automatycznie" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Wybierz kolor..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Wybierz czcionkę..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Wybierz z listy" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Wybierz w jaki sposób jest sortowana lista odtwarzania i ile ścieżek będzie zawierać" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Wybierz folder pobierania dla podcastów" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Wybierz usługi internetowe, które chcesz wyswietlać" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Wybierz serwisy, których Clementine ma używać szukając tekstów" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Muzyka klasyczna" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Czyszczenie" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Wyczyść" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Wyczyść listę odtwarzania" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Błąd Clementine" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Pomarańczowy Clementine" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Wizualizacja Clementine" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine potrafi automatycznie konwertować muzykę kopiowaną na to urządzenie do formatu, który potrafi odtwarzać." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Clementine może odtwarzać muzykę, którą wysłałeś do Amazon Cloud Drive" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine nie może odtwarzać muzyki wysłanej do Box-a" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine może odtwarzać muzykę umieszczoną w serwisie Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine może odtwarzać muzykę, która znajduje się na Dysku Google" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine może odtwarzać muzykę, którą przechowujesz na OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine może pokazywać powiadomienia, gdy zmienia się utwór." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine może zsynchronizować Twoją listę subskrypcji z innymi komputerami i aplikacjami do słuchania podcastów. Stwórz konto." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine nie może wczytać wizualizacji. Sprawdź czy Clementine został zainstalowany prawidłowo." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Przeglądarka obrazów Clementine" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine nie znalazł wyników dla tego pliku" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine wyszuka muzykę w następujących miejscach:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Kliknij, aby dodać jakąś muzykę" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Kliknij tutaj i dodaj tę playlistę do ulubionych żeby ją zapisać i mieć do niej łatwy dostęp z panelu po lewej stronie" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Przełącz pomiędzy czasem odtwarzania a czasem pozostałym" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Kliknięcie przycisku \"Zaloguj\" spowoduje otworzenie przeglądarki internetowej." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Zamknij" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Zamknij listę odtwarzania" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Zamknij wizualizację" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Zamknięcie tego okna anuluje pobieranie." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Zamknięcie tego okna spowoduje zatrzymanie wyszukiwania okładek albumu." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Klubowa" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Kolory" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Rozdzielona przecinkami lista klasa:poziom, gdzie poziom wynosi 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Komentarz" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Radio społeczności" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Automatycznie uzupełnij znaczniki" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Automatycznie uzupełnij znaczniki..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Kompozytor" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Konfiguruj %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Konfiguracja Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Konfiguracja skrótów klawiszowych" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Konfiguracja Spotify..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Skonfiguruj Subsonic..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Konfiguruj Vk.com..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Skonfiguruj globalne wyszukiwanie..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Konfiguruj bibliotekę..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Konfiguruj podcasty..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Konfiguruj..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Podłącz urządzenia Wii Remote używając akcji aktywuj/deaktywuj" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Podłącz urządzenie" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Połącz z Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Serwer odmówił połączenia, sprawdź URL serwera. Przykład: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Przekroczono limit czasu, sprawdź URL serwera. Przykład: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Konsola" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Stały bitrate" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Przekonwertuj całą muzykę" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Przekonwertuj muzykę, której nie może odtworzyć urządzenie" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Konwertuj pliki bezstratne" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Kopiuj współdzielony url do schowka" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Kopiuj do schowka" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Skopiuj na urządzenie..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Skopiuj do biblioteki..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Prawa autorskie" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Błąd połączenia z Subsonic, sprawdź adres URL. Przykład: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Nie można utworzyć elementu \"%1\" GStreamera - upewnij się, czy są zainstalowane wszystkie wymagane wtyczki GStreamera" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Nie można utworzyć listy odtwarzania" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Nie można odnaleźć muxera dla %1. Sprawdź czy posiadasz zainstalowane prawidłowe wtyczki GStreamera" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Nie można odnaleźć enkodera dla %1. Sprawdź czy posiadasz zainstalowane prawidłowe wtyczki GStreamera" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Nie można otworzyć pliku %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Menedżer okładek" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Okładka z osadzonego obrazu" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Okładka wczytana automatycznie z %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Okładka ręcznie wyłączona" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Brak okładki" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Źródło okładki: %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Okładki z %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Płynne przejście przy automatycznej zmianie ścieżek" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Płynne przejście przy ręcznej zmianie ścieżek" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Własne" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Własny obrazek:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Opcje niestandardowych wiadomości" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Własny..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "Ścieżka DBus" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dance" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Wykryto uszkodzenie bazy danych. Proszę, zapoznaj się z https://code.google.com/p/clementine-player/wiki/DatabaseCorruption, jeżeli potrzebujesz instrukcji jak naprawić ten błąd." #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Data utworzenia" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Data modyfikacji" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Dni" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "&Domyślny" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Zmniejsz głośność o 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Zmniejsz głośność o procentów" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Zmniejsz głośność" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Domyślny obrazek tła" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Domyślne urządzenie na %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Domyślne" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Opóźnienie pomiędzy wizualizacjami" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Usuń" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Usuń pobrane dane" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Usuń pliki" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Usuń z urządzenia..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Usuń z dysku..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Usuń odtworzone odcinki" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Usuń ustawienie korektora" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Usuń inteligentną listę odtwarzania" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Usuń oryginalne pliki" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Usuwanie plików" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Usuń ścieżki z kolejki odtwarzania" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Usuń ścieżkę z kolejki odtwarzania" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Miejsce docelowe" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Szczegóły..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Urządzenie" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Ustawienia urządzenia" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Nazwa urządzenia" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Ustawienia urządzenia..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Urządzenia" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Okno" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Czy chodziło o" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Hasło Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Nazwa użytkownika Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Bezpośrednie połączenie z Internetem" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Katalog" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Wyłącz czas" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Wyłącz generowanie pasków humoru" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Wyłączone" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Wyłączone" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Płyta" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "DTX" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Opcje wyświetlania" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Pokaż menu ekranowe" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Przeskanuj całą bibliotekę od nowa" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Dokonaj pełnego przeskanowania" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Dokonaj pełnego przeskanowania..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Nie konwertuj" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Nie nadpisuj" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "Wykonanie pełnego przeskanowania spowoduje utratę wszelkich zapisanych metadanych w programie Clementine takich jak okładki albumów, ilość odtworzeń oraz oceny. Clementine dokona przeskanowania Twoich wszystkich w Google Drive co może zająć trochę czasu. " #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Nie powtarzaj" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Nie pokazuj w różni wykonawcy" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Nie pokazuj odsłuchanych epizodów" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Nie losuj" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Nie zatrzymuj!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Wpłać darowiznę" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Kliknij podwójnie, by otworzyć" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Podwójne kliknięcie utworu spowoduje..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Ściągnij epizody (%n)" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Pobierz katalog" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Pobierz odcinki do" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Pobierz członkostwo" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Pobierz nowe odcinki automatycznie" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Pobieranie w kolejce" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Pobierz ustawienia" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Pobierz aplikację na Androida" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Pobierz ten album" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Pobierz ten album..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Pobierz ten odcinek" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Pobierz..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Pobieranie (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Pobieranie katalogu Icecast" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Pobieranie katalogu Jamendo" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Pobieranie katalogu Magnatune" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Pobierz plugin Spotify" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Pobieranie metadanych" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Przeciągnij, aby zmienić pozycję" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dubstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Czas" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Tryb dynamiczny włączony" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Dynamiczny, losowy miks" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Edytuj inteligentną listę odtwarzania..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Edytuj tag \"%1\"..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Edytuj znacznik..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Edytuj znaczniki" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Edytuj informacje o utworze" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Edytuj informacje o utworze..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Edytuj informacje o utworach..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Edytuj..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "Email" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Włącz obsługę urządzeń Wii Remote" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Włącz korektor dźwięku" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Włącz skróty tylko, gdy Clementine jest aktywny" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Odblokuj pozycje z listy aby wyszukiwać również w tych lokalizacjach. Uwaga: wyniki wyszukiwania będą prezentowane w poniższej kolejności." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Włącz/Wyłącz przesyłanie do Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Złożoność kodowania" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Jakość silnika kodowania" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Tryb kodowania" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Wpisz URL" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Podaj adres www, aby ściągać okładki dla albumów" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Wpisz nazwę dla eksportowanych okładek (bez rozszerzenia):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Wpisz nową nazwę dla listy odtwarzania" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Wpisz frazę powyżej żeby wyszukać muzykę na swoim komputerze lub w internecie" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Wpisz słowa kluczowe poniżej aby wyszukać podcasty w iTunes Store" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Wpisz słowa kluczowe poniżej aby wyszukać podcasty na gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Wpisz szukane wyrażenie" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Dodaj URL radia internetowego:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Wprowadź nazwę folderu" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Wpisz ten adres IP do aplikacji w celu połączenia z Clementine." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Cała kolekcja" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Korektor dźwięku" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Rownoważny --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Rownoważny --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Błąd" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Błąd podczas zgrywania płyty CD" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Błąd podczas łączenia z urządzeniem MTP" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Błąd przy kopiowaniu utworów" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Błąd przy usuwaniu utworów" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Plugin Spotify - nieudane pobieranie" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Błąd wczytywania %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Problem podczas ładowania listy odtwarzania di.fm" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Błąd przetwarzania %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Błąd przy wczytywaniu audio CD" #: library/library.cpp:68 msgid "Ever played" msgstr "Odtwarzane choć raz" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Co 10 minut" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Co 12 godzin" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Co 2 godziny" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Co 20 minut" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Co 30 minut" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Co 6 godzin" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Co godzinę" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Za wyjątkiem utworów z tego samego albumu lub arkusza CUE" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Istniejące okładki" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Rozwiń" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Wygasa %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Eksportuj okładki" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Eksportuj okładki" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Eksportuj pobrane okładki" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Eksportuj osadzone okładki" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Eksportowanie zakończone" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Wyodrębniono okładek: %1 / %2 (pominięto: %3)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Przyciszanie przed pauzą i łagodne podgłośnianie przy wznawianiu" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Przyciszaj ścieżkę, gdy jest zatrzymywana" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Przejście" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Czas przejścia" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Błąd odczytywania napędu CD" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Nie udało się pobrać katalogu" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Nie udało się pobrać podcastów" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Nie udało się załadować podcastów" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Nie udało się sparsować XML dla tego kanału RSS" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Szybki" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Ulubione ścieżki" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Pobierz brakujące okładki" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Pobierz automatycznie" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Pobieranie ukończone" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Pobieranie bibliotek Subsonic" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Błąd podczas pobierania okładki" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Format pliku" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Rozszerzenie pliku" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Formaty pliku" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Nazwa pliku" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Nazwa pliku (bez ścieżki)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Wzór nazwy pliku:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Wielkość pliku" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Typ pliku" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Nazwa pliku" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Pliki" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Pliki do transkodowania" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Znajdź ścieżki w swojej bibliotece, które odpowiadają podanym kryteriom." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Znajdź tego artystę" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Tworzenie sygnatury utworu" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Koniec" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Pierwszy poziom" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Dopasuj okładkę do szerokości" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Rozmiar czcionki" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Ze względów licencyjnych Spotify obsługiwany jest przez oddzielny plugin" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Wymuś kodowanie mono" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Zapomnij o urządzeniu" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Zapomnienie urządzenia spowoduje usunięcie go z listy i Clementine będzie musiał ponownie przeskanować wszystkie piosenki ponownie przy następnym podłączeniu urządzenia." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Forma" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Format" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Klatki na sekundę" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Klatek na bufor" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Zamrożony" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Pełny bas" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Pełny bas + soprany" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Pełne soprany" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Ogólne" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Podstawowe ustawienia" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Gatunek" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Pobieranie kanałów" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Otrzymywanie strumieni" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Nadaj nazwę:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Idź" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Przejdź do kolejnej karty z listą odtwarzania" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Przejdź do poprzedniej karty z listą odtwarzania" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Dysk Google" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Uzyskano %1 okładek z %2 (%3 nieudane)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Usunięte utwory zostaną wyszarzone w listach odtwarzania" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Grupuj bibliotekę według..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Grupuj według" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Grupuj według Album" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Grupuj według Artysta" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Grupuj według Artysta/Album" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Grupuj według Artysta/Rok - Album" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Grupuj według Gatunek/Artysta" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Grupuj według Gatunek/Artysta/Album" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Grupowanie" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "Strona HTML nie zawiera żadnego kanału RSS" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "Otrzymano kod statusu HTTP 3xx bez adresu URL, sprawdź konfigurację serwera" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "Pośrednik HTTP (proxy)" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Szczęśliwy" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Informacja o urządzeniu" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Informacja o urządzeniu jest widoczna tylko, gdy urządzenie jest podłączone." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Wysoki" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Dużo (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Wysoka (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Host nie został znaleziony, sprawdź URL serwera. Przykład: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Godzin" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnoropucha" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Nie posiadam konta w Magnatune" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Ikona" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Ikony na górze" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Identyfikowanie utworu" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Jeśli będziesz kontynuował, urządzenie będzie działać wolniej i skopiowane na nie piosenki mogą nie działać." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Jeżeli znasz URL podcastu, wpisz go poniżej i naciśnij \"Idź\"." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Ignoruj \"The\" w nazwach artystów" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Obrazy (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Obrazy (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "W ciągu następnych %1 dni" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "W ciągu następnych %1 tygodni" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "W trybie dynamicznym nowe utwory będą wybierane i dodawane do playlisty za każdym razem gdy skończy się odtwarzanie bieżącego utworu." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Skrzynka odbiorcza" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Dołącz okładkę albumu" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Dołączaj wszystkie utwory" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Niekompatybilna wersja protokołu Subsonic REST. Klient musi zostać zaktualizowany." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Niekompatybilna wersja protokołu Subsonic REST. Serwer musi zostać zaktualizowany." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Niekompletna konfiguracja, upewnij się, że wszystkie pola zostały wypełnione." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Zwiększ głośność o 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Zwiększ głośność o procentów" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Zwiększ głośność" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Indeksowanie %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Informacja" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Opcje wejścia" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Wstaw..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Zainstalowano" #: core/database.cpp:585 msgid "Integrity check" msgstr "Sprawdzanie integralności" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Usługi internetowe" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Zły klucz API" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Błędny format" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Błędna metoda" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Błędne parametry" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Nieprawidłowe określenie zasobów" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Błędna usługa" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Zły klucz sesji" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Odwróć zaznaczenie" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Najczęściej odsłuchiwane ścieżki na Jamendo" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Najlepsze ścieżki na Jamendo" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Najlepsze ścieżki tego miesiąca na Jamendo" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Najlepsze ścieżki tego tygodnia na Jamendo" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Baza danych Jamendo" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Przeskocz do aktualnie odtwarzanej ścieżki" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Przytrzymaj klawisze przez %1 sekundę..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Przytrzymaj klawisze przez %1 sekundy..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Pozostań w tle po zamknięciu okna" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Zachowaj oryginalne pliki" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Kotki" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Język" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Laptop/Słuchawki" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Duża hala" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Duża okładka albumu" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Duża okładka albumu (szczegóły poniżej)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Duży pasek boczny" #: library/library.cpp:80 msgid "Last played" msgstr "Ostatnio odtwarzane" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Ostatnio odtwarzane" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm jest przeciążone, prosimy spróbować za chwilę" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Hasło Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Last.fm - ilość odtworzeń" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Tagi Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Użytkownik Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Wiki Last.fm" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Najmniej lubiane ścieżki" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Lewy" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Długość" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Biblioteka" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Zaawansowanie grupowanie biblioteki" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Konieczność odświeżenia biblioteki" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Poszukiwania biblioteki" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Limity" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Na żywo" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Wczytaj" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Wczytaj okładkę z adresu URL" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Wczytaj okładkę z adresu URL..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Wczytaj okładkę z dysku" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Wczytaj okładkę z dysku..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Wczytaj listę odtwarzania" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Wczytaj listę odtwarzania..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Wczytywanie urządzenia MTP" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Wczytywanie bazy danych iPoda" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Wczytywanie inteligentnej listy odtwarzania" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Wczytywanie utworów" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Wczytywanie strumienia" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Wczytywanie ścieżek" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Wczytywanie informacji o utworze" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Wczytywanie..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Wczytuje pliki/adresy URL, zastępując obecną listę odtwarzania" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Zaloguj się" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Logowanie nieudane" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Wyloguj" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Profil przewidywania długoterminowego (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Dodaj do ulubionych" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Mało (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Niska (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Profil niskiej złożoności (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Teksty utworów" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Tekst z %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Pobierz z Magnatune" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Pobieranie z Magnatune zakończone" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Profil główny (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Zrób tak!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Zrób tak!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Uczyń playlistę dostępną offline" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Nieprawidłowa odpowiedź" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Ręczna konfiguracja pośrednika (proxy)" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Ręcznie" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Wytwórca" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Oznacz jako przesłuchany" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Oznacz jako nowy" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Porównaj wszystkie warunki (AND/I)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Porównaj jeden lub więcej warunków (OR/LUB)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Maksymalna ilość wyników wyszukiwania globalnego" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Maksymalny bitrate" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Umiarkowanie (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Średnia (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Typ członkostwa" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Minimalny bitrate" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Brak ustawień projectM" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Monitoruj zmiany biblioteki" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Odtwarzanie mono" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Miesięcy" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Humor" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Styl paska humoru" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Paski humoru" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Więcej" #: library/library.cpp:84 msgid "Most played" msgstr "Najczęściej odtwarzane" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Punkt montowania" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Punkty montowania" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Przesuń w dół" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Przenieś do biblioteki..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Przesuń w górę" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Muzyka" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Biblioteka muzyki" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Wycisz" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Moja Muzyka" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Moje rekomendacje" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Nazwa" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Nazwa" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Nazwy opcji" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Wąskie pasmo (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Pośrednik sieciowy (proxy)" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Zdalne sterowanie przez sieć" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Nigdy" #: library/library.cpp:74 msgid "Never played" msgstr "Jeszcze nie odtwarzane" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Nie odtwarzaj automatycznie" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Nowy folder" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Nowa lista odtwarzania" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Nowa inteligentna lista odtwarzania..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Nowe utwory" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Nowe ścieżki będą automatycznie dodane." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Najnowsze ścieżki" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Dalej" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Następny utwór" #: core/utilities.cpp:151 msgid "Next week" msgstr "W następnym tygodniu" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Bez analizatora" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Brak obrazka tła" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Brak okładek do wyodrębnienia" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Bez długich bloków" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Nie znaleziono wyników. Wyczyść pole wyszukiwania, by wyświetlić listę odtwarzania" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Bez krótkich bloków" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Brak" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Żaden z zaznaczonych utworów nie był odpowiedni do skopiowania na urządzenie" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Neutralny" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Zwykły typ bloku" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Niedostępne podczas używania inteligentnej listy odtwarzania" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Nie podłączono" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Za mało zawartości" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Za mało fanów" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Za mało użytkowników" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Za mało sąsiadów" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Nie zainstalowano" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Niezalogowany" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Nie zamontowano - kliknij dwukrotnie, aby zamontować" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Nic nie znaleziono" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Typ powiadomień" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Powiadomienia" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Teraz odtwarzane" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Podgląd OSD" #: widgets/osd.cpp:173 msgid "Off" msgstr "Wył" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "Wł" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Zezwalaj tylko na połączenia z następujących zakresów IP:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Zezwalaj tylko na połączenia z sieci lokalnej" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Pokaż tylko pierwsze" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Krycie" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Otwórz %1 w przeglądarce" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Otwórz audio CD" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Otwórz plik OPML" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Otwórz plik OPML..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Otwórz urządzenie" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Otwórz plik..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Otwórz w Dysku Google" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Otwórz w nowej liście odtwarzania" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Otwórz w nowej liście odtwarzania" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Otwórz w przeglądarce" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Otwórz..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Operacja nieudana" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Optymalizuj pod względem szybkości transmisji (bitrate)" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Optymalizuj pod względem jakości" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Opcje" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Uporządkuj pliki" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Uporządkuj pliki..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Porządkowanie plików" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Aktualne znaczniki" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Inne opcje" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Wyjście" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Urządzenie wyjściowe" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Opcje wyjścia" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Nadpisz wszystkie" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Nadpisz istniejące pliki" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Nadpisz tylko mniejsze" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Właściciel" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Parsowanie katalogu Jamendo" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Impreza" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Hasło" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Pauza" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Wstrzymaj odtwarzanie" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Zatrzymane" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Wykonawca" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Piksel" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Zwykły pasek boczny" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Odtwarzaj" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Ilość odtworzeń" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Odtwarzaj, gdy zatrzymane; zatrzymaj, gdy odtwarzane" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Odtwarzaj jeśli nic nie jest aktualnie odtwarzane" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Odtwórz ścieżkę na liście odtwarzania" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Odtwarzaj/wstrzymaj" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Odtwarzanie" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Opcje odtwarzacza" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Lista odtwarzania" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Lista odtwarzania zakończona" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Opcje listy odtwarzania" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Typ listy odtwarzania" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Listy odtwarzania" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Aby kontynuować pracę z Clementine należy zamknąć przeglądarkę" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Stan wtyczki:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcasty" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Czas powiadomienia" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Wzmocnienie" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Ustawienia" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Ustawienia..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Szukaj okładek w plikach zawierających w nazwie (oddziel przecinkami):" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Preferowany format audio" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Preferowana jakość" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Preferowany format" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Typ audio dla konta premium" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Ustawienie:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Ustaw kombinację przycisków dla" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Naciśnij klawisz" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Naciśnij kombinację klawiszy dla %1" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Opcje ładnego OSD (menu ekranowego)" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Podgląd" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Wstecz" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Poprzedni utwór" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Wypisz informacje o wersji" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Postęp" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Postęp" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psychodeliczna" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Naciśnij przycisk na pilocie" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Posortuj ścieżki w przypadkowej kolejności" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Jakość" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Jakość" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Odpytywanie urządzenia..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Menedżer kolejki odtwarzania" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Kolejkuj wybrane ścieżki" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Kolejkuj ścieżkę" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (równa głośność dla wszystkich ścieżek)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Deszcz" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Deszcz" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Losowa wizualizacja" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Ocena utworu: 0" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Ocena utworu: 1" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Ocena utworu: 2" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Ocena utworu: 3" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Ocena utworu: 4" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Ocena utworu: 5" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Ocena" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Na pewno anulować?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Przekroczono limit przekierowań, sprawdź konfigurację serwera" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Odśwież katalog" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Odśwież kanały" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Odśwież listę stacji" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Odśwież strumienie" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Pamiętaj ruchy pilota" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Zapamiętaj z ostatniego razu" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Usuń" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Usuń akcję" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Usuń duplikaty z playlisty" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Usuń katalog" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Usuń z Mojej Muzyki" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Usuń z zakładek" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Usuń z listy odtwarzania" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Usuń listę odtwrzania" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Usuń listy odtwarzania" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Zmień nazwę listy odtwarzania" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Zmień nazwę listy odtwarzania..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Ponumeruj utwory według tej kolejności..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Powtarzaj" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Powtarzaj album" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Powtarzaj listę odtwarzania" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Powtarzaj utwór" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Zastąp aktualną listę odtwarzania" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Zastąp listę odtwarzania" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Zamień spacje na podkreślniki" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Tryb Replay Gain" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Stwórz ponownie" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Wymagaj kodu uwierzytelniającego" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Resetuj" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Wyzeruj licznik odtworzeń" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Odtwarzaj od początku lub odtwórz poprzedni utwór jeżeli nie minęło 8 sekund aktualnego utworu" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Ogranicz do znaków ASCII" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Wznów odtwarzanie przy uruchamianiu programu" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Powróć do Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Prawy" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Zgraj" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Zgraj CD" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Uruchom" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "Pośrednik (proxy) SOCKS" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Błąd powitania SSL, sprawdź konfigurację serwera. Włączenie SSLv3 poniżej może pomóc w obejściu tego problemu" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Bezpiecznie usuń urządzenie" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Bezpiecznie usuń urządzenie po kopiowaniu" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Próbkowanie" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Próbkowanie" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Zapisz pliki .mood w swojej bibliotece" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Zapisz okładkę albumu" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Zapisz okładkę na dysk..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Zapisz obraz" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Zapisz listę odtwarzania" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Zapisz listę odtwarzania" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Zapisz listę odtwarzania..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Zapisz ustawienia korektora" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Zapisz oceny w tagach kiedy to możliwe" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Zapisz statystyki w tagach kiedy to możliwe" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Zapisz ten strumień w zakładce Internet" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Zapisywanie statystyk do plików" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Zapisywanie utworów" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Profil skalowalnego próbkowania (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Wielkość po przeskalowaniu" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Wynik" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Wysyłaj informacje o utworach, których słucham" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Szukaj" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Szukaj" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Przeszukaj stacje Icecast" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Przeszukaj Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Przeszukaj Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Przeszukaj Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Wyszukaj automatycznie" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Szukaj okładek..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Wpisz dowolną frazę" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Przeszukaj gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Przeszukaj iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Tryb wyszukiwania" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Opcje wyszukiwania" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Wyniki wyszukiwania" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Kryteria wyszukiwania" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Drugi poziom" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Przewiń wstecz" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Przewiń w przód" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Przesuń obecnie odtwarzaną ścieżkę o względną wartość" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Przesuń obecnie odtwarzaną ścieżkę do określonej pozycji" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Zaznacz wszystko" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Odznacz wszystkie" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Wybierz kolor tła:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Wybierz obrazek tła" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Wybierz najlepsze dopasowanie" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Wybierz kolor pierwszoplanowy:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Wybierz wizualizacje" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Wybierz wizualizacje..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Wybierz..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Numer seryjny" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Serwer" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "Adres URL serwera" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Szczegóły serwera" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Usługa niedostępna" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Ustaw %1 na \"%2\"..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Ustaw głośność na procent" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Ustaw wartość dla wszystkich zaznaczonych utworów..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Ustawienia" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Skrót" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Skrót dla %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Skrót dla %1 już istnieje" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Pokaż" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Pokaż OSD" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Pokaż animację podświetlenia aktualnie odtwarzanej ścieżki" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Pokaż pasek humoru na pasku statusu ścieżki" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Pokaż natywne powiadomienia środowiska graficznego" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Pokaż powiadomienie, gdy zmieniam tryb powtarzania / losowania utworów" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Pokaż powiadomienie, gdy zmieniam głośność" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Pokaż popup z ikony w tacce systemowej" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Pokazuj ładne OSD (menu ekranowe)" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Pokaż ponad paskiem stanu" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Pokaż wszystkie utwory" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Pokaż wszystkie ścieżki" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Pokazuj okładki w bibliotece" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Pokaż separatory" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Pokaż w pełnej wielkości..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Pokaż grup w globalnych wynikach wyszukiwania" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Pokaż w menadżerze plików..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Pokaż w bibliotece..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Pokaż w różni wykonawcy" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Pokaż pasek humoru" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Pokaż tylko duplikaty" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Pokaż tylko nieoznaczone" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Pokazuj sugestie" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Pokaż przycisk \"Dodaj do ulubionych\"" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Pokaż przycisk scrobblingu w głównym oknie" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Pokaż ikonkę w tacce systemowej" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Wyświetl listę włączonych i wyłączonych źródeł" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Pokaż/Ukryj" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Losuj" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Losuj albumy" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Losuj wszystko" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Wymieszaj listę odtwarzania" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Losuj utwory w tym albumie" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Zaloguj" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Wyloguj" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Logowanie..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Podobni wykonawcy" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Wielkość" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Wielkość:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Przeskocz wstecz w liście odtwarzania" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Ilość przeskoczeń utworu" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Przeskocz w przód w liście odtwarzania" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Pomiń wybrane ścieżki" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Pomiń ścieżkę" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Mała okładka albumu" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Mały pasek boczny" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Inteligentna lista odtwarzania" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Inteligentne listy odtwarzania" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Miękki" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Informacje o utworze" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "O utworze" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Przepraszamy" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Sortuj według gatunku (alfabetycznie)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Sortuj według gatunku (według popularności)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Sortuj według nazwy stacji" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Sortuj według" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Sortowanie" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Źródło" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Źródła" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Nieudane logowanie do Spotify" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Wtyczka Spotify" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Nie zainstalowano pluginu Spotify" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Standardowy" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Oznaczone gwiazdką" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Zacznij zgrywanie" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Rozpocznij aktualnie odtwarzaną listę" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Rozpocznij transkodowanie" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Zacznij wpisywać frazę w polu powyżej, aby rozpocząć wyszukiwanie" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Uruchamianie %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Uruchamianie..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Zatrzymaj" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Zatrzymaj po" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Zatrzymaj po tym utworze" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Zatrzymaj odtwarzanie" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Zatrzymaj odtwarzanie po obecnej ścieżce" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Zatrzymaj po utworze: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Zatrzymano" #: core/song.cpp:431 msgid "Stream" msgstr "Strumień" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Strumieniowanie z serwera Subsonic wymaga ważnej licencji serwera po zakończeniu 30-dniowego okresu próbnego." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Strumieniowanie członkostwa" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Subskrybenci" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Suckes!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "Pomyślnie zapisano %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Sugerowane znaczniki" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Podsumowanie" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Bardzo dużo (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Super wysoka (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Obsługiwane formaty" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Zsynchronizuj statystyki z plikami" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Synchronizowanie skrzynki Spotify" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Synchronizowanie playlisty Spotify" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Synchronizowanie utworów oznaczonych gwiazdką na Spotify" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Kolory systemowe" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Zakładki na górze" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Uzupełnianie znaczników" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Docelowy bitrate" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Opcje tekstu" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Podziękowania dla" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Nie można było uruchomić komendy \"%1\"." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Okładka albumu odtwarzanego utworu" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "Katalog %1 jest nieprawidłowy" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "Druga wartość musi być większa niż pierwsza!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Wybrany serwis nie istnieje!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Wybrany adres nie jest obrazem!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Okres próbny dla serwera Subsonic wygasł. Zapłać, aby otrzymać klucz licencyjny. Szczegóły na subsonic.org." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Wersja do której właśnie zaktualizowano odtwarzacz Clementine wymaga odświeżenia całej biblioteki. Wynika to z wprowadzenia następujących zmian:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Na tym albumie są inne utwory" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Wystąpił problem z komunikacją z serwisem gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Wystąpił problem podczas pobierania metadanych z Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Wystąpił problem podczas parsowania odpowiedzi z iTunes Store" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Wystąpiły problemy podczas kopiowania utworów. Nie można było skopiować następujących plików:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Wystąpiły problemy podczas kasowania utworów. Nie można było skasować następujących plików:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Te pliki zostaną usunięte z urządzenia. Na pewno chcesz kontynuować?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Te pliki zostaną nieodwracalnie usunięte z dysku, czy na pewno chcesz kontynuować?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Te katalogi będą skanowane w poszukiwaniu muzyki" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Te ustawienia są używane w \"Transkodowaniu muzyki\" oraz podczas konwertowania muzyki przed kopiowaniem jej na urządzenie." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Trzeci poziom" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Ta operacja spowoduje utworzenie bazy, która będzie zawierać około 150 MB danych.\nCzy chcesz kontynuować?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Ten album nie jest dostępny w żądanym formacie" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "To urządzenie musi być podłączone i otwarte zanim Clementine zobaczy jakie formaty plików ono obsługuje." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "To urządzenie obsługuje następujące formaty plików:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "To urządzenie nie będzie działać prawidłowo" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "To jest urządzenie MTP, ale skompilowałeś Clementine bez obsługi libmtp." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "To jest urządzenie iPod, ale skompilowałeś Clementine bez obsługi libgpod." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Pierwszy raz podłączyłeś to urządzenie. Clementine przeskanuje je teraz w poszukiwaniu plików z muzyką - może to zająć trochę czasu." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Opcja ta może zostać zmieniona w preferencjach \"Trybu\"" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Strumień wyłącznie dla płacących subskrybentów" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Ten typ urządzenia nie jest obsługiwany: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Nazwa" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Dzisiaj" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Przełącz ładne OSD" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Przełącz tryb pełnoekranowy" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Przełącz stan kolejki" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Włącz scroblowanie" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Przełącz wyświetlanie ładnego menu ekranowego" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Jutro" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Zbyt wiele przekierowań" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Top utworów" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "W sumie albumów:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Całkowita ilość przesłanych w bajtach" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Całkowita ilość zapytań sieciowych" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Utwór" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Ścieżki" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Transkoduj muzykę" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Dziennik transkodera" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Konwersja" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Transkodowanie %1 plików za pomocą %2 wątków" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Opcje konwersji" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbina" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Wyłącz" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Bardzo szerokie pasmo (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Nie udało się pobrać %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "nieznany" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Nieznany content-type" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Nieznany błąd" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Usuń okładkę" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Nie pomijaj wybranych ścieżek" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Nie pomijaj ścieżki" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Anuluj subskrypcję" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Nadchodzące koncerty" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Zaktualizuj" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Uaktualnij wszystkie podcasty" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Odśwież zmienione katalogi biblioteki" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Odświeżaj bibliotekę przy uruchomieniu Clementine" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Uaktualnij ten podcast" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Aktualizacja" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Odświeżanie %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Odświeżanie %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Aktualizowanie biblioteki" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Użycie" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Używaj tagu \"Wykonawca albumu\" jeżeli jest dostępny" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Używaj skrótów klawiaturowych Gnome" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Używaj metadanych Replay Gain, jeśli są dostępne" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Użyj SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Używaj Wii Remote" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Użyj własnego zestawu kolorów" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Użyj niestandardowej wiadomości dla powiadomień" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Użyj zdalnego sterowania" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Użyj uwierzytelniania" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Użyj silnika zarządzania przepływnością" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Użyj trybu automatycznego" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Używaj powiadomień do raportowania statusów urządzenia Wii Remote" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Użyj chwilowego kształtowania szumu" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Użyj domyślnych ustawień systemowych" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Użyj systemowego zestawu kolorów" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Użyj systemowych ustawień proxy" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Używaj wyrównywania głośności" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Użyto" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Interfejs użytkownika" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Użytkownik" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Dodanie utworu z menu kontekstowego powoduje..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Zmienny bitrate" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Różni wykonawcy" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Wersja %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Pokaż" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Tryb wizualizacji" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Wizualizacje" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Ustawienia wizualizacji" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Wykrywanie aktywności głosowej" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Głośność %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Ostrzeż mnie kiedy zamknę zakładkę listy odtwarzania" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Strona internetowa" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Tygodni" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Podczas startu Clementine" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Szukając okładki, Clementine w pierwszej kolejności przeszuka pliki obrazów zawierające któreś z podanych słów.\nW przypadku braku takich plików użyty zostanie największy obraz z danego katalogu." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Jeżeli lista wyników jest pusta..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Czemu by nie spróbować..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Szerokie pasmo (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: aktywowany" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: połączony" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: krytyczny poziom baterii (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: dezaktywowany" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: rozłączony" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: niski poziom baterii (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Bez okładek:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Czy chciałbyś przenieść także inny piosenki z tego albumu do Różnych wykonawców?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Czy chcesz teraz rozpocząć odświeżanie biblioteki?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Zapisz wszystkie statystyki w plikach muzycznych" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Zły login lub hasło." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Rok" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Rok - Album" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Lat" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Wczoraj" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Zaraz pobierzesz następujące albumy" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Czy na pewno chcesz usunąć listy odtwarzania (%1) z ulubionych??" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Zamierzasz usunąć listę odtwarzania nienależącą do list ulubionych. Ta lista zostanie NIEODWRACALNIE usunięta (po usunięciu nie da się jej przywrócić).\nCzy jesteś pewien?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Nie jesteś zalogowany/a." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Jesteś zalogowany/a jako %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Jesteś zalogowany/a" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Możesz zmienić sposób w jaki prezentowane są utwory w bibliotece." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Możesz słuchać muzyki za darmo bez posiadania konta, lecz uzytkownicy premium mogą słuchać lepszej jakości muzykę bez reklam." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Możesz słuchać utworów z Magnatune za darmo nie posiadając konta. Opłacenie członkostwa usuwa komunikaty na końcu każdej ścieżki." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Oprócz muzyki możesz jednocześnie słuchać strumieni tła." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Kontrolera Wii Remote można używać jako zdalnego sterowania w Clementine. Zobacz stronę wiki Clementine w celu uzyskania dalszych informacji.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Nie masz konta Spotify Premium." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Nie posiadasz aktywnej subskrypcji" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "Nie musisz się logować, aby przeglądać i słuchać muzyki w SoundCloud. Natomiast musisz się zalogować, jeżeli chcesz uzyskać dostęp do swoich playlist i swojego strumienia." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Zostałeś wylogowany ze Spotify, proszę wpisać ponownie hasło w ustawieniach." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Zostałeś wylogowany ze Spotify, proszę wpisać ponownie hasło." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Kochasz tę ścieżkę" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Jeśli zmieniałeś ustawienia językowe, będziesz musiał zrestartować Clementine." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Twój adres IP:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Niepoprawne dane konta last.fm" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Niepoprawne dane konta Magnatune" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Biblioteka jest pusta!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Twoje strumienie radiowe" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Przesłane utwory: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "W Twoim systemie brakuje wsparcia dla OpenGL, wizualizacje są niedostępne." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Nazwa użytkownika lub hasło niepoprawne." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "dodaj %n utworów" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "po" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "temu" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "i" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "automatycznie" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "przed" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "pomiędzy" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "najpierw największe" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "uderzeń na minutę" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "zawiera" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "wyłączony" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "płyta %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "nie zawiera" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "kończy się na" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "jest równy" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "katalog gpodder.net" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "większy niż" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "IPody i urządzenia USB obecnie nie działają na systemie Windows. Przepraszamy!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "w ostatnich" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "mniejszy niż" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "najpierw najdłuższe" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "przenieś utwory: %n" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "najpierw najnowsze" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "nie wynosi" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "oprócz ostatnich" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "nie w" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "najpierw najstarsze" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "w dniu" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "opcje" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "lub zeskanuj kod QR!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "wciśnij enter" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "usuń %n utworów" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "najpierw najkrótsze" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "losuj utwory" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "najpierw najmniejsze" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "sortuj utwory" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "zaczyna się na" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "zatrzymaj" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "utwór %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/pt.po000066400000000000000000005137151260417502300236760ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Alexandro Casanova , 2013 # arnaudbienner , 2011 # arnaudbienner , 2011 # FIRST AUTHOR , 2010 # Hugo Carvalho , 2015 # João Santos , 2015 # Alexandro Casanova , 2013 # Sérgio Marques , 2011-2015 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Portuguese (http://www.transifex.com/davidsansome/clementine/language/pt/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nPode adicionar listas de reprodução favoritas clicando na estrela existente junto ao nome da lista de reprodução\n\nAs listas de reprodução favoritas serão guardadas aqui" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " dias" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr " s" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " segundos" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " faixas" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 faixas)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 álbuns" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 dias" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 dias atrás" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 em %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 listas de reprodução (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "selecionada(s) %1 de" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 faixa" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 faixas" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 faixas encontradas" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 faixas encontradas (a mostrar %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 faixas" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 transferidas" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Módulo Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 outros ouvintes" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 reproduções" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n falha(s)" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n concluída(s)" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n por converter" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Alinhar texto" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Centro" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Personalizado" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "&Extras" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "Aj&uda" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&Ocultar %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Ocultar..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Esquerda" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "&Música" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Nenhum" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "Lista de re&produção" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Sair" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Modo de &repetição" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "Di&reita" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Modo de de&sordenação" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "Ajustar coluna&s à janela" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "Ferramen&tas" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(diferente entre as várias faixas)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", de" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "... e a todos os colaboradores do Amarok" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0 px." #: core/utilities.cpp:119 msgid "1 day" msgstr "1 dia" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 faixa" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192 000Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44 100Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48 000Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 faixas aleatórias" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96 000Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Atualizar para a versão Premium" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Se inativa, o Clementine tenta gravar a avaliação e as estatísticas numa base de dados distinta e não modificará os seus ficheiros.

Se ativa, a avaliação e as estatísticas serão gravadas na base de dados e nos detalhes dos ficheiros.

Tenha em conta que esta operação pode não funcionar para todos os formatos de ficheiro e não existe um formato universal, podendo estes dados não estarem disponíveis nos outros reprodutores de música.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Prefixe uma palavra com o nome do campo para limitar a procura a esse campo. Por exemplo artista:Bode procura na coleção por todos os artistas que tenham a palavra Bode.

Campos disponíveis: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Esta ação irá gravar as estatísticas e as avaliações nos detalhes dos ficheiros, para todas as faixas da coleção.

Não será necessário se a opção "Gravar avaliações e estatísticas nos detalhes dos ficheiros" estiver sempre ativa.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Os \"tokens\" iniciam com %, por exemplo: %artist %album %title

\n\n

Ao colocar parênteses entre as secções de texto que contêm \"tokens\", essa secção será ocultada se o \"token\" estiver vazio

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Requer uma conta Spotify Premium" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "A aplicação só pode estabelecer a ligação se introduzir o código correto" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Uma lista de reprodução inteligente é aquela que advém da sua coleção. Existem diversos tipos de listas inteligentes, que oferecem diferentes métodos de seleção de faixas." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "A faixa será incluída na lista de reprodução se satisfizer estas condições." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ALL GLORY TO THE HYPNOTOAD" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Abortar" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Sobre o %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Sobre o Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Sobre o Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Absolutos" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Detalhes da conta" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Detalhes da conta (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Ação" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Ação" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Ativar/desativar Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Emissão de atividades" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Adicionar podcast" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Adicionar emissão" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Adicionar uma nova linha, se suportado pelo serviço de notificações" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Adicionar uma ação" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Adicionar todas as faixas de um diretório e subdiretórios" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Adicionar outra emissão..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Adicionar diretório..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Adicionar ficheiro" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Adicionar ficheiro ao conversor" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Adicionar ficheiro(s) ao conversor" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Adicionar ficheiro..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Adicionar ficheiros a converter" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Adicionar pasta" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Adicionar pasta..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Adicionar nova pasta..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Adicionar podcast" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Adicionar podcast..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Adicionar termo de pesquisa" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Adicionar álbum" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Adicionar artista do álbum" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Adicionar artista" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Adicionar avaliação automaticamente" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Adicionar compositor" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Adicionar número do disco" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Adicionar nome do ficheiro" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Adicionar género" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Adicionar grupo" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Adicionar duração" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Adicionar intérprete" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Adicionar número de reproduções" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Adicionar avaliação" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Adicionar reproduções ignoradas" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Adicionar título" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Adicionar faixa à cache" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Adicionar número da faixa" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Adicionar ano" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Adicionar faixas às \"Minhas músicas\" ao clicar no botão \"Gosto\"" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Adicionar emissão..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Adicionar às \"Minha músicas\"" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Adicionar às listas do Spotify" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Adicionar ao Spotify com estrela" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Adicionar noutra lista de reprodução" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Adicionar aos marcadores" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Adicionar à lista de reprodução" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Adicionar à fila de reprodução" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Adicionar utilizador/grupo aos marcadores" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Adicionar uma ação wiimotedev" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Adicionar..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Adicionadas este mês" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Adicionadas esta semana" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Adicionadas este ano" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Adicionadas hoje" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Adicionadas no espaço de três meses" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Agrupamento avançado..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Após " #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Depois de copiar..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Álbum" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Álbum (volume ideal para todas as faixas)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Artista do álbum" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Capa do álbum" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Informações do álbum em jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Álbuns" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Álbuns com capas" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Álbuns sem capas" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Todos" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Todos os ficheiros (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "All Glory to the Hypnotoad!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Todos os álbuns" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Todos os artistas" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Todos os ficheiros (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Todas as listas de reprodução (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Todos os tradutores" #: library/library.cpp:98 msgid "All tracks" msgstr "Todas as faixas" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Permitir que um cliente transfira faixas deste computador." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Permitir transferências" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Permitir codificação mid/side" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Juntamente aos originais" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Ocultar sempre a janela principal" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Mostrar sempre a janela principal" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Iniciar sempre a reprodução" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon Cloud Drive" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Necessita de um suplemento para utilizar o Spotify no Clementine. Pretende transferir e instalar o suplemento?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Ocorreu um erro ao carregar a base de dados iTunes" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Ocorreu um erro ao gravar os detalhes em \"%1\"" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Ocorreu um erro desconhecido." #: ui/about.cpp:85 msgid "And:" msgstr "E:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Chateado" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Aspeto" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Adicionar ficheiros/URL à lista de reprodução" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Juntar à lista de reprodução atual" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Juntar à lista de reprodução" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Aplicar compressão para impedir a distorção" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Tem a certeza de que quer eliminar \"%1\"?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Tem a certeza de que quer reiniciar as estatísticas desta faixa?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Tem a certeza que pretende gravar as estatísticas e avaliações para todas as faixas da sua coleção?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Artista" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Info do artista" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Tags do artista" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Iniciais do artista" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Perguntar ao gravar" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Formato áudio" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Dispositivo áudio" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Falha ao autenticar" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Autor" #: ui/about.cpp:68 msgid "Authors" msgstr "Autores" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Automático" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Automáticos" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Atualização automática" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Na coleção em árvore, abrir automaticamente as categorias individuais" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Disponível" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Taxa de dados média" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Tamanho médio" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "Podcasts BBC" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Emissões secundárias" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Cor de fundo" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Imagem de fundo" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Opacidade do fundo" #: core/database.cpp:648 msgid "Backing up database" msgstr "A copiar base de dados" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Equilíbrio" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "Banir (Last.fm scrobbling)" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Barras" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Azul" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Serviço básico" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Comportamento" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Melhor" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Biografia de %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Taxa de dados" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Taxa de dados" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Taxa de dados" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Blocos" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Tipo de bloco" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Valor" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Conteúdo" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Boom" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Procurar..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Duração da memória" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "A processar..." #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "A criar índice Seafile..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Mas estas fontes estão inativas:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Botões" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Suporte a ficheiros CUE" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Caminha da cache:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Colocação em cache" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "A colocar %1 em cache" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Cancelar" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Cancelar transferência" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Requer Captcha\nInicie sessão no Vk.com com o navegador web para corrigir este problema" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Alterar capa do álbum" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Alterar tamanho da letra..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Alterar modo de repetição" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Alterar atalho..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Alterar modo de desordenação" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "Alterar a faixa em reprodução" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Alterar idioma" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "As alterações serão aplicadas a partir da próxima faixa" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "A alteração a esta preferência de reprodução produzirá efeito nas faixas seguintes" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Procurar novos episódios" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Procurar atualizações" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Procurar atualizações..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Escolher diretório de cache Vk.com" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Escolha o nome da lista de reprodução inteligente" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Escolher automaticamente" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Escolha a cor..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Escolha o tipo de letra..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Escolher da lista" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Escolha o tipo de organização da lista e o número de faixas a incluir" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Escolha o diretório para guardar os podcasts" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Escolha os serviços web que pretende mostrar." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Escolha os sítios web em que o Clementine deve pesquisar as letras das faixas" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Clássica" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Eliminação" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Limpar" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Limpar lista de reprodução" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Erro do Clementine" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Laranja" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Visualização Clementine" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "O Clementine pode converter automaticamente, num formato reconhecido pelo leitor, os ficheiros copiados para o dispositivo" #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "O Clementine pode reproduzir as músicas enviadas para o Amazon Cloud Drive" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "O Clementine pode reproduzir as faixas existentes no Box" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "O Clementine pode reproduzir as faixas existentes no Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "O Clementine pode reproduzir as faixas existentes no Google Drive" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "O Clementine consegue reproduzir as músicas enviadas para o OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "O Clementine pode mostrar uma notificação ao mudar de faixa" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "O Clementine pode sincronizar a lista de subscrições existentes noutro computador ou aplicações. Criar uma conta" #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "O Clementine não conseguiu carregar as visualizações projectM. Verifique se o Clementine foi bem instalado." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Visualizador de imagens do Clementine" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "O Clementine não conseguiu encontrar resultados para este ficheiro" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "O Clementine vai procurar as faixas em:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Clique aqui para adicionar músicas" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Clique aqui para adicionar esta lista de reprodução como favorita para que fique acessível no painel de listas de reprodução da barra lateral" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Clique para alternar entre tempo restante e tempo total" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Ao clicar no botão Iniciar sessão, o navegador web será aberto. Após iniciar sessão, deve retornar ao Clementine." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Fechar" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Fechar lista de reprodução" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Fechar visualização" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Se fechar esta janela, irá cancelar a transferência." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Se fechar esta janela, irá parar a pesquisa das capas de álbum." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Clube" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Cores" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Lista de classes separadas por vírgula: nível entre 0 e 3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Comentário" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Rádio da comunidade" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Preencher detalhes automaticamente" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Preencher detalhes automaticamente..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Compositor" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Configurar %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Configurar Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Configurar atalhos" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Configurar Spotify..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Configurar Subsonic..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Configurar Vk.com..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Configurar pesquisa global..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Configurar coleção..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Configurar podcasts..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Configurar..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Ligar a Wii Remotes utilizando a ação ativar/desativar" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Ligar dispositivo" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Ligar ao Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Ligação recusada pelo servidor. Verifique o URL. Por exemplo: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Ligação expirada. Verifique o URL. Por exemplo: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Erro na ligação ou o som foi desativado pelo proprietário" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Consola" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Taxa de dados constante" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Converter todas as faixas" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Converter quaisquer faixas não reconhecidas pelo dispositivo" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Converter ficheiros áudio antes de os enviar para o serviço remoto." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Converter ficheros sem perdas" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Copiar URL para a área de transferência" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Copiar para a área de transferência" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Copiar para o dispositivo..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Copiar para a coleção..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Direitos de autor" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Não foi possível ligar ao Subsonic. Verifique o URL. Por exemplo: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Incapaz de criar o elemento GStreamer \"%1\" - certifique-se que tem instalados todos os suplementos necessários" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Não foi possível criar a lista de reprodução" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Incapaz de encontrar o recurso para %1 - certifique-se que tem instalados todos os suplementos necessários" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Incapaz de encontrar o codificador para %1 - certifique-se que tem instalados todos os suplementos necessários" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Não foi possível abrir o ficheiro %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Gestor de capas" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Capa de álbum a partir de uma imagem" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Capa de álbum existente em %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Capa de álbum desativada manualmente" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Capa de álbum não definida" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Capa de álbum em %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Capas de álbum em %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Sobreposição ao mudar automaticamente de faixas" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Sobreposição ao mudar manualmente de faixas" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Seta para baixo" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Seta para cima" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Personalizar" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Imagem personalizada:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Definições personalizadas" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Personalizar..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "Caminho DBus" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dança" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Foram detetados erros na base de dados. Por favor consulte https://code.google.com/p/clementine-player/wiki/DatabaseCorruption para obter as informações sobre a recuperação das bases de dados" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Data de criação" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Data de modificação" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Dias" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "Pa&drão" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Diminuir volume em 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Diminuir volume em por cento" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Diminuir volume" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Imagem de fundo padrão" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Dispositivo pré-definido em %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Padrões" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Atraso entre visualizações" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Eliminar" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Eliminar dados transferidos" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Eliminar ficheiros" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Eliminar do dispositivo..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Eliminar do disco..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Eliminar episódios reproduzidos" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Eliminar pré-ajustes" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Eliminar lista de reprodução inteligente" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Eliminar ficheiros originais" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "A eliminar ficheiros" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Retirar da fila as faixas selecionadas" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Retirar esta faixa da fila" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Destino" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Detalhes..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Dispositivo" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Propriedades do dispositivo" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Nome do dispositivo" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Propriedades do dispositivo..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Dispositivos" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Caixa de diálogo" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Será que queria dizer" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Palavra-passe Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Utilizador Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Ligação direta à Internet" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Diretório" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Desativar duração" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Desativar barra de estado de espírito" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Inativo" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Inativo" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Disco" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Transmissão intermitente" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Opções de exibição" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Mostrar notificação" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Reanalisar coleção" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Efetuar um reanálise total" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Efetuar um reanálise total..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Não converter quaisquer faixas" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Não substituir" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "Ao fazer uma reanálise total, perderá todos os meta-dados (ex: capa de álbum, número de reproduções e avaliações) gravados com o Clementine. O Clementine irá reanalisar as músicas do Google Drive, o que poderá demorar algum tempo." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Não repetir" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Não mostrar em vários artistas" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Não mostrar episódios reproduzidos" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Não desordenar" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Não parar!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Donativos" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Duplo clique para abrir" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "Ao clicar duas vezes na faixa da lista de reprodução..." #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Ao clicar duas vezes numa faixa..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Transferir %n episódios" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Diretório de transferências" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Transferir episódios para" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Transferência" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Transferir novos episódios automaticamente" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Transferência colocada na fila" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Definições de transferência" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Transferir a aplicação Android" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Transferir este álbum" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Transferir este álbum..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Transferir este episódio" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Transferir..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "A transferir (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "A transferir diretório Icecast" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "A transferir catálogo Jamendo" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "A transferir catálogo Magnatune" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "A transferir suplemento Spotify" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "A transferir dados" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Arraste para posicionar" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dub" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Duração" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "O modo dinâmico está ativo" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Combinação aleatória dinâmica" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Editar lista de reprodução inteligente..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Editar \"%1\"..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Editar \"tag\"..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Editar detalhes" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Editar informações da faixa" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Editar informações da faixa..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Editar informações das faixas..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Editar..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "E-mail" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Ativar suporte a Wii Remote" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Ativar caching automático" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Ativar equalizador" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Apenas ativar os atalhos se o Clementine estiver evidenciado" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Ativar edição imediata dos detalhes das faixas ao clicar" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Ative as fontes que quer utilizar na pesquisa. Os resultados serão exibidos por esta ordem." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Ativar/desativar envio para a Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Complexidade da codificação" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Qualidade da codificação" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Tipo de codificação" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Introduza o URL" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Introduza o URL para transferir a capa do álbum:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Introduza o nome das capas exportadas (sem extensão):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Introduza o nome para esta lista de reprodução" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Introduza os termos para pesquisa as faixas no computador e na Internet" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Introduza os termos de pesquisa para os podcasts no iTunes" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Introduza os termos de pesquisa para os podcasts do gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Introduza aqui os termos de pesquisa" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Introduza o URL da rádio na Internet:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Introduza o nome da pasta" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Introduza este IP na aplicação para se ligar ao Clementine" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Toda a coleção" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Equalizador" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Equivalente a --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Equivalente a --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Erro" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Erro ao extrair CD" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Erro ao ligar ao dispositivo MTP" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Erro ao copiar faixas" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Erro ao eliminar faixas" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Erro ao transferir o suplemento Spotify" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Erro ao carregar %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Erro ao carregar a lista de reprodução di.fm" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Erro ao processar %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Erro ao carregar o CD áudio" #: library/library.cpp:68 msgid "Ever played" msgstr "Reproduzida alguma vez" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "A cada 10 minutos" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "A cada 12 horas" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "A cada 2 horas" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "A cada 20 minutos" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "A cada 30 minutos" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "A cada 6 horas" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "A cada hora" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Exceto entre faixas do mesmo álbum ou ficheiros CUE" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Capas existentes " #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Expandir" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Termina em %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Exportar capas" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Exportar capas" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Exportar capas transferidas" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Exportar capas incorporadas" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Exportação terminada" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Exportada(s) %1 de %2 capa(s) (%3 ignoradas)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Redução/aumento gradual de volume ao pausar/retomar" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Redução gradual ao parar uma faixa" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Desvanecimento" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Duração" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Falha ao ler a unidade de CD" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Erro ao obter o diretório" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Erro ao obter os podcasts" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Erro ao carregar o podcast" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Erro ao processar o XML desta fonte RSS" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Rápida" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Faixas preferidas" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Obter capas em falta" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Obter automaticamente" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Obtencão concluída" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "A obter coleção Subsonic" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Erro ao obter a capa do álbum" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Formato de ficheiro" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Extensão do ficheiro" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Formatos de ficheiro" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Nome do ficheiro" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Nome do ficheiro (sem caminho)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Padrão do nome de ficheiro:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Caminhos de ficheiro" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Tamanho do ficheiro" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Tipo de ficheiro" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Nome do ficheiro" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Ficheiros" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Ficheiros a converter" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Procurar faixas da coleção que coincidem com os critérios indicados" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Procurar este artista" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "A procurar identificadores" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Terminar" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Primeiro nível" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Ajustar capa à largura" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Tamanho da letra" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Devido à sua licença, o suplemento do Spotify é disponibilizado separadamente" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Forçar codificação mono" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Ignorar dispositivo" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Se optar por ignorar um dispositivo, este será removido da lista e na próxima vez que o ligar, o Clementine terá que procurar as faixas novamente" #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Formulário" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Formato" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Taxa de imagens" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Imagens por memória" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Estático" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Graves" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Graves e agudos" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Agudos" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Geral" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Definições gerais" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Género" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Obter URL para partilhar esta faixa Spotify" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Obter URL para partilhar esta lista de reprodução" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "A obter canais" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "A obter emissões" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Nome:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Procurar" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Ir para o separador seguinte" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Ir para o separador anterior" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Foram obtidas %1 de %2 capas (não foram obtidas %3)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Nas listas de reprodução, escurecer as faixas inexistentes" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Agrupar coleção por..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Agrupar por" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Agrupar por álbum" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Agrupar por artista" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Agrupar por artista/álbum" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Agrupar por artista/ano - álbum" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Agrupar por género/álbum" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Agrupar por género/artista/álbum" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Grupo" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "A página HTML não possui fontes RSS" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "Recebido o código de estado HTTP 3xx sem URL. Verifique a configuração do servidor." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "Proxy HTTP" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Contente" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Informações do equipamento" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "As informações só estão disponíveis se o dispositivo estiver ligado" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Alta" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Alta (%1 ips)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Alta (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "HipHop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Servidor não encontrado. Verifique o URL. Por exemplo: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Horas" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Não tenho uma conta Magnatune" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Ícone" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Ícones no topo" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "A identificar faixa" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Se ativar esta opção, ao clicar numa faixa da lista de reprodução, pode editar os seus detalhes diretamente" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Se continuar, o dispositivo irá funcionar lentamente e as faixas copiadas poderão não funcionar" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Se souber o URL do podcast, introduza-o em baixo e prima Procurar" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Ignorar \"The\" no nome do artista" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Imagens (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Imagens (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Importar..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "No espaço de %1 dia(s)" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "No espaço de %1 semana(s)" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "No modo dinâmico, as faixas são escolhidas e adicionadas à lista de reprodução assim que uma faixa termine" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Caixa de entrada" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Incluir capa do álbum na notificação" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Incluir todas as faixas" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Versão incompatível do protocolo Subsonic REST. Tem que atualizar a aplicação." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Versão incompatível do protocolo Subsonic REST. Tem que atualizar o servidor." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Configuração incompleta. Verifique se todos os campos estão preenchidos." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Aumentar volume em 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Aumentar volume em por cento" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Aumentar volume" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "A indexar %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Informações" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Opções de entrada" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Inserir..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Instalado" #: core/database.cpp:585 msgid "Integrity check" msgstr "Verificação de integridade" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Serviços na Internet" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Serviços web" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "Metade das faixas" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Chave API inválida" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Formato inválido" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Método inválido" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Parâmetros inválidos" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Recurso especificado inválido" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Serviço inválido" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Chave de sessão inválida" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Inverter seleção" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "As faixas mais ouvidas no Jamendo" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "As melhores faixas do Jamendo" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "As melhores faixas do mês no Jamendo" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "As melhores faixas da semana no Jamendo" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Base de dados Jamendo" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Imediatamente para a faixa anterior " #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Ir para a faixa em reprodução" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Manter botões durante %1 segundo..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Manter botões durante %1 segundos..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Executar em segundo plano ao fechar a janela principal" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Manter ficheiros originais" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Gatinhos" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Idioma" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Portátil/Auscultadores" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Sala ampla" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Capa de álbum grande" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Capa de álbum grande (detalhes em baixo)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Capa de álbum grande (sem detalhes)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Barra lateral grande" #: library/library.cpp:80 msgid "Last played" msgstr "Última reprodução" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Última reprodução" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Neste momento, a Last.fm está ocupada. Tente mais tarde" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Palavra-passe Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Número de reproduções Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Etiquetas Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Utilizador Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Wiki da Last.fm" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Faixas favoritas (mas pouco)" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Esquerda" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Duração" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Coleção" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Agrupamento avançado da coleção" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Aviso de análise da coleção" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Pesquisar na coleção" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Restrições" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Ao vivo" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Carregar" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Carregar capa de álbum do URL" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Carregar capa de álbum do URL..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Carregar capa de álbum no disco" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Carregar capa de álbum no disco..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Carregar lista de reprodução" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Carregar lista de reprodução..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "A carregar dispositivo MTP" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "A carregar base de dados iPod" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "A carregar lista de reprodução inteligente" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "A carregar faixas" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "A carregar emissão" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "A carregar faixas" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "A carregar informação das faixas" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "A carregar..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Carregar ficheiros/URL, substituindo a lista de reprodução atual" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Iniciar sessão" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Falha ao iniciar sessão" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Sair" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Perfil para predição (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Gosto" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "Gosto (Last.fm scrobbling)" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Baixa (%1 ips)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Baixa (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Perfil de baixa complexidade (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Letras musicais" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Letras musicais de %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Obter letra nos detalhes ID3v2" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Transferência Magnatune" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Transferência Magnatune concluída" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Perfil principal (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Make it so!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Make it so!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Criar lista de reprodução local" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Resposta inválida" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Configuração manual de proxy" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Manualmente" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Fabricante" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Marcar como reproduzido" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Marcar como novo" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Coincidente com cada termo de pesquisa (E)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Coincidente com um ou mais termos de pesquisa (OU)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Resultados máximos na pesquisa global" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Taxa de dados máxima" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Multimédia alterada. A recarregar..." #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Média (%1 ips)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Média (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Tipo de adesão" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Taxa de dados mínima" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Valor mínimo de memória" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Pré-ajustes projectM em falta" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Modelo" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Monitorizar alterações na coleção" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Reprodução mono" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Meses" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Estado de espírito" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Estilo da barra" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Barras de estado de espírito" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Mais" #: library/library.cpp:84 msgid "Most played" msgstr "Mais reproduzidas" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Ponto de montagem" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Pontos de montagem" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Mover para baixo" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Mover para a coleção..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Mover para cima" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Música" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Coleção de músicas" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Sem áudio" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Meus álbuns" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Minhas músicas" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "As minhas recomendações" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Nome" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Nome" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Opções de nomeação" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Banda estreita (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Proxy de rede" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Rede remota" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Nunca" #: library/library.cpp:74 msgid "Never played" msgstr "Nunca reproduzidas" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Nunca iniciar a reprodução" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Nova pasta" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Nova lista de reprodução" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Nova lista de reprodução inteligente..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Novas faixas" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "As novas faixas serão adicionadas automaticamente" #: library/library.cpp:92 msgid "Newest tracks" msgstr "Faixas recentes" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Seguinte" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Faixa seguinte" #: core/utilities.cpp:151 msgid "Next week" msgstr "Na próxima semana" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Sem analisador" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Sem imagem de fundo" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Nenhuma capa para exportar" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Sem blocos longos" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Sem ocorrências. Limpe a caixa de pesquisa para mostrar toda a lista de reprodução" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Sem blocos curtos" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Nenhum" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Nenhuma das faixas selecionadas eram adequadas à cópia para o dispositivo" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Normal" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Bloco normal" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Não disponível, se estiver a utilizar uma lista de reprodução dinâmica" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Não ligado" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Conteúdo insuficiente" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Fãs insuficientes" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Membros insuficientes" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Vizinhos insuficientes" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Não instalado" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Sessão não iniciada" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Não montado. Clique duas vezes para montar" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Nada encontrado" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Tipo de notificação" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Notificações" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "A reproduzir" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Número de episódios a mostrar" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Antevisão da notificação" #: widgets/osd.cpp:173 msgid "Off" msgstr "Desligado" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "Ligado" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Apenas aceitar ligações de clientes nestes intervalos de IP:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Apenas permitir ligações da rede local" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Mostrar apenas as primeiras" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Opacidade" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Abrir %1 no navegador" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "&Abrir CD áudio..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Abrir um ficheiro OPML" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Abrir um ficheiro OPML..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Abrir um diretório para efetuar a importação" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Abrir dispositivo..." #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Abrir ficheiro..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Abrir no Google Drive" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Abrir numa nova lista de reprodução" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Abrir em nova lista de reprodução" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Abrir no navegador web" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Abrir..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Falha na operação" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Otimizar para taxa de dados" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Otimizar para qualidade" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Opções..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Organizar ficheiros" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Organizar ficheiros..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Organizando ficheiros" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Detalhes originais" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "Ano original" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "Ano original - Álbum" #: library/library.cpp:118 msgid "Original year tag support" msgstr "Suporte ao detalhe Ano original" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Outras opções" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Destino" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Dispositivo" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Opções de saída" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Substituir tudo" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Substituir ficheiros existentes" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Substituir apenas as pequenas" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Proprietário" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Analisando o catálogo Jamendo" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Festa" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Palavra-passe" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Pausa" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Pausa na reprodução" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Em pausa" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Intérprete" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Pixel" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Barra lateral simples" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Reproduzir" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Número de reproduções" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Reproduzir se parado, pausa se em reprodução" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Reproduzir, se não existir qualquer faixa em reprodução" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Reproduzir a .ª faixa da lista de reprodução" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Reproduzir/Pausa" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Reprodução" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Opções do reprodutor" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Lista de reprodução" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Lista de reprodução terminada" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Opções da lista de reprodução" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Tipo de lista de reprodução" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Listas de reprodução" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Feche o navegador e volte ao Clementine" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Estado:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcasts" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Duração do alerta" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Porta" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Amplificador" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Preferências" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Preferências" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Preferências..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Nomes preferidos para as capas de álbum (separados por vírgulas)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Formato áudio preferido" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Taxa de dados preferencial" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Formato preferido" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Serviço Premium" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Pré-ajuste:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Prima a combinação a utilizar para" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Prima uma tecla" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Prima a combinação a utilizar para %1..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "A clicar em \"Anterior\", o reprodutor irá..." #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Opções da notificação" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Antevisão" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Anterior" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Faixa anterior" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Imprimir informações da versão" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Perfil" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Evolução" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Evolução" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psicadélico" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Carregue no botão do Wiiremote" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Colocar faixas aleatoriamente" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Qualidade" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Qualidade" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "A consultar dispositivo..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Gestor da fila" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Colocar em fila as faixas selecionadas" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Colocar esta faixa na fila" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Faixa (volume igual para todas as faixas)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Chuva" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Chuva" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Visualização aleatória" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Atribuir 0 estrelas à faixa atual" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Atribuir 1 estrela à faixa atual" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Atribuir 2 estrelas à faixa atual" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Atribuir 3 estrelas à faixa atual" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Atribuir 4 estrelas à faixa atual" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Atribuir 5 estrelas à faixa atual" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Avaliação" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Realmente cancelar?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Limite de redirecionamento excedido. Verifique a configuração do servidor." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Atualizar catálogo" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Atualizar canais" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Atualizar lista de estações" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Atualizar emissões" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Relativos" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Lembrar cadência do Wii remote" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Lembrar última opção" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Memorizar escolha" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Remover" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Remover ação" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Remover duplicados da lista de reprodução" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Remover pasta" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Remover das Minhas músicas" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Remover dos marcadores" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Remover da lista de reprodução" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Remover lista de reprodução" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Remover listas de reprodução" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Remover da lista de reprodução as faixas indisponíveis" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Mudar nome da lista de reprodução" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Mudar nome da lista de reprodução..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Renumerar faixas por esta ordem..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Repetir" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Repetir álbum" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Repetir lista de reprodução" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Repetir faixa" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Substituir lista de reprodução atual" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Substituir lista de reprodução" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Substituir espaços por \"underscores\"" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Consistência (Replay Gain)" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Modo Replay Gain" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Preencher novamente" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Requer código de autenticação" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Reiniciar" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Reiniciar número de contagens" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Reiniciar a faixa atual e passar para a anterior se clicar novamente" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Reiniciar faixa ou reproduzir a anterior se o tempo de reprodução for inferior a 8 segundos" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Restringir a caracteres ASCII" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Retomar reprodução ao iniciar" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Voltar ao Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Direita" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Extrair" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Extrair CD" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Extrair CD áudio" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Executar" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "Proxy SOCKS" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Erro de negociação SSL. Verifique a configuração do servidor. A opção SSLv3 pode resolver alguns problemas." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Remover dispositivo em segurança" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Depois de copiar, remover dispositivo em segurança" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Frequência" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Frequência" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Guardar ficheiros .mood na coleção de faixas" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Guardar capa de álbum" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Guardar capa de álbum no disco..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Guardar imagem" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Guardar lista de reprodução" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Guardar lista de reprodução" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Guardar lista de reprodução..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Guardar pré-ajuste" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Se possível, gravar avaliação nos detalhes do ficheiro" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Se possível, gravar estatísticas nos detalhes do ficheiro" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Guardar esta emissão no separador Internet" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Guardar estatísticas nos ficheiros" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "A guardar faixas" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Perfil de taxa de amostragem ajustável (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Escala" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Pontuação" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Enviar as faixas que eu oiço" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Pesquisar" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Pesquisar" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Pesquisar estações Icecast" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Pesquisar no Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Pesquisar no Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Pesquisar no Subsconic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Pesquisar automaticamente" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Pesquisar capas de álbuns..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Pesquisar algo" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Pesquisar no gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Pesquisar no iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Modo de pesquisa" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Opções de pesquisa" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Resultados da pesquisa" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Termos de pesquisa" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Segundo nível" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Recuar" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Avançar" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Avançar um tempo relativo na faixa atual" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Avançar para uma posição absoluta na faixa atual" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "Procurar através de uma tecla de atalho" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Todas" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Nenhuma" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Escolha a cor de fundo:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Escolha a imagem de fundo" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Escolha os prováveis" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Escolha a cor do texto:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Escolha as visualizações" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Escolha as visualizações..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Selecionar..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Número de série" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Servidor" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "URL do servidor" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Detalhes do servidor" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Serviço desligado" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Definir %1 para \"%2\"..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Ajustar volume para por cento" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Utilizar valor para todas as faixas selecionadas..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Definições" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Atalho" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Atalho para %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Já existe um atalho para %1" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Mostrar" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Mostrar notificação" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Mostrar animação na faixa reproduzida" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Mostrar estado de espírito na barra de evolução das faixas" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Mostrar notificação do ambiente de trabalho" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Mostrar notificação ao alterar o modo de repetição/desordenação" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Mostrar notificação ao alterar o volume" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Mostrar uma notificação quando eu pauso a reprodução" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Mostrar alerta na área de notificação" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Mostrar notificação personalizada" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Mostrar acima da barra de estado" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Mostrar todas as faixas" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Mostrar todas as faixas" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Mostrar capa de álbum na coleção" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Mostrar separadores" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Mostrar em ecrã completo..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Mostrar grupos nos resultados de pesquisa global" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Mostrar no gestor de ficheiros..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Mostrar na coleção..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Mostrar em vários artistas" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Mostrar barra de estado de espírito" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Mostrar apenas as repetidas" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Mostrar apenas faixas sem detalhes" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Mostrar faixa reproduzida na página de perfil" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Mostrar sugestões de pesquisa" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Mostrar o botão \"Gosto\"" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Mostrar o botão \"Enviar\"" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Mostrar ícone na área de notificação" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Mostrar estado das fontes (ativas ou inativas)" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Mostrar/Ocultar" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Desordenar" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Desordenar álbuns" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Desordenar tudo" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Desordenar lista de reprodução" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Desordenar faixas deste álbum" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Iniciar sessão" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Terminar sessão" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "A iniciar sessão..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Artistas semelhantes" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Tamanho" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Tamanho:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Recuar na lista de reprodução" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Reproduções ignoradas" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Avançar na lista de reprodução" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Ignorar faixas selecionadas" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Ignorar faixa" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Capa de álbum pequena" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Barra lateral pequena" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Lista de reprodução inteligente" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Listas de reprodução inteligentes" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Suave" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Rock suave" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Informações da faixa" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Info da faixa" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonograma" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Desculpe" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Organizar por género (alfabeticamente)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Organizar por género (popularidade)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Organizar por nome de estação" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Organizar faixas por" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Organização" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Fonte" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Fontes" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Erro de autenticação Spotify" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "URL da lista de reprodução Spotify" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Suplemento Spotify" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Suplemento Spotify não instalado" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "URL da faixa Spotify" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Padrão" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Com estrela" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Iniciar extração" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Iniciar lista de reprodução atual" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Iniciar conversão" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Escreva algo na caixa de pesquisa para preencher a lista de resultados" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "A iniciar %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "A iniciar..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Parar" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Parar após" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Parar após cada faixa" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Parar após cada faixa" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Parar após esta faixa" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Parar reprodução" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Parar reprodução após a faixa atual" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Parar reprodução após a faixa: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Parado" #: core/song.cpp:431 msgid "Stream" msgstr "Emissão" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Para receber as emissões do servidor Subsonic, tem que adquirir uma licença após o período experimental de 30 dias." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Emissão" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Subscritores" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Sucesso!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "Escrito com sucesso %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Detalhes sugeridos" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Resumo" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Ultra (%1 ips)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Muito alta (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Formatos suportados" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Sincronizar estatísticas dos ficheiros" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "A sincronizar caixa de entrada Spotify" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "A sincronizar lista de reprodução Spotify" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "A sincronizar faixas Spotify com estrela" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Cores do sistema" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Separadores no topo" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Obtenção de detalhes" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Taxa de dados" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Opções de texto" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Obrigado a" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "O comando \"%1\" não pôde ser iniciado" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "A capa de álbum da faixa em reprodução" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "O diretório %1 é inválido" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "O segundo valor tem que ser superior ao primeiro" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "O sítio web indicado não existe" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "O sítio web indicado não é uma imagem" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "O período de testes do Subsonic terminou. Efetue um donativo para obter uma licença. Consulte subsonic.org para mais detalhes." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Em virtude das funcionalidades abaixo indicadas, o Clementine precisa de efetuar uma nova análise à sua coleção:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Existem outras faixas neste álbum" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Ocorreu um erro ao comunicar com gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Ocorreu um problema ao obter os metadados Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Ocorreu um erro ao processar a resposta da loja iTunes" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Ocorreram alguns problemas as copiar as faixas. Os seguintes ficheiros não foram copiados:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Ocorreram alguns problemas ao eliminar as faixas. Os seguintes ficheiros não foram eliminados:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Estes ficheiros vão ser eliminados do dispositivo. Tem a certeza que quer continuar?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Estes ficheiros serão eliminados permanentemente do disco. Tem a certeza que quer continuar?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Estas pastas vão ser analisadas para criar a sua coleção" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Estas definições são utilizadas na \"Conversão de ficheiros\", no momento anterior à cópia para o dispositivo" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Terceiro nível" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Com esta opção, vai criar uma base de dados que pode atingir os 150 MB.\nTem a certeza que quer continuar?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Este álbum não está disponível no formato solicitado" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Pode alterar esta opção nas preferências" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Este dispositivo deve estar ligado e aberto, para que o Clementine verifique os tipos de formatos suportados" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Este dispositivo tem suporte aos seguintes formatos:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "O dispositivo não vai funcionar corretamente" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Este é um dispositivo MTP, mas o Clementine foi compilado sem suporte a libmtp" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Este é um dispositivo iPod, mas o Clementine foi compilado sem suporte a libgpod" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Esta é a primeira vez que liga este dispositivo. O Clementine vai analisar o dispositivo para encontrar ficheiros de música. Pode levar algum tempo." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Esta opção pode ser alterada nas preferências" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Só os assinantes têm acesso a esta emissão" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Este tipo de dispositivo não é suportado: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "Valor de tempo" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Título" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Hoje" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Alternar notificação" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Trocar para ecrã completo" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Trocar estado da fila" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Alternar envio" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Alternar visibilidade da notificação" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Amanhã" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Demasiados reencaminhamentos" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "As melhores faixas" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Total de álbuns:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Total de dados transferidos" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Total de pedidos efetuados" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Faixa" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Faixas" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Conversão de ficheiros" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Registo do conversor" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Conversão" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "A converter %1 ficheiros com %2 processos" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Opções de conversão" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbina" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Desligar" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Bando ultra larga (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Ligação não estabelecida" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Incapaz de transferir %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Desconhecido" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Conteúdo desconhecido" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Erro desconhecido" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Sem capa" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Não ignorar faixas selecionadas" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Não ignorar faixa" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Cancelar subscrição" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Próximos eventos" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Atualizar" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Atualizar todos os podcasts" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Atualizar pastas alteradas" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Atualizar coleção ao iniciar o Clementine" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Atualizar este podcast" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Atualização" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "A atualizar %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "A atualizar %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "A atualizar coleção" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Utilização" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Se disponível, utilizar os detalhes Artista do álbum" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Utilizar teclas de atalho Gnome" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Utilizar cores psicadélicas" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Se disponível, utilizar consistência de dados (Replay Gain)" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Utilizar SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Utilizar Wii Remote" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Utilizar cores personalizadas" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Utilizar notificações personalizadas" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Utilizar controlo remoto de rede" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Utilizar autenticação" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Utilizar mecanismo de gestão de dados" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Utilizar modo dinâmico" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Utilizar notificações para reportar o estado do Wii Remote" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Utilizar modelação de ruído" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Utilizar definições do sistema" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Utilizar cores do sistema" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Utilizar definições do sistema" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Utilizar normalização de volume" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Utilizado" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Interface de utilizador" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Utilizador" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Ao utilizar o menu para adicionar uma faixa..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Taxa de dados variável" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Vários artistas" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Versão %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Ver" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Modo de visualização" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Visualizações" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Definições das visualizações" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Deteção de voz" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Disco %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Mural" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Avisar ao fechar um separador de lista de reprodução" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Sítio web" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Semanas" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Ao iniciar o Clementine" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Ao procurar pelas capas dos álbuns, o Clementine irá procurar as imagens que possuam uma destas palavras.\nSe não existirem ocorrências, o Clementine utilizará a maior imagem do diretório." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "Ao gravar uma lista de reprodução, os caminhos devem ser" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Se a lista estiver vazia..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Porque não tenta..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Banda larga (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: ativo" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: ligado" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: bateria em estado crítico (%2%)" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: inativo" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: desligado" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: bateria fraca (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media Áudio" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Sem capa:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Pretende mover as outras faixas deste álbum para Vários artistas?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Pretende executar uma nova análise?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Gravar todas as estatísticas nos detalhes dos ficheiros" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Gravar metadados" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Nome de utilizador e/ou palavra-passe inválido(a)" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Ano" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Ano - Álbum" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Anos" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Ontem" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Está prestes a transferir os seguintes álbuns" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Está prestes a eliminar %1 listas de reprodução dos favoritos. Tem a certeza?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Está prestes a remover uma lista de reprodução que não faz parte das suas favoritas. A lista de reprodução será eliminada (esta ação não pode ser anulada).\nTem a certeza de que quer continuar?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Sessão não iniciada" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Sessão iniciada como %1" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Sessão iniciada" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Pode modificar o modo de organização das faixas na coleção" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Pode ouvir músicas gratuitamente, mas só os membros Premium podem ouvir as emissões com uma qualidade superior e sem anúncios" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Pode ouvir as faixa Magnatune sem possuir uma conta. Se aderir ao serviço, a mensagem no final de cada faixa será removida" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Pode ouvir as emissões secundárias, em simultâneo com outras faixas" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Pode utilizar o seu Wii Remote para controlar o Clementine. Consulte o wiki do Clementine para mais informações\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Você não tem uma conta Spotify Premium" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Não tem uma subscrição ativa" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "Não precisa de iniciar a sessão para pesquisar e ouvir as músicas do SoundCloud. Contudo, para aceder às suas listas de reprodução ou emissões tem que iniciar sessão." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Terminou a sessão no Spotify. Reintroduza a sua palavra-passe." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Terminou a sessão no Spotify. Reintroduza a sua palavra-passe." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Você gosta desta faixa" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "Tem que abrir as preferências do sistema e permitir que o Clementine possa \"controlar o seu computador\" para conseguir utilizar os atalhos globais do Clementine." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Se mudar o idioma, tem que reiniciar o Clementine para aplicar as alterações" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "O seu endereço IP:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Os seus dados Last.fm são inválidos" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Os seus dados Magnatune são inválidos" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "A coleção está vazia!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "As suas emissões de rádio" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Os seus envios: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "O seu sistema não possui suporte a OpenGL e as visualizações não estão disponíveis" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Nome de utilizador e/ou palavra-passe inválido(a)" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Plano" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "adicionar %n faixas" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "depois" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "atrás" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "e" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "automático" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "antes" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "entre" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "a maior primeiro" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "contém" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "inativa" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "disco %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "não contém" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "termina com" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "igual a" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "Diretório gpodder.net" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "maior que" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "Atualmente os dispositivos iPod e USB não funcionam no Windows. Desculpe!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "no(s) último(s)" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "menor que" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "a mais longa primeiro" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "mover %n faixas" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "a mais recente primeiro" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "não igual a" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "não nos últimos" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "não ligado" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "a mais antiga primeiro" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "em" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "opções" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "ou processe o código QR!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "prima Enter" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "remover %n faixas" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "a mais curta primeiro" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "desordenar faixas" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "a mais pequena primeiro" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "ordenar faixas" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "inicia com" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "parar" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "faixa %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/pt_BR.po000066400000000000000000005156431260417502300242630ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Alexandro Casanova , 2013-2014 # Amilton Pereira cavalcante , 2013 # bedi1982 , 2012 # carlo giusepe tadei valente sasaki , 2014-2015 # carlo giusepe tadei valente sasaki , 2014 # FIRST AUTHOR , 2010 # Gustavo Brito Sampaio , 2014 # Israel Lins Albuquerque , 2012 # aramaicus , 2013 # Marco Tulio Costa , 2012 # Ricardo Cappellano , 2013,2015 # Alexandro Casanova , 2012 # Weiller Cardoso <>, 2012-2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/davidsansome/clementine/language/pt_BR/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nVocê pode adicionar às favoritas a lista de reprodução clicando no ícone estrela, próximo ao nome da lista de reprodução\n\nLista de reproduções favoritas serão salvas aqui" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "dias" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr " s" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " segundos" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " músicas" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 músicas)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 álbuns" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 dias" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 dias atrás" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 de %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 listas de reprodução (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 selecionado(s) de" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 música" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 músicas" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 músicas encontradas" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 músicas encontradas (Exibindo %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 faixas" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 transferido" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Módulo do dispositivo Wiimote" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 outros ouvintes" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 total de execuções" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n falhou" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n finalizado" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n faltando" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Alinhar texto" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Centro" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Personalizado" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "Extras" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Ajuda" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&Ocultar %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Ocultar..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Esquerda" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "Música" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Nenhum" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "Lista de Reprodução" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Sair" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "&Mode de Repetição" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Direita" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Modo aleatório" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Esticar colunas para ajustar a janela" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Ferramentas" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(diferentes em várias músicas)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", por" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...todos que contribuíram com o Amarok" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 dia" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 faixa" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192.000Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44.100Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48.000Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 faixas aleatórias" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96.000Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Atualizar para versão Premium" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Se não for marcada, Clementine vai tentar salvar suas classificações e outras estatísticas apenas em um banco de dados separado e não modificará seus arquivos..

Se marcado, ele irá salvar as estatísticas, tanto em banco de dados e diretamente no arquivo a cada vez que mudou.

Por favor, note que pode não funcionar para todos os formatos e como não existe um padrão para isso, outros players podem não ser capaz de lê-los.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Anteceda um termo com um nome de campo para limitar a busca a esse campo, por exemplo artista:Bode procura por todos os artistas que contenham a palavra Bode na biblioteca.

Campos disponíveis: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Isso vai escrever a classificação das músicas e estatísticas em tags para todos os arquivos de sua biblioteca músicas.

Isto não é necessário se o "Save classificações e estatísticas em arquivo tags" sempre foi ativada.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Símbolos iniciam com %, por exemplo: %artist %album %title

\n\n

Se você inserir trechos do texto que contem um símbolo com chaves, esta seção será oculta se o símbolo estiver vazio.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "É necessária uma conta Premium Spotify." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Um cliente só pode se conectar se o código correto for digitado." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Uma lista inteligente é uma lista dinâmica de músicas de sua biblioteca. Há diferentes tipos de listas inteligentes que oferecem formas variadas de selecionar músicas." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Uma música será incluída na lista se ela satisfizer estas condições." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "TODA A GLÓRIA PARA O HYPNOTOAD" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Abortar" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Sobre %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Sobre o Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Sobre o Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Absoluto" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Detalhes da conta" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Detalhes da Conta (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Ação" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Ação" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Ativar/desativar Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Fluxo de atividades" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Adicionar Podcast" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Adicionar transmissão" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Adicionar uma nova linha se suportado pelo tipo de notificação" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Adicionar ação" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Adicionar todas as faixas de uma pasta e de suas subpastas" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Adicionar outro canal..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Adicionar diretório..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Adicionar Arquivo" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Adicionar arquivo para conversor" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Adicionar arquivo(s) para conversor" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Adicionar arquivo..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Adicionar arquivos para converter" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Adicionar pasta" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Adicionar pasta..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Adicionar nova pasta..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Adicionar Podcast" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Adicionar Podcast..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Adicionar termo para busca" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Adicionar tag álbum da música" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Adicionar à música a tag artista do álbum" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Adicionar a tag artista da música" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Adicionar avaliação automática da faíxa" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Adicionar a tag compositor da música" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Adicionar a tag disco da música" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Adicionar o nome do arquivo da música" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Adicionar a tag gênero da música" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Adicionar músicas por agrupamento da tag" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Adicionar a tag duração da música" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Adicionar músicas por tag do artista" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Adicionar contagem a reprodução da música" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Adicionar avaliar faixa " #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Adicionar contador de pular música" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Adicionar a tag título da música" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Adicionar música ao cache" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Adicionar a tag faixa da música" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Adicionar a tag ano da música" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Adicionar músicas às \"Minhas músicas\" quando o botão \"Curtir\" for clicado" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Adicionar transmissão..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Adicionar às Minhas músicas" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Adicionar às listas de reprodução do Spotify" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Adicionar ao Spotify com estrela" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Adicionar à outra lista de reprodução" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Adicionar aos favoritos" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Adicionar à lista de reprodução" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Adicionar à fila" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Adicionar usuário/grupo aos favoritos" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Adicionar ação de dispositivo wiimote" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Adicionar..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Adicionado(s) este mês" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Adicionado(s) esta semana" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Adicionado(s) este ano" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Adicionado(s) hoje" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Adicionado(s) há três meses" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Organização avançada..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Depois" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Depois de copiar..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Álbum" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Álbum (volume ideal para todas as faixas)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Artista do álbum" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Capa do Álbum" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Informação do álbum no jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Discos" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Álbuns com capas" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Álbuns sem capas" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Tudo" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Todos os arquivos (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "Toda a Glória para o Hypnotoad!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Todos os álbuns" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Todos os artistas" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Todos os arquivos (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Todas as listas de reprodução (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Todos os tradutores" #: library/library.cpp:98 msgid "All tracks" msgstr "Todas as faixas" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Permitir que um cliente baixe músicas desse computador." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Permitir downloads" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Permitir codificação mid/side" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Juntamente com os originais" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Sempre ocultar a janela principal" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Sempre exibir a janela principal" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Sempre começar tocando" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon Cloud Drive" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Um plugin adicional é necessário para usar Spotify no Clementine. Gostaria de fazer o download e instalá-lo agora?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Ocorreu um erro no carregamento do banco de dados do iTunes" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Ocorreu um erro de escrita de metadados para '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Um erro não especificado ocorreu." #: ui/about.cpp:85 msgid "And:" msgstr "e:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Bravo" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Aparência" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Acrescentar arquivos/sites para a lista de reprodução" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Adicionar à lista de reprodução atual" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Anexar ao fim da lista de reprodução" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Aplicar compressão para prevenir picos" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Tem certeza que deseja apagar a pré-regulagem \"%1\" ?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Você tem certeza que quer limpar as estatísticas dessa música?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Tem certeza de que deseja escrever estatísticas de música em arquivo de músicas para todas as músicas da sua biblioteca?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Artista" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Sobre o Artista" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Tags do artista" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Inicial do artista" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Perguntar ao salvar" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Formato de áudio" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Saída de áudio" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Falha na autenticação" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Autor" #: ui/about.cpp:68 msgid "Authors" msgstr "Autores" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Automático" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Automático" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Atualização automática" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Abrir categorias únicas da árvore da biblioteca automaticamente" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Disponível" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Taxa de bits média" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Tamanho médio de imagem" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "Podcasts BBC" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Sons de fundo" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Cor de fundo" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Imagem de fundo" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Opacidade de fundo" #: core/database.cpp:648 msgid "Backing up database" msgstr "Cópia do banco de dados" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Balanço" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "Excluir (Last.fm scrobbling)" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Barra" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Azul básico" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Tipo de Áudio básico" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Comportamento" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Melhor" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Biografia de %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Taxa de bits" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Taxa de Amostragem" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Taxa de Amostragem" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Analizador de bloco" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Tipo de bloco" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Quantidade borrão" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Conteúdo" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Explosão" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Procurar..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Duração do buffer" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Armazenando em buffer" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Construindo índice do Seafile..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Mas estes recursos estão desabilitados:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Botões" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Suporte a lista CUE" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Localização do cache:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Caching" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "Caching %1" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Cancelar" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Cancelar o download" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "O Captcha é necessário.\nTente logar no Vk.com com seu navegador para resolver esse problema." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Alterar capa" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Mudar tamanho da letra..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Alterar modo de repetição" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Mudar atalho..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Alterar modo aleatório" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "Trocar a música em reprodução" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Alterar idioma" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "As alterações entrarão em vigor quando a próxima música iniciar" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Alterar a saída mono terá efeito para as próximas músicas a serem tocadas" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Procurar por novos episódios" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Verificar se há atualizações" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Procurar por atualizações..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Escolha o diretório do cache do Vk.com" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Escolha um nome para sua lista inteligente" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Escolher automaticamente" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Escolher cor..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Escolher fonte..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Escolher da lista" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Escolha como a lista será organizada e quantas músicas ela conterá." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Escolha a pasta de download de podcasts" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Escolha os serviços de Internet que deseja exibir." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Escolha os sites que você deseja que o Clementine use para buscar letras de música." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Clássica" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Limpando" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Limpar" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Limpar lista de reprodução" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Erro no Clementine" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Clementine Laranja" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Visualização Clementine" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "O Clementine pode converter automaticamente a música que você copiar para o dispositivo no formato que pode ser executado." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "O Clementine pode reproduzir músicas que você enviou para o Amazon Cloud Drive" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "O Clementine pode reproduzir músicas que você enviou para o Box" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine pode tocar a musica que você enviou para o Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "O Clementine pode tocar músicas que você guardou no Google Drive." #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "O Clementine consegue reproduzir músicas armazenadas no OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "O Clementine pode exibir uma mensagem quando a faixa mudar." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "O Clementine pode sincronizar sua lista de seguidores com seus outros computadores e aplicativos podcast. Criar uma conta." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "O Clementine não conseguiu carregar nenhuma visualização do projectM. Verifique se você instalou o Clementine corretamente." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Visualizador de imagens do Clementine" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "O Clementine não conseguiu encontrar resultados para este arquivo" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "O Clementine irá buscar música em:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Clique aqui para adicionar algumas músicas" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Clique aqui para favoritar esta lista de reprodução, para ser salva e permanecer acessível no painel de \"Lista de Reprodução\" da barra lateral esquerda." #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Clique para alternar entre tempo restante e tempo total" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Clicando no botão de Login irá aparecer uma janela do seu navegador. Você pode retornar ao Clementine quando tiver acessado." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Fechar" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Fechar lista de reprodução" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Fechar visualização" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Fechar esta janela cancelará o download" #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Fechar esta janela irá parar a busca por capas de álbuns" #: ui/equalizer.cpp:114 msgid "Club" msgstr "Clube" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Cores" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Lista separada por vírgulas de classe: o nível, o nível é 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Comentário" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Rádio da comunidade" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Completar tags automaticamente" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Preencher tags automaticamente..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Compositor" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Configurar %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Configurar Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Configurar atalhos" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Configurar Spotify..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Configurar Subsonic..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Configurar Vk.com..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Configurar busca global..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Configurar biblioteca..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Configurar podcasts" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Configurar..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Conectar controles remotos do Wii usando ação de ativar/desativar" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Conectar dispositivo" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Conectando ao Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Conexão recusada pelo servidor, verifique a URL do servidor. Exemplo: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Conexão expirou, verifique a URL do servidor. Exemplo: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Problemas com a conexão ou o áudio foi desabilitado pelo proprietário" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Painel" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Taxa de bits constante" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Converter todas as músicas" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Converter qualquer música que o dispositivo não puder tocar" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Converter arquivos de áudio sem perda antes de enviá-los remotamente." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Converter arquivos sem perda" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Copiar url compartilhada para a área de transferência" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Copiar para a área de transferência" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Copiar para o dispositivo..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Copiar para biblioteca..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Copyright" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Não foi possível conectar-se a Subsonic, verificar a URL do servidor. Exemplo: http://localhost:4040/ " #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Incapaz de criar o elemento GStreamer \"%1\" - confira se você possui todos os plugins requeridos pelo GStreamer instalados" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Não foi possível criar a lista de reprodução" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Não foi possível encontrar um multiplexador para %1, verifique se você tem os plugins corretos do GStreamer instalados" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Não foi possível encontrar um codificador para %1, verifique se você tem os plugins corretos do GStreamer instalados" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Não foi possível abrir o arquivo de saída %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Gerenciador de capas" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Capa do album da imagem inserida" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "A capa foi carregada automaticamente a partir de %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Capa manualmente removida" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Capa não definida" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Capa configurada de %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Capas do %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Transição suave quando mudar de faixa automaticamente" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Transição suave quando mudar de faixa manualmente" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Personalizado" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Imagem personalizada:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Configurações de mensagem personalizada" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Personalizado..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "Caminho do DBus" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dance" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Banco de dados corrompido detectado. Por favor, leia https://code.google.com/p/clementine-player/wiki/Database para instruções de como recuperar seu banco de dados" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Data de criação" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Data de modificação" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Dias" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "&Padrão" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Diminuir volume em 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Diminuir o volume por porcentagem " #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Diminuir volume" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Imagem de fundo padrão" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Dispositivo padrão em %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Padrões" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Intervalo entre visualizações" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Apagar" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Apagar dados baixados" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Excluir arquivos" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Apagar do dispositivo..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Apagar do disco..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Apagar episódios reproduzidos" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Apagar pré-regulagem" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Apagar lista inteligente" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Apagar os arquivos originais" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Apagando arquivos" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Retirar faixas selecionadas da fila" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Retirar faixa da fila" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Destino" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Detalhes..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Dispositivo" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Propriedades do dispositivo" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Nome do dispositivo" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Propriedades do dispositivo..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Dispositivos" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Diálogo" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Você quis dizer" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Senha Digitally imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Usuário Digitally importado" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Conexão direta à Internet" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Diretório" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Desativar duração" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Desabilitar criação da moodbar." #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Desativado" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Desativado" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Disco" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Transmissão descontínua" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Opções de exibição" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Mostrar na tela" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Reescanear por completo a biblioteca" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Reescanear completamente" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Reescanear completamente..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Não converter nenhuma música" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Não substituir" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "Ao reescanear por completo, você perderá quaisquer metadados salvos no Clementine, como capas de discos, contagem de reprodução e avaliações. O Clementine reescaneará todas as suas músicas no Google Drive, o que pode demorar algum tempo." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Não repetir" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Não exibir em vários artistas" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Não exibir episódios escutados" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Não embaralhar" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Não parar!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Doar" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Clique duplo para abrir" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "Clique duplo numa música da lista de reprodução irá..." #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Clique duplo em uma música irá..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Baixar %n episódios" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Pasta de download" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Baixar episódios para" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Conta de download" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Baixar automaticamente novos episódios" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Download na fila" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Configurações de download" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Baixar o aplicativo Android" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Baixar este álbum" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Baixar este álbum..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Baixar este episódio" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Baixar..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Baixando (%1%)" #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Baixando diretório Icecast" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Baixando catálogo do Jamendo" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Baixando catálogo da Magnatune" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Baixando plugin Spotify" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Baixando metadados" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Arraste para reposicionar" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dubstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Duração" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Modo dinâmico ligado" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Mix aleatório dinâmico" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Editar lista de reprodução inteligente..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Editar tag \"%1\"..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Editar tag..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Editar tag" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Editar informações da faixa" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Editar informações da faixa..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Editar informações da faixa..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Editar..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "E-mail" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Habilitar suporte a controle remoto do Wii" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Habilitar caching automático" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Habilitar equalizador" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Habilitar atalhos só quando o Clementine tiver foco" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Habilitar edição dos metadados da música com um clique" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Habilitar fontes abaixo para incluí-las nos resultados da pesquisa. | | Os resultados irão aparecer nesta ordem." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Ativar/Desativar Last.fm scrobbling" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Complexidade de codificação" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Qualidade da codificação" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Modo de codificação" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Digite uma URL" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Insira uma URL para fazer baixar uma capa da Internet:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Digite um nome de arquivo para capas exportadas (sem extensão):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Digite um novo nome para esta lista" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Digite os termos da pesquisa acima para buscar por música no seu computador e na internet." #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Digite os termos da busca abaixo para procurar podcasts no iTunes Store" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Digite os termos da busca para procurar podcasts no gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Digite os termos da pesquisa aqui" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Forneça o endereço do site de transmissão de rádio:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Digite o nome da pasta" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Digite este IP no Aplicativo para conectar ao Clementine." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Toda a coletânia" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Equalizador" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Equivalente ao --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Equivalente ao --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Erro" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Erro ao extrair do CD" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Erro ao conectar ao dispositivo MTP" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Erro ao copiar músicas" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Erro ao apagar músicas" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Erro ao baixar o plugin Spotify" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Erro carregando %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Erro carregando a lista de reprodução: di.fm" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Erro processando %1:%2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Erro ao carregar o CD de áudio" #: library/library.cpp:68 msgid "Ever played" msgstr "Já reproduzido" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "A cada 10 minutos" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "A cada 12 horas" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "A cada 2 horas" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "A cada 20 minutos" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "A cada 30 minutos" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "A cada 6 horas" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "A cada hora" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Exceto entre as faixas do mesmo álbum ou lista CUE" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Capas existentes" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Expandir" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Expira em %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Exportar Capas" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Exportar capas" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Exportar capas baixadas" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Exportar capas embutidas" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Exportação terminou" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Exportado %1 capa(s) de %2 (%3 pulado)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Desvanecer ao pausar / Voltar gradualmente ao retomar" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Diminuir o som gradativamente quando terminar uma faixa" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Diminuindo" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Duração da dimunuição" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Falha ao ler o CD" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Falha ao acessar o diretório" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Falha ao acessar os podcasts" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Falha ao abrir o podcast" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Falha ao analisar o XML para essa atualização RSS" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Rápida" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Faixas preferidas" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Buscar as capas que faltam" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Buscar automaticamente" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Atualização concluída" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Buscando biblioteca Subsonic" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Erro ao buscar a capa" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Formato de arquivo" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Extensão de arquivo" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Formatos de arquivo" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Nome de arquivo" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Nome do arquivo (sem pasta)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Padrão do nome de arquivo:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Endereços dos arquivos" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Tamanho do arquivo" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Tipo de arquivo" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Nome do arquivo" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Arquivos" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Arquivos para converter" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Encontrar músicas na sua biblioteca que satisfazem aos critérios que você especificar." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Encontre esse artista" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Registrando a música" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Finalizar" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Primeiro nível" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Ajustar capa à largura" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Tamanho da fonte" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Por motivos de licenciamento, o suporte ao Spotify está em um plugin separado." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Forçar codificação em mono" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Esquecer dispositivo" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Esquecer um dispositivo irá removê-lo desta lista e o Clementine terá que examinar todas as músicas de novo, da próxima vez que você conectá-lo." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Formulário" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Formato" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Quadros por segundo" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Quadros por buffer" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Congelado" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Graves" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Graves + Agudos" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Muito Agudo" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Geral" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Configurações gerais" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Gênero" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Obter uma URL para compartilhar esta música do Spotify" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Obter uma URL para compartilhar esta lista de reprodução" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Adquirindo canais" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Recebendo transmissões" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Nome da transmissão:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Ir" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Ir até a aba do próximo playlist" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Ir até a aba lista de reprodução anterior" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Conseguiu %1 capa(s) de %2 (%3 falharam)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Acinzentar músicas inexistentes na minha lista de reprodução" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Organizar Biblioteca por..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Organizar por" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Organizar por Álbum" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Organizar por Artista" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Organizar por Artista/Álbum" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Organizar por Artista/Ano do Álbum" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Organizar por Gênero/Álbum" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Organizar por Gênero/Artista/Álbum" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Agrupamento" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "A página HTML não contém nenhum RSS" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "Código de status HTTP 3xx recebido sem URL, verificar a configuração do servidor." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "Proxy HTTP" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Feliz" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Informação de hardware" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Informação do hardware só está disponível quando o dispositivo está conectado." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Alta" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Alto (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Alta (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "HipHop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Host não encontrado, verifique a URL do servidor. Exemplo: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Horas" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Eu não tenho uma conta no Magnatune" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Ícone" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Ícones acima" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Identificando música" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Caso ativado, ao clicar numa música na lista de reprodução, você poderá editar diretamente os valores de sua etiqueta." #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Se você continar, este dispositivo funcionará lentamente e as músicas copiadas para ele podem não funcionar." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Se você sabe a URL do podcast, digite abaixo e clique em Ir" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Ignorar o \"The\" em nomes de artistas" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Imagens (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Imagens (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Importar..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "Em %1 dias" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "Em %1 semanas" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "No modo dinâmico, novas faixas serão escolhidas e adicionadas à lista de reprodução toda a vez que uma musica terminar." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Caixa de entrada" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Incluir capa do álbum na notificação" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Incluir todas as músicas" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Versão do protocolo Subsonic REST incompatível. O cliente deve ser atualizado." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Versão do protocolo Subsonic REST incompatível. Servidor deve atualizar." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Configuração incompleta, assegure que todos os campos estão preenchidos." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Aumentar volume em 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Aumentar o volume por porcentagem " #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Aumentar volume" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Indexando %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Informação" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Opções de entrada" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Inserir..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Instalado" #: core/database.cpp:585 msgid "Integrity check" msgstr "Verificar integridade" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Dados da Internet" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Serviços de Internet" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "Introdução das faixas" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Chave API inválida" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Formato inválido" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Método inválido" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Parâmetros inválidos" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Recurso especificado inválido" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Serviço inválido" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Chave de sessão inválida" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Inverter Seleção" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Faixas mais ouvidas do Jamendo" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Faixas principais no Jamendo" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Faixas principais no Jamendo este mês" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Faixas principais no Jamendo esta semana" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Banco de dados Jamendo" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Pular imediatamente para a faixa anterior" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Pular para a faixa em execução" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Manter botões por %1 segundo..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Manter botôes por %1 segundos..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Continuar executando quando a janela é fechada" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Manter arquivos originais" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Gatinhos" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Idioma" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Notebook / fones de ouvido" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Salão Grande" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Capa grande de álbum" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Capa grande de disco (detalhes abaixo)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Capa grande do disco (sem detalhes)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Barra lateral grande" #: library/library.cpp:80 msgid "Last played" msgstr "Última reprodução" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Reproduzida por último" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm está ocupado no momento, por favor tente novamente daqui a alguns minutos" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Senha do Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Número de reproduções do last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Tags do Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Nome de usuário do Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Wiki do last.fm" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Faixas menos preferidas" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Esquerda" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Duração" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Biblioteca" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Organização avançada de biblioteca" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Aviso de reescaneamento da biblioteca" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Busca na biblioteca" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Limites" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Ao vivo" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Carregar" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Carregar capa da URL" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Carregar capa da URL..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Carregar capa do disco" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Carregar capa do disco..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Carregar lista de reprodução" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Carregar lista de reprodução..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Carregando dispositivo MTP" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Carregando banco de dados do iPod" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Carregando lista de reprodução inteligente" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Carregando músicas" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Carregando transmissão" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Carregando faixas" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Carregando informações da faixa" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Carregando..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Carregar arquivos/sites, substiuindo a lista de reprodução atual" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Login" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Falha ao conectar" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Logout" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Perfil de previsão a longo prazo (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Curtir" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "Amar (Last.fm scrobbling)" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Baixo (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Baixa (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Perfil de baixa complexidade (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Letras de música" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Letras de %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Letras da tag ID3v2" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Download do Magnatune" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Download do Magnatune finalizado" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Menu perfil (PRINCIPAL)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Agora!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Faça isso!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Tornar lista de reprodução disponível offline" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Resposta inválida" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Configuração manual de proxy" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Manualmente" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Fabricante" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Marcar como ouvida" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Marcar como nova" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Buscar por todos os termos de pesquisa juntos (E)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Buscar um ou mais termos de pesquisa (OU)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Número máximo de resultados da busca global" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Taxa de bits máxima" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "A mídia foi alterada. Recarregando" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Médio (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Média (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Tipo de conta" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Taxa de bits mínima" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Preenchimento mínimo do buffer" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Pré-definições do projectM faltando" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Modelo" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Vigiar mudanças na biblioteca" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Saída Mono" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Meses" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Modo" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Estilo da moodbar" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Moodbars" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Mais" #: library/library.cpp:84 msgid "Most played" msgstr "Mais tocadas" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Ponto de montagem" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Pontos de montagem" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Para baixo" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Mover para biblioteca..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Para cima" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Música" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Biblioteca de Músicas" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Mudo" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Meus discos" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Minha Música" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Minhas Recomendações" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Nome" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Nome" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Opções de nomes" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Banda baixa (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Proxy da Rede" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Rede Remota" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Nunca" #: library/library.cpp:74 msgid "Never played" msgstr "Nunca tocado" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Nunca iniciar tocando" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Nova pasta" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Nova lista de reprodução" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Nova lista de reprodução inteligente..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Novas músicas" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Novas faixas serão adicionadas automaticamente." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Faixas mais recentes" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Próximo" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Próxima faixa" #: core/utilities.cpp:151 msgid "Next week" msgstr "Próxima semana" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Sem visualização" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Sem imagem de fundo" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Não há capas para exportar." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Sem blocos longos" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Nenhum resultado encontrado. Limpe a caixa de busca para ver a lista de reprodução completa novamente." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Sem blocos curtos" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Nenhum" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Nenhuma das músicas selecionadas estão adequadas para copiar para um dispositivo" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Normal" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Tipo de blocos normal" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Não disponível enquanto uma lista dinâmica estiver em uso" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Desconectado" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Conteúdo insuficiente" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Fãs insuficientes" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Sem membros o bastante" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Sem vizinhos o bastante" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Não instalado" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Não logado" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Não montado - clique duas vezes para montar" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Nada encontrado" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Tipo de notificação" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Notificações" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Reproduzindo Agora" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Número de episódios a serem exibidos" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Pré-visualização de informações na tela" #: widgets/osd.cpp:173 msgid "Off" msgstr "Desligado" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "Ligado" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Aceitar apenas conexões de clientes dentro das faixas de ip:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Permitir somente conexões da rede local" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Só mostrar o primeiro" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Opacidade" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Abrir %1 no browser" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Abrir CD de &áudio..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Abrir arquivo OPML" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Abrir arquivo OPML..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Abrir uma pasta para importar músicas" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Abrir dispositivo" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Abrir arquivo..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Abrir no Google Drive" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Abrir em nova lista de reprodução" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Abrir em nova lista de reprodução" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Abrir no navegador" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Abrir..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "A operação falhou" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Otimizar por taxa de bits" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Otimizar por qualidade" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Opções..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Organizar Arquivos" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Organizar arquivos..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Organizando arquivos" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Tags originais" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "Ano original" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "Ano original - álbum" #: library/library.cpp:118 msgid "Original year tag support" msgstr "Suporte à etiqueta de ano original" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Outras opções" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Saída" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Dispositivo de saída" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Opções de Saída" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Substituir tudo" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Sobrescrever arquivos existentes" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Substituir apenas os menores" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Dono" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Analisando catálogo do Jamendo" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Festa" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Senha" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Pausar" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Pausar reprodução" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Pausado" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Artista" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Pixel" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Barra lateral simples" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Reproduzir" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Número de reproduções" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Reproduzir se estiver parado, pausar se estiver tocando" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Tocar se não houver nada tocando" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Tocar a ª faixa da lista" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Reproduzir/pausar" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Reproduzir" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Opções do player" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Lista de Reprodução" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "A lista de reprodução terminou" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Opções da lista de reprodução" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Tipo de lista de reprodução" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Listas de reprodução" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Por favor, feche seu navegador e volte ao Clementine" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Status do plugin:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcasts" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Duração do aviso" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Porta" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Pré-amplificação" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Preferência" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Preferências" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Preferências..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Nomenclatura para arquivos de capa (separado por vírgulas)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Formato de áudio preferido" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Taxa de bits preferida" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Formato preferido" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Áudio Premium" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Pré-regulagem:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Pressione uma combinação de botões para usar para" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Pressione uma tecla" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Pressione uma combinação de teclas para %1..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Pressionar \"Anterior\" no reprodutor irá..." #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Opções de aviso estilizado" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Pré-visualização" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Anterior" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Faixa anterior" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Imprimir informação da versão" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Perfil" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Andamento" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Progresso" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psicodélico " #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Aperte botão do controle remoto do Wii" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Colocar músicas em ordem aleatória" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Qualidade" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Qualidade" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Consultando dispositivo..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Gerenciador de Fila" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Colocar as faixas selecionadas na fila" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Colocar a faixa na fila" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Rádio (volume igual para todas as faixas)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Chuva" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Chuva" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Visualização aleatória" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Classificar a música atual com 0 estrelas" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Classificar a música atual com 1 estrela" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Classificar a música atual com 2 estrelas" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Classificar a música atual com 3 estrelas" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Classificar a música atual com 4 estrelas" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Classificar a música atual com 5 estrelas" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Avaliação" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Deseja realmente cancelar?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Limite de redirecionamento excedeu, verifique a configuração do servidor." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Atualizar catálogo" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Atualizar canais" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Atualizar lista de estações" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Atualizar transmissões" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Relativo" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Lembrar balanço do Wiimote" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Lembrar a última vez" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Lembrar-se da minha escolha" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Remover" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Remover ação" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Remover duplicados da lista de reprodução" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Remover pasta" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Remover de Minha Música" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Remover dos favoritos" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Remover da lista de reprodução" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Remover lista de reprodução" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Remover listas de reprodução" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Remover faixas indisponíveis da lista de reprodução" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Renomear lista de reprodução" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Renomear lista de reprodução..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Renumerar faixas nesta ordem..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Repetir" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Repetir um álbum" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Repetir lista de reprodução" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Repetir uma faixa" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Substituir lista de reprodução atual" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Substituir a lista de reprodução" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Substituir espaços com sublinhados" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Modo ReplayGain" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Repovoar" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Exigir código de autenticação" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Redefinir" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Limpar contador de reprodução" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Reiniciar a faixa e só pular para a faixa anterior caso seja pressionado novamente" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Reiniciar a faixa, ou reproduzir a faixa anterior, se dentro de 8 segundos começar." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Restringir a caracteres ASCII" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Retomar a reprodução ao iniciar" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Voltar ao Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Direita" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Converter" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Extrair CD" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Extrair CD de áudio" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Executar" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "Proxy SOCKS" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Erro de handshake SSL, verificar a configuração do servidor. Opção SSLv3 abaixo pode solucionar alguns problemas ." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Remover o dispositivo com segurança" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Remover o dispositivo com segurança após copiar" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Taxa de amostragem" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Taxa de amostragem" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Salvar arquivos .mood na sua biblioteca musical." #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Salvar capa do álbum" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Gravar capa para o disco..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Salvar imagem" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Salvar lista de reprodução" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Salvar lista de reprodução" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Salvar lista de reprodução..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Salvar pré-regulagem" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Salvar classificações em tags de arquivos quando possível" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Salvar estatísticas em tags de arquivos quando possível" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Salvar esta transmissão na aba de Internet" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Salvando estatísticas de músicas em arquivos de músicas" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Gravando faixas" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Perfil evolutivo taxa de amostragem (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Tamanho de escala" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Pontuação" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Adicionar ao meu perfil os dados das músicas que eu ouvir" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Pesquisar" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Pesquisar" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Pesquisar estações do Icecast" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Pesquisar Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Pesquisar Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Pesquisa Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Buscar automaticamente" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Procurar por capas dos álbuns..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Busca por qualquer coisa" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Procurar gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Procurar no iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Modo de pesquisa" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Opções de pesquisa" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Resultados da busca" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Termos de pesquisa" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Segundo nível" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Voltar" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Avançar" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Avançar na faixa atual por um tempo relativo" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Avançar na faixa atual para uma posição absoluta" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "Buscar usando um atalho de teclado" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Selecionar Tudo" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Desmarcar Tudo" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Selecione uma cor de fundo:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Escolha uma imagem de fundo" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Selecionar o melhor resultado possível" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Selecione uma cor de frente:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Selecionar visualizações" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Selecione as visualizações..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Selecionar..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Número de série" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Servidor" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "URL do Servidor" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Detalhes do servidor" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Serviço indisponível" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Mudar %1 para \"%2\"..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Mudar volume para por cento" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Mudar o valor para todas as faixas selecionadas..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Configurações" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Atalho" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Atalho para %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Já existe um atalho para %1" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Exibir" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Mostrar aviso na tela" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Mostrar animação na faixa atual" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Exibir a moodbar na barra de progresso." #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Mostrar notificação nativa do sistema" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Mostrar uma notificação quando eu mudar o modo repetir/aleatório" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Mostrar notificação quando mudar o volume" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Exibir uma notificação ao pausar a reprodução" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Mostrar uma notificação na área de notificação" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Mostrar aviso estilizado na tela" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Mostrar acima da barra de status" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Mostrar todas as músicas" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Mostrar todas as músicas" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Mostrar capa na biblioteca" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Mostrar divisores" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Exibir em tamanho real..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Exibir grupos no resultado da busca global" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Mostrar no navegador de arquivos..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Mostrar na biblioteca..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Exibir em vários artistas" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Exibir moodbar" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Mostrar somente os duplicados" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Mostrar somente os sem tag" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Exibe a música em execução em sua página" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Exibir sugestões de busca" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Exibir o botão \"Curtir\"" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Mostrar o botão scrobble na janela principal" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Exibir ícone na área de notificação" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Exibir quais fontes estão habilitadas ou não." #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Mostrar/Ocultar" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Aleatória" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Embaralhar albuns" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Embaralhar tudo" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Embaralhar lista de reprodução" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Embaralhar faixas dos albuns" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Cadastrar" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Sair" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Conectando..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Artistas similares" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Tamanho" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Tamanho:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Pular para a música anterior da lista" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Número de pulos" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Pular para a próxima música da lista" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Pular faixas selecionadas" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Pular faixa" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Capa pequena de álbum" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Barra lateral compacta" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Lista de reprodução inteligente" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Listas de reprodução inteligentes" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Suave" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Informações da Música" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Sobre a Música" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonograma" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Desculpe" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Organizar por gênero (alfabeticamente)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Organizar por gênero (popularidade)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Organizar por nome da estação" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Organizar músicas por" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Organizando" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Fonte" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Fontes" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Erro ao conectar no Spotify" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "URL da lista de reprodução do Spotify" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Plugin Spofity" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Plugin Spofity não instalado" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "URL da música do Spotify" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Padrão" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Favoritos" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Iniciar conversão" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Iniciar a lista que está em execução" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Começar conversão" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Comece a digitar algo na caixa de pesquisa para preencher esta lista de resultados." #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Iniciando %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Iniciando..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Parar" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Parar depois" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Parar depois de cada faixa" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Parar depois de todas as faixas" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Parar depois desta música" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Parar reprodução" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Parar reprodução depois da música atual" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Parar de reproduzir depois desta faixa: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Parado" #: core/song.cpp:431 msgid "Stream" msgstr "Transmissão" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Steaming de um servidor Subsonic requer uma licença valida do servidor, depois de 30 dias do período de teste." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Conta de transmissão multimídia" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Seguidores" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Êxito!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "%1 gravado com sucesso" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Tags sugeridas" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Resumo" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Super alto (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Super alta (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Formatos suportados" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Sincronizar as estatísticas de arquivos agora" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Sincronizando caixa de entrada do Spotify" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Sincronizando listas de reprodução do Spotify" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Sincronizando faixas favoritas do Spotify" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Cores do Sistema" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Mostrar abas no topo" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Buscador de tag" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Taxa de bits alvo" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Opções de texto" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Agradecimentos a" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "O comando \"%1\" não pôde ser iniciado." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "A capa do álbum da música atual" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "O diretório %1 não é válido" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "O segundo valor tem que ser maior que o primeiro!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "O site que você pediu não existe!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "O site que você pediu não é uma imagem!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "O período de testes para o servidor Subsonic acabou. Por favor, doe para obter uma chave de licença. Visite subsonic.org para mais detalhes." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "A versão do Clementine para a qual você atualizou requer um reescaneamento completo da biblioteca por causa dos novos recursos listados abaixo:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Há outras músicas neste álbum" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Houve um problema com a comunicação com o gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Houve um problema ao buscar os metadados do Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Houve um problema ao obter resposta do iTunes Store" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Houve problemas na cópia de algumas músicas. Os seguintes arquivos não puderam ser copiados:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Houve problemas ao deletar algumas músicas. Os seguintes arquivos não puderam ser deletados:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Estes arquivos serão deletados do dispositivo, tem certeza que deseja continuar?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Esses arquivos serão permanentemente excluídos do disco, deseja continuar?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "As pastas serão escaneadas em busca de músicas para montar sua biblioteca" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Essas configurações são usadas na \"Conversão de Músicas\" e, ao converter a música antes de copiar para um dispositivo." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Terceiro nível" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Essa ação criará um banco de dados que pode ter mais de 150 MB.\nDeseja continuar mesmo assim?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Este álbum não encontra-se disponível no formato requerido" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Isso pode ser alterado posteriormente nas configurações" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "O dispositivo deve estar conectado e aberto antes que o Clementine possa ver que formatos de arquivo ele suporta." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Este dispositivo suporta os seguintes formatos de arquivo:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Este dispositivo não funcionará corretamente" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Este é um dispositivo MTP, mas você compilou o Clementine sem suporte a libmtp" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Este é um iPod, mas você compilou o Clementine sem suporte a libgpod" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Esta é a primeira vez que você conecta este dispositivo. O Clementine vai escaneá-lo agora para achar músicas - isso pode levar algum tempo." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Essa opção pode ser alterada nas preferências de \"Comportamento\"" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Este canal é apenas para assinantes" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Este tipo de dispositivo não é suportado: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "Intervalo de tempo" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Tí­tulo" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Hoje" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Ativar/desativar Pretty OSD" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Ativar/desativar tela cheia" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Mudar status da fila" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Ativar/desativar scrobbling" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Ativar/desativar visibilidade das notificações em modo bonito" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Amanhã" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Muitos redirecionamentos" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Faixas Top." #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Total de albuns:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Total de bytes transferido" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Total de requisições de rede feitas" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Faixa" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Faixas" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Converter Música" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Log do conversor" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Conversão" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Convertendo %1 arquivos usando %2 núcleos" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Opção de conversão" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbina" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Desligar" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "Site(s)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Banda ultralarga (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Incapaz de conectar" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Não foi possível baixar %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Desconhecido" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Tipo de conteúdo desconhecido" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Erro desconhecido" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Capa não fixada" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Não pular faixas selecionadas" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Não pular faixa" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Desinscrever" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Próximos shows" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Update" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Atualizar todos os podcasts" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Atualizar pastas da biblioteca modificadas" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Atualizar a biblioteca quando o Clementine iniciar" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Atualizar este podcast" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Atualizando" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Atualizando %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Atualizando %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Atualizando biblioteca" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Utilização" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Usar tag artista-álbum quando disponível" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Usar teclas de atalho do Gnome" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Usar cores psicodélicas" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Usar metadados Replay Gain, se estiver disponível" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Usar SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Usar Wiimote" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Usar cores personalizadas" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Usar uma mensagem personalizada para notificações" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Usar um controle remoto de rede" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Usar autenticação" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Configurar taxa de bits" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Usar modo dinâmico" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Usar notificações para avisar o status do Wiimote" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Usar padronização de ruídos temporais" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Usar padrão do sistema" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Usar cores do sistema" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Usar configurações de proxy do sistema" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Usar normalização de volume" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Usado" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Interface" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Nome de usuário" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Usar o menu para adicionar uma música irá..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "MP3 com VBR" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Taxa de bits variável" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Vários artistas" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Versão %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Exibir" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Modo de visualização" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Visualizações" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Configurações de visualização" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Detecção de atividade de voz" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Volume %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Muro" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Avisar-me quando fechar uma guia de lista de reprodução" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Website" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Semanas" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Quando o Clementine iniciar" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Ao procurar por capas de discos, o Clementine primeiro procurará por arquivos que contenham uma destas palavras.\nSe não houver resultados, ele usará a maior imagem no diretório." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "Ao salvar uma lista de reprodução, os endereços dos arquivos devem ser" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Quando a lista está vazia..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Por que não tentar..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Banda larga (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: ativado" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: conectado" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: bateria crítica (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: desativado" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: desconectado" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: bateria fraca (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Áudio do Windows Media" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Sem capas:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Gostaria de mover as outras músicas deste álbum para Vários Artistas?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Gostaria de realizar um reescaneamento completo agora?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Escrever todas as estatísticas de músicas em arquivos de canções" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Escrever metadados" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Nome de usuário ou senha incorreta." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Ano" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Ano - Álbum" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Anos" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Ontem" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Você fará o download dos seguintes álbuns" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Você está prestes a apagar %1 listas de seus favoritos, tem certeza?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Você está prestes a remover uma lista de reprodução que não é parte de suas listas de reproduções favoritas: a lista de reprodução será removida (esta ação não pode ser desfeita).\nDeseja continuar?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Você não está logado." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Você está logado como %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Você está logado." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Você pode mudar a forma de organização das músicas na biblioteca." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Você pode ouvir de graça sem uma conta, mas os membros Premium podem ouvir transmissões de alta qualidade, sem propagandas." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Você pode ouvir as músicas do Magnatune de graça, sem uma conta. Comprando uma assinatura as mensagens no final de cada faixa serão removidas." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Você pode ouvir sons de fundo ao mesmo tempo que ouve uma música." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Você pode usar seu Wii Remote como controle remoto do Clementine. Veja a página na wiki do Clementine para mais informações.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Você não tem uma conta Spotify Premium." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Você não possui um cadastro ativo." #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "Você não precisa estar logado para procurar e ouvir músicas no SoundCloud. Porém, você precisa se logar para acessar suas listas de reprodução e seu fluxo." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Você foi desconectado do Spotify, por favor re-digite sua senha na caixa de diálogo Configurações." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Você foi desconectado do Spotify, por favor re-digite sua senha." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Você curtiu essa faixa" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "Você deve iniciar as Preferências do Sistema e permitir que o Clementine \"controle o seu computador\" para poder usar atalhos globais no Clementine." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Você precisará reiniciar o Clementine se mudar o idioma." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Seu endereço de IP:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Suas credencias do Last.fm estavam incorretas" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Suas credenciais do Magnatune estão incorretas" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Sua biblioteca está vazia!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Seus canais de rádio" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Seus scrobbles: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Seu sistema não tem suporte ao OpenGL, as visualizações estão indisponíveis." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Usuário e/ou senha inválidos" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "Adicionar %n músicas" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "após" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "atrás" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "e" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "automático" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "antes" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "entre" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "maiores primeiro" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "contém" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "desabilitado" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "disco %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "não contém" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "termina com" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "iguais" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "Diretório gpodder.net" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "maior que" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "iPods e dispositivos USB atualmente não funcionam no Windows. Desculpe!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "nos últimos" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "menor que" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "mais longas primeiro" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "mover %n músicas" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "mais novas primeiro" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "não equivale" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "não no final" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "desligado" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "mais antigas primeiro" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "ligado" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "opções" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "ou escanear um código QR!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "Pressione enter" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "Remover %n músicas" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "mais curtas primeiro" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "músicas aleatórias" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "menores primeiro" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "Classificação das músicas" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "começa com" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "parar" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "faixa %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/ro.po000066400000000000000000005116371260417502300236740ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # arnaudbienner , 2011 # arnaudbienner , 2011 # AzuraMeta , 2011 # AzuraMeta , 2011 # Marius , 2013 # Daniel Șerbănescu , 2014 # Daniel Șerbănescu , 2014 # FIRST AUTHOR , 2010 # ilixandr , 2014 # Marius , 2013 # titus , 2014-2015 # titus , 2014 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Romanian (http://www.transifex.com/davidsansome/clementine/language/ro/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ro\n" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nPuteți adăuga listele de redare la favorite apăsând miniatura stea de lângă numele listei de redare\n\nListele de redare favorite vor fi salvate aici" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "zile" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr "ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr "pct" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr " s" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " secunde" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " melodii" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 melodii)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 albume" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 zile" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 zile în urmă" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 pe %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 liste de redare (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 selectat din" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 melodie" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 melodii" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 melodii găsite" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 melodii găsite (se afișează %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 piste" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 transferat" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: modul Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 alți ascultători" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 redări în total" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%nume fișier%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n eșuat" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n finalizat" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n rămas" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Aliniază textul" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Centrat" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Personalizat" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "&Extra" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Ajutor" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&Ascunde %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Ascunde..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Stânga" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "&Muzică" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Nimic" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "&Listă de redare" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Termină" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "&Mod repetare" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Dreapta" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "&Mod aleator" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Îngustează coloanele pentru a se potrivi în fereastră" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Unelte" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(diferit în cadrul mai multor melodii)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", de " #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...și tuturor contribuitorilor Amarok" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 zi" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 pistă" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192,000Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44,100Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48,000Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 de piste aleatoare" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96,000Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Actualizează acum la Premium" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Daca optiunea nu este bifata, Clementine va incerca sa va salvaze ratingurile si alte statistici doar intr-o baza de date separata si nu va va modifica fisierele.

Daca optiunea este bifata, statisticile vor fi salvate atat in baza de data, cat si direct in fisier de fiecare data cand acestea se modifica.

Va rugam sa tineti cont ca s-ar putea sa nu functioneze pentru toate formatele si ca, din cauza absentei unui standard, alte playere ar putea sa nu le poata citi.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Asociati un cuvant impreuna cu numele unui camp pentru a limita cautarea strict la acel camp, de exemplu artist:Bode cauta in librarie toti artisti ale caror nume contin cuvantul Bode.

Campuri disponibile: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Aceasta va scrie ratingurile si statisticile melodiilor in etichetele fisierelor pentru toate melodiile din libraria dumneavoastra.

Aceasta actiune nu este necesara daca optiunea "Salveaza ratingurile si statisticile in etivhetele fisierelor" est activa.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Jetoanele încep cu%, de exemplu:% artist %album %titlu \n\n

Dacă încadrați secțiuni de text care conțin un jeton cu bucle-acolade, acea secțiune va fi ascunsă dacă jetonul este gol." #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Este necesar un cont Spotify Premium." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Se poate conecta numai un singur client, dacă a fost introdus codul corect." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "O listă de redare inteligentă este o listă dinamică de melodii care vin din bibliotecă. Există diferite tipuri de liste de redare inteligente care oferă moduri diferite de selectare melodii." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "O melodie va fi inclusă în lista de redare dacă îndeplinește aceste condiții." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "TOATĂ SLAVA HYPNOTOADULUI" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Anulează" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Despre %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Despre Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Despre Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Absolut" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Detalii cont" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Detalii cont (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Acțiune" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Acțiune" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Activează/dezactivează Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Activități flux" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Adaugă podcast" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Adaugă flux" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Adaugă o linie nouă dacă este acceptată de tipul de notificare" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Adaugă acțiune" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Adaugă toate pistele dintr-un director și din toate subdirectoarele sale" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Adaugă alt flux..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Adaugă director..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Adaugă fișier" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Adaugă fișier la transcodificator" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Adaugă fișier(e) la transcodificator" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Adaugă fișier..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Adaugă fișiere pentru transcodificat" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Adaugă dosar" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Adaugă dosar..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Adaugă dosar nou..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Adaugă podcast" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Adaugă podcast..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Adaugă termen de căutare" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Adaugă eticheta albumului melodiei" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Adaugă eticheta artistului albumului melodiei" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Adaugă eticheta artistului melodiei" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Adaugă melodiei scor automat" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Adaugă eticheta compozitorului melodiei" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Adaugă eticheta discului melodiei" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Adaugă numele de fișier al melodiei" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Adaugă eticheta genului melodiei" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Adaugă melodiei eticheta grupării" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Adaugă eticheta lungimii melodiei" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Adaugă melodiei eticheta interpretului" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Adaugă numărul de redări ale melodiei" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Adaugă evaluare melodie" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Adaugă numărul de omiteri melodie" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Adaugă eticheta titlului melodiei" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Adaugă melodie din cache" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Adaugă eticheta piesei" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Adaugă eticheta anului melodiei" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Adaugă melodiile la \"Muzica mea\" când este apăsat butonul \"Iubește\"" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Adaugă flux..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Adaugă la Muzica mea" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Adaugă la listele de redare Spotify" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Adaugă la altă listă de redare" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Adaugă la semnele de carte" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Adaugă în lista de redare" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Adaugă la coadă" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Adaugă utilizator/grup la semne de carte" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Adaugă acțiune wiimotedev" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Adaugă..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Adăugat luna aceasta" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Adăugat săptămâna aceasta" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Adăugat anul acesta" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Adăugat azi" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Adăugat în ultimele trei luni" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Grupare avansată..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "După" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "După copiere..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Album (efect loudness ideal pentru toate pistele)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Artist album" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Copertă album" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Informații album pe jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Albume" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Albume cu coperți" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Albume fără coperți" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Toate" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Toate fișierele (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "Toată slava Hypnotoadului!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Toate albumele" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Toți artiștii" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Toate fișierele (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Toate listele de redare (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Toți traducătorii" #: library/library.cpp:98 msgid "All tracks" msgstr "Toate pistele" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Permite unui client să descarce muzică din acest computer." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Permite descărcări" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Permite codarea mijloc/părți" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Lângă originale" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Ascunde întotdeauna fereastra principală" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Arată întotdeauna fereastra principală" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Întotdeauna pornește redarea" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon Cloud Drive" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Este necesar un modul suplimentar pentru utilizarea Spotify în Clementine. Doriți să fie descărcat și instalat acum?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "A apărut o eroare la încărcarea bazei de date iTunes" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "A apărut o eroare la scrierea metadatei la '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "A intervenit o eroare neașteptată." #: ui/about.cpp:85 msgid "And:" msgstr "Și:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Furios" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Aspect" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Adaugă fișiere/URL-uri în lista de redare" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Adaugă în lista de redare curentă" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Adaugă în lista de redare" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Aplicați compresia pentru a preveni tăierea" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Sigur doriți să ștergeți preconfigurarea \"%1\"?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Sigur doriți să resetați statisticile acestei melodii?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Sunteți sigur că doriți să scrieți statisticile melodiei în fișierul melodiei pentru toate melodiile din biblioteca dumneavoastră?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Artist" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Info artist" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Etichetele artistului" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Inițiala artistului" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Întreabă când se salvează" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Format audio" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Ieșire audio" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Autentificarea a eșuat" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Autor" #: ui/about.cpp:68 msgid "Authors" msgstr "Autori" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Automat" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Automat" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Actualizare automată" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Deschide automat categorii singure din bibliotecă" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Disponibil" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Rată de biți medie" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Dimensiunea medie a imaginii" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "Podcast-uri BBC" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Fluxuri de fundal" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Culoare de fundal" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Imagine de fundal" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Opacitate fundal" #: core/database.cpp:648 msgid "Backing up database" msgstr "Se creează copia de rezervă a bazei de date" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Balans" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Analizor bare" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Albastru de bază" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Tip audio de bază" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Comportament" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Optim" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Biografie de la %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Rată de biți" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Rată de biți" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Rată de biți" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Analizor blocuri" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Tip bloc" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Valoare neclara" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Corp" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Analizor Boom" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Navighează..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Durată memorie tampon" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Se încarcă memoria tampon" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Dar aceste surse sunt dezactivate:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Butoane" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Suport jurnal CUE" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Cale cache:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Memorare in cache" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "Memorare in cache a %1" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Anulare" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Anuleaza decarcarea" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Este necesar captcha.\nÎncercați să vă autentificați la Vk.com cu navigatorul, pentru a repara această problemă." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Schimbă coperta" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Schimbă dimensiunea fontului..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Schimba modul repetiție" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Schimbă scurtătura..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Schimbă modul amestecare" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Schimbă limba" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Modificările preferinței redării mono vor avea efect pentru melodiile redate ulterior" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Verifică după episoade noi" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Verifică după actualizări" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Verifică după actualizări..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Alegeți directorul cache pentru Vk.com" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Alegeți un nume pentru lista de redare inteligentă" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Alege automat" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Alegeți culoare..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Alegeți font..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Alegeți din listă" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Alegeți cum este sortată lista de redare și câte melodii va conține." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Alegeți directorulo de descărcare pentru podcast-uri" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Alegeți serviciile de internet care doriți să fie arătate." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Alegeți paginile web pe care doriți ca Clementine să le folosească pentru a căuta versuri." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Clasic" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Curățare" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Curăță" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Curăță lista de redare" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Eroare Clementine" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Clementine portocaliu" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Vizualizare Clementine" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine poate converti automat muzica copiată pe acest dispozitiv într-un format pe care îl poate reda." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine poate reda muzica pe care ați încărcat-o pe Box" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine poate reda muzica pe care ați încărcat-o pe Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine poate reda muzica pe care ați încărcat-o pe Google Drive " #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine poate reda muzica pe care ați încărcat-o pe OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine poate afișa un mesaj când se schimbă pista." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine poate sincroniza lista dumneavoastră de abonamente cu alte calculatoare ale dumneavoastră și aplicații podcast. Creați-vă un cont." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine nu a putut încărca nici o vizualizare projectM. Verificați dacă ați instalat corect Clementine." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Vizualizator de imagini Clementine" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine nu a reușit să găsească rezultate pentru acest fișier" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine va găsi muzica în:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Apăsați aici pentru a adăuga niște muzică" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Apăsați aici pentru a marca această listă de redare astfel va fi salvată și va rămâne accesibilă prin panoul \"Liste de redare\" pe bara laterală din stânga" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Apăsați aici pentru a comuta între timpul rămas și durata totală" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Apăsând butonul de autentificare se va deschide un navigator web. Ar trebui să reveniți la Clementine după ce v-ați autentificat." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Închide" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Închide lista de redare" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Închide vizualizarea" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Închiderea acestei ferestre va anula descărcarea." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Închizând această ferestră se va opri căutarea coperților pentru album." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Culori" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Listă separată prin virgulă de clasă:nivel, nivelul este 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Comentariu" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Radio comunitar" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Completează etichetele automat" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Completează etichetele automat..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Compozitor" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Configurați %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Configurați Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Configurați scurtături" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Configurați Spotify..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Configurați Subsonic..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Configurați Vk.com..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Configurați căutarea globală..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Configurați biblioteca..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Configurați podcast-uri..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Configurați..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Conectează telecomenzile Wii folosind acțiunea activare/dezactivare" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Conectează dispozitiv" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Se conectează la Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Conexiune refuzată de server, verificați adresa URL a serverului. Exemplu: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Conexiunea a expirat, verificați adresa URL a serverului. Exemplu: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Probleme cu conexiunea sau audio este dezactivat de către proprietar" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Consolă" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Rată de biți constantă" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Convertește toată muzica" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Convertește orice muzică pe care nu o poate reda dispozitivul" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Convertiți fișierele audio fără pierdere, înainte de trimiterea lor la distanță." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Convertește fișiere fără pierdere" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Copiază în memoria temporară url-ul partajat" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Copiază în memoria temporară" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Copiază pe dispozitiv..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Copiază în bibliotecă..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Drept de autor" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Nu se poate conecta la Subsonic, verificați adresa URL a serverului. Exemplu: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Nu se poate creea elementului GStreamer \"%1\" - asigurați-vă că aveți toate modulele GStreamer necesare instalate" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Nu se poate crea lista de redare" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Nu s-a putut găsi un mixer pentru %1, verificați dacă aveți instalate modulele corecte GStreamer" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Nu s-a putut găsi un codor pentru %1, verificați dacă aveți instalate modulele GStreamer corecte" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Nu s-a putut deschide fișierul de ieșire %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Gestionar de coperți" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Coperta din imaginea încorporată" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Coperta încărcată automat de la %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Deselectează manual coperta" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Coperta nu este stabilită" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Copertă stabilită de la %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Coperte de la %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Estompare-încrucișată când se schimbă automat pistele" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Estompare-încrucișată când se schimbă manual pistele" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Personalizat" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Imagine personalizată:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Configurări mesaj personalizat" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Personalizat..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "Cale DBus" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dance" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "S-a detectat corupția bazei de date. Citiți https://code.google.com/p/clementine-player/wiki/DatabaseCorruption pentru instrucțiuni cum puteți recupera baza de date" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Data creării" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Data modificării" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Zile" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "Im&plicit" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Scade volumul cu 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Scade volumul cu procent" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Scade volumul" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Imagine de fundal implicită" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Dispozitiv implicit pe %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Implicite" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Întârziere între vizualizări" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Șterge" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Șterge datele descărcate" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Șterge fișiere" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Șterge de pe dispozitiv..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Șterge de pe disc..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Șterge episoadele redate" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Șterge preconfigurarea" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Șterge lista de redare inteligentă" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Șterge fișierele originale" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Se șterg fișierele" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Elimină din coadă melodiile selectate" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Elimină din coadă pista" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Destinație" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Detalii..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Dispozitiv" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Proprietățile dispozitivului" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Nume dispozitiv" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Proprietăți dispozitiv..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Dispozitive" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Dialog" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Ați vrut să spuneți" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Parolă Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Nume de utilizator Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Conexiune directă la internet" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Director" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Dezactivează durata" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Dezactivare generația barelor dispoziție" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Dezactivat" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Dezactivat" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Disc" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Transmisie discontinuă" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Afișează opțiunile" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Afișează afișarea pe ecran" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Fă o rescanare completa a bibliotecii" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Fă o rescanare completă" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Fă o rescanare completă..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Nu converti nici o muzică" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Nu suprascrie" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "O rescanare completa va distruge orice metadate pe care le-ati salvat in Clementine, precum coperta, numarul de redari si evaluarile. Clementine va scana toate fisierele muzicale din Google Drive, iar aceasta va dura ceva timp." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Nu repeta" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Nu arăta în artiști diferiți" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Nu arata episoadele ascultate" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Nu amesteca" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Nu opri!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Donați" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Dublu clic pentru a deschide" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Dublu clic pe o melodie va..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Descarcă %n episoade" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Descarcă directorul" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Descarcă episoadele la" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Descarcă membru" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Descarcă automat noile episoade" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Descarcă coada" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Descărcere configurări" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Descarcă aplicația Android" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Descarcă acest album" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Descarcă acest album..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Descarcă acest episod" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Descărcare..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Se descarcă (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Descărcare directorul Icecast" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Se descarcă acest catalog Jamendo" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Se descarcă acest catalog Magnatune" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Se descarcă modulul Spotify" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Se descarcă metadata" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Trage pentru a repoziționa" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dubstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Durată" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Modul dinamic este pornit" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Mixare aleatoare dinamică" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Editare listă de redare inteligentă..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Editare eticheta \"%1\"..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Editare etichetă..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Editare etichete" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Editare informație pistă" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Editare informație pistă..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Editare informație piste..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Editare..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "Email" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Activare suport Wii Remote" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Activeaza cachingul automat" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Activare egalizator" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Activează scurtăturile numai când Clementine este focalizat" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Activati editarea inline a melodiilor prin click" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Activați sursele de mai jos pentru a le include în rezultatul căutării. Rezultatele vor fi afișate în această ordine." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Activează/dezactivează scrobbling Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Complexitate codare" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Calitate motor de codare" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Mod codare" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Introduceți o adresă URL" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Introduce o adresă URL pentru a descărca o copertă de pe internet:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Introduceți un nume de fișier pentru coperțile exportate (fără extensie):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Introduceți un nume nou pentru această listă de redare" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Introduceți termenii de căutare de mai sus pentru a găsi melodii pe computer și pe internet" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Introduceți termeni de căutare mai jos pentru a găsi podcast-uri în iTunes Store" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Introduceți termeni de căutare mai jos pentru a găsi podcast-uri pe gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Introduceți aici termenii de căutare" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Introduceți adresa URL a unui flux radio de pe internet:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Introduceți numele dosarului" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Introduceți acest IP în aplicație pentru conectarea la Clementine." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Toată colecția" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Egalizator" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Echivalent cu --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Echivalent cu --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Eroare" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Eroare la extragerea CD-ului" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Eroare conectare dispozitiv MTP" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Eroare copiere melodii" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Eroare ștergere melodii" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Eroare la descărcarea modulului Spotify" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Eroare încărcare %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Eroare încărcarea listă de redare di.fm" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Eroare procesare %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Eroare la încărcarea CD-ului audio" #: library/library.cpp:68 msgid "Ever played" msgstr "Redate vreodată" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "La fiecare 10 minute" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "La fiecare 12 ore" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "La fiecare 2 ore" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "La fiecare 20 de minute" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "La fiecare 30 de minute" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "La fiecare 6 ore" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "La fiecare oră" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Excepție între pistele de pe același album sau în aceeași filă CUE" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Coperți existente" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Extinde" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Expiră pe %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Exportă coperți" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Exportă coperți" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Exportă coperțile descărcate" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Exportă coperțile incluse" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Export terminat" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "S-a exportat %1 coperți din %2 (%3 omise)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Estompare ieșire la pauzare / estompare intrare la reluare" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Estompare ieșire la oprirea unei piese" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Se estompează" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Durata estompării" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "A eșuat citirea unității CD" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "A eșuat preluarea directorului" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "A eșuat preluarea podcast-urilor" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "A eșuat încărcarea podcast-ului" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "A eșuat interpretarea XML pentru acest flux RSS" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Rapid" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Piste favorite" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Preluare coperți lipsă" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Preluare automată" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Preluare finalizată" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Se preia biblioteca Subsonic" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Eroare preluare copertă" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Format fișier" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Extensie fișier" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Formate fișier" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Nume fișier" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Nume fișier (fără cale)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Model nume fișier:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Căi fișier" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Dimensiune fișier" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Tip fișier" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Nume fișier" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Fișiere" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Fișiere pentru transcodificare" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Căutați melodii în biblioteca dumneavoastră care se potrivesc cu criteriul specificat." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Găsește acest artist" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Amprentare melodie" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Sfârșit" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Primul nivel" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Ajusteaza coperta in functie de latime" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Dimensiune font" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Din motive de licență, suportul pentru Spotify este într-un modul separat." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Forțează codarea mono" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Uită dispozitivul" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Uitarea unui dispozitiv va determina inlaturarea lui din aceasta lista, iar Clementine va trebui sa rescaneze toate melodiile atunci cand il veti reconecta." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Formular" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Format" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Rată de cadre" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Cadre pe memoria tampon" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Înghețat" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Bass complet" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Bas complet + Înalte" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Înalte complet" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "General" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Configurări generale" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Gen" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Obtine un URL pentru a distribui aceasta melodie Spotify" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Obtine un URL pentru a distribui aceasta lista de redare" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Obținere canalele" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Obținere fluxuri" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Dați-i un nume:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Mergi" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Mergi la fila listei de redare următoare" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Mergi la fila listei de redare anterioare" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "S-au exportat %1 coperte din %2 (%3 omise) " #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Colorează în gri melodiile inexistente în listele mele de redare" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Grupează biblioteca după..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Grupează după" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Grupează după album" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Grupează după artist" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Grupează după artist/album" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Grupează după artist/an - album" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Grupează după gen/album" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Grupează după gen/artist/album" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Gruparea" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "Pagina HTML nu conține nici un flux RSS" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "A fost receptionat codul de stare HTTP 3xx fara URL, verificati configuratia serverului." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "Proxy HTTP" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Fericit" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Informație hardware" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Informația hardware este disponibilă numai în timp ce dispozitivul este conectat." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Înalt" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Înalt (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Înalt (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "HipHop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Gazda nu a fost găsită, verificați adresa URL a serverului. Exemplu: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Ore" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Nu am un cont Magnatune" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Miniatură" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Miniaturile în partea de sus" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Identificare melodie" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Daca aceasta optiune este activa, un click pe melodia selectata in lista de redate va va permite sa editati valoarea etichetei in mod direct" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Dacă veți continua, acest dispozitiv va funcționa încet iar melodiile copiate pe el este posibil să nu funcționeze." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Dacă știți adresa URL a unui podcast, introduceți-o mai jos și apăsați „Mergi”." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Ignoră \"The\" în numele artiștilor" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Imagini (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Imagini (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Se importă..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "În %1 zile" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "În %1 săptămâni" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "În modul dinamic, piste noi vor fi alese și adăugate la lista de redare de fiecare dată când se termină o melodie." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Inbox" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Include grafica albumului în notificare" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Include toate melodiile" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Versiune protocol Subsonic REST incompatibilă. Clientul trebuie actualizat." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Versiune protocol Subsonic REST incompatibilă. Serverul trebuie actualizat." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Configurație incompletă, asigurați-vă că toate câmpurile sunt populate." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Crește volumul cu 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Crește volumul cu procent" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Crește volumul" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Se indexează %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Informație" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Opțiuni intrare" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Inserați..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Instalat" #: core/database.cpp:585 msgid "Integrity check" msgstr "Verificare integritate" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Furnizori de internet" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Servicii internet" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Cheie API nevalidă" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Format nevalid" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Metodă nevalidă" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Parametri nevalizi" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Resursa specificată este nevalidă" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Serviciu nevalid" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Cheie sesiune nevalidă" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Inversează selecția" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Cele mai ascultate piste Jamendo" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Piste de top Jamendo" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo pistele de top ale lunii" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Jamedo pistele de top ale săptămânii" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Baza de date Jamendo" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Sări la pista în curs de redare" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Mențineți butoanele pentru %1 secundă..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Mențineți butoanele pentru %1 secunde..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Menține rularea în fundal atunci când fereastra este închisă" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Menține fișierele originale" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Pisicuțe" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Limbă" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Laptop/Căști" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Sală mare" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Copertă album mare" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Copertă album mare (detaliile dedesubt)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Bară laterală mare" #: library/library.cpp:80 msgid "Last played" msgstr "Ultimele redate" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Ultima redată" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm este momentan ocupat, încercați din nou peste câteva minute" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Parolă Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Număr de redări Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Etichete Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Nume utilizator Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Wiki Last.fm" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Pistele cele mai puțin preferate" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Stânga" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Lungime" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Bibliotecă" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Grupare avansată bibliotecă" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Notă rescanare bibliotecă" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Căutare bibliotecă" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Limite" #: ui/equalizer.cpp:137 msgid "Live" msgstr "În direct" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Încărcare" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Încarcă copertă de la URL" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Încarcă copertă de la URL..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Încarcă copertă de pe disc" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Încarcă coperta pentru disc..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Încarcă lista de redare" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Încarcă lista de redare..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Se încarcă dispozitiv MTP" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Se încarcă baza de date iPod" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Se încarcă lista de redare inteligentă" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Se încarcă melodiile" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Se încarcă fluxul" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Se încarcă pistele" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Se încarcă informație piste" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Se încarcă..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Încarcă fișiere/URL-uri, înlocuind lista de redare curentă" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Autentificare" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Autentificare eșuată" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Deautentificare" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Profil de predicție pe termen lung (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Iubește" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Scăzut (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Scăzut (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Profil de complexitate redusă (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Versuri" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Versuri de pe %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Descărcare Magnatune" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Descărcarea Magnatune finalizată" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Profil principal (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Fă-o așa!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Fă-o așa!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Fă lista de redare disponibilă offline" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Răspuns incorect" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Configurare proxy manuală" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Manual" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Producător" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Marchează ca ascultat" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Marchează ca nou" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Potrivește toți termenii de căutare (AND)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Potrivește unul sau mai mulți termeni (OR)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Maxim de rezultate căutare globală" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Rata de biți maximă" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Media a fost schimbată. Se reâncarcă" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Mediu (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Mediu (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Tipul de apartenenta" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Rata de biți minimă" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Umplere minima a tamponului" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Lipsesc preconfigurările proiectM" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Monitorizează biblioteca pentru schimbări" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Redare mono" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Luni" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Dispoziție" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Stil bară dispoziție" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Bare dispoziție" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Mai mult" #: library/library.cpp:84 msgid "Most played" msgstr "Cele mai redate" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Punct de montare" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Puncte de montare" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Mută în jos" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Mută în bibliotecă..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Mută în sus" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Muzică" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Biblioteca muzicală" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Mut" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Albumele mele" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Muzica mea" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Recomandările mele" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Nume" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Nume" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Opțiuni de numire" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Bandă îngustă (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Proxy rețea" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Control la distanță prin rețea" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Niciodată" #: library/library.cpp:74 msgid "Never played" msgstr "Niciodată redate" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Nu începe redarea niciodată" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Dosar nou" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Listă de redare nouă" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Listă de redare inteligentă nouă..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Melodii noi" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Pistele noi vor fi adăugate automat." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Cele mai noi piste" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Următorul" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Pista următoare" #: core/utilities.cpp:151 msgid "Next week" msgstr "Săptămâna viitoare" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Nici un analizor" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Fără imagine de fundal" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Nu sunt coperți de exportat." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Fără blocuri lungi" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Nu s-au găsit potriviri. Curățați căsuța de căutare pentru a arăta din nou întreaga listă de redare." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Fără blocuri scurte" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Nimic" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Nici una dintre melodiile selectate nu sunt potrivite pentru copierea pe un dispozitiv" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Normal" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Tip bloc normal" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Nu este disponibil în timpul utilizării unei liste de redare dinamice" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Neconectat" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Nu este destul conținut" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Nu sunt destui fani" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Nu sunt destui membri" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Nu sunt destui vecini" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Neinstalat" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Nu este autentificat" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Nu este montat - dublu clic pentru montare" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Nu s-a găsit nimic" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Tip notificare" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Notificări" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Se redă acum" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Numarul de episoade afisate" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Previzualizare OSD" #: widgets/osd.cpp:173 msgid "Off" msgstr "Închis" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "Pornit" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Se acceptă conexiuni numai de la clienții din intervalele ip:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Acceptă conexiuni numai din rețeaua locală" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Arată numai primul" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Opacitate" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Deschide %1 în navigator" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Deschide CD &audio..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Deschide fișier OPML" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Deschide fișier OPML..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Deschide un director pentru a se importa muzica din el" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Deschide dispozitiv" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Deschide fișier..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Deschide în Google Drive" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Deschide în listă de redare nouă" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Deschide în listă de redare nouă" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Deschideți în navigator" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Deschide..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Operația a eșuat" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Optimizează pentru rata de biți" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Optimizează pentru calitate" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Opțiuni..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Organizează Fișiere" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Organizează fișiere..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Organizare fișiere" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Etichete originale" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "An original" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "An original - Album" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Alte opțiuni" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Ieșire" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Dispozitiv de ieșire" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Opțiuni ieșire" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Suprascrie tot" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Suprascrie fișierele existente" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Suprascrie numai cele mici" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Proprietar" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Analizare catalog Jamendo" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Petrecere" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Parolă" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Pauză" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Pauză redare" #: widgets/osd.cpp:156 msgid "Paused" msgstr "În pauză" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Interpret" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Pixel" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Bară laterală simplă" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Redare" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Număr redări" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Redă dacă este oprit, întrerupe dacă se redă" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Redă numai dacă nu se redă deja ceva" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Redă melodia a a din lista de redare" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Redare/Pauză" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Redare" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Opțiuni player" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Listă de redare" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Listă de redare terminată" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Opțiuni listă de redare" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Tip listă de redare" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Liste de redare" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Închideți navigatorul și reveniți la Clementine." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Stare modul:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcast-uri" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Durată afișare " #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Preamplificare" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Preferință" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Preferințe" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Preferințe..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Nume fișiere preferate pentru grafica albumului (separate prin virgule)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Format audio preferat" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Rată de biți preferată" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Format preferat" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Tip audio Premium" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Preconfigurare:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Apasă o combinație de butoane pentru a fi utilizată" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Apăsați o tastă" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Apăsați o combinație de taste pentru a fi utilizată la %1..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Opțiuni OSD drăguț" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Previzualizare" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Anterior" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Pista anterioară" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Tipărește informația versiunii" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Progres" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Progres" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psihedelic" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Apăsați butonul Wiiremote" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Aranjează melodiile într-o ordine aleatoare" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Calitate" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Calitate" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Se interoghează dispozitivul..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Administrator coadă" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Adaugă în coadă pistele selectate" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Adaugă în coadă pista" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (egalizare loudness pentru toate pistele)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Ploaie" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Ploaie" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Vizualizare aleatorie" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Votează melodia curentă cu 0 stele" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Votează melodia curentă cu 1 stea" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Votează melodia curentă cu 2 stele" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Votează melodia curentă cu 3 stele" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Votează melodia curentă cu 4 stele" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Votează melodia curentă cu 5 stele" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Votare" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Sigur anulați?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Limita de redirectionari a fost depasita, verificati configuratia serverului." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Reâmprospătare catalog" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Reâmprospătare canalele" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Reâmprospătare lista stațiilor" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Reâmprospătare fluxuri" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Relativ" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Ține minte de ultima dată" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Ține minte alegerea mea" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Elimină" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Elimină acțiunea" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Elimină duplicatele din lista de redare" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Elimină dosar" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Elimină din Muzica mea" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Elimină din semne de carte" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Elimină din lista de redare" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Elimină lista de redare" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Elimină listele de redare" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Elimină pistele nedisponibile din lista de redare" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Redenumește lista de redare" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Redenumește lista de redare..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Renumerotează pistele în această ordine..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Repetă" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Repetă albumul" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Repetă lista de redare" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Repetă pista" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Înlocuiește lista de redare curentă" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Înlocuiește lista de redare" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Înlocuiește spațiul cu subliniere" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Repopulează" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Necesită cod de autentificare" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Resetare" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Resetează numărul de ascultări" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Restricionat la caractere ASCII" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Reia redarea la pornire" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Revenire la Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Dreapta" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Extrage" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Extrage CD" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Extrage CD audio" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Rulează" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "Proxy SOCKS" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Eroare de handshake SSL, verificati configuratia serverului. Optiunea SSLv3 de mai jos poate inlatura unele probleme." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Scoate în siguranță dispozitivul" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Scoate în siguranță dispozitivul după copiere" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Rată de eșantionare" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Rată de eșanționare" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Salvează fișierele .mood în biblioteca muzicală" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Salvează coperta albumului" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Salvează coperta pe disc..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Salvează imaginea" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Salvează lista de redare" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Salvează lista de redare" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Salvează lista de redare..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Salvează preconfigurare" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Salvează când este posibil evaluările în etichetele fișierului" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Salvează când este posibil statisticile în etichetele fișierului" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Salvează acest flux în fila internetului" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Se salvează statisticile melodiilor în fișierele melodiilor" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Se salvează pistele" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Dimensiune scală" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Scor" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Căutare" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Căutare" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Caută stații Icecast" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Caută Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Caută Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Caută Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Caută automat" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Caută coperți pentru album..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Caută orice" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Caută gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Caută iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Mod căutare" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Opțiuni căutare" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Rezultate căutare" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Termeni căutare" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Al doilea nivel" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Caută înapoi" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Caută înainte" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Caută în pista redată curent cu o cantitate relativă" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Caută în pista redată curent pentru o poziție absolută" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Selectați Tot" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Nu este selectat nimic" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Selectați culoarea de fundal:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Selectați imaginea de fundal" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Selectați cea mai bună potrivire" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Selectați culoare prim-plan:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Selectați vizualizările" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Selectați vizualizările..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Selectați..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Număr serial" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Server" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "Adresă URL server" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Detalii server" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Serviciu offline" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Configurați %1 la \"%2\"..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Configurează volumul la procent" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Configurează valoarea pentru toate pistele selectate..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Configurări" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Scurtătură" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Scurtătură pentru %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Scurtătură pentru %1 există deja" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Arată" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Arată OSD" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Arată o animație strălucitoare pe pista curentă" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Arată o bară dispoziție în bara de progres a pistei" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Arată o notificare de desktop nativă" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Arată o notificare când se schimbă modul repetare/amestecare" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Arată o notificare când se modifică volumul" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Arată o notificare când se pauzează redarea" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Arată o notificare din zona de notificări" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Arată un OSD drăguț" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Arată deasupra bării de stare" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Arată toate melodiile" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Arată toate melodiile" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Arată grafica albumului în bibliotecă" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Arată separatori" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Arată dimensiunea completă..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Arată grupurile în rezultatul căutării globale" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Arată în navigatorul de fișiere..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Arată în bibliotecă..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Arată în artiști diferiți" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Arată bara dispoziție" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Arată numai duplicatele" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Arată numai cele neetichetate" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Arată melodia redată pe pagina dumneavoastră" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Arată sugestiile de căutare" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Arată butonul \"iubire\"" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Arată butonul scrobble în fereastra principală" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Arată pictograma în tava de sistem" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Arată care surse sunt activate și dezactivate" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Arată/Ascunde" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Amestecă" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Amestecă albume" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Amestecă tot" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Amestecă lista de redare" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Amestecă pistele din acest album" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Autentificare" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Deautentificare" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Se autentifică..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Artiști similari" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Dimensiune" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Dimensiune:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Sari înapoi în lista de redare" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Omite numărătoarea" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Sări înainte în lista de redare" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Omite pistele selectate" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Omite pista" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Copertă album mică" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Bară laterală mică" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Listă de redare inteligentă" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Liste de redare inteligente" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Informație melodie" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Informație melodie" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Ne pare rău" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Sortează după gen (alfabetic)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Sortează după gen (după popularitate)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Sortează după numele stației" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Sortează melodiile după" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Sortare" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Sursă" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Surse" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Eroare autentificare Spotify" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "URL-ul listei de redare Spotify" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Modul Spotify" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Modulul Spotify nu este instalat" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "URL-ul listei melodiei Spotify" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Standard" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Cu steluță" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Pornire extragere" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Pornește lista de redare curent redată" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Pornire transcodificare" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Se pornește %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Se pornește..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Oprește" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Oprește după" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Oprește după pista aceasta" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Oprește redarea" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Oprește redarea după pista curentă" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Oprește redarea după pista: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Oprit" #: core/song.cpp:431 msgid "Stream" msgstr "Flux" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Abonați" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Succes!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "S-a scris cu succes %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Etichete sugerate" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Sumar" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Foarte înalt (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Foarte înalt (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Formate acceptate" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Se sincronizează lista de redare Spotify" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Culori de sistem" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "File deasupra" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Rată de biți țintă" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Opțiuni text" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Mulțumiri lui" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Comanda \"%1\" nu poate fi pornită." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Coperta albumului melodiei redate curent" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "Directorul %1 nu este valid" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "A doua valoare trebuie să fie mai mare decât prima!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Site-ul pe care l-ați solicitat nu există!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Site-ul solicitat nu este o imagine!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Perioada de încercare pentru serverul Subsonic este terminată. Donați pentru a obține o cheie de licență. Vizitați subsonic.org pentru detalii." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Versiunea Clementine pe care tocmai ați actualizat-o necesită o rescanare completă a bibliotecii datorită funcțiunilor noi listate mai jos:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Sunt alte melodii în acest album" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "A fost o problemă la comunicarea cu gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "A fost o problemă la obținerea metadatelor de la Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "A fost o problemă la analizarea răspunsului de la iTunes Store" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "A fost o problemă la copierea unor melodii. Următoarele fișiere nu au putut fi copiate:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "A fost o problemă la ștergerea unor melodii. Următoarele fișiere nu pot fi șterse:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Aceste fișiere vor fi șterse de pe dispozitiv, sigur doriți să continuați?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Aceste fișiere vor fi șterse permanent de pe disk, sigur doriți să continuați?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Aceste dosare vor fi scanate după muzică pentru construirea bibliotecii dumneavoastră" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Al treilea nivel" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Această acțiune va crea o bază de date care ar putea fi la fel de mare ca 150MB.\nDoriți să continuați oricum?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Acest album nu este disponibil în formatul cerut" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Aceasta poate fi modificat mai târziu din preferințe" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Dispozitivul trebuie conectat și deschis înainte ca Clementine să poată vedea ce formate de fișier sunt suportate." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Dispozitivul suportă următoarele formate de fișiere:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Acest dispozitiv nu funcționează corespunzător" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Acesta este un dispozitiv MTP, dar ați compilat Clementine fără suport libmtp." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Acesta este un iPod, dar ați compilat Clementine fără suport libgpod." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Aceasta este prima dată când ați conectat acest dispozitiv. Clementine va scana acum dispozitivul pentru a găsi fișiere muzică - aceasta poate dura." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Această opțiune poate fi modificată în \"Comportament\" preferințe" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Acest flux este numai pentru abonații cu plată" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Acest tip de dispozitiv nu este suportat: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Titlu" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Astăzi" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Comută OSD drăguț" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Comută ecran complet" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Comută stare coadă" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Comută scrobbling" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Comută vizibilitatea pentru afișare-pe-ecran drăguță" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Mâine" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Prea multe redirecționări" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Albume în total:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Total octeți transferați" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Pistă" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Piste" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Transcodifică muzica" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Jurnal transcoder" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Se transcodifică" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Opțiuni transcodificare" #: core/song.cpp:426 msgid "TrueAudio" msgstr "Audio adevărat" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbină" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Oprește" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL(-uri)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Banda ultra-larga (BUL)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Nu se poate conecta" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Nu se poate descărca %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Necunoscut" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Tip de conținut necunoscut" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Eroare necunoscută" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Nu omite pistele selectate" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Nu omite pista" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Dezabonare" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Concerte viitoare" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Actualizare" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Actualizează toate podcasturile" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Actualizează dosarele modificate ale bibliotecii" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Actualizează biblioteca atunci când pornește Clementine" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Actualizează acest podcast" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Se actualizează" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Se actualizează %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Se actualizează %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Se actualizează biblioteca" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Utilizare" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Utilizați scurtăturile de taste Gnome" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Utilizează culori psihedelice" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Utilizează SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Utilizează telecomanda Wii" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Folositi un set de culori personalizat" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Utilizează un mesaj personalizat pentru notificări" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Utilizează un control la distanță prin rețea" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Utilizează autentificarea" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Utilizează motorul de administrare a ratei de biți" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Utilizează modul dinamic" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Utilizează notificările pentru raportare stare Wii Remote" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Utilizează cele implicite de sistem" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Utilizează setul de culori implicit al sistemului" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Utilizează configurările proxy ale sistemului" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Utilizează normalizarea volumului" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Utilizat" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Interfață utilizator " #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Nume utilizator" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Utilizarea meniului pentru a adăuga o melodie va..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Rată de biți variabilă" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Artiști diferiți" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Versiunea %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Vizualizare" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Mod vizualizare" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Vizualizări" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Configurări vizualizare" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Detecție activitate voce" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Volum %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Zid" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Atenționează-mă când închid o filă listă de redare" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Site web" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Săptămâni" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Când pornește Clementine" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "Când se salvează o listă de redare, calea fișierului ar trebui să fie" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Când lista este goală..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "De ce nu încercați..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Bandă largă (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: activat" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: conectat" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: baterie critică (%2%)" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: dezactivat" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: deconectat" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: baterie critică (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "audio Windows Media" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Fără copertă:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Doriți să rulați o rescanare completă chiar acum?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Scrie toate statisticile melodiilor în fișierele melodiei" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Scrie metadatele" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Nume utilizator sau parolă greșite" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "An" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "An - Album" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Ani" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Ieri" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Sunteți pe cale să descărcați următoarele albume" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Sunteți pe cale de a elimina %1 liste de redare de la favorite, sunteți sigur?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Sunteti pe cale sa inlaturati o lista de redare care nu face parte din listele dumneavoastra de redare favorite: lista de redare va fi stearsa (nu se poate reveni asupra acestei actiuni). \nSigur doriti sa continuati?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Nu sunteți autentificat." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Sunteți autentificat ca %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Sunteți autentificat." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Puteți modifica modul cum sunt organizate melodiile în bibliotecă." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Puteți asculta gratuit fără un cont, însă membrii Premium pot asculta fluxuri de calitate înaltă fără reclame." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Nu aveți un cont Spotify Premium." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Nu aveți un abonament activ" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Ați fost deautentificat de la Spotify, reintroduceți parola în dialogul configurări." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Ați fost deautentificat de la Spotify, reintroduceți parola dumneavoastră." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Iubiți această pistă" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Va trebui să reporniți Clementine dacă schimbați limba." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Adresa dumneavoastră IP:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Acreditările dumneavoastră Last.fm sunt incorecte" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Acreditările dumneavoastră Magnatune sunt incorecte" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Biblioteca dumneavoastră este goală!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Fluxurile dumneavoastră radio" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Sistemului dumneavoastră îi lipsește suportul OpenGL, vizualizările sun nedisponibile." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Parola sau numele de utilizator au fost incorecte." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "adaugă %n melodii" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "după" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "în urmă" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "și" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "automat" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "înainte" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "între" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "întâi cele mai mari" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "conține" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "dezactivat" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "disc %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "nu conține" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "se termină cu" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "egale" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "director gpodder.net" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "mai mare decât" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "iPod-urile și dispozitivele USB nu funcționează actualmente pe Windows. Regretăm!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "in ultimele" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "mai puțin decât" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "întâi cele mai lungi" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "mută %n melodii" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "întâi cele mai noi" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "nu sunt egale" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "nu se afla in ultimele" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "nu este in" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "întâi cele mai vechi" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "pornire" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "opțiuni" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "sau scanați codul QR!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "apăsați enter" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "elimină %n melodii" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "cele mai scurte primele" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "amestecare melodii" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "întâi cele mai scurte" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "sortare melodii" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "începând cu" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "oprește" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "pista %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/ru.po000066400000000000000000005764371260417502300237130ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Andrei Stepanov, 2014 # al42and , 2012 # Alexander, 2012 # Alexander Vysotskiy , 2012 # Andrei Demin , 2014 # Andrei Stepanov, 2014-2015 # Andy Dufrane <>, 2012 # arnaudbienner , 2011 # dr&mx , 2013 # Eugene Sharygin , 2014 # Just a baka , 2013 # Just a baka , 2012 # Валерий Третьяк , 2012 # SvetlanaK , 2011 # Brodyaga20 , 2012 # Dmitry , 2013 # Alexander Vysotskiy , 2012 # Nikita Putko , 2011 # Nikolay Parukhin , 2013 # Oleg Sevostyanov , 2011 # serg0 , 2013 # KazimirSpontaliku , 2012 # Stanislav Hanzhin , 2012 # Vyacheslav Blinov , 2012 # Анатолий Валерианович , 2014 # vlodimer , 2012 # Владислав , 2013 # Павел Малеев , 2010 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Russian (http://www.transifex.com/davidsansome/clementine/language/ru/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nВы можете занести плейлист в избранные, кликнув по звёздочки возле имени списка\n\nИзбранные плейлисты хранятся тут" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "дней" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "кбит/с" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr "мс" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr "пунктов" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "с" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr "секунд" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "песен" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 песен)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 альбомов" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 дней" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 дней назад" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 на %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 плейлистов (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 выбрано из" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 песня" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 песен" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "Найдено %1 песен" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "Найдено %1 песен (показано %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 треков" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 передано" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: модуль Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 других слушателей" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "Всего %L1 прослушиваний" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n с ошибкой" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n завершено" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n осталось" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "Выровнять &текст" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "По &центру" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Другое" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "Дополнения" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "Помощь" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&Скрыть \"%1\"" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Скрыть…" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "С&лева" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "Музыка" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Нет" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "&Плейлист" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Выход" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "&Режим повтора" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "С&права" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "&Режим перемешивания" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Подгонять по размеру окна" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Инструменты" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(различный через несколько композиций)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", от" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "…и всех создателей Amarok" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 день" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 трек" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128 кбит/c MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192 000 Гц" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44 100 Гц" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48 000 Гц" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 случайных треков" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96 000 Гц" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Обновить до версии Premium сейчас" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Если не отмечено, то Clementine попытается сохранить ваши рейтинги и другие статистические данные только в отдельной базе данных без изменения ваших файлов.

Если отмечено, то статистика будет сохранена как в базе данных, так и прямо в файле каждый раз при их изменении.

Имейте в виду, что это может не работать для каждого формата и, поскольку стандартов для этого нет, другие музыкальные проигрыватели могут не прочесть их.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Допишите название поля, чтобы ограничить поиск по этому полю, например Артист:Bode ищет фонотеке всех исполнителей со словом \"Bode\".

Доступные поля: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Рейтинги и статистика песен будут записаны в теги всех музыкальных файлов вашей фонотеки.

Это не требуется, если параметр "Сохранять рейтинги и статистику в теги файла" был включен постоянно.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Поля начинаются со знака %, например: %artist %album %title

\n\n

Если Вы окружили часть текста фигурными скобками, то эта часть текста не будет видна, если значения полей будут пустыми

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Требуется премиум аккаунт Spotify." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Клиент может подключиться, только если был введен правильный код." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Умный плейлист — это динамический список композиций из вашей фонотеки. Существуют разные типы умных плейлистов с различными способами выбора композиций." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Композиция будет добавлена в плейлист, если соответствует этим условиям." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z (А-Я)" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128 кбит/c" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32 кбит/c" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64 кбит/c" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "СЛАВА ГИПНОЖАБЕ" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Прервать" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "О %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "О Clementine" #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Информация о Qt" #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Абсолютные" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Данные учётной записи" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Данные учётной записи (Премиум)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Действие" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Действие" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Активировать/деактивировать Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Лента активности" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Добавить подкаст" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Добавить поток" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Добавить новую строку, если поддерживается типом уведомления" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Добавить действие" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Добавить все треки из папки и её подпапок" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Добавить другой поток…" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Добавить каталог…" #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Добавить файл" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Конвертировать файл" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Конвертировать файл(ы)" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Добавить файл…" #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Конвертировать файлы" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Добавить папку" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Добавить папку…" #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Добавить новую папку" #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Добавить подкаст" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Добавить подкаст…" #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Добавить условие поиска" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Добавить тег \"Альбом\"" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Добавить тег \"Исполнитель альбома\"" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Добавить тег \"Исполнитель\"" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Добавить автоподсчёт воспроизведений" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Добавить тег \"Композитор\"" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Добавить тег \"Диск\"" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Добавить имя файла с композицией" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Добавить тег \"Жанр\"" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Добавить тег \"Группа\"" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Добавить тег \"Длина\"" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Добавить тег \"Исполнитель\"" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Добавить число воспроизведений" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Добавить рейтинг" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Добавить число пропусков" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Добавить тег \"Название\"" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Добавить песню в кэш" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Добавить тег \"Номер дорожки\"" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Добавить тег \"Год\"" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Добавить песни в \"Мою музыку\", если нажата кнопка \"В любимые\"" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Добавить поток…" #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Добавить в Мою музыку" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Добавить в плейлисты Spotify" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Добавить в оценённые Spotify" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Добавить в другой плейлист" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Добавить в закладки" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Добавить в плейлист" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Добавить в очередь" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Добавить пользователя/группу в закладки" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Добавить действие wiimotedev" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Добавить…" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Добавлено за месяц" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Добавлено за неделю" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Добавлено за год" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Добавлено сегодня" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Добавлено за три месяца" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Расширенная сортировка…" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "После " #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "После копирования…" #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Альбом" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Альбом (идеальная громкость всех треков)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Исполнитель альбома" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Обложка альбома" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Информация об альбоме на jamendo.com…" #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Альбомы" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Альбомы с обложками" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Альбомы без обложек" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Все" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Все файлы (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "Cлава Гипножабе!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Все альбомы" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Все исполнители" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Все файлы (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Все плейлисты (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Всех переводчиков" #: library/library.cpp:98 msgid "All tracks" msgstr "Все композиции" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Позволяет клиенту скачивать музыку с этого компьютера." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Разрешить загрузки" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Разрешить mid/side кодирование" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Вместе с оригиналами" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Всегда скрывать главное окно" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Всегда показывать главное окно" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Всегда начинать воспроизведение" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon Cloud Drive" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Требуется дополнительный модуль для использования Spotify в Clementine. Скачать и установить его?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Произошла ошибка при загрузке данных iTunes" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Ошибка при записи мета-данных в '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Произошла неизвестная ошибка." #: ui/about.cpp:85 msgid "And:" msgstr "А также:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Сердитый" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Внешний вид" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Добавить файлы/URLs в плейлист" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Добавить в текущий плейлист" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Добавить в плейлист" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Применить сжатие для предотвращения искажений" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Вы действительно хотите удалить профиль \"%1\"?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Вы действительно хотите сбросить статистику этой песни?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Вы действительно хотите записывать статистику во все файлы композиций вашей фонотеки?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Исполнитель" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Артист" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Теги исполнителя" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Инициалы исполнителя" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Спрашивать при сохранении" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Формат аудио" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Вывод звука" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Ошибка аутентификации" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Автор" #: ui/about.cpp:68 msgid "Authors" msgstr "Авторы" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Авто" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Автоматические" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Автоматическое обновление" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Автоматически раскрывать одиночные категории в дереве фонотеки" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Доступно" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Средний битрейт" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Средний размер изображений" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "Подкасты BBC" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "Ударов в минуту" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Фоновые звуки" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Цвет фона" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Фоновое изображение" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Непрозрачность фона" #: core/database.cpp:648 msgid "Backing up database" msgstr "Резервное копирование базы данных" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Баланс" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "Запретить (в скорбблере Last.fm)" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Полосный анализатор" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Стандартный голубой" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Базовый тип аудио" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Поведение" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Лучшее" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Биография из %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Битрейт" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Битрейт" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Битрейт" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Блоковый анализатор" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Тип блока" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Степень размытости" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Содержимое" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Плавающий анализатор" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Обзор…" #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Размер буфера" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Буферизация" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Построение индекса Seafile…" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Эти источники отключены:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Клавиши" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Поддержка файлов разметки CUE" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Папка кэша:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Кэширование" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "Кэширование %1" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Отмена" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Отменить загрузку" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Нужна капча.%s\nПопробуйте зайти в VK.com через браузер для решения этой проблемы." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Сменить обложку" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Изменить размер шрифта…" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Изменить режим повтора" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Изменить клавиши…" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Изменить режим перемешивания" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "Сменить текущий трек" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Сменить язык" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "Изменения вступят в силу со следующей песни" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Изменение настроек воспроизведения моно подействует со следующей композиции" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Проверять новые выпуски" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Проверить обновления" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Проверить обновления…" #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Выберите папку для кэша VK.com" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Выберите название умного плейлиста" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Выбирать автоматически" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Выбрать цвет…" #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Выбрать шрифт…" #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Выбор из списка" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Настройка сортировки плейлиста и количества песен в нём." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Выберите каталог для загрузки подкастов" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Выберите службы интернет, которые вы хотите использовать." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Выберите сайты, которые будут использоваться для поиска текстов песен." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Классический" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Очистка" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Очистить" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Очистить плейлист" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Ошибка Clementine" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Оранжевый Clementine" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Визуализация Clementine" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "При копировании на носитель Clementine может автоматически конвертировать музыку в формат, который оно поддерживает." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Clementine может проигрывать вашу музыку, загруженную в Amazon Cloud Drive" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine может проигрывать музыку, загруженную вами в Box" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine может проигрывать музыку, загруженную вами в Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine может проигрывать музыку с Google Диска" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine может проигрывать музыку, загруженную на OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine может показывать уведомление при смене трека." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine может синхронизировать ваши подписки с другими компьютерами и приложениями. Создать аккаунт." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine не может загрузить ни одну визуализацию projectM. Проверьте, что Clementine установлен правильно." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Просмотр изображений в Clementine" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine не смог найти результаты по запросу для этого файла" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine будет искать здесь:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Нажмите сюда, чтобы добавить музыку" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Нажмите сюда для добавления плейлиста в избранное, он будет сохранен в разделе \"Списки\" левой боковой панели" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Нажмите для переключения между оставшимся и полным временем" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "После нажатия откроется окно браузера. Вернитесь в Clementine, когда совершите вход." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Закрыть" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Закрыть плейлист" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Закрыть визуализацию" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Закрытие этого окна отменит загрузку." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Закрытие этого окна остановит поиск обложек для альбомов." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Клубный" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Цвета" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Разделенный запятыми список \"класс:уровень\", где уровень от 0 до 3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Комментарий" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Радио сообщества" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Заполнить поля автоматически" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Заполнить поля автоматически" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Композитор" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Настроить %1…" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Настройка Magnatune…" #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Горячие клавиши" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Настройка Spotify…" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Настроить Subsonic…" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Настроить VK.com…" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Настроить глобальный поиск…" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Настроить фонотеку…" #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Настроить подкасты…" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Настроить…" #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Подключать пульт Wii при активации/деактивации" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Подключить носитель" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Подключение к Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Соединение отвергнуто сервером, проверьте адрес сервера. Пример: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Превышено время ожидания при установке соединения, проверьте адрес сервера. Пример: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Ошибка подключения или аудио удалено владельцем" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Консоль" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Постоянный битрейт" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Конвертировать всю музыку" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Конвертировать всю музыку, не поддерживаемую носителем." #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Конвертировать аудиофайлы, сжатые без потери качества, перед отправкой их на удаленное устройство." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Конвертировать файлы сжатые без потери качества" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Скопировать ссылку для публикации в буфер" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Скопировать в буфер" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Копировать на носитель" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Копировать в фонотеку…" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Copyright" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Не удается подключиться к Subsonic, проверьте адрес сервера. Например, http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Невозможно создать элемент GStreamer \"%1\" - убедитесь, что у вас установлены все необходимые дополнения GStreamer" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Невозможно создать плейлист" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Не возможно найти мультиплексор для %1. Убедитесь, что установлены необходимые модули GStreamer" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Невозможно найти кодировщик для %1, проверьте, что установлены все необходимые модули GStreamer" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Невозможно открыть выходной файл %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Менеджер обложек" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Обложка из встроенного изображения" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Обложка загружена автоматически с %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Обложка вручную отключена" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Обложка не задана" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Обложка задана из %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Обложки из %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Перекрёстное затухание при автоматической смене трека" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Перекрёстное затухание при ручной смене трека" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Пользовательский" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Собственное изображение:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Настройки сообщения" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Пользовательский…" #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "Путь DBus" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Танцевальный" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Обнаружен сбой в базе данных. Инструкции по восстановлению можно прочитать по адресу https://code.google.com/p/clementine-player/wiki/DatabaseCorruption" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Дата создания" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Дата изменения" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "день (дня, дней)" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "По &умолчанию" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Уменьшить громкость на 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Уменьшить громкость на процентов" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Уменьшить громкость" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Стандартное фоновое изображение" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Стандартное для %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "По умолчанию" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Задержка между визуализациями" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Удалить" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Удалить загруженные данные" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Удалить файлы" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Удалить с носителя" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Удалить с диска…" #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Удалять прослушанные выпуски" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Удалить профиль" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Удалить умный плейлист" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Удалить оригинальные файлы" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Удаление файлов" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Убрать выбранные треки из очереди" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Убрать трек из очереди" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Назначение" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Подробнее…" #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Носитель" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Свойства носителя" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Имя носителя" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Свойства носителя…" #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Носители" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Диалог" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Возможно, вы имели в виду" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Пароль" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Имя пользователя" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Прямое соединение с Интернетом" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Каталог" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Отключить длительность" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Не создавать индикатор тона" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Отключено" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Отключено" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Диск" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Непрерывная передача" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Настройки вида" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Показывать экранное уведомление" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Пересканировать фонотеку" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Полность пересканировать" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Полность пересканировать…" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Не конвертировать какую-либо музыку" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Не перезаписывать" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "После полного пересканирования потеряются все метаданные, сохраненные в Clementine, такие как обложки, счетчик воспроизведений и рейтинги. Clementine так же пересканирует всю вашу музыку в Google Диск, что может потребовать некоторое время." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Не повторять" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Не показывать в \"Различных исполнителях\"" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Не показывать прослушанные выпуски" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Не перемешивать" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Не останавливать!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Пожертвования" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Кликните дважды для открытия" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "Двойной щелчок по плейлисту…" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Двойной щелчок по песне…" #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Загрузить %n выпусков" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Каталог загрузок" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Загружать выпуски в" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Загрузка подписки" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Загружать новые выпуски автоматически" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Загрузка добавлена в очередь" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Настройки загрузки" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Загрузите приложение для Android" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Загрузить этот альбом" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Загрузить этот альбом" #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Загрузить этот выпуск" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Загрузить…" #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Загрузка (%1%)…" #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Загружается директория Icecast" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Загружается каталог Jamendo" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Загружается каталог Magnatune" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Загружается модуль Spotify" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Загрузка метаданных" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Тащите для перемещения" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Дабстеп" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Длительность" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Динамический режим включён" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Случайный динамичный микс" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Изменить умный плейлист…" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Изменить тег \"%1\"…" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Изменить тег…" #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Изменить теги" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Изменить информацию о треке" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Изменить информацию о треке" #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Изменить информацию о треках" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Изменить…" #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "Email" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Включить поддержку пульта Wii" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Включить автоматическое кэширование" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Включить эквалайзер" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Включить горячие клавиши, только когда окно в фокусе" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Включить редактирование метаданных песни по клику" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Укажите источники, включаемые в результаты поиска. Результаты будут отображаться в данном порядке." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Включить/отключить скробблер Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Сложность кодирования" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Качество кодирования" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Режим кодирования" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Введите адрес" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Введите ссылку для скачивания обложки из Интернета:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Введите имя файла для экспортируемых обложек (без расширения):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Введите новое имя для этого плейлиста" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Введите условия поиска музыки на компьютере и в интернете" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Введите ключевые слова для поиска подкастов в iTunes Store" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Введите ключевые слова для поиска в gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Введите критерии поиска" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Введите адрес потока интернет-радио:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Введите имя папки" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Введите этот IP-адрес в App для подключения к Clementine." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Вся коллекция" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Эквалайзер" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Аналогично --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Аналогично --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Ошибка" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Ошибка конвертирования CD" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Ошибка подключения устройства MTP" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Ошибка копирования композиций" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Ошибка удаления композиций" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Ошибка загрузки модуля Spotify" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Ошибка загрузки %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Ошибка при загрузке плейлиста di.fm" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Ошибка при обработке %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Ошибка при загрузке аудио-диска" #: library/library.cpp:68 msgid "Ever played" msgstr "Когда-либо проигранных" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Каждые 10 минут" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Каждые 12 часов" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Каждые 2 часа" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Каждые 20 минут" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Каждые 30 минут" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Каждые 6 часов" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Каждый час" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Кроме треков с одного и того же альбома или CUE-файла" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Существующие обложки" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Развернуть" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Истекает %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Экспорт обложек" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Экспорт обложек" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Экспорт загруженных обложек" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Экспорт встроенных обложек" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Экспорт завершён" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Экспортировано %1 обложек из %2 (%3 пропущено)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Затухание при паузе / нарастание при продолжении воспроизведения" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Приглушать звук при остановке воспроизведения" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Затухание звука" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Длительность затухания" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Не удалось прочесть CD-привод" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Ошибка получения каталога" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Ошибка получения подкастов" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Ошибка загрузки подкаста" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Ошибка разбора XML в данной RSS подписке" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Быстрое" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Любимые треки" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Получить недостающие обложки" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Получать автоматически" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Получение завершено" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Получение фонотеки Subsonic" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Ошибка получения обложки" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Формат файла" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Расширение файла" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Форматы файлов" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Полное имя файла" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Имя файла" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Шаблон имени файла:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Пути файлов" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Размер файла" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Тип файла" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Имя файла" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Файлы" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Файлы для конвертации" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Найти композиции в фонотеке по указанным критериям." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Найти этого исполнителя" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Получение отпечатка песни" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Готово" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Первый уровень" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Подогнать обложку по ширине" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "FLAC" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Размер шрифта" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "По лицензионным соображениям поддержка Spotify реализована в виде отдельного плагина." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Принудительное кодирование в моно" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "\"Забыть\" носитель" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Команда \"Забыть носитель\", удалит носитель из этого списка и Clementine пересканирует все песни на нём при следующем подключении." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Форма" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Формат" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Частота кадров" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Фреймов на буфер" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Сдержанный" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Бас" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Бас + высокие частоты" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Высокие частоты" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Общие" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Общие настройки" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Жанр" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Получить адрес песни со Spotify для публикации" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Получить адрес плейлиста для публикации" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Получение каналов" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Получение потоков" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Название:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Перейти" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Перейти к следующему плейлисту" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Перейти к предудыщему плейлисту" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Диск" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Получено %1 обложек из %2 (%3 загрузить не удалось)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Отмечать серым несуществующие песни в моих плейлистах" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Сгруппировать фонотеку по…" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Сгруппировать по" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Группировать по альбомам" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Группировать по исполнителю" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Группировать по исполнителю/альбому" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Группировать по исполнителю/году - альбому" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Группировать по жанру/альбому" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Группировать по жанру/исполнителю/альбому" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Группа" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "HTML-страница не содержит RSS-подписок" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "Код состояния HTTP 3xx получен без URL, проверьте настройку сервера." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "HTTP-прокси" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Счастливый" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Информация об оборудовании" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Информация об оборудовании доступна только при подключении устройства." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Высокое" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Высокая (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Высокое (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "Хип-хоп" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Сервер не найден, проверьте адрес сервера. Пример: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Часа(ов)" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Гипножаба" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "У меня нет учётной записи Magnatune" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Значок" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Значки сверху" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Определение песни" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Если включить, то клик по выбранной песне в плейлисте позволит редактировать тег напрямую" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "При продолжении, устройство будет работать медленно и скопированные песни не будут работать." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Если вы знаете адрес подкаста, введите его сюда и нажмите Перейти." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Игнорировать \"The\" в именах исполнителей" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Изображения (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Изображения (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Импорт…" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "В течение %1 дней" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "В течение %1 недель" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "В динамическом режиме новые дорожки выбираются и добавляются в плейлист каждый раз, когда заканчивается очередная песня." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Входящие" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Показывать обложку альбома в уведомлении" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Включить все песни" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Несовместимая версия протокола Subsonic REST. Требуется обновление клиента." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Несовместимая версия протокола Subsonic REST. Требуется обновление сервера." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Неполная конфигурация, пожалуйста, убедитесь, что все поля заполнены." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Увеличить громкость на 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Увеличить громкость на процентов" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Увеличить громкость" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Индексация %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Сведения" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Настройки ввода" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Вставить…" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Установлено" #: core/database.cpp:585 msgid "Integrity check" msgstr "Проверка целостности" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Интернет" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Службы интернет" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Службы интернет" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "Вступительные треки" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Неверный ключ API" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Неверный формат" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Неверный метод" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Неверные параметры" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Указан неверный источник" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Неверная служба" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Неверный ключ сессии" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Инвертировать выбор" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Самые прослушиваемые треки на Jamendo" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Самые популярные треки на Jamendo" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Треки месяца на Jamendo" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Треки недели на Jamendo" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "База данных Jamendo" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Немедленный переход к предыдущей песне" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Перейти к текущему треку" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Показывать кнопки в течении %1 секунды…" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Показывать кнопки в течении %1 секунд…" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Продолжить работу в фоновом режиме при закрытии окна" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Сохранять оригинальные файлы" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Котята" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Кудуро" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Язык" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Наушники/ноутбук" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Большой зал" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Большая обложка альбома" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Большая обложка альбома (сведения снизу)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Большая обложка альбома (без сведений)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Широкая боковая панель" #: library/library.cpp:80 msgid "Last played" msgstr "Последнее прослушивание" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Последнее прослушивание" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm в данный момент занят, попробуйте позже" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Пароль Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Счётчики Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Теги Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Имя пользователя Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Last.fm wiki страничка" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Нелюбимые треки" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Левый канал" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Длина" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Фонотека" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Расширенная группировка фонотеки" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Уведомление о сканировании фонотеки" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Поиск по фонотеке" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Ограничения" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Лайв" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Загрузить" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Загрузить обложку по ссылке" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Загрузить обложку по ссылке…" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Загрузить обложку с диска" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Загрузить обложку с диска…" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Загрузить плейлист" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Загрузить плейлист…" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Загрузка устройства MTP" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Загрузка база данных iPod" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Загрузка умного плейлиста" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Загрузка песен" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Загрузка потока" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Загрузка композиций" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Загрузка информации о треках" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Загрузка…" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Загрузка файлов или ссылок с заменой текущего плейлиста" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Вход" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Ошибка входа" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Выйти" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Профиль Long term prediction (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "В любимые" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "В любимые (скорбблер Last.fm)" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Низкая (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Низкое (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Профиль низкой сложности (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Тексты песен" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Текст песни с %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Текст песни из ID3v2 тега" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "MP4 AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256 кбит/c" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96 кбит/c" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Загрузка Magnatune" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Загрузка Magnatune окончена" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Основной профиль (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Да будет так!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Да будет так!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Сделать плейлист доступным автономно" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Неправильный ответ" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Ручная настройка прокси" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Вручную" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Производитель" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Пометить как прослушанное" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Пометить как новое" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Совпадает с каждым условием поиска (И)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Совпадает с одним или несколькими условиями (ИЛИ)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Максимум результатов глобального поиска" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Максимальный битрейт" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Источник медиа сменился. Перезагрузка" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Средняя (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Среднее (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Тип подписки" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Минимальный битрейт" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Наим. заполнение буфера" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Предустановки projectM не найдены" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Модель" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Следить за изменениями фонотеки" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Режим моно" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Месяцев" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Тон" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Стиль индикатора тона" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Индикатор тона" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Ещё" #: library/library.cpp:84 msgid "Most played" msgstr "Наиболее прослушиваемые" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Точка монтирования" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Точки монтирования" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Переместить вниз" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Переместить в фонотеку…" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Переместить вверх" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Музыка" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Фонотека" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Приглушить звук" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Мои альбомы" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Моя музыка" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Мои рекомендации" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Имя" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Имя" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Настройки названия" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Узкая полоса пропускания (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Прокси-сервер" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Удалённое управление" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Никогда" #: library/library.cpp:74 msgid "Never played" msgstr "Никогда не прослушивались" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Никогда не начинать воспроизведение" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Новая папка" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Новый плейлист" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Новый умный плейлист…" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Новые композиции" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Новые треки будут добавлены автоматически." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Последние треки" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Дальше" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Следующий трек" #: core/utilities.cpp:151 msgid "Next week" msgstr "На следующей неделе" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Без анализатора" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Нет фонового изображения" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Нет обложек для экспорта." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Без длинных блоков" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Совпадений не найдено. Очистите строку поиска, чтобы увидеть плейлист снова." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Без коротких блоков" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Ничего" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Ни одна из выбранных песен не будет скопирована на устройство" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Нормальный" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Нормальный тип блоков" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Не доступно при использовании динамического плейлиста" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Не подключено" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Недостаточно содержания" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Недостаточно фанатов" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Недостаточно участников" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Недостаточно соседей" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Не установлен" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Вход не выполнен " #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Не подключено - щелкните дважды для подключения" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Ничего не найдено" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Тип уведомления" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Уведомления" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Сейчас проигрывается" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Количество показываемых выпусков" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Предпросмотр OSD" #: widgets/osd.cpp:173 msgid "Off" msgstr "Выкл." #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "Вкл." #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Разрешать подключение с IP адресов из диапазонов:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Разрешать соединения только из локальной сети" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Показывать только первый" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Непрозрачность" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Открыть «%1» в браузере" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Открыть аудио-&диск…" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Открыть файл OPML" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Открыть файл OPML…" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Открыть папку для импортирования музыки" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Открыть устройство" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Открыть файл…" #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Открыть в Google Диске" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Открыть в новом плейлисте" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Открыть в новом плейлисте" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Открыть в браузере" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Открыть…" #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Операция не удалась" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Оптимизировать по битрейту" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Оптимизировать по качеству" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Настройки…" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Упорядочить файлы" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Упорядочить файлы…" #: core/organise.cpp:73 msgid "Organising files" msgstr "Упорядочивание файлов" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Исходные теги" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "Год выхода оригинала" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "Год выхода оригинала - Альбом" #: library/library.cpp:118 msgid "Original year tag support" msgstr "Поддержка года выхода оригинала" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Другие настройки" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Вывод" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Устройство вывода" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Настройки вывода" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Перезаписать все" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Перезаписать существующие файлы" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Перезаписать только меньшие" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Владелец" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Анализ каталога Jamendo" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Вечеринка" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Пароль" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Пауза" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Приостановить воспроизведение" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Приостановлен" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Исполнитель" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Пиксель" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Нормальная боковая панель" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Воспроизвести" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Количество проигрываний" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Воспроизвести если остановлено, приостановить если воспроизводится" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Проиграть, если ничего не проигрывается" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Воспроизвести -ную композицию в плейлисте" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Воспроизведение/Пауза" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Проигрывание" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Настройки проигрывателя" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Плейлист" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Плейлист закончился" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Настройки плейлиста" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Тип плейлиста" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Списки" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Пожалуйста, закройте браузер и вернитесь в Clementine." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Статус модуля:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Подкасты" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Поп" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Длительность отображения" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Порт" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Предусиление" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Настройки" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Настройки" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Настройки…" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Приоритетные имена файлов обложек (через запятые)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Предпочитаемый формат аудио" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Предпочитаемый битрейт" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Предпочитаемый формат" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Премиум-тип аудио" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Профиль:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Нажмите комбинацию клавиш" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Нажмите клавиши" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Нажмите сочетание клавиш для: \"%1\"…" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Нажатие кнопки \"Предыдущий\" осуществит…" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Настройки OSD" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Предпросмотр" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Предыдущий" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Предыдущий трек" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Вывести информацию о версии" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Профиль" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Ход выполнения" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Ход выполнения" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Психоделия" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Нажмите на кнопку пульта Wii" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Разбросать композиции в случайном порядке" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Качество" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Качество" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Опрашиваем устройство…" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Управление очередью" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Выбранные треки в очередь" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Трек в очередь" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Радио (одинаковая громкость для всех треков)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Дождь" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Дождь" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Случайная визуализация" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Оценка текущей песни 0 звёзд" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Оценка текущей песни 1 звезда" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Оценка текущей песни 2 звезды" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Оценка текущей песни 3 звезды" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Оценка текущей песни 4 звезды" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Оценка текущей песни 5 звёзд" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Рейтинг" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Действительно отменить?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Превышен предел перенаправлений, проверьте настройку сервера." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Обновить каталог" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Обновить каналы" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Обновить список станций" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Обновить потоки" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Регги" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Относительные" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Запомнить движение ульта Wii" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Вернуть предыдущее состояние" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Запомнить мой выбор" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Удалить" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Удалить действие" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Удалить повторы из плейлиста" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Удалить папку" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Удалить из Моей музыки" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Удалить из закладок" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Удалить из плейлиста" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Удалить плейлист" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Удалить плейлисты" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Удалить недоступные треки" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Переименовать плейлист" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Переименовать плейлист…" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Перенумеровать треки в данном порядке…" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Повтор" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Повторять альбом" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Повторять плейлист" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Повторять композицию" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Заменить текущий плейлист" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Заменить плейлист" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Заменять пробелы подчеркиванием" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Нормализация громкости" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Режим нормализации" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Перезаполнить" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Требовать код аутентификации" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Сброс" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Сбросить счётчики воспроизведения" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Перезапустит песню при повторном переходе к предыдущей " #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Перезапустить трек или проиграть предыдущий, если не прошло 8 секунд от начала." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Ограничить только символами ASCII" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Продолжить воспроизведение при запуске" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Вернуться в Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Правый канал" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Конвертировать" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Конвертировать CD" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Конвертировать аудио-диск" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Рок" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Выполнить" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "SOCKS прокси" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Ошибка установки SSL-соединения, проверьте настройки соединения. В некоторых случаях может помочь включение SSLv3." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Безопасно извлечь устройство" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Безопасно извлечь устройство после копирования" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Частота" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Частота" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Сохранять файлы тона .mood рядом с аудиофайлами" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Сохранить обложку альбома" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Сохранить обложку на диск…" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Сохранить изображение" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Сохранить плейлист" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Сохранить плейлист" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Сохранить плейлист…" #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Сохранить профиль" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Записывать рейтинги в теги файлов, если возможно" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Записывать статистику в теги файлов, если возможно" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Сохранить этот поток во вкладке Интернет" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Сохранение статистики композиций в файлы" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Сохранение композиций" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Профиль Scalable sampling rate (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Размер масштабирования" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Счет" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Скробблить треки, которые я слушаю" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Поиск" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Поиск" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Поиск станций Icecast" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Поиск в Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Поиск на Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Поиск в Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Искать автоматически" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Поиск обложек альбомов…" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Поиск чего-либо" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Поиск на gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Поиск в iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Режим поиска" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Параметры поиска" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Результаты поиска" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Условия поиска" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Второй уровень" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Перемотка назад" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Перемотка вперед" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Перемотать текущий трек на относительную позицию" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Перемотать текущую трек на абсолютную позицию" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "Перемотка с помощью горячих клавиш" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Выбрать все" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Отменить выбор" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Выбрать цвет фона:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Выбрать фоновое изображение" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Выбрать самые подходящие результаты" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Выберать основной цвет:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Выбрать визуализации" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Выбрать визуализации…" #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Выбрать…" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Серийный номер" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Сервер" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "Адрес сервера" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Информация о сервере" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Служба недоступна" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Установить %1 в \"%2\"…" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Установить громкость в процентов" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Установить значение для всех выделенных треков…" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Настройки" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Сочетание клавиш" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Сочетание клавиш \"%1\"" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Сочетание клавиш \"%1\" уже существует" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Показать" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Показывать OSD" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Подсвечивать проигрываемый трек" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Показывать индикатор тона в полосе прогресса" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Уведомления с помощью служб рабочего стола" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Уведомлять при изменении режима повтора/перемешивания" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Уведомлять при смене громкости" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Уведомлять о приостановке проигрывания" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Всплывающие сообщения из системного лотка" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Показывать OSD" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Показать над строкой состояния" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Показать все композиции" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Показать все песни" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Показывать обложки в фонотеке" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Показывать разделители" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Показать в полный размер…" #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Показывать группы в результатах глобального поиска" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Показать в диспетчере файлов" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Показать в фонотеке…" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Показать в \"Различных исполнителях\"" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Показывать индикатор тона" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Показывать только повторяющиеся" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Показывать только без тегов" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Показывать играющую музыку на вашей странице" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Показать поисковые подсказки" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Показывать кнопку \"В любимые\"" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Показывать кнопку скробблинга в главном окне" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Показывать значок в системном лотке" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Показать включенные и отключеные источники" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Показать/Скрыть" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Перемешивание" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Перемешать альбомы" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Перемешать все" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Перемешать плейлист" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Перемешать треки в этом альбоме" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Войти" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Выйти" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Выполняется вход…" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Похожие исполнители" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Размер" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Размер:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ска" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Переместить назад в плейлисте" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Пропустить подсчёт" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Переместить вперед в плейлисте" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Пропустить выбранные треки" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Пропустить трек" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Маленькая обложка альбома" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Узкая боковая панель" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Умный плейлист" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Умные плейлисты" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Мягкий" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Софт-рок" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Тексты песен" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Песня" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Сонограмма" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Извините" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Сортировать по жанру (в алфавитном порядке)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Сортировать по жанру (по популярности)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Сортировать по названию станции" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Сортировать песни по" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Сортировка" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Источник" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Источники" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Ошибка при входе на Spotify" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "Адрес плейлиста Spotify" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Модуль Spotify" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Модуль Spotify не установлен" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "Адрес песни Spotify" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Стандартнoe" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Оцененные" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Начать конвертирование" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Запустить проигрываемый сейчас плейлист" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Конвертировать" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Введите что-нибудь в поле для начала поиска" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Запуск %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Запуск…" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Остановить" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Остановить после" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Останавливать после каждого трека" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Останавливать после каждого трека" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Остановить после этого трека" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Остановить воспроизведение" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Остановить после текущего трека" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Остановить воспроизведение после трека: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Остановлено" #: core/song.cpp:431 msgid "Stream" msgstr "Поток" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Для потокового вещания с сервера Subsonic после 30-дневного пробного периода требуется действительная лицензия." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "\"Streaming\" подписка" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Подписчики" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Успешно завершено!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "Успешно записано %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Предлагаемые теги" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Сводка" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Очень высокая (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Очень высокое (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Поддерживаемые форматы" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Синхронизировать статистику в файлы прямо сейчас" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Синхронизация входящих Spotify" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Синхронизация плейлистов Spotify" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Синхронизация оцененных треков Spotify" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Системные цвета" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Вкладки вверху" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Сборщик тегов" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Целевой битрейт" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Техно" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Свойства текста" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Благодарим за помощь" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Команда \"%1\" не может быть выполнена" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Обложка альбома текущей композиции" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "Каталог %1 неправильный" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "Второе значение должно быть выше первого!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Запрошенный сайт не существует!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Запрошенная ссылка не является изображением!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Пробный период для сервера Subsonic закончен. Пожалуйста, поддержите разработчика, чтобы получить лицензионный ключ. Посетите subsonic.org для подробной информации." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Обновленная версия Clementine требует повторного сканирования фонотеки из-за следующих новых особенностей:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "В альбоме присутствуют другие композиции" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Произошла ошибка связи с gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Проблема получения метаданных с Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Произошла ошибка при разборе ответа от iTunes Store" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "В процессе копирования некоторых композиций возникли проблемы. Следующие файлы не могут быть скопированы:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "В процессе удаления некоторых композиций возникли проблемы. Следующие файлы не могут быть удалены:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Эти файлы будут удалены с устройства. Вы действительно хотите продолжить?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Эти файлы будут окончательно удалены с диска, Вы действительно хотите продолжить?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "В этих каталогах будет выполнен поиск музыки при создании вашей фонотеки" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Эти настройки используются в диалоге \"Конвертация музыки\" и при конвертировании музыки перед копированием на устройство." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Третий уровень" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Это действие создаст базу данных, которая может занимать более 150Мб.\nВсе равно продолжить?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Этот альбом не доступен в требуемом формате" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "В дальнейшем это может быть изменено в настройках" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Устройство должно быть подключено и открыто перед тем, как Clementine определит, какой формат оно поддерживает." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Это устройство поддерживает следующие форматы:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Это устройство не будет работать правильно" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Это MTP устройство, а ваша версия Clementine скомпилирована без поддержки libmtp." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Это iPod, а вы скомпилировали Clementine без поддержки libgpod." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Это устройство подключено впервые. Clementine выполнит поиск музыкальных файлов на устройстве. Это может занять некоторое время" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Эта опция может быть изменена в настройках на вкладке \"Поведение\"" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Поток только для платных подписчиков" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Не поддерживаемый тип устройства: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "Шаг времени" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Название" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Сегодня" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Включить OSD" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Развернуть на весь экран" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Переключить состояние очереди" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Вкл/выкл скробблинг" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Переключить видимость OSD" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Завтра" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Слишком много перенаправлений" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Самые популярные" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Всего альбомов:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Всего передано байт" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Всего выполнено сетевых запросов" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Трек" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Треки" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Конвертер музыки" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Журнал конвертера" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Конвертер" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Конвертировано %1 файлов в %2 потока" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Настройки конвертации" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Турбина" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Выключить" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "Ссылки" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Ультраширокая полоса пропускания (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Невозможно подключиться" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Невозможно загрузить %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Неизвестный" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Неизвестный тип контента" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Неизвестная ошибка" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Удалить обложку" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Не пропускать выбранные треки" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Не пропускать трек" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Отписаться" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Предстоящие концерты" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Обновить" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Обновить все подкасты" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Сканировать обновлённые папки" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Обновлять фонотеку при запуске Clementine" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Обновить этот подкаст" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Обновление" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Идет обновление %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Обновление %1%…" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Обновление фонотеки" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Использование" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "По возможности использовать тег \"Исполнитель альбома\"" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Использовать горячие клавиши Gnome" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Психоделические цвета" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Использовать значения из тегов по возможности" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Использовать SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Использовать пульт Wii" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Использовать собственный набор цветов" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Использовать собственное сообщение для уведомлений" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Использовать удалённое управление по сети" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Использовать аутентификацию" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Использовать движок управления битрейтом" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Использовать динамический режим" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Уведомлять о статусе пульта Wii" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Использовать временнóе сглаживание шумов" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Использовать язык системы" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Использовать системные цвета" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Использовать системные настройки прокси" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Использовать нормализацию громкости" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Использовано" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Интерфейс" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Имя пользователя" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "После добавления песни через меню…" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Переменный битрейт" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Различные исполнители" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Версия %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Просмотр" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Режим визуализации" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Визуализации" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Настройки визуализации" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "ВКонтакте" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Определение голоса" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Громкость %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Стена" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Оповещать при закрытии вкладки плейлиста" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Веб-сайт" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Недель" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "При запуске Clementine" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "При поиске обложек альбомов Clementine будет сначала искать файлы изображений, которые содержат одно из этих слов.\nПри отсутствии совпадений будет использовано наибольшее изображение в каталоге." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "При сохранении плейлистов пути файлов должны быть" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Когда список пуст…" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Почему бы не попробовать…" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Шировая полоса пропускания (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Пульт Wii %1: активен" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Пульт Wii %1: подключен" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Пульт Wii %1: критический уровень заряда батареи (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Пульт Wii %1: неактивен" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Пульт Wii %1: отключен" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Пульт Wii %1: низкий заряд батареи (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Пульт Wii Remote" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128 кбит/c" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40 кбит/c" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64 кбит/c" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Без обложек:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Хотите ли вы переместить и другие песни из этого альбома в \"Различные исполнители?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Желаете запустить повторное сканирование?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Записать все статистические данные в файлы композиций" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Записывать мета-данные" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Неверное имя или пароль." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Год" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Год - Альбом" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Годы" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Вчера" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Вы собираетесь скачать следующие альбомы" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Вы собираетесь удалить %1 плейлистов из избранных, уверены?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Вы собираетесь удалить плейлист, который не является избранным: плейлист будет удалён (действие не может быть отменено). \nВы действительно хотите продолжить?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Вход не выполнен." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Вы вошли в систему как %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Вы вошли в систему." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Можно изменить способ организации композиций в фонотеке." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Бесплатное прослушивание возможно без регистрации, но Premium-пользователи могут слушать потоки в более высоком качестве и без рекламы." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Прослушивание композиций с Magnatune бесплатно и не требует регистрации. Регистрация убирает сообщения в конце каждой композиции." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Фоновые звуки можно слушать одновременно с другой музыкой." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Для дистанционного управления Clementine можно использовать пульт Wii. Подробнее на wiki-странице Clementine.\n\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "У вас нет учетной записи Spotify Premium." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "У вас нет активной подписки" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "Для поиска и прослушивания музыки на SoundCloud входить не обязательно. Но если вы хотите получить доступ к своим плейлистам и подпискам, то нужно войти." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Произошёл выход из Spotify. Введите ваш пароль повторно в диалоге Настройки." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Произошёл выход из Spotify. Введите ваш пароль повторно." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Вам нравится эта композиция" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "Вы должны запустить Настройку системы \"System Preferences\" и позволить Clemetine \"управлять вашим компьютером\" для использования глобальных горячих клавиш в Clementine." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Для применения языка потребуется перезапуск Clementine." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Ваш IP-адрес:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Учётные данные Last.fm введены неверно" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Учётные данные Magnatune введены неверно" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Ваша фонотека пуста!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Ваши потоки радио" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Заскробблено: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Отсутствует поддержка OpenGL в системе, визуализации недоступны." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Имя пользователя или пароль указаны неверно." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Я-А (Z-A)" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "По-умолчанию" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "добавить %n композиций" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "после" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "тому назад" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "и" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "авто" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "до" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "между" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "наибольшие сначала" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "содержит" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "отключён" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "диск %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "не содержит" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "заканчивается на" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "совпадает с" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "Каталог gpodder.net" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "больше чем" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "Носители типа iPod и USB временно не поддерживаются в Windows. Извините!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "в последние" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "кбит/с" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "меньше чем" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "сначала самые длинные" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "переместить %n композиций" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "сначала самые новые" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "не совпадает с" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "не в последние" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "не на" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "сначала самые старые" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "на" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "настройки" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "или сканируйте QR-код!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "нажмите ввод" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "удалить %n композиций" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "сначала кратчайший" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "перемешать песни" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "сначала наименьший" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "сортировать песни" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "начинается на" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "стоп" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "композиция %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/si_LK.po000066400000000000000000004020711260417502300242440ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Sinhala (Sri Lanka) (http://www.transifex.com/davidsansome/clementine/language/si_LK/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: si_LK\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr "" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "" #: core/utilities.cpp:119 msgid "1 day" msgstr "" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "" #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "" #: core/song.cpp:422 msgid "AIFF" msgstr "" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "" #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "" #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "" #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "" #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "" #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "" #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "" #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:80 msgid "All the translators" msgstr "" #: library/library.cpp:98 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:85 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "" #: ui/about.cpp:68 msgid "Authors" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "" #: core/database.cpp:648 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "" #: core/song.cpp:428 msgid "CDDA" msgstr "" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "" #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:114 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "" #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "" #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "" #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "" #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:68 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:585 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "" #: library/library.cpp:80 msgid "Last played" msgstr "" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: ui/equalizer.cpp:137 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "" #: core/song.cpp:410 msgid "MPC" msgstr "" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "" #: library/library.cpp:74 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:92 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "" #: core/utilities.cpp:151 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "" #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "" #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "" #: core/organise.cpp:73 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:139 msgid "Party" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "" #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "" #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "" #: core/song.cpp:431 msgid "Stream" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "" #: ui/about.cpp:74 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "" #: core/song.cpp:426 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "" #: devices/giolister.cpp:157 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/sk.po000066400000000000000000005141051260417502300236620ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Dušan Kazik , 2015 # bs_ , 2013 # Ján Ďanovský , 2011-2015 # Levi Taule , 2015 # Michal Polovka , 2012 # MiroslavR , 2015 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Slovak (http://www.transifex.com/davidsansome/clementine/language/sk/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sk\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nMôžte playlisty označiť ako obľúbené kliknutím na hviezdičku vedľa názvu playlistu\n\nObľúbené playlisty budú uložené tu" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "dní" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kb/s" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " bodov" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "s" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " sekúnd" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " piesne" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 piesne)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 albumov" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 dní" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "Pred %1 dňami" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 na %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 playlistov (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 vybratých z" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 pieseň" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 piesní" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "nájdených %1 piesní" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "nájdených %1 piesní (zobrazuje sa %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 skladieb" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 prenesených" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev modul" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 ďalších poslucháčov" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 spolu prehraní" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n zlyhalo" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n dokončených" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n zostávajúcich" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "Zarovn&ať text" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "Na &stred" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Vlastná" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "Bonusy" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Nápoveda" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&Skryť %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Skryť..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Vľavo" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "Hudba" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Nijaká" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "Playlist" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Zavrieť" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Režim opakovania" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "Vp&ravo" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Režim zamiešavania" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "Roztiahnuť &stĺpce na prispôsobenie oknu" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "Nástroje" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(odlišné naprieč mnohými piesňami)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", od " #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...a všetkým prispievateľom Amaroku" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 deň" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 skladba" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192000Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44100Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48000Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 náhodých piesní" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96000Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Prejsť teraz na prémium verziu" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Ak nie je zaškrtnuté, Clementine sa pokúsi uložiť vaše hodnotenia a ďalšie štatistiky iba v samostatnej databáze a nebude meniť vaše súbory.

Ak je zaškrtnuté, štatistika sa bude ukladať rovnako do databázy aj priamo do súboru vždy keď sa zmení.

Uvedomte si, prosím, že toto nemusí fungovať pre každý formát, a neexistuje ani žiadny štandard, ako toto robiť, takže iné hudobné prehrávače možno nebudú schopné tieto súbory čítať.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Pred hľadaný výraz napíšte typ výraz, ktorý hľadáte, napr. artist:Bode vyhľadá v zbierke všetkých interprétov, ktorý obsahujú slovo Bode.

Dostupné typy: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Toto zapíše hodnotenie piesní a štatistiky do tagov piesní pri všetkých piesňach vo vašej zbierke.

Toto nie je potrebné, ak bola možnosť "Ukladať hodnotenie piesní a štatistiky do tagov piesní" vždy zapnutá.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Štítky začínajte s %, napríklad: %artist %album %title

\n\n

Ak naplníte sekciu znakmi ktoré obsahujú štítok so zloženými zátvorkami, táto sekcia bude skrytá, ak je štítok prázdny.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Je vyžadovaný prémium účet na Spotify." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Klient sa môže pripojiť len vtedy, ak bol zadaný správny kód." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Inteligentný playlist je dynamický zoznam piesní z vašej zbierky. Existujú rôzne typy inteligentných playlistov ktoré ponúkajú rúzne cesty výberu piesní." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Pieseň bude zahrnutá do playlistu ak spĺňa tieto podmienky." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ALL GLORY TO THE HYPNOTOAD" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Zrušiť" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "O %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "O Clemetine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "O Qt.." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "absolútne" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Detaily účtu" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Podrobnosti účtu (prémium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Činnosť" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Činnosť" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Aktivovať/deaktivovať Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Stream činností" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Pridať podcast" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Pridať stream" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Pridať nový riadok, ak je to podporované typom upozornení" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Pridať činnosť" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Pridať všetky skladby z priečinka a všetkých jeho podpriečinkov" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Pridať ďalší stream..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Pridať priečinok..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Pridať súbor" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Pridať súbor na prekódovanie" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Pridať súbor(y) na prekódovanie" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Pridať súbor..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Pridať súbory na transkódovanie" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Pridať priečinok" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Pridať priečinok..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Pridať nový priečinok..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Pridať podcast" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Pridať podcast..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Pridať výraz hľadania" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Pridať tag albumu" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Pridať tag interpréta albumu" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Pridať tag interpréta piesne" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Pridať automatické skóre piesne" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Pridať tag skladateľa piesne" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Pridať tag disku" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Vložiť názov súboru piesne" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Pridať tag žánru piesne" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Pridať tag zoskupenia piesne" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Pridať tag dĺžky piesne" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Pridať tag účinkujúceho piesne" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Pridať počet prehraní piesne" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Pridať hodnotenie piesne" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Pridať počet preskočení piesne" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Pridať tag názvu piesne" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Pridať pieseň do vyrovnávacej pamäte" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Pridať tag čísla skladby" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Pridať tag roka piesne" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Pridať piesne do \"Moja hudba\", pri kliknutí na tlačítko Obľúbiť" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Pridať stream..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Pridať do Moja hudba" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Pridať do Spotify playlistov" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Pridať do S hviezdičkou na Spotify" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Pridať do iného playlistu" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Pridať do záložiek" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Pridať do playlistu" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "ju pridá do poradia" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Pridať používateľa/skupinu do záložiek" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Pridať wiimotedev činnosť" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Pridať..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Pridané tento mesiac" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Pridané tento týždeň" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Pridané tento rok" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Pridané dnes" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Pridané posledný štvrťrok" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Pokročilé zoraďovanie..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Po " #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Po kopírovaní..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Album (ideálna hlasitosť pre všetky skladby)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Interprét albumu" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Obal albumu" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Informácie o albume na jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Albumy" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Albumy s obalmi" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Albumy bez obalov" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Všetko" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Všetky súbory (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "All Glory to the Hypnotoad!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Všetky albumy" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Všetci interpréti" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Všetky súbory (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Všetky playlisty (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "DAG Software (Ďanovský Ján), všetkým ostatným prekladateľom" #: library/library.cpp:98 msgid "All tracks" msgstr "Všetky skladby" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Povoliť klientu stiahnuť hudbu z tohto počítača." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Povoliť sťahovania" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Povoliť stred/kraj enkódovanie" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Po boku originálov" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Vždy skryť hlavné okno" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Vždy zobrazovať hlavné okno" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Hneď začne hrať" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon Cloud Drive" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Aby sa dalo Spotify využiť v Clementine, je vyžadovaný ďalší plugin. Chcete ho teraz stiahnuť a nainštalovať?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Nastala chyba pri načítavaní iTunes databázy" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Vyskytla sa chyba počas zapisovania metadát do '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Vyskytla nešpecifikovaná chyba." #: ui/about.cpp:85 msgid "And:" msgstr "A:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Zlostný" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Vzhľad" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Pridať súbory/URL adresy do playlistu" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Pridať do aktuálneho playlistu" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "ju pridá do playlistu" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Použiť kompresiu na zabránenie odrezávania" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Ste si istý, že chcete vymazať predvoľbu \"%1\"?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Ste si istý, že chcete zresetovať štatistiky tejto piesne?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Ste si istý, že chcete ukladať štatistiky piesní do súboru piesne pri všetkých piesňach vo vašej zbierke?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Interprét" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Interprét" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Tagy interpréta" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Iniciálky interpréta" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Opýtať sa pri ukladaní" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Audio formát" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Výstup zvuku" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Autentifikácia zlyhala" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Autor" #: ui/about.cpp:68 msgid "Authors" msgstr "Autori" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Automaticky" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Automaticky" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Automatické aktualizovanie" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Automaticky otvoriť jednotlivé kategórie v strome zbierky" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "K dispozícii" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Priemerný dátový tok" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Priemerná veľkosť obrázku" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "Podcasty BBC" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Streamy na pozadí" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Farba pozadia" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Obrázok na pozadí" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Priehľadnosť pozadia" #: core/database.cpp:648 msgid "Backing up database" msgstr "Zálohuje sa databáza" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Vyváženie" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "Zakázať (Last.fm skroblovanie)" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Prúžkový analyzér" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Základná modrá" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Základný typ zvuku" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Správanie" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Najlepšia" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Životopis z %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Bit rate" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Dátový tok" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Dátový tok" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Blokový analyzér" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Typ bloku" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Množstvo rozmazania" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Obsah" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Boom analyzér" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Prehľadávať..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Dĺžka vyrovnávacej pamäte" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Ukladá sa do vyrovnávacej pamäte" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Zostavuje sa index Seafile..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Ale tieto zdroje sú zakázané:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Tlačidlá" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "podpora CUE zoznamu" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Cesta k vyrovnávacej pamäti:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Ukladá sa do vyrovnávacej pamäte" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "%1 sa ukladá do vyrovnávacej pamäte" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Zrušiť" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Zrušiť sťahovanie" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Vyžaduje sa Captcha.\nSkúste sa prihlásiť na Vk.com vo vašom prehliadači, aby ste opravili tento problém." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Zmeniť obal albumu" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Zmeniť veľkosť písma..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Zmeniť režim opakovania" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Zmeniť skratku..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Zmeniť režim zamiešavania" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "Zmeniť momentálne prehrávanú pieseň" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Zmeniť jazyk" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "Zmeny sa prejavia pri spustení prehrávania nasledujúcej skladby" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Zmena nastavenia mono prehrávania bude účinná pre nasledujúce prehrávané piesne." #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Skontrolovať, či sú nové časti" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Skontrolovať aktualizácie" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Skontrolovať aktualizácie..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Vyberte priečinok vyrovnávacej pamäte na Vk.com" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Vyberte názov pre váš inteligentný playlist" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Vybrať automaticky" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Vybrať farbu..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Vybrať písmo..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Vybrať zo zoznamu" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Vyberte, ako má byť playlist usporiadaný a koľko piesní má obsahovať." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Vybrať pričinok na sťahovanie podcastu" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Vyberte internetové služby, ktoré chcete zobraziť." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Vyberte webstránky ktoré chcete použiť na hľadanie textov piesní." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Classical" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Upratovanie" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Vyprázdniť" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Vyprázdniť playlist" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Chyba Clementine" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Klementínková oranžová" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Clementine vizualizácia" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine môže automaticky konvertovať hudbu, ktorú ste skopírovali na toto zariadenie do formátu, ktorý môže prehrať." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Clementine môže prehrávať hudbu, torú ste uploadli na Amazon Cloud Drive" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine môže prehrávať hudbu, ktorú ste uploadli do služby Box" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine môže prehrať hudbu, ktorú ste uploadli na Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine môže prehrávať hudbu, ktorú ste uploadli na Google Drive" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine môže prehrávať hudbu, ktorú ste uploadli do služby OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine môže zobraziť správu keď sa zmení skladba." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine môže synchronizovať váš zoznam predplatných s vašimi ďalšími počítačmi a programami pre podcasty. Vytvoriť účet." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine nemôže načítať žiadnu projectM vizualizáciu. Skontrolujte, či máte Clementine nainštalovaný správne." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Clementine prehliadač obrázkov" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine nebol schopný nájsť výsledky pre tento súbor" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine bude hľadať hudbu na:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Kliknite sem aby ste pridali nejakú hudbu" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Kliknite sem pre označenie tohto playlitu ako obľúbeného, uloží sa a zostane prístupný cez bočný panel Playlisty" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Kliknite na prepínanie medzi zostávajúcim a celkovým časom" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Kliknutie na tlačítko Prihlásiť otvorí internetový prehliadač.\nPo tom, ako sa prihlásite, mali by ste sa vrátiť do Clementine." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Zatvoriť" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Zatvoriť playlist" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Zatvoriť vizualizáciu" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Zatvorenie tohto okna zruší sťahovanie." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Zatvorenie tohto okna zastaví hľadanie obalov albumov" #: ui/equalizer.cpp:114 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Farby" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Čiarkou oddelený zoznam class:level, level je 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Komentár" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Komunitné rádio" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Vyplniť tagy automaticky" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Vyplniť tagy automaticky..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Skladateľ" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Nastaviť %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Nastaviť Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Klávesové skratky" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Nastaviť Spotify..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Nastaviť Subsonic..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Nastaviť Vk.com..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Nastaviť globálne vyhľadávanie..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Nastaviť zbierku..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Nastaviť podcasty..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Nastaviť..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Pripojiť Wii diaľkové použitím činnosti aktivovať/deaktivovať" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Pripojiť zariadenie" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Pripájanie k Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Spojenie odmietnuté serverom, skontrolujte URL adresu serveru. Príklad: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Čas na spojenie vypršal, skontrolujte URL adresu serveru. Príklad: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Problémy s pripojením, alebo je zvuk zakázaný vlastníkom" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Konzola" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Konštantný dátový tok" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Konvertovať všetku hudbu" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Konvertovať hudbu ktorú zariadenie nemôže prehrať" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Konvertovať bezstratové zvukové súbory pred ich odoslaním do vzdialeného úložiska." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Konvertovať bezstratové súbory" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Kopírovať zdieľanú URL adresu do schránky" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Kopírovať do schránky" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Skopírovať na zariadenie..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Skopírovať do zbierky..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Autorské práva" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Nedalo sa pripojiť na Subsonic, skontrolujte URL adresu servera. Napríklad: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Nedal sa vytvoriť GStreamer element \"%1\" - uistite sa, že máte nainštalované všetky potrebné pluginy GStreamera." #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Nepodarilo sa vytvoriť playlist" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Nedal sa nájsť muxer pre %1, skontrolujte či máte korektne nainštalované GStreamer pluginy" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Nedal sa nájsť enkóder pre %1, skontrolujte či máte korektne nainštalované GStreamer pluginy" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Nedá sa otvoriť výstupný súbor %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Správca obalov" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Obal zo zabudovaného obrázka" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Obal automaticky načítaný z %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Obal ručne nenastavený" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Obal nenastavený" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Obal nastavený z %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Obaly z %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Prelínať keď sa zmení skladba automaticky" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Prelínať keď sa zmení skladba ručne" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Vlastné" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Vlastný obrázok" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Vlastné nastavenie správy" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Vlastná..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "DBus cesta" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dance" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Bolo zistené porušenie databázy. Prosím, prečítajte si https://code.google.com/p/clementine-player/wiki/DatabaseCorruption pre inštrukcie, ako zotaviť vašu databázu" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Dátum vytvorenia" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Dátum zmeny" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Dni" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "Pôvo&dná" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Znížiť hlasitosť o 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Znížiť hlasitosť o %" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Znížiť hlasitosť" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Štandardný obrázok na pozadí" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Východzie zariadenie na %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Predvolené" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Oneskorenie medzi vizualizáciami" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Vymazať" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Vymazať stiahnuté dáta" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Vymazať súbory" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Vymazať zo zariadenia..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Vymazať z disku..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Vymazať prehrané časti" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Vymazať predvoľbu" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Vymazať inteligentný playlist" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Vymazať pôvodné súbory" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Odstraňujú sa súbory" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Vybrať z radu vybrané skladby" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Vybrať z radu skladbu" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Cieľ" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Podrobnosti..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Zariadenie" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Vlastnosti zariadenia" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Názov zariadenia" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Vlastnosti zariadenia..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Zariadenia" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Dialóg" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Mysleli ste" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Digitally Imported heslo" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Digitally Imported meno používateľa" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Priame pripojenie na internet" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Priečinok" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Zakázať trvanie" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Zakázať vytváranie panelu nálady" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Zakázané" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Zakázané" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Disk" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Nesúvislý prenos" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Možnosti zobrazovania" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Zobrazovať OSD" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Vykonať preskenovanie celej zbierky" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Vykonať úplné preskenovanie" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Vykonať úplné preskenovanie..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Nekonvertovať žiadnu hudbu" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Neprepisovať" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "Úplné preskenovanie spôsobí stratu akýchkoľvek metadát uložených v Clementine, napr. obrázky obalov, počty prehraní, a hodnotenia. Clementine znovu preskenuje všetku vašu hudbu v Google Drive, čo môže zabrať nejaký čas." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Neopakovať" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Nezobrazovať v rôznych interprétoch" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Nezobrazovať vypočuté epizódy" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Nezamiešavať" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Neprestávať!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Prispieť" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Otvoríte dvojklikom" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "Dvojklik na pieseň v playliste..." #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Dvojklik na pieseň..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Stiahnuť %n častí" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Priečinok na sťahovanie" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Stiahnuť časti do" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Členstvo sťahovania" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Sťahovať nové časti automaticky" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Sťahovanie zaradené" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Nastavenia sťahovania" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Stiahnuť Android aplikáciu" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Stiahnuť tento album" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Stiahnuť tento album..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Stiahnuť túto časť" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Stiahnuť..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Sťahovanie (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Sťahuje sa Icecast priečinok" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Sťahuje sa Jamendo katalóg" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Sťahuje sa Magnatune katalóg" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Sťahuje sa Spotify plugin" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Sťahujú sa metadáta" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Pretiahnite na iné miesto" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dubstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Dĺžka" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Dynamický režim je zapnutý" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Dynamicky náhodná zmes" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Upraviť inteligentný playlist..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Upraviť tag \"%1\"..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Upraviť tag..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Upraviť tagy" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Upravť informácie o skladbe" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Upravť informácie o skladbe..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Upraviť informácie o skladbách" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Upraviť..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "Email" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Povoliť podporu Wii diaľkového" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Povoliť automatické ukladanie do vyrovnávacej pamäte" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Povoliť ekvalizér" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Povoliť skratky len keď je Clementine zameraný" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Povoliť upravovanie metadát piesní kliknutím na riadok" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Povoľte zdroje nižšie, aby boli zahrnuté do výsledkov vyhľadávania. Výsledky budú zobrazené v tomto poradí." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Povoliť/zakázať Last.fm skroblovanie" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Zložitosť enkódovania" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Kvalita enkódovacieho stroja" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Režim enkódovania" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Zadajte URL adresu" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Zadajte URL adresu na stiahnutie obalu z internetu:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Zadajte názov súboru pre exportované obaly (bez prípony):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Zadajte nový názov pre tento playlist" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Sem vyššie zadajte určité výrazy, aby ste našli hudbu vo vašom počítači alebo na internete" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Zadajte výrazy na hľadanie nižšie, aby ste našli podcasty na iTunes Store" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Zadajte výrazy na hľadanie nižšie, aby ste našli podcasty na gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Sem napíšte výrazy na hľadanie" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Zadajte URL adresu internetového rádio streamu:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Vložte názov priečinka" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Zadajte túto IP adresu v programe na spojenie s Clementine." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Celá zbierka" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Ekvalizér" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Ekvivalent k --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Ekvivalent k --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Chyba" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Chyba pri ripovaní CD" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Chyba pri pripájaní MTP zariadenia" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Chyba pri kopírovaní piesní" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Chyba pri vymazávaní piesní" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Chyba pri sťahovaní Spotify pluginu." #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Chyba pri načítavaní %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Chyba pri načítavaní di.fm playlistu" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Chyba spracovania %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Chyba pri čítaní zvukového CD" #: library/library.cpp:68 msgid "Ever played" msgstr "Vždy hrané" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Každých 10 minút" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Každých 12 hodín" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Každé 2 hodiny" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Každých 20 minut" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Každých 30 minút" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Každých 6 hodín" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Každú hodinu" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Nezoslabovať medzi skladbami z rovnakého albumu" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Existujúce obaly" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Rozbaliť" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Vyprší %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Exportovať obaly" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Exportovať obaly" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Exportovať stiahnuté obaly" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Exportovať vložené obaly" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Exportovanie dokončené" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Exportovaných %1 obalov z %2 (%3 preskočených)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Zoslabenie pri pozastavení / zosilenie pri obnovení prehrávania" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Zoslabiť pri zastavení skladby" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Zoslabovanie" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Trvanie zoslabovania" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Zlyhalo čítanie CD v mechanike" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Zlyhalo získanie priečinka" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Zlyhalo získanie podcastov" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Zlyhalo načítanie podcastu" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Zlyhalo spracovanie XML pre tento RSS kanál" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Rýchla" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Obľúbené skladby" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Získať chýbajúce obaly" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Získavať automaticky" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Sťahovanie dokončené" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Získava sa zbierka zo Subsonicu" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Chyba pri získavaní obalu" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Formát súboru" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Prípona súboru" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Formáty súborov" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Názov súboru" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Názov súboru (bez cesty)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Vzor pre názov súboru:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Cesty k súborom" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Veľkosť súboru" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Typ súboru" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Názov súboru" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Súbory" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Súbory na transkódovanie" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Nájsť piesne vo vašej zbierke ktoré spĺňajú kritériá ktoré ste zadali." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Nájsť tohto interpréta" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Robí sa odtlačok piesne" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Dokončiť" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Prvá úroveň" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Prispôsobiť obal šírke" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Veľkosť písma" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Kvôli licenčným dôvodom je podpora Spotify v oddelenom plugine." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Vynútiť mono enkódovanie" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Zabudnúť na zariadenie" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Zabudnutie zariadenia ho odstráni z tohto zoznamu a Clementine bude musieť preskenovať všetky piesne znovu, keď ho nabudúce pripojíte." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Formulár" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Formát" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Počet snímkov" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Snímkov na buffer" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Zmrznutý" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Plné basy" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Plné basy a výšky" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Plné výšky" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Všeobecné" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Všeobecné nastavenia" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Žáner" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Získať URL adresu na zdieľanie tejto piesne na Spotify" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Získať URL adresu na zdieľanie tohto playlistu" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Preberanie kanálov" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Získavanie streamov" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Pomenujte:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Prejsť" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Prejsť na kartu ďalšieho playlistu" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Prejsť na kartu predchádzajúceho playlistu" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Získaných %1 obalov z %2 (%3 zlyhalo)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Zošednúť neexistujúce piesne v playlistoch" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Zoraďovanie zbierky podľa..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Zoradiť podľa" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Zoradiť podľa albumu" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Zoradiť podľa interpréta" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Zoradiť podľa interprét/album" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Zoradiť podľa interprét/rok - album" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Zoradiť podľa žáner/album" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Zoradiť podľa žáner/interprét/album" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Zoskupenie" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "HTML stránka neobsahuje žiadne RSS kanály" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "Stavový kód HTTP 3xx prijatý bez URL adresy, overte nastavenie serveru" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "HTTP proxy" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Šťastný" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Hardwarové informácie" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Hardwarové informácie sú dostupné len keď je zariadenie pripojené." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Vysoké" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Vysoké (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Vysoká (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "Hip Hop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Hostiteľ nenájdený, skontrolujte URL adresu serveru. Príklad: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Hodiny" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Nemám Magnatune účet" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Ikona" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Ikony na vrchu" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Identifikuje sa pieseň" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Ak je aktivované, kliknutím na vybratú pieseň v playliste priamo upravíte tagy" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Ak budete pokračovať, toto zariadenie bude pracovať pomaly a skopírované piesne možno nebudú fungovať." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Ak poznáte URL adrsesu podcastu, zadajte ju nižšie a kliknite na Prejsť." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Ignorovať „The“ v menách interprétov" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Obrázky (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Obrázky (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Importovať..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "Za %1 dní" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "Za %1 týždňov" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "V dynamickom režime budú nové skladby vybraté a pridané do playlistu zakaždým keď skončí pieseň." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Doručené" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Zahrnúť obal do upozornenia" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Zahrnúť všetky piesne." #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Nekompatibilná verzia Subsonic REST protokolu. Klienta musíte aktualizovať." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Nekompatibilná verzia Subsonic REST protokolu. Server musíte aktualizovať." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Neúplné nastavenie. Zabezpečte, prosím, aby boli všetky políčka vyplnené." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Zvýšiť hlasitosť o 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Znížiť hlasitosť o %" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Zvýšiť hlasitosť" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Indexuje sa %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Informácie" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Možnosti vstupu" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Vložiť..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Nainštalované" #: core/database.cpp:585 msgid "Integrity check" msgstr "Kontrola integrity" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Internetoví poskytovatelia" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Internetové služby" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "Úvodné skladby" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Neplatný API kľúč" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Neplatný formát" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Neplatná metóda" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Neplatné parametre" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Určený neplatný zdroj" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Nefunkčná služba" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Neplatný kľúč sedenia" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Invertovať výber" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Jamendo najpočúvanejšie skladby" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Jamendo naj skladby" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo naj skladby mesiaca" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo naj skladby týždňa" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Jamendo databáza" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Okamžitý prechod na predchádzajúcu pieseň" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Skočiť na práve prehrávanú skladbu" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Držte tlačidlá %1 sekundu..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Držte tlačidlá %1 sekúnd..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Nechať bežať na pozadí, keď sa zavrie hlavné okno" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Zachovať pôvodné súbory" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Mačiatka" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Jazyk" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Notebook/sluchátka" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Large Hall" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Veľký obal albumu" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Veľký obal albumu (detaily naspodku)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Veľký obal albumu (bez detailov)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Veľký bočný panel" #: library/library.cpp:80 msgid "Last played" msgstr "Naposledy prehrávané" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Naposledy prehrávané" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm je práve zaneprázdnené, prosím skúste za pár minút" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Last.fm heslo" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Last.fm počet prehraní" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Last.fm tagy" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Last.fm použ. meno" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Najmenej obľúbené skladby" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Ľavý" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Dĺžka" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Zbierka" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Pokročilé zoraďovanie zbierky" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Poznámka k preskenovaniu zbierky" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Hľadanie v zbierke" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Obmedzenia" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Načítať" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Načítať obal z URL adresy" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Načítať obal z URL adresy..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Načítať obal z disku" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Načítať obal z disku..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Načítať playlist" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Načítať playlist..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Načítava sa MTP zariadenie" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Načítava sa iPod databáza" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Načítava sa inteligentný playlist" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Načítavanie piesní" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Načítava sa stream" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Načítavajú sa skladby" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Načítavajú sa informácie o skladbe" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Načítava sa..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Načítať súbory/URL adresy, nahradiť nimi aktuálny playlist" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Prihlásiť sa" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Prihlásenie zlyhalo" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Odhlásiť" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Profil dlhodobej predpovede (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Obľúbené" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "Povoliť (Last.fm skroblovanie)" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Nízke (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Nízka (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Nízko-komplexný profil (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Texty piesní" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Texty z %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Texty z ID3v2 tagu" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Magnatune sťahovanie" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Magnatune sťahovanie dokončené" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Hlavný profil (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Make it so!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Make it so!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Urobiť playlist dostupný offline" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Poškodená odpoveď" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Ručné nastavenie proxy" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Ručne" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Výrobca" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Označiť ako vypočuté" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Označiť ako nové" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Spĺňať všetky výrazy hľadania (AND)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Splniť jeden alebo viac výrazov (OR)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Maximum výsledkov globálneho vyhľadávania" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Maximálny dátový tok" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Médium sa zmenilo. Načítava sa znovu." #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Stredné (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Stredná (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Typ členstva" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Minimálny dátový tok" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Nejmenšie naplnenie vyrovnávacej pamäte" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Chýbajú projectM predvoľby" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Sledovať zmeny v zbierke" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Mono prehrávanie" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Mesiace" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Nálada" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Štýl panelu nálady" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Panel nálady" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Viac" #: library/library.cpp:84 msgid "Most played" msgstr "Najviac hrané" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Bod pripojenia" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Body pripojenia" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Posunúť nižšie" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Presunúť do zbierky..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Posunúť vyššie" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Hudba" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Hudobná zbierka" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Stlmiť" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Moje albumy" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Moja hudba" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Moje odporúčania" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Názov" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Názov" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Možnosti pomenovávania" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Úzke pásmo" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Sieťové proxy" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Diaľkové ovládanie cez sieť" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Nikdy" #: library/library.cpp:74 msgid "Never played" msgstr "Nikdy nehrané" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Nezačne sa prehrávať" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Nový playlist" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Nový playlist" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Nový inteligentný playlist..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Nové piesne" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Nové skladby budú pridané autamticky." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Najnovšie skladby" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Ďalšia" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Nasledujúca skladba" #: core/utilities.cpp:151 msgid "Next week" msgstr "Budúci týždeň" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Bez analyzéru" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Žiaden obrázok na pozadí" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Žiadne obaly na exportovanie." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Žiadne dlhé bloky" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Nenájdené. Vymažte políčko hľadania pre opätovné zobrazenie celého playlistu." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Žiadne krátke bloky" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Nijako" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Žiadna z vybratých piesní nieje vhodná na kopírovanie do zariadenia" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Normálny" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Normálny typ bloku" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Nedostupné, keď sa používajú dynamické playlisty" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Nepripojené" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Nedostatok obsahu" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Nedostatok fanúšikov" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Nedostatok členov" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Nedostatok susedov" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Nenainštalované" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Nieprihlásený" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Nepripojené - pripojíte dvojklikom" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Nič sa nenašlo" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Typ upozornení" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Upozornenia" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Prehráva sa" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Počet epizód na zobrazenie" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "OSD ukážka" #: widgets/osd.cpp:173 msgid "Off" msgstr "Vypnuté" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "Zapnuté" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Akceptovať iba spojenia z klientov s rozsahom ip adries:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Povoliť spojenie iba z lokálnej siete" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Iba prvé zobraziť" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Nepriehľadnosť" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Otvoriť %1 v prehliadači" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Otvoriť &zvukové CD..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Otvoriť OPML súbor" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Otvoriť OPML súbor..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Otvoriť priečinok na importovanie hudby z neho" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Otvoriť zariadenie" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Otvoriť súbor ..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Otvoriť v Google Drive" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "ju otvorí v novom playliste" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "ju otvorí v novom playliste" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Otvoriť v prehliadači" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Otvoriť..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Operácia zlyhala" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Optimalizovať na dátový tok" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Optimalizovať na kvalitu" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Možnosti..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Organizovať súbory" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Spravovať súbory..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Spravovanie súborov" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Pôvodné tagy" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "Pôvodný rok" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "Pôvodný rok - Album" #: library/library.cpp:118 msgid "Original year tag support" msgstr "Podpora tagu pôvodného roku" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Ostatné možnosti" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Výstup" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Výstupné zariadenie" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Možnosti výstupu" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Prepísať všetko" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Prepísať existujúce súbory" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Prepísať iba menšie" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Vlastník" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Analyzuje sa Jamendo katalóg" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Party" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Heslo" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Pozastaviť" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Pozastaviť prehrávanie" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Pozastavené" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Účinkujúci" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Pixel" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Obyčajný bočný panel" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Hrať" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Počet prehraní" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Hrať ak je zastavené, pozastaviť ak hrá" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Začne hrať, ak sa nič neprehráva" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Hrať . skladbu v playliste" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Hrať/Pozastaviť" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Prehrávanie" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Možnosti prehrávača" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Playlist" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Playlist dokončený" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Možnosti playlistu" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Typ playlistu" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Playlisty" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Prosím zatvorte váš internetový prehliadač a vráťte sa do Clementine" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Stav pluginu:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcasty" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Trvanie upozornenia" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Predzosilnenie" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Nastavenie" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Nastavenia" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Nastavenia..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Preferované názvy súborov obalov albumov (oddelené čiarkou)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Preferovaný formát zvuku" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Preferovaný dátový tok" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Preferovaný formát" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Typ zvuku prémium" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Predvoľba:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Stlačte kombináciu kláves na použitue pre" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Stlač tlačítko" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Stlač kombináciu tlačítok na použitie pre %1..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Stlačenie \"Predchádzajúca\" v prehrávači spôsobí..." #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Možnosti krásneho OSD" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Ukážka" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Predchádzajúca" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Predchádzajúca skladba" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Vypísať informáciu o verzii" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Priebeh" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Priebeh" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psychedelické" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Stlač tlačidlo na Wiiremote" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Vložiť piesne v náhodnom poradí" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Kvalita" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Kvalita" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Zaraďuje sa zariadenie..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Správca poradia" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Zaradiť vybrané skladby" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Zaradiť skladbu" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Rádio (rovnaká hlasitosť pre všetky skladby)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Dážď" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Dážď" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Náhodná vizualizácia" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Ohodnotiť aktuálnu pieseň 0 hviezdičkami" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Ohodnotiť aktuálnu pieseň 1 hviezdičkou" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Ohodnotiť aktuálnu pieseň 2 hviezdičkami" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Ohodnotiť aktuálnu pieseň 3 hviezdičkami" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Ohodnotiť aktuálnu pieseň 4 hviezdičkami" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Ohodnotiť aktuálnu pieseň 5 hviezdičkami" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Hodnotenie" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Naozaj zrušiť?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Prekročený limit presmerovaní, overte nastavenie servra" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Obnoviť katalóg" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Obnoviť kanály" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Obnoviť zoznam staníc" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Obnoviť streamy" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "relatívne" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Pamätať si kývnutie Wii diaľkového" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Zapamätať z naposledy" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Pamätať môj výber" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Odstrániť" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Odstrániť činnosť" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Odstrániť duplikáty z playlistu" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Odstrániť priečinok" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Odstrániť z Mojej hudby" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Odstrániť zo záložiek" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Odstrániť z playlistu" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Odstrániť playlist" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Odstrániť playlisty" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Odstrániť nedostupné skladby z playlistu" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Premenovať playlist" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Premenovať playlist..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Prečíslovať skladby v tomto poradí..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Opakovať" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Opakovať album" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Opakovať playlist" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Opakovať skladbu" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Nahradiť aktuálny playlist" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "ňou nahradí playlist" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Nahradiť medzery podčiarknutiami" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Vyrovnať hlasitosť" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Režim normalizovania hlasitosti" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Znovu naplniť" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Vyžadovať overovací kód" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Zresetovať" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Vynulovať počet prehraní" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Prehrávať pieseň od začiatku, po ďalšom stlačení prechod na predchádzajúcu pieseň" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Spustiť znovu prehrávanie skladby, alebo prehrať predchádzajúcu skladbu, ak ešte neprešlo 8 sekúnd od začiatku skladby." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Obmedziť na ASCII písmená" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Obnoviť prehrávanie pri spustení" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Vrátiť sa do Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Pravý" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Ripovať" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Ripovať CD" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Ripovať zvukové CD" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Spustiť" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "SOCKS proxy" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Chyba pri SSL handshakeu, overte nastavenie serveru. Možnosť SSLv3 nižšie môže niektoré problémy obísť." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Bezpečne odpojiť zariadenie" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Bezpečne odpojiť zariadenie po skončení kopírovania" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Rýchlosť vzorkovania" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Rýchlosť vzorkovania" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Ukladať súbory .mood vo vašej hudobnej zbierke" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Uložiť obal albumu" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Uložiť obal na disk..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Uložiť obrázok" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Uložiť playlist" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Uložiť playlist" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Uložiť playlist..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Uložiť predvoľbu" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Ukladať hodnotenie do tagov súboru, keď je to možné" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Ukladať štatistiku do tagov súboru, keď je to možné" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Uložiť tento stream na karte Internet" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Ukladanie štatistiky piesní do súborov piesní" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Ukladajú sa skladby" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Profil so škálovateľnou vzorkovacou frekvenciou" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Veľkosť škály" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Skóre" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Skroblovať skladby, ktoré počúvam" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Hľadať" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Hľadať" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Hľadať Icecast stanice" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Hľadať na Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Hľadať na Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Vyhľadať na Subsonicu" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Hľadať automaticky" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Hľadať obaly albumov..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Hľadať všetko" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Hľadať na gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Hľadať na iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Režim hľadania" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Možnosti hľadania" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Výsledky hľadania" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Výrazy na hľadanie" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Druhá úroveň" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Posunúť vzad" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Posunúť vpred" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Pretočiť súčasnú skladbu o určitý čas" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Pretočiť súčasnú skladbu na presné miesto" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "Posúvanie pomocou klávesovej skratky" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Označiť všetko" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Nevybrať nič" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Vybrať farbu pozadia:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Vybrať obrázok pozadia" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Vyberte najlepšiu možnosť" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Vybrať farbu popredia:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Vybrať vizualizácie" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Vybrať vizualizácie..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Vybrať..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Sériové číslo" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Server" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "URL adresa servera" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Podrobnosti servera" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Služba je offline" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Nastaviť %1 do \"%2\"..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Nastaviť hlasitosť na percent" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Nastaviť hodnotu pre všetky vybraté skladby..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Nastavenia" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Skratka" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Skratka pre %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Skratka pre %1 už existuje" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Zobraziť" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Zobraziť OSD" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Zobraziť blikajúcu animáciu na súčasnej skladbe" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Zobraziť panel nálady v paneli priebehu skladby" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Zobrazovať natívne desktopové upozornenia" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Zobraziť upozornenie keď zmením režim opakovania alebo zamiešavania" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Zobraziť upozornenie keď zmením hlasitosť" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Zobraziť upozornenie keď pozastavím prehrávanie" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Zobrazovať upozornenia z tray lišty" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Zobrazovať krásne OSD" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Zobraziť nad stavovou lištou" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Zobraziť všetky piesne" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Zobraziť všetky piesne" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Zobraziť obaly albumov v zbierke" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Zobraziť oddeľovače" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Zobraziť celú veľkosť..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Zobraziť skupiny vo výsledkoch globálneho vyhľadávania" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Zobraziť v prehliadači súborov..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Zobraziť v zbierke..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Zobrazovať v rôznych interprétoch" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Zobraziť panel nálady" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Zobraziť iba duplikáty" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Zobraziť iba neotagované" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Zobraziť prehrávanú pieseň na vašej stránke" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Zobrazovať návrhy vyhľadávania" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Zobraziť tlačidlo \"Obľúbené\"" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Zobraziť tlačidlo skroblovania v hlavnom okne" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Zobrazovať tray ikonu" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Zobraziť, ktoré zdroje sú povolené, a ktoré zakázané" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Zobraziť/Skryť" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Zamiešať" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Zamiešať albumy" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Zamiešať všetko" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Zamiešať playlist" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Zamiešať skladby v tomto albume" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Prihlásiť sa" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Odhlásiť" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Prihlasovanie..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Podobní interpréti" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Veľkosť" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Veľkosť:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Preskočiť dozadu v playliste" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Počet preskočení" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Preskočiť dopredu v playliste" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Preskočiť vybrané skladby" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Preskočiť skladbu" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Malý obal albumu" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Malý bočný panel" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Inteligentný playlist" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Inteligentné playlisty" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Informácie o piesni" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Pieseň" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Ľutujem" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Usporiadať podľa žánru (abecedne)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Usporiadať podľa žánru (podľa populatity)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Usporiadať podľa názvu stanice" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Zoradiť piesne podľa" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Triedenie" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Zdroj" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Zdroje" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Chyba pri prihlasovaní na Spotify" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "URL adresa playlistu na Spotify" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Spotify plugin" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Spotify plugin nieje nainštalovaný" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "URL adresa piesne na Spotify" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Štandardný" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "S hviezdičkou" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Začať ripovanie" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Začať playlist práve prehrávanou" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Začať transkódovanie" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Začnite písať niečo do vyhľadávacieho políčka vyššie, aby ste naplnili tento zoznam výsledkov hľadania" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Začína sa %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Začína sa ..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Zastaviť" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Zastaviť po" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Zastaviť po každej skladbe" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Zastaviť po každej skladbe" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Zastaviť po tejto skladbe" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Zastaviť prehrávanie" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Zastaviť prehrávanie po aktuálnej skladbe" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Zastaviť prehrávanie po skladbe: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Zastavené" #: core/song.cpp:431 msgid "Stream" msgstr "Stream" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Streamovanie zo servru Subsonic vyžaduje po 30 dňovej skúšobnej dobe platnú servrovú licenciu." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Streamovacie členstvo" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Predplatitelia" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Hotovo!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "Úspešne zapísané %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Nájdené tagy" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Zhrnutie" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Veľmi vysoké (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Super vysoká (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Podporované formáty" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Synchronizovať štatistiky do súborov teraz" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Synchronizuje sa Spotify schránka" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Synchronizuje sa Spotify playlist" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Synchronizujú sa skladby ohviezdičkované na Spotify" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Systémové farby" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Karty na vrchu" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Získavač tagov" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Cieľový dátový tok" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Textové možnosti" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Poďakovanie" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Príkaz \"%1\" nemohol začať." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Obal albumu práve prehrávanej piesne" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "Priečinok %1 nieje platný" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "Druhá hodnota musí byť väčšia ako prvá!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Stránka, ktorú požadujete, neexistuje!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Stránka, ktorú požadujete, nie je obrázok!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Skúšobná verzia Subsonic servera uplynula. Prosím prispejte, aby ste získali licenčný kľúč. Navštívte subsonic.org pre detaily." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Verzia Clementine, na ktorú sa práve aktualizovali, vyžaduje preskenovanie celej zbierky kvôli novým funkciám uvedeným nižšie:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "V tomto albume sú ďalšie piesne" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Bol tu problém s komunikáciou s gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Nastal problém pri získavaní metadát z Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Bol tu problém so spracovaním odpovede z iTunes Store" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Nastal problém pri kopírovaní niektorých piesní. Nasledujúce súbory sa nedali skopírovať:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Nastal problém pri vymazávaní niektorých piesní. Nasledujúce súbory sa nedali vymazať:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Tieto súbory budú vymazané zo zariadenia, ste si istý, že chcete pokračovať?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Tieto súbory budú trvalo vymazané z disku. Ste si istý, že chcete pokračovať?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Tieto priečinky budú prehľadané pre vytvorenie vašej zbierky" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Tieto nastavenia sú použité v dialógu \"Transkódovať hudbu\", a keď sa konvertuje hudba pred skopírovaním na zariadenie." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Tretia úroveň" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Táto činnosť vytvorí databázu ktorá môže byť veľká aj 150MB.\nChcete ajtak pokračovať?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Tento album nieje dostupný v požadovanom formáte" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Toto sa dá zmeniť neskôr v nastaveniach" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Toto zariadenie musí byť najprv pripojené a otvorené, až potom môže Clementine vidieť ktoré formáty súborov podporuje." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Toto zariadenie podporuje nasledujúce formáty súborov:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Toto zariadenie nebude pracovať správne" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Toto síce je MTP zariadenie, ale skompilovali ste Clementine bez podpory libmtp." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Toto síce je iPod, ale skompilovali ste Clementine bez podpory libgpod." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Prvý krát ste pripojili toto zariadenie. Clementine teraz prehľadá zariadenie aby našlo hudobné súbory - môže to zabrať nejaký čas." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Táto možnosť sa dá zmeniť v nastaveniach, v časti Správanie" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Tento stream je len pre platiacich predplatiteľov" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Tento typ zariadení nieje podporovaný: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "Časový krok" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Názov" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Dnes" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Prepnúť Krásne OSD" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Prepnúť na celú obrazovku" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Prepínať stav radu" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Prepnúť skroblovanie" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Prepnúť viditeľnosť Krásneho OSD" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Zajtra" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Príliš veľa presmerování" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Top skladby" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Albumov celkom:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Spolu prenesených bytov" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Spolu urobených požiadavok cez sieť" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Č." #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Skladby" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Transkódovať hudbu" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Výpis transkódera" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Transkódovanie" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Transkódovanie %1 súborov použitím %2 vlákien." #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Možnosti transkódovania" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbína" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Vypnúť" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL adresa(y)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Ultra široké pásmo (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Nepodarilo sa pripojiť" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Nedá sa stiahnuť %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "neznámy" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Neznámy typ obsahu" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Neznáma chyba" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Nenastavený obal" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Nepreskočiť vybraté skladby" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Nepreskočiť skladbu" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Zrušiť predplatné" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Pripravované koncerty" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Aktualizovať" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Aktualizovať všetky podcasty" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Aktualizovať zmenené priečinky v zbierke" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Aktualizovať zbierku pri zapnutí Clementine" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Aktualizovať tento podcast" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Aktualizuje sa" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Aktualizovanie %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Aktualizovanie %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Aktualizovanie zbierky" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Využitie" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Použiť tag Interprét albumu, ak je dostupný" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Použiť klávesové skratky GNOME" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Používať psychedelické farby" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Použiť metadáta na vyrovnanie hlasitosti ak sú dostupné" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Použiť SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Použiť Wii diaľkové" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Použiť vlastnú sadu farieb" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Používať vlastnú správu pre upozornenia" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Použiť sieťové diaľkové ovládanie" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Používať autentifikáciu" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Použiť stroj na správu dátového toku" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Použiť dynamický režim" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Použiť upozornenia na oznamovanie stavu Wii diaľkového" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Použiť časové tvarovanie šumu" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Použiť základný systémový" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Použiť systémom predvolenú sadu farieb" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Použiť systémové nastavenia proxy" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Použiť normalizáciu hlasitosti" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Použitých" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Používateľské rozhranie" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Meno používateľa" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Použitie menu na pridanie piesne..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Premenlivý dátový tok" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Rôzni interpréti" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Verzia %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Zobraziť" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Režim vizualizácií" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Vizualizácie" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Nastavenia vizualizácií" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Detekcia hlasovej činnosti" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Hlasitosť %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Stena" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Varovať ma pri zatvorení karty s playlistom" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Webstránka" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Týždne" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Pri zapnutí Clementine" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Keď sa hľadá obal albumu, Clementine sa najprv pozrie po súbore, ktorého názov obsahuje jedno z týchto slov.\nAk sa ani jeden nezhoduje, použije sa najväčší obrázok v priečinku." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "Pri ukladaní playlitu majú byť cesty k súborom" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Keď je zoznam prázdny..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Prečo neskúsiť..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Široké pásmo (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii diaľkové %1: aktivované" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii diaľkové %1: pripojené" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii diaľkové %1: kriticky slabá baterka (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii diaľkové %1: odaktivované" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii diaľkové %1: odpojené" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii diaľkové %1: slabá baterka (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "WMa" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Bez obalu:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Chceli by ste presunúť tiež ostatné piesne v tomto albume do rôznych interprétov?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Chcete teraz spustiť úplné preskenovanie?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Zapísať všetky štatistiky piesní do súborov piesní" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Zapísať metadáta" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Nesprávne meno používateľa alebo heslo." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Rok" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Rok - Album" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Roky" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Včera" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Chystáte sa stiahnuť nasledujúce albumy" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Chystáte sa odstrániť %1 playlistov z vašich obľúbených, ste si istí?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Chystáte sa odstrániť playlist, ktorý nie je súčasťou vašich obľúbených playlistov: playlist bude nenávratne vymazaný (tento krok sa nedá vrátiť späť). Ste si istý, že chcete pokračovať?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Nie ste prihlásený." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Ste prihlásený ako %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Ste prihlásený." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Môžete zmeniť spôsob, ktorým sú piesne v zbierke organizované." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Môžete počúvať zadarmo bez účtu, ale prémium členovia môžu počúvať kvalitnejšie streamy bez reklám." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Môžete zadarmo počúvať Magnatune piesne bez účtu. Zakúpenie členstva odstráni správy na konci každej skladby." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Môžete počúvať streamy na pozadí v rovnakom čase ako inú hudbu." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Môžete použiť vaše Wii diaľkové ako diaľkový ovládač pre Clementine. Pozrite si stránku na Clementine wiki pre viac informácií.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Nemáte Spotify prémium účet." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Nemáte aktívne predplatné" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "Nemusíte byť prihlásený, aby ste mohli hľadať a počúvať hudbu na SoundCloud. Musíte sa ale prihlásiť, ak chcete pristupovať k vašim playlistom a streamom." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Boli ste odhlásení zo Spotify, prosím, zadajte heslo znovu v dialógu Nastavenia." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Boli ste odhlásený zo Spotify, prosím znovu zadajte heslo." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Milujete túto pieseň" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "Potrebujete otvoriť Systémové nastavenia a povoliť Clementine \"ovládať váš počítač\" na použitie globálnych skratiek v Clementine." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Musíte reštartovať Clementine ak chcete zmeniť jazyk." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Vaša IP adresa:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Vaše Last.fm údaje sú neplatné" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Vaše Magnatune údaje sú neplatné" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Vaša zbierka je prázdna!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Vaše rádio streamy" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Skroblujete: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Vášmu systému chýba OpenGL podpora, vizualizácie nebudú dostupné." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Vaše meno používateľa alebo heslo bolo nesprávne." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Vynulovať" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "pridať %n piesní" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "po" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "pred" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "a" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "automaticky" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "pred" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "medzi" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "najprv najväčšie" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "obsahuje" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "zakázané" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "disk %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "neobsahuje" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "končí na" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "rovná sa" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "gpodder.net priečinok" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "väčšie ako" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "iPody a USB zariadenia momentálne na Windows nepracují. Prepáčte!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "za posledných" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "menšie ako" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "najprv najdlhšie" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "presunúť %n piesní" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "najprv najnovšie" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "sa nerovná" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "nie za posledných" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "nie na" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "najprv najstaršie" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "na" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "možnosti" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "alebo oskenovať QR kód!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "stlačte Enter" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "odstrániť %n piesní" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "najprv najkratšie" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "zamiešať piesne" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "najprv najmenšie" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "zoradiť piesne" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "začína na" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "posledná" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "skladba %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/sl.po000066400000000000000000005120371260417502300236650ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Andrej Mernik , 2012-2015 # Andrej Mernik , 2013 # FIRST AUTHOR , 2010 # mihaelersic , 2012 # mihaelersic , 2012 # Andrej Mernik , 2013 # Andrej Mernik , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Slovenian (http://www.transifex.com/davidsansome/clementine/language/sl/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sl\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nSezname predvajanja lahko dodate med priljubljene tako da kliknete na ikono zvezdice ob imenu seznama predvajanja\n\nPriljubljeni seznami predvajanja bodo shranjeni sem" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " dni" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kb/s" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "s" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " sekund" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " skladb" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 skladb)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 albumov" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 dni" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "pred %1 dnevi" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 na %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 seznamov predvajanja (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "izbran %1 od" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 skladba" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 skladb" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "najdenih %1 skladb" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "najdenih %1 skladb (prikazanih %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 skladb" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 prenesenih" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: modul Wimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 drugih poslušalcev" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "skupno %L1 predvajanj" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n spodletelih" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n končanih" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n preostaja" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "Por&avnaj besedilo" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "U&sredini" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "Po &meri" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "Dodatki" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Pomoč" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&Skrij %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Skrij ..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Levo" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "&Glasba" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Brez" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "Seznam &predvajanja" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Končaj" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Način p&onavljanja" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Desno" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Pre&mešani način" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "Raztegni &stolpce, da se prilegajo oknu" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Orodja" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(različno preko več skladb)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", avtorja" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "... in vsem razvijalcem Amaroka" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0 px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 dan" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 skladba" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192000 Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40 %" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44100 Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48000 Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 naključnih skladb" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96000 Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Nadgradite na Premium" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Če ni označeno, bo Clementine poskusil shraniti vaše ocene in druge statistike v ločeno podatkovno zbirko in ne bo spreminjal vaših datotek.

Če je označeno, bo shranil statistike tako v podatkovno zbirko kot tudi neposredno v datoteko, vsakič, ko se spremenijo.

Zapomnite si, da to morda ne bo delovalo za vsako vrsto datotek in ker ni standardov, jih morda drugi predvajalniki ne bodo mogli prebrati.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Da omejite iskanje na eno izmed polj, dodajte ime polja pred iskalni pojem, npr. artist:Bode preišče knjižnico za vse izvajalce, ki vsebujejo besedo Bode.

Razpoložljiva polja: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

To bo zapisalo vse ocene in statistike v oznake datotek za vse vaše skladbe v knjižnici.

To ni zahtevano, če je vedno vklopljena možnost "Shrani ocene in statistike v oznake datotek".

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Žetoni se pričnejo z %, na primer: %artist %album %title

\n\n

V primeru da odseke besedila, ki vsebujejo žetone, obdate z zavitimi oklepaji, bodo odseki skriti, če je žeton prazen.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Zahtevan je račun Spotify Premium." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Odjemalec se lahko poveže le, če je vnesel pravo kodo." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Pametni seznam predvajanja je dinamični seznam skladb, ki se nahajajo v vaši knjižnici. Obstajajo različne vrste pametnih seznamov predvajanja, ki ponujajo različne načine izbire skladb." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Skladba bo vključena v seznam predvajanja, če se ujema s temi pogoji." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Ž" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ALL GLORY TO THE HYPNOTOAD" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Prekini" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "O %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "O Clementine ..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "O Qt ..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Absolutne" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Podrobnosti računa" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Podrobnosti računa (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Dejanje" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Dejanje" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Omogoči/Onemogoči Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Pretok dejavnosti" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Dodaj podcast" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Dodaj pretok" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Dodaj novo vrstico, če jo podpira vrsta obvestila" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Dodaj dejanje" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Dodaj vse skladbe iz mape in njenih podmap" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Dodaj še en pretok ..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Dodaj mapo ..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Dodaj datoteko" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Dodaj datoteko v prekodirnik" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Dodaj datoteko(-e) v prekodirnik" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Dodaj datoteko ..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Dodajte datoteke za prekodiranje" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Dodaj mapo" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Dodaj mapo ..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Dodaj novo mapo ..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Dodaj podcast" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Dodaj podcast ..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Dodaj iskalni pojem" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Dodaj oznako: album" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Dodaj oznako: izvajalec albuma" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Dodaj oznako: izvajalec" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Dodaj samodejno oceno skladbe" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Dodaj oznako: skladatelj" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Dodaj oznako: disk" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Dodaj ime datoteke skladbe" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Dodaj oznako: žanr" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Dodaj oznako za združevanje skladb" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Dodaj oznako: dolžina" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Dodaj oznako za izvajalca skladbe" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Dodaj oznako: število predvajanj" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Dodaj oceno skladbe" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Dodaj oznako: število preskokov" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Dodaj oznako: naslov" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Dodaj skladbo v predpomnilnik" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Dodaj oznako: številka skladbe" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Dodaj oznako: leto" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Dodaj skladbe med \"Moja glasba\", ko kliknem na gumb \"Priljubljena\"" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Dodaj pretok ..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Dodaj v Mojo glasbo" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Dodaj na sezname predvajanja Spotify" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Dodaj med priljubljene v Spotify" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Dodaj na drug seznam predvajanja" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Dodaj med zaznamke" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Dodaj na seznam predvajanja" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Dodaj v vrsto" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Dodaj uporabnika/skupino v zaznamke" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Dodaj dejanje wiimotedev" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Dodaj ..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Dodano ta mesec" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Dodano ta teden" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Dodano letos" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Dodano danes" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Dodano v zadnjih treh mesecih" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Napredno združevanje ..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Po " #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Po kopiranju ..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Album (najboljša glasnost za vse skladbe)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Izvajalec albuma" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Ovitek albuma" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Podrobnosti albuma na jamendo.com ..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Albumi" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Albumi z ovitkom" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Albumi brez ovitka" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Vse" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Vse datoteke (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "All Glory to the Hypnotoad!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Vsi albumi" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Vsi izvajalci" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Vse datoteke (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Vsi seznami predvajanja (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Vsem prevajalcem" #: library/library.cpp:98 msgid "All tracks" msgstr "Vse skladbe" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Dovoli odjemalcu, da prejme glasbo iz tega računalnika." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Dovoli prejeme" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Dovoli kodiranje mid/side (MS)" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Ob izvirnikih" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Vedno skrij glavno okno" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Vedno pokaži glavno okno" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Vedno začni s predvajanjem" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon Cloud Drive" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Da lahko uporabite Spotify v Clementine, potrebujete dodaten vstavek. Ali ga želite prejeti in namestiti zdaj?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Med nalaganjem podatkovne zbirke iTunes je prišlo do napake" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Med zapisovanjem metapodatkov v '%1' je prišlo do napake" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Prišlo je do nedoločene napake." #: ui/about.cpp:85 msgid "And:" msgstr "In:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Jezen" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Videz" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Pripni datoteke/naslove URL seznamu predvajanja" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Pripni trenutnemu seznamu predvajanja" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Pripni k seznamu predvajanja" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Uporabi stiskanje za preprečitev odrezanja" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Ali resnično želite izbrisati predlogo nastavitev \"%1\"?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Ali ste prepričani, da želite ponastaviti statistike te skladbe?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Ali ste prepričani, da želite zapisati statistike skladbe v datoteko skladbe za vse skladbe v vaši knjižnici?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Izvajalec" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "O izvajalcu" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Oznake izvajalcev" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Začetnice izvajalca" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Vprašaj med shranjevanjem" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Vrsta zvoka" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Izhod zvoka" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Overitev ni uspela" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Avtor" #: ui/about.cpp:68 msgid "Authors" msgstr "Avtorji" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Samodejno" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Samodejne" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Samodejno posodabljanje" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Samodejno razširi enojne kategorije v drevesnem pogledu knjižnice" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Na voljo" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Povprečna bitna hitrost" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Povprečna velikost slike" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "BBC-jevi podcasti" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "udarcev/min" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Pretoki v ozadju" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Barva ozadja" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Slika ozadja" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Prekrivnost ozadja" #: core/database.cpp:648 msgid "Backing up database" msgstr "Varnostno kopiranje podatkovne zbirke" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Ravnovesje" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "Izobči (pošiljanje podatkov o predvajanih skladbah v Last.fm)" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Stolpčni preučevalnik" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Preprosta modra" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Osnovna vrsta zvoka" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Obnašanje" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Najboljše" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Biografija iz %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Bitna hitrost" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Bitna hitrost" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Bitna hitrost" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Blokovni preučevalnik" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Vrsta bloka" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Raven zabrisanja" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Telo" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Preučevalnik Boom" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Prebrskaj ..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Trajanje medpomnilnika" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Medpomnjenje" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Izgrajevanje kazala Seafile ..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Ti viri so onemogočeni:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Gumbi" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Podpora predlogam CUE" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Pot do predpomnilnika:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Predpomnjenje" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "Predpomnjenje %1" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Prekliči" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Prekliči prejem" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Zahtevan je Captcha.\nDa rešite to težavo, se poskusite v Vk.prijaviti z vašim brskalnikom." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Spremeni ovitek albuma" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Spremeni velikost pisave ..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Spremeni način ponavljanja" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Spremeni bližnjico ..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Spremeni način naključnega predvajanja" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Sprememba jezika" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "Spremembe bodo stopile v veljavo, ko se začne predvajati naslednja skladba" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Sprememba nastavitve predvajanja mono, bo dejavna za naslednje skladbe, ki bodo predvajane" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Preveri za novimi epizodami" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Preveri za posodobitvami" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Preveri za posodobitvami ..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Izberi mapo s predpomnilnikom za Vk.com" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Izberite ime za vaš pametni seznam predvajanja" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Izberi samodejno" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Izberi barvo ..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Izberi pisavo ..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Izberi s seznama" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Izberite kako bo seznam predvajanja razvrščen in koliko skladb bo vseboval." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Izberi mapo za prejeme podcastov" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Izberite internetne storitve, ki bi jih želeli prikazati." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Izberite spletne strani za katere želite, da jih Clementine uporabi pri iskanju besedil" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Klasična" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Čiščenje" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Počisti" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Počisti seznam predvajanja" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Napaka v Clementine" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Clementine oranžna" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Clementine predočenja" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine lahko samodejno pretvori glasbo, ki jo kopirate na to napravo, v vrsto, ki jo zmore naprava predvajati." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Clementine lahko predvaja glasbo, ki ste jo poslali na Amazon Cloud Drive" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine lahko predvaja glasbo, ki ste jo poslali na Box" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine lahko predvaja glasbo, ki ste jo poslali na Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine lahko predvaja glasbo, ki ste jo poslali na Google Drive" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine lahko predvaja glasbo, ki ste jo poslali na OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine lahko prikaže sporočilo ob spremembi skladbe." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine lahko uskladi vaš seznam naročil z drugimi računalniki in programi za podcast. Ustvari račun." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine ni mogel naložiti predočenj projectM. Preverite, če je Clementine pravilno nameščen." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Pregledovalnik slik Clementine" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine ni mogel najti rezultatov za to datoteko" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine bo našel glasbo v:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Kliknite sem za dodajanje glasbe" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Kliknite sem, da dodate ta seznam predvajanja med priljubljene. Na ta način bo shranjen in ostal na voljo v levem pultu pod \"Seznami predvajanja\"" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Kliknite za preklop med preostalim in celotnim časom" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Ko boste kliknili na gumb Prijavi, se bo odprl brskalnik. Potem ko ste se prijavili, se vrnite v Clementine." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Zapri" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Zapri seznam predvajanja" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Zapri predočenje" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Zaprtje tega okna bo prekinilo prejem." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Zaprtje tega okna bo prekinilo iskanje ovitkov albumov." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Klubska" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Barve" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Z vejicami ločen seznam razred:raven, raven je 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Opomba" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Radio skupnosti" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Samodejno dopolni oznake" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Samodejno dopolni oznake ..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Skladatelj" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Nastavi %1 ..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Nastavi Magnatune ..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Nastavi bližnjice" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Nastavi Spotify ..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Nastavite Subsonic ..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Nastavi Vk.com ..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Nastavi splošno iskanje" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Nastavi knjižnico ..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Nastavi podcaste ..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Nastavi ..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Povežite Wii Remotes z uporabo dejanja omogoči/onemogoči" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Povežite napravo" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Povezovanje na Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Strežnik je zavrnil povezavo, preverite njegov naslov URL. Primer: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Povezava je časovno pretekla, preverite naslov URL strežnika. Primer: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Težava s povezavo ali pa je lastnik onemogočil zvok" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Konzola" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Stalna bitna hitrost" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Pretvori vso glasbo" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Pretvori vso glasbo, ki je naprava ne more predvajati" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Pretvori zvočne datoteke brez izgub pred pošiljanjem." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Pretvori datoteke brez izgub" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Kopiraj naslov URL za deljenje v odložišče" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Kopiraj v odložišče" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Kopiraj na napravo ..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Kopiraj v knjižnico ..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Avtorske pravice" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Ni se bilo mogoče povezati s Subsonic. Preverite naslov URL strežnika. Primer: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Ni bilo mogoče ustvariti GStreamer-jevega elementa \"%1\" - prepričajte se, da imate nameščene vse zahtevane vstavke GStreamer" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Ni bilo mogoče ustvariti seznama predvajanja" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Zvijalnika za %1 ni bilo mogoče najti. Preverite, če so nameščeni pravilni vstavki GStreamer" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Kodirnika za %1 ni bilo mogoče najti. Preverite, če so nameščeni pravilni vstavki GStreamer" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Izhodne datoteke %1 ni bilo mogoče odpreti" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Upravljalnik ovitkov" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Ovitek albuma iz vstavljene slike" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Ovitek albuma je bil samodejno naložen iz %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Ovitek albuma je bil ročno odstranjen iz uporabe" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Ovitek albuma ni nastavljen" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Ovitek albuma je nastavljen iz %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Ovitki iz %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Postopni prehod med samodejno spremembo skladb" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Postopni prehod med ročno spremembo skladb" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Dol" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Gor" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Po meri" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Slika po meri:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Nastavitve sporočil po meri" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Po meri ..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "Pot DBus" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Plesna" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Zaznana je bila okvara podatkovne zbirke. Za navodila obnovitve podatkovne zbirke si oglejte: https://code.google.com/p/clementine-player/wiki/DatabaseCorruption" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Datum ustvarjenja" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Datum spremembe" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Dnevi" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "&Privzeto" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Zmanjšaj glasnost za 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Zmanjšaj glasnost za odstotkov" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Zmanjšaj glasnost" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Privzeta slika ozadja" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Privzeta naprava na %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Privzete vrednosti" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Zakasnitev med predočenji" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Izbriši" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Izbriši prejete podatke" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Izbriši datoteke" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Izbriši iz naprave ..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Izbriši iz diska ..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Izbriši predvajane epizode" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Izbriši predlogo nastavitev" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Izbriši pameten seznam predvajanja" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Izbriši izvorne datoteke" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Brisanje datotek" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Odstrani izbrane skladbe iz vrste" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Odstrani skladbo iz vrste" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Cilj" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Podrobnosti ..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Naprava" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Lastnosti naprave" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Ime naprave" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Lastnosti naprave ..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Naprave" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Pogovorno okno" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Ste mislili" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Geslo za Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Uporabniško ime za Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Neposredna povezava na internet" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Mapa" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Trajanje onemogočenja" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Onemogoči ustvarjanje moodbara" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Onemogočeno" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Onemogočeno" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Disk" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Nezvezni prenos (DTX)" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Možnosti prikaza" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Pokaži prikaz na zaslonu" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Ponovno preišči celotno knjižnico" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Izvedi polno ponovno preiskovanje" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Izvedi polno ponovno preiskovanje ..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Ne pretvarjaj glasbe" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Ne prepiši" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "Polno ponovno preiskovanje bo povzročilo izgubo metapodatkov, ki ste jih shranili v Clementine, med drugim ovitkov, števila predvajanj in ocen. Clementine bo znova preiskal vso vašo glasbo v Google Drive, kar lahko traja nekaj časa." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Ne ponavljaj" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Ne prikaži med \"Različni izvajalci\"" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Ne pokaži poslušanih epizod" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Ne premešaj" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Ne zaustavi!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Donacija" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Dvoklik za odpiranje" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Dvoklik skladbe bo povzročil sledeče ..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Prejmi %n epizod" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Mapa prejemov" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Prejmi epizode v" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Članstvo prejemanja" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Samodejno prejmi nove epizode" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Prejem je v čakalni vrsti" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Nastavitve prejemov" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Prejmite app za Android" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Prejmi ta album" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Prejmi ta album ..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Prejmi to epizodo" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Prejmi ..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Prejemanje (%1 %) ..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Prejemanje imenika Icecast" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Prejemanje kataloga Jamendo" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Prejemanje kataloga Magnatune" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Prejemanje vstavka Spotify" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Prejemanje metapodatkov" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Povlecite za spremembo položaja" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dubstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Trajanje" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Dinamični način je vključen" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Dinamični naključni miks" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Uredi pametni seznam predvajanja ..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Uredi oznako \"%1\" ..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Uredi oznako ..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Uredi oznake" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Uredi podrobnosti o skladbi" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Uredi podrobnosti o skladbi ..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Uredi podrobnosti skladb ..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Uredi ..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "E-pošta" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Omogoči podporo Wii Remote" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Omogoči samodejno predpomnjenje" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Omogoči uravnalnik" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Omogoči bližnjice le, ko je Clementine v žarišču" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Omogoči znotrajvrstično urejanje metapodatkov skladbe s klikom" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Omogočite spodnje vire, da bodo vključeni v iskalne rezultate. Rezultati bodo prikazani v sledečem vrstnem redu." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Omogoči/onemogoči pošiljanje podatkov o predvajanih skladbah v Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Zapletenost kodiranja" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Kakovost pogona za kodiranje" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Način kodiranja" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Vnesite URL" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Vnesite naslov URL, da prejmete ovitek z interneta:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Vnesite ime datoteke za izvožene ovitke (brez pripone):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Vnesite novo ime za ta seznam predvajanja" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Zgoraj vnesite iskalne pogoje, da najdete glasbo na vašem računalniku in internetu" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Spodaj vnesite iskalne pogoje, da najdete podcaste v trgovini iTunes" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Spodaj vnesite iskalne pogoje, da najdete podcaste na gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Sem vnesite iskalne pogoje" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Vnesite naslov URL pretoka internetnega radia:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Vnesite ime mape" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Vnesite ta IP v App, da se povežete s Clementine." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Celotna zbirka" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Uravnalnik" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Enakovredno --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Enakovredno --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Napaka" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Napaka med zajemanjem CD-ja" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Napaka med povezovanjem naprave MTP" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Napaka med kopiranjem skladb" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Napaka med brisanjem skladb" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Napaka med prejemanjem vstavka Spotify" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Napaka med nalaganjem %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Napaka med nalaganjem seznama predvajanja di.fm" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Napaka med obdelavo %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Napaka med nalaganjem zvočnega CD-ja" #: library/library.cpp:68 msgid "Ever played" msgstr "Sploh predvajano" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Vsakih 10 minut" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Vsakih 12 ur" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Vsaki 2 uri" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Vsakih 20 minut" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Vsakih 30 minut" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Vsakih 6 ur" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Vsako uro" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Razen med skladbami na istem albumu ali v isti predlogi CUE" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Obstoječi ovitki" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Razširi" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Poteče %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Izvozi ovitke" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Izvozi ovitke" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Izvozi prejete ovitke" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Izvozi vstavljene ovitke" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Izvoz končan" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Izvoženih %1 od %2 ovitkov (%3 preskočenih)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Pojemaj ob premoru / povečaj ob nadaljevanju" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Pojemanje glasnosti ob zaustavitvi predvajanja" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Pojemanje" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Trajanje pojemanja" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Napaka med branjem iz pogona CD" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Imenika ni bilo mogoče prejeti" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Podcastov ni bilo mogoče prejeti" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Podcasta ni bilo mogoče naložiti" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "XML-ja za ta vir RSS ni bilo mogoče razčleniti" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Hitro" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Priljubljene skladbe" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Pridobi manjkajoče ovitke" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Samodejno pridobi" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Prejemanje zaključeno" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Pridobivanje knjižnice Subsonic" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Napaka med pridobivanjem ovitka" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Vrsta datoteke" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Pripona datoteke" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Vrste datotek" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Ime datoteke" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Ime datoteke (brez poti)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Vzorec imena datoteke:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Poti do datotek" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Velikost datoteke" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Vrsta datoteke" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Ime datoteke" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Datoteke" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Datoteke za prekodiranje" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Najdite skladbe v knjižnici, ki se ujemajo z merili, ki jih določite." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Najdi tega izvajalca" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Jemanje prstnega odtisa skladbe" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Končaj" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Prva raven" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Prilagodi ovitek širini" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Velikost pisave" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Zaradi licence je podpora Spotify v ločenem vstavku." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Vsili mono kodiranje" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Pozabi napravo" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Klik na \"Pozabi napravo\", bo napravo odstranil iz tega seznama. Ob naslednjem priklopu bo moral Clementine znova napraviti seznam vseh skladb." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Obrazec" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Vrsta" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Hitrost sličic" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Sličic na medpomnilnik" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Zmrznjen" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Polni basi" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Polni basi in visoki toni" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Polni visoki toni" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Splošno" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Splošne nastavitve" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Zvrst" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Pridobi naslov URL za delitev te skladbe Spotify" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Pridobi naslov URL za deljenje tega seznama predvajanja" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Pridobivanje kanalov" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Pridobivanje pretokov" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Vnesite ime:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Pojdi" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Pojdi na naslednji zavihek seznama predvajanja" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Pojdi na predhodni zavihek seznama predvajanja" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Pridobljenih je bilo %1 od %2 ovitkov (%3 spodletelih)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Označi s sivo skladbe, ki so na seznamih predvajanja in ne obstajajo več" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Združi knjižnico po ..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Združi po" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Združi po albumu" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Združi po izvajalcu" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Združi po izvajalcu/albumu" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Združi po izvajalcu/letu - albumu" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Združi po zvrsti/albumu" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Združi po zvrsti/izvajalcu/albumu" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Združevanje" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "Stran HTML ni vsebovala virov RSS" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "Prejeta je bila koda stanja HTTP 3xx brez naslova URL, preverite nastavitev strežnika." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "Posredniški strežnik HTTP" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Srečen" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Podrobnosti o strojni opremi" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Podrobnosti o strojni opremi so na voljo le, ko je naprava povezana" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Visoka" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Visoko (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Visoka (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "HipHop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Gostitelj ni bil najden, preverite naslov URL strežnika. Primer: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Ure" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Nimam računa Magnatune" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Ikona" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Ikone na vrhu" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Prepoznavanje skladbe" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Če je omogočeno, bo klik na izbrano skladbo v pogledu seznama predvajanja omogočil neposredno urejanje vrednosti oznake" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Če boste nadaljevali, bo naprava delovala počasi in skladbe, ki ste jih kopirali, morda ne bodo delovale." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Če poznate naslov URL podcasta, ga vnesite spodaj in pritisnite Pojdi" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Prezri \"The\" v imenih izvajalcev" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Slike (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Slike (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Uvozi ..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "čez %1 dni" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "čez %1 tednov" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "V dinamičnem načinu bodo nove skladbe izbrane in dodane na seznam predvajanja vsakič, ko se prejšnja skladba konča." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Prejeto" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Vključi ovitek albuma v obvestilo" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Vključi vse skladbe" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Nezdružljiva različica protokola REST za Subsonic. Odjemalec mora nadgraditi." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Nezdružljiva različica protokola REST za Subsonic. Strežnik mora nadgraditi." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Nepopolna nastavitev, prepričajte se, da so vsa polja izpolnjena." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Povečaj glasnost za 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Povečaj glasnost za odstotkov" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Povečaj glasnost" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Izgradnja kazala za %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Podrobnosti" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Možnosti vhoda" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Vstavi ..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Nameščeno" #: core/database.cpp:585 msgid "Integrity check" msgstr "Preverjanje celovitosti" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Ponudniki interneta" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Internetne storitve" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "Skladbe začetka" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Neveljaven ključ API" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Neveljavna vrsta" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Neveljavni način" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Neveljavni parametri" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Podan je bil neveljaven vir" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Neveljavna storitev" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Neveljavni ključ seje" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Obrni izbor" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Jamendo: najbolj poslušane skladbe" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Jamendo: najboljše skladbe" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo: najboljše skladbe meseca" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo: najboljše skladbe tedna" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Podatkovna zbirka Jamendo" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "takoj skočilo na predhodno skladbo" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Skoči na trenutno predvajano skladbo" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Ohrani gumbe za %1 sekundo ..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Ohrani gumbe za %1 sekund ..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Ostani zagnan v ozadju dokler se ne zapre okno" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Ohrani izvorne datoteke" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Mucke" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Jezik" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Prenosnik/slušalke" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Velika dvorana" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Velik ovitek albuma" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Velik ovitek albuma (podrobnosti spodaj)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Velik ovitek albuma (brez podrobnosti)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Velika stranska vrstica" #: library/library.cpp:80 msgid "Last played" msgstr "Zadnjič predvajano" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Zadnjič predvajano" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm je trenutno zaposlen, poskusite znova čez nekaj minut" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Geslo Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Število predvajanj last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Oznake Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Uporabniško ime Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Wiki last.fm" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Najmanj priljubljene skladbe" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Levo" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Dolžina" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Knjižnica" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Napredno združevanje v knjižnici" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Obvestilo ponovnega preiskovanja knjižnice" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Iskanje po knjižnici" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Omejitve" #: ui/equalizer.cpp:137 msgid "Live" msgstr "V živo" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Naloži" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Naloži ovitek iz naslova URL" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Naloži ovitek iz naslova URL ..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Naloži ovitek iz diska" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Naloži ovitek iz diska ..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Naloži seznam predvajanja" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Naloži seznam predvajanja ..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Nalaganje naprave MTP" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Nalaganje zbirke podatkov iPod" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Nalaganje pametnega seznama predvajanja" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Nalaganje skladb" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Nalaganje pretoka" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Nalaganje skladb" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Nalaganje podrobnosti o skladbah" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Nalaganje ..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Naloži datoteke/naslove URL in zamenjaj trenutni seznam predvajanja" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Prijava" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Prijava je spodletela" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Odjava" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Profil daljnosežnega predvidevanja (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Priljubljena" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "Obožuj (pošiljanje podatkov o predvajanih skladbah v Last.fm)" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Nizko (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Nizka (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Profil nizke kompleksnosti (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Besedila" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Besedila iz %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Besedila iz oznake ID3v2" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Prejemi Magnatune" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Prejem Magnatune je končan" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Glavni profil (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Make it so!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Make it so!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Seznam predvajanja naj bo na voljo tudi brez povezave" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Napačno oblikovan odziv" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Ročna nastavitev posredniškega strežnika" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Ročno" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Proizvajalec" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Označi kot poslušano" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Označi kot novo" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Ujemanje s vsakim pogojem iskanja (IN)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Ujemanje enega ali več pogojev iskanja (ALI)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Največ rezultatov splošnega iskanja" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Največja bitna hitrost" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Medij je bil zamenjan. Ponovno nalaganje" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Srednje (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Srednja (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Vrsta članstva" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Najmanjša bitna hitrost" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Najmanjša zapolnitev medpomnilnika" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Manjkajoče predloge nastavitev projectM" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Spremljaj knjižnico za spremembami" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Predvajanje v načinu mono" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Meseci" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Razpoloženje" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Slog vrstice razpoloženja" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Vrstice razpoloženja" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Več" #: library/library.cpp:84 msgid "Most played" msgstr "Najbolj predvajano" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Priklopna točka" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Priklopne točke" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Premakni dol" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Premakni v knjižnico ..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Premakni gor" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Glasba" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Glasbena knjižnica" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Utišaj" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Moji albumi" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Moja glasba" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Moja priporočila" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Ime" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Ime" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Možnosti poimenovanja" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Ozek pas (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Omrežni posredniški strežnik" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Omrežni nadzor" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Nikoli" #: library/library.cpp:74 msgid "Never played" msgstr "Nikoli predvajano" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Nikoli ne začni s predvajanjem" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Nova mapa" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Nov seznam predvajanja" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Nov pametni seznam predvajanja" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Nove skladbe" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Nove skladbe bodo samodejno dodane." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Najnovejše skladbe" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Naslednji" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Naslednja skladba" #: core/utilities.cpp:151 msgid "Next week" msgstr "Naslednji teden" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Brez preučevalnika" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Brez slike ozadja" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Ni ovitkov za izvoz." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Brez dolgih blokov" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Iskanje ni vrnilo rezultatov. Počistite iskalno polje za prikaz celotnega seznama predvajanja." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Brez kratkih blokov" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Brez" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Nobena izmed izbranih skladb ni bila primerna za kopiranje na napravo" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Običajno" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Običajna vrsta bloka" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Ni razpoložljivo med uporabo dinamičnega seznama predvajanja" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Brez povezave" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Ni dovolj vsebine" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Ni dovolj oboževalcev" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Ni dovolj članov" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Ni dovolj sosedov" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Ni nameščeno" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Niste prijavljeni" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Ni priklopljeno - dvokliknite za priklop" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Nič ni bilo najdeno" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Vrsta obvestila" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Obvestila" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Se predvaja" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Število prikazanih epizod" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Predogled prikaza na zaslonu" #: widgets/osd.cpp:173 msgid "Off" msgstr "Izklopljeno" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "Vklopljeno" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Sprejmi samo povezave iz odjemalcev znotraj območij IP:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Dovoli samo povezave iz krajevnega omrežja" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Pokaži le prve" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Motnost" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Odpri %1 v brskalniku" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Odpri &zvočni CD ..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Odpri datoteko OPML" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Odpri datoteko OPML ..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Odpri mapo, iz katere bo uvožena glasba" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Odpri napravo" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Odpri datoteko ..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Odpri v Google Drive" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Odpri v novem seznamu predvajanja" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Odpri v novem seznamu predvajanja" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Odpri v brskalniku" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Odpri ..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Opravilo je spodletelo" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Optimiziraj za bitno hitrost" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Optimiziraj za kakovost" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Možnosti ..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Organiziraj datoteke" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Organiziraj datoteke ..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Organiziranje datotek" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Izvorne oznake" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "Izvorno leto" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "Izvorno leto - album" #: library/library.cpp:118 msgid "Original year tag support" msgstr "Podpora za oznako izvornega leta" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Druge možnosti" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Izhod" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Izhodna naprava" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Možnosti izhoda" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Prepiši vse" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Prepiši obstoječe datoteke" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Prepiši le manjše" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Lastnik" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Razčlenjanje kataloga Jamendo" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Zabava" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Geslo" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Naredi premor" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Naredi premor predvajanja" #: widgets/osd.cpp:156 msgid "Paused" msgstr "V premoru" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Izvajalec" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Slikovna točka" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Navadna stranska vrstica" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Predvajaj" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Število predvajanj" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Predvajaj, če je zaustavljeno, napravi premor, če se predvaja" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Predvajaj, če se trenutno ne predvaja nič" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Predvajaj -to skladbo v seznamu predvajanja" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Predvajaj/premor" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Predvajanje" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Možnosti predvajalnika" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Seznam predvajanja" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Seznam predvajanja je končan" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Možnosti seznama predvajanja" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Vrsta seznama predvajanja" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Seznami predvajanja" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Zaprite vaš brskalnik in se vrnite v Clementine." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Stanje vstavka:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcasti" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Trajanje pojavnega obvestila" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Vrata" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Predojačanje" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Možnost" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Možnosti" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Možnosti ..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Prednostna imena datotek ovitkov albumov (ločena z vejico)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Prednostna vrsta zvoka" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Zaželena bitna hitrost" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Prednostna vrsta" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Vrsta zvoka za Premium račun" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Predloga nastavitev:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Pritisnite kombinacijo gumbov za" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Pritisnite tipko" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Pritisnite kombinacijo tipk, ki jo želite uporabiti za %1 ..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Klik na »Predhodno« v predvajalniku bo ..." #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Možnosti za lep prikaz na zaslonu" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Predogled" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Predhodni" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Predhodna skladba" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Izpiši podrobnosti o različici" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Napredek" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Napredek" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psihedelično" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Pritisnite gumb Wiiremote" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Razvrsti skladbe naključno" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Kakovost" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Kakovost" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Poizvedovanje po napravi ..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Upravljalnik vrste" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Postavi izbrane skladbe v vrsto" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Postavi skladbo v vrsto" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (enaka glasnost za vse skladbe)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Dež" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Dež" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Naključno predočenje" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Oceni trenutno skladbo: 0 zvezdic" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Oceni trenutno skladbo: 1 zvezdica" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Oceni trenutno skladbo: 2 zvezdici" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Oceni trenutno skladbo: 3 zvezdice" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Oceni trenutno skladbo: 4 zvezdice" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Oceni trenutno skladbo: 5 zvezdic" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Ocena" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Resnično prekličem?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Presežena je bila omejitev preusmeritev, preverite nastavitev strežnika." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Osveži katalog" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Osveži kanale" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Osveži seznam postaj" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Osveži pretoke" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Relativne" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Zapomni si Wii remote zamah" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Zapomni si od zadnjič" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Zapomni si mojo izbiro" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Odstrani" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Odstrani dejanje" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Odstrani podvojene iz seznama predvajanja" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Odstrani mapo" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Odstrani iz Moje glasbe" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Odstrani iz zaznamkov" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Odstrani iz seznama predvajanja" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Odstrani seznam predvajanja" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Odstrani sezname predvajanja" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Iz seznama predvajanja odstrani skladbe, ki niso na voljo" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Preimenuj seznam predvajanja" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Preimenuj seznam predvajanja ..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Znova oštevilči skladbe v naslednjem vrstnem redu ..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Ponavljanje" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Ponavljaj album" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Ponavljaj seznam predvajanja" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Ponavljaj skladbo" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Zamenjaj trenuten seznam predvajanja" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Zamenjaj seznam predvajanja" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Zamenja presledke s podčrtaji" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Jakost predvajanja" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Način Jakosti predvajanja" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Znova napolni" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Zahtevaj overitveno kodo" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Ponastavi" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Ponastavi število predvajanj" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "ponovil skladbo, nato pa ob ponovnem kliku skočil na predhodno" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Znova zaženi skladbo ali predvajaj predhodno skladbo, če je znotraj 8 sekund začetka." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Omeji na znake ASCII" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Ob zagonu nadaljuj s predvajanjem" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Vrni se v Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Desno" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Zajemi" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Zajemi CD" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Zajemi zvočni CD" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Zaženi" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "Posredniški strežnik SOCKS" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Napaka med rokovanjem SSH, preverite nastavitev strežnika. Za nekatere težave je morda začasna rešitev spodnja možnost SSLv3." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Varno odstrani napravo" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Varno odstrani napravo po kopiranju" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Hitrost vzorčenja" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Hitrost vzorčenja" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Shrani datoteke .mood v vašo glasbeno knjižnico" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Shrani ovitek albuma" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Shrani ovitek na disk ..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Shrani sliko" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Shrani seznam predvajanja" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Shrani seznam predvajanja" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Shrani seznam predvajanja ..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Shrani predlogo nastavitev" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Shrani ocene v oznake datotek, če je to mogoče" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Shrani statistike v oznake datotek, če je to mogoče" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Shrani ta pretok v zavihek Internet" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Shranjevanje statistike skladb v datoteke skladb" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Shranjevanje skladb" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Profil prilagodljive vzorčne hitrosti (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Umeri velikost" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Rezultat" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Pošlji podatke o predvajanih skladbah" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Poišči" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Išči" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Poišči postaje Icecast" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Poišči na Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Poišči na Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Poišči na Subsonicu" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Samodejno najdi" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Poišči ovitke albumov ..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Poišči karkoli" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Poišči na gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Poišči na iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Način iskanja" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Možnosti iskanja" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Rezultati iskanja" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Iskalni pojmi" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Druga raven" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Previj nazaj" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Previj naprej" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Previj trenutno predvajano skladbo za relativno količino" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Previj trenutno predvajano skladbo na absoluten položaj" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "Preiskovanje s pomočjo tipkovne bližnjice" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Izberi vse" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Odstrani izbor" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Izberite barvo ozadja:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Izberi sliko ozadja" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Izberi najboljše mogoče ujemanje" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Izberite barvo ospredja:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Izberi predočenja" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Izberi predočenja ..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Izberi ..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Zaporedna številka" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Strežnik" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "Naslov URL strežnika" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Podrobnosti strežnika" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Storitev je nepovezana" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Nastavi %1 na \"%2\" ..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Nastavi glasnost na odstotkov" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Nastavi vrednost za vse izbrane skladbe ..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Nastavitve" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Bližnjica" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Bližnjica za %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Bližnjica za %1 že obstaja" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Pokaži" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Pokaži prikaz na zaslonu" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Pokaži žarečo animacijo na trenutni skladbi" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Pokaži vrstico razpoloženja v vrstici napredka skladbe" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Prikaži lastno obvestilo namizja" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Prikaži obvestilo, ko spremenim način ponavljanja/naključnega predvajanja" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Prikaži obvestilo ob spremembi glasnosti" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Prikaži obvestilo ob prestavitvi predvajanja v premor" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Prikaži pojavno okno iz sistemske vrstice" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Pokaži lep prikaz na zaslonu" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Pokaži nad vrstico stanja" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Pokaži vse skladbe" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Pokaži vse skladbe" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Pokaži ovitek albuma v knjižnici" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Pokaži razdelilnike" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Pokaži v polni velikosti ..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Pokaži skupine v rezultatih splošnega iskanja" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Pokaži v brskalniku datotek ..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Pokaži v knjižnici ..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Pokaži med \"Različni izvajalci\"" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Pokaži vrstico razpoloženja" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Pokaži samo podvojene" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Pokaži samo tiste brez oznak" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Pokaži skladbo, ki se predvaja, na moji strani" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Prikaži iskalne predloge" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Pokaži gumb \"Priljubljena\"" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Kaži gumb za pošiljanje podatkov o predvajanih skladbah" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Pokaži ikono v sistemski vrstici" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Prikaži kateri viri so omogočeni in kateri onemogočeni" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Pokaži/Skrij" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Premešaj" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Premešaj albume" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Premešaj vse" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Premešaj seznam predvajanja" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Premešaj skladbe v tem albumu" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Prijava" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Odjavi se" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Prijavljanje ..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Podobni izvajalci" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Velikost" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Velikost:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Skoči nazaj po seznamu predvajanja" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Število preskočenih" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Skoči naprej po seznamu predvajanja" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Preskoči izbrane skladbe" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Preskoči skladbo" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Majhen ovitek albuma" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Majhna stranska vrstica" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Pametni seznam predvajanja" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Pametni seznami predvajanja" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Podrobnosti o skladbi" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "O skladbi" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Oprostite" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Razvrsti po zvrsti (po abecednem redu)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Razvrsti po zvrsti (po priljubljenosti)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Razvrsti po imenu postaje" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Razvrsti skladbe po" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Razvrščanje" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Vir" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Viri" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Napaka med prijavo na Spotify" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "Naslov URL seznama predvajanja Spotify" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Vstavek Spotify" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Vstavek Spotify ni nameščen" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "Naslov URL skladbe Spotify" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Običajno" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Z zvezdico" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Začni z zajemanjem" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Predvajaj skladbo, ki je označena v seznamu predvajanja" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Začni s prekodiranjem" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Natipkajte nekaj v iskalno polje, da napolnite te seznam z rezultati iskanja" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Začenjanje %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Začenjanje ..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Zaustavi" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Zaustavi po" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Zaustavi po vsaki skladbi" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Zaustavi po vsaki skladbi" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Zaustavi po tej skladbi" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Zaustavi predvajanje" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Zaustavi predvajanje po trenutni skladbi" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Zaustavi predvajanje po skladbi: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Zaustavljeno" #: core/song.cpp:431 msgid "Stream" msgstr "Pretok" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Pretakanje iz strežnika Subsonic zahteva veljavno strežniško licenco, če je 30-dnevno preizkusno obdobje že poteklo." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Članstvo pretakanja" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Naročniki" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Uspeh!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "Uspešno zapisan %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Predlagane oznake" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Povzetek" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Zelo visoko (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Zelo visoko (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Podprte vrste" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Uskladi statistike v datoteke zdaj" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Usklajevanje mape Spotify - prejeto" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Usklajevanje seznama predvajanja Spotify" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Usklajevanje označenih skladb v Spotify" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Sistemske barve" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Zavihki na vrhu" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Prejemnik oznak" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Ciljna bitna hitrost" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Možnosti besedila" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Zahvala gre" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Ukaza \"%1\" ni bilo mogoče zagnati." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Ovitek albuma skladbe, ki se trenutno predvaja" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "Mapa %1 ni veljavna" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "Druga vrednost mora biti višja od prve!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Zahtevana stran ne obstaja!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Zahtevana stran ni slika!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Preizkusno obdobje za strežnik Subsonic je končano. Da pridobite licenčni ključ, morate donirati. Za podrobnosti si oglejte subsonic.org." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Različica Clementine, ki ste jo posodobili, zahteva polno ponovno preiskovanje knjižnice, zaradi spodaj navedenih novih zmožnosti:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "V tem albumu so druge skladbe" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Med komunikacijo z gpodder.net je prišlo do težave" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Med pridobivanjem metapodatkov iz Magnatune je prišlo do težave" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Med razčlenjevanjem odgovora iz trgovine iTunes je prišlo do težave" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Med kopiranjem nekaterih skladb so nastopile težave. Sledečih datotek ni bilo mogoče kopirati:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Med brisanjem nekaterih skladb so nastopile težave. Sledečih datotek ni bilo mogoče izbrisati:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Te datoteke bodo izbrisane iz naprave. Ali ste prepričani, da želite nadaljevati?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Te datoteke bodo trajno izbrisane iz diska. Ali ste prepričani, da želite nadaljevati?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Najdene skladbe v naslednjih mapah bodo dodane v vašo knjižnico" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Te nastavitve so uporabljene v pogovornem oknu \"Prekodiraj glasbo\" in dovolijo pretvorbo glasbe pred kopiranjem na napravo." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Tretja raven" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "To dejanje bo ustvarilo podatkovno zbirko, ki je lahko velika tudi do 150 MB.\nAli želite vseeno nadaljevati?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Ta album ni na voljo v zahtevani obliki" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "To lahko spremenite kasneje v možnostih" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Ta naprava mora biti povezana in odprta, preden lahko Clementine ugotovi katere vrste podpira" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Ta naprava podpira sledeče vrste datotek:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Ta naprava ne bo delovala pravilno" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "To je naprava MTP, Clementine pa je preveden brez podpore libmtp." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "To je naprava iPod, Clementine pa je preveden brez podpore libgpod." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Tokrat ste prvič priklopili to napravo. Clementine bo sedaj preiskal napravo za glasbenimi datotekami - to lahko traja nekaj časa." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "To možnost lahko spremenite v \"Obnašanje\"" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Ta pretok je le za plačane naročnike" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Ta vrsta naprave ni podprta: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "Časovni korak" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Naslov" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Danes" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Preklopi lep prikaz na zaslonu" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Preklopi celozaslonski način" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Preklopi stanje vrste" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Preklopi med pošiljanjem podatkov o predvajanih skladbah" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Preklopi vidnost lepega prikaza na zaslonu" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Jutri" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Preveč preusmeritev" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Najboljše skladbe" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Skupno albumov:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Skupno prenesenih bajtov" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Skupno število omrežnih zahtev" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Skladba" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Skladbe" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Prekodiraj glasbo" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Dnevnik prekodirnika" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Prekodiranje" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Prekodiranje %1 datotek z uporabo %2 niti" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Možnosti prekodiranja" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbina" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Izklopi" #: devices/giolister.cpp:157 msgid "URI" msgstr "Naslov URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "Naslovi URL" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Zelo širok pas (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Ni se mogoče povezati" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Ni bilo mogoče prejeti %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Neznano" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Neznan content-type" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Neznana napaka" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Odstrani ovitek" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Ne preskoči izbranih skladb" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Ne preskoči skladbe" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Ukini naročnino" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Prihajajoči koncerti" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Posodobi" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Posodobi vse podcaste" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Posodobi spremenjene mape v knjižnici" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Posodobi knjižnico ob zagonu Clementine" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Posodobi ta podcast" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Posodabljanje" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Posodabljanje %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Posodabljanje %1 % ..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Posodabljanje knjižnice" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Uporaba" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Uporabi oznako Izvajalca albuma, če je ta na voljo" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Uporabi bližnjice Gnome" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Uporabi psihedelične barve" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Uporabi metapodatke Jakosti predvajanja, če je mogoče" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Uporabi SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Uporabi Wii Remote" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Izberite seznam barv po meri" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Za obvestila uporabi sporočila po meri" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Uporabi omrežni oddaljeni nadzor" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Uporabi overitev" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Uporabi pogon za upravljanje bitne hitrosti" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Uporabi dinamični način" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Uporabi obvestila za poročanje o stanju Wii Remote" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Uporabi začasno oblikovanje šuma" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Uporabi privzeto za sistem" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Uporabi sistemsko privzeti seznam barv" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Uporabi nastavitve posredniškega strežnika sistema" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Uporabi izenačevanje glasnosti" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Uporabljeno" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Uporabniški vmesnik" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Uporabniško ime" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Uporaba menija za dodajanje skladbe bo povzročila sledeče ..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Spremenljiva bitna hitrost" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Različni izvajalci" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Različica %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Pogled" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Način predočenja" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Predočenja" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Nastavitve predočenja" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Zaznava dejavnosti glasu" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Glasnost %1 %" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Zid" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Opozori med pred zapiranjem zavihkov seznamov predvajanja" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Spletišče" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Tednov" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Ko se Clementine zažene" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Med iskanjem ovitkov albumov bo Clementine najprej poiskal datoteke s slikami, ki vsebujejo te besede. \nČe ne bo ujemanj, bo uporabil največjo sliko v mapi" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "Med shranjevanjem seznama predvajanja naj bodo poti datotek" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Ko je seznam prazen ..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Zakaj ne bi poskusili ..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Širok pas (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: omogočen" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: povezan" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: kritična baterija (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: onemogočen" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: nepovezan" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: šibka baterija (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media Audio" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Brez ovitka:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Ali bi želeli tudi druge skladbe v tem albumu premakniti med kategorijo Različni izvajalci?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Ali želite opraviti ponovno preiskovanje celotne knjižnice?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Zapiši vse statistike skladb v datoteke skladb" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Zapiši metapodatke" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Napačno uporabniško ime ali geslo." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Leto" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Leto - Album" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Let" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Včeraj" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Pravkar boste prejeli naslednje albume" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Pravkar boste izbrisali %1 seznamov predvajanja iz vaših priljubljenih, ali ste prepričani?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Pravkar boste odstranili seznam predvajanja, ki ni del vaših priljubljenih seznamov predvajanja, posledično bo izbrisan (tega dejanja ni mogoče razveljaviti).\nAli resnično želite nadaljevati?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Niste prijavljeni." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Prijavljeni ste kot %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Ste prijavljeni." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Spremenite lahko kako so skladbe organizirane v knjižnici" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Brezplačno lahko poslušate tudi brez računa, ampak le Premium člani lahko poslušajo pretoke višje kakovosti brez reklam." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Skladbe iz Magnatune lahko poslušate brezplačno tudi brez računa. Če plačate članstvo, bodo sporočila na koncu skladb odstranjena." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Sočasno lahko poslušate pretoke v ozadju in drugo glasbo." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Wii Remote lahko uporabite kot daljinski upravljalnik v Clementine. Obiščite Clementine wiki za več podrobnosti.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Nimate računa Spotify Premium." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Nimate dejavne naročnine" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "Za iskanje in predvajanje glasbe se vam ni potrebno prijaviti v SoundCloud, vseeno pa se boste morali prijaviti za dostop do vaših seznamov predvajanja in vašega pretoka." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Bili ste odjavljeni iz Spotify. Ponovno vnesite geslo v pogovorno okno nastavitev." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Bili ste odjavljeni iz Spotify. Ponovno vnesite vaše geslo." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "To je vaša priljubljena skladba" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "V sistemskih nastavitvah morate vklopiti \"nadzor vašega računalnika\", da boste lahko uporabili splošne bližnjice v Clementine." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Za spremembo jezika morate ponovno zagnati Clementine" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Vaš naslov IP:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Vaša poverila Last.fm so bila napačna" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Vaša poverila Magnatune so bila napačna" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Vaša knjižnica je prazna!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Vaši radio pretoki" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Vaši poslani seznami predvajanih skladb: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Predočenja niso na voljo, ker vašemu sistemu manjka podpora OpenGL" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Vaše uporabniško ime ali geslo je bilo napačno." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Ž-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Brez" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "dodaj %n skladb" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "po" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "nazaj" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "in" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "samodejno" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "pred" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "med" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "najprej največji" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "udarcev/min" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "vsebuje" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "onemogočeno" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "disk %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "ne vsebuje" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "se konča z" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "je enako" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "mapa gpodder.net" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "večje kot" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "Žal iPodi in naprave USB trenutno ne delujejo na Windows." #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "v zadnjih" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kb/s" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "manjše od" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "najprej najdaljši" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "premakni %n skladb" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "najprej novejši" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "ni enako" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "ne v zadnjih" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "ne na" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "najprej starejši" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "v" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "možnosti" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "ali optično preberite kodo QR!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "pritisnite enter" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "odstrani %n skladb" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "najprej krajši" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "premešaj skladbe" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "najprej manjši" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "razvrsti skladbe" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "se začne z" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "zaustavi" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "skladba %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/sr.po000066400000000000000000005644171260417502300237040ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Mladen Pejaković , 2014 # FIRST AUTHOR , 2010 # Jovana Savic , 2012 # Mladen Pejaković , 2014-2015 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Serbian (http://www.transifex.com/davidsansome/clementine/language/sr/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sr\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nМожете ставити листе нумера у омиљене кликом на звездицу поред имена листе\n\nОмиљене листе нумера биће сачуване овде" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " дана" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kb/s" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr " s" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " секунди" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " песама" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 песама)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 албума" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 дана" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "пре %1 дана" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 на %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 листи нумера (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 изабрано од" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 песма" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 песама" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 песама пронађено" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 песама пронађено (приказујем %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 нумера" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 пребачено" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev модул" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 других слушалаца" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 укупних слушања" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n неуспешно" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n завршено" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n преостало" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Поравнај текст" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&центрирај" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Посебна" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "&Додаци" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Помоћ" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&Сакриј %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Сакриј..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&лево" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "&Музика" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Ниједна" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "&Листа нумера" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Напусти" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "&Режим понављања" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&десно" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "&Насумични режим" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Уклопи колоне у прозор" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Алатке" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(другачије кроз разне песме)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", од" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "и свима који су допринели Амароку" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 дан" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 нумера" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k МП3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192.000Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44.100Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48.000Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 насумичних песама" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96.000Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Надогради на Премијум налог" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Ако није штиклирано Клементина ће уписивати ваше оцене и и осталу статистику само у одвојеној бази података и неће мењати ваше фајлове.

Ако је штиклирано, уписиваће статистику и у бази података и директно у фајл при свакој измени.

Имајте на уму да ово можда неће радити за сваки формат фајла и, како нема стандарда за то, остали музички плејери можда неће умети да то прочитају.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Ставите име поља испред тражене речи да бисте ограничили претрагу само на то поље, нпр. artist:Бора тражиће све извођаче чије име садржи реч „Бора“.

Доступна поља: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Упис статистике и оцена песама у ознаке фајлова за све песме ваше библиотеке.

Није потребно ако је поставка „Упиши оцену/статистику песме у ознаке кад је то могуће“ увек била активирана.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Показивачи почињу знаком %, на пример: %artist %album %title

\n\n

Ако део текста који садржи показиваче ставите у витичасте заграде, тај део ће бити сакривен ако је показивач празан.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Потребан је Спотифај Премијум налог" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Клијент може да се повеже само ако је унесен исправан кôд." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Паметна листа нумера је динамичка листа песама из ваше библиотеке. Постоје различити типови паметних листа који нуде различите начине избора песама." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Песма ће бити укључена у листу ако задовољава ове услове." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "А-Ш" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "ААЦ" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "ААЦ 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "ААЦ 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "ААЦ 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "АИФФ" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "СЛАВА ХИПНОЖАПЦУ" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Прекини" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "О %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "О Клементини..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Више о Куту..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Апсолутне" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Детаљи о налогу" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Детаљи о налогу (Премијум)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "радња" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Радња" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Укључи/искључи Wii даљински" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Ток активности" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Додај подкаст" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Додај ток" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Додај нову линију ако је подржано типом обавештења" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Додај радњу" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Додај све нумере из фасцикле и свих њених подфасцикли" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Додај други ток..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Додај фасциклу..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Додавање фајла" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Додај фајл у прекодер" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Додај фајло(ове) у прекодер" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Додај фајл..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Додавање фајлова за прекодирање" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Додавање фасцикле" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Додај фасциклу..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Додај нову фасциклу..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Додавање подкаста" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Додај подкаст..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Додај појам за тражење" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Уметни албум песме" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Уметни извођача албума песме" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Уметни извођача песме" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Уметни скор песме" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Уметни композитора песме" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Уметни диск песме" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Уметни име фајла песме" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Уметни жанр песме" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Уметни груписање песме" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Уметни дужину песме" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Уметни извођача песме" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Уметни број пуштања песме" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Уметни оцену песме" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Уметни број прескока песме" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Уметни наслов песме" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Додај песму у кеш" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Уметни нумеру песме" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Уметни годину песме" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Додај песму у „Моју музику“ кад кликнем на дугме „Волим“" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Додај ток..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Додај у Моју музику" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Додај у Спотифај листе нумера" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Додај на Спотифај оцењено" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Додај у другу листу" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Додај у обележиваче" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Додај у листу нумера" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "стави у ред" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Додај корисника/групу у обележиваче" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Додај wiimotedev радњу" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Додај..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "додато овог месеца" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "додато ове седмице" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "додато ове године" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "додато данас" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "додато у последња три месеца" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Напредно груписање..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "након " #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Након копирања:" #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "албум" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "албум (идеална јачина за све песме)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "извођач албума" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Омот албума" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Подаци албума са Џаменда..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Албуми" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Албуми са омотима" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Албуми без омота" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Све" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Сви фајлови (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "Слава Хипножапцу!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Сви албуми" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Сви извођачи" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Сви фајлови" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Све листе нумера (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "свим преводиоцима" #: library/library.cpp:98 msgid "All tracks" msgstr "Све нумере" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Дозволи клијенту да преузима музику са овог рачунара." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Дозволи преузимања" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Дозволи „mid/side“ кодирање" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "поред оригинала" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Увек сакриј главни прозор" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Увек прикажи главни прозор" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "увек ће почети пуштање" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Амазон Клауд Драјв" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Потребан је додатни прикључак за коришћење Спотифаја у Клементини. Желите ли да га преузмете и инсталирате сада?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Дошло је до грешке учитавања базе података Ајтјунса" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Дошло је до грешке уписа метаподатака на „%1“" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Дошло је до неодређене грешке." #: ui/about.cpp:85 msgid "And:" msgstr "И:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "љутит" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Изглед" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Додај нумере/УРЛ токове у листу нумера" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Додај у текућу листу нумера" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "дода у листу нумера" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Примени компресију како би се спречило одсецање" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Желите ли заиста да обришете препоставку „%1“?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Желите ли заиста да поништите статистику ове песме?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Желите ли заиста да упишете статистику песме у фајл песме за све песме из ваше библиотеке?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "извођач" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Подаци о извођачу" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Ознаке извођача" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "иницијали извођача" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Питај приликом уписа" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Формат звука" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Излаз звука" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Аутентификација није успела" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Аутор" #: ui/about.cpp:68 msgid "Authors" msgstr "Аутори" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "аутоматски" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Аутоматски" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Аутоматско ажурирање" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Аутоматски отвори појединачне категорије у стаблу библиотеке" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Доступно" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Просечни битски проток" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Просечна величина слике" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "ББЦ-ијеви подкасти" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "темпо" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Позадински токови" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Боја позадине" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Слика позадине" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Непрозирност позадине" #: core/database.cpp:648 msgid "Backing up database" msgstr "Бекапујем базу података" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Равнотежа" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "Забрани (Ласт.фм скробловање)" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Тракасти анализатор" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "основна плава" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Тип звука (основно)" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Понашање" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "најбољи" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Биографија са %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "битски проток" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Битски проток" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "битски проток" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Блок анализатор" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Тип блока" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Замућење" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Тело" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Бум анализатор" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Бокс" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Прегледај..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Величина бафера" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Баферујем" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Изгради Сифајл индекс..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "али ови извори су онемогућени:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "дугмад" #: core/song.cpp:428 msgid "CDDA" msgstr "ЦДДА" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Подршка за ЦУЕ лист" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Путања кеша:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Кеширање" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "Кеширам %1" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Одустани" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Прекини преузимање" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Потребан је кепча кôд.\nДа бисте поправили проблем покушајте да се пријавите на Vk.com у вашем прегледачу." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Промени слику омота" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Промени величину фонта..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Понављање" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Измени пречицу..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Насумичност" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "мења тренутно пуштену песму" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Промени језик" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "Измене ће наступити по пуштању следеће песме" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Измена ће бити активна за наступајуће песме" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Тражи нове епизоде" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Потражи надоградње" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Потражи надоградње..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Избор фасцикле кеша за Vk.com" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Изаберите име за вашу паметну листу" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Изабери аутоматски" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Изабери боју..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Изабери фонт..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "избор са списка" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Одредите сортирање листе нумера и колико песама ће да садржи." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Избор фасцикле преузимања за подкаст" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Изаберите интернет сервисе за приказ." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Изаберите сајтове које желите да Клементина користи при тражењу стихова." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "класична" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Чишћење" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Очисти" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Очисти листу нумера" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Клементина" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Грешка Клементине" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Клементина наранџаста" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Визуелизација Клементине" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Клементина може аутоматски да претвори музику коју копирате на овај уређај у формат који тај уређај може да пусти." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Клементина може да пушта музику коју сте учитали на Амазон Клауд Драјв" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Клементина може да пушта музику коју сте учитали на Бокс" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Клементина може да пушта музику коју сте учитали на Дропбокс" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Клементина може да пушта музику коју сте учитали на Гугл Драјв" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Клементина може да пушта музику коју сте учитали на ВанДрајв" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Клементина може приказивати поруке приликом измена нумера." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Клементина може да синхронизује ваше претплатничке листе са осталим вашим рачунарима и апликацијама подкаста. Направите налог." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Клементина не може да учита ниједну пројектМ визуелизацију. Проверите да ли сте исправно инсталирали Клементину." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Клеметинин прегледач слика" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Клементина није могла да нађе резултате за овај фајл" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Клементина ће тражити музику у:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Кликните овде да додате музику" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Кликните овде да ставите ову листу нумера у омиљене како би била сачувана и приступачна преко панела „Листе нумера“ на левој бочној траци" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Кликните да промените приказ преосталог/укупног времена" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Кликом на дугме пријаве отворићете веб прегледач. Вратите се на Клементину пошто се пријавите." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Затвори" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Затвори листу нумера" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Затвори визуелизацију" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Затварањем овог прозора прекинућете преузимање." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Затварањем овог прозора прекинућете потрагу за омотима албума." #: ui/equalizer.cpp:114 msgid "Club" msgstr "клуб" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Боје" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Зарез раздваја листу од класа: ниво, ниво је 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "коментар" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Друштвени радио" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Попуни ознаке аутоматски" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Попуни ознаке аутоматски..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "композитор" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Подеси %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Подеси Магнатјун..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Поставке пречица" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Подеси Спотифај..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Подеси Субсоник..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Подеси vk.com..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Подеси општу претрагу..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Подеси библиотеку..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Подеси подкасте..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Подеси..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Повежи Wii даљинске користећи радње укључено/искључено" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Повежи уређај" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Повежи се на Спотифај" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Сервер је одбио везу, проверите УРЛ. Пример: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Прековреме истекло, проверите УРЛ сервера. Пример: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Проблем са повезивањем или је власник онемогућио звук" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Конзола" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Константан битски проток" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Претвори сву музику" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Претвори сву музику коју уређај не може да пусти" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Претвори безгубитне аудио фајлове пре слања на даљински." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Претвори безгубитне фајлове" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Копирај УРЛ дељења на клипборд" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Копирај на клипборд" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Копирај на уређај...." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Копирај у библиотеку..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Ауторска права" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Не могу да се повежем на Субсоник, проверите УРЛ сервера. Пример: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Не могу да направим Гстример елемент „%1“ - проверите да ли су инсталирани сви потребни Гстример прикључци" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Не могу да направим листу нумера" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Не могу да нађем муксер за %1, проверите да ли имате инсталиране потребне прикључке за Гстример" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Не могу да нађем кодер за %1, проверите да ли имате инсталиране потребне прикључке за Гстример" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Не могу да отворим излазни фајл %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Менаџер омота" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Омот из уграђене слике" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Омот аутоматски учитан из %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Омот ручно уклоњен" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Омот није постављен" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Омот постављен из %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Омоти са %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Претапање при аутоматској измени нумера" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Претапање при ручној измени нумера" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "посебно" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Посебна слика:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Поставке посебне поруке" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "посебна..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "Дбус путања" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "денс" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Откривено оштећење базе података. Погледајте https://code.google.com/p/clementine-player/wiki/DatabaseCorruption за упутства како да повратите вашу базу података" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "направљен" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "измењен" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "дана" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "Под&разумевана" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Утишај звук за 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Смањи јачину звука за <вредност> процената" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Смањи јачину звука" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Подразумевана" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Подразумевани уређај на %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Подразумевано" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Застој између визуелизација" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Обриши" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Обриши преузете податке" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Брисање фајлова" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Обриши са уређаја..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Обриши са диска..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Обриши пуштене епизоде" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Обриши препоставку" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Обриши паметну листу" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "обриши оригиналне фајлове" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Бришем фајлове" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Избаци изабране нумере из реда" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Избаци нумеру из реда" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Одредиште" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Детаљи..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Уређај" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Својства уређаја" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Име уређаја" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Својства уређаја..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Уређаји" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Дијалог" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Да ли сте мислили" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Диџитали Импортед" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Лозинка" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Корисничко име" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Директна интернет веза" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "фасцикла" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Онемогући трајање" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Искључи стварање расположења" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Онемогућено" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Онемогућен" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "диск" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Испрекидан пренос" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Опције приказа" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Прикажи екрански преглед" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Поново скенирај библиотеку" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Понови скенирање" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Понови скенирање..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Не претварај музику" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Не пребрисуј" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "Поновним скенирањем ћете изгубити све метаподатке сачуване у Клементини, нпр. омоте албума, број пуштања и оцене. Клементина ће поново скенирати сву вашу музику са Гугловог Драјва што може потрајати." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Не понављај" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Не приказуј у разним извођачима" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Не приказуј преслушане епизоде" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Не пуштај насумично" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Не заустављај!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Донирај" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Кликните двапут да отворите" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "Двоклик на песму са листе..." #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Двоклик на песму ће да је..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Преузми %n епизода" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Фасцикла за преузимање" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Преузимај епизоде у" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "преузимања садржаја" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Преузимај нове епизоде аутоматски" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Преузимање је на чекању" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Поставке преузимања" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Преузмите апликацију за Андроид" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Преузми овај албум" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Преузми овај албум..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Преузми ову епизоду" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Преузми..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Преузимам (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Преузимам Ајскаст директоријум" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Преузимам Џамендов каталог" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Преузимам Магнатјунов каталог" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Преузимам Спотифај прикључак" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Преузимам метаподатке" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Превлачите да бисте мењали положај" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Дропбокс" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "дабстеп" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Трајање" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Динамички режим је укључен" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Динамички насумични микс" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Уреди паметну листу..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Уреди ознаку „%1“..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Уреди ознаку..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Уреди ознаке" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Уређивање података нумере" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Уреди податке нумере..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Уреди податке нумера.." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Уреди..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "Е-адреса" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Омогући подршку за Wii даљински" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Аутоматско кеширање" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Укључи еквилајзер" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Омогући пречице само кад је Клементина у фокусу" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Омогући уткано уређивање метаподатака песме кликом" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Омогућите изворе приказане испод да бисте их укључили у претрагу. Резултати ће бити приказани овим редим." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Ласт.фм скробловање" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Комплексност кодирања" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Квалитет мотора кодирања" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Режим кодирања" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Унос УРЛ-а" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Унесите УРЛ за преузимање омота са интернета:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Унесите име за извезене омоте (без наставка):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Унесите ново име за ову листу нумера" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Унесите појмове за тражење изнад да бисте пронашли музику на вашем рачунару или на интернету" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Унесите појам за тражење испод да бисте нашли подкасте у Ајтјунс продавници" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Унесите појам за тражење испод да бисте нашли подкасте на gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Унесите појам за тражење овде" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Унесите УРЛ тока интернет радија:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Унесите име фасцикле" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Унесите овај ИП у апликацију да бисте је повезали са Клементином." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "читаву колекцију" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Еквилајзер" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Исто као и --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Исто као и --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Грешка" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Грешка при чупању ЦД-а" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Грешка повезивања МТП уређаја" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Грешка копирања песама" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Грешка брисања песама" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Грешка преузимања Спотифај прикључка" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Грешка учитавања %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Грешка учитавања di.fm листе нумера" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Грешка обраде %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Грешка приликом учитавања аудио ЦД-а" #: library/library.cpp:68 msgid "Ever played" msgstr "Већ пуштано" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "сваких 10 минута" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "сваких 12 сати" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "свака 2 сата" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "сваких 20 минута" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "сваких 30 минута" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "сваких 6 сати" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "сваког сата" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Осим између нумера на истом албуму или на истом ЦУЕ листу" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Постојећи омоти" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Прошири" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Истиче %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Извези омоте" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Извоз омота" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Извези преузете омоте" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Извези уграђене омоте" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Извоз завршен" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Извезено %1 омота од %2 (%3 прескочено)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "ФЛАЦ" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Утапај при паузи/настављању" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Утапај нумеру при заустављању" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Утапање" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Трајање претапања" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Неуспех читања ЦД уређаја" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Неуспех добављања директоријума" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Неуспех добављања подкаста" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Неуспех учитавања подкаста" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Неуспех рашчлањивања ИксМЛ-а за овај РСС довод" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "брз" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Омиљене нумере" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Добави недостајуће омоте" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Добави аутоматски" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Добављање завршено" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Добављам Субсоникову библиотеку" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Грешка добављања омота" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Формат фајла" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "наставак фајла" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Формати фајлова" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "име фајла" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "име фајла (без путање)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Шаблон имена фајла:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Путање фајлова" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "величина фајла" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "тип фајла" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "име фајла" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Фајлови" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Фајлови за прекодирање" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Пронађите песме у библиотеци које одговарају одређеном критеријуму." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Пронађи овог извођача" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Идентификујем песму" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Заврши" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Први ниво" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Уклопи омот по ширини" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "ФЛАЦ" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Величина фонта" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Из разлога лиценцирања подршка за Спотифај је у одвојеном прикључку." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Присили моно кодирање" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Заборави уређај" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Заборављањем уређаја уклонићете га са списка и Клементина ће морати поново да скенира све песме следећи пут када га повежете." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Образац" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Формат" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Број кадрова" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Сличица по баферу" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "залеђен" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "пуни бас" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "пуни бас + сопран" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "пуни сопран" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Опште" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Опште поставке" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "жанр" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Добави УРЛ за дељење ове песме са Спотифаја" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Добави УРЛ за дељење ове листе нумера" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Добављам канале" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Добављам токове" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Дајте јој име:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Иди" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Иди на следећи језичак листе" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Иди на претходни језичак листе" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Гугл Драјв" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Добављено %1 омота од %2 (%3 неуспешно)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Посиви непостојеће песме у листи нумера" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Груписање библиотеке" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Груписање" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "албум" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "извођач" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "извођач/албум" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "извођач/година — албум" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "жанр/албум" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "жанр/извођач/албум" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "груписање" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "ХТМЛ страница не садржи ниједан РСС довод" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "Примљен ХТТП 3xx кôд без УРЛ-а, проверите поставке сервера." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "ХТТП прокси" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "срећан" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Подаци о хардверу" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Подаци о хардверу су доступни само док је уређај повезан." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "висок" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "висок (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "висок (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "Хип-хоп" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Домаћин није нађен, проверите УРЛ сервера. Пример: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "сати" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Хипножабац" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "немам налог на Магнатјуну" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Икона" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Иконе на врху" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Идентификујем песму" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Дозвољава уређивање ознаке директно у приказу листе нумера кликом на песму" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Ако наставите, овај уређај ће радити споро а песме копиране на њега можда неће радити." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Ако знате УРЛ подкаста, унесите га испод и кликните на „Иди“." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Игонориши „The“ у имену извођача" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Слике (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Слике (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Увези..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "за %1 дана" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "за %1 седмица" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "У динамичком режиму нове нумере ће бити изабране и додате на листу сваки пут кад се песма заврши." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Сандуче" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Укључи омоте албума у обавештења" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Укључи све песме" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Неодговарајуће издање Субсониковог РЕСТ протокола. Клијент треба надоградњу." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Неодговарајуће издање Субсониковог РЕСТ протокола. Сервер треба надоградњу." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Непотпуно подешавање, испуните сва поља." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Појачај звук за 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Повећај јачину звука за <вредност> процената" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Повећај јачину звука" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Индексирам %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Подаци" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Опције улаза" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Уметни..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "инсталиран" #: core/database.cpp:585 msgid "Integrity check" msgstr "Провера интегритета" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Интернет" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Интернет сервиси" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Интернет сервиси" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "Уводне нумере" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Неважећи АПИ кључ" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Неисправан формат" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Неисправан начин" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Неисправни параметри" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Наведен неисправан ресурс" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Неисправан сервис" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Неважећи кључ сесије" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Обрни избор" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Џамендо" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Џамендове најслушаније нумере" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Џамендове најбоље нумере" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Џамендове најбоље нумере овог месеца" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Џамендове најбоље нумере ове седмице" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Џамендова база података" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "пушта претходну песму одмах" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Скочи на текућу нумеру" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Држите тастере %1 секунду..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Држите тастере %1 секунди..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Настави рад у позадини кад се прозор затвори" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "задржи оригиналне фајлове" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Мачићи" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Кудуро" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Језик" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "лаптоп/слушалице" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "велика дворана" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Велики омот" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Велики омот албума (детаљи испод)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Велики омот албума (без детаља)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Широка трака" #: library/library.cpp:80 msgid "Last played" msgstr "Последњи пут пуштано" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "последњи пут пуштена" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Ласт.фм" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Ласт.фм је тренутно заузет, покушајте поново за неколико минута" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Лозинка" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Ласт.фм број пуштања" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Ласт.фм ознаке" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Корисничко име" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Ласт.фм вики" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Најмање омиљене нумере" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Лево" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "дужина" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Библиотека" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Напредно груписање библиотеке" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Обавештење о поновном скенирању библиотеке" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Претраживање библиотеке" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Ограничења" #: ui/equalizer.cpp:137 msgid "Live" msgstr "уживо" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Учитај" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Учитавање омота са УРЛ-а" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Учитај омот са УРЛ-а..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Учитавање омота са диска" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Учитај омот са диска..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Учитавање листе нумера" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Учитај листу нумера..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Учитавам МТП уређај" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Учитавам Ајподову базу података" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Учитавам паметну листу" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Учитавам песме" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Учитавам ток" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Учитавам нумере" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Учитавам податке о нумерама" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Учитавам..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Учитава датотеке/УРЛ-ове, замењујући текућу листу" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Пријава" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Пријава није успела" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Одјава" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "дугорочно предвиђање (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Волим" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "Воли (Ласт.фм скробловање)" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "низак (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "низак (256X256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "ниска комплексност (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Стихови" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Стихови са %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Стихови из ИД3в2 ознаке" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "М4А ААЦ" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MП3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "МП3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "МП3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "МП4 ААЦ" #: core/song.cpp:410 msgid "MPC" msgstr "МПЦ" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Магнатјун" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Преузимање са Магнатјуна" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Завршено преузимање са Магнатјуна" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "главни профил (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Ентерпрајз!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Ентерпрајз!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Направи листу доступну ван мреже" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Лош одговор" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Ручно подешавање проксија" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "ручно" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Произвођач" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Означи као преслушано" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Означи као ново" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Упореди сваки тражени појам (AND)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Упореди један или више тражених појмова (ОR)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Највише резултата опште претраге" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Највећи битски проток" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Медиј је промењен. Учитавам поново" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "средњи (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "средњи (512X512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Тип чланства" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Најмањи битски проток" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Најмањи испун бафера" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Недостају препоставке за пројектМ" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Модел" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Надгледај измене у библиотеци" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Моно репродукција" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "месеци" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "расположење" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Стил расположења" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Расположења" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Још" #: library/library.cpp:84 msgid "Most played" msgstr "Најчешће пуштано" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Тачка монтирања" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Тачке монтирања" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Помери доле" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Премести у библиотеку" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Помери горе" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Музика" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Музичка библиотека" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Утишај" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Моји албуми" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Моја музика" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Моје препоруке" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Име" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "име" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Опције именовања" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "уски опсег (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Мрежни прокси" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Мрежни даљински" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Никад" #: library/library.cpp:74 msgid "Never played" msgstr "Никад пуштано" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "неће почети пуштање" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Нова фасцикла" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Нова листа нумера" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Нова паметна листа" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Нове песме" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Нове нумере ће бити аутоматски додате." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Најновије нумере" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Следећа" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Следећа нумера" #: core/utilities.cpp:151 msgid "Next week" msgstr "следеће седмице" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Без анализатора" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Без слике позадине" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Нема омота за извоз." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "без дугих блокова" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Нема поклапања. Очистите поље претраге да бисте приказали целу листу поново." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "без кратких блокова" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "ништа" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Ниједна од изабраних песама није погодна за копирање на уређај" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "нормалан" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "нормални тип блока" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Није доступно док се користи промењива листа" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Неповезан" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Нема довољно садржаја" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Нема довољно обожавалаца" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Нема довољно чланова" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Нема довољно комшија" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "није инсталиран" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Нисте пријављени" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Није монтиран — кликните двапут да монтирате" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Ништа није нађено" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Врста обавештења" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Обавештења" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Сада пуштам" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Број епизода за приказ" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "ОСД преглед" #: widgets/osd.cpp:173 msgid "Off" msgstr "искључено" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "ОГГ ФЛАЦ" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "ОГГ Опус" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "ОГГ Спикс" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "ОГГ Ворбис" #: widgets/osd.cpp:173 msgid "On" msgstr "укључено" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "Ван Драјв" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Прихватај везе само од клијената унутар овог распона ип адреса:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Дозволи само везе са локалне мреже" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Прикажи само почетних" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Прозирност" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Отвори %1 у прегледачу" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Отвори &аудио ЦД..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Отварање ОПМЛ фајла" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Отвори ОПМЛ фајл..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Отварање фасцикле за увоз музике" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Отвори уређај" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Отвори фајл..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Отвори у Гугл Драјву" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Отвори у новој листи" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "отвори у новој листи" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Отвори у прегледачу" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Отвори..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Радња није успела" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Оптимизуј битски проток" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Оптимизуј квалитет" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Опције..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Опус" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Организовање фајлова" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Организуј фајлове..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Организујем фајлове" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Почетне ознаке" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "изворна година" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "изворна година — албум" #: library/library.cpp:118 msgid "Original year tag support" msgstr "Подршка за ознаку изворне године" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Остале опције" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Излаз" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Уређај излаза" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Опције излаза" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Пребриши све" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Пребриши постојеће фајлове" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Пребриши само мање фајлове" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Власник" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Рашчлањујем Џамендов каталог" #: ui/equalizer.cpp:139 msgid "Party" msgstr "журка" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Лозинка" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Паузирај" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Паузирај пуштање" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Паузирано" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "извођач" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "пиксела" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Обична трака" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Пусти" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "број пуштања" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Пусти ако је заустављено, заустави ако се пушта" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "почеће пуштање ако тренутно ништа није пуштено" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Пусти у нумеру са листе" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Пусти/паузирај" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Пуштање" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Опције плејера" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Листа нумера" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Листа нумера је завршена" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Опције листе нумера" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Тип листе" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Листе нумера" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Затворите ваш прегледач и вратите се на Клементину." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Стање прикључка:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Подкасти" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "поп" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Трајање" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Порт" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Претпојачање" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Поставка" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Поставке" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Подешавање..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Имена фајлова омота (одвојена зарезом)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Пожељни формат звука" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Пожељни битски проток" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Пожељни формат" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Тип звука (премијум)" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Препоставка:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Притисните комбинацију тастера за" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Притисните тастер" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Притисните комбинацију тастера за %1..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Дугме „Претходна“ у плејеру..." #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Опције лепог ОСД-а" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Преглед" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Претходна" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Претходна нумера" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Прикажи податке о издању" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Профил" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Напредак" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "напредак" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "психоделично" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Притисните тастер на Wii даљинском" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Постави насумично" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Квалитет" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Квалитет" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Испитујем уређај..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Менаџер редоследа" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Стави у ред изабране нумере" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Стави нумеру у ред" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "радио (једнака јачина за све песме)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Киша" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Киша" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "насумично" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Оцени текућу песму са 0 звезда" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Оцени текућу песму са 1 звездом" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Оцени текућу песму са 2 звезде" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Оцени текућу песму са 3 звезде" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Оцени текућу песму са 4 звезде" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Оцени текућу песму са 5 звезда" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "оцена" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Заиста одустајете?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Пређено ограничење преусмеравања, проверите поставке сервера." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Освежи каталог" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Освежи канале" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Освежи списак станица" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Освежи токове" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "реге" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Релативне" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Упамти замах" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Сети се од прошлог пута" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Упамти мој избор" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Уклони" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Уклони радњу" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Уклони дупликате са листе" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Уклони фасциклу" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Уклони из Моје музике" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Уклони из обележивача" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Уклони са листе нумера" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Уклањање листе нумера" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Уклони листе нумера" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Уклони недоступне нумере са листе нумера" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Преименовање листе нумера" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Преименуј листу нумера..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Нумериши овим редом..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Понављање" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Понављај албум" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Понављај листу нумера" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Понављај нумеру" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Замени текућу листу" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "замени листу нумера" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Замени размаке подвлаком" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Нивелатор звука" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Режим нивелисања звука" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Попуни поново" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Захтевај аутентификацијски кôд" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Ресетуј" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Поништи број пуштања" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "понавља песму, и пушта претходну ако је поново притиснуто" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Поново пусти нумеру или пусти претходну ако је текућа унутар почетних 8 секунди." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Ограничи се на АСКИ знакове" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Настави пуштање по покретању" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Вратите се на Клементину" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Десно" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "чупај" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Чупање ЦД-а" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Чупај аудио ЦД" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "рок" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Изврши" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "СОЦКС прокси" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Грешка ССЛ руковања, проверите поставке сервера. ССЛв3 опција испод може заобићи неке проблеме." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Безбедно извади уређај" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Безбедно извади уређај после копирања" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "узорковање" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "узорковање" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Сачувај .mood фајлове у музичкој библиотеци" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Уписивање омота албума" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Сачувај омот на диск..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Сачувај слику" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Сачувај листу нумера" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Упис листе нумера" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Сачувај листу нумера..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Сачувај препоставку" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Упиши оцену песме у ознаке кад је то могуће" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Упиши статистику песме у ознаке кад је то могуће" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Сачувај овај ток у интернет језичку" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Уписујем статистике песама у фајлове песама" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Уписујем нумере" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "скалабилно узорковање (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Промени величину" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "скор" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Скроблуј нумере које пуштам" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Сифајл" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Тражи" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Претрага" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Тражи Ајскаст станице" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Тражи на Џаменду" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Тражи на Магнатјуну" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Тражи на Субсонику" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Тражи аутоматски" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Тражи омоте албума..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Тражите било шта" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Тражи на gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Тражи на Ајтјунсу" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Режим претраге" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Опције претраге" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Резултати претраге" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Појмови за претрагу" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Други ниво" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Тражи уназад" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Тражи унапред" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Иди на положај текуће нумере за релативни износ" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Иди на положај текуће нумере за апсолутни износ" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "Бирање положаја пречицом тастатуре" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Изабери све" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Очисти избор" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Боја позадине:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Слика позадине" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Изаберите најбоље поклапање" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Главна боја:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Избор визуелизација" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Изабери визуелизације..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Изабери..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Серијски број" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Сервер" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "УРЛ сервера" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Детаљи сервера" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Сервис ван мреже" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Промени %1 у „%2“..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Постави јачину звука на <вредност> процената" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Подеси вредност за све изабране нумере..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Подешавања" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "пречица" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Пречица за %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Пречица за %1 већ постоји" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Прикажи" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Прикажи ОСД" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Прикажи шљаштећу анимацију на пуштеној нумери" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Прикажи траку расположења у траци напретка нумере" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Изворна обавештења радне површи" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Обавештење при промени режима понављања/насумичности" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Обавештење при промени јачине звука" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Обавештење при паузи пуштања" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Облачић са системске касете" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Лепи ОСД" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Прикажи изнад траке стања" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Прикажи све песме" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Прикажи све песме" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Прикажи омот у библиотеци" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Прикажи раздвајаче" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Пуна величина..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Прикажи групе у резултату опште претраге" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Прикажи у менаџеру фајлова" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Прикажи у библиотеци..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Приказуј у разним извођачима" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Прикажи расположење" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Прикажи само дупликате" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Прикажи само неозначене" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Прикажи текућу песму на мојој страници" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "прикажи предлоге претраге" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Прикажи „волим“ дугме" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Прикажи дугме скробловања у главном прозору" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Усидри у системску касету" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "прикажи који су извори омогућени/онемогућени" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Прикажи/сакриј" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Насумичност" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Насумично албуми" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Насумично све" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Претумбај листу" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Насумично нумере у овом албуму" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Пријави се" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Одјави се" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Пријављујем се..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Слични извођачи" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Величина" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Величина:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "ска" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Прескочи уназад у листи нумера" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "број прескакања" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Прескочи унапред у листи нумера" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Прескочи изабране нумере" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Прескочи нумеру" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Мали омот" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Уска трака" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Паметна листа" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Паметне листе" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "лагана" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "лагани рок" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Подаци о песми" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Подаци о песми" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Сонограм" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Жао нам је" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Поређај по жанру (абецедно)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Поређај по жанру (по популарности)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Поређај по имену станице" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Критеријум ређања" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Ређање" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "Саундклауд" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "извор" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Извори" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Спикс" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Спотифај" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Грешка пријављивања на Спотифај" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "УРЛ Спотифај листе нумера" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Спотифај прикључак" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Спотифај прикључак није инсталиран" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "УРЛ Спотифај песме" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "стандардан" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Са звездицом" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Почни чупање" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Пусти текућу листу нумера" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Почни прекодирање" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Почните нешто да куцате у поље за претрагу изнад да бисте испунили овај списак резултата претраге" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Почињем %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Почињем..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Заустави" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Заустави после" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Заустави после сваке нумере" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Заустављање после сваке нумере" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Заустави после ове нумере" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Заустави пуштање" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Заустави после текуће нумере" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Заустави пуштање после нумере: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Заустављено" #: core/song.cpp:431 msgid "Stream" msgstr "Ток" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Пуштање тока са Субсониковог сервера захтева важећу лиценцу сервера након 30-дневног пробног периода." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "стримовање садржаја" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Претплатници" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Субсоник" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Успех!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "Успешно уписано %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Предложене ознаке" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Резиме" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "супер висок (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "супер висок (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Подржани формати" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Синхронизуј статистике у фајлове" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Синхронизовање Спотифај сандучета" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Синхронизовање Спотифај листе нумера" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Синхронизовање Спотифај оцењених нумера" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "системске боје" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Језичци на врху" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Добављач ознака" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Циљани битски проток" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "техно" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Опције текста" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Захвалнице" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Наредбе „%1“ се не могу покренути." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Омот албума текуће песме" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "Директоријум „%1“ није исправан" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "Друга вредност мора бити већа од прве!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Сајт који сте затражили не постоји!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Сајт који сте затражили није слика!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Пробни период за Субсоников сервер је истекао. Донирајте да бисте добили лиценцни кључ. Посетите subsonic.org за више детаља." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Издање Клементине које сте управо надоградили захтева потпуно скенирање библиотеке због нових могућности које су излистане испод:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Има још песама у овом албуму" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Проблем приликом комуникације са gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Проблем приликом добављања метаподатака са Магнатјуна" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Проблем приликом рашчлањивања одговора са Ајтјунс продавнице." #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Било је проблема приликом копирања неких песама. Следећи фајлови нису копирани:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Било је проблема при брисању неких песама. Следећи фајлови нису обрисани:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Ови фајлови ће бити обрисани са уређаја, желите ли заиста да наставите?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Ови фајлови ће бити трајно обрисани са диска, желите ли заиста да наставите?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Ове фасцикле ће бити скениране да би се направила библиотека" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Ове поставке се користе у дијалогу „Прекодирање музике“, и приликом кодирања музике пре копирања на уређај." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Трећи ниво" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Овај радња ће направити базу података која може бити велика и до 150 MB.\nЖелите ли ипак да наставите?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Овај албум није доступан у траженом формату" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Ово можете да измените касније у подешавањима" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Овај уређај мора бити повезан и отворен пре него што Клементина може да види које формате фајлова подржава." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Овај уређај подржава следеће формате фајлова:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Овај уређај неће радити исправно" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Ово је МТП уређај, али ви сте компиловали Клементину без libmtp подршке." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Ово је Ајпод, али ви сте компиловали Клементину без libgpod подршке." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Ово је први пут да сте повезали овај уређај. Клементина ће сад да скенира уређај да би нашла музику - то може да потраје." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Ову опцију можете изменити у поставкама „Понашања“" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Овај ток је само за претплатнике" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Овај тип уређаја није подржан: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "Временски корак" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "наслов" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "данас" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Лепи ОСД" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Цео екран" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Мењај стање редоследа" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Мењај скробловање" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Мењај видљивост лепог ОСД-а" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "сутра" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Превише преусмеравања" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Најбоље нумере" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Укупно албума:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Укупно бајтова пребачено" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Укупно направљених мрежних захтева" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "нумера" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Нумере" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Прекодирање музике" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Дневник прекодирања" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Прекодирање" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Прекодирам %1 фајлова користећи %2 ниски" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Опције прекодирања" #: core/song.cpp:426 msgid "TrueAudio" msgstr "ТруеАудио" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Турбина" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Искључи" #: devices/giolister.cpp:157 msgid "URI" msgstr "УРИ" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "Адресе" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "ултра широки опсег (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Не могу да се повежем" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Не могу да преузмем %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Непознато" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Непознат тип садржаја" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Непозната грешка" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Уклони омот" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Уклони прескакање нумера" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Уклони прескакање" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Уклони претплату" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Предстојећи концерти" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Ажурирај" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Ажурирај све подкасте" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Ажурирај измењене фасцикле библиотеке" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Ажурирај библиотеку при покретању Клементине" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Ажурирај овај подкаст" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Ажурирање" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Ажурирам %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Ажурирам %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Ажурирање библиотеке" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Употреба" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Користи ознаку извођача албума ако је доступна" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Користи Гномове пречице" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Користи психоделичне боје" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Користи метаподатке нивелисања ако су доступни" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Користи ССЛв3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Користи Wii даљински" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Посебна палета боја" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Користи посебну поруку за обавештења" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Укључи даљинско управљање преко мреже" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Користи аутентификациjу" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Мотор менаџмента за битски проток" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Динамички режим" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Користите обавештења за пријаву стања Wii даљинског" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Временско обликовање шума" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "системски подразумеван" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Системски подразумевана палета боја" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Системске поставке проксија" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Нормализација јачине звука" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Искоришћено" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Корисничко сучеље" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Корисничко име" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Радња менија за додавање песме..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "ВБР МП3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Промењив битски проток" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Разни извођачи" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Издање %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Приказ" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Режим визуелизација" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Визуелизације" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Подешавање визуелизација" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Откривање гласовне активности" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Јачина %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Ворбис" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "ВАВ" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "ВМА" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Зид" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Упозори ме приликом затварања језичка листе нумера" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "ВАВ" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Вебсајт" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "седмица" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Када се Клементина покрене" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Приликом тражења омота албума Клементина ће најпре да тражи фајлове слика који садрже неке од ових речи.\nАко нема поклапања онда ће да користи највећу слику у директоријуму." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "При упису листе нумера, путање фајлова треба да буду" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Када је списак празан:" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Зашто не бисте пробали..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "широки опсег (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii даљински %1: активиран" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii даљински %1: повезан" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii даљински %1: ниво батерије критичан (%2%)" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii даљински %1: деактивиран" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii даљински %1: неповезан" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii даљински %1: ниво батерије низак (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wii даљински" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Виндоуз медија 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Виндоуз медија 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Виндоуз медија 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Виндоуз медија аудио" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Без омота:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Желите ли да померите и остале песме из овог албума у разне извођаче такође?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Желите ли сада да покренете потпуно скенирање?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Уписивање статистика свих песама у фајлове песама" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Уписуј метаподатке" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Погрешно корисничко име или лозинка." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "година" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "година — албум" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "година" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "јуче" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Преузећете следеће албуме" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Желите ли заиста да уклоните %1 листи нумера из омиљених?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Уклонићете и обрисати листу нумера која није у вашим омиљеним (ова радња не може да се поништи). \nЖелите ли заиста да наставите?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Нисте пријављени." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Пријављени сте као %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Пријављени сте." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Можете изменити начин организивања песама у библиотеци." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Можете да слушате бесплатно без налога, али само премијум корисници могу да слушају токове високог квалитета без реклама." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Можете бесплатно слушати песме на Магнатјуну без налога. Куповином чланства ослободићете се порука на крају сваке нумере." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Можете да слушате позадинске токове истовремено са другом музиком." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Можете да користите ваш Wii даљински за даљинску контролу Клементине. Погледајте страницу на Клементином викију за више података.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Немате Спотифај Премијум налог." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Немате активну претплату" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "Не морате бити пријављени да бисте претраживали и слушали музику са Саундклауда. Међутим, морате да се пријавите да бисте приступили вашим листама нумера и вашем току." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Одјављени сте са Спотифаја, унесите вашу лозинку поново у дијалогу поставки." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Одјављени сте са Спотифаја, унесите вашу лозинку поново." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Волите ову нумеру" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "Морате да покренете подешавање система и дозволите Клементини да „управља вашим рачунаром“ да бисте користили опште пречице у Клементини." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Морате поново да покренете Клементину да бисте променили језик." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Ваша ИП адреса:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Ваши акредитиви за Ласт.фм су нетачни" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Ваши акредитиви за Магнатјун су нетачни" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Ваша библиотека је празна!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Ваши радио токови" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Ваша скробловања: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Ваш систем не подржава ОпенГЛ, визуелизације нису доступне." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Ваше корисничко име или лозинка су нетачни." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Ш-А" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "ништа" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "додавање %n ставки" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "након" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr " " #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "и" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "аутоматски" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "пре" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "између" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "прво највеће" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "темпо" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "садржи" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "онемогућено" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "диск %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "не садржи" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "завршава са" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "једнак" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "gpodder.net директоријум" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "већи од" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "Ајподи и УСБ уређаји за сада не раде на Виндоузу. Жао нам је!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "последњих" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kb/s" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "мањи од" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "прво најдуже" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "померање %n ставки" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "прво најновије" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "није једнак" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "не у последњих" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "не на дан" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "прво најстарије" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "на дан" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "Опције" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "или скенирајте кôд испод!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "притисните ЕНТЕР" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "уклањање %n ставки" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "прво најкраће" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "тумбање" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "прво најмање" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "сортирање песама" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "почиње са" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "Заустави" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "нумера %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/sr@latin.po000066400000000000000000005037171260417502300250300ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Mladen Pejaković , 2014 # FIRST AUTHOR , 2010-2011 # Jovana Savic , 2012 # Mladen Pejaković , 2014-2015 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Serbian (Latin) (http://www.transifex.com/davidsansome/clementine/language/sr@latin/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sr@latin\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nMožete staviti liste numera u omiljene klikom na zvezdicu pored imena liste\n\nOmiljene liste numera biće sačuvane ovde" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " dana" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kb/s" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr " s" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " sekundi" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " pesama" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 pesama)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 albuma" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 dana" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "pre %1 dana" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 na %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 listi numera (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 izabrano od" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 pesma" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 pesama" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 pesama pronađeno" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 pesama pronađeno (prikazujem %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 numera" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 prebačeno" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev modul" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 drugih slušalaca" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 ukupnih slušanja" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n neuspešno" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n završeno" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n preostalo" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Poravnaj tekst" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "¢riraj" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Posebna" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "&Dodaci" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Pomoć" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&Sakrij %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Sakrij..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&levo" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "&Muzika" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Nijedna" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "&Lista numera" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Napusti" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "&Režim ponavljanja" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&desno" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "&Nasumični režim" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Uklopi kolone u prozor" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Alatke" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(drugačije kroz razne pesme)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", od" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "i svima koji su doprineli Amaroku" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 dan" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 numera" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192.000Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44.100Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48.000Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 nasumičnih pesama" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96.000Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Nadogradi na Premijum nalog" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Ako nije štiklirano Klementina će upisivati vaše ocene i i ostalu statistiku samo u odvojenoj bazi podataka i neće menjati vaše fajlove.

Ako je štiklirano, upisivaće statistiku i u bazi podataka i direktno u fajl pri svakoj izmeni.

Imajte na umu da ovo možda neće raditi za svaki format fajla i, kako nema standarda za to, ostali muzički plejeri možda neće umeti da to pročitaju.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Stavite ime polja ispred tražene reči da biste ograničili pretragu samo na to polje, npr. artist:Bora tražiće sve izvođače čije ime sadrži reč „Bora“.

Dostupna polja: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Upis statistike i ocena pesama u oznake fajlova za sve pesme vaše biblioteke.

Nije potrebno ako je postavka „Upiši ocenu/statistiku pesme u oznake kad je to moguće“ uvek bila aktivirana.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Pokazivači počinju znakom %, na primer: %artist %album %title

\n\n

Ako deo teksta koji sadrži pokazivače stavite u vitičaste zagrade, taj deo će biti sakriven ako je pokazivač prazan.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Potreban je Spotifaj Premijum nalog" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Klijent može da se poveže samo ako je unesen ispravan kôd." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Pametna lista numera je dinamička lista pesama iz vaše biblioteke. Postoje različiti tipovi pametnih lista koji nude različite načine izbora pesama." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Pesma će biti uključena u listu ako zadovoljava ove uslove." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Ž" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "SLAVA HIPNOŽAPCU" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Prekini" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "O %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "O Klementini..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Više o Kutu..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Apsolutne" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Detalji o nalogu" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Detalji o nalogu (Premijum)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "radnja" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Radnja" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Uključi/isključi Wii daljinski" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Tok aktivnosti" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Dodaj podkast" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Dodaj tok" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Dodaj novu liniju ako je podržano tipom obaveštenja" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Dodaj radnju" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Dodaj sve numere iz fascikle i svih njenih podfascikli" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Dodaj drugi tok..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Dodaj fasciklu..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Dodavanje fajla" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Dodaj fajl u prekoder" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Dodaj fajlo(ove) u prekoder" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Dodaj fajl..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Dodavanje fajlova za prekodiranje" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Dodavanje fascikle" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Dodaj fasciklu..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Dodaj novu fasciklu..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Dodavanje podkasta" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Dodaj podkast..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Dodaj pojam za traženje" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Umetni album pesme" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Umetni izvođača albuma pesme" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Umetni izvođača pesme" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Umetni skor pesme" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Umetni kompozitora pesme" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Umetni disk pesme" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Umetni ime fajla pesme" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Umetni žanr pesme" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Umetni grupisanje pesme" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Umetni dužinu pesme" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Umetni izvođača pesme" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Umetni broj puštanja pesme" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Umetni ocenu pesme" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Umetni broj preskoka pesme" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Umetni naslov pesme" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Dodaj pesmu u keš" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Umetni numeru pesme" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Umetni godinu pesme" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Dodaj pesmu u „Moju muziku“ kad kliknem na dugme „Volim“" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Dodaj tok..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Dodaj u Moju muziku" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Dodaj u Spotifaj liste numera" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Dodaj na Spotifaj ocenjeno" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Dodaj u drugu listu" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Dodaj u obeleživače" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Dodaj u listu numera" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "stavi u red" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Dodaj korisnika/grupu u obeleživače" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Dodaj wiimotedev radnju" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Dodaj..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "dodato ovog meseca" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "dodato ove sedmice" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "dodato ove godine" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "dodato danas" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "dodato u poslednja tri meseca" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Napredno grupisanje..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "nakon " #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Nakon kopiranja:" #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "album" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "album (idealna jačina za sve pesme)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "izvođač albuma" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Omot albuma" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Podaci albuma sa Džamenda..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Albumi" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Albumi sa omotima" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Albumi bez omota" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Sve" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Svi fajlovi (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "Slava Hipnožapcu!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Svi albumi" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Svi izvođači" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Svi fajlovi" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Sve liste numera (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "svim prevodiocima" #: library/library.cpp:98 msgid "All tracks" msgstr "Sve numere" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Dozvoli klijentu da preuzima muziku sa ovog računara." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Dozvoli preuzimanja" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Dozvoli „mid/side“ kodiranje" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "pored originala" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Uvek sakrij glavni prozor" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Uvek prikaži glavni prozor" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "uvek će početi puštanje" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon Cloud Drive" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Potreban je dodatni priključak za korišćenje Spotifaja u Klementini. Želite li da ga preuzmete i instalirate sada?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Došlo je do greške učitavanja baze podataka Ajtjunsa" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Došlo je do greške upisa metapodataka na „%1“" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Došlo je do neodređene greške." #: ui/about.cpp:85 msgid "And:" msgstr "I:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "ljutit" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Izgled" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Dodaj numere/URL tokove u listu numera" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Dodaj u tekuću listu numera" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "doda u listu numera" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Primeni kompresiju kako bi se sprečilo odsecanje" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Želite li zaista da obrišete prepostavku „%1“?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Želite li zaista da poništite statistiku ove pesme?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Želite li zaista da upišete statistiku pesme u fajl pesme za sve pesme iz vaše biblioteke?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "izvođač" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Podaci o izvođaču" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Oznake izvođača" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "inicijali izvođača" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Pitaj prilikom upisa" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Format zvuka" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Izlaz zvuka" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Autentifikacija nije uspela" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Autor" #: ui/about.cpp:68 msgid "Authors" msgstr "Autori" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "automatski" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Automatski" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Automatsko ažuriranje" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Automatski otvori pojedinačne kategorije u stablu biblioteke" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Dostupno" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Prosečni bitski protok" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Prosečna veličina slike" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "BBC-ijevi podkasti" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "tempo" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Pozadinski tokovi" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Boja pozadine" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Slika pozadine" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Neprozirnost pozadine" #: core/database.cpp:648 msgid "Backing up database" msgstr "Bekapujem bazu podataka" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Ravnoteža" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "Zabrani (Last.fm skroblovanje)" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Trakasti analizator" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "osnovna plava" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Tip zvuka (osnovno)" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Ponašanje" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "najbolji" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Biografija sa %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "bitski protok" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Bitski protok" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "bitski protok" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Blok analizator" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Tip bloka" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Zamućenje" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Telo" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Bum analizator" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Boks" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Pregledaj..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Veličina bafera" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Baferujem" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Izgradi Seafile indeks..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "ali ovi izvori su onemogućeni:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "dugmad" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Podrška za CUE list" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Putanja keša:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Keširanje" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "Keširam %1" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Odustani" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Prekini preuzimanje" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Potreban je kepča kôd.\nDa biste popravili problem pokušajte da se prijavite na Vk.com u vašem pregledaču." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Promeni sliku omota" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Promeni veličinu fonta..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Ponavljanje" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Izmeni prečicu..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Nasumičnost" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "menja trenutno puštenu pesmu" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Promeni jezik" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "Izmene će nastupiti po puštanju sledeće pesme" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Izmena će biti aktivna za nastupajuće pesme" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Traži nove epizode" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Potraži nadogradnje" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Potraži nadogradnje..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Izbor fascikle keša za Vk.com" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Izaberite ime za vašu pametnu listu" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Izaberi automatski" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Izaberi boju..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Izaberi font..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "izbor sa spiska" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Odredite sortiranje liste numera i koliko pesama će da sadrži." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Izbor fascikle preuzimanja za podkast" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Izaberite internet servise za prikaz." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Izaberite sajtove koje želite da Klementina koristi pri traženju stihova." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "klasična" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Čišćenje" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Očisti" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Očisti listu numera" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Klementina" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Greška Klementine" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Klementina narandžasta" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Vizuelizacija Klementine" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Klementina može automatski da pretvori muziku koju kopirate na ovaj uređaj u format koji taj uređaj može da pusti." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Klementina može da pušta muziku koju ste učitali na Amazon Cloud Drive" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Klementina može da pušta muziku koju ste učitali na Boks" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Klementina može da pušta muziku koju ste učitali na Dropboks" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Klementina može da pušta muziku koju ste učitali na Gugl Drajv" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Klementina može da pušta muziku koju ste učitali na VanDrajv" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Klementina može prikazivati poruke prilikom izmena numera." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Klementina može da sinhronizuje vaše pretplatničke liste sa ostalim vašim računarima i aplikacijama podkasta. Napravite nalog." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Klementina ne može da učita nijednu projektM vizuelizaciju. Proverite da li ste ispravno instalirali Klementinu." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Klemetinin pregledač slika" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Klementina nije mogla da nađe rezultate za ovaj fajl" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Klementina će tražiti muziku u:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Kliknite ovde da dodate muziku" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Kliknite ovde da stavite ovu listu numera u omiljene kako bi bila sačuvana i pristupačna preko panela „Liste numera“ na levoj bočnoj traci" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Kliknite da promenite prikaz preostalog/ukupnog vremena" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Klikom na dugme prijave otvorićete veb pregledač. Vratite se na Klementinu pošto se prijavite." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Zatvori" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Zatvori listu numera" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Zatvori vizuelizaciju" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Zatvaranjem ovog prozora prekinućete preuzimanje." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Zatvaranjem ovog prozora prekinućete potragu za omotima albuma." #: ui/equalizer.cpp:114 msgid "Club" msgstr "klub" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Boje" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Zarez razdvaja listu od klasa: nivo, nivo je 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "komentar" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Društveni radio" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Popuni oznake automatski" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Popuni oznake automatski..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "kompozitor" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Podesi %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Podesi Magnatjun..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Postavke prečica" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Podesi Spotifaj..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Podesi Subsonik..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Podesi Vk.com..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Podesi opštu pretragu..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Podesi biblioteku..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Podesi podkaste..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Podesi..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Poveži Wii daljinske koristeći radnje uključeno/isključeno" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Poveži uređaj" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Poveži se na Spotifaj" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Server je odbio vezu, proverite URL. Primer: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Prekovreme isteklo, proverite URL servera. Primer: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Problem sa povezivanjem ili je vlasnik onemogućio zvuk" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Konzola" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Konstantan bitski protok" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Pretvori svu muziku" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Pretvori svu muziku koju uređaj ne može da pusti" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Pretvori bezgubitne audio fajlove pre slanja na daljinski." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Pretvori bezgubitne fajlove" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Kopiraj URL deljenja na klipbord" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Kopiraj na klipbord" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Kopiraj na uređaj...." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Kopiraj u biblioteku..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Autorska prava" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Ne mogu da se povežem na Subsonik, proverite URL servera. Primer: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Ne mogu da napravim Gstrimer element „%1“ - proverite da li su instalirani svi potrebni Gstrimer priključci" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Ne mogu da napravim listu numera" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Ne mogu da nađem mukser za %1, proverite da li imate instalirane potrebne priključke za Gstrimer" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Ne mogu da nađem koder za %1, proverite da li imate instalirane potrebne priključke za Gstrimer" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Ne mogu da otvorim izlazni fajl %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Menadžer omota" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Omot iz ugrađene slike" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Omot automatski učitan iz %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Omot ručno uklonjen" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Omot nije postavljen" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Omot postavljen iz %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Omoti sa %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Pretapanje pri automatskoj izmeni numera" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Pretapanje pri ručnoj izmeni numera" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "posebno" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Posebna slika:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Postavke posebne poruke" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "posebna..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "Dbus putanja" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "dens" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Otkriveno oštećenje baze podataka. Pogledajte https://code.google.com/p/clementine-player/wiki/DatabaseCorruption za uputstva kako da povratite vašu bazu podataka" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "napravljen" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "izmenjen" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "dana" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "Pod&razumevana" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Utišaj zvuk za 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Smanji jačinu zvuka za procenata" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Smanji jačinu zvuka" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Podrazumevana" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Podrazumevani uređaj na %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Podrazumevano" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Zastoj između vizuelizacija" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Obriši" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Obriši preuzete podatke" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Brisanje fajlova" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Obriši sa uređaja..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Obriši sa diska..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Obriši puštene epizode" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Obriši prepostavku" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Obriši pametnu listu" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "obriši originalne fajlove" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Brišem fajlove" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Izbaci izabrane numere iz reda" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Izbaci numeru iz reda" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Odredište" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Detalji..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Uređaj" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Svojstva uređaja" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Ime uređaja" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Svojstva uređaja..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Uređaji" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Dijalog" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Da li ste mislili" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Didžitali Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Lozinka" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Korisničko ime" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Direktna internet veza" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "fascikla" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Onemogući trajanje" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Isključi stvaranje raspoloženja" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Onemogućeno" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Onemogućen" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "disk" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Isprekidan prenos" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Opcije prikaza" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Prikaži ekranski pregled" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Ponovo skeniraj biblioteku" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Ponovi skeniranje" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Ponovi skeniranje..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Ne pretvaraj muziku" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Ne prebrisuj" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "Ponovnim skeniranjem ćete izgubiti sve metapodatke sačuvane u Klementini, npr. omote albuma, broj puštanja i ocene. Klementina će ponovo skenirati svu vašu muziku sa Guglovog Drajva što može potrajati." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Ne ponavljaj" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Ne prikazuj u raznim izvođačima" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Ne prikazuj preslušane epizode" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Ne puštaj nasumično" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Ne zaustavljaj!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Doniraj" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Kliknite dvaput da otvorite" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "Dvoklik na pesmu sa liste..." #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Dvoklik na pesmu će da je..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Preuzmi %n epizoda" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Fascikla za preuzimanje" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Preuzimaj epizode u" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "preuzimanja sadržaja" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Preuzimaj nove epizode automatski" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Preuzimanje je na čekanju" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Postavke preuzimanja" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Preuzmite aplikaciju za Android" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Preuzmi ovaj album" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Preuzmi ovaj album..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Preuzmi ovu epizodu" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Preuzmi..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Preuzimam (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Preuzimam Ajskast direktorijum" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Preuzimam Džamendov katalog" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Preuzimam Magnatjunov katalog" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Preuzimam Spotifaj priključak" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Preuzimam metapodatke" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Prevlačite da biste menjali položaj" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropboks" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "dabstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Trajanje" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Dinamički režim je uključen" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Dinamički nasumični miks" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Uredi pametnu listu..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Uredi oznaku „%1“..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Uredi oznaku..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Uredi oznake" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Uređivanje podataka numere" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Uredi podatke numere..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Uredi podatke numera.." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Uredi..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "E-adresa" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Omogući podršku za Wii daljinski" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Automatsko keširanje" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Uključi ekvilajzer" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Omogući prečice samo kad je Klementina u fokusu" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Omogući utkano uređivanje metapodataka pesme klikom" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Omogućite izvore prikazane ispod da biste ih uključili u pretragu. Rezultati će biti prikazani ovim redim." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Last.fm skroblovanje" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Kompleksnost kodiranja" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Kvalitet motora kodiranja" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Režim kodiranja" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Unos URL-a" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Unesite URL za preuzimanje omota sa interneta:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Unesite ime za izvezene omote (bez nastavka):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Unesite novo ime za ovu listu numera" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Unesite pojmove za traženje iznad da biste pronašli muziku na vašem računaru ili na internetu" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Unesite pojam za traženje ispod da biste našli podkaste u Ajtjuns prodavnici" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Unesite pojam za traženje ispod da biste našli podkaste na gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Unesite pojam za traženje ovde" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Unesite URL toka internet radija:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Unesite ime fascikle" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Unesite ovaj IP u aplikaciju da biste je povezali sa Klementinom." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "čitavu kolekciju" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Ekvilajzer" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Isto kao i --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Isto kao i --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Greška" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Greška pri čupanju CD-a" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Greška povezivanja MTP uređaja" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Greška kopiranja pesama" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Greška brisanja pesama" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Greška preuzimanja Spotifaj priključka" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Greška učitavanja %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Greška učitavanja di.fm liste numera" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Greška obrade %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Greška prilikom učitavanja audio CD-a" #: library/library.cpp:68 msgid "Ever played" msgstr "Već puštano" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "svakih 10 minuta" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "svakih 12 sati" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "svaka 2 sata" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "svakih 20 minuta" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "svakih 30 minuta" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "svakih 6 sati" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "svakog sata" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Osim između numera na istom albumu ili na istom CUE listu" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Postojeći omoti" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Proširi" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Ističe %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Izvezi omote" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Izvoz omota" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Izvezi preuzete omote" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Izvezi ugrađene omote" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Izvoz završen" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Izvezeno %1 omota od %2 (%3 preskočeno)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Utapaj pri pauzi/nastavljanju" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Utapaj numeru pri zaustavljanju" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Utapanje" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Trajanje pretapanja" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Neuspeh čitanja CD uređaja" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Neuspeh dobavljanja direktorijuma" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Neuspeh dobavljanja podkasta" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Neuspeh učitavanja podkasta" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Neuspeh raščlanjivanja IksML-a za ovaj RSS dovod" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "brz" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Omiljene numere" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Dobavi nedostajuće omote" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Dobavi automatski" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Dobavljanje završeno" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Dobavljam Subsonikovu biblioteku" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Greška dobavljanja omota" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Format fajla" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "nastavak fajla" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Formati fajlova" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "ime fajla" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "ime fajla (bez putanje)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Šablon imena fajla:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Putanje fajlova" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "veličina fajla" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "tip fajla" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "ime fajla" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Fajlovi" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Fajlovi za prekodiranje" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Pronađite pesme u biblioteci koje odgovaraju određenom kriterijumu." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Pronađi ovog izvođača" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Identifikujem pesmu" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Završi" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Prvi nivo" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Uklopi omot po širini" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "FLAC" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Veličina fonta" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Iz razloga licenciranja podrška za Spotifaj je u odvojenom priključku." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Prisili mono kodiranje" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Zaboravi uređaj" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Zaboravljanjem uređaja uklonićete ga sa spiska i Klementina će morati ponovo da skenira sve pesme sledeći put kada ga povežete." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Obrazac" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Format" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Broj kadrova" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Sličica po baferu" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "zaleđen" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "puni bas" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "puni bas + sopran" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "puni sopran" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Opšte" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Opšte postavke" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "žanr" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Dobavi URL za deljenje ove pesme sa Spotifaja" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Dobavi URL za deljenje ove liste numera" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Dobavljam kanale" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Dobavljam tokove" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Dajte joj ime:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Idi" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Idi na sledeći jezičak liste" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Idi na prethodni jezičak liste" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Gugl Drajv" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Dobavljeno %1 omota od %2 (%3 neuspešno)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Posivi nepostojeće pesme u listi numera" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Grupisanje biblioteke" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Grupisanje" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "album" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "izvođač" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "izvođač/album" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "izvođač/godina — album" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "žanr/album" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "žanr/izvođač/album" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "grupisanje" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "HTML stranica ne sadrži nijedan RSS dovod" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "Primljen HTTP 3xx kôd bez URL-a, proverite postavke servera." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "HTTP proksi" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "srećan" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Podaci o hardveru" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Podaci o hardveru su dostupni samo dok je uređaj povezan." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "visok" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "visok (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "visok (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "Hip-hop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Domaćin nije nađen, proverite URL servera. Primer: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "sati" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hipnožabac" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "nemam nalog na Magnatjunu" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Ikona" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Ikone na vrhu" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Identifikujem pesmu" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Dozvoljava uređivanje oznake direktno u prikazu liste numera klikom na pesmu" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Ako nastavite, ovaj uređaj će raditi sporo a pesme kopirane na njega možda neće raditi." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Ako znate URL podkasta, unesite ga ispod i kliknite na „Idi“." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Igonoriši „The“ u imenu izvođača" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Slike (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Slike (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Uvezi..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "za %1 dana" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "za %1 sedmica" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "U dinamičkom režimu nove numere će biti izabrane i dodate na listu svaki put kad se pesma završi." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Sanduče" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Uključi omote albuma u obaveštenja" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Uključi sve pesme" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Neodgovarajuće izdanje Subsonikovog REST protokola. Klijent treba nadogradnju." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Neodgovarajuće izdanje Subsonikovog REST protokola. Server treba nadogradnju." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Nepotpuno podešavanje, ispunite sva polja." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Pojačaj zvuk za 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Povećaj jačinu zvuka za procenata" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Povećaj jačinu zvuka" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Indeksiram %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Podaci" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Opcije ulaza" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Umetni..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "instaliran" #: core/database.cpp:585 msgid "Integrity check" msgstr "Provera integriteta" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Internet servisi" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Internet servisi" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "Uvodne numere" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Nevažeći API ključ" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Neispravan format" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Neispravan način" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Neispravni parametri" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Naveden neispravan resurs" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Neispravan servis" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Nevažeći ključ sesije" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Obrni izbor" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Džamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Džamendove najslušanije numere" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Džamendove najbolje numere" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Džamendove najbolje numere ovog meseca" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Džamendove najbolje numere ove sedmice" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Džamendova baza podataka" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "pušta prethodnu pesmu odmah" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Skoči na tekuću numeru" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Držite tastere %1 sekundu..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Držite tastere %1 sekundi..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Nastavi rad u pozadini kad se prozor zatvori" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "zadrži originalne fajlove" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Mačići" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Jezik" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "laptop/slušalice" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "velika dvorana" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Veliki omot" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Veliki omot albuma (detalji ispod)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Veliki omot albuma (bez detalja)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Široka traka" #: library/library.cpp:80 msgid "Last played" msgstr "Poslednji put puštano" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "poslednji put puštena" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm je trenutno zauzet, pokušajte ponovo za nekoliko minuta" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Lozinka" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Last.fm broj puštanja" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Last.fm oznake" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Korisničko ime" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Last.fm viki" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Najmanje omiljene numere" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Levo" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "dužina" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Biblioteka" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Napredno grupisanje biblioteke" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Obaveštenje o ponovnom skeniranju biblioteke" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Pretraživanje biblioteke" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Ograničenja" #: ui/equalizer.cpp:137 msgid "Live" msgstr "uživo" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Učitaj" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Učitavanje omota sa URL-a" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Učitaj omot sa URL-a..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Učitavanje omota sa diska" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Učitaj omot sa diska..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Učitavanje liste numera" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Učitaj listu numera..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Učitavam MTP uređaj" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Učitavam Ajpodovu bazu podataka" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Učitavam pametnu listu" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Učitavam pesme" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Učitavam tok" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Učitavam numere" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Učitavam podatke o numerama" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Učitavam..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Učitava datoteke/URL-ove, zamenjujući tekuću listu" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Prijava" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Prijava nije uspela" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Odjava" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "dugoročno predviđanje (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Volim" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "Voli (Last.fm skroblovanje)" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "nizak (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "nizak (256X256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "niska kompleksnost (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Stihovi" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Stihovi sa %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Stihovi iz ID3v2 oznake" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatjun" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Preuzimanje sa Magnatjuna" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Završeno preuzimanje sa Magnatjuna" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "glavni profil (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Enterprajz!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Enterprajz!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Napravi listu dostupnu van mreže" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Loš odgovor" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Ručno podešavanje proksija" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "ručno" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Proizvođač" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Označi kao preslušano" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Označi kao novo" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Uporedi svaki traženi pojam (AND)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Uporedi jedan ili više traženih pojmova (OR)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Najviše rezultata opšte pretrage" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Najveći bitski protok" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Medij je promenjen. Učitavam ponovo" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "srednji (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "srednji (512X512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Tip članstva" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Najmanji bitski protok" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Najmanji ispun bafera" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Nedostaju prepostavke za projektM" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Nadgledaj izmene u biblioteci" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Mono reprodukcija" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "meseci" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "raspoloženje" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Stil raspoloženja" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Raspoloženja" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Još" #: library/library.cpp:84 msgid "Most played" msgstr "Najčešće puštano" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Tačka montiranja" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Tačke montiranja" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Pomeri dole" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Premesti u biblioteku" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Pomeri gore" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Muzika" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Muzička biblioteka" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Utišaj" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Moji albumi" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Moja muzika" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Moje preporuke" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Ime" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "ime" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Opcije imenovanja" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "uski opseg (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Mrežni proksi" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Mrežni daljinski" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Nikad" #: library/library.cpp:74 msgid "Never played" msgstr "Nikad puštano" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "neće početi puštanje" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Nova fascikla" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Nova lista numera" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Nova pametna lista" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Nove pesme" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Nove numere će biti automatski dodate." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Najnovije numere" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Sledeća" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Sledeća numera" #: core/utilities.cpp:151 msgid "Next week" msgstr "sledeće sedmice" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Bez analizatora" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Bez slike pozadine" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Nema omota za izvoz." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "bez dugih blokova" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Nema poklapanja. Očistite polje pretrage da biste prikazali celu listu ponovo." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "bez kratkih blokova" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "ništa" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Nijedna od izabranih pesama nije pogodna za kopiranje na uređaj" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "normalan" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "normalni tip bloka" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Nije dostupno dok se koristi promenjiva lista" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Nepovezan" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Nema dovoljno sadržaja" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Nema dovoljno obožavalaca" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Nema dovoljno članova" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Nema dovoljno komšija" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "nije instaliran" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Niste prijavljeni" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Nije montiran — kliknite dvaput da montirate" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Ništa nije nađeno" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Vrsta obaveštenja" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Obaveštenja" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Sada puštam" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Broj epizoda za prikaz" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "OSD pregled" #: widgets/osd.cpp:173 msgid "Off" msgstr "isključeno" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "OGG FLAC" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "OGG Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "OGG Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "OGG Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "uključeno" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "Van Drajv" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Prihvataj veze samo od klijenata unutar ovog raspona ip adresa:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Dozvoli samo veze sa lokalne mreže" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Prikaži samo početnih" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Prozirnost" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Otvori %1 u pregledaču" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Otvori &audio CD..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Otvaranje OPML fajla" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Otvori OPML fajl..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Otvaranje fascikle za uvoz muzike" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Otvori uređaj" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Otvori fajl..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Otvori u Gugl Drajvu" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Otvori u novoj listi" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "otvori u novoj listi" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Otvori u pregledaču" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Otvori..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Radnja nije uspela" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Optimizuj bitski protok" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Optimizuj kvalitet" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Opcije..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Organizovanje fajlova" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Organizuj fajlove..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Organizujem fajlove" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Početne oznake" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "izvorna godina" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "izvorna godina — album" #: library/library.cpp:118 msgid "Original year tag support" msgstr "Podrška za oznaku izvorne godine" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Ostale opcije" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Izlaz" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Uređaj izlaza" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Opcije izlaza" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Prebriši sve" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Prebriši postojeće fajlove" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Prebriši samo manje fajlove" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Vlasnik" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Raščlanjujem Džamendov katalog" #: ui/equalizer.cpp:139 msgid "Party" msgstr "žurka" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Lozinka" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Pauziraj" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Pauziraj puštanje" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Pauzirano" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "izvođač" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "piksela" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Obična traka" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Pusti" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "broj puštanja" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Pusti ako je zaustavljeno, zaustavi ako se pušta" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "počeće puštanje ako trenutno ništa nije pušteno" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Pusti u numeru sa liste" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Pusti/pauziraj" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Puštanje" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Opcije plejera" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Lista numera" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Lista numera je završena" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Opcije liste numera" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Tip liste" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Liste numera" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Zatvorite vaš pregledač i vratite se na Klementinu." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Stanje priključka:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podkasti" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Trajanje" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Pretpojačanje" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Postavka" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Postavke" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Podešavanje..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Imena fajlova omota (odvojena zarezom)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Poželjni format zvuka" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Poželjni bitski protok" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Poželjni format" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Tip zvuka (premijum)" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Prepostavka:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Pritisnite kombinaciju tastera za" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Pritisnite taster" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Pritisnite kombinaciju tastera za %1..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Dugme „Prethodna“ u plejeru..." #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Opcije lepog OSD-a" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Pregled" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Prethodna" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Prethodna numera" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Prikaži podatke o izdanju" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Napredak" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "napredak" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "psihodelično" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Pritisnite taster na Wii daljinskom" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Postavi nasumično" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Kvalitet" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Kvalitet" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Ispitujem uređaj..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Menadžer redosleda" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Stavi u red izabrane numere" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Stavi numeru u red" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "radio (jednaka jačina za sve pesme)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Kiša" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Kiša" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "nasumično" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Oceni tekuću pesmu sa 0 zvezda" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Oceni tekuću pesmu sa 1 zvezdom" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Oceni tekuću pesmu sa 2 zvezde" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Oceni tekuću pesmu sa 3 zvezde" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Oceni tekuću pesmu sa 4 zvezde" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Oceni tekuću pesmu sa 5 zvezda" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "ocena" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Zaista odustajete?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Pređeno ograničenje preusmeravanja, proverite postavke servera." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Osveži katalog" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Osveži kanale" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Osveži spisak stanica" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Osveži tokove" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "rege" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Relativne" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Upamti zamah" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Seti se od prošlog puta" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Upamti moj izbor" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Ukloni" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Ukloni radnju" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Ukloni duplikate sa liste" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Ukloni fasciklu" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Ukloni iz Moje muzike" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Ukloni iz obeleživača" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Ukloni sa liste numera" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Uklanjanje liste numera" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Ukloni liste numera" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Ukloni nedostupne numere sa liste numera" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Preimenovanje liste numera" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Preimenuj listu numera..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Numeriši ovim redom..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Ponavljanje" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Ponavljaj album" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Ponavljaj listu numera" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Ponavljaj numeru" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Zameni tekuću listu" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "zameni listu numera" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Zameni razmake podvlakom" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Nivelator zvuka" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Režim nivelisanja zvuka" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Popuni ponovo" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Zahtevaj autentifikacijski kôd" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Resetuj" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Poništi broj puštanja" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "ponavlja pesmu, i pušta prethodnu ako je ponovo pritisnuto" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Ponovo pusti numeru ili pusti prethodnu ako je tekuća unutar početnih 8 sekundi." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Ograniči se na ASKI znakove" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Nastavi puštanje po pokretanju" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Vratite se na Klementinu" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Desno" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "čupaj" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Čupanje CD-a" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Čupaj audio CD" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "rok" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Izvrši" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "SOCKS proksi" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Greška SSL rukovanja, proverite postavke servera. SSLv3 opcija ispod može zaobići neke probleme." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Bezbedno izvadi uređaj" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Bezbedno izvadi uređaj posle kopiranja" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "uzorkovanje" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "uzorkovanje" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Sačuvaj .mood fajlove u muzičkoj biblioteci" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Upisivanje omota albuma" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Sačuvaj omot na disk..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Sačuvaj sliku" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Sačuvaj listu numera" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Upis liste numera" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Sačuvaj listu numera..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Sačuvaj prepostavku" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Upiši ocenu pesme u oznake kad je to moguće" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Upiši statistiku pesme u oznake kad je to moguće" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Sačuvaj ovaj tok u internet jezičku" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Upisujem statistike pesama u fajlove pesama" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Upisujem numere" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "skalabilno uzorkovanje (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Promeni veličinu" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "skor" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Skrobluj numere koje puštam" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Traži" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Pretraga" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Traži Ajskast stanice" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Traži na Džamendu" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Traži na Magnatjunu" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Traži na Subsoniku" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Traži automatski" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Traži omote albuma..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Tražite bilo šta" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Traži na gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Traži na Ajtjunsu" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Režim pretrage" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Opcije pretrage" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Rezultati pretrage" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Pojmovi za pretragu" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Drugi nivo" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Traži unazad" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Traži unapred" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Idi na položaj tekuće numere za relativni iznos" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Idi na položaj tekuće numere za apsolutni iznos" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "Biranje položaja prečicom tastature" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Izaberi sve" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Očisti izbor" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Boja pozadine:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Slika pozadine" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Izaberite najbolje poklapanje" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Glavna boja:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Izbor vizuelizacija" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Izaberi vizuelizacije..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Izaberi..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Serijski broj" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Server" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "URL servera" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Detalji servera" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Servis van mreže" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Promeni %1 u „%2“..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Postavi jačinu zvuka na procenata" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Podesi vrednost za sve izabrane numere..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Podešavanja" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "prečica" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Prečica za %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Prečica za %1 već postoji" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Prikaži" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Prikaži OSD" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Prikaži šljašteću animaciju na puštenoj numeri" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Prikaži traku raspoloženja u traci napretka numere" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Izvorna obaveštenja radne površi" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Obaveštenje pri promeni režima ponavljanja/nasumičnosti" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Obaveštenje pri promeni jačine zvuka" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Obaveštenje pri pauzi puštanja" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Oblačić sa sistemske kasete" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Lepi OSD" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Prikaži iznad trake stanja" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Prikaži sve pesme" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Prikaži sve pesme" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Prikaži omot u biblioteci" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Prikaži razdvajače" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Puna veličina..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Prikaži grupe u rezultatu opšte pretrage" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Prikaži u menadžeru fajlova" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Prikaži u biblioteci..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Prikazuj u raznim izvođačima" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Prikaži raspoloženje" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Prikaži samo duplikate" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Prikaži samo neoznačene" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Prikaži tekuću pesmu na mojoj stranici" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "prikaži predloge pretrage" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Prikaži „volim“ dugme" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Prikaži dugme skroblovanja u glavnom prozoru" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Usidri u sistemsku kasetu" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "prikaži koji su izvori omogućeni/onemogućeni" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Prikaži/sakrij" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Nasumičnost" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Nasumično albumi" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Nasumično sve" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Pretumbaj listu" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Nasumično numere u ovom albumu" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Prijavi se" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Odjavi se" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Prijavljujem se..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Slični izvođači" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Veličina" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Veličina:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Preskoči unazad u listi numera" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "broj preskakanja" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Preskoči unapred u listi numera" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Preskoči izabrane numere" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Preskoči numeru" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Mali omot" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Uska traka" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Pametna lista" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Pametne liste" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "lagana" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "lagani rok" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Podaci o pesmi" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Podaci o pesmi" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Žao nam je" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Poređaj po žanru (abecedno)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Poređaj po žanru (po popularnosti)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Poređaj po imenu stanice" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Kriterijum ređanja" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Ređanje" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "izvor" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Izvori" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotifaj" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Greška prijavljivanja na Spotifaj" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "URL Spotifaj liste numera" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Spotifaj priključak" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Spotifaj priključak nije instaliran" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "URL Spotifaj pesme" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "standardan" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Sa zvezdicom" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Počni čupanje" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Pusti tekuću listu numera" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Počni prekodiranje" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Počnite nešto da kucate u polje za pretragu iznad da biste ispunili ovaj spisak rezultata pretrage" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Počinjem %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Počinjem..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Zaustavi" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Zaustavi posle" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Zaustavi posle svake numere" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Zaustavljanje posle svake numere" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Zaustavi posle ove numere" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Zaustavi puštanje" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Zaustavi posle tekuće numere" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Zaustavi puštanje posle numere: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Zaustavljeno" #: core/song.cpp:431 msgid "Stream" msgstr "Tok" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Puštanje toka sa Subsonikovog servera zahteva važeću licencu servera nakon 30-dnevnog probnog perioda." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "strimovanje sadržaja" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Pretplatnici" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonik" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Uspeh!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "Uspešno upisano %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Predložene oznake" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Rezime" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "super visok (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "super visok (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Podržani formati" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Sinhronizuj statistike u fajlove" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Sinhronizovanje Spotifaj sandučeta" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Sinhronizovanje Spotifaj liste numera" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Sinhronizovanje Spotifaj ocenjenih numera" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "sistemske boje" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Jezičci na vrhu" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Dobavljač oznaka" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Ciljani bitski protok" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "tehno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Opcije teksta" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Zahvalnice" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Naredbe „%1“ se ne mogu pokrenuti." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Omot albuma tekuće pesme" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "Direktorijum „%1“ nije ispravan" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "Druga vrednost mora biti veća od prve!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Sajt koji ste zatražili ne postoji!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Sajt koji ste zatražili nije slika!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Probni period za Subsonikov server je istekao. Donirajte da biste dobili licencni ključ. Posetite subsonic.org za više detalja." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Izdanje Klementine koje ste upravo nadogradili zahteva potpuno skeniranje biblioteke zbog novih mogućnosti koje su izlistane ispod:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Ima još pesama u ovom albumu" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Problem prilikom komunikacije sa gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Problem prilikom dobavljanja metapodataka sa Magnatjuna" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Problem prilikom raščlanjivanja odgovora sa Ajtjuns prodavnice." #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Bilo je problema prilikom kopiranja nekih pesama. Sledeći fajlovi nisu kopirani:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Bilo je problema pri brisanju nekih pesama. Sledeći fajlovi nisu obrisani:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Ovi fajlovi će biti obrisani sa uređaja, želite li zaista da nastavite?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Ovi fajlovi će biti trajno obrisani sa diska, želite li zaista da nastavite?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Ove fascikle će biti skenirane da bi se napravila biblioteka" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Ove postavke se koriste u dijalogu „Prekodiranje muzike“, i prilikom kodiranja muzike pre kopiranja na uređaj." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Treći nivo" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Ovaj radnja će napraviti bazu podataka koja može biti velika i do 150 MB.\nŽelite li ipak da nastavite?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Ovaj album nije dostupan u traženom formatu" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Ovo možete da izmenite kasnije u podešavanjima" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Ovaj uređaj mora biti povezan i otvoren pre nego što Klementina može da vidi koje formate fajlova podržava." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Ovaj uređaj podržava sledeće formate fajlova:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Ovaj uređaj neće raditi ispravno" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Ovo je MTP uređaj, ali vi ste kompilovali Klementinu bez libmtp podrške." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Ovo je Ajpod, ali vi ste kompilovali Klementinu bez libgpod podrške." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Ovo je prvi put da ste povezali ovaj uređaj. Klementina će sad da skenira uređaj da bi našla muziku - to može da potraje." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Ovu opciju možete izmeniti u postavkama „Ponašanja“" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Ovaj tok je samo za pretplatnike" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Ovaj tip uređaja nije podržan: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "Vremenski korak" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "naslov" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "danas" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Lepi OSD" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Ceo ekran" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Menjaj stanje redosleda" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Menjaj skroblovanje" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Menjaj vidljivost lepog OSD-a" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "sutra" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Previše preusmeravanja" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Najbolje numere" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Ukupno albuma:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Ukupno bajtova prebačeno" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Ukupno napravljenih mrežnih zahteva" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "numera" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Numere" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Prekodiranje muzike" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Dnevnik prekodiranja" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Prekodiranje" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Prekodiram %1 fajlova koristeći %2 niski" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Opcije prekodiranja" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbina" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Isključi" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "Adrese" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "ultra široki opseg (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Ne mogu da se povežem" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Ne mogu da preuzmem %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Nepoznato" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Nepoznat tip sadržaja" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Nepoznata greška" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Ukloni omot" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Ukloni preskakanje numera" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Ukloni preskakanje" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Ukloni pretplatu" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Predstojeći koncerti" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Ažuriraj" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Ažuriraj sve podkaste" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Ažuriraj izmenjene fascikle biblioteke" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Ažuriraj biblioteku pri pokretanju Klementine" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Ažuriraj ovaj podkast" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Ažuriranje" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Ažuriram %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Ažuriram %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Ažuriranje biblioteke" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Upotreba" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Koristi oznaku izvođača albuma ako je dostupna" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Koristi Gnomove prečice" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Koristi psihodelične boje" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Koristi metapodatke nivelisanja ako su dostupni" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Koristi SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Koristi Wii daljinski" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Posebna paleta boja" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Koristi posebnu poruku za obaveštenja" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Uključi daljinsko upravljanje preko mreže" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Koristi autentifikaciju" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Motor menadžmenta za bitski protok" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Dinamički režim" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Koristite obaveštenja za prijavu stanja Wii daljinskog" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Vremensko oblikovanje šuma" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "sistemski podrazumevan" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Sistemski podrazumevana paleta boja" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Sistemske postavke proksija" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Normalizacija jačine zvuka" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Iskorišćeno" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Korisničko sučelje" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Korisničko ime" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Radnja menija za dodavanje pesme..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Promenjiv bitski protok" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Razni izvođači" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Izdanje %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Prikaz" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Režim vizuelizacija" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Vizuelizacije" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Podešavanje vizuelizacija" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Otkrivanje glasovne aktivnosti" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Jačina %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "VAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "VMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Zid" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Upozori me prilikom zatvaranja jezička liste numera" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "VAV" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Vebsajt" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "sedmica" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Kada se Klementina pokrene" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Prilikom traženja omota albuma Klementina će najpre da traži fajlove slika koji sadrže neke od ovih reči.\nAko nema poklapanja onda će da koristi najveću sliku u direktorijumu." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "Pri upisu liste numera, putanje fajlova treba da budu" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Kada je spisak prazan:" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Zašto ne biste probali..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "široki opseg (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii daljinski %1: aktiviran" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii daljinski %1: povezan" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii daljinski %1: nivo baterije kritičan (%2%)" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii daljinski %1: deaktiviran" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii daljinski %1: nepovezan" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii daljinski %1: nivo baterije nizak (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wii daljinski" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Vindouz medija 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Vindouz medija 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Vindouz medija 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Vindouz medija audio" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Bez omota:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Želite li da pomerite i ostale pesme iz ovog albuma u razne izvođače takođe?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Želite li sada da pokrenete potpuno skeniranje?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Upisivanje statistika svih pesama u fajlove pesama" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Upisuj metapodatke" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Pogrešno korisničko ime ili lozinka." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "godina" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "godina — album" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "godina" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "juče" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Preuzećete sledeće albume" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Želite li zaista da uklonite %1 listi numera iz omiljenih?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Uklonićete i obrisati listu numera koja nije u vašim omiljenim (ova radnja ne može da se poništi). \nŽelite li zaista da nastavite?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Niste prijavljeni." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Prijavljeni ste kao %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Prijavljeni ste." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Možete izmeniti način organizivanja pesama u biblioteci." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Možete da slušate besplatno bez naloga, ali samo premijum korisnici mogu da slušaju tokove visokog kvaliteta bez reklama." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Možete besplatno slušati pesme na Magnatjunu bez naloga. Kupovinom članstva oslobodićete se poruka na kraju svake numere." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Možete da slušate pozadinske tokove istovremeno sa drugom muzikom." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Možete da koristite vaš Wii daljinski za daljinsku kontrolu Klementine. Pogledajte stranicu na Klementinom vikiju za više podataka.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Nemate Spotifaj Premijum nalog." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Nemate aktivnu pretplatu" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "Ne morate biti prijavljeni da biste pretraživali i slušali muziku sa Saundklauda. Međutim, morate da se prijavite da biste pristupili vašim listama numera i vašem toku." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Odjavljeni ste sa Spotifaja, unesite vašu lozinku ponovo u dijalogu postavki." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Odjavljeni ste sa Spotifaja, unesite vašu lozinku ponovo." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Volite ovu numeru" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "Morate da pokrenete podešavanje sistema i dozvolite Klementini da „upravlja vašim računarom“ da biste koristili opšte prečice u Klementini." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Morate ponovo da pokrenete Klementinu da biste promenili jezik." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Vaša IP adresa:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Vaši akreditivi za Last.fm su netačni" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Vaši akreditivi za Magnatjun su netačni" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Vaša biblioteka je prazna!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Vaši radio tokovi" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Vaša skroblovanja: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Vaš sistem ne podržava OpenGL, vizuelizacije nisu dostupne." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Vaše korisničko ime ili lozinka su netačni." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Ž-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "ništa" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "dodavanje %n stavki" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "nakon" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr " " #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "i" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "automatski" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "pre" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "između" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "prvo najveće" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "tempo" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "sadrži" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "onemogućeno" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "disk %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "ne sadrži" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "završava sa" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "jednak" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "gpodder.net direktorijum" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "veći od" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "Ajpodi i USB uređaji za sada ne rade na Vindouzu. Žao nam je!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "poslednjih" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kb/s" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "manji od" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "prvo najduže" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "pomeranje %n stavki" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "prvo najnovije" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "nije jednak" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "ne u poslednjih" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "ne na dan" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "prvo najstarije" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "na dan" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "Opcije" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "ili skenirajte kôd ispod!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "pritisnite ENTER" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "uklanjanje %n stavki" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "prvo najkraće" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "tumbanje" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "prvo najmanje" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "sortiranje pesama" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "počinje sa" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "Zaustavi" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "numera %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/sv.po000066400000000000000000005102141260417502300236720ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Anton Strömkvist , 2014 # Christian Svensson , 2013 # Daniel Sandman , 2012 # FIRST AUTHOR , 2010 # Kristian , 2013-2015 # Kristian , 2012 # Kristoffer Grundström , 2014 # paperbagcorner , 2014-2015 # Patrik Nilsson , 2014-2015 # pieorpaj , 2013 # pieorpaj , 2012 # Robin Poulsen , 2011 # elfa , 2013 # Hoven1 , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Swedish (http://www.transifex.com/davidsansome/clementine/language/sv/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nDu kan göra spellistor till favoriter genom att klicka på stjärnikonen intill ett namn på en spellista\n\nFavoriserade spellistor kommer att sparas här" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " dagar" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "s" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " sekunder" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " låtar" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 låtar)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 album" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 dagar" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 dagar sedan" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 av %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 spellistor (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 vald(a) av" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 låt" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 låtar" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 låtar hittades" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 låtar hittades (visar %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 spår" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 överfört" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev-modul" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 andra lyssnare" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 totala uppspelningar" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n misslyckades" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n färdig" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n återstår" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Justera text" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Centrera" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "A&npassad" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "Extrafunktioner" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "Hjälp" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "Dölj %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "Dölj..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Vänster" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "Musik" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "I&nga" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "Spellista" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "A&vsluta" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Upprepningsläge" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Höger" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Blandningsläge" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "Justera kolumner så de passar fönstret" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "Verktyg" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(olika på flera låtar)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", av" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "... och alla Amarok-bidragsgivare" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 dag" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 spår" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192,000Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44,100Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48,000Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 slumpmässiga spår" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96,000Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Uppgradera till premium nu" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Om omarkerad, kommer Clementine att försöka spara dina betyg och annan statistik endast till en separat databas och dina filer lämnas oändrade.

Om markerad,kommer statistiken att sparas både i databasen och i filerna varje gång den ändras.

Notera att detta kanske inte fungerar för alla format för att ett standardsystem för att göra detta inte existerar, andra musikspelare kan kanske inte läsa dom.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Begränsa sökningen till ett specifikt fält genom att lägga till fältnamnet före sökordet. Till exempel söker artist:Bode igenom biblioteket efter alla artister som innehåller ordet Bode.

Tillgängliga fält: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Detta kommer att skriva låtbetyg och statistik till filetiketter i hela ditt musikbibliotek.

Detta är inte nödvändigt om "Spara betyg och statistik i filetiketter" alltid är aktiverat.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

En variabel påbörjas med %, till exempel: %artist %album %titel

\n\n

Om du omgärdar en variabel med klammerparanteser (måsvingar), så kommer den inte att visas om variabeln är tom.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Kräver ett Spotify Premium-konto." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Fjärrkontrollen kan endast ansluta om rätt kod anges." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "En smart spellista är en dynamisk lista över låtar som finns i ditt bibliotek. Det finns olika typer av smarta spellistor som väljer låtar på olika sätt." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "En låt kommer att inkluderas i spellistan om den matchar dessa villkor." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Ö" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ÄRAD VARE HYPNOTOAD" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Avbryt" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Om %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Om Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Om Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Absolut" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Kontodetaljer" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Kontoinformation (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Åtgärd" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Åtgärd" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Aktivera/inaktivera Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Aktivitetsström" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Lägg till podsändning" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Lägg till ström" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Lägg till en ny rad om det stöds av notifieringstypen" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Lägg till åtgärd" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Lägg till alla låtar från en katalog och alla dess underkataloger" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Lägg till en annan ström..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Lägg till katalog..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Lägg till fil" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Lägg till fil till transkodaren" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Lägg till fil(er) till transkodaren" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Lägg till fil..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Lägg till filer för omkodning" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Lägg till mapp" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Lägg till mapp..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Lägg till mapp..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Lägg till podsändning" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Lägg till podsändning..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Lägg till sökterm" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Lägg en albumetikett till låten" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Lägg en albumartistetikett till låten" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Lägg till etikett för låtens artist" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Lägg till poäng för musik automatiskt" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Lägg till etikett för låtens kompositör" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Lägg till etikett för skivnummer" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Lägg till filnamn på låt" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Lägg till etikett för genre" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Lägg till låtgrupperingsetikett" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Lägg till etikett för låtens längd" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Lägg till etikett för utövare" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Lägg till antal uppspelningar" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Lägg till låtbetyg" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Lägg till antal överhoppningar" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Lägg till etikett för låtens titel" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Lägg till en låt till cache" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Lägg till etikett för spårnummer" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Lägg till etikett för år" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Lägg till låtar i \"Min musik\" när \"Älskar\" knappen klickas" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Lägg till ström..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Lägg till i Min Musik" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Lägg till i Spotify's spellistor" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Lägg till under Spotify's stjärnmärkta" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Lägg till i en annan spellista" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Lägg till i bokmärken" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Lägga till den i spellistan" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Lägga till den i spelkön" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Lägg till användare/grupp till bokmärken" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Lägg till Wiimotedev-åtgärd" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Lägg till..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Tillagda denna månad" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Tillagda denna vecka" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Tillagda i år" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Tillagda idag" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Tillagda senaste tre månaderna" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Avancerad gruppering..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Efter " #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Efter kopiering..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Album (lämplig ljudstyrka för alla spår)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Albumartist" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Almbumomslag" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Album information från jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Album" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Album med omslag" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Album utan omslag" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Alla" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Alla filer (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "Ärad vare Hypnotoad!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Alla album" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Alla artister" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Alla filer (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Alla spellistor (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Alla översättare" #: library/library.cpp:98 msgid "All tracks" msgstr "Alla spår" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Tillåt en klient att ladda ner musik från denna dator." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Tillåt nedladdningar" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Tillåt mellan-/sidokodning" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Tillsammans med originalen" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Dölj alltid huvudfönstret" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Visa alltid huvudfönstret" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Alltid starta uppspelning" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon Cloud Drive" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Ett ytterligare insticksprogram krävs för att använda Spotify i Clementine. Vill du ladda ner och installera det nu?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Ett fel uppstod vid inläsning av iTunes-databasen" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Ett fel uppstod när metadata skulle skrivas till '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Ett okänt fel inträffade." #: ui/about.cpp:85 msgid "And:" msgstr "Och:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Arg" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Utseende" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Lägg till filer/webbadresser till spellistan" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Lägg till i den aktuella spellistan" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Lägg till i spellistan" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Tillämpa komprimering för att förhindra distorsion" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Är du säker på att du vill ta bort förinställningen \"%1\"?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Är du säker på att du vill återställa den här låtens statistik?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Är du säker på att du vill skriva låtstatistik till låtfilerna på alla låtar i ditt musikbibliotek?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Artist" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Artistinfo" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Artist-taggar" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Artistens initialer" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Fråga vid sparande" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Ljudformat" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Ljudutgång" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Behörighetskontroll misslyckades" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Författare" #: ui/about.cpp:68 msgid "Authors" msgstr "Upphovsmän" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Auto" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Automatisk" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Automatisk uppdatering" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Öppna enstaka kategorier i biblioteksträdet automatiskt" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Tillgängliga" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Genomsnittlig bithastighet" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Genomsnittlig bildstorlek" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "BBC podsändningar" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Bakgrundsströmmar" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Bakgrundsfärg" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Bakgrundsbild" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Bakgrundsopacitet" #: core/database.cpp:648 msgid "Backing up database" msgstr "Säkerhetskopiera databasen" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Balans" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "Förbjud (Last.fm scrobbling)" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Stapelanalysator" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Basblå" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Grundläggande ljudtyp" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Beteende" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Bästa" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Biografi från %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Bithastighet" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Bitfrekvens" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Bithastighet" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Blockanalysator" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Blocktyp" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Grumlighet" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Brödtext" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Boom-analysator" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Bläddra..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Längd på buffer" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Buffrar" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Skapar register för Seafile..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Men dessa källor är inaktiverade:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Knappar" #: core/song.cpp:428 msgid "CDDA" msgstr "CD-ljud" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Stöd för CUE-filer" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Cache sökväg:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Cachar" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "Cachar %1" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Avbryt" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Avbryt nedladdning" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Captcha krävs.\nFörsök logga in på Vk.com med din webbläsare, för att fixa det här problemet." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Ändra omslag" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Ändra typsnittsstorlek" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Ändra upprepningsläge" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Ändra snabbtangent..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Ändra blandningsläge" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "Byta ut låten som spelas för tillfället" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Ändra språket" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "Ändringarna verkställs när nästa låt börjar spelas" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Byte från/till Monoljud börjar gälla från nästa låt" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Kolla efter nya avsnitt" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Sök efter uppdateringar" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Leta efter uppdateringar..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Välj Vk.com cache-katalog" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Välj ett namn för din smara spellista" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Välj automatiskt" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Välj färg..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Välj typsnitt..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Välj från listan" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Välj hur spellistan ska sorteras och hur många låtar den ska innehålla." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Välj nedladdningsmapp för podsändningar" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Välj internet-tjänsterna du vill ha synliga." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Välj webbplatserna du vill att Clementine ska använda vid sökning efter låttexter." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Klassisk" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Rensar upp" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Rensa" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Rensa spellistan" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Clementine-fel" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Clementine-orange" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Clementine-visualisering" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine kan konvertera musiken du kopierar till denna enhet till ett format som den kan spela upp." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Clementine kan spela upp musiken som du laddat upp till Amazon Cloud Drive" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine kan spela musik som du har laddat upp på Box" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine kan spela musik som du har laddat upp på Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine kan spela musik som du laddat upp till Google Drive" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine kan spela musik som du laddat upp till OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine kan visa ett meddelande vid byte av spår." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine kan synkronisera din prenumeration lista med dina andra datorer och podsändningsprogram. Skapa ett konto ." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine kunde inte läsa in några projectM-visualiseringar. Kontrollera att du har installerat Clementine ordentligt." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Clementine-bildvisare" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine kunde inte hitta resultat för den här filen" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine kommer att söka musik i:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Klicka här för att lägga till musik" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Klicka här för att favorisera denna spellista så att den sparas och förblir tillgänglig från \"Spellistor\" på den vänstra sidbalken" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Klicka för att växla mellan återstående tid och total tid" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Att klicka på Login kommer att öppna en webbläsare. Du bör återgå till Clementine efter att inloggningen slutförts." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Stäng" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Stäng spellista" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Stäng visualisering" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Stängning av detta fönster kommer att avbryta hämtningen." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Stängning av detta fönster kommer att stoppa sökningen efter albumomslag." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Färger" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Lista, separerad med komma, över class:level; level är 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Kommentar" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Samhällsradio" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Fyll i etiketter automatiskt" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Fyll i etiketter automatiskt..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Kompositör" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Ställ in %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Konfigurera Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Konfigurera snabbtangenter" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Anpassa Spotify..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Konfigurera Subsonic..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Konfigurera VK.com..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Ställ in Global sökning..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Konfigurera biblioteket..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Konfigurera podcasts..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Konfigurera..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Anslut Wii-kontroller med åtgärden aktivera/inaktivera" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Anslut enhet" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Ansluter till Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Uppkoppling vägrad av servern, Kontrollera serverns URL. Exempel:http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Uppkopplingen har avbrutits, kontrollera serverns URL. Exempel: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Anslutningsproblem eller ljudet är inaktiverat av användaren" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Konsoll" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Konstant bithastighet" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Konvertera all musik" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Konvertera all musik som enheten inte kan spela upp" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Konvertera förlustfria ljudfiler innan dom sänds till fjärrkontrollen." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Konvertera förlustfria filer" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Kopiera delad url till urklipp" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Kopiera till klippbordet" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Kopiera till enhet..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Kopiera till biblioteket..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Copyright" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Kunde inte ansluta till Subsonic, kontrollera serverns URL. Exampel: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Kunde inte skapa GStreamer-elementet \"%1\" - kontrollera att du har alla GStreamer-insticken som krävs installerade" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Kunde inte skapa spellista" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Kunde inte hitta en muxer för %1, kontrollera att du har de korrekta GStreamer-insticken installerade" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Kunde inte hitta en kodare för %1, kontrollera att du har de korrekta GStreamer-insticken installerade" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Kunde inte öppna utdatafilen %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Omslagshanterare" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Omslagsbilder från inbäddad bild" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Omslagsbild laddas automatiskt från %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Omslagsbild kastades manuellt" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Omslagsbild inte angiven" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Omslagsbild angiven från %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Omslagsbilder från %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Korstona vid automatiskt byte av spår" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Korstona vid manuellt byte av spår" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Anpassad" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Anpassad bild:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Egna meddelandeinställningar" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Anpassad..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "Dbus-sökväg" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dans" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Databas-korruption upptäckt. Läs https://code.google.com/p/clementine-player/wiki/DatabaseCorruption för instruktioner om hur du återställer din databas" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Datum skapad" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Datum ändrad" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Dagar" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "S&tandard" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Sänk volymen med 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Minska volymen med procent" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Sänk volymen" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Standardbakgrund" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Standardenhet på %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Standardvärden" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Fördröjning mellan visualiseringar" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Ta bort" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Ta bort nedladdad data" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Ta bort filer" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Ta bort från enhet..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Ta bort från disk..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Ta bort uppspelade avsnitt" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Ta bort förinställning" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Radera smart spellista" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Ta bort originalfilerna" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Tar bort filer" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Avköa valda spår" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Avköa spår" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Mål" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Detaljer..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Enhet" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Enhetsinställningar" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Enhetsnamn" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Enhetsinställningar..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Enheter" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Dialog" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Menade du" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitalt importerad" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Digitalt importerat lösenord" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Digitalt importerat användarnamn" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Direkt Internetanslutning" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Katalog" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Avaktivera tidsvisning" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Inaktivera generering av stämningsdiagram" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Inaktiverad" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Inaktiverad" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Skiva" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Icke-kontinuerlig sändning" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Visningsalternativ" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Visa on-screen-display" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Gör en fullständig omsökning av biblioteket" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Gör en fullständig omskanning" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Gör en fullständig omskanning..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Konvertera inte någon musik" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Skriv ej över" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "Att göra en fullständig omskanning kommer ta bort all metadata du har sparat i Clementine t.ex. skivomslag, antal spelningar och betyg. Clementine kommer skanna om all din musik i Google Drive vilket kan ta lite tid." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Upprepa inte" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Visa inte i diverse artister" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Visa inte redan hörda episoder" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Blanda inte" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Stoppa inte!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Donera" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Dubbelklicka för att öppna" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "Att dubbelklicka på en låt i spellistan kommer att..." #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Att dubbelklicka på en låt kommer att..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Ladda ner %n avsnitt" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Nedladdningskatalog" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Ladda ner avsnitt till" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Hämta medlemskap" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Ladda ner nya avsnitt automatiskt" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Nedladdning köad" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Ladda ner inställningar" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Ladda ner Android appen" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Hämta detta album" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Ladda ner det här albumet ..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Ladda ner detta avsnitt" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Ladda ner..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Laddar ner (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Ladda ner Icecast-katalog" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Ladda ner Jamendo-katalog" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Hämtar katalog från Magnatune" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Laddar ner Spotify-insticket" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Hämtar metadata" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Dra för att ändra position" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dubstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Längd" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Dynamiskt läge är på" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Dynamisk slumpmässig blandning" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Redigera smart spellista..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Redigera etikett \"%1\"..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Redigera tagg..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Redigera etiketter" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Redigera spårinformation" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Redigera spårinformation..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Redigera spårinformation..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Redigera..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "Epost" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Aktivera stöd för Wii-kontroll" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Aktivera automatisk caching" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Aktivera equalizer" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Aktivera endast snabbknappar när Clementine är fokuserat" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Aktivera låt metadata radversion genom att klicka" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Aktivera underliggande källor för att inkludera dem i sökresultatet.Resultaten kommer att visas i följande ordning." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Aktivera/avaktivera Last.fm-skrobbling" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Kodningskomplexitet" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Kodningsmotorns kvalitet" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Kodningsläge" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Ange en adress" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Ange en URL för att ladda ner ett omslag från Internet:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Ange ett filnamn för exporterade omslag (utan ändelse):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Ange ett nytt namn för denna spellista" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Ange söktermer här ovanför för att söka efter musik på din dator eller på nätet" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Ange en sökterm här under för att hitta en podsändning på iTunes" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Ange en sökterm här under för att hitta en podsändning på gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Ange söktermer här" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Skriv in webbadressen till en radiostation på Internet:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Ange katalogens namn" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Ange detta IP-nummer i Appen för att ansluta till Clementine." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Hela samlingen" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Equalizer" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Motsvarar --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Motsvarar --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Fel" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Något gick fel med CD-Rippningen" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Fel vid anslutning av MTP-enhet" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Fel vid kopiering av låtar" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Fel vid borttagning av låtar" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Fel vid hämtning av Spotify-insticket" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Fel vid insläsning av %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Fel vid laddning av di.fm spellista" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Fel vid bearbetning av %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Fel vid läsning av ljud-CD" #: library/library.cpp:68 msgid "Ever played" msgstr "Någonsin spelade" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Var tionde minut" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Var tolfte timma" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Varannan timme" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Var tjugonde minut" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Varje halvtimma" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Var sjätte timma" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Varje timma" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Förutom mellan spår på samma album eller i samma CUE-fil" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Existerande omslag" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Expandera" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Går ut den %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Exportera Omslag" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Exportera omslag" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Exportera nedladdade omslag" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Exportera inbäddade omslag" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Exporteringen är färdig" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Exporterat %1 omslag av %2 (%3 överhoppade)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Tona ut vid pausning / tona in vid återupptagning" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Tona ut när ett spår stoppas" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Toning" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Toningslängd" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Fel vid läsning av CD-enhet" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Misslyckades hämta katalog" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Misslyckades att hämta podsändning" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Misslyckades att ladda podsändning" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Misslyckades att tolka XML för denna RSS-flöde" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Snabb" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Favoritspår" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Hämta saknade omslag" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Hämta automatiskt" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Hämtning klar" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Hämtar bibliotek från Subsonic" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Fel vid hämtning av omslag" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Filformat" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Filändelse" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Filformat" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Filnamn" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Filnamn (utan sökväg)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Filnamnsmönster:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Filsökvägar" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Filstorlek" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Filtyp" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Filnamn" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Filer" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Filer som skall omkodas" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Hitta låtar i ditt bibliotek som matchar de kriterier du anger." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Hitta denna artisten" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Sätter fingeravtryck på låten" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Avsluta" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Första nivån" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Passa omslag till bredd" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "FLAC" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Typsnittsstorlek" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Av licensskäl finns Spotify-stöd i ett separat insticksprogram." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Tvinga enkanalskodning" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Glöm enhet" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "En enhet tas bort från listan om den glöms och Clementine kommer att behöva söka av alla låtar igen nästa gång du ansluter den." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Formulär" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Format" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Bildfrekvens" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Ramar per buffert" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Frusen" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Full bas" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Full bas + diskant" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Full diskant" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Allmänt" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Allmänna inställningar" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Genre" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Hämta en URL för att dela Spotify låt" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Hämta en URL för delning av denna spellista" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Hämtar kanaler" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Hämtar ström" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Ge den ett namn:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Starta" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Gå till nästa spellisteflik" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Gå till föregående spellisteflik" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Erhöll %1 omslagsbild utav %2 (%3 misslyckades)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Gråa ut icke-existerande låtar i mina spellistor" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Gruppera biblioteket efter..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Gruppera efter" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Gruppera efter album" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Gruppera efter artist" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Gruppera efter artist/album" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Gruppera efter artist/år - album" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Gruppera efter genre/album" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Gruppera efter genre/artist/album" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Gruppera" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "HTML-sida inehöll inget RSS-flöde" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "HTTP 3xx statuskod mottagen utan URL, verifiera serverkonfiguration." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "HTTP-proxy" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Glad" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Hårdvaruinformation" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Hårdvaruinformation är endast tillgänglig när enheten är ansluten." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Hög" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Hög (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Hög (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "HipHop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Hittade ingen värd, Kontrollera serverns URL. Exempel: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Timmar" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Jag har inte ett Magnatune-konto" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Ikon" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Ikoner längst upp" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Identifierar låt" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Om aktiverad så kan du klicka på en markerad sång i spellistan för att ändra taggvärdet direkt" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Om du fortsätter kommer denna enhet att arbeta långsamt och låtar som kopierats till den kanske inte fungerar." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Om du känner till en adress till en podsändnin, ange den här under och tryck Starta" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Ignorera \"The\" i artistnamn" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Bilder (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Bilder (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Importera..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "Om %1 dagar" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "Om %1 veckor" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "I dynamiskt läge kommer nya spår väljas och läggas till i spellistan varje gång en låt tar slut." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Inkorg" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Inkludera albumomslag i notifieringen" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Inkludera alla spår" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Okompatibelt Subsonic REST protokoll. Klienten måste uppgraderas." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Okompatibel Subsonic REST protokollsversion. Servern måste uppgraderas." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Ej komplett konfiguration, var vänlig och kontrollera att alla fält är ifyllda." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Öka volymen med 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Öka volymen med procent" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Höj volymen" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Indexerar %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Information" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Indataalternativ" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Infoga..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Installerad" #: core/database.cpp:585 msgid "Integrity check" msgstr "Integritetskontroll" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Internetoperatörer" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Internet-tjänster" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "Låtintroduktion" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Felaktig API-nyckel" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Ogiltigt format" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Ogiltig metod" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Ogiltiga parametrar" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Ogiltig resurs angiven" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Ogiltig tjänst" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Felaktig sessionsnyckel" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Invertera val" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Jamendo Mest Lyssnade låtar" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Jamendo Topplåtar" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendos favoritspår för månaden" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendos favoritspår för veckan" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Jamendos databas" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Hoppa till föregående låt direkt" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Hoppa till spåret som spelas just nu" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Behåll knappar i %1 sekund..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Behåll knappar i %1 sekunder..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Fortsätt köra i bakgrunden när fönstret är stängt" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Behåll originalfilerna" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Kattungar" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Språk" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Laptop/hörlurar" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Stor hall" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Stort albumomslag" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Stora skivomslag (detaljer nedan)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Stora skivomslag (inga detaljer)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Stor sidopanel" #: library/library.cpp:80 msgid "Last played" msgstr "Senast spelad" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Senast spelad" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm är upptaget för närvarande, försök igen om ett par minuter" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Last.fm-lösenord" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Last.fm-låtstatistik" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Last.fm-taggar" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Last.fm-användarnamn" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Last.fm-wiki" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Minst omtyckta spår" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Vänster" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Speltid" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Bibliotek" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Avancerad bibliotekgruppering" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Notis om omsökning av biblioteket" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Bibliotekssökning" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Begränsningar" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Läs in" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Ladda omslag från URL" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Ladda omslag från URL..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Ladda omslag från hårddisk" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Läs in omslagsbild från disk..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Läs in spellista" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Läs in spellista..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Läser in MTP-enhet" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Läser in iPod-databas" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Läser in smart spellista" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Laddar låtar" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Läser in ström" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Läser in spår" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Laddar låtinformation" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Läser in..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Läser in filer/webbadresser, ersätter aktuell spellista" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Inloggning" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Misslyckad inloggning" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Logga ut" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Långsiktig förutsägelseprofil (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Älska" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "Älska (Last.fm scrobbling)" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Låg (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Låg (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Låg komplexitetprofil (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Låttexter" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Låttext från %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Låttext från ID3v2 etikett" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "MP4 AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Magnatude-hämtning" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Magnatude-hämtning slutförd" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Huvudprofil (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Gör så!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Gör det så!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Gör spellista tillgänglig offline" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Felformaterat svar" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Manuell proxykonfiguration" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Manuellt" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Tillverkare" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Markera som lyssnad" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Markera som ny" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Matcha varje sökterm (OCH)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Matcha en eller flera söktermer (ELLER)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Max globala sökresultat" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Maximal bithastighet" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Media har ändrats. Laddar om" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Mellan (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Mellan (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Medlemskapstyp" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Minimal bithastighet" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Minsta buffertfyllnad" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Saknar förinställningar för projectM" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Modell" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Övervaka förändringar i biblioteket" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Mono uppspeling" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Månader" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Stämning" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Stil på stämningsdiagrammet" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Stämningsdiagram" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Mer" #: library/library.cpp:84 msgid "Most played" msgstr "Mest spelade" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Monteringspunkt" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Monteringspunkter" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Flytta nedåt" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Flytta till biblioteket..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Flytta uppåt" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Musik" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Musikbibliotek" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Tyst" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Mina Album" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Min Musik" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Mina rekommendationer" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Namn" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Namn" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Namngivningsalternativ" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Snävt band (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Nätverksproxy" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Fjärrstyr över nätverk" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Aldrig" #: library/library.cpp:74 msgid "Never played" msgstr "Aldrig spelade" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Aldrig starta uppspelning" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Ny mapp" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Ny spellista" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Ny smart spellista..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Nya låtar" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Nya spår läggs till automatiskt." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Nyaste spåren" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Nästa" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Nästa spår" #: core/utilities.cpp:151 msgid "Next week" msgstr "Nästa vecka" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Ingen analysator" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Ingen bagrundsbild" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Inga omslag att exportera." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Inga långa block" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Inga träffar hittades. Töm sökrutan för att visa hela spellistan igen." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Inga korta block" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Inga" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Ingen av de valda låtarna lämpar sig för kopiering till en enhet" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Normal" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Normal blocktyp" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Inte tillgängligt när du använder en dynamisk spellista" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Inte ansluten" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Inte tillräckligt med innehåll" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Inte tillräckligt många fans" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Inte tillräckligt många medlemmar" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Inte tillräckligt med grannar" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Inte installerad" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Inte inloggad" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Inte monterad - dubbelklicka för att montera" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Inget hittades" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Notifieringstyp" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Notifieringar" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Spelas just nu" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Antal episoder att visa" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Förhandsvisning av notifiering" #: widgets/osd.cpp:173 msgid "Off" msgstr "Av" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg FLAC" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "På" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Acceptera endast anslutningar från klienter inom dessa ip ranges:⏎ 10.x.x.x⏎ 172.16.0.0 - 172.31.255.255⏎ 192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Tillåt endast uppkopplingar från det lokala nätverket" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Visa endast de första" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Opacitet" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Öppna %1 i webbläsare" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Öppna &ljud-CD..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Öppna OPML fil" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Öppna OPML fil..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Öppna en katalog att importera musik från" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Öppna enhet" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Öppna fil..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Öppna i Google Drive" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Öppna i en ny spellista" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Öppna i en ny spellista" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Öppna i webbläsare" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Öppna..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Åtgärden misslyckades" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Optimera för bithastighet" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Optimera för kvalitet" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Alternativ..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Organisera filer" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Organisera filer..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Organiserar filer..." #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Ursprungliga etiketter" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "Originalår" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "Originalår - Album" #: library/library.cpp:118 msgid "Original year tag support" msgstr "Stöd för etiketten originalår" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Övriga flaggor" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Utgång" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Utgångsenhet" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Utdataalternativ" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Skriv över alla" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Skriv över befintliga filer" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Skriv endast över mindre" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Ägare" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Sorterar Jamendos katalog" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Party" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Lösenord" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Gör paus" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Gör paus i uppspelning" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Pausad" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Utövare" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Pixel" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Vanlig sidorad" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Spela upp" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Antal uppspelningar" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Spela upp om stoppad, gör paus vid uppspelning" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Spela om ingenting redan spelas" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Spela upp spår nummer från spellistan" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Spela upp/gör paus" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Uppspelning" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Spelaralternativ" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Spellista" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Spellistan slutförd" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Alternativ för spellista" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Spellistetyp" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Spellistor" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Var god och stäng din webbläsare och återgå till Clementine." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Instickstatus:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podsändning" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Popup-varaktighet" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Förförstärkare" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Inställning" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Inställningar" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Inställningar..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Föredragna omslagsbildsfilnamn (kommaseparerade)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Önskat ljudformat" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Föredragen bitrate" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Önskat format" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Bättre ljudtyp" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Förval:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Tryck en tangentkombination att använda för" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Tryck en tangent" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Tryck en tangentkombination till att använda för %1" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Att klicka på \"Föregående spår\" i spelaren kommer att..." #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Alternativ för Skön notifiering" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Förhandsvisning" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Föregående" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Föregående spår" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Visa versionsinformation" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Förlopp" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Framgång" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psykadelisk" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Tryck på Wii-kontrollknapp" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Lägg till låtar i slumpmässig ordning" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Kvalitet" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Kvalitet" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Förfrågar enhet..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Köhanterare" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Kölägg valda spår" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Kölägg spår" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (likvärdig ljudstyrka för alla spår)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Regn" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Regn" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Slumpmässig visualisering" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Betygsätt den aktuella låten 0 stjärnor" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Betygsätt den aktuella låten 1 stjärnor" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Betygsätt den aktuella låten 2 stjärnor" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Betygsätt den aktuella låten 3 stjärnor" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Betygsätt den aktuella låten 4 stjärnor" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Betygsätt den aktuella låten 5 stjärnor" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Betyg" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Verkligen avbryta?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Gränsen för omdirigering överskriden, verifiera serverkonfiguration." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Updatera katalog" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Uppdatera kanaler" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Uppdatera kanallistan" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Uppdatera strömmar" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Relativ" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Kom ihåg Wii-kontrollens rörelse" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Kom ihåg från förra gången" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Kom ihåg mitt val" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Ta bort" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Ta bort åtgärd" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Ta bort dubbletter från spellistan" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Ta bort mapp" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Ta bort från Min Musik" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Ta bort från bokmärken" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Ta bort från spellistan" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Ta bort spellista" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Ta bort spellistor" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Ta bort otillgängliga låtar från spellistan" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Döp om spellista" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Döp om spellistan..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Omnumrera spår i denna ordning..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Upprepa" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Upprepa album" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Upprepa spellista" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Upprepa spår" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Ersätt den aktuella spellistan" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Ersätta spellistan" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Ersätter mellanslag med understreck" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Replay Gain läge" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Skapa en ny blandning" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Kräv autentiseringskod" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Återställ" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Återställ låtstatistik" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Starta om låten, hoppa till föregående låt vid dubbelklickning" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Starta om spåret, eller spela föregående spår om inom 8 sekunder sedan start." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Begränsa till ASCII-tecken" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Fortsätt uppspelning vid start" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Återgå till Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Höger" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Kopiera" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Kopiera CD-skiva" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Rippa ljud CD" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Kör" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "SOCKS proxy" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "SSL handslaget misslyckades, verifiera serverkonfigurationen. SSLv3 alternativet nedan kan lösa vissa problem." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Säker borttagning av enhet" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Säker borttagning av enheten efter kopiering" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Samplingsfrekvens" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Samplingsfrekvens" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Spara .stämningsfiler i ditt musikbibliotek" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Spara skivomslag" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Spara omslag till disk..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Spara bild" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Spara spellista" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Spara spellista" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Spara spellistan..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Spara förinställning" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Spara betyg i låtetiketter om möjligt" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Spara statistik i filetiketter om möjligt" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Spara denna ström i Internet-filken" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Spara låtstatistik till låtfiler" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Sparar spår" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Skalbar samplingsfrekvensprofil (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Skalnings storlek" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Poäng" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Skrobbla låtar som jag lyssnar på" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Sök" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Sök" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Leta efter stationer på Icecast" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Sök på Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Sök i Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Sök Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Sök automatiskt" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Sök efter albumomslag..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Sök efter vad som helst" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Sök gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Sök iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Sökläge" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Sökalternativ" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Sökresultat" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Söktermer" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Andra nivån" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Hoppa bakåt" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Hoppa framåt" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Hoppa till en relativ position i spåret som spelas för närvarande" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Hoppa till en absolut position i spåret som spelas för närvarande" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "Sök med en tangentbordsgenväg" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Välj alla" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Välj ingen" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Välj bakgrundsfärg:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Väl en bakgrundsbild" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Välj bästa möjliga matchning" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Väl förgrundsfärg:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Välj visualiseringar" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Välj visualiseringar..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Välj..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Serienummer" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Server" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "Server URL" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Serverdetaljer" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Tjänst inte tillgänglig" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Ställ in %1 till \"%2\"..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Ställ in volymen till procent" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Ställ in värde för alla valda spår..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Inställningar" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Snabbtangent" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Snabbtangent för %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Snabbtangent för %1 finns redan" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Visa" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Visa notifiering" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Visa en lysande animation på det nuvarande spåret" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Visa ett stämninsdiagram i tidsvisningsbalken" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Visa en standardiserad skrivbordsnotifiering" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Visa en notifiering när jag ändrar upprepnings/blandningsläge" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Visa en notifiering när jag ändrar volymen" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Visa en avisering när jag pausar uppspelningen" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Visa en popup från notifieringsytan" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Visa en skön notifiering" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Visa ovanför statusraden" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Visa alla låtar" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Visa alla låtar" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Visa omslagsbilder i biblioteket" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Visa avdelare" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Visa full storlek..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Visa grupper i globala sökresultat" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Visa i filhanterare..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Visa i biblioteket" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Visa i diverse artister" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Visa stämningsdiagram" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Visa endast dubbletter" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Visa otaggade endast" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Visa låt som spelas på din sida" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Visa sökförslag" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Visa knappen \"Älska\"" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Visa skrobbelknappen i huvudfönstret" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Visa notifieringsikon" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Visa vilka källor som är aktiva/inaktiva" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Visa/dölj" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Blanda" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Blanda album" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Blanda allt" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Blanda spellistan" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Blanda låtar i detta album" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Logga in" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Logga ut" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Loggar in..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Liknande artister" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Storlek" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Storlek:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Gå bakåt i spellista" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Antal överhoppningar" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Gå framåt i spellista" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Hoppa över valda spår" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Hoppa över spår" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Liten omslagsbild" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Liten sidopanel" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Smart spellista" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Smarta spellistor" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Låtinformation" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Låtinfo" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Spektrogram" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Tyvärr" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Sortera på genre (alfabetiskt ordning)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Sortera på genre (ordning efter popularitet)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Sortera efter stationsnamn" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Ordna låtar efter" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Sortering" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Källa" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Källor" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Fel vid inloggning på Spotify" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "URL för Spotify's spellistor" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Spotify-insticksprogram" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Spotify-insticksprogrammet är inte installerat" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "URL för Spotify's låtar" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Standard" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Stjärnmärkta" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Starta kopiering" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Starta spellistan som spelas för närvarande" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Starta omkodning" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Skriv nånting i sökrutan ovan för att få sökresultat i denna lista" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Startar %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Startar..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Stoppa" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Stoppa efter" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Stoppa efter varje låt" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Stoppa efter varje låt" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Stoppa efter detta spår" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Stoppa uppspelning" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Sluta spela efter aktuellt spår" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Sluta spela efter spår: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Stoppad" #: core/song.cpp:431 msgid "Stream" msgstr "Ström" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "För att streama från Subsonics servrar krävs en giltig licens efter en testperiod på 30 dagar. " #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Strömmningsmedlemskap" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Prenumeranter" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Lyckades!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "Skrev %1 med lyckat resultat" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Föreslagna etiketter" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Sammanfattning" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Väldigt hög (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Super high (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Stödda format" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Synkronisera statistik till filerna nu" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Synkroniserar Spotify-inkorg" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Synkroniserar Spotify-spellista" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Synkroniserar stjärnmärkta spår i Spotify" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Systemfärger" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Flikar längst upp" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Etiketthämtare" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Önskad bithastighet" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Textalternativ" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Tack till" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Kommandot \"%1\" kunde inte startas." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Albumomslaget på den nu spelande låten." #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "Katalogen %1 är inte giltig" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "Det andra värdet måste vara större än det första!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Den webbplats du söker finns inte!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Webbplatsen du söker är inte en bild!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Testperioden för Subsonics server är över. Var vänlig och donera för att få en licensnyckel. Besök subsonic.org för mer detaljer." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Den version av Clementine du precis uppdaterade till kräver en fullständig omsökning av biblioteket på grund av dessa nya funktioner:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Det finns 'andra låtar' i det här albumet." #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Det uppstod ett fel med kommunikationen till gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Ett fel uppstod vid hämtning av metadatan från Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Det uppstod ett fel med kommunikationen till iTunes" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Fel uppstod vid kopiering av några låtar. Följande filer kunde inte kopieras:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Fel uppstod vid borttagning av några låtar. Följande filer kunde inte kopieras:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Filerna kommer att tas bort från enheten, är du säker på att du vill fortsätta?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Dessa filer tas permanent bort från disken, är du säker på att du vill fortsätta?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Dessa mappar kommer att sökas igenom efter musik för att skapa ditt bibliotek" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Dessa inställningar används i dialogrutan \"Omkoda musik\", och vid konvertering av musik innan den kopieras till en bärbar enhet." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Tredje nivån" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Den här åtgärden kommer skapa en databas som kan bli så stor som 150 Mb.\nVill du fortsätta i alla fall?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Detta album är inte tillgängligt i det begärda formatet" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Detta kan ändras senare genom inställningar" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Denna enhet måste vara ansluten och öppnad före Clementine kan se vilka filformat den stöder." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Denna enhet stöder följande filformat:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Denna enhet kommer inte att fungera ordentligt" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Detta är en MTP-enhet, men du kompilerade Clementine utan stöd av libmtp." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Detta är en iPod, men du kompilerade Clementine utan stöd av libgpod." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Detta är första gången du ansluter denna enhet. Clementine kommer nu att söka igenom enheten för att hitta musikfiler - detta kan ta lite tid." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Detta alternativ kan ändras i \"Beteende\" i Inställningar" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Denna ström är endast för betalkunder" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Denna typ av enhet är inte stödd: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "Tidssteg" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Titel" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Idag" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Växla Pretty OSD" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Växla fullskärm" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Växla köstatus" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Växla skrobbling" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Växla synlighet för Pretty på-skärm-visning" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Imorgon" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "För många omdirigeringar" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Topplåtar" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Album totalt:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Totalt antal byte överfört" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Totalt antal nätverksbegäran" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Spår" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Spår" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Omkoda musik" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Omkodningslogg" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Omkodare" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Omkodar %1 filer med %2 trådar" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Omkodningsalternativ" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbin" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Stäng av" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "Webbadress(er)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Ultrabredband (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Kan inte ansluta" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Det går inte att hämta %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Okänt" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Okänd innehållstyp" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Okänt fel" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Ta bort omslag" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Hoppa inte över valda spår" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Hoppa inte över valt spår" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Avprenumerera" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Kommande konserter" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Uppdatering" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Uppdatera alla podsändningar" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Uppdatera ändrade bibliotekskataloger" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Uppdatera biblioteket när Clementine startar" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Uppdatera denna podsändning" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Uppdatera" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Uppdaterar %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Uppdaterar %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Uppdaterar biblioteket" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Användning" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Använd om möjligt album artist tagg" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Använd GNOMEs snabbtangenter" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Använd Psykodeliska färger" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Använd Replay Gain-metadata om det finns tillgängligt" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Använd SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Använd Wii-kontroll" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Använd en egen färguppsättning." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Använd ett eget meddelande för notifieringar" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Använd en nätverks fjärrkontroll" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Använd autentisering" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Använd motor för hantering av bithastighet" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Aktivera dynamiskt läge" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Använd notifieringar för rapportering av Wii-kontrollstatus" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Använd tidsbaserad brusformning" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Använd systemets standard" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Använd systemets standarduppsätting av färger." #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Använd systemets proxy inställningar" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Använd ljudnormalisering" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Använd" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Användargränssnitt" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Användarnamn" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Att använda menyn för att lägga till en låt kommer att..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Variabel bithastighet" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Diverse artister" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Version %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Visa" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Visualiseringsläge" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Visualiseringar" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Inställningar för visualiseringar" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Avkänning av röstaktivitet" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Volym %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Vägg" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Varna mig när jag stänger en spellistsflik" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "WAV" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Webbsida" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Veckor" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "När Clementine startar" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "När Clementine letar efter albumomslag söker den först efter bildfiler som innehåller något av dessa ord.\nOm det inte finns några matchande så kommer den att använda den största bilden i katalogen." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "När en spellista sparas ska sökvägen vara" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "När listan är tom..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Försök med..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Bredband (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii-kontroll %1: aktiverad" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii-kontroll %1: ansluten" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii-kontroll %1: kritisk batterinivå (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii-kontroll %1: inaktiverad" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii-kontroll %1: frånkopplad" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii-kontroll %1: låg batterinivå (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wii kontroll" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media-ljud" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Utan omslag:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Vill du flytta på 'andra låtar' i det här albumet till Blandade Artister också?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Vill du köra en fullständig omsökning nu?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Skriv all låtstatistik till låtfilerna" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Skriv metadata" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Fel användarnamn eller lösenord." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "År" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "År - Album" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "År" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Igår" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Du är på väg att hämta de följande albumen" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Du är på väg att ta bort %1 spellista från dina favoriter, är du säker?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Du är på väg att ta bort en spellista som inte är en av dina favoriserade spellistor:denna spellista kommer att förstöras (denna åtgärd kan inte ångras).\nÄr du säker på att du vill fortsätta?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Du är inte inloggad." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Du är inloggad som %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Du är inloggad." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Du kan ändra hur låtarna i biblioteket är organiserade." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Du kan lyssna gratis utan ett konto, men premiumanvändare kan lyssna på strömmar med högre kvalité utan reklam." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Du kan lyssna på Magnatune-låtar gratis utan ett konto. Köp av ett medlemskap tar bort meddelandena i slutet av varje spår." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Du kan lyssna på bakgrundströmmar samtidigt som du lyssnar på annan musik." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Du kan använda din Wii-kontroll som en fjärrkontroll för Clementine. Se sidan på Clementine-wikin för mer information.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Du har inget Spotify Premium konto" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Du har inte någon aktiv prenumeration" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "Du behöver inte vara inloggad för att söka och lyssna till musik på SoundCloud. Men om du vill komma åt dina spellistor och strömmar krävs inloggning." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Du har loggats ur Spotify, ange ditt lösenord på nytt i dialogrutan." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Du har loggats ut från Spotify, ange ditt lösenord på nytt." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Du älskar detta spår" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "Du behöver starta Systeminställningar och tillåta Clementine att \"kontrollera din dator\" för att använda globala snabbtangenter i Clementine." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Du måste starta om Clementine om du ändrar språket." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Din IP-adress:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Dina Last.fm-uppgifter var felaktiga" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Dina uppgifter för Magnatune var felaktiga" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Ditt bibliotek är tomt!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Dina radioströmmar" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Dina skrobblingar: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Ditt system saknar OpenGL support, visualiseringar är inte tillgängliga." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Ditt användarnamn eller lösenord var felaktigt" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Ö-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Noll" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "lägg till %n låtar" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "efter" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "sedan" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "och" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "automatisk" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "före" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "mellan" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "största först" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "som innehåller" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "inaktiverad" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "skiva %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "som inte innehåller" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "som slutar med" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "som är lika med" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "gpodder.net katalog" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "som är större än" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "Ipodspelare och USB-enheter fungerar för närvarande inte i Windows. " #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "de senaste" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "som är mindre än" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "längsta först" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "flytta %n låtar" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "nyaste först" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "inte lika med" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "inte de senaste" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "inte den" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "äldsta först" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "på" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "alternativ" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "eller scanna QR koden!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "tryck enter" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "ta bort %n låtar" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "korstaste först" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "Blanda låtar" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "minsta först" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "Sortera låtar" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "som börjar med" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "stoppa" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "spår %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/te.po000066400000000000000000004035031260417502300236540ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Gōpāla Kr̥ṣṇa Kōḍūri , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Telugu (http://www.transifex.com/davidsansome/clementine/language/te/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: te\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr "సెకనులు" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "పాటలు" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 గీతమాలికలు" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 రోజులు" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 రోజుల మునుపు" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 పాటలజాబితాలు (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 ఎంచుకున్నారు" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 పాట" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 పాటలు" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 పాటలు కనుగొన్నాము" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 పాటలు కనుగొన్నాము (%2 చూపిస్తున్నాము)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 పాటలు" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 బదిలీ చేశాము" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 మిగతా శ్రోతలు" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "మొత్తం‌ %L1 ఆటలు" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n విఫలమయ్యాయి" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n పూర్తయ్యాయి" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n మిగిలాయి" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&పాఠ్యాన్ని సమలేఖనం" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&మధ్యస్థం" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&అనురూపితం" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "" #: core/utilities.cpp:119 msgid "1 day" msgstr "" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "" #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "" #: core/song.cpp:422 msgid "AIFF" msgstr "" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "" #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "" #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "" #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "" #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "" #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "" #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "" #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:80 msgid "All the translators" msgstr "" #: library/library.cpp:98 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:85 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "" #: ui/about.cpp:68 msgid "Authors" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "" #: core/database.cpp:648 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "" #: core/song.cpp:428 msgid "CDDA" msgstr "" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "" #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:114 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "" #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "" #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "" #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "" #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:68 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:585 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "" #: library/library.cpp:80 msgid "Last played" msgstr "" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: ui/equalizer.cpp:137 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "" #: core/song.cpp:410 msgid "MPC" msgstr "" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "" #: library/library.cpp:74 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:92 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "" #: core/utilities.cpp:151 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "" #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "" #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "" #: core/organise.cpp:73 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:139 msgid "Party" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "" #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "" #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "" #: core/song.cpp:431 msgid "Stream" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "" #: ui/about.cpp:74 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "" #: core/song.cpp:426 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "" #: devices/giolister.cpp:157 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/tr.po000066400000000000000000005133521260417502300236750ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Ahmet Sezgin Duran , 2013 # arnaudbienner , 2011 # devingregory , 2012 # Ege Öz , 2013 # Emre FIRAT , 2013 # H. İbrahim Güngör , 2011 # H. İbrahim Güngör , 2010 # H. İbrahim Güngör , 2011 # Irfan YAZICI , 2011 # Kadir Celep , 2012 # Muhammet Kara , 2012 # Muhammet Kara , 2015 # Murat Ikilik <>, 2012 # Murat Sahin , 2012 # Mustafa YILMAZ , 2013 # Ömer Faruk Uzun , 2012 # seckin Yılmaz , 2015 # zeugma , 2012 # Volkan Gezer , 2013-2015 # yusufbesir1 , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Turkish (http://www.transifex.com/davidsansome/clementine/language/tr/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nÇalma listelerini bir çalma listesi adının anındaki yıldız simgesi ile beğenilenlere ekleyebilirsiniz\n\nBeğenilen çalma listeleri buraya kaydedilecek" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " günler" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " saniye" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " şarkılar" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 şarkı)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 albüm" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 gün" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 gün önce" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%2 üzerinde %1" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 çalma listesi (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 seçili" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 şarkı" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 şarkı" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 şarkı bulundu" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 şarkı bulundu (%2 tanesi gösteriliyor)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 parça" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 aktarıldı" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev modülü" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 başka dinleyici" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 toplam çalma" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n başarısız" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n tamamlandı" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n kaldı" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Metni hizala" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Ortala" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Özel" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "Ekler" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Yardım" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "&Gizle %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Gizle..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Sol" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "Müzik" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Hiçbiri" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "Çalma Listesi" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Çık" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Tekrar kipi" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Sağ" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Rastgele kipi" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Sütunları pencereye sığacak şekilde ayarla" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Araçlar" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(her şarkı için farklı)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", " #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...ve tüm Amarok katkıcılarına" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 gün" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 parça" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 rastgele parça" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Şimdi Premium üyeliğine geçin" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Eğer işaretli değilse, Clementine beğenilerinizi ve diğer istatistikleri, sadece ayrı bir veritabanında saklayıp dosyalarınızı değiştirmeyecektir.

İşaretli ise, istatistikler hem veritabanına hem de her dosya değişiminde doğrudan dosyalara kaydedilecektir.

Lütfen, bu işlem için bir standart olmadığından ve bu işlem her biçim için çalışmayabileceğinden, diğer müzik oynatıcılar okuyamayabilir.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Aramayı ilgili alanla sınırlamak için bir kelimenin önüne ilgili alanı ekleyin. Örn. artist:Bode Bode kelimesini içeren tüm sanatçıları kütüphanede arar.

Kullanılabilir alanlar: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Bu şarkının beğenilerini ve isatistiklerini, tüm kütüphanenizin şarkılarındaki dosya etiketlerine yazacaktır.

Eğer "Beğeni ve istatistikleri dosya etiketinde sakla" seçeneği her zaman etkin ise, gerekli değildir.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

% ile başlayan özellikler, örneğin: %artist %album %title

\n\n

İşaret içeren metnin bölümlerini süslü parantez ile sarmalarsanız, işaret boşsa o bölüm görünmeyecektir.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Bir Spotify Premium hesabı gereklidir." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Kod doğru girilmişse, yalnızca bir istemciye bağlanabilirsiniz." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Akıllı çalma listesi, kütüphanenizden gelen şarkıların dinamik bir listesidir. Şarkı seçmenin farklı yollarını sunan farklı akıllı şarkı listesi türleri vardır." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Bir şarkı, eğer bu koşullara uyarsa çalma listesine eklenecektir." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "TÜM ŞEREF HYPNOTOAD'A GİTSİN" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "İptal" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "%1 Hakkında" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Clementine Hakkında..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Qt Hakkında..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Kesin" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Hesap ayrıntıları" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Hesap detayları (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Eylem" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Eylem" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Wiiremote etkinleştir/devre dışı bırak" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Etkinlik akışı" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Podcast Ekle" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Müzik Yayını Ekle" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Bildirim türü olarak yeni bir satır ekleyin" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Eylem ekle" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Bir dizin ve tüm alt dizinlerindeki parçaları ekle" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Başka bir yayın ekle..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Dizin ekle..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Dosya ekle" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Dosyayı dönüştürücüye ekle" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Dosyayı/dosyaları dönüştürücüye ekle" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Dosya ekle..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Dönüştürülecek dosyaları ekle" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Klasör ekle" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Klasör ekle..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Yeni klasör ekle..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Podcast ekle" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Podcast ekle..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Arama terimi ekle" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Albüm etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Albüm sanatçısı etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Sanatçı etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Otomatik şarkı puanı ekle" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Besteci etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Şarkı diski etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Dosya adı ekle" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Şarkı tarzı etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Şarkı gruplama etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Şarkı uzunluğu etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Şarkıyı söyleyen etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Şarkı çalma sayısı ekle" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Şarkı derecelendirmesi ekle" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Şarkı atlama sayısı ekle" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Şarkı adı etiketi ekle" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Şarkıyı önbelleğe ekle" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Şarkıya parça etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Yıl etiketi ekle" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "\"Beğendim\" düğmesi tıklandığında şarkıları \"Müziklerim\"e ekle" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Yayın ekle..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Müziklerime Ekle" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Spotify çalma listelerine ekle" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Spotify yıldızlılarına ekle" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Başka bir çalma listesine ekle" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Yer imlerine ekle" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Çalma listesine ekle" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Kuyruğa ekle" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Kullanıcı/grubu yer imlerine ekle" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "wiimotedev eylemi ekle" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Ekle..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Bu ay eklenenler" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Bu hafta eklenenler" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Bu yıl eklenenler" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Bugün eklenenler" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Son üç ay içinde eklenenler" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Gelişmiş gruplama..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Sonra " #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Kopyalandıktan sonra..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Albüm" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Albüm (tüm parçalar için ideal ses yüksekliği)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Albüm sanatçısı" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Albüm kapağı" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Jamendo.com'daki albüm bilgileri..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Albümler" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Kapak resmine olan albümler" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Kapak resmi olmayan albümler" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Tümü" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Tüm Dosyalar (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "All Glory to the Hypnotoad!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Tüm albümler" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Tüm sanatçılar" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Tüm dosyalar (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Tüm çalma listeleri (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Tüm çevirmenler" #: library/library.cpp:98 msgid "All tracks" msgstr "Tüm parçalar" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Bir istemciye bu bilgisayardan müzik indirmesine izin ver." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "İndirmelere izin ver" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Mid/side kodlamaya izin ver" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Orijinallerin yanına" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Ana pencereyi her zaman gizle" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Ana pencereyi her zaman göster" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Her zaman çalarak başlat" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon Cloud Drive" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Spotify'ın Clementine'de kullanılması için harici bir eklenti gerekmektedir. Şimdi indirmek ve kurulumunu yapmak ister misiniz?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "iTunes veritabanı yüklenirken hata oluştu" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "'%1' dosyasına metadata yazarken hata oluştu" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Belirlenemeyen bir hata oluştu." #: ui/about.cpp:85 msgid "And:" msgstr "Ve:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Öfkeli" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Görünüm" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Çalma listesine dosya/URL ekle" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Şu anki çalma listesine ekle" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Çalma listesine ekle" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Kesintiyi engellemek için sıkıştırma uygula" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "\"%1\" ayarını silmek istediğinizden emin misiniz?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Bu şarkının istatistik bilgisini sıfırlamak istiyor musunuz?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Şarkıların istatistiklerini, kütüphanenizdeki tüm şarkıların kendi dosyalarına yazmak istediğinizden emin misiniz?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Sanatçı" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Sanatçı bilgisi" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Sanatçı etiketleri" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Sanatçının kısaltması" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Kaydederken sor" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Ses biçimi" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Ses çıkışı" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Kimlik doğrulama başarısız" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Yazar" #: ui/about.cpp:68 msgid "Authors" msgstr "Yazarlar" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Otomatik" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Otomatik" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Otomatik güncelleme" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Kütüphane ağacında tek kategori olanları otomatik olarak aç" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Mevcut" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Ortalama bit oranı" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Ortalama resim boyutu" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "BBC Podcastları" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Arkaplan Akışları" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Arkaplan rengi" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Arkaplan resmi" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Artalan saydamlığı" #: core/database.cpp:648 msgid "Backing up database" msgstr "Veritabanını yedekliyor" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Denge" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "Ban (Last.fm skroplama)" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Bar çözümleyici" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Temel Mavi" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Temel ses tipi" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Davranış" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "En iyi" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "%1 sitesinden biyografi" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Bit oranı" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Veri Akış Hızı" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Veri Akış Hızı" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Blok çözümleyici" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Engelleme türü" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Bulanıklık miktarı" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Gövde" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Boom çözümleyici" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Gözat..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Önbellek süresi" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Arabelleğe alınıyor" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Seafile dizini oluşturuluyor..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Ancak şu kaynaklar devre dışı:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Düğmeler" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "CUE desteği" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Önbellek yolu:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Önbellekleme" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "Önbelleklenen %1" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "İptal" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "İndirmeyi iptal et" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Resim doğrulaması gerekli.\nBu sorunu çözmek için Vk.com'da tarayıcınızla oturum açmayı deneyin." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Kapak resmini değiştir" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Yazı boyutunu değiştir..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Tekrar kipin değiştir" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Kısayolu değiştir..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Karıştırma kipini değiştir" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "Şu anda çalınan parçayı değiştir" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Dili değiştir" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Mono çalma ayarını değiştirmek sonraki şarkılarda da etkili olur" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Yeni bölümler için kontrol et" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Güncellemeleri denetle" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Güncellemeleri denetle..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Vk.com önbellek dizinini seç" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Akıllı çalma listesi için isim seçin" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Otomatik seç" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Rengi seç..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Yazı tipi seç..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Listeden seç" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Çalma listesinin nasıl dizildiğini ve kaç şarkı içereceğini seçin." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Podcast indirme dizinini seç" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Göstermek istediğiniz İnternet hizmetlerini seçin." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Şarkı sözü ararken Clementine'in kullanacağı siteleri seçin." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Klasik" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Temizliyor" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Temizle" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Çalma listesini temizle" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Clementine Hatası" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Clementine Turuncu" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Clementine Görselleştirme" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine bu aygıta kopyaladığınız müzikleri, aygıtın çalacağı biçime dönüştürebilir." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Clementine, Amazon Cloud Drive'a yüklediğiniz müziği oynatabilir" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine, Box içerisine yüklediğiniz müziği çalabilir" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine Dropbox'a yüklediğiniz müzikleri oynatabilir" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine Google Drive'a yüklediğiniz müzikleri oynatabilir" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine, OneDrive'a yüklediğiniz müziği oynatabilir" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Parça değiştiğinde Clementine bir ileti gösterebilir." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine, diğer bilgisayarlar ve podcast uygulamaları ile abonelik listesini senkronize edebilirsiniz. bir hesap oluşturun ." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine projectM görsellerini yükleyemedi. Clementine programını düzgün yüklediğinizi kontrol edin." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Clementine resim görüntüleyici" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine bu dosya için sonuç bulamadı" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine müzikleri şurada bulacak:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Parça eklemek için buraya tıklayın" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Bu çalma listesini beğenmek için buraya tıkladığınızda, kenar çubuğundaki \"Çalma Listeleri\" panelinde erişilebilir olacaktır." #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Toplam zaman ve kalan zaman arasında seçim yapmak için tıklayın" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Oturum Aç düğmesini tıklayınca yeni internet sayfası açılır. Oturum açtıktan sonra Clementine'e geri dönmelisiniz" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Kapat" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "oynatma lis" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Görselleştirmeyi kapat" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Bu pencereyi kapatmak indirme işlemini iptal edecektir." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Bu pencereyi kapatmak albüm kapakları için yapılan aramayı durduracaktır." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Kulüp" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Renk" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Virgülle ayrılmış sınıf:seviye listesi, sınıf 0-3 arasında olabilir " #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Yorum" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Topluluk Radyosu" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Etiketleri otomatik tamamla" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Etiketleri otomatik tamamla..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Besteci" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Düzenle %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Magnatune'u Yapılandır..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Kısayolları Yapılandır" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Spotify'ı Yapılandır..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Subsonic'i yapılandır..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Vk.com'u yapılandır..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Genel aramayı düzenle..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Kütüphaneyi düzenle..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Podcastları ayarla..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Yapılandır..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Etkinleştir/devre dışı bırak eylemiyle Wii Kumandalarına bağlan" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Aygıtı bağla" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Spotify'a bağlanılıyor" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Bağlantı sunucu tarafından reddedildi, sunucu adresini denetleyin. Örnek: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Bağlantı zaman aşımına uğradı, sunucu adresini denetleyin. Örnek: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Bağlantı sorunu veya ses sahibi tarafından devre dışı bırakılmış" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Konsol" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Sabit bit oranı" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Tüm müzikleri dönüştür" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Aygıtın çalamadığı müzikleri dönüştür" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Uzağa göndermeden önce kayıpsız ses dosyalarını dönüştür." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Kayıpsız dosyaları dönüştür" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Paylaşım adresini panoya kopyala" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Panoya kopyala" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Aygıta kopyala..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Kütüphaneye kopyala..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Copyright" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Subsonic'e bağlanılamadı, sunucu adresini kontrol edin. Örnek: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "GStreamer elementi \"%1\" oluşturulamadı - tüm Gstreamer eklentilerinin kurulu olduğundan emin olun" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Çalma listesi oluşturulamadı" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "%1 için ayrıştırıcı bulunamadı, gerekli GStreamer eklentilerinin kurulu olup olmadığını kontrol edin" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "%1 için kodlayıcı bulunamadı, gerekli GStreamer eklentilerinin yüklü olup olmadığını kontrol edin" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "%1 çıktı dosyası açılamadı" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Kapak Yöneticisi" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Gömülü resimden kapak resmi" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Kapak resmi %1 adresinden otomatik olarak yüklendi" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Kapak resmi elle çıkarıldı" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Kapak resmi ayarlanmamış" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Kapak resmi %1 adresinden ayarlandı" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "%1 adresindeki kapak resimleri" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Parça değiştirirken otomatik olarak çapraz geçiş yap" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Parça değiştirirken elle çapraz geçiş yap" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Özel" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Özel resim:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Mesaj ayarlarını özelleştir" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Özel..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "DBus yolu" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dans" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Veritabanında bozulma tespit edildi. Lütfen https://code.google.com/p/clementine-player/wiki/DatabaseCorruption adresindeki veritabanınızı nasıl kurtaracağınıza ilişkin talimatları okuyun." #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Oluşturulduğu tarih" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Değiştirildiği tarih" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Gün" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "&Öntanımlı" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Ses seviyesini 4% azalt" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr " oranında sesi azaltın" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Sesi azalt" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Varsayılan arkaplan resmi" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "%1 üzerinde öntanımlı aygıt" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Öntanımlılar" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Görselleştirmeler arasındaki gecikme" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Sil" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "İndirilmiş veriyi sil" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Dosyaları sil" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Aygıttan sil..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Diskten sil..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Çalımış bölümleri sil" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Ayarı sil" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Akıllı çalma listesini silin" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Orijinal dosyaları sil" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Dosyalar siliniyor" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Seçili parçaları kuyruktan çıkar" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Parçayı kuyruktan çıkar" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Hedef" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Detaylar..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Aygıt" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Aygıt Özellikleri" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Aygıt adı" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Aygıt özellikleri..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Aygıtlar" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "İletişim Kutusu" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Bunu mu demek istediniz" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Digitally Imported parolası" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Digitally Imported kullanıcı adı" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Doğrudan internet bağlantısı" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Dizin" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Süreyi devre dışı bırak" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Moodbar oluşturmayı kapat" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Devre Dışı" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Devre Dışı" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Disk" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Kesikli aktarma" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Gösterim seçenekleri" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Ekran görselini göster" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Tüm kütüphaneyi yeniden tara" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Tam bir yeniden tarama yap" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Tam bir yeniden tarama yap..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Hiç bir müziği dönüştürme" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Üzerine yazma" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "Tam bir yeniden tarama yapmak; albüm kapağı, oynatma sayısı ve beğeniler gibi Clementine içerisindeki kayıtlı tüm üst verileri kaybettirecektir. Clementine, zaman alabilecek Google Drive içerisindeki tüm müziğinizi yeniden tarayacak." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Tekrarlama" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Çeşitli sanatçılarda gösterme" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Dinlenen bölümleri gösterme" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Karıştırma" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Durma!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Bağış Yap" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Açmak için çift tıkla" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Bir şarkıyı çift tıklamak..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "%n bölüm indir" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "İndirme dizini" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Bölümleri şuraya indir" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "İndirme üyeliği" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Yeni bölümleri otomatik olarak indir" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Sıradakileri indir" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "İndirme ayarları" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Android uygulamasını indir" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Bu albümü indir" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Bu albümü indirin..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Bu bölümü indir" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "İndir..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "İndiriyor (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Icecast dizini indiriliyor" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Jamendo kataloğu indiriliyor" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Magnatune kataloğu indiriliyor" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Spotify eklentisi indiriliyor" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Üstveri indiriliyor" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Yeniden konumlandırmak için sürükleyin" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dubstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Süre" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Dinamik kip açık" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Dinamik rastgele karışım" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Akıllı çalma listesini düzenleyin" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "\"%1\" etiketini düzenle..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Etiketi düzenle..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Etiketleri düzenle" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Parça bilgisini düzenle" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Parça bilgisini düzenle..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Parça bilgilerini düzenle..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Düzenle..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "E-posta" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Wii kumanda desteğini etkinleştir" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Otomatik önbelleklemeyi etkinleştir" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Ekolayzırı etkinleştir" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Kısayolları sadece Clementine odaktayken etkinleştir" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Tıklama ile şarkı üst veri satır içi sürümünü etkinleştir" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Arama sonuçlarına dahil etmek için aşağıdaki kaynakları aktifleştirin. Sonuçlar bu sırayla gösterilecektir." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Last.fm skroplamayı aç/kapa" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Kodlama karmaşıklığı" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Kodlama motor kalitesi" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Kodlama kipi" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Bir URL gir" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Kapağı Internet'ten indirmek için URL girin:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Dışa aktarılan kapaklar için bir dosya adı girin (uzantı yok):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Bu çalma listesi için yeni bir isim gir" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Bilgisayarınızda ve internette müzik bulmak için yukarıdaki alana arama terimlerinizi girin" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "iTunes Store üzerinde podcastlar bulmak için aşağıya arama terimleri gir" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "gpodder.net üzerinde podcastlar bulmak için aşağıya arama terimleri gir" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Arama terimlerini buraya girin" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Bir internet radyo yayın akışının URL'sini girin" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Klasör ismini girin" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "App Clementine için bağlanmak için IP girin." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Tüm koleksiyon" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Ekolayzır" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "--log-levels *:1'e eşdeğer" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "--log-levels *:3'e eşdeğer" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Hata" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "CD Kopyalanırken Hata" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "MTP aygıtına bağlanırken hata" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Şarkılar kopyalanırken hata" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Şarkılar silinirken hata" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Spotify eklentisini indirirken hata" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "%1 yüklenirken hata" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "di.fm çalma listesi yüklenirken hata oluştu" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "%1 işlenirken hata: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Ses CD'si yüklenirken hata" #: library/library.cpp:68 msgid "Ever played" msgstr "Önceden çalınmış" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Her 10 dakikada" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Her 12 saatte" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Her 2 saatte" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Her 20 dakikada" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Her 30 dakikada" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Her 6 saatte" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Her saat" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Aynı albümde veya aynı CUE dosyasında bulunan parçalar hariç" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Mevcut kapaklar" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Genişlet" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Bitiş tarihi %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Kapakları Aktar" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Kapakları aktar" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "İndirilen kapakları aktar" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Gömülü kapakları aktar" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Biteni aktar" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "%2 kapağın %1 tanesi aktarıldı (%3 atlandı)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Bekletmede sesi yavaşça kıs / devam ettiğinde aç" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Bir parça durdurulurken yumuşak geç" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Yumuşak geçiş" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Yumuşak geçiş süresi" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "CD sürücünü okuma başarısız" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Dizin getirme başarısız oldu" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Podcastların indirilmesi başarısız oldu" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Podcastların yüklenmesi başarısız oldu" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Bu RSS beslemesinin XML ayıklaması başarısız oldu" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Hızlı" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Beğenilen parçalar" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Eksik Albüm Kapaklarını İndir" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Otomatik indir" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Alım tamamlandı" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Subsonic kütüphanesi eşleştiriliyor" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Kapak alınırken bir hata oluştu" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Dosya Biçimi" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Dosya uzantısı" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Dosya biçimleri" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Dosya adı" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Dosya adı (yol hariç)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Dosya adı deseni:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Dosya yolları" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Dosya boyutu" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Dosya türü" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Dosya adı" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Dosyalar" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Dönüştürülecek dosyalar" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Kütüphanenizde belirttiğiniz kriterlerle eşleşen şarkıları bulun." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Bu sanatçıyı bul" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Şarkının parmak izi çıkartılıyor" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Bitir" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "İlk Seviye" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Kapağı genişliğe sığdır" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Yazı tipi boyutu" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Lisans sebepleri dolayısıyla Spotify desteği ayrı bir eklentidir." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Mono kodlamaya zorla" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Aygıtı unut" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Bir aygıtı unuttuğunuzda listeden silinecek ve bu aygıtı tekrar bağladığızda, Clementine tüm şarkıları tekrar taramak zorunda kalacak." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Biçim" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Biçim" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Kare oranı" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Tampon başına kare" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Soğuk" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Full Bass" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Full Bass + Tiz" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Yüksek tiz" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Genel" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Genel ayarlar" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Tür" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Bu Spotify şarkısını paylaşmak için URL al" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Bu çalma listesini paylaşmak için URL al" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Kanallar alınıyor" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Akışlar alınıyor" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Bir isim verin:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Git" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Sıradaki listeye git" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Önceki listeye git" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "%2 kapaktan %1 tanesi alındı (%3 tanesi başarısız)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Çalma listemde olmayan şarkıları gri göster" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Kütüpheneyi şuna göre grupla..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Grupla" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Albüme göre grupla" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Sanatçıya göre grupla" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Sanatçı/Albüme göre grupla" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Sanatçı/Yıl - Albüme göre grupla" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Tür/Albüme göre grupla" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Tür/Sanatçı/Albüme göre grupla" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Gruplandırma" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "HTML sayfası herhangi bir RSS beslemesi içermiyor" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "HTTP 3xx durum kodu adressiz alındı, sunucu yapılandırmasını doğrulayın." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "HTTP vekil sunucu" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Mutlu" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Donanım bilgisi" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Donanım bilgisine sadece aygıt bağlıyken erişilebilir." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Yüksek" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Yüksek (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Yüksek (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "HipHop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Sunucu bulunamadı, sunucu adresini denetleyin. Örnek: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Saat" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Magnatune hesabım yok" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Simge" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Üstteki simgeler" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Şarkı teşhis ediliyor" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Etkinleştirildiğinde, çalma listesi içerisinde bir şarkı seçmek doğrudan etiket değerini düzenlemenizi sağlayacak" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Devam ederseniz, aygıt yavaş çalışacak ve kopyaladığınız şarkılar düzgün çalışmayacak." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Eğer bir podcast'ın URL adresini biliyorsanız, aşağıya yazın ve Git'e basın." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Sanatçı isimlerinde \"The\" kelimesini önemseme" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Resimler (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Resimler (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "İçe aktar..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "%1 günde" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "%1 haftada" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "Dinamik kipte yeni şarkılar seçilerek, her şarkı bittiğinde çalma listesine eklenecektir." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Gelen Kutusu" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Bildirimde albüm resimlendirmesini göster" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Tüm şarkıları içer" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Uyumsuz Subsonic REST protokol sürümü. İstemci yükseltilmeli." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Uyumsuz Subsonic REST protokol sürümü. Sunucu yükseltilmeli." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Tamamlanmamış yapılandırma, lütfen tüm alanların dolduğundan emin olun" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Ses seviyesini 4% arttır" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr " oranında sesi artırın" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Sesi arttır" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "%1 İndekslendi" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Bilgi" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Girdi seçenekleri" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Ekle..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Kuruldu" #: core/database.cpp:585 msgid "Integrity check" msgstr "Bütünlük doğrulaması" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "İnternet sağlayıcılar" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "İnternet hizmetleri" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "Giriş parçaları" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Geçersiz API anahtarı" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Geçersiz biçim" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Geçersiz metod" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Geçersiz parametreler" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Geçersiz kaynak belirtildi" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Geçersiz servis" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Geçersiz oturum anahtarı" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Seçimi Tersine Çevir" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Jamendo En Çok Dinlenen Parçalar" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Jamendo Zirvedeki Parçalar" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo Ayın Zirvedeki Parçaları" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo Haftanın Zirvedeki Parçaları" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Jamendo veritabanı" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Hemen bir önceki şarkıya gidecek" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Şu anda çalınan parçaya atla" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Düğmeleri %1 saniye tut..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Düğmeleri %1 saniye tut..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Pencere kapandığında arkaplanda çalışmaya devam et" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Orijinal dosyaları sakla" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Kedicikler" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Dil" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Dizüstü/Kulaklık" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Geniş Salon" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Geniş albüm kapağı" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Büyük albüm kapağı (ayrıntılar aşağıda)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Büyük albüm kapağı (ayrıntı yok)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Büyük kenar çubuğu" #: library/library.cpp:80 msgid "Last played" msgstr "Son çalınan" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Son çalınan" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm şu anda meşgul, lütfen birkaç dakika içinde tekrar deneyin" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Last.fm parolası" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Last.fm çalma sayısı" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Last.fm etiketleri" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Last.fm kullanıcı adı" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Az beğenilen parçalar" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "So" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Süre" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Kütüphane" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Kütüphane gelişmiş gruplama" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Kütüphane yeniden tarama bildirisi" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Kütüphane araması" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Limitler" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Canlı" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Yükle" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Bağlantıdan kapak al" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Kapağı bu URL'den yükle..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Diskten kapak yükle" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Albüm kapağını diskten yükle..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Çalma listesini yükle" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Çalma listesi yükle..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "MTP aygıtı yükleniyor" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "iPod veritabanı yükleniyor" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Akıllı çalma listesi yükleniyor" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Şarkılar yükleniyor" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Yayın akışı yükleniyor" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Parçalar yükleniyor" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Parça bilgileri yükleniyor" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Yükleniyor..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Dosyaları/URLleri yükler, mevcut çalma listesinin yerine koyar" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Oturum aç" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Giriş başarısız oldu." #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Oturumu Kapat" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Long term prediction profile (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Beğen" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "Love (Last.fm skroplama)" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Düşük (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Düşük (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Düşük karmaşıklık profili (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Şarkı sözleri" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "%1 sitesinden şarkı sözleri" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "ID3v2 etiketinden sözler" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Magnatune İndir" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Magnatune indirme bitti" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Ana profil (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Yap gitsin!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Yap gitsin!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Çalma listesini çevrim dışındayken kullanılabilir yap" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Bozuk yanıt" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Elle vekil sunucu yapılandırma" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "El ile" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Üretici" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Dinlenmiş olarak işaretle" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Yeni olarak işaretle" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Her arama terimiyle eşleştir (VE)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Bir veya daha fazla arama terimiyle eşleştir (VEYA)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "En fazla genel arama sonucu" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Maksimum bit oranı" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Ortam değişti. Yeniden yükleniyor" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Orta (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Orta (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Üyelik türü" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Minimum bit oranı" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Asgari tampon doldurma" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Eksik projectM ayarları" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Kütüphanede olacak değişiklikleri izle" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Tekli oynat" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Ay" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Atmosfer" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Atmosfer çubuğu tasarımı" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Atmosfer çubukları" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Daha fazla" #: library/library.cpp:84 msgid "Most played" msgstr "En fazla çalınan" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Bağlama noktası" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Bağlama noktaları" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Aşağı taşı" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Kütüphaneye taşı..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Yukarı taşı" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Müzik" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Müzik Kütüphanesi" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Sessiz" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Albümlerim" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Müziğim" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Önerdiklerim" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "İsim" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "İsim" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "İsimlendirme seçenekleri" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Dar band (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Vekil Sunucu" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Ağ Denetimi" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Hiçbir zaman" #: library/library.cpp:74 msgid "Never played" msgstr "Hiç çalınmamış" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Asla çalarak başlama" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Yeni klasör" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Yeni çalma listesi" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Yeni akıllı çalma listesi..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Yeni şarkılar" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Yeni parçalar otomatik olarak eklenecektir." #: library/library.cpp:92 msgid "Newest tracks" msgstr "En yeni parçalar" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "İleri" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Sonraki parça" #: core/utilities.cpp:151 msgid "Next week" msgstr "Gelecek hafta" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Çözümleyici yok" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Arkaplan resmi yok" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Aktarılacak kapak yok." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Uzun blok yok" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Eşleşen bulunmadı. Çalma listesini tekrar görmek için arama çubuğunu temizleyin." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Kısa blok yok" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Hiçbiri" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Seçili şarkıların hiçbiri aygıta yüklemeye uygun değil" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Normal" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Normal blok tipi" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Dinamik şarkı listesi kullanırken geçerli değil" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Bağlı Değil" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Yeterli içerik yok" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Yeterli hayran yok" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Yeterli üye yok" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Yeterli komşu yok" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Kurulu değil" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Giriş yapmadınız" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Bağlı değil - bağlamak için çift tıklayın" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Hiçbir şey bulunamadı" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Bildirim türü" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Bildirimler" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Şimdi Çalıyor" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Gösterilecek bölüm sayısı" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "OSD Önizleme" #: widgets/osd.cpp:173 msgid "Off" msgstr "Kapalı" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "Açık" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Sadece bu IP aralıklarındaki istemcilerden bağlantı kabul et:\\n 10.x.x.x\\n 172.16.0.0 - 172.31.255.255\\n 192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Sadece yerel ağdan bağlantılara izin ver" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Sadece ilki göster" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Opaklık" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Tarayıcıda aç: %1" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "&Ses CD'si aç..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "OPML dosyası aç" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "OPML dosyasını aç..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Müziğin içe aktarılacağı bir dizin aç" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Aygıtı aç" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Dosya aç..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Google Drive'da aç" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Yeni çalma listesinde aç" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Yeni çalma listesinde aç" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Tarayıcınızda açın" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Aç..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "İşlem başarısız" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Bit oranı için eniyileştir" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Kalite için eniyileştir" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Seçenekler..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Dosyaları Düzenle" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Dosyaları düzenle..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Dosyalar düzenleniyor" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Özgün etiketler" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "Çıkış Yılı" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Diğer seçenekler" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Çıktı" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Çıktı aygıtı" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Çıktı seçenekleri" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Tümünün üzerine yaz" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Mevcut dosyaların üzerine yaz" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Sadece daha küçük olanların üzerine yaz" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Sahibi" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Jamendo kataloğu ayrıştırılıyor" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Parti" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Parola" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Duraklat" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Beklet" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Duraklatıldı" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Sanatçı" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Piksel" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Düz kenar çubuğu" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Çal" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Çalma sayısı" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Duraklatılmışsa çal, çalıyorsa beklet" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Çalan bir şey yoksa çal" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Listedeki numaralı parçayı çal" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Çal/Duraklat" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Oynat" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Oynatıcı seçenekleri" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Çalma Listesi" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Parça listesi tamamlandı" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Çalma listesi seçenekleri" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Çalma listesi türü" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Çalma listeleri" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Lütfen tarayıcınızı kapatıp Clementine'e geri dönün." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Eklenti durumu:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcastlar" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Açılır pencere süresi" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Ön yükseltici" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Tercih" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Tercihler" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Tercihler..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Tercih edilen albüm kapağı dosya adları (virgülle ayırın)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Tercih edilen ses biçimleri" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Tercih edilen bit oranı" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Tercih edilen biçim" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Premium ses tipi" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Ayar:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Kullanmak için bir tuş kombinasyonuna basın" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Bir tuşa basın" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "%1 için kullanmak için bir tuş kombinasyonun basın..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Oynatıcıda \"Önceki\" düğmesine basmak..." #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "OSD seçenekleri" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Önizleme" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Önceki" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Önceki parça" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Sürüm bilgisini bastır" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "İlerleme" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "İlerleme" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Psikodelik" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Wiiremote düğmesine basın" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Şarkıları rastgele sırala" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Kalite" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Kalite" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Aygıt sorgulanıyor..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Kuyruk Yöneticisi" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Seçili parçaları kuyruğa ekle" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Parçayı kuyruğa ekle" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Radyo (tüm parçalar için eşit ses seviyesi)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Yağmur" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Yağmur" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Karışık görseller" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Geçerli şarkıyı 0 yıldızla oyla" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Geçerli şarkıyı 1 yıldızla oyla" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Geçerli şarkıyı 2 yıldızla oyla" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Geçerli şarkıyı 3 yıldızla oyla" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Geçerli şarkıyı 4 yıldızla oyla" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Geçerli şarkıyı 5 yıldızla oyla" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Beğeni" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Gerçekten iptal edeyim mi?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Yönlendirme limiti aşıldı, sunucu yapılandırmasını doğrulayın." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Kataloğu yenile" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Kanalları yenile" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "İstasyon listesini yenile" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Akışları yenile" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Bağıl" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Wii kumanda sallamayı hatırla" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Son seferkinden hatırla" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Seçimimi hatırla" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Kaldır" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Eylemi kaldır" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Şarkı listesindeki çiftleri birleştir" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Klasörü kaldır..." #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Müziklerimden sil" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Yer imlerinden kaldır" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Çalma listesinden kaldır" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Çalma listesini kaldır" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Çalma listesini kaldır" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Şarkı listesindeki kullanılamayan parçaları kaldır" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Çalma listesini yeniden adlandır" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Çalma listesini yeniden adlandır..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Parçaları bu sırada hatırla..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Tekrarla" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Albümü tekrarla" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Çalma listesini tekrarla" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Parçayı tekrarla" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Şu anki çalma listesinin yerine geç" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Çalma listesinin yerine geç" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Boşlukları alt çizgiyle değiştirir" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Yeniden Oynatma Kazanç kipi" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Yeniden doldur" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Doğrulama kodu iste" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Sıfırla" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Çalma sayısını sıfırla" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Şarkıyı yeniden başlatacak, ardından tekrar basılırsa öncekine gidecek" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Eğer başlangıçtan en fazla 8 saniye geçmişse parçayı yeniden başlat veya önceki parçayı çal." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "ASCII karakterler olarak kısıtla" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Başlarken çalmaya devam et" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Clementine'e Geri Dön" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Sağ" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Dönüştür" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "CD Dönüştür" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Ses CD'si dönüştür" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Çalıştır" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "SOCKS vekil sunucu" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "SSL anlaşma hatası, sunucu yapılandırmasını doğrulayın. SSLv3 seçeneği bazı durumlarda sorunu çözebilir." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Aygıtı güvenli kaldır" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Kopyalama işleminden sonra aygıtı güvenli kaldır" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Örnekleme oranı" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Örneklemeoranı" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr ".mood dosyalarını müzik kütüphaneme kaydet" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Kapağı kaydet" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Kapağı diske kaydet..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Görüntüyü kaydet" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Çalma listesini kaydet" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Çalma listesini kaydet" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Çalma listesini kaydet..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Ayarı kaydet" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Mümkün olduğunda beğenileri dosya etiketlerine kaydet" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Mümkün olduğunda istatistikleri dosya etiketlerine kaydet" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Bu akışı Internet sekmesine kaydet" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Şarkı istatistikleri şarkı dosyalarına kaydediliyor" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Parçalar kaydediliyor" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Ölçeklenebilir örnekleme oranı profili (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "ÖLçek boyutu" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Puan" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Dinlediğim parçaları skropla" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Ara" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Ara" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Icecast istasyonları ara" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Jamendo'da ara" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Magnatune'da Ara" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Subsonic'de Ara" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Otomatik ara" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Albüm kapaklarını ara..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Herhangi bir şey ara" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "gpodder.net'i ara" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "iTunes'u ara" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Arama kipi" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Arama seçenekleri" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Arama sonuçları" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Arama terimleri" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "İkinci seviye" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Geriye doğru ara" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "İleri doğru ara" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Çalan parçayı görece miktara göre ara" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Çalan parçayı kesin bir konuma göre ara" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Tümünü Seç" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Hiçbirini Seçme" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Arkaplan rengini seçin:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Arkaplan resmini seçin" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "En uygun eşleşmeyi seç" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Ön plan rengi seçin:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Görsel seç" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Görselleştirmeleri seç..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Seç..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Seri numarası" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Sunucu" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "Sunucu URL'si" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Sunucu ayrıntıları" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Hizmet çevrim dışı" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "%1'i \"%2\" olarak ayarla" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Ses seviyesini yüzde yap" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Seçili tüm parçalar için değeri ayarla..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Ayarlar" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Kısayol" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "%1 için kısayol" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "%1 için kısayol zaten tanımlı" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Göster" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "OSD göster" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Mevcut parçada parlayan bir animasyon göster" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Parça ilerleme çubuğunda bir atmosfer çubuğu göster." #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Masaüstü bildirimi göster" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Tekrarla/Karıştır kipini değiştirdiğimde bir bildirim göster" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Ses düzeyini değiştirdiğimde bir bildirim göster" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Oynatmayı duraklattığımda bir bildirim göster" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Sistem tepsisinden bir açılır pencere göster" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Şirin bir OSD göster" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Durum çubuğunun üzerinde göster" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Tüm şarkıları göster" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Tüm şarkıları göster" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Kapak resmini kütüphanede göster" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Ayırıcıları göster" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Tam boyutta göster" #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Genel arama sonuçlarında grupları göster" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Dosya gözatıcısında göster..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Kütüphanede göster..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Çeşitli sanatçılarda göster" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Atmosfer çubuğunu göster" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Sadece aynı olanları göster" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Sadece etiketi olmayanları göster" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Sayfanızda oynatılan parçayı göster" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Arama önerilerini göster" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "\"Beğen\" düğmesini göster" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Ana pencerede skroplama düğmesini göster" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Sistem çekmecesi simgesini göster" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Hangi kaynakların aktif ya da devre dışı olduğunu göster" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Göster/Gizle" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Karışık" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Albümleri karıştır" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Hepsini karıştır" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Çalma listesini karıştır" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Bu albümdeki şarkıları karıştır" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Giriş yap" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Çıkış yap" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Oturum açılıyor..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Benzer sanatçılar" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Boyut" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Boyut:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Parça listesinde geri git" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Atlama sayısı" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Parça listesinde ileri git" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Seçili parçaları atla" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Parçayı atla" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Küçük albüm kapağı" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Küçük kenar çubuğu" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Akıllı çalma listesi" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Akıllı çalma listeleri" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Hafif" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Hafif Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Şarkı Bilgisi" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Şarkı bilgisi" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Üzgünüm" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Türe göre sırala (alfabetik)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Türe göre sırala (popülarite)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "İstasyon adına göre sırala" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Şarkıları şuna göre diz" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Dizim" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Kaynak" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Kaynaklar" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Spotify giriş hatası" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "Spotify çalma listesi adresi" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Spotify eklentisi" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Spotify eklentisi kurulu değil" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "Spotify şarkı adresi" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Standart" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Yıldızlı" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Dönüştürmeyi başlat" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Çalma listesini mevcut çalınanla başlat" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Dönüştürmeye başla" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Arama sonucunu görmek için arama kutusuna bir şeyler yazmaya başlayın." #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "%1 Başlatılıyor" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Başlatılıyor..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Durdur" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Şundan sonra durdur" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Her parçadan sonra dur" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Her parçadan sonra dur" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Bu parçadan sonra durdur" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Duraklat" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Bu parçadan sonra durdur" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Şu parçadan sonra çalmayı durdur: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Durduruldu" #: core/song.cpp:431 msgid "Stream" msgstr "Akış" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Bir Subsonik sunucudan Stream 30 günlük deneme süresinden sonra geçerli bir sunucu lisansı gerektirir." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Yayın akış üyeliği" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Aboneler" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Başarılı!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "%1 başarıyla yazıldı" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Önerilen etiketler" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Özet" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Süper yüksek (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Çok yüksek çözünürlük (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Desteklenen biçimler" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "İstatistikleri dosyalara şimdi eşleştir" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Spotify gelen kutusu eşleniyor" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Spotify çalma listesi eşleniyor" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Spotify yıldızlı şarkılar eşleniyor" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Sistem renkleri" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Üstteki sekmeler" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Etiket getirici" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Hedeflenen bit oranı" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Tekno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Metin seçenekleri" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Teşekkürler" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "\"%1\" komutu başlatılamadı." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Şu anda çalan şarkının albüm kapağı" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "%1 dizini geçersiz" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "İkinci değer ilk değerden büyük olmak zorunda!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "İstediğiniz site mevcut değil!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "İstediğiniz site bir resim değil!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Subsonic sunucusunun deneme süresi bitti. Lisans anahtarı almak için lütfen bağış yapın. Ayrıntılar için subsonic.org'u ziyaret edin." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Güncellediğiniz Clementine sürümü, aşağıda listelenen yeni özellikler nedeniyle kütüphanenizin baştan taranmasını gerektiriyor:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Bu albümde başka şarkılar da var" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "gpodder.net ile iletişimde bir sorun oluştu." #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Magnatude servisinden veri alınırken hata oluştu" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "iTunes Store'dan gelen yanıtı ayıklamada bir sorun oluştu" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Bazı şarkılar kopyalanırken hata oluştu. Şu dosyalar kopyalanamadı:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Bazı şarkılar silinirken hata oluştu. Şu dosyalar silinemedi:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Bu dosyalar aygıttan silinecek, devam etmek istiyor musunuz?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Bu dosyalar diskten kalıcı olarak silinecek, devam etmek istiyor musunuz?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Bu klasörler, kütüphaneyi oluşturacak müzikler için taranacak" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Bu seçenekler \"Müzik Dönüştür\" penceresinde ve aygıta müzik kopyalamadan önce dönüştürme işleminde kullanılır." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Üçüncü seviye" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Bu eylem 150 MB kadar büyüklükte olabilecek bir veri tabanı oluşturacak.\nYine de devam etmek istiyor musunuz?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Bu albüm istenilen biçimde mevcut değil" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Bu daha sonra tercihlerden değiştirilebilir" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Bu aygıt Clementine başlamadan önce bağlanmalı ve açılmalıdır aksi takdirde hangi dosya biçimleri desteklendiği algılanamaz." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Bu aygıt aşağıdaki dosya biçimlerini destekler:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Bu aygıt düzgün çalışmayacak" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Bu bir MTP aygıtı fakat Clementine libmtp desteği olmadan derlenmiş." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Bu bir iPod fakat Clementine libgpod desteği olmadan derlenmiş." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Bu aygıtı ilk defa bağlıyorsunuz. Clementine müzik dosyalarını bulmak için aygıtı tarayacak - bu işlem biraz zaman alabilir." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Bu seçenek \"Davranış\" tercihlerinden değiştirilebilir" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Bu yayın sadece abone olan kullanıcılar içindir" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Bu tür bir aygıt desteklenmiyor: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Başlık" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Bugün" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Şirin OSD'yi Aç/Kapa" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Tam ekran göster/gizle" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Kuyruk durumunu göster/gizle" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Skroplamayı aç/kapa" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Şirin OSD görünürlüğünü aç/kapa" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Yarın" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Çok fazla yeniden yönlendirme" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "En çok dinlenen parçalar" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Toplam albüm:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Aktarılan toplam bayt" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Yapılmış toplam ağ istemi" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Parça" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Parçalar" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Müzik Dönüştür" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Dönüştürücü Kaydı" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Kod çevrimi" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "%1 adet dosya %2 adet thread ile dönüştürülüyor" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Kod çevrimi seçenekleri" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Türbin" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Kapat" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL(ler)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Engin frekans bandı (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Bağlanılamadı" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "%1 indirilemedi (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Bilinmeyen" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Bilinmeyen içerik türü" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Bilinmeyen hata" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Albüm kapağını çıkar" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Seçili parçaları atlama" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Parçayı atlama" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Abonelikten çık" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Yaklaşan Konserler" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Güncelle" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Bütün podcastları güncelle" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Değişen kütüphane klasörlerini güncelle" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Clementine başladığında kütüphaneyi güncelle" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Bu podcast'ı güncelle" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Güncelliyor" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "%1 Güncelleniyor" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "%1% Güncelleniyor..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Kütüphane güncelleniyor" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Kullanım" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Varsa Albüm sanatçısı etiketini kullan" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Gnome kısayol tuşlarını kullan" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Varsa Replay Gain verisini kullan" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "SSLv3 kullan" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Wii kumandasını kullan" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Özel bir renk düzeni kullan" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Bildirimler için özel bir mesaj kullan" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Bir ağ uzak denetimi kullan" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Kimlik denetimi kullan" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Bi oranı kontrolü yönetimini kullan" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Dinamik kip kullan" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Wii kumanda durumunu raporlamak için bildirimleri kullan" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Temporal noise shaping kullan" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Sistem öntanımlısını kullan" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Varsayılan sistem renk düzenini kullan" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Sistem vekil sunucu ayarlarını kullan" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Ses normalleştirme kullan" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Kullanılan" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Kullanıcı arayüzü" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Kullanıcı Adı" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Menü kullanarak şarkı eklemek..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Değişken bit oranı" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Çeşitli sanatçılar" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Sürüm %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Görünüm" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Görüntüleme kipi" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Görseller" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Görüntüleme Ayarları" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Ses aktivitesi algılama" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Ses %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Duvar" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Bir çalma listesi sekmesini kapatırken beni uyar" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "İnternet sitesi" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Haftalar" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Clementine başladığında" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Clementine albüm kapağı ararken ilk önce dosya adında şu kelimelerden birini içeren resim dosyasına bakacak.\nEğer eşleşen bir dosya bulamazsa, bulunduğu dizindeki en büyük resmi kullanacak." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "Bir çalma listesi kaydederken, yollar şöyle olmalı" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Liste boş olduğunda..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Neden denemeyelim..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Geniş Bant (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Kumanda %1: etkin" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Kumanda %1: bağlandı" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Kumanda %1: kritik pil seviyesi (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Kumanda %1: etkin değil" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Kumanda %1: çıkarıldı" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Kumanda %1: düşük pil seviyesi (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Medya 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Medya 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Kapak resmi olmayan:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Bu albümdeki diğer şarkıları da Çeşitli Sanatçılar'a taşımak ister misiniz?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Şu anda tam bir yeniden tarama çalıştırmak ister misiniz?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Tüm şarkı istatistiklerini şarkı dosyalarına yaz" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Üstveriyi yaz" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Yanlış kullanıcı adı veya parola." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Yıl" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Yıl - Albüm" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Yıl" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Dün" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Aşağıdaki albümleri indirmek üzeresiniz" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Beğenilenlerinizden %1 oynatma listesini kaldırmak üzeresiniz. Emin misiniz?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Beğenilen çalma listelerinizin bir parçası olmayan bir çalma listesini kaldırmak üzeresiniz: çalma listesi silinecektir (bu işlem geri alınamaz).\nDevam etmek istediğinizden emin misiniz?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Oturum açmadınız." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "%1 olarak oturum açtınız." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Oturum açtınız." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Kütüphanedeki parçalarını farklı şekilde organize edebilirsiniz." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Hesabınız olmadan ücretsiz dinleyebilirsiniz fakat Premium üyeler reklamsız ve daha yüksek kalitedeki akışları dinleyebilir." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Bir hesabınız olmadan ücretsiz olarak Magnatude'dan şarkı dinleyebilirsiniz. Üyelik alırsanız her şarkının sonunda görünen bu mesajı kaldırabilirsiniz." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Arkaplan akışlarını diğer müzikler gibi aynı anda dinleyebilirsiniz." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Wii kumandanızı kullanarak Clementine'ı uzaktan kumanda edebilirsiniz. Daha fazla bilgi için Clementine wikideki ilgili sayfayı ziyaret edin.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Spotify Premium hesabınız yok." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Aktif bir aboneliğiniz yok" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "SoundCloud üzerinde arama yapmak ve müzik dinlemek için oturum açmanız gerekmiyor. Ancak oynatma listenize veya akışlarınıza ulaşabilmeniz için oturum açmanız gerekli." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Spotify servisinden çıktınız, lütfen Ayarlar ekranında parolanızı yeniden girin." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Spotify servisinden çıktınız, lütfen parolanızı yeniden girin." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Bu şarkıyı seviyorsunuz" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "Clementine'da genel kısayolları kullanabilmek için Sistem Tercihleri'ne girmeli ve \"bilgisayarı denetleme\"si için etkinleştirmelisiniz.." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Dili değiştirdiyseniz programı yeniden başlatmanız gerekmektedir." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "IP adresiniz:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Last.fm giriş bilgileriniz doğru değil" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Magnatune kimlik bilgileriniz hatalı" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Kütüphaneniz boş!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Radyo yayın akışlarınız" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Skroplarınız: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Sisteminizde OpenGL desteği yok, görselleştirmeler çalışmayacak." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Kullanıcı adı veya parolanız yanlış." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Sıfır" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "%n şarkıyı ekle" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "sonra" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "önce" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "ve" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "otomatik" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "önce" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "arasında" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "ilk önce en büyüğü" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "şunu içeriyor" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "devre dışı" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "disk %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "şunu içermiyor" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "şununla bitiyor" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "eşittir" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "gpodder.net dizini" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "büyüktür" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "iPod'lar ve USB aygıtları şimdilik Windows'ta çalışmıyor. Üzgünüz!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "Sonuncu" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "küçüktür" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "ilk önce en uzunu" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "%n şarkıyı taşı" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "ilk önce en yenisi" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "eşit değiller" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "şu süreden beri değil:" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "değil" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "ilk önce en eskisi" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "açık" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "seçenekler" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "veya QR kodunu tara!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "enter'a basın" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "%n şarkıyı kaldır" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "ilk önce en kısası" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "Parçaları karıştır" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "ilk önce en küçüğü" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "şarkıları sırala" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "şununla başlıyor" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "durdur" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "parça %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/tr_TR.po000066400000000000000000004040321260417502300242740ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Ahmet Sezgin Duran , 2013 # Mustafa YILMAZ , 2013 # arnaudbienner , 2011 # devingregory , 2012 # devingregory , 2012 # Emre FIRAT , 2013 # Erhan BURHAN <>, 2012 # H. İbrahim Güngör , 2011 # H. İbrahim Güngör , 2010 # H. İbrahim Güngör , 2011 # Irfan YAZICI , 2011 # Kadir Celep , 2012 # Ege Öz , 2013 # mutlucan96 , 2013 # Muhammet Kara , 2012 # Murat Ikilik <>, 2012 # Murat Sahin , 2012 # Necdet Yücel , 2012 # Faruk Uzun , 2012 # Volkan Gezer , 2013 # Volkan Gezer , 2014 # yusufbesir1 , 2012 # zeugma , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Turkish (Turkey) (http://www.transifex.com/davidsansome/clementine/language/tr_TR/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr_TR\n" "Plural-Forms: nplurals=1; plural=0;\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr "" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "" #: core/utilities.cpp:119 msgid "1 day" msgstr "" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "" #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "" #: core/song.cpp:422 msgid "AIFF" msgstr "" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "" #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "" #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "" #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "" #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "" #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "" #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "" #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:80 msgid "All the translators" msgstr "" #: library/library.cpp:98 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:85 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "" #: ui/about.cpp:68 msgid "Authors" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "" #: core/database.cpp:648 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "" #: core/song.cpp:428 msgid "CDDA" msgstr "" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "" #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:114 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "" #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "" #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "" #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "" #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "" #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:68 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:585 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "" #: library/library.cpp:80 msgid "Last played" msgstr "" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: ui/equalizer.cpp:137 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "" #: core/song.cpp:410 msgid "MPC" msgstr "" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "" #: library/library.cpp:74 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:92 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "" #: core/utilities.cpp:151 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "" #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "" #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "" #: core/organise.cpp:73 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:139 msgid "Party" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "" #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "" #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "" #: core/song.cpp:431 msgid "Stream" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "" #: ui/about.cpp:74 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "" #: core/song.cpp:426 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "" #: devices/giolister.cpp:157 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/uk.po000066400000000000000000006073431260417502300236730ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # FIRST AUTHOR , 2010 # Sergii Galashyn , 2011-2012 # Yuri Chornoivan , 2011-2015 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Ukrainian (http://www.transifex.com/davidsansome/clementine/language/uk/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uk\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\nЗробити список відтворення улюбленим можна натисканням піктограми із зіркою, розташованої поряд з пунктом з назвою списку\n\nУлюблені списки відтворення буде збережено тут" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " днів" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " кб/с" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " мс" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " тчк" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "с" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " секунд" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " композицій" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 композицій)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 альбом(ів)" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 д." #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 день тому" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 на %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 списків відтворення (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "обрано %1 з" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 композиція" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 пісень" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "Знайдено %1 пісень" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "Знайдено %1 пісень (показано %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 доріжок" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 передано" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Модуль Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 інших слухачів" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 відтворень в цілому" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n з помилкою" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n завершено" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n залишилось" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Вирівняти текст" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "По &центру" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Нетипово" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "Додатково" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Довідка" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "Приховати %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "Приховати…" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Ліворуч" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "Музика" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Немає" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "Список відтворення" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "Ви&йти" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "Режим повтору" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Праворуч" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Режим перемішування" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "Розтягнути стовпчики відповідно вмісту вікна" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Інструменти" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(відрізняється поміж багатьма піснями)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", " #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "…та всім розробникам Amarok" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0 т." #: core/utilities.cpp:119 msgid "1 day" msgstr "1 день" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 доріжка" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192000 Гц" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44100 Гц" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48000 Гц" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 випадкових доріжок" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96000 Гц" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Оновитися до Premium зараз" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Якщо цей пункт не позначено, Clementine намагатиметься зберігати дані щодо оцінок та інші статистичні дані у окремій базі даних і не вноситиме змін до ваших файлів.

Якщо пункт позначено, програма зберігатиме статистичні дані у базі даних та безпосередньо у файлі, щойно буде виявлено зміни у даних.

Будь ласка, зауважте, що збереження даних можливе не для всіх форматів файлів. Крім того, не існує стандартів зберігання подібних даних, тому може так статися, що інші програвачі не зможуть прочитати ці дані.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

Вкажіть перед словом назву поля, щоб обмежити пошук вмістом вказаного поля. Приклад: artist:Руслана призведе до пошуку у бібліотеці усіх виконавців, записи назв яких містять слово «Руслана».

Передбачено доступ до таких полів: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

За допомогою цього пункту можна наказати програмі записувати для всіх композицій у вашій бібліотеці оцінки та статистичні дані щодо композицій до міток у файлі.

Потреби у використанні цього пункту немає, якщо постійно позначено пункт «Зберігати дані щодо оцінки та статистичні дані у мітках файлів».

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Мітки починаються з %, наприклад: %artist %album %title

\n\n

Якщо ви берете частину тексту з міткою у фігурні дужки, ця частина буде приховуватись, якщо мітка порожня.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Потрібен обліковий запис Spotify Premium." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Клієнтське з’єднання стане можливим лише після введення належного коду." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "«Розумний» список відтворення — це динамічний список композицій з вашої фонотеки. Існують різні типи таких списків з різними способами вибору композицій." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Пісню буде включено до списку відтворення якщо вона відповідає наступним умовам." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC, 128 кб" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC, 32 кб" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC, 64 кб" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ВСЯ СЛАВА ГІПНОЖАБІ" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Перервати" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Про %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Про Clementine…" #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Про Qt…" #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "Абсолютними" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Параметри облікового запису" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Параметри облікового запису (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Дія" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "Дія" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Активувати/деактивувати Wiiremote" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "Потік дій" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Додати подкаст" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Додати потік" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Додати новий рядок, якщо підтримується типом сповіщення" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Додати дію" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "Додати усі композиції з каталогу та усіх його підкаталогів" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Додати інший потік…" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Додати теку…" #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Додати файл" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Додати файл для перекодування" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Додати файли для перекодування" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Додати файл…" #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Додати файли для перекодування" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Додати теку" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Додати теку…" #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Додати нову теку…" #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Додати подкаст" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Додати подкаст..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Додати критерій пошуку" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Додати мітку альбому пісні" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Додати мітку виконавця альбому" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Додати мітку виконавця пісні" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "Додати автоматично визначену оцінку композиції" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Додати мітку композитора пізні" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Додати мітку диску пісні" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Додати ім’я файлу композиції" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Додати мітку жанру пісні" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "Додати мітку групування композицій" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Додати мітку тривалості пісні" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "Додати мітку виконавця композиції" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Додати мітку кількості відтворень" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Додати оцінку композиції" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Додати мітку кількості пропусків" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Додати мітку назви пісні" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "Додати композицію до кешу" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Додати мітку номеру доріжки" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Додати мітку року пісні" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Додавати композиції до теки «Моя музика», якщо натиснуто кнопку «Уподобати»" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Додати потік…" #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Додати до «Моєї музики»" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Додати до списків відтворення Spotify" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Додати до оцінених у Spotify" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Додати до іншого списку відтворення" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Додати до закладок" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Додати до списку відтворення" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Додати до черги" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "Додати користувача/групу до закладок" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Додати дію wiimotedev" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Додати…" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Додано у цьому місяці" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Додано цього тижня" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Додано цього року" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Додано сьогодні" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Додано за три місяці" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Розширене групування…" #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Після " #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Після копіювання…" #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Альбом" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Альбом (ідеальна гучність для всіх композицій)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Виконавець альбому" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Обкладинка альбому" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Дані про альбом на jamendo.com…" #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Альбоми" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Альбоми з обкладинками" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Альбоми без обкладинок" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Усі" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Всі файли (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "Вся слава Гіпножабі!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Всі альбоми" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Всі виконавці" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Всі файли (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Всі списки відтворення (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Всім перекладачам" #: library/library.cpp:98 msgid "All tracks" msgstr "Всі доріжки" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "Дозволити клієнту отримувати музику з цього комп’ютера." #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Дозволити отримання" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Дозволити mid/side кодування" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Разом з оригіналами" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Завжди приховувати головне вікно" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Завжди показувати головне вікно" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Завжди починати відтворення" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Диск Amazon Cloud" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Для користування Spotify в Clementine, потрібний додатковий модуль. Завантажити і встановити його зараз?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Виникла помилка завантаження бази даних iTunes" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Трапилася помилка під час запису метаданих до '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Сталася неочікувана помилка." #: ui/about.cpp:85 msgid "And:" msgstr "Та:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Злість" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Вигляд" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Додати файли/адреси до списку відтворення" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Додати до списку відтворення" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Додати до списку відтворення" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Застосувати стиснення для запобігання зрізанню" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Ви дійсно хочете вилучити задане \"%1\"?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Впевнені, що бажаєте скинути статистику цієї композиції?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Ви справді хочете записати статистичні дані до всіх файлів композицій у вашій бібліотеці?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Виконавець" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Про виконавця" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Мітки виконавця" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Ініціали виконавця" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Питати під час збереження" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Аудіо-формат" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Виведення звуку" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Помилка автентификації" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Автор" #: ui/about.cpp:68 msgid "Authors" msgstr "Автори" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Автоматично" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Автоматично" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Автоматичне оновлення" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Автоматично відкривати одиночні категорії в дереві фонотеки" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Доступне" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Середня бітова швидкість" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Середній розмір малюнку" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "Подкасти BBC" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "Бітів за хвилину" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Фонові Потоки" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Колір фону" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Зображення тла" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Прозорість фону" #: core/database.cpp:648 msgid "Backing up database" msgstr "Створення резервної копії бази даних" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Баланс" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "Заблокувати (скроблінг Last.fm)" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Смужка аналізатора" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Стандартний синій" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Основний тип звуку" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Поведінка" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Найкраще" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Біографія з %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Бітова швидкість" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Бітова швидкість" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Бітова швидкість" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Блок аналізатора" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Тип блоку" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Рівень розмивання" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Текст" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Плаваючий аналізатор" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Огляд…" #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Місткість буфера" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Буферизація" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Будуємо покажчик Seafile…" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Ці джерела вимкнено:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Кнопки" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Підтримка листів CUE" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Каталог кешу:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "Кешування" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "Кешування %1" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Скасувати" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Скасувати отримання даних" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Слід пройти перевірку CAPTCHA.\nСпробуйте увійти до Vk.com за допомогою вашої програми для перегляду інтернету, щоб виправити це." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Змінити обкладинку" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Змінити розмір шрифту…" #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Змінити режим повторення" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Змінити комбінацію клавіш…" #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Змінити режим перемішування" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "Змінити поточну відтворювану композицію" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Змінити мову" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "Зміни набудуть чинності на початку відтворення наступної композиції" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Зміни, внесені до параметрів монофонічного відтворення, набудуть чинності лише для наступних композицій" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Перевіряти наявність нових випусків" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Перевірити наявність оновлень" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Перевірити оновлення…" #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Виберіть каталог кешування даних Vk.com" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Оберіть ім’я для вашого розумного списку відтворення" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Вибрати автоматично" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Вибрати колір…" #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Вибрати шрифт…" #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Вибрати зі списку" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Вибрати спосіб сортування списку та кількість композицій в ньому." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Обрати теку для завантаження подкастів" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Виберіть інтернет-служби, дані яких слід показувати." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Оберіть веб-сайти, які Clementine має використати для пошуку текстів пісень." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Класична" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Вичищаю" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Очистити" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Очистити список відтворення" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Помилка Clementine" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Помаранчевий Clementine" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Візуалізація Clementine" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine може автоматично конвертувати скопійовану до цього пристрою музику в потрібний формат." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Clementine може відтворювати музику, вивантажену вами на Amazon Cloud Drive" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine може відтворювати файли звукових даних, вивантажені на Box" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine може відтворювати музичні дані, які ви вивантажили на Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine може відтворювати музику, вивантажену вами на Google Drive" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine може відтворювати музику, вивантажену вами на OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine може показувати повідомлення під час зміни доріжки." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine може синхронізувати список ваших підписок з іншими комп’ютерами та додатками для подкастів. Створити рахунок." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine не вдалось завантажити візуалізації projectM. Перевірте чи ви правильно встановили Clementine." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Переглядач зображень Clementine" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine не зміг здобути результатів для цього файлу" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine шукатиме музику у:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Клацніть тут, щоб додати музику" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Натисніть тут, щоб зробити цей список відтворення улюбленим, зберегти його і отримати швидкий доступ до нього за допомогою панелі «Списки відтворення» на лівій бічній панелі" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Клацніть аби перемкнутися між часом, що залишився, та загальним" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Після натискання кнопки входу буде відкрито вікно програми для перегляду сторінок інтернету. Після того, як ви увійдете до системи, вам слід повернутися до вікна Clementine." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Закрити" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Закрити список відтворення" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Закрити візуалізацію" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Закриття цього вікна скасує завантаження." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Закриття цього вікна зупинить пошук обкладинок альбомів." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Клубна" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Кольори" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Список, розділений комами, виду клас:рівень, рівень може бути від 0 до 3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Коментар" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "Громадське радіо" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Заповнити мітки автоматично" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Заповнити мітки автоматично…" #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Композитор" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Налаштувати %1…" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Налаштувати Magnatune…" #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Налаштування комбінацій клавіш" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Налаштування Spotify…" #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Налаштувати Subsonic…" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "Налаштувати Vk.com…" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Налаштувати загальні правила пошуку…" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Налаштувати фонотеку" #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Налаштувати подкасти..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Налаштувати…" #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Під’єднати Wii Remotes через дію активувати/деактивувати" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "З’єднати пристрій" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "З'єднання зі Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Сервер відмовив у з’єднанні. Переконайтеся, що адресу сервера вказано правильно. Приклад: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Вичерпано строк очікування на з’єднання. Переконайтеся, що адресу сервера вказано правильно. Приклад: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "Проблеми зі з’єднанням або надсилання звукових даних вимкнено власником" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Консоль" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Стала бітова швидкість" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Конвертувати всю музику" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Конвертувати всю музику, яку не може відтворити пристрій" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "Перетворювати звукові файли у форматах без втрати якості перед надсиланням їх на віддалений пристрій." #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "Перетворювати файли, стиснені без втрати якості" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "Копіювати адресу оприлюднення до буфера" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Копіювати до буфера" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Копіювати до пристрою…" #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Скопіювати до фонотеки…" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Копірайт" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Не вдалося встановити з’єднання з Subsonic, перевірте адресу сервера. Приклад: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Не вдалось створити елемент GStreamer \"%1\" - переконайтесь, що всі потрібні для GStreamer модулі встановлені" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Не вдалося створити список відтворення" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Не вдалось знайти ущільнювач для %1, перевірте чи правильно встановлений модуль GStreamer" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Не вдалось знайти кодер для %1, перевірте чи правильно встановлений модуль GStreamer" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Не вдалось відкрити вихідний файл %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Менеджер обкладинок" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Обкладинка з вбудованого малюнка" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Обкладинку завантажено з %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Обкладинку прибрано вручну" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Обкладинку не встановлено" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Обкладинку встановлено з %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Обкладинки з %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Перехресне згасання під час автоматичної зміни доріжок" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Перехресне згасання під час ручної зміни доріжок" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Вниз" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Вгору" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Інша" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Нетипове зображення:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Власні налаштування повідомлень" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Нетиповий…" #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "Шлях DBus" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Танцювальна" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Виявлено пошкодження бази даних. Будь ласка, ознайомтеся з даними на сторінці https://code.google.com/p/clementine-player/wiki/DatabaseCorruption , щоб дізнатися більше про способи відновлення вашої бази даних." #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Дата створення" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Дата зміни" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Днів" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "Ти&пово" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Зменшити гучність на 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Зменшити гучність на відсотків" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Зменшити гучність" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Типове зображення тла" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "Типовий пристрій у %1" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Типові значення" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Затримка між візуалізаціями" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Вилучити" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Видалити завантажені дані" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Вилучити файли" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Вилучити з пристрою…" #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Вилучити з диска…" #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Видалити відтворені випуски" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Скинути налаштування" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Видалити розумний список відтворення" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Вилучити оригінальні файли" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Вилучення файлів" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Вилучити з черги вибрані доріжки" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Вилучити з черги доріжки" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Призначення" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Детальніше…" #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Пристрій" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Налаштування пристрою" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Назва пристрою" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Налаштування пристрою…" #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Пристрої" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Діалогове вікно" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Може ви мали на увазі" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Пароль Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Ім’я користувача Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Пряме з'єднання з Інтернет" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Тека" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Вимкнути тривалість" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Вимкнути створення смужок настрою" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Вимкнено" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Вимкнено" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Диск" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Переривчаста передача" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Налаштування відображення" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Показувати екранні повідомлення" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Повторити повне сканування фонотеки" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Повторити повне сканування" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Повторити повне сканування…" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Не конвертувати ніяку музику" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Не перезаписувати" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "Повторне виконання повного сканування фонотеки призведе до втрати усіх метаданих, які було збережено у базі даних Clementine, зокрема зображень обкладинок, даних щодо кількості відтворень та оцінок. Clementine також виконає повторне сканування усіх музичних даних на Google Drive, що потребуватиме певного часу." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Не повторювати" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Не показувати в «різних виконавцях»" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Не показувати епізодів, які вже прослухано" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Не перемішувати" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Не зупиняти!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Підтримати фінансово" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Подвійне клацання, щоб відкрити" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "Подвійне клацання на пункті у списку композицій змусить…" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Подвійне клацання на пісні:" #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Завантажити %n випусків" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Тека завантаження" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Завантажити епізоди до" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Завантажити членство" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Завантажувати нові епізоди автоматично" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Завантаження поставлено в чергу" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Параметри отримання" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Отримати програму для Android" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Завантажити цей альбом" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Завантажити цей альбом…" #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Завантажити цей випуск" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Звантажити…" #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Завантажую (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Завантажую каталог Icecast" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Завантажую каталог Jamendo" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Завантаження каталогу Magnatune" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Завантаження модуля Spotify" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Завантажую метадані" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Перетягніть, щоб змінити розташування" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Дабстеп" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Тривалість" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Динамічний режим увімкнено" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Динамічний випадковий мікс" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Редагувати розумний список відтворення…" #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Змінити «%1»…" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Редагувати мітку…" #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Редагувати мітки" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Редагувати дані доріжки" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Редагувати дані про доріжку…" #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Редагувати дані про доріжки…" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Змінити…" #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "Ел. пошта" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Увімкнути підтримку Wii Remote" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "Увімкнути автоматичне кешування" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Увімкнути еквалайзер" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Використовувати глобальні скорочення лише коли Clementine у фокусі" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Уможливити вбудоване редагування метаданих композиції клацанням" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Включити наведені нижче адреси до джерел пошуку. Результати буде показано відповідно до вказаного вами порядку." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Увімкнути/вимкнути скроблінг в Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Складність кодування" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Якість кодування" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Режим кодування" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Введіть посилання" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Введіть посилання для завантаження обкладинки з нетрів:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Вкажіть назву файла для експортованих обкладинок (без суфікса назви):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Введіть нову назву для цього списку відтворення" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Вище ви можете вказати ключові слова пошуку музичних творів на вашому комп’ютері та у інтернеті" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Введіть критерії пошуку для пошуку подкастів у iTunes Store" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Введіть критерії пошуку для пошуку подкастів на gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Введіть сюди критерії пошуку" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Введіть адресу радіо-потоку:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Вкажіть назву теки" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Вкажіть цю IP-адресу у програмі для встановлення з’єднання з Clementine." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Вся фонотека" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Еквалайзер" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Відповідає --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Відповідає --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Помилка" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "Помилка під час видобування даних з компакт-диска" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Помилка з’єднання з пристроєм MTP" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Помилка копіювання композицій" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Помилка вилучення композицій" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Помилка завантаження модуля Spotify" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Помилка завантаження %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Помилка завантаження списку відтворення di.fm" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Помилка обробляння %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Помилка завантаження аудіо CD" #: library/library.cpp:68 msgid "Ever played" msgstr "Будь-коли відтворений" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Кожні 10 хвилин" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Кожні 12 годин" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Кожні 2 години" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Кожні 20 хвилин" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Кожні 30 хвилин" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Кожні 6 годин" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Кожну годину" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Крім як між треками на одному альбомі, або в тому ж CUE листі" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Наявні обкладинки" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Розгорнути" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Діє до %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Експортування обкладинок" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Експортувати обкладинки" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Експортувати отримані обкладинки" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Експортувати вбудовані обкладинки" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Експортування завершено" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Експортовано %1 обкладинок з %2 (%3 пропущено)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Зтишувати під час призупинення і робити голоснішим під час відновлення" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Згасання під час зупинки відтворення" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Згасання" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Тривалість згасання" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Не вдалося виконати читання з простою читання компакт-дисків" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Не вдалося отримати каталог" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Не вдалося отримати подкасти" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Не вдалося завантажити подкаст" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Не вдалося розібрати XML для цієї RSS стрічки" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Швидко" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Улюблені композиції" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Отримати обкладинки, котрих бракує" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Отримувати автоматично" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Отримання завершено" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Отримуємо бібліотеку Subsonic" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Не вдалося отримати обкладинку" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Формат файлів" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Розширення файлу" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Формати файлів" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Назва файлу" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Назва файлу (без шляху)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Зразок назви файла:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Шляхи до файлів" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Розмір файлу" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Тип файлу" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Назва файлу" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Файли" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Файли для перекодування" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Знайти композиції у фонотеці, що відповідають вказаним вами критеріям." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Знайти цього виконавця" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Роблю відбиток пісні" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Готово" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Перший рівень" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Підібрати розміри обкладинки за шириною" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Розмір шрифту" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "З підстав ліцензування, для підтримки Spotify потрібен спеціальний модуль." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Примусове моно-кодування" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Забути пристрій" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Забування пристрою вилучає його з цього списку і Clementine знову доведеться сканувати всі доріжки на ньому під час наступного під’єднання." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Форма" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Формат" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Частота кадрів" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Кадрів на буфер" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Холодність" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Повні баси" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Повні баси + верхи" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Повні верхи" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Загальне" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Загальні налаштування" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Жанр" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Отримати адресу цієї композиції Spotify для оприлюднення" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Отримати адресу для оприлюднення цього списку відтворення" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Отримання каналів" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Отримання потоків" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Дати назву:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Вперед" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "До наступної вкладки списку відтворення" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "До попередньої вкладки списку відтворення" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Отримано %1 обкладинок з %2 (%3 не вдалось)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Позначати сірим пісні у списках відтворення, що не існують" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Групувати фонотеку за…" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Групувати за" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Групувати за альбомом" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Групувати за виконавцем" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Групувати за виконавецем/альбомом" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Групувати зак виконавцем/роком - альбомом" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Групувати за жанром/альбомом" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Групувати за жанром/Виконавцем/альбомом" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Групування" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "HTML сторінка не містить жодних RSS стрічок" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "Отримано код стану HTTP 3xx без адреси. Перевірте налаштування сервера." #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "HTTP проксі" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Щастя" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Відомості про обладнання" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Відомості про обладнання доступні лише після під’єднання пристрою." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Високий" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Висока (%1 к/с)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Висока (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "Хіп-хоп" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Вузол не знайдено. Переконайтеся, що адресу сервера вказано правильно. Приклад: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Годин" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Гіпножаба" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "У мене немає облікового запису на Magnatune" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Значок" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Значки зверху" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Визначаю пісню" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Якщо буде позначено, ви зможете редагувати значення мітки композиції у списку відтворення простим клацанням на відповідному записі." #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Якщо продовжите, цей пристрій буде працювати повільно і скопійовані на нього композиції можуть не відтворюватись." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Якщо ви знаєте URL подкасту, введіть його та натисніть Вперед." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Ігнорувати «The» в іменах виконавців" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Зображення (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Зображення (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Імпортувати…" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "За %1 днів" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "За %1 тижнів" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "У динамічному режимі нові доріжку буде обрано та додано до списку відтворення кожного разу як завершується пісня." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Вхідні" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Показувати обкладинку в повідомлені" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Включити всі композиції" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Несумісна версія протоколу REST Subsonic. Слід оновити клієнтську частину." #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Несумісна версія протоколу REST Subsonic. Слід оновити серверну частину." #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Налаштовування не завершено! Переконайтеся, що заповнено всі поля." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Збільшити гучність на 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Збільшити гучність на відсотків" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Збільшити гучність" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Індексуємо %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Інформація" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "Налаштування вхідних даних" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Вставити…" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Встановлено" #: core/database.cpp:585 msgid "Integrity check" msgstr "Перевірка цілісності даних" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Інтернет" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Інтернет-джерела" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "Інтернет-служби" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "Вступні композиції" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Неправильний ключ API" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Не чинний формат" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Неправильний метод" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Неправильні параметри" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Неправильно вказане джерело" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Нечинна служба" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Неправильний ключ сеансу" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Інвертувати позначення" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Композиції Jamendo, що прослуховувалися найбільше" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Найпопулярніші композиції Jamendo" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Найпопулярніші композиції місяця в Jamendo" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Найпопулярніші композиції тижня в Jamendo" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "База даних Jamendo" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Перейти до попередньої композиції негайно" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Перейти до відтворюваної доріжки" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Тримати кнопки %1 секунду…" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Тримати кнопки %1 секунд…" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Продовжувати виконання у фоні коли вікно зачинено" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Зберегти оригінальні файли" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Кошенята" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Кудуро" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Мова" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "портативний комп’ютер/навушники" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Велика зала" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Велика обкладинка альбому" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Велика обкладинка альбому (подробиці нижче)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Велика обкладинка альбому (без подробиць)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Велика бічна панель" #: library/library.cpp:80 msgid "Last played" msgstr "Востаннє відтворено" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Останні відтворені" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "На цей час Last.fm зайнятий, спробуйте через кілька хвилин" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Пароль Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Статистика Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Мітки Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Користувач Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Вікі Last.fm" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Найменш улюблені композиції" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Ліворуч" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Тривалість" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Фонотека" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Розширене групування фонотеки" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Повідомлення про повторне сканування фонотеки" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Пошук у фонотеці" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Обмеження" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Наживо" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Завантажити" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Завантажити обкладинку з нетрів" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Завантажити обкладинку з нетрів…" #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Завантажити обкладинку з диска" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Завантажити обкладинку з диска" #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Завантажити список відтворення" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Завантажити список відтворення…" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Завантаження пристрою MTP" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Завантаження бази даних iPod" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Завантаження «розумного» списку відтворення" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Завантаження пісень" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Завантаження потоку" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Завантаження доріжок" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Завантажую дані доріжок" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Завантаження…" #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Завантажити файли/адреси, замінюючи поточний список відтворення" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Увійти" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Не вдалося увійти" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Вийти" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Профіль довготривалого передбачення (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Додати до улюблених" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "Уподобати (скроблінг Last.fm)" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Низька (%1 к/с)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Низька (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Профіль низької складності (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Тексти пісень" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Текст пісні з %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Текст пісні з мітки ID3v2" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3, 256 кб" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3, 96 кб" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Завантаження з Magnatune" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Завантаження з Magnatune завершено" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Основний профіль (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Гаразд!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "Гаразд!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Зробити список відтворення доступним онлайн" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Спотворений відгук" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Ручне налаштування проксі" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Вручну" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Виробник" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Позначити як прослуханий" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Позначити як новий" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Враховувати кожний пошуковий термін (AND)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Враховувати один чи більше пошукових термінів (OR)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Максимальна кількість результатів загального пошуку" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Найбільша бітова швидкість" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "Носій було змінено. Перезавантажуємо дані." #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Середня (%1 к/с)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Середня (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Тип членства" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Найменша бітова швидкість" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "Мінімальне заповнення буфера" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Відсутні типові налаштування projectM" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Модель" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Стежити за змінами у фонотеці" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Відтворення у режимі моно" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Місяців" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Настрій" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Стиль смужки настрою" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Смужки настрою" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "Більше" #: library/library.cpp:84 msgid "Most played" msgstr "Найчастіше відтворювані" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Точка монтування" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Точки монтування" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Перемістити вниз" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Перемістити до фонотеки…" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Перемістити вгору" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Музика" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Фонотека" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Вимкнути звук" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Альбоми" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Моя музика" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Мої рекомендації" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Назва" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Назва" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Налаштування найменування" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Вузька смуга (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Проксі мережі" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Дистанційне керування з мережі" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Ніколи" #: library/library.cpp:74 msgid "Never played" msgstr "Ніколи не відтворені" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Ніколи не починати відтворення" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Нова тека" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Новий список відтворення" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Новий «розумний» список відтворення" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Нові композиції" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Нові композиції буде додано автоматично" #: library/library.cpp:92 msgid "Newest tracks" msgstr "Найновіші доріжки" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Наступна" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Наступна доріжка" #: core/utilities.cpp:151 msgid "Next week" msgstr "Наступного тижня" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Без аналізатора" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Без зображення тла" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Немає зображень обкладинок для експортування." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Без довгих блоків" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Нічого не знайдено. Очистіть вікно пошуку, щоб знову показати весь список відтворення." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Без коротких блоків" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Немає" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Жодна з вибраних композицій не придатна для копіювання на пристрій" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Звичайний" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Нормальний тип блоку" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Недоступно при використанні динамічних списків відтворення" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Не з’єднано" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Не достатньо вмісту" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Недостатньо фанів" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Не достатньо учасників" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Недостатньо сусідів" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Не встановлено" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Вхід не здійснено" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Не змонтовано — двічі клацніть, щоб змонтувати" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Нічого не знайдено" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Тип повідомлення" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Сповіщення" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Зараз відтворюється" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Кількість показаних епізодів" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Повідомлення OSD" #: widgets/osd.cpp:173 msgid "Off" msgstr "Вимкн." #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Opus Ogg" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "Увімкн." #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Підтримувати зв’язок лише з клієнтами у таких діапазонах IP-адрес:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "З’єднуватися лише у межах локальної мережі" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Показувати лише перший" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Непрозорість" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Відкрити %1 у переглядачі" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Відкрити &аудіо CD…" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Відкрити файл OPML" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Відкрити файл OPML…" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Відкрити каталог для імпортування музичних творів" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Відкрити пристрій" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Відкрити файл…" #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Відкрити у Google Drive" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Відкрити у новому списку відтворення" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Відкрити у новому списку відтворення" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Відкрити у вашому переглядачі" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Відкрити…" #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Помилка виконання операції" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Оптимізувати для бітової швидкості" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Оптимізувати для якості" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Налаштування…" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Упорядкування файлів" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Упорядкування файлів…" #: core/organise.cpp:73 msgid "Organising files" msgstr "Упорядкування файлів" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Початкові мітки" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "Рік оригіналу" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr " Рік оригіналу — Альбом" #: library/library.cpp:118 msgid "Original year tag support" msgstr "Підтримка мітки року оригіналу" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Інші налаштування" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Результат" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Пристрій відтворення" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Налаштування виведення" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Перезаписати все" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Перезаписати існуючі файли" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Перезаписати лише менші" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Власник" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Опрацьовую каталог Jamendo" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Вечірка" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Пароль" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Призупинити" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Призупинити відтворення" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Призупинено" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Виконавець" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Піксель" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Звичайна бічна панель" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Відтворити" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Кількість відтворень" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Відтворити, якщо зупинено; призупинити, якщо відтворюється" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Відтворювати, якщо зараз нічого не відтворюється" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Відтворити доріжку в списку відтворення" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Відтворити/Призупинити" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Відтворення" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Налаштування програвача" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Список відтворення" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Список відтворення завершився" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Налаштування списку відтворення" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Тип списку відтворення" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Списки відтворення" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Будь ласка, закрийте вікно програми для перегляду інтернету і поверніться до роботи з Clementine." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Статус модуля:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Подкасти" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Поп" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Тривалість виринаючого повідомлення" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Порт" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Підсилення" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Пріоритет" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Параметри" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Параметри…" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Бажані імена файлів для обкладинок, розділені комами" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Бажаний аудіо формат" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Бажана бітова швидкість" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Бажаний формат" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Тип звуку вищого класу" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Шаблон:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Натисніть комбінацію кнопок для" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Натисніть клавішу" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Натисніть комбінацію клавіш для %1…" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Натискання «Попередня» у програвачі виконує дію…" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Налаштування OSD" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Перегляд" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Попередня" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Попередня доріжка" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Відобразити дані про версію" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Профіль" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Поступ" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Поступ" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "Психоделічна музика" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Натиснути кнопку Wiiremote" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Виводити композиції у випадковому порядку" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Якість" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Якість" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Опитування пристрою…" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Керування чергою" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Поставити в чергу вибрані доріжки" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Поставити в чергу доріжки" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Радіо (однакова гучність всіх композицій)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Дощ" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Дощ" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Випадкова візуалізація" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Поставити поточній композиції нуль зірочок" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Поставити поточній композиції одну зірочку" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Поставити поточній композиції дві зірочки" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Поставити поточній композиції три зірочки" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Поставити поточній композиції чотири зірочки" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Поставити поточній композиції п’ять зірочок" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Оцінка" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Дійсно скасувати?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Досягнено максимальної кількості переспрямовувань, перевірте налаштування сервера." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Оновити каталог" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Оновити канали" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Оновити список станцій" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Оновити потоки" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Реґґі" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Відносними" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Пам’ятати рухи в Wii remote" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Пам'ятати з минулого разу" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Запам’ятати вибір" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Вилучити" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Вилучити дію" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Вилучити повтори зі списку відтворення" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Вилучити теку" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Вилучити з теки Моя музика" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Вилучити із закладок" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Вилучити зі списку відтворення" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Вилучення списку відтворення" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Вилучення списків відтворення" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Вилучити недоступні композиції зі списку відтворення" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Перейменувати список відтворення" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Перейменувати список відтворення…" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Пронумерувати доріжки в такому порядку…" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Повторювати" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Повторювати альбом" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Повторювати список відтворення" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Повторювати композицію" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Замінити список відтворення" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Замінити список відтворення" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Замінити пробіли підкресленнями" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Режим вирівнювання гучності" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Знов наповнити" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Потрібен код розпізнавання" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Скинути" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Скинути лічильник відтворень" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Перезапустити композицію, потім перейти до попередньої, якщо натиснуто ще раз" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Повторно відтворити композицію або відтворити попередню композицію, якщо було відтворено не більше 8 секунд поточної композиції." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Обмежитись символами ASCII" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Відновлювати відтворення після запуску" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Повернутися до Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Праворуч" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "Оцифрувати" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "Оцифрувати КД" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "Оцифрувати звуковий КД" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Рок" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Виконати" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "SOCKS проксі" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Помилка під час спроби встановлення з’єднання SSL. Перевірте налаштування сервера. За допомогою наведеного нижче пункту використання SSLv3 можна уникнути деяких проблем." #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Безпечно вилучити пристрій" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Безпечне вилучення пристрою після копіювання" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Частота вибірки" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Частота вибірки" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Зберегти файли .mood до вашої музичної бібліотеки" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Зберегти обкладинку" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Зберегти обкладинку на диск…" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Зберегти зображення" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "Зберегти список відтворення" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "Збереження списку відтворення" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Зберегти список відтворення…" #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Зберегти налаштування" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Зберігати дані щодо оцінки у мітках файлів, якщо можна" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Зберігати статистичні дані у мітках файлів, якщо можна" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Зберегти цей потік на вкладці «Інтернет»" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "Зберігаємо статистичні дані щодо композицій до файлів композицій" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Зберігаю доріжки" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Профіль масштабованої частоти вибірки (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "Масштабований розмір" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Рахунок" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Скробблити доріжки, які я слухаю" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Пошук" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Пошук" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Шукати станції Icecast" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Шукати на Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Пошук на Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Шукати на Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Шукати автоматично" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Пошук обкладинок альбомів…" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Шукати всюди" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Пошук по gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Пошук по iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Режим пошуку" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Налаштування пошуку" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Результати пошуку" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Умови пошуку" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Другий рівень" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Перемотати назад" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Перемотати вперед" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Трохи перемотати поточну доріжку" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Перемотати поточну доріжку на абсолютну позицію" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "Позиціювання за допомогою клавіатурного скорочення" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Вибрати все" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Скасувати вибір" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Оберіть колір заднього плану:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Вибір зображення тла" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Оберіть найкращий збіг" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Оберіть колір переднього плану:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Вибрати візуалізації" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Вибрати візуалізації…" #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Вибрати…" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Серійний номер" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Сервер" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "Адреса сервера" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Параметри сервера" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Служба вимкнена" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Встановити %1 до \"%2\"…" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Встановити гучність до відсотків" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Встановити значення для всіх вибраних доріжок…" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Параметри" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Комбінація клавіш" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Комбінація клавіш для %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Комбінація клавіш для %1 вже є" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Показати" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Показувати OSD" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Показувати для поточної доріжки блимаючу анімацію" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Показувати смужку настрою на панелі поступу композиції" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Показувати системні повідомлення" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Показувати сповіщення коли я змінюю режим повторення чи перемішування" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Показувати повідомлення, коли я змінюю гучність" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Показувати повідомлення, коли я призупиняю відтворення" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Показувати підказки в системному лотку" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Показувати приємні повідомлення OSD" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Показати вище, в рядку стану" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Показати всі композиції" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Показати всі композиції" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Показувати обкладинки у фонотеці" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Показати розділювачі" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Показати на повний розмір…" #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "Показувати групи у результатах загального пошуку" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Показати в оглядачі файлів…" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Показати у фонотеці…" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Показувати в різних виконавцях" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Показувати смужку настрою" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Показати тільки дублікати" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Показати тільки без міток" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Показувати відтворювану композицію на вашій сторінці" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Показувати пропозиції щодо пошуку" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Показувати кнопку «love»" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Показувати кнопку скроблінга в головному вікні" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Показувати значок в лотку" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Показати список увімкнених та вимкнених джерел" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Показати/приховати" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Режим перемішування" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Перемішати альбоми" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Перемішати все" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Перемішати список відтворення" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Перемішати поточний альбом" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Увійти" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Вийти" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Реєстрація…" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Подібні виконавці" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Розмір" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Розмір:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ска" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Перескочити назад в списку композицій" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Кількість пропусків" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Перескочити вперед у списку композицій" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Пропустити позначені композиції" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Пропустити композицію" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Маленька обкладинка альбому" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Маленька бічна панель" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "«Розумний» список відтворення" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "«Розумні» списки відтворення" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Легка" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Легкий рок" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Про композицію" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Про композицію" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Сонограма" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Вибачте" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Сортувати за жанром (за абеткою)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Сортувати за жанром (за популярністю)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Сортувати за назвою станції" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Сортувати композиції за" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Сортування" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Джерело" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Джерела" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Помилка входу до Spotify" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "Адреса списку відтворення у Spotify" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Модуль Spotify" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Модуль Spotify не встановлено" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "Адреса композиції у Spotify" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Типово" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Оцінені" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "Почати оцифрування" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Запустити список відтворення, що відтворюється на цей час" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Почати перекодування" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Введіть щось у полі пошуку, розташованому вище, щоб побачити на цій панелі список результатів пошуку" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Запуск %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Запуск…" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Зупинити" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Зупинити після" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Зупинятися після кожної композиції" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Зупинятися після будь-якої композиції" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Зупинити після цієї доріжки" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Зупинити відтворення" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Зупинити відтворення після цієї доріжки" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Зупинити відтворення після композиції %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Зупинено" #: core/song.cpp:431 msgid "Stream" msgstr "Потік" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Після завершення 30-денного періоду тестування надсилання даних з сервера Subsonic потребує належної серверної ліцензії." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Потокове членство" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Передплатники" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Виконано!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "Успішно записано %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Пропоновані мітки" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Зведення" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Найвища (%1 к/с)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Надвисока (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Підтримувані формати" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Синхронізувати статистичні дані з файлами" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Синхронізація вхідних Spotify" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Синхронізація списку відтворення Spotify" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Синхронізація оцінених доріжок Spotify" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Кольори системи" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Вкладки зверху" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Упорядник міток" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Цільова бітова швидкість" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Техно" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Налаштування тексту" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Подяки" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Команда \"%1\" не може бути виконана" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Обкладинка альбому, до якого увійшла композиція, яка зараз відтворюється" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "Тека %1 не чинна" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "Друге значення має бути більшим за перше!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Вказана вами адреса не існує!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Вказана вами адреса не є малюнком!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Час тестування сервера Subsonic завершено. Будь ласка, придбайте ліцензійний ключ. Відвідайте subsonic.org, щоб дізнатися більше." #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Версія Clementine, яку ви щойно встановили, вимагає повного сканування фонотеки задля використання наступних нових можливостей:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "У цьому альбомі є інші композиції" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Виникла проблема зв’язку з gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Не вдалося отримати метадані з Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Виникла проблема розбору відповіді iTunes Store" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Виникли проблеми копіювання деяких композицій. Не вдалось скопіювати такі:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Виникли проблеми вилучення деяких композицій. Не вдалось вилучити такі:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Ці файли будуть вилучені з пристрою. Ви впевнені? Вилучити їх?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Ці файли буде остаточно вилучено з диска. Ви справді цього хочете?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "В цих теках виконуватиметься пошук музики для створення фонотеки" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Ці налаштування використовуються у діалозі «Перекодування музики» та при перетворенні музики перед її копіюванням на пристрій." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Третій рівень" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Ця дія створить базу даних розміром у 150МБ\nВи точно хочете продовжити?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Цей альбом не доступний в запитуваному форматі" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Згодом цей параметр можна буде змінити у налаштуваннях програми" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Потрібно під’єднати та відкрити пристрій, щоб Clementine розпізнала, які формати файлів він підтримує." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Цей пристрій підтримує такі формати файлів:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Цей пристрій не працюватиме як слід" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Це пристрій MTP, але ви скомпілювали Clementine без підтримки libmtp." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Це пристрій iPod, але ви скомпілювали Clementine без підтримки libgpod." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Під час першого під’єднання пристрою, Clementine скануватиме його, щоб знайти музичні файли — це може зайняти деякий час." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Значення цього параметра можна змінити на сторінці «Поведінка» налаштувань програми." #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Цей потік лише для платних передплатників" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Цей тип пристрою не підтримується: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "Крок за часом" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Назва" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Сьогодні" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Змінити режим приємних OSD" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Повноекранний режим" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Перемикнути статус черги" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Змінити режим скроблінгу" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Змінити режим видимості приємних OSD" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Завтра" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Забагато перенапрямлень" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Найкращі композиції" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "Загалом альбомів:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Всього передано байтів" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Всього зроблено запитів до мережі" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Доріжка" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Композиції" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Перекодування музики" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Журнал перекодування" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Перекодування" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Перекодовано %1 файлів, використовуючи %2 гілки" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Налаштування перекодування" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Турбіна" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Вимкнути" #: devices/giolister.cpp:157 msgid "URI" msgstr "Адреса" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "Адреса(и)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Надзвичайно широка смуга (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Не вдалося з’єднатися" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Не вдалось завантажити %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Невідомо" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Невідомий content-type" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Невідома помилка" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Вилучити обкладинку" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Не пропускати позначені композиції" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Не пропускати композицію" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Відписатися" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Найближчі виступи" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Оновити" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Оновити всі подкасти" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Оновити змінені теки у фонотеці" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Оновлювати фонотеку під час запуску Clementine" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Оновити цей подкаст" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Оновлення" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Оновлення %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Оновлення %1%…" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Оновлення фонотеки" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Використання" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Використовувати мітку виконавця альбому, якщо є" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Використовувати комбінації клавіш Gnome" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "Психоделічні кольори" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Використовувати метадані Replay Gain, якщо такі є" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Використовувати SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Використовувати Wii Remote" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Використати власну палітру" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Використати власне повідомлення для сповіщень" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "Використовувати віддалене керування мережею" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Використовувати автентифікацію" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Використати двигун контролю бітової швидкості" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Використовувати динамічний режим" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Використовувати повідомлення для звітів про стан Wii Remote" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Використати тимчасове формування шуму" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Використовувати системну" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Використати системну палітру" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Використовувати системні налаштування проксі" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Використати нормалізацію гучності" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Використано" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Інтерфейс користувача" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Користувач" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Використання меню для додавання композиції…" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Змінна бітова швидкість" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Різні виконавці" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Версія %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Перегляд" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Режим візуалізації" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Візуалізації" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Налаштування візуалізацій" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Визначення голосової активності" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Гучність %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "Стіна" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Попереджати про закриття вкладки списку відтворення" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Веб-сайт" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Тижнів" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Під час запуску Clementine" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Під час пошуку обкладинок, Clementine спочатку шукатиме файли зображень, що містять одне з цих слів.\nЯкщо відповідників не буде, використовуватиметься найбільше зображення в каталозі." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "Шляхи під час збереження списків відтворення мають бути" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Якщо список є порожнім…" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Чому б не спробувати…" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Широка смуга (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: активовано" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: під’єднано" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: критичний розряд батареї (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: деактивовано" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: від’єднано" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: низький заряд батареї (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media, 128 кб" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media, 40 кб" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media, 64 кб" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Без обкладинки:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Хочете пересунути всі ініші композиції цього альбому до розділу «Різні виконавці»?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Бажаєте зараз виконати повторне сканування фонотеки?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Записати статичні дані щодо всіх композицій до файлів композицій" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Записати метадані" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Помилкове ім’я користувача або пароль." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Рік" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Рік - Альбом" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Років" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Вчора" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Ви збираєтеся завантажити такі альбоми" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Ви маєте намір вилучити %1 списків відтворення зі списку улюблених. Ви впевнені у цьому?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Ви наказали програми вилучити список відтворення, який не є частиною списку ваших улюблених списків відтворення. Такий список відтворення буде вилучено без можливості відновлення. \nВи справді хочете вилучити цей список відтворення?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Вас не зареєстровано." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Вас зареєстровано як %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Вас зареєстровано." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Ви можете змінити спосіб упорядкування композицій у фонотеці." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Ви можете безкоштовно слухати будь-яку музику без облікового запису, але учасники з Premium мають змогу покращити якість звукового потоку та усунути рекламу." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Ви можете прослухати композиції з Magnatune безкоштовно і без реєстрації. Набуття членства дає змогу вилучати повідомлення в кінці кожної композиції." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Ви можете чути фонові звуки разом з іншою музикою." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Можете використовувати Wii Remote для віддаленого керування Clementine. Детальніше, на сторінці вікі Clementine.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "У вас немає облікового запису Spotify Premium." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "У вас немає оформленої передплати" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "Вам не потрібно входити до системи, щоб шукати і слухати музику із SoundCloud. Втім, вам доведеться увійти до системи, якщо ви хочете отримати доступу до ваших списків відтворення та потоків даних." #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Ви вийшли зі Spotify, введіть ваш пароль знов у налаштуваннях, будь ласка." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Ви вийшли зі Spotify, введіть ваш пароль знов, будь ласка." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Улюблена композиція" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "Щоб мати змогу користуватися загальними клавіатурними скороченнями у Clementine, вам слід запустити програму «Системні налаштування» і дозволити Clementine «керувати вашим комп’ютером»." #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Потрібно перезапустити Clementine, щоб змінити мову." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Ваша IP-адреса:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Ваші облікові дані Last.fm неправильні" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Введені дані облікового запису Magnatune некоректні" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Ваша фонотека порожня!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Ваші радіо-потоки" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "%1 відтворень у вас" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "У вашій системі не передбачено підтримки OpenGL, отже візуалізаціями не можна буде скористатися." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Вами вказано помилкове ім’я користувача або пароль." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "додати %n композицій" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "після" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "тому" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "та" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "автоматично" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "до" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "між" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "спочатку найбільші" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "такт/хв." #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "містить" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "вимкнено" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "диск %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "не містить" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "закінчується на" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "збігається з" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "Каталог gpodder.net " #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "більше ніж" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "У поточній версії робота з пристроями iPod та USB у операційній системі Windows неможлива. Вибачте!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "за останні" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "кбіт/с" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "менше ніж" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "спочатку найдовші" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "пересунути %n композицій" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "спочатку найновіші" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "не дорівнює" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "не за останні" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "не на" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "спочатку найстаріші" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "на" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "налаштування" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "або скануйте QR-код!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "натисніть клавішу «enter»" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "вилучити %n композицій" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "спочатку найкоротші" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "перемішати композиції" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "спочатку найменші" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "впорядкувати композиції" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "починається з" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "зупинити" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "доріжка %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/uz.po000066400000000000000000004315331260417502300237060ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Umid Almasov , 2013 # Umid Almasov , 2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Uzbek (http://www.transifex.com/davidsansome/clementine/language/uz/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uz\n" "Plural-Forms: nplurals=1; plural=0;\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "kun" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "kb/s" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " punkt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr "soniya" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "qo'shiq" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 albom" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 kun" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 kun oldin" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 %2'da" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 pleylist (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 tanlangan" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 qo'shiq" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 qo'shiq" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 qo'shiq topildi" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 qo'shiq topildi (ko'rsatildi %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 trek" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 ko'chirildi" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev moduli" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 boshqa eshituvchilar" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 jami eshitildi" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n muvaffaqiyatsiz tugadi" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n tugadi" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n qoldi" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "Matnni &tekislash" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Markaz" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Boshqa" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "&Extras" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "&Yordam" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "%1 &Yashirish" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "&Yashirish..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Chap" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "&Musiqa" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Yo'q" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "&Pleylist" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "&Chiqish" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "&Takrorlash" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&O'ng" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "&Tasodifan" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "&Ustunlarni oynaga moslash" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Vositalar" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(har xil bir nechta qo'shiqlar orqali)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr "" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...va barcha Amarok tuzuvchilariga" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 kun" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 trek" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 tasodifiy trek" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Premium versiyagacha yangilash" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Spotify Premium uchun hisob kerak." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "" #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Agar qo'shiq shartlarga mos kelsa, u pleylistga qo'shiladi." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ALL GLORY TO THE HYPNOTOAD" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "%1 haqida" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Clementine haqida..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Qt haqida..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Hisob tafsilotlari" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Hisob tafsilotlari (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Amal" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Wiiremote yoqish/o'chirish" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Podcast qo'shish" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "To'lqinni qo'shish" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Eslatma turi tomonidan qo'llansa yangi satr qo'shish" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Amal qo'shish" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Boshqa to'lqinni qo'shish..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Jild qo'shish..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Fayl qo'shish" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Fayl qo'shish..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Transkodlash uchun fayllar qo'shish" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Jild qo'shish" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Jild qo'shish..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Yangi jild qo'shish..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Podcast qo'shish" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Podcast qo'shish..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Qidirish shartini qo'shish" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Qo'shiq albomi tegini qo'shish" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Qo'shiq albomi artisti tegini qo'shish" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Qo'shiq artisti tegini qo'shish" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Qo'shiq bastakori tegini qo'shish" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Qo'shiq diski tegini qo'shish" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Qo'shiq fayl nomi tegini qo'shish" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Qo'shiq janri tegini qo'shish" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Qo'shiq uzunligi tegini qo'shish" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Qo'shiq ijro ettirish soni tegini qo'shish" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Qo'shiq o'tkazib yuborishlar soni tegini qo'shish" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Qo'shiq nomi tegini qo'shish" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Qo'shiq treki tegini qo'shish" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Qo'shiq yili tegini qo'shish" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "To'lqinni qo'shish..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Boshqa pleylistga qo'shish" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Pleylistga qo'shish" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Navbatga qo'shish" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Wiimotedev amalini qo'shish" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Qo'shish..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Shu oy qo'shilgan" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Shu hafta qo'shilgan" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Shu yil qo'shilgan" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Bugun qo'shilgan" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Uch oy ichida qo'shilgan" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Kengaytirilgan guruhlarga bo'lish..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Keyin" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Nusxa olgandan keyin..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Albom" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Albom (hamma treklar uchun ideal ovoz balandligi)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Albom artisti" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Albom rasmi" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "jamendo.com sahifasida albom haqida ma'lumot..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Rasmli albomlar" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Rasmsiz albomlar" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Hamma fayllar (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Hamma albomlar" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Hamma artistlar" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Hamma fayllar (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Hamma pleylistlar (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Hamma tarjimonlar" #: library/library.cpp:98 msgid "All tracks" msgstr "Hamma treklar" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Mid/side kodlashga ruxsat berish" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Asl nusxalari bilan birga" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Bosh oynani hamisha yashirish" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Bosh oynani hamisha ko'rsatish" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Hamisha ijro ettirish" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Clementine'da Spotify'dan foydalanish uchun qo'shimcha plagin kerak. Uni yuklab olishni va o'rnatishni istaysizmi?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "iTunes ma'lumot bazasini yuklaganda xato ro'y berdi" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "'%1'ga meta-ma'lumot yozilganda xato ro'y berdi" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:85 msgid "And:" msgstr "Va:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Ko'rinish" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Fayllarni/URL'larni pleylistga qo'shish" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Joriy pleylistga qo'shish" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Pleylistga qo'shish" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Kesilmaslik uchun qisishni qo'llash" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "\"%1\" presetini o'chirishga ishonchingiz komilmi?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Statistikani boshlang'ich holatga qaytarishga ishonchingiz komilmi?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Artist" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Artist haqida ma'lumot" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Artist teglari" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Artistning ismi-sharifi" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Audio format" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Tasdiqlash muvaffaqiyatsiz tugadi" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Muallif" #: ui/about.cpp:68 msgid "Authors" msgstr "Mualliflar" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Avto" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Avomatik yangilash" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Mavjud" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "O'rtacha bitreyt" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "O'rtacha rasm o'lchami" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "BBC Podcasts" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Orqa fon to'lqinlari" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Orqa fon rangi" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Orqa fon rasmi" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Orqa fon tiniqligi" #: core/database.cpp:648 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Bar analizatori" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Asosiy ko'k" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Asosiy audio turi" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Amal" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Zo'r" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "%1'dan tarjimai holi" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Bitreyt" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Bitreyt" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Blok analizatori" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Blok turi" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Boom analizatori" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Ko'rib chiqish..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Buferizatsiya" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Tugmalar" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "CUE sheet qo'llash" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Bekor qilish" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Albom rasmini o'zgartirish" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Shrift o'lchamini o'zgartirish..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Takrorlash usulini o'zgartirish" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Tugmalar birikmasini o'zgartirish..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Tasodifiy usulini o'zgartirish" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Tilni o'zgartirish" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Yangi epizodlarni tekshirish" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Yangilanishlarni tekshirish..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Aqlli pleylist nomini tanlang" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Avtomatik ravishda tanlash" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Rang tanlash..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Shrift tanlash..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Ro'yxatdan tanlash" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Pleylist qanday saralashini va nechta qo'shiq borligini tanlash" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Podkast yuklab olish direktoriyasini tanlash" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Clementine qo'shiq matnlarini qidirish uchun veb-sahifalarni tanlash" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Classical" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Tozalanmoqda" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Tozalash" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Pleylistni tozalash" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Clementine xatosi" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Apelsin Clementine" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Clementine vizualizatsiyasi" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine ushbu uskunaga nusxa olinayotgan musiqan ui ijro etaoladigan formatga o'tkazishi mumkin." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine Dropboxga yuklangan musiqangizni ijri ettirishi mumkin" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine trek o'zgarganda xabar ko'rsatishi mumkin." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Clementine rasm ko'ruvchisi" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Musiqani qo'shish uchun shu joyga bosing" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Yopish" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Vizualizatsiyani yopish" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Ushbu oynani yopganda yuklab olish bekor qilinadi." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Ushbu oynani yopganda albom rasmlarini qidirish to'xtatiladi." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Ranglar" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Izoh" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Teglarni avtomatik ravishda yakunlash" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Teglarni avtomatik ravishda yakunlash..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Bastakor" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "" #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Magnatune moslash..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Tugmalar birikmalarini moslash" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Spotify moslash..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "" #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Kutubxonani sozlash..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Podkastlarni moslash..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Moslash..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Uskunaga ulanish" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Spotify'ga ulanmoqda" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Konsol" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "O'zgarmas tezlik" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Hamma musiqani konvertasiya qilish" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Klipbordga nusxa olish" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Uskunaga nusxa olish..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Kutubxonaga nusxa ko'chirish..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Mualliflik huquqlari" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Albom rasmi boshqaruvchisi" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Albom rasmi avtomatik ravishda %1'dan yuklandi" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "%1'dan albom rasmlari" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Boshqa" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Boshqa rasm:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Boshqa xabar moslamalari" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Boshqa..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "DBus yo'li" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dance" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Yaratilgan sanasi" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "O'zgartirilgan sanasi" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Kun" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "&Andoza" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Ovoz balandligini 4%'ga kamaytirish" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Ovoz balandligini kamaytirish" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Orqa fon andoza rasmi" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Andoza" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "O'chirish" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Yuklab olingan ma'lumotni o'chirish" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Fayllarni o'chirish" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Uskunadan o'chirish..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Diskdan o'chirish..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Ijro etilgan epizodlarni o'chirish" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Presetni o'chirish" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Aqlli pleylistni o'chirish" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Asl faylini o'chirish" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Fayllar o'chirilmoqda" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Tafsilotlar..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Uskuna" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Uskuna hossalari" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Uskuna nomi" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Uskuna hossalari..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Uskunalar" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Direktoriya" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Disk" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Ko'rsatish parametrlari" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Takrorlanmasin" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Boshqa artistlarda ko'rsatilmasin" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "To'xtatilmasin!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Ochish uchun ikki marta bosish" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Qo'shiqni ikki marta bosganda..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "%n epizodlarni yuklab olish" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Direktoriyani yuklab olish" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Epizodlarni yuklash" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "A'zolikni yuklab olish" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Yangi epizodlarni avtomatik ravishda yuklab olish" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Yuklab olish navbatga qo'yildi" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Ushbu albomni yuklab olish" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Ushbu albomni yuklab olish..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Ushbu epizodni yuklab olish" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Yuklab olish..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "(%1%) yuklab olinmoqda..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Icecast direktoriyasi yuklab olinmoqda" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Jamendo katalogi yuklab olinmoqda" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Magnatune katalogi yuklab olinmoqda" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Spotify plagini yuklab olinmoqda" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Meta-ma'lumot yuklab olinmoqda" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Smart ijro ro'yxatini tahrirlash..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Tegni tahrirlash..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Teglarni tahrirlash" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Trek ma'lumotini tahrirlash" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Trek ma'lumotini tahrirlash..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Treklar ma'lumotini tahrirlash" #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Tahrirlash..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Wii Remote qo'llab-quvvatlashini yoqish" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Ekvalayzer yoqish" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Faqat Clementine fokusda bo'lganda yorliqlarni yoqish" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Last.fm scrobblingni yoqish/o'chirish" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Kodlash usuli" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "URL kiriting" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Albom rasmini internetdan yuklab olish uchun URL kiriting:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Ushbu pleylist uchun yangi nom kiriting" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "iTunes Store'da podkastni topish uchun qidirish shartlarini kiriting" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "gpodder.net'da podkastni topish uchun qidirish shartlarini kiriting" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Qidirish shartlarini kiriting" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Internet radio to'lqini uchun URL kiriting:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Jild nomini kiriting" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Ekvalayzer" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Xato" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "MTP uskunasiga ulanganda xato ro'y berdi" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Qo'shiqlar nusxa olinganda xato ro'y berdi" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Qo'shiqlarni o'chirganda xato ro'y berdi" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Spotify plaginini yuklab olganda xato ro'y berdi" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "%1'ni yuklaganda xato ro'y berdi" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "di.fm pleylistini yuklaganda xato ro'y berdi" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Audio CD yuklanganda xato ro'y berdi" #: library/library.cpp:68 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Har 10 daqiqa" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Har 12 soat" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Har 2 soat" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Har 20 daqiqa" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Har 30 daqiqa" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Har 6 soat" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Har soat" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Podkast olish muvaffaqiyatsiz tugadi" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Podkast yuklash muvaffaqiyatsiz tugadi" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Ushbu RSS manbai uchun XML tahlil qilish muvaffaqiyatsiz tugadi" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Fayl formatlari" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Fayl nomi" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Fayl hajmi" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Fayl turi" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Fayl nomi" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Fayllar" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Transkodlash uchun fayllar" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Shrift o'lchami" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Full Bass" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Full Bass + Treble" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Full Treble" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Umumiy" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Umumiy moslamalar" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Janr" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Kanallarni olish" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "To'lqinlarni olish" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "O'tish" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "HTTP proksi" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Apparat ta'minoti haqida ma'lumot" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Yuqori" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Yuqori (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Yuqori (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Soat" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Mening Magnatune hisob qaydnomam yo'q" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Nishoncha" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Ijrochi nomlarida \"The\" artiklini e'tiborsiz qoldirish" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Rasmlar (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Rasmlar (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "%1 kundan so'ng" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "%1 haftadan so'ng" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Kelganlar" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Xabarnomaga albom bezagini qo'shish" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Ma'lumot" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "O'rnatilgan" #: core/database.cpp:585 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Internet provayderlari" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "API kaliti haqiqiy emas" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Format haqiqiy emas" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Usul haqiqiy emas" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Parametrlar haqiqiy emas" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Xizmat haqiqiy emas" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Seans kaliti haqiqiy emas" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Jamendo ma'lumot bazasi" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Til" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "" #: library/library.cpp:80 msgid "Last played" msgstr "" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Last.fm maxfiy so'zi" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Last.fm teglari" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Last.fm foydalanuvchi nomi" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Uzunligi" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Kutubxona" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: ui/equalizer.cpp:137 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Yuklash" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Albom rasmini URL'dan yuklash" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Albom rasmini URL'dan yuklash..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Albom rasmini diskdan yuklash" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Albom rasmini diskdan yuklash..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Pleylistni yuklash" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Pleylistni yuklash..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "MTP uskunasi yuklanmoqda" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "iPod ma'lumot bazasi yuklanmoqda" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Aqlli pleylist yuklanmoqda" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Qo'shiqlar yuklanmoqda" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "To'lqin yuklanmoqda" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Treklar yuklanmoqda" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Treklar haqida ma'lumot yuklanmoqda" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Yuklanmoqda..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Kirish" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Kirish muvaffaqiyatsiz tugadi" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Past (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Past (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Qo'shiq matnlari" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "%1'dan qo'shiq matnlari" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Magnatune Download" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Shunday qilinsin!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Musiqa" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Mening musiqam" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Tarmoq proksi" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Hech qachon" #: library/library.cpp:74 msgid "Never played" msgstr "Hech qachon ijro ettirilmagan" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Yangi jild" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Yangi pleylist" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Yangi aqlli pleylist..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Yangi qo'shiqlar" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:92 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Keyingi" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Keyingi trek" #: core/utilities.cpp:151 msgid "Next week" msgstr "Kelasi hafta" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Yo'q" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Ulanmagan" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Hajmi yetarli emas" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "O'rnatilmagan" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Ulanmagan - ulash uchun ikki marta bosing" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "%1 brauzerda ochish" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "&Audio CD ochish..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Uskunani ochish" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Failni ochish..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Google Driveda ochish" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Yangi pleylistda ochish" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Ochish..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Jarayon muvaffaqiyatsiz tugadi" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Parametrlar..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Fayllarni boshqarish" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Fayllarni boshqarish..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Fayllarni tashkillashtirish" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Asl teglar" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Boshqa parametrlar" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Chiqarish parametrlari" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Mavjud fayllarni almashtirish" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:139 msgid "Party" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Maxfiy so'z" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Pleyer parametrlari" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Pleylist" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Pleylist parametrlari" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Pleylist turi" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Pleylistlar" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Brauzerni yopib Clementinega qayting" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Plagin holati:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podkastlar" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Moslamalar" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Moslamalar..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Afzal audio formati" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Afzal bitreyt" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Tugmani bosing" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Ko'rib chiqish" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Oldingi" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Oldingi trek" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Joriy qo'shiqni baholash 0 yulduz" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Joriy qo'shiqni baholash 1 yulduz" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Joriy qo'shiqni baholash 2 yulduz" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Joriy qo'shiqni baholash 3 yulduz" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Joriy qo'shiqni baholash 4 yulduz" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Joriy qo'shiqni baholash 5 yulduz" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Baho" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Rostdan bekor qilinsinmi?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Mening musiqamdan o'chirish" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Clementinega qaytish" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Albom rasmini saqlash" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Albom rasmini diskka saqlash..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Rasmni saqlash" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Pleylistni saqlash..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Treklar saqlanmoqda" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Qidirish" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Icecast stansiyalarni qidirish" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Jamendo qidirish" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Magnatune qidirish" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "gpodder.net qidirish" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "iTunes qidirish" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Qidirish usuli" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Qidirish parametrlari" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Qidirish shartlari" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Hammasini tanlash" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Hech qaysini tanlamaslik" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Orqa fon rangini tanlash:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Orqa fon rasmini tanlash" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "" #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Seriya raqami" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Tugmalar birikmasi" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "%1 uchun tugmalar birikmasi" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "%1 uchun tugmalar birikmasi mavjud" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Ko'rsatish" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "OSD ko'rsatish" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Hamma qo'shiqlarni ko'rsatish" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Hamma qo'shiqlarni ko'rsatish" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "" #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "" #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Trey nishonchasini ko'rsatish" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Ko'rsatish/Yashirish" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Qo'shiq haqida ma'lumot" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Qo'shiq haqida ma'lumot" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Manba" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Manbalar" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Spotify kirish xatosi" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Spotify plagini" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Spotify plagini o'rnatilmagan" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "" #: core/song.cpp:431 msgid "Stream" msgstr "To'lqin" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Muvaffaqiyat!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "Muvaffaqiyatli yozilgan %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Tizim ranglari" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Tashakkurlar" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "%1 direktoriyasi haqiqiy emas" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Ushbi albomda boshqa qo'shiqlar mavjud" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Bugun" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Ertaga" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Trek" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Musiqani transkodlash" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Transkodlash parametrlari" #: core/song.cpp:426 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL(lar)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "%1 (%2) yuklab olib bo'lmadi" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Noma'lum" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Noma'lum xato" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Foydalanuvchi interfeysi" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Foydalanuvchi nomi" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Versiya %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Ko'rish" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Vizualizatsiya usuli" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Vizualizatsiyalar" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Vizualizatsiya moslamalari" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Veb sahifa" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Hafta" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Clementine ishga tushganda" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Keng band (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: yoqilgan" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: ulangan" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: critical battery (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: o'chirilgan" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: ulanmagan" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: low battery (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Yil" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Yil - Albom" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Yillar" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Kecha" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Sizda Spotify Premium hisobi yo'q." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Siz Spotify'dan chiqib ketdingiz, Moslamalar oynasida maxfiy so'zni qaytadan kiriting." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Siz Spotify'dan chiqib ketdingiz, maxfiy so'zni qaytadan kiriting." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Usbu trek sizga yoqdi" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Tilni o'zgartirganda Clementine'dan chiqib qaytadan kirish kerak." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Radio to'lqinlaringiz" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Skrobbling: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Foydalanuvchi nomi yoki maxfiy so'z noto'g'ri." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Andoza" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "%n qo'shiqni qo'shish" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "keyin" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "avval" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "va" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "avtomatik" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "oldin" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "orasida" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "kattasidan boshlab" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "disk %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "tugaydi" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "teng" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "gpodder.net direktoriyasi" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kb/s" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "uzunidan boshlab" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "yangisidan boshlab" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "teng emas" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "oldingisidan boshlab" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "parametrlar" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "Enter bosing" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "%n qo'shiqni o'chirish" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "qisqasidan boshlab" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "kichigidan boshlab" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "boshlanadi" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "to'xtatish" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "trek %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/vi.po000066400000000000000000005171001260417502300236610ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # FIRST AUTHOR , 2011 # pinkyfinger111 , 2011, 2012 # Lê Trường An , 2011, 2012 # Lê Trường An , 2011-2013 # Lê Trường An , 2011 # Phạm Nguyễn Hoàng , 2015 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Vietnamese (http://www.transifex.com/davidsansome/clementine/language/vi/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: vi\n" "Plural-Forms: nplurals=1; plural=0;\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr " ngày" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " mili giây" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " điểm" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "s" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " giây" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " bài hát" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 bài hát)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 album" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 ngày" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 ngày trước" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 trên %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "Danh sách %1 (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 chọn" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 bài hát" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 bài hát" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "Đã tìm thấy %1 bài hát" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "Đã tìm thấy %1 bài hát (đang hiện %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 bài" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "Đã tải %1" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: mô-đun tay cầm Wii" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 người nghe khác" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 tổng số lần phát" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n thất bại" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n kết thúc" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "Còn lại %n" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Căn chỉnh" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Giữa" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "&Tùy chọn" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "&Hiệu ứng" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "Trợ &giúp" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "Ẩ&n %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "Ẩ&n..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "T&rái" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "&Nhạc" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "&Không" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "&Danh sách" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "T&hoát" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "&Chế độ lặp lại" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Phải" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "Chế độ phát n&gẫu nhiên" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "Căng các cột ra cho &vừa với cửa sổ" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "&Công cụ" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(mỗi bài mỗi khác)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", bởi" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...và tất cả cộng tác viên của Amarok" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0 điểm ảnh" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 ngày" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 bài" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192 000 Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44 100 Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48 000 Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 bài ngẫu nhiên" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96 000 Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "Nâng cấp lên tài khoản cao cấp ngay" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

Nếu không chọn, Clementine sẽ lưu đánh giá của bạn và các thông tin thống kê khác trong cơ sở dữ liệu riêng để không thay đổi tập tin nhạc của bạn.

Nếu được chọn, Clementine sẽ lưu thông tin thống kê cả trong cơ sở dữ liệu và trực tiếp vào tập tin khi có thay đổi.

Lưu ý rằng chỉ có một số định dạng tập tin được hỗ trợ và vì không có chuẩn chung nên các trình nghe nhạc khác có thể không đọc đựoc những dữ liệu này.

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

Sẽ lưu đánh giá và thông tin về bài hát trực tiếp vào các tập tin trong thư viện nhạc của bạn.

Không cần phải chọn nếu tùy chọn "Lưu đánh giá vào tập tin khi có thể" đã luôn được bật.

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Các dấu bắt đầu là %, ví dụ: %artist %album %title

\n\n

Nếu bạn quét chọn đoạn văn bản chứa dấu ngoặc nhọn, đoạn đó sẽ bị ẩn đi nếu dấu bắt đầu rỗng.

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "Cần có tài khoản cao cấp của Spotify." #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "Máy khách được kết nối chỉ khi nhập đúng mã." #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "Danh sách thông minh là danh sách các bài hát trong thư viện có thể tự động thay đổi. Có nhiều loại danh sách nhạc thông minh khác nhau và chúng cung cấp cho bạn nhiều cách để lựa chọn các bài hát." #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Một bài hát sẽ được đưa vào danh sách nếu như nó đáp ứng những điều kiện sau." #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ALL GLORY TO THE HYPNOTOAD" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "Huỷ bỏ" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "Giới thiệu %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "Giới thiệu Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "Giới thiệu Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "Chi tiết tài khoản" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "Chi tiết tài khoản (Cao cấp)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "Hoạt động" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "Kích hoạt/vô hiệu tay cầm Wii" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "Thêm Podcast" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "Thêm luồng dữ liệu" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "Thêm một dòng mới nếu được hỗ trợ từ kiểu thông báo" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "Thêm hành động" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "Thêm luồng dữ liệu khác..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "Thêm thư mục..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "Thêm tập tin" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "Thêm tập tin vào bộ chuyển mã" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "Thêm (các) tập tin vào bộ chuyển mã" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "Thêm tập tin..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "Thêm các tập tin để chuyển mã" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "Thêm thư mục" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "Thêm thư mục..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "Thêm thư mục mới..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "Thêm podcast" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "Thêm podcast..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "Thêm điều kiện tìm kiếm" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "Thêm thẻ album bài hát" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "Thêm thẻ nghệ sĩ album" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "Thêm thẻ nghệ sĩ của bài hát" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "Thêm thẻ người soạn nhạc" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "Thêm thẻ đĩa của bài hát" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "Thêm tên tập tin bài hát" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "Thêm thẻ thể loại bài hát" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "Thêm thẻ thời lượng" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "Thêm số lần phát" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "Thêm đánh giá" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "Thêm bỏ qua đếm bài hát" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "Thêm thẻ tựa đề bài hát" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "Thêm thẻ bài hát" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "Thêm thẻ năm của bài hát" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "Thêm bài hát vào \"Nhạc của tôi\" khi nhấn nút \"Thích\"" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "Thêm luồng dữ liệu..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "Thêm vào Nhạc của tôi" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "Thêm vào danh sách Spotify" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "Thêm vào Spotify và đánh dấu sao" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "Thêm vào danh sách khác" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "Thêm vào đánh dấu" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "Thêm vào danh sách" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "Thêm vào danh sách đợi" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "Thêm hoạt động tay cầm wii" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "Thêm..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "Đã thêm vào trong tháng này" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "Đã thêm vào trong tuần này" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "Đã thêm vào trong năm nay" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "Đã thêm vào trong ngày" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "Đã thêm vào trong ba tháng" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "Nhóm nâng cao..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "Sau " #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "Sau khi sao chép..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "Album (âm lượng lớn cho mọi bài hát)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "Nghệ sĩ của Album" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "Ảnh bìa" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "Thông tin của album trên jamendo.com..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "Album" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "Album có ảnh bìa" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "Album không có ảnh bìa" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "Tất cả" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "Mọi tập tin (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "Tất cả album" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "Tất cả nghệ sĩ" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "Mọi tập tin (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Tất cả danh sách (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "Tất cả những người dịch" #: library/library.cpp:98 msgid "All tracks" msgstr "Tất cả bài hát" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "Cho phép tải về" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "Cho phép mã hóa song song" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "Thư mục chứa tập tin gốc" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "Luôn ẩn cửa sổ chính" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "Luôn hiện cửa sổ chính" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "Bắt đầu phát nhạc" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Cần có một phần mở rộng để sử dụng Spotify trong Clementine. Bạn có muốn tải nó về và cài đặt ngay không?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "Có lỗi khi nạp cơ sở dữ liệu iTunes" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Có lỗi khi ghi thông tin vào '%1'" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "Lỗi không xác định." #: ui/about.cpp:85 msgid "And:" msgstr "Và:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "Angry" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "Giao diện" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "Thêm tập tin/URLs vào danh sách" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "Thêm vào danh sách hiện tại" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "Thêm vào danh sách" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "Nén để chặn việc ngắt đoạn" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Bạn có chắc sẽ xóa thiết lập \"%1\"?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "Bạn có chắc muốn thiết đặt lại bộ đếm của bài hát này?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Bạn có muốn ghi thông tin thống kê về tất cả các bài hát trong thư viện vào tập tin nhạc hay không?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "Nghệ sĩ" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "Nghệ sĩ" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "Thẻ nghệ sĩ" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "Tên viết tắt của nghệ sĩ" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "Hỏi khi lưu" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "Định dạng" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "Ngõ ra âm thanh" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Xác thực thất bại" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "Tác giả" #: ui/about.cpp:68 msgid "Authors" msgstr "Các tác giả" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "Tự động" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "Tự động" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "Tự động cập nhật" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "Tự động mở các mục đơn trong cây thư mục" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "Còn trống" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "Bitrate trung bình" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "Kích thước ảnh trung bình" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "Podcast BBC" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "Âm thanh nền" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "Màu nền" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "Ảnh nền" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "Độ mờ của khung nền" #: core/database.cpp:648 msgid "Backing up database" msgstr "Đang sao lưu cơ sở dữ liệu" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "Cân bằng" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "Cấm (Last.fm)" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "Phân tích theo các thanh" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "Xanh dương" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "Âm bình thường" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "Hành động" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "Tốt nhất" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "Thông tin từ %1" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "Bit rate" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "Bitrate" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "Bitrate" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "Phân tích theo các khối vuông" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "Kiểu khối" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "Độ mờ" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "Nội dung" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "Phân tích theo dạng cây" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "Duyệt tìm..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "Thời gian đệm" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "Đang tạo bộ đệm" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "Đang tạo chỉ mục Seafile..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "Những nguồn này đã bị vô hiệu:" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "Nút" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "Hỗ trợ danh sách CUE" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "Đường dẫn bộ nhớ đệm:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "Hủy bỏ" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "Hủy tải về" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "Cần phải gõ Captcha.\nHãy đăng nhập vào Vk.com bằng trình duyệt của bạn để sửa lỗi này." #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "Đổi ảnh bìa" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "Đổi kích cỡ phông chữ..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "Thay đổi chế độ lặp lại" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "Đổi phím tắt..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "Thay đổi chế độ phát ngẫu nhiên" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "Đổi bài đang phát" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Đổi ngôn ngữ" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "Thay đổi sẽ có hiệu lực khi phát bài tiếp theo" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Thay đổi tùy chỉnh phát đơn kênh sẽ ảnh hưởng đến bài kế tiếp" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "Kiểm tra tập mới" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "Kiểm tra cập nhật" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "Kiểm tra cập nhật..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "Chọn thư mục bộ nhớ đệm của Vk.com" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "Đặt tên cho danh sách nhạc của bạn" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "Tự động lựa chọn" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "Chọn màu..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "Chọn phông chữ..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "Chọn từ danh sách" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Chọn cách sắp xếp của danh sách nhạc và số bài hát trong đó." #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "Chọn thư mục lưu podcast tải về" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "Chọn các dịch vụ Internet được hiển thị." #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Chọn các trang web bạn muốn Clementine tìm lời bài hát." #: ui/equalizer.cpp:112 msgid "Classical" msgstr "Cổ điển" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "Dọn dẹp" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "Loại bỏ tất cả" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "Loại bỏ tất cả b.hát trong d.sách" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Lỗi Clementine" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Clementine Orange" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Clementine - Hình ảnh ảo" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine có thể tự động chuyển đổi định dạng nhạc mà bạn chép sang thiết bị này sang một định dạng mà nó có thể phát." #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "Clementine có thể phát nhạc đã tải lên Amazon Cloud Drive" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine có thể phát nhạc trong tài khoản Box" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine có thể phát nhạc trong tài khoản Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine có thể phát nhạc trong tài khoản Google Drive" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine có thể phát nhạc đã tải lên OneDrive" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine có thể hiện thông báo khi bài hát thay đổi." #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine có thể đồng bộ danh sách đăng kí của bạn với máy tính khác và ứng dụng podcast khác. Tạo tài khoản." #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine không thể nạp hiệu ứng hình ảnh ảo projectM. Hãy chắc rằng bạn đã cài Clementine đúng cách." #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Clementine - Xem ảnh" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine không tìm thấy kết quả cho tập tin này" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine sẽ tìm nhạc trong:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "Nhấp vào đây để thêm nhạc" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "Nhấn vào đây để thêm danh sách vào mục ưa thích. Nó sẽ được lưu lại trong phần \"Danh sách\" ở thanh bên trái." #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "Nhấn vào đây để chuyển đổi giữa thời gian còn lại và tổng thời gian" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Nhấn nút Đăng nhập sẽ mở trình duyệt web. Bạn nên trở lại với Clementine sau khi đăng nhập." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Ðóng" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "Đóng danh sách" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "Đóng hiệu ứng hình ảnh ảo" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "Đóng cửa sổ này sẽ hủy tải xuống." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "Đóng cửa sổ này sẽ kết thúc tìm ảnh bìa." #: ui/equalizer.cpp:114 msgid "Club" msgstr "Hội" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "Màu" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Dấu phẩy phân cách danh sách lớp:mức độ, mức độ từ 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "Lời bình" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "Điền thông tin bài hát" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "Điền thông tin bài hát..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "Soạn nhạc" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "Cấu hình %1..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "Cấu hình Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "Phím tắt" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "Cấu hình Spotify..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "Cấu hình Subsonic..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "Cấu hình tìm kiếm chung..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "Cấu hình thư viện..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "Cấu hình podcast..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "Cấu hình..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "Kết nối tay cầm Wii sử dụng thao tác kích hoạt/vô hiệu" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "Kết nối thiết bị" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "Kết nối đến Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Kết nối bị máy chủ từ chối, kiểm tra URL máy chủ. Ví dụ: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Hết thời gian kết nối, kiểm tra URL máy chủ. Ví dụ: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "Console" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "Bitrate cố định" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "Chuyển đổi toàn bộ nhạc" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "Chuyển đổi bất kì bản nhạc nào mà thiết bị không thể chơi" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "Chép vào bộ đệm" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "Chép vào thiết bị..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "Chép vào thư viện..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "Bản quyền" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Không thể kết nối đến Subsonic, kiểm tra URL của máy chủ. Ví dụ: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Không thể tạo phần tử GStreamer \"%1\" - hãy chắc chắn là bạn đã có đủ các phần bổ trợ mà GStreamer cần" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "Không thể tạo danh sách" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Không tìm thấy thiết bị ghép kênh cho %1, hãy chắn chắn là bạn đã cài đặt đủ các phần bổ sung của GStreamer" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Không tim thấy bộ mã hóa cho %1, hãy chắc chắn là bạn đã cài đặt đủ các phần bổ sung của GStreamer" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "Không thể mở tập tin %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "Quản lí ảnh bìa" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "Ảnh bìa từ ảnh nhúng" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Ảnh bìa được nạp tự động từ %1" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "Bỏ thiết đặt ảnh bìa một cách thủ công" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "Chưa có ảnh bìa" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "Ảnh bìa được thiết lập từ %1" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "Ảnh bìa từ %1" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "Tự động giảm dần âm lượng khi chuyển sang bài khác" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "Giảm dần âm lượng khi chuyển sang bài khác" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "Tuỳ chọn" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "Chọn ảnh:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "Thiết lập tùy chọn tin nhắn" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "Tùy chọn..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "Đường dẫn Dbus" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "Dance" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Cơ sở dữ liệu bị hỏng. Xem trang https://code.google.com/p/clementine-player/wiki/DatabaseCorruption để biết các chỉ dẫn phục hồi cho cơ sở dữ liệu" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "Ngày tạo" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "Ngày chỉnh sửa" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "Ngày" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "&Mặc định" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Giảm 4% âm lượng" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "Giảm phần trăm âm lượng" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "Giảm âm lượng" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "Dùng ảnh nền mặc định" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "Mặc định" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "Độ trễ giữa các hiệu ứng hình ảnh ảo" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "Xóa" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "Xóa dữ liệu đã tải về" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "Xóa các tập tin" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "Xóa khỏi thiết bị..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "Xóa khỏi ổ cứng..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "Xóa tập đã phát" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "Xoá thiết lập" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "Xóa danh sách thông minh" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "Xóa tập tin gốc" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Đang xóa các tập tin" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "Loại các bài đã chọn khỏi danh sách chờ" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "Loại bài hát khỏi d.sách chờ" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "Xuất ra" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "Chi tiết..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "Thiết bị" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "Thuộc tính của thiết bị" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "Tên thiết bị" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "Thuộc tính của thiết bị..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "Thiết bị" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "Hộp thoại" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Ý bạn là" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Mật khẩu Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Tên người dùng Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "Nối mạng trực tiếp" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "Thư mục" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "Tắt thời lượng" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "Tắt khởi tạo thanh trạng thái" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "Tắt" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "Tắt" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "Đĩa" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "Dừng truyền tải" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "Tùy chọn hiển thị" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Hiện hộp thông báo trên màn hình" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "Quét toàn bộ thư viện" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "Quét lại toàn bộ" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "Quét lại toàn bộ..." #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "Không chuyển đổi bất kì bản nhạc nào" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "Không ghi đè" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "Quét lại sẽ làm mất các dữ liệu lưu trong Clementine như ảnh bìa, số lần nghe và đánh giá. Clementine sẽ quét lại toàn bộ nhạc của bạn trên Google Drive nên sẽ có thể mất một lúc." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "Không lặp lại" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "Không hiện trong mục nhiều nghệ sĩ" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "Không hiện các tập đã nghe" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "Không phát ngẫu nhiên" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "Không dừng lại!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "Quyên góp" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "Nhấn đúp chuột để mở" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "Nhấn đúp chuột vào bài hát trong danh sách sẽ..." #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "Nhấn đúp chuột vào một bài hát sẽ..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "Tải về %n tập" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "Tải thư mục" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "Lưu các tập tải về vào" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "Tải với tư cách thành viên" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "Tự động tải về các tập mới" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "Đợi tải về" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "Cài đặt tải về" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "Tải ứng dụng Android" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "Tải album này" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "Tải album này..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "Tải tập này" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "Tải về..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "Đang tải (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "Đang tải thư mục Icecast" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "Đang tải mục lục Jamendo" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "Đang tải mục lục Magnatune" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "Đang tải phần hỗ trợ cho Spotify" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "Đang tải thông tin dữ liệu" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "Kéo để xác định lại vị trí" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "Dubstep" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "Thời lượng" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "Chế độ năng động đã bật" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "Hòa trộn âm thanh động ngẫu nhiên" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "Cập nhật danh sách thông minh..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Sửa \"%1\"..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "Cập nhật thẻ..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "Sửa thông tin" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "Sửa thông tin bài hát" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "Sửa thông tin bài hát..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "Sửa thông tin bài hát..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "Cập nhật..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "Email" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "Bật hỗ trợ tay cầm Wii" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "Bật bộ cân chỉnh âm" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "Bật các phím tắt chỉ khi cửa sổ Clementine đang được chọn" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "Bật sửa thông tin nhạc ngay trong danh sách" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Bật những nguồn tương ứng để tìm nhạc. Kết quả được hiển thị theo thứ tự này." #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "Bật/Tắt Chuyển thông tin bài hát đến Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "Mã hóa phức tạp" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "Chất lượng engine mã hóa" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "Chế độ mã hóa" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "Nhập URL" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "Nhập một địa chỉ để tải ảnh bìa từ internet:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "Nhập tên tập tin cho các ảnh bìa đã xuất (không có đuôi):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "Nhập tên mới cho danh sách này" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Nhập điều kiện tìm kiếm vào bên trên để tìm nhạc trong máy và trên mạng" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Nhập từ khóa để tìm podcast trên iTunes Store" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Nhập từ khóa vào bên dưới để tìm podcast trên gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "Nhập điều kiện tìm kiếm" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "Nhập địa chỉ của kênh phát thanh trên internet:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "Nhập tên thư mục" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "Nhập IP này vào ứng dụng để kết nối đến Clementine." #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "Trọn bộ sưu tập" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "Bộ cân chỉnh âm" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "Tương đương với --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "Tương đương với --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "Lỗi" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Lỗi kết nối thiết bị MTP" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "Lỗi chép nhạc" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "Lỗi xóa bài hát" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "Lỗi khi tải phần hỗ trợ Spotify" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "Lỗi nạp %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Lỗi khi nạp danh sách di.fm" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "Lỗi xử lý %1: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "Có lỗi xảy ra khi nạp đĩa CD" #: library/library.cpp:68 msgid "Ever played" msgstr "Chưa bao giờ được phát" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "Mỗi 10 phút" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "Mỗi 12 giờ" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "Mỗi 2 giờ" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "Mỗi 20 phút" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "Mỗi 30 phút" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "Mỗi 6 giờ" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "Mỗi giờ" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Ngoại trừ giữa các bài hát trong album tương tự hoặc trong danh sách CUE tương tự" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "Ảnh bìa có sẵn" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "Mở rộng" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "Hết hạn vào %1" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "Xuất ảnh bìa" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "Xuất ảnh bìa" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "Xuất các ảnh bìa đã tải" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "Xuất các ảnh bìa trong tập tin" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "Đã xuất xong" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Đã xuất %1 trên %2 ảnh bìa (đã bỏ qua %3)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "Giảm tiếng khi dừng / tăng tiếng khi tiếp tục" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "Giảm dần âm lượng khi dừng một bài hát" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "Giảm dần âm lượng" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "Thời gian giảm dần âm lượng" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "Không đọc được ổ đĩa CD" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "Lỗi tải thư mục" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "Lỗi lấy podcast" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "Lỗi nạp podcast" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "Lỗi phân tích XML cho nguồn tin RSS" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "Nhanh" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "Bài hát yêu thích" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "Tải các ảnh bìa còn thiếu" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "Tự động tải" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "Đã tải xong" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "Đang tải thư viện Subsonic" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Lỗi khi tải ảnh bìa" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "Định dạng tập tin" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "Phần mở rộng tập tin" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "Định dạng tập tin" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "Tên tập tin" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "Tên tập tin (không có đường dẫn)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "Quy tắc đặt tên tập tin:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "Đường dẫn tập tin" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "Dung lượng" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "Loại tập tin" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "Tên tập tin" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "Tập tin" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "Tập tin để chuyển mã" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "Tìm bài hát trong thư viện của bạn phù hợp với tiêu chuẩn mà bạn chỉ định." #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "Tìm nghệ sĩ này" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "Đang lấy thông tin bài hát" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "Hoàn tất" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "Mức độ đầu" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "Hiện ảnh bìa vừa chiều rộng" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "Kích cỡ phông chữ" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Vì lí do giấy phép nên Spotify được hỗ trợ thông qua một phần mở rộng." #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "Buộc mã hóa đơn kênh" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "Quên thiết bị" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "Chọn Quên thiết bị sẽ xóa tên nó khỏi danh sách này và Clementine sẽ phải quét lại tất cả nhạc khi bạn kết nối lại." #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "Biểu mẫu" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "Định dạng" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Tần số khung hình" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "Số khung mỗi lần tạo bộ đệm" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "Frozen" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "Full Bass" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "Full Bass + Treble" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "Full Treble" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "Tổng quát" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "Thiết lập chung" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "Thể loại" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "Lấy URL để chia sẻ bài này" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "Lấy URL để chia sẻ danh sách này" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "Đang tải các kênh" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "Đang tải các luồng" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "Đặt tên:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Đi" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "Đến tab danh sách tiếp theo" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "Trở về tab danh sách trước" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Đã tải %1 ảnh bìa trong số %2 (thất bại %3)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "Loại bỏ những bài hát không tồn tại khỏi các danh sách" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "Nhóm Thư viện theo..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "Nhóm theo" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "Nhóm theo Album" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "Nhóm theo Nghệ sĩ" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "Nhóm theo Nghệ sĩ/Album" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "Nhóm theo Nghệ sĩ/Năm - Album" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "Nhóm theo Thể loại/Album" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "Nhóm theo Thể loại/Nghệ sĩ/Album" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "Nhóm" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "Trang HTML không chứa nguồn tin RSS" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "Proxy HTTP" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "Happy" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "Thông tin phần cứng" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "Chỉ xem được thông tin phần cứng khi đã kết nối thiết bị." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "Cao" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "Cao (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "Cao (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "Hip hop" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Không tìm thấy máy chủ, kiểm tra lại URL. Ví dụ: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "Giờ" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "Không có tài khoản Magnatune" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "Biểu tượng" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "Biểu tượng trên cùng" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "Đang nhận diện bài hát" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "Nếu bật, bạn có thể sửa thông tin bài hát trực tiếp bằng cách nhấn vào bài đã chọn trong danh sách" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Nếu bạn tiếp tục, thiết bị này sẽ hoạt động chậm lại và các bài hát đã chép có thể sẽ không phát được." #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Nếu bạn biết URL của một podcast, nhập nó vào bên dưới và nhấn Đi." #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "Bỏ qua \"The\" trong phần tên nghệ sĩ" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Hình ảnh (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Hình ảnh (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "Nhập..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "Trong %1 ngày" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "Trong %1 tuần" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "Trong chế độ năng động, các bài hát mới sẽ được chọn và thêm vào danh sách mỗi khi một bài hát được phát xong." #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "Hộp thư đến" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "Kèm theo ảnh bìa trong thông báo" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "Bao gồm tất cả bài hát" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Chưa cấu hình xong, hãy điền vào tất cả các trường." #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Tăng 4% âm lượng" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "Tăng phần trăm âm lượng" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Tăng âm lượng" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "Đang đánh chỉ mục %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "Thông tin" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "Nhập..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Đã cài đặt" #: core/database.cpp:585 msgid "Integrity check" msgstr "Kiểm tra tính toàn vẹn" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "Dịch vụ" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "Giới thiệu bài hát" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "Khóa API không hợp lệ" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "Định dạng không hợp lệ" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "Phương thức không hợp lệ" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "Tham số không hợp lệ" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "Nguồn được xác lập không hợp lệ" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "Dịch vụ không hợp lệ" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "Khoá phiên chạy không hợp lệ" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "Đảo ngược lựa chọn" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Những bài hát được nghe nhiều nhất trên Jamendo" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Những bài hát đầu bảng trên Jamendo" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Những bài hát đầu bảng trong tháng trên Jamendo" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Những bài hát đầu bảng trong tuần trên Jamendo" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Cơ sở dữ liệu Jamendo" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "Nhảy ngay tới bài trước" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "Chọn bài đang được phát" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Giữ nút trong %1 giây..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Giữ nút trong %1 giây..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "Chạy nền khi đã đóng cửa sổ chính" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "Giữ nguyên tập tin gốc" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "Mèo con" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "Ngôn ngữ" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "Laptop/Headphones" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "Large Hall" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "Ảnh bìa lớn" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "Ảnh lớn (hiện thông tin phía dưới)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "Ảnh lớn (không có thông tin)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "Thanh bên cỡ lớn" #: library/library.cpp:80 msgid "Last played" msgstr "Lần phát cuối" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "Lần phát cuối" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm hiện đang bận, vui lòng thử lại sau vài phút" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Mật khẩu Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Số lần phát trên Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Các thẻ trên Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Tên đăng nhập Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "Những bài hát ít được yêu thích nhất" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "Trái" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "Thời lượng" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "Thư viện" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "Nhóm thư viện nâng cao" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "Chú ý quét lại thư viện" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "Tìm trong thư viện" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Giới hạn" #: ui/equalizer.cpp:137 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "Nạp" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "Nạp ảnh bìa từ URL" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "Nạp ảnh bìa từ URL..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "Nạp ảnh bìa từ đĩa" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "Nạp ảnh bìa từ đĩa..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "Mở danh sách" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "Mở danh sách..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Đang nạp thiết bị MTP" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "Đang nạp cơ sở dữ liệu iPod" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "Đang nạp danh sách thông minh" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "Đang nạp bài hát" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "Đang nạp luồng dữ liệu" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "Đang nạp bài hát" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "Đang nạp thông tin bài hát" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "Đang nạp..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "Mở tập tin/URL, thay thế danh sách hiện tại" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "Đăng nhập" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "Đăng nhập thất bại" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "Đăng xuất" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "Hồ sơ dự báo lâu dài (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "Yêu thích" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "Thích (Last.fm)" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Thấp (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "Thấp (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "Hồ sơ ít phức tạp (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "Lời bài hát" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "Lời bài hát từ %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "Lời bài hát từ thẻ ID3v2" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Tải về Magnatune" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Hoàn tất tải về Magnatune" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "Hồ sơ chính (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "Make it so!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "Danh sách sẵn sàng ngoại tuyến" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "Phản hồi có vẻ xấu" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "Cấu hình proxy thủ công" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "Thủ công" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "Nhà sản xuất" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "Đánh dấu là đã nghe" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "Đánh dấu mới" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "Tất cả các điều kiện đều khớp (AND)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "Một hay nhiều điều kiện khớp (OR)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "Số lượng kết quả tìm kiếm tối đa" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "Bitrate tối đa" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "Trung bình (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "Trung bình (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "Kiểu thành viên" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "Bitrate tối thiểu" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "Thiếu thiết đặt projectM" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "Giám sát các thay đổi trong thư viện" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "Phát đơn kênh" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "Tháng" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "Sắc thái" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "Kiểu thanh sắc thái" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "Thanh sắc thái" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "Phát nhiều nhất" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "Điểm gắn" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "Các điểm gắn" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "Chuyển xuống" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "Dời vào thư viện..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "Chuyển lên" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "Nhạc" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "Thư viện nhạc" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "Tắt âm" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "Album của tôi" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "Nhạc của tôi" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "Bài nên nghe" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "Hành động" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "Tên" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "Tùy chọn đặt tên" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "Băng hẹp (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "Proxy" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "Điều khiển qua mạng" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "Chưa bao giờ" #: library/library.cpp:74 msgid "Never played" msgstr "Chưa bao giờ phát" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "Không phát nhạc" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "Thư mục mới" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "Tạo danh sách mới" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "Tạo danh sách thông minh..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "Bài hát mới" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "Những bài hát mới sẽ được tự động thêm vào." #: library/library.cpp:92 msgid "Newest tracks" msgstr "Những bài mới nhất" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "Tiếp theo" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "Phát bài tiếp theo" #: core/utilities.cpp:151 msgid "Next week" msgstr "Tuần sau" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "Không phân tích" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "Không dùng ảnh nền" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "Không có ảnh bìa để xuất." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "Các khối không dài" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Không có kết quả nào trùng khớp. Xóa nội dung trong ô tìm kiếm để hiện danh sách trở lại." #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "Các khối ngắn" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "Không" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "Không bài hát nào phù hợp để chép qua thiết bị" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "Bình thường" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "Kiểu khối bình thường" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "Không khả thi khi dùng danh sách năng động" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "Chưa kết nối" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "Không đủ nội dung" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "Chưa đủ người hâm mộ" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "Chưa đủ thành viên" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "Chưa đủ những người lân cận" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Chưa cài đặt" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "Chưa đăng nhập" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "Chưa gắn kết - nhấp đúp chuột để gắn kết" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "Không tìm được gì" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "Thông báo" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "Thông báo" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Đang phát" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "Số tập được hiển thị" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "Xem trước hộp thông báo" #: widgets/osd.cpp:173 msgid "Off" msgstr "Tắt" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "Bật" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "Chỉ chấp nhận kết nối từ máy khách có ip trong các khoảng:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "Chỉ cho kết nối trong mạng nội bộ" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Hiện số bài hát đầu tiên" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "Độ mờ" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "Mở %1 bằng trình duyệt" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "Mở đĩa &CD..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "Mở tập tin OPML" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "Mở tập tin OPML..." #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "Mở một thư mục để thêm nhạc" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "Mở thiết bị" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "Mở tập tin..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "Mở trong Google Drive" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "Mở trong danh sách mới" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "Mở trong danh sách mới" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "Mở bằng trình duyệt" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "Mở..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "Thao tác thất bại" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "Tối ưu cho bitrate" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "Tối ưu cho chất lượng" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "Tuỳ chọn..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "Sao chép tập tin" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "Sao chép tập tin..." #: core/organise.cpp:73 msgid "Organising files" msgstr "Tổ chức tập tin" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "Thẻ gốc" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "Năm gốc" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "Năm gốc - Album" #: library/library.cpp:118 msgid "Original year tag support" msgstr "Hỗ trợ thẻ thông tin về năm gốc" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "Các tuỳ chọn khác" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "Ngõ ra" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "Thiết bị xuất" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "Tùy chọn xuất" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "Ghi đè tất cả" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "Ghi đè tập tin đã tồn tại" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "Chỉ ghi đè ảnh nhỏ hơn" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "Sở hữu" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "Đang phân tích mục lục Jamendo" #: ui/equalizer.cpp:139 msgid "Party" msgstr "Party" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "Mật khẩu" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "Tạm dừng" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "Tạm dừng phát" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Đã tạm dừng" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "Biểu diễn" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "Điểm ảnh" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "Thanh bên đơn giản" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "Phát" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "Số lần phát" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "Phát nếu như đang dừng, tạm dừng nếu như đang phát" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "Phát nhạc nếu không có bài khác đang phát" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "Phát bài hát thứ trong danh sách" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "Phát/Tạm dừng" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "Phát nhạc" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "Tùy chỉnh phát nhạc" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "Danh sách" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "Kết thúc danh sách" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "Tùy chọn danh sách" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "Loại danh sách" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "Danh sách" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "Hãy đóng trình duyệt và trở lại Clementine." #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "Trạng thái phần mở rộng:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcast" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "Pop" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "Thời gian xuất hiện" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "Cổng" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "Pre-amp" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "Tùy chỉnh" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "Tùy chỉnh" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "Tùy chỉnh..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "Tìm ảnh bìa với tên tập tin có chứa các từ sau (phân cách bằng dấu phẩy)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "Định dạng âm thanh được ưu tiên" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "Bitrate ưu tiên" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "Định dạng được ưu tiên" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "Âm cao cấp" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "Thể loại:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "Ấn tổ hợp phím để" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "Ấn một phím" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Bấm tổ hợp phím để %1..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "Ấn \"Trước\" trong chương trình sẽ..." #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "Tùy chọn hộp thông báo" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "Xem trước" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "Trước" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "Phát bài trước" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Hiển thị thông tin phiên bản" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "Hồ sơ" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "Tiến độ" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "Tiến độ" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "Ấn vào nút tay cầm Wii" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Sắp xếp ngẫu nhiên các bài hát" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "Chất lượng" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "Chất lượng" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "Truy vấn thiết bị..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "Quản lý danh sách chờ" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "Chờ phát những bài đã chọn" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "Chờ phát sau" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "Phát thanh (âm thanh bằng nhau cho mọi bài hát)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "Rain" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "Mưa" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "Hiệu ứng hình ảnh ảo ngẫu nhiên" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "Đánh giá 0 sao cho bài hiện tại" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "Đánh giá 1 sao cho bài hiện tại" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "Đánh giá 2 sao cho bài hiện tại" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "Đánh giá 3 sao cho bài hiện tại" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "Đánh giá 4 sao cho bài hiện tại" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "Đánh giá 5 sao cho bài hiện tại" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "Đánh giá" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "Thực sự hủy bỏ?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "Đã vượt số lượng chuyển hướng, hãy kiểm tra cấu hình máy chủ." #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "Cập nhật mục lục" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "Cập nhật kênh" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "Cập nhật danh sách đài" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "Cập nhật các luồng" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "Đường dẫn tương đối" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "Ghi nhớ dao động của tay cầm Wii" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "Nhớ từ lần trước" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "Nhớ lựa chọn của tôi" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "Loại bỏ" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "Loại bỏ hành động" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "Loại bỏ mục trùng nhau khỏi d.sách" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "Loại bỏ thư mục" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "Loại bỏ khỏi Nhạc của tôi" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "Xoá đánh dấu" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "Loại bỏ khỏi danh sách" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "Loại bỏ danh sách" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "Loại bỏ danh sách" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "Xoá các bài không phát được khỏi danh sách" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "Đổi tên danh sách" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "Đổi tên danh sách..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "Đánh số lại các bài hát theo thứ tự này..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "Lặp lại" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "Lặp lại album" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "Lặp lại danh sách" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "Lặp lại bài hát" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Thay thế danh sách hiện tại" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "Thay thế danh sách" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "Thay thế những khoảng trắng bằng dấu gạch dưới" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "Tăng thêm âm lượng" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "Chế độ Replay Gain" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "Phục hồi số lượng" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "Cần có mã xác thực" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "Thiết lập lại" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "Thiết lập lại bộ đếm số lần phát" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "Nghe lại bài hát, lùi lại bài trước nếu nhấn tiếp" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Nghe lại bài hát, nếu bài đang nghe chưa được 8 giây thì phát bài trước đó." #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "Phải dùng kí tự mã ASCII" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "Tiếp tục phát nhạc khi khởi động" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "Trở lại Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "Phải" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "Chạy" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "SOCKS proxy" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "Tháo gỡ thiết bị an toàn" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "Tháo gỡ thiết bị an toàn sau khi sao chép" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "Tần số âm" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "Tần số âm thanh" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "Lưu tập tin .mood trong thư viện nhạc" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "Lưu ảnh bìa album" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "Lưu lại ảnh bìa..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "Lưu ảnh" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "Lưu danh sách..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "Lưu thiết lập" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "Lưu đánh giá vào tập tin khi có thể" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "Lưu thống kê vào tập tin khi có thể" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "Lưu luồng dữ liệu này trong thẻ Internet" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "Đang lưu các bài hát" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "Hồ sơ tỉ lệ mẫu có thể mở rộng (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "Điểm" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Tự động gửi tên các bài hát tôi nghe" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "Tìm kiếm" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "Tìm kiếm" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "Tìm trên Icecast" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "Tìm trên Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "Tìm trên Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "Tìm trên Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "Tìm kiếm tự động" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "Tìm ảnh bìa..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "Tìm tất cả" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "Tìm trên gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "Tìm trên iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "Chế độ tìm kiếm" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "Tùy chỉnh tìm kiếm" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "Kết quả tìm kiếm" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "Điều kiện tìm kiếm" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "Mức độ hai" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "Lùi về sau" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "Tiến về trước" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "Tua đến khoảng tương đối trong bài đang phát" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "Tua đến vị trí chính xác trong bài đang phát" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "Tua bài bằng phím tắt" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "Chọn hết" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "Bỏ chọn hết" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "Chọn màu nền:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "Chọn ảnh nền" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "Chọn mục khớp nhiều nhất" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "Chọn màu lớp trên:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "Chọn hiệu ứng hình ảnh ảo" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "Chọn hiệu ứng hình ảnh ảo..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "Chọn..." #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "Số sê-ri" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "Máy chủ" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "URL máy chủ" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "Chi tiết máy chủ" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "Dịch vụ ngoại tuyến" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Thiết lập %1 sang \"%2\"..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Đặt âm lượng ở mức phần trăm" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "Đặt giá trị cho tất cả những bài được chọn..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "Thiết lập" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "Phím tắt" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "Phím tắt để %1" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Đã có phím tắt để %1" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "Hiển thị" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "Hiện hộp thông báo" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "Hiện hiệu ứng làm nổi bật bài hát hiện tại" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "Hiện thanh sắc thái đè lên thanh thời gian" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "Hiện hộp thông báo" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Hiện thông báo khi thay đổi chế độ lặp lại/phát ngẫu nhiên" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "Hiện thông báo khi thay đổi âm lượng" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "Hiện thông báo khi dừng nhạc" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "Hiện một thông báo nhỏ dưới khay hệ thống" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "Tùy chỉnh thông báo" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "Hiện phía trên thanh trạng thái" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "Hiện tất cả bài hát" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Hiện tất cả bài hát" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "Hiện ảnh bìa trong thư viện" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "Hiện đường phân cách" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "Hiện với kích thước gốc..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "Mở thư mục lưu..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "Hiện trong thư viện..." #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "Hiện trong mục nhiều nghệ sĩ" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "Hiện thanh sắc thái" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "Chỉ hiện những mục bị trùng" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "Chỉ hiện những mục không được gán thẻ" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "Hiện bài đang nghe trên trang của bạn" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "Hiện đề nghị tìm kiếm" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "Hiện nút \"thích\"" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "Hiện nút chuyển thông tin trong cửa sổ chính" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "Hiện biểu tượng dưới khay hệ thống" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "Hiện những nguồn đã được bật và tắt" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "Hiện/Ẩn" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "Phát ngẫu nhiên" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "Phát ngẫu nhiên album" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "Phát ngẫu nhiên tất cả" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "Phát ngẫu nhiên danh sách" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "Phát ngẫu nhiên trong album này" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "Đăng nhập" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "Đăng xuất" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "Đang đăng nhập..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "Nghệ sĩ tương tự" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "Kích thước" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "Kích thước:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "Không cho lùi lại trong danh sách" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "Không đếm" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Không cho chuyển bài trong danh sách" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "Bỏ qua các bài đã chọn" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "Bỏ qua bài hát" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "Ảnh bìa nhỏ" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "Thanh bên nhỏ" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "Danh sách thông minh" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "Danh sách thông minh" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "Thông tin bài hát" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "Bài hát" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "Rất tiếc" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "Sắp xếp theo thể loại (theo thứ tự abc)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "Sắp xếp theo thể loại (theo mức độ phổ biến)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "Sắp xếp dựa theo tên đài" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Sắp xếp bài hát theo" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Sắp xếp" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "Nguồn" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "Nguồn" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Lỗi đăng nhập Spotify" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "URL của danh sách Spotify" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Phần hỗ trợ Spotify" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Phần hỗ trợ Spotify chưa được cài đặt" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "URL của bài hát trên Spotify" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "Chuẩn" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "Đã đánh giá" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "Bắt đầu danh sách đang phát" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "Bắt đầu chuyển mã" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Gõ gì đó vào ô tìm kiếm" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "Bắt đầu %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "Đang bắt đầu..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "Dừng" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "Dừng lại sau khi" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "Dừng lại sau mỗi bài" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "Dừng lại sau mỗi bài" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "Dừng sau khi phát xong bài này" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "Dừng lại" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "Dừng khi phát xong bài hiện tại" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "Dừng lại sau bài: %1" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "Đã dừng" #: core/song.cpp:431 msgid "Stream" msgstr "Truyền tải" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Cần giấy phép hợp lệ để tải nhạc từ Subsonic sau 30 ngày dùng thử." #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "Truyền tải thông tin thành viên" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "Người đăng kí" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "Thành công!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "Đã ghi vào %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "Thẻ được đề nghị" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "Tóm tắt" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "Rất cao (%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "Rất lớn (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "Các định dạng được hỗ trợ" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "Đồng bộ thống kê vào tập tin ngay" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "Đang đồng bộ hộp thư đến Spotify" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "Đang đồng bộ danh sách Spotify" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "Đang đồng bộ các bài hát được đánh dấu sao của Spotify" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "Màu hệ thống" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "Các thẻ ở phía trên" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "Trình tải thẻ" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "Bitrate mục tiêu" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "Tùy chỉnh văn bản" #: ui/about.cpp:74 msgid "Thanks to" msgstr "Xin gửi lời cám ơn đến" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Không thể bắt đầu lệnh \"%1\"." #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "Ảnh bìa của bài hát hiện tại" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "Thư mục %1 không hợp lệ" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "Giá trị thứ hai phải lớn hơn giá trị thứ nhất!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "Trang bạn đã yêu cầu không tồn tại!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "Trang bạn đã yêu cầu không phải là một tấm ảnh!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Thời hạn dùng thử Subsonic đã hết. Hãy nộp phí để nhận giấy phép. Xem thêm chi tiết tại subsonic.org" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "Phiên bản Clementine bạn vừa cập nhật yêu cầu quét thư viện bởi các tính năng mới được liệt kê bên dưới:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "Có bài khác trong album này" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "Có một vấn đề khi giao tiếp với gpodder.net" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Có vấn đề khi lấy thông tin từ Magnatune" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Có vấn đề khi phân tích phản hồi từ iTunes Store" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Có vấn đề khi đang sao chép một số bài hát. Không thể sao chép các tập tin sau đây:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Có vấn đề khi xóa một số bài hát. Không thể xóa các tập tin sau đây:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Các tập tin này sẽ bị xóa khỏi thiết bị, bạn có muốn tiếp tục?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Những tập tin này sẽ bị xóa khỏi đĩa cứng vĩnh viễn, bạn có chắc chắn muốn tiếp tục không?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "Các thư mục này sẽ được quét để thêm nhạc vào thư viện" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Các thiết lập này được sử dụng trong hộp thoại \"Chuyển mã nhạc\", và khi chuyển đổi nhạc trước khi chép chúng vào thiết bị." #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "Mức độ ba" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "Thao tác này sẽ tạo một cơ sở dữ liệu và dung lượng của nó có thể đạt 150MB.\nBạn có muốn tiếp tục không?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "Album này không có trong định dạng yêu cầu" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "Có thể thay đổi sau trong mục Tùy chỉnh" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Thiết bị này phải được kết nối và mở trước để Clementine có thể nhận biết được các định dạng mà nó hỗ trợ." #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "Thiết bị này hỗ trợ các định dạng sau đây:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Thiết bị này sẽ không làm việc đúng cách" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Đây là thiết bị MTP, nhưng bạn đã biên dịch Clementine mà không có hỗ trợ libmtp." #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Đây là một chiếc iPod, nhưng bạn đã biên dịch Clementine mà không có hỗ trợ libgpod." #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "Đây là lần đầu tiên bạn kết nối thiết bị này. Clementine sẽ bắt đầu quét thiết bị để tìm các tập tin nhạc - có thể mất một ít thời gian." #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "Luồng này chỉ dành cho người trả phí" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "Loại thiết bị này không được hỗ trợ: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "Tựa đề" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "Hôm nay" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "Bật/Tắt hộp thông báo" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Tắt/Bật toàn màn hình" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "Tắt/Bật trạng thái chờ" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "Bật/Tắt Chuyển thông tin bài hát" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Bật/Tắt hiển thị của hộp thông báo" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "Ngày mai" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "Quá nhiều chuyển hướng" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "Những bài đứng đầu" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "Số byte đã truyền tải" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "Số lần gửi yêu cầu" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "Bài hát" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "Bài hát" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "Chuyển mã nhạc" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "Nhật kí chuyển mã" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "Chuyển mã" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Đang chuyển mã %1 tập tin sử dụng %2 luồng" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "Tùy chỉnh chuyển mã" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "Tắt" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "Băng siêu rộng (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "Không kết nối được" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Không thể tải về %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "Chưa xác định" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "Không hiểu nội dung" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "Lỗi không xác định" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "Bỏ thiết đặt ảnh bìa" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "Hủy việc bỏ qua các bài đã chọn" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "Hủy bỏ qua bài hát" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "Hủy đăng kí" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "Các buổi hòa nhạc sắp diễn ra" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "Cập nhật" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "Cập nhật tất cả podcast" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "Cập nhập thư mục thư viện đã thay đổi" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Cập nhật thư viện khi Clementine khởi động" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "Cập nhật podcast này" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "Cập nhật" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Đang cập nhật %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "Đang cập nhật %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Đang cập nhật thư viện" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Cách sử dụng" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "Dùng thẻ Nghệ sĩ của album khi có thể" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "Sử dụng phím tắt của Gnome" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "Sử dụng thông tin để tăng âm lượng nếu có" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "Dùng SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "Sử dụng tay cầm điều khiển Wii" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "Chọn màu" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "Tùy chọn tin nhắn thông báo" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "Sử dụng xác thực" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "Dùng engine quản lí bitrate" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "Sử dụng chế độ năng động" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "Dùng thông báo để cập nhật trạng thái của tay cầm Wii" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "Tạo tiếng ồn tạm thời" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "Mặc định của hệ thống" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "Dùng thiết lập màu mặc định của hệ thống" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "Sử dụng thiết lập proxy của hệ thống" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "Sử dụng cân bằng âm lượng" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "Đã dùng" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "Giao diện người dùng" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "Tên người dùng" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "Sử dụng trình đơn để thêm một bài hát sẽ..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "Bit rate thay đổi" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "Nhiều nghệ sỹ" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "Phiên bản %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "Hiển thị" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "Chế độ hình ảnh ảo" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "Hình ảnh ảo" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "Thiết đặt hiệu ứng hình ảnh ảo" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "Nhận dạng âm thanh hoạt động" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "Âm lượng %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "Nhắc nhở tôi khi đóng một thẻ danh sách" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "Trang web" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "Tuần" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Khi Clementine khởi động" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "Khi tìm ảnh bìa album Clementine sẽ tìm các tập tin ảnh chứa một trong các từ này trước.\nNếu không có kết quả nào trùng khớp thì sẽ sử dụng bức ảnh lớn nhất trong thư mục." #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "Khi lưu danh sách, thư mục lưu là" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "Khi danh sách trống..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "Tại sao không thử..." #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "Băng rộng (Wb)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Tay cầm Wii %1: đã kích hoạt" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Tay cầm Wii %1: đã kết nối" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Tay cầm Wii %1: sắp hết pin (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Tay cầm Wii %1: đã tắt" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Tay cầm Wii %1: đã ngắt kết nối" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Tay cầm Wii %1: Pin yếu (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Tay cầm Wii" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Âm thanh Windows Media" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "Không có ảnh bìa:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Bạn có muốn chuyển những bài khác trong album này vào mục nhiều nghệ sĩ không?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "Bạn muốn quét lại toàn bộ ngay bây giờ?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "Ghi tất cả thống kê của các bài hát vào các tập tin" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "Ghi thông tin" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "Sai tên người dùng hoặc mật khẩu." #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "Năm" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "Năm - Album" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "Năm" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "Hôm qua" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "Bạn muốn tải xuống các album sau" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Bạn có chắc muốn loại bỏ %1 danh sách từ yêu thích?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "Bạn sắp loại bỏ một danh sách không nằm trong mục yêu thích: danh sách này sẽ bị xóa (không thể khôi phục được).\nBạn có chắc chắn muốn tiếp tục không?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "Bạn chưa đăng nhập." #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "Bạn đã đăng nhập với tên %1." #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "Bạn đã đăng nhập." #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "Bạn có thể thay đổi cách tổ chức các bài hát trong thư viện." #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Bạn có thể nghe nhạc miễn phí không cần tài khoản, nhưng nếu dùng tài khoản cao cấp, chất lượng nhạc sẽ cao hơn và không có quảng cáo." #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "Bạn có thể nghe các bài hát từ Magnatune miễn phí và không cần tài khoản. Việc trả phí thành viên có thể loại bỏ các tin nhắn ở cuối mỗi bài hát." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "Bạn có thể nghe âm thanh nền một cách riêng lẻ hay được lồng vào nhạc." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "Bạn có thể điều khiển Clementine từ xa với tay cầm Wii. Xem bài viết trên Clementine wiki để biết thêm chi tiết.\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Bạn không có tài khoản cao cấp của Spotify." #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "Bạn không có một đăng kí được kích hoạt" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Bạn đã đăng xuất khỏi Spotify, hãy nhập lại mật khẩu trong hộp thoại Thiết lập." #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Bạn đã đăng xuất khỏi Spotify, hãy nhập lại mật khẩu." #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "Bạn thích bài hát này" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "Bạn cần khởi động lại Clementine khi thay đổi ngôn ngữ." #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "Địa chỉ IP của bạn:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Thông tin tài khoản Last.fm không đúng" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "Thông tin tài khoản Magnatune không đúng" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "Thư viện của bạn chưa có gì!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "Kênh phát thanh của bạn" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "Thông tin bài hát của bạn: %1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Hệ thống của bạn không hỗ trợ OpenGL, hiệu ứng hình ảnh ảo không chạy được." #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "Tên người dùng hay mật khẩu không đúng." #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Không" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "và %n bài hát" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "sau" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "trước" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "và" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "tự động" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "trước" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "giữa" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "lớn nhất trước" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "có chứa" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "đã tắt" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "đĩa %1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "không chứa" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "kết thúc với" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "bằng" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "Thư mục gpodder.net" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "lớn hơn" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "iPod và các thiết bị USB hiện không hoạt động trên Windows. Rất xin lỗi!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "cuối" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "nhỏ hơn" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "dài nhất trước" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "di chuyển %n bài hát" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "mới nhất trước" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "không bằng" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "không ở cuối" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "không có ở" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "cũ nhất trước" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "vào" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "tùy chọn" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "hoặc quét mã QR!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "nhấn enter" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "loại bỏ %n bài hát" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "ngắn nhất trước" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "phát ngẫu nhiên" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "nhỏ nhất trước" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "sắp xếp bài hát" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "bắt đầu với" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "dừng" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "bài %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/zh_CN.po000066400000000000000000004740451260417502300242560ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Aron Xu , 2011 # Weibing Chen , 2012 # Weibing Chen , 2012 # xaojan , 2012 # davidsansome , 2010,2014 # mabier , 2014 # walking , 2013 # xaojan , 2012 # Xinkai Chen , 2012 # Xinkai Chen , 2012 # zhangmin , 2013-2015 # zhangmin , 2013-2014 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Chinese (China) (http://www.transifex.com/davidsansome/clementine/language/zh_CN/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\n您可以通过点击播放列表名称旁的星标来收藏播放列表\n\n收藏的播放列表将被保存至此" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "天" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr "千比特每秒" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " 毫秒" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " 磅" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "s" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " 秒" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " 首" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 首歌)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 个专辑" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 天" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 天前" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%1 在 %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 播放列表 (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 选定" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 首" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 首" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "找到 %1 首歌" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "找到 %1 首(显示 %2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 首" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "%1 已传输" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wii 遥控器设备模块" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1 位收听者" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 合计播放" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n 失败" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n 完成" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n 剩余" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "对齐文本(&A)" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "居中(&C)" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "自定义(&C)" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "附件(&E)" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "帮助(&H)" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "隐藏 %1(&H)" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "隐藏(&H)..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "左对齐(&L)" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "音乐(&M)" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "无(&N)" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "播放列表(&P)" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "退出(&Q)" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "循环模式(&R)" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "右对齐(&R)" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "随机播放模式(&S)" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "拉伸栏以适应窗口(&S)" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "工具(&T)" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(多个曲目间不同)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ", - " #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...和所有 Amarok 的贡献者" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 天" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 个曲目" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "192,000Hz" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "44,100Hz" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "48,000Hz" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 个随机曲目" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "96,000Hz" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "立即升级至豪华版" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

如果未勾选, Clementine 将尽量在外部数据库中保存您的内容评级及其它统计信息,并不会修改您的文件。

如果勾选,程序在每次信息更新时会将统计信息保存至数据库并同时直接写入文件。

注意,因为缺少标准可循,这并不对所以格式都有效,其它播放器也不一定都能读取这些信息。

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

在搜索关键词前加分类前缀进行搜索,例如: artist:Bode 搜索所有名字中包含 Bode 的艺术家。

可用的前缀有: %1.

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "

这会将每首歌曲的评级和统计信息写入您所有歌曲库中歌曲的文件标记中。

如果 "保存评级和统计到文件标记中" 选项始终开启,本操作没有必要执行。

" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

变量标记以%开头,例如: %artist %album %title

\n\n

如果您用花括号\"{}\"将含有标记的部分文本括起来,此部分在标记内容为空时将自动隐藏。

" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "需要一个 Spotify 的付费账户。" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "只有在输入正确代码后,客户端才能连接。" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "智能播放列表是产生于您的媒体库的动态列表。不同的智能播放列表提供帮您选歌的不同方式。" #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "一首歌如果满足这些条件就会被加入此播放列表。" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ALL GLORY TO THE HYPNOTOAD" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "中止" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "关于 %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "关于 Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "关于 Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "绝对" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "帐号详情" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "帐号详情 (付费账户)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "操作" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "操作" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "启用/禁用 Wii 遥控器" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "热门音频" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "添加播客" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "添加流媒体" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "如果支持此通知类型,则添加一个新行" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "添加动作" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "添加目录及其子目录的所有曲目" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "添加其他流媒体..." #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "添加目录..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "添加文件" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "添加文件至转码器" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "添加文件至转码器" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "添加文件..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "添加需转码文件" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "添加文件夹" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "添加文件夹..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "添加新文件夹..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "添加播客" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "添加播客..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "添加查询条件" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "添加歌曲专辑标签" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "添加歌曲专辑作者标签" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "添加歌曲艺术家标签" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "添加歌曲自动评分" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "添加歌曲作曲家标签" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "添加歌曲盘片标签" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "添加音乐文件" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "添加歌曲流派标签" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "添加歌曲分组标签" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "添加歌曲长度标签" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "添加歌曲表演者标签" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "统计音乐播放次数" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "添加歌曲评级" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "统计跳过歌曲的次数" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "添加歌曲标题标签" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "添加歌曲到缓存" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "添加歌曲曲目标签" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "添加歌曲年份标签" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "当点击\"喜欢\"按钮后将歌曲添加到\"我的音乐\"" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "添加流媒体..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "添加到我的音乐" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "添加到 Spotify 播放列表" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "添加到 Spotify 收藏" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "添加到另一播放列表" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "添加到书签" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "添加到播放列表" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "添加到队列" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "添加用户/组到书签" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "添加 Wii 遥控器设备动作" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "添加..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "本月加入" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "本周加入" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "今年加入" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "今日加入" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "于三个月内加入" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "高级分组..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "之后 " #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "复制后..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "专辑" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "专辑(所有曲目采用合适音量)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "专辑艺人" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "专辑封面" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr "jamendo.com 上的专辑信息..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "专辑" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "有封面的专辑" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "无封面的专辑" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "所有" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "全部文件 (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "全部归功于睡蛙!" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "全部专辑" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "全部艺人" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "全部文件 (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "全部播放列表 (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "所有翻译人员" #: library/library.cpp:98 msgid "All tracks" msgstr "全部曲目" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "允许客户端从本机下载音乐。" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "允许下载" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "允许 M/S 编码 (和差编码)" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "原始歌曲同一目录下" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "总是隐藏主窗口" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "总是显示主窗口" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "总是开始播放" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "Amazon 云盘" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Clementine 需要安装额外的插件才能使用 Spotify。现在就下载并安装吗?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "加载 iTunes 数据库时出错" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "向 '%1' 写入元数据时出错" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "出现了意外错误。" #: ui/about.cpp:85 msgid "And:" msgstr "和:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "愤怒" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "外观" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "添加文件/URL 到播放列表" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "追加至当前播放列表" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "追加至播放列表" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "允许压缩以阻止剪切" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "您确定要删除预设 %1 吗?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "您确定要重置此曲目的统计信息吗?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "您确定要将媒体库中所有歌曲的统计信息写入相应的歌曲文件?" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "艺人" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "艺人信息" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "艺人标签" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "艺术家名字的首字母" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "保存时提示" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "音频格式" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "音频输出" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "认证失败" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "作者" #: ui/about.cpp:68 msgid "Authors" msgstr "作者" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "自动" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "自动" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "自动更新" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "自动打开媒体库树重的单个分类" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "可用" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "平均位速率" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "图片平均大小" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "BBC 播客" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "背景流媒体" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "背景颜色" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "背景图片" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "背景透明度" #: core/database.cpp:648 msgid "Backing up database" msgstr "备份数据库" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "均衡" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "Ban (Last.fm 音乐记录)" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "条形分析器" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "基础蓝" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "基本音频类型" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "行为" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "最佳" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "%1 上的个人档案" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "位速率" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "位速率" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "比特率" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "块状分析器" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "屏蔽类型" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "模糊量" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "通知正文" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "轰鸣音分析器" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "浏览..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "缓冲时长" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "缓冲中" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "建立 Seafile 索引..." #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "但这些资源已经被禁止" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "按钮" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "CUE 支持" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "缓存路径:" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "缓存中" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "缓存 %1 中" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "取消" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "取消下载" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "需要Captcha\n请使用浏览器登录 VK.com 修复此问题" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "更改封面" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "更改字号..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "改变重复模式" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "更改快捷键..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "更改乱序模式" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "改变正在播放歌曲" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "更改语言" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "变更会在下首歌播放时生效" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "单声道回放设置的改变将在下首歌曲播放时生效" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "检测新节目" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "检查更新" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "检查更新..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "选择 VK.com 缓存目录" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "为您的智能播放列表起名" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "自动选择" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "选择颜色..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "选择字体..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "从列表中选择" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "选择播放列表的排序方式和包含歌曲数量。" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "选择播客下载目录" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "选择想显示的网络服务。" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "选择 Clementine 搜索歌词的网站。" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "古典" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "清理" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "清除" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "清空播放列表" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Clementine 错误" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Clementine 橙" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Clementine 视觉效果" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine 可自动将要复制到设备的文件转换为它可以播放的格式。" #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "CLementine 可以播放您上传到 Amazon Cloud Drive 的音乐" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine 可以播放你上传到 Box 云存储的音乐" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine 可以播放你上传到 Dropbox 的音乐" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine 可以播放你上传到Google云存储的音乐" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine 可以播放 OneDrive 上保存的音乐" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "Clementine 可在曲目发生变化时显示提示。" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine 能够同步您在不同计算机和播客程序订阅的博客。创建新帐户。" #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine 无法加载 projectM 可视化效果。请确定您已正确安装了 Clementine。" #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Clementine 图像查看器" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine 无法为此文件查找结果" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine 将在这些地方搜索音乐:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "点击此处添加一些音乐" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "点此收藏播放列表,列表将被保存并可稍候通过左侧边栏的“播放列表”面板访问" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "单击切换剩余时间和总计时间模式" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "点击登录按钮将会打开网络浏览器。 登录之后将回到 Clementine。" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "关闭" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "关闭播放列表" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "关闭视觉效果" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "关闭此窗口将取消下载。" #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "关闭此窗口将停止寻找专辑封面。" #: ui/equalizer.cpp:114 msgid "Club" msgstr "俱乐部" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "颜色" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "class:level 列表用逗号分隔,level 范围 0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "备注" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "社区广播" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "自动补全标签" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "自动补全标签..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "作曲" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "配置 %1 ..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "配置 Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "配置快捷键" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "配置Spotify..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "配置 Subsonic..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "配置 VK.com" #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "配置全局搜索…" #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "配置媒体库..." #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "正在设置播客..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "配置..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "连接 Wii 遥控器" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "连接设备" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "连接Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "连接被服务器拒绝,请检查服务器链接。例如: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "连接超时,请检查服务器链接。例如: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "连接出错或用户已禁用音频" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "终端" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "固定位速率" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "转换全部音乐" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "转换设备不能播放的音乐" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "在远程发送前转换无损音频文件。" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "转换无损文件" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "复制分享链接" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "复制到剪切板" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "复制到设备..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "复制到媒体库..." #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "版权所有" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "无法连接至 Subsonic,请检查服务器链接。例如: http://localhost:4040/" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "无法创建GStreamer元素 \"%1\" - 请确认您已安装了所需GStreamer插件" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "无法创建列表" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "无法为%1找到混音器,请检查是否安装了正确的Gstreamer插件" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "无法找到适合 %1 的解码器,请确认您正确安装了GStreamer插件" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "无法打开输出文件 %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "封面管理器" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "从内嵌图片获取封面" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "从 %1 自动加载封面" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "手工清除了封面" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "未设置封面" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "从 %1 中设置封面" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "来自%1的封面" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "自动换曲时淡入淡出" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "手动换曲时淡入淡出" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "自定义" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "自定义图片:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "自定义消息设置" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "自定义..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "DBus 路径" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "舞曲" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "检测到数据库损坏,请查阅 https://code.google.com/p/clementine-player/wiki/DatabaseCorruption 获取恢复数据库的方法" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "创建日期" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "修改日期" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "天" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "默认(&F)" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "音量减少 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "降低音量 %" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "降低音量" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "默认背景图片" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "%1 的默认设备" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "默认" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "在两个视觉化效果间延迟切换" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "删除" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "删除已下载的数据" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "删除文件" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "从设备删除..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "从硬盘删除..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "删除收听过的节目" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "删除预设" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "删除智能播放列表" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "删除原始文件" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "删除文件" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "移除选定曲目" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "移除曲目" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "目标" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "详情..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "设备" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "设备属性" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "设备名称" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "设备属性..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "设备" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "对话框" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "您是想搜索" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Digitally Imported 密码" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Digitally Imported 用户名" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "直接连接到互联网" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "目录" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "关闭时长" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "禁止生成心情指示条" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "禁用" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "关闭" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "盘片" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "断续传输" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "显示选项" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "显示屏幕显示" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "重新扫描整个媒体库" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "执行完整扫描" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "执行完整扫描" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "不转换任何曲目" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "不要覆盖" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "执行完整扫描会丢失所有 Clementine 中的元数据,例如封面,播放次数和评分等。Clementine 会扫描您 Google Drive 中的所有音乐,可能需要很长时间." #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "不循环播放" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "不在群星中显示" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "不要显示已经收听过的" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "不随机播放" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "不要停止!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "捐助" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "双击打开" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "双击播放列表中的歌曲将..." #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "双击歌曲将..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "已经下载了 %n 个节目" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "下载目录" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "下载节目到" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "下载会员" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "自动下载新的节目" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "下载队列" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "下载设置" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "下载 Android 应用" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "下载此专辑" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "下载此专辑..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "下载此节目" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "下载..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "下载中 (%1%)..." #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "正在下载 Icecast 目录" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "正在下载 Jamendo 分类" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "正在下载 Magnatune 分类" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "下载Spotify插件中" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "下载元数据" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "拖拽以重新定位" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "Dropbox" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "回响贝斯" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "长度" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "已打开动态模式" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "动态随机混音" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "编辑智能播放列表..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "编辑标签 \"%1\"..." #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "编辑标签..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "编辑标签" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "编辑曲目信息" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "编辑曲目信息..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "编辑曲目信息..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "编辑..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "邮箱" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "启用 Wii 遥控支持" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "启用自动缓存" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "启用均衡器" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "仅当 Clementine 在焦点时启用快捷键" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "启用单击后行内编辑元数据" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "在搜索结果中启用以下来源。结果将按以下顺序显示。" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "启用/禁用 Last.fm 的音乐记录" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "编码复杂度" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "编码引擎质量" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "编码模式" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "输入网址(URL)" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "输入 URL 以便从网络下载封面:" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "输入导出封面的文件名(不含扩展名):" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "输入播放列表的新名称" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "输入搜索项,在本地电脑和网络搜索" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "使用下方输入的内容在 iTunes商店 上搜索播客" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "使用下方输入的内容在 gpodder.net 上搜索播客" #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "在此输入查找条件" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "请输入互联网广播流媒体地址:" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "输入文件夹名字" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "在应用中输入此 IP 来连接上 Clementine。" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "整个集合" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "均衡器" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "相当于 --log-levels *:1" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "相当于 --log-levels *:3" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "错误" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "CD抓轨出错" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "连接 MTP 设备出错" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "复制曲目出错" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "删除曲目出错" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "下载Spotify插件出错" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "载入 %1 出错" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "读取di.fm播放列表错误" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "处理 %1 出错:%2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "读取CD时发生错误" #: library/library.cpp:68 msgid "Ever played" msgstr "曾经播放" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "每10分钟" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "每12小时" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "每2小时" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "每20分钟" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "每30分钟" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "每6小时" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "每小时" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "同一专辑歌曲或者同一CUE sheet不淡出" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "现有封面" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "扩展" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "于%1过期" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "导出封面" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "导出封面" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "导出下载的封面" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "导出内嵌封面" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "导出完成" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "已导出 %1 个封面,共 %2 个(跳过 %3 个)" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "暂停时淡出/恢复时淡入" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "停止播放曲目时淡出" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "淡出" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "淡出时长" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "读取 CD 失败" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "无法获取目录" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "无法获取播客" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "无法读取播客" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "无法解析此 RSS 种子的XML" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "快速" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "收藏的曲目" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "获取缺少的封面" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "自动获取" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "读取完毕" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "正在获取 Subsonic 曲目库" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "获取封面出错" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "文件格式" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "文件扩展名" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "文件格式" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "文件名" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "文件名(无路径)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "文件名模式:" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "文件路径" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "文件大小" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "文件类型" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "文件名" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "文件" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "要转换的文件" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "在你的媒体库里查找符合条件的歌曲。" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "搜索此艺术家" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "识别音乐" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "完成" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "第一阶段" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "适应封面到等宽" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "字号" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "由于许可证原因 Spotify 支持位于单独的插件中。" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "强制单声道编码" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "忘记设备" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "忘记设备将从列表删除该设备.如果下次您再次插入该设备,Clementine将重新扫描所有歌曲。" #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "表格" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "格式" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "帧速率" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "每次缓冲帧数" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "冻结" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "重低音" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "低音饱满 + 高音清丽" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "高音" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "一般" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "常规设置" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "流派" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "获取一个分享该 Spotify 音乐的网址" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "获取一个分享该播放列表的网址" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "获得频道" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "获取流" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "给它起个名字" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "Go" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "转到下一播放列表标签" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "转到上一播放列表标签" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google云存储" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "获取了 %1 个封面,共 %2 个(失败 %3 个)" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "灰色显示播放列表中不存在的歌曲" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "媒体库分组..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "分组" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "按专辑分组" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "按艺人分组" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "按艺人/专辑分组" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "按艺人/年份分组 - 专辑" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "按流派/专辑分组" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "按流派/艺人/专辑分组" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "分组" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "HTML页面没有包含任何 RSS 种子" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "未获得 URL 返回 HTTP 3xx 状态代码, 请检查服务器配置。" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "HTTP 代理" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "高兴" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "硬件信息" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "硬件信息仅在设备连接上后可用。" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "高" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "高(%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "高(1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "嘻哈" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "主机未找到,请检查服务器链接。例如: http://localhost:4040/" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "小时" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "蛤蟆" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "我没有 Magnatune 帐号" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "图标" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "图标在上" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "识别曲目" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "如果选择启用,在播放列表中点击一个已选择的歌曲则会直接打开标签编辑" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "如果您选择继续,设备运行将会变慢并且复制歌曲工作可能无法正常进行。" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "如果您知道播客地址,请在下面填入地址并且点击 Go。" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "忽略艺人名称中的“The”" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "图像 (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "图像 (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "导入..." #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "在 %1 天内" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "%1 周内" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "在动态模式中, 每次歌曲播放完之后会被选择并添加新歌曲到播放列表.使用动态模式将忽略您的播放列表大小设定值。" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "收件夹" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "在通知中加入专辑封面" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "包含所有的歌曲" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Subsonic REST 协议版本不兼容。客户端需更新。" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Subsonic REST 协议版本不兼容。服务端需更新。" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "配置不完整,请确认所有字段都已填好。" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "以 4% 为单位增大音量" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "提升音量 %" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "增大音量" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "正在索引 %1" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "信息" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "输入选项" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "插入..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "已安装" #: core/database.cpp:585 msgid "Integrity check" msgstr "完整性检验" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "互联网" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "互联网提供商" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "网络服务" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "代表曲目" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "无效的 API 密钥" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "无效格式" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "无效方式" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "无效参数" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "指定的资源无效" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "服务无效" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "会话钥匙无效" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "反选" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Jamedo 最受欢迎曲目" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Jamendo 曲目排行" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo 本月曲目排行" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo 本周曲目排行" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Jamendo 数据库" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "立即跳到上首歌" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "跳转到当前播放的曲目" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "保持按钮 %1 秒..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "保持按钮 %1 秒..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "当窗口关闭时仍在后台运行" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "保留原始文件" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "小猫咪" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "Kuduro" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "语言" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "笔记本电脑/耳机" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "大礼堂" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "大专辑封面" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "大专辑封面(详情如下)" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "大专辑封面(无详情)" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "大侧边栏" #: library/library.cpp:80 msgid "Last played" msgstr "最近播放" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "上次播放的" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm 正忙,请及分钟后再试" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Last.fm 密码" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Last.fm 播放计数" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Last.fm 标签" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Last.fm 用户名" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Last.fm 维基" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "最不喜欢的曲目" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "左" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "长度" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "媒体库" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "媒体库高级分组" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "重新扫描媒体库提示" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "媒体库搜索" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "限制" #: ui/equalizer.cpp:137 msgid "Live" msgstr "直播" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "载入" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "从 URL 载入封面" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "从 URL 载入封面..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "从磁盘读取封面" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "从磁盘载入封面..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "载入播放列表" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "载入播放列表..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "正在载入 MTP 设备" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "正在载入 iPod 数据库" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "正在载入智能播放列表" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "加载曲目" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "正在载入媒体流" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "正在载入曲目" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "正在加载曲目信息" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "正在载入..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "载入文件或URL,替换当前播放列表" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "登录" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "登录失败" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "注销" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "长期预测 (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "喜爱" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "喜欢(Last.fm 音乐记录)" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "低(%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "低(256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "低复杂度 (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "歌词" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "歌词来自 %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "ID3v2 标签中的歌词" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "M4A AAC" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Magnatune 下载" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Magnatune 下载完成" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "主要档案(MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "就这样吧!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "努力去实现它!" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "播放列表离线可用" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "无效的响应" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "手工设置代理" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "手动" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "生产商" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "标记为已听" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "标记为新的" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "匹配每个查询条件(与)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "匹配一个或多个查询条件(或)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "最大全局搜索结果" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "最大位速率" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "媒体库已改变,重新载入中" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "中(%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "中(512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "会员类型" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "最小位速率" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "最小缓冲填充" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "projectM 设置缺失" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "型号" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "监控媒体库的更改" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "单曲循环" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "月" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "心情" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "心情指示条风格" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "心情指示条" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "更多" #: library/library.cpp:84 msgid "Most played" msgstr "最常播放" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "挂载点" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "挂载点" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "下移" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "移动至媒体库..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "上移" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "音乐" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "媒体库" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "静音" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "我的专辑" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "我的音乐" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "我的推荐" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "名称" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "名字" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "命名选项" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "窄带(NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "网络代理" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "网络远程" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "从不" #: library/library.cpp:74 msgid "Never played" msgstr "从未播放" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "从未播放" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "创建新文件夹" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "新建播放列表" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "新建智能播放列表..." #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "新曲目" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "新曲目会被自动添加。" #: library/library.cpp:92 msgid "Newest tracks" msgstr "最新曲目" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "下一首" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "下一个曲目" #: core/utilities.cpp:151 msgid "Next week" msgstr "下一周" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "无均衡器" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "无背景图片" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "无封面可供导出。" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "无长块" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "无匹配。清空搜索框以重新显示整个播放列表。" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "无短块" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "无" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "已选择的曲目均不适合复制到设备" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "正常" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "普通块类型" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "使用动态播放列表时不可用" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "未连接" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "内容不足" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "歌迷不足" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "会员不足" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "邻居不足" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "未安装" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "未登录" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "尚未挂载 - 双击进行挂载" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "无内容" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "通知类型" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "通知" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "现在播放" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "设置显示节目的数量" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "OSD 预览" #: widgets/osd.cpp:173 msgid "Off" msgstr "关闭" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "打开" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "OneDrive" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "只接受来自以下 IP 段的客户端连接:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "只允许来自本地网络的连接" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "只显示第一个" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "不透明度" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "在浏览器中打开%1" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "打开音频CD...(&a)" #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "打开 OPML 文件" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "打开 OPML 文件…" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "打开目录导入音乐" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "打开设备" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "打开文件..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "打开 Google 云存储" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "在新播放列表中打开" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "在新的播放列表中打开" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "在浏览器中打开" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "打开..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "操作失败" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "为位速率优化" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "为质量优化" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "选项..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "组织文件" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "组织文件..." #: core/organise.cpp:73 msgid "Organising files" msgstr "组织文件" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "原始标签" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "原始年代" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "原始年份 - 专辑" #: library/library.cpp:118 msgid "Original year tag support" msgstr "原始年代标签支持" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "其它选项" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "输出" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "输出设备" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "输出选项" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "覆盖全部" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "覆盖已存在的文件" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "只覆盖体积较小的文件" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "所有者" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "正在解析 Jamendo 分类" #: ui/equalizer.cpp:139 msgid "Party" msgstr "晚会" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "密码" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "暂停" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "暂停播放" #: widgets/osd.cpp:156 msgid "Paused" msgstr "已暂停" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "表演者" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "像素" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "普通侧边栏" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "播放" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "播放计数" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "若停止则播放,若播放则停止" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "如无歌曲播放则自动播放添加的歌曲" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "播放列表中的第首" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "播放/暂停" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "播放" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "播放器选项" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "播放列表" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "已完成播放列表" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "播放列表选项" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "播放列表类型" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "播放列表" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "请关闭你的浏览器,回到 Clementine。" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "插件状态:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "播客" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "流行" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "弹出时长" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "端口" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "前置放大" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "首选项" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "首选项" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "首选项..." #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "专辑封面的文件名(逗号分隔)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "首选音乐格式" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "偏好的比特率" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "首选格式" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "高级音频类型" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "预设:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "按下组合键定义为" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "按一个键" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "请为 %1 按下新的组合键..." #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "点击“上一首”将会..." #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "漂亮的 OSD 选项" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "预览" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "上一首" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "上一个曲目" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "输出版本信息" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "档案" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "进度" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "进度" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "迷幻" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "按下 Wii遥控器 按钮" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "随机打乱曲目顺序" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "质量" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "质量" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "正在查询设备..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "队列管理器" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "将选定曲目加入队列" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "加入队列" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "电台(所有曲目采用相同的音量)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "雨声" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "雨" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "随机视觉效果" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "给当前曲目评级为零星" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "给当前曲目评级为一星" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "给当前曲目评级为两星" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "给当前曲目评级为三星" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "给当前曲目评级为四星" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "给当前曲目评级为五星" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "评级" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "确实取消?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "重定向次数超过限制,请验证客户端配置。" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "刷新分类" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "刷新频道" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "刷新电台列表" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "刷新流" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "Reggae" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "相关" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "记住 Wii遥控器 节奏" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "记住上次设置" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "记住我的选择" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "删除" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "删除操作" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "从播放列表中移除重复项" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "删除文件夹" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "从我的音乐中移出" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "从书签移除" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "从播放列表中移除" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "删除播放列表" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "删除播放列表" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "从播放列表中移除不可用项" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "重命名播放列表" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "重命名播放列表..." #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "以此顺序为曲目重新编号..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "循环" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "专辑循环" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "播放列表循环" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "单曲循环" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "移除当前播放列表" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "移除播放列表" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "以下划线代替空格" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "回放增益" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "回放增益模式" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "重现加入队列" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "需要验证码" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "重置" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "重置播放计数" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "按一次重新播放歌曲,连按两次则播放上首歌" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "重播当前曲目,如果曲目开播不足8秒钟则播放上一曲。" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "仅使用 ASCII 字符" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "启动时恢复播放" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "回到Clementine" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "右" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "抓轨" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "CD 抓轨" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "音乐 CD 抓轨" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "摇滚" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "运行" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "SOCKS 代理" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "SSL 握手出错,请验证服务器配置。下面的 SSLv3 选项可能解决一些问题。" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "安全移除设备" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "复制后安全移除设备" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "采样率" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "采样率" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "保存 .mood 文件至您的音乐库" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "保存转接封面" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "保存封面至硬盘..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "保存图像" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "保存播放列表" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "保存播放列表" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "保存播放列表..." #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "保存预设" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "如果可能,保存评级信息至文件标记中" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "如果可能,保存统计信息至文件标记中" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "在网络标签中收藏此媒体流" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "正在保存统计信息至歌曲文件" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "正在保存曲目" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "可变采样频率 (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "缩放" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "得分" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "提交正在收听的音乐" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "Seafile" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "搜索" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "搜索" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "搜索 Icecast 电台" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "搜索 Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "搜索 Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "搜索 Subsonic" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "自动搜索" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "搜索专辑封面..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "搜索一切" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "搜索 gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "搜索iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "搜索模式" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "搜索选项" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "搜索结果" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "搜索条目" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "第二阶段" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "快退" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "快进" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "当前播放的曲目以相对步长快进/快退" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "当前播放的曲目快进/快退至指定时间点" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "使用键盘快捷键寻位" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "选择全部" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "不选择" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "选择背景色:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "选择背景图片" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "选择最可能的匹配项" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "选择前景色:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "选择视觉效果" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "选择视觉效果..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "选择……" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "序列号" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "服务器" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "服务器 URL" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "服务器详情" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "服务离线" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "将 %1 设置为 %2..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "设置音量为 %" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "为全部选中的曲目设置值..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "设置" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "快捷键" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "%1 的快捷键" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "已存在 %1 的快捷键" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "显示" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "显示 OSD" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "当前曲目显示发光动画" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "在音轨进度条上显示心情指示条" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "使用原生桌面通知" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "在我更改了循环播放模式时弹出通知" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "改变音量是显示通知" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "在暂停播放事显示通知" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "系统托盘气泡通知" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "显示漂亮的 OSD" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "在状态栏之上显示" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "显示所有歌曲" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "显示全部曲目" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "在媒体库中显示封面" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "显示分频器" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "显示完整尺寸..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "在全局搜索结果中显示分组" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "在文件管理器中打开..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "在媒体库中显示" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "在群星中显示" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "显示心情指示条" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "只显示重复" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "只显示未加标签的" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "在您的主页显示正在播放的歌曲" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "显示搜索建议" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "显示\"喜欢\"按钮" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "在主窗体中显示提交按钮" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "显示托盘图标" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "显示来源启用/禁用状态" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "显示/隐藏" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "乱序" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "乱序专辑" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "乱序全部" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "随机播放列表" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "此专辑的曲目乱序播放" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "登录" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "注销" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "登录..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "相似艺人" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "大小" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "大小:" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "在播放列表中后退" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "跳过计数" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "在播放列表中前进" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "跳过所选择的曲目" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "跳过曲目" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "小专辑封面" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "小侧边栏" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "智能播放列表" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "智能播放列表" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "曲目信息" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "曲目信息" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "声波图" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "抱歉" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "按流派排序(字母顺序)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "按流派排序(流行度)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "通过电台名排序" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "排序曲目" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "正在排序" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "SoundCloud" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "来源" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "来源" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Spotify 登录失败" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "Spotify 播放列表地址" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Spotify插件" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "potify 插件未安装" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "Spotify 歌曲地址" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "标准" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "用星号标记" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "开始抓轨" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "开始播放当前播放列表" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "开始转换" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "请在上方搜索栏中输入一些词条,来充实搜索结果列表" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "正在开始 %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "正在开始..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "停止" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "后停止" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "播放完每个曲目后停止" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "播放每个曲目前停止" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "在此曲目后停止" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "停止播放" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "播放完此曲目后停止" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "播完曲目 %1 后停止" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "已停止" #: core/song.cpp:431 msgid "Stream" msgstr "流媒体" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "在30天试用期过后,从 Subsonic 服务器播放流媒体,需要有效的服务器许可。" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "流媒体成员" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "订阅" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "成功!" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "成功写入 %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "推荐标签" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "总览" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "很高(%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "超高质 (2048x2048)" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "支持的格式" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "立即同步统计数据至文件" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "同步 Spotify 收件箱" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "同步 Spotify 播放列表" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "同步 Spotify 星号标记的曲目" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "系统颜色" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "标签在上" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "标签提取程序" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "目标位速率" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "文本设置" #: ui/about.cpp:74 msgid "Thanks to" msgstr "感谢" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "命令\"%1\"无法执行。" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "目前正在播放的音乐的专辑封面" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "文件夹 %1 无效" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "第二音量应该比第一音量还大!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "请求的站点不存在!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "您请求的站点并不是一个图片!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "Subsonic 服务器的试用期已过。请捐助来获得许可文件。详情请访问 subsonic.org 。" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "已更新Clementine,由于添加了如下特性,您需要更新您的收藏:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "此专辑中还有其它歌曲" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "与 gpodder.net 通讯时出现了问题" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "从Magnatune获取元数据出错" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "在解析 iTunes 商店的回馈信息出现了问题" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "复制歌曲出错。以下歌曲无法复制:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "删除歌曲出错。以下歌曲无法删除:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "将从设备中删除这些文件.确定删除吗?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "这些文件将从磁盘中永久性删除,您确定要继续吗?" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "这些文件夹将被扫描然后收录进您的媒体库" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "这些设置将用于“音乐转码”对话框,及向设备中复制音乐前的格式转换。" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "第三阶段" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "将会创建一个超过 150 MB 的数据库,\n您无论如何也要继续吗?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "这张专辑不是有效的格式" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "此项可以稍后在首选项中进行更改" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "此设备必须在连接并打开之前,Clementine可以检测它支持什么文件格式。" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "该设备支持以下文件格式:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "这个设备将不会正常工作" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "这个一部 MTP 设备,但是您可以通过 Clementine 来编辑而无需 libmtp 的支持。" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "这是 iPod 设备,但 Clementine 编译时未包含 libgpod 支持。" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "这是您第一次连接该设备。Clementine 将扫描设备上的音乐文件-这需要花费一些时间。" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "这些选项可以在“行为”设置中修改" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "该流媒体只有付费用户才能收听" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "这种设备不被支持: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "时间步长" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "标题" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "今日" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "切换漂亮的 OSD" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "切换全屏" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "切换队列状态" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "切换歌曲记录" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "切换 OSD 可见性" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "明天" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "太多的重定向" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "热门曲目" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "专辑总数:" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "已传输字节总数" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "已发出网络连接总数" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "曲目" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "曲目" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "音乐转码" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "转换日志" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "转码" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "正在转码 %1 个文件,占用线程 %2 个" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "转码设置" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "关闭" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "超宽带 (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "无法连接" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "无法下载 %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "未知" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "未知的content-type" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "未知错误" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "撤销封面" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "取消略过的选定曲目" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "取消掠过曲目" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "取消订阅" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "近期音乐会" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "更新" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "更新所有播客" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "更新改变的媒体库文件夹" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "Clementine 启动时更新媒体库" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "更新此播客" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "更新中" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "正在更新 %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "正在更新 %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "正在更新媒体库" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "用法" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "使用专辑艺术家标记(如果可用)" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "使用 GNOME 快捷键" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "使用迷幻配色" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "使用播放增益元数据(如果可用)" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "使用 SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "使用Wii控制器" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "使用自定义颜色集" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "自定义通告信息" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "使用网络远程控制" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "使用认证" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "使用位速率管理引擎" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "使用动态模式" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "通告 Wii Remote 状态" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "使用瞬时降噪" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "使用系统默认" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "使用系统默认颜色集" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "使用系统代理设置" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "使用音量标准化" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "已使用" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "用户界面" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "用户名" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "使用菜单添加歌曲将..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "可变比特率" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "群星" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "版本 %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "查看" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "视觉效果模式" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "视觉效果" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "视觉效果设置" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "Vk.com" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "语音活动检测" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "音量 %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "墙" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "关闭播放列表标签时,提示我" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "网站" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "周" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "Clementine 启动时" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "当查找专辑封面时,Clementine将首先查找包含这些关键词的图片。\n如果未能匹配,Clementine将使用目录下最大的图片。" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "保存播放列表时,保存路径应该为" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "列表为空的时候..." #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "为什么不试试…" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "宽带 (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii 遥控器 %1:活动" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii 遥控器 %1:已连接" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii 遥控器 %1:电池告急(%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii 遥控器 %1:不活动" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii 遥控器 %1:已断开" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii 遥控器 %1:电池电量低(%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media 音频" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "无封面:" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "您想要把此专辑的其它歌曲移动到 群星?" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "您要立即做个全部重新扫描?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "所有统计信息写入至歌曲文件" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "写入元数据" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "用户名密码错误。" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "年份" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "年份 - 专辑" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "年" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "昨天" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "您即将下载以下专辑" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "您正试图从收藏夹中删除播放列表 %1 ,确定要这样做吗?" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "您正试图删除未收藏的播放列表: 此播放列表将被真正删除 (此操作无法撤销)。\n您确定要继续吗?" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "您未登录。" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "您已经作为%1登录。" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "您已经登录。" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "您可以更改媒体库中音乐的组织形式。" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "您无需注册即可免费收听音乐,但是高级会员可以收听无广告的高音质内容。" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "您无需注册帐户即可收听 Magnatune 的音乐。 订购会员即可移除每个曲目结尾的内容。" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "在聆听音乐的同时,您也可以同时后台收听其它流媒体。" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "您可以使用Wii遥控器来控制 Clementine。参见 Clementine Wiki for more information。\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "您没有Spotify付费账户。" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "您没有活动订阅" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "你不需要登录就可以搜索或聆听 SoundCloud 上的音乐。但是只有登录后才能获取您自己的播放列表和流" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "您已经登出了 Spotify,请在设置对话框中重新输入您的密码。" #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "您已经登出了 Spotify,请重新输入您的密码。" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "您喜爱这个曲目" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "您需要在系统设置中开启\"控制您的电脑\"选项,允许Clementine使用全局快捷键。" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "如果更改语言,您需要重启 Clementine 使设置生效。" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "您的 IP 地址:" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "你的Last.fm帐号信息有误" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "你的Magnatune帐号信息有误" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "您的媒体库是空的!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "您的广播流媒体" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "提交的音轨:%1" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "您的系统缺少OpenGL支持,可视化效果不可用。" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "您的用户名或密码不正确。" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "00" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "添加 %n 首曲目" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "之后" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "以前" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "和" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "自动" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "之前" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "之间" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "体积大的优先" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "包含" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "关闭" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "盘片%1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "不包含" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "结尾为" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "等于" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "gpodder.net 目录" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "大于" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "iPod 和 USB 设备目前在Windows 中无法使用。抱歉!" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "最后" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "小于" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "最长优先" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "移动 %n 首歌" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "最新优先" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "不等于" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "不在最后" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "除日期" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "最老优先" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "于日期" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "选项" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "或扫描 OR 码!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "按回车键" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "移除 %n 首歌" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "最短优先" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "乱序歌曲" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "最小优先" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "排序歌曲" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "起始为" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "停止" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "曲目 %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/translations/zh_TW.po000066400000000000000000004564541260417502300243140ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # BrLi , 2013-2015 # Cheng-Hong Wu , 2012 # FIRST AUTHOR , 2010 # taijuin lee , 2011-2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "PO-Revision-Date: 2015-09-28 10:05+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/davidsansome/clementine/language/zh_TW/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_TW\n" "Plural-Forms: nplurals=1; plural=0;\n" #: playlist/playlistlistview.cpp:37 msgid "" "\n" "\n" "You can favorite playlists by clicking the star icon next to a playlist name\n" "\n" "Favorited playlists will be saved here" msgstr "\n\n您可以經由點選名稱旁的星形符號來收藏播放列表\n\n已收藏的播放列表將顯示於此" #: ../bin/src/ui_podcastsettingspage.h:273 msgid " days" msgstr "天" #: ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:219 #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:204 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_playbacksettingspage.h:347 #: ../bin/src/ui_playbacksettingspage.h:350 #: ../bin/src/ui_playbacksettingspage.h:364 msgid " ms" msgstr " 毫秒" #: ../bin/src/ui_songinfosettingspage.h:156 msgid " pt" msgstr " pt" #: ../bin/src/ui_behavioursettingspage.h:359 msgid " s" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 #: ../bin/src/ui_visualisationselector.h:115 msgid " seconds" msgstr " 秒" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " 歌曲" #: internet/vk/vkservice.cpp:149 #, qt-format msgid "%1 (%2 songs)" msgstr "%1 (%2 個歌曲)" #: widgets/osd.cpp:194 #, qt-format msgid "%1 albums" msgstr "%1 專輯" #: core/utilities.cpp:119 #, qt-format msgid "%1 days" msgstr "%1 天" #: core/utilities.cpp:138 #, qt-format msgid "%1 days ago" msgstr "%1 天前" #: internet/podcasts/gpoddersync.cpp:84 #, qt-format msgid "%1 on %2" msgstr "%2 的 %1" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 播放清單 (%2)" #: playlist/playlistmanager.cpp:409 #, qt-format msgid "%1 selected of" msgstr "%1 選定" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 song" msgstr "%1 歌曲" #: devices/deviceview.cpp:127 #, qt-format msgid "%1 songs" msgstr "%1 歌曲" #: smartplaylists/searchpreview.cpp:132 #, qt-format msgid "%1 songs found" msgstr "%1 首歌曲找到" #: smartplaylists/searchpreview.cpp:128 #, qt-format msgid "%1 songs found (showing %2)" msgstr "發現%1首歌(顯示%2)" #: playlist/playlistmanager.cpp:415 #, qt-format msgid "%1 tracks" msgstr "%1 歌曲" #: ui/albumcovermanager.cpp:466 #, qt-format msgid "%1 transferred" msgstr "傳送%1" #: widgets/osd.cpp:241 widgets/osd.cpp:247 widgets/osd.cpp:253 #: widgets/osd.cpp:259 widgets/osd.cpp:265 widgets/osd.cpp:272 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev 模組" #: songinfo/lastfmtrackinfoprovider.cpp:95 #, qt-format msgid "%L1 other listeners" msgstr "%L1其他聽眾" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1總共播放" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "%filename%" msgstr "%檔案名稱%" #: transcoder/transcodedialog.cpp:214 #, c-format, qt-plural-format msgctxt "" msgid "%n failed" msgstr "%n 失敗的" #: transcoder/transcodedialog.cpp:209 #, c-format, qt-plural-format msgctxt "" msgid "%n finished" msgstr "%n 完成的" #: transcoder/transcodedialog.cpp:203 #, c-format, qt-plural-format msgctxt "" msgid "%n remaining" msgstr "%n 剩餘的" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "對齊文字(&A)" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "中間(&C)" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "&Custom" msgstr "自訂(&C)" #: ../bin/src/ui_mainwindow.h:721 msgid "&Extras" msgstr "外掛程式(&E)" #: ../bin/src/ui_mainwindow.h:720 msgid "&Help" msgstr "幫助(&H)" #: playlist/playlistheader.cpp:73 #, qt-format msgid "&Hide %1" msgstr "隱藏 %1" #: playlist/playlistheader.cpp:32 msgid "&Hide..." msgstr "隱藏(&H)..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "左邊(&L)" #: ../bin/src/ui_mainwindow.h:718 msgid "&Music" msgstr "音樂(&M)" #: ../bin/src/ui_globalshortcutssettingspage.h:175 msgid "&None" msgstr "無(&N)" #: ../bin/src/ui_mainwindow.h:719 msgid "&Playlist" msgstr "播放清單(&P)" #: ../bin/src/ui_mainwindow.h:647 msgid "&Quit" msgstr "結束(&Q)" #: ../bin/src/ui_mainwindow.h:683 msgid "&Repeat mode" msgstr "循環播放模式(&R)" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "右邊(&R)" #: ../bin/src/ui_mainwindow.h:682 msgid "&Shuffle mode" msgstr "隨機播放模式(&S)" #: playlist/playlistheader.cpp:33 msgid "&Stretch columns to fit window" msgstr "將列伸展至視窗邊界(&S)" #: ../bin/src/ui_mainwindow.h:722 msgid "&Tools" msgstr "工具(&T)" #: ui/edittagdialog.cpp:49 msgid "(different across multiple songs)" msgstr "(在多首歌曲的差異)" #: internet/spotify/spotifyservice.cpp:465 msgid ", by " msgstr ",由" #: ui/about.cpp:84 msgid "...and all the Amarok contributors" msgstr "...和所有的 Amarok 的貢獻者" #: ../bin/src/ui_albumcovermanager.h:222 ../bin/src/ui_albumcovermanager.h:223 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_trackslider.h:73 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "0px" msgstr "0px" #: core/utilities.cpp:119 msgid "1 day" msgstr "1 天" #: playlist/playlistmanager.cpp:415 msgid "1 track" msgstr "1 歌曲" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_playbacksettingspage.h:378 msgid "192,000Hz" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "40%" msgstr "40%" #: ../bin/src/ui_playbacksettingspage.h:375 msgid "44,100Hz" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:376 msgid "48,000Hz" msgstr "" #: library/library.cpp:64 msgid "50 random tracks" msgstr "50 隨機歌曲" #: ../bin/src/ui_playbacksettingspage.h:377 msgid "96,000Hz" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Upgrade to Premium now" msgstr "現在就升級至進階" #: ../bin/src/ui_librarysettingspage.h:194 msgid "" "

If not checked, Clementine will try to save your " "ratings and other statistics only in a separate database and don't modify " "your files.

If checked, it will save statistics both in database and " "directly into the file each time they changed.

Please note it might " "not work for every format and, as there is no standard for doing so, other " "music players might not be able to read them.

" msgstr "

若無勾選, Clementine 將儲存您的評價雨其他統計資料於獨立的資料庫檔案中,而不影響您的媒體檔案。

若有勾選,當有修改時,本軟體將同時更新這些統計資料於資料庫以及媒體檔案中。

請注意:這不一定適用於所有檔案格式,且,由於沒有實現這項功能的通用規範,其他音樂播放器將無法順利讀取這些資料。

" #: ../bin/src/ui_libraryfilterwidget.h:96 #, qt-format msgid "" "

Prefix a word with a field name to limit the search to" " that field, e.g. artist:Bode searches the library for all " "artists that contain the word Bode.

Available fields: %1.

" msgstr "

前綴範圍單詞已縮小搜尋範圍,例如:artist:Bode 將會搜尋所有演出者為 Bode 的專輯。

可用的範圍:%1

" #: ../bin/src/ui_librarysettingspage.h:198 msgid "" "

This will write songs' ratings and statistics into " "files tags for all your library's songs.

This is not needed if the " ""Save ratings and statistics in file tags" option has always been " "activated.

" msgstr "" #: ../bin/src/ui_organisedialog.h:250 msgid "" "

Tokens start with %, for example: %artist %album %title

\n" "\n" "

If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.

" msgstr "

Tokens 由%開頭, 例如:%artist %album %title

\n\n

若您將一段文字的前後用大括號括起來,那段文字將在token是空白的情況下被隱藏。" #: internet/spotify/spotifysettingspage.cpp:166 msgid "A Spotify Premium account is required." msgstr "必須為 Spotify 的高級帳戶。" #: ../bin/src/ui_networkremotesettingspage.h:233 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:74 msgid "" "A smart playlist is a dynamic list of songs that come from your library. " "There are different types of smart playlist that offer different ways of " "selecting songs." msgstr "智慧型播放清單是一動態的歌曲清單,其歌曲來源是您的音樂庫。有不同類型的智慧型播放清單,其提供不同的選擇歌曲方式。" #: smartplaylists/querywizardplugin.cpp:157 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "一首歌曲將被包括在播放清單中,如果這些條件是符合的。" #: smartplaylists/searchterm.cpp:370 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:422 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:149 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "所有的榮耀歸於大蟾蜍" #: ui/albumcovermanager.cpp:111 ui/albumcoversearcher.cpp:158 msgid "Abort" msgstr "取消" #: ui/about.cpp:30 #, qt-format msgid "About %1" msgstr "關於 %1" #: ../bin/src/ui_mainwindow.h:666 msgid "About Clementine..." msgstr "關於 Clementine..." #: ../bin/src/ui_mainwindow.h:701 msgid "About Qt..." msgstr "關於 Qt..." #: playlist/playlistsaveoptionsdialog.cpp:34 #: ../bin/src/ui_behavioursettingspage.h:363 msgid "Absolute" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:154 #: ../bin/src/ui_spotifysettingspage.h:207 #: ../bin/src/ui_lastfmsettingspage.h:150 ../bin/src/ui_vksettingspage.h:216 #: ../bin/src/ui_seafilesettingspage.h:168 msgid "Account details" msgstr "帳戶詳情" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Account details (Premium)" msgstr "帳戶詳情(高級)" #: ../bin/src/ui_wiimotesettingspage.h:190 msgid "Action" msgstr "功能" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgctxt "Category label" msgid "Action" msgstr "行為" #: wiimotedev/wiimotesettingspage.cpp:96 msgid "Active/deactive Wiiremote" msgstr "開啟/關閉 Wii 遙控器" #: internet/soundcloud/soundcloudservice.cpp:125 msgid "Activities stream" msgstr "活動串流" #: internet/podcasts/addpodcastdialog.cpp:62 msgid "Add Podcast" msgstr "加入 Podcast" #: ../bin/src/ui_addstreamdialog.h:112 msgid "Add Stream" msgstr "加入網路串流" #: ../bin/src/ui_notificationssettingspage.h:430 msgid "Add a new line if supported by the notification type" msgstr "如果通知類型支援的話新增一欄" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Add action" msgstr "加入功能" #: ../bin/src/ui_transcodedialog.h:217 msgid "Add all tracks from a directory and all its subdirectories" msgstr "從一個目錄及其所有子目錄新增音軌" #: internet/internetradio/savedradio.cpp:112 msgid "Add another stream..." msgstr "加入其它的網路串流" #: library/librarysettingspage.cpp:67 msgid "Add directory..." msgstr "加入目錄..." #: ui/mainwindow.cpp:1898 msgid "Add file" msgstr "加入檔案" #: ../bin/src/ui_mainwindow.h:712 msgid "Add file to transcoder" msgstr "加入檔案以便轉碼" #: ../bin/src/ui_mainwindow.h:710 msgid "Add file(s) to transcoder" msgstr "加入檔案以便轉碼" #: ../bin/src/ui_mainwindow.h:670 msgid "Add file..." msgstr "加入檔案..." #: transcoder/transcodedialog.cpp:224 msgid "Add files to transcode" msgstr "加入檔案以轉碼" #: transcoder/transcodedialog.cpp:306 ui/mainwindow.cpp:1925 #: ripper/ripcddialog.cpp:185 msgid "Add folder" msgstr "加入資料夾" #: ../bin/src/ui_mainwindow.h:687 msgid "Add folder..." msgstr "加入資料夾..." #: ../bin/src/ui_librarysettingspage.h:187 msgid "Add new folder..." msgstr "新增資料夾..." #: ../bin/src/ui_addpodcastdialog.h:178 msgid "Add podcast" msgstr "加入 Podcast" #: internet/podcasts/podcastservice.cpp:416 ../bin/src/ui_mainwindow.h:708 msgid "Add podcast..." msgstr "加入 Podcast..." #: smartplaylists/searchtermwidget.cpp:356 msgid "Add search term" msgstr "加入搜尋字詞" #: ../bin/src/ui_notificationssettingspage.h:385 msgid "Add song album tag" msgstr "加入歌曲專輯標籤" #: ../bin/src/ui_notificationssettingspage.h:391 msgid "Add song albumartist tag" msgstr "加入歌曲專輯演出者標籤" #: ../bin/src/ui_notificationssettingspage.h:382 msgid "Add song artist tag" msgstr "加入歌曲演出者標籤" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "Add song auto score" msgstr "新增歌曲自動評分" #: ../bin/src/ui_notificationssettingspage.h:397 msgid "Add song composer tag" msgstr "加入歌曲作曲家標籤" #: ../bin/src/ui_notificationssettingspage.h:406 msgid "Add song disc tag" msgstr "加入歌曲光碟標籤" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Add song filename" msgstr "加入歌曲檔名" #: ../bin/src/ui_notificationssettingspage.h:412 msgid "Add song genre tag" msgstr "加入歌曲風格標籤" #: ../bin/src/ui_notificationssettingspage.h:403 msgid "Add song grouping tag" msgstr "新增歌曲群組標籤" #: ../bin/src/ui_notificationssettingspage.h:415 msgid "Add song length tag" msgstr "加入歌曲長度標籤" #: ../bin/src/ui_notificationssettingspage.h:400 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:418 msgid "Add song play count" msgstr "加入歌曲播放次數" #: ../bin/src/ui_notificationssettingspage.h:424 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:421 msgid "Add song skip count" msgstr "加入歌曲跳過次數" #: ../bin/src/ui_notificationssettingspage.h:388 msgid "Add song title tag" msgstr "加入歌曲標題標籤" #: internet/vk/vkservice.cpp:329 msgid "Add song to cache" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:409 msgid "Add song track tag" msgstr "加入歌曲曲目標籤" #: ../bin/src/ui_notificationssettingspage.h:394 msgid "Add song year tag" msgstr "加入歌曲年份標籤" #: ../bin/src/ui_vksettingspage.h:221 msgid "Add songs to \"My Music\" when the \"Love\" button is clicked" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Add stream..." msgstr "加入網路串流..." #: internet/vk/vkservice.cpp:321 msgid "Add to My Music" msgstr "" #: internet/spotify/spotifyservice.cpp:617 msgid "Add to Spotify playlists" msgstr "" #: internet/spotify/spotifyservice.cpp:610 msgid "Add to Spotify starred" msgstr "" #: ui/mainwindow.cpp:1719 msgid "Add to another playlist" msgstr "加入到其他播放清單" #: internet/vk/vkservice.cpp:307 msgid "Add to bookmarks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Add to playlist" msgstr "加入播放清單" #: ../bin/src/ui_behavioursettingspage.h:343 #: ../bin/src/ui_behavioursettingspage.h:355 msgid "Add to the queue" msgstr "加入到佇列中" #: internet/vk/vkservice.cpp:337 msgid "Add user/group to bookmarks" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:122 msgid "Add wiimotedev action" msgstr "加入 wiimotedev 功能" #: ../bin/src/ui_transcodedialog.h:214 msgid "Add..." msgstr "加入..." #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this month" msgstr "本月加入" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added this week" msgstr "本週加入" #: ../bin/src/ui_libraryfilterwidget.h:93 msgid "Added this year" msgstr "本年加入" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Added today" msgstr "今天加入" #: ../bin/src/ui_libraryfilterwidget.h:89 #: ../bin/src/ui_libraryfilterwidget.h:91 msgid "Added within three months" msgstr "在三個月內加入" #: library/libraryfilterwidget.cpp:142 msgid "Advanced grouping..." msgstr "進階歸類..." #: ../bin/src/ui_podcastsettingspage.h:274 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:241 msgid "After copying..." msgstr "複製後 ..." #: playlist/playlist.cpp:1319 ui/organisedialog.cpp:61 #: ui/qtsystemtrayicon.cpp:236 ../bin/src/ui_groupbydialog.h:128 #: ../bin/src/ui_groupbydialog.h:147 ../bin/src/ui_groupbydialog.h:166 #: ../bin/src/ui_albumcoversearcher.h:110 #: ../bin/src/ui_albumcoversearcher.h:112 ../bin/src/ui_edittagdialog.h:737 #: ../bin/src/ui_trackselectiondialog.h:208 ../bin/src/ui_ripcddialog.h:314 msgid "Album" msgstr "專輯" #: ../bin/src/ui_playbacksettingspage.h:357 msgid "Album (ideal loudness for all tracks)" msgstr "專輯 (為所有歌曲取得理想音量)" #: playlist/playlist.cpp:1333 ui/organisedialog.cpp:64 #: ../bin/src/ui_groupbydialog.h:130 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:168 ../bin/src/ui_edittagdialog.h:739 msgid "Album artist" msgstr "專輯演出者" #: ../bin/src/ui_appearancesettingspage.h:283 msgid "Album cover" msgstr "專輯封面" #: internet/jamendo/jamendoservice.cpp:427 msgid "Album info on jamendo.com..." msgstr " jamendo.com上的專輯資訊..." #: internet/vk/vkservice.cpp:836 msgid "Albums" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums with covers" msgstr "有封面的專輯" #: ui/albumcovermanager.cpp:136 msgid "Albums without covers" msgstr "無封面的專輯" #: ../bin/src/ui_podcastsettingspage.h:278 msgid "All" msgstr "" #: ui/mainwindow.cpp:161 msgid "All Files (*)" msgstr "所有檔案 (*)" #: ../bin/src/ui_mainwindow.h:678 msgctxt "Label for button to enable/disable Hypnotoad background sound." msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:134 msgid "All albums" msgstr "所有專輯" #: ui/albumcovermanager.cpp:268 msgid "All artists" msgstr "所有演出者" #: ui/albumcoverchoicecontroller.cpp:48 msgid "All files (*)" msgstr "所有檔案 (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "所有播放清單 (%1)" #: ui/about.cpp:80 msgid "All the translators" msgstr "所有翻譯者" #: library/library.cpp:98 msgid "All tracks" msgstr "所有曲目" #: ../bin/src/ui_networkremotesettingspage.h:242 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:244 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Allow mid/side encoding" msgstr "允許 M/S (Mid/Side) 編碼技術" #: ../bin/src/ui_transcodedialog.h:226 msgid "Alongside the originals" msgstr "與原本的一起" #: ../bin/src/ui_behavioursettingspage.h:316 msgid "Always hide the main window" msgstr "總是隱藏主要視窗" #: ../bin/src/ui_behavioursettingspage.h:315 msgid "Always show the main window" msgstr "總是顯示主要視窗" #: ../bin/src/ui_behavioursettingspage.h:329 #: ../bin/src/ui_behavioursettingspage.h:349 msgid "Always start playing" msgstr "總是開始播放" #: ../bin/src/ui_amazonsettingspage.h:102 msgid "Amazon Cloud Drive" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:72 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "在 Clementine 中使用 Spotify 需要額外的插件。 \n您想要下載並安裝此插件嗎?" #: devices/gpodloader.cpp:60 msgid "An error occurred loading the iTunes database" msgstr "讀取 iTunes 資料時發生錯誤" #: ui/edittagdialog.cpp:695 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "寫入目標數據至「%1」時發生錯誤" #: internet/subsonic/subsonicsettingspage.cpp:123 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:85 msgid "And:" msgstr "以及:" #: moodbar/moodbarrenderer.cpp:171 msgid "Angry" msgstr "生氣" #: ../bin/src/ui_podcastsettingspage.h:276 #: ../bin/src/ui_songinfosettingspage.h:154 #: ../bin/src/ui_appearancesettingspage.h:270 msgid "Appearance" msgstr "外觀" #: core/commandlineoptions.cpp:167 msgid "Append files/URLs to the playlist" msgstr "附加檔案或網址到播放清單" #: devices/deviceview.cpp:216 globalsearch/globalsearchview.cpp:453 #: internet/core/internetservice.cpp:80 library/libraryview.cpp:372 #: widgets/fileviewlist.cpp:31 msgid "Append to current playlist" msgstr "附加到目前的播放清單" #: ../bin/src/ui_behavioursettingspage.h:340 msgid "Append to the playlist" msgstr "附加到播放清單" #: ../bin/src/ui_playbacksettingspage.h:360 msgid "Apply compression to prevent clipping" msgstr "使用壓縮,以防止截波失真" #: ui/equalizer.cpp:222 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "您確定您想要刪除預設的「%1」嗎?" #: ui/edittagdialog.cpp:801 msgid "Are you sure you want to reset this song's statistics?" msgstr "您確定要重置歌曲的統計嗎?" #: library/librarysettingspage.cpp:155 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "" #: playlist/playlist.cpp:1317 ui/organisedialog.cpp:62 #: ui/qtsystemtrayicon.cpp:234 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:148 ../bin/src/ui_groupbydialog.h:167 #: ../bin/src/ui_albumcoversearcher.h:106 #: ../bin/src/ui_albumcoversearcher.h:108 ../bin/src/ui_edittagdialog.h:735 #: ../bin/src/ui_trackselectiondialog.h:209 ../bin/src/ui_ripcddialog.h:315 msgid "Artist" msgstr "演出者" #: ui/mainwindow.cpp:251 msgid "Artist info" msgstr "演出者" #: songinfo/echonesttags.cpp:61 msgid "Artist tags" msgstr "演出者標籤" #: ui/organisedialog.cpp:63 msgid "Artist's initial" msgstr "演唱者簽署" #: ../bin/src/ui_behavioursettingspage.h:365 msgid "Ask when saving" msgstr "" #: ../bin/src/ui_transcodedialog.h:221 #: ../bin/src/ui_networkremotesettingspage.h:250 #: ../bin/src/ui_ripcddialog.h:322 msgid "Audio format" msgstr "音頻格式" #: ../bin/src/ui_playbacksettingspage.h:361 msgid "Audio output" msgstr "" #: internet/digitally/digitallyimportedsettingspage.cpp:83 #: internet/magnatune/magnatunesettingspage.cpp:116 #: internet/lastfm/lastfmservice.cpp:228 #: internet/lastfm/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "認證失敗" #: ../bin/src/ui_podcastinfowidget.h:191 msgid "Author" msgstr "作者" #: ui/about.cpp:68 msgid "Authors" msgstr "作者" #: ../bin/src/ui_transcoderoptionsspeex.h:226 #: ../bin/src/ui_playbacksettingspage.h:374 msgid "Auto" msgstr "自動" #: playlist/playlistsaveoptionsdialog.cpp:32 #: ../bin/src/ui_behavioursettingspage.h:362 msgid "Automatic" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Automatic updating" msgstr "自動更新" #: ../bin/src/ui_librarysettingspage.h:207 msgid "Automatically open single categories in the library tree" msgstr "自動開啟音樂庫中的單一類型" #: widgets/freespacebar.cpp:44 msgid "Available" msgstr "可用的" #: ../bin/src/ui_transcoderoptionsspeex.h:220 msgid "Average bitrate" msgstr "平均位元率" #: covers/coversearchstatisticsdialog.cpp:69 msgid "Average image size" msgstr "平均圖片大小" #: internet/podcasts/addpodcastdialog.cpp:87 msgid "BBC Podcasts" msgstr "BBC Podcasts" #: playlist/playlist.cpp:1353 ui/organisedialog.cpp:71 #: ../bin/src/ui_edittagdialog.h:719 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:55 msgid "Background Streams" msgstr "背景串流" #: ../bin/src/ui_notificationssettingspage.h:459 msgid "Background color" msgstr "背景顏色" #: ../bin/src/ui_appearancesettingspage.h:278 msgid "Background image" msgstr "背景圖片" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Background opacity" msgstr "背景不透明" #: core/database.cpp:648 msgid "Backing up database" msgstr "備份資料庫" #: ../bin/src/ui_equalizer.h:172 msgid "Balance" msgstr "" #: core/globalshortcuts.cpp:80 msgid "Ban (Last.fm scrobbling)" msgstr "" #: analyzers/baranalyzer.cpp:34 msgid "Bar analyzer" msgstr "條狀分析儀" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Basic Blue" msgstr "基本的藍色" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 msgid "Basic audio type" msgstr "基本音訊類型" #: ../bin/src/ui_behavioursettingspage.h:304 msgid "Behavior" msgstr "行為" #: ../bin/src/ui_transcoderoptionsflac.h:82 msgid "Best" msgstr "最佳" #: songinfo/echonestbiographies.cpp:84 #, qt-format msgid "Biography from %1" msgstr "%1的傳記" #: playlist/playlist.cpp:1355 ../bin/src/ui_edittagdialog.h:721 msgid "Bit rate" msgstr "位元率" #: ../bin/src/ui_groupbydialog.h:138 ../bin/src/ui_groupbydialog.h:157 #: ../bin/src/ui_groupbydialog.h:176 ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsmp3.h:193 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionswma.h:78 msgid "Bitrate" msgstr "位元率" #: ui/organisedialog.cpp:77 msgctxt "Refers to bitrate in file organise dialog." msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:44 msgid "Block analyzer" msgstr "區塊分析儀" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Block type" msgstr "區塊型態" #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:455 msgid "Body" msgstr "主體" #: analyzers/boomanalyzer.cpp:36 msgid "Boom analyzer" msgstr "聲響分析儀" #: ../bin/src/ui_boxsettingspage.h:102 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_podcastsettingspage.h:269 #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Browse..." msgstr "瀏覽..." #: ../bin/src/ui_playbacksettingspage.h:363 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:907 msgid "Buffering" msgstr "緩衝" #: internet/seafile/seafileservice.cpp:226 msgid "Building Seafile index..." msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Buttons" msgstr "按鈕" #: core/song.cpp:428 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:117 msgid "CUE sheet support" msgstr "CUE 表單支援" #: ../bin/src/ui_vksettingspage.h:226 msgid "Cache path:" msgstr "" #: ../bin/src/ui_vksettingspage.h:224 msgid "Caching" msgstr "" #: internet/vk/vkmusiccache.cpp:120 #, qt-format msgid "Caching %1" msgstr "" #: internet/spotify/spotifyblobdownloader.cpp:57 msgid "Cancel" msgstr "取消" #: internet/podcasts/podcastservice.cpp:439 msgid "Cancel download" msgstr "" #: internet/vk/vkservice.cpp:635 msgid "" "Captcha is needed.\n" "Try to login into Vk.com with your browser,to fix this problem." msgstr "" #: ../bin/src/ui_edittagdialog.h:715 msgid "Change cover art" msgstr "更換封面圖片" #: songinfo/songinfotextview.cpp:73 msgid "Change font size..." msgstr "變更字型大小..." #: core/globalshortcuts.cpp:73 msgid "Change repeat mode" msgstr "更改重複模式" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "Change shortcut..." msgstr "變更快速鍵..." #: core/globalshortcuts.cpp:71 msgid "Change shuffle mode" msgstr "切換隨機模式" #: ../bin/src/ui_behavioursettingspage.h:354 msgid "Change the currently playing song" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "變更語言" #: ../bin/src/ui_playbacksettingspage.h:381 msgid "Changes will take place when the next song starts playing" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:368 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:255 msgid "Check for new episodes" msgstr "檢查是否有新的片斷內容" #: internet/googledrive/googledriveservice.cpp:220 msgid "Check for updates" msgstr "" #: ui/mainwindow.cpp:742 msgid "Check for updates..." msgstr "檢查更新..." #: internet/vk/vksettingspage.cpp:98 msgid "Choose Vk.com cache directory" msgstr "" #: smartplaylists/wizard.cpp:84 msgid "Choose a name for your smart playlist" msgstr "為您智慧型播放清單選擇一個名稱" #: engines/gstengine.cpp:928 msgid "Choose automatically" msgstr "自動選擇" #: ../bin/src/ui_notificationssettingspage.h:467 msgid "Choose color..." msgstr "選擇顏色 ..." #: ../bin/src/ui_notificationssettingspage.h:468 msgid "Choose font..." msgstr "選擇字體..." #: ../bin/src/ui_visualisationselector.h:112 msgid "Choose from the list" msgstr "從清單中選擇" #: smartplaylists/querywizardplugin.cpp:161 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "選擇此播放清單將要如何分類以及擁有多少歌曲" #: internet/podcasts/podcastsettingspage.cpp:140 msgid "Choose podcast download directory" msgstr "選擇 podcast 下載目錄" #: ../bin/src/ui_internetshowsettingspage.h:88 msgid "Choose the internet services you want to show." msgstr "" #: ../bin/src/ui_songinfosettingspage.h:159 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "選擇您想要 Clementine 使用來搜尋歌詞的網站。" #: ui/equalizer.cpp:112 msgid "Classical" msgstr "古典" #: ../bin/src/ui_podcastsettingspage.h:270 msgid "Cleaning up" msgstr "清除" #: transcoder/transcodedialog.cpp:61 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:138 msgid "Clear" msgstr "清除" #: ../bin/src/ui_mainwindow.h:653 ../bin/src/ui_mainwindow.h:655 msgid "Clear playlist" msgstr "清除播放清單" #: smartplaylists/searchtermwidget.cpp:345 #: visualisations/visualisationcontainer.cpp:215 #: ../bin/src/ui_mainwindow.h:638 ../bin/src/ui_visualisationoverlay.h:182 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:92 msgid "Clementine Error" msgstr "Clementine 錯誤" #: ../bin/src/ui_notificationssettingspage.h:463 msgid "Clementine Orange" msgstr "Clementine 的橘黃色" #: visualisations/visualisationcontainer.cpp:76 #: visualisations/visualisationcontainer.cpp:158 msgid "Clementine Visualization" msgstr "Clementine的視覺化效果" #: ../bin/src/ui_deviceproperties.h:375 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine 可以自動轉換您複製到這個裝置的音樂為它可以播放的格式。" #: ../bin/src/ui_amazonsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Amazon Cloud Drive" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine 能播放您上傳到 Box 的音樂檔" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine 能播放您上傳到 Dropbox 的音樂檔" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine 可以播放您已經上傳到Google 雲端硬碟的音樂" #: ../bin/src/ui_skydrivesettingspage.h:103 msgid "Clementine can play music that you have uploaded to OneDrive" msgstr "Clementine 能播放您上傳到 OneDrive 的音樂檔" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Clementine can show a message when the track changes." msgstr "當曲目變更時,Clementine 可以顯示一個訊息。" #: ../bin/src/ui_podcastsettingspage.h:281 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine 可以和您的其它電腦及 podcast 應用程式同步訂閱清單。建立一個帳戶。" #: visualisations/projectmvisualisation.cpp:132 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine 無法載入任何 ProjectM 視覺化工具。\n請檢查是否正確安裝 Clementine。" #: widgets/prettyimage.cpp:200 msgid "Clementine image viewer" msgstr "Clementine 圖片檢視器" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Clementine was unable to find results for this file" msgstr "Clementine 無法搜尋到任何符合此檔案的結果" #: ../bin/src/ui_globalsearchview.h:209 msgid "Clementine will find music in:" msgstr "Clementine 將在以下位置搜尋音樂:" #: library/libraryview.cpp:353 msgid "Click here to add some music" msgstr "點擊此處加入一些音樂" #: playlist/playlisttabbar.cpp:298 msgid "" "Click here to favorite this playlist so it will be saved and remain " "accessible through the \"Playlists\" panel on the left side bar" msgstr "" #: ../bin/src/ui_trackslider.h:71 msgid "Click to toggle between remaining time and total time" msgstr "點擊以切換剩餘時間/全部時間" #: ../bin/src/ui_soundcloudsettingspage.h:106 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_dropboxsettingspage.h:105 #: ../bin/src/ui_skydrivesettingspage.h:105 #: ../bin/src/ui_boxsettingspage.h:105 ../bin/src/ui_amazonsettingspage.h:105 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "點擊「登錄」按鈕將打開一個網頁瀏覽器。登錄後您應該回到 Clementine 中。" #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "關閉" #: playlist/playlisttabbar.cpp:55 msgid "Close playlist" msgstr "關閉播放清單" #: visualisations/visualisationcontainer.cpp:135 msgid "Close visualization" msgstr "關閉視覺化效果" #: internet/magnatune/magnatunedownloaddialog.cpp:306 msgid "Closing this window will cancel the download." msgstr "關閉此視窗將取消下載." #: ui/albumcovermanager.cpp:219 msgid "Closing this window will stop searching for album covers." msgstr "關閉此視窗將停止搜尋專輯封面." #: ui/equalizer.cpp:114 msgid "Club" msgstr "俱樂部" #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Colors" msgstr "顏色" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "用逗號化分類別清單:等級為0-3" #: playlist/playlist.cpp:1372 smartplaylists/searchterm.cpp:358 #: ui/organisedialog.cpp:75 ../bin/src/ui_edittagdialog.h:746 msgid "Comment" msgstr "評論" #: internet/vk/vkservice.cpp:155 msgid "Community Radio" msgstr "社群廣播" #: ../bin/src/ui_edittagdialog.h:744 msgid "Complete tags automatically" msgstr "標籤完全自動分類" #: ../bin/src/ui_mainwindow.h:705 msgid "Complete tags automatically..." msgstr "標籤完全自動分類..." #: playlist/playlist.cpp:1335 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:150 #: ../bin/src/ui_groupbydialog.h:169 ../bin/src/ui_edittagdialog.h:740 msgid "Composer" msgstr "作曲家" #: internet/core/searchboxwidget.cpp:45 #, qt-format msgid "Configure %1..." msgstr "設定 %1 ..." #: internet/magnatune/magnatuneservice.cpp:290 msgid "Configure Magnatune..." msgstr "設定 Magnatune ..." #: ../bin/src/ui_globalshortcutssettingspage.h:166 msgid "Configure Shortcuts" msgstr "設定快速鍵" #: internet/spotify/spotifyservice.cpp:913 msgid "Configure Spotify..." msgstr "設定 Spotify..." #: internet/subsonic/subsonicservice.cpp:112 msgid "Configure Subsonic..." msgstr "設定 Subsonic..." #: internet/vk/vkservice.cpp:346 msgid "Configure Vk.com..." msgstr "設定 Vk.com..." #: globalsearch/globalsearchview.cpp:149 globalsearch/globalsearchview.cpp:473 msgid "Configure global search..." msgstr "設定全域搜尋..." #: ui/mainwindow.cpp:592 msgid "Configure library..." msgstr "設定音樂庫" #: internet/podcasts/addpodcastdialog.cpp:74 #: internet/podcasts/podcastservice.cpp:453 msgid "Configure podcasts..." msgstr "設定 podcasts..." #: internet/core/cloudfileservice.cpp:105 #: internet/digitally/digitallyimportedservicebase.cpp:182 #: internet/googledrive/googledriveservice.cpp:228 #: ../bin/src/ui_globalsearchsettingspage.h:149 msgid "Configure..." msgstr "設定..." #: ../bin/src/ui_wiimotesettingspage.h:185 msgid "Connect Wii Remotes using active/deactive action" msgstr "連結 Wii 遙控器可以使用「作用」/「取消作用」的行動" #: devices/devicemanager.cpp:321 devices/devicemanager.cpp:326 msgid "Connect device" msgstr "連接裝置" #: internet/spotify/spotifyservice.cpp:295 msgid "Connecting to Spotify" msgstr "連接到 Spotify" #: internet/subsonic/subsonicsettingspage.cpp:128 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "伺服器拒絕連線,請檢查伺服器網址。\n例如: http://localhost:4040/" #: internet/subsonic/subsonicsettingspage.cpp:140 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "連線逾時,請檢查伺服器網址。\n例如: http://localhost:4040/" #: internet/vk/vkservice.cpp:1113 msgid "Connection trouble or audio is disabled by owner" msgstr "" #: ../bin/src/ui_console.h:79 ../bin/src/ui_mainwindow.h:681 msgid "Console" msgstr "終端機" #: ../bin/src/ui_transcoderoptionsmp3.h:195 msgid "Constant bitrate" msgstr "恆定位元率" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert all music" msgstr "轉換所有音樂" #: ../bin/src/ui_deviceproperties.h:377 msgid "Convert any music that the device can't play" msgstr "轉換任何裝置無法播放的音樂" #: ../bin/src/ui_networkremotesettingspage.h:247 msgid "Convert lossless audiofiles before sending them to the remote." msgstr "在上傳到遠端前轉換無損音樂檔。" #: ../bin/src/ui_networkremotesettingspage.h:249 msgid "Convert lossless files" msgstr "轉換無損檔案" #: internet/vk/vkservice.cpp:333 msgid "Copy share url to clipboard" msgstr "複製分享連結到剪貼簿" #: internet/core/internetservice.cpp:57 msgid "Copy to clipboard" msgstr "複製到剪貼簿" #: library/libraryview.cpp:402 internet/podcasts/podcastservice.cpp:437 #: ui/mainwindow.cpp:641 widgets/fileviewlist.cpp:43 msgid "Copy to device..." msgstr "複製到裝置..." #: devices/deviceview.cpp:225 ui/mainwindow.cpp:631 #: widgets/fileviewlist.cpp:38 msgid "Copy to library..." msgstr "複製到音樂庫" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Copyright" msgstr "著作權" #: internet/subsonic/subsonicsettingspage.cpp:96 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:58 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "無法建立 GStreamer 元件「%1」- 請確認您安裝了所有需要的GStreamer外掛。" #: playlist/playlistmanager.cpp:167 msgid "Couldn't create playlist" msgstr "" #: transcoder/transcoder.cpp:425 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "無法為%1找到混合器,請確認已正確安裝 GStreamer 外掛。" #: transcoder/transcoder.cpp:419 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "無法找到%1的解碼器,請確認已正確安裝 GStreamer 外掛。" #: internet/magnatune/magnatunedownloaddialog.cpp:220 #, qt-format msgid "Couldn't open output file %1" msgstr "無法開啟輸出檔 %1" #: internet/core/cloudfileservice.cpp:102 #: internet/googledrive/googledriveservice.cpp:226 #: ../bin/src/ui_albumcovermanager.h:214 #: ../bin/src/ui_albumcoversearcher.h:104 ../bin/src/ui_mainwindow.h:676 msgid "Cover Manager" msgstr "封面管理員" #: ui/edittagdialog.cpp:476 msgid "Cover art from embedded image" msgstr "從嵌入式影像取得封面圖片" #: ui/edittagdialog.cpp:479 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "封面圖片自動從 %1 載入" #: ui/edittagdialog.cpp:471 msgid "Cover art manually unset" msgstr "手動取消設置封面圖片" #: ui/edittagdialog.cpp:481 msgid "Cover art not set" msgstr "封面圖片未設置" #: ui/edittagdialog.cpp:474 #, qt-format msgid "Cover art set from %1" msgstr "從 %1 取得封面圖片" #: covers/coversearchstatisticsdialog.cpp:59 ui/albumcoversearcher.cpp:100 #, qt-format msgid "Covers from %1" msgstr "來自 %1 的封面" #: ../bin/src/ui_playbacksettingspage.h:344 msgid "Cross-fade when changing tracks automatically" msgstr "當自動改變曲目時,聲音同時淡出及淡入" #: ../bin/src/ui_playbacksettingspage.h:343 msgid "Cross-fade when changing tracks manually" msgstr "當手動改變曲目時,聲音同時淡出及淡入" #: ../bin/src/ui_mainwindow.h:650 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_queuemanager.h:132 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:669 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:689 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:140 ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:652 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:691 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:648 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:693 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:671 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:695 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:128 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:110 msgid "Custom" msgstr "自訂" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "Custom image:" msgstr "自訂圖片:" #: ../bin/src/ui_notificationssettingspage.h:450 msgid "Custom message settings" msgstr "自訂訊息設定" #: ../bin/src/ui_notificationssettingspage.h:464 msgid "Custom..." msgstr "自訂..." #: devices/devicekitlister.cpp:125 msgid "DBus path" msgstr "DBus 路徑" #: ui/equalizer.cpp:116 msgid "Dance" msgstr "舞蹈" #: core/database.cpp:601 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "" #: playlist/playlist.cpp:1369 ../bin/src/ui_edittagdialog.h:730 msgid "Date created" msgstr "創建的日期" #: playlist/playlist.cpp:1367 ../bin/src/ui_edittagdialog.h:729 msgid "Date modified" msgstr "修改的日期" #: smartplaylists/searchterm.cpp:393 msgid "Days" msgstr "天" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "De&fault" msgstr "預設(&F)" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "減低音量4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:62 wiimotedev/wiimotesettingspage.cpp:105 msgid "Decrease volume" msgstr "減低音量" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Default background image" msgstr "預設的背景圖片" #: engines/gstengine.cpp:953 #, qt-format msgid "Default device on %1" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Defaults" msgstr "預設" #: ../bin/src/ui_visualisationselector.h:114 msgid "Delay between visualizations" msgstr "在兩個視覺化效果間延遲切換" #: playlist/playlistlistcontainer.cpp:70 #: ../bin/src/ui_playlistlistcontainer.h:130 msgid "Delete" msgstr "" #: internet/podcasts/podcastservice.cpp:433 msgid "Delete downloaded data" msgstr "刪除下載的資料" #: devices/deviceview.cpp:404 library/libraryview.cpp:638 #: ui/mainwindow.cpp:2261 widgets/fileview.cpp:186 msgid "Delete files" msgstr "刪除檔案" #: devices/deviceview.cpp:228 msgid "Delete from device..." msgstr "從裝置中刪除..." #: library/libraryview.cpp:404 ui/mainwindow.cpp:643 #: widgets/fileviewlist.cpp:44 msgid "Delete from disk..." msgstr "從硬碟中刪除 ..." #: ../bin/src/ui_podcastsettingspage.h:271 msgid "Delete played episodes" msgstr "刪除播放過的片斷內容" #: ui/equalizer.cpp:221 ../bin/src/ui_equalizer.h:168 msgid "Delete preset" msgstr "刪除預設" #: library/libraryview.cpp:393 msgid "Delete smart playlist" msgstr "刪除智慧型播放清單" #: ../bin/src/ui_organisedialog.h:245 msgid "Delete the original files" msgstr "刪除原本的檔案" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "檔案刪除中" #: ui/mainwindow.cpp:1640 msgid "Dequeue selected tracks" msgstr "將選取的歌曲移出佇列中" #: ui/mainwindow.cpp:1638 msgid "Dequeue track" msgstr "將歌曲移出佇列中" #: ../bin/src/ui_transcodedialog.h:223 ../bin/src/ui_organisedialog.h:240 #: ../bin/src/ui_ripcddialog.h:320 msgid "Destination" msgstr "目的地" #: ../bin/src/ui_transcodedialog.h:230 msgid "Details..." msgstr "詳情..." #: devices/devicekitlister.cpp:128 devices/giolister.cpp:156 msgid "Device" msgstr "裝置" #: ../bin/src/ui_deviceproperties.h:367 msgid "Device Properties" msgstr "裝置屬性" #: ../bin/src/ui_podcastsettingspage.h:285 msgid "Device name" msgstr "裝置名稱" #: devices/deviceview.cpp:210 msgid "Device properties..." msgstr "裝置屬性..." #: ui/mainwindow.cpp:246 msgid "Devices" msgstr "裝置" #: ../bin/src/ui_ripcddialog.h:299 ../bin/src/ui_vksearchdialog.h:60 msgid "Dialog" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "您的意思是" #: ../bin/src/ui_digitallyimportedsettingspage.h:159 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 msgid "Digitally Imported password" msgstr "Digitally Imported 密碼" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Digitally Imported username" msgstr "Digitally Imported 帳號" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Direct internet connection" msgstr "直接連接到網際網路" #: ../bin/src/ui_magnatunedownloaddialog.h:144 #: ../bin/src/ui_transcodedialog.h:212 msgid "Directory" msgstr "目錄" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Disable duration" msgstr "禁用期限" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Disable moodbar generation" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgctxt "Refers to a disabled notification type in Notification settings." msgid "Disabled" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:46 msgctxt "Refers to search provider's status." msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1325 ui/organisedialog.cpp:70 #: ../bin/src/ui_groupbydialog.h:139 ../bin/src/ui_groupbydialog.h:158 #: ../bin/src/ui_groupbydialog.h:177 ../bin/src/ui_edittagdialog.h:736 #: ../bin/src/ui_ripcddialog.h:313 msgid "Disc" msgstr "唱片" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Discontinuous transmission" msgstr "不連續傳送" #: internet/icecast/icecastfilterwidget.cpp:36 #: internet/core/searchboxwidget.cpp:34 library/libraryfilterwidget.cpp:104 #: ../bin/src/ui_librarysettingspage.h:206 msgid "Display options" msgstr "顯示選項" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "顯示螢幕上的顯示" #: ../bin/src/ui_mainwindow.h:704 msgid "Do a full library rescan" msgstr "做一個完整的音樂庫重新掃描" #: internet/googledrive/googledriveservice.cpp:267 #: internet/googledrive/googledriveservice.cpp:273 msgid "Do a full rescan" msgstr "" #: internet/googledrive/googledriveservice.cpp:223 msgid "Do a full rescan..." msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "Do not convert any music" msgstr "沒有轉換任何音樂" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Do not overwrite" msgstr "" #: internet/googledrive/googledriveservice.cpp:268 msgid "" "Doing a full rescan will lose any metadata you've saved in Clementine such " "as cover art, play counts and ratings. Clementine will rescan all your " "music in Google Drive which may take some time." msgstr "" #: widgets/osd.cpp:306 ../bin/src/ui_playlistsequence.h:110 msgid "Don't repeat" msgstr "不要循環播放" #: library/libraryview.cpp:422 msgid "Don't show in various artists" msgstr "不要顯示不同的演出者" #: ../bin/src/ui_podcastsettingspage.h:277 msgid "Don't show listened episodes" msgstr "" #: widgets/osd.cpp:285 ../bin/src/ui_playlistsequence.h:116 msgid "Don't shuffle" msgstr "不要隨機播放" #: internet/magnatune/magnatunedownloaddialog.cpp:308 #: ui/albumcovermanager.cpp:221 msgid "Don't stop!" msgstr "不要停止!" #: internet/somafm/somafmservice.cpp:106 msgid "Donate" msgstr "" #: devices/deviceview.cpp:117 msgid "Double click to open" msgstr "雙擊打開" #: ../bin/src/ui_behavioursettingspage.h:351 msgid "Double clicking a song in the playlist will..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:337 msgid "Double clicking a song will..." msgstr "雙擊一首歌曲將..." #: internet/podcasts/podcastservice.cpp:529 #, c-format, qt-plural-format msgctxt "" msgid "Download %n episodes" msgstr "下載 %n 片斷內容" #: internet/magnatune/magnatunedownloaddialog.cpp:268 msgid "Download directory" msgstr "下載目錄" #: ../bin/src/ui_podcastsettingspage.h:267 msgid "Download episodes to" msgstr "下載片斷內容到" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Download membership" msgstr "下載會員" #: ../bin/src/ui_podcastsettingspage.h:268 msgid "Download new episodes automatically" msgstr "自動下載新的片斷內容" #: internet/podcasts/podcastservice.cpp:292 #: internet/podcasts/podcastservice.cpp:331 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:245 msgid "Download settings" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:252 msgid "Download the Android app" msgstr "" #: internet/magnatune/magnatuneservice.cpp:280 msgid "Download this album" msgstr "下載此專輯" #: internet/jamendo/jamendoservice.cpp:430 msgid "Download this album..." msgstr "下載此專輯..." #: internet/podcasts/podcastservice.cpp:531 msgid "Download this episode" msgstr "下載這個片斷內容" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Download..." msgstr "下載..." #: internet/podcasts/podcastservice.cpp:300 #: internet/podcasts/podcastservice.cpp:340 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecast/icecastservice.cpp:102 msgid "Downloading Icecast directory" msgstr "下載 Icecast 目錄中" #: internet/jamendo/jamendoservice.cpp:200 msgid "Downloading Jamendo catalogue" msgstr "下載 Jamendo 目錄中" #: internet/magnatune/magnatuneservice.cpp:160 msgid "Downloading Magnatune catalogue" msgstr "下載 Magnatune 目錄中" #: internet/spotify/spotifyblobdownloader.cpp:56 msgid "Downloading Spotify plugin" msgstr "下載 Spotify 插件中" #: musicbrainz/tagfetcher.cpp:107 msgid "Downloading metadata" msgstr "下載詮釋資料中" #: ui/notificationssettingspage.cpp:36 msgid "Drag to reposition" msgstr "拖曳以重新定位" #: ../bin/src/ui_dropboxsettingspage.h:102 msgid "Dropbox" msgstr "" #: ui/equalizer.cpp:119 msgid "Dubstep" msgstr "" #: ../bin/src/ui_ripcddialog.h:308 msgid "Duration" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:108 msgid "Dynamic mode is on" msgstr "動態模式開啟" #: internet/jamendo/jamendoservice.cpp:126 library/library.cpp:111 msgid "Dynamic random mix" msgstr "動態隨機混合" #: library/libraryview.cpp:390 msgid "Edit smart playlist..." msgstr "編輯智慧型播放清單..." #: ui/mainwindow.cpp:1682 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Edit tag..." msgstr "編輯標籤 ..." #: ../bin/src/ui_edittagdialog.h:747 msgid "Edit tags" msgstr "編輯標籤" #: ../bin/src/ui_edittagdialog.h:713 msgid "Edit track information" msgstr "編輯歌曲資訊" #: library/libraryview.cpp:409 widgets/fileviewlist.cpp:49 #: ../bin/src/ui_mainwindow.h:658 msgid "Edit track information..." msgstr "編輯歌曲資訊..." #: library/libraryview.cpp:412 msgid "Edit tracks information..." msgstr "編輯音軌資訊..." #: internet/internetradio/savedradio.cpp:109 msgid "Edit..." msgstr "編輯..." #: ../bin/src/ui_seafilesettingspage.h:171 msgid "Email" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Enable Wii Remote support" msgstr "啟用 Wii 遙控器的支持" #: ../bin/src/ui_vksettingspage.h:225 msgid "Enable automatic caching" msgstr "" #: ../bin/src/ui_equalizer.h:170 msgid "Enable equalizer" msgstr "啟用等化器" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Enable shortcuts only when Clementine is focused" msgstr "只在 Clemetine 是處於聚焦時才啟用快捷鍵" #: ../bin/src/ui_behavioursettingspage.h:323 msgid "Enable song metadata inline edition with click" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:76 msgid "Enable/disable Last.fm scrobbling" msgstr "啟用/停用 Last.fm scrobbling" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Encoding complexity" msgstr "編碼複雜度" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Encoding engine quality" msgstr "編碼引擎品質" #: ../bin/src/ui_transcoderoptionsspeex.h:223 msgid "Encoding mode" msgstr "編碼模式" #: ../bin/src/ui_addpodcastbyurl.h:75 msgid "Enter a URL" msgstr "輸入網址" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Enter a URL to download a cover from the Internet:" msgstr "輸入網址,從網路中取得封面" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:147 msgid "Enter a new name for this playlist" msgstr "為這個播放清單輸入新的名稱" #: ../bin/src/ui_globalsearchview.h:208 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "在 gpodder.net 上,輸入下面搜尋字詞以尋找 podcasts " #: ../bin/src/ui_libraryfilterwidget.h:98 #: ../bin/src/ui_albumcovermanager.h:218 msgid "Enter search terms here" msgstr "在這裡輸入搜尋字詞" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Enter the URL of an internet radio stream:" msgstr "輸入網路廣播串流的網址(URL):" #: playlist/playlistlistcontainer.cpp:169 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:238 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:86 msgid "Entire collection" msgstr "整個收藏" #: ../bin/src/ui_equalizer.h:162 ../bin/src/ui_mainwindow.h:685 msgid "Equalizer" msgstr "等化器" #: core/commandlineoptions.cpp:173 msgid "Equivalent to --log-levels *:1" msgstr "" #: core/commandlineoptions.cpp:174 msgid "Equivalent to --log-levels *:3" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:242 #: library/libraryview.cpp:632 ui/mainwindow.cpp:1964 ui/mainwindow.cpp:2211 #: ui/mainwindow.cpp:2359 internet/vk/vkservice.cpp:634 msgid "Error" msgstr "錯誤" #: ripper/ripcddialog.cpp:135 msgid "Error Ripping CD" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "連接 MTP 裝置錯誤" #: ui/organiseerrordialog.cpp:52 msgid "Error copying songs" msgstr "複製歌曲錯誤" #: ui/organiseerrordialog.cpp:59 msgid "Error deleting songs" msgstr "刪除歌曲錯誤" #: internet/spotify/spotifyblobdownloader.cpp:260 msgid "Error downloading Spotify plugin" msgstr "下載 Spotify 插件出現錯誤" #: playlist/songloaderinserter.cpp:64 #, qt-format msgid "Error loading %1" msgstr "錯誤載入 %1" #: internet/digitally/digitallyimportedservicebase.cpp:200 #: internet/digitally/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "載入 di.fm 播放清單錯誤" #: transcoder/transcoder.cpp:390 #, qt-format msgid "Error processing %1: %2" msgstr "處理 %1 錯誤: %2" #: playlist/songloaderinserter.cpp:94 msgid "Error while loading audio CD" msgstr "載入音樂CD時,出現錯誤" #: library/library.cpp:68 msgid "Ever played" msgstr "曾經播放的" #: ../bin/src/ui_podcastsettingspage.h:259 msgid "Every 10 minutes" msgstr "每隔10分鐘" #: ../bin/src/ui_podcastsettingspage.h:265 msgid "Every 12 hours" msgstr "每隔12小時" #: ../bin/src/ui_podcastsettingspage.h:263 msgid "Every 2 hours" msgstr "每隔二小時" #: ../bin/src/ui_podcastsettingspage.h:260 msgid "Every 20 minutes" msgstr "每隔20分鐘" #: ../bin/src/ui_podcastsettingspage.h:261 msgid "Every 30 minutes" msgstr "每隔30分鐘" #: ../bin/src/ui_podcastsettingspage.h:264 msgid "Every 6 hours" msgstr "每隔六小時" #: ../bin/src/ui_podcastsettingspage.h:262 msgid "Every hour" msgstr "每隔一小時" #: ../bin/src/ui_playbacksettingspage.h:345 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "除非是在相同專輯或是CUE表單的歌曲之間" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:139 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:202 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:785 ui/albumcovermanager.cpp:809 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:794 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:667 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:663 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:640 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:642 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:644 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:646 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 #: ../bin/src/ui_transcodersettingspage.h:176 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:348 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:342 msgid "Fade out when stopping a track" msgstr "當停播一首歌時,聲音逐漸淡出" #: ../bin/src/ui_playbacksettingspage.h:341 msgid "Fading" msgstr "淡出" #: ../bin/src/ui_playbacksettingspage.h:346 #: ../bin/src/ui_playbacksettingspage.h:349 msgid "Fading duration" msgstr "淡出持續時間" #: ui/mainwindow.cpp:1965 msgid "Failed reading CD drive" msgstr "" #: internet/podcasts/gpoddertoptagspage.cpp:72 msgid "Failed to fetch directory" msgstr "" #: internet/podcasts/gpoddersearchpage.cpp:75 #: internet/podcasts/gpoddertoptagsmodel.cpp:103 #: internet/podcasts/itunessearchpage.cpp:65 #: internet/podcasts/itunessearchpage.cpp:76 #: internet/podcasts/itunessearchpage.cpp:83 msgid "Failed to fetch podcasts" msgstr "" #: internet/podcasts/addpodcastbyurl.cpp:69 #: internet/podcasts/fixedopmlpage.cpp:55 msgid "Failed to load podcast" msgstr "無法載入 podcast" #: internet/podcasts/podcasturlloader.cpp:175 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:199 msgid "Fast" msgstr "快速" #: library/library.cpp:88 msgid "Favourite tracks" msgstr "最喜愛的歌曲" #: ../bin/src/ui_albumcovermanager.h:224 msgid "Fetch Missing Covers" msgstr "取得缺少的封面" #: ../bin/src/ui_albumcovermanager.h:215 msgid "Fetch automatically" msgstr "自動取得" #: ../bin/src/ui_coversearchstatisticsdialog.h:74 msgid "Fetch completed" msgstr "取得完成" #: internet/subsonic/subsonicservice.cpp:250 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:70 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "取得封面出錯" #: ../bin/src/ui_ripcddialog.h:319 msgid "File Format" msgstr "" #: ui/organisedialog.cpp:79 msgid "File extension" msgstr "副檔名" #: ../bin/src/ui_deviceproperties.h:383 msgid "File formats" msgstr "檔案格式" #: playlist/playlist.cpp:1359 ../bin/src/ui_edittagdialog.h:731 msgid "File name" msgstr "檔名" #: playlist/playlist.cpp:1361 msgid "File name (without path)" msgstr "檔名(不含路徑)" #: ../bin/src/ui_vksettingspage.h:227 msgid "File name pattern:" msgstr "" #: ../bin/src/ui_playlistsaveoptionsdialog.h:95 msgid "File paths" msgstr "" #: playlist/playlist.cpp:1363 ../bin/src/ui_edittagdialog.h:725 msgid "File size" msgstr "檔案大小" #: playlist/playlist.cpp:1365 ../bin/src/ui_groupbydialog.h:132 #: ../bin/src/ui_groupbydialog.h:151 ../bin/src/ui_groupbydialog.h:170 #: ../bin/src/ui_edittagdialog.h:727 msgid "File type" msgstr "檔案型態" #: ../bin/src/ui_transcodedialog.h:213 msgid "Filename" msgstr "檔名" #: ui/mainwindow.cpp:239 msgid "Files" msgstr "檔案" #: ../bin/src/ui_transcodedialog.h:210 msgid "Files to transcode" msgstr "要轉碼的檔案" #: smartplaylists/querywizardplugin.cpp:82 msgid "Find songs in your library that match the criteria you specify." msgstr "在您的歌曲庫裡找到符合您指定的歌曲。" #: internet/vk/vkservice.cpp:317 msgid "Find this artist" msgstr "" #: musicbrainz/tagfetcher.cpp:58 msgid "Fingerprinting song" msgstr "指紋歌曲" #: smartplaylists/wizard.cpp:83 msgid "Finish" msgstr "完成" #: ../bin/src/ui_groupbydialog.h:124 msgid "First level" msgstr "第一層次" #: widgets/nowplayingwidget.cpp:108 msgid "Fit cover to width" msgstr "" #: core/song.cpp:406 transcoder/transcoder.cpp:233 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:155 msgid "Font size" msgstr "字型大小" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "由於許可證的原因,Spotify 支援是在一個獨立的插件中。" #: ../bin/src/ui_transcoderoptionsmp3.h:203 msgid "Force mono encoding" msgstr "強制單聲道編碼" #: devices/deviceview.cpp:207 devices/deviceview.cpp:330 #: devices/deviceview.cpp:335 msgid "Forget device" msgstr "忘記裝置" #: devices/deviceview.cpp:331 msgid "" "Forgetting a device will remove it from this list and Clementine will have " "to rescan all the songs again next time you connect it." msgstr "忘記裝置這個動作將會把此裝置從名單中移除且 Clementine 將會在下次連結重新掃描歌曲" #: ../bin/src/ui_deviceviewcontainer.h:97 #: ../bin/src/ui_searchproviderstatuswidget.h:93 #: ../bin/src/ui_suggestionwidget.h:69 ../bin/src/ui_icecastfilterwidget.h:73 #: ../bin/src/ui_internetviewcontainer.h:70 ../bin/src/ui_searchboxwidget.h:61 #: ../bin/src/ui_libraryfilterwidget.h:85 #: ../bin/src/ui_libraryviewcontainer.h:58 #: ../bin/src/ui_playlistcontainer.h:142 #: ../bin/src/ui_playlistlistcontainer.h:125 #: ../bin/src/ui_podcastinfowidget.h:190 ../bin/src/ui_querysearchpage.h:111 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:103 #: ../bin/src/ui_searchtermwidget.h:267 ../bin/src/ui_wizardfinishpage.h:82 #: ../bin/src/ui_songkickconcertwidget.h:99 #: ../bin/src/ui_transcoderoptionsaac.h:127 #: ../bin/src/ui_transcoderoptionsflac.h:79 #: ../bin/src/ui_transcoderoptionsmp3.h:189 #: ../bin/src/ui_transcoderoptionsopus.h:78 #: ../bin/src/ui_transcoderoptionsspeex.h:215 #: ../bin/src/ui_transcoderoptionsvorbis.h:200 #: ../bin/src/ui_transcoderoptionswma.h:77 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:106 ../bin/src/ui_loginstatewidget.h:170 #: ../bin/src/ui_trackslider.h:68 ../bin/src/ui_visualisationoverlay.h:181 msgid "Form" msgstr "表格" #: ../bin/src/ui_magnatunedownloaddialog.h:135 msgid "Format" msgstr "格式" #: analyzers/analyzercontainer.cpp:52 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "畫面更新率" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Frames per buffer" msgstr "幀/每段緩衝" #: moodbar/moodbarrenderer.cpp:173 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:121 msgid "Full Bass" msgstr "全部低音" #: ui/equalizer.cpp:125 msgid "Full Bass + Treble" msgstr "全部低音+高音" #: ui/equalizer.cpp:123 msgid "Full Treble" msgstr "全部高音" #: ui/settingsdialog.cpp:141 msgid "General" msgstr "一般" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "General settings" msgstr "一般設定" #: playlist/playlist.cpp:1331 ui/organisedialog.cpp:74 #: ../bin/src/ui_groupbydialog.h:133 ../bin/src/ui_groupbydialog.h:152 #: ../bin/src/ui_groupbydialog.h:171 ../bin/src/ui_edittagdialog.h:743 #: ../bin/src/ui_ripcddialog.h:316 msgid "Genre" msgstr "風格" #: internet/spotify/spotifyservice.cpp:633 #: internet/spotify/spotifyservice.cpp:676 msgid "Get a URL to share this Spotify song" msgstr "" #: internet/spotify/spotifyservice.cpp:665 msgid "Get a URL to share this playlist" msgstr "" #: internet/somafm/somafmservice.cpp:120 msgid "Getting channels" msgstr "取得頻道" #: internet/digitally/digitallyimportedservicebase.cpp:105 msgid "Getting streams" msgstr "取得串流" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Give it a name:" msgstr "給它一個名字:" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "Go" msgstr "前往" #: ../bin/src/ui_mainwindow.h:696 msgid "Go to next playlist tab" msgstr "到下一個播放清單分頁" #: ../bin/src/ui_mainwindow.h:697 msgid "Go to previous playlist tab" msgstr "到前一個播放清單分頁" #: ../bin/src/ui_googledrivesettingspage.h:102 msgid "Google Drive" msgstr "Google 雲端硬碟" #: covers/coversearchstatisticsdialog.cpp:53 ui/albumcovermanager.cpp:460 #: ../bin/src/ui_coversearchstatisticsdialog.h:75 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "獲得 %1 涵蓋了 %2 ( %3 失敗 )" #: ../bin/src/ui_behavioursettingspage.h:319 msgid "Grey out non existent songs in my playlists" msgstr "用灰色顯示在我播放清單有,但不存在的歌曲" #: ../bin/src/ui_groupbydialog.h:123 msgid "Group Library by..." msgstr "歸類音樂庫依..." #: globalsearch/globalsearchview.cpp:470 library/libraryfilterwidget.cpp:97 msgid "Group by" msgstr "歸類方式" #: library/libraryfilterwidget.cpp:131 msgid "Group by Album" msgstr "依專輯歸類" #: library/libraryfilterwidget.cpp:120 msgid "Group by Artist" msgstr "依演出者歸類" #: library/libraryfilterwidget.cpp:123 msgid "Group by Artist/Album" msgstr "依演出者/專輯歸類" #: library/libraryfilterwidget.cpp:127 msgid "Group by Artist/Year - Album" msgstr "依演出者/專輯發行年度歸類" #: library/libraryfilterwidget.cpp:134 msgid "Group by Genre/Album" msgstr "依風格/專輯歸類" #: library/libraryfilterwidget.cpp:138 msgid "Group by Genre/Artist/Album" msgstr "依風格/演出者/專輯歸類" #: playlist/playlist.cpp:1339 ui/organisedialog.cpp:67 #: ../bin/src/ui_groupbydialog.h:141 ../bin/src/ui_groupbydialog.h:160 #: ../bin/src/ui_groupbydialog.h:179 ../bin/src/ui_edittagdialog.h:742 msgid "Grouping" msgstr "" #: internet/podcasts/podcasturlloader.cpp:206 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:162 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:162 msgid "HTTP proxy" msgstr "HTTP 代理" #: moodbar/moodbarrenderer.cpp:175 msgid "Happy" msgstr "快樂" #: ../bin/src/ui_deviceproperties.h:370 msgid "Hardware information" msgstr "硬體資訊" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information is only available while the device is connected." msgstr "硬體資訊只有當裝置是連結的時候可以取得。" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "High" msgstr "高級" #: analyzers/analyzercontainer.cpp:70 #: visualisations/visualisationcontainer.cpp:111 #, qt-format msgid "High (%1 fps)" msgstr "高 (%1 fps)" #: visualisations/visualisationcontainer.cpp:124 msgid "High (1024x1024)" msgstr "高 (1024x1024)" #: ui/equalizer.cpp:128 msgid "HipHop" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:134 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:391 msgid "Hours" msgstr "小時" #: core/backgroundstreams.cpp:46 msgid "Hypnotoad" msgstr "大蟾蜍" #: ../bin/src/ui_magnatunesettingspage.h:158 msgid "I don't have a Magnatune account" msgstr "我沒有 Magnatune 帳號" #: ../bin/src/ui_deviceproperties.h:369 msgid "Icon" msgstr "圖示" #: widgets/fancytabwidget.cpp:666 msgid "Icons on top" msgstr "圖示在上面" #: musicbrainz/tagfetcher.cpp:90 msgid "Identifying song" msgstr "辨識歌曲" #: ../bin/src/ui_behavioursettingspage.h:321 msgid "" "If activated, clicking a selected song in the playlist view will let you " "edit the tag value directly" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:577 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "如果您要繼續,此裝置將會變慢且可能無法複製歌曲" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "如果您知道一個 podcast 的網址,在下面輸入並按下「前往」。" #: ../bin/src/ui_organisedialog.h:255 msgid "Ignore \"The\" in artist names" msgstr "忽視在演出者名字中的“The”" #: ui/albumcoverchoicecontroller.cpp:44 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "圖片 (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:46 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "圖片(*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: ../bin/src/ui_transcodedialog.h:219 msgid "Import..." msgstr "" #: core/utilities.cpp:150 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:153 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "在動態模式中當一手個播畢新的音軌會被選中且新增至播放清單" #: internet/spotify/spotifyservice.cpp:421 msgid "Inbox" msgstr "收件匣" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Include album art in the notification" msgstr "包括封面圖片的通知" #: ../bin/src/ui_querysearchpage.h:117 msgid "Include all songs" msgstr "包括所有歌曲" #: internet/subsonic/subsonicsettingspage.cpp:106 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:111 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:152 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "增加音量4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:61 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "提高音量" #: internet/core/cloudfileservice.cpp:152 #, qt-format msgid "Indexing %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:132 ../bin/src/ui_deviceproperties.h:372 msgid "Information" msgstr "資訊" #: ../bin/src/ui_ripcddialog.h:300 msgid "Input options" msgstr "" #: ../bin/src/ui_organisedialog.h:254 msgid "Insert..." msgstr "插入..." #: internet/spotify/spotifysettingspage.cpp:75 msgid "Installed" msgstr "已安裝" #: core/database.cpp:585 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:243 msgid "Internet" msgstr "網路" #: ui/settingsdialog.cpp:164 msgid "Internet providers" msgstr "網際網路服務供應商" #: ../bin/src/ui_internetshowsettingspage.h:86 msgctxt "Global search settings dialog title." msgid "Internet services" msgstr "" #: widgets/osd.cpp:321 ../bin/src/ui_playlistsequence.h:115 msgid "Intro tracks" msgstr "" #: internet/lastfm/lastfmservice.cpp:240 msgid "Invalid API key" msgstr "無效的 API key" #: internet/lastfm/lastfmservice.cpp:230 msgid "Invalid format" msgstr "無效的格式" #: internet/lastfm/lastfmservice.cpp:226 msgid "Invalid method" msgstr "無效的方法" #: internet/lastfm/lastfmservice.cpp:232 msgid "Invalid parameters" msgstr "無效的參數" #: internet/lastfm/lastfmservice.cpp:234 msgid "Invalid resource specified" msgstr "無效的資源指定" #: internet/lastfm/lastfmservice.cpp:224 msgid "Invalid service" msgstr "無效的服務" #: internet/lastfm/lastfmservice.cpp:238 msgid "Invalid session key" msgstr "無效對稱金鑰" #: ../bin/src/ui_ripcddialog.h:311 msgid "Invert Selection" msgstr "" #: internet/jamendo/jamendoservice.cpp:138 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendo/jamendoservice.cpp:123 msgid "Jamendo Most Listened Tracks" msgstr "Jamendo 最常聆聽音軌" #: internet/jamendo/jamendoservice.cpp:120 msgid "Jamendo Top Tracks" msgstr "Jamendo 熱門曲目" #: internet/jamendo/jamendoservice.cpp:114 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo 每月熱門曲目" #: internet/jamendo/jamendoservice.cpp:117 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo 每週熱門曲目" #: internet/jamendo/jamendoservice.cpp:180 msgid "Jamendo database" msgstr "Jamendo 資料庫" #: ../bin/src/ui_behavioursettingspage.h:334 msgid "Jump to previous song right away" msgstr "" #: ../bin/src/ui_mainwindow.h:688 msgid "Jump to the currently playing track" msgstr "跳轉到目前播放的曲目" #: wiimotedev/wiimoteshortcutgrabber.cpp:69 #, qt-format msgid "Keep buttons for %1 second..." msgstr "按住按鈕 %1 秒..." #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #: wiimotedev/wiimoteshortcutgrabber.cpp:114 #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "按住按鈕 %1 秒..." #: ../bin/src/ui_behavioursettingspage.h:306 msgid "Keep running in the background when the window is closed" msgstr "當視窗關閉時,保持在背景運轉" #: ../bin/src/ui_organisedialog.h:244 msgid "Keep the original files" msgstr "保留原本的檔案" #: ../bin/src/ui_mainwindow.h:680 msgctxt "Label for buton to enable/disable kittens in the now playing widget" msgid "Kittens" msgstr "" #: ui/equalizer.cpp:131 msgid "Kuduro" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:308 msgid "Language" msgstr "語言" #: ui/equalizer.cpp:133 msgid "Laptop/Headphones" msgstr "筆記型電腦 /耳機" #: ui/equalizer.cpp:135 msgid "Large Hall" msgstr "大型音樂廳" #: widgets/nowplayingwidget.cpp:98 msgid "Large album cover" msgstr "大的專輯封面" #: widgets/nowplayingwidget.cpp:101 msgid "Large album cover (details below)" msgstr "" #: widgets/nowplayingwidget.cpp:103 msgid "Large album cover (no details)" msgstr "" #: widgets/fancytabwidget.cpp:662 msgid "Large sidebar" msgstr "大型側邊欄" #: library/library.cpp:80 msgid "Last played" msgstr "最近播放" #: playlist/playlist.cpp:1348 ../bin/src/ui_edittagdialog.h:722 msgctxt "A playlist's tag." msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:149 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfm/lastfmservice.cpp:247 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm 目前正在忙,請在幾分鐘後再試一次" #: ../bin/src/ui_lastfmsettingspage.h:153 msgid "Last.fm password" msgstr "Last.fm 密碼" #: songinfo/lastfmtrackinfoprovider.cpp:76 msgid "Last.fm play counts" msgstr "Last.fm 播放計數" #: songinfo/lastfmtrackinfoprovider.cpp:130 msgid "Last.fm tags" msgstr "Last.fm 標籤" #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Last.fm username" msgstr "Last.fm 帳號" #: songinfo/lastfmtrackinfoprovider.cpp:110 msgid "Last.fm wiki" msgstr "Last.fm 維基百科" #: library/library.cpp:102 msgid "Least favourite tracks" msgstr "最不喜歡的曲目" #: ../bin/src/ui_equalizer.h:171 msgid "Left" msgstr "" #: playlist/playlist.cpp:1321 ui/organisedialog.cpp:76 #: ui/qtsystemtrayicon.cpp:239 ../bin/src/ui_edittagdialog.h:717 msgid "Length" msgstr "長度" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:238 #: ../bin/src/ui_seafilesettingspage.h:177 msgid "Library" msgstr "音樂庫" #: ../bin/src/ui_groupbydialog.h:121 msgid "Library advanced grouping" msgstr "音樂庫進階的歸類" #: ui/mainwindow.cpp:2483 msgid "Library rescan notice" msgstr "音樂庫重新掃描提示" #: smartplaylists/querywizardplugin.cpp:79 msgid "Library search" msgstr "音樂庫搜尋" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "限制" #: ui/equalizer.cpp:137 msgid "Live" msgstr "現場" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Load" msgstr "載入" #: ../bin/src/ui_coverfromurldialog.h:101 msgid "Load cover from URL" msgstr "從網址載入封面" #: ui/albumcoverchoicecontroller.cpp:64 msgid "Load cover from URL..." msgstr "從網址載入封面..." #: ui/albumcoverchoicecontroller.cpp:104 msgid "Load cover from disk" msgstr "從磁碟載入封面" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Load cover from disk..." msgstr "從磁碟載入封面..." #: playlist/playlistcontainer.cpp:291 msgid "Load playlist" msgstr "載入播放清單" #: ../bin/src/ui_mainwindow.h:694 msgid "Load playlist..." msgstr "載入播放清單..." #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "載入 MTP 裝置" #: devices/gpodloader.cpp:45 msgid "Loading iPod database" msgstr "載入 iPod 資料庫" #: smartplaylists/generatorinserter.cpp:50 msgid "Loading smart playlist" msgstr "載入智慧型播放清單" #: library/librarymodel.cpp:157 msgid "Loading songs" msgstr "載入歌曲" #: internet/digitally/digitallyimportedurlhandler.cpp:67 #: internet/somafm/somafmurlhandler.cpp:53 msgid "Loading stream" msgstr "載入串流" #: playlist/songloaderinserter.cpp:129 ui/edittagdialog.cpp:242 msgid "Loading tracks" msgstr "載入曲目" #: playlist/songloaderinserter.cpp:149 msgid "Loading tracks info" msgstr "載入曲目資訊" #: library/librarymodel.cpp:152 #: internet/podcasts/podcastdiscoverymodel.cpp:105 widgets/prettyimage.cpp:168 #: widgets/widgetfadehelper.cpp:96 internet/vk/vkservice.cpp:508 #: internet/vk/vksettingspage.cpp:122 ../bin/src/ui_addpodcastdialog.h:179 #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_organisedialog.h:261 msgid "Loading..." msgstr "載入中..." #: core/commandlineoptions.cpp:168 msgid "Loads files/URLs, replacing current playlist" msgstr "載入檔案/網址,取代目前的播放清單" #: internet/vk/vksettingspage.cpp:111 #: ../bin/src/ui_digitallyimportedsettingspage.h:162 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_soundcloudsettingspage.h:105 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:129 #: ../bin/src/ui_lastfmsettingspage.h:152 #: ../bin/src/ui_googledrivesettingspage.h:104 #: ../bin/src/ui_dropboxsettingspage.h:104 #: ../bin/src/ui_skydrivesettingspage.h:104 #: ../bin/src/ui_boxsettingspage.h:104 ../bin/src/ui_vksettingspage.h:218 #: ../bin/src/ui_seafilesettingspage.h:172 #: ../bin/src/ui_amazonsettingspage.h:104 msgid "Login" msgstr "登錄" #: internet/podcasts/podcastsettingspage.cpp:127 msgid "Login failed" msgstr "登錄失敗" #: internet/vk/vksettingspage.cpp:121 msgid "Logout" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Long term prediction profile (LTP)" msgstr "長時期預測規格 (LTP)" #: ../bin/src/ui_mainwindow.h:651 msgid "Love" msgstr "喜愛" #: core/globalshortcuts.cpp:78 msgid "Love (Last.fm scrobbling)" msgstr "" #: analyzers/analyzercontainer.cpp:68 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "低 (%1 fps)" #: visualisations/visualisationcontainer.cpp:121 msgid "Low (256x256)" msgstr "低 (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Low complexity profile (LC)" msgstr "低複雜度規格 (LC)" #: ui/organisedialog.cpp:68 ../bin/src/ui_songinfosettingspage.h:158 #: ../bin/src/ui_edittagdialog.h:745 msgid "Lyrics" msgstr "歌詞" #: songinfo/ultimatelyricsprovider.cpp:154 #, qt-format msgid "Lyrics from %1" msgstr "歌詞來自 %1" #: songinfo/taglyricsinfoprovider.cpp:29 msgid "Lyrics from the ID3v2 tag" msgstr "" #: transcoder/transcoder.cpp:235 msgid "M4A AAC" msgstr "" #: core/song.cpp:412 transcoder/transcoder.cpp:238 #: ../bin/src/ui_transcodersettingspage.h:174 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:176 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:169 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:408 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:410 msgid "MPC" msgstr "MPC" #: internet/magnatune/magnatuneservice.cpp:109 #: ../bin/src/ui_magnatunesettingspage.h:153 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:130 msgid "Magnatune Download" msgstr "Magnatune 下載" #: widgets/osd.cpp:196 msgid "Magnatune download finished" msgstr "Magnatune 下載完成" #: ../bin/src/ui_transcoderoptionsaac.h:133 msgid "Main profile (MAIN)" msgstr "主規格 (MAIN)" #: core/backgroundstreams.cpp:52 msgid "Make it so!" msgstr "使它這樣的!" #: ../bin/src/ui_mainwindow.h:679 msgctxt "Label for button to enable/disable Enterprise background sound." msgid "Make it so!" msgstr "" #: internet/spotify/spotifyservice.cpp:662 msgid "Make playlist available offline" msgstr "使播放清單可離線使用" #: internet/lastfm/lastfmservice.cpp:259 msgid "Malformed response" msgstr "格式不正確的反應" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Manual proxy configuration" msgstr "手動代理伺服器設定" #: ../bin/src/ui_podcastsettingspage.h:258 #: ../bin/src/ui_podcastsettingspage.h:272 msgid "Manually" msgstr "手動" #: devices/deviceproperties.cpp:156 msgid "Manufacturer" msgstr "製造商" #: internet/podcasts/podcastservice.cpp:448 ../bin/src/ui_organisedialog.h:259 msgid "Mark as listened" msgstr "標記為聽過的" #: internet/podcasts/podcastservice.cpp:447 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:115 msgid "Match every search term (AND)" msgstr "符合每個搜尋字詞(AND)" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match one or more search terms (OR)" msgstr "符合一個或更多搜尋字詞(OR)" #: ../bin/src/ui_vksettingspage.h:220 msgid "Max global search results" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:208 msgid "Maximum bitrate" msgstr "最大位元率" #: ripper/ripcddialog.cpp:136 msgid "Media has changed. Reloading" msgstr "" #: analyzers/analyzercontainer.cpp:69 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "Medium (%1 fps)" msgstr "中 (%1 fps)" #: visualisations/visualisationcontainer.cpp:122 msgid "Medium (512x512)" msgstr "中 (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:155 msgid "Membership type" msgstr "會員類型" #: ../bin/src/ui_transcoderoptionsvorbis.h:205 msgid "Minimum bitrate" msgstr "最小位元率" #: ../bin/src/ui_playbacksettingspage.h:365 msgid "Minimum buffer fill" msgstr "" #: visualisations/projectmvisualisation.cpp:131 msgid "Missing projectM presets" msgstr "略過 projectM 預設" #: devices/deviceproperties.cpp:155 msgid "Model" msgstr "樣本" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Monitor the library for changes" msgstr "監視音樂庫的變化" #: ../bin/src/ui_playbacksettingspage.h:370 msgid "Mono playback" msgstr "單聲道播放" #: smartplaylists/searchterm.cpp:397 msgid "Months" msgstr "月" #: playlist/playlist.cpp:1376 msgid "Mood" msgstr "" #: moodbar/moodbarproxystyle.cpp:382 #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "Moodbars" msgstr "" #: internet/vk/vkservice.cpp:512 msgid "More" msgstr "" #: library/library.cpp:84 msgid "Most played" msgstr "最常播放的" #: devices/giolister.cpp:155 msgid "Mount point" msgstr "掛載點" #: devices/devicekitlister.cpp:127 msgid "Mount points" msgstr "掛載點" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:130 ../bin/src/ui_songinfosettingspage.h:161 msgid "Move down" msgstr "下移" #: ui/mainwindow.cpp:634 widgets/fileviewlist.cpp:40 msgid "Move to library..." msgstr "移到音樂庫..." #: ../bin/src/ui_globalsearchsettingspage.h:147 #: ../bin/src/ui_queuemanager.h:126 ../bin/src/ui_songinfosettingspage.h:160 msgid "Move up" msgstr "上移" #: transcoder/transcodedialog.cpp:225 ui/mainwindow.cpp:1899 #: internet/vk/vkservice.cpp:893 msgid "Music" msgstr "音樂" #: ../bin/src/ui_librarysettingspage.h:185 msgid "Music Library" msgstr "音樂庫" #: core/globalshortcuts.cpp:63 wiimotedev/wiimotesettingspage.cpp:106 #: ../bin/src/ui_mainwindow.h:702 msgid "Mute" msgstr "靜音" #: internet/vk/vkservice.cpp:829 msgid "My Albums" msgstr "" #: internet/vk/vkservice.cpp:887 msgid "My Music" msgstr "" #: internet/vk/vkservice.cpp:519 msgid "My Recommendations" msgstr "我推薦的電台" #: ui/equalizer.cpp:205 ../bin/src/ui_deviceproperties.h:368 #: ../bin/src/ui_wizardfinishpage.h:83 msgid "Name" msgstr "名稱" #: ../bin/src/ui_magnatunedownloaddialog.h:134 msgctxt "Category label" msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:248 msgid "Naming options" msgstr "命名選項" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Narrow band (NB)" msgstr "窄頻 (NB)" #: ../bin/src/ui_networkproxysettingspage.h:156 msgid "Network Proxy" msgstr "網路代理伺服器" #: ../bin/src/ui_networkremotesettingspage.h:221 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:296 ui/edittagdialog.cpp:523 msgid "Never" msgstr "從未" #: library/library.cpp:74 msgid "Never played" msgstr "從未播放" #: ../bin/src/ui_behavioursettingspage.h:327 #: ../bin/src/ui_behavioursettingspage.h:347 msgid "Never start playing" msgstr "永不開始播放" #: playlist/playlistlistcontainer.cpp:69 #: playlist/playlistlistcontainer.cpp:168 #: ../bin/src/ui_playlistlistcontainer.h:127 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1736 ../bin/src/ui_mainwindow.h:690 msgid "New playlist" msgstr "新增播放清單" #: library/libraryview.cpp:387 msgid "New smart playlist..." msgstr "新增智慧型播放清單" #: widgets/freespacebar.cpp:45 msgid "New songs" msgstr "新的歌曲" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "New tracks will be added automatically." msgstr "新曲目將被自動加入。" #: library/library.cpp:92 msgid "Newest tracks" msgstr "最新曲目" #: ui/edittagdialog.cpp:163 ui/trackselectiondialog.cpp:48 msgid "Next" msgstr "下一個" #: core/globalshortcuts.cpp:57 wiimotedev/wiimotesettingspage.cpp:97 #: ../bin/src/ui_mainwindow.h:645 msgid "Next track" msgstr "下一首曲目" #: core/utilities.cpp:151 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:87 msgid "No analyzer" msgstr "沒有分析儀" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "No background image" msgstr "沒有背景圖片" #: ui/albumcovermanager.cpp:786 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No long blocks" msgstr "無長區塊" #: playlist/playlistcontainer.cpp:376 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "沒有找到符合的.清除搜尋框,再次顯示整個播放清單" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "No short blocks" msgstr "無短區塊" #: ../bin/src/ui_groupbydialog.h:127 ../bin/src/ui_groupbydialog.h:146 #: ../bin/src/ui_groupbydialog.h:165 msgid "None" msgstr "沒有" #: library/libraryview.cpp:633 ui/mainwindow.cpp:2212 ui/mainwindow.cpp:2360 msgid "None of the selected songs were suitable for copying to a device" msgstr "所選歌曲沒有適合複製到裝置的" #: moodbar/moodbarrenderer.cpp:169 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:143 msgid "Normal block type" msgstr "普通區塊型態" #: playlist/playlistsequence.cpp:199 msgid "Not available while using a dynamic playlist" msgstr "不可使用,當使用一個動態播放清單" #: devices/deviceview.cpp:109 msgid "Not connected" msgstr "沒有連接" #: internet/lastfm/lastfmservice.cpp:250 msgid "Not enough content" msgstr "沒有足夠的內容" #: internet/lastfm/lastfmservice.cpp:254 msgid "Not enough fans" msgstr "沒有足夠的粉絲" #: internet/lastfm/lastfmservice.cpp:252 msgid "Not enough members" msgstr "沒有足夠的成員" #: internet/lastfm/lastfmservice.cpp:256 msgid "Not enough neighbors" msgstr "沒有足夠的鄰居" #: internet/spotify/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "沒有安裝" #: globalsearch/globalsearchsettingspage.cpp:119 #: globalsearch/searchproviderstatuswidget.cpp:47 msgid "Not logged in" msgstr "沒有登錄" #: devices/deviceview.cpp:113 msgid "Not mounted - double click to mount" msgstr "未掛載 - 雙擊以掛載" #: internet/vk/vksearchdialog.cpp:93 msgid "Nothing found" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "Notification type" msgstr "通知型式" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Notifications" msgstr "通知" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "現在正播放" #: ../bin/src/ui_podcastsettingspage.h:279 msgid "Number of episodes to show" msgstr "" #: ui/notificationssettingspage.cpp:36 msgid "OSD Preview" msgstr "OSD 的預覽" #: widgets/osd.cpp:173 msgid "Off" msgstr "" #: core/song.cpp:414 transcoder/transcoder.cpp:244 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:420 transcoder/transcoder.cpp:250 msgid "Ogg Opus" msgstr "" #: core/song.cpp:416 transcoder/transcoder.cpp:247 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:418 transcoder/transcoder.cpp:241 #: ../bin/src/ui_magnatunedownloaddialog.h:138 #: ../bin/src/ui_magnatunesettingspage.h:169 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: widgets/osd.cpp:173 msgid "On" msgstr "" #: ../bin/src/ui_skydrivesettingspage.h:102 msgid "OneDrive" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:226 msgid "" "Only accept connections from clients within the ip ranges:\n" "10.x.x.x\n" "172.16.0.0 - 172.31.255.255\n" "192.168.x.x" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:231 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "只顯示第一" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "Opacity" msgstr "" #: internet/digitally/digitallyimportedservicebase.cpp:176 #: internet/icecast/icecastservice.cpp:302 #: internet/jamendo/jamendoservice.cpp:434 #: internet/magnatune/magnatuneservice.cpp:284 #: internet/somafm/somafmservice.cpp:102 #: internet/soundcloud/soundcloudservice.cpp:351 #, qt-format msgid "Open %1 in browser" msgstr "在瀏覽器中開啟 %1" #: ../bin/src/ui_mainwindow.h:675 msgid "Open &audio CD..." msgstr "開啟音樂光碟(&A)..." #: internet/podcasts/addpodcastdialog.cpp:238 msgid "Open OPML file" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:80 msgid "Open OPML file..." msgstr "" #: transcoder/transcodedialog.cpp:240 msgid "Open a directory to import music from" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "Open device" msgstr "開啟裝置" #: ../bin/src/ui_mainwindow.h:674 msgid "Open file..." msgstr "開啟檔案..." #: internet/googledrive/googledriveservice.cpp:216 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:221 globalsearch/globalsearchview.cpp:461 #: internet/core/internetservice.cpp:102 library/libraryview.cpp:377 #: widgets/fileviewlist.cpp:35 msgid "Open in new playlist" msgstr "開啟在新的播放清單" #: ../bin/src/ui_behavioursettingspage.h:342 msgctxt "Refers to behavior settings in Clementine settings page." msgid "Open in new playlist" msgstr "" #: songinfo/echonestbiographies.cpp:101 msgid "Open in your browser" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "Open..." msgstr "開啟..." #: internet/lastfm/lastfmservice.cpp:236 msgid "Operation failed" msgstr "操作失敗" #: ../bin/src/ui_transcoderoptionsmp3.h:192 msgid "Optimize for bitrate" msgstr "最佳化位元率" #: ../bin/src/ui_transcoderoptionsmp3.h:190 msgid "Optimize for quality" msgstr "最佳化品質" #: ../bin/src/ui_transcodedialog.h:222 #: ../bin/src/ui_networkremotesettingspage.h:251 #: ../bin/src/ui_ripcddialog.h:321 msgid "Options..." msgstr "選擇..." #: ../bin/src/ui_transcodersettingspage.h:180 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:239 msgid "Organise Files" msgstr "組織檔案" #: library/libraryview.cpp:398 ui/mainwindow.cpp:637 msgid "Organise files..." msgstr "組織檔案..." #: core/organise.cpp:73 msgid "Organising files" msgstr "組織檔案中" #: ui/trackselectiondialog.cpp:162 msgid "Original tags" msgstr "原來的標籤" #: playlist/playlist.cpp:1329 ui/organisedialog.cpp:73 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:154 #: ../bin/src/ui_groupbydialog.h:173 msgid "Original year" msgstr "" #: ../bin/src/ui_groupbydialog.h:137 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_groupbydialog.h:175 msgid "Original year - Album" msgstr "" #: library/library.cpp:118 msgid "Original year tag support" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Other options" msgstr "其它選項" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:362 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:220 ../bin/src/ui_ripcddialog.h:317 msgid "Output options" msgstr "輸出選項" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:258 msgid "Overwrite existing files" msgstr "覆寫現有的檔案" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Owner" msgstr "擁有者" #: internet/jamendo/jamendoservice.cpp:228 msgid "Parsing Jamendo catalogue" msgstr "擷取 Jamendo目錄" #: ui/equalizer.cpp:139 msgid "Party" msgstr "派對" #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:284 #: ../bin/src/ui_networkproxysettingspage.h:168 #: ../bin/src/ui_seafilesettingspage.h:169 msgid "Password" msgstr "密碼" #: core/globalshortcuts.cpp:50 ui/mainwindow.cpp:1058 ui/mainwindow.cpp:1549 #: ui/qtsystemtrayicon.cpp:175 wiimotedev/wiimotesettingspage.cpp:107 msgid "Pause" msgstr "暫停" #: core/commandlineoptions.cpp:152 msgid "Pause playback" msgstr "暫停播放" #: widgets/osd.cpp:156 msgid "Paused" msgstr "已暫停" #: playlist/playlist.cpp:1337 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:140 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_groupbydialog.h:178 ../bin/src/ui_edittagdialog.h:741 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:664 msgid "Plain sidebar" msgstr "樸素的側邊欄" #: core/globalshortcuts.cpp:49 ui/mainwindow.cpp:609 ui/mainwindow.cpp:1026 #: ui/mainwindow.cpp:1044 ui/mainwindow.cpp:1552 ui/qtsystemtrayicon.cpp:164 #: ui/qtsystemtrayicon.cpp:188 wiimotedev/wiimotesettingspage.cpp:100 #: ../bin/src/ui_mainwindow.h:641 msgid "Play" msgstr "播放" #: playlist/playlist.cpp:1344 ../bin/src/ui_edittagdialog.h:718 msgid "Play count" msgstr "播放計數" #: core/commandlineoptions.cpp:151 msgid "Play if stopped, pause if playing" msgstr "停止的話就開始播放,播放中的就暫停" #: ../bin/src/ui_behavioursettingspage.h:328 #: ../bin/src/ui_behavioursettingspage.h:348 msgid "Play if there is nothing already playing" msgstr "播放如果沒有歌曲是正在播放中" #: core/commandlineoptions.cpp:169 msgid "Play the th track in the playlist" msgstr "播放清單中的第首歌曲" #: core/globalshortcuts.cpp:51 wiimotedev/wiimotesettingspage.cpp:109 msgid "Play/Pause" msgstr "播放/暫停" #: ../bin/src/ui_playbacksettingspage.h:339 msgid "Playback" msgstr "播放" #: core/commandlineoptions.cpp:149 msgid "Player options" msgstr "播放器選項" #: playlist/playlistcontainer.cpp:287 playlist/playlistlistcontainer.cpp:228 #: playlist/playlistmanager.cpp:87 playlist/playlistmanager.cpp:156 #: playlist/playlistmanager.cpp:501 playlist/playlisttabbar.cpp:366 msgid "Playlist" msgstr "播放清單" #: widgets/osd.cpp:180 msgid "Playlist finished" msgstr "完成的播放清單" #: core/commandlineoptions.cpp:166 #: ../bin/src/ui_playlistsaveoptionsdialog.h:94 msgid "Playlist options" msgstr "播放清單選擇" #: smartplaylists/wizard.cpp:72 msgid "Playlist type" msgstr "播放清單類型" #: internet/soundcloud/soundcloudservice.cpp:130 ui/mainwindow.cpp:241 msgid "Playlists" msgstr "播放清單" #: ../data/oauthsuccess.html:38 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Plugin status:" msgstr "插件狀態:" #: internet/podcasts/podcastservice.cpp:131 #: ../bin/src/ui_podcastsettingspage.h:253 msgid "Podcasts" msgstr "Podcasts" #: ui/equalizer.cpp:141 msgid "Pop" msgstr "流行音樂" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Popup duration" msgstr "彈出持續時間" #: ../bin/src/ui_networkproxysettingspage.h:165 #: ../bin/src/ui_networkremotesettingspage.h:224 msgid "Port" msgstr "連接埠" #: ui/equalizer.cpp:44 ../bin/src/ui_playbacksettingspage.h:359 msgid "Pre-amp" msgstr "前置放大" #: ../bin/src/ui_seafilesettingspage.h:176 msgid "Preference" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:215 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:154 ../bin/src/ui_vksettingspage.h:219 msgid "Preferences" msgstr "偏好設定" #: ../bin/src/ui_mainwindow.h:664 msgid "Preferences..." msgstr "偏好設定…" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Preferred album art filenames (comma separated)" msgstr "偏好專輯封面的檔名(以逗號分隔)" #: ../bin/src/ui_magnatunesettingspage.h:166 msgid "Preferred audio format" msgstr "偏好的音訊格式" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Preferred bitrate" msgstr "偏好的位元率" #: ../bin/src/ui_deviceproperties.h:379 msgid "Preferred format" msgstr "偏好的格式" #: ../bin/src/ui_digitallyimportedsettingspage.h:173 msgid "Premium audio type" msgstr "高級音訊類型" #: ../bin/src/ui_equalizer.h:163 msgid "Preset:" msgstr "預設:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Press a button combination to use for" msgstr "按下一組按鍵來操作" #: ../bin/src/ui_globalshortcutgrabber.h:72 msgid "Press a key" msgstr "按一個鍵" #: ui/globalshortcutgrabber.cpp:35 ../bin/src/ui_globalshortcutgrabber.h:73 #, qt-format msgid "Press a key combination to use for %1..." msgstr "按下一組按鍵來操作 %1" #: ../bin/src/ui_behavioursettingspage.h:331 msgid "Pressing \"Previous\" in player will..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Pretty OSD options" msgstr "漂亮的 OSD 選項" #: ../bin/src/ui_searchpreview.h:104 ../bin/src/ui_songinfosettingspage.h:157 #: ../bin/src/ui_notificationssettingspage.h:452 #: ../bin/src/ui_organisedialog.h:260 msgid "Preview" msgstr "預覽" #: ui/edittagdialog.cpp:162 ui/trackselectiondialog.cpp:47 msgid "Previous" msgstr "往前" #: core/globalshortcuts.cpp:59 wiimotedev/wiimotesettingspage.cpp:99 #: ../bin/src/ui_mainwindow.h:639 msgid "Previous track" msgstr "上一首歌曲" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "印出版本資訊" #: ../bin/src/ui_transcoderoptionsaac.h:130 msgid "Profile" msgstr "規格" #: ../bin/src/ui_transcodedialog.h:229 ../bin/src/ui_ripcddialog.h:323 msgid "Progress" msgstr "進展" #: ../bin/src/ui_magnatunedownloaddialog.h:133 msgctxt "Category label" msgid "Progress" msgstr "" #: ui/equalizer.cpp:144 msgid "Psychedelic" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:239 #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Push Wiiremote button" msgstr "按 Wiiremote 按鈕" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "將歌曲放入隨機曲單" #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:191 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 msgctxt "Sound quality" msgid "Quality" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgctxt "Visualisation quality" msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Querying device..." msgstr "查詢裝置..." #: ../bin/src/ui_queuemanager.h:124 ../bin/src/ui_mainwindow.h:700 msgid "Queue Manager" msgstr "佇列管理員" #: ui/mainwindow.cpp:1644 msgid "Queue selected tracks" msgstr "將選取的歌曲加入佇列中" #: globalsearch/globalsearchview.cpp:466 library/libraryview.cpp:382 #: ui/mainwindow.cpp:1642 msgid "Queue track" msgstr "將歌曲加入佇列中" #: ../bin/src/ui_playbacksettingspage.h:356 msgid "Radio (equal loudness for all tracks)" msgstr "廣播 (為所有歌曲取得相同音量)" #: core/backgroundstreams.cpp:47 msgid "Rain" msgstr "下雨" #: ../bin/src/ui_mainwindow.h:677 msgctxt "Label for button to enable/disable rain background sound." msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:111 msgid "Random visualization" msgstr "隨機視覺化" #: core/globalshortcuts.cpp:83 msgid "Rate the current song 0 stars" msgstr "評價目前的歌曲 0 顆星" #: core/globalshortcuts.cpp:85 msgid "Rate the current song 1 star" msgstr "評價目前的歌曲 1 顆星" #: core/globalshortcuts.cpp:87 msgid "Rate the current song 2 stars" msgstr "評價目前的歌曲 2 顆星" #: core/globalshortcuts.cpp:89 msgid "Rate the current song 3 stars" msgstr "評價目前的歌曲 3 顆星" #: core/globalshortcuts.cpp:91 msgid "Rate the current song 4 stars" msgstr "評價目前的歌曲 4 顆星" #: core/globalshortcuts.cpp:93 msgid "Rate the current song 5 stars" msgstr "評價目前的歌曲 5 顆星" #: playlist/playlist.cpp:1342 ../bin/src/ui_edittagdialog.h:726 msgid "Rating" msgstr "評分" #: internet/magnatune/magnatunedownloaddialog.cpp:305 #: ui/albumcovermanager.cpp:218 msgid "Really cancel?" msgstr "真的要取消?" #: internet/subsonic/subsonicsettingspage.cpp:157 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/jamendo/jamendoservice.cpp:437 #: internet/magnatune/magnatuneservice.cpp:287 #: internet/subsonic/subsonicservice.cpp:109 msgid "Refresh catalogue" msgstr "刷新目錄" #: internet/somafm/somafmservice.cpp:111 msgid "Refresh channels" msgstr "刷新頻道" #: internet/icecast/icecastservice.cpp:305 msgid "Refresh station list" msgstr "重新整理電台清單" #: internet/digitally/digitallyimportedservicebase.cpp:179 msgid "Refresh streams" msgstr "重新整理串流" #: ui/equalizer.cpp:146 msgid "Reggae" msgstr "雷鬼" #: playlist/playlistsaveoptionsdialog.cpp:33 #: ../bin/src/ui_behavioursettingspage.h:364 msgid "Relative" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 msgid "Remember Wii remote swing" msgstr "記住Wii遙控器揮動" #: ../bin/src/ui_behavioursettingspage.h:317 msgid "Remember from last time" msgstr "記得上一次的狀態" #: ../bin/src/ui_playlistsaveoptionsdialog.h:99 msgid "Remember my choice" msgstr "" #: internet/internetradio/savedradio.cpp:107 ../bin/src/ui_queuemanager.h:134 #: ../bin/src/ui_transcodedialog.h:215 msgid "Remove" msgstr "移除" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Remove action" msgstr "刪除功能" #: ../bin/src/ui_mainwindow.h:709 msgid "Remove duplicates from playlist" msgstr "從播放清單中移除重複的" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Remove folder" msgstr "移除資料夾" #: internet/vk/vkservice.cpp:325 msgid "Remove from My Music" msgstr "" #: internet/vk/vkservice.cpp:311 msgid "Remove from bookmarks" msgstr "" #: internet/spotify/spotifyservice.cpp:674 ../bin/src/ui_mainwindow.h:684 msgid "Remove from playlist" msgstr "從播放清單移除" #: playlist/playlisttabbar.cpp:183 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:317 msgid "Remove playlists" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Remove unavailable tracks from playlist" msgstr "" #: playlist/playlisttabbar.cpp:146 msgid "Rename playlist" msgstr "變更播放清單名稱" #: playlist/playlisttabbar.cpp:57 msgid "Rename playlist..." msgstr "重新命名播放清單" #: ../bin/src/ui_mainwindow.h:660 msgid "Renumber tracks in this order..." msgstr "按此順序重新為歌曲編號..." #: playlist/playlistsequence.cpp:203 ../bin/src/ui_playlistsequence.h:121 msgid "Repeat" msgstr "循環播放" #: widgets/osd.cpp:312 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat album" msgstr "循環播放專輯" #: widgets/osd.cpp:315 ../bin/src/ui_playlistsequence.h:113 msgid "Repeat playlist" msgstr "循環播放所有歌曲" #: widgets/osd.cpp:309 ../bin/src/ui_playlistsequence.h:111 msgid "Repeat track" msgstr "循環播放單曲" #: devices/deviceview.cpp:219 globalsearch/globalsearchview.cpp:457 #: internet/core/internetservice.cpp:91 library/libraryview.cpp:374 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "取代目前播放清單" #: ../bin/src/ui_behavioursettingspage.h:341 msgid "Replace the playlist" msgstr "取代播放清單" #: ../bin/src/ui_organisedialog.h:256 msgid "Replaces spaces with underscores" msgstr "用底線取代空格" #: ../bin/src/ui_playbacksettingspage.h:351 msgid "Replay Gain" msgstr "播放增益" #: ../bin/src/ui_playbacksettingspage.h:353 msgid "Replay Gain mode" msgstr "播放增益模式" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Repopulate" msgstr "重新填充" #: ../bin/src/ui_networkremotesettingspage.h:235 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:52 ../bin/src/ui_vksettingspage.h:228 msgid "Reset" msgstr "重置" #: ui/edittagdialog.cpp:800 ../bin/src/ui_edittagdialog.h:716 msgid "Reset play counts" msgstr "重置播放計數" #: ../bin/src/ui_behavioursettingspage.h:335 msgid "Restart song, then jump to previous if pressed again" msgstr "" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "" #: ../bin/src/ui_organisedialog.h:257 msgid "Restrict to ASCII characters" msgstr "限制為 ASCII 字符" #: ../bin/src/ui_behavioursettingspage.h:318 msgid "Resume playback on start" msgstr "" #: ../data/oauthsuccess.html:5 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Right" msgstr "" #: ../bin/src/ui_ripcddialog.h:302 msgid "Rip" msgstr "" #: ripper/ripcddialog.cpp:95 msgid "Rip CD" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Rip audio CD" msgstr "" #: ui/equalizer.cpp:148 msgid "Rock" msgstr "搖滾" #: ../bin/src/ui_console.h:80 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "SOCKS proxy" msgstr "SOCKS 代理" #: internet/subsonic/subsonicsettingspage.cpp:146 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:203 msgid "Safely remove device" msgstr "安全地移除裝置" #: ../bin/src/ui_organisedialog.h:247 msgid "Safely remove the device after copying" msgstr "在複製之後,安全的移除裝置" #: playlist/playlist.cpp:1357 ../bin/src/ui_edittagdialog.h:723 #: ../bin/src/ui_playbacksettingspage.h:371 msgid "Sample rate" msgstr "取樣頻率" #: ui/organisedialog.cpp:78 msgid "Samplerate" msgstr "取樣頻率" #: ../bin/src/ui_appearancesettingspage.h:294 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:127 msgid "Save album cover" msgstr "儲存專輯封面" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Save cover to disk..." msgstr "儲存封面到磁碟..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:230 msgid "Save image" msgstr "儲存圖片" #: playlist/playlistlistcontainer.cpp:72 msgctxt "Save playlist menu action." msgid "Save playlist" msgstr "" #: playlist/playlistmanager.cpp:231 msgctxt "Title of the playlist save dialog." msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:59 ../bin/src/ui_mainwindow.h:692 msgid "Save playlist..." msgstr "儲存播放清單" #: ui/equalizer.cpp:205 ../bin/src/ui_equalizer.h:165 msgid "Save preset" msgstr "儲存設定" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:196 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Save this stream in the Internet tab" msgstr "儲存這個串流網址到「網路」這個分頁標籤" #: library/library.cpp:194 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:703 ui/trackselectiondialog.cpp:254 msgid "Saving tracks" msgstr "儲存曲目" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Scalable sampling rate profile (SSR)" msgstr "可變取樣率規格 (SSR)" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1350 ../bin/src/ui_edittagdialog.h:724 msgid "Score" msgstr "分數" #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Scrobble tracks that I listen to" msgstr "Scrobble 我在聽的曲目" #: ../bin/src/ui_seafilesettingspage.h:164 msgid "Seafile" msgstr "" #: ui/albumcoversearcher.cpp:165 ui/albumcoversearcher.cpp:182 #: internet/vk/vkservice.cpp:527 ../bin/src/ui_gpoddersearchpage.h:77 #: ../bin/src/ui_itunessearchpage.h:77 ../bin/src/ui_albumcoversearcher.h:113 msgid "Search" msgstr "搜尋" #: ui/mainwindow.cpp:236 ../bin/src/ui_globalsearchsettingspage.h:144 msgctxt "Global search settings dialog title." msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Search Icecast stations" msgstr "搜尋 Icecast stations" #: internet/jamendo/jamendoservice.cpp:444 msgid "Search Jamendo" msgstr "搜尋 Jamendo" #: internet/magnatune/magnatuneservice.cpp:296 msgid "Search Magnatune" msgstr "搜尋 Magnatune" #: internet/subsonic/subsonicservice.cpp:93 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:73 msgid "Search automatically" msgstr "" #: ui/albumcoverchoicecontroller.cpp:66 msgid "Search for album covers..." msgstr "搜尋專輯封面..." #: ../bin/src/ui_globalsearchview.h:207 msgid "Search for anything" msgstr "搜尋任何東西" #: ../bin/src/ui_gpoddersearchpage.h:75 msgid "Search gpodder.net" msgstr "搜尋 gpodder.net" #: ../bin/src/ui_itunessearchpage.h:75 msgid "Search iTunes" msgstr "搜尋 iTunes" #: ../bin/src/ui_querysearchpage.h:112 msgid "Search mode" msgstr "搜尋模式" #: smartplaylists/querywizardplugin.cpp:159 msgid "Search options" msgstr "搜尋選項" #: internet/soundcloud/soundcloudservice.cpp:116 #: internet/spotify/spotifyservice.cpp:406 msgid "Search results" msgstr "搜尋結果" #: smartplaylists/querywizardplugin.cpp:155 #: ../bin/src/ui_querysearchpage.h:119 msgid "Search terms" msgstr "搜尋條件" #: ../bin/src/ui_groupbydialog.h:143 msgid "Second level" msgstr "第二個層次" #: core/globalshortcuts.cpp:65 wiimotedev/wiimotesettingspage.cpp:111 msgid "Seek backward" msgstr "倒帶" #: core/globalshortcuts.cpp:64 wiimotedev/wiimotesettingspage.cpp:113 msgid "Seek forward" msgstr "快轉" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track by a relative amount" msgstr "藉由相對數字尋找現在播放的曲目" #: core/commandlineoptions.cpp:160 msgid "Seek the currently playing track to an absolute position" msgstr "藉由絕對位置尋找現在播放的曲目" #: ../bin/src/ui_behavioursettingspage.h:357 msgid "Seeking using a keyboard shortcut" msgstr "" #: visualisations/visualisationselector.cpp:37 ../bin/src/ui_ripcddialog.h:309 msgid "Select All" msgstr "選擇全部" #: visualisations/visualisationselector.cpp:38 ../bin/src/ui_ripcddialog.h:310 msgid "Select None" msgstr "不選取" #: ../bin/src/ui_appearancesettingspage.h:276 msgid "Select background color:" msgstr "選擇背景色:" #: ui/appearancesettingspage.cpp:258 msgid "Select background image" msgstr "選擇背景圖片" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Select best possible match" msgstr "選擇最佳匹配" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Select foreground color:" msgstr "選擇前景色:" #: ../bin/src/ui_visualisationselector.h:107 msgid "Select visualizations" msgstr "選取視覺化" #: visualisations/visualisationcontainer.cpp:131 msgid "Select visualizations..." msgstr "選取視覺化..." #: ../bin/src/ui_transcodedialog.h:228 ../bin/src/ui_ripcddialog.h:318 msgid "Select..." msgstr "" #: devices/devicekitlister.cpp:126 msgid "Serial number" msgstr "序號" #: ../bin/src/ui_seafilesettingspage.h:173 msgid "Server" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:124 msgid "Server details" msgstr "" #: internet/lastfm/lastfmservice.cpp:242 msgid "Service offline" msgstr "服務離線" #: ui/mainwindow.cpp:1681 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "設定 %1 到「%2」..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "設定音量到百分之" #: ../bin/src/ui_mainwindow.h:661 msgid "Set value for all selected tracks..." msgstr "為所有選擇的歌曲設定音量..." #: ../bin/src/ui_networkremotesettingspage.h:223 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:172 msgid "Shortcut" msgstr "快速鍵" #: ui/globalshortcutssettingspage.cpp:130 #: ../bin/src/ui_globalshortcutssettingspage.h:174 #, qt-format msgid "Shortcut for %1" msgstr "%1 的快速鍵" #: wiimotedev/wiimotesettingspage.cpp:133 #, qt-format msgid "Shortcut for %1 already exists" msgstr "%1 的快速鍵已經存在" #: library/libraryfilterwidget.cpp:69 msgid "Show" msgstr "顯示" #: core/globalshortcuts.cpp:67 wiimotedev/wiimotesettingspage.cpp:115 msgid "Show OSD" msgstr "顯示 OSD" #: ../bin/src/ui_playbacksettingspage.h:340 msgid "Show a glowing animation on the current track" msgstr "顯示一發光動畫在目前播放歌曲上" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 msgid "Show a native desktop notification" msgstr "顯示一原生桌面通知" #: ../bin/src/ui_notificationssettingspage.h:447 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "當我改變重複 / 隨機播放模式時,顯示一個通知" #: ../bin/src/ui_notificationssettingspage.h:446 msgid "Show a notification when I change the volume" msgstr "當我改變音量時,顯示一個通知" #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Show a notification when I pause playback" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a popup from the system tray" msgstr "從系統工作列顯示一個彈出訊息" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Show a pretty OSD" msgstr "顯示一個漂亮的螢幕顯示" #: widgets/nowplayingwidget.cpp:140 msgid "Show above status bar" msgstr "顯示在狀態欄上方" #: ui/mainwindow.cpp:577 msgid "Show all songs" msgstr "顯示所有歌曲" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "顯示所有的歌曲" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Show cover art in library" msgstr "在音樂庫,顯示封面圖片" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show dividers" msgstr "顯示分隔線" #: ui/albumcoverchoicecontroller.cpp:70 widgets/prettyimage.cpp:182 msgid "Show fullsize..." msgstr "全螢幕..." #: ../bin/src/ui_vksettingspage.h:222 msgid "Show groups in global search result" msgstr "" #: library/libraryview.cpp:415 ui/mainwindow.cpp:646 #: widgets/fileviewlist.cpp:51 msgid "Show in file browser..." msgstr "在檔案瀏覽器顯示..." #: ui/mainwindow.cpp:649 msgid "Show in library..." msgstr "" #: library/libraryview.cpp:419 msgid "Show in various artists" msgstr "顯示各演出者" #: moodbar/moodbarproxystyle.cpp:377 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:579 msgid "Show only duplicates" msgstr "只顯示重複的" #: ui/mainwindow.cpp:581 msgid "Show only untagged" msgstr "只顯示未標記的" #: ../bin/src/ui_vksettingspage.h:223 msgid "Show playing song on your page" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Show the \"love\" button" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the scrobble button in the main window" msgstr "在主視窗顯示 scrobble 的按鈕" #: ../bin/src/ui_behavioursettingspage.h:305 msgid "Show tray icon" msgstr "顯示工作列圖示" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Show/Hide" msgstr "顯示 / 隱藏" #: playlist/playlistsequence.cpp:202 ../bin/src/ui_playlistsequence.h:124 msgid "Shuffle" msgstr "隨機播放" #: widgets/osd.cpp:294 ../bin/src/ui_playlistsequence.h:119 msgid "Shuffle albums" msgstr "隨機播放專輯" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:118 msgid "Shuffle all" msgstr "隨機播放所有歌曲" #: ../bin/src/ui_mainwindow.h:668 msgid "Shuffle playlist" msgstr "隨機排列播放清單" #: widgets/osd.cpp:291 ../bin/src/ui_playlistsequence.h:117 msgid "Shuffle tracks in this album" msgstr "隨機播放這張專輯中的曲目" #: ../bin/src/ui_podcastsettingspage.h:283 msgid "Sign in" msgstr "登錄" #: ../bin/src/ui_loginstatewidget.h:172 msgid "Sign out" msgstr "登出" #: ../bin/src/ui_loginstatewidget.h:174 msgid "Signing in..." msgstr "登錄..." #: songinfo/echonestsimilarartists.cpp:58 msgid "Similar artists" msgstr "相似的演出者" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Size:" msgstr "" #: ui/equalizer.cpp:152 msgid "Ska" msgstr "強節奏流行音樂" #: core/commandlineoptions.cpp:153 msgid "Skip backwards in playlist" msgstr "跳至播放清單開頭" #: playlist/playlist.cpp:1346 ../bin/src/ui_edittagdialog.h:720 msgid "Skip count" msgstr "略過計數" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "跳至播放清單最後頭" #: ui/mainwindow.cpp:1655 msgid "Skip selected tracks" msgstr "" #: ui/mainwindow.cpp:1653 msgid "Skip track" msgstr "" #: widgets/nowplayingwidget.cpp:96 msgid "Small album cover" msgstr "小的專輯封面" #: widgets/fancytabwidget.cpp:663 msgid "Small sidebar" msgstr "小型測邊欄" #: smartplaylists/wizard.cpp:63 msgid "Smart playlist" msgstr "智慧型播放清單" #: library/librarymodel.cpp:1351 msgid "Smart playlists" msgstr "智慧型播放清單" #: ui/equalizer.cpp:150 msgid "Soft" msgstr "輕柔的音樂" #: ui/equalizer.cpp:154 msgid "Soft Rock" msgstr "比較輕柔的搖滾樂" #: ../bin/src/ui_songinfosettingspage.h:153 msgid "Song Information" msgstr "歌曲資訊" #: ui/mainwindow.cpp:249 msgid "Song info" msgstr "歌曲" #: analyzers/sonogram.cpp:32 msgid "Sonogram" msgstr "聲納圖" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Sorry" msgstr "不好意思" #: ../bin/src/ui_icecastfilterwidget.h:74 msgid "Sort by genre (alphabetically)" msgstr "按風格排序(按字母順序排列)" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (by popularity)" msgstr "按風格排序(按熱門程度)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by station name" msgstr "以站名分類" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "歌曲排序方式" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "分類" #: ../bin/src/ui_soundcloudsettingspage.h:103 msgid "SoundCloud" msgstr "" #: playlist/playlist.cpp:1374 msgid "Source" msgstr "來源" #: ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_internetshowsettingspage.h:87 msgid "Sources" msgstr "來源" #: ../bin/src/ui_transcodersettingspage.h:177 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:206 msgid "Spotify" msgstr "Spotify" #: internet/spotify/spotifyservice.cpp:219 msgid "Spotify login error" msgstr "Spotify 登錄錯誤" #: internet/spotify/spotifyservice.cpp:837 msgid "Spotify playlist's URL" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:211 msgid "Spotify plugin" msgstr "Spotify 插件" #: internet/spotify/spotifyblobdownloader.cpp:71 msgid "Spotify plugin not installed" msgstr "Spotify 插件沒有安裝" #: internet/spotify/spotifyservice.cpp:828 msgid "Spotify song's URL" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Standard" msgstr "標準" #: internet/spotify/spotifyservice.cpp:414 msgid "Starred" msgstr "已標記星號" #: ripper/ripcddialog.cpp:69 msgid "Start ripping" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Start the playlist currently playing" msgstr "開始播放目前播放清單" #: transcoder/transcodedialog.cpp:90 msgid "Start transcoding" msgstr "開始轉碼" #: internet/soundcloud/soundcloudservice.cpp:118 #: internet/spotify/spotifyservice.cpp:408 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:397 #, qt-format msgid "Starting %1" msgstr "標記星號 %1" #: internet/magnatune/magnatunedownloaddialog.cpp:124 msgid "Starting..." msgstr "開啟..." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:101 #: ../bin/src/ui_mainwindow.h:643 msgid "Stop" msgstr "停止" #: wiimotedev/wiimotesettingspage.cpp:114 msgid "Stop after" msgstr "在...之後停止" #: ../bin/src/ui_playlistsequence.h:114 msgid "Stop after each track" msgstr "" #: widgets/osd.cpp:318 msgid "Stop after every track" msgstr "" #: ui/mainwindow.cpp:612 ../bin/src/ui_mainwindow.h:649 msgid "Stop after this track" msgstr "在這首歌之後停止" #: core/commandlineoptions.cpp:152 msgid "Stop playback" msgstr "停止播放" #: core/globalshortcuts.cpp:55 msgid "Stop playing after current track" msgstr "在目前這首歌之後停止" #: widgets/osd.cpp:173 #, qt-format msgid "Stop playing after track: %1" msgstr "" #: widgets/osd.cpp:167 msgid "Stopped" msgstr "已停止" #: core/song.cpp:431 msgid "Stream" msgstr "串流" #: internet/subsonic/subsonicsettingspage.cpp:50 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "Streaming membership" msgstr "串流成員" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Subscribers" msgstr "" #: internet/subsonic/subsonicservice.cpp:120 #: ../bin/src/ui_subsonicsettingspage.h:123 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:189 #, qt-format msgid "Successfully written %1" msgstr "成功寫入 %1" #: ui/trackselectiondialog.cpp:166 msgid "Suggested tags" msgstr "建議標籤" #: ../bin/src/ui_edittagdialog.h:732 #: ../bin/src/ui_notificationssettingspage.h:454 msgid "Summary" msgstr "摘要" #: analyzers/analyzercontainer.cpp:71 #: visualisations/visualisationcontainer.cpp:113 #, qt-format msgid "Super high (%1 fps)" msgstr "超級高(%1 fps)" #: visualisations/visualisationcontainer.cpp:126 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 msgid "Supported formats" msgstr "支持格式" #: ../bin/src/ui_librarysettingspage.h:200 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotify/spotifyservice.cpp:701 msgid "Syncing Spotify inbox" msgstr "同步 Spotify 的收件匣" #: internet/spotify/spotifyservice.cpp:695 msgid "Syncing Spotify playlist" msgstr "同步 Spotify 的播放清單" #: internet/spotify/spotifyservice.cpp:706 msgid "Syncing Spotify starred tracks" msgstr "同步 Spotify 的星號標記曲目" #: moodbar/moodbarrenderer.cpp:177 msgid "System colors" msgstr "系統顏色" #: widgets/fancytabwidget.cpp:665 msgid "Tabs on top" msgstr "標籤在上面" #: ../bin/src/ui_trackselectiondialog.h:203 msgid "Tag fetcher" msgstr "標籤擷取器" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Target bitrate" msgstr "目標位元率" #: ui/equalizer.cpp:156 msgid "Techno" msgstr "電子音樂" #: ../bin/src/ui_notificationssettingspage.h:466 msgid "Text options" msgstr "文字選項" #: ui/about.cpp:74 msgid "Thanks to" msgstr "感謝" #: ui/globalshortcutssettingspage.cpp:170 #, qt-format msgid "The \"%1\" command could not be started." msgstr "無法開始指令\"%1\"" #: ../bin/src/ui_appearancesettingspage.h:281 msgid "The album cover of the currently playing song" msgstr "目前播放歌曲的專輯封面" #: internet/magnatune/magnatunedownloaddialog.cpp:94 #, qt-format msgid "The directory %1 is not valid" msgstr "目錄%1是無效的" #: smartplaylists/searchtermwidget.cpp:346 msgid "The second value must be greater than the first one!" msgstr "第二個值必須大於第一個!" #: ui/coverfromurldialog.cpp:71 msgid "The site you requested does not exist!" msgstr "您要求的網站不存在!" #: ui/coverfromurldialog.cpp:83 msgid "The site you requested is not an image!" msgstr "您要求的網址不是一個圖片!" #: internet/subsonic/subsonicsettingspage.cpp:116 msgid "" "The trial period for the Subsonic server is over. Please donate to get a " "license key. Visit subsonic.org for details." msgstr "" #: ui/mainwindow.cpp:2474 msgid "" "The version of Clementine you've just updated to requires a full library " "rescan because of the new features listed below:" msgstr "方才更新的 Clementine 因為以下新的功能,需要對音樂庫做完整的重新掃描:" #: library/libraryview.cpp:555 msgid "There are other songs in this album" msgstr "有其他歌曲在這張專輯中" #: internet/podcasts/gpoddersearchpage.cpp:76 #: internet/podcasts/gpoddertoptagsmodel.cpp:104 #: internet/podcasts/gpoddertoptagspage.cpp:73 msgid "There was a problem communicating with gpodder.net" msgstr "與 gpodder.net 進行通信有一個問題" #: internet/magnatune/magnatunedownloaddialog.cpp:163 msgid "There was a problem fetching the metadata from Magnatune" msgstr "從 Magnatune 獲取詮釋資料有一個問題" #: internet/podcasts/itunessearchpage.cpp:77 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:54 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "複製歌曲時發生問題,以下檔案將無法複製:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "刪除歌曲時發生問題,以下檔案將無法刪除:" #: devices/deviceview.cpp:405 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "這些檔案將從裝置上被移除,你確定你要繼續?" #: library/libraryview.cpp:639 ui/mainwindow.cpp:2262 widgets/fileview.cpp:187 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "These folders will be scanned for music to make up your library" msgstr "這些資料夾將被掃描是否有音樂檔,以建構您的音樂庫。" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "這些設定是使用在「音樂轉碼」對話框中。" #: ../bin/src/ui_groupbydialog.h:162 msgid "Third level" msgstr "第三個層次" #: internet/jamendo/jamendoservice.cpp:181 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "這項動作將新增一個容量大約 150MB 的資料庫,仍然要繼續?" #: internet/magnatune/magnatunedownloaddialog.cpp:190 msgid "This album is not available in the requested format" msgstr "這張專輯中不提供所要求的格式" #: ../bin/src/ui_playlistsaveoptionsdialog.h:97 msgid "This can be changed later through the preferences" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "裝置必須在 Clementine 發現可支援的檔案格式前連接並開啟。" #: ../bin/src/ui_deviceproperties.h:374 msgid "This device supports the following file formats:" msgstr "裝置支援以下檔案格式:" #: devices/devicemanager.cpp:563 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "裝置將無法正常運作" #: devices/devicemanager.cpp:564 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "這是一個 MTP 裝置,但您編譯的 Clementine 卻為包含 libmtp 支援。" #: devices/devicemanager.cpp:575 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "這是一個 iPod,但是您編譯 Clementine 卻未包含 libgpod 支援。" #: devices/devicemanager.cpp:322 msgid "" "This is the first time you have connected this device. Clementine will now " "scan the device to find music files - this may take some time." msgstr "這是您第一次連接這個裝置,Clementine 將掃描裝置並搜尋音樂檔案-將需要一些時間。" #: playlist/playlisttabbar.cpp:197 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfm/lastfmservice.cpp:244 msgid "This stream is for paid subscribers only" msgstr "此串流音樂是只針對付費用戶" #: devices/devicemanager.cpp:591 #, qt-format msgid "This type of device is not supported: %1" msgstr "這種裝置不被支援: %1" #: ../bin/src/ui_behavioursettingspage.h:358 msgid "Time step" msgstr "" #: playlist/playlist.cpp:1315 ui/organisedialog.cpp:60 #: ui/qtsystemtrayicon.cpp:232 ../bin/src/ui_about.h:141 #: ../bin/src/ui_edittagdialog.h:733 ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_ripcddialog.h:306 msgid "Title" msgstr "標題" #: core/utilities.cpp:136 core/utilities.cpp:148 msgid "Today" msgstr "今日" #: core/globalshortcuts.cpp:69 msgid "Toggle Pretty OSD" msgstr "拖曳漂亮的螢幕顯示" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "切換全螢幕模式" #: ui/mainwindow.cpp:1646 msgid "Toggle queue status" msgstr "切換佇列狀態" #: ../bin/src/ui_mainwindow.h:707 msgid "Toggle scrobbling" msgstr "切換 scrobbling" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "調整漂亮的螢幕顯示的可見度" #: core/utilities.cpp:149 msgid "Tomorrow" msgstr "" #: internet/podcasts/podcasturlloader.cpp:117 msgid "Too many redirects" msgstr "" #: internet/spotify/spotifyservice.cpp:427 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Total bytes transferred" msgstr "總傳輸位元組" #: covers/coversearchstatisticsdialog.cpp:67 msgid "Total network requests made" msgstr "總發送網路請求" #: playlist/playlist.cpp:1323 ui/organisedialog.cpp:69 #: ../bin/src/ui_edittagdialog.h:734 ../bin/src/ui_trackselectiondialog.h:212 #: ../bin/src/ui_ripcddialog.h:304 msgid "Track" msgstr "歌曲" #: internet/soundcloud/soundcloudservice.cpp:133 msgid "Tracks" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 ../bin/src/ui_mainwindow.h:686 msgid "Transcode Music" msgstr "音樂轉碼" #: ../bin/src/ui_transcodelogdialog.h:62 msgid "Transcoder Log" msgstr "轉碼日誌" #: ../bin/src/ui_transcodersettingspage.h:172 msgid "Transcoding" msgstr "轉碼" #: transcoder/transcoder.cpp:317 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "轉碼 %1 個檔案使用 %2 個進程" #: ../bin/src/ui_transcoderoptionsdialog.h:53 msgid "Transcoding options" msgstr "轉碼選項" #: core/song.cpp:426 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:35 msgid "Turbine" msgstr "渦輪" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Turn off" msgstr "關閉" #: devices/giolister.cpp:157 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Ultra wide band (UWB)" msgstr "超寬頻 (UWB)" #: internet/seafile/seafilesettingspage.cpp:131 #: internet/seafile/seafilesettingspage.cpp:132 msgid "Unable to connect" msgstr "" #: internet/magnatune/magnatunedownloaddialog.cpp:149 #, qt-format msgid "Unable to download %1 (%2)" msgstr "無法下載 %1 (%2)" #: core/song.cpp:435 library/librarymodel.cpp:361 library/librarymodel.cpp:366 #: library/librarymodel.cpp:370 library/librarymodel.cpp:1143 #: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:508 #: playlist/playlistmanager.cpp:509 ui/albumcoverchoicecontroller.cpp:124 #: ui/edittagdialog.cpp:455 ui/edittagdialog.cpp:499 msgid "Unknown" msgstr "未知的" #: internet/podcasts/podcasturlloader.cpp:208 msgid "Unknown content-type" msgstr "未知的內容類型" #: internet/digitally/digitallyimportedclient.cpp:74 #: internet/lastfm/lastfmservice.cpp:263 msgid "Unknown error" msgstr "不明的錯誤" #: ui/albumcoverchoicecontroller.cpp:68 msgid "Unset cover" msgstr "未設置封面" #: ui/mainwindow.cpp:1651 msgid "Unskip selected tracks" msgstr "" #: ui/mainwindow.cpp:1649 msgid "Unskip track" msgstr "" #: internet/podcasts/addpodcastdialog.cpp:68 #: internet/podcasts/podcastservice.cpp:442 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:172 msgid "Upcoming Concerts" msgstr "" #: internet/vk/vkservice.cpp:341 msgid "Update" msgstr "" #: internet/podcasts/podcastservice.cpp:419 msgid "Update all podcasts" msgstr "更新全部的 podcasts" #: ../bin/src/ui_mainwindow.h:698 msgid "Update changed library folders" msgstr "更新改變的音樂庫資料夾" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Update the library when Clementine starts" msgstr "當啟動 Clementine 時,更新音樂庫" #: internet/podcasts/podcastservice.cpp:427 msgid "Update this podcast" msgstr "更新這個 podcast" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Updating" msgstr "更新" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "更新 %1" #: devices/deviceview.cpp:105 #, qt-format msgid "Updating %1%..." msgstr "更新 %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "正在更新音樂庫" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "使用" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Use Album Artist tag when available" msgstr "當有可以用時,使用專輯演出者標籤" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Use Gnome's shortcut keys" msgstr "使用 Gnome 的快速鍵" #: analyzers/analyzercontainer.cpp:94 msgid "Use Psychedelic Colors" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:352 msgid "Use Replay Gain metadata if it is available" msgstr "使用播放增益元數據,如果它是可獲得的" #: ../bin/src/ui_subsonicsettingspage.h:128 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use Wii Remote" msgstr "使用 Wii 遙控器" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use a custom color set" msgstr "使用自訂顏色組合" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Use a custom message for notifications" msgstr "使用自訂訊息的通知" #: ../bin/src/ui_networkremotesettingspage.h:222 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 msgid "Use authentication" msgstr "使用認證" #: ../bin/src/ui_transcoderoptionsvorbis.h:202 msgid "Use bitrate management engine" msgstr "使用位元率管理引擎" #: ../bin/src/ui_wizardfinishpage.h:84 msgid "Use dynamic mode" msgstr "使用動態模式" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Use notifications to report Wii Remote status" msgstr "使用通知信息以報告 Wii 遙控器的狀態" #: ../bin/src/ui_transcoderoptionsaac.h:138 msgid "Use temporal noise shaping" msgstr "使用時域雜訊重整" #: ../bin/src/ui_behavioursettingspage.h:311 msgid "Use the system default" msgstr "使用系統預設" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Use the system default color set" msgstr "使用系統預設的顏色組合" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Use the system proxy settings" msgstr "使用系統代理設置" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Use volume normalisation" msgstr "使用音量正常化" #: widgets/freespacebar.cpp:46 msgid "Used" msgstr "已用" #: ui/settingsdialog.cpp:155 msgid "User interface" msgstr "使用者介面" #: ../bin/src/ui_magnatunesettingspage.h:162 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_subsonicsettingspage.h:126 #: ../bin/src/ui_podcastsettingspage.h:282 #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Username" msgstr "使用者名稱" #: ../bin/src/ui_behavioursettingspage.h:324 msgid "Using the menu to add a song will..." msgstr "使用選單加入的歌曲將..." #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:231 msgid "Variable bit rate" msgstr "可變位元率" #: globalsearch/globalsearchmodel.cpp:106 library/librarymodel.cpp:287 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:270 msgid "Various artists" msgstr "各種演出者" #: ui/about.cpp:33 #, qt-format msgid "Version %1" msgstr "版本 %1" #: ../bin/src/ui_albumcovermanager.h:219 msgid "View" msgstr "檢視" #: ../bin/src/ui_visualisationselector.h:108 msgid "Visualization mode" msgstr "視覺化模式" #: ui/dbusscreensaver.cpp:33 ../bin/src/ui_mainwindow.h:699 msgid "Visualizations" msgstr "視覺化" #: ../bin/src/ui_visualisationoverlay.h:184 msgid "Visualizations Settings" msgstr "視覺化設定" #: ../bin/src/ui_vksettingspage.h:215 msgid "Vk.com" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Voice activity detection" msgstr "語音活動偵測" #: widgets/osd.cpp:186 #, qt-format msgid "Volume %1%" msgstr "音量 %1%" #: ../bin/src/ui_transcodersettingspage.h:175 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "WMA" msgstr "WMA" #: internet/vk/vkservice.cpp:869 msgid "Wall" msgstr "" #: playlist/playlisttabbar.cpp:192 ../bin/src/ui_behavioursettingspage.h:307 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:424 transcoder/transcoder.cpp:256 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Website" msgstr "網站" #: smartplaylists/searchterm.cpp:395 msgid "Weeks" msgstr "星期" #: ../bin/src/ui_behavioursettingspage.h:314 msgid "When Clementine starts" msgstr "當 Clementine 啟動" #: ../bin/src/ui_librarysettingspage.h:203 msgid "" "When looking for album art Clementine will first look for picture files that contain one of these words.\n" "If there are no matches then it will use the largest image in the directory." msgstr "在搜尋專輯封面時, Clementine 會優先搜尋包含以下單字的圖片。\n假如沒有任何吻合的項目, Clementine 將使用檔案所在目錄下最大的圖片。" #: ../bin/src/ui_behavioursettingspage.h:361 msgid "When saving a playlist, file paths should be" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:150 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Wide band (WB)" msgstr "寬頻 (WB)" #: widgets/osd.cpp:243 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii 遙控器 %1 :起作用的" #: widgets/osd.cpp:255 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: 連接的" #: widgets/osd.cpp:274 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: 電池電量嚴重不足 (%2%) " #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: 沒作用的" #: widgets/osd.cpp:261 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: 未連接的" #: widgets/osd.cpp:267 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: 電池電量不足 (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:181 msgid "Wiimotedev" msgstr "Wii 遙控裝置" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:404 transcoder/transcoder.cpp:253 msgid "Windows Media audio" msgstr "Windows Media 音訊" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:556 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2481 msgid "Would you like to run a full rescan right now?" msgstr "您想要立刻執行完整的重新掃描嗎?" #: library/librarysettingspage.cpp:154 msgid "Write all songs statistics into songs' files" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:366 msgid "Write metadata" msgstr "" #: internet/subsonic/subsonicsettingspage.cpp:101 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1327 ui/organisedialog.cpp:72 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:153 #: ../bin/src/ui_groupbydialog.h:172 ../bin/src/ui_edittagdialog.h:738 #: ../bin/src/ui_trackselectiondialog.h:211 ../bin/src/ui_ripcddialog.h:312 msgid "Year" msgstr "年份" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_groupbydialog.h:174 msgid "Year - Album" msgstr "年份 - 專輯" #: smartplaylists/searchterm.cpp:399 msgid "Years" msgstr "年" #: core/utilities.cpp:137 msgid "Yesterday" msgstr "昨天" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "You are about to download the following albums" msgstr "您將要下載以下專輯" #: playlist/playlistlistcontainer.cpp:318 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:186 msgid "" "You are about to remove a playlist which is not part of your favorite playlists: the playlist will be deleted (this action cannot be undone). \n" "Are you sure you want to continue?" msgstr "" #: ../bin/src/ui_loginstatewidget.h:171 msgid "You are not signed in." msgstr "您還沒有登錄。" #: widgets/loginstatewidget.cpp:71 #, qt-format msgid "You are signed in as %1." msgstr "您是登錄為 %1。" #: widgets/loginstatewidget.cpp:68 msgid "You are signed in." msgstr "您已登錄。" #: ../bin/src/ui_groupbydialog.h:122 msgid "You can change the way the songs in the library are organised." msgstr "您可以改變音樂庫中歌曲的組織方式。" #: internet/digitally/digitallyimportedsettingspage.cpp:48 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "您可以收聽免費的而不需要帳號,但高級會員可以收聽沒有廣告且更高品質的串流。" #: internet/magnatune/magnatunesettingspage.cpp:58 msgid "" "You can listen to Magnatune songs for free without an account. Purchasing a" " membership removes the messages at the end of each track." msgstr "您可以免費聽 Magnatune 的歌曲,而不需要一個帳戶。而當您購買成為會員時,每首歌曲後的廣告訊息將刪除." #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "You can listen to background streams at the same time as other music." msgstr "您可以在同一時間聽「背景串流」和其他音樂。" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "" "You can use your Wii Remote as a remote control for Clementine. See the page on the " "Clementine wiki for more information.\n" msgstr "您可以使用您的 Wii 遙控器遙控 Clementine。 請參閱在 Clementine wiki 的頁面 取得更多的資訊。\n" #: internet/spotify/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "您沒有 Spotify 的高級帳戶。" #: internet/digitally/digitallyimportedclient.cpp:96 msgid "You do not have an active subscription" msgstr "" #: ../bin/src/ui_soundcloudsettingspage.h:104 msgid "" "You don't need to be logged in to search and to listen to music on " "SoundCloud. However, you need to login to access your playlists and your " "stream." msgstr "" #: internet/spotify/spotifyservice.cpp:204 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "您已經登出 Spotify,請重新在設置對話框中輸入您的密碼。" #: internet/spotify/spotifysettingspage.cpp:160 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "您已經登出Spotify,請重新輸入您的密碼。" #: songinfo/lastfmtrackinfoprovider.cpp:85 msgid "You love this track" msgstr "您愛這首歌曲" #: ../bin/src/ui_globalshortcutssettingspage.h:169 msgid "" "You need to launch System Preferences and allow Clementine to \"control your computer\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:313 msgid "You will need to restart Clementine if you change the language." msgstr "您將需要重新啟動 Clementine ,如果您變更了本程式使用者介面所用的語言。" #: ../bin/src/ui_networkremotesettingspage.h:240 msgid "Your IP address:" msgstr "" #: internet/lastfm/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatune/magnatunesettingspage.cpp:117 msgid "Your Magnatune credentials were incorrect" msgstr "您的 Magnatune 的憑證是不正確的" #: library/libraryview.cpp:347 msgid "Your library is empty!" msgstr "您的音樂庫是空的!" #: globalsearch/savedradiosearchprovider.cpp:26 #: internet/internetradio/savedradio.cpp:53 msgid "Your radio streams" msgstr "您的電台" #: songinfo/lastfmtrackinfoprovider.cpp:87 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:159 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/spotify/spotifysettingspage.cpp:155 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:370 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:158 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:28 #, c-format, qt-plural-format msgctxt "" msgid "add %n songs" msgstr "加入 %n 歌" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "之後" #: ../bin/src/ui_searchtermwidget.h:269 msgid "ago" msgstr "之久" #: ../bin/src/ui_searchtermwidget.h:268 msgid "and" msgstr "和" #: ../bin/src/ui_transcoderoptionsspeex.h:218 msgid "automatic" msgstr "自動" #: smartplaylists/searchterm.cpp:207 msgid "before" msgstr "之前" #: smartplaylists/searchterm.cpp:217 msgid "between" msgstr "之間" #: smartplaylists/searchterm.cpp:380 msgid "biggest first" msgstr "最大優先" #: playlist/playlistview.cpp:228 ui/edittagdialog.cpp:492 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:225 msgid "contains" msgstr "包含" #: ../bin/src/ui_transcoderoptionsspeex.h:221 #: ../bin/src/ui_transcoderoptionsvorbis.h:206 #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "disabled" msgstr "禁用" #: widgets/osd.cpp:112 #, qt-format msgid "disc %1" msgstr "光碟%1" #: smartplaylists/searchterm.cpp:227 msgid "does not contain" msgstr "不包含" #: smartplaylists/searchterm.cpp:231 msgid "ends with" msgstr "以...結尾" #: smartplaylists/searchterm.cpp:237 msgid "equals" msgstr "相等" #: ../bin/src/ui_podcastsettingspage.h:280 msgid "gpodder.net" msgstr "gpodder.net" #: internet/podcasts/gpoddertoptagspage.cpp:35 msgid "gpodder.net directory" msgstr "gpodder.net 目錄" #: smartplaylists/searchterm.cpp:233 msgid "greater than" msgstr "大於" #: ../bin/src/ui_deviceviewcontainer.h:98 msgid "iPods and USB devices currently don't work on Windows. Sorry!" msgstr "" #: smartplaylists/searchterm.cpp:213 msgid "in the last" msgstr "在最後" #: internet/spotify/spotifysettingspage.cpp:62 #: internet/spotify/spotifysettingspage.cpp:63 #: internet/spotify/spotifysettingspage.cpp:64 playlist/playlistview.cpp:232 #: ui/edittagdialog.cpp:494 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:235 msgid "less than" msgstr "少於" #: smartplaylists/searchterm.cpp:376 msgid "longest first" msgstr "最長優先" #: playlist/playlistundocommands.cpp:82 #, c-format, qt-plural-format msgctxt "" msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:373 msgid "newest first" msgstr "最新優先" #: smartplaylists/searchterm.cpp:239 msgid "not equals" msgstr "不相等" #: smartplaylists/searchterm.cpp:215 msgid "not in the last" msgstr "不在最後" #: smartplaylists/searchterm.cpp:211 msgid "not on" msgstr "不在" #: smartplaylists/searchterm.cpp:372 msgid "oldest first" msgstr "最舊優先" #: smartplaylists/searchterm.cpp:209 msgid "on" msgstr "在" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "選項" #: ../bin/src/ui_networkremotesettingspage.h:253 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "按下Enter" #: playlist/playlistundocommands.cpp:53 playlist/playlistundocommands.cpp:75 #, c-format, qt-plural-format msgctxt "" msgid "remove %n songs" msgstr "移除 %n 歌" #: smartplaylists/searchterm.cpp:375 msgid "shortest first" msgstr "最短優先" #: playlist/playlistundocommands.cpp:106 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:379 msgid "smallest first" msgstr "最小優先" #: playlist/playlistundocommands.cpp:100 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:229 msgid "starts with" msgstr "以...開始" #: playlist/playlistdelegates.cpp:181 msgid "stop" msgstr "停止" #: widgets/osd.cpp:113 #, qt-format msgid "track %1" msgstr "歌曲 %1" clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/000077500000000000000000000000001260417502300205735ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/about.cpp000066400000000000000000000076241260417502300224220ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "about.h" #include "config.h" #include "ui_about.h" #include #include const char* About::kUrl = "http://www.clementine-player.org/"; About::About(QWidget* parent) : QDialog(parent) { ui_.setupUi(this); setWindowTitle(tr("About %1").arg(QCoreApplication::applicationName())); ui_.title->setText(QCoreApplication::applicationName()); ui_.version->setText( tr("Version %1").arg(QCoreApplication::applicationVersion())); QFont title_font; title_font.setBold(true); title_font.setPointSize(title_font.pointSize() + 4); ui_.title->setFont(title_font); authors_ << Person("David Sansome", "me@davidsansome.com") << Person("John Maguire", "john.maguire@gmail.com") << Person(QString::fromUtf8("Paweł Bara"), "keirangtp@gmail.com") << Person("Arnaud Bienner", "arnaud.bienner@gmail.com"); thanks_to_ << Person("Mark Kretschmann", "kretschmann@kde.org") << Person("Max Howell", "max.howell@methylblue.com") << Person(QString::fromUtf8("Bartłomiej Burdukiewicz"), "dev.strikeu@gmail.com") << Person("Jakub Stachowski", "qbast@go2.pl") << Person("Paul Cifarelli", "paul@cifarelli.net") << Person("Felipe Rivera", "liebremx@users.sourceforge.net") << Person("Alexander Peitz") << Person("Artur Rona", "artur.rona@gmail.com") << Person("Andreas Muttscheller", "asfa194@gmail.com") << Person("Mark Furneaux", "mark@furneaux.ca"); qSort(authors_); qSort(thanks_to_); ui_.content->setHtml(MakeHtml()); ui_.buttonBox->button(QDialogButtonBox::Close) ->setShortcut(QKeySequence::Close); } QString About::MakeHtml() const { QString ret = QString( "

%2

" "

%3:").arg(kUrl, kUrl, tr("Authors")); for (const Person& person : authors_) { ret += "
" + MakeHtml(person); } ret += QString("

%3:").arg(tr("Thanks to")); for (const Person& person : thanks_to_) { ret += "
" + MakeHtml(person); } ret += QString( "
" + tr("All the translators") + " <" "https://www.transifex.com/projects/p/clementine/>"); ret += QString("
%1

").arg(tr("...and all the Amarok contributors")); ret += QString("

%1").arg(tr("And:")); ret += QString("
Rainy Mood"); ret += QString( "
Scott " "Smitelli"); ret += QString( "
Allie " "Brosh

"); ret += "

This product uses Music by Spotify but is not endorsed, certified " "or otherwise approved in any way by Spotify. Spotify is the registered " "trade mark of the Spotify Group.

"; return ret; } QString About::MakeHtml(const Person& person) const { if (person.email.isNull()) return person.name; else return QString("%1 <%3>") .arg(person.name, person.email, person.email); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/about.h000066400000000000000000000025011260417502300220540ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ABOUT_H #define ABOUT_H #include #include "ui_about.h" class About : public QDialog { Q_OBJECT public: About(QWidget* parent = nullptr); static const char* kUrl; struct Person { Person(const QString& n, const QString& e = QString()) : name(n), email(e) {} bool operator<(const Person& other) const { return name < other.name; } QString name; QString email; }; private: QString MakeHtml() const; QString MakeHtml(const Person& person) const; private: Ui::About ui_; QList authors_; QList thanks_to_; }; #endif // ABOUT_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/about.ui000066400000000000000000000103451260417502300222470ustar00rootroot00000000000000 About 0 0 652 480 :/icon.png:/icon.png #line { color: lightgrey; } :/icon.png false Qt::Vertical 20 40 QFrame::Plain Qt::Vertical 16777215 64 0 Qt::Vertical 20 40 Title Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse true Qt::Horizontal QDialogButtonBox::Close buttonBox accepted() About accept() 248 254 157 274 buttonBox rejected() About reject() 316 260 286 274 clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/addstreamdialog.cpp000066400000000000000000000052671260417502300244350ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "addstreamdialog.h" #include "ui_addstreamdialog.h" #include "internet/core/internetmodel.h" #include "internet/internetradio/savedradio.h" #include #include #include #include const char* AddStreamDialog::kSettingsGroup = "AddStreamDialog"; AddStreamDialog::AddStreamDialog(QWidget* parent) : QDialog(parent), ui_(new Ui_AddStreamDialog), saved_radio_(nullptr) { ui_->setupUi(this); connect(ui_->url, SIGNAL(textChanged(QString)), SLOT(TextChanged(QString))); TextChanged(QString::null); // Restore settings QSettings s; s.beginGroup(kSettingsGroup); ui_->save->setChecked(s.value("save", true).toBool()); ui_->url->setText(s.value("url").toString()); ui_->name->setText(s.value("name").toString()); } AddStreamDialog::~AddStreamDialog() { delete ui_; } QUrl AddStreamDialog::url() const { return QUrl(ui_->url->text()); } QString AddStreamDialog::name() const { return ui_->name->text(); } void AddStreamDialog::set_name(const QString& name) { ui_->name->setText(name); } void AddStreamDialog::set_url(const QUrl& url) { ui_->url->setText(url.toString()); } void AddStreamDialog::set_save_visible(bool visible) { ui_->save->setVisible(visible); if (!visible) ui_->name_container->setEnabled(true); } void AddStreamDialog::accept() { if (ui_->save->isChecked() && saved_radio_) { saved_radio_->Add(url(), name()); } // Save settings QSettings s; s.beginGroup(kSettingsGroup); s.setValue("save", ui_->save->isChecked()); s.setValue("url", url().toString()); s.setValue("name", ui_->name->text()); QDialog::accept(); } void AddStreamDialog::TextChanged(const QString& text) { // Decide whether the URL is valid QUrl url(text); bool valid = url.isValid() && !url.scheme().isEmpty() && !url.toString().isEmpty(); ui_->button_box->button(QDialogButtonBox::Ok)->setEnabled(valid); } void AddStreamDialog::showEvent(QShowEvent*) { ui_->url->setFocus(); ui_->url->selectAll(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/addstreamdialog.h000066400000000000000000000027321260417502300240740ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ADDSTREAMDIALOG_H #define ADDSTREAMDIALOG_H #include #include class SavedRadio; class Ui_AddStreamDialog; class AddStreamDialog : public QDialog { Q_OBJECT public: AddStreamDialog(QWidget* parent = nullptr); ~AddStreamDialog(); void set_url(const QUrl& url); void set_name(const QString& name); void set_save_visible(bool visible); void set_add_on_accept(SavedRadio* saved_radio) { saved_radio_ = saved_radio; } QUrl url() const; QString name() const; void accept(); protected: void showEvent(QShowEvent*); private slots: void TextChanged(const QString& text); private: static const char* kSettingsGroup; Ui_AddStreamDialog* ui_; SavedRadio* saved_radio_; }; #endif // ADDSTREAMDIALOG_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/addstreamdialog.ui000066400000000000000000000065351260417502300242670ustar00rootroot00000000000000 AddStreamDialog 0 0 400 168 Add Stream :/icon.png:/icon.png Enter the URL of an internet radio stream: Save this stream in the Internet tab true 0 Give it a name: Qt::Vertical 20 7 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok url save name button_box button_box accepted() AddStreamDialog accept() 257 158 157 167 button_box rejected() AddStreamDialog reject() 325 158 286 167 save toggled(bool) name_container setEnabled(bool) 65 75 111 97 clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/albumcoverchoicecontroller.cpp000066400000000000000000000266341260417502300267300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "core/application.h" #include "core/logging.h" #include "core/utilities.h" #include "covers/albumcoverfetcher.h" #include "covers/albumcoverloader.h" #include "covers/currentartloader.h" #include "library/librarybackend.h" #include "ui/albumcoverchoicecontroller.h" #include "ui/albumcovermanager.h" #include "ui/albumcoversearcher.h" #include "ui/coverfromurldialog.h" #include "ui/iconloader.h" #include #include #include #include #include #include #include #include #include #include const char* AlbumCoverChoiceController::kLoadImageFileFilter = QT_TR_NOOP( "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)"); const char* AlbumCoverChoiceController::kSaveImageFileFilter = QT_TR_NOOP("Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)"); const char* AlbumCoverChoiceController::kAllFilesFilter = QT_TR_NOOP("All files (*)"); QSet* AlbumCoverChoiceController::sImageExtensions = nullptr; AlbumCoverChoiceController::AlbumCoverChoiceController(QWidget* parent) : QWidget(parent), app_(nullptr), cover_searcher_(nullptr), cover_fetcher_(nullptr), save_file_dialog_(nullptr), cover_from_url_dialog_(nullptr) { cover_from_file_ = new QAction(IconLoader::Load("document-open"), tr("Load cover from disk..."), this); cover_to_file_ = new QAction(IconLoader::Load("document-save"), tr("Save cover to disk..."), this); cover_from_url_ = new QAction(IconLoader::Load("download"), tr("Load cover from URL..."), this); search_for_cover_ = new QAction(IconLoader::Load("find"), tr("Search for album covers..."), this); unset_cover_ = new QAction(IconLoader::Load("list-remove"), tr("Unset cover"), this); show_cover_ = new QAction(IconLoader::Load("zoom-in"), tr("Show fullsize..."), this); search_cover_auto_ = new QAction(IconLoader::Load("find"), tr("Search automatically"), this); search_cover_auto_->setCheckable(true); search_cover_auto_->setChecked(false); separator_ = new QAction(this); separator_->setSeparator(true); } AlbumCoverChoiceController::~AlbumCoverChoiceController() {} void AlbumCoverChoiceController::SetApplication(Application* app) { app_ = app; cover_fetcher_ = new AlbumCoverFetcher(app_->cover_providers(), this); cover_searcher_ = new AlbumCoverSearcher(QIcon(":/nocover.png"), app, this); cover_searcher_->Init(cover_fetcher_); connect(cover_fetcher_, SIGNAL(AlbumCoverFetched(quint64, QImage, CoverSearchStatistics)), this, SLOT(AlbumCoverFetched(quint64, QImage, CoverSearchStatistics))); } QList AlbumCoverChoiceController::GetAllActions() { return QList() << cover_from_file_ << cover_to_file_ << separator_ << cover_from_url_ << search_for_cover_ << unset_cover_ << show_cover_; } QString AlbumCoverChoiceController::LoadCoverFromFile(Song* song) { QString cover = QFileDialog::getOpenFileName( this, tr("Load cover from disk"), GetInitialPathForFileDialog(*song, QString()), tr(kLoadImageFileFilter) + ";;" + tr(kAllFilesFilter)); if (cover.isNull()) return QString(); // Can we load the image? QImage image(cover); if (!image.isNull()) { SaveCover(song, cover); return cover; } else { return QString(); } } void AlbumCoverChoiceController::SaveCoverToFile(const Song& song, const QImage& image) { QString initial_file_name = "/" + (song.album().isEmpty() ? tr("Unknown") : song.album()) + ".jpg"; QString save_filename = QFileDialog::getSaveFileName( this, tr("Save album cover"), GetInitialPathForFileDialog(song, initial_file_name), tr(kSaveImageFileFilter) + ";;" + tr(kAllFilesFilter)); if (save_filename.isNull()) return; QString extension = save_filename.right(4); if (!extension.startsWith('.') || !QImageWriter::supportedImageFormats().contains( extension.right(3).toUtf8())) { save_filename.append(".jpg"); } image.save(save_filename); } QString AlbumCoverChoiceController::GetInitialPathForFileDialog( const Song& song, const QString& filename) { // art automatic is first to show user which cover the album may be // using now; the song is using it if there's no manual path but we // cannot use manual path here because it can contain cached paths if (!song.art_automatic().isEmpty() && !song.has_embedded_cover()) { return song.art_automatic(); // if no automatic art, start in the song's folder } else if (!song.url().isEmpty() && song.url().toLocalFile().contains('/')) { return song.url().toLocalFile().section('/', 0, -2) + filename; // fallback - start in home } else { return QDir::home().absolutePath() + filename; } } QString AlbumCoverChoiceController::LoadCoverFromURL(Song* song) { if (!cover_from_url_dialog_) { cover_from_url_dialog_ = new CoverFromURLDialog(this); } QImage image = cover_from_url_dialog_->Exec(); if (!image.isNull()) { QString cover = SaveCoverInCache(song->artist(), song->album(), image); SaveCover(song, cover); return cover; } else { return QString(); } } QString AlbumCoverChoiceController::SearchForCover(Song* song) { // Get something sensible to stick in the search box QImage image = cover_searcher_->Exec(song->artist(), song->album()); if (!image.isNull()) { QString cover = SaveCoverInCache(song->artist(), song->album(), image); SaveCover(song, cover); return cover; } else { return QString(); } } QString AlbumCoverChoiceController::UnsetCover(Song* song) { QString cover = Song::kManuallyUnsetCover; SaveCover(song, cover); return cover; } void AlbumCoverChoiceController::ShowCover(const Song& song) { QDialog* dialog = new QDialog(this); dialog->setAttribute(Qt::WA_DeleteOnClose, true); // Use Artist - Album as the window title QString title_text(song.albumartist()); if (title_text.isEmpty()) title_text = song.artist(); if (!song.album().isEmpty()) title_text += " - " + song.album(); QLabel* label = new QLabel(dialog); label->setPixmap(AlbumCoverLoader::TryLoadPixmap( song.art_automatic(), song.art_manual(), song.url().toLocalFile())); // add (WxHpx) to the title before possibly resizing title_text += " (" + QString::number(label->pixmap()->width()) + "x" + QString::number(label->pixmap()->height()) + "px)"; // if the cover is larger than the screen, resize the window // 85% seems to be enough to account for title bar and taskbar etc. QDesktopWidget desktop; int current_screen = desktop.screenNumber(this); int desktop_height = desktop.screenGeometry(current_screen).height(); int desktop_width = desktop.screenGeometry(current_screen).width(); // resize differently if monitor is in portrait mode if (desktop_width < desktop_height) { const int new_width = (double)desktop_width * 0.95; if (new_width < label->pixmap()->width()) { label->setPixmap( label->pixmap()->scaledToWidth(new_width, Qt::SmoothTransformation)); } } else { const int new_height = (double)desktop_height * 0.85; if (new_height < label->pixmap()->height()) { label->setPixmap(label->pixmap()->scaledToHeight( new_height, Qt::SmoothTransformation)); } } dialog->setWindowTitle(title_text); dialog->setFixedSize(label->pixmap()->size()); dialog->show(); } void AlbumCoverChoiceController::SearchCoverAutomatically(const Song& song) { qint64 id = cover_fetcher_->FetchAlbumCover(song.artist(), song.album()); cover_fetching_tasks_[id] = song; } void AlbumCoverChoiceController::AlbumCoverFetched( quint64 id, const QImage& image, const CoverSearchStatistics& statistics) { Song song; if (cover_fetching_tasks_.contains(id)) { song = cover_fetching_tasks_.take(id); } if (!image.isNull()) { QString cover = SaveCoverInCache(song.artist(), song.album(), image); SaveCover(&song, cover); } emit AutomaticCoverSearchDone(); } void AlbumCoverChoiceController::SaveCover(Song* song, const QString& cover) { if (song->is_valid() && song->id() != -1) { song->set_art_manual(cover); app_->library_backend()->UpdateManualAlbumArtAsync(song->artist(), song->album(), cover); if (song->url() == app_->current_art_loader()->last_song().url()) { app_->current_art_loader()->LoadArt(*song); } } } QString AlbumCoverChoiceController::SaveCoverInCache(const QString& artist, const QString& album, const QImage& image) { // Hash the artist and album into a filename for the image QString filename(Utilities::Sha1CoverHash(artist, album).toHex() + ".jpg"); QString path(AlbumCoverLoader::ImageCacheDir() + "/" + filename); // Make sure this directory exists first QDir dir; dir.mkdir(AlbumCoverLoader::ImageCacheDir()); // Save the image to disk image.save(path, "JPG"); return path; } bool AlbumCoverChoiceController::IsKnownImageExtension(const QString& suffix) { if (!sImageExtensions) { sImageExtensions = new QSet(); (*sImageExtensions) << "png" << "jpg" << "jpeg" << "bmp" << "gif" << "xpm" << "pbm" << "pgm" << "ppm" << "xbm"; } return sImageExtensions->contains(suffix); } bool AlbumCoverChoiceController::CanAcceptDrag(const QDragEnterEvent* e) { for (const QUrl& url : e->mimeData()->urls()) { const QString suffix = QFileInfo(url.toLocalFile()).suffix().toLower(); if (IsKnownImageExtension(suffix)) return true; } if (e->mimeData()->hasImage()) { return true; } return false; } QString AlbumCoverChoiceController::SaveCover(Song* song, const QDropEvent* e) { for (const QUrl& url : e->mimeData()->urls()) { const QString filename = url.toLocalFile(); const QString suffix = QFileInfo(filename).suffix().toLower(); if (IsKnownImageExtension(suffix)) { SaveCover(song, filename); return filename; } } if (e->mimeData()->hasImage()) { QImage image = qvariant_cast(e->mimeData()->imageData()); if (!image.isNull()) { QString cover_path = SaveCoverInCache(song->artist(), song->album(), image); SaveCover(song, cover_path); return cover_path; } } return QString(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/albumcoverchoicecontroller.h000066400000000000000000000121401260417502300263600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ALBUMCOVERCHOICECONTROLLER_H #define ALBUMCOVERCHOICECONTROLLER_H #include #include #include #include class AlbumCoverFetcher; class AlbumCoverSearcher; class Application; class CoverFromURLDialog; class QFileDialog; class Song; struct CoverSearchStatistics; // Controller for the common album cover related menu options. class AlbumCoverChoiceController : public QWidget { Q_OBJECT public: static const char* kLoadImageFileFilter; static const char* kSaveImageFileFilter; static const char* kAllFilesFilter; AlbumCoverChoiceController(QWidget* parent = nullptr); ~AlbumCoverChoiceController(); void SetApplication(Application* app); // Getters for all QActions implemented by this controller. QAction* cover_from_file_action() const { return cover_from_file_; } QAction* cover_to_file_action() const { return cover_to_file_; } QAction* cover_from_url_action() const { return cover_from_url_; } QAction* search_for_cover_action() const { return search_for_cover_; } QAction* unset_cover_action() const { return unset_cover_; } QAction* show_cover_action() const { return show_cover_; } QAction* search_cover_auto_action() const { return search_cover_auto_; } // Returns QAction* for every operation implemented by this controller. // The list contains QAction* for: // 1. loading cover from file // 2. loading cover from URL // 3. searching for cover using last.fm // 4. unsetting the cover manually // 5. showing the cover in original size QList GetAllActions(); // All of the methods below require a currently selected song as an // input parameter. Also - LoadCoverFromFile, LoadCoverFromURL, // SearchForCover, UnsetCover and SaveCover all update manual path // of the given song in library to the new cover. // Lets the user choose a cover from disk. If no cover will be chosen or the // chosen // cover will not be a proper image, this returns an empty string. Otherwise, // the // path to the chosen cover will be returned. QString LoadCoverFromFile(Song* song); // Shows a dialog that allows user to save the given image on disk. The image // is supposed to be the cover of the given song's album. void SaveCoverToFile(const Song& song, const QImage& image); // Downloads the cover from an URL given by user. This returns the downloaded // image // or null image if something went wrong for example when user cancelled the // dialog. QString LoadCoverFromURL(Song* song); // Lets the user choose a cover among all that have been found on last.fm. // Returns the chosen cover or null cover if user didn't choose anything. QString SearchForCover(Song* song); // Returns a path which indicates that the cover has been unset manually. QString UnsetCover(Song* song); // Shows the cover of given song in it's original size. void ShowCover(const Song& song); // Search for covers automatically void SearchCoverAutomatically(const Song& song); // Saves the chosen cover as manual cover path of this song in library. void SaveCover(Song* song, const QString& cover); // Saves the cover that the user picked through a drag and drop operation. QString SaveCover(Song* song, const QDropEvent* e); // Saves the given image in cache as a cover for 'artist' - 'album'. // The method returns path of the cached image. QString SaveCoverInCache(const QString& artist, const QString& album, const QImage& image); static bool CanAcceptDrag(const QDragEnterEvent* e); signals: void AutomaticCoverSearchDone(); private slots: void AlbumCoverFetched(quint64 id, const QImage& image, const CoverSearchStatistics& statistics); private: QString GetInitialPathForFileDialog(const Song& song, const QString& filename); static bool IsKnownImageExtension(const QString& suffix); static QSet* sImageExtensions; Application* app_; AlbumCoverSearcher* cover_searcher_; AlbumCoverFetcher* cover_fetcher_; QFileDialog* save_file_dialog_; CoverFromURLDialog* cover_from_url_dialog_; QAction* cover_from_file_; QAction* cover_to_file_; QAction* separator_; QAction* cover_from_url_; QAction* search_for_cover_; QAction* unset_cover_; QAction* show_cover_; QAction* search_cover_auto_; QMap cover_fetching_tasks_; }; #endif // ALBUMCOVERCHOICECONTROLLER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/albumcoverexport.cpp000066400000000000000000000067731260417502300247150ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "albumcoverexport.h" #include "ui_albumcoverexport.h" #include const char* AlbumCoverExport::kSettingsGroup = "AlbumCoverExport"; AlbumCoverExport::AlbumCoverExport(QWidget* parent) : QDialog(parent), ui_(new Ui_AlbumCoverExport) { ui_->setupUi(this); connect(ui_->forceSize, SIGNAL(stateChanged(int)), SLOT(ForceSizeToggled(int))); } AlbumCoverExport::~AlbumCoverExport() { delete ui_; } AlbumCoverExport::DialogResult AlbumCoverExport::Exec() { QSettings s; s.beginGroup(kSettingsGroup); // restore last accepted settings ui_->fileName->setText(s.value("fileName", "cover").toString()); ui_->doNotOverwrite->setChecked( s.value("overwrite", OverwriteMode_None).toInt() == OverwriteMode_None); ui_->overwriteAll->setChecked( s.value("overwrite", OverwriteMode_All).toInt() == OverwriteMode_All); ui_->overwriteSmaller->setChecked(s.value("overwrite", OverwriteMode_Smaller) .toInt() == OverwriteMode_Smaller); ui_->forceSize->setChecked(s.value("forceSize", false).toBool()); ui_->width->setText(s.value("width", "").toString()); ui_->height->setText(s.value("height", "").toString()); ui_->export_downloaded->setChecked( s.value("export_downloaded", true).toBool()); ui_->export_embedded->setChecked(s.value("export_embedded", false).toBool()); ForceSizeToggled(ui_->forceSize->checkState()); DialogResult result = DialogResult(); result.cancelled_ = (exec() == QDialog::Rejected); if (!result.cancelled_) { QString fileName = ui_->fileName->text(); if (fileName.isEmpty()) { fileName = "cover"; } OverwriteMode overwrite = ui_->doNotOverwrite->isChecked() ? OverwriteMode_None : (ui_->overwriteAll->isChecked() ? OverwriteMode_All : OverwriteMode_Smaller); bool forceSize = ui_->forceSize->isChecked(); QString width = ui_->width->text(); QString height = ui_->height->text(); s.setValue("fileName", fileName); s.setValue("overwrite", overwrite); s.setValue("forceSize", forceSize); s.setValue("width", width); s.setValue("height", height); s.setValue("export_downloaded", ui_->export_downloaded->isChecked()); s.setValue("export_embedded", ui_->export_embedded->isChecked()); result.fileName_ = fileName; result.overwrite_ = overwrite; result.forceSize_ = forceSize; result.width_ = width.toInt(); result.height_ = height.toInt(); result.export_downloaded_ = ui_->export_downloaded->isChecked(); result.export_embedded_ = ui_->export_embedded->isChecked(); } return result; } void AlbumCoverExport::ForceSizeToggled(int state) { ui_->width->setEnabled(state == Qt::Checked); ui_->height->setEnabled(state == Qt::Checked); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/albumcoverexport.h000066400000000000000000000033171260417502300243510ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ALBUMCOVEREXPORT_H #define ALBUMCOVEREXPORT_H #include class Ui_AlbumCoverExport; // Controller for the "Export covers" dialog. class AlbumCoverExport : public QDialog { Q_OBJECT public: AlbumCoverExport(QWidget* parent = nullptr); ~AlbumCoverExport(); enum OverwriteMode { OverwriteMode_None = 0, OverwriteMode_All = 1, OverwriteMode_Smaller = 2 }; struct DialogResult { bool cancelled_; bool export_downloaded_; bool export_embedded_; QString fileName_; OverwriteMode overwrite_; bool forceSize_; int width_; int height_; bool IsSizeForced() const { return forceSize_ && width_ > 0 && height_ > 0; } bool RequiresCoverProcessing() const { return IsSizeForced() || overwrite_ == OverwriteMode_Smaller; } }; DialogResult Exec(); private slots: void ForceSizeToggled(int state); private: Ui_AlbumCoverExport* ui_; static const char* kSettingsGroup; }; #endif // ALBUMCOVEREXPORT_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/albumcoverexport.ui000066400000000000000000000145131260417502300245370ustar00rootroot00000000000000 AlbumCoverExport 0 0 608 412 0 0 Export covers :/icon.png:/icon.png Output Enter a filename for exported covers (no extension): Export downloaded covers true Export embedded covers false Existing covers Do not overwrite Overwrite all Overwrite smaller ones only Size 50 false Scale size Size: 0 0 Qt::ImhDigitsOnly 4 × Qt::ImhDigitsOnly 4 Pixel Qt::Horizontal QSizePolicy::Preferred 200 20 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() AlbumCoverExport accept() 248 254 157 274 buttonBox rejected() AlbumCoverExport reject() 316 260 286 274 clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/albumcovermanager.cpp000066400000000000000000000632751260417502300250060ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "albumcovermanager.h" #include "albumcoversearcher.h" #include "iconloader.h" #include "ui_albumcovermanager.h" #include "core/application.h" #include "core/logging.h" #include "core/utilities.h" #include "covers/albumcoverexporter.h" #include "covers/albumcoverfetcher.h" #include "covers/albumcoverloader.h" #include "covers/coverproviders.h" #include "covers/coversearchstatisticsdialog.h" #include "library/librarybackend.h" #include "library/libraryquery.h" #include "library/sqlrow.h" #include "playlist/songmimedata.h" #include "widgets/forcescrollperpixel.h" #include "ui/albumcoverchoicecontroller.h" #include "ui/albumcoverexport.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include const char* AlbumCoverManager::kSettingsGroup = "CoverManager"; AlbumCoverManager::AlbumCoverManager(Application* app, LibraryBackend* library_backend, QWidget* parent, QNetworkAccessManager* network) : QMainWindow(parent), ui_(new Ui_CoverManager), app_(app), album_cover_choice_controller_(new AlbumCoverChoiceController(this)), cover_fetcher_( new AlbumCoverFetcher(app_->cover_providers(), this, network)), cover_searcher_(nullptr), cover_export_(nullptr), cover_exporter_(new AlbumCoverExporter(this)), artist_icon_(IconLoader::Load("x-clementine-artist")), all_artists_icon_(IconLoader::Load("x-clementine-album")), context_menu_(new QMenu(this)), progress_bar_(new QProgressBar(this)), abort_progress_(new QPushButton(this)), jobs_(0), library_backend_(library_backend) { ui_->setupUi(this); ui_->albums->set_cover_manager(this); // Icons ui_->action_fetch->setIcon(IconLoader::Load("download")); ui_->export_covers->setIcon(IconLoader::Load("document-save")); ui_->view->setIcon(IconLoader::Load("view-choose")); ui_->fetch->setIcon(IconLoader::Load("download")); ui_->action_add_to_playlist->setIcon( IconLoader::Load("media-playback-start")); ui_->action_load->setIcon(IconLoader::Load("media-playback-start")); album_cover_choice_controller_->SetApplication(app_); // Get a square version of nocover.png QImage nocover(":/nocover.png"); nocover = nocover.scaled(120, 120, Qt::KeepAspectRatio, Qt::SmoothTransformation); QImage square_nocover(120, 120, QImage::Format_ARGB32); square_nocover.fill(0); QPainter p(&square_nocover); p.setOpacity(0.4); p.drawImage((120 - nocover.width()) / 2, (120 - nocover.height()) / 2, nocover); p.end(); no_cover_icon_ = QPixmap::fromImage(square_nocover); cover_searcher_ = new AlbumCoverSearcher(no_cover_icon_, app_, this); cover_export_ = new AlbumCoverExport(this); // Set up the status bar statusBar()->addPermanentWidget(progress_bar_); statusBar()->addPermanentWidget(abort_progress_); progress_bar_->hide(); abort_progress_->hide(); abort_progress_->setText(tr("Abort")); connect(abort_progress_, SIGNAL(clicked()), this, SLOT(CancelRequests())); ui_->albums->setAttribute(Qt::WA_MacShowFocusRect, false); ui_->artists->setAttribute(Qt::WA_MacShowFocusRect, false); QShortcut* close = new QShortcut(QKeySequence::Close, this); connect(close, SIGNAL(activated()), SLOT(close())); EnableCoversButtons(); } AlbumCoverManager::~AlbumCoverManager() { CancelRequests(); delete ui_; } LibraryBackend* AlbumCoverManager::backend() const { return library_backend_; } void AlbumCoverManager::Init() { // View menu QActionGroup* filter_group = new QActionGroup(this); filter_all_ = filter_group->addAction(tr("All albums")); filter_with_covers_ = filter_group->addAction(tr("Albums with covers")); filter_without_covers_ = filter_group->addAction(tr("Albums without covers")); filter_all_->setCheckable(true); filter_with_covers_->setCheckable(true); filter_without_covers_->setCheckable(true); filter_group->setExclusive(true); filter_all_->setChecked(true); QMenu* view_menu = new QMenu(this); view_menu->addActions(filter_group->actions()); ui_->view->setMenu(view_menu); // Context menu QList actions = album_cover_choice_controller_->GetAllActions(); connect(album_cover_choice_controller_->cover_from_file_action(), SIGNAL(triggered()), this, SLOT(LoadCoverFromFile())); connect(album_cover_choice_controller_->cover_to_file_action(), SIGNAL(triggered()), this, SLOT(SaveCoverToFile())); connect(album_cover_choice_controller_->cover_from_url_action(), SIGNAL(triggered()), this, SLOT(LoadCoverFromURL())); connect(album_cover_choice_controller_->search_for_cover_action(), SIGNAL(triggered()), this, SLOT(SearchForCover())); connect(album_cover_choice_controller_->unset_cover_action(), SIGNAL(triggered()), this, SLOT(UnsetCover())); connect(album_cover_choice_controller_->show_cover_action(), SIGNAL(triggered()), this, SLOT(ShowCover())); connect(cover_exporter_, SIGNAL(AlbumCoversExportUpdate(int, int, int)), SLOT(UpdateExportStatus(int, int, int))); context_menu_->addActions(actions); context_menu_->addSeparator(); context_menu_->addAction(ui_->action_load); context_menu_->addAction(ui_->action_add_to_playlist); ui_->albums->installEventFilter(this); // Connections connect(ui_->artists, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), SLOT(ArtistChanged(QListWidgetItem*))); connect(ui_->filter, SIGNAL(textChanged(QString)), SLOT(UpdateFilter())); connect(filter_group, SIGNAL(triggered(QAction*)), SLOT(UpdateFilter())); connect(ui_->view, SIGNAL(clicked()), ui_->view, SLOT(showMenu())); connect(ui_->fetch, SIGNAL(clicked()), SLOT(FetchAlbumCovers())); connect(ui_->export_covers, SIGNAL(clicked()), SLOT(ExportCovers())); connect(cover_fetcher_, SIGNAL(AlbumCoverFetched(quint64, QImage, CoverSearchStatistics)), SLOT(AlbumCoverFetched(quint64, QImage, CoverSearchStatistics))); connect(ui_->action_fetch, SIGNAL(triggered()), SLOT(FetchSingleCover())); connect(ui_->albums, SIGNAL(doubleClicked(QModelIndex)), SLOT(AlbumDoubleClicked(QModelIndex))); connect(ui_->action_add_to_playlist, SIGNAL(triggered()), SLOT(AddSelectedToPlaylist())); connect(ui_->action_load, SIGNAL(triggered()), SLOT(LoadSelectedToPlaylist())); // Restore settings QSettings s; s.beginGroup(kSettingsGroup); restoreGeometry(s.value("geometry").toByteArray()); if (!ui_->splitter->restoreState(s.value("splitter_state").toByteArray())) { // Sensible default size for the artists view ui_->splitter->setSizes(QList() << 200 << width() - 200); } connect(app_->album_cover_loader(), SIGNAL(ImageLoaded(quint64, QImage)), SLOT(CoverImageLoaded(quint64, QImage))); cover_searcher_->Init(cover_fetcher_); new ForceScrollPerPixel(ui_->albums, this); } void AlbumCoverManager::showEvent(QShowEvent*) { Reset(); } void AlbumCoverManager::closeEvent(QCloseEvent* e) { if (!cover_fetching_tasks_.isEmpty()) { std::unique_ptr message_box(new QMessageBox( QMessageBox::Question, tr("Really cancel?"), tr("Closing this window will stop searching for album covers."), QMessageBox::Abort, this)); message_box->addButton(tr("Don't stop!"), QMessageBox::AcceptRole); if (message_box->exec() != QMessageBox::Abort) { e->ignore(); return; } } // Save geometry QSettings s; s.beginGroup(kSettingsGroup); s.setValue("geometry", saveGeometry()); s.setValue("splitter_state", ui_->splitter->saveState()); // Cancel any outstanding requests CancelRequests(); } void AlbumCoverManager::CancelRequests() { app_->album_cover_loader()->CancelTasks( QSet::fromList(cover_loading_tasks_.keys())); cover_loading_tasks_.clear(); cover_exporter_->Cancel(); cover_fetching_tasks_.clear(); cover_fetcher_->Clear(); progress_bar_->hide(); abort_progress_->hide(); statusBar()->clearMessage(); EnableCoversButtons(); } static bool CompareNocase(const QString& left, const QString& right) { return QString::localeAwareCompare(left, right) < 0; } static bool CompareAlbumNameNocase(const LibraryBackend::Album& left, const LibraryBackend::Album& right) { return CompareNocase(left.album_name, right.album_name); } void AlbumCoverManager::Reset() { EnableCoversButtons(); ui_->artists->clear(); new QListWidgetItem(all_artists_icon_, tr("All artists"), ui_->artists, All_Artists); new QListWidgetItem(artist_icon_, tr("Various artists"), ui_->artists, Various_Artists); QStringList artists(library_backend_->GetAllArtistsWithAlbums()); qStableSort(artists.begin(), artists.end(), CompareNocase); for (const QString& artist : artists) { if (artist.isEmpty()) continue; new QListWidgetItem(artist_icon_, artist, ui_->artists, Specific_Artist); } } void AlbumCoverManager::EnableCoversButtons() { ui_->fetch->setEnabled(app_->cover_providers()->HasAnyProviders()); ui_->export_covers->setEnabled(true); } void AlbumCoverManager::DisableCoversButtons() { ui_->fetch->setEnabled(false); ui_->export_covers->setEnabled(false); } void AlbumCoverManager::ArtistChanged(QListWidgetItem* current) { if (!current) return; QString artist; if (current->type() == Specific_Artist) artist = current->text(); ui_->albums->clear(); context_menu_items_.clear(); CancelRequests(); // Get the list of albums. How we do it depends on what thing we have // selected in the artist list. LibraryBackend::AlbumList albums; switch (current->type()) { case Various_Artists: albums = library_backend_->GetCompilationAlbums(); break; case Specific_Artist: albums = library_backend_->GetAlbumsByArtist(current->text()); break; case All_Artists: default: albums = library_backend_->GetAllAlbums(); break; } // Sort by album name. The list is already sorted by sqlite but it was done // case sensitively. qStableSort(albums.begin(), albums.end(), CompareAlbumNameNocase); for (const LibraryBackend::Album& info : albums) { // Don't show songs without an album, obviously if (info.album_name.isEmpty()) continue; QListWidgetItem* item = new QListWidgetItem(no_cover_icon_, info.album_name, ui_->albums); item->setData(Role_ArtistName, info.artist); item->setData(Role_AlbumName, info.album_name); item->setData(Role_FirstUrl, info.first_url); item->setData(Qt::TextAlignmentRole, QVariant(Qt::AlignTop | Qt::AlignHCenter)); item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled); item->setToolTip(info.artist + " - " + info.album_name); if (!info.art_automatic.isEmpty() || !info.art_manual.isEmpty()) { quint64 id = app_->album_cover_loader()->LoadImageAsync( cover_loader_options_, info.art_automatic, info.art_manual, info.first_url.toLocalFile()); item->setData(Role_PathAutomatic, info.art_automatic); item->setData(Role_PathManual, info.art_manual); cover_loading_tasks_[id] = item; } } UpdateFilter(); } void AlbumCoverManager::CoverImageLoaded(quint64 id, const QImage& image) { if (!cover_loading_tasks_.contains(id)) return; QListWidgetItem* item = cover_loading_tasks_.take(id); if (image.isNull()) return; item->setIcon(QPixmap::fromImage(image)); UpdateFilter(); } void AlbumCoverManager::UpdateFilter() { const QString filter = ui_->filter->text().toLower(); const bool hide_with_covers = filter_without_covers_->isChecked(); const bool hide_without_covers = filter_with_covers_->isChecked(); HideCovers hide = Hide_None; if (hide_with_covers) { hide = Hide_WithCovers; } else if (hide_without_covers) { hide = Hide_WithoutCovers; } qint32 total_count = 0; qint32 without_cover = 0; for (int i = 0; i < ui_->albums->count(); ++i) { QListWidgetItem* item = ui_->albums->item(i); bool should_hide = ShouldHide(*item, filter, hide); item->setHidden(should_hide); if (!should_hide) { total_count++; if (item->icon().cacheKey() == no_cover_icon_.cacheKey()) { without_cover++; } } } ui_->total_albums->setText(QString::number(total_count)); ui_->without_cover->setText(QString::number(without_cover)); } bool AlbumCoverManager::ShouldHide(const QListWidgetItem& item, const QString& filter, HideCovers hide) const { bool has_cover = item.icon().cacheKey() != no_cover_icon_.cacheKey(); if (hide == Hide_WithCovers && has_cover) { return true; } else if (hide == Hide_WithoutCovers && !has_cover) { return true; } if (filter.isEmpty()) { return false; } QStringList query = filter.split(' '); for (const QString& s : query) { if (!item.text().contains(s, Qt::CaseInsensitive) && !item.data(Role_ArtistName).toString().contains(s, Qt::CaseInsensitive)) { return true; } } return false; } void AlbumCoverManager::FetchAlbumCovers() { for (int i = 0; i < ui_->albums->count(); ++i) { QListWidgetItem* item = ui_->albums->item(i); if (item->isHidden()) continue; if (item->icon().cacheKey() != no_cover_icon_.cacheKey()) continue; quint64 id = cover_fetcher_->FetchAlbumCover(item->data(Role_ArtistName).toString(), item->data(Role_AlbumName).toString()); cover_fetching_tasks_[id] = item; jobs_++; } if (!cover_fetching_tasks_.isEmpty()) ui_->fetch->setEnabled(false); progress_bar_->setMaximum(jobs_); progress_bar_->show(); abort_progress_->show(); fetch_statistics_ = CoverSearchStatistics(); UpdateStatusText(); } void AlbumCoverManager::AlbumCoverFetched( quint64 id, const QImage& image, const CoverSearchStatistics& statistics) { if (!cover_fetching_tasks_.contains(id)) return; QListWidgetItem* item = cover_fetching_tasks_.take(id); if (!image.isNull()) { SaveAndSetCover(item, image); } if (cover_fetching_tasks_.isEmpty()) { EnableCoversButtons(); } fetch_statistics_ += statistics; UpdateStatusText(); } void AlbumCoverManager::UpdateStatusText() { QString message = tr("Got %1 covers out of %2 (%3 failed)") .arg(fetch_statistics_.chosen_images_) .arg(jobs_) .arg(fetch_statistics_.missing_images_); if (fetch_statistics_.bytes_transferred_) { message += ", " + tr("%1 transferred").arg(Utilities::PrettySize( fetch_statistics_.bytes_transferred_)); } statusBar()->showMessage(message); progress_bar_->setValue(fetch_statistics_.chosen_images_ + fetch_statistics_.missing_images_); if (cover_fetching_tasks_.isEmpty()) { QTimer::singleShot(2000, statusBar(), SLOT(clearMessage())); progress_bar_->hide(); abort_progress_->hide(); CoverSearchStatisticsDialog* dialog = new CoverSearchStatisticsDialog(this); dialog->setAttribute(Qt::WA_DeleteOnClose); dialog->Show(fetch_statistics_); jobs_ = 0; } } bool AlbumCoverManager::eventFilter(QObject* obj, QEvent* event) { if (obj == ui_->albums && event->type() == QEvent::ContextMenu) { context_menu_items_ = ui_->albums->selectedItems(); if (context_menu_items_.isEmpty()) return false; bool some_with_covers = false; for (QListWidgetItem* item : context_menu_items_) { if (item->icon().cacheKey() != no_cover_icon_.cacheKey()) some_with_covers = true; } album_cover_choice_controller_->cover_from_file_action()->setEnabled( context_menu_items_.size() == 1); album_cover_choice_controller_->cover_from_url_action()->setEnabled( context_menu_items_.size() == 1); album_cover_choice_controller_->show_cover_action()->setEnabled( some_with_covers && context_menu_items_.size() == 1); album_cover_choice_controller_->unset_cover_action()->setEnabled( some_with_covers); album_cover_choice_controller_->search_for_cover_action()->setEnabled( app_->cover_providers()->HasAnyProviders()); QContextMenuEvent* e = static_cast(event); context_menu_->popup(e->globalPos()); return true; } return QMainWindow::eventFilter(obj, event); } Song AlbumCoverManager::GetSingleSelectionAsSong() { return context_menu_items_.size() != 1 ? Song() : ItemAsSong(context_menu_items_[0]); } Song AlbumCoverManager::GetFirstSelectedAsSong() { return context_menu_items_.isEmpty() ? Song() : ItemAsSong(context_menu_items_[0]); } Song AlbumCoverManager::ItemAsSong(QListWidgetItem* item) { Song result; QString title = item->data(Role_AlbumName).toString(); if (!item->data(Role_ArtistName).toString().isNull()) result.set_title(item->data(Role_ArtistName).toString() + " - " + title); else result.set_title(title); result.set_artist(item->data(Role_ArtistName).toString()); result.set_album(item->data(Role_AlbumName).toString()); result.set_url(item->data(Role_FirstUrl).toUrl()); result.set_art_automatic(item->data(Role_PathAutomatic).toString()); result.set_art_manual(item->data(Role_PathManual).toString()); // force validity result.set_valid(true); result.set_id(0); return result; } void AlbumCoverManager::ShowCover() { Song song = GetSingleSelectionAsSong(); if (!song.is_valid()) return; album_cover_choice_controller_->ShowCover(song); } void AlbumCoverManager::FetchSingleCover() { for (QListWidgetItem* item : context_menu_items_) { quint64 id = cover_fetcher_->FetchAlbumCover(item->data(Role_ArtistName).toString(), item->data(Role_AlbumName).toString()); cover_fetching_tasks_[id] = item; jobs_++; } progress_bar_->setMaximum(jobs_); progress_bar_->show(); abort_progress_->show(); UpdateStatusText(); } void AlbumCoverManager::UpdateCoverInList(QListWidgetItem* item, const QString& cover) { quint64 id = app_->album_cover_loader()->LoadImageAsync(cover_loader_options_, QString(), cover); item->setData(Role_PathManual, cover); cover_loading_tasks_[id] = item; } void AlbumCoverManager::LoadCoverFromFile() { Song song = GetSingleSelectionAsSong(); if (!song.is_valid()) return; QListWidgetItem* item = context_menu_items_[0]; QString cover = album_cover_choice_controller_->LoadCoverFromFile(&song); if (!cover.isEmpty()) { UpdateCoverInList(item, cover); } } void AlbumCoverManager::SaveCoverToFile() { Song song = GetSingleSelectionAsSong(); if (!song.is_valid()) return; QImage image; // load the image from disk if (song.has_manually_unset_cover()) { image = QImage(":/nocover.png"); } else { if (!song.art_manual().isEmpty() && QFile::exists(song.art_manual())) { image = QImage(song.art_manual()); } else if (!song.art_automatic().isEmpty() && QFile::exists(song.art_automatic())) { image = QImage(song.art_automatic()); } else { image = QImage(":/nocover.png"); } } album_cover_choice_controller_->SaveCoverToFile(song, image); } void AlbumCoverManager::LoadCoverFromURL() { Song song = GetSingleSelectionAsSong(); if (!song.is_valid()) return; QListWidgetItem* item = context_menu_items_[0]; QString cover = album_cover_choice_controller_->LoadCoverFromURL(&song); if (!cover.isEmpty()) { UpdateCoverInList(item, cover); } } void AlbumCoverManager::SearchForCover() { Song song = GetFirstSelectedAsSong(); if (!song.is_valid()) return; QListWidgetItem* item = context_menu_items_[0]; QString cover = album_cover_choice_controller_->SearchForCover(&song); if (cover.isEmpty()) return; // force the found cover on all of the selected items for (QListWidgetItem* current : context_menu_items_) { // don't save the first one twice if (current != item) { Song current_song = ItemAsSong(current); album_cover_choice_controller_->SaveCover(¤t_song, cover); } UpdateCoverInList(current, cover); } } void AlbumCoverManager::UnsetCover() { Song song = GetFirstSelectedAsSong(); if (!song.is_valid()) return; QListWidgetItem* item = context_menu_items_[0]; QString cover = album_cover_choice_controller_->UnsetCover(&song); // force the 'none' cover on all of the selected items for (QListWidgetItem* current : context_menu_items_) { current->setIcon(no_cover_icon_); current->setData(Role_PathManual, cover); // don't save the first one twice if (current != item) { Song current_song = ItemAsSong(current); album_cover_choice_controller_->SaveCover(¤t_song, cover); } } } SongList AlbumCoverManager::GetSongsInAlbum(const QModelIndex& index) const { SongList ret; LibraryQuery q; q.SetColumnSpec("ROWID," + Song::kColumnSpec); q.AddWhere("album", index.data(Role_AlbumName).toString()); q.SetOrderBy("disc, track, title"); QString artist = index.data(Role_ArtistName).toString(); q.AddCompilationRequirement(artist.isEmpty()); if (!artist.isEmpty()) q.AddWhere("artist", artist); if (!library_backend_->ExecQuery(&q)) return ret; while (q.Next()) { Song song; song.InitFromQuery(q, true); ret << song; } return ret; } SongList AlbumCoverManager::GetSongsInAlbums(const QModelIndexList& indexes) const { SongList ret; for (const QModelIndex& index : indexes) { ret << GetSongsInAlbum(index); } return ret; } SongMimeData* AlbumCoverManager::GetMimeDataForAlbums( const QModelIndexList& indexes) const { SongList songs = GetSongsInAlbums(indexes); if (songs.isEmpty()) return nullptr; SongMimeData* data = new SongMimeData; data->backend = library_backend_; data->songs = songs; return data; } void AlbumCoverManager::AlbumDoubleClicked(const QModelIndex& index) { SongMimeData* data = GetMimeDataForAlbums(QModelIndexList() << index); if (data) { data->from_doubleclick_ = true; emit AddToPlaylist(data); } } void AlbumCoverManager::AddSelectedToPlaylist() { emit AddToPlaylist( GetMimeDataForAlbums(ui_->albums->selectionModel()->selectedIndexes())); } void AlbumCoverManager::LoadSelectedToPlaylist() { SongMimeData* data = GetMimeDataForAlbums(ui_->albums->selectionModel()->selectedIndexes()); if (data) { data->clear_first_ = true; emit AddToPlaylist(data); } } void AlbumCoverManager::SaveAndSetCover(QListWidgetItem* item, const QImage& image) { const QString artist = item->data(Role_ArtistName).toString(); const QString album = item->data(Role_AlbumName).toString(); QString path = album_cover_choice_controller_->SaveCoverInCache(artist, album, image); // Save the image in the database library_backend_->UpdateManualAlbumArtAsync(artist, album, path); // Update the icon in our list quint64 id = app_->album_cover_loader()->LoadImageAsync(cover_loader_options_, QString(), path); item->setData(Role_PathManual, path); cover_loading_tasks_[id] = item; } void AlbumCoverManager::ExportCovers() { AlbumCoverExport::DialogResult result = cover_export_->Exec(); if (result.cancelled_) { return; } DisableCoversButtons(); cover_exporter_->SetDialogResult(result); for (int i = 0; i < ui_->albums->count(); ++i) { QListWidgetItem* item = ui_->albums->item(i); // skip hidden and coverless albums if (item->isHidden() || item->icon().cacheKey() == no_cover_icon_.cacheKey()) { continue; } cover_exporter_->AddExportRequest(ItemAsSong(item)); } if (cover_exporter_->request_count() > 0) { progress_bar_->setMaximum(cover_exporter_->request_count()); progress_bar_->show(); abort_progress_->show(); cover_exporter_->StartExporting(); } else { QMessageBox msg; msg.setWindowTitle(tr("Export finished")); msg.setText(tr("No covers to export.")); msg.exec(); } } void AlbumCoverManager::UpdateExportStatus(int exported, int skipped, int max) { progress_bar_->setValue(exported); QString message = tr("Exported %1 covers out of %2 (%3 skipped)") .arg(exported) .arg(max) .arg(skipped); statusBar()->showMessage(message); // end of the current process if (exported + skipped >= max) { QTimer::singleShot(2000, statusBar(), SLOT(clearMessage())); progress_bar_->hide(); abort_progress_->hide(); EnableCoversButtons(); QMessageBox msg; msg.setWindowTitle(tr("Export finished")); msg.setText(message); msg.exec(); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/albumcovermanager.h000066400000000000000000000121671260417502300244450ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ALBUMCOVERMANAGER_H #define ALBUMCOVERMANAGER_H #include #include #include #include "gtest/gtest_prod.h" #include "core/song.h" #include "covers/albumcoverloaderoptions.h" #include "covers/coversearchstatistics.h" class AlbumCoverChoiceController; class AlbumCoverExport; class AlbumCoverExporter; class AlbumCoverFetcher; class AlbumCoverSearcher; class Application; class LibraryBackend; class SongMimeData; class Ui_CoverManager; class QListWidgetItem; class QMenu; class QNetworkAccessManager; class QPushButton; class QProgressBar; class AlbumCoverManager : public QMainWindow { Q_OBJECT public: AlbumCoverManager(Application* app, LibraryBackend* library_backend, QWidget* parent = nullptr, QNetworkAccessManager* network = 0); ~AlbumCoverManager(); static const char* kSettingsGroup; LibraryBackend* backend() const; QIcon no_cover_icon() const { return no_cover_icon_; } void Reset(); void Init(); void EnableCoversButtons(); void DisableCoversButtons(); SongList GetSongsInAlbum(const QModelIndex& index) const; SongList GetSongsInAlbums(const QModelIndexList& indexes) const; SongMimeData* GetMimeDataForAlbums(const QModelIndexList& indexes) const; signals: void AddToPlaylist(QMimeData* data); protected: void showEvent(QShowEvent*); void closeEvent(QCloseEvent*); // For the album view context menu events bool eventFilter(QObject* obj, QEvent* event); private slots: void ArtistChanged(QListWidgetItem* current); void CoverImageLoaded(quint64 id, const QImage& image); void UpdateFilter(); void FetchAlbumCovers(); void ExportCovers(); void AlbumCoverFetched(quint64 id, const QImage& image, const CoverSearchStatistics& statistics); void CancelRequests(); // On the context menu void FetchSingleCover(); void LoadCoverFromFile(); void SaveCoverToFile(); void LoadCoverFromURL(); void SearchForCover(); void UnsetCover(); void ShowCover(); // For adding albums to the playlist void AlbumDoubleClicked(const QModelIndex& index); void AddSelectedToPlaylist(); void LoadSelectedToPlaylist(); void UpdateCoverInList(QListWidgetItem* item, const QString& cover); void UpdateExportStatus(int exported, int bad, int count); private: enum ArtistItemType { All_Artists, Various_Artists, Specific_Artist, }; enum Role { Role_ArtistName = Qt::UserRole + 1, Role_AlbumName, Role_PathAutomatic, Role_PathManual, Role_FirstUrl, }; enum HideCovers { Hide_None, Hide_WithCovers, Hide_WithoutCovers, }; QString InitialPathForOpenCoverDialog(const QString& path_automatic, const QString& first_file_name) const; // Returns the selected element in form of a Song ready to be used // by AlbumCoverChoiceController or invalid song if there's nothing // or multiple elements selected. Song GetSingleSelectionAsSong(); // Returns the first of the selected elements in form of a Song ready // to be used by AlbumCoverChoiceController or invalid song if there's nothing // selected. Song GetFirstSelectedAsSong(); Song ItemAsSong(QListWidgetItem* item); void UpdateStatusText(); bool ShouldHide(const QListWidgetItem& item, const QString& filter, HideCovers hide) const; void SaveAndSetCover(QListWidgetItem* item, const QImage& image); private: Ui_CoverManager* ui_; Application* app_; AlbumCoverChoiceController* album_cover_choice_controller_; QAction* filter_all_; QAction* filter_with_covers_; QAction* filter_without_covers_; AlbumCoverLoaderOptions cover_loader_options_; QMap cover_loading_tasks_; AlbumCoverFetcher* cover_fetcher_; QMap cover_fetching_tasks_; CoverSearchStatistics fetch_statistics_; AlbumCoverSearcher* cover_searcher_; AlbumCoverExport* cover_export_; AlbumCoverExporter* cover_exporter_; QIcon artist_icon_; QIcon all_artists_icon_; QIcon no_cover_icon_; QImage no_cover_image_; QMenu* context_menu_; QList context_menu_items_; QProgressBar* progress_bar_; QPushButton* abort_progress_; int jobs_; LibraryBackend* library_backend_; FRIEND_TEST(AlbumCoverManagerTest, HidesItemsWithCover); FRIEND_TEST(AlbumCoverManagerTest, HidesItemsWithoutCover); FRIEND_TEST(AlbumCoverManagerTest, HidesItemsWithFilter); }; #endif // ALBUMCOVERMANAGER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/albumcovermanager.ui000066400000000000000000000207211260417502300246260ustar00rootroot00000000000000 CoverManager 0 0 903 662 Cover Manager :/icon.png:/icon.png 0 Qt::Horizontal true QAbstractItemView::SelectRows 24 24 true 0 0 6 0 Enter search terms here View 16 16 QToolButton::MenuButtonPopup Qt::ToolButtonTextBesideIcon true 6 10 10 Total albums: Without cover: 10 10 Qt::RightToLeft 0 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::Horizontal 40 20 0 Fetch Missing Covers 16 16 Export Covers true QAbstractItemView::DragDrop false QAbstractItemView::ExtendedSelection 120 120 QListView::LeftToRight true QListView::Adjust 2 QListView::IconMode true true Fetch automatically Load Add to playlist QSearchField QWidget
3rdparty/qocoa/qsearchfield.h
AlbumCoverManagerList QListWidget
ui/albumcovermanagerlist.h
artists albums
clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/albumcovermanagerlist.cpp000066400000000000000000000042531260417502300256710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "albumcovermanagerlist.h" #include #include #include #include "albumcovermanager.h" #include "library/librarybackend.h" #include "playlist/songmimedata.h" AlbumCoverManagerList::AlbumCoverManagerList(QWidget* parent) : QListWidget(parent), manager_(nullptr) {} QMimeData* AlbumCoverManagerList::mimeData(const QList items) const { // Get songs SongList songs; for (QListWidgetItem* item : items) { songs << manager_->GetSongsInAlbum(indexFromItem(item)); } if (songs.isEmpty()) return nullptr; // Get URLs from the songs QList urls; for (const Song& song : songs) { urls << song.url(); } // Get the QAbstractItemModel data so the picture works std::unique_ptr orig_data(QListWidget::mimeData(items)); SongMimeData* mime_data = new SongMimeData; mime_data->backend = manager_->backend(); mime_data->songs = songs; mime_data->setUrls(urls); mime_data->setData(orig_data->formats()[0], orig_data->data(orig_data->formats()[0])); return mime_data; } void AlbumCoverManagerList::dropEvent(QDropEvent* e) { // Set movement to Static just for this dropEvent so the user can't move the // album covers. If it's set to Static all the time then the user can't even // drag to the playlist QListWidget::Movement old_movement = movement(); setMovement(QListWidget::Static); QListWidget::dropEvent(e); setMovement(old_movement); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/albumcovermanagerlist.h000066400000000000000000000023351260417502300253350ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ALBUMCOVERMANAGERLIST_H #define ALBUMCOVERMANAGERLIST_H #include class AlbumCoverManager; class AlbumCoverManagerList : public QListWidget { Q_OBJECT public: AlbumCoverManagerList(QWidget* parent = nullptr); void set_cover_manager(AlbumCoverManager* manager) { manager_ = manager; } protected: QMimeData* mimeData(const QList items) const; void dropEvent(QDropEvent* event); private: AlbumCoverManager* manager_; }; #endif // ALBUMCOVERMANAGERLIST_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/albumcoversearcher.cpp000066400000000000000000000203651260417502300251610ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "albumcoversearcher.h" #include "ui_albumcoversearcher.h" #include "core/application.h" #include "core/logging.h" #include "core/utilities.h" #include "covers/albumcoverfetcher.h" #include "covers/albumcoverloader.h" #include "widgets/forcescrollperpixel.h" #include "widgets/groupediconview.h" #include #include #include #include const int SizeOverlayDelegate::kMargin = 4; const int SizeOverlayDelegate::kPaddingX = 3; const int SizeOverlayDelegate::kPaddingY = 1; const qreal SizeOverlayDelegate::kBorder = 5.0; const qreal SizeOverlayDelegate::kFontPointSize = 7.5; const int SizeOverlayDelegate::kBorderAlpha = 200; const int SizeOverlayDelegate::kBackgroundAlpha = 175; SizeOverlayDelegate::SizeOverlayDelegate(QObject* parent) : QStyledItemDelegate(parent) {} void SizeOverlayDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { QStyledItemDelegate::paint(painter, option, index); if (!index.data(AlbumCoverSearcher::Role_ImageFetchFinished).toBool()) { return; } const QSize size = index.data(AlbumCoverSearcher::Role_ImageSize).toSize(); const QString text = Utilities::PrettySize(size); QFont font(option.font); font.setPointSizeF(kFontPointSize); font.setBold(true); const QFontMetrics metrics(font); const int text_width = metrics.width(text); const QRect icon_rect(option.rect.left(), option.rect.top(), option.rect.width(), option.rect.width()); const QRect background_rect( icon_rect.right() - kMargin - text_width - kPaddingX * 2, icon_rect.bottom() - kMargin - metrics.height() - kPaddingY * 2, text_width + kPaddingX * 2, metrics.height() + kPaddingY * 2); const QRect text_rect(background_rect.left() + kPaddingX, background_rect.top() + kPaddingY, text_width, metrics.height()); painter->save(); painter->setRenderHint(QPainter::Antialiasing); painter->setPen(QColor(0, 0, 0, kBorderAlpha)); painter->setBrush(QColor(0, 0, 0, kBackgroundAlpha)); painter->drawRoundedRect(background_rect, kBorder, kBorder); painter->setPen(Qt::white); painter->setFont(font); painter->drawText(text_rect, text); painter->restore(); } AlbumCoverSearcher::AlbumCoverSearcher(const QIcon& no_cover_icon, Application* app, QWidget* parent) : QDialog(parent), ui_(new Ui_AlbumCoverSearcher), app_(app), model_(new QStandardItemModel(this)), no_cover_icon_(no_cover_icon), fetcher_(nullptr), id_(0) { setWindowModality(Qt::WindowModal); ui_->setupUi(this); ui_->busy->hide(); ui_->covers->set_header_text(tr("Covers from %1")); ui_->covers->AddSortSpec(Role_ImageDimensions, Qt::DescendingOrder); ui_->covers->setItemDelegate(new SizeOverlayDelegate(this)); ui_->covers->setModel(model_); options_.scale_output_image_ = false; options_.pad_output_image_ = false; connect(app_->album_cover_loader(), SIGNAL(ImageLoaded(quint64, QImage)), SLOT(ImageLoaded(quint64, QImage))); connect(ui_->search, SIGNAL(clicked()), SLOT(Search())); connect(ui_->covers, SIGNAL(doubleClicked(QModelIndex)), SLOT(CoverDoubleClicked(QModelIndex))); new ForceScrollPerPixel(ui_->covers, this); ui_->buttonBox->button(QDialogButtonBox::Cancel) ->setShortcut(QKeySequence::Close); } AlbumCoverSearcher::~AlbumCoverSearcher() { delete ui_; } void AlbumCoverSearcher::Init(AlbumCoverFetcher* fetcher) { fetcher_ = fetcher; connect(fetcher_, SIGNAL(SearchFinished(quint64, CoverSearchResults, CoverSearchStatistics)), SLOT(SearchFinished(quint64, CoverSearchResults))); } QImage AlbumCoverSearcher::Exec(const QString& artist, const QString& album) { ui_->artist->setText(artist); ui_->album->setText(album); ui_->artist->setFocus(); if (!artist.isEmpty() || !album.isEmpty()) { Search(); } if (exec() == QDialog::Rejected) return QImage(); QModelIndex selected = ui_->covers->currentIndex(); if (!selected.isValid() || !selected.data(Role_ImageFetchFinished).toBool()) return QImage(); QIcon icon = selected.data(Qt::DecorationRole).value(); if (icon.cacheKey() == no_cover_icon_.cacheKey()) return QImage(); return icon.pixmap(icon.availableSizes()[0]).toImage(); } void AlbumCoverSearcher::Search() { model_->clear(); cover_loading_tasks_.clear(); if (ui_->album->isEnabled()) { id_ = fetcher_->SearchForCovers(ui_->artist->text(), ui_->album->text()); ui_->search->setText(tr("Abort")); ui_->busy->show(); ui_->artist->setEnabled(false); ui_->album->setEnabled(false); ui_->covers->setEnabled(false); } else { fetcher_->Clear(); ui_->search->setText(tr("Search")); ui_->busy->hide(); ui_->search->setEnabled(true); ui_->artist->setEnabled(true); ui_->album->setEnabled(true); ui_->covers->setEnabled(true); } } void AlbumCoverSearcher::SearchFinished(quint64 id, const CoverSearchResults& results) { if (id != id_) return; ui_->search->setEnabled(true); ui_->artist->setEnabled(true); ui_->album->setEnabled(true); ui_->covers->setEnabled(true); ui_->search->setText(tr("Search")); id_ = 0; for (const CoverSearchResult& result : results) { if (result.image_url.isEmpty()) continue; quint64 id = app_->album_cover_loader()->LoadImageAsync( options_, result.image_url.toString(), QString()); QStandardItem* item = new QStandardItem; item->setIcon(no_cover_icon_); item->setText(result.description); item->setData(result.image_url, Role_ImageURL); item->setData(id, Role_ImageRequestId); item->setData(false, Role_ImageFetchFinished); item->setData(QVariant(Qt::AlignTop | Qt::AlignHCenter), Qt::TextAlignmentRole); item->setData(result.provider, GroupedIconView::Role_Group); model_->appendRow(item); cover_loading_tasks_[id] = item; } if (cover_loading_tasks_.isEmpty()) ui_->busy->hide(); } void AlbumCoverSearcher::ImageLoaded(quint64 id, const QImage& image) { if (!cover_loading_tasks_.contains(id)) return; QStandardItem* item = cover_loading_tasks_.take(id); if (cover_loading_tasks_.isEmpty()) ui_->busy->hide(); if (image.isNull()) { model_->removeRow(item->row()); return; } QIcon icon(QPixmap::fromImage(image)); // Create a pixmap that's padded and exactly the right size for the icon. QImage scaled_image(image.scaled(ui_->covers->iconSize(), Qt::KeepAspectRatio, Qt::SmoothTransformation)); QImage padded_image(ui_->covers->iconSize(), QImage::Format_ARGB32_Premultiplied); padded_image.fill(0); QPainter p(&padded_image); p.drawImage((padded_image.width() - scaled_image.width()) / 2, (padded_image.height() - scaled_image.height()) / 2, scaled_image); p.end(); icon.addPixmap(QPixmap::fromImage(padded_image)); item->setData(true, Role_ImageFetchFinished); item->setData(image.width() * image.height(), Role_ImageDimensions); item->setData(image.size(), Role_ImageSize); item->setIcon(icon); } void AlbumCoverSearcher::keyPressEvent(QKeyEvent* e) { if (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return) { e->ignore(); return; } QDialog::keyPressEvent(e); } void AlbumCoverSearcher::CoverDoubleClicked(const QModelIndex& index) { if (index.isValid()) accept(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/albumcoversearcher.h000066400000000000000000000051071260417502300246230ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ALBUMCOVERSEARCHER_H #define ALBUMCOVERSEARCHER_H #include #include #include #include "covers/albumcoverfetcher.h" #include "covers/albumcoverloaderoptions.h" class AlbumCoverLoader; class Application; class Ui_AlbumCoverSearcher; class QModelIndex; class QStandardItem; class QStandardItemModel; class SizeOverlayDelegate : public QStyledItemDelegate { public: static const int kMargin; static const int kPaddingX; static const int kPaddingY; static const qreal kBorder; static const qreal kFontPointSize; static const int kBorderAlpha; static const int kBackgroundAlpha; SizeOverlayDelegate(QObject* parent = nullptr); void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; }; // This is a dialog that lets the user search for album covers class AlbumCoverSearcher : public QDialog { Q_OBJECT public: AlbumCoverSearcher(const QIcon& no_cover_icon, Application* app, QWidget* parent); ~AlbumCoverSearcher(); enum Role { Role_ImageURL = Qt::UserRole + 1, Role_ImageRequestId, Role_ImageFetchFinished, Role_ImageDimensions, // width * height Role_ImageSize, }; void Init(AlbumCoverFetcher* fetcher); QImage Exec(const QString& artist, const QString& album); protected: void keyPressEvent(QKeyEvent*); private slots: void Search(); void SearchFinished(quint64 id, const CoverSearchResults& results); void ImageLoaded(quint64 id, const QImage& image); void CoverDoubleClicked(const QModelIndex& index); private: Ui_AlbumCoverSearcher* ui_; Application* app_; QStandardItemModel* model_; QIcon no_cover_icon_; AlbumCoverLoaderOptions options_; AlbumCoverFetcher* fetcher_; quint64 id_; QMap cover_loading_tasks_; }; #endif // ALBUMCOVERSEARCHER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/albumcoversearcher.ui000066400000000000000000000100611260417502300250040ustar00rootroot00000000000000 AlbumCoverSearcher 0 0 829 518 Cover Manager Artist Artist Album Album Search Qt::ScrollBarAsNeeded Qt::ScrollBarAlwaysOff 120 120 2 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok QSearchField QWidget
3rdparty/qocoa/qsearchfield.h
BusyIndicator QWidget
widgets/busyindicator.h
GroupedIconView QListView
widgets/groupediconview.h
artist album search covers buttonBox buttonBox accepted() AlbumCoverSearcher accept() 257 508 157 274 buttonBox rejected() AlbumCoverSearcher reject() 325 508 286 274 artist returnPressed() search click() 357 35 812 36 album returnPressed() search click() 580 22 779 21
clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/appearancesettingspage.cpp000066400000000000000000000272251260417502300260240ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "appearancesettingspage.h" #include #include #include #include #include #include "config.h" #include "iconloader.h" #include "mainwindow.h" #include "settingsdialog.h" #include "ui_appearancesettingspage.h" #include "core/appearance.h" #include "core/application.h" #include "core/logging.h" #include "playlist/playlistview.h" #include "ui/albumcoverchoicecontroller.h" #ifdef HAVE_MOODBAR #include "moodbar/moodbarrenderer.h" #endif const int AppearanceSettingsPage::kMoodbarPreviewWidth = 150; const int AppearanceSettingsPage::kMoodbarPreviewHeight = 18; AppearanceSettingsPage::AppearanceSettingsPage(SettingsDialog* dialog) : SettingsPage(dialog), ui_(new Ui_AppearanceSettingsPage), original_use_a_custom_color_set_(false), playlist_view_background_image_type_(PlaylistView::Default), initialised_moodbar_previews_(false) { ui_->setupUi(this); setWindowIcon(IconLoader::Load("view-media-visualization")); connect(ui_->blur_slider, SIGNAL(valueChanged(int)), SLOT(BlurLevelChanged(int))); connect(ui_->opacity_slider, SIGNAL(valueChanged(int)), SLOT(OpacityLevelChanged(int))); Load(); connect(ui_->select_foreground_color, SIGNAL(pressed()), SLOT(SelectForegroundColor())); connect(ui_->select_background_color, SIGNAL(pressed()), SLOT(SelectBackgroundColor())); connect(ui_->use_a_custom_color_set, SIGNAL(toggled(bool)), SLOT(UseCustomColorSetOptionChanged(bool))); connect(ui_->select_background_image_filename_button, SIGNAL(pressed()), SLOT(SelectBackgroundImage())); connect(ui_->use_custom_background_image, SIGNAL(toggled(bool)), ui_->background_image_filename, SLOT(setEnabled(bool))); connect(ui_->use_custom_background_image, SIGNAL(toggled(bool)), ui_->select_background_image_filename_button, SLOT(setEnabled(bool))); connect(ui_->use_custom_background_image, SIGNAL(toggled(bool)), ui_->blur_slider, SLOT(setEnabled(bool))); connect(ui_->use_album_cover_background, SIGNAL(toggled(bool)), ui_->blur_slider, SLOT(setEnabled(bool))); connect(ui_->use_default_background, SIGNAL(toggled(bool)), SLOT(DisableBlurAndOpacitySliders(bool))); connect(ui_->use_no_background, SIGNAL(toggled(bool)), SLOT(DisableBlurAndOpacitySliders(bool))); } AppearanceSettingsPage::~AppearanceSettingsPage() { delete ui_; } void AppearanceSettingsPage::Load() { QSettings s; s.beginGroup(Appearance::kSettingsGroup); QPalette p = QApplication::palette(); // Keep in mind originals colors, in case the user clicks on Cancel, to be // able to restore colors original_use_a_custom_color_set_ = s.value(Appearance::kUseCustomColorSet, false).toBool(); original_foreground_color_ = s.value(Appearance::kForegroundColor, p.color(QPalette::WindowText)) .value(); current_foreground_color_ = original_foreground_color_; original_background_color_ = s.value(Appearance::kBackgroundColor, p.color(QPalette::Window)) .value(); current_background_color_ = original_background_color_; InitColorSelectorsColors(); s.endGroup(); // Playlist settings s.beginGroup(Playlist::kSettingsGroup); playlist_view_background_image_type_ = static_cast( s.value(PlaylistView::kSettingBackgroundImageType).toInt()); playlist_view_background_image_filename_ = s.value(PlaylistView::kSettingBackgroundImageFilename).toString(); ui_->use_system_color_set->setChecked(!original_use_a_custom_color_set_); ui_->use_a_custom_color_set->setChecked(original_use_a_custom_color_set_); switch (playlist_view_background_image_type_) { case PlaylistView::None: ui_->use_no_background->setChecked(true); DisableBlurAndOpacitySliders(true); break; case PlaylistView::AlbumCover: ui_->use_album_cover_background->setChecked(true); break; case PlaylistView::Custom: ui_->use_custom_background_image->setChecked(true); break; case PlaylistView::Default: default: ui_->use_default_background->setChecked(true); DisableBlurAndOpacitySliders(true); } ui_->background_image_filename->setText( playlist_view_background_image_filename_); ui_->blur_slider->setValue( s.value("blur_radius", PlaylistView::kDefaultBlurRadius).toInt()); ui_->opacity_slider->setValue( s.value("opacity_level", PlaylistView::kDefaultOpacityLevel).toInt()); s.endGroup(); // Moodbar settings s.beginGroup("Moodbar"); ui_->moodbar_show->setChecked(s.value("show", true).toBool()); ui_->moodbar_style->setCurrentIndex(s.value("style", 0).toInt()); ui_->moodbar_calculate->setChecked(!s.value("calculate", true).toBool()); ui_->moodbar_save->setChecked( s.value("save_alongside_originals", false).toBool()); s.endGroup(); InitMoodbarPreviews(); } void AppearanceSettingsPage::Save() { QSettings s; s.beginGroup(Appearance::kSettingsGroup); bool use_a_custom_color_set = ui_->use_a_custom_color_set->isChecked(); s.setValue(Appearance::kUseCustomColorSet, use_a_custom_color_set); if (use_a_custom_color_set) { s.setValue(Appearance::kBackgroundColor, current_background_color_); s.setValue(Appearance::kForegroundColor, current_foreground_color_); } else { dialog()->appearance()->ResetToSystemDefaultTheme(); } s.endGroup(); // Playlist settings s.beginGroup(Playlist::kSettingsGroup); playlist_view_background_image_filename_ = ui_->background_image_filename->text(); if (ui_->use_no_background->isChecked()) { playlist_view_background_image_type_ = PlaylistView::None; } else if (ui_->use_album_cover_background->isChecked()) { playlist_view_background_image_type_ = PlaylistView::AlbumCover; } else if (ui_->use_default_background->isChecked()) { playlist_view_background_image_type_ = PlaylistView::Default; } else if (ui_->use_custom_background_image->isChecked()) { playlist_view_background_image_type_ = PlaylistView::Custom; s.setValue(PlaylistView::kSettingBackgroundImageFilename, playlist_view_background_image_filename_); } s.setValue(PlaylistView::kSettingBackgroundImageType, playlist_view_background_image_type_); s.setValue("blur_radius", ui_->blur_slider->value()); s.setValue("opacity_level", ui_->opacity_slider->value()); s.endGroup(); // Moodbar settings s.beginGroup("Moodbar"); s.setValue("calculate", !ui_->moodbar_calculate->isChecked()); s.setValue("show", ui_->moodbar_show->isChecked()); s.setValue("style", ui_->moodbar_style->currentIndex()); s.setValue("save_alongside_originals", ui_->moodbar_save->isChecked()); s.endGroup(); } void AppearanceSettingsPage::Cancel() { if (original_use_a_custom_color_set_) { dialog()->appearance()->ChangeForegroundColor(original_foreground_color_); dialog()->appearance()->ChangeBackgroundColor(original_background_color_); } else { dialog()->appearance()->ResetToSystemDefaultTheme(); } } void AppearanceSettingsPage::SelectForegroundColor() { QColor color_selected = QColorDialog::getColor(current_foreground_color_); if (!color_selected.isValid()) return; current_foreground_color_ = color_selected; dialog()->appearance()->ChangeForegroundColor(color_selected); UpdateColorSelectorColor(ui_->select_foreground_color, color_selected); } void AppearanceSettingsPage::SelectBackgroundColor() { QColor color_selected = QColorDialog::getColor(current_background_color_); if (!color_selected.isValid()) return; current_background_color_ = color_selected; dialog()->appearance()->ChangeBackgroundColor(color_selected); UpdateColorSelectorColor(ui_->select_background_color, color_selected); } void AppearanceSettingsPage::UseCustomColorSetOptionChanged(bool checked) { if (checked) { dialog()->appearance()->ChangeForegroundColor(current_foreground_color_); dialog()->appearance()->ChangeBackgroundColor(current_background_color_); } else { dialog()->appearance()->ResetToSystemDefaultTheme(); } } void AppearanceSettingsPage::InitColorSelectorsColors() { UpdateColorSelectorColor(ui_->select_foreground_color, current_foreground_color_); UpdateColorSelectorColor(ui_->select_background_color, current_background_color_); } void AppearanceSettingsPage::UpdateColorSelectorColor(QWidget* color_selector, const QColor& color) { QString css = QString("background-color: rgb(%1, %2, %3); color: rgb(255, 255, 255)") .arg(color.red()) .arg(color.green()) .arg(color.blue()); color_selector->setStyleSheet(css); } void AppearanceSettingsPage::SelectBackgroundImage() { QString selected_filename = QFileDialog::getOpenFileName( this, tr("Select background image"), playlist_view_background_image_filename_, tr(AlbumCoverChoiceController::kLoadImageFileFilter) + ";;" + tr(AlbumCoverChoiceController::kAllFilesFilter)); if (selected_filename.isEmpty()) return; playlist_view_background_image_filename_ = selected_filename; ui_->background_image_filename->setText( playlist_view_background_image_filename_); } void AppearanceSettingsPage::BlurLevelChanged(int value) { ui_->background_blur_radius_label->setText(QString("%1px").arg(value)); } void AppearanceSettingsPage::OpacityLevelChanged(int percent) { ui_->background_opacity_label->setText(QString("%1\%").arg(percent)); } void AppearanceSettingsPage::InitMoodbarPreviews() { #ifdef HAVE_MOODBAR if (initialised_moodbar_previews_) return; initialised_moodbar_previews_ = true; const QSize preview_size(kMoodbarPreviewWidth, kMoodbarPreviewHeight); ui_->moodbar_style->setIconSize(preview_size); // Read the sample data QFile file(":sample.mood"); if (!file.open(QIODevice::ReadOnly)) { qLog(Warning) << "Unable to open moodbar sample file"; return; } QByteArray data(file.readAll()); // Render and set each preview for (int i = 0; i < MoodbarRenderer::StyleCount; ++i) { const MoodbarRenderer::MoodbarStyle style = MoodbarRenderer::MoodbarStyle(i); const ColorVector colors = MoodbarRenderer::Colors(data, style, palette()); QPixmap pixmap(preview_size); QPainter p(&pixmap); MoodbarRenderer::Render(colors, &p, pixmap.rect()); p.end(); ui_->moodbar_style->addItem(MoodbarRenderer::StyleName(style)); ui_->moodbar_style->setItemData(i, pixmap, Qt::DecorationRole); } #else ui_->moodbar_group->hide(); #endif } void AppearanceSettingsPage::DisableBlurAndOpacitySliders(bool checked) { // Blur slider ui_->blur_slider->setDisabled(checked); ui_->background_blur_radius_label->setDisabled(checked); ui_->select_background_blur_label->setDisabled(checked); // Opacity slider ui_->opacity_slider->setDisabled(checked); ui_->background_opacity_label->setDisabled(checked); ui_->select_opacity_level_label->setDisabled(checked); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/appearancesettingspage.h000066400000000000000000000041771260417502300254720ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef APPEARANCESETTINGSPAGE_H #define APPEARANCESETTINGSPAGE_H #include "settingspage.h" #include "playlist/playlistview.h" class QWidget; class Ui_AppearanceSettingsPage; class AppearanceSettingsPage : public SettingsPage { Q_OBJECT public: AppearanceSettingsPage(SettingsDialog* dialog); ~AppearanceSettingsPage(); void Load(); void Save(); void Cancel(); private slots: void SelectForegroundColor(); void SelectBackgroundColor(); void UseCustomColorSetOptionChanged(bool); void SelectBackgroundImage(); void BlurLevelChanged(int); void OpacityLevelChanged(int); void DisableBlurAndOpacitySliders(bool); private: static const int kMoodbarPreviewWidth; static const int kMoodbarPreviewHeight; // Set the widget's background to new_color void UpdateColorSelectorColor(QWidget* color_selector, const QColor& new_color); // Init (or refresh) the colorSelectors colors void InitColorSelectorsColors(); void InitMoodbarPreviews(); Ui_AppearanceSettingsPage* ui_; bool original_use_a_custom_color_set_; QColor original_foreground_color_; QColor original_background_color_; QColor current_foreground_color_; QColor current_background_color_; PlaylistView::BackgroundImageType playlist_view_background_image_type_; QString playlist_view_background_image_filename_; bool initialised_moodbar_previews_; }; #endif // APPEARANCESETTINGSPAGE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/appearancesettingspage.ui000066400000000000000000000231111260417502300256450ustar00rootroot00000000000000 AppearanceSettingsPage 0 0 596 566 Appearance Colors Use the system default color set Use a custom color set false Select foreground color: false false Select background color: false Background image Default background image The album cover of the currently playing song Album cover No background image Custom image: false false Browse... true Blur amount 0 10 Qt::Horizontal QSlider::TicksBelow 1 true 0px Opacity 100 10 Qt::Horizontal QSlider::TicksBelow 10 40% Moodbars Show a moodbar in the track progress bar Moodbar style Save .mood files in your music library Disable moodbar generation Qt::Vertical 20 40 use_a_custom_color_set toggled(bool) select_background_color setEnabled(bool) 301 72 440 139 use_a_custom_color_set toggled(bool) select_background_color_label setEnabled(bool) 301 72 162 139 use_a_custom_color_set toggled(bool) select_foreground_color setEnabled(bool) 301 72 440 104 use_a_custom_color_set toggled(bool) select_foreground_color_label setEnabled(bool) 301 72 162 104 clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/backgroundstreamssettingspage.cpp000066400000000000000000000054341260417502300274410ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "backgroundstreamssettingspage.h" #include "iconloader.h" #include "settingsdialog.h" #include "ui_backgroundstreamssettingspage.h" #include "core/backgroundstreams.h" #include #include BackgroundStreamsSettingsPage::BackgroundStreamsSettingsPage( SettingsDialog* dialog) : SettingsPage(dialog), ui_(new Ui_BackgroundStreamsSettingsPage) { ui_->setupUi(this); setWindowIcon(QIcon(":/icons/32x32/weather-showers-scattered.png")); for (const QString& name : dialog->background_streams()->streams()) { AddStream(name); } } BackgroundStreamsSettingsPage::~BackgroundStreamsSettingsPage() { delete ui_; } void BackgroundStreamsSettingsPage::Load() {} void BackgroundStreamsSettingsPage::Save() { dialog()->background_streams()->SaveStreams(); } void BackgroundStreamsSettingsPage::AddStream(const QString& name) { BackgroundStreams* streams = dialog()->background_streams(); QGroupBox* box = new QGroupBox(tr(name.toUtf8())); QSlider* slider = new QSlider(Qt::Horizontal, box); QCheckBox* check = new QCheckBox(box); QHBoxLayout* hbox_layout = new QHBoxLayout(box); hbox_layout->addWidget(slider); hbox_layout->addWidget(check); QVBoxLayout* streams_layout = qobject_cast(layout()); streams_layout->insertWidget(streams_layout->count() - 1, box); slider->setProperty("stream_name", name); check->setProperty("stream_name", name); connect(slider, SIGNAL(valueChanged(int)), SLOT(StreamVolumeChanged(int))); connect(check, SIGNAL(toggled(bool)), SLOT(EnableStream(bool))); slider->setValue(streams->GetStreamVolume(name)); check->setCheckState(streams->IsPlaying(name) ? Qt::Checked : Qt::Unchecked); } void BackgroundStreamsSettingsPage::EnableStream(bool enabled) { const QString name = sender()->property("stream_name").toString(); dialog()->background_streams()->EnableStream(name, enabled); } void BackgroundStreamsSettingsPage::StreamVolumeChanged(int value) { const QString name = sender()->property("stream_name").toString(); dialog()->background_streams()->SetStreamVolume(name, value); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/backgroundstreamssettingspage.h000066400000000000000000000024561260417502300271070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef BACKGROUNDSTREAMSSETTINGSPAGE_H #define BACKGROUNDSTREAMSSETTINGSPAGE_H #include "settingspage.h" class Ui_BackgroundStreamsSettingsPage; class BackgroundStreamsSettingsPage : public SettingsPage { Q_OBJECT public: BackgroundStreamsSettingsPage(SettingsDialog* dialog); ~BackgroundStreamsSettingsPage(); void Load(); void Save(); private slots: void EnableStream(bool enabled); void StreamVolumeChanged(int value); private: void AddStream(const QString& name); private: Ui_BackgroundStreamsSettingsPage* ui_; }; #endif // BACKGROUNDSTREAMSSETTINGSPAGE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/backgroundstreamssettingspage.ui000066400000000000000000000017671260417502300273010ustar00rootroot00000000000000 BackgroundStreamsSettingsPage 0 0 475 300 Background Streams You can listen to background streams at the same time as other music. Qt::Vertical 20 256 clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/behavioursettingspage.cpp000066400000000000000000000245301260417502300257050ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "behavioursettingspage.h" #include "mainwindow.h" #include "core/player.h" #include "ui_behavioursettingspage.h" #include "playlist/playlist.h" #include "playlist/playlisttabbar.h" #include namespace { bool LocaleAwareCompare(const QString& a, const QString& b) { return a.localeAwareCompare(b) < 0; } } // namespace BehaviourSettingsPage::BehaviourSettingsPage(SettingsDialog* dialog) : SettingsPage(dialog), ui_(new Ui_BehaviourSettingsPage) { ui_->setupUi(this); connect(ui_->b_show_tray_icon_, SIGNAL(toggled(bool)), SLOT(ShowTrayIconToggled(bool))); ui_->doubleclick_addmode->setItemData(0, MainWindow::AddBehaviour_Append); ui_->doubleclick_addmode->setItemData(1, MainWindow::AddBehaviour_Load); ui_->doubleclick_addmode->setItemData(2, MainWindow::AddBehaviour_OpenInNew); ui_->doubleclick_addmode->setItemData(3, MainWindow::AddBehaviour_Enqueue); ui_->doubleclick_playmode->setItemData(0, MainWindow::PlayBehaviour_Never); ui_->doubleclick_playmode->setItemData(1, MainWindow::PlayBehaviour_IfStopped); ui_->doubleclick_playmode->setItemData(2, MainWindow::PlayBehaviour_Always); ui_->doubleclick_playlist_addmode->setItemData( 0, MainWindow::PlaylistAddBehaviour_Play); ui_->doubleclick_playlist_addmode->setItemData( 1, MainWindow::PlaylistAddBehaviour_Enqueue); ui_->menu_playmode->setItemData(0, MainWindow::PlayBehaviour_Never); ui_->menu_playmode->setItemData(1, MainWindow::PlayBehaviour_IfStopped); ui_->menu_playmode->setItemData(2, MainWindow::PlayBehaviour_Always); ui_->menu_previousmode->setItemData(0, Player::PreviousBehaviour_DontRestart); ui_->menu_previousmode->setItemData(1, Player::PreviousBehaviour_Restart); // Populate the language combo box. We do this by looking at all the // compiled in translations. QDir dir(":/translations/"); QStringList codes(dir.entryList(QStringList() << "*.qm")); QRegExp lang_re("^clementine_(.*).qm$"); for (const QString& filename : codes) { // The regex captures the "ru" from "clementine_ru.qm" if (!lang_re.exactMatch(filename)) continue; QString code = lang_re.cap(1); QString lookup_code = QString(code) .replace("@latin", "_Latn") .replace("_CN", "_Hans_CN") .replace("_TW", "_Hant_TW"); QString language_name = QLocale::languageToString(QLocale(lookup_code).language()); #if QT_VERSION >= 0x040800 QString native_name = QLocale(lookup_code).nativeLanguageName(); if (!native_name.isEmpty()) { language_name = native_name; } #endif QString name = QString("%1 (%2)").arg(language_name, code); language_map_[name] = code; } language_map_["English (en)"] = "en"; // Sort the names and show them in the UI QStringList names = language_map_.keys(); qStableSort(names.begin(), names.end(), LocaleAwareCompare); ui_->language->addItems(names); #ifdef Q_OS_DARWIN ui_->b_show_tray_icon_->setEnabled(false); ui_->startup_group_->setEnabled(false); #endif } BehaviourSettingsPage::~BehaviourSettingsPage() { delete ui_; } void BehaviourSettingsPage::Load() { QSettings s; s.beginGroup(MainWindow::kSettingsGroup); ui_->b_show_tray_icon_->setChecked(s.value("showtray", true).toBool()); ui_->b_keep_running_->setChecked( s.value("keeprunning", ui_->b_show_tray_icon_->isChecked()).toBool()); ui_->doubleclick_addmode->setCurrentIndex(ui_->doubleclick_addmode->findData( s.value("doubleclick_addmode", MainWindow::AddBehaviour_Append).toInt())); ui_->doubleclick_playmode->setCurrentIndex( ui_->doubleclick_playmode->findData( s.value("doubleclick_playmode", MainWindow::PlayBehaviour_IfStopped) .toInt())); ui_->doubleclick_playlist_addmode->setCurrentIndex( ui_->doubleclick_playlist_addmode->findData( s.value("doubleclick_playlist_addmode", MainWindow::PlaylistAddBehaviour_Play).toInt())); ui_->menu_playmode->setCurrentIndex(ui_->menu_playmode->findData( s.value("menu_playmode", MainWindow::PlayBehaviour_IfStopped).toInt())); MainWindow::StartupBehaviour behaviour = MainWindow::StartupBehaviour( s.value("startupbehaviour", MainWindow::Startup_Remember).toInt()); switch (behaviour) { case MainWindow::Startup_AlwaysHide: ui_->b_always_hide_->setChecked(true); break; case MainWindow::Startup_AlwaysShow: ui_->b_always_show_->setChecked(true); break; case MainWindow::Startup_Remember: ui_->b_remember_->setChecked(true); break; } ui_->resume_after_start_->setChecked( s.value("resume_playback_after_start", false).toBool()); s.endGroup(); s.beginGroup(Player::kSettingsGroup); ui_->menu_previousmode->setCurrentIndex(ui_->menu_previousmode->findData( s.value("menu_previousmode", Player::PreviousBehaviour_DontRestart) .toInt())); ui_->seek_step_sec->setValue(s.value("seek_step_sec", 10).toInt()); s.endGroup(); s.beginGroup("General"); QString name = language_map_.key(s.value("language").toString()); if (name.isEmpty()) ui_->language->setCurrentIndex(0); else ui_->language->setCurrentIndex(ui_->language->findText(name)); s.endGroup(); s.beginGroup(Playlist::kSettingsGroup); ui_->b_grey_out_deleted_->setChecked( s.value("greyoutdeleted", false).toBool()); ui_->b_click_edit_inline_->setChecked( s.value("click_edit_inline", true).toBool()); Playlist::Path path = Playlist::Path( s.value(Playlist::kPathType, Playlist::Path_Automatic).toInt()); switch (path) { case Playlist::Path_Automatic: ui_->b_automatic_path->setChecked(true); break; case Playlist::Path_Absolute: ui_->b_absolute_path->setChecked(true); break; case Playlist::Path_Relative: ui_->b_relative_path->setChecked(true); break; case Playlist::Path_Ask_User: ui_->b_ask_path->setChecked(true); } ui_->b_write_metadata->setChecked( s.value(Playlist::kWriteMetadata, true).toBool()); s.endGroup(); s.beginGroup(PlaylistTabBar::kSettingsGroup); ui_->b_warn_close_playlist_->setChecked( s.value("warn_close_playlist", true).toBool()); s.endGroup(); } void BehaviourSettingsPage::Save() { QSettings s; MainWindow::StartupBehaviour behaviour = MainWindow::Startup_Remember; if (ui_->b_always_hide_->isChecked()) behaviour = MainWindow::Startup_AlwaysHide; if (ui_->b_always_show_->isChecked()) behaviour = MainWindow::Startup_AlwaysShow; if (ui_->b_remember_->isChecked()) behaviour = MainWindow::Startup_Remember; MainWindow::AddBehaviour doubleclick_addmode = MainWindow::AddBehaviour( ui_->doubleclick_addmode->itemData( ui_->doubleclick_addmode->currentIndex()) .toInt()); MainWindow::PlayBehaviour doubleclick_playmode = MainWindow::PlayBehaviour( ui_->doubleclick_playmode->itemData( ui_->doubleclick_playmode->currentIndex()) .toInt()); MainWindow::PlaylistAddBehaviour doubleclick_playlist_addmode = MainWindow::PlaylistAddBehaviour( ui_->doubleclick_playlist_addmode ->itemData(ui_->doubleclick_playlist_addmode->currentIndex()) .toInt()); MainWindow::PlayBehaviour menu_playmode = MainWindow::PlayBehaviour( ui_->menu_playmode->itemData(ui_->menu_playmode->currentIndex()).toInt()); Player::PreviousBehaviour menu_previousmode = Player::PreviousBehaviour( ui_->menu_previousmode->itemData(ui_->menu_previousmode->currentIndex()) .toInt()); Playlist::Path path = Playlist::Path_Automatic; if (ui_->b_automatic_path->isChecked()) { path = Playlist::Path_Automatic; } else if (ui_->b_absolute_path->isChecked()) { path = Playlist::Path_Absolute; } else if (ui_->b_relative_path->isChecked()) { path = Playlist::Path_Relative; } else if (ui_->b_ask_path->isChecked()) { path = Playlist::Path_Ask_User; } s.beginGroup(MainWindow::kSettingsGroup); s.setValue("showtray", ui_->b_show_tray_icon_->isChecked()); s.setValue("keeprunning", ui_->b_keep_running_->isChecked()); s.setValue("startupbehaviour", int(behaviour)); s.setValue("doubleclick_addmode", doubleclick_addmode); s.setValue("doubleclick_playmode", doubleclick_playmode); s.setValue("doubleclick_playlist_addmode", doubleclick_playlist_addmode); s.setValue("menu_playmode", menu_playmode); s.setValue("resume_playback_after_start", ui_->resume_after_start_->isChecked()); s.endGroup(); s.beginGroup(Player::kSettingsGroup); s.setValue("menu_previousmode", menu_previousmode); s.setValue("seek_step_sec", ui_->seek_step_sec->value()); s.endGroup(); s.beginGroup("General"); s.setValue("language", language_map_.contains(ui_->language->currentText()) ? language_map_[ui_->language->currentText()] : QString()); s.endGroup(); s.beginGroup(Playlist::kSettingsGroup); s.setValue("greyoutdeleted", ui_->b_grey_out_deleted_->isChecked()); s.setValue("click_edit_inline", ui_->b_click_edit_inline_->isChecked()); s.setValue(Playlist::kPathType, static_cast(path)); s.setValue(Playlist::kWriteMetadata, ui_->b_write_metadata->isChecked()); s.endGroup(); s.beginGroup(PlaylistTabBar::kSettingsGroup); s.setValue("warn_close_playlist", ui_->b_warn_close_playlist_->isChecked()); s.endGroup(); } void BehaviourSettingsPage::ShowTrayIconToggled(bool on) { ui_->b_always_hide_->setEnabled(on); if (!on && ui_->b_always_hide_->isChecked()) ui_->b_remember_->setChecked(true); ui_->b_keep_running_->setEnabled(on); ui_->b_keep_running_->setChecked(on); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/behavioursettingspage.h000066400000000000000000000023211260417502300253440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef BEHAVIOURSETTINGSPAGE_H #define BEHAVIOURSETTINGSPAGE_H #include "settingspage.h" #include class Ui_BehaviourSettingsPage; class BehaviourSettingsPage : public SettingsPage { Q_OBJECT public: BehaviourSettingsPage(SettingsDialog* dialog); ~BehaviourSettingsPage(); void Load(); void Save(); private slots: void ShowTrayIconToggled(bool on); private: Ui_BehaviourSettingsPage* ui_; QMap language_map_; }; #endif // BEHAVIOURSETTINGSPAGE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/behavioursettingspage.ui000066400000000000000000000270071260417502300255420ustar00rootroot00000000000000 BehaviourSettingsPage 0 0 516 851 Behavior Show tray icon true Keep running in the background when the window is closed Qt::Horizontal Warn me when closing a playlist tab Language Use the system default You will need to restart Clementine if you change the language. When Clementine starts Always show the main window Always hide the main window Remember from last time true Qt::Vertical QSizePolicy::Fixed 20 10 Resume playback on start false Grey out non existent songs in my playlists If activated, clicking a selected song in the playlist view will let you edit the tag value directly Enable song metadata inline edition with click Using the menu to add a song will... 0 Never start playing Play if there is nothing already playing Always start playing Pressing "Previous" in player will... 0 Jump to previous song right away Restart song, then jump to previous if pressed again Double clicking a song will... 0 Append to the playlist Replace the playlist Open in new playlist Add to the queue 1 Never start playing Play if there is nothing already playing Always start playing Double clicking a song in the playlist will... 0 Change the currently playing song Add to the queue Seeking using a keyboard shortcut Time step s 1 20 10 Qt::Horizontal 40 20 When saving a playlist, file paths should be Automatic true Absolute Relative Ask when saving Qt::Vertical QSizePolicy::Fixed 20 10 Write metadata true Qt::Vertical 20 5 clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/console.cpp000066400000000000000000000020601260417502300227370ustar00rootroot00000000000000#include "console.h" #include #include #include #include #include #include "core/application.h" #include "core/database.h" Console::Console(Application* app, QWidget* parent) : QDialog(parent), app_(app) { ui_.setupUi(this); connect(ui_.run, SIGNAL(clicked()), SLOT(RunQuery())); QFont font("Monospace"); font.setStyleHint(QFont::TypeWriter); ui_.output->setFont(font); ui_.query->setFont(font); } void Console::RunQuery() { QSqlDatabase db = app_->database()->Connect(); QSqlQuery query = db.exec(ui_.query->text()); ui_.query->clear(); ui_.output->append("> " + query.executedQuery() + ""); query.next(); while (query.isValid()) { QSqlRecord record = query.record(); QStringList values; for (int i = 0; i < record.count(); ++i) { values.append(record.value(i).toString()); } ui_.output->append(values.join("|")); query.next(); } ui_.output->verticalScrollBar()->setValue( ui_.output->verticalScrollBar()->maximum()); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/console.h000066400000000000000000000005031260417502300224040ustar00rootroot00000000000000#ifndef CONSOLE_H #define CONSOLE_H #include #include "ui_console.h" class Application; class Console : public QDialog { Q_OBJECT public: Console(Application* app, QWidget* parent = nullptr); private slots: void RunQuery(); private: Ui::Console ui_; Application* app_; }; #endif // CONSOLE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/console.ui000066400000000000000000000021021260417502300225670ustar00rootroot00000000000000 Console 0 0 545 347 Console Run query run output clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/coverfromurldialog.cpp000066400000000000000000000046341260417502300252130ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "coverfromurldialog.h" #include "ui_coverfromurldialog.h" #include "core/network.h" #include "covers/albumcoverloader.h" #include #include #include #include #include #include CoverFromURLDialog::CoverFromURLDialog(QWidget* parent) : QDialog(parent), ui_(new Ui_CoverFromURLDialog), network_(new NetworkAccessManager(this)) { ui_->setupUi(this); ui_->busy->hide(); } CoverFromURLDialog::~CoverFromURLDialog() { delete ui_; } QImage CoverFromURLDialog::Exec() { // reset state ui_->url->setText(""); ; last_image_ = QImage(); QClipboard* clipboard = QApplication::clipboard(); ui_->url->setText(clipboard->text()); exec(); return last_image_; } void CoverFromURLDialog::accept() { ui_->busy->show(); QNetworkRequest network_request = QNetworkRequest(QUrl::fromUserInput(ui_->url->text())); QNetworkReply* reply = network_->get(network_request); connect(reply, SIGNAL(finished()), SLOT(LoadCoverFromURLFinished())); } void CoverFromURLDialog::LoadCoverFromURLFinished() { ui_->busy->hide(); QNetworkReply* reply = qobject_cast(sender()); reply->deleteLater(); if (reply->error() != QNetworkReply::NoError) { QMessageBox::information(this, tr("Fetching cover error"), tr("The site you requested does not exist!")); return; } QImage image; image.loadFromData(reply->readAll()); if (!image.isNull()) { last_image_ = image; QDialog::accept(); } else { QMessageBox::information(this, tr("Fetching cover error"), tr("The site you requested is not an image!")); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/coverfromurldialog.h000066400000000000000000000026531260417502300246570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef COVERFROMURLDIALOG_H #define COVERFROMURLDIALOG_H #include #include class NetworkAccessManager; class Song; class Ui_CoverFromURLDialog; // Controller for a dialog which fetches covers from the given URL. class CoverFromURLDialog : public QDialog { Q_OBJECT public: CoverFromURLDialog(QWidget* parent = nullptr); ~CoverFromURLDialog(); // Opens the dialog. This returns an image found at the URL chosen by user // or null image if the dialog got rejected. QImage Exec(); private slots: void accept(); void LoadCoverFromURLFinished(); private: Ui_CoverFromURLDialog* ui_; NetworkAccessManager* network_; QImage last_image_; }; #endif // COVERFROMURLDIALOG_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/coverfromurldialog.ui000066400000000000000000000055141260417502300250440ustar00rootroot00000000000000 CoverFromURLDialog 0 0 407 126 Load cover from URL :/icon.png:/icon.png 0 0 Enter a URL to download a cover from the Internet: Qt::Vertical 20 3 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok BusyIndicator QWidget
widgets/busyindicator.h
buttonBox accepted() CoverFromURLDialog accept() 248 254 157 274 buttonBox rejected() CoverFromURLDialog reject() 316 260 286 274
clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/dbusscreensaver.cpp000066400000000000000000000031511260417502300244750ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "dbusscreensaver.h" #include #include #include DBusScreensaver::DBusScreensaver(const QString& service, const QString& path, const QString& interface) : service_(service), path_(path), interface_(interface) {} void DBusScreensaver::Inhibit() { QDBusInterface gnome_screensaver("org.gnome.ScreenSaver", "/", "org.gnome.ScreenSaver"); QDBusReply reply = gnome_screensaver.call("Inhibit", QCoreApplication::applicationName(), QObject::tr("Visualizations")); if (reply.isValid()) { cookie_ = reply.value(); } } void DBusScreensaver::Uninhibit() { QDBusInterface gnome_screensaver("org.gnome.ScreenSaver", "/", "org.gnome.ScreenSaver"); gnome_screensaver.call("UnInhibit", cookie_); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/dbusscreensaver.h000066400000000000000000000021551260417502300241450ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef DBUSSCREENSAVER_H #define DBUSSCREENSAVER_H #include "screensaver.h" #include class DBusScreensaver : public Screensaver { public: DBusScreensaver(const QString& service, const QString& path, const QString& interface); void Inhibit(); void Uninhibit(); private: QString service_; QString path_; QString interface_; quint32 cookie_; }; #endif clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/edittagdialog.cpp000066400000000000000000000665501260417502300241140ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "albumcovermanager.h" #include "edittagdialog.h" #include "trackselectiondialog.h" #include "ui_edittagdialog.h" #include "core/application.h" #include "core/logging.h" #include "core/tagreaderclient.h" #include "core/utilities.h" #include "covers/albumcoverloader.h" #include "covers/coverproviders.h" #include "library/library.h" #include "library/librarybackend.h" #include "playlist/playlistdelegates.h" #include "ui/albumcoverchoicecontroller.h" #include "ui/coverfromurldialog.h" #include #include #include #include #include #include #include #include #include #include #include #include const char* EditTagDialog::kHintText = QT_TR_NOOP("(different across multiple songs)"); const char* EditTagDialog::kSettingsGroup = "EditTagDialog"; EditTagDialog::EditTagDialog(Application* app, QWidget* parent) : QDialog(parent), ui_(new Ui_EditTagDialog), app_(app), album_cover_choice_controller_(new AlbumCoverChoiceController(this)), loading_(false), ignore_edits_(false), tag_fetcher_(new TagFetcher(this)), cover_art_id_(0), cover_art_is_set_(false), results_dialog_(new TrackSelectionDialog(this)) { cover_options_.default_output_image_ = AlbumCoverLoader::ScaleAndPad(cover_options_, QImage(":nocover.png")); connect(app_->album_cover_loader(), SIGNAL(ImageLoaded(quint64, QImage, QImage)), SLOT(ArtLoaded(quint64, QImage, QImage))); connect(tag_fetcher_, SIGNAL(ResultAvailable(Song, SongList)), results_dialog_, SLOT(FetchTagFinished(Song, SongList)), Qt::QueuedConnection); connect(tag_fetcher_, SIGNAL(Progress(Song, QString)), results_dialog_, SLOT(FetchTagProgress(Song, QString))); connect(results_dialog_, SIGNAL(SongChosen(Song, Song)), SLOT(FetchTagSongChosen(Song, Song))); connect(results_dialog_, SIGNAL(finished(int)), tag_fetcher_, SLOT(Cancel())); album_cover_choice_controller_->SetApplication(app_); ui_->setupUi(this); ui_->splitter->setSizes(QList() << 200 << width() - 200); ui_->loading_label->hide(); // An editable field is one that has a label as a buddy. The label is // important because it gets turned bold when the field is changed. for (QLabel* label : findChildren()) { QWidget* widget = label->buddy(); if (widget) { // Store information about the field fields_ << FieldData(label, widget, widget->objectName()); // Connect the Reset signal if (dynamic_cast(widget)) { connect(widget, SIGNAL(Reset()), SLOT(ResetField())); } // Connect the edited signal if (qobject_cast(widget)) { connect(widget, SIGNAL(textChanged(QString)), SLOT(FieldValueEdited())); } else if (qobject_cast(widget)) { connect(widget, SIGNAL(textChanged()), SLOT(FieldValueEdited())); } else if (qobject_cast(widget)) { connect(widget, SIGNAL(valueChanged(int)), SLOT(FieldValueEdited())); } } } // Set the colour of all the labels on the summary page const bool light = palette().color(QPalette::Base).value() > 128; const QColor color = palette().color(QPalette::WindowText); QPalette summary_label_palette(palette()); summary_label_palette.setColor( QPalette::WindowText, light ? color.lighter(150) : color.darker(150)); for (QLabel* label : ui_->summary_tab->findChildren()) { if (label->property("field_label").toBool()) { label->setPalette(summary_label_palette); } } // Pretend the summary text is just a label ui_->summary->setMaximumHeight(ui_->art->height() - ui_->summary_art_button->height() - 4); connect(ui_->song_list->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), SLOT(SelectionChanged())); connect(ui_->button_box, SIGNAL(clicked(QAbstractButton*)), SLOT(ButtonClicked(QAbstractButton*))); connect(ui_->rating, SIGNAL(RatingChanged(float)), SLOT(SongRated(float))); connect(ui_->playcount_reset, SIGNAL(clicked()), SLOT(ResetPlayCounts())); connect(ui_->fetch_tag, SIGNAL(clicked()), SLOT(FetchTag())); // Set up the album cover menu cover_menu_ = new QMenu(this); QList actions = album_cover_choice_controller_->GetAllActions(); connect(album_cover_choice_controller_->cover_from_file_action(), SIGNAL(triggered()), this, SLOT(LoadCoverFromFile())); connect(album_cover_choice_controller_->cover_to_file_action(), SIGNAL(triggered()), this, SLOT(SaveCoverToFile())); connect(album_cover_choice_controller_->cover_from_url_action(), SIGNAL(triggered()), this, SLOT(LoadCoverFromURL())); connect(album_cover_choice_controller_->search_for_cover_action(), SIGNAL(triggered()), this, SLOT(SearchForCover())); connect(album_cover_choice_controller_->unset_cover_action(), SIGNAL(triggered()), this, SLOT(UnsetCover())); connect(album_cover_choice_controller_->show_cover_action(), SIGNAL(triggered()), this, SLOT(ShowCover())); cover_menu_->addActions(actions); ui_->summary_art_button->setMenu(cover_menu_); ui_->art->installEventFilter(this); ui_->art->setAcceptDrops(true); // Add the next/previous buttons previous_button_ = new QPushButton(IconLoader::Load("go-previous"), tr("Previous"), this); next_button_ = new QPushButton(IconLoader::Load("go-next"), tr("Next"), this); ui_->button_box->addButton(previous_button_, QDialogButtonBox::ResetRole); ui_->button_box->addButton(next_button_, QDialogButtonBox::ResetRole); connect(previous_button_, SIGNAL(clicked()), SLOT(PreviousSong())); connect(next_button_, SIGNAL(clicked()), SLOT(NextSong())); // Set some shortcuts for the buttons new QShortcut(QKeySequence::Back, previous_button_, SLOT(click())); new QShortcut(QKeySequence::Forward, next_button_, SLOT(click())); new QShortcut(QKeySequence::MoveToPreviousPage, previous_button_, SLOT(click())); new QShortcut(QKeySequence::MoveToNextPage, next_button_, SLOT(click())); // Show the shortcuts as tooltips previous_button_->setToolTip(QString("%1 (%2 / %3)").arg( previous_button_->text(), QKeySequence(QKeySequence::Back).toString(QKeySequence::NativeText), QKeySequence(QKeySequence::MoveToPreviousPage) .toString(QKeySequence::NativeText))); next_button_->setToolTip(QString("%1 (%2 / %3)").arg( next_button_->text(), QKeySequence(QKeySequence::Forward).toString(QKeySequence::NativeText), QKeySequence(QKeySequence::MoveToNextPage) .toString(QKeySequence::NativeText))); new TagCompleter(app_->library_backend(), Playlist::Column_Artist, ui_->artist); new TagCompleter(app_->library_backend(), Playlist::Column_Album, ui_->album); new TagCompleter(app_->library_backend(), Playlist::Column_AlbumArtist, ui_->albumartist); new TagCompleter(app_->library_backend(), Playlist::Column_Genre, ui_->genre); new TagCompleter(app_->library_backend(), Playlist::Column_Composer, ui_->composer); new TagCompleter(app_->library_backend(), Playlist::Column_Performer, ui_->performer); new TagCompleter(app_->library_backend(), Playlist::Column_Grouping, ui_->grouping); } EditTagDialog::~EditTagDialog() { delete ui_; } bool EditTagDialog::SetLoading(const QString& message) { const bool loading = !message.isEmpty(); if (loading == loading_) return false; loading_ = loading; ui_->button_box->setEnabled(!loading); ui_->tab_widget->setEnabled(!loading); ui_->song_list->setEnabled(!loading); ui_->fetch_tag->setEnabled(!loading); ui_->loading_label->setVisible(loading); ui_->loading_label->set_text(message); return true; } QList EditTagDialog::LoadData( const SongList& songs) const { QList ret; for (const Song& song : songs) { if (song.IsEditable()) { // Try reloading the tags from file Song copy(song); TagReaderClient::Instance()->ReadFileBlocking(copy.url().toLocalFile(), ©); if (copy.is_valid()) { copy.MergeUserSetData(song); ret << Data(copy); } } } return ret; } void EditTagDialog::SetSongs(const SongList& s, const PlaylistItemList& items) { // Show the loading indicator if (!SetLoading(tr("Loading tracks") + "...")) return; data_.clear(); playlist_items_ = items; ui_->song_list->clear(); // Reload tags in the background QFuture> future = QtConcurrent::run(this, &EditTagDialog::LoadData, s); QFutureWatcher>* watcher = new QFutureWatcher>(this); watcher->setFuture(future); connect(watcher, SIGNAL(finished()), SLOT(SetSongsFinished())); } void EditTagDialog::SetSongsFinished() { QFutureWatcher>* watcher = dynamic_cast>*>(sender()); if (!watcher) return; watcher->deleteLater(); if (!SetLoading(QString())) return; data_ = watcher->result(); if (data_.count() == 0) { // If there were no valid songs, disable everything ui_->song_list->setEnabled(false); ui_->tab_widget->setEnabled(false); // Show a summary with empty information UpdateSummaryTab(Song()); ui_->tab_widget->setCurrentWidget(ui_->summary_tab); SetSongListVisibility(false); return; } // Add the filenames to the list for (const Data& data : data_) { ui_->song_list->addItem(data.current_.basefilename()); } // Select all ui_->song_list->setCurrentRow(0); ui_->song_list->selectAll(); // Hide the list if there's only one song in it SetSongListVisibility(data_.count() != 1); } void EditTagDialog::SetSongListVisibility(bool visible) { ui_->song_list->setVisible(visible); previous_button_->setEnabled(visible); next_button_->setEnabled(visible); } QVariant EditTagDialog::Data::value(const Song& song, const QString& id) { if (id == "title") return song.title(); if (id == "artist") return song.artist(); if (id == "album") return song.album(); if (id == "albumartist") return song.albumartist(); if (id == "composer") return song.composer(); if (id == "performer") return song.performer(); if (id == "grouping") return song.grouping(); if (id == "genre") return song.genre(); if (id == "comment") return song.comment(); if (id == "lyrics") return song.lyrics(); if (id == "track") return song.track(); if (id == "disc") return song.disc(); if (id == "year") return song.year(); qLog(Warning) << "Unknown ID" << id; return QVariant(); } void EditTagDialog::Data::set_value(const QString& id, const QVariant& value) { if (id == "title") current_.set_title(value.toString()); else if (id == "artist") current_.set_artist(value.toString()); else if (id == "album") current_.set_album(value.toString()); else if (id == "albumartist") current_.set_albumartist(value.toString()); else if (id == "composer") current_.set_composer(value.toString()); else if (id == "performer") current_.set_performer(value.toString()); else if (id == "grouping") current_.set_grouping(value.toString()); else if (id == "genre") current_.set_genre(value.toString()); else if (id == "comment") current_.set_comment(value.toString()); else if (id == "lyrics") current_.set_lyrics(value.toString()); else if (id == "track") current_.set_track(value.toInt()); else if (id == "disc") current_.set_disc(value.toInt()); else if (id == "year") current_.set_year(value.toInt()); else qLog(Warning) << "Unknown ID" << id; } bool EditTagDialog::DoesValueVary(const QModelIndexList& sel, const QString& id) const { QVariant value = data_[sel.first().row()].current_value(id); for (int i = 1; i < sel.count(); ++i) { if (value != data_[sel[i].row()].current_value(id)) return true; } return false; } bool EditTagDialog::IsValueModified(const QModelIndexList& sel, const QString& id) const { for (const QModelIndex& i : sel) { if (data_[i.row()].original_value(id) != data_[i.row()].current_value(id)) return true; } return false; } void EditTagDialog::InitFieldValue(const FieldData& field, const QModelIndexList& sel) { const bool varies = DoesValueVary(sel, field.id_); const bool modified = IsValueModified(sel, field.id_); if (ExtendedEditor* editor = dynamic_cast(field.editor_)) { editor->clear(); editor->clear_hint(); if (varies) { editor->set_hint(tr(EditTagDialog::kHintText)); } else { editor->set_text(data_[sel[0].row()].current_value(field.id_).toString()); } } QFont new_font(font()); new_font.setBold(modified); field.label_->setFont(new_font); field.editor_->setFont(new_font); } void EditTagDialog::UpdateFieldValue(const FieldData& field, const QModelIndexList& sel) { // Get the value from the field QVariant value; if (ExtendedEditor* editor = dynamic_cast(field.editor_)) { value = editor->text(); } // Did we get it? if (!value.isValid()) { return; } // Set it in each selected song for (const QModelIndex& i : sel) { data_[i.row()].set_value(field.id_, value); } // Update the boldness const bool modified = IsValueModified(sel, field.id_); QFont new_font(font()); new_font.setBold(modified); field.label_->setFont(new_font); field.editor_->setFont(new_font); } void EditTagDialog::ResetFieldValue(const FieldData& field, const QModelIndexList& sel) { // Reset each selected song for (const QModelIndex& i : sel) { Data& data = data_[i.row()]; data.set_value(field.id_, data.original_value(field.id_)); } // Reset the field InitFieldValue(field, sel); } void EditTagDialog::SelectionChanged() { const QModelIndexList sel = ui_->song_list->selectionModel()->selectedIndexes(); if (sel.isEmpty()) return; // Set the editable fields ignore_edits_ = true; for (const FieldData& field : fields_) { InitFieldValue(field, sel); } ignore_edits_ = false; // If we're editing multiple songs then we have to disable certain tabs const bool multiple = sel.count() > 1; ui_->tab_widget->setTabEnabled(ui_->tab_widget->indexOf(ui_->summary_tab), !multiple); if (!multiple) { const Song& song = data_[sel.first().row()].original_; UpdateSummaryTab(song); UpdateStatisticsTab(song); } } static void SetText(QLabel* label, int value, const QString& suffix, const QString& def = QString()) { label->setText(value <= 0 ? def : (QString::number(value) + " " + suffix)); } static void SetDate(QLabel* label, uint time) { if (time == std::numeric_limits::max()) { // -1 label->setText(QObject::tr("Unknown")); } else { label->setText(QDateTime::fromTime_t(time).toString( QLocale::system().dateTimeFormat(QLocale::LongFormat))); } } void EditTagDialog::UpdateSummaryTab(const Song& song) { cover_art_id_ = app_->album_cover_loader()->LoadImageAsync(cover_options_, song); QString summary = "" + Qt::escape(song.PrettyTitleWithArtist()) + "
"; bool art_is_set = true; if (song.has_manually_unset_cover()) { summary += Qt::escape(tr("Cover art manually unset")); art_is_set = false; } else if (!song.art_manual().isEmpty()) { summary += Qt::escape(tr("Cover art set from %1").arg(song.art_manual())); } else if (song.has_embedded_cover()) { summary += Qt::escape(tr("Cover art from embedded image")); } else if (!song.art_automatic().isEmpty()) { summary += Qt::escape( tr("Cover art loaded automatically from %1").arg(song.art_automatic())); } else { summary += Qt::escape(tr("Cover art not set")); art_is_set = false; } ui_->summary->setText(summary); album_cover_choice_controller_->unset_cover_action()->setEnabled(art_is_set); album_cover_choice_controller_->show_cover_action()->setEnabled(art_is_set); ui_->summary_art_button->setEnabled(song.id() != -1); ui_->length->setText(Utilities::PrettyTimeNanosec(song.length_nanosec())); SetText(ui_->bpm, song.bpm(), tr("bpm")); SetText(ui_->samplerate, song.samplerate(), "Hz"); SetText(ui_->bitrate, song.bitrate(), tr("kbps")); SetDate(ui_->mtime, song.mtime()); SetDate(ui_->ctime, song.ctime()); if (song.filesize() == -1) { ui_->filesize->setText(tr("Unknown")); } else { ui_->filesize->setText(Utilities::PrettySize(song.filesize())); } ui_->filetype->setText(song.TextForFiletype()); if (song.url().scheme() == "file") ui_->filename->setText(QDir::toNativeSeparators(song.url().toLocalFile())); else ui_->filename->setText(song.url().toString()); album_cover_choice_controller_->search_for_cover_action()->setEnabled( app_->cover_providers()->HasAnyProviders()); } void EditTagDialog::UpdateStatisticsTab(const Song& song) { ui_->playcount->setText(QString::number(qMax(0, song.playcount()))); ui_->skipcount->setText(QString::number(qMax(0, song.skipcount()))); ui_->score->setText(QString::number(qMax(0, song.score()))); ui_->rating->set_rating(song.rating()); ui_->lastplayed->setText( song.lastplayed() <= 0 ? tr("Never") : QDateTime::fromTime_t(song.lastplayed()).toString( QLocale::system().dateTimeFormat(QLocale::LongFormat))); } void EditTagDialog::ArtLoaded(quint64 id, const QImage& scaled, const QImage& original) { if (id == cover_art_id_) { ui_->art->setPixmap(QPixmap::fromImage(scaled)); original_ = original; } } void EditTagDialog::FieldValueEdited() { if (ignore_edits_) return; const QModelIndexList sel = ui_->song_list->selectionModel()->selectedIndexes(); if (sel.isEmpty()) return; QWidget* w = qobject_cast(sender()); // Find the field for (const FieldData& field : fields_) { if (field.editor_ == w) { UpdateFieldValue(field, sel); return; } } } void EditTagDialog::ResetField() { const QModelIndexList sel = ui_->song_list->selectionModel()->selectedIndexes(); if (sel.isEmpty()) return; QWidget* w = qobject_cast(sender()); // Find the field for (const FieldData& field : fields_) { if (field.editor_ == w) { ignore_edits_ = true; ResetFieldValue(field, sel); ignore_edits_ = false; return; } } } Song* EditTagDialog::GetFirstSelected() { const QModelIndexList sel = ui_->song_list->selectionModel()->selectedIndexes(); if (sel.isEmpty()) return nullptr; return &data_[sel.first().row()].original_; } void EditTagDialog::LoadCoverFromFile() { Song* song = GetFirstSelected(); if (!song) return; const QModelIndexList sel = ui_->song_list->selectionModel()->selectedIndexes(); QString cover = album_cover_choice_controller_->LoadCoverFromFile(song); if (!cover.isEmpty()) UpdateCoverOf(*song, sel, cover); } void EditTagDialog::SaveCoverToFile() { Song* song = GetFirstSelected(); if (!song) return; album_cover_choice_controller_->SaveCoverToFile(*song, original_); } void EditTagDialog::LoadCoverFromURL() { Song* song = GetFirstSelected(); if (!song) return; const QModelIndexList sel = ui_->song_list->selectionModel()->selectedIndexes(); QString cover = album_cover_choice_controller_->LoadCoverFromURL(song); if (!cover.isEmpty()) UpdateCoverOf(*song, sel, cover); } void EditTagDialog::SearchForCover() { Song* song = GetFirstSelected(); if (!song) return; const QModelIndexList sel = ui_->song_list->selectionModel()->selectedIndexes(); QString cover = album_cover_choice_controller_->SearchForCover(song); if (!cover.isEmpty()) UpdateCoverOf(*song, sel, cover); } void EditTagDialog::UnsetCover() { Song* song = GetFirstSelected(); if (!song) return; const QModelIndexList sel = ui_->song_list->selectionModel()->selectedIndexes(); QString cover = album_cover_choice_controller_->UnsetCover(song); UpdateCoverOf(*song, sel, cover); } void EditTagDialog::ShowCover() { Song* song = GetFirstSelected(); if (!song) { return; } album_cover_choice_controller_->ShowCover(*song); } void EditTagDialog::UpdateCoverOf(const Song& selected, const QModelIndexList& sel, const QString& cover) { if (!selected.is_valid() || selected.id() == -1) return; UpdateSummaryTab(selected); // Now check if we have any other songs cached that share that artist and // album (and would therefore be changed as well) for (int i = 0; i < data_.count(); ++i) { if (i == sel.first().row()) // Already changed this one continue; Song* other_song = &data_[i].original_; if (selected.artist() == other_song->artist() && selected.album() == other_song->album()) { other_song->set_art_manual(cover); } } } void EditTagDialog::NextSong() { if (ui_->song_list->count() == 0) { return; } int row = (ui_->song_list->currentRow() + 1) % ui_->song_list->count(); ui_->song_list->setCurrentRow(row); } void EditTagDialog::PreviousSong() { if (ui_->song_list->count() == 0) { return; } int row = (ui_->song_list->currentRow() - 1 + ui_->song_list->count()) % ui_->song_list->count(); ui_->song_list->setCurrentRow(row); } void EditTagDialog::ButtonClicked(QAbstractButton* button) { if (button == ui_->button_box->button(QDialogButtonBox::Discard)) { reject(); } } void EditTagDialog::SaveData(const QList& data) { for (int i = 0; i < data.count(); ++i) { const Data& ref = data[i]; if (ref.current_.IsMetadataEqual(ref.original_)) continue; if (!TagReaderClient::Instance()->SaveFileBlocking( ref.current_.url().toLocalFile(), ref.current_)) { emit Error(tr("An error occurred writing metadata to '%1'") .arg(ref.current_.url().toLocalFile())); } } } void EditTagDialog::accept() { // Show the loading indicator if (!SetLoading(tr("Saving tracks") + "...")) return; // Save tags in the background QFuture future = QtConcurrent::run(this, &EditTagDialog::SaveData, data_); QFutureWatcher* watcher = new QFutureWatcher(this); watcher->setFuture(future); connect(watcher, SIGNAL(finished()), SLOT(AcceptFinished())); } void EditTagDialog::AcceptFinished() { QFutureWatcher* watcher = dynamic_cast*>(sender()); if (!watcher) return; watcher->deleteLater(); if (!SetLoading(QString())) return; QDialog::accept(); } bool EditTagDialog::eventFilter(QObject* o, QEvent* e) { if (o == ui_->art) { switch (e->type()) { case QEvent::MouseButtonRelease: cover_menu_->popup(static_cast(e)->globalPos()); break; case QEvent::DragEnter: { QDragEnterEvent* event = static_cast(e); if (AlbumCoverChoiceController::CanAcceptDrag(event)) { event->acceptProposedAction(); } break; } case QEvent::Drop: { const QDropEvent* event = static_cast(e); const QModelIndexList sel = ui_->song_list->selectionModel()->selectedIndexes(); Song* song = GetFirstSelected(); const QString cover = album_cover_choice_controller_->SaveCover(song, event); if (!cover.isEmpty()) { UpdateCoverOf(*song, sel, cover); } break; } default: break; } } return false; } void EditTagDialog::showEvent(QShowEvent* e) { // Set the dialog's height to the smallest possible resize(width(), sizeHint().height()); // Restore the tab that was current last time. QSettings s; s.beginGroup(kSettingsGroup); ui_->tab_widget->setCurrentIndex(s.value("current_tab").toInt()); QDialog::showEvent(e); } void EditTagDialog::hideEvent(QHideEvent* e) { // Save the current tab QSettings s; s.beginGroup(kSettingsGroup); s.setValue("current_tab", ui_->tab_widget->currentIndex()); QDialog::hideEvent(e); } void EditTagDialog::SongRated(float rating) { const QModelIndexList sel = ui_->song_list->selectionModel()->selectedIndexes(); if (sel.isEmpty()) return; Song* song = &data_[sel.first().row()].original_; if (!song->is_valid() || song->id() == -1) return; song->set_rating(rating); app_->library_backend()->UpdateSongRatingAsync(song->id(), rating); } void EditTagDialog::ResetPlayCounts() { const QModelIndexList sel = ui_->song_list->selectionModel()->selectedIndexes(); if (sel.isEmpty()) return; Song* song = &data_[sel.first().row()].original_; if (!song->is_valid() || song->id() == -1) return; if (QMessageBox::question( this, tr("Reset play counts"), tr("Are you sure you want to reset this song's statistics?"), QMessageBox::Reset, QMessageBox::Cancel) != QMessageBox::Reset) { return; } song->set_playcount(0); song->set_skipcount(0); song->set_lastplayed(-1); song->set_score(0); app_->library_backend()->ResetStatisticsAsync(song->id()); UpdateStatisticsTab(*song); } void EditTagDialog::FetchTag() { const QModelIndexList sel = ui_->song_list->selectionModel()->selectedIndexes(); SongList songs; for (const QModelIndex& index : sel) { Song song = data_[index.row()].original_; if (!song.is_valid()) { continue; } songs << song; } if (songs.isEmpty()) return; results_dialog_->Init(songs); tag_fetcher_->StartFetch(songs); results_dialog_->show(); } void EditTagDialog::FetchTagSongChosen(const Song& original_song, const Song& new_metadata) { const QString filename = original_song.url().toLocalFile(); // Find the song with this filename for (int i = 0; i < data_.count(); ++i) { Data* data = &data_[i]; if (data->original_.url().toLocalFile() != filename) continue; // Is it currently being displayed in the UI? if (ui_->song_list->currentRow() == i) { // Yes! We can just set the fields in the UI ui_->title->set_text(new_metadata.title()); ui_->artist->set_text(new_metadata.artist()); ui_->album->set_text(new_metadata.album()); ui_->track->setValue(new_metadata.track()); ui_->year->setValue(new_metadata.year()); } else { data->current_.set_title(new_metadata.title()); data->current_.set_artist(new_metadata.artist()); data->current_.set_album(new_metadata.album()); data->current_.set_track(new_metadata.track()); data->current_.set_year(new_metadata.year()); } break; } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/edittagdialog.h000066400000000000000000000107311260417502300235470ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef EDITTAGDIALOG_H #define EDITTAGDIALOG_H #include #include #include "config.h" #include "core/song.h" #include "covers/albumcoverloaderoptions.h" #include "musicbrainz/tagfetcher.h" #include "playlist/playlistitem.h" #include "widgets/lineedit.h" #include "trackselectiondialog.h" class Application; class AlbumCoverChoiceController; class LibraryBackend; class Ui_EditTagDialog; class QAbstractButton; class QItemSelection; class QLabel; class QPushButton; class EditTagDialog : public QDialog { Q_OBJECT public: EditTagDialog(Application* app, QWidget* parent = nullptr); ~EditTagDialog(); static const char* kHintText; static const char* kSettingsGroup; void SetSongs(const SongList& songs, const PlaylistItemList& items = PlaylistItemList()); PlaylistItemList playlist_items() const { return playlist_items_; } void accept(); signals: void Error(const QString& message); protected: bool eventFilter(QObject* o, QEvent* e); void showEvent(QShowEvent*); void hideEvent(QHideEvent*); private slots: void SetSongsFinished(); void AcceptFinished(); void SelectionChanged(); void FieldValueEdited(); void ResetField(); void ButtonClicked(QAbstractButton* button); void SongRated(float rating); void ResetPlayCounts(); void FetchTag(); void FetchTagSongChosen(const Song& original_song, const Song& new_metadata); void ArtLoaded(quint64 id, const QImage& scaled, const QImage& original); void LoadCoverFromFile(); void SaveCoverToFile(); void LoadCoverFromURL(); void SearchForCover(); void UnsetCover(); void ShowCover(); void PreviousSong(); void NextSong(); private: struct Data { Data(const Song& song = Song()) : original_(song), current_(song) {} static QVariant value(const Song& song, const QString& id); QVariant original_value(const QString& id) const { return value(original_, id); } QVariant current_value(const QString& id) const { return value(current_, id); } void set_value(const QString& id, const QVariant& value); Song original_; Song current_; }; struct FieldData { FieldData(QLabel* label = nullptr, QWidget* editor = nullptr, const QString& id = QString()) : label_(label), editor_(editor), id_(id) {} QLabel* label_; QWidget* editor_; QString id_; }; Song* GetFirstSelected(); void UpdateCoverOf(const Song& selected, const QModelIndexList& sel, const QString& cover); bool DoesValueVary(const QModelIndexList& sel, const QString& id) const; bool IsValueModified(const QModelIndexList& sel, const QString& id) const; void InitFieldValue(const FieldData& field, const QModelIndexList& sel); void UpdateFieldValue(const FieldData& field, const QModelIndexList& sel); void ResetFieldValue(const FieldData& field, const QModelIndexList& sel); void UpdateSummaryTab(const Song& song); void UpdateStatisticsTab(const Song& song); bool SetLoading(const QString& message); void SetSongListVisibility(bool visible); // Called by QtConcurrentRun QList LoadData(const SongList& songs) const; void SaveData(const QList& data); private: Ui_EditTagDialog* ui_; Application* app_; AlbumCoverChoiceController* album_cover_choice_controller_; bool loading_; PlaylistItemList playlist_items_; QList data_; QList fields_; bool ignore_edits_; TagFetcher* tag_fetcher_; AlbumCoverLoaderOptions cover_options_; quint64 cover_art_id_; bool cover_art_is_set_; // A copy of the original, unscaled album cover. QImage original_; QMenu* cover_menu_; QPushButton* previous_button_; QPushButton* next_button_; TrackSelectionDialog* results_dialog_; }; #endif // EDITTAGDIALOG_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/edittagdialog.ui000066400000000000000000001062751260417502300237460ustar00rootroot00000000000000 EditTagDialog 0 0 863 635 Edit track information :/icon.png:/icon.png Qt::Horizontal QAbstractItemView::ExtendedSelection 1 Summary 0 0 124 124 QFrame::StyledPanel Qt::AlignCenter 2 0 0 QTextEdit { background: transparent; } QFrame::NoFrame Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse 0 0 Change cover art 0 0 Reset play counts Qt::Horizontal 40 20 Qt::Horizontal 18 0 0 Length true 0 0 150 0 150 0 true Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse 0 0 Play count true 0 0 true Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse 0 0 BPM true 0 0 0 0 true Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse 0 0 Skip count true true Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse 0 0 Bit rate true 0 0 0 0 true Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse 0 0 Last played true true Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse 0 0 Sample rate true 0 0 true Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse 0 0 Score true true Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse 0 0 File size true 0 0 true Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse 0 0 Rating true 0 0 0 0 0 0 File type true 0 0 true Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse 0 0 Date modified true true Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse 0 0 Date created true true Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse File name true QLineEdit { background: transparent; } false true Qt::Vertical 20 40 0 0 528 514 Edit tags Title title true false Track track QAbstractSpinBox::CorrectToNearestValue 9999 false true Artist artist true false Disc disc QAbstractSpinBox::CorrectToNearestValue 9999 false true Album album true false Year year QAbstractSpinBox::CorrectToNearestValue 9999 false true Album artist albumartist true false Composer composer true false Performer performer true false Grouping grouping true false Genre genre true false Complete tags automatically :/providers/musicbrainz.png:/providers/musicbrainz.png 38 22 0 0 100 0 Lyrics lyrics true false 100 0 Comment comment true false QDialogButtonBox::Discard|QDialogButtonBox::Save BusyIndicator QWidget
widgets/busyindicator.h
LineEdit QLineEdit
widgets/lineedit.h
RatingWidget QWidget
widgets/ratingwidget.h
1
TextEdit QTextEdit
widgets/lineedit.h
SpinBox QSpinBox
widgets/lineedit.h
button_box accepted() EditTagDialog accept() 65 552 84 533 button_box rejected() EditTagDialog reject() 236 542 242 532
clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/equalizer.cpp000066400000000000000000000264711260417502300233120ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "equalizer.h" #include "ui_equalizer.h" #include #include #include #include #include #include "ui/iconloader.h" #include "widgets/equalizerslider.h" // We probably don't need to translate these, right? const char* Equalizer::kGainText[] = {"60", "170", "310", "600", "1k", "3k", "6k", "12k", "14k", "16k"}; const char* Equalizer::kSettingsGroup = "Equalizer"; Equalizer::Equalizer(QWidget* parent) : QDialog(parent), ui_(new Ui_Equalizer), loading_(false) { ui_->setupUi(this); // Icons ui_->preset_del->setIcon(IconLoader::Load("list-remove")); ui_->preset_save->setIcon(IconLoader::Load("document-save")); preamp_ = AddSlider(tr("Pre-amp")); QFrame* line = new QFrame(ui_->slider_container); line->setFrameShape(QFrame::VLine); line->setFrameShadow(QFrame::Sunken); ui_->slider_container->layout()->addWidget(line); for (int i = 0; i < kBands; ++i) gain_[i] = AddSlider(kGainText[i]); // Must be done before the signals are connected ReloadSettings(); connect(ui_->enable, SIGNAL(toggled(bool)), SIGNAL(EnabledChanged(bool))); connect(ui_->enable, SIGNAL(toggled(bool)), ui_->slider_container, SLOT(setEnabled(bool))); connect(ui_->enable, SIGNAL(toggled(bool)), SLOT(Save())); connect(ui_->preset, SIGNAL(currentIndexChanged(int)), SLOT(PresetChanged(int))); connect(ui_->preset_save, SIGNAL(clicked()), SLOT(SavePreset())); connect(ui_->preset_del, SIGNAL(clicked()), SLOT(DelPreset())); connect(ui_->balance_slider, SIGNAL(valueChanged(int)), SLOT(StereoSliderChanged(int))); QShortcut* close = new QShortcut(QKeySequence::Close, this); connect(close, SIGNAL(activated()), SLOT(close())); } Equalizer::~Equalizer() { delete ui_; } void Equalizer::ReloadSettings() { QSettings s; s.beginGroup(kSettingsGroup); presets_.clear(); ui_->preset->clear(); // Load presets int count = s.beginReadArray("presets"); for (int i = 0; i < count; ++i) { s.setArrayIndex(i); AddPreset(s.value("name").toString(), s.value("params").value()); } s.endArray(); if (count == 0) LoadDefaultPresets(); // Selected preset QString selected_preset = s.value("selected_preset", "Custom").toString(); QString selected_preset_display_name = QString(tr(qPrintable(selected_preset))); int selected_index = ui_->preset->findText(selected_preset_display_name); if (selected_index != -1) ui_->preset->setCurrentIndex(selected_index); // Enabled? ui_->enable->setChecked(s.value("enabled", false).toBool()); ui_->slider_container->setEnabled(ui_->enable->isChecked()); int stereo_balance = s.value("stereo_balance", 0).toInt(); ui_->balance_slider->setValue(stereo_balance); StereoSliderChanged(stereo_balance); PresetChanged(selected_preset); } void Equalizer::LoadDefaultPresets() { AddPreset(QT_TRANSLATE_NOOP("Equalizer", "Custom"), Params(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)); AddPreset(QT_TRANSLATE_NOOP("Equalizer", "Classical"), Params(0, 0, 0, 0, 0, 0, -40, -40, -40, -50)); AddPreset(QT_TRANSLATE_NOOP("Equalizer", "Club"), Params(0, 0, 20, 30, 30, 30, 20, 0, 0, 0)); AddPreset(QT_TRANSLATE_NOOP("Equalizer", "Dance"), Params(50, 35, 10, 0, 0, -30, -40, -40, 0, 0)); // Dubstep equalizer created by Devyn Collier Johnson AddPreset(QT_TRANSLATE_NOOP("Equalizer", "Dubstep"), Params(0, 36, 85, 58, 30, 0, 36, 60, 96, 62, 0)); AddPreset(QT_TRANSLATE_NOOP("Equalizer", "Full Bass"), Params(70, 70, 70, 40, 20, -45, -50, -55, -55, -55)); AddPreset(QT_TRANSLATE_NOOP("Equalizer", "Full Treble"), Params(-50, -50, -50, -25, 15, 55, 80, 80, 80, 85)); AddPreset(QT_TRANSLATE_NOOP("Equalizer", "Full Bass + Treble"), Params(35, 30, 0, -40, -25, 10, 45, 55, 60, 60)); // HipHop equalizer created by Devyn Collier Johnson AddPreset(QT_TRANSLATE_NOOP("Equalizer", "HipHop"), Params(88, 100, 100, -23, -27, 12, 100, 0, 50, 73, 0)); // Kuduro equalizer created by Devyn Collier Johnson AddPreset(QT_TRANSLATE_NOOP("Equalizer", "Kuduro"), Params(65, -100, 15, 62, -38, 88, 100, -46, 23, -100, 0)); AddPreset(QT_TRANSLATE_NOOP("Equalizer", "Laptop/Headphones"), Params(25, 50, 25, -20, 0, -30, -40, -40, 0, 0)); AddPreset(QT_TRANSLATE_NOOP("Equalizer", "Large Hall"), Params(50, 50, 30, 30, 0, -25, -25, -25, 0, 0)); AddPreset(QT_TRANSLATE_NOOP("Equalizer", "Live"), Params(-25, 0, 20, 25, 30, 30, 20, 15, 15, 10)); AddPreset(QT_TRANSLATE_NOOP("Equalizer", "Party"), Params(35, 35, 0, 0, 0, 0, 0, 0, 35, 35)); AddPreset(QT_TRANSLATE_NOOP("Equalizer", "Pop"), Params(-10, 25, 35, 40, 25, -5, -15, -15, -10, -10)); // Psychedelic equalizer created by Devyn Collier Johnson AddPreset(QT_TRANSLATE_NOOP("Equalizer", "Psychedelic"), Params(100, 100, 0, 40, 0, 67, 79, 0, 30, -100, 37)); AddPreset(QT_TRANSLATE_NOOP("Equalizer", "Reggae"), Params(0, 0, -5, -30, 0, -35, -35, 0, 0, 0)); AddPreset(QT_TRANSLATE_NOOP("Equalizer", "Rock"), Params(40, 25, -30, -40, -20, 20, 45, 55, 55, 55)); AddPreset(QT_TRANSLATE_NOOP("Equalizer", "Soft"), Params(25, 10, -5, -15, -5, 20, 45, 50, 55, 60)); AddPreset(QT_TRANSLATE_NOOP("Equalizer", "Ska"), Params(-15, -25, -25, -5, 20, 30, 45, 50, 55, 50)); AddPreset(QT_TRANSLATE_NOOP("Equalizer", "Soft Rock"), Params(20, 20, 10, -5, -25, -30, -20, -5, 15, 45)); AddPreset(QT_TRANSLATE_NOOP("Equalizer", "Techno"), Params(40, 30, 0, -30, -25, 0, 40, 50, 50, 45)); AddPreset(QT_TRANSLATE_NOOP("Equalizer", "Zero"), Params(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)); } void Equalizer::AddPreset(const QString& name, const Params& params) { QString name_displayed = tr(qPrintable(name)); presets_[name] = params; if (ui_->preset->findText(name_displayed) == -1) { ui_->preset->addItem(name_displayed, // name to display (translated) QVariant(name) // original name ); } } void Equalizer::PresetChanged(int index) { PresetChanged(ui_->preset->itemData(index).toString()); } void Equalizer::PresetChanged(const QString& name) { if (presets_.contains(last_preset_)) { if (presets_[last_preset_] != current_params()) { SaveCurrentPreset(); } } last_preset_ = name; Params& p = presets_[name]; loading_ = true; preamp_->set_value(p.preamp); for (int i = 0; i < kBands; ++i) gain_[i]->set_value(p.gain[i]); loading_ = false; ParametersChanged(); Save(); } void Equalizer::SavePreset() { QString name = SaveCurrentPreset(); if (!name.isEmpty()) { last_preset_ = name; ui_->preset->setCurrentIndex(ui_->preset->findText(tr(qPrintable(name)))); } } QString Equalizer::SaveCurrentPreset() { QString name = QInputDialog::getText(this, tr("Save preset"), tr("Name"), QLineEdit::Normal, tr(qPrintable(last_preset_))); ; if (name.isEmpty()) return QString(); AddPreset(name, current_params()); Save(); return name; } void Equalizer::DelPreset() { QString name = ui_->preset->itemData(ui_->preset->currentIndex()).toString(); QString name_displayed = ui_->preset->currentText(); if (!presets_.contains(name) || name.isEmpty()) return; int ret = QMessageBox::question( this, tr("Delete preset"), tr("Are you sure you want to delete the \"%1\" preset?") .arg(name_displayed), QMessageBox::Yes, QMessageBox::No); if (ret == QMessageBox::No) return; presets_.remove(name); ui_->preset->removeItem(ui_->preset->currentIndex()); Save(); } EqualizerSlider* Equalizer::AddSlider(const QString& label) { EqualizerSlider* ret = new EqualizerSlider(label, ui_->slider_container); ui_->slider_container->layout()->addWidget(ret); connect(ret, SIGNAL(ValueChanged(int)), SLOT(ParametersChanged())); return ret; } bool Equalizer::is_enabled() const { return ui_->enable->isChecked(); } int Equalizer::preamp_value() const { return preamp_->value(); } QList Equalizer::gain_values() const { QList ret; for (int i = 0; i < kBands; ++i) { ret << gain_[i]->value(); } return ret; } Equalizer::Params Equalizer::current_params() const { QList gains = gain_values(); Params ret; ret.preamp = preamp_value(); std::copy(gains.begin(), gains.end(), ret.gain); return ret; } float Equalizer::stereo_balance() const { return qBound(-1.0f, ui_->balance_slider->value() / 100.0f, 1.0f); } void Equalizer::ParametersChanged() { if (loading_) return; emit ParametersChanged(preamp_value(), gain_values()); } void Equalizer::Save() { QSettings s; s.beginGroup(kSettingsGroup); // Presets s.beginWriteArray("presets", presets_.count()); int i = 0; for (const QString& name : presets_.keys()) { s.setArrayIndex(i++); s.setValue("name", name); s.setValue("params", QVariant::fromValue(presets_[name])); } s.endArray(); // Selected preset s.setValue("selected_preset", ui_->preset->itemData(ui_->preset->currentIndex()).toString()); // Enabled? s.setValue("enabled", ui_->enable->isChecked()); s.setValue("stereo_balance", ui_->balance_slider->value()); } void Equalizer::closeEvent(QCloseEvent* e) { QString name = ui_->preset->currentText(); if (!presets_.contains(name)) return; if (presets_[name] == current_params()) return; SavePreset(); } Equalizer::Params::Params() : preamp(0) { for (int i = 0; i < Equalizer::kBands; ++i) gain[i] = 0; } Equalizer::Params::Params(int g0, int g1, int g2, int g3, int g4, int g5, int g6, int g7, int g8, int g9, int pre) : preamp(pre) { gain[0] = g0; gain[1] = g1; gain[2] = g2; gain[3] = g3; gain[4] = g4; gain[5] = g5; gain[6] = g6; gain[7] = g7; gain[8] = g8; gain[9] = g9; } bool Equalizer::Params::operator==(const Equalizer::Params& other) const { if (preamp != other.preamp) return false; for (int i = 0; i < Equalizer::kBands; ++i) { if (gain[i] != other.gain[i]) return false; } return true; } bool Equalizer::Params::operator!=(const Equalizer::Params& other) const { return !(*this == other); } void Equalizer::StereoSliderChanged(int value) { emit StereoBalanceChanged(stereo_balance()); Save(); } QDataStream& operator<<(QDataStream& s, const Equalizer::Params& p) { s << p.preamp; for (int i = 0; i < Equalizer::kBands; ++i) s << p.gain[i]; return s; } QDataStream& operator>>(QDataStream& s, Equalizer::Params& p) { s >> p.preamp; for (int i = 0; i < Equalizer::kBands; ++i) s >> p.gain[i]; return s; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/equalizer.h000066400000000000000000000047561260417502300227610ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef EQUALIZER_H #define EQUALIZER_H #include #include #include class EqualizerSlider; class Ui_Equalizer; class Equalizer : public QDialog { Q_OBJECT public: Equalizer(QWidget* parent = nullptr); ~Equalizer(); static const int kBands = 10; static const char* kGainText[kBands]; static const char* kSettingsGroup; struct Params { Params(); Params(int g0, int g1, int g2, int g3, int g4, int g5, int g6, int g7, int g8, int g9, int pre = 0); bool operator==(const Params& other) const; bool operator!=(const Params& other) const; int preamp; int gain[kBands]; }; bool is_enabled() const; int preamp_value() const; QList gain_values() const; Params current_params() const; float stereo_balance() const; signals: void EnabledChanged(bool enabled); void ParametersChanged(int preamp, const QList& band_gains); void StereoBalanceChanged(float balance); protected: void closeEvent(QCloseEvent*); private slots: void ParametersChanged(); void PresetChanged(const QString& name); void PresetChanged(int index); void SavePreset(); void DelPreset(); void Save(); void StereoSliderChanged(int value); private: EqualizerSlider* AddSlider(const QString& label); void LoadDefaultPresets(); void AddPreset(const QString& name, const Params& params); void ReloadSettings(); QString SaveCurrentPreset(); private: Ui_Equalizer* ui_; bool loading_; QString last_preset_; EqualizerSlider* preamp_; EqualizerSlider* gain_[kBands]; QMap presets_; }; Q_DECLARE_METATYPE(Equalizer::Params); QDataStream& operator<<(QDataStream& s, const Equalizer::Params& p); QDataStream& operator>>(QDataStream& s, Equalizer::Params& p); #endif // EQUALIZER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/equalizer.ui000066400000000000000000000101021260417502300231250ustar00rootroot00000000000000 Equalizer 0 0 435 265 Equalizer :/icon.png:/icon.png Preset: 0 0 Save preset Delete preset Qt::Horizontal Enable equalizer false 0 0 Left Qt::AlignLeft | Qt::AlignBottom 11 Balance Qt::AlignCenter Right Qt::AlignRight | Qt::AlignBottom 11 100 -100 Qt::Horizontal QSlider::TicksBelow 10 10 100 preset preset_save clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/flowlayout.cpp000066400000000000000000000127721260417502300235150ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor ** the names of its contributors may be used to endorse or promote ** products derived from this software without specific prior written ** permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "flowlayout.h" //! [1] FlowLayout::FlowLayout(QWidget* parent, int margin, int hSpacing, int vSpacing) : QLayout(parent), m_hSpace(hSpacing), m_vSpace(vSpacing) { setContentsMargins(margin, margin, margin, margin); } FlowLayout::FlowLayout(int margin, int hSpacing, int vSpacing) : m_hSpace(hSpacing), m_vSpace(vSpacing) { setContentsMargins(margin, margin, margin, margin); } //! [1] //! [2] FlowLayout::~FlowLayout() { QLayoutItem* item; while ((item = takeAt(0))) delete item; } //! [2] //! [3] void FlowLayout::addItem(QLayoutItem* item) { itemList.append(item); } //! [3] //! [4] int FlowLayout::horizontalSpacing() const { if (m_hSpace >= 0) { return m_hSpace; } else { return smartSpacing(QStyle::PM_LayoutHorizontalSpacing); } } int FlowLayout::verticalSpacing() const { if (m_vSpace >= 0) { return m_vSpace; } else { return smartSpacing(QStyle::PM_LayoutVerticalSpacing); } } //! [4] //! [5] int FlowLayout::count() const { return itemList.size(); } QLayoutItem* FlowLayout::itemAt(int index) const { return itemList.value(index); } QLayoutItem* FlowLayout::takeAt(int index) { if (index >= 0 && index < itemList.size()) return itemList.takeAt(index); else return 0; } //! [5] //! [6] Qt::Orientations FlowLayout::expandingDirections() const { return 0; } //! [6] //! [7] bool FlowLayout::hasHeightForWidth() const { return true; } int FlowLayout::heightForWidth(int width) const { int height = doLayout(QRect(0, 0, width, 0), true); return height; } //! [7] //! [8] void FlowLayout::setGeometry(const QRect& rect) { QLayout::setGeometry(rect); doLayout(rect, false); } QSize FlowLayout::sizeHint() const { return minimumSize(); } QSize FlowLayout::minimumSize() const { QSize size; for (QLayoutItem* item : itemList) size = size.expandedTo(item->minimumSize()); size += QSize(2 * margin(), 2 * margin()); return size; } //! [8] //! [9] int FlowLayout::doLayout(const QRect& rect, bool testOnly) const { int left, top, right, bottom; getContentsMargins(&left, &top, &right, &bottom); QRect effectiveRect = rect.adjusted(+left, +top, -right, -bottom); int x = effectiveRect.x(); int y = effectiveRect.y(); int lineHeight = 0; //! [9] //! [10] for (QLayoutItem* item : itemList) { QWidget* wid = item->widget(); int spaceX = horizontalSpacing(); if (spaceX == -1) spaceX = wid->style()->layoutSpacing( QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Horizontal); int spaceY = verticalSpacing(); if (spaceY == -1) spaceY = wid->style()->layoutSpacing( QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Vertical); //! [10] //! [11] int nextX = x + item->sizeHint().width() + spaceX; if (nextX - spaceX > effectiveRect.right() && lineHeight > 0) { x = effectiveRect.x(); y = y + lineHeight + spaceY; nextX = x + item->sizeHint().width() + spaceX; lineHeight = 0; } if (!testOnly) item->setGeometry(QRect(QPoint(x, y), item->sizeHint())); x = nextX; lineHeight = qMax(lineHeight, item->sizeHint().height()); } return y + lineHeight - rect.y() + bottom; } //! [11] //! [12] int FlowLayout::smartSpacing(QStyle::PixelMetric pm) const { QObject* parent = this->parent(); if (!parent) { return -1; } else if (parent->isWidgetType()) { QWidget* pw = static_cast(parent); return pw->style()->pixelMetric(pm, 0, pw); } else { return static_cast(parent)->spacing(); } } //! [12] clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/flowlayout.h000066400000000000000000000056751260417502300231660ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor ** the names of its contributors may be used to endorse or promote ** products derived from this software without specific prior written ** permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef FLOWLAYOUT_H #define FLOWLAYOUT_H #include #include #include #include //! [0] class FlowLayout : public QLayout { public: FlowLayout(QWidget* parent, int margin = -1, int hSpacing = -1, int vSpacing = -1); FlowLayout(int margin = -1, int hSpacing = -1, int vSpacing = -1); ~FlowLayout(); void addItem(QLayoutItem* item); int horizontalSpacing() const; int verticalSpacing() const; Qt::Orientations expandingDirections() const; bool hasHeightForWidth() const; int heightForWidth(int) const; int count() const; QLayoutItem* itemAt(int index) const; QSize minimumSize() const; void setGeometry(const QRect& rect); QSize sizeHint() const; QLayoutItem* takeAt(int index); private: int doLayout(const QRect& rect, bool testOnly) const; int smartSpacing(QStyle::PixelMetric pm) const; QList itemList; int m_hSpace; int m_vSpace; }; //! [0] #endif clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/globalshortcutgrabber.cpp000066400000000000000000000046451260417502300256710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "globalshortcutgrabber.h" #include "ui_globalshortcutgrabber.h" #include #include GlobalShortcutGrabber::GlobalShortcutGrabber(QWidget* parent) : QDialog(parent), ui_(new Ui::GlobalShortcutGrabber) { ui_->setupUi(this); modifier_keys_ << Qt::Key_Shift << Qt::Key_Control << Qt::Key_Meta << Qt::Key_Alt << Qt::Key_AltGr; } GlobalShortcutGrabber::~GlobalShortcutGrabber() { delete ui_; } QKeySequence GlobalShortcutGrabber::GetKey(const QString& name) { ui_->label->setText(tr("Press a key combination to use for %1...").arg(name)); ui_->combo->clear(); ret_ = QKeySequence(); if (exec() == QDialog::Rejected) return QKeySequence(); return ret_; } void GlobalShortcutGrabber::showEvent(QShowEvent* e) { grabKeyboard(); QDialog::showEvent(e); } void GlobalShortcutGrabber::hideEvent(QHideEvent* e) { releaseKeyboard(); QDialog::hideEvent(e); } void GlobalShortcutGrabber::grabKeyboard() { #ifdef Q_OS_DARWIN SetupMacEventHandler(); #endif QDialog::grabKeyboard(); } void GlobalShortcutGrabber::releaseKeyboard() { #ifdef Q_OS_DARWIN TeardownMacEventHandler(); #endif QDialog::releaseKeyboard(); } bool GlobalShortcutGrabber::event(QEvent* e) { if (e->type() == QEvent::ShortcutOverride) { QKeyEvent* ke = static_cast(e); if (modifier_keys_.contains(ke->key())) ret_ = QKeySequence(ke->modifiers()); else ret_ = QKeySequence(ke->modifiers() | ke->key()); UpdateText(); if (!modifier_keys_.contains(ke->key())) accept(); return true; } return QDialog::event(e); } void GlobalShortcutGrabber::UpdateText() { ui_->combo->setText("" + ret_.toString(QKeySequence::NativeText) + ""); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/globalshortcutgrabber.h000066400000000000000000000030321260417502300253230ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef GLOBALSHORTCUTGRABBER_H #define GLOBALSHORTCUTGRABBER_H #include class MacMonitorWrapper; class Ui_GlobalShortcutGrabber; #ifdef __OBJC__ @class NSEvent; #else class NSEvent; #endif class GlobalShortcutGrabber : public QDialog { Q_OBJECT public: GlobalShortcutGrabber(QWidget* parent = nullptr); ~GlobalShortcutGrabber(); QKeySequence GetKey(const QString& name); protected: bool event(QEvent*); void showEvent(QShowEvent*); void hideEvent(QHideEvent*); void grabKeyboard(); void releaseKeyboard(); private: void UpdateText(); void SetupMacEventHandler(); void TeardownMacEventHandler(); bool HandleMacEvent(NSEvent*); Ui_GlobalShortcutGrabber* ui_; QKeySequence ret_; QList modifier_keys_; MacMonitorWrapper* wrapper_; }; #endif // GLOBALSHORTCUTGRABBER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/globalshortcutgrabber.mm000066400000000000000000000040011260417502300255020ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "globalshortcutgrabber.h" #import #import #import #import #include #import "core/mac_utilities.h" class MacMonitorWrapper { public: explicit MacMonitorWrapper(id monitor) : local_monitor_(monitor) {} ~MacMonitorWrapper() { [NSEvent removeMonitor:local_monitor_]; } private: id local_monitor_; Q_DISABLE_COPY(MacMonitorWrapper); }; bool GlobalShortcutGrabber::HandleMacEvent(NSEvent* event) { ret_ = mac::KeySequenceFromNSEvent(event); UpdateText(); if ([[event charactersIgnoringModifiers] length] != 0) { accept(); return true; } return ret_ == QKeySequence(Qt::Key_Escape); } void GlobalShortcutGrabber::SetupMacEventHandler() { id monitor = [NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask handler:^(NSEvent* event) { return HandleMacEvent(event) ? event : nil; }]; wrapper_ = new MacMonitorWrapper(monitor); } void GlobalShortcutGrabber::TeardownMacEventHandler() { delete wrapper_; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/globalshortcutgrabber.ui000066400000000000000000000041601260417502300255140ustar00rootroot00000000000000 GlobalShortcutGrabber 0 0 418 110 Press a key :/icon.png:/icon.png Press a key combination to use for %1... Qt::AlignCenter Qt::RichText Qt::AlignCenter Qt::Horizontal QDialogButtonBox::Cancel buttonBox accepted() GlobalShortcutGrabber accept() 248 254 157 274 buttonBox rejected() GlobalShortcutGrabber reject() 316 260 286 274 clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/globalshortcutssettingspage.cpp000066400000000000000000000135441260417502300271430ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "globalshortcutgrabber.h" #include "globalshortcutssettingspage.h" #include "ui_globalshortcutssettingspage.h" #include "core/globalshortcuts.h" #include "core/logging.h" #include "core/utilities.h" #include "ui/iconloader.h" #include "ui/settingsdialog.h" #include #include #include #include #include #include #include GlobalShortcutsSettingsPage::GlobalShortcutsSettingsPage(SettingsDialog* dialog) : SettingsPage(dialog), ui_(new Ui_GlobalShortcutsSettingsPage), initialised_(false), grabber_(new GlobalShortcutGrabber) { ui_->setupUi(this); ui_->shortcut_options->setEnabled(false); ui_->list->header()->setResizeMode(QHeaderView::ResizeToContents); setWindowIcon(IconLoader::Load("input-keyboard")); settings_.beginGroup(GlobalShortcuts::kSettingsGroup); connect(ui_->list, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), SLOT(ItemClicked(QTreeWidgetItem*))); connect(ui_->radio_none, SIGNAL(clicked()), SLOT(NoneClicked())); connect(ui_->radio_default, SIGNAL(clicked()), SLOT(DefaultClicked())); connect(ui_->radio_custom, SIGNAL(clicked()), SLOT(ChangeClicked())); connect(ui_->change, SIGNAL(clicked()), SLOT(ChangeClicked())); connect(ui_->gnome_open, SIGNAL(clicked()), SLOT(OpenGnomeKeybindingProperties())); } GlobalShortcutsSettingsPage::~GlobalShortcutsSettingsPage() { delete ui_; } bool GlobalShortcutsSettingsPage::IsEnabled() const { return true; } void GlobalShortcutsSettingsPage::Load() { GlobalShortcuts* manager = dialog()->global_shortcuts_manager(); if (!initialised_) { initialised_ = true; connect(ui_->mac_open, SIGNAL(clicked()), manager, SLOT(ShowMacAccessibilityDialog())); if (!manager->IsGsdAvailable()) { ui_->gnome_container->hide(); } for (const GlobalShortcuts::Shortcut& s : manager->shortcuts().values()) { Shortcut shortcut; shortcut.s = s; shortcut.key = s.action->shortcut(); shortcut.item = new QTreeWidgetItem( ui_->list, QStringList() << s.action->text() << s.action->shortcut().toString( QKeySequence::NativeText)); shortcut.item->setData(0, Qt::UserRole, s.id); shortcuts_[s.id] = shortcut; } ui_->list->sortItems(0, Qt::AscendingOrder); ItemClicked(ui_->list->topLevelItem(0)); } for (const Shortcut& s : shortcuts_.values()) { SetShortcut(s.s.id, s.s.action->shortcut()); } bool use_gnome = settings_.value("use_gnome", true).toBool(); if (ui_->gnome_container->isVisibleTo(this)) { ui_->gnome_checkbox->setChecked(use_gnome); } ui_->mac_container->setVisible(!manager->IsMacAccessibilityEnabled()); } void GlobalShortcutsSettingsPage::SetShortcut(const QString& id, const QKeySequence& key) { Shortcut& shortcut = shortcuts_[id]; shortcut.key = key; shortcut.item->setText(1, key.toString(QKeySequence::NativeText)); } void GlobalShortcutsSettingsPage::Save() { for (const Shortcut& s : shortcuts_.values()) { s.s.action->setShortcut(s.key); s.s.shortcut->setKey(s.key); settings_.setValue(s.s.id, s.key.toString()); } settings_.setValue("use_gnome", ui_->gnome_checkbox->isChecked()); dialog()->global_shortcuts_manager()->ReloadSettings(); } void GlobalShortcutsSettingsPage::ItemClicked(QTreeWidgetItem* item) { current_id_ = item->data(0, Qt::UserRole).toString(); Shortcut& shortcut = shortcuts_[current_id_]; // Enable options ui_->shortcut_options->setEnabled(true); ui_->shortcut_options->setTitle( tr("Shortcut for %1").arg(shortcut.s.action->text())); if (shortcut.key == shortcut.s.default_key) ui_->radio_default->setChecked(true); else if (shortcut.key.isEmpty()) ui_->radio_none->setChecked(true); else ui_->radio_custom->setChecked(true); } void GlobalShortcutsSettingsPage::NoneClicked() { SetShortcut(current_id_, QKeySequence()); } void GlobalShortcutsSettingsPage::DefaultClicked() { SetShortcut(current_id_, shortcuts_[current_id_].s.default_key); } void GlobalShortcutsSettingsPage::ChangeClicked() { GlobalShortcuts* manager = dialog()->global_shortcuts_manager(); manager->Unregister(); QKeySequence key = grabber_->GetKey(shortcuts_[current_id_].s.action->text()); manager->Register(); if (key.isEmpty()) return; // Check if this key sequence is used by any other actions for (const QString& id : shortcuts_.keys()) { if (shortcuts_[id].key == key) SetShortcut(id, QKeySequence()); } ui_->radio_custom->setChecked(true); SetShortcut(current_id_, key); } void GlobalShortcutsSettingsPage::OpenGnomeKeybindingProperties() { if (!QProcess::startDetached("gnome-keybinding-properties")) { if (!QProcess::startDetached("gnome-control-center", QStringList() << "keyboard")) { QMessageBox::warning(this, "Error", tr("The \"%1\" command could not be started.") .arg("gnome-keybinding-properties")); } } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/globalshortcutssettingspage.h000066400000000000000000000034741260417502300266110ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef GLOBALSHORTCUTSSETTINGSPAGE_H #define GLOBALSHORTCUTSSETTINGSPAGE_H #include #include #include #include "core/globalshortcuts.h" #include "ui/settingspage.h" class QTreeWidgetItem; class Ui_GlobalShortcutsSettingsPage; class GlobalShortcutGrabber; class GlobalShortcutsSettingsPage : public SettingsPage { Q_OBJECT public: GlobalShortcutsSettingsPage(SettingsDialog* dialog); ~GlobalShortcutsSettingsPage(); bool IsEnabled() const; void Load(); void Save(); private slots: void ItemClicked(QTreeWidgetItem*); void NoneClicked(); void DefaultClicked(); void ChangeClicked(); void OpenGnomeKeybindingProperties(); private: struct Shortcut { GlobalShortcuts::Shortcut s; QKeySequence key; QTreeWidgetItem* item; }; void SetShortcut(const QString& id, const QKeySequence& key); private: Ui_GlobalShortcutsSettingsPage* ui_; bool initialised_; std::unique_ptr grabber_; QSettings settings_; QMap shortcuts_; QString current_id_; }; #endif // GLOBALSHORTCUTSSETTINGSPAGE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/globalshortcutssettingspage.ui000066400000000000000000000133441260417502300267740ustar00rootroot00000000000000 GlobalShortcutsSettingsPage 0 0 507 393 Configure Shortcuts :/icon.png:/icon.png 0 0 0 Use Gnome's shortcut keys Open... 0 0 0 0 You need to launch System Preferences and allow Clementine to "<span style="font-style:italic">control your computer</span>" to use global shortcuts in Clementine. true Open... QAbstractItemView::NoEditTriggers true false true Action Shortcut true Shortcut for %1 true &None true De&fault &Custom Qt::Horizontal 40 20 Change shortcut... list radio_none radio_default radio_custom change gnome_checkbox toggled(bool) list setDisabled(bool) 63 25 82 63 gnome_checkbox toggled(bool) shortcut_options setDisabled(bool) 244 26 122 298 clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/iconloader.cpp000066400000000000000000000027351260417502300234250ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "iconloader.h" #include "core/logging.h" #include #include QList IconLoader::sizes_; void IconLoader::Init() { sizes_.clear(); sizes_ << 22 << 32 << 48; } QIcon IconLoader::Load(const QString& name) { QIcon ret; if (name.isEmpty()) return ret; #if QT_VERSION >= 0x040600 // Try to load it from the theme initially ret = QIcon::fromTheme(name); if (!ret.isNull()) return ret; #endif // Otherwise use our fallback theme const QString path(":/icons/%1x%2/%3.png"); for (int size : sizes_) { QString filename(path.arg(size).arg(size).arg(name)); if (QFile::exists(filename)) ret.addFile(filename, QSize(size, size)); } if (ret.isNull()) qLog(Warning) << "Couldn't load icon" << name; return ret; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/iconloader.h000066400000000000000000000017131260417502300230650ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ICONLOADER_H #define ICONLOADER_H #include class IconLoader { public: static void Init(); static QIcon Load(const QString& name); private: IconLoader() {} static QList sizes_; }; #endif // ICONLOADER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/macscreensaver.cpp000066400000000000000000000022471260417502300243050ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "macscreensaver.h" #include #include #include "core/utilities.h" MacScreensaver::MacScreensaver() : assertion_id_(0) {} void MacScreensaver::Inhibit() { IOPMAssertionCreateWithName( kIOPMAssertPreventUserIdleDisplaySleep, kIOPMAssertionLevelOn, CFSTR("Showing full-screen Clementine visualisations"), &assertion_id_); } void MacScreensaver::Uninhibit() { IOPMAssertionRelease(assertion_id_); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/macscreensaver.h000066400000000000000000000017641260417502300237550ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MACSCREENSAVER_H #define MACSCREENSAVER_H #include "screensaver.h" #include class MacScreensaver : public Screensaver { public: MacScreensaver(); void Inhibit(); void Uninhibit(); private: IOPMAssertionID assertion_id_; }; #endif clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/macsystemtrayicon.h000066400000000000000000000031141260417502300245210ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MACSYSTEMTRAYICON_H #define MACSYSTEMTRAYICON_H #include #include "systemtrayicon.h" class MacSystemTrayIconPrivate; class MacSystemTrayIcon : public SystemTrayIcon { Q_OBJECT public: MacSystemTrayIcon(QObject* parent = nullptr); ~MacSystemTrayIcon(); void SetupMenu(QAction* previous, QAction* play, QAction* stop, QAction* stop_after, QAction* next, QAction* mute, QAction* love, QAction* quit); void SetNowPlaying(const Song& song, const QString& image_path); void ClearNowPlaying(); private: void SetupMenuItem(QAction* action); private slots: void ActionChanged(); protected: // SystemTrayIcon void UpdateIcon(); private: QPixmap orange_icon_; QPixmap grey_icon_; std::unique_ptr p_; Q_DISABLE_COPY(MacSystemTrayIcon); }; #endif // MACSYSTEMTRAYICON_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/macsystemtrayicon.mm000066400000000000000000000150161260417502300247070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "macsystemtrayicon.h" #include "core/mac_delegate.h" #include "core/song.h" #include #include #include #include #include #include @interface Target : NSObject { QAction* action_; } - (id)initWithQAction:(QAction*)action; - (void)clicked; @end @implementation Target // - (id)init { return [super init]; } - (id)initWithQAction:(QAction*)action { action_ = action; return self; } - (BOOL)validateMenuItem:(NSMenuItem*)menuItem { // This is called when the menu is shown. return action_->isEnabled(); } - (void)clicked { action_->trigger(); } @end class MacSystemTrayIconPrivate { public: MacSystemTrayIconPrivate() { dock_menu_ = [[NSMenu alloc] initWithTitle:@"DockMenu"]; QString title = QT_TR_NOOP("Now Playing"); NSString* t = [[NSString alloc] initWithUTF8String:title.toUtf8().constData()]; now_playing_ = [[NSMenuItem alloc] initWithTitle:t action:nullptr keyEquivalent:@""]; now_playing_artist_ = [[NSMenuItem alloc] initWithTitle:@"Nothing to see here" action:nullptr keyEquivalent:@""]; now_playing_title_ = [[NSMenuItem alloc] initWithTitle:@"Nothing to see here" action:nullptr keyEquivalent:@""]; [dock_menu_ insertItem:now_playing_title_ atIndex:0]; [dock_menu_ insertItem:now_playing_artist_ atIndex:0]; [dock_menu_ insertItem:now_playing_ atIndex:0]; // Don't look now. // This must be called after our custom NSApplicationDelegate has been set. [(AppDelegate*)([NSApp delegate])setDockMenu:dock_menu_]; ClearNowPlaying(); } void AddMenuItem(QAction* action) { // Strip accelarators from name. QString text = action->text().remove("&"); NSString* title = [[NSString alloc] initWithUTF8String:text.toUtf8().constData()]; // Create an object that can receive user clicks and pass them on to the // QAction. Target* target = [[Target alloc] initWithQAction:action]; NSMenuItem* item = [[[NSMenuItem alloc] initWithTitle:title action:@selector(clicked) keyEquivalent:@""] autorelease]; [item setEnabled:action->isEnabled()]; [item setTarget:target]; [dock_menu_ addItem:item]; actions_[action] = item; } void ActionChanged(QAction* action) { NSMenuItem* item = actions_[action]; NSString* title = [[NSString alloc] initWithUTF8String:action->text().toUtf8().constData()]; [item setTitle:title]; } void AddSeparator() { NSMenuItem* separator = [NSMenuItem separatorItem]; [dock_menu_ addItem:separator]; } void ShowNowPlaying(const QString& artist, const QString& title) { ClearNowPlaying(); // Makes sure the order is consistent. [now_playing_artist_ setTitle:[[NSString alloc] initWithUTF8String:artist.toUtf8().constData()]]; [now_playing_title_ setTitle:[[NSString alloc] initWithUTF8String:title.toUtf8().constData()]]; title.isEmpty() ? HideItem(now_playing_title_) : ShowItem(now_playing_title_); artist.isEmpty() ? HideItem(now_playing_artist_) : ShowItem(now_playing_artist_); artist.isEmpty() && title.isEmpty() ? HideItem(now_playing_) : ShowItem(now_playing_); } void ClearNowPlaying() { // Hiding doesn't seem to work in the dock menu. HideItem(now_playing_); HideItem(now_playing_artist_); HideItem(now_playing_title_); } private: void HideItem(NSMenuItem* item) { if ([dock_menu_ indexOfItem:item] != -1) { [dock_menu_ removeItem:item]; } } void ShowItem(NSMenuItem* item, int index = 0) { if ([dock_menu_ indexOfItem:item] == -1) { [dock_menu_ insertItem:item atIndex:index]; } } QMap actions_; NSMenu* dock_menu_; NSMenuItem* now_playing_; NSMenuItem* now_playing_artist_; NSMenuItem* now_playing_title_; Q_DISABLE_COPY(MacSystemTrayIconPrivate); }; MacSystemTrayIcon::MacSystemTrayIcon(QObject* parent) : SystemTrayIcon(parent), orange_icon_(QPixmap(":icon_large.png").scaled( 128, 128, Qt::KeepAspectRatio, Qt::SmoothTransformation)), grey_icon_(QPixmap(":icon_large_grey.png").scaled( 128, 128, Qt::KeepAspectRatio, Qt::SmoothTransformation)) { QApplication::setWindowIcon(orange_icon_); } MacSystemTrayIcon::~MacSystemTrayIcon() {} void MacSystemTrayIcon::SetupMenu(QAction* previous, QAction* play, QAction* stop, QAction* stop_after, QAction* next, QAction* mute, QAction* love, QAction* quit) { p_.reset(new MacSystemTrayIconPrivate()); SetupMenuItem(previous); SetupMenuItem(play); SetupMenuItem(stop); SetupMenuItem(stop_after); SetupMenuItem(next); p_->AddSeparator(); SetupMenuItem(mute); p_->AddSeparator(); SetupMenuItem(love); Q_UNUSED(quit); // Mac already has a Quit item. } void MacSystemTrayIcon::SetupMenuItem(QAction* action) { p_->AddMenuItem(action); connect(action, SIGNAL(changed()), SLOT(ActionChanged())); } void MacSystemTrayIcon::UpdateIcon() { QApplication::setWindowIcon(CreateIcon(orange_icon_, grey_icon_)); } void MacSystemTrayIcon::ActionChanged() { QAction* action = qobject_cast(sender()); p_->ActionChanged(action); } void MacSystemTrayIcon::ClearNowPlaying() { p_->ClearNowPlaying(); } void MacSystemTrayIcon::SetNowPlaying(const Song& song, const QString& image_path) { p_->ShowNowPlaying(song.artist(), song.PrettyTitle()); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/mainwindow.cpp000066400000000000000000003021341260417502300234560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef Q_OS_WIN32 #include #endif #include "core/appearance.h" #include "core/application.h" #include "core/backgroundstreams.h" #include "core/commandlineoptions.h" #include "core/database.h" #include "core/deletefiles.h" #include "core/filesystemmusicstorage.h" #include "core/globalshortcuts.h" #include "core/logging.h" #include "core/mac_startup.h" #include "core/mergedproxymodel.h" #include "core/mimedata.h" #include "core/modelfuturewatcher.h" #include "core/mpris_common.h" #include "core/network.h" #include "core/player.h" #include "core/songloader.h" #include "core/stylesheetloader.h" #include "core/taskmanager.h" #include "core/timeconstants.h" #include "core/utilities.h" #include "devices/devicemanager.h" #include "devices/devicestatefiltermodel.h" #include "devices/deviceview.h" #include "devices/deviceviewcontainer.h" #include "engines/enginebase.h" #include "engines/gstengine.h" #include "globalsearch/globalsearch.h" #include "globalsearch/globalsearchview.h" #include "globalsearch/librarysearchprovider.h" #include "internet/magnatune/magnatuneservice.h" #include "internet/core/internetmodel.h" #include "internet/core/internetview.h" #include "internet/core/internetviewcontainer.h" #include "internet/internetradio/savedradio.h" #include "library/groupbydialog.h" #include "library/library.h" #include "library/librarybackend.h" #include "library/librarydirectorymodel.h" #include "library/libraryfilterwidget.h" #include "library/libraryviewcontainer.h" #include "musicbrainz/tagfetcher.h" #include "networkremote/networkremote.h" #include "playlist/playlistbackend.h" #include "playlist/playlist.h" #include "playlist/playlistlistcontainer.h" #include "playlist/playlistmanager.h" #include "playlist/playlistsequence.h" #include "playlist/playlistview.h" #include "playlist/queue.h" #include "playlist/queuemanager.h" #include "playlist/songplaylistitem.h" #include "playlistparsers/playlistparser.h" #include "internet/podcasts/podcastservice.h" #ifdef HAVE_AUDIOCD #include "ripper/ripcddialog.h" #endif #include "smartplaylists/generator.h" #include "smartplaylists/generatormimedata.h" #include "songinfo/artistinfoview.h" #include "songinfo/songinfoview.h" #include "transcoder/transcodedialog.h" #include "ui/about.h" #include "ui/addstreamdialog.h" #include "ui/albumcovermanager.h" #include "ui/console.h" #include "ui/edittagdialog.h" #include "ui/equalizer.h" #include "ui/iconloader.h" #include "ui/organisedialog.h" #include "ui/organiseerrordialog.h" #include "ui/qtsystemtrayicon.h" #include "ui/settingsdialog.h" #include "ui/systemtrayicon.h" #include "ui/trackselectiondialog.h" #include "ui/windows7thumbbar.h" #include "version.h" #include "widgets/errordialog.h" #include "widgets/fileview.h" #include "widgets/multiloadingindicator.h" #include "widgets/osd.h" #include "widgets/stylehelper.h" #include "widgets/trackslider.h" #ifdef Q_OS_DARWIN #include "ui/macsystemtrayicon.h" #endif #ifdef HAVE_LIBLASTFM #include "internet/lastfm/lastfmservice.h" #endif #ifdef HAVE_WIIMOTEDEV #include "wiimotedev/shortcuts.h" #endif #ifdef ENABLE_VISUALISATIONS #include "visualisations/visualisationcontainer.h" #endif #ifdef HAVE_MOODBAR #include "moodbar/moodbarcontroller.h" #include "moodbar/moodbarproxystyle.h" #endif #ifdef HAVE_VK #include "internet/vk/vkservice.h" #endif #include #ifdef Q_OS_DARWIN // Non exported mac-specific function. void qt_mac_set_dock_menu(QMenu*); #endif const char* MainWindow::kSettingsGroup = "MainWindow"; const char* MainWindow::kAllFilesFilterSpec = QT_TR_NOOP("All Files (*)"); namespace { const int kTrackSliderUpdateTimeMs = 40; const int kTrackPositionUpdateTimeMs = 1000; } MainWindow::MainWindow(Application* app, SystemTrayIcon* tray_icon, OSD* osd, QWidget* parent) : QMainWindow(parent), ui_(new Ui_MainWindow), thumbbar_(new Windows7ThumbBar(this)), app_(app), tray_icon_(tray_icon), osd_(osd), global_shortcuts_(new GlobalShortcuts(this)), remote_(nullptr), global_search_view_(new GlobalSearchView(app_, this)), library_view_(new LibraryViewContainer(this)), file_view_(new FileView(this)), playlist_list_(new PlaylistListContainer(this)), internet_view_(new InternetViewContainer(this)), device_view_container_(new DeviceViewContainer(this)), device_view_(device_view_container_->view()), song_info_view_(new SongInfoView(this)), artist_info_view_(new ArtistInfoView(this)), equalizer_(new Equalizer), organise_dialog_(new OrganiseDialog(app_->task_manager())), playlist_menu_(new QMenu(this)), playlist_add_to_another_(nullptr), playlistitem_actions_separator_(nullptr), library_sort_model_(new QSortFilterProxyModel(this)), track_position_timer_(new QTimer(this)), track_slider_timer_(new QTimer(this)), was_maximized_(false), saved_playback_position_(0), saved_playback_state_(Engine::Empty), doubleclick_addmode_(AddBehaviour_Append), doubleclick_playmode_(PlayBehaviour_IfStopped), menu_playmode_(PlayBehaviour_IfStopped) { qLog(Debug) << "Starting"; connect(app, SIGNAL(ErrorAdded(QString)), SLOT(ShowErrorDialog(QString))); connect(app, SIGNAL(SettingsDialogRequested(SettingsDialog::Page)), SLOT(OpenSettingsDialogAtPage(SettingsDialog::Page))); // Initialise the UI ui_->setupUi(this); #ifdef Q_OS_DARWIN ui_->menu_help->menuAction()->setVisible(false); #endif ui_->multi_loading_indicator->SetTaskManager(app_->task_manager()); ui_->now_playing->SetApplication(app_); int volume = app_->player()->GetVolume(); ui_->volume->setValue(volume); VolumeChanged(volume); // Initialise the global search widget StyleHelper::setBaseColor(palette().color(QPalette::Highlight).darker()); // Add global search providers app_->global_search()->AddProvider(new LibrarySearchProvider( app_->library_backend(), tr("Library"), "library", IconLoader::Load("folder-sound"), true, app_, this)); app_->global_search()->ReloadSettings(); global_search_view_->ReloadSettings(); connect(global_search_view_, SIGNAL(AddToPlaylist(QMimeData*)), SLOT(AddToPlaylist(QMimeData*))); // Add tabs to the fancy tab widget ui_->tabs->AddTab(global_search_view_, IconLoader::Load("search"), tr("Search", "Global search settings dialog title.")); ui_->tabs->AddTab(library_view_, IconLoader::Load("folder-sound"), tr("Library")); ui_->tabs->AddTab(file_view_, IconLoader::Load("document-open"), tr("Files")); ui_->tabs->AddTab(playlist_list_, IconLoader::Load("view-media-playlist"), tr("Playlists")); ui_->tabs->AddTab(internet_view_, IconLoader::Load("applications-internet"), tr("Internet")); ui_->tabs->AddTab(device_view_container_, IconLoader::Load("multimedia-player-ipod-mini-blue"), tr("Devices")); ui_->tabs->AddSpacer(); ui_->tabs->AddTab(song_info_view_, IconLoader::Load("view-media-lyrics"), tr("Song info")); ui_->tabs->AddTab(artist_info_view_, IconLoader::Load("x-clementine-artist"), tr("Artist info")); // Add the now playing widget to the fancy tab widget ui_->tabs->AddBottomWidget(ui_->now_playing); ui_->tabs->SetBackgroundPixmap(QPixmap(":/sidebar_background.png")); track_position_timer_->setInterval(kTrackPositionUpdateTimeMs); connect(track_position_timer_, SIGNAL(timeout()), SLOT(UpdateTrackPosition())); track_slider_timer_->setInterval(kTrackSliderUpdateTimeMs); connect(track_slider_timer_, SIGNAL(timeout()), SLOT(UpdateTrackSliderPosition())); // Start initialising the player qLog(Debug) << "Initialising player"; app_->player()->Init(); background_streams_ = new BackgroundStreams(app_->player()->engine(), this); background_streams_->LoadStreams(); // Models qLog(Debug) << "Creating models"; library_sort_model_->setSourceModel(app_->library()->model()); library_sort_model_->setSortRole(LibraryModel::Role_SortText); library_sort_model_->setDynamicSortFilter(true); library_sort_model_->setSortLocaleAware(true); library_sort_model_->sort(0); connect(ui_->playlist, SIGNAL(ViewSelectionModelChanged()), SLOT(PlaylistViewSelectionModelChanged())); ui_->playlist->SetManager(app_->playlist_manager()); ui_->playlist->view()->SetApplication(app_); library_view_->view()->setModel(library_sort_model_); library_view_->view()->SetApplication(app_); internet_view_->SetApplication(app_); device_view_->SetApplication(app_); playlist_list_->SetApplication(app_); organise_dialog_->SetDestinationModel( app_->library()->model()->directory_model()); // Icons qLog(Debug) << "Creating UI"; ui_->action_about->setIcon(IconLoader::Load("help-about")); ui_->action_about_qt->setIcon( QIcon(":/trolltech/qmessagebox/images/qtlogo-64.png")); ui_->action_add_file->setIcon(IconLoader::Load("document-open")); ui_->action_add_folder->setIcon(IconLoader::Load("document-open-folder")); ui_->action_add_stream->setIcon(IconLoader::Load("document-open-remote")); ui_->action_clear_playlist->setIcon(IconLoader::Load("edit-clear-list")); ui_->action_configure->setIcon(IconLoader::Load("configure")); ui_->action_cover_manager->setIcon(IconLoader::Load("download")); ui_->action_edit_track->setIcon(IconLoader::Load("edit-rename")); ui_->action_equalizer->setIcon(IconLoader::Load("view-media-equalizer")); ui_->action_jump->setIcon(IconLoader::Load("go-jump")); ui_->action_next_track->setIcon(IconLoader::Load("media-skip-forward")); ui_->action_open_media->setIcon(IconLoader::Load("document-open")); ui_->action_open_cd->setIcon(IconLoader::Load("media-optical")); ui_->action_play_pause->setIcon(IconLoader::Load("media-playback-start")); ui_->action_previous_track->setIcon(IconLoader::Load("media-skip-backward")); ui_->action_quit->setIcon(IconLoader::Load("application-exit")); ui_->action_remove_from_playlist->setIcon(IconLoader::Load("list-remove")); ui_->action_repeat_mode->setIcon(IconLoader::Load("media-playlist-repeat")); ui_->action_rip_audio_cd->setIcon(IconLoader::Load("media-optical")); ui_->action_shuffle->setIcon(IconLoader::Load("x-clementine-shuffle")); ui_->action_shuffle_mode->setIcon(IconLoader::Load("media-playlist-shuffle")); ui_->action_stop->setIcon(IconLoader::Load("media-playback-stop")); ui_->action_stop_after_this_track->setIcon( IconLoader::Load("media-playback-stop")); ui_->action_new_playlist->setIcon(IconLoader::Load("document-new")); ui_->action_load_playlist->setIcon(IconLoader::Load("document-open")); ui_->action_save_playlist->setIcon(IconLoader::Load("document-save")); ui_->action_full_library_scan->setIcon(IconLoader::Load("view-refresh")); ui_->action_rain->setIcon(IconLoader::Load("weather-showers-scattered")); ui_->action_hypnotoad->setIcon(IconLoader::Load("hypnotoad")); ui_->action_kittens->setIcon(IconLoader::Load("kittens")); ui_->action_enterprise->setIcon(IconLoader::Load("enterprise")); // File view connections connect(file_view_, SIGNAL(AddToPlaylist(QMimeData*)), SLOT(AddToPlaylist(QMimeData*))); connect(file_view_, SIGNAL(PathChanged(QString)), SLOT(FilePathChanged(QString))); connect(file_view_, SIGNAL(CopyToLibrary(QList)), SLOT(CopyFilesToLibrary(QList))); connect(file_view_, SIGNAL(MoveToLibrary(QList)), SLOT(MoveFilesToLibrary(QList))); connect(file_view_, SIGNAL(EditTags(QList)), SLOT(EditFileTags(QList))); connect(file_view_, SIGNAL(CopyToDevice(QList)), SLOT(CopyFilesToDevice(QList))); file_view_->SetTaskManager(app_->task_manager()); // Action connections connect(ui_->action_next_track, SIGNAL(triggered()), app_->player(), SLOT(Next())); connect(ui_->action_previous_track, SIGNAL(triggered()), app_->player(), SLOT(Previous())); connect(ui_->action_play_pause, SIGNAL(triggered()), app_->player(), SLOT(PlayPause())); connect(ui_->action_stop, SIGNAL(triggered()), app_->player(), SLOT(Stop())); connect(ui_->action_quit, SIGNAL(triggered()), SLOT(Exit())); connect(ui_->action_stop_after_this_track, SIGNAL(triggered()), SLOT(StopAfterCurrent())); connect(ui_->action_mute, SIGNAL(triggered()), app_->player(), SLOT(Mute())); #ifdef HAVE_LIBLASTFM connect(ui_->action_love, SIGNAL(triggered()), SLOT(Love())); connect(ui_->action_toggle_scrobbling, SIGNAL(triggered()), app_->scrobbler(), SLOT(ToggleScrobbling())); #endif #ifdef HAVE_VK connect(ui_->action_love, SIGNAL(triggered()), InternetModel::Service(), SLOT(AddToMyMusicCurrent())); #endif connect(ui_->action_clear_playlist, SIGNAL(triggered()), app_->playlist_manager(), SLOT(ClearCurrent())); connect(ui_->action_remove_duplicates, SIGNAL(triggered()), app_->playlist_manager(), SLOT(RemoveDuplicatesCurrent())); connect(ui_->action_remove_unavailable, SIGNAL(triggered()), app_->playlist_manager(), SLOT(RemoveUnavailableCurrent())); connect(ui_->action_remove_from_playlist, SIGNAL(triggered()), SLOT(PlaylistRemoveCurrent())); connect(ui_->action_edit_track, SIGNAL(triggered()), SLOT(EditTracks())); connect(ui_->action_renumber_tracks, SIGNAL(triggered()), SLOT(RenumberTracks())); connect(ui_->action_selection_set_value, SIGNAL(triggered()), SLOT(SelectionSetValue())); connect(ui_->action_edit_value, SIGNAL(triggered()), SLOT(EditValue())); connect(ui_->action_auto_complete_tags, SIGNAL(triggered()), SLOT(AutoCompleteTags())); connect(ui_->action_configure, SIGNAL(triggered()), SLOT(OpenSettingsDialog())); connect(ui_->action_about, SIGNAL(triggered()), SLOT(ShowAboutDialog())); connect(ui_->action_about_qt, SIGNAL(triggered()), qApp, SLOT(aboutQt())); connect(ui_->action_shuffle, SIGNAL(triggered()), app_->playlist_manager(), SLOT(ShuffleCurrent())); connect(ui_->action_open_media, SIGNAL(triggered()), SLOT(AddFile())); connect(ui_->action_open_cd, SIGNAL(triggered()), SLOT(AddCDTracks())); #ifdef HAVE_AUDIOCD connect(ui_->action_rip_audio_cd, SIGNAL(triggered()), SLOT(OpenRipCDDialog())); #else ui_->action_rip_audio_cd->setVisible(false); #endif connect(ui_->action_add_file, SIGNAL(triggered()), SLOT(AddFile())); connect(ui_->action_add_folder, SIGNAL(triggered()), SLOT(AddFolder())); connect(ui_->action_add_stream, SIGNAL(triggered()), SLOT(AddStream())); connect(ui_->action_add_podcast, SIGNAL(triggered()), SLOT(AddPodcast())); connect(ui_->action_cover_manager, SIGNAL(triggered()), SLOT(ShowCoverManager())); connect(ui_->action_equalizer, SIGNAL(triggered()), equalizer_.get(), SLOT(show())); connect(ui_->action_transcode, SIGNAL(triggered()), SLOT(ShowTranscodeDialog())); connect(ui_->action_jump, SIGNAL(triggered()), ui_->playlist->view(), SLOT(JumpToCurrentlyPlayingTrack())); connect(ui_->action_update_library, SIGNAL(triggered()), app_->library(), SLOT(IncrementalScan())); connect(ui_->action_full_library_scan, SIGNAL(triggered()), app_->library(), SLOT(FullScan())); connect(ui_->action_queue_manager, SIGNAL(triggered()), SLOT(ShowQueueManager())); connect(ui_->action_add_files_to_transcoder, SIGNAL(triggered()), SLOT(AddFilesToTranscoder())); background_streams_->AddAction("Rain", ui_->action_rain); background_streams_->AddAction("Hypnotoad", ui_->action_hypnotoad); background_streams_->AddAction("Make it so!", ui_->action_enterprise); // Playlist view actions ui_->action_next_playlist->setShortcuts( QList() << QKeySequence::fromString("Ctrl+Tab") #ifdef Q_OS_DARWIN // On OS X "Ctrl+Tab" == Cmd + Tab but this shorcut // is already used by default for switching between // applications. // I would have preferred to use Meta+Tab (which // means Ctrl+Tab on OS X), like in Firefox or // Chrome, but this doesn't work (probably at Qt bug) // and some applications (e.g. Qt creator) uses // Alt+Tab too so I believe it's a good shorcut anyway << QKeySequence::fromString("Alt+Tab") #endif // Q_OS_DARWIN << QKeySequence::fromString("Ctrl+PgDown")); ui_->action_previous_playlist->setShortcuts( QList() << QKeySequence::fromString("Ctrl+Shift+Tab") #ifdef Q_OS_DARWIN << QKeySequence::fromString("Alt+Shift+Tab") #endif // Q_OS_DARWIN << QKeySequence::fromString("Ctrl+PgUp")); // Actions for switching tabs will be global to the entire window, so adding // them here addAction(ui_->action_next_playlist); addAction(ui_->action_previous_playlist); // Give actions to buttons ui_->forward_button->setDefaultAction(ui_->action_next_track); ui_->back_button->setDefaultAction(ui_->action_previous_track); ui_->pause_play_button->setDefaultAction(ui_->action_play_pause); ui_->stop_button->setDefaultAction(ui_->action_stop); ui_->love_button->setDefaultAction(ui_->action_love); ui_->scrobbling_button->setDefaultAction(ui_->action_toggle_scrobbling); ui_->clear_playlist_button->setDefaultAction(ui_->action_clear_playlist); ui_->playlist->SetActions( ui_->action_new_playlist, ui_->action_load_playlist, ui_->action_save_playlist, ui_->action_next_playlist, /* These two actions aren't associated */ ui_->action_previous_playlist /* to a button but to the main window */); #ifdef ENABLE_VISUALISATIONS connect(ui_->action_visualisations, SIGNAL(triggered()), SLOT(ShowVisualisations())); #else ui_->action_visualisations->setEnabled(false); #endif // Add the shuffle and repeat action groups to the menu ui_->action_shuffle_mode->setMenu(ui_->playlist_sequence->shuffle_menu()); ui_->action_repeat_mode->setMenu(ui_->playlist_sequence->repeat_menu()); // Stop actions QMenu* stop_menu = new QMenu(this); stop_menu->addAction(ui_->action_stop); stop_menu->addAction(ui_->action_stop_after_this_track); ui_->stop_button->setMenu(stop_menu); // Player connections connect(ui_->volume, SIGNAL(valueChanged(int)), app_->player(), SLOT(SetVolume(int))); connect(app_->player(), SIGNAL(Error(QString)), SLOT(ShowErrorDialog(QString))); connect(app_->player(), SIGNAL(SongChangeRequestProcessed(QUrl, bool)), app_->playlist_manager(), SLOT(SongChangeRequestProcessed(QUrl, bool))); connect(app_->player(), SIGNAL(Paused()), SLOT(MediaPaused())); connect(app_->player(), SIGNAL(Playing()), SLOT(MediaPlaying())); connect(app_->player(), SIGNAL(Stopped()), SLOT(MediaStopped())); connect(app_->player(), SIGNAL(Seeked(qlonglong)), SLOT(Seeked(qlonglong))); connect(app_->player(), SIGNAL(TrackSkipped(PlaylistItemPtr)), SLOT(TrackSkipped(PlaylistItemPtr))); connect(this, SIGNAL(IntroPointReached()), app_->player(), SLOT(IntroPointReached())); connect(app_->player(), SIGNAL(VolumeChanged(int)), SLOT(VolumeChanged(int))); connect(app_->player(), SIGNAL(Paused()), ui_->playlist, SLOT(ActivePaused())); connect(app_->player(), SIGNAL(Playing()), ui_->playlist, SLOT(ActivePlaying())); connect(app_->player(), SIGNAL(Stopped()), ui_->playlist, SLOT(ActiveStopped())); connect(app_->player(), SIGNAL(Paused()), osd_, SLOT(Paused())); connect(app_->player(), SIGNAL(Stopped()), osd_, SLOT(Stopped())); connect(app_->player(), SIGNAL(PlaylistFinished()), osd_, SLOT(PlaylistFinished())); connect(app_->player(), SIGNAL(VolumeChanged(int)), osd_, SLOT(VolumeChanged(int))); connect(app_->player(), SIGNAL(VolumeChanged(int)), ui_->volume, SLOT(setValue(int))); connect(app_->player(), SIGNAL(ForceShowOSD(Song, bool)), SLOT(ForceShowOSD(Song, bool))); connect(app_->playlist_manager(), SIGNAL(CurrentSongChanged(Song)), SLOT(SongChanged(Song))); connect(app_->playlist_manager(), SIGNAL(CurrentSongChanged(Song)), app_->player(), SLOT(CurrentMetadataChanged(Song))); connect(app_->playlist_manager(), SIGNAL(EditingFinished(QModelIndex)), SLOT(PlaylistEditFinished(QModelIndex))); connect(app_->playlist_manager(), SIGNAL(Error(QString)), SLOT(ShowErrorDialog(QString))); connect(app_->playlist_manager(), SIGNAL(SummaryTextChanged(QString)), ui_->playlist_summary, SLOT(setText(QString))); connect(app_->playlist_manager(), SIGNAL(PlayRequested(QModelIndex)), SLOT(PlayIndex(QModelIndex))); connect(ui_->playlist->view(), SIGNAL(doubleClicked(QModelIndex)), SLOT(PlaylistDoubleClick(QModelIndex))); connect(ui_->playlist->view(), SIGNAL(PlayItem(QModelIndex)), SLOT(PlayIndex(QModelIndex))); connect(ui_->playlist->view(), SIGNAL(PlayPause()), app_->player(), SLOT(PlayPause())); connect(ui_->playlist->view(), SIGNAL(RightClicked(QPoint, QModelIndex)), SLOT(PlaylistRightClick(QPoint, QModelIndex))); connect(ui_->playlist->view(), SIGNAL(SeekForward()), app_->player(), SLOT(SeekForward())); connect(ui_->playlist->view(), SIGNAL(SeekBackward()), app_->player(), SLOT(SeekBackward())); connect(ui_->playlist->view(), SIGNAL(BackgroundPropertyChanged()), SLOT(RefreshStyleSheet())); connect(ui_->track_slider, SIGNAL(ValueChangedSeconds(int)), app_->player(), SLOT(SeekTo(int))); connect(ui_->track_slider, SIGNAL(SeekForward()), app_->player(), SLOT(SeekForward())); connect(ui_->track_slider, SIGNAL(SeekBackward()), app_->player(), SLOT(SeekBackward())); // Library connections connect(library_view_->view(), SIGNAL(AddToPlaylistSignal(QMimeData*)), SLOT(AddToPlaylist(QMimeData*))); connect(library_view_->view(), SIGNAL(ShowConfigDialog()), SLOT(ShowLibraryConfig())); connect(app_->library_model(), SIGNAL(TotalSongCountUpdated(int)), library_view_->view(), SLOT(TotalSongCountUpdated(int))); connect(app_->library_model(), SIGNAL(modelAboutToBeReset()), library_view_->view(), SLOT(SaveFocus())); connect(app_->library_model(), SIGNAL(modelReset()), library_view_->view(), SLOT(RestoreFocus())); connect(app_->task_manager(), SIGNAL(PauseLibraryWatchers()), app_->library(), SLOT(PauseWatcher())); connect(app_->task_manager(), SIGNAL(ResumeLibraryWatchers()), app_->library(), SLOT(ResumeWatcher())); // Devices connections connect(device_view_, SIGNAL(AddToPlaylistSignal(QMimeData*)), SLOT(AddToPlaylist(QMimeData*))); // Library filter widget QActionGroup* library_view_group = new QActionGroup(this); library_show_all_ = library_view_group->addAction(tr("Show all songs")); library_show_duplicates_ = library_view_group->addAction(tr("Show only duplicates")); library_show_untagged_ = library_view_group->addAction(tr("Show only untagged")); library_show_all_->setCheckable(true); library_show_duplicates_->setCheckable(true); library_show_untagged_->setCheckable(true); library_show_all_->setChecked(true); connect(library_view_group, SIGNAL(triggered(QAction*)), SLOT(ChangeLibraryQueryMode(QAction*))); QAction* library_config_action = new QAction( IconLoader::Load("configure"), tr("Configure library..."), this); connect(library_config_action, SIGNAL(triggered()), SLOT(ShowLibraryConfig())); library_view_->filter()->SetSettingsGroup(kSettingsGroup); library_view_->filter()->SetLibraryModel(app_->library()->model()); QAction* separator = new QAction(this); separator->setSeparator(true); library_view_->filter()->AddMenuAction(library_show_all_); library_view_->filter()->AddMenuAction(library_show_duplicates_); library_view_->filter()->AddMenuAction(library_show_untagged_); library_view_->filter()->AddMenuAction(separator); library_view_->filter()->AddMenuAction(library_config_action); // Playlist menu playlist_play_pause_ = playlist_menu_->addAction(tr("Play"), this, SLOT(PlaylistPlay())); playlist_menu_->addAction(ui_->action_stop); playlist_stop_after_ = playlist_menu_->addAction( IconLoader::Load("media-playback-stop"), tr("Stop after this track"), this, SLOT(PlaylistStopAfter())); playlist_queue_ = playlist_menu_->addAction("", this, SLOT(PlaylistQueue())); playlist_queue_->setShortcut(QKeySequence("Ctrl+D")); ui_->playlist->addAction(playlist_queue_); playlist_skip_ = playlist_menu_->addAction("", this, SLOT(PlaylistSkip())); ui_->playlist->addAction(playlist_skip_); playlist_menu_->addSeparator(); playlist_menu_->addAction(ui_->action_remove_from_playlist); playlist_undoredo_ = playlist_menu_->addSeparator(); playlist_menu_->addAction(ui_->action_edit_track); playlist_menu_->addAction(ui_->action_edit_value); playlist_menu_->addAction(ui_->action_renumber_tracks); playlist_menu_->addAction(ui_->action_selection_set_value); playlist_menu_->addAction(ui_->action_auto_complete_tags); playlist_menu_->addAction(ui_->action_add_files_to_transcoder); playlist_menu_->addSeparator(); playlist_copy_to_library_ = playlist_menu_->addAction( IconLoader::Load("edit-copy"), tr("Copy to library..."), this, SLOT(PlaylistCopyToLibrary())); playlist_move_to_library_ = playlist_menu_->addAction( IconLoader::Load("go-jump"), tr("Move to library..."), this, SLOT(PlaylistMoveToLibrary())); playlist_organise_ = playlist_menu_->addAction(IconLoader::Load("edit-copy"), tr("Organise files..."), this, SLOT(PlaylistMoveToLibrary())); playlist_copy_to_device_ = playlist_menu_->addAction( IconLoader::Load("multimedia-player-ipod-mini-blue"), tr("Copy to device..."), this, SLOT(PlaylistCopyToDevice())); playlist_delete_ = playlist_menu_->addAction(IconLoader::Load("edit-delete"), tr("Delete from disk..."), this, SLOT(PlaylistDelete())); playlist_open_in_browser_ = playlist_menu_->addAction( IconLoader::Load("document-open-folder"), tr("Show in file browser..."), this, SLOT(PlaylistOpenInBrowser())); playlist_show_in_library_ = playlist_menu_->addAction( IconLoader::Load("edit-find"), tr("Show in library..."), this, SLOT(ShowInLibrary())); playlist_menu_->addSeparator(); playlistitem_actions_separator_ = playlist_menu_->addSeparator(); playlist_menu_->addAction(ui_->action_clear_playlist); playlist_menu_->addAction(ui_->action_shuffle); playlist_menu_->addAction(ui_->action_remove_duplicates); playlist_menu_->addAction(ui_->action_remove_unavailable); #ifdef Q_OS_DARWIN ui_->action_shuffle->setShortcut(QKeySequence()); #endif // We have to add the actions on the playlist menu to this QWidget otherwise // their shortcut keys don't work addActions(playlist_menu_->actions()); connect(ui_->playlist, SIGNAL(UndoRedoActionsChanged(QAction*, QAction*)), SLOT(PlaylistUndoRedoChanged(QAction*, QAction*))); playlist_copy_to_device_->setDisabled( app_->device_manager()->connected_devices_model()->rowCount() == 0); connect(app_->device_manager()->connected_devices_model(), SIGNAL(IsEmptyChanged(bool)), playlist_copy_to_device_, SLOT(setDisabled(bool))); // Global search shortcut QAction* global_search_action = new QAction(this); global_search_action->setShortcuts(QList() << QKeySequence("Ctrl+F") << QKeySequence("Ctrl+L")); addAction(global_search_action); connect(global_search_action, SIGNAL(triggered()), SLOT(FocusGlobalSearchField())); // Internet connections connect(app_->internet_model(), SIGNAL(StreamError(QString)), SLOT(ShowErrorDialog(QString))); connect(app_->internet_model(), SIGNAL(StreamMetadataFound(QUrl, Song)), app_->playlist_manager(), SLOT(SetActiveStreamMetadata(QUrl, Song))); connect(app_->internet_model(), SIGNAL(AddToPlaylist(QMimeData*)), SLOT(AddToPlaylist(QMimeData*))); connect(app_->internet_model(), SIGNAL(ScrollToIndex(QModelIndex)), SLOT(ScrollToInternetIndex(QModelIndex))); #ifdef HAVE_LIBLASTFM connect(app_->scrobbler(), SIGNAL(ButtonVisibilityChanged(bool)), SLOT(LastFMButtonVisibilityChanged(bool))); connect(app_->scrobbler(), SIGNAL(ScrobbleButtonVisibilityChanged(bool)), SLOT(ScrobbleButtonVisibilityChanged(bool))); connect(app_->scrobbler(), SIGNAL(ScrobblingEnabledChanged(bool)), SLOT(ScrobblingEnabledChanged(bool))); connect(app_->scrobbler(), SIGNAL(ScrobbledRadioStream()), SLOT(ScrobbledRadioStream())); #endif connect(app_->internet_model()->Service(), SIGNAL(DownloadFinished(QStringList)), osd_, SLOT(MagnatuneDownloadFinished(QStringList))); connect(internet_view_->tree(), SIGNAL(AddToPlaylistSignal(QMimeData*)), SLOT(AddToPlaylist(QMimeData*))); // Connections to the saved streams service connect(InternetModel::Service(), SIGNAL(ShowAddStreamDialog()), SLOT(AddStream())); #ifdef Q_OS_DARWIN mac::SetApplicationHandler(this); #endif // Tray icon tray_icon_->SetupMenu(ui_->action_previous_track, ui_->action_play_pause, ui_->action_stop, ui_->action_stop_after_this_track, ui_->action_next_track, ui_->action_mute, ui_->action_love, ui_->action_quit); connect(tray_icon_, SIGNAL(PlayPause()), app_->player(), SLOT(PlayPause())); connect(tray_icon_, SIGNAL(SeekForward()), app_->player(), SLOT(SeekForward())); connect(tray_icon_, SIGNAL(SeekBackward()), app_->player(), SLOT(SeekBackward())); connect(tray_icon_, SIGNAL(NextTrack()), app_->player(), SLOT(Next())); connect(tray_icon_, SIGNAL(PreviousTrack()), app_->player(), SLOT(Previous())); connect(tray_icon_, SIGNAL(ShowHide()), SLOT(ToggleShowHide())); connect(tray_icon_, SIGNAL(ChangeVolume(int)), SLOT(VolumeWheelEvent(int))); // Windows 7 thumbbar buttons thumbbar_->SetActions(QList() << ui_->action_previous_track << ui_->action_play_pause << ui_->action_stop << ui_->action_next_track << nullptr // spacer << ui_->action_love); #if (defined(Q_OS_DARWIN) && defined(HAVE_SPARKLE)) || defined(Q_OS_WIN32) // Add check for updates item to application menu. QAction* check_updates = ui_->menu_tools->addAction(tr("Check for updates...")); check_updates->setMenuRole(QAction::ApplicationSpecificRole); connect(check_updates, SIGNAL(triggered(bool)), SLOT(CheckForUpdates())); #endif #ifdef Q_OS_WIN32 qLog(Debug) << "Creating sparkle updater"; qtsparkle::Updater* updater = new qtsparkle::Updater( QUrl("https://clementine-data.appspot.com/sparkle-windows"), this); updater->SetNetworkAccessManager(new NetworkAccessManager(this)); updater->SetVersion(CLEMENTINE_VERSION_SPARKLE); connect(check_updates, SIGNAL(triggered()), updater, SLOT(CheckNow())); #endif // Global shortcuts connect(global_shortcuts_, SIGNAL(Play()), app_->player(), SLOT(Play())); connect(global_shortcuts_, SIGNAL(Pause()), app_->player(), SLOT(Pause())); connect(global_shortcuts_, SIGNAL(PlayPause()), ui_->action_play_pause, SLOT(trigger())); connect(global_shortcuts_, SIGNAL(Stop()), ui_->action_stop, SLOT(trigger())); connect(global_shortcuts_, SIGNAL(StopAfter()), ui_->action_stop_after_this_track, SLOT(trigger())); connect(global_shortcuts_, SIGNAL(Next()), ui_->action_next_track, SLOT(trigger())); connect(global_shortcuts_, SIGNAL(Previous()), ui_->action_previous_track, SLOT(trigger())); connect(global_shortcuts_, SIGNAL(IncVolume()), app_->player(), SLOT(VolumeUp())); connect(global_shortcuts_, SIGNAL(DecVolume()), app_->player(), SLOT(VolumeDown())); connect(global_shortcuts_, SIGNAL(Mute()), app_->player(), SLOT(Mute())); connect(global_shortcuts_, SIGNAL(SeekForward()), app_->player(), SLOT(SeekForward())); connect(global_shortcuts_, SIGNAL(SeekBackward()), app_->player(), SLOT(SeekBackward())); connect(global_shortcuts_, SIGNAL(ShowHide()), SLOT(ToggleShowHide())); connect(global_shortcuts_, SIGNAL(ShowOSD()), app_->player(), SLOT(ShowOSD())); connect(global_shortcuts_, SIGNAL(TogglePrettyOSD()), app_->player(), SLOT(TogglePrettyOSD())); #ifdef HAVE_LIBLASTFM connect(global_shortcuts_, SIGNAL(ToggleScrobbling()), app_->scrobbler(), SLOT(ToggleScrobbling())); connect(global_shortcuts_, SIGNAL(Love()), app_->scrobbler(), SLOT(Love())); connect(global_shortcuts_, SIGNAL(Ban()), app_->scrobbler(), SLOT(Ban())); #endif connect(global_shortcuts_, SIGNAL(RateCurrentSong(int)), app_->playlist_manager(), SLOT(RateCurrentSong(int))); // Fancy tabs connect(ui_->tabs, SIGNAL(ModeChanged(FancyTabWidget::Mode)), SLOT(SaveGeometry())); connect(ui_->tabs, SIGNAL(CurrentChanged(int)), SLOT(SaveGeometry())); // Lyrics ConnectInfoView(song_info_view_); ConnectInfoView(artist_info_view_); // Analyzer ui_->analyzer->SetEngine(app_->player()->engine()); ui_->analyzer->SetActions(ui_->action_visualisations); connect(ui_->analyzer, SIGNAL(WheelEvent(int)), SLOT(VolumeWheelEvent(int))); // Equalizer qLog(Debug) << "Creating equalizer"; connect(equalizer_.get(), SIGNAL(ParametersChanged(int, QList)), app_->player()->engine(), SLOT(SetEqualizerParameters(int, QList))); connect(equalizer_.get(), SIGNAL(EnabledChanged(bool)), app_->player()->engine(), SLOT(SetEqualizerEnabled(bool))); connect(equalizer_.get(), SIGNAL(StereoBalanceChanged(float)), app_->player()->engine(), SLOT(SetStereoBalance(float))); app_->player()->engine()->SetEqualizerEnabled(equalizer_->is_enabled()); app_->player()->engine()->SetEqualizerParameters(equalizer_->preamp_value(), equalizer_->gain_values()); app_->player()->engine()->SetStereoBalance(equalizer_->stereo_balance()); // Statusbar widgets ui_->playlist_summary->setMinimumWidth( QFontMetrics(font()).width("WW selected of WW tracks - [ WW:WW ]")); ui_->status_bar_stack->setCurrentWidget(ui_->playlist_summary_page); connect(ui_->multi_loading_indicator, SIGNAL(TaskCountChange(int)), SLOT(TaskCountChanged(int))); ui_->track_slider->SetApplication(app); #ifdef HAVE_MOODBAR // Moodbar connections connect(app_->moodbar_controller(), SIGNAL(CurrentMoodbarDataChanged(QByteArray)), ui_->track_slider->moodbar_style(), SLOT(SetMoodbarData(QByteArray))); #endif // Now playing widget qLog(Debug) << "Creating now playing widget"; ui_->now_playing->set_ideal_height(ui_->status_bar->sizeHint().height() + ui_->player_controls->sizeHint().height()); connect(app_->player(), SIGNAL(Stopped()), ui_->now_playing, SLOT(Stopped())); connect(ui_->now_playing, SIGNAL(ShowAboveStatusBarChanged(bool)), SLOT(NowPlayingWidgetPositionChanged(bool))); connect(ui_->action_hypnotoad, SIGNAL(toggled(bool)), ui_->now_playing, SLOT(AllHail(bool))); connect(ui_->action_kittens, SIGNAL(toggled(bool)), ui_->now_playing, SLOT(EnableKittens(bool))); connect(ui_->action_kittens, SIGNAL(toggled(bool)), app_->network_remote(), SLOT(EnableKittens(bool))); // Hide the console // connect(ui_->action_console, SIGNAL(triggered()), SLOT(ShowConsole())); NowPlayingWidgetPositionChanged(ui_->now_playing->show_above_status_bar()); // Load theme // This is tricky: we need to save the default/system palette now, before // loading user preferred theme (which will overide it), to be able to restore // it later const_cast(Appearance::kDefaultPalette) = QApplication::palette(); app_->appearance()->LoadUserTheme(); StyleSheetLoader* css_loader = new StyleSheetLoader(this); css_loader->SetStyleSheet(this, ":mainwindow.css"); // Load playlists app_->playlist_manager()->Init(app_->library_backend(), app_->playlist_backend(), ui_->playlist_sequence, ui_->playlist); // This connection must be done after the playlists have been initialized. connect(this, SIGNAL(StopAfterToggled(bool)), osd_, SLOT(StopAfterToggle(bool))); // We need to connect these global shortcuts here after the playlist have been // initialized connect(global_shortcuts_, SIGNAL(CycleShuffleMode()), app_->playlist_manager()->sequence(), SLOT(CycleShuffleMode())); connect(global_shortcuts_, SIGNAL(CycleRepeatMode()), app_->playlist_manager()->sequence(), SLOT(CycleRepeatMode())); connect(app_->playlist_manager()->sequence(), SIGNAL(RepeatModeChanged(PlaylistSequence::RepeatMode)), osd_, SLOT(RepeatModeChanged(PlaylistSequence::RepeatMode))); connect(app_->playlist_manager()->sequence(), SIGNAL(ShuffleModeChanged(PlaylistSequence::ShuffleMode)), osd_, SLOT(ShuffleModeChanged(PlaylistSequence::ShuffleMode))); #ifdef HAVE_LIBLASTFM connect(app_->scrobbler(), SIGNAL(ScrobbleSubmitted()), SLOT(ScrobbleSubmitted())); connect(app_->scrobbler(), SIGNAL(ScrobbleError(int)), SLOT(ScrobbleError(int))); LastFMButtonVisibilityChanged(app_->scrobbler()->AreButtonsVisible()); ScrobbleButtonVisibilityChanged(app_->scrobbler()->IsScrobbleButtonVisible()); ScrobblingEnabledChanged(app_->scrobbler()->IsScrobblingEnabled()); #else LastFMButtonVisibilityChanged(false); ScrobbleButtonVisibilityChanged(false); #endif // Load settings qLog(Debug) << "Loading settings"; settings_.beginGroup(kSettingsGroup); restoreGeometry(settings_.value("geometry").toByteArray()); if (!ui_->splitter->restoreState( settings_.value("splitter_state").toByteArray())) { ui_->splitter->setSizes(QList() << 300 << width() - 300); } ui_->tabs->SetCurrentIndex( settings_.value("current_tab", 1 /* Library tab */).toInt()); FancyTabWidget::Mode default_mode = FancyTabWidget::Mode_LargeSidebar; ui_->tabs->SetMode( FancyTabWidget::Mode(settings_.value("tab_mode", default_mode).toInt())); file_view_->SetPath( settings_.value("file_path", QDir::homePath()).toString()); // Users often collapse one side of the splitter by mistake and don't know // how to restore it. This must be set after the state is restored above. ui_->splitter->setChildrenCollapsible(false); ReloadSettings(); // Reload pretty OSD to avoid issues with fonts osd_->ReloadPrettyOSDSettings(); // Reload playlist settings, for BG and glowing ui_->playlist->view()->ReloadSettings(); #ifndef Q_OS_DARWIN StartupBehaviour behaviour = StartupBehaviour( settings_.value("startupbehaviour", Startup_Remember).toInt()); bool hidden = settings_.value("hidden", false).toBool(); switch (behaviour) { case Startup_AlwaysHide: hide(); break; case Startup_AlwaysShow: show(); break; case Startup_Remember: setVisible(!hidden); break; } // Force the window to show in case somehow the config has tray and window set // to hide if (hidden && !tray_icon_->IsVisible()) { settings_.setValue("hidden", false); show(); } #else // Q_OS_DARWIN // Always show mainwindow on startup on OS X. show(); #endif QShortcut* close_window_shortcut = new QShortcut(this); close_window_shortcut->setKey(Qt::CTRL + Qt::Key_W); connect(close_window_shortcut, SIGNAL(activated()), SLOT(SetHiddenInTray())); #ifdef HAVE_WIIMOTEDEV // http://code.google.com/p/clementine-player/issues/detail?id=670 // Switched position, mayby something is not ready ? wiimotedev_shortcuts_.reset( new WiimotedevShortcuts(osd_, this, app_->player())); #endif CheckFullRescanRevisions(); LoadPlaybackStatus(); qLog(Debug) << "Started"; } MainWindow::~MainWindow() { SaveGeometry(); delete ui_; } void MainWindow::ReloadSettings() { #ifndef Q_OS_DARWIN bool show_tray = settings_.value("showtray", true).toBool(); tray_icon_->SetVisible(show_tray); if (!show_tray && !isVisible()) show(); #endif QSettings s; s.beginGroup(kSettingsGroup); doubleclick_addmode_ = AddBehaviour(s.value("doubleclick_addmode", AddBehaviour_Append).toInt()); doubleclick_playmode_ = PlayBehaviour( s.value("doubleclick_playmode", PlayBehaviour_IfStopped).toInt()); doubleclick_playlist_addmode_ = PlaylistAddBehaviour(s.value("doubleclick_playlist_addmode", PlaylistAddBehaviour_Play).toInt()); menu_playmode_ = PlayBehaviour(s.value("menu_playmode", PlayBehaviour_IfStopped).toInt()); } void MainWindow::ReloadAllSettings() { ReloadSettings(); // Other settings app_->ReloadSettings(); app_->global_search()->ReloadSettings(); app_->library()->ReloadSettings(); app_->player()->ReloadSettings(); osd_->ReloadSettings(); library_view_->ReloadSettings(); song_info_view_->ReloadSettings(); app_->player()->engine()->ReloadSettings(); ui_->playlist->view()->ReloadSettings(); app_->internet_model()->ReloadSettings(); #ifdef HAVE_WIIMOTEDEV wiimotedev_shortcuts_->ReloadSettings(); #endif } void MainWindow::RefreshStyleSheet() { setStyleSheet(styleSheet()); } void MainWindow::MediaStopped() { setWindowTitle(QCoreApplication::applicationName()); ui_->action_stop->setEnabled(false); ui_->action_stop_after_this_track->setEnabled(false); ui_->action_play_pause->setIcon(IconLoader::Load("media-playback-start")); ui_->action_play_pause->setText(tr("Play")); ui_->action_play_pause->setEnabled(true); ui_->action_love->setEnabled(false); tray_icon_->LastFMButtonLoveStateChanged(false); track_position_timer_->stop(); track_slider_timer_->stop(); ui_->track_slider->SetStopped(); tray_icon_->SetProgress(0); tray_icon_->SetStopped(); } void MainWindow::MediaPaused() { ui_->action_stop->setEnabled(true); ui_->action_stop_after_this_track->setEnabled(true); ui_->action_play_pause->setIcon(IconLoader::Load("media-playback-start")); ui_->action_play_pause->setText(tr("Play")); ui_->action_play_pause->setEnabled(true); track_position_timer_->stop(); track_slider_timer_->stop(); tray_icon_->SetPaused(); } void MainWindow::MediaPlaying() { ui_->action_stop->setEnabled(true); ui_->action_stop_after_this_track->setEnabled(true); ui_->action_play_pause->setIcon(IconLoader::Load("media-playback-pause")); ui_->action_play_pause->setText(tr("Pause")); bool enable_play_pause = !(app_->player()->GetCurrentItem()->options() & PlaylistItem::PauseDisabled); ui_->action_play_pause->setEnabled(enable_play_pause); bool can_seek = !(app_->player()->GetCurrentItem()->options() & PlaylistItem::SeekDisabled); ui_->track_slider->SetCanSeek(can_seek); #ifdef HAVE_LIBLASTFM bool enable_love = app_->scrobbler()->IsScrobblingEnabled(); ui_->action_love->setEnabled(enable_love); tray_icon_->LastFMButtonLoveStateChanged(enable_love); tray_icon_->SetPlaying(enable_play_pause, enable_love); #else tray_icon_->SetPlaying(enable_play_pause); #endif track_position_timer_->start(); track_slider_timer_->start(); UpdateTrackPosition(); } void MainWindow::VolumeChanged(int volume) { ui_->action_mute->setChecked(!volume); tray_icon_->MuteButtonStateChanged(!volume); } void MainWindow::SongChanged(const Song& song) { setWindowTitle(song.PrettyTitleWithArtist()); tray_icon_->SetProgress(0); #ifdef HAVE_LIBLASTFM if (ui_->action_toggle_scrobbling->isVisible()) SetToggleScrobblingIcon(app_->scrobbler()->IsScrobblingEnabled()); #endif } void MainWindow::TrackSkipped(PlaylistItemPtr item) { // If it was a library item then we have to increment its skipped count in // the database. if (item && item->IsLocalLibraryItem() && item->Metadata().id() != -1 && app_->playlist_manager()->active()->get_lastfm_status() != Playlist::LastFM_Scrobbled && app_->playlist_manager()->active()->get_lastfm_status() != Playlist::LastFM_Queued) { Song song = item->Metadata(); const qint64 position = app_->player()->engine()->position_nanosec(); const qint64 length = app_->player()->engine()->length_nanosec(); const float percentage = (length == 0 ? 1 : float(position) / length); const qint64 seconds_left = (length - position) / kNsecPerSec; const qint64 seconds_total = length / kNsecPerSec; if (((0.05 * seconds_total > 60 && percentage < 0.98) || percentage < 0.95) && seconds_left > 5) { // Never count the skip if under 5 seconds left app_->library_backend()->IncrementSkipCountAsync(song.id(), percentage); } } } #ifdef HAVE_LIBLASTFM void MainWindow::ScrobblingEnabledChanged(bool value) { if (ui_->action_toggle_scrobbling->isVisible()) SetToggleScrobblingIcon(value); if (app_->player()->GetState() != Engine::Idle) { return; } else { // invalidate current song, we will scrobble the next one if (app_->playlist_manager()->active()->get_lastfm_status() == Playlist::LastFM_New) { app_->playlist_manager()->active()->set_lastfm_status( Playlist::LastFM_Seeked); } } ui_->action_love->setEnabled(value); tray_icon_->LastFMButtonLoveStateChanged(value); } #endif void MainWindow::LastFMButtonVisibilityChanged(bool value) { ui_->action_love->setVisible(value); ui_->last_fm_controls->setVisible(value); tray_icon_->LastFMButtonVisibilityChanged(value); } void MainWindow::ScrobbleButtonVisibilityChanged(bool value) { ui_->action_toggle_scrobbling->setVisible(value); ui_->scrobbling_button->setVisible(value); // when you reshow the buttons if (value) { // check if the song was scrobbled if (app_->playlist_manager()->active()->get_lastfm_status() == Playlist::LastFM_Scrobbled) { ui_->action_toggle_scrobbling->setIcon(QIcon(":/last.fm/as.png")); } else { #ifdef HAVE_LIBLASTFM SetToggleScrobblingIcon(app_->scrobbler()->IsScrobblingEnabled()); #endif } } } void MainWindow::resizeEvent(QResizeEvent*) { SaveGeometry(); } void MainWindow::SaveGeometry() { settings_.setValue("geometry", saveGeometry()); settings_.setValue("splitter_state", ui_->splitter->saveState()); settings_.setValue("current_tab", ui_->tabs->current_index()); settings_.setValue("tab_mode", ui_->tabs->mode()); } void MainWindow::SavePlaybackStatus() { QSettings settings; settings.beginGroup(MainWindow::kSettingsGroup); settings.setValue("playback_state", app_->player()->GetState()); if (app_->player()->GetState() == Engine::Playing || app_->player()->GetState() == Engine::Paused) { settings.setValue( "playback_position", app_->player()->engine()->position_nanosec() / kNsecPerSec); } else { settings.setValue("playback_position", 0); } } void MainWindow::LoadPlaybackStatus() { QSettings settings; settings.beginGroup(MainWindow::kSettingsGroup); bool resume_playback = settings.value("resume_playback_after_start", false).toBool(); saved_playback_state_ = static_cast( settings.value("playback_state", Engine::Empty).toInt()); saved_playback_position_ = settings.value("playback_position", 0).toDouble(); if (!resume_playback || saved_playback_state_ == Engine::Empty || saved_playback_state_ == Engine::Idle) { return; } QTimer::singleShot(100, this, SLOT(ResumePlayback())); } void MainWindow::ResumePlayback() { qLog(Debug) << "Resuming playback"; if (saved_playback_state_ == Engine::Paused) { NewClosure(app_->player(), SIGNAL(Playing()), app_->player(), SLOT(PlayPause())); } app_->player()->Play(); app_->player()->SeekTo(saved_playback_position_); } void MainWindow::PlayIndex(const QModelIndex& index) { if (!index.isValid()) return; int row = index.row(); if (index.model() == app_->playlist_manager()->current()->proxy()) { // The index was in the proxy model (might've been filtered), so we need // to get the actual row in the source model. row = app_->playlist_manager()->current()->proxy()->mapToSource(index).row(); } app_->playlist_manager()->SetActiveToCurrent(); app_->player()->PlayAt(row, Engine::Manual, true); } void MainWindow::PlaylistDoubleClick(const QModelIndex& index) { if (!index.isValid()) return; int row = index.row(); if (index.model() == app_->playlist_manager()->current()->proxy()) { // The index was in the proxy model (might've been filtered), so we need // to get the actual row in the source model. row = app_->playlist_manager()->current()->proxy()->mapToSource(index).row(); } QModelIndexList dummyIndexList; switch (doubleclick_playlist_addmode_) { case PlaylistAddBehaviour_Play: app_->playlist_manager()->SetActiveToCurrent(); app_->player()->PlayAt(row, Engine::Manual, true); break; case PlaylistAddBehaviour_Enqueue: dummyIndexList.append(index); app_->playlist_manager()->current()->queue()->ToggleTracks( dummyIndexList); if (app_->player()->GetState() != Engine::Playing) { app_->player()->PlayAt( app_->playlist_manager()->current()->queue()->TakeNext(), Engine::Manual, true); } break; } } void MainWindow::VolumeWheelEvent(int delta) { ui_->volume->setValue(ui_->volume->value() + delta / 30); } void MainWindow::ToggleShowHide() { if (settings_.value("hidden").toBool()) { show(); SetHiddenInTray(false); } else if (isActiveWindow()) { hide(); setWindowState((windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); SetHiddenInTray(true); } else if (isMinimized()) { hide(); setWindowState((windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); SetHiddenInTray(false); } else if (!isVisible()) { show(); activateWindow(); } else { // Window is not hidden but does not have focus; bring it to front. activateWindow(); raise(); } } void MainWindow::StopAfterCurrent() { app_->playlist_manager()->active()->StopAfter( app_->playlist_manager()->active()->current_row()); emit StopAfterToggled( app_->playlist_manager()->active()->stop_after_current()); } void MainWindow::closeEvent(QCloseEvent* event) { QSettings s; s.beginGroup(kSettingsGroup); bool keep_running = s.value("keeprunning", tray_icon_->IsVisible()).toBool(); if (keep_running && event->spontaneous()) { event->ignore(); SetHiddenInTray(true); } else { QApplication::quit(); } } void MainWindow::SetHiddenInTray(bool hidden) { settings_.setValue("hidden", hidden); // Some window managers don't remember maximized state between calls to // hide() and show(), so we have to remember it ourself. if (hidden) { was_maximized_ = isMaximized(); hide(); } else { if (was_maximized_) showMaximized(); else show(); } } void MainWindow::FilePathChanged(const QString& path) { settings_.setValue("file_path", path); } void MainWindow::Seeked(qlonglong microseconds) { const int position = microseconds / kUsecPerSec; const int length = app_->player()->GetCurrentItem()->Metadata().length_nanosec() / kNsecPerSec; tray_icon_->SetProgress(double(position) / length * 100); // if we seeked, scrobbling is canceled, update the icon if (ui_->action_toggle_scrobbling->isVisible()) SetToggleScrobblingIcon(true); } void MainWindow::UpdateTrackPosition() { // Track position in seconds Playlist* playlist = app_->playlist_manager()->active(); PlaylistItemPtr item(app_->player()->GetCurrentItem()); const int position = std::floor( float(app_->player()->engine()->position_nanosec()) / kNsecPerSec + 0.5); const int length = app_->player()->engine()->length_nanosec() / kNsecPerSec; const int scrobble_point = playlist->scrobble_point_nanosec() / kNsecPerSec; if (length <= 0) { // Probably a stream that we don't know the length of return; } #ifdef HAVE_LIBLASTFM const bool last_fm_enabled = ui_->action_toggle_scrobbling->isVisible() && app_->scrobbler()->IsScrobblingEnabled() && app_->scrobbler()->IsAuthenticated(); #endif // Time to scrobble? if (position >= scrobble_point) { if (playlist->get_lastfm_status() == Playlist::LastFM_New) { #ifdef HAVE_LIBLASTFM if (app_->scrobbler()->IsScrobblingEnabled() && app_->scrobbler()->IsAuthenticated()) { qLog(Info) << "Scrobbling at" << scrobble_point; app_->scrobbler()->Scrobble(); } #endif } // Update the play count for the song if it's from the library if (!playlist->have_incremented_playcount() && item->IsLocalLibraryItem() && item->Metadata().id() != -1 && playlist->get_lastfm_status() != Playlist::LastFM_Seeked) { app_->library_backend()->IncrementPlayCountAsync(item->Metadata().id()); playlist->set_have_incremented_playcount(); } } // (just after) the scrobble point is a good point to change tracks in intro // mode if (position >= scrobble_point + 5) { if (playlist->sequence()->repeat_mode() == PlaylistSequence::Repeat_Intro) { emit IntroPointReached(); } } // Update the tray icon every 10 seconds if (position % 10 == 0) { qLog(Debug) << "position" << position << "scrobble point" << scrobble_point << "status" << playlist->get_lastfm_status(); tray_icon_->SetProgress(double(position) / length * 100); // if we're waiting for the scrobble point, update the icon #ifdef HAVE_LIBLASTFM if (position < scrobble_point && playlist->get_lastfm_status() == Playlist::LastFM_New && last_fm_enabled) { ui_->action_toggle_scrobbling->setIcon( CreateOverlayedIcon(position, scrobble_point)); } #endif } } void MainWindow::UpdateTrackSliderPosition() { PlaylistItemPtr item(app_->player()->GetCurrentItem()); const int slider_position = std::floor( float(app_->player()->engine()->position_nanosec()) / kNsecPerMsec); const int slider_length = app_->player()->engine()->length_nanosec() / kNsecPerMsec; // Update the slider ui_->track_slider->SetValue(slider_position, slider_length); } #ifdef HAVE_LIBLASTFM void MainWindow::ScrobbledRadioStream() { ui_->action_love->setEnabled(true); tray_icon_->LastFMButtonLoveStateChanged(true); } void MainWindow::Love() { app_->scrobbler()->Love(); ui_->action_love->setEnabled(false); tray_icon_->LastFMButtonLoveStateChanged(false); } #endif void MainWindow::ApplyAddBehaviour(MainWindow::AddBehaviour b, MimeData* data) const { switch (b) { case AddBehaviour_Append: data->clear_first_ = false; data->enqueue_now_ = false; break; case AddBehaviour_Enqueue: data->clear_first_ = false; data->enqueue_now_ = true; break; case AddBehaviour_Load: data->clear_first_ = true; data->enqueue_now_ = false; break; case AddBehaviour_OpenInNew: data->open_in_new_playlist_ = true; break; } } void MainWindow::ApplyPlayBehaviour(MainWindow::PlayBehaviour b, MimeData* data) const { switch (b) { case PlayBehaviour_Always: data->play_now_ = true; break; case PlayBehaviour_Never: data->play_now_ = false; break; case PlayBehaviour_IfStopped: data->play_now_ = !(app_->player()->GetState() == Engine::Playing); break; } } void MainWindow::AddToPlaylist(QMimeData* data) { if (!data) return; if (MimeData* mime_data = qobject_cast(data)) { // Should we replace the flags with the user's preference? if (mime_data->override_user_settings_) { // Do nothing } else if (mime_data->from_doubleclick_) { ApplyAddBehaviour(doubleclick_addmode_, mime_data); ApplyPlayBehaviour(doubleclick_playmode_, mime_data); } else { ApplyPlayBehaviour(menu_playmode_, mime_data); } // Should we create a new playlist for the songs? if (mime_data->open_in_new_playlist_) { app_->playlist_manager()->New(mime_data->get_name_for_new_playlist()); } } app_->playlist_manager()->current()->dropMimeData(data, Qt::CopyAction, -1, 0, QModelIndex()); delete data; } void MainWindow::AddToPlaylist(QAction* action) { int destination = action->data().toInt(); PlaylistItemList items; // get the selected playlist items for (const QModelIndex& index : ui_->playlist->view()->selectionModel()->selection().indexes()) { if (index.column() != 0) continue; int row = app_->playlist_manager()->current()->proxy()->mapToSource(index).row(); items << app_->playlist_manager()->current()->item_at(row); } SongList songs; for (PlaylistItemPtr item : items) { songs << item->Metadata(); } // we're creating a new playlist if (destination == -1) { // save the current playlist to reactivate it int current_id = app_->playlist_manager()->current_id(); // get the name from selection app_->playlist_manager()->New( app_->playlist_manager()->GetNameForNewPlaylist(songs)); if (app_->playlist_manager()->current()->id() != current_id) { // I'm sure the new playlist was created and is selected, so I can just // insert items app_->playlist_manager()->current()->InsertItems(items); // set back the current playlist app_->playlist_manager()->SetCurrentPlaylist(current_id); } } else { // we're inserting in a existing playlist app_->playlist_manager()->playlist(destination)->InsertItems(items); } } void MainWindow::PlaylistRightClick(const QPoint& global_pos, const QModelIndex& index) { QModelIndex source_index = app_->playlist_manager()->current()->proxy()->mapToSource(index); playlist_menu_index_ = source_index; // Is this song currently playing? if (app_->playlist_manager()->current()->current_row() == source_index.row() && app_->player()->GetState() == Engine::Playing) { playlist_play_pause_->setText(tr("Pause")); playlist_play_pause_->setIcon(IconLoader::Load("media-playback-pause")); } else { playlist_play_pause_->setText(tr("Play")); playlist_play_pause_->setIcon(IconLoader::Load("media-playback-start")); } // Are we allowed to pause? if (index.isValid()) { playlist_play_pause_->setEnabled( app_->playlist_manager()->current()->current_row() != source_index.row() || !(app_->playlist_manager() ->current() ->item_at(source_index.row()) ->options() & PlaylistItem::PauseDisabled)); } else { playlist_play_pause_->setEnabled(false); } playlist_stop_after_->setEnabled(index.isValid()); // Are any of the selected songs editable or queued? QModelIndexList selection = ui_->playlist->view()->selectionModel()->selection().indexes(); bool cue_selected = false; int editable = 0; int streams = 0; int in_queue = 0; int not_in_queue = 0; int in_skipped = 0; int not_in_skipped = 0; for (const QModelIndex& index : selection) { if (index.column() != 0) continue; PlaylistItemPtr item = app_->playlist_manager()->current()->item_at(index.row()); if (item->Metadata().has_cue()) { cue_selected = true; } else if (item->Metadata().IsEditable()) { editable++; } if (item->Metadata().is_stream()) { streams++; } if (index.data(Playlist::Role_QueuePosition).toInt() == -1) not_in_queue++; else in_queue++; if (item->GetShouldSkip()) { in_skipped++; } else { not_in_skipped++; } } int all = not_in_queue + in_queue; // this is available when we have one or many files and at least one of // those is not CUE related ui_->action_edit_track->setEnabled(editable); ui_->action_edit_track->setVisible(editable); ui_->action_auto_complete_tags->setEnabled(editable); ui_->action_auto_complete_tags->setVisible(editable); // the rest of the read / write actions work only when there are no CUEs // involved if (cue_selected) editable = 0; // no 'show in browser' action if only streams are selected playlist_open_in_browser_->setVisible(streams != all); bool track_column = (index.column() == Playlist::Column_Track); ui_->action_renumber_tracks->setVisible(editable >= 2 && track_column); ui_->action_selection_set_value->setVisible(editable >= 2 && !track_column); ui_->action_edit_value->setVisible(editable); ui_->action_remove_from_playlist->setEnabled(!selection.isEmpty()); playlist_show_in_library_->setVisible(false); playlist_copy_to_library_->setVisible(false); playlist_move_to_library_->setVisible(false); playlist_organise_->setVisible(false); playlist_delete_->setVisible(false); playlist_copy_to_device_->setVisible(false); if (in_queue == 1 && not_in_queue == 0) playlist_queue_->setText(tr("Dequeue track")); else if (in_queue > 1 && not_in_queue == 0) playlist_queue_->setText(tr("Dequeue selected tracks")); else if (in_queue == 0 && not_in_queue == 1) playlist_queue_->setText(tr("Queue track")); else if (in_queue == 0 && not_in_queue > 1) playlist_queue_->setText(tr("Queue selected tracks")); else playlist_queue_->setText(tr("Toggle queue status")); if (in_skipped == 1 && not_in_skipped == 0) playlist_skip_->setText(tr("Unskip track")); else if (in_skipped > 1 && not_in_skipped == 0) playlist_skip_->setText(tr("Unskip selected tracks")); else if (in_skipped == 0 && not_in_skipped == 1) playlist_skip_->setText(tr("Skip track")); else if (in_skipped == 0 && not_in_skipped > 1) playlist_skip_->setText(tr("Skip selected tracks")); if (not_in_queue == 0) playlist_queue_->setIcon(IconLoader::Load("go-previous")); else playlist_queue_->setIcon(IconLoader::Load("go-next")); if (!index.isValid()) { ui_->action_selection_set_value->setVisible(false); ui_->action_edit_value->setVisible(false); } else { Playlist::Column column = (Playlist::Column)index.column(); bool column_is_editable = Playlist::column_is_editable(column) && editable; ui_->action_selection_set_value->setVisible( ui_->action_selection_set_value->isVisible() && column_is_editable); ui_->action_edit_value->setVisible(ui_->action_edit_value->isVisible() && column_is_editable); QString column_name = Playlist::column_name(column); QString column_value = app_->playlist_manager()->current()->data(source_index).toString(); if (column_value.length() > 25) column_value = column_value.left(25) + "..."; ui_->action_selection_set_value->setText( tr("Set %1 to \"%2\"...").arg(column_name.toLower()).arg(column_value)); ui_->action_edit_value->setText(tr("Edit tag \"%1\"...").arg(column_name)); // Is it a library item? PlaylistItemPtr item = app_->playlist_manager()->current()->item_at(source_index.row()); if (item->IsLocalLibraryItem() && item->Metadata().id() != -1) { playlist_organise_->setVisible(editable); playlist_show_in_library_->setVisible(editable); } else { playlist_copy_to_library_->setVisible(editable); playlist_move_to_library_->setVisible(editable); } playlist_delete_->setVisible(editable); playlist_copy_to_device_->setVisible(editable); // Remove old item actions, if any. for (QAction* action : playlistitem_actions_) { playlist_menu_->removeAction(action); } // Get the new item actions, and add them playlistitem_actions_ = item->actions(); playlistitem_actions_separator_->setVisible( !playlistitem_actions_.isEmpty()); playlist_menu_->insertActions(playlistitem_actions_separator_, playlistitem_actions_); } // if it isn't the first time we right click, we need to remove the menu // previously created if (playlist_add_to_another_ != nullptr) { playlist_menu_->removeAction(playlist_add_to_another_); delete playlist_add_to_another_; } // create the playlist submenu QMenu* add_to_another_menu = new QMenu(tr("Add to another playlist"), this); add_to_another_menu->setIcon(IconLoader::Load("list-add")); for (const PlaylistBackend::Playlist& playlist : app_->playlist_backend()->GetAllOpenPlaylists()) { // don't add the current playlist if (playlist.id != app_->playlist_manager()->current()->id()) { QAction* existing_playlist = new QAction(this); existing_playlist->setText(playlist.name); existing_playlist->setData(playlist.id); add_to_another_menu->addAction(existing_playlist); } } add_to_another_menu->addSeparator(); // add to a new playlist QAction* new_playlist = new QAction(this); new_playlist->setText(tr("New playlist")); new_playlist->setData(-1); // fake id add_to_another_menu->addAction(new_playlist); playlist_add_to_another_ = playlist_menu_->insertMenu( ui_->action_remove_from_playlist, add_to_another_menu); connect(add_to_another_menu, SIGNAL(triggered(QAction*)), SLOT(AddToPlaylist(QAction*))); playlist_menu_->popup(global_pos); } void MainWindow::PlaylistPlay() { if (app_->playlist_manager()->current()->current_row() == playlist_menu_index_.row()) { app_->player()->PlayPause(); } else { PlayIndex(playlist_menu_index_); } } void MainWindow::PlaylistStopAfter() { app_->playlist_manager()->current()->StopAfter(playlist_menu_index_.row()); } void MainWindow::EditTracks() { SongList songs; PlaylistItemList items; for (const QModelIndex& index : ui_->playlist->view()->selectionModel()->selection().indexes()) { if (index.column() != 0) continue; int row = app_->playlist_manager()->current()->proxy()->mapToSource(index).row(); PlaylistItemPtr item(app_->playlist_manager()->current()->item_at(row)); Song song = item->Metadata(); if (song.IsEditable()) { songs << song; items << item; } } EnsureEditTagDialogCreated(); edit_tag_dialog_->SetSongs(songs, items); edit_tag_dialog_->show(); } void MainWindow::EditTagDialogAccepted() { for (PlaylistItemPtr item : edit_tag_dialog_->playlist_items()) { item->Reload(); } // This is really lame but we don't know what rows have changed ui_->playlist->view()->update(); app_->playlist_manager()->current()->Save(); } void MainWindow::RenumberTracks() { QModelIndexList indexes = ui_->playlist->view()->selectionModel()->selection().indexes(); int track = 1; // Get the index list in order qStableSort(indexes); // if first selected song has a track number set, start from that offset if (!indexes.isEmpty()) { const Song first_song = app_->playlist_manager() ->current() ->item_at(indexes[0].row()) ->Metadata(); if (first_song.track() > 0) track = first_song.track(); } for (const QModelIndex& index : indexes) { if (index.column() != 0) continue; const QModelIndex source_index = app_->playlist_manager()->current()->proxy()->mapToSource(index); int row = source_index.row(); Song song = app_->playlist_manager()->current()->item_at(row)->Metadata(); if (song.IsEditable()) { song.set_track(track); TagReaderReply* reply = TagReaderClient::Instance()->SaveFile(song.url().toLocalFile(), song); NewClosure(reply, SIGNAL(Finished(bool)), this, SLOT(SongSaveComplete(TagReaderReply*, QPersistentModelIndex)), reply, QPersistentModelIndex(source_index)); } track++; } } void MainWindow::SongSaveComplete(TagReaderReply* reply, const QPersistentModelIndex& index) { if (reply->is_successful() && index.isValid()) { app_->playlist_manager()->current()->ReloadItems(QList() << index.row()); } reply->deleteLater(); } void MainWindow::SelectionSetValue() { Playlist::Column column = (Playlist::Column)playlist_menu_index_.column(); QVariant column_value = app_->playlist_manager()->current()->data(playlist_menu_index_); QModelIndexList indexes = ui_->playlist->view()->selectionModel()->selection().indexes(); for (const QModelIndex& index : indexes) { if (index.column() != 0) continue; const QModelIndex source_index = app_->playlist_manager()->current()->proxy()->mapToSource(index); int row = source_index.row(); Song song = app_->playlist_manager()->current()->item_at(row)->Metadata(); if (Playlist::set_column_value(song, column, column_value)) { TagReaderReply* reply = TagReaderClient::Instance()->SaveFile(song.url().toLocalFile(), song); NewClosure(reply, SIGNAL(Finished(bool)), this, SLOT(SongSaveComplete(TagReaderReply*, QPersistentModelIndex)), reply, QPersistentModelIndex(source_index)); } } } void MainWindow::EditValue() { QModelIndex current = ui_->playlist->view()->currentIndex(); if (!current.isValid()) return; // Edit the last column that was right-clicked on. If nothing's ever been // right clicked then look for the first editable column. int column = playlist_menu_index_.column(); if (column == -1) { for (int i = 0; i < ui_->playlist->view()->model()->columnCount(); ++i) { if (ui_->playlist->view()->isColumnHidden(i)) continue; if (!Playlist::column_is_editable(Playlist::Column(i))) continue; column = i; break; } } ui_->playlist->view()->edit(current.sibling(current.row(), column)); } void MainWindow::AddFile() { // Last used directory QString directory = settings_.value("add_media_path", QDir::currentPath()).toString(); PlaylistParser parser(app_->library_backend()); // Show dialog QStringList file_names = QFileDialog::getOpenFileNames( this, tr("Add file"), directory, QString("%1 (%2);;%3;;%4").arg(tr("Music"), FileView::kFileFilter, parser.filters(), tr(kAllFilesFilterSpec))); if (file_names.isEmpty()) return; // Save last used directory settings_.setValue("add_media_path", file_names[0]); // Convert to URLs QList urls; for (const QString& path : file_names) { urls << QUrl::fromLocalFile(QFileInfo(path).canonicalFilePath()); } MimeData* data = new MimeData; data->setUrls(urls); AddToPlaylist(data); } void MainWindow::AddFolder() { // Last used directory QString directory = settings_.value("add_folder_path", QDir::currentPath()).toString(); // Show dialog directory = QFileDialog::getExistingDirectory(this, tr("Add folder"), directory); if (directory.isEmpty()) return; // Save last used directory settings_.setValue("add_folder_path", directory); // Add media MimeData* data = new MimeData; data->setUrls(QList() << QUrl::fromLocalFile( QFileInfo(directory).canonicalFilePath())); AddToPlaylist(data); } void MainWindow::AddStream() { if (!add_stream_dialog_) { add_stream_dialog_.reset(new AddStreamDialog); connect(add_stream_dialog_.get(), SIGNAL(accepted()), SLOT(AddStreamAccepted())); add_stream_dialog_->set_add_on_accept(InternetModel::Service()); } add_stream_dialog_->show(); } void MainWindow::AddStreamAccepted() { MimeData* data = new MimeData; data->setUrls(QList() << add_stream_dialog_->url()); AddToPlaylist(data); } void MainWindow::OpenRipCDDialog() { #ifdef HAVE_AUDIOCD if (!rip_cd_dialog_) { rip_cd_dialog_.reset(new RipCDDialog); } if (rip_cd_dialog_->CheckCDIOIsValid()) { rip_cd_dialog_->show(); } else { QMessageBox cdio_fail(QMessageBox::Critical, tr("Error"), tr("Failed reading CD drive")); cdio_fail.exec(); } #endif } void MainWindow::AddCDTracks() { MimeData* data = new MimeData; // We are putting empty data, but we specify cdda mimetype to indicate that // we want to load audio cd tracks data->open_in_new_playlist_ = true; data->setData(Playlist::kCddaMimeType, QByteArray()); AddToPlaylist(data); } void MainWindow::ShowInLibrary() { // Show the first valid selected track artist/album in LibraryView QModelIndexList proxy_indexes = ui_->playlist->view()->selectionModel()->selectedRows(); SongList songs; for (const QModelIndex& proxy_index : proxy_indexes) { QModelIndex index = app_->playlist_manager()->current()->proxy()->mapToSource(proxy_index); if (app_->playlist_manager() ->current() ->item_at(index.row()) ->IsLocalLibraryItem()) { songs << app_->playlist_manager() ->current() ->item_at(index.row()) ->Metadata(); break; } } QString search; if (!songs.isEmpty()) { search = "artist:" + songs.first().artist() + " album:" + songs.first().album(); } library_view_->filter()->ShowInLibrary(search); } void MainWindow::PlaylistRemoveCurrent() { ui_->playlist->view()->RemoveSelected(); } void MainWindow::PlaylistEditFinished(const QModelIndex& index) { if (index == playlist_menu_index_) SelectionSetValue(); } void MainWindow::CommandlineOptionsReceived( const QByteArray& serialized_options) { if (serialized_options == "wake up!") { // Old versions of Clementine sent this - just ignore it return; } CommandlineOptions options; options.Load(serialized_options); if (options.is_empty()) { show(); activateWindow(); } else CommandlineOptionsReceived(options); } void MainWindow::CommandlineOptionsReceived(const CommandlineOptions& options) { switch (options.player_action()) { case CommandlineOptions::Player_Play: if (options.urls().empty()) { app_->player()->Play(); } break; case CommandlineOptions::Player_PlayPause: app_->player()->PlayPause(); break; case CommandlineOptions::Player_Pause: app_->player()->Pause(); break; case CommandlineOptions::Player_Stop: app_->player()->Stop(); break; case CommandlineOptions::Player_Previous: app_->player()->Previous(); break; case CommandlineOptions::Player_Next: app_->player()->Next(); break; case CommandlineOptions::Player_RestartOrPrevious: app_->player()->RestartOrPrevious(); break; case CommandlineOptions::Player_None: break; } if (!options.urls().empty()) { MimeData* data = new MimeData; data->setUrls(options.urls()); // Behaviour depends on command line options, so set it here data->override_user_settings_ = true; if (options.player_action() == CommandlineOptions::Player_Play) data->play_now_ = true; else ApplyPlayBehaviour(doubleclick_playmode_, data); switch (options.url_list_action()) { case CommandlineOptions::UrlList_Load: data->clear_first_ = true; break; case CommandlineOptions::UrlList_Append: // Nothing to do break; case CommandlineOptions::UrlList_None: ApplyAddBehaviour(doubleclick_addmode_, data); break; } AddToPlaylist(data); } if (options.set_volume() != -1) app_->player()->SetVolume(options.set_volume()); if (options.volume_modifier() != 0) app_->player()->SetVolume(app_->player()->GetVolume() + options.volume_modifier()); if (options.seek_to() != -1) app_->player()->SeekTo(options.seek_to()); else if (options.seek_by() != 0) app_->player()->SeekTo(app_->player()->engine()->position_nanosec() / kNsecPerSec + options.seek_by()); if (options.play_track_at() != -1) app_->player()->PlayAt(options.play_track_at(), Engine::Manual, true); if (options.show_osd()) app_->player()->ShowOSD(); if (options.toggle_pretty_osd()) app_->player()->TogglePrettyOSD(); } void MainWindow::ForceShowOSD(const Song& song, const bool toggle) { if (toggle) { osd_->SetPrettyOSDToggleMode(toggle); } osd_->ReshowCurrentSong(); } void MainWindow::Activate() { show(); } bool MainWindow::LoadUrl(const QString& url) { if (!QFile::exists(url)) return false; MimeData* data = new MimeData; data->setUrls(QList() << QUrl::fromLocalFile(url)); AddToPlaylist(data); return true; } void MainWindow::CheckForUpdates() { #if defined(Q_OS_DARWIN) mac::CheckForUpdates(); #endif } void MainWindow::PlaylistUndoRedoChanged(QAction* undo, QAction* redo) { playlist_menu_->insertAction(playlist_undoredo_, undo); playlist_menu_->insertAction(playlist_undoredo_, redo); } void MainWindow::AddFilesToTranscoder() { if (!transcode_dialog_) { transcode_dialog_.reset(new TranscodeDialog); } QStringList filenames; for (const QModelIndex& index : ui_->playlist->view()->selectionModel()->selection().indexes()) { if (index.column() != 0) continue; int row = app_->playlist_manager()->current()->proxy()->mapToSource(index).row(); PlaylistItemPtr item(app_->playlist_manager()->current()->item_at(row)); Song song = item->Metadata(); filenames << song.url().toLocalFile(); } transcode_dialog_->SetFilenames(filenames); ShowTranscodeDialog(); } void MainWindow::ShowLibraryConfig() { EnsureSettingsDialogCreated(); settings_dialog_->OpenAtPage(SettingsDialog::Page_Library); } void MainWindow::TaskCountChanged(int count) { if (count == 0) { ui_->status_bar_stack->setCurrentWidget(ui_->playlist_summary_page); } else { ui_->status_bar_stack->setCurrentWidget(ui_->multi_loading_indicator); } } void MainWindow::NowPlayingWidgetPositionChanged(bool above_status_bar) { if (above_status_bar) { ui_->status_bar->setParent(ui_->centralWidget); } else { ui_->status_bar->setParent(ui_->player_controls_container); } ui_->status_bar->parentWidget()->layout()->addWidget(ui_->status_bar); ui_->status_bar->show(); } void MainWindow::CopyFilesToLibrary(const QList& urls) { organise_dialog_->SetDestinationModel( app_->library_model()->directory_model()); organise_dialog_->SetUrls(urls); organise_dialog_->SetCopy(true); organise_dialog_->show(); } void MainWindow::MoveFilesToLibrary(const QList& urls) { organise_dialog_->SetDestinationModel( app_->library_model()->directory_model()); organise_dialog_->SetUrls(urls); organise_dialog_->SetCopy(false); organise_dialog_->show(); } void MainWindow::CopyFilesToDevice(const QList& urls) { organise_dialog_->SetDestinationModel( app_->device_manager()->connected_devices_model(), true); organise_dialog_->SetCopy(true); if (organise_dialog_->SetUrls(urls)) organise_dialog_->show(); else { QMessageBox::warning( this, tr("Error"), tr("None of the selected songs were suitable for copying to a device")); } } void MainWindow::EditFileTags(const QList& urls) { EnsureEditTagDialogCreated(); SongList songs; for (const QUrl& url : urls) { Song song; song.set_url(url); song.set_valid(true); song.set_filetype(Song::Type_Mpeg); songs << song; } edit_tag_dialog_->SetSongs(songs); edit_tag_dialog_->show(); } void MainWindow::PlaylistCopyToLibrary() { PlaylistOrganiseSelected(true); } void MainWindow::PlaylistMoveToLibrary() { PlaylistOrganiseSelected(false); } void MainWindow::PlaylistOrganiseSelected(bool copy) { QModelIndexList proxy_indexes = ui_->playlist->view()->selectionModel()->selectedRows(); SongList songs; for (const QModelIndex& proxy_index : proxy_indexes) { QModelIndex index = app_->playlist_manager()->current()->proxy()->mapToSource(proxy_index); songs << app_->playlist_manager() ->current() ->item_at(index.row()) ->Metadata(); } organise_dialog_->SetDestinationModel( app_->library_model()->directory_model()); organise_dialog_->SetSongs(songs); organise_dialog_->SetCopy(copy); organise_dialog_->show(); } void MainWindow::PlaylistDelete() { // Note: copied from LibraryView::Delete if (QMessageBox::warning(this, tr("Delete files"), tr("These files will be permanently deleted from " "disk, are you sure you want to continue?"), QMessageBox::Yes, QMessageBox::Cancel) != QMessageBox::Yes) return; std::shared_ptr storage(new FilesystemMusicStorage("/")); // Get selected songs SongList selected_songs; QModelIndexList proxy_indexes = ui_->playlist->view()->selectionModel()->selectedRows(); for (const QModelIndex& proxy_index : proxy_indexes) { QModelIndex index = app_->playlist_manager()->current()->proxy()->mapToSource(proxy_index); selected_songs << app_->playlist_manager() ->current() ->item_at(index.row()) ->Metadata(); } ui_->playlist->view()->RemoveSelected(); DeleteFiles* delete_files = new DeleteFiles(app_->task_manager(), storage); connect(delete_files, SIGNAL(Finished(SongList)), SLOT(DeleteFinished(SongList))); delete_files->Start(selected_songs); } void MainWindow::PlaylistOpenInBrowser() { QList urls; QModelIndexList proxy_indexes = ui_->playlist->view()->selectionModel()->selectedRows(); for (const QModelIndex& proxy_index : proxy_indexes) { const QModelIndex index = app_->playlist_manager()->current()->proxy()->mapToSource(proxy_index); urls << QUrl(index.sibling(index.row(), Playlist::Column_Filename) .data() .toString()); } Utilities::OpenInFileBrowser(urls); } void MainWindow::DeleteFinished(const SongList& songs_with_errors) { if (songs_with_errors.isEmpty()) return; OrganiseErrorDialog* dialog = new OrganiseErrorDialog(this); dialog->Show(OrganiseErrorDialog::Type_Delete, songs_with_errors); // It deletes itself when the user closes it } void MainWindow::PlaylistQueue() { QModelIndexList indexes; for (const QModelIndex& proxy_index : ui_->playlist->view()->selectionModel()->selectedRows()) { indexes << app_->playlist_manager()->current()->proxy()->mapToSource( proxy_index); } app_->playlist_manager()->current()->queue()->ToggleTracks(indexes); } void MainWindow::PlaylistSkip() { QModelIndexList indexes; for (const QModelIndex& proxy_index : ui_->playlist->view()->selectionModel()->selectedRows()) { indexes << app_->playlist_manager()->current()->proxy()->mapToSource( proxy_index); } app_->playlist_manager()->current()->SkipTracks(indexes); } void MainWindow::PlaylistCopyToDevice() { QModelIndexList proxy_indexes = ui_->playlist->view()->selectionModel()->selectedRows(); SongList songs; for (const QModelIndex& proxy_index : proxy_indexes) { QModelIndex index = app_->playlist_manager()->current()->proxy()->mapToSource(proxy_index); songs << app_->playlist_manager() ->current() ->item_at(index.row()) ->Metadata(); } organise_dialog_->SetDestinationModel( app_->device_manager()->connected_devices_model(), true); organise_dialog_->SetCopy(true); if (organise_dialog_->SetSongs(songs)) organise_dialog_->show(); else { QMessageBox::warning( this, tr("Error"), tr("None of the selected songs were suitable for copying to a device")); } } void MainWindow::ChangeLibraryQueryMode(QAction* action) { if (action == library_show_duplicates_) { library_view_->filter()->SetQueryMode(QueryOptions::QueryMode_Duplicates); } else if (action == library_show_untagged_) { library_view_->filter()->SetQueryMode(QueryOptions::QueryMode_Untagged); } else { library_view_->filter()->SetQueryMode(QueryOptions::QueryMode_All); } } void MainWindow::ShowCoverManager() { if (!cover_manager_) { cover_manager_.reset(new AlbumCoverManager(app_, app_->library_backend())); cover_manager_->Init(); // Cover manager connections connect(cover_manager_.get(), SIGNAL(AddToPlaylist(QMimeData*)), SLOT(AddToPlaylist(QMimeData*))); } cover_manager_->show(); } void MainWindow::EnsureSettingsDialogCreated() { if (settings_dialog_) return; settings_dialog_.reset(new SettingsDialog(app_, background_streams_)); settings_dialog_->SetGlobalShortcutManager(global_shortcuts_); settings_dialog_->SetSongInfoView(song_info_view_); // Settings connect(settings_dialog_.get(), SIGNAL(accepted()), SLOT(ReloadAllSettings())); #ifdef HAVE_WIIMOTEDEV connect(settings_dialog_.get(), SIGNAL(SetWiimotedevInterfaceActived(bool)), wiimotedev_shortcuts_.get(), SLOT(SetWiimotedevInterfaceActived(bool))); #endif // Allows custom notification preview connect(settings_dialog_.get(), SIGNAL(NotificationPreview(OSD::Behaviour, QString, QString)), SLOT(HandleNotificationPreview(OSD::Behaviour, QString, QString))); } void MainWindow::OpenSettingsDialog() { EnsureSettingsDialogCreated(); settings_dialog_->show(); } void MainWindow::OpenSettingsDialogAtPage(SettingsDialog::Page page) { EnsureSettingsDialogCreated(); settings_dialog_->OpenAtPage(page); } void MainWindow::EnsureEditTagDialogCreated() { if (edit_tag_dialog_) return; edit_tag_dialog_.reset(new EditTagDialog(app_)); connect(edit_tag_dialog_.get(), SIGNAL(accepted()), SLOT(EditTagDialogAccepted())); connect(edit_tag_dialog_.get(), SIGNAL(Error(QString)), SLOT(ShowErrorDialog(QString))); } void MainWindow::ShowAboutDialog() { if (!about_dialog_) { about_dialog_.reset(new About); } about_dialog_->show(); } void MainWindow::ShowTranscodeDialog() { if (!transcode_dialog_) { transcode_dialog_.reset(new TranscodeDialog); } transcode_dialog_->show(); } void MainWindow::ShowErrorDialog(const QString& message) { if (!error_dialog_) { error_dialog_.reset(new ErrorDialog); } error_dialog_->ShowMessage(message); } void MainWindow::CheckFullRescanRevisions() { int from = app_->database()->startup_schema_version(); int to = app_->database()->current_schema_version(); // if we're restoring DB from scratch or nothing has // changed, do nothing if (from == 0 || from == to) { return; } // collect all reasons QSet reasons; for (int i = from; i <= to; i++) { QString reason = app_->library()->full_rescan_reason(i); if (!reason.isEmpty()) { reasons.insert(reason); } } // if we have any... if (!reasons.isEmpty()) { QString message = tr("The version of Clementine you've just updated to " "requires a full library rescan " "because of the new features listed below:") + "
    "; for (const QString& reason : reasons) { message += ("
  • " + reason + "
  • "); } message += "
" + tr("Would you like to run a full rescan right now?"); if (QMessageBox::question(this, tr("Library rescan notice"), message, QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) { app_->library()->FullScan(); } } } void MainWindow::ShowQueueManager() { if (!queue_manager_) { queue_manager_.reset(new QueueManager); queue_manager_->SetPlaylistManager(app_->playlist_manager()); } queue_manager_->show(); } void MainWindow::ShowVisualisations() { #ifdef ENABLE_VISUALISATIONS if (!visualisation_) { visualisation_.reset(new VisualisationContainer); visualisation_->SetActions(ui_->action_previous_track, ui_->action_play_pause, ui_->action_stop, ui_->action_next_track); connect(app_->player(), SIGNAL(Stopped()), visualisation_.get(), SLOT(Stopped())); connect(app_->player(), SIGNAL(ForceShowOSD(Song, bool)), visualisation_.get(), SLOT(SongMetadataChanged(Song))); connect(app_->playlist_manager(), SIGNAL(CurrentSongChanged(Song)), visualisation_.get(), SLOT(SongMetadataChanged(Song))); visualisation_->SetEngine( qobject_cast(app_->player()->engine())); } visualisation_->show(); #endif // ENABLE_VISUALISATIONS } void MainWindow::ConnectInfoView(SongInfoBase* view) { connect(app_->playlist_manager(), SIGNAL(CurrentSongChanged(Song)), view, SLOT(SongChanged(Song))); connect(app_->player(), SIGNAL(PlaylistFinished()), view, SLOT(SongFinished())); connect(app_->player(), SIGNAL(Stopped()), view, SLOT(SongFinished())); connect(view, SIGNAL(ShowSettingsDialog()), SLOT(ShowSongInfoConfig())); connect(view, SIGNAL(DoGlobalSearch(QString)), SLOT(DoGlobalSearch(QString))); } void MainWindow::AddSongInfoGenerator(smart_playlists::GeneratorPtr gen) { if (!gen) return; gen->set_library(app_->library_backend()); AddToPlaylist(new smart_playlists::GeneratorMimeData(gen)); } void MainWindow::ShowSongInfoConfig() { OpenSettingsDialogAtPage(SettingsDialog::Page_SongInformation); } void MainWindow::PlaylistViewSelectionModelChanged() { connect(ui_->playlist->view()->selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex)), SLOT(PlaylistCurrentChanged(QModelIndex))); } void MainWindow::PlaylistCurrentChanged(const QModelIndex& proxy_current) { const QModelIndex source_current = app_->playlist_manager()->current()->proxy()->mapToSource(proxy_current); // If the user moves the current index using the keyboard and then presses // F2, we don't want that editing the last column that was right clicked on. if (source_current != playlist_menu_index_) playlist_menu_index_ = QModelIndex(); } void MainWindow::Raise() { show(); activateWindow(); } #ifdef Q_OS_WIN32 bool MainWindow::winEvent(MSG* msg, long*) { thumbbar_->HandleWinEvent(msg); return false; } #endif // Q_OS_WIN32 void MainWindow::Exit() { SavePlaybackStatus(); if (app_->player()->engine()->is_fadeout_enabled()) { // To shut down the application when fadeout will be finished connect(app_->player()->engine(), SIGNAL(FadeoutFinishedSignal()), qApp, SLOT(quit())); if (app_->player()->GetState() == Engine::Playing) { app_->player()->Stop(); hide(); tray_icon_->SetVisible(false); return; // Don't quit the application now: wait for the fadeout finished // signal } } qApp->quit(); } void MainWindow::AutoCompleteTags() { // Create the tag fetching stuff if it hasn't been already if (!tag_fetcher_) { tag_fetcher_.reset(new TagFetcher); track_selection_dialog_.reset(new TrackSelectionDialog); track_selection_dialog_->set_save_on_close(true); connect(tag_fetcher_.get(), SIGNAL(ResultAvailable(Song, SongList)), track_selection_dialog_.get(), SLOT(FetchTagFinished(Song, SongList)), Qt::QueuedConnection); connect(tag_fetcher_.get(), SIGNAL(Progress(Song, QString)), track_selection_dialog_.get(), SLOT(FetchTagProgress(Song, QString))); connect(track_selection_dialog_.get(), SIGNAL(accepted()), SLOT(AutoCompleteTagsAccepted())); connect(track_selection_dialog_.get(), SIGNAL(finished(int)), tag_fetcher_.get(), SLOT(Cancel())); } // Get the selected songs and start fetching tags for them SongList songs; autocomplete_tag_items_.clear(); for (const QModelIndex& index : ui_->playlist->view()->selectionModel()->selection().indexes()) { if (index.column() != 0) continue; int row = app_->playlist_manager()->current()->proxy()->mapToSource(index).row(); PlaylistItemPtr item(app_->playlist_manager()->current()->item_at(row)); Song song = item->Metadata(); if (song.IsEditable()) { songs << song; autocomplete_tag_items_ << item; } } track_selection_dialog_->Init(songs); tag_fetcher_->StartFetch(songs); track_selection_dialog_->show(); } void MainWindow::AutoCompleteTagsAccepted() { for (PlaylistItemPtr item : autocomplete_tag_items_) { item->Reload(); } // This is really lame but we don't know what rows have changed ui_->playlist->view()->update(); } QPixmap MainWindow::CreateOverlayedIcon(int position, int scrobble_point) { QPixmap normal_icon = QIcon(":/last.fm/as_light.png").pixmap(16); QPixmap light_icon = QIcon(":/last.fm/as.png").pixmap(16); QRect rect(normal_icon.rect()); // calculates the progress double perc = 1.0 - ((double)position / (double)scrobble_point); QPolygon mask; mask << rect.topRight(); mask << rect.topLeft(); mask << QPoint(rect.left(), rect.height() * perc); mask << QPoint(rect.right(), (rect.height()) * perc); QPixmap ret(light_icon); QPainter p(&ret); // Draw the red icon over the light red one p.setClipRegion(mask); p.drawPixmap(0, 0, normal_icon); p.setClipping(false); p.end(); return ret; } void MainWindow::SetToggleScrobblingIcon(bool value) { if (!value) { ui_->action_toggle_scrobbling->setIcon(QIcon(":/last.fm/as_disabled.png")); } else { ui_->action_toggle_scrobbling->setIcon(QIcon(":/last.fm/as_light.png")); } } #ifdef HAVE_LIBLASTFM void MainWindow::ScrobbleSubmitted() { const bool last_fm_enabled = ui_->action_toggle_scrobbling->isVisible() && app_->scrobbler()->IsScrobblingEnabled() && app_->scrobbler()->IsAuthenticated(); app_->playlist_manager()->active()->set_lastfm_status( Playlist::LastFM_Scrobbled); // update the button icon if (last_fm_enabled) ui_->action_toggle_scrobbling->setIcon(QIcon(":/last.fm/as.png")); } void MainWindow::ScrobbleError(int value) { switch (value) { case -1: // custom error value got from initial validity check app_->playlist_manager()->active()->set_lastfm_status( Playlist::LastFM_Invalid); break; case 30: // Hack: when offline, liblastfm doesn't inform us, so set the status // as queued; in this way we won't try to scrobble again, it will be done // automatically app_->playlist_manager()->active()->set_lastfm_status( Playlist::LastFM_Queued); break; default: if (value > 3) { // we're for sure in an error state app_->playlist_manager()->active()->set_lastfm_status( Playlist::LastFM_Error); qLog(Warning) << "Last.fm scrobbling error: " << value; } break; } } #endif void MainWindow::HandleNotificationPreview(OSD::Behaviour type, QString line1, QString line2) { if (!app_->playlist_manager()->current()->GetAllSongs().isEmpty()) { // Show a preview notification for the first song in the current playlist osd_->ShowPreview( type, line1, line2, app_->playlist_manager()->current()->GetAllSongs().first()); } else { qLog(Debug) << "The current playlist is empty, showing a fake song"; // Create a fake song Song fake; fake.Init("Title", "Artist", "Album", 123); fake.set_genre("Classical"); fake.set_composer("Anonymous"); fake.set_performer("Anonymous"); fake.set_lyrics("None"); fake.set_track(1); fake.set_disc(1); fake.set_year(2011); osd_->ShowPreview(type, line1, line2, fake); } } void MainWindow::ScrollToInternetIndex(const QModelIndex& index) { internet_view_->ScrollToIndex(index); ui_->tabs->SetCurrentWidget(internet_view_); } void MainWindow::AddPodcast() { app_->internet_model()->Service()->AddPodcast(); } void MainWindow::FocusGlobalSearchField() { ui_->tabs->SetCurrentWidget(global_search_view_); global_search_view_->FocusSearchField(); } void MainWindow::DoGlobalSearch(const QString& query) { FocusGlobalSearchField(); global_search_view_->StartSearch(query); } void MainWindow::ShowConsole() { Console* console = new Console(app_, this); console->show(); } void MainWindow::keyPressEvent(QKeyEvent* event) { if (event->key() == Qt::Key_Space) { app_->player()->PlayPause(); event->accept(); } else if (event->key() == Qt::Key_Left) { app_->player()->SeekBackward(); event->accept(); } else if (event->key() == Qt::Key_Right) { app_->player()->SeekForward(); event->accept(); } else { QMainWindow::keyPressEvent(event); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/mainwindow.h000066400000000000000000000240251260417502300231230ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include #include #include "config.h" #include "core/mac_startup.h" #include "core/tagreaderclient.h" #include "engines/engine_fwd.h" #include "library/librarymodel.h" #include "playlist/playlistitem.h" #include "ui/settingsdialog.h" class About; class AddStreamDialog; class AlbumCoverManager; class Appearance; class Application; class ArtistInfoView; class BackgroundStreams; class CommandlineOptions; class CoverProviders; class Database; class DeviceManager; class DeviceView; class DeviceViewContainer; class EditTagDialog; class Equalizer; class ErrorDialog; class FileView; class GlobalSearch; class GlobalSearchView; class GlobalShortcuts; class GroupByDialog; class Library; class LibraryViewContainer; class MimeData; class MultiLoadingIndicator; class OrganiseDialog; class OSD; class Player; class PlaylistBackend; class PlaylistListContainer; class PlaylistManager; class QueueManager; class InternetItem; class InternetModel; class InternetViewContainer; class Remote; class RipCDDialog; class Song; class SongInfoBase; class SongInfoView; class SystemTrayIcon; class TagFetcher; class TaskManager; class TrackSelectionDialog; class TranscodeDialog; class VisualisationContainer; class WiimotedevShortcuts; class Windows7ThumbBar; class Ui_MainWindow; class QSortFilterProxyModel; class MainWindow : public QMainWindow, public PlatformInterface { Q_OBJECT public: MainWindow(Application* app, SystemTrayIcon* tray_icon, OSD* osd, QWidget* parent = nullptr); ~MainWindow(); static const char* kSettingsGroup; static const char* kAllFilesFilterSpec; // Don't change the values enum StartupBehaviour { Startup_Remember = 1, Startup_AlwaysShow = 2, Startup_AlwaysHide = 3, }; // Don't change the values enum AddBehaviour { AddBehaviour_Append = 1, AddBehaviour_Enqueue = 2, AddBehaviour_Load = 3, AddBehaviour_OpenInNew = 4 }; // Don't change the values enum PlayBehaviour { PlayBehaviour_Never = 1, PlayBehaviour_IfStopped = 2, PlayBehaviour_Always = 3, }; // Don't change the values enum PlaylistAddBehaviour { PlaylistAddBehaviour_Play = 1, PlaylistAddBehaviour_Enqueue = 2, }; void SetHiddenInTray(bool hidden); void CommandlineOptionsReceived(const CommandlineOptions& options); protected: void keyPressEvent(QKeyEvent* event); void resizeEvent(QResizeEvent* event); void closeEvent(QCloseEvent* event); #ifdef Q_OS_WIN32 bool winEvent(MSG* message, long* result); #endif // PlatformInterface void Activate(); bool LoadUrl(const QString& url); signals: // Signals that stop playing after track was toggled. void StopAfterToggled(bool stop); void IntroPointReached(); private slots: void FilePathChanged(const QString& path); void MediaStopped(); void MediaPaused(); void MediaPlaying(); void TrackSkipped(PlaylistItemPtr item); void ForceShowOSD(const Song& song, const bool toggle); void PlaylistRightClick(const QPoint& global_pos, const QModelIndex& index); void PlaylistCurrentChanged(const QModelIndex& current); void PlaylistViewSelectionModelChanged(); void PlaylistPlay(); void PlaylistStopAfter(); void PlaylistQueue(); void PlaylistSkip(); void PlaylistRemoveCurrent(); void PlaylistEditFinished(const QModelIndex& index); void EditTracks(); void EditTagDialogAccepted(); void RenumberTracks(); void SelectionSetValue(); void EditValue(); void AutoCompleteTags(); void AutoCompleteTagsAccepted(); void PlaylistUndoRedoChanged(QAction* undo, QAction* redo); void AddFilesToTranscoder(); void PlaylistCopyToLibrary(); void PlaylistMoveToLibrary(); void PlaylistCopyToDevice(); void PlaylistOrganiseSelected(bool copy); void PlaylistDelete(); void PlaylistOpenInBrowser(); void ShowInLibrary(); void ChangeLibraryQueryMode(QAction* action); void PlayIndex(const QModelIndex& index); void PlaylistDoubleClick(const QModelIndex& index); void StopAfterCurrent(); void SongChanged(const Song& song); void VolumeChanged(int volume); void CopyFilesToLibrary(const QList& urls); void MoveFilesToLibrary(const QList& urls); void CopyFilesToDevice(const QList& urls); void EditFileTags(const QList& urls); void AddToPlaylist(QMimeData* data); void AddToPlaylist(QAction* action); void VolumeWheelEvent(int delta); void ToggleShowHide(); void Seeked(qlonglong microseconds); void UpdateTrackPosition(); void UpdateTrackSliderPosition(); // Handle visibility of LastFM icons void LastFMButtonVisibilityChanged(bool value); void ScrobbleButtonVisibilityChanged(bool value); void SetToggleScrobblingIcon(bool value); #ifdef HAVE_LIBLASTFM void ScrobblingEnabledChanged(bool value); void Love(); void ScrobbledRadioStream(); #endif void TaskCountChanged(int count); void ShowLibraryConfig(); void ReloadSettings(); void ReloadAllSettings(); void RefreshStyleSheet(); void SetHiddenInTray() { SetHiddenInTray(true); } void AddFile(); void AddFolder(); void AddStream(); void AddStreamAccepted(); void OpenRipCDDialog(); void AddCDTracks(); void AddPodcast(); void CommandlineOptionsReceived(const QByteArray& serialized_options); void CheckForUpdates(); void NowPlayingWidgetPositionChanged(bool above_status_bar); void SongSaveComplete(TagReaderReply* reply, const QPersistentModelIndex& index); void ShowCoverManager(); #ifdef HAVE_LIBLASTFM void ScrobbleSubmitted(); void ScrobbleError(int value); #endif void ShowAboutDialog(); void ShowTranscodeDialog(); void ShowErrorDialog(const QString& message); void ShowQueueManager(); void ShowVisualisations(); void EnsureSettingsDialogCreated(); void EnsureEditTagDialogCreated(); void OpenSettingsDialog(); void OpenSettingsDialogAtPage(SettingsDialog::Page page); void ShowSongInfoConfig(); void SaveGeometry(); void SavePlaybackStatus(); void LoadPlaybackStatus(); void ResumePlayback(); void AddSongInfoGenerator(smart_playlists::GeneratorPtr gen); void DeleteFinished(const SongList& songs_with_errors); void Raise(); void Exit(); void HandleNotificationPreview(OSD::Behaviour type, QString line1, QString line2); void ScrollToInternetIndex(const QModelIndex& index); void FocusGlobalSearchField(); void DoGlobalSearch(const QString& query); void ShowConsole(); private: void ConnectInfoView(SongInfoBase* view); void ApplyAddBehaviour(AddBehaviour b, MimeData* data) const; void ApplyPlayBehaviour(PlayBehaviour b, MimeData* data) const; void CheckFullRescanRevisions(); // creates the icon by painting the full one depending on the current position QPixmap CreateOverlayedIcon(int position, int scrobble_point); private: Ui_MainWindow* ui_; Windows7ThumbBar* thumbbar_; Application* app_; SystemTrayIcon* tray_icon_; OSD* osd_; std::unique_ptr edit_tag_dialog_; std::unique_ptr about_dialog_; GlobalShortcuts* global_shortcuts_; Remote* remote_; GlobalSearchView* global_search_view_; LibraryViewContainer* library_view_; FileView* file_view_; #ifdef HAVE_AUDIOCD std::unique_ptr rip_cd_dialog_; #endif PlaylistListContainer* playlist_list_; InternetViewContainer* internet_view_; DeviceViewContainer* device_view_container_; DeviceView* device_view_; SongInfoView* song_info_view_; ArtistInfoView* artist_info_view_; std::unique_ptr settings_dialog_; std::unique_ptr add_stream_dialog_; std::unique_ptr cover_manager_; std::unique_ptr equalizer_; std::unique_ptr transcode_dialog_; std::unique_ptr error_dialog_; std::unique_ptr organise_dialog_; std::unique_ptr queue_manager_; std::unique_ptr tag_fetcher_; std::unique_ptr track_selection_dialog_; PlaylistItemList autocomplete_tag_items_; #ifdef ENABLE_VISUALISATIONS std::unique_ptr visualisation_; #endif #ifdef HAVE_WIIMOTEDEV std::unique_ptr wiimotedev_shortcuts_; #endif QAction* library_show_all_; QAction* library_show_duplicates_; QAction* library_show_untagged_; QMenu* playlist_menu_; QAction* playlist_play_pause_; QAction* playlist_stop_after_; QAction* playlist_undoredo_; QAction* playlist_organise_; QAction* playlist_show_in_library_; QAction* playlist_copy_to_library_; QAction* playlist_move_to_library_; QAction* playlist_copy_to_device_; QAction* playlist_delete_; QAction* playlist_open_in_browser_; QAction* playlist_queue_; QAction* playlist_skip_; QAction* playlist_add_to_another_; QList playlistitem_actions_; QAction* playlistitem_actions_separator_; QModelIndex playlist_menu_index_; QSortFilterProxyModel* library_sort_model_; QTimer* track_position_timer_; QTimer* track_slider_timer_; QSettings settings_; bool was_maximized_; int saved_playback_position_; Engine::State saved_playback_state_; AddBehaviour doubleclick_addmode_; PlayBehaviour doubleclick_playmode_; PlaylistAddBehaviour doubleclick_playlist_addmode_; PlayBehaviour menu_playmode_; BackgroundStreams* background_streams_; }; #endif // MAINWINDOW_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/mainwindow.ui000066400000000000000000000712171260417502300233160ustar00rootroot00000000000000 MainWindow 0 0 1131 685 Clementine :/icon.png:/icon.png 0 0 Qt::Horizontal 0 0 0 0 0 Qt::Vertical 0 0 QFrame::NoFrame 1 0 22 22 true Qt::Vertical 22 22 true 22 22 true false 22 22 QToolButton::MenuButtonPopup true 22 22 true 1 0 Qt::Vertical 22 22 true Qt::Vertical 100 0 0 36 Qt::Horizontal QSizePolicy::Expanding 0 0 Qt::Vertical 0 0 100 Qt::Horizontal 0 0 0 0 Qt::Horizontal 0 0 3 0 0 0 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::Vertical Qt::Vertical true 0 0 16 16 true 10 0 0 0 1131 25 &Music &Playlist &Help &Extras &Tools Previous track F5 Play F6 false Stop F7 Next track F8 &Quit Ctrl+Q QAction::QuitRole Stop after this track Ctrl+Alt+V false :/last.fm/love.png:/last.fm/love.png Love Ctrl+L Clear playlist Clear playlist Ctrl+K Edit track information... Ctrl+E Renumber tracks in this order... Set value for all selected tracks... Edit tag... F2 Preferences... Ctrl+P QAction::PreferencesRole About Clementine... F1 QAction::AboutRole Shuffle playlist Ctrl+H Add file... Ctrl+Shift+A Add stream... Ctrl+O Open file... Open &audio CD... Cover Manager true Rain true All Glory to the Hypnotoad! true Make it so! true Kittens Console &Shuffle mode &Repeat mode Remove from playlist Equalizer Transcode Music Add folder... Jump to the currently playing track Ctrl+J New playlist Ctrl+N Save playlist... Ctrl+S Load playlist... Ctrl+Shift+O Go to next playlist tab Go to previous playlist tab Update changed library folders Visualizations Queue Manager About Qt... QAction::AboutQtRole true Mute Ctrl+M Do a full library rescan :/providers/musicbrainz.png:/providers/musicbrainz.png Complete tags automatically... Ctrl+T Toggle scrobbling :/providers/podcast16.png:/providers/podcast16.png Add podcast... Remove duplicates from playlist false Add file(s) to transcoder Add file to transcoder Ctrl+Shift+T Rip audio CD Remove unavailable tracks from playlist Amarok::VolumeSlider QSlider
widgets/sliderwidget.h
AnalyzerContainer QWidget
analyzers/analyzercontainer.h
1
PlaylistContainer QWidget
playlist/playlistcontainer.h
1
TrackSlider QWidget
widgets/trackslider.h
1
PlaylistSequence QWidget
playlist/playlistsequence.h
1
MultiLoadingIndicator QWidget
widgets/multiloadingindicator.h
1
NowPlayingWidget QWidget
widgets/nowplayingwidget.h
1
FancyTabWidget QWidget
widgets/fancytabwidget.h
clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/networkproxysettingspage.cpp000066400000000000000000000062701260417502300265150ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "iconloader.h" #include "networkproxysettingspage.h" #include "ui_networkproxysettingspage.h" #include "core/networkproxyfactory.h" #include NetworkProxySettingsPage::NetworkProxySettingsPage(SettingsDialog* dialog) : SettingsPage(dialog), ui_(new Ui_NetworkProxySettingsPage) { ui_->setupUi(this); setWindowIcon(IconLoader::Load("applications-internet")); } NetworkProxySettingsPage::~NetworkProxySettingsPage() { delete ui_; } void NetworkProxySettingsPage::Load() { QSettings s; s.beginGroup(NetworkProxyFactory::kSettingsGroup); NetworkProxyFactory::Mode mode = NetworkProxyFactory::Mode( s.value("mode", NetworkProxyFactory::Mode_System).toInt()); switch (mode) { case NetworkProxyFactory::Mode_Manual: ui_->proxy_manual->setChecked(true); break; case NetworkProxyFactory::Mode_Direct: ui_->proxy_direct->setChecked(true); break; case NetworkProxyFactory::Mode_System: default: ui_->proxy_system->setChecked(true); break; } ui_->proxy_type->setCurrentIndex( s.value("type", QNetworkProxy::HttpProxy).toInt() == QNetworkProxy::HttpProxy ? 0 : 1); ui_->proxy_hostname->setText(s.value("hostname").toString()); ui_->proxy_port->setValue(s.value("port").toInt()); ui_->proxy_auth->setChecked(s.value("use_authentication", false).toBool()); ui_->proxy_username->setText(s.value("username").toString()); ui_->proxy_password->setText(s.value("password").toString()); s.endGroup(); } void NetworkProxySettingsPage::Save() { QSettings s; NetworkProxyFactory::Mode mode = NetworkProxyFactory::Mode_System; if (ui_->proxy_direct->isChecked()) mode = NetworkProxyFactory::Mode_Direct; else if (ui_->proxy_system->isChecked()) mode = NetworkProxyFactory::Mode_System; else if (ui_->proxy_manual->isChecked()) mode = NetworkProxyFactory::Mode_Manual; s.beginGroup(NetworkProxyFactory::kSettingsGroup); s.setValue("mode", mode); s.setValue("type", ui_->proxy_type->currentIndex() == 0 ? QNetworkProxy::HttpProxy : QNetworkProxy::Socks5Proxy); s.setValue("hostname", ui_->proxy_hostname->text()); s.setValue("port", ui_->proxy_port->value()); s.setValue("use_authentication", ui_->proxy_auth->isChecked()); s.setValue("username", ui_->proxy_username->text()); s.setValue("password", ui_->proxy_password->text()); s.endGroup(); NetworkProxyFactory::Instance()->ReloadSettings(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/networkproxysettingspage.h000066400000000000000000000021711260417502300261560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef NETWORKPROXYSETTINGSPAGE_H #define NETWORKPROXYSETTINGSPAGE_H #include "settingspage.h" class Ui_NetworkProxySettingsPage; class NetworkProxySettingsPage : public SettingsPage { Q_OBJECT public: NetworkProxySettingsPage(SettingsDialog* dialog); ~NetworkProxySettingsPage(); void Load(); void Save(); private: Ui_NetworkProxySettingsPage* ui_; }; #endif // NETWORKPROXYSETTINGSPAGE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/networkproxysettingspage.ui000066400000000000000000000106041260417502300263440ustar00rootroot00000000000000 NetworkProxySettingsPage 0 0 400 300 Network Proxy Use the system proxy settings true Direct internet connection Manual proxy configuration false 24 HTTP proxy SOCKS proxy Port 65535 8080 Use authentication true false QFormLayout::AllNonFixedFieldsGrow Username Password QLineEdit::Password Qt::Vertical 20 36 proxy_manual toggled(bool) proxy_manual_container setEnabled(bool) 39 76 29 99 clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/networkremotesettingspage.cpp000066400000000000000000000127521260417502300266310ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "iconloader.h" #include "networkremotesettingspage.h" #include "ui_networkremotesettingspage.h" #include "networkremote/networkremote.h" #include "networkremote/networkremotehelper.h" #include "transcoder/transcoder.h" #include "transcoder/transcoderoptionsdialog.h" #include #include #include #include const char* NetworkRemoteSettingsPage::kPlayStoreUrl = "https://play.google.com/store/apps/details?id=de.qspool.clementineremote"; static bool ComparePresetsByName(const TranscoderPreset& left, const TranscoderPreset& right) { return left.name_ < right.name_; } NetworkRemoteSettingsPage::NetworkRemoteSettingsPage(SettingsDialog* dialog) : SettingsPage(dialog), ui_(new Ui_NetworkRemoteSettingsPage) { ui_->setupUi(this); setWindowIcon(IconLoader::Load("ipodtouchicon")); connect(ui_->options, SIGNAL(clicked()), SLOT(Options())); ui_->play_store->installEventFilter(this); // Get presets QList presets = Transcoder::GetAllPresets(); qSort(presets.begin(), presets.end(), ComparePresetsByName); for (const TranscoderPreset& preset : presets) { ui_->format->addItem( QString("%1 (.%2)").arg(preset.name_, preset.extension_), QVariant::fromValue(preset)); } } NetworkRemoteSettingsPage::~NetworkRemoteSettingsPage() { delete ui_; } bool NetworkRemoteSettingsPage::eventFilter(QObject* object, QEvent* event) { if (object == ui_->play_store && event->type() == QEvent::MouseButtonRelease) { QDesktopServices::openUrl(QUrl(kPlayStoreUrl)); return true; } return SettingsPage::eventFilter(object, event); } void NetworkRemoteSettingsPage::Load() { QSettings s; s.beginGroup(NetworkRemote::kSettingsGroup); ui_->use_remote->setChecked(s.value("use_remote").toBool()); ui_->remote_port->setValue( s.value("port", NetworkRemote::kDefaultServerPort).toInt()); ui_->only_non_public_ip->setChecked( s.value("only_non_public_ip", true).toBool()); // Auth Code, 5 digits ui_->use_auth_code->setChecked(s.value("use_auth_code", false).toBool()); ui_->auth_code->setValue(s.value("auth_code", qrand() % 100000).toInt()); ui_->allow_downloads->setChecked(s.value("allow_downloads", false).toBool()); ui_->convert_lossless->setChecked(s.value("convert_lossless", false).toBool()); // Load settings QString last_output_format = s.value("last_output_format", "audio/x-vorbis").toString(); for (int i = 0; i < ui_->format->count(); ++i) { if (last_output_format == ui_->format->itemData(i).value().codec_mimetype_) { ui_->format->setCurrentIndex(i); break; } } s.endGroup(); // Get local ip addresses QString ip_addresses; QList addresses = QNetworkInterface::allAddresses(); for (const QHostAddress& address : addresses) { // TODO: Add ipv6 support to tinysvcmdns. if (address.protocol() == QAbstractSocket::IPv4Protocol && !address.isInSubnet(QHostAddress::parseSubnet("127.0.0.1/8"))) { if (!ip_addresses.isEmpty()) { ip_addresses.append(", "); } ip_addresses.append(address.toString()); } } ui_->ip_address->setText(ip_addresses); // Get the right play store badge for this language. QString language = dialog()->app()->language_without_region(); QString badge_filename = ":/playstore/" + language + "_generic_rgb_wo_45.png"; if (!QFile::exists(badge_filename)) { badge_filename = ":/playstore/en_generic_rgb_wo_45.png"; } ui_->play_store->setPixmap(QPixmap(badge_filename)); } void NetworkRemoteSettingsPage::Save() { QSettings s; s.beginGroup(NetworkRemote::kSettingsGroup); s.setValue("port", ui_->remote_port->value()); s.setValue("use_remote", ui_->use_remote->isChecked()); s.setValue("only_non_public_ip", ui_->only_non_public_ip->isChecked()); s.setValue("use_auth_code", ui_->use_auth_code->isChecked()); s.setValue("auth_code", ui_->auth_code->value()); s.setValue("allow_downloads", ui_->allow_downloads->isChecked()); s.setValue("convert_lossless", ui_->convert_lossless->isChecked()); TranscoderPreset preset = ui_->format->itemData(ui_->format->currentIndex()) .value(); s.setValue("last_output_format", preset.codec_mimetype_); s.endGroup(); if (NetworkRemoteHelper::Instance()) { NetworkRemoteHelper::Instance()->ReloadSettings(); } } void NetworkRemoteSettingsPage::Options() { TranscoderPreset preset = ui_->format->itemData(ui_->format->currentIndex()) .value(); TranscoderOptionsDialog dialog(preset.type_, this); dialog.set_settings_postfix(NetworkRemote::kTranscoderSettingPostfix); if (dialog.is_valid()) { dialog.exec(); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/networkremotesettingspage.h000066400000000000000000000024121260417502300262660ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef NETWORKREMOTESETTINGSPAGE_H #define NETWORKREMOTESETTINGSPAGE_H #include "settingspage.h" class Ui_NetworkRemoteSettingsPage; class NetworkRemoteSettingsPage : public SettingsPage { Q_OBJECT public: NetworkRemoteSettingsPage(SettingsDialog* dialog); ~NetworkRemoteSettingsPage(); void Load(); void Save(); protected: bool eventFilter(QObject* object, QEvent* event); private slots: void Options(); private: static const char* kPlayStoreUrl; Ui_NetworkRemoteSettingsPage* ui_; }; #endif // NETWORKREMOTESETTINGSPAGE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/networkremotesettingspage.ui000066400000000000000000000222401260417502300264550ustar00rootroot00000000000000 NetworkRemoteSettingsPage 0 0 421 664 Network Remote Use a network remote control false Settings QFormLayout::AllNonFixedFieldsGrow 171 0 Qt::LeftToRight Port Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 65535 8080 Only accept connections from clients within the ip ranges: 10.x.x.x 172.16.0.0 - 172.31.255.255 192.168.x.x Only allow connections from the local network true A client can connect only, if the correct code was entered. Require authentication code false 99999 Enter this IP in the App to connect to Clementine. Your IP address: 127.0.0.1 Allow a client to download music from this computer. Allow downloads false Download settings Convert lossless audiofiles before sending them to the remote. Convert lossless files false Audio format Options... Download the Android app Qt::Horizontal 40 20 PointingHandCursor Qt::AlignCenter Qt::Horizontal 40 20 or scan the QR code! Qt::AlignCenter :/clementine_remote_qr.png Qt::AlignCenter Qt::Vertical 20 98 use_auth_code toggled(bool) auth_code setEnabled(bool) 137 124 351 125 use_remote toggled(bool) use_remote_container_2 setEnabled(bool) 59 22 57 43 allow_downloads toggled(bool) download_settings_container setEnabled(bool) 196 160 117 205 convert_lossless toggled(bool) format_container setEnabled(bool) 218 212 218 262 clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/notificationssettingspage.cpp000066400000000000000000000306061260417502300265730ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "iconloader.h" #include "notificationssettingspage.h" #include "settingsdialog.h" #include "ui_notificationssettingspage.h" #include "widgets/osdpretty.h" #include #include #include #include NotificationsSettingsPage::NotificationsSettingsPage(SettingsDialog* dialog) : SettingsPage(dialog), ui_(new Ui_NotificationsSettingsPage), pretty_popup_(new OSDPretty(OSDPretty::Mode_Draggable)) { ui_->setupUi(this); setWindowIcon(IconLoader::Load("help-hint")); pretty_popup_->SetMessage(tr("OSD Preview"), tr("Drag to reposition"), QImage(":nocover.png")); ui_->notifications_bg_preset->setItemData(0, QColor(OSDPretty::kPresetBlue), Qt::DecorationRole); ui_->notifications_bg_preset->setItemData(1, QColor(OSDPretty::kPresetOrange), Qt::DecorationRole); // Create and populate the helper menus QMenu* menu = new QMenu(this); menu->addAction(ui_->action_artist); menu->addAction(ui_->action_album); menu->addAction(ui_->action_title); menu->addAction(ui_->action_albumartist); menu->addAction(ui_->action_year); menu->addAction(ui_->action_composer); menu->addAction(ui_->action_performer); menu->addAction(ui_->action_grouping); menu->addAction(ui_->action_length); menu->addAction(ui_->action_disc); menu->addAction(ui_->action_track); menu->addAction(ui_->action_genre); menu->addAction(ui_->action_playcount); menu->addAction(ui_->action_skipcount); menu->addAction(ui_->action_filename); menu->addAction(ui_->action_rating); menu->addAction(ui_->action_score); menu->addSeparator(); menu->addAction(ui_->action_newline); ui_->notifications_exp_chooser1->setMenu(menu); ui_->notifications_exp_chooser2->setMenu(menu); ui_->notifications_exp_chooser1->setPopupMode(QToolButton::InstantPopup); ui_->notifications_exp_chooser2->setPopupMode(QToolButton::InstantPopup); // We need this because by default menus don't show tooltips connect(menu, SIGNAL(hovered(QAction*)), SLOT(ShowMenuTooltip(QAction*))); connect(ui_->notifications_none, SIGNAL(toggled(bool)), SLOT(NotificationTypeChanged())); connect(ui_->notifications_native, SIGNAL(toggled(bool)), SLOT(NotificationTypeChanged())); connect(ui_->notifications_tray, SIGNAL(toggled(bool)), SLOT(NotificationTypeChanged())); connect(ui_->notifications_pretty, SIGNAL(toggled(bool)), SLOT(NotificationTypeChanged())); connect(ui_->notifications_opacity, SIGNAL(valueChanged(int)), SLOT(PrettyOpacityChanged(int))); connect(ui_->notifications_bg_preset, SIGNAL(activated(int)), SLOT(PrettyColorPresetChanged(int))); connect(ui_->notifications_fg_choose, SIGNAL(clicked()), SLOT(ChooseFgColor())); connect(ui_->notifications_font_choose, SIGNAL(clicked()), SLOT(ChooseFont())); connect(ui_->notifications_exp_chooser1, SIGNAL(triggered(QAction*)), SLOT(InsertVariableFirstLine(QAction*))); connect(ui_->notifications_exp_chooser2, SIGNAL(triggered(QAction*)), SLOT(InsertVariableSecondLine(QAction*))); connect(ui_->notifications_disable_duration, SIGNAL(toggled(bool)), ui_->notifications_duration, SLOT(setDisabled(bool))); if (!OSD::SupportsNativeNotifications()) ui_->notifications_native->setEnabled(false); if (!OSD::SupportsTrayPopups()) ui_->notifications_tray->setEnabled(false); connect(ui_->notifications_pretty, SIGNAL(toggled(bool)), SLOT(UpdatePopupVisible())); connect(ui_->notifications_custom_text_enabled, SIGNAL(toggled(bool)), SLOT(NotificationCustomTextChanged(bool))); connect(ui_->notifications_preview, SIGNAL(clicked()), SLOT(PrepareNotificationPreview())); // Icons ui_->notifications_exp_chooser1->setIcon(IconLoader::Load("list-add")); ui_->notifications_exp_chooser2->setIcon(IconLoader::Load("list-add")); } NotificationsSettingsPage::~NotificationsSettingsPage() { delete pretty_popup_; delete ui_; } void NotificationsSettingsPage::showEvent(QShowEvent*) { UpdatePopupVisible(); } void NotificationsSettingsPage::hideEvent(QHideEvent*) { UpdatePopupVisible(); } void NotificationsSettingsPage::Load() { QSettings s; s.beginGroup(OSD::kSettingsGroup); OSD::Behaviour osd_behaviour = OSD::Behaviour(s.value("Behaviour", OSD::Native).toInt()); switch (osd_behaviour) { case OSD::Native: if (OSD::SupportsNativeNotifications()) { ui_->notifications_native->setChecked(true); break; } // Fallthrough case OSD::Pretty: ui_->notifications_pretty->setChecked(true); break; case OSD::TrayPopup: if (OSD::SupportsTrayPopups()) { ui_->notifications_tray->setChecked(true); break; } // Fallthrough case OSD::Disabled: default: ui_->notifications_none->setChecked(true); break; } ui_->notifications_duration->setValue(s.value("Timeout", 5000).toInt() / 1000); ui_->notifications_volume->setChecked( s.value("ShowOnVolumeChange", false).toBool()); ui_->notifications_play_mode->setChecked( s.value("ShowOnPlayModeChange", true).toBool()); ui_->notifications_pause->setChecked( s.value("ShowOnPausePlayback", true).toBool()); ui_->notifications_art->setChecked(s.value("ShowArt", true).toBool()); ui_->notifications_custom_text_enabled->setChecked( s.value("CustomTextEnabled", false).toBool()); ui_->notifications_custom_text1->setText(s.value("CustomText1").toString()); ui_->notifications_custom_text2->setText(s.value("CustomText2").toString()); s.endGroup(); #ifdef Q_OS_DARWIN ui_->notifications_options->setEnabled( ui_->notifications_pretty->isChecked()); #endif // Pretty OSD pretty_popup_->ReloadSettings(); ui_->notifications_opacity->setValue(pretty_popup_->background_opacity() * 100); QRgb color = pretty_popup_->background_color(); if (color == OSDPretty::kPresetBlue) ui_->notifications_bg_preset->setCurrentIndex(0); else if (color == OSDPretty::kPresetOrange) ui_->notifications_bg_preset->setCurrentIndex(1); else ui_->notifications_bg_preset->setCurrentIndex(2); ui_->notifications_bg_preset->setItemData(2, QColor(color), Qt::DecorationRole); ui_->notifications_disable_duration->setChecked( pretty_popup_->disable_duration()); UpdatePopupVisible(); } void NotificationsSettingsPage::Save() { QSettings s; OSD::Behaviour osd_behaviour = OSD::Disabled; if (ui_->notifications_none->isChecked()) osd_behaviour = OSD::Disabled; else if (ui_->notifications_native->isChecked()) osd_behaviour = OSD::Native; else if (ui_->notifications_tray->isChecked()) osd_behaviour = OSD::TrayPopup; else if (ui_->notifications_pretty->isChecked()) osd_behaviour = OSD::Pretty; s.beginGroup(OSD::kSettingsGroup); s.setValue("Behaviour", int(osd_behaviour)); s.setValue("Timeout", ui_->notifications_duration->value() * 1000); s.setValue("ShowOnVolumeChange", ui_->notifications_volume->isChecked()); s.setValue("ShowOnPlayModeChange", ui_->notifications_play_mode->isChecked()); s.setValue("ShowOnPausePlayback", ui_->notifications_pause->isChecked()); s.setValue("ShowArt", ui_->notifications_art->isChecked()); s.setValue("CustomTextEnabled", ui_->notifications_custom_text_enabled->isChecked()); s.setValue("CustomText1", ui_->notifications_custom_text1->text()); s.setValue("CustomText2", ui_->notifications_custom_text2->text()); s.endGroup(); s.beginGroup(OSDPretty::kSettingsGroup); s.setValue("foreground_color", pretty_popup_->foreground_color()); s.setValue("background_color", pretty_popup_->background_color()); s.setValue("background_opacity", pretty_popup_->background_opacity()); s.setValue("popup_display", pretty_popup_->popup_display()); s.setValue("popup_pos", pretty_popup_->popup_pos()); s.setValue("font", pretty_popup_->font().toString()); s.setValue("disable_duration", ui_->notifications_disable_duration->isChecked()); s.endGroup(); } void NotificationsSettingsPage::PrettyOpacityChanged(int value) { pretty_popup_->set_background_opacity(qreal(value) / 100.0); } void NotificationsSettingsPage::UpdatePopupVisible() { pretty_popup_->setVisible(isVisible() && ui_->notifications_pretty->isChecked()); } void NotificationsSettingsPage::PrettyColorPresetChanged(int index) { if (dialog()->is_loading_settings()) return; switch (index) { case 0: pretty_popup_->set_background_color(OSDPretty::kPresetBlue); break; case 1: pretty_popup_->set_background_color(OSDPretty::kPresetOrange); break; case 2: default: ChooseBgColor(); break; } } void NotificationsSettingsPage::ChooseBgColor() { QColor color = QColorDialog::getColor(pretty_popup_->background_color(), this); if (!color.isValid()) return; pretty_popup_->set_background_color(color.rgb()); ui_->notifications_bg_preset->setItemData(2, color, Qt::DecorationRole); } void NotificationsSettingsPage::ChooseFgColor() { QColor color = QColorDialog::getColor(pretty_popup_->foreground_color(), this); if (!color.isValid()) return; pretty_popup_->set_foreground_color(color.rgb()); } void NotificationsSettingsPage::ChooseFont() { bool ok; QFont font = QFontDialog::getFont(&ok, pretty_popup_->font(), this); if (ok) pretty_popup_->set_font(font); } void NotificationsSettingsPage::NotificationCustomTextChanged(bool enabled) { ui_->notifications_custom_text1->setEnabled(enabled); ui_->notifications_custom_text2->setEnabled(enabled); ui_->notifications_exp_chooser1->setEnabled(enabled); ui_->notifications_exp_chooser2->setEnabled(enabled); ui_->notifications_preview->setEnabled(enabled); ui_->label_19->setEnabled(enabled); ui_->label_20->setEnabled(enabled); } void NotificationsSettingsPage::PrepareNotificationPreview() { OSD::Behaviour notificationType = OSD::Disabled; if (ui_->notifications_native->isChecked()) { notificationType = OSD::Native; } else if (ui_->notifications_pretty->isChecked()) { notificationType = OSD::Pretty; } else if (ui_->notifications_tray->isChecked()) { notificationType = OSD::TrayPopup; } // If user changes timeout or other options, that won't be reflected in the // preview emit NotificationPreview(notificationType, ui_->notifications_custom_text1->text(), ui_->notifications_custom_text2->text()); } void NotificationsSettingsPage::InsertVariableFirstLine(QAction* action) { // We use action name, therefore those shouldn't be translatable ui_->notifications_custom_text1->insert(action->text()); } void NotificationsSettingsPage::InsertVariableSecondLine(QAction* action) { // We use action name, therefore those shouldn't be translatable ui_->notifications_custom_text2->insert(action->text()); } void NotificationsSettingsPage::ShowMenuTooltip(QAction* action) { QToolTip::showText(QCursor::pos(), action->toolTip()); } void NotificationsSettingsPage::NotificationTypeChanged() { bool enabled = !ui_->notifications_none->isChecked(); bool pretty = ui_->notifications_pretty->isChecked(); ui_->notifications_general->setEnabled(enabled); ui_->notifications_pretty_group->setEnabled(pretty); ui_->notifications_custom_text_group->setEnabled(enabled); #ifdef Q_OS_DARWIN ui_->notifications_options->setEnabled(pretty); #endif ui_->notifications_duration->setEnabled( !pretty || (pretty && !ui_->notifications_disable_duration->isChecked())); ui_->notifications_disable_duration->setEnabled(pretty); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/notificationssettingspage.h000066400000000000000000000032701260417502300262350ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef NOTIFICATIONSSETTINGSPAGE_H #define NOTIFICATIONSSETTINGSPAGE_H #include "settingspage.h" class Ui_NotificationsSettingsPage; class NotificationsSettingsPage : public SettingsPage { Q_OBJECT public: NotificationsSettingsPage(SettingsDialog* dialog); ~NotificationsSettingsPage(); void Load(); void Save(); protected: void hideEvent(QHideEvent*); void showEvent(QShowEvent*); private slots: void NotificationTypeChanged(); void NotificationCustomTextChanged(bool enabled); void PrepareNotificationPreview(); void InsertVariableFirstLine(QAction* action); void InsertVariableSecondLine(QAction* action); void ShowMenuTooltip(QAction* action); void PrettyOpacityChanged(int value); void PrettyColorPresetChanged(int index); void ChooseBgColor(); void ChooseFgColor(); void ChooseFont(); void UpdatePopupVisible(); private: Ui_NotificationsSettingsPage* ui_; OSDPretty* pretty_popup_; }; #endif // NOTIFICATIONSSETTINGSPAGE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/notificationssettingspage.ui000066400000000000000000000335001260417502300264220ustar00rootroot00000000000000 NotificationsSettingsPage 0 0 526 642 Notifications Clementine can show a message when the track changes. Notification type Disabled Show a native desktop notification Show a pretty OSD Show a popup from the system tray General settings 0 Popup duration seconds 1 20 5 Disable duration Show a notification when I change the volume Show a notification when I change the repeat/shuffle mode Show a notification when I pause playback Include album art in the notification Custom message settings QFrame::NoFrame QFrame::Plain 0 0 Use a custom message for notifications false 0 0 Preview QFrame::NoFrame QFrame::Plain 0 0 0 false false Summary Body false false Pretty OSD options Background opacity Qt::Horizontal Background color Basic Blue Clementine Orange Custom... Text options Choose color... Choose font... Qt::Vertical 20 32 %artist% Add song artist tag %album% Add song album tag %title% Add song title tag %albumartist% Add song albumartist tag %year% Add song year tag %composer% Add song composer tag %performer% Add song performer tag %grouping% Add song grouping tag %disc% Add song disc tag %track% Add song track tag %genre% Add song genre tag %length% Add song length tag %playcount% Add song play count %skipcount% Add song skip count %rating% Add song rating %score% Add song auto score %newline% Add a new line if supported by the notification type %filename% Add song filename clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/organisedialog.cpp000066400000000000000000000300771260417502300242750ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "organisedialog.h" #include "ui_organisedialog.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "iconloader.h" #include "organiseerrordialog.h" #include "core/musicstorage.h" #include "core/organise.h" #include "core/tagreaderclient.h" #include "core/utilities.h" const char* OrganiseDialog::kDefaultFormat = "%artist/%album{ (Disc %disc)}/{%track - }%title.%extension"; const char* OrganiseDialog::kSettingsGroup = "OrganiseDialog"; OrganiseDialog::OrganiseDialog(TaskManager* task_manager, QWidget* parent) : QDialog(parent), ui_(new Ui_OrganiseDialog), task_manager_(task_manager), total_size_(0), resized_by_user_(false) { ui_->setupUi(this); connect(ui_->button_box->button(QDialogButtonBox::Reset), SIGNAL(clicked()), SLOT(Reset())); ui_->aftercopying->setItemIcon(1, IconLoader::Load("edit-delete")); // Valid tags QMap tags; tags[tr("Title")] = "title"; tags[tr("Album")] = "album"; tags[tr("Artist")] = "artist"; tags[tr("Artist's initial")] = "artistinitial"; tags[tr("Album artist")] = "albumartist"; tags[tr("Composer")] = "composer"; tags[tr("Performer")] = "performer"; tags[tr("Grouping")] = "grouping"; tags[tr("Lyrics")] = "lyrics"; tags[tr("Track")] = "track"; tags[tr("Disc")] = "disc"; tags[tr("BPM")] = "bpm"; tags[tr("Year")] = "year"; tags[tr("Original year")] = "originalyear"; tags[tr("Genre")] = "genre"; tags[tr("Comment")] = "comment"; tags[tr("Length")] = "length"; tags[tr("Bitrate", "Refers to bitrate in file organise dialog.")] = "bitrate"; tags[tr("Samplerate")] = "samplerate"; tags[tr("File extension")] = "extension"; // Naming scheme input field new OrganiseFormat::SyntaxHighlighter(ui_->naming); connect(ui_->destination, SIGNAL(currentIndexChanged(int)), SLOT(UpdatePreviews())); connect(ui_->naming, SIGNAL(textChanged()), SLOT(UpdatePreviews())); connect(ui_->replace_ascii, SIGNAL(toggled(bool)), SLOT(UpdatePreviews())); connect(ui_->replace_the, SIGNAL(toggled(bool)), SLOT(UpdatePreviews())); connect(ui_->replace_spaces, SIGNAL(toggled(bool)), SLOT(UpdatePreviews())); // Get the titles of the tags to put in the insert menu QStringList tag_titles = tags.keys(); qStableSort(tag_titles); // Build the insert menu QMenu* tag_menu = new QMenu(this); QSignalMapper* tag_mapper = new QSignalMapper(this); for (const QString& title : tag_titles) { QAction* action = tag_menu->addAction(title, tag_mapper, SLOT(map())); tag_mapper->setMapping(action, tags[title]); } connect(tag_mapper, SIGNAL(mapped(QString)), SLOT(InsertTag(QString))); ui_->insert->setMenu(tag_menu); } OrganiseDialog::~OrganiseDialog() { delete ui_; } void OrganiseDialog::SetDestinationModel(QAbstractItemModel* model, bool devices) { ui_->destination->setModel(model); ui_->eject_after->setVisible(devices); } bool OrganiseDialog::SetSongs(const SongList& songs) { total_size_ = 0; songs_.clear(); for (const Song& song : songs) { if (song.url().scheme() != "file") { continue; } if (song.filesize() > 0) total_size_ += song.filesize(); songs_ << song; } ui_->free_space->set_additional_bytes(total_size_); UpdatePreviews(); SetLoadingSongs(false); if (songs_future_.isRunning()) { songs_future_.cancel(); } songs_future_ = QFuture(); return songs_.count(); } bool OrganiseDialog::SetUrls(const QList& urls) { QStringList filenames; // Only add file:// URLs for (const QUrl& url : urls) { if (url.scheme() == "file") { filenames << url.toLocalFile(); } } return SetFilenames(filenames); } bool OrganiseDialog::SetFilenames(const QStringList& filenames) { songs_future_ = QtConcurrent::run(this, &OrganiseDialog::LoadSongsBlocking, filenames); QFutureWatcher* watcher = new QFutureWatcher(this); watcher->setFuture(songs_future_); NewClosure(watcher, SIGNAL(finished()), [=]() { SetSongs(songs_future_.result()); watcher->deleteLater(); }); SetLoadingSongs(true); return true; } void OrganiseDialog::SetLoadingSongs(bool loading) { if (loading) { ui_->preview_stack->setCurrentWidget(ui_->loading_page); ui_->button_box->button(QDialogButtonBox::Ok)->setEnabled(false); } else { ui_->preview_stack->setCurrentWidget(ui_->preview_page); // The Ok button is enabled by UpdatePreviews } } SongList OrganiseDialog::LoadSongsBlocking(const QStringList& filenames) { SongList songs; Song song; QStringList filenames_copy = filenames; while (!filenames_copy.isEmpty()) { const QString filename = filenames_copy.takeFirst(); // If it's a directory, add all the files inside. if (QFileInfo(filename).isDir()) { const QDir dir(filename); for (const QString& entry : dir.entryList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot | QDir::Readable)) { filenames_copy << dir.filePath(entry); } continue; } TagReaderClient::Instance()->ReadFileBlocking(filename, &song); if (song.is_valid()) songs << song; } return songs; } void OrganiseDialog::SetCopy(bool copy) { ui_->aftercopying->setCurrentIndex(copy ? 0 : 1); } void OrganiseDialog::InsertTag(const QString& tag) { ui_->naming->insertPlainText("%" + tag); } Organise::NewSongInfoList OrganiseDialog::ComputeNewSongsFilenames( const SongList& songs, const OrganiseFormat& format) { // Check if we will have multiple files with the same name. // If so, they will erase each other if the overwrite flag is set. // Better to rename them: e.g. foo.bar -> foo(2).bar QHash filenames; Organise::NewSongInfoList new_songs_info; for (const Song& song : songs) { QString new_filename = format.GetFilenameForSong(song); if (filenames.contains(new_filename)) { QString song_number = QString::number(++filenames[new_filename]); new_filename = Utilities::PathWithoutFilenameExtension(new_filename) + "(" + song_number + ")." + QFileInfo(new_filename).suffix(); } filenames.insert(new_filename, 1); new_songs_info << Organise::NewSongInfo(song, new_filename); } return new_songs_info; } void OrganiseDialog::UpdatePreviews() { if (songs_future_.isRunning()) { return; } const QModelIndex destination = ui_->destination->model()->index(ui_->destination->currentIndex(), 0); std::shared_ptr storage; bool has_local_destination = false; if (destination.isValid()) { storage = destination.data(MusicStorage::Role_Storage) .value>(); if (storage) { has_local_destination = !storage->LocalPath().isEmpty(); } } // Update the free space bar quint64 capacity = destination.data(MusicStorage::Role_Capacity).toLongLong(); quint64 free = destination.data(MusicStorage::Role_FreeSpace).toLongLong(); if (!capacity) { ui_->free_space->hide(); } else { ui_->free_space->show(); ui_->free_space->set_free_bytes(free); ui_->free_space->set_total_bytes(capacity); } // Update the format object format_.set_format(ui_->naming->toPlainText()); format_.set_replace_non_ascii(ui_->replace_ascii->isChecked()); format_.set_replace_spaces(ui_->replace_spaces->isChecked()); format_.set_replace_the(ui_->replace_the->isChecked()); const bool format_valid = !has_local_destination || format_.IsValid(); // Are we gonna enable the ok button? bool ok = format_valid && !songs_.isEmpty(); if (capacity != 0 && total_size_ > free) ok = false; ui_->button_box->button(QDialogButtonBox::Ok)->setEnabled(ok); if (!format_valid) return; new_songs_info_ = ComputeNewSongsFilenames(songs_, format_); // Update the previews ui_->preview->clear(); ui_->preview_group->setVisible(has_local_destination); ui_->naming_group->setVisible(has_local_destination); if (has_local_destination) { for (const Organise::NewSongInfo& song_info : new_songs_info_) { QString filename = storage->LocalPath() + "/" + song_info.new_filename_; ui_->preview->addItem(QDir::toNativeSeparators(filename)); } } if (!resized_by_user_) { adjustSize(); } } QSize OrganiseDialog::sizeHint() const { return QSize(650, 0); } void OrganiseDialog::Reset() { ui_->naming->setPlainText(kDefaultFormat); ui_->replace_ascii->setChecked(false); ui_->replace_spaces->setChecked(false); ui_->replace_the->setChecked(false); ui_->overwrite->setChecked(false); ui_->mark_as_listened->setChecked(false); ui_->eject_after->setChecked(false); } void OrganiseDialog::showEvent(QShowEvent*) { resized_by_user_ = false; QSettings s; s.beginGroup(kSettingsGroup); ui_->naming->setPlainText(s.value("format", kDefaultFormat).toString()); ui_->replace_ascii->setChecked(s.value("replace_ascii", false).toBool()); ui_->replace_spaces->setChecked(s.value("replace_spaces", false).toBool()); ui_->replace_the->setChecked(s.value("replace_the", false).toBool()); ui_->overwrite->setChecked(s.value("overwrite", false).toBool()); ui_->mark_as_listened->setChecked( s.value("mark_as_listened", false).toBool()); ui_->eject_after->setChecked(s.value("eject_after", false).toBool()); QString destination = s.value("destination").toString(); int index = ui_->destination->findText(destination); if (index != -1 && !destination.isEmpty()) { ui_->destination->setCurrentIndex(index); } } void OrganiseDialog::accept() { QSettings s; s.beginGroup(kSettingsGroup); s.setValue("format", ui_->naming->toPlainText()); s.setValue("replace_ascii", ui_->replace_ascii->isChecked()); s.setValue("replace_spaces", ui_->replace_spaces->isChecked()); s.setValue("replace_the", ui_->replace_the->isChecked()); s.setValue("overwrite", ui_->overwrite->isChecked()); s.setValue("mark_as_listened", ui_->overwrite->isChecked()); s.setValue("destination", ui_->destination->currentText()); s.setValue("eject_after", ui_->eject_after->isChecked()); const QModelIndex destination = ui_->destination->model()->index(ui_->destination->currentIndex(), 0); std::shared_ptr storage = destination.data(MusicStorage::Role_StorageForceConnect) .value>(); if (!storage) return; // It deletes itself when it's finished. const bool copy = ui_->aftercopying->currentIndex() == 0; Organise* organise = new Organise( task_manager_, storage, format_, copy, ui_->overwrite->isChecked(), ui_->mark_as_listened->isChecked(), new_songs_info_, ui_->eject_after->isChecked()); connect(organise, SIGNAL(Finished(QStringList)), SLOT(OrganiseFinished(QStringList))); connect(organise, SIGNAL(FileCopied(int)), this, SIGNAL(FileCopied(int))); organise->Start(); QDialog::accept(); } void OrganiseDialog::OrganiseFinished(const QStringList& files_with_errors) { if (files_with_errors.isEmpty()) return; error_dialog_.reset(new OrganiseErrorDialog); error_dialog_->Show(OrganiseErrorDialog::Type_Copy, files_with_errors); } void OrganiseDialog::resizeEvent(QResizeEvent* e) { if (e->spontaneous()) { resized_by_user_ = true; } QDialog::resizeEvent(e); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/organisedialog.h000066400000000000000000000052021260417502300237320ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ORGANISEDIALOG_H #define ORGANISEDIALOG_H #include #include #include #include #include "gtest/gtest_prod.h" #include "core/organise.h" #include "core/organiseformat.h" #include "core/song.h" class LibraryWatcher; class OrganiseErrorDialog; class TaskManager; class Ui_OrganiseDialog; class QAbstractItemModel; class OrganiseDialog : public QDialog { Q_OBJECT public: OrganiseDialog(TaskManager* task_manager, QWidget* parent = nullptr); ~OrganiseDialog(); static const char* kDefaultFormat; static const char* kSettingsGroup; QSize sizeHint() const; void SetDestinationModel(QAbstractItemModel* model, bool devices = false); // These functions return true if any songs were actually added to the dialog. // SetSongs returns immediately, SetUrls and SetFilenames load the songs in // the background. bool SetSongs(const SongList& songs); bool SetUrls(const QList& urls); bool SetFilenames(const QStringList& filenames); void SetCopy(bool copy); signals: void FileCopied(int); public slots: void accept(); protected: void showEvent(QShowEvent*); void resizeEvent(QResizeEvent*); private slots: void Reset(); void InsertTag(const QString& tag); void UpdatePreviews(); void OrganiseFinished(const QStringList& files_with_errors); private: SongList LoadSongsBlocking(const QStringList& filenames); void SetLoadingSongs(bool loading); static Organise::NewSongInfoList ComputeNewSongsFilenames( const SongList& songs, const OrganiseFormat& format); Ui_OrganiseDialog* ui_; TaskManager* task_manager_; OrganiseFormat format_; QFuture songs_future_; SongList songs_; Organise::NewSongInfoList new_songs_info_; quint64 total_size_; std::unique_ptr error_dialog_; bool resized_by_user_; FRIEND_TEST(OrganiseDialogTest, ComputeNewSongsFilenamesTest); }; #endif // ORGANISEDIALOG_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/organisedialog.ui000066400000000000000000000200611260417502300241200ustar00rootroot00000000000000 OrganiseDialog 0 0 588 525 Organise Files :/icon.png:/icon.png Destination After copying... Keep the original files Delete the original files Safely remove the device after copying Naming options <p>Tokens start with %, for example: %artist %album %title </p> <p>If you surround sections of text that contain a token with curly-braces, that section will be hidden if the token is empty.</p> QTextEdit::NoWrap false Insert... QToolButton::InstantPopup Ignore "The" in artist names Replaces spaces with underscores Restrict to ASCII characters Overwrite existing files Mark as listened Preview 0 0 0 0 0 Qt::Horizontal 264 20 Loading... Qt::Horizontal 264 20 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Reset FreeSpaceBar QWidget
widgets/freespacebar.h
1
LineTextEdit QTextEdit
widgets/linetextedit.h
BusyIndicator QWidget
widgets/busyindicator.h
1
destination aftercopying eject_after naming insert replace_the replace_spaces replace_ascii overwrite button_box button_box accepted() OrganiseDialog accept() 257 487 157 274 button_box rejected() OrganiseDialog reject() 325 487 286 274
clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/organiseerrordialog.cpp000066400000000000000000000042571260417502300253500ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "organiseerrordialog.h" #include "ui_organiseerrordialog.h" #include OrganiseErrorDialog::OrganiseErrorDialog(QWidget* parent) : QDialog(parent), ui_(new Ui_OrganiseErrorDialog) { ui_->setupUi(this); const int icon_size = style()->pixelMetric(QStyle::PM_MessageBoxIconSize, 0, this); QIcon icon = style()->standardIcon(QStyle::SP_MessageBoxCritical, 0, this); ui_->icon->setPixmap(icon.pixmap(icon_size)); } OrganiseErrorDialog::~OrganiseErrorDialog() { delete ui_; } void OrganiseErrorDialog::Show(OperationType type, const SongList& songs_with_errors) { QStringList files; for (const Song& song : songs_with_errors) { files << song.url().toLocalFile(); } Show(type, files); } void OrganiseErrorDialog::Show(OperationType type, const QStringList& files_with_errors) { QStringList sorted_files = files_with_errors; qStableSort(sorted_files); switch (type) { case Type_Copy: setWindowTitle(tr("Error copying songs")); ui_->label->setText( tr("There were problems copying some songs. The following files " "could not be copied:")); break; case Type_Delete: setWindowTitle(tr("Error deleting songs")); ui_->label->setText( tr("There were problems deleting some songs. The following files " "could not be deleted:")); break; } ui_->list->addItems(sorted_files); show(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/organiseerrordialog.h000066400000000000000000000024001260417502300250010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ORGANISEERRORDIALOG_H #define ORGANISEERRORDIALOG_H #include #include "core/song.h" class Ui_OrganiseErrorDialog; class OrganiseErrorDialog : public QDialog { Q_OBJECT public: OrganiseErrorDialog(QWidget* parent = nullptr); ~OrganiseErrorDialog(); enum OperationType { Type_Copy, Type_Delete, }; void Show(OperationType type, const SongList& songs_with_errors); void Show(OperationType type, const QStringList& files_with_errors); private: Ui_OrganiseErrorDialog* ui_; }; #endif // ORGANISEERRORDIALOG_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/organiseerrordialog.ui000066400000000000000000000040541260417502300251760ustar00rootroot00000000000000 OrganiseErrorDialog 0 0 779 355 Qt::Vertical 20 40 Qt::Horizontal QDialogButtonBox::Close buttonBox accepted() OrganiseErrorDialog accept() 248 254 157 274 buttonBox rejected() OrganiseErrorDialog reject() 316 260 286 274 clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/playbacksettingspage.cpp000066400000000000000000000156001260417502300255050ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "iconloader.h" #include "playbacksettingspage.h" #include "settingsdialog.h" #include "ui_playbacksettingspage.h" #include "engines/gstengine.h" #include "playlist/playlist.h" PlaybackSettingsPage::PlaybackSettingsPage(SettingsDialog* dialog) : SettingsPage(dialog), ui_(new Ui_PlaybackSettingsPage) { ui_->setupUi(this); setWindowIcon(IconLoader::Load("media-playback-start")); connect(ui_->fading_cross, SIGNAL(toggled(bool)), SLOT(FadingOptionsChanged())); connect(ui_->fading_out, SIGNAL(toggled(bool)), SLOT(FadingOptionsChanged())); connect(ui_->fading_auto, SIGNAL(toggled(bool)), SLOT(FadingOptionsChanged())); connect(ui_->buffer_min_fill, SIGNAL(valueChanged(int)), SLOT(BufferMinFillChanged(int))); ui_->buffer_min_fill_value_label->setMinimumWidth( QFontMetrics(ui_->buffer_min_fill_value_label->font()).width("WW%")); connect(ui_->replaygain_preamp, SIGNAL(valueChanged(int)), SLOT(RgPreampChanged(int))); ui_->replaygain_preamp_label->setMinimumWidth( QFontMetrics(ui_->replaygain_preamp_label->font()).width("-WW.W dB")); RgPreampChanged(ui_->replaygain_preamp->value()); ui_->sample_rate->setItemData(0, GstEngine::kAutoSampleRate); ui_->sample_rate->setItemData(1, 44100); ui_->sample_rate->setItemData(2, 48000); ui_->sample_rate->setItemData(3, 96000); ui_->sample_rate->setItemData(4, 192000); } PlaybackSettingsPage::~PlaybackSettingsPage() { delete ui_; } void PlaybackSettingsPage::Load() { const GstEngine* engine = dialog()->gst_engine(); ui_->gst_output->clear(); for (const GstEngine::OutputDetails& output : engine->GetOutputsList()) { // Strip components off the icon name until we find one. QStringList components = output.icon_name.split("-"); QIcon icon; while (icon.isNull() && !components.isEmpty()) { icon = IconLoader::Load(components.join("-")); components.removeLast(); } ui_->gst_output->addItem(icon, output.description, QVariant::fromValue(output)); } QSettings s; s.beginGroup(Playlist::kSettingsGroup); ui_->current_glow->setChecked(s.value("glow_effect", true).toBool()); s.endGroup(); s.beginGroup(Engine::Base::kSettingsGroup); ui_->fading_out->setChecked(s.value("FadeoutEnabled", true).toBool()); ui_->fading_cross->setChecked(s.value("CrossfadeEnabled", true).toBool()); ui_->fading_auto->setChecked(s.value("AutoCrossfadeEnabled", false).toBool()); ui_->fading_duration->setValue(s.value("FadeoutDuration", 2000).toInt()); ui_->fading_samealbum->setChecked( s.value("NoCrossfadeSameAlbum", true).toBool()); ui_->fadeout_pause->setChecked( s.value("FadeoutPauseEnabled", false).toBool()); ui_->fading_pause_duration->setValue( s.value("FadeoutPauseDuration", 250).toInt()); s.endGroup(); s.beginGroup(GstEngine::kSettingsGroup); QString sink = s.value("sink", GstEngine::kAutoSink).toString(); QString device = s.value("device").toString(); ui_->gst_output->setCurrentIndex(0); for (int i = 0; i < ui_->gst_output->count(); ++i) { GstEngine::OutputDetails details = ui_->gst_output->itemData(i).value(); if (details.gstreamer_plugin_name == sink && details.device_property_value == device) { ui_->gst_output->setCurrentIndex(i); break; } } ui_->replaygain->setChecked(s.value("rgenabled", false).toBool()); ui_->replaygain_mode->setCurrentIndex(s.value("rgmode", 0).toInt()); ui_->replaygain_preamp->setValue(s.value("rgpreamp", 0.0).toDouble() * 10 + 150); ui_->replaygain_compression->setChecked( s.value("rgcompression", true).toBool()); ui_->buffer_duration->setValue(s.value("bufferduration", 4000).toInt()); ui_->mono_playback->setChecked(s.value("monoplayback", false).toBool()); ui_->sample_rate->setCurrentIndex(ui_->sample_rate->findData( s.value("samplerate", GstEngine::kAutoSampleRate).toInt())); ui_->buffer_min_fill->setValue(s.value("bufferminfill", 33).toInt()); s.endGroup(); } void PlaybackSettingsPage::Save() { QSettings s; s.beginGroup(Playlist::kSettingsGroup); s.setValue("glow_effect", ui_->current_glow->isChecked()); s.endGroup(); s.beginGroup(Engine::Base::kSettingsGroup); s.setValue("FadeoutEnabled", ui_->fading_out->isChecked()); s.setValue("FadeoutDuration", ui_->fading_duration->value()); s.setValue("CrossfadeEnabled", ui_->fading_cross->isChecked()); s.setValue("AutoCrossfadeEnabled", ui_->fading_auto->isChecked()); s.setValue("NoCrossfadeSameAlbum", ui_->fading_samealbum->isChecked()); s.setValue("FadeoutPauseEnabled", ui_->fadeout_pause->isChecked()); s.setValue("FadeoutPauseDuration", ui_->fading_pause_duration->value()); s.endGroup(); GstEngine::OutputDetails details = ui_->gst_output->itemData(ui_->gst_output->currentIndex()) .value(); s.beginGroup(GstEngine::kSettingsGroup); s.setValue("sink", details.gstreamer_plugin_name); s.setValue("device", details.device_property_value); s.setValue("rgenabled", ui_->replaygain->isChecked()); s.setValue("rgmode", ui_->replaygain_mode->currentIndex()); s.setValue("rgpreamp", float(ui_->replaygain_preamp->value()) / 10 - 15); s.setValue("rgcompression", ui_->replaygain_compression->isChecked()); s.setValue("bufferduration", ui_->buffer_duration->value()); s.setValue("monoplayback", ui_->mono_playback->isChecked()); s.setValue( "samplerate", ui_->sample_rate->itemData(ui_->sample_rate->currentIndex()).toInt()); s.setValue("bufferminfill", ui_->buffer_min_fill->value()); s.endGroup(); } void PlaybackSettingsPage::RgPreampChanged(int value) { float db = float(value) / 10 - 15; QString db_str; db_str.sprintf("%+.1f dB", db); ui_->replaygain_preamp_label->setText(db_str); } void PlaybackSettingsPage::BufferMinFillChanged(int value) { ui_->buffer_min_fill_value_label->setText(QString::number(value) + "%"); } void PlaybackSettingsPage::FadingOptionsChanged() { ui_->fading_options->setEnabled(ui_->fading_out->isChecked() || ui_->fading_cross->isChecked() || ui_->fading_auto->isChecked()); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/playbacksettingspage.h000066400000000000000000000023241260417502300251510ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PLAYBACKSETTINGSPAGE_H #define PLAYBACKSETTINGSPAGE_H #include "settingspage.h" class Ui_PlaybackSettingsPage; class PlaybackSettingsPage : public SettingsPage { Q_OBJECT public: PlaybackSettingsPage(SettingsDialog* dialog); ~PlaybackSettingsPage(); void Load(); void Save(); private slots: void FadingOptionsChanged(); void RgPreampChanged(int value); void BufferMinFillChanged(int value); private: Ui_PlaybackSettingsPage* ui_; }; #endif // PLAYBACKSETTINGSPAGE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/playbacksettingspage.ui000066400000000000000000000326471260417502300253520ustar00rootroot00000000000000 PlaybackSettingsPage 0 0 596 667 Playback Show a glowing animation on the current track true Fading Fade out when stopping a track true Cross-fade when changing tracks manually true Cross-fade when changing tracks automatically false Except between tracks on the same album or in the same CUE sheet 0 Fading duration 22 ms 10000 1000 2000 Qt::Horizontal 257 20 Fade out on pause / fade in on resume Fading duration 22 ms 10000 50 250 Qt::Horizontal 40 20 Replay Gain Use Replay Gain metadata if it is available false 0 Replay Gain mode Radio (equal loudness for all tracks) Album (ideal loudness for all tracks) Pre-amp 300 150 Qt::Horizontal 150 Apply compression to prevent clipping Audio output QFormLayout::AllNonFixedFieldsGrow Output device Buffer duration ms 60000 100 Minimum buffer fill 1 50 33 Qt::Horizontal 1 Changing mono playback preference will be effective for the next playing songs Mono playback Sample rate 0 0 0 0 Changes will take place when the next song starts playing QComboBox::AdjustToContents Auto 44,100Hz 48,000Hz 96,000Hz 192,000Hz Qt::Horizontal 40 20 Qt::Vertical 20 114 StickySlider QSlider
widgets/stickyslider.h
replaygain toggled(bool) widget setEnabled(bool) 89 259 143 285 fading_auto toggled(bool) fading_samealbum setEnabled(bool) 109 133 113 153
clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/qt_blurimage.h000066400000000000000000000017001260417502300234150ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef QT_BLURIMAGE_H #define QT_BLURIMAGE_H // Exported by QtGui void qt_blurImage(QPainter* p, QImage& blurImage, qreal radius, bool quality, bool alphaOnly, int transposed = 0); #endif // QT_BLURIMAGE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/qtsystemtrayicon.cpp000066400000000000000000000177441260417502300247560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "iconloader.h" #include "qtsystemtrayicon.h" #include "core/song.h" #include #include #include #include #include #include #include QtSystemTrayIcon::QtSystemTrayIcon(QObject* parent) : SystemTrayIcon(parent), tray_(new QSystemTrayIcon(this)), menu_(new QMenu), action_play_pause_(nullptr), action_stop_(nullptr), action_stop_after_this_track_(nullptr), action_mute_(nullptr), action_love_(nullptr) { QIcon theme_icon = IconLoader::Load("clementine-panel"); QIcon theme_icon_grey = IconLoader::Load("clementine-panel-grey"); if (theme_icon.isNull() || theme_icon_grey.isNull()) { // Load the default icon QIcon icon(":icon.png"); orange_icon_ = icon.pixmap(48, QIcon::Normal); grey_icon_ = icon.pixmap(48, QIcon::Disabled); } else { // Use the icons from the theme orange_icon_ = theme_icon.pixmap(48); grey_icon_ = theme_icon_grey.pixmap(48); } tray_->setIcon(orange_icon_); tray_->installEventFilter(this); ClearNowPlaying(); QFile pattern_file(":/now_playing_tooltip.txt"); pattern_file.open(QIODevice::ReadOnly); pattern_ = QString::fromAscii(pattern_file.readAll()); connect(tray_, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), SLOT(Clicked(QSystemTrayIcon::ActivationReason))); } QtSystemTrayIcon::~QtSystemTrayIcon() { delete menu_; } bool QtSystemTrayIcon::eventFilter(QObject* object, QEvent* event) { if (QObject::eventFilter(object, event)) return true; if (object != tray_) return false; if (event->type() == QEvent::Wheel) { QWheelEvent* e = static_cast(event); if (e->modifiers() == Qt::ShiftModifier) { if (e->delta() > 0) { emit SeekForward(); } else { emit SeekBackward(); } } else if (e->modifiers() == Qt::ControlModifier) { if (e->delta() < 0) { emit NextTrack(); } else { emit PreviousTrack(); } } else { emit ChangeVolume(e->delta()); } return true; } return false; } void QtSystemTrayIcon::SetupMenu(QAction* previous, QAction* play, QAction* stop, QAction* stop_after, QAction* next, QAction* mute, QAction* love, QAction* quit) { // Creating new actions and connecting them to old ones. This allows us to // use old actions without displaying shortcuts that can not be used when // Clementine's window is hidden menu_->addAction(previous->icon(), previous->text(), previous, SLOT(trigger())); action_play_pause_ = menu_->addAction(play->icon(), play->text(), play, SLOT(trigger())); action_stop_ = menu_->addAction(stop->icon(), stop->text(), stop, SLOT(trigger())); action_stop_after_this_track_ = menu_->addAction( stop_after->icon(), stop_after->text(), stop_after, SLOT(trigger())); menu_->addAction(next->icon(), next->text(), next, SLOT(trigger())); menu_->addSeparator(); action_mute_ = menu_->addAction(mute->icon(), mute->text(), mute, SLOT(trigger())); action_mute_->setCheckable(true); action_mute_->setChecked(mute->isChecked()); menu_->addSeparator(); #ifdef HAVE_LIBLASTFM action_love_ = menu_->addAction(love->icon(), love->text(), love, SLOT(trigger())); action_love_->setVisible(love->isVisible()); action_love_->setEnabled(love->isEnabled()); #endif menu_->addSeparator(); menu_->addAction(quit->icon(), quit->text(), quit, SLOT(trigger())); tray_->setContextMenu(menu_); } void QtSystemTrayIcon::Clicked(QSystemTrayIcon::ActivationReason reason) { switch (reason) { case QSystemTrayIcon::DoubleClick: case QSystemTrayIcon::Trigger: emit ShowHide(); break; case QSystemTrayIcon::MiddleClick: emit PlayPause(); break; default: break; } } void QtSystemTrayIcon::ShowPopup(const QString& summary, const QString& message, int timeout) { tray_->showMessage(summary, message, QSystemTrayIcon::NoIcon, timeout); } void QtSystemTrayIcon::UpdateIcon() { tray_->setIcon(CreateIcon(orange_icon_, grey_icon_)); } void QtSystemTrayIcon::SetPaused() { SystemTrayIcon::SetPaused(); action_stop_->setEnabled(true); action_stop_after_this_track_->setEnabled(true); action_play_pause_->setIcon(IconLoader::Load("media-playback-start")); action_play_pause_->setText(tr("Play")); action_play_pause_->setEnabled(true); } void QtSystemTrayIcon::SetPlaying(bool enable_play_pause, bool enable_love) { SystemTrayIcon::SetPlaying(); action_stop_->setEnabled(true); action_stop_after_this_track_->setEnabled(true); action_play_pause_->setIcon(IconLoader::Load("media-playback-pause")); action_play_pause_->setText(tr("Pause")); action_play_pause_->setEnabled(enable_play_pause); #ifdef HAVE_LIBLASTFM action_love_->setEnabled(enable_love); #endif } void QtSystemTrayIcon::SetStopped() { SystemTrayIcon::SetStopped(); action_stop_->setEnabled(false); action_stop_after_this_track_->setEnabled(false); action_play_pause_->setIcon(IconLoader::Load("media-playback-start")); action_play_pause_->setText(tr("Play")); action_play_pause_->setEnabled(true); #ifdef HAVE_LIBLASTFM action_love_->setEnabled(false); #endif } void QtSystemTrayIcon::LastFMButtonVisibilityChanged(bool value) { #ifdef HAVE_LIBLASTFM action_love_->setVisible(value); #endif } void QtSystemTrayIcon::LastFMButtonLoveStateChanged(bool value) { #ifdef HAVE_LIBLASTFM action_love_->setEnabled(value); #endif } void QtSystemTrayIcon::MuteButtonStateChanged(bool value) { if (action_mute_) action_mute_->setChecked(value); } bool QtSystemTrayIcon::IsVisible() const { return tray_->isVisible(); } void QtSystemTrayIcon::SetVisible(bool visible) { tray_->setVisible(visible); } void QtSystemTrayIcon::SetNowPlaying(const Song& song, const QString& image_path) { #ifdef Q_WS_WIN // Windows doesn't support HTML in tooltips, so just show something basic tray_->setToolTip(song.PrettyTitleWithArtist()); return; #endif int columns = image_path == nullptr ? 1 : 2; QString clone = pattern_; clone.replace("%columns", QString::number(columns)); clone.replace("%appName", QCoreApplication::applicationName()); clone.replace("%titleKey", tr("Title") % ":"); clone.replace("%titleValue", Qt::escape(song.PrettyTitle())); clone.replace("%artistKey", tr("Artist") % ":"); clone.replace("%artistValue", Qt::escape(song.artist())); clone.replace("%albumKey", tr("Album") % ":"); clone.replace("%albumValue", Qt::escape(song.album())); clone.replace("%lengthKey", tr("Length") % ":"); clone.replace("%lengthValue", Qt::escape(song.PrettyLength())); if (columns == 2) { QString final_path = image_path.startsWith("file://") ? image_path.mid(7) : image_path; clone.replace("%image", " " " " " "); } else { clone.replace("%image", ""); } // TODO: we should also repaint this tray_->setToolTip(clone); } void QtSystemTrayIcon::ClearNowPlaying() { tray_->setToolTip(QCoreApplication::applicationName()); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/qtsystemtrayicon.h000066400000000000000000000041321260417502300244060ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef QTSYSTEMTRAYICON_H #define QTSYSTEMTRAYICON_H #include "systemtrayicon.h" #include class QtSystemTrayIcon : public SystemTrayIcon { Q_OBJECT public: QtSystemTrayIcon(QObject* parent = nullptr); ~QtSystemTrayIcon(); void SetupMenu(QAction* previous, QAction* play, QAction* stop, QAction* stop_after, QAction* next, QAction* mute, QAction* love, QAction* quit); bool IsVisible() const; void SetVisible(bool visible); void ShowPopup(const QString& summary, const QString& message, int timeout); void SetNowPlaying(const Song& song, const QString& image_path); void ClearNowPlaying(); protected: // SystemTrayIcon void UpdateIcon(); void SetPaused(); void SetPlaying(bool enable_play_pause = false, bool enable_love = false); void SetStopped(); void LastFMButtonVisibilityChanged(bool value); void LastFMButtonLoveStateChanged(bool value); void MuteButtonStateChanged(bool value); // QObject bool eventFilter(QObject*, QEvent*); private slots: void Clicked(QSystemTrayIcon::ActivationReason); private: QSystemTrayIcon* tray_; QMenu* menu_; QAction* action_play_pause_; QAction* action_stop_; QAction* action_stop_after_this_track_; QAction* action_mute_; QAction* action_love_; QString pattern_; QPixmap orange_icon_; QPixmap grey_icon_; }; #endif // QTSYSTEMTRAYICON_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/screensaver.cpp000066400000000000000000000037121260417502300236220ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "config.h" #include "screensaver.h" #include #ifdef HAVE_DBUS #include "dbusscreensaver.h" #include #include #endif #ifdef Q_OS_DARWIN #include "macscreensaver.h" #endif #include const char* Screensaver::kGnomeService = "org.gnome.ScreenSaver"; const char* Screensaver::kGnomePath = "/"; const char* Screensaver::kGnomeInterface = "org.gnome.ScreenSaver"; const char* Screensaver::kKdeService = "org.kde.ScreenSaver"; const char* Screensaver::kKdePath = "/ScreenSaver/"; const char* Screensaver::kKdeInterface = "org.freedesktop.ScreenSaver"; Screensaver* Screensaver::screensaver_ = 0; Screensaver* Screensaver::GetScreensaver() { if (!screensaver_) { #if defined(HAVE_DBUS) if (QDBusConnection::sessionBus().interface()->isServiceRegistered( kGnomeService)) { screensaver_ = new DBusScreensaver(kGnomeService, kGnomePath, kGnomeInterface); } else if (QDBusConnection::sessionBus().interface()->isServiceRegistered( kKdeService)) { screensaver_ = new DBusScreensaver(kKdeService, kKdePath, kKdeInterface); } #elif defined(Q_OS_DARWIN) screensaver_ = new MacScreensaver(); #endif } return screensaver_; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/screensaver.h000066400000000000000000000022661260417502300232720ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SCREENSAVER_H #define SCREENSAVER_H class Screensaver { public: virtual ~Screensaver() {} static const char* kGnomeService; static const char* kGnomePath; static const char* kGnomeInterface; static const char* kKdeService; static const char* kKdePath; static const char* kKdeInterface; virtual void Inhibit() = 0; virtual void Uninhibit() = 0; static Screensaver* GetScreensaver(); private: static Screensaver* screensaver_; }; #endif clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/settingsdialog.cpp000066400000000000000000000250221260417502300243200ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "appearancesettingspage.h" #include "backgroundstreamssettingspage.h" #include "behavioursettingspage.h" #include "config.h" #include "globalshortcutssettingspage.h" #include "iconloader.h" #include "playbacksettingspage.h" #include "networkproxysettingspage.h" #include "networkremotesettingspage.h" #include "notificationssettingspage.h" #include "mainwindow.h" #include "settingsdialog.h" #include "core/application.h" #include "core/backgroundstreams.h" #include "core/logging.h" #include "core/networkproxyfactory.h" #include "core/player.h" #include "engines/enginebase.h" #include "engines/gstengine.h" #include "globalsearch/globalsearchsettingspage.h" #include "internet/digitally/digitallyimportedsettingspage.h" #include "internet/core/internetshowsettingspage.h" #include "internet/magnatune/magnatunesettingspage.h" #include "internet/soundcloud/soundcloudsettingspage.h" #include "internet/spotify/spotifysettingspage.h" #include "internet/subsonic/subsonicsettingspage.h" #include "library/librarysettingspage.h" #include "playlist/playlistview.h" #include "internet/podcasts/podcastsettingspage.h" #include "songinfo/songinfosettingspage.h" #include "transcoder/transcodersettingspage.h" #include "widgets/groupediconview.h" #include "widgets/osdpretty.h" #include "ui_settingsdialog.h" #ifdef HAVE_LIBLASTFM #include "internet/lastfm/lastfmsettingspage.h" #endif #ifdef HAVE_WIIMOTEDEV #include "wiimotedev/wiimotesettingspage.h" #endif #ifdef HAVE_GOOGLE_DRIVE #include "internet/googledrive/googledrivesettingspage.h" #endif #ifdef HAVE_DROPBOX #include "internet/dropbox/dropboxsettingspage.h" #endif #ifdef HAVE_BOX #include "internet/box/boxsettingspage.h" #endif #ifdef HAVE_VK #include "internet/vk/vksettingspage.h" #endif #ifdef HAVE_SKYDRIVE #include "internet/skydrive/skydrivesettingspage.h" #endif #ifdef HAVE_SEAFILE #include "internet/seafile/seafilesettingspage.h" #endif #ifdef HAVE_AMAZON_CLOUD_DRIVE #include "internet/amazon/amazonsettingspage.h" #endif #include #include #include #include #include SettingsItemDelegate::SettingsItemDelegate(QObject* parent) : QStyledItemDelegate(parent) {} QSize SettingsItemDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const { const bool is_separator = index.data(SettingsDialog::Role_IsSeparator).toBool(); QSize ret = QStyledItemDelegate::sizeHint(option, index); if (is_separator) { ret.setHeight(ret.height() * 2); } return ret; } void SettingsItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { const bool is_separator = index.data(SettingsDialog::Role_IsSeparator).toBool(); if (is_separator) { GroupedIconView::DrawHeader(painter, option.rect, option.font, option.palette, index.data().toString()); } else { QStyledItemDelegate::paint(painter, option, index); } } SettingsDialog::SettingsDialog(Application* app, BackgroundStreams* streams, QWidget* parent) : QDialog(parent), app_(app), model_(app_->library_model()->directory_model()), gst_engine_(qobject_cast(app_->player()->engine())), song_info_view_(nullptr), streams_(streams), global_search_(app_->global_search()), appearance_(app_->appearance()), ui_(new Ui_SettingsDialog), loading_settings_(false) { ui_->setupUi(this); ui_->list->setItemDelegate(new SettingsItemDelegate(this)); QTreeWidgetItem* general = AddCategory(tr("General")); AddPage(Page_Playback, new PlaybackSettingsPage(this), general); AddPage(Page_Behaviour, new BehaviourSettingsPage(this), general); AddPage(Page_Library, new LibrarySettingsPage(this), general); AddPage(Page_Proxy, new NetworkProxySettingsPage(this), general); AddPage(Page_Transcoding, new TranscoderSettingsPage(this), general); AddPage(Page_NetworkRemote, new NetworkRemoteSettingsPage(this), general); #ifdef HAVE_WIIMOTEDEV AddPage(Page_Wiimotedev, new WiimoteSettingsPage(this), general); #endif // User interface QTreeWidgetItem* iface = AddCategory(tr("User interface")); AddPage(Page_GlobalShortcuts, new GlobalShortcutsSettingsPage(this), iface); AddPage(Page_GlobalSearch, new GlobalSearchSettingsPage(this), iface); AddPage(Page_Appearance, new AppearanceSettingsPage(this), iface); AddPage(Page_SongInformation, new SongInfoSettingsPage(this), iface); AddPage(Page_Notifications, new NotificationsSettingsPage(this), iface); AddPage(Page_InternetShow, new InternetShowSettingsPage(this), iface); // Internet providers QTreeWidgetItem* providers = AddCategory(tr("Internet providers")); #ifdef HAVE_LIBLASTFM AddPage(Page_Lastfm, new LastFMSettingsPage(this), providers); #endif #ifdef HAVE_GOOGLE_DRIVE AddPage(Page_GoogleDrive, new GoogleDriveSettingsPage(this), providers); #endif #ifdef HAVE_DROPBOX AddPage(Page_Dropbox, new DropboxSettingsPage(this), providers); #endif #ifdef HAVE_BOX AddPage(Page_Box, new BoxSettingsPage(this), providers); #endif #ifdef HAVE_SKYDRIVE AddPage(Page_Skydrive, new SkydriveSettingsPage(this), providers); #endif AddPage(Page_SoundCloud, new SoundCloudSettingsPage(this), providers); AddPage(Page_Spotify, new SpotifySettingsPage(this), providers); #ifdef HAVE_VK AddPage(Page_Vk, new VkSettingsPage(this), providers); #endif #ifdef HAVE_SEAFILE AddPage(Page_Seafile, new SeafileSettingsPage(this), providers); #endif #ifdef HAVE_AMAZON_CLOUD_DRIVE AddPage(Page_AmazonCloudDrive, new AmazonSettingsPage(this), providers); #endif AddPage(Page_Magnatune, new MagnatuneSettingsPage(this), providers); AddPage(Page_DigitallyImported, new DigitallyImportedSettingsPage(this), providers); AddPage(Page_BackgroundStreams, new BackgroundStreamsSettingsPage(this), providers); AddPage(Page_Subsonic, new SubsonicSettingsPage(this), providers); AddPage(Page_Podcasts, new PodcastSettingsPage(this), providers); providers->sortChildren(0, Qt::AscendingOrder); // List box connect(ui_->list, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), SLOT(CurrentItemChanged(QTreeWidgetItem*))); ui_->list->setCurrentItem(pages_[Page_Playback].item_); // Make sure the list is big enough to show all the items ui_->list->setMinimumWidth( static_cast(ui_->list)->sizeHintForColumn(0)); ui_->buttonBox->button(QDialogButtonBox::Cancel) ->setShortcut(QKeySequence::Close); } SettingsDialog::~SettingsDialog() { delete ui_; } QTreeWidgetItem* SettingsDialog::AddCategory(const QString& name) { QTreeWidgetItem* item = new QTreeWidgetItem; item->setText(0, name); item->setData(0, Role_IsSeparator, true); item->setFlags(Qt::ItemIsEnabled); ui_->list->invisibleRootItem()->addChild(item); item->setExpanded(true); return item; } void SettingsDialog::AddPage(Page id, SettingsPage* page, QTreeWidgetItem* parent) { if (!parent) parent = ui_->list->invisibleRootItem(); // Connect page's signals to the settings dialog's signals connect(page, SIGNAL(NotificationPreview(OSD::Behaviour, QString, QString)), SIGNAL(NotificationPreview(OSD::Behaviour, QString, QString))); connect(page, SIGNAL(SetWiimotedevInterfaceActived(bool)), SIGNAL(SetWiimotedevInterfaceActived(bool))); // Create the list item QTreeWidgetItem* item = new QTreeWidgetItem; item->setText(0, page->windowTitle()); item->setIcon(0, page->windowIcon()); item->setData(0, Role_IsSeparator, false); if (!page->IsEnabled()) { item->setFlags(Qt::NoItemFlags); } parent->addChild(item); // Create a scroll area containing the page QScrollArea* area = new QScrollArea; area->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); area->setWidget(page); area->setWidgetResizable(true); area->setFrameShape(QFrame::NoFrame); area->setMinimumWidth(page->layout()->minimumSize().width()); // Add the page to the stack ui_->stacked_widget->addWidget(area); // Remember where the page is PageData data; data.item_ = item; data.scroll_area_ = area; data.page_ = page; pages_[id] = data; } void SettingsDialog::Save() { for (const PageData& data : pages_.values()) { data.page_->Save(); } } void SettingsDialog::accept() { Save(); QDialog::accept(); } void SettingsDialog::reject() { // Notify each page that user clicks on Cancel for (const PageData& data : pages_.values()) { data.page_->Cancel(); } QDialog::reject(); } void SettingsDialog::DialogButtonClicked(QAbstractButton* button) { // While we only connect Apply at the moment, this might change in the future if (ui_->buttonBox->button(QDialogButtonBox::Apply) == button) { Save(); } } void SettingsDialog::showEvent(QShowEvent* e) { // Load settings loading_settings_ = true; for (const PageData& data : pages_.values()) { data.page_->Load(); } loading_settings_ = false; // Resize the dialog if it's too big const QSize available = QApplication::desktop()->availableGeometry(this).size(); if (available.height() < height()) { resize(width(), sizeHint().height()); } QDialog::showEvent(e); } void SettingsDialog::OpenAtPage(Page page) { if (!pages_.contains(page)) { return; } ui_->list->setCurrentItem(pages_[page].item_); show(); } void SettingsDialog::CurrentItemChanged(QTreeWidgetItem* item) { if (!(item->flags() & Qt::ItemIsSelectable)) { return; } // Set the title ui_->title->setText("" + item->text(0) + ""); // Display the right page for (const PageData& data : pages_.values()) { if (data.item_ == item) { ui_->stacked_widget->setCurrentWidget(data.scroll_area_); break; } } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/settingsdialog.h000066400000000000000000000077521260417502300237770ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SETTINGSDIALOG_H #define SETTINGSDIALOG_H #include #include #include "config.h" #include "widgets/osd.h" class QAbstractButton; class QScrollArea; class QTreeWidgetItem; class Appearance; class BackgroundStreams; class GlobalSearch; class GlobalShortcuts; class LibraryDirectoryModel; class SettingsPage; class SongInfoView; class Ui_SettingsDialog; class GstEngine; class SettingsItemDelegate : public QStyledItemDelegate { public: SettingsItemDelegate(QObject* parent); QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const; void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; }; class SettingsDialog : public QDialog { Q_OBJECT public: SettingsDialog(Application* app, BackgroundStreams* streams, QWidget* parent = nullptr); ~SettingsDialog(); enum Page { Page_Playback, Page_Behaviour, Page_SongInformation, Page_GlobalShortcuts, Page_GlobalSearch, Page_Appearance, Page_NetworkRemote, Page_Notifications, Page_Library, Page_Lastfm, Page_SoundCloud, Page_Spotify, Page_Magnatune, Page_DigitallyImported, Page_BackgroundStreams, Page_Proxy, Page_Transcoding, Page_Remote, Page_Wiimotedev, Page_Subsonic, Page_Podcasts, Page_GoogleDrive, Page_Dropbox, Page_Skydrive, Page_Box, Page_Vk, Page_Seafile, Page_InternetShow, Page_AmazonCloudDrive, }; enum Role { Role_IsSeparator = Qt::UserRole }; void SetGlobalShortcutManager(GlobalShortcuts* manager) { manager_ = manager; } void SetSongInfoView(SongInfoView* view) { song_info_view_ = view; } bool is_loading_settings() const { return loading_settings_; } Application* app() const { return app_; } LibraryDirectoryModel* library_directory_model() const { return model_; } GlobalShortcuts* global_shortcuts_manager() const { return manager_; } const GstEngine* gst_engine() const { return gst_engine_; } SongInfoView* song_info_view() const { return song_info_view_; } BackgroundStreams* background_streams() const { return streams_; } GlobalSearch* global_search() const { return global_search_; } Appearance* appearance() const { return appearance_; } void OpenAtPage(Page page); // QDialog void accept(); void reject(); // QWidget void showEvent(QShowEvent* e); signals: void NotificationPreview(OSD::Behaviour, QString, QString); void SetWiimotedevInterfaceActived(bool); private slots: void CurrentItemChanged(QTreeWidgetItem* item); void DialogButtonClicked(QAbstractButton* button); private: struct PageData { QTreeWidgetItem* item_; QScrollArea* scroll_area_; SettingsPage* page_; }; QTreeWidgetItem* AddCategory(const QString& name); void AddPage(Page id, SettingsPage* page, QTreeWidgetItem* parent = nullptr); void Save(); private: Application* app_; LibraryDirectoryModel* model_; GlobalShortcuts* manager_; const GstEngine* gst_engine_; SongInfoView* song_info_view_; BackgroundStreams* streams_; GlobalSearch* global_search_; Appearance* appearance_; Ui_SettingsDialog* ui_; bool loading_settings_; QMap pages_; }; #endif // SETTINGSDIALOG_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/settingsdialog.ui000066400000000000000000000070751260417502300241630ustar00rootroot00000000000000 SettingsDialog 0 0 827 768 Preferences :/icon.png:/icon.png 220 16777215 Qt::ScrollBarAlwaysOff 32 32 false false false false 1 Qt::Horizontal -1 Qt::Horizontal QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok list buttonBox buttonBox accepted() SettingsDialog accept() 816 757 521 545 buttonBox rejected() SettingsDialog reject() 816 757 322 549 buttonBox clicked(QAbstractButton*) SettingsDialog DialogButtonClicked(QAbstractButton*) 20 20 20 20 clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/settingspage.cpp000066400000000000000000000015601260417502300237760ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "settingsdialog.h" #include "settingspage.h" SettingsPage::SettingsPage(SettingsDialog* dialog) : QWidget(dialog), dialog_(dialog) {} clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/settingspage.h000066400000000000000000000030071260417502300234410ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SETTINGSPAGE_H #define SETTINGSPAGE_H #include #include "widgets/osd.h" class SettingsDialog; class SettingsPage : public QWidget { Q_OBJECT public: SettingsPage(SettingsDialog* dialog); // Return false to grey out the page's item in the list. virtual bool IsEnabled() const { return true; } // Load is called when the dialog is shown, Save when the user clicks OK, and // Cancel when the user clicks on Cancel virtual void Load() = 0; virtual void Save() = 0; virtual void Cancel() {} // The dialog that this page belongs to. SettingsDialog* dialog() const { return dialog_; } signals: void NotificationPreview(OSD::Behaviour, QString, QString); void SetWiimotedevInterfaceActived(bool); private: SettingsDialog* dialog_; }; #endif // SETTINGSPAGE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/standarditemiconloader.cpp000066400000000000000000000063061260417502300260230ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "standarditemiconloader.h" #include "covers/albumcoverloader.h" #include #include #include StandardItemIconLoader::StandardItemIconLoader(AlbumCoverLoader* cover_loader, QObject* parent) : QObject(parent), cover_loader_(cover_loader), model_(nullptr) { cover_options_.desired_height_ = 16; connect(cover_loader_, SIGNAL(ImageLoaded(quint64, QImage)), SLOT(ImageLoaded(quint64, QImage))); } void StandardItemIconLoader::SetModel(QAbstractItemModel* model) { if (model_) { disconnect(model_, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), this, SLOT(RowsAboutToBeRemoved(QModelIndex, int, int))); } model_ = model; connect(model_, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), SLOT(RowsAboutToBeRemoved(QModelIndex, int, int))); connect(model_, SIGNAL(modelAboutToBeReset()), SLOT(ModelReset())); } void StandardItemIconLoader::LoadIcon(const QString& art_automatic, const QString& art_manual, QStandardItem* for_item) { const quint64 id = cover_loader_->LoadImageAsync(cover_options_, art_automatic, art_manual); pending_covers_[id] = for_item; } void StandardItemIconLoader::LoadIcon(const Song& song, QStandardItem* for_item) { const quint64 id = cover_loader_->LoadImageAsync(cover_options_, song); pending_covers_[id] = for_item; } void StandardItemIconLoader::RowsAboutToBeRemoved(const QModelIndex& parent, int begin, int end) { for (QMap::iterator it = pending_covers_.begin(); it != pending_covers_.end();) { const QStandardItem* item = it.value(); const QStandardItem* item_parent = item->parent(); if (item_parent && item_parent->index() == parent && item->index().row() >= begin && item->index().row() <= end) { cover_loader_->CancelTask(it.key()); it = pending_covers_.erase(it); } else { ++it; } } } void StandardItemIconLoader::ModelReset() { cover_loader_->CancelTasks(QSet::fromList(pending_covers_.keys())); pending_covers_.clear(); } void StandardItemIconLoader::ImageLoaded(quint64 id, const QImage& image) { QStandardItem* item = pending_covers_.take(id); if (!item) return; if (!image.isNull()) { item->setIcon(QIcon(QPixmap::fromImage(image))); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/standarditemiconloader.h000066400000000000000000000035431260417502300254700ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef STANDARDITEMICONLOADER_H #define STANDARDITEMICONLOADER_H #include "covers/albumcoverloaderoptions.h" #include #include class AlbumCoverLoader; class Song; class QAbstractItemModel; class QModelIndex; class QStandardItem; // Uses an AlbumCoverLoader to asynchronously load and set an icon on a // QStandardItem. class StandardItemIconLoader : public QObject { Q_OBJECT public: StandardItemIconLoader(AlbumCoverLoader* cover_loader, QObject* parent = nullptr); AlbumCoverLoaderOptions* options() { return &cover_options_; } void SetModel(QAbstractItemModel* model); void LoadIcon(const QString& art_automatic, const QString& art_manual, QStandardItem* for_item); void LoadIcon(const Song& song, QStandardItem* for_item); private slots: void ImageLoaded(quint64 id, const QImage& image); void RowsAboutToBeRemoved(const QModelIndex& parent, int begin, int end); void ModelReset(); private: AlbumCoverLoader* cover_loader_; AlbumCoverLoaderOptions cover_options_; QAbstractItemModel* model_; QMap pending_covers_; }; #endif // STANDARDITEMICONLOADER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/systemtrayicon.cpp000066400000000000000000000055751260417502300244100ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "macsystemtrayicon.h" #include "qtsystemtrayicon.h" #include "systemtrayicon.h" #include #include #include #include #include #include #include SystemTrayIcon::SystemTrayIcon(QObject* parent) : QObject(parent), percentage_(0), playing_icon_(":/tiny-start.png"), paused_icon_(":/tiny-pause.png") {} QPixmap SystemTrayIcon::CreateIcon(const QPixmap& icon, const QPixmap& grey_icon) { QRect rect(icon.rect()); // The angle of the line that's used to cover the icon. // Centered on rect.topRight() double angle = double(100 - song_progress()) / 100.0 * M_PI_2 + M_PI; double length = sqrt(pow(rect.width(), 2.0) + pow(rect.height(), 2.0)); QPolygon mask; mask << rect.topRight(); mask << rect.topRight() + QPoint(length * sin(angle), -length * cos(angle)); if (song_progress() > 50) mask << rect.bottomLeft(); mask << rect.topLeft(); mask << rect.topRight(); QPixmap ret(icon); QPainter p(&ret); // Draw the grey bit over the orange icon p.setClipRegion(mask); p.drawPixmap(0, 0, grey_icon); p.setClipping(false); // Draw the playing or paused icon in the top-right if (!current_state_icon().isNull()) { int height = rect.height() / 2; QPixmap scaled( current_state_icon().scaledToHeight(height, Qt::SmoothTransformation)); QRect state_rect(rect.width() - scaled.width(), 0, scaled.width(), scaled.height()); p.drawPixmap(state_rect, scaled); } p.end(); return ret; } void SystemTrayIcon::SetProgress(int percentage) { percentage_ = percentage; UpdateIcon(); } void SystemTrayIcon::SetPaused() { current_state_icon_ = paused_icon_; UpdateIcon(); } void SystemTrayIcon::SetPlaying(bool enable_play_pause, bool enable_love) { current_state_icon_ = playing_icon_; UpdateIcon(); } void SystemTrayIcon::SetStopped() { current_state_icon_ = QPixmap(); UpdateIcon(); } SystemTrayIcon* SystemTrayIcon::CreateSystemTrayIcon(QObject* parent) { #ifdef Q_OS_DARWIN return new MacSystemTrayIcon(parent); #else return new QtSystemTrayIcon(parent); #endif } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/systemtrayicon.h000066400000000000000000000052411260417502300240430ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SYSTEMTRAYICON_H #define SYSTEMTRAYICON_H #include #include class QAction; class Song; class SystemTrayIcon : public QObject { Q_OBJECT public: SystemTrayIcon(QObject* parent = nullptr); // Called once to create the icon's context menu virtual void SetupMenu(QAction* previous, QAction* play, QAction* stop, QAction* stop_after, QAction* next, QAction* mute, QAction* love, QAction* quit) = 0; virtual bool IsVisible() const { return true; } virtual void SetVisible(bool visible) {} // Called by the OSD virtual void ShowPopup(const QString& summary, const QString& message, int timeout) {} /** * If this get's invoked with image_path equal to nullptr, the tooltip should * still be shown - just without the cover art. */ virtual void SetNowPlaying(const Song& song, const QString& image_path) {} virtual void ClearNowPlaying() {} static SystemTrayIcon* CreateSystemTrayIcon(QObject* parent = nullptr); public slots: void SetProgress(int percentage); virtual void SetPaused(); virtual void SetPlaying(bool enable_play_pause = false, bool enable_love = false); virtual void SetStopped(); virtual void LastFMButtonVisibilityChanged(bool value) {} virtual void LastFMButtonLoveStateChanged(bool value) {} virtual void MuteButtonStateChanged(bool value) {} signals: void ChangeVolume(int delta); void SeekForward(); void SeekBackward(); void NextTrack(); void PreviousTrack(); void ShowHide(); void PlayPause(); protected: virtual void UpdateIcon() = 0; QPixmap CreateIcon(const QPixmap& icon, const QPixmap& grey_icon); int song_progress() const { return percentage_; } QPixmap current_state_icon() const { return current_state_icon_; } private: int percentage_; QPixmap playing_icon_; QPixmap paused_icon_; QPixmap current_state_icon_; }; #endif // SYSTEMTRAYICON_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/trackselectiondialog.cpp000066400000000000000000000225631260417502300255010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "iconloader.h" #include "trackselectiondialog.h" #include "ui_trackselectiondialog.h" #include "core/tagreaderclient.h" #include #include #include #include #include #include #include #include TrackSelectionDialog::TrackSelectionDialog(QWidget* parent) : QDialog(parent), ui_(new Ui_TrackSelectionDialog), save_on_close_(false) { // Setup dialog window ui_->setupUi(this); connect(ui_->song_list, SIGNAL(currentRowChanged(int)), SLOT(UpdateStack())); connect(ui_->results, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), SLOT(ResultSelected())); ui_->splitter->setSizes(QList() << 200 << width() - 200); SetLoading(QString()); // Add the next/previous buttons previous_button_ = new QPushButton(IconLoader::Load("go-previous"), tr("Previous"), this); next_button_ = new QPushButton(IconLoader::Load("go-next"), tr("Next"), this); ui_->button_box->addButton(previous_button_, QDialogButtonBox::ResetRole); ui_->button_box->addButton(next_button_, QDialogButtonBox::ResetRole); connect(previous_button_, SIGNAL(clicked()), SLOT(PreviousSong())); connect(next_button_, SIGNAL(clicked()), SLOT(NextSong())); // Set some shortcuts for the buttons new QShortcut(QKeySequence::Back, previous_button_, SLOT(click())); new QShortcut(QKeySequence::Forward, next_button_, SLOT(click())); new QShortcut(QKeySequence::MoveToPreviousPage, previous_button_, SLOT(click())); new QShortcut(QKeySequence::MoveToNextPage, next_button_, SLOT(click())); // Resize columns ui_->results->setColumnWidth(0, 50); // Track column ui_->results->setColumnWidth(1, 50); // Year column ui_->results->setColumnWidth(2, 160); // Title column ui_->results->setColumnWidth(3, 160); // Artist column ui_->results->setColumnWidth(4, 160); // Album column } TrackSelectionDialog::~TrackSelectionDialog() { delete ui_; } void TrackSelectionDialog::Init(const SongList& songs) { ui_->song_list->clear(); ui_->stack->setCurrentWidget(ui_->loading_page); data_.clear(); for (const Song& song : songs) { Data data; data.original_song_ = song; data_ << data; QListWidgetItem* item = new QListWidgetItem(ui_->song_list); item->setText(QFileInfo(song.url().toLocalFile()).fileName()); item->setForeground(palette().color(QPalette::Disabled, QPalette::Text)); } const bool multiple = songs.count() > 1; ui_->song_list->setVisible(multiple); next_button_->setEnabled(multiple); previous_button_->setEnabled(multiple); ui_->song_list->setCurrentRow(0); } void TrackSelectionDialog::FetchTagProgress(const Song& original_song, const QString& progress) { // Find the item with this filename int row = -1; for (int i = 0; i < data_.count(); ++i) { if (data_[i].original_song_.url() == original_song.url()) { row = i; break; } } if (row == -1) return; data_[row].progress_string_ = progress; // If it's the current item, update the display if (ui_->song_list->currentIndex().row() == row) { UpdateStack(); } } void TrackSelectionDialog::FetchTagFinished(const Song& original_song, const SongList& songs_guessed) { // Find the item with this filename int row = -1; for (int i = 0; i < data_.count(); ++i) { if (data_[i].original_song_.url() == original_song.url()) { row = i; break; } } if (row == -1) return; // Set the color back to black ui_->song_list->item(row)->setForeground(palette().text()); // Add the results to the list data_[row].pending_ = false; data_[row].results_ = songs_guessed; // If it's the current item, update the display if (ui_->song_list->currentIndex().row() == row) { UpdateStack(); } } void TrackSelectionDialog::UpdateStack() { const int row = ui_->song_list->currentRow(); if (row < 0 || row >= data_.count()) return; const Data& data = data_[row]; if (data.pending_) { ui_->stack->setCurrentWidget(ui_->loading_page); ui_->progress->set_text(data.progress_string_ + "..."); return; } else if (data.results_.isEmpty()) { ui_->stack->setCurrentWidget(ui_->error_page); return; } ui_->stack->setCurrentWidget(ui_->results_page); // Clear tree widget ui_->results->clear(); // Put the original tags at the top AddDivider(tr("Original tags"), ui_->results); AddSong(data.original_song_, -1, ui_->results); // Fill tree view with songs AddDivider(tr("Suggested tags"), ui_->results); int song_index = 0; for (const Song& song : data.results_) { AddSong(song, song_index++, ui_->results); } // Find the item that was selected last time for (int i = 0; i < ui_->results->model()->rowCount(); ++i) { const QModelIndex index = ui_->results->model()->index(i, 0); const QVariant id = index.data(Qt::UserRole); if (!id.isNull() && id.toInt() == data.selected_result_) { ui_->results->setCurrentIndex(index); break; } } } void TrackSelectionDialog::AddDivider(const QString& text, QTreeWidget* parent) const { QTreeWidgetItem* item = new QTreeWidgetItem(parent); item->setFirstColumnSpanned(true); item->setText(0, text); item->setFlags(Qt::NoItemFlags); item->setForeground(0, palette().color(QPalette::Disabled, QPalette::Text)); QFont bold_font(font()); bold_font.setBold(true); item->setFont(0, bold_font); } void TrackSelectionDialog::AddSong(const Song& song, int result_index, QTreeWidget* parent) const { QStringList values; values << ((song.track() > 0) ? QString::number(song.track()) : QString()) << ((song.year() > 0) ? QString::number(song.year()) : QString()) << song.title() << song.artist() << song.album(); QTreeWidgetItem* item = new QTreeWidgetItem(parent, values); item->setData(0, Qt::UserRole, result_index); item->setData(0, Qt::TextAlignmentRole, Qt::AlignRight); } void TrackSelectionDialog::ResultSelected() { if (!ui_->results->currentItem()) return; const int song_row = ui_->song_list->currentRow(); if (song_row == -1) return; const int result_index = ui_->results->currentItem()->data(0, Qt::UserRole).toInt(); data_[song_row].selected_result_ = result_index; } void TrackSelectionDialog::SetLoading(const QString& message) { const bool loading = !message.isEmpty(); ui_->button_box->setEnabled(!loading); ui_->splitter->setEnabled(!loading); ui_->loading_label->setVisible(loading); ui_->loading_label->set_text(message); } void TrackSelectionDialog::SaveData(const QList& data) { for (int i = 0; i < data.count(); ++i) { const Data& ref = data[i]; if (ref.pending_ || ref.results_.isEmpty() || ref.selected_result_ == -1) continue; const Song& new_metadata = ref.results_[ref.selected_result_]; Song copy(ref.original_song_); copy.set_title(new_metadata.title()); copy.set_artist(new_metadata.artist()); copy.set_album(new_metadata.album()); copy.set_track(new_metadata.track()); copy.set_year(new_metadata.year()); if (!TagReaderClient::Instance()->SaveFileBlocking(copy.url().toLocalFile(), copy)) { qLog(Warning) << "Failed to write new auto-tags to" << copy.url().toLocalFile(); } } } void TrackSelectionDialog::accept() { if (save_on_close_) { SetLoading(tr("Saving tracks") + "..."); // Save tags in the background QFuture future = QtConcurrent::run(&TrackSelectionDialog::SaveData, data_); QFutureWatcher* watcher = new QFutureWatcher(this); watcher->setFuture(future); connect(watcher, SIGNAL(finished()), SLOT(AcceptFinished())); return; } QDialog::accept(); for (const Data& data : data_) { if (data.pending_ || data.results_.isEmpty() || data.selected_result_ == -1) continue; const Song& new_metadata = data.results_[data.selected_result_]; emit SongChosen(data.original_song_, new_metadata); } } void TrackSelectionDialog::AcceptFinished() { QFutureWatcher* watcher = dynamic_cast*>(sender()); if (!watcher) return; watcher->deleteLater(); SetLoading(QString()); QDialog::accept(); } void TrackSelectionDialog::NextSong() { int row = (ui_->song_list->currentRow() + 1) % ui_->song_list->count(); ui_->song_list->setCurrentRow(row); } void TrackSelectionDialog::PreviousSong() { int row = (ui_->song_list->currentRow() - 1 + ui_->song_list->count()) % ui_->song_list->count(); ui_->song_list->setCurrentRow(row); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/trackselectiondialog.h000066400000000000000000000043231260417502300251400ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef TRACKSELECTIONDIALOG_H #define TRACKSELECTIONDIALOG_H #include #include "config.h" #include "core/song.h" class Ui_TrackSelectionDialog; class QTreeWidget; class TrackSelectionDialog : public QDialog { Q_OBJECT public: TrackSelectionDialog(QWidget* parent = nullptr); ~TrackSelectionDialog(); void set_save_on_close(bool save_on_close) { save_on_close_ = save_on_close; } void Init(const SongList& songs); public slots: void FetchTagProgress(const Song& original_song, const QString& progress); void FetchTagFinished(const Song& original_song, const SongList& songs_guessed); // QDialog void accept(); signals: void SongChosen(const Song& original_song, const Song& new_metadata); private slots: void UpdateStack(); void NextSong(); void PreviousSong(); void ResultSelected(); void AcceptFinished(); private: Ui_TrackSelectionDialog* ui_; struct Data { Data() : pending_(true), selected_result_(0) {} Song original_song_; bool pending_; QString progress_string_; SongList results_; int selected_result_; }; void AddDivider(const QString& text, QTreeWidget* parent) const; void AddSong(const Song& song, int result_index, QTreeWidget* parent) const; void SetLoading(const QString& message); static void SaveData(const QList& data); private: QList data_; QPushButton* previous_button_; QPushButton* next_button_; bool save_on_close_; }; #endif // TRACKSELECTIONDIALOG_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/trackselectiondialog.ui000066400000000000000000000201341260417502300253240ustar00rootroot00000000000000 TrackSelectionDialog 0 0 773 375 Tag fetcher :/icon.png:/icon.png 0 0 Qt::Horizontal true 0 Qt::Vertical 20 133 Qt::Horizontal 40 20 Qt::Horizontal 40 20 Qt::Vertical 20 133 Qt::Vertical 20 124 QLabel { font-weight: bold; } Sorry Qt::AlignCenter Clementine was unable to find results for this file Qt::AlignCenter true Qt::Vertical 20 124 0 QLabel { font-weight: bold; } Select best possible match QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed false 150 50 Track Year Title Artist Album 0 0 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok BusyIndicator QWidget
widgets/busyindicator.h
button_box accepted() TrackSelectionDialog accept() 248 254 157 274 button_box rejected() TrackSelectionDialog reject() 316 260 286 274
clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/windows7thumbbar.cpp000066400000000000000000000126411260417502300246110ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "windows7thumbbar.h" #include "core/logging.h" #include #include #ifdef Q_OS_WIN32 #define _WIN32_WINNT 0x0600 #include #include #include #endif // Q_OS_WIN32 const int Windows7ThumbBar::kIconSize = 16; const int Windows7ThumbBar::kMaxButtonCount = 7; Windows7ThumbBar::Windows7ThumbBar(QWidget* widget) : QObject(widget), widget_(widget), button_created_message_id_(0), taskbar_list_(nullptr) {} void Windows7ThumbBar::SetActions(const QList& actions) { #ifdef Q_OS_WIN32 qLog(Debug) << "Setting actions"; Q_ASSERT(actions.count() <= kMaxButtonCount); actions_ = actions; for (QAction* action : actions) { if (action) { connect(action, SIGNAL(changed()), SLOT(ActionChanged())); } } qLog(Debug) << "Done"; #endif // Q_OS_WIN32 } #ifdef Q_OS_WIN32 static void SetupButton(const QAction* action, THUMBBUTTON* button) { if (action) { button->hIcon = action->icon().pixmap(Windows7ThumbBar::kIconSize).toWinHICON(); button->dwFlags = action->isEnabled() ? THBF_ENABLED : THBF_DISABLED; // This is unsafe - doesn't obey 260-char restriction action->text().toWCharArray(button->szTip); button->szTip[action->text().count()] = L'\0'; if (!action->isVisible()) { button->dwFlags = THUMBBUTTONFLAGS(button->dwFlags | THBF_HIDDEN); } button->dwMask = THUMBBUTTONMASK(THB_ICON | THB_TOOLTIP | THB_FLAGS); } else { button->hIcon = 0; button->szTip[0] = L'\0'; button->dwFlags = THBF_NOBACKGROUND; button->dwMask = THUMBBUTTONMASK(THB_FLAGS); } } #endif // Q_OS_WIN32 void Windows7ThumbBar::HandleWinEvent(MSG* msg) { #ifdef Q_OS_WIN32 if (button_created_message_id_ == 0) { // Compute the value for the TaskbarButtonCreated message button_created_message_id_ = RegisterWindowMessage("TaskbarButtonCreated"); qLog(Debug) << "TaskbarButtonCreated message ID registered" << button_created_message_id_; } if (msg->message == button_created_message_id_) { HRESULT hr; qLog(Debug) << "Button created"; // Unref the old taskbar list if we had one if (taskbar_list_) { qLog(Debug) << "Releasing old taskbar list"; reinterpret_cast(taskbar_list_)->Release(); taskbar_list_ = nullptr; } // Copied from win7 SDK shobjidl.h static const GUID CLSID_ITaskbarList = { 0x56FDF344, 0xFD6D, 0x11d0, {0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90}}; // Create the taskbar list hr = CoCreateInstance(CLSID_ITaskbarList, nullptr, CLSCTX_ALL, IID_ITaskbarList3, (void**)&taskbar_list_); if (hr != S_OK) { qLog(Warning) << "Error creating the ITaskbarList3 interface" << hex << DWORD(hr); return; } ITaskbarList3* taskbar_list = reinterpret_cast(taskbar_list_); hr = taskbar_list->HrInit(); if (hr != S_OK) { qLog(Warning) << "Error initialising taskbar list" << hex << DWORD(hr); taskbar_list->Release(); taskbar_list_ = nullptr; return; } // Add the buttons qLog(Debug) << "Initialising" << actions_.count() << "buttons"; THUMBBUTTON buttons[kMaxButtonCount]; for (int i = 0; i < actions_.count(); ++i) { const QAction* action = actions_[i]; THUMBBUTTON* button = &buttons[i]; button->iId = i; SetupButton(action, button); } qLog(Debug) << "Adding buttons"; hr = taskbar_list->ThumbBarAddButtons(widget_->winId(), actions_.count(), buttons); if (hr != S_OK) qLog(Debug) << "Failed to add buttons" << hex << DWORD(hr); for (int i = 0; i < actions_.count(); i++) { if (buttons[i].hIcon > 0) DestroyIcon(buttons[i].hIcon); } } else if (msg->message == WM_COMMAND) { const int button_id = LOWORD(msg->wParam); if (button_id >= 0 && button_id < actions_.count()) { if (actions_[button_id]) { qLog(Debug) << "Button activated"; actions_[button_id]->activate(QAction::Trigger); } } } #endif // Q_OS_WIN32 } void Windows7ThumbBar::ActionChanged() { #ifdef Q_OS_WIN32 if (!taskbar_list_) return; ITaskbarList3* taskbar_list = reinterpret_cast(taskbar_list_); THUMBBUTTON buttons[kMaxButtonCount]; for (int i = 0; i < actions_.count(); ++i) { const QAction* action = actions_[i]; THUMBBUTTON* button = &buttons[i]; button->iId = i; SetupButton(action, button); if (buttons->hIcon > 0) DestroyIcon(buttons->hIcon); } taskbar_list->ThumbBarUpdateButtons(widget_->winId(), actions_.count(), buttons); #endif // Q_OS_WIN32 } clementine-1.2.3+git1354-gdaddbde+dfsg/src/ui/windows7thumbbar.h000066400000000000000000000033501260417502300242530ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef WINDOWS7THUMBBAR_H #define WINDOWS7THUMBBAR_H #include #include #ifndef Q_OS_WIN32 typedef void MSG; #endif // Q_OS_WIN32 class Windows7ThumbBar : public QObject { Q_OBJECT public: // Creates a list of buttons in the taskbar icon for this window. Does // nothing and is safe to use on other operating systems too. Windows7ThumbBar(QWidget* widget = 0); static const int kIconSize; static const int kMaxButtonCount; // You must call this in the parent widget's constructor before returning // to the event loop. If an action is nullptr it becomes a spacer. void SetActions(const QList& actions); // Call this from the parent's winEvent() function. void HandleWinEvent(MSG* msg); private slots: void ActionChanged(); private: QWidget* widget_; QList actions_; unsigned int button_created_message_id_; // Really an ITaskbarList3* but I don't want to have to include windows.h here void* taskbar_list_; }; #endif // WINDOWS7THUMBBAR_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/version.h.in000066400000000000000000000015561260417502300224300ustar00rootroot00000000000000/* This file is part of Clementine. Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef VERSION_H_IN #define VERSION_H_IN #define CLEMENTINE_VERSION_DISPLAY "${CLEMENTINE_VERSION_DISPLAY}" #define CLEMENTINE_VERSION_SPARKLE "${CLEMENTINE_VERSION_SPARKLE}" #endif // VERSION_H_IN clementine-1.2.3+git1354-gdaddbde+dfsg/src/visualisations/000077500000000000000000000000001260417502300232335ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/visualisations/projectmpresetmodel.cpp000066400000000000000000000076661260417502300300450ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "config.h" #include "projectmpresetmodel.h" #include "projectmvisualisation.h" #ifdef USE_SYSTEM_PROJECTM #include #else #include "projectM.hpp" #endif #include #include ProjectMPresetModel::ProjectMPresetModel(ProjectMVisualisation* vis, QObject* parent) : QAbstractItemModel(parent), vis_(vis) { // Find presets QDir preset_dir(vis_->preset_url()); QStringList presets( preset_dir.entryList(QStringList() << "*.milk" << "*.prjm", QDir::Files | QDir::NoDotAndDotDot | QDir::Readable, QDir::Name | QDir::IgnoreCase)); for (const QString& filename : presets) { all_presets_ << Preset(preset_dir.absoluteFilePath(filename), filename, false); } } int ProjectMPresetModel::rowCount(const QModelIndex&) const { if (!vis_) return 0; return all_presets_.count(); } int ProjectMPresetModel::columnCount(const QModelIndex&) const { return 1; } QModelIndex ProjectMPresetModel::index(int row, int column, const QModelIndex&) const { return createIndex(row, column); } QModelIndex ProjectMPresetModel::parent(const QModelIndex& child) const { return QModelIndex(); } QVariant ProjectMPresetModel::data(const QModelIndex& index, int role) const { switch (role) { case Qt::DisplayRole: return all_presets_[index.row()].name_; case Qt::CheckStateRole: { bool selected = all_presets_[index.row()].selected_; return selected ? Qt::Checked : Qt::Unchecked; } case Role_Url: return all_presets_[index.row()].path_; default: return QVariant(); } } Qt::ItemFlags ProjectMPresetModel::flags(const QModelIndex& index) const { if (!index.isValid()) return QAbstractItemModel::flags(index); return Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled; } bool ProjectMPresetModel::setData(const QModelIndex& index, const QVariant& value, int role) { if (role == Qt::CheckStateRole) { all_presets_[index.row()].selected_ = value.toBool(); vis_->SetSelected(QStringList() << all_presets_[index.row()].path_, value.toBool()); return true; } return false; } void ProjectMPresetModel::SetImmediatePreset(const QModelIndex& index) { vis_->SetImmediatePreset(all_presets_[index.row()].path_); } void ProjectMPresetModel::SelectAll() { QStringList paths; for (int i = 0; i < all_presets_.count(); ++i) { paths << all_presets_[i].path_; all_presets_[i].selected_ = true; } vis_->SetSelected(paths, true); emit dataChanged(index(0, 0), index(rowCount() - 1, 0)); } void ProjectMPresetModel::SelectNone() { vis_->ClearSelected(); for (int i = 0; i < all_presets_.count(); ++i) { all_presets_[i].selected_ = false; } emit dataChanged(index(0, 0), index(rowCount() - 1, 0)); } void ProjectMPresetModel::MarkSelected(const QString& path, bool selected) { for (int i = 0; i < all_presets_.count(); ++i) { if (path == all_presets_[i].path_) { all_presets_[i].selected_ = selected; return; } } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/visualisations/projectmpresetmodel.h000066400000000000000000000041251260417502300274750ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PROJECTMPRESETMODEL_H #define PROJECTMPRESETMODEL_H #include class ProjectMVisualisation; class ProjectMPresetModel : public QAbstractItemModel { Q_OBJECT friend class ProjectMVisualisation; public: ProjectMPresetModel(ProjectMVisualisation* vis, QObject* parent = nullptr); enum { Role_Url = Qt::UserRole, }; void MarkSelected(const QString& path, bool selected); // QAbstractItemModel QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const; QModelIndex parent(const QModelIndex& child) const; int rowCount(const QModelIndex& parent = QModelIndex()) const; int columnCount(const QModelIndex& parent = QModelIndex()) const; QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; Qt::ItemFlags flags(const QModelIndex& index) const; bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole); public slots: void SetImmediatePreset(const QModelIndex& index); void SelectAll(); void SelectNone(); private: struct Preset { Preset(const QString& path, const QString& name, bool selected) : path_(path), name_(name), selected_(selected) {} QString path_; QString name_; bool selected_; }; ProjectMVisualisation* vis_; QList all_presets_; }; #endif // PROJECTMPRESETMODEL_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/visualisations/projectmvisualisation.cpp000066400000000000000000000176031260417502300304040ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "config.h" #include "projectmpresetmodel.h" #include "projectmvisualisation.h" #include "visualisationcontainer.h" #include #include #include #include #include #include #include #include #include #include #include #include #ifdef USE_SYSTEM_PROJECTM #include #else #include "projectM.hpp" #endif #ifdef Q_OS_MAC #include "core/mac_startup.h" #include #else #include #endif ProjectMVisualisation::ProjectMVisualisation(QObject* parent) : QGraphicsScene(parent), preset_model_(nullptr), mode_(Random), duration_(15), texture_size_(512) { connect(this, SIGNAL(sceneRectChanged(QRectF)), SLOT(SceneRectChanged(QRectF))); for (int i = 0; i < TOTAL_RATING_TYPES; ++i) default_rating_list_.push_back(3); } ProjectMVisualisation::~ProjectMVisualisation() {} void ProjectMVisualisation::InitProjectM() { // Find the projectM presets QStringList paths = QStringList() #ifdef USE_INSTALL_PREFIX << CMAKE_INSTALL_PREFIX "/share/clementine/projectm-presets" << CMAKE_INSTALL_PREFIX "/share/projectM/presets" #endif << "/usr/share/clementine/projectm-presets" << "/usr/local/share/clementine/projectm-presets" << "/usr/share/projectM/presets" << "/usr/local/share/projectM/presets"; #if defined(Q_OS_WIN32) paths.prepend(QCoreApplication::applicationDirPath() + "/projectm-presets"); #elif defined(Q_OS_MAC) paths.prepend(mac::GetResourcesPath() + "/projectm-presets"); #endif QString preset_path; for (const QString& path : paths) { if (!QFile::exists(path)) continue; // Don't use empty directories if (QDir(path).entryList(QDir::Files | QDir::NoDotAndDotDot).isEmpty()) continue; preset_path = path; break; } // Write an empty font out to a temporary directory. libprojectM dies if it's // compiled with FTGL support and you pass it an empty font URL, so we have // to give it a dummy font even though we won't use it. temporary_font_.reset(QTemporaryFile::createLocalFile(":blank.ttf")); const QString font_path = temporary_font_->fileName(); // Create projectM settings projectM::Settings s; s.meshX = 32; s.meshY = 24; s.textureSize = texture_size_; s.fps = 35; s.windowWidth = 512; s.windowHeight = 512; s.smoothPresetDuration = 5; s.presetDuration = duration_; s.presetURL = preset_path.toStdString(); s.shuffleEnabled = true; s.easterEgg = 0; // ?? s.softCutRatingsEnabled = false; s.menuFontURL = font_path.toStdString(); s.titleFontURL = font_path.toStdString(); projectm_.reset(new projectM(s)); preset_model_ = new ProjectMPresetModel(this, this); Load(); // Start at a random preset. if (projectm_->getPlaylistSize() > 0) { projectm_->selectPreset(qrand() % projectm_->getPlaylistSize(), true); } if (font_path.isNull()) { qWarning("ProjectM presets could not be found, search path was:\n %s", paths.join("\n ").toLocal8Bit().constData()); QMessageBox::warning( nullptr, tr("Missing projectM presets"), tr("Clementine could not load any projectM visualisations. Check that " "you have installed Clementine properly.")); } } void ProjectMVisualisation::drawBackground(QPainter* p, const QRectF&) { p->beginNativePainting(); if (!projectm_) { InitProjectM(); } projectm_->projectM_resetGL(sceneRect().width(), sceneRect().height()); projectm_->renderFrame(); p->endNativePainting(); } void ProjectMVisualisation::SceneRectChanged(const QRectF& rect) { if (projectm_) projectm_->projectM_resetGL(rect.width(), rect.height()); } void ProjectMVisualisation::SetTextureSize(int size) { texture_size_ = size; if (projectm_) projectm_->changeTextureSize(texture_size_); } void ProjectMVisualisation::SetDuration(int seconds) { duration_ = seconds; if (projectm_) projectm_->changePresetDuration(duration_); Save(); } void ProjectMVisualisation::ConsumeBuffer(GstBuffer* buffer, int) { GstMapInfo map; gst_buffer_map(buffer, &map, GST_MAP_READ); const int samples_per_channel = map.size / sizeof(short) / 2; const short* data = reinterpret_cast(map.data); if (projectm_) { projectm_->pcm()->addPCM16Data(data, samples_per_channel); } gst_buffer_unmap(buffer, &map); gst_buffer_unref(buffer); } void ProjectMVisualisation::SetSelected(const QStringList& paths, bool selected) { for (const QString& path : paths) { int index = IndexOfPreset(path); if (selected && index == -1) { projectm_->addPresetURL(path.toStdString(), std::string(), default_rating_list_); } else if (!selected && index != -1) { projectm_->removePreset(index); } } Save(); } void ProjectMVisualisation::ClearSelected() { projectm_->clearPlaylist(); Save(); } int ProjectMVisualisation::IndexOfPreset(const QString& path) const { for (uint i = 0; i < projectm_->getPlaylistSize(); ++i) { if (QString::fromStdString(projectm_->getPresetURL(i)) == path) return i; } return -1; } void ProjectMVisualisation::Load() { QSettings s; s.beginGroup(VisualisationContainer::kSettingsGroup); mode_ = Mode(s.value("mode", 0).toInt()); duration_ = s.value("duration", duration_).toInt(); projectm_->changePresetDuration(duration_); projectm_->clearPlaylist(); switch (mode_) { case Random: for (int i = 0; i < preset_model_->all_presets_.count(); ++i) { projectm_->addPresetURL( preset_model_->all_presets_[i].path_.toStdString(), std::string(), default_rating_list_); preset_model_->all_presets_[i].selected_ = true; } break; case FromList: { QStringList paths(s.value("preset_paths").toStringList()); for (const QString& path : paths) { projectm_->addPresetURL(path.toStdString(), std::string(), default_rating_list_); preset_model_->MarkSelected(path, true); } } } } void ProjectMVisualisation::Save() { QStringList paths; for (const ProjectMPresetModel::Preset& preset : preset_model_->all_presets_) { if (preset.selected_) paths << preset.path_; } QSettings s; s.beginGroup(VisualisationContainer::kSettingsGroup); s.setValue("preset_paths", paths); s.setValue("mode", mode_); s.setValue("duration", duration_); } void ProjectMVisualisation::SetMode(Mode mode) { mode_ = mode; Save(); } QString ProjectMVisualisation::preset_url() const { return QString::fromStdString(projectm_->settings().presetURL); } void ProjectMVisualisation::SetImmediatePreset(const QString& path) { int index = IndexOfPreset(path); if (index == -1) { index = projectm_->addPresetURL(path.toStdString(), std::string(), default_rating_list_); } projectm_->selectPreset(index, true); } void ProjectMVisualisation::Lock(bool lock) { projectm_->setPresetLock(lock); if (!lock) Load(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/visualisations/projectmvisualisation.h000066400000000000000000000043401260417502300300430ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PROJECTMVISUALISATION_H #define PROJECTMVISUALISATION_H #include #include #include #include #include "engines/bufferconsumer.h" class projectM; class ProjectMPresetModel; class QTemporaryFile; class ProjectMVisualisation : public QGraphicsScene, public BufferConsumer { Q_OBJECT public: ProjectMVisualisation(QObject* parent = nullptr); ~ProjectMVisualisation(); enum Mode { Random = 0, FromList = 1, }; QString preset_url() const; ProjectMPresetModel* preset_model() const { return preset_model_; } Mode mode() const { return mode_; } int duration() const { return duration_; } // BufferConsumer void ConsumeBuffer(GstBuffer* buffer, int); public slots: void SetTextureSize(int size); void SetDuration(int seconds); void SetSelected(const QStringList& paths, bool selected); void ClearSelected(); void SetImmediatePreset(const QString& path); void SetMode(Mode mode); void Lock(bool lock); protected: // QGraphicsScene void drawBackground(QPainter* painter, const QRectF& rect); private slots: void SceneRectChanged(const QRectF& rect); private: void InitProjectM(); void Load(); void Save(); int IndexOfPreset(const QString& path) const; private: std::unique_ptr projectm_; ProjectMPresetModel* preset_model_; Mode mode_; int duration_; std::unique_ptr temporary_font_; std::vector default_rating_list_; int texture_size_; }; #endif // PROJECTMVISUALISATION_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/visualisations/visualisationcontainer.cpp000066400000000000000000000224671260417502300305470ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "config.h" #include "projectmvisualisation.h" #include "visualisationcontainer.h" #include "visualisationoverlay.h" #include "visualisationselector.h" #include "engines/gstengine.h" #include "ui/iconloader.h" #include "ui/screensaver.h" #include #include #include #include #include #include #include #include #include #include // Framerates const int VisualisationContainer::kLowFramerate = 15; const int VisualisationContainer::kMediumFramerate = 25; const int VisualisationContainer::kHighFramerate = 35; const int VisualisationContainer::kSuperHighFramerate = 60; const char* VisualisationContainer::kSettingsGroup = "Visualisations"; const int VisualisationContainer::kDefaultWidth = 828; const int VisualisationContainer::kDefaultHeight = 512; const int VisualisationContainer::kDefaultFps = kHighFramerate; const int VisualisationContainer::kDefaultTextureSize = 512; VisualisationContainer::VisualisationContainer(QWidget* parent) : QGraphicsView(parent), initialised_(false), engine_(nullptr), vis_(new ProjectMVisualisation(this)), overlay_(new VisualisationOverlay), selector_(new VisualisationSelector(this)), overlay_proxy_(nullptr), menu_(new QMenu(this)), fps_(kDefaultFps), size_(kDefaultTextureSize) { QSettings s; s.beginGroup(kSettingsGroup); if (!restoreGeometry(s.value("geometry").toByteArray())) { resize(kDefaultWidth, kDefaultHeight); } fps_ = s.value("fps", kDefaultFps).toInt(); size_ = s.value("size", kDefaultTextureSize).toInt(); QShortcut* close = new QShortcut(QKeySequence::Close, this); connect(close, SIGNAL(activated()), SLOT(close())); setMinimumSize(64, 64); } void VisualisationContainer::Init() { setWindowTitle(tr("Clementine Visualization")); setWindowIcon(QIcon(":/icon.png")); // Set up the graphics view setScene(vis_); setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers))); setViewportUpdateMode(QGraphicsView::FullViewportUpdate); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setFrameStyle(QFrame::NoFrame); // Add the overlay overlay_proxy_ = scene()->addWidget(overlay_); connect(overlay_, SIGNAL(OpacityChanged(qreal)), SLOT(ChangeOverlayOpacity(qreal))); connect(overlay_, SIGNAL(ShowPopupMenu(QPoint)), SLOT(ShowPopupMenu(QPoint))); ChangeOverlayOpacity(0.0); vis_->SetTextureSize(size_); SizeChanged(); // Selector selector_->SetVisualisation(vis_); // Settings menu menu_->addAction(IconLoader::Load("view-fullscreen"), tr("Toggle fullscreen"), this, SLOT(ToggleFullscreen())); QMenu* fps_menu = menu_->addMenu(tr("Framerate")); QSignalMapper* fps_mapper = new QSignalMapper(this); QActionGroup* fps_group = new QActionGroup(this); AddMenuItem(tr("Low (%1 fps)").arg(kLowFramerate), kLowFramerate, fps_, fps_group, fps_mapper); AddMenuItem(tr("Medium (%1 fps)").arg(kMediumFramerate), kMediumFramerate, fps_, fps_group, fps_mapper); AddMenuItem(tr("High (%1 fps)").arg(kHighFramerate), kHighFramerate, fps_, fps_group, fps_mapper); AddMenuItem(tr("Super high (%1 fps)").arg(kSuperHighFramerate), kSuperHighFramerate, fps_, fps_group, fps_mapper); fps_menu->addActions(fps_group->actions()); connect(fps_mapper, SIGNAL(mapped(int)), SLOT(SetFps(int))); QMenu* quality_menu = menu_->addMenu(tr("Quality", "Visualisation quality")); QSignalMapper* quality_mapper = new QSignalMapper(this); QActionGroup* quality_group = new QActionGroup(this); AddMenuItem(tr("Low (256x256)"), 256, size_, quality_group, quality_mapper); AddMenuItem(tr("Medium (512x512)"), 512, size_, quality_group, quality_mapper); AddMenuItem(tr("High (1024x1024)"), 1024, size_, quality_group, quality_mapper); AddMenuItem(tr("Super high (2048x2048)"), 2048, size_, quality_group, quality_mapper); quality_menu->addActions(quality_group->actions()); connect(quality_mapper, SIGNAL(mapped(int)), SLOT(SetQuality(int))); menu_->addAction(tr("Select visualizations..."), selector_, SLOT(show())); menu_->addSeparator(); menu_->addAction(IconLoader::Load("application-exit"), tr("Close visualization"), this, SLOT(hide())); } void VisualisationContainer::AddMenuItem(const QString& name, int value, int def, QActionGroup* group, QSignalMapper* mapper) { QAction* action = group->addAction(name); action->setCheckable(true); action->setChecked(value == def); mapper->setMapping(action, value); connect(action, SIGNAL(triggered()), mapper, SLOT(map())); } void VisualisationContainer::SetEngine(GstEngine* engine) { engine_ = engine; if (isVisible()) engine_->AddBufferConsumer(vis_); } void VisualisationContainer::showEvent(QShowEvent* e) { if (!initialised_) { if (!QGLFormat::hasOpenGL()) { hide(); QMessageBox::warning(this, tr("Clementine Visualization"), tr("Your system is missing OpenGL support, " "visualizations are unavailable."), QMessageBox::Close); return; } Init(); initialised_ = true; } QGraphicsView::showEvent(e); update_timer_.start(1000 / fps_, this); if (engine_) engine_->AddBufferConsumer(vis_); } void VisualisationContainer::hideEvent(QHideEvent* e) { QGraphicsView::hideEvent(e); update_timer_.stop(); if (engine_) engine_->RemoveBufferConsumer(vis_); } void VisualisationContainer::resizeEvent(QResizeEvent* e) { QGraphicsView::resizeEvent(e); SizeChanged(); } void VisualisationContainer::SizeChanged() { // Save the geometry QSettings s; s.beginGroup(kSettingsGroup); s.setValue("geometry", saveGeometry()); // Resize the scene if (scene()) scene()->setSceneRect(QRect(QPoint(0, 0), size())); // Resize the overlay if (overlay_) overlay_->resize(size()); } void VisualisationContainer::timerEvent(QTimerEvent* e) { QGraphicsView::timerEvent(e); if (e->timerId() == update_timer_.timerId()) scene()->update(); } void VisualisationContainer::SetActions(QAction* previous, QAction* play_pause, QAction* stop, QAction* next) { overlay_->SetActions(previous, play_pause, stop, next); } void VisualisationContainer::SongMetadataChanged(const Song& metadata) { overlay_->SetSongTitle( QString("%1 - %2").arg(metadata.artist(), metadata.title())); } void VisualisationContainer::Stopped() { overlay_->SetSongTitle(tr("Clementine")); } void VisualisationContainer::ChangeOverlayOpacity(qreal value) { overlay_proxy_->setOpacity(value); // Hide the cursor if the overlay is hidden if (value < 0.5) viewport()->setCursor(Qt::BlankCursor); else viewport()->unsetCursor(); } void VisualisationContainer::enterEvent(QEvent* e) { QGraphicsView::enterEvent(e); overlay_->SetVisible(true); } void VisualisationContainer::leaveEvent(QEvent* e) { QGraphicsView::leaveEvent(e); overlay_->SetVisible(false); } void VisualisationContainer::mouseMoveEvent(QMouseEvent* e) { QGraphicsView::mouseMoveEvent(e); overlay_->SetVisible(true); } void VisualisationContainer::mouseDoubleClickEvent(QMouseEvent* e) { QGraphicsView::mouseDoubleClickEvent(e); ToggleFullscreen(); } void VisualisationContainer::contextMenuEvent(QContextMenuEvent* event) { QGraphicsView::contextMenuEvent(event); ShowPopupMenu(event->pos()); } void VisualisationContainer::keyReleaseEvent(QKeyEvent* event) { if (event->matches(QKeySequence::Close) || event->key() == Qt::Key_Escape) { if (isFullScreen()) ToggleFullscreen(); else hide(); return; } QGraphicsView::keyReleaseEvent(event); } void VisualisationContainer::ToggleFullscreen() { setWindowState(windowState() ^ Qt::WindowFullScreen); Screensaver* screensaver = Screensaver::GetScreensaver(); if (screensaver) isFullScreen() ? screensaver->Inhibit() : screensaver->Uninhibit(); } void VisualisationContainer::SetFps(int fps) { fps_ = fps; // Save settings QSettings s; s.beginGroup(kSettingsGroup); s.setValue("fps", fps_); update_timer_.stop(); update_timer_.start(1000 / fps_, this); } void VisualisationContainer::ShowPopupMenu(const QPoint& pos) { menu_->popup(mapToGlobal(pos)); } void VisualisationContainer::SetQuality(int size) { size_ = size; // Save settings QSettings s; s.beginGroup(kSettingsGroup); s.setValue("size", size_); vis_->SetTextureSize(size_); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/visualisations/visualisationcontainer.h000066400000000000000000000053331260417502300302050ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef VISUALISATIONCONTAINER_H #define VISUALISATIONCONTAINER_H #include #include #include "core/song.h" class GstEngine; class ProjectMVisualisation; class VisualisationOverlay; class VisualisationSelector; class QMenu; class QSignalMapper; class QActionGroup; class VisualisationContainer : public QGraphicsView { Q_OBJECT public: VisualisationContainer(QWidget* parent = nullptr); static const int kLowFramerate; static const int kMediumFramerate; static const int kHighFramerate; static const int kSuperHighFramerate; static const char* kSettingsGroup; static const int kDefaultWidth; static const int kDefaultHeight; static const int kDefaultFps; static const int kDefaultTextureSize; void SetEngine(GstEngine* engine); void SetActions(QAction* previous, QAction* play_pause, QAction* stop, QAction* next); public slots: void SongMetadataChanged(const Song& metadata); void Stopped(); protected: // QWidget void showEvent(QShowEvent* e); void hideEvent(QHideEvent* e); void resizeEvent(QResizeEvent* e); void timerEvent(QTimerEvent* e); void mouseMoveEvent(QMouseEvent* e); void enterEvent(QEvent* e); void leaveEvent(QEvent* e); void mouseDoubleClickEvent(QMouseEvent* e); void contextMenuEvent(QContextMenuEvent* event); void keyReleaseEvent(QKeyEvent* event); private: void Init(); void SizeChanged(); void AddMenuItem(const QString& name, int value, int def, QActionGroup* group, QSignalMapper* mapper); private slots: void ChangeOverlayOpacity(qreal value); void ShowPopupMenu(const QPoint& pos); void ToggleFullscreen(); void SetFps(int fps); void SetQuality(int size); private: bool initialised_; GstEngine* engine_; ProjectMVisualisation* vis_; VisualisationOverlay* overlay_; QBasicTimer update_timer_; VisualisationSelector* selector_; QGraphicsProxyWidget* overlay_proxy_; QMenu* menu_; int fps_; int size_; }; #endif // VISUALISATIONCONTAINER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/visualisations/visualisationoverlay.cpp000066400000000000000000000064531260417502300302430ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "visualisationoverlay.h" #include "ui_visualisationoverlay.h" #include "ui/iconloader.h" #include #include #include #include #include const int VisualisationOverlay::kFadeDuration = 500; const int VisualisationOverlay::kFadeTimeout = 5000; VisualisationOverlay::VisualisationOverlay(QWidget* parent) : QWidget(parent), ui_(new Ui_VisualisationOverlay), fade_timeline_(new QTimeLine(kFadeDuration, this)), visible_(false) { ui_->setupUi(this); setAttribute(Qt::WA_TranslucentBackground); setMouseTracking(true); ui_->settings->setIcon(IconLoader::Load("configure")); connect(ui_->settings, SIGNAL(clicked()), SLOT(ShowSettingsMenu())); connect(fade_timeline_, SIGNAL(valueChanged(qreal)), SIGNAL(OpacityChanged(qreal))); } VisualisationOverlay::~VisualisationOverlay() { delete ui_; } QGraphicsProxyWidget* VisualisationOverlay::title(QGraphicsProxyWidget* proxy) const { return proxy->createProxyForChildWidget(ui_->song_title); } void VisualisationOverlay::SetActions(QAction* previous, QAction* play_pause, QAction* stop, QAction* next) { ui_->previous->setDefaultAction(previous); ui_->play_pause->setDefaultAction(play_pause); ui_->stop->setDefaultAction(stop); ui_->next->setDefaultAction(next); } void VisualisationOverlay::ShowSettingsMenu() { emit ShowPopupMenu( ui_->settings->mapToGlobal(ui_->settings->rect().bottomLeft())); } void VisualisationOverlay::timerEvent(QTimerEvent* e) { QWidget::timerEvent(e); if (e->timerId() == fade_out_timeout_.timerId()) { SetVisible(false); } } void VisualisationOverlay::SetVisible(bool visible) { // If we're showing the overlay, then fade out again in a little while fade_out_timeout_.stop(); if (visible) fade_out_timeout_.start(kFadeTimeout, this); // Don't change to the state we're in already if (visible == visible_) return; visible_ = visible; // If there's already another fader running then start from the same time // that one was already at. int start_time = visible ? 0 : fade_timeline_->duration(); if (fade_timeline_->state() == QTimeLine::Running) start_time = fade_timeline_->currentTime(); fade_timeline_->stop(); fade_timeline_->setDirection(visible ? QTimeLine::Forward : QTimeLine::Backward); fade_timeline_->setCurrentTime(start_time); fade_timeline_->resume(); } void VisualisationOverlay::SetSongTitle(const QString& title) { ui_->song_title->setText(title); SetVisible(true); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/visualisations/visualisationoverlay.h000066400000000000000000000032671260417502300277100ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef VISUALISATIONOVERLAY_H #define VISUALISATIONOVERLAY_H #include #include class Ui_VisualisationOverlay; class QTimeLine; class VisualisationOverlay : public QWidget { Q_OBJECT public: VisualisationOverlay(QWidget* parent = nullptr); ~VisualisationOverlay(); static const int kFadeDuration; static const int kFadeTimeout; QGraphicsProxyWidget* title(QGraphicsProxyWidget* proxy) const; void SetActions(QAction* previous, QAction* play_pause, QAction* stop, QAction* next); void SetSongTitle(const QString& title); public slots: void SetVisible(bool visible); signals: void OpacityChanged(qreal value); void ShowPopupMenu(const QPoint& pos); protected: // QWidget void timerEvent(QTimerEvent*); private slots: void ShowSettingsMenu(); private: Ui_VisualisationOverlay* ui_; QTimeLine* fade_timeline_; QBasicTimer fade_out_timeout_; bool visible_; }; #endif // VISUALISATIONOVERLAY_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/visualisations/visualisationoverlay.ui000066400000000000000000000146751260417502300301030ustar00rootroot00000000000000 VisualisationOverlay 0 0 523 302 Form VisualisationOverlay { background-color: transparent; } #frame { background-color: rgba(96, 59, 25, 70%); border-top-left-radius: 10px; border-top-right-radius: 10px; border-color: rgba(145, 89, 38, 100%); border-width: 4px 4px 0px 4px; border-style: solid; } #song_title { font-weight: bold; font-size: 20px; color: #feae65; } QToolButton { background: transparent; border: none; } 0 Qt::Vertical 20 210 Qt::Horizontal 40 20 QFrame::StyledPanel QFrame::Raised Clementine Qt::AlignCenter Qt::Horizontal QSizePolicy::Preferred 40 20 0 0 0 24 24 24 24 24 24 24 24 Qt::Horizontal QSizePolicy::Fixed 20 13 Visualizations Settings 24 24 Qt::Horizontal QSizePolicy::Preferred 40 20 Qt::Horizontal 40 20 clementine-1.2.3+git1354-gdaddbde+dfsg/src/visualisations/visualisationselector.cpp000066400000000000000000000053011260417502300303710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "config.h" #include "projectmpresetmodel.h" #include "projectmvisualisation.h" #include "visualisationselector.h" #include "ui_visualisationselector.h" #include #ifdef USE_SYSTEM_PROJECTM #include #else #include "projectM.hpp" #endif VisualisationSelector::VisualisationSelector(QWidget* parent) : QDialog(parent), ui_(new Ui_VisualisationSelector), vis_(nullptr) { ui_->setupUi(this); select_all_ = ui_->buttonBox->addButton(tr("Select All"), QDialogButtonBox::ActionRole); select_none_ = ui_->buttonBox->addButton(tr("Select None"), QDialogButtonBox::ActionRole); connect(select_all_, SIGNAL(clicked()), SLOT(SelectAll())); connect(select_none_, SIGNAL(clicked()), SLOT(SelectNone())); select_all_->setEnabled(false); select_none_->setEnabled(false); connect(ui_->mode, SIGNAL(currentIndexChanged(int)), SLOT(ModeChanged(int))); } VisualisationSelector::~VisualisationSelector() { delete ui_; } void VisualisationSelector::showEvent(QShowEvent*) { if (!ui_->list->model()) { ui_->delay->setValue(vis_->duration()); ui_->list->setModel(vis_->preset_model()); connect(ui_->list->selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex)), vis_->preset_model(), SLOT(SetImmediatePreset(QModelIndex))); connect(ui_->delay, SIGNAL(valueChanged(int)), vis_, SLOT(SetDuration(int))); ui_->mode->setCurrentIndex(vis_->mode()); } vis_->Lock(true); } void VisualisationSelector::hideEvent(QHideEvent*) { vis_->Lock(false); } void VisualisationSelector::ModeChanged(int mode) { bool enabled = mode == 1; ui_->list->setEnabled(enabled); select_all_->setEnabled(enabled); select_none_->setEnabled(enabled); vis_->SetMode(ProjectMVisualisation::Mode(mode)); } void VisualisationSelector::SelectAll() { vis_->preset_model()->SelectAll(); } void VisualisationSelector::SelectNone() { vis_->preset_model()->SelectNone(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/visualisations/visualisationselector.h000066400000000000000000000026261260417502300300450ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef VISUALISATIONSELECTOR_H #define VISUALISATIONSELECTOR_H #include class ProjectMVisualisation; class Ui_VisualisationSelector; class VisualisationSelector : public QDialog { Q_OBJECT public: VisualisationSelector(QWidget* parent = nullptr); ~VisualisationSelector(); void SetVisualisation(ProjectMVisualisation* vis) { vis_ = vis; } protected: void showEvent(QShowEvent*); void hideEvent(QHideEvent*); private slots: void ModeChanged(int mode); void SelectAll(); void SelectNone(); private: Ui_VisualisationSelector* ui_; QPushButton* select_all_; QPushButton* select_none_; ProjectMVisualisation* vis_; }; #endif // VISUALISATIONSELECTOR_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/visualisations/visualisationselector.ui000066400000000000000000000066441260417502300302370ustar00rootroot00000000000000 VisualisationSelector 0 0 595 475 Select visualizations :/icon.png:/icon.png Visualization mode Random visualization Choose from the list Delay between visualizations seconds 2 120 15 false true QAbstractItemView::SelectRows true Qt::Horizontal QDialogButtonBox::Ok mode delay list buttonBox buttonBox accepted() VisualisationSelector accept() 248 254 157 274 buttonBox rejected() VisualisationSelector reject() 316 260 286 274 clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/000077500000000000000000000000001260417502300216245ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/autoexpandingtreeview.cpp000066400000000000000000000100661260417502300267540ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "autoexpandingtreeview.h" #include "core/mimedata.h" #include #include const int AutoExpandingTreeView::kRowsToShow = 50; AutoExpandingTreeView::AutoExpandingTreeView(QWidget* parent) : QTreeView(parent), auto_open_(true), expand_on_reset_(true), add_on_double_click_(true), ignore_next_click_(false) { setExpandsOnDoubleClick(false); connect(this, SIGNAL(expanded(QModelIndex)), SLOT(ItemExpanded(QModelIndex))); connect(this, SIGNAL(clicked(QModelIndex)), SLOT(ItemClicked(QModelIndex))); connect(this, SIGNAL(doubleClicked(QModelIndex)), SLOT(ItemDoubleClicked(QModelIndex))); } void AutoExpandingTreeView::reset() { QTreeView::reset(); // Expand nodes in the tree until we have about 50 rows visible in the view if (auto_open_ && expand_on_reset_) { RecursivelyExpand(rootIndex()); } } void AutoExpandingTreeView::RecursivelyExpand(const QModelIndex& index) { int rows = model()->rowCount(index); RecursivelyExpand(index, &rows); } bool AutoExpandingTreeView::RecursivelyExpand(const QModelIndex& index, int* count) { if (!CanRecursivelyExpand(index)) return true; if (model()->canFetchMore(index)) model()->fetchMore(index); int children = model()->rowCount(index); if (*count + children > kRowsToShow) return false; expand(index); *count += children; for (int i = 0; i < children; ++i) { if (!RecursivelyExpand(model()->index(i, 0, index), count)) return false; } return true; } void AutoExpandingTreeView::ItemExpanded(const QModelIndex& index) { if (model()->rowCount(index) == 1 && auto_open_) expand(model()->index(0, 0, index)); } void AutoExpandingTreeView::ItemClicked(const QModelIndex& index) { if (ignore_next_click_) { ignore_next_click_ = false; return; } setExpanded(index, !isExpanded(index)); } void AutoExpandingTreeView::ItemDoubleClicked(const QModelIndex& index) { ignore_next_click_ = true; if (add_on_double_click_) { QMimeData* data = model()->mimeData(QModelIndexList() << index); if (MimeData* mime_data = qobject_cast(data)) { mime_data->from_doubleclick_ = true; } emit AddToPlaylistSignal(data); } } void AutoExpandingTreeView::mousePressEvent(QMouseEvent* event) { if (event->modifiers() != Qt::NoModifier) { ignore_next_click_ = true; } QTreeView::mousePressEvent(event); // enqueue to playlist with middleClick if (event->button() == Qt::MidButton) { QMimeData* data = model()->mimeData(selectedIndexes()); if (MimeData* mime_data = qobject_cast(data)) { mime_data->enqueue_now_ = true; } emit AddToPlaylistSignal(data); } } void AutoExpandingTreeView::keyPressEvent(QKeyEvent* e) { switch (e->key()) { case Qt::Key_Enter: case Qt::Key_Return: if (currentIndex().isValid()) emit doubleClicked(currentIndex()); e->accept(); break; case Qt::Key_Backspace: case Qt::Key_Escape: emit FocusOnFilterSignal(e); e->accept(); break; } QTreeView::keyPressEvent(e); } void AutoExpandingTreeView::UpAndFocus() { setCurrentIndex(moveCursor(QAbstractItemView::MoveUp, Qt::NoModifier)); setFocus(); } void AutoExpandingTreeView::DownAndFocus() { setCurrentIndex(moveCursor(QAbstractItemView::MoveDown, Qt::NoModifier)); setFocus(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/autoexpandingtreeview.h000066400000000000000000000037041260417502300264220ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef AUTOEXPANDINGTREEVIEW_H #define AUTOEXPANDINGTREEVIEW_H #include class AutoExpandingTreeView : public QTreeView { Q_OBJECT public: AutoExpandingTreeView(QWidget* parent = nullptr); static const int kRowsToShow; void SetAutoOpen(bool v) { auto_open_ = v; } void SetExpandOnReset(bool v) { expand_on_reset_ = v; } void SetAddOnDoubleClick(bool v) { add_on_double_click_ = v; } public slots: void RecursivelyExpand(const QModelIndex& index); void UpAndFocus(); void DownAndFocus(); signals: void AddToPlaylistSignal(QMimeData* data); void FocusOnFilterSignal(QKeyEvent* event); protected: // QAbstractItemView void reset(); // QWidget void mousePressEvent(QMouseEvent* event); void keyPressEvent(QKeyEvent* event); virtual bool CanRecursivelyExpand(const QModelIndex& index) const { return true; } private slots: void ItemExpanded(const QModelIndex& index); void ItemClicked(const QModelIndex& index); void ItemDoubleClicked(const QModelIndex& index); private: bool RecursivelyExpand(const QModelIndex& index, int* count); private: bool auto_open_; bool expand_on_reset_; bool add_on_double_click_; bool ignore_next_click_; }; #endif // AUTOEXPANDINGTREEVIEW_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/busyindicator.cpp000066400000000000000000000035011260417502300252060ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "busyindicator.h" #include #include BusyIndicator::BusyIndicator(const QString& text, QWidget* parent) : QWidget(parent) { Init(text); } BusyIndicator::BusyIndicator(QWidget* parent) : QWidget(parent) { Init(QString::null); } void BusyIndicator::Init(const QString& text) { movie_ = new QMovie(":spinner.gif"), label_ = new QLabel; QLabel* icon = new QLabel; icon->setMovie(movie_); icon->setMinimumSize(16, 16); label_->setWordWrap(true); label_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); QHBoxLayout* layout = new QHBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); layout->addWidget(icon); layout->addSpacing(6); layout->addWidget(label_); set_text(text); } BusyIndicator::~BusyIndicator() { delete movie_; } void BusyIndicator::showEvent(QShowEvent*) { movie_->start(); } void BusyIndicator::hideEvent(QHideEvent*) { movie_->stop(); } void BusyIndicator::set_text(const QString& text) { label_->setText(text); label_->setVisible(!text.isEmpty()); } QString BusyIndicator::text() const { return label_->text(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/busyindicator.h000066400000000000000000000025031260417502300246540ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef BUSYINDICATOR_H #define BUSYINDICATOR_H #include class QMovie; class BusyIndicator : public QWidget { Q_OBJECT Q_PROPERTY(QString text READ text WRITE set_text) public: explicit BusyIndicator(const QString& text, QWidget* parent = nullptr); explicit BusyIndicator(QWidget* parent = nullptr); ~BusyIndicator(); QString text() const; void set_text(const QString& text); protected: void showEvent(QShowEvent* event); void hideEvent(QHideEvent* event); private: void Init(const QString& text); private: QMovie* movie_; QLabel* label_; }; #endif // BUSYINDICATOR_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/clickablelabel.cpp000066400000000000000000000016571260417502300252520ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, Andrea Decorte Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "clickablelabel.h" ClickableLabel::ClickableLabel(QWidget* parent) : QLabel(parent) {} void ClickableLabel::mousePressEvent(QMouseEvent* event) { emit Clicked(); QLabel::mousePressEvent(event); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/clickablelabel.h000066400000000000000000000020001260417502300246760ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, Andrea Decorte Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CLICKABLELABEL_H #define CLICKABLELABEL_H #include class ClickableLabel : public QLabel { Q_OBJECT public: ClickableLabel(QWidget* parent = nullptr); signals: void Clicked(); protected: void mousePressEvent(QMouseEvent* event); }; #endif // CLICKABLELABEL_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/didyoumean.cpp000066400000000000000000000112571260417502300244740ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "didyoumean.h" #include "core/logging.h" #include #include #include #include const int DidYouMean::kPadding = 3; DidYouMean::DidYouMean(QWidget* buddy, QWidget* parent) : QWidget(parent, Qt::ToolTip), buddy_(buddy), close_(new QToolButton(this)), normal_font_(font()), correction_font_(font()), press_enter_font_(font()) { // Close icon close_->setToolTip(tr("Close")); close_->setIcon(QIcon(":/trolltech/styles/macstyle/images/closedock-16.png")); close_->setIconSize(QSize(16, 16)); connect(close_, SIGNAL(clicked()), SLOT(hide())); // Cursors setCursor(Qt::PointingHandCursor); close_->setCursor(Qt::ArrowCursor); // Fonts correction_font_.setBold(true); press_enter_font_.setBold(true); press_enter_font_.setPointSizeF(7.5); hide(); buddy_->installEventFilter(this); // Texts did_you_mean_ = tr("Did you mean") + ": "; press_enter_ = "(" + tr("press enter") + ")"; // Texts' sizes did_you_mean_size_ = QFontMetrics(normal_font_).width(did_you_mean_); press_enter_size_ = QFontMetrics(press_enter_font_).width(press_enter_); } bool DidYouMean::eventFilter(QObject* object, QEvent* event) { if (object != buddy_) { return QObject::eventFilter(object, event); } switch (event->type()) { case QEvent::Move: case QEvent::Resize: if (isVisible()) { UpdateGeometry(); } break; case QEvent::KeyPress: if (!isVisible()) { break; } switch (static_cast(event)->key()) { case Qt::Key_Return: case Qt::Key_Enter: emit Accepted(correction_); // fallthrough case Qt::Key_Escape: hide(); return true; default: break; } break; case QEvent::FocusOut: case QEvent::WindowDeactivate: hide(); break; default: break; } return QObject::eventFilter(object, event); } void DidYouMean::showEvent(QShowEvent*) { UpdateGeometry(); } void DidYouMean::UpdateGeometry() { const int text_height = fontMetrics().height(); const int height = text_height + kPadding * 2; move(buddy_->mapToGlobal(buddy_->rect().bottomLeft())); // Resize to len(text to display) + total number of padding added + // size(close button), so the "Did you mean" widget is always fully displayed resize(QSize(did_you_mean_size_ + QFontMetrics(correction_font_).width(correction_ + " ") + press_enter_size_ + kPadding * 6 + close_->width(), height)); close_->move(kPadding, kPadding); close_->resize(text_height, text_height); } void DidYouMean::paintEvent(QPaintEvent*) { QPainter p(this); // Draw the background QColor bg(palette().color(QPalette::Inactive, QPalette::ToolTipBase)); p.fillRect(0, 0, width() - 1, height() - 1, bg); // Border p.setPen(Qt::black); p.drawRect(0, 0, width() - 1, height() - 1); // Text rectangle QRect text_rect(kPadding + close_->width() + kPadding, kPadding, rect().width() - kPadding, rect().height() - kPadding); // Text p.setFont(normal_font_); p.drawText(text_rect, Qt::AlignLeft | Qt::AlignVCenter, did_you_mean_); text_rect.setLeft(text_rect.left() + p.fontMetrics().width(did_you_mean_)); p.setFont(correction_font_); p.drawText(text_rect, Qt::AlignLeft | Qt::AlignVCenter, correction_); text_rect.setLeft(text_rect.left() + p.fontMetrics().width(correction_ + " ")); p.setPen(palette().color(QPalette::Disabled, QPalette::Text)); p.setFont(press_enter_font_); p.drawText(text_rect, Qt::AlignLeft | Qt::AlignVCenter, press_enter_); } void DidYouMean::SetCorrection(const QString& correction) { correction_ = correction; UpdateGeometry(); update(); } void DidYouMean::Show(const QString& correction) { SetCorrection(correction); show(); } void DidYouMean::mouseReleaseEvent(QMouseEvent* e) { emit Accepted(correction_); hide(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/didyoumean.h000066400000000000000000000032611260417502300241350ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef DIDYOUMEAN_H #define DIDYOUMEAN_H #include class QToolButton; class DidYouMean : public QWidget { Q_OBJECT public: DidYouMean(QWidget* buddy, QWidget* parent); static const int kPadding; public slots: void SetCorrection(const QString& correction); void Show(const QString& correction); signals: void Accepted(const QString& correction); protected: void paintEvent(QPaintEvent*); void showEvent(QShowEvent*); void mouseReleaseEvent(QMouseEvent* e); bool eventFilter(QObject* object, QEvent* event); private: void UpdateGeometry(); private: QWidget* buddy_; QString correction_; QToolButton* close_; QFont normal_font_; QFont correction_font_; QFont press_enter_font_; QString did_you_mean_; QString press_enter_; // Size of the text to display, according to QFonts above. // Stored here to avoid to recompute them each time int did_you_mean_size_; int press_enter_size_; }; #endif // DIDYOUMEAN_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/elidedlabel.cpp000066400000000000000000000020651260417502300245610ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "elidedlabel.h" ElidedLabel::ElidedLabel(QWidget* parent) : QLabel(parent) {} void ElidedLabel::SetText(const QString& text) { text_ = text; UpdateText(); } void ElidedLabel::resizeEvent(QResizeEvent*) { UpdateText(); } void ElidedLabel::UpdateText() { setText(fontMetrics().elidedText(text_, Qt::ElideRight, width() - 5)); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/elidedlabel.h000066400000000000000000000020771260417502300242310ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ELIDEDLABEL_H #define ELIDEDLABEL_H #include class ElidedLabel : public QLabel { Q_OBJECT public: ElidedLabel(QWidget* parent = nullptr); public slots: void SetText(const QString& text); protected: void resizeEvent(QResizeEvent* e); private: void UpdateText(); private: QString text_; }; #endif // ELIDEDLABEL_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/equalizerslider.cpp000066400000000000000000000023441260417502300255370ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "equalizerslider.h" #include "ui_equalizerslider.h" EqualizerSlider::EqualizerSlider(const QString& label, QWidget* parent) : QWidget(parent), ui_(new Ui_EqualizerSlider) { ui_->setupUi(this); ui_->label->setText(label); connect(ui_->slider, SIGNAL(valueChanged(int)), SIGNAL(ValueChanged(int))); } EqualizerSlider::~EqualizerSlider() { delete ui_; } int EqualizerSlider::value() const { return ui_->slider->value(); } void EqualizerSlider::set_value(int value) { ui_->slider->setValue(value); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/equalizerslider.h000066400000000000000000000022411260417502300252000ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef EQUALISERSLIDER_H #define EQUALISERSLIDER_H #include class Ui_EqualizerSlider; // Contains the slider and the label class EqualizerSlider : public QWidget { Q_OBJECT public: EqualizerSlider(const QString& label, QWidget* parent = nullptr); ~EqualizerSlider(); int value() const; void set_value(int value); signals: void ValueChanged(int value); private: Ui_EqualizerSlider* ui_; }; #endif // EQUALISERSLIDER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/equalizerslider.ui000066400000000000000000000043071260417502300253730ustar00rootroot00000000000000 EqualizerSlider 0 0 33 224 0 100 Form 0 Qt::Horizontal 0 0 -100 100 Qt::Vertical 0 10 Qt::Horizontal 0 0 Qt::AlignCenter StickySlider QSlider
widgets/stickyslider.h
clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/errordialog.cpp000066400000000000000000000034111260417502300246400ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "errordialog.h" #include "ui_errordialog.h" ErrorDialog::ErrorDialog(QWidget* parent) : QDialog(parent), ui_(new Ui_ErrorDialog) { ui_->setupUi(this); QIcon warning_icon(style()->standardIcon(QStyle::SP_MessageBoxWarning)); QPixmap warning_pixmap(warning_icon.pixmap(48)); QPalette messages_palette(ui_->messages->palette()); messages_palette.setColor(QPalette::Base, messages_palette.color(QPalette::Background)); ui_->messages->setPalette(messages_palette); ui_->icon->setPixmap(warning_pixmap); } ErrorDialog::~ErrorDialog() { delete ui_; } void ErrorDialog::ShowMessage(const QString& message) { current_messages_ << message; UpdateContent(); show(); raise(); activateWindow(); } void ErrorDialog::hideEvent(QHideEvent*) { current_messages_.clear(); UpdateContent(); } void ErrorDialog::UpdateContent() { QString html; for (const QString& message : current_messages_) { if (!html.isEmpty()) html += "
"; html += Qt::escape(message); } ui_->messages->setHtml(html); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/errordialog.h000066400000000000000000000022141260417502300243050ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ERRORDIALOG_H #define ERRORDIALOG_H #include class Ui_ErrorDialog; class ErrorDialog : public QDialog { Q_OBJECT public: ErrorDialog(QWidget* parent = nullptr); ~ErrorDialog(); public slots: void ShowMessage(const QString& message); protected: void hideEvent(QHideEvent*); private: void UpdateContent(); Ui_ErrorDialog* ui_; QStringList current_messages_; }; #endif // ERRORDIALOG_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/errordialog.ui000066400000000000000000000050501260417502300244740ustar00rootroot00000000000000 ErrorDialog 0 0 411 180 Clementine Error :/icon.png:/icon.png Qt::Vertical 20 40 QFrame::NoFrame Qt::ScrollBarAlwaysOff true Qt::Horizontal QDialogButtonBox::Close buttonBox accepted() ErrorDialog accept() 248 254 157 274 buttonBox rejected() ErrorDialog reject() 316 260 286 274 clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/fancytabwidget.cpp000066400000000000000000000544221260417502300253320ustar00rootroot00000000000000/************************************************************************** ** ** This file is part of Qt Creator ** ** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** Commercial Usage ** ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at http://qt.nokia.com/contact. ** **************************************************************************/ #include "fancytabwidget.h" #include "stylehelper.h" #include "core/logging.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace Core; using namespace Internal; const int FancyTabBar::m_rounding = 22; const int FancyTabBar::m_textPadding = 4; void FancyTabProxyStyle::drawControl(ControlElement element, const QStyleOption* option, QPainter* p, const QWidget* widget) const { const QStyleOptionTabV3* v_opt = qstyleoption_cast(option); if (element != CE_TabBarTab || !v_opt) { QProxyStyle::drawControl(element, option, p, widget); return; } const QRect rect = v_opt->rect; const bool selected = v_opt->state & State_Selected; const bool vertical_tabs = v_opt->shape == QTabBar::RoundedWest; const QString text = v_opt->text; if (selected) { // background p->save(); QLinearGradient grad(rect.topLeft(), rect.topRight()); grad.setColorAt(0, QColor(255, 255, 255, 140)); grad.setColorAt(1, QColor(255, 255, 255, 210)); p->fillRect(rect.adjusted(0, 0, 0, -1), grad); p->restore(); // shadows p->setPen(QColor(0, 0, 0, 110)); p->drawLine(rect.topLeft() + QPoint(1, -1), rect.topRight() - QPoint(0, 1)); p->drawLine(rect.bottomLeft(), rect.bottomRight()); p->setPen(QColor(0, 0, 0, 40)); p->drawLine(rect.topLeft(), rect.bottomLeft()); // highlights p->setPen(QColor(255, 255, 255, 50)); p->drawLine(rect.topLeft() + QPoint(0, -2), rect.topRight() - QPoint(0, 2)); p->drawLine(rect.bottomLeft() + QPoint(0, 1), rect.bottomRight() + QPoint(0, 1)); p->setPen(QColor(255, 255, 255, 40)); p->drawLine(rect.topLeft() + QPoint(0, 0), rect.topRight()); p->drawLine(rect.topRight() + QPoint(0, 1), rect.bottomRight() - QPoint(0, 1)); p->drawLine(rect.bottomLeft() + QPoint(0, -1), rect.bottomRight() - QPoint(0, 1)); } QTransform m; if (vertical_tabs) { m = QTransform::fromTranslate(rect.left(), rect.bottom()); m.rotate(-90); } else { m = QTransform::fromTranslate(rect.left(), rect.top()); } const QRect draw_rect(QPoint(0, 0), m.mapRect(rect).size()); p->save(); p->setTransform(m); QRect icon_rect(QPoint(8, 0), v_opt->iconSize); QRect text_rect(icon_rect.topRight() + QPoint(4, 0), draw_rect.size()); text_rect.setRight(draw_rect.width()); icon_rect.translate(0, (draw_rect.height() - icon_rect.height()) / 2); QFont boldFont(p->font()); boldFont.setPointSizeF(Utils::StyleHelper::sidebarFontSize()); boldFont.setBold(true); p->setFont(boldFont); p->setPen(selected ? QColor(255, 255, 255, 160) : QColor(0, 0, 0, 110)); int textFlags = Qt::AlignHCenter | Qt::AlignVCenter; p->drawText(text_rect, textFlags, text); p->setPen(selected ? QColor(60, 60, 60) : Utils::StyleHelper::panelTextColor()); #ifndef Q_WS_MAC if (widget) { const QString fader_key = "tab_" + text + "_fader"; const QString animation_key = "tab_" + text + "_animation"; const QString tab_hover = widget->property("tab_hover").toString(); int fader = widget->property(fader_key.toUtf8().constData()).toInt(); QPropertyAnimation* animation = widget->property(animation_key.toUtf8().constData()) .value(); if (!animation) { QWidget* mut_widget = const_cast(widget); fader = 0; mut_widget->setProperty(fader_key.toUtf8().constData(), fader); animation = new QPropertyAnimation(mut_widget, fader_key.toUtf8(), mut_widget); connect(animation, SIGNAL(valueChanged(QVariant)), mut_widget, SLOT(update())); mut_widget->setProperty(animation_key.toUtf8().constData(), QVariant::fromValue(animation)); } if (text == tab_hover) { if (animation->state() != QAbstractAnimation::Running && fader != 40) { animation->stop(); animation->setDuration(80); animation->setEndValue(40); animation->start(); } } else { if (animation->state() != QAbstractAnimation::Running && fader != 0) { animation->stop(); animation->setDuration(160); animation->setEndValue(0); animation->start(); } } if (!selected) { p->save(); QLinearGradient grad(draw_rect.topLeft(), vertical_tabs ? draw_rect.bottomLeft() : draw_rect.topRight()); grad.setColorAt(0, Qt::transparent); grad.setColorAt(0.5, QColor(255, 255, 255, fader)); grad.setColorAt(1, Qt::transparent); p->fillRect(draw_rect, grad); p->setPen(QPen(grad, 1.0)); p->drawLine(draw_rect.topLeft(), vertical_tabs ? draw_rect.bottomLeft() : draw_rect.topRight()); p->drawLine(draw_rect.bottomRight(), vertical_tabs ? draw_rect.topRight() : draw_rect.bottomLeft()); p->restore(); } } #endif Utils::StyleHelper::drawIconWithShadow(v_opt->icon, icon_rect, p, QIcon::Normal); p->drawText(text_rect.translated(0, -1), textFlags, text); p->restore(); } void FancyTabProxyStyle::polish(QWidget* widget) { if (QString(widget->metaObject()->className()) == "QTabBar") { widget->setMouseTracking(true); widget->installEventFilter(this); } QProxyStyle::polish(widget); } void FancyTabProxyStyle::polish(QApplication* app) { QProxyStyle::polish(app); } void FancyTabProxyStyle::polish(QPalette& palette) { QProxyStyle::polish(palette); } bool FancyTabProxyStyle::eventFilter(QObject* o, QEvent* e) { QTabBar* bar = qobject_cast(o); if (bar && (e->type() == QEvent::MouseMove || e->type() == QEvent::Leave)) { QMouseEvent* event = static_cast(e); const QString old_hovered_tab = bar->property("tab_hover").toString(); const QString hovered_tab = e->type() == QEvent::Leave ? QString() : bar->tabText(bar->tabAt(event->pos())); bar->setProperty("tab_hover", hovered_tab); if (old_hovered_tab != hovered_tab) bar->update(); } return false; } FancyTab::FancyTab(QWidget* tabbar) : QWidget(tabbar), tabbar(tabbar), m_fader(0) { animator.setPropertyName("fader"); animator.setTargetObject(this); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); } void FancyTab::fadeIn() { animator.stop(); animator.setDuration(80); animator.setEndValue(40); animator.start(); } void FancyTab::fadeOut() { animator.stop(); animator.setDuration(160); animator.setEndValue(0); animator.start(); } void FancyTab::setFader(float value) { m_fader = value; tabbar->update(); } FancyTabBar::FancyTabBar(QWidget* parent) : QWidget(parent) { setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); setStyle(new QWindowsStyle); setMinimumWidth(qMax(2 * m_rounding, 40)); setAttribute(Qt::WA_Hover, true); setFocusPolicy(Qt::NoFocus); setMouseTracking(true); // Needed for hover events m_triggerTimer.setSingleShot(true); QVBoxLayout* layout = new QVBoxLayout; layout->addSpacerItem( new QSpacerItem(0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding)); layout->setSpacing(0); layout->setContentsMargins(0, 0, 0, 0); setLayout(layout); // We use a zerotimer to keep the sidebar responsive connect(&m_triggerTimer, SIGNAL(timeout()), this, SLOT(emitCurrentIndex())); } FancyTabBar::~FancyTabBar() { delete style(); } QSize FancyTab::sizeHint() const { QFont boldFont(font()); boldFont.setPointSizeF(Utils::StyleHelper::sidebarFontSize()); boldFont.setBold(true); QFontMetrics fm(boldFont); int spacing = 8; int width = 60 + spacing + 2; int iconHeight = 32; QSize ret(width, iconHeight + spacing + fm.height()); return ret; } QSize FancyTabBar::tabSizeHint(bool minimum) const { QFont boldFont(font()); boldFont.setPointSizeF(Utils::StyleHelper::sidebarFontSize()); boldFont.setBold(true); QFontMetrics fm(boldFont); int spacing = 8; int width = 60 + spacing + 2; int iconHeight = minimum ? 0 : 32; return QSize(width, iconHeight + spacing + fm.height()); } void FancyTabBar::paintEvent(QPaintEvent* event) { Q_UNUSED(event) QPainter p(this); for (int i = 0; i < count(); ++i) if (i != currentIndex()) paintTab(&p, i); // paint active tab last, since it overlaps the neighbors if (currentIndex() != -1) paintTab(&p, currentIndex()); } bool FancyTab::event(QEvent* event) { if (event->type() == QEvent::ToolTip) { QFontMetrics metrics(font()); int text_width = metrics.width(text); if (text_width > sizeHint().width()) { // The text is elided: show the tooltip QHelpEvent* he = static_cast(event); QToolTip::showText(he->globalPos(), text); } else { QToolTip::hideText(); } return true; } return QWidget::event(event); } void FancyTab::enterEvent(QEvent*) { fadeIn(); } void FancyTab::leaveEvent(QEvent*) { fadeOut(); } QSize FancyTabBar::sizeHint() const { QSize sh = tabSizeHint(); return QSize(sh.width(), sh.height() * m_tabs.count()); } QSize FancyTabBar::minimumSizeHint() const { QSize sh = tabSizeHint(true); return QSize(sh.width(), sh.height() * m_tabs.count()); } QRect FancyTabBar::tabRect(int index) const { return m_tabs[index]->geometry(); } QString FancyTabBar::tabToolTip(int index) const { return m_tabs[index]->toolTip(); } void FancyTabBar::setTabToolTip(int index, const QString& toolTip) { m_tabs[index]->setToolTip(toolTip); } // This keeps the sidebar responsive since // we get a repaint before loading the // mode itself void FancyTabBar::emitCurrentIndex() { emit currentChanged(m_currentIndex); } void FancyTabBar::mousePressEvent(QMouseEvent* e) { e->accept(); for (int index = 0; index < m_tabs.count(); ++index) { if (tabRect(index).contains(e->pos())) { m_currentIndex = index; update(); m_triggerTimer.start(0); break; } } } void FancyTabBar::addTab(const QIcon& icon, const QString& label) { FancyTab* tab = new FancyTab(this); tab->icon = icon; tab->text = label; tab->setToolTip(label); m_tabs.append(tab); qobject_cast(layout()) ->insertWidget(layout()->count() - 1, tab); } void FancyTabBar::addSpacer(int size) { qobject_cast(layout())->insertSpacerItem( layout()->count() - 1, new QSpacerItem(0, size, QSizePolicy::Fixed, QSizePolicy::Maximum)); } void FancyTabBar::paintTab(QPainter* painter, int tabIndex) const { if (!validIndex(tabIndex)) { qWarning("invalid index"); return; } painter->save(); QRect rect = tabRect(tabIndex); bool selected = (tabIndex == m_currentIndex); if (selected) { // background painter->save(); QLinearGradient grad(rect.topLeft(), rect.topRight()); grad.setColorAt(0, QColor(255, 255, 255, 140)); grad.setColorAt(1, QColor(255, 255, 255, 210)); painter->fillRect(rect.adjusted(0, 0, 0, -1), grad); painter->restore(); // shadows painter->setPen(QColor(0, 0, 0, 110)); painter->drawLine(rect.topLeft() + QPoint(1, -1), rect.topRight() - QPoint(0, 1)); painter->drawLine(rect.bottomLeft(), rect.bottomRight()); painter->setPen(QColor(0, 0, 0, 40)); painter->drawLine(rect.topLeft(), rect.bottomLeft()); // highlights painter->setPen(QColor(255, 255, 255, 50)); painter->drawLine(rect.topLeft() + QPoint(0, -2), rect.topRight() - QPoint(0, 2)); painter->drawLine(rect.bottomLeft() + QPoint(0, 1), rect.bottomRight() + QPoint(0, 1)); painter->setPen(QColor(255, 255, 255, 40)); painter->drawLine(rect.topLeft() + QPoint(0, 0), rect.topRight()); painter->drawLine(rect.topRight() + QPoint(0, 1), rect.bottomRight() - QPoint(0, 1)); painter->drawLine(rect.bottomLeft() + QPoint(0, -1), rect.bottomRight() - QPoint(0, 1)); } QString tabText(painter->fontMetrics().elidedText(this->tabText(tabIndex), Qt::ElideRight, width())); QRect tabTextRect(tabRect(tabIndex)); QRect tabIconRect(tabTextRect); tabIconRect.adjust(+4, +4, -4, -4); tabTextRect.translate(0, -2); QFont boldFont(painter->font()); boldFont.setPointSizeF(Utils::StyleHelper::sidebarFontSize()); boldFont.setBold(true); painter->setFont(boldFont); painter->setPen(selected ? QColor(255, 255, 255, 160) : QColor(0, 0, 0, 110)); int textFlags = Qt::AlignCenter | Qt::AlignBottom; painter->drawText(tabTextRect, textFlags, tabText); painter->setPen(selected ? QColor(60, 60, 60) : Utils::StyleHelper::panelTextColor()); #ifndef Q_WS_MAC if (!selected) { painter->save(); int fader = int(m_tabs[tabIndex]->fader()); QLinearGradient grad(rect.topLeft(), rect.topRight()); grad.setColorAt(0, Qt::transparent); grad.setColorAt(0.5, QColor(255, 255, 255, fader)); grad.setColorAt(1, Qt::transparent); painter->fillRect(rect, grad); painter->setPen(QPen(grad, 1.0)); painter->drawLine(rect.topLeft(), rect.topRight()); painter->drawLine(rect.bottomLeft(), rect.bottomRight()); painter->restore(); } #endif const int textHeight = painter->fontMetrics().height(); tabIconRect.adjust(0, 4, 0, -textHeight); Utils::StyleHelper::drawIconWithShadow(tabIcon(tabIndex), tabIconRect, painter, QIcon::Normal); painter->translate(0, -1); painter->drawText(tabTextRect, textFlags, tabText); painter->restore(); } void FancyTabBar::setCurrentIndex(int index) { m_currentIndex = index; update(); emit currentChanged(m_currentIndex); } ////// // FancyColorButton ////// class FancyColorButton : public QWidget { public: FancyColorButton(QWidget* parent) : m_parent(parent) { setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); } void mousePressEvent(QMouseEvent* ev) { if (ev->modifiers() & Qt::ShiftModifier) Utils::StyleHelper::setBaseColor(QColorDialog::getColor( Utils::StyleHelper::requestedBaseColor(), m_parent)); } private: QWidget* m_parent; }; ////// // FancyTabWidget ////// FancyTabWidget::FancyTabWidget(QWidget* parent) : QWidget(parent), mode_(Mode_None), tab_bar_(nullptr), stack_(new QStackedLayout), side_widget_(new QWidget), side_layout_(new QVBoxLayout), top_layout_(new QVBoxLayout), use_background_(false), menu_(nullptr), proxy_style_(new FancyTabProxyStyle) { side_layout_->setSpacing(0); side_layout_->setMargin(0); side_layout_->addSpacerItem( new QSpacerItem(0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding)); side_widget_->setLayout(side_layout_); side_widget_->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); top_layout_->setMargin(0); top_layout_->setSpacing(0); top_layout_->addLayout(stack_); QHBoxLayout* main_layout = new QHBoxLayout; main_layout->setMargin(0); main_layout->setSpacing(1); main_layout->addWidget(side_widget_); main_layout->addLayout(top_layout_); setLayout(main_layout); } void FancyTabWidget::AddTab(QWidget* tab, const QIcon& icon, const QString& label) { stack_->addWidget(tab); items_ << Item(icon, label); } void FancyTabWidget::AddSpacer(int size) { items_ << Item(size); } void FancyTabWidget::SetBackgroundPixmap(const QPixmap& pixmap) { background_pixmap_ = pixmap; update(); } void FancyTabWidget::paintEvent(QPaintEvent*) { if (!use_background_) return; QPainter painter(this); QRect rect = side_widget_->rect().adjusted(0, 0, 1, 0); rect = style()->visualRect(layoutDirection(), geometry(), rect); Utils::StyleHelper::verticalGradient(&painter, rect, rect); if (!background_pixmap_.isNull()) { QRect pixmap_rect(background_pixmap_.rect()); pixmap_rect.moveTo(rect.topLeft()); while (pixmap_rect.top() < rect.bottom()) { QRect source_rect(pixmap_rect.intersected(rect)); source_rect.moveTo(0, 0); painter.drawPixmap(pixmap_rect.topLeft(), background_pixmap_, source_rect); pixmap_rect.moveTop(pixmap_rect.bottom() - 10); } } painter.setPen(Utils::StyleHelper::borderColor()); painter.drawLine(rect.topRight(), rect.bottomRight()); QColor light = Utils::StyleHelper::sidebarHighlight(); painter.setPen(light); painter.drawLine(rect.bottomLeft(), rect.bottomRight()); } int FancyTabWidget::current_index() const { return stack_->currentIndex(); } void FancyTabWidget::SetCurrentIndex(int index) { if (FancyTabBar* bar = qobject_cast(tab_bar_)) { bar->setCurrentIndex(index); } else if (QTabBar* bar = qobject_cast(tab_bar_)) { bar->setCurrentIndex(index); } else { stack_->setCurrentIndex(index); } } void FancyTabWidget::SetCurrentWidget(QWidget* widget) { SetCurrentIndex(stack_->indexOf(widget)); } void FancyTabWidget::ShowWidget(int index) { stack_->setCurrentIndex(index); emit CurrentChanged(index); } void FancyTabWidget::AddBottomWidget(QWidget* widget) { top_layout_->addWidget(widget); } void FancyTabWidget::SetMode(Mode mode) { // Remove previous tab bar delete tab_bar_; tab_bar_ = nullptr; use_background_ = false; // Create new tab bar switch (mode) { case Mode_None: default: qLog(Warning) << "Unknown fancy tab mode" << mode; // fallthrough case Mode_LargeSidebar: { FancyTabBar* bar = new FancyTabBar(this); side_layout_->insertWidget(0, bar); tab_bar_ = bar; for (const Item& item : items_) { if (item.type_ == Item::Type_Spacer) bar->addSpacer(item.spacer_size_); else bar->addTab(item.tab_icon_, item.tab_label_); } bar->setCurrentIndex(stack_->currentIndex()); connect(bar, SIGNAL(currentChanged(int)), SLOT(ShowWidget(int))); use_background_ = true; break; } case Mode_Tabs: MakeTabBar(QTabBar::RoundedNorth, true, false, false); break; case Mode_IconOnlyTabs: MakeTabBar(QTabBar::RoundedNorth, false, true, false); break; case Mode_SmallSidebar: MakeTabBar(QTabBar::RoundedWest, true, true, true); use_background_ = true; break; case Mode_PlainSidebar: MakeTabBar(QTabBar::RoundedWest, true, true, false); break; } tab_bar_->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); mode_ = mode; emit ModeChanged(mode); update(); } void FancyTabWidget::contextMenuEvent(QContextMenuEvent* e) { if (!menu_) { menu_ = new QMenu(this); QSignalMapper* mapper = new QSignalMapper(this); QActionGroup* group = new QActionGroup(this); AddMenuItem(mapper, group, tr("Large sidebar"), Mode_LargeSidebar); AddMenuItem(mapper, group, tr("Small sidebar"), Mode_SmallSidebar); AddMenuItem(mapper, group, tr("Plain sidebar"), Mode_PlainSidebar); AddMenuItem(mapper, group, tr("Tabs on top"), Mode_Tabs); AddMenuItem(mapper, group, tr("Icons on top"), Mode_IconOnlyTabs); menu_->addActions(group->actions()); connect(mapper, SIGNAL(mapped(int)), SLOT(SetMode(int))); } menu_->popup(e->globalPos()); } void FancyTabWidget::AddMenuItem(QSignalMapper* mapper, QActionGroup* group, const QString& text, Mode mode) { QAction* action = group->addAction(text); action->setCheckable(true); mapper->setMapping(action, mode); connect(action, SIGNAL(triggered()), mapper, SLOT(map())); if (mode == mode_) action->setChecked(true); } void FancyTabWidget::MakeTabBar(QTabBar::Shape shape, bool text, bool icons, bool fancy) { QTabBar* bar = new QTabBar(this); bar->setShape(shape); bar->setDocumentMode(true); bar->setUsesScrollButtons(true); bar->setElideMode(Qt::ElideRight); if (shape == QTabBar::RoundedWest) { bar->setIconSize(QSize(22, 22)); } if (fancy) { bar->setStyle(proxy_style_.get()); } if (shape == QTabBar::RoundedNorth) top_layout_->insertWidget(0, bar); else side_layout_->insertWidget(0, bar); for (const Item& item : items_) { if (item.type_ != Item::Type_Tab) continue; QString label = item.tab_label_; if (shape == QTabBar::RoundedWest) { label = QFontMetrics(font()).elidedText(label, Qt::ElideMiddle, 100); } int tab_id = -1; if (icons && text) tab_id = bar->addTab(item.tab_icon_, label); else if (icons) tab_id = bar->addTab(item.tab_icon_, QString()); else if (text) tab_id = bar->addTab(label); bar->setTabToolTip(tab_id, item.tab_label_); } bar->setCurrentIndex(stack_->currentIndex()); connect(bar, SIGNAL(currentChanged(int)), SLOT(ShowWidget(int))); tab_bar_ = bar; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/fancytabwidget.h000066400000000000000000000132371260417502300247760ustar00rootroot00000000000000/************************************************************************** ** ** This file is part of Qt Creator ** ** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** Commercial Usage ** ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at http://qt.nokia.com/contact. ** **************************************************************************/ #ifndef FANCYTABWIDGET_H #define FANCYTABWIDGET_H #include #include #include #include #include #include #include class QActionGroup; class QMenu; class QPainter; class QSignalMapper; class QStackedLayout; class QStatusBar; class QVBoxLayout; namespace Core { namespace Internal { class FancyTabProxyStyle : public QProxyStyle { Q_OBJECT public: void drawControl(ControlElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget) const; void polish(QWidget* widget); void polish(QApplication* app); void polish(QPalette& palette); protected: bool eventFilter(QObject* o, QEvent* e); }; class FancyTab : public QWidget { Q_OBJECT Q_PROPERTY(float fader READ fader WRITE setFader) public: FancyTab(QWidget* tabbar); float fader() { return m_fader; } void setFader(float value); QSize sizeHint() const; void fadeIn(); void fadeOut(); QIcon icon; QString text; protected: bool event(QEvent*); void enterEvent(QEvent*); void leaveEvent(QEvent*); private: QPropertyAnimation animator; QWidget* tabbar; float m_fader; }; class FancyTabBar : public QWidget { Q_OBJECT public: FancyTabBar(QWidget* parent = nullptr); ~FancyTabBar(); void paintEvent(QPaintEvent* event); void paintTab(QPainter* painter, int tabIndex) const; void mousePressEvent(QMouseEvent*); bool validIndex(int index) const { return index >= 0 && index < m_tabs.count(); } QSize sizeHint() const; QSize minimumSizeHint() const; void addTab(const QIcon& icon, const QString& label); void addSpacer(int size = 40); void removeTab(int index) { FancyTab* tab = m_tabs.takeAt(index); delete tab; } void setCurrentIndex(int index); int currentIndex() const { return m_currentIndex; } void setTabToolTip(int index, const QString& toolTip); QString tabToolTip(int index) const; QIcon tabIcon(int index) const { return m_tabs.at(index)->icon; } QString tabText(int index) const { return m_tabs.at(index)->text; } int count() const { return m_tabs.count(); } QRect tabRect(int index) const; signals: void currentChanged(int); public slots: void emitCurrentIndex(); private: static const int m_rounding; static const int m_textPadding; int m_currentIndex; QList m_tabs; QTimer m_triggerTimer; QSize tabSizeHint(bool minimum = false) const; }; class FancyTabWidget : public QWidget { Q_OBJECT public: FancyTabWidget(QWidget* parent = nullptr); // Values are persisted - only add to the end enum Mode { Mode_None = 0, Mode_LargeSidebar = 1, Mode_SmallSidebar = 2, Mode_Tabs = 3, Mode_IconOnlyTabs = 4, Mode_PlainSidebar = 5, }; struct Item { Item(const QIcon& icon, const QString& label) : type_(Type_Tab), tab_label_(label), tab_icon_(icon), spacer_size_(0) {} Item(int size) : type_(Type_Spacer), spacer_size_(size) {} enum Type { Type_Tab, Type_Spacer, }; Type type_; QString tab_label_; QIcon tab_icon_; int spacer_size_; }; void AddTab(QWidget* tab, const QIcon& icon, const QString& label); void AddSpacer(int size = 40); void SetBackgroundPixmap(const QPixmap& pixmap); void AddBottomWidget(QWidget* widget); int current_index() const; Mode mode() const { return mode_; } public slots: void SetCurrentIndex(int index); void SetCurrentWidget(QWidget* widget); void SetMode(Mode mode); void SetMode(int mode) { SetMode(Mode(mode)); } signals: void CurrentChanged(int index); void ModeChanged(FancyTabWidget::Mode mode); protected: void paintEvent(QPaintEvent* event); void contextMenuEvent(QContextMenuEvent* e); private slots: void ShowWidget(int index); private: void MakeTabBar(QTabBar::Shape shape, bool text, bool icons, bool fancy); void AddMenuItem(QSignalMapper* mapper, QActionGroup* group, const QString& text, Mode mode); Mode mode_; QList items_; QWidget* tab_bar_; QStackedLayout* stack_; QPixmap background_pixmap_; QWidget* side_widget_; QVBoxLayout* side_layout_; QVBoxLayout* top_layout_; bool use_background_; QMenu* menu_; std::unique_ptr proxy_style_; }; } // namespace Internal } // namespace Core Q_DECLARE_METATYPE(QPropertyAnimation*); using Core::Internal::FancyTab; using Core::Internal::FancyTabBar; using Core::Internal::FancyTabWidget; #endif // FANCYTABWIDGET_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/favoritewidget.cpp000066400000000000000000000035641260417502300253630ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2013, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "favoritewidget.h" #include #include #include #include #include #include "core/logging.h" const int FavoriteWidget::kStarSize = 15; FavoriteWidget::FavoriteWidget(int tab_index, bool favorite, QWidget* parent) : QWidget(parent), tab_index_(tab_index), favorite_(favorite), on_(":/star-on.png"), off_(":/star-off.png"), rect_(0, 0, kStarSize, kStarSize) {} void FavoriteWidget::SetFavorite(bool favorite) { if (favorite_ != favorite) { favorite_ = favorite; update(); emit FavoriteStateChanged(tab_index_, favorite_); } } QSize FavoriteWidget::sizeHint() const { const int frame_width = 1 + style()->pixelMetric(QStyle::PM_DefaultFrameWidth); return QSize(kStarSize + frame_width * 2, kStarSize + frame_width * 2); } void FavoriteWidget::paintEvent(QPaintEvent* e) { QStylePainter p(this); if (favorite_) { p.drawPixmap(rect_, on_); } else { p.drawPixmap(rect_, off_); } } void FavoriteWidget::mouseReleaseEvent(QMouseEvent* e) { favorite_ = !favorite_; update(); emit FavoriteStateChanged(tab_index_, favorite_); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/favoritewidget.h000066400000000000000000000026261260417502300250260ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2013, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include class QPaintEvent; class QMouseEvent; class FavoriteWidget : public QWidget { Q_OBJECT public: FavoriteWidget(int tab_id, bool favorite = false, QWidget* parent = nullptr); // Change the value if different from the current one and then update display // and emit FavoriteStateChanged signal void SetFavorite(bool favorite); QSize sizeHint() const; signals: void FavoriteStateChanged(int, bool); protected: void paintEvent(QPaintEvent* e); void mouseReleaseEvent(QMouseEvent* e); private: static const int kStarSize; // The playlist's id this widget belongs to int tab_index_; bool favorite_; QPixmap on_; QPixmap off_; QRect rect_; }; clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/fileview.cpp000066400000000000000000000165761260417502300241610ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "fileview.h" #include "ui_fileview.h" #include "core/deletefiles.h" #include "core/filesystemmusicstorage.h" #include "core/mimedata.h" #include "ui/iconloader.h" #include "ui/mainwindow.h" // for filter information #include "ui/organiseerrordialog.h" #include #include #include #include const char* FileView::kFileFilter = "*.mp3 *.ogg *.flac *.mpc *.m4a *.m4b *.aac *.wma " "*.mp4 *.spx *.wav *.m3u *.m3u8 *.pls *.xspf " "*.asx *.asxini *.cue *.ape *.wv *.mka *.opus " "*.oga *.mka *.mp2"; FileView::FileView(QWidget* parent) : QWidget(parent), ui_(new Ui_FileView), model_(nullptr), undo_stack_(new QUndoStack(this)), task_manager_(nullptr), storage_(new FilesystemMusicStorage("/")) { ui_->setupUi(this); // Icons ui_->back->setIcon(IconLoader::Load("go-previous")); ui_->forward->setIcon(IconLoader::Load("go-next")); ui_->home->setIcon(IconLoader::Load("go-home")); ui_->up->setIcon(IconLoader::Load("go-up")); connect(ui_->back, SIGNAL(clicked()), undo_stack_, SLOT(undo())); connect(ui_->forward, SIGNAL(clicked()), undo_stack_, SLOT(redo())); connect(ui_->home, SIGNAL(clicked()), SLOT(FileHome())); connect(ui_->up, SIGNAL(clicked()), SLOT(FileUp())); connect(ui_->path, SIGNAL(textChanged(QString)), SLOT(ChangeFilePath(QString))); connect(undo_stack_, SIGNAL(canUndoChanged(bool)), ui_->back, SLOT(setEnabled(bool))); connect(undo_stack_, SIGNAL(canRedoChanged(bool)), ui_->forward, SLOT(setEnabled(bool))); connect(ui_->list, SIGNAL(activated(QModelIndex)), SLOT(ItemActivated(QModelIndex))); connect(ui_->list, SIGNAL(doubleClicked(QModelIndex)), SLOT(ItemDoubleClick(QModelIndex))); connect(ui_->list, SIGNAL(AddToPlaylist(QMimeData*)), SIGNAL(AddToPlaylist(QMimeData*))); connect(ui_->list, SIGNAL(CopyToLibrary(QList)), SIGNAL(CopyToLibrary(QList))); connect(ui_->list, SIGNAL(MoveToLibrary(QList)), SIGNAL(MoveToLibrary(QList))); connect(ui_->list, SIGNAL(CopyToDevice(QList)), SIGNAL(CopyToDevice(QList))); connect(ui_->list, SIGNAL(Delete(QStringList)), SLOT(Delete(QStringList))); connect(ui_->list, SIGNAL(EditTags(QList)), SIGNAL(EditTags(QList))); QString filter(FileView::kFileFilter); filter_list_ << filter.split(" "); } FileView::~FileView() { delete ui_; } void FileView::SetPath(const QString& path) { if (!model_) lazy_set_path_ = path; else ChangeFilePathWithoutUndo(path); } void FileView::SetTaskManager(TaskManager* task_manager) { task_manager_ = task_manager; } void FileView::FileUp() { QDir dir(model_->rootDirectory()); dir.cdUp(); // Is this the same as going back? If so just go back, so we can keep the // view scroll position. if (undo_stack_->canUndo()) { const UndoCommand* last_dir = static_cast( undo_stack_->command(undo_stack_->index() - 1)); if (last_dir->undo_path() == dir.path()) { undo_stack_->undo(); return; } } ChangeFilePath(dir.path()); } void FileView::FileHome() { ChangeFilePath(QDir::homePath()); } void FileView::ChangeFilePath(const QString& new_path_native) { QString new_path = QDir::fromNativeSeparators(new_path_native); QFileInfo info(new_path); if (!info.exists() || !info.isDir()) return; QString old_path(model_->rootPath()); if (old_path == new_path) return; undo_stack_->push(new UndoCommand(this, new_path)); } void FileView::ChangeFilePathWithoutUndo(const QString& new_path) { ui_->list->setRootIndex(model_->setRootPath(new_path)); ui_->path->setText(QDir::toNativeSeparators(new_path)); QDir dir(new_path); ui_->up->setEnabled(dir.cdUp()); emit PathChanged(new_path); } void FileView::ItemActivated(const QModelIndex& index) { if (model_->isDir(index)) ChangeFilePath(model_->filePath(index)); } void FileView::ItemDoubleClick(const QModelIndex& index) { if (model_->isDir(index)) return; QString file_path = model_->filePath(index); MimeData* data = new MimeData; data->from_doubleclick_ = true; data->setUrls(QList() << QUrl::fromLocalFile(file_path)); data->name_for_new_playlist_ = file_path; emit AddToPlaylist(data); } FileView::UndoCommand::UndoCommand(FileView* view, const QString& new_path) : view_(view) { old_state_.path = view->model_->rootPath(); old_state_.scroll_pos = view_->ui_->list->verticalScrollBar()->value(); old_state_.index = view_->ui_->list->currentIndex(); new_state_.path = new_path; } void FileView::UndoCommand::redo() { view_->ChangeFilePathWithoutUndo(new_state_.path); if (new_state_.scroll_pos != -1) { view_->ui_->list->setCurrentIndex(new_state_.index); view_->ui_->list->verticalScrollBar()->setValue(new_state_.scroll_pos); } } void FileView::UndoCommand::undo() { new_state_.scroll_pos = view_->ui_->list->verticalScrollBar()->value(); new_state_.index = view_->ui_->list->currentIndex(); view_->ChangeFilePathWithoutUndo(old_state_.path); view_->ui_->list->setCurrentIndex(old_state_.index); view_->ui_->list->verticalScrollBar()->setValue(old_state_.scroll_pos); } void FileView::Delete(const QStringList& filenames) { if (filenames.isEmpty()) return; if (QMessageBox::warning(this, tr("Delete files"), tr("These files will be permanently deleted from " "disk, are you sure you want to continue?"), QMessageBox::Yes, QMessageBox::Cancel) != QMessageBox::Yes) return; DeleteFiles* delete_files = new DeleteFiles(task_manager_, storage_); connect(delete_files, SIGNAL(Finished(SongList)), SLOT(DeleteFinished(SongList))); delete_files->Start(filenames); } void FileView::DeleteFinished(const SongList& songs_with_errors) { if (songs_with_errors.isEmpty()) return; OrganiseErrorDialog* dialog = new OrganiseErrorDialog(this); dialog->Show(OrganiseErrorDialog::Type_Delete, songs_with_errors); // It deletes itself when the user closes it } void FileView::showEvent(QShowEvent* e) { QWidget::showEvent(e); if (model_) return; model_ = new QFileSystemModel(this); model_->setNameFilters(filter_list_); // if an item fails the filter, hide it model_->setNameFilterDisables(false); ui_->list->setModel(model_); ChangeFilePathWithoutUndo(QDir::homePath()); if (!lazy_set_path_.isEmpty()) ChangeFilePathWithoutUndo(lazy_set_path_); } void FileView::keyPressEvent(QKeyEvent* e) { switch (e->key()) { case Qt::Key_Back: case Qt::Key_Backspace: ui_->up->click(); break; } QWidget::keyPressEvent(e); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/fileview.h000066400000000000000000000051151260417502300236110ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef FILEVIEW_H #define FILEVIEW_H #include #include #include #include #include #include "core/song.h" class FilesystemMusicStorage; class MusicStorage; class TaskManager; class Ui_FileView; class QFileSystemModel; class QUndoStack; class FileView : public QWidget { Q_OBJECT public: FileView(QWidget* parent = nullptr); ~FileView(); static const char* kFileFilter; void SetPath(const QString& path); void SetTaskManager(TaskManager* task_manager); void showEvent(QShowEvent*); void keyPressEvent(QKeyEvent* e); signals: void PathChanged(const QString& path); void AddToPlaylist(QMimeData* data); void CopyToLibrary(const QList& urls); void MoveToLibrary(const QList& urls); void CopyToDevice(const QList& urls); void EditTags(const QList& urls); private slots: void FileUp(); void FileHome(); void ChangeFilePath(const QString& new_path); void ItemActivated(const QModelIndex& index); void ItemDoubleClick(const QModelIndex& index); void Delete(const QStringList& filenames); void DeleteFinished(const SongList& songs_with_errors); private: void ChangeFilePathWithoutUndo(const QString& new_path); private: class UndoCommand : public QUndoCommand { public: UndoCommand(FileView* view, const QString& new_path); QString undo_path() const { return old_state_.path; } void undo(); void redo(); private: struct State { State() : scroll_pos(-1) {} QString path; QModelIndex index; int scroll_pos; }; FileView* view_; State old_state_; State new_state_; }; Ui_FileView* ui_; QFileSystemModel* model_; QUndoStack* undo_stack_; TaskManager* task_manager_; std::shared_ptr storage_; QString lazy_set_path_; QStringList filter_list_; }; #endif // FILEVIEW_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/fileview.ui000066400000000000000000000056501260417502300240030ustar00rootroot00000000000000 FileView 0 0 400 300 Form 0 0 0 false 16 16 true false 16 16 true 16 16 true 16 16 true true QAbstractItemView::DragOnly QAbstractItemView::ExtendedSelection QAbstractItemView::SelectRows 16 16 FileViewList QListView
widgets/fileviewlist.h
clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/fileviewlist.cpp000066400000000000000000000117251260417502300250440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "fileviewlist.h" #include "core/mimedata.h" #include "core/utilities.h" #include "ui/iconloader.h" #include #include #include #include FileViewList::FileViewList(QWidget* parent) : QListView(parent), menu_(new QMenu(this)) { menu_->addAction(IconLoader::Load("media-playback-start"), tr("Append to current playlist"), this, SLOT(AddToPlaylistSlot())); menu_->addAction(IconLoader::Load("media-playback-start"), tr("Replace current playlist"), this, SLOT(LoadSlot())); menu_->addAction(IconLoader::Load("document-new"), tr("Open in new playlist"), this, SLOT(OpenInNewPlaylistSlot())); menu_->addSeparator(); menu_->addAction(IconLoader::Load("edit-copy"), tr("Copy to library..."), this, SLOT(CopyToLibrarySlot())); menu_->addAction(IconLoader::Load("go-jump"), tr("Move to library..."), this, SLOT(MoveToLibrarySlot())); menu_->addAction(IconLoader::Load("multimedia-player-ipod-mini-blue"), tr("Copy to device..."), this, SLOT(CopyToDeviceSlot())); menu_->addAction(IconLoader::Load("edit-delete"), tr("Delete from disk..."), this, SLOT(DeleteSlot())); menu_->addSeparator(); menu_->addAction(IconLoader::Load("edit-rename"), tr("Edit track information..."), this, SLOT(EditTagsSlot())); menu_->addAction(IconLoader::Load("document-open-folder"), tr("Show in file browser..."), this, SLOT(ShowInBrowser())); setAttribute(Qt::WA_MacShowFocusRect, false); } void FileViewList::contextMenuEvent(QContextMenuEvent* e) { menu_selection_ = selectionModel()->selection(); menu_->popup(e->globalPos()); e->accept(); } QList FileViewList::UrlListFromSelection() const { QList urls; for (const QModelIndex& index : menu_selection_.indexes()) { if (index.column() == 0) urls << QUrl::fromLocalFile(static_cast(model()) ->fileInfo(index) .canonicalFilePath()); } return urls; } MimeData* FileViewList::MimeDataFromSelection() const { MimeData* data = new MimeData; data->setUrls(UrlListFromSelection()); QList filenames = FilenamesFromSelection(); // if just one folder selected - use it's path as the new playlist's name if (filenames.size() == 1 && QFileInfo(filenames.first()).isDir()) { data->name_for_new_playlist_ = filenames.first(); // otherwise, use the current root path } else { data->name_for_new_playlist_ = static_cast(model())->rootPath(); } return data; } QStringList FileViewList::FilenamesFromSelection() const { QStringList filenames; for (const QModelIndex& index : menu_selection_.indexes()) { if (index.column() == 0) filenames << static_cast(model())->filePath(index); } return filenames; } void FileViewList::LoadSlot() { MimeData* data = MimeDataFromSelection(); data->clear_first_ = true; emit AddToPlaylist(data); } void FileViewList::AddToPlaylistSlot() { emit AddToPlaylist(MimeDataFromSelection()); } void FileViewList::OpenInNewPlaylistSlot() { MimeData* data = MimeDataFromSelection(); data->open_in_new_playlist_ = true; emit AddToPlaylist(data); } void FileViewList::CopyToLibrarySlot() { emit CopyToLibrary(UrlListFromSelection()); } void FileViewList::MoveToLibrarySlot() { emit MoveToLibrary(UrlListFromSelection()); } void FileViewList::CopyToDeviceSlot() { emit CopyToDevice(UrlListFromSelection()); } void FileViewList::DeleteSlot() { emit Delete(FilenamesFromSelection()); } void FileViewList::EditTagsSlot() { emit EditTags(UrlListFromSelection()); } void FileViewList::mousePressEvent(QMouseEvent* e) { QListView::mousePressEvent(e); // enqueue to playlist with middleClick if (e->button() == Qt::MidButton) { // we need to update the menu selection menu_selection_ = selectionModel()->selection(); MimeData* data = new MimeData; data->setUrls(UrlListFromSelection()); data->enqueue_now_ = true; emit AddToPlaylist(data); } } void FileViewList::ShowInBrowser() { Utilities::OpenInFileBrowser(UrlListFromSelection()); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/fileviewlist.h000066400000000000000000000033731260417502300245110ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef FILEVIEWLIST_H #define FILEVIEWLIST_H #include #include class MimeData; class FileViewList : public QListView { Q_OBJECT public: FileViewList(QWidget* parent = nullptr); void mousePressEvent(QMouseEvent* e); signals: void AddToPlaylist(QMimeData* data); void CopyToLibrary(const QList& urls); void MoveToLibrary(const QList& urls); void CopyToDevice(const QList& urls); void Delete(const QStringList& filenames); void EditTags(const QList& urls); protected: void contextMenuEvent(QContextMenuEvent* e); private slots: void LoadSlot(); void AddToPlaylistSlot(); void OpenInNewPlaylistSlot(); void CopyToLibrarySlot(); void MoveToLibrarySlot(); void CopyToDeviceSlot(); void DeleteSlot(); void EditTagsSlot(); void ShowInBrowser(); QStringList FilenamesFromSelection() const; QList UrlListFromSelection() const; MimeData* MimeDataFromSelection() const; private: QMenu* menu_; QItemSelection menu_selection_; }; #endif // FILEVIEWLIST_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/forcescrollperpixel.cpp000066400000000000000000000027051260417502300264220ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "forcescrollperpixel.h" #include #include #include ForceScrollPerPixel::ForceScrollPerPixel(QAbstractItemView* item_view, QObject* parent) : QObject(parent), item_view_(item_view) { item_view_->installEventFilter(this); } bool ForceScrollPerPixel::eventFilter(QObject* object, QEvent* event) { if (object == item_view_ && event->type() != QEvent::Destroy && event->type() != QEvent::WinIdChange && event->type() != QEvent::AccessibilityPrepare) { item_view_->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); item_view_->verticalScrollBar()->setSingleStep(20); } return QObject::eventFilter(object, event); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/forcescrollperpixel.h000066400000000000000000000023471260417502300260710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef FORCESCROLLPERPIXEL_H #define FORCESCROLLPERPIXEL_H #include class QAbstractItemView; // Some KDE styles override the ScrollMode property of QAbstractItemViews. // This helper class forces the mode back to ScrollPerPixel. class ForceScrollPerPixel : public QObject { public: ForceScrollPerPixel(QAbstractItemView* item_view, QObject* parent = nullptr); protected: bool eventFilter(QObject* object, QEvent* event); private: QAbstractItemView* item_view_; }; #endif // FORCESCROLLPERPIXEL_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/freespacebar.cpp000066400000000000000000000156701260417502300247630ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "freespacebar.h" #include "core/utilities.h" #include #include const int FreeSpaceBar::kBarHeight = 20; const int FreeSpaceBar::kBarBorderRadius = 8; const int FreeSpaceBar::kMarkerSpacing = 32; const int FreeSpaceBar::kLabelBoxSize = 12; const int FreeSpaceBar::kLabelBoxPadding = 4; const int FreeSpaceBar::kLabelSpacing = 16; const QRgb FreeSpaceBar::kColorBg1 = qRgb(214, 207, 200); const QRgb FreeSpaceBar::kColorBg2 = qRgb(234, 226, 218); const QRgb FreeSpaceBar::kColorAdd1 = qRgb(136, 180, 229); const QRgb FreeSpaceBar::kColorAdd2 = qRgb(72, 146, 229); const QRgb FreeSpaceBar::kColorBar1 = qRgb(250, 148, 76); const QRgb FreeSpaceBar::kColorBar2 = qRgb(214, 102, 24); const QRgb FreeSpaceBar::kColorBorder = qRgb(174, 168, 162); FreeSpaceBar::FreeSpaceBar(QWidget* parent) : QWidget(parent), free_(100), additional_(0), total_(100), free_text_(tr("Available")), additional_text_(tr("New songs")), used_text_(tr("Used")) { setMinimumHeight(sizeHint().height()); } QSize FreeSpaceBar::sizeHint() const { return QSize(150, kBarHeight + kLabelBoxPadding + fontMetrics().height()); } void FreeSpaceBar::paintEvent(QPaintEvent*) { // Geometry QRect bar_rect(rect()); bar_rect.setHeight(kBarHeight); QRect reflection_rect(bar_rect); reflection_rect.moveTop(reflection_rect.bottom()); QRect labels_rect(rect()); labels_rect.setTop(labels_rect.top() + kBarHeight + kLabelBoxPadding); // Draw the reflection // Create the reflected pixmap QImage reflection(reflection_rect.size(), QImage::Format_ARGB32_Premultiplied); reflection.fill(palette().color(QPalette::Background).rgba()); QPainter p(&reflection); // Set up the transformation QTransform transform; transform.scale(1.0, -1.0); transform.translate(0.0, -reflection.height()); p.setTransform(transform); // Draw the bar DrawBar(&p, QRect(QPoint(0, 0), reflection.size())); // Make it fade out towards the bottom QLinearGradient fade_gradient(reflection.rect().topLeft(), reflection.rect().bottomLeft()); fade_gradient.setColorAt(0.0, QColor(0, 0, 0, 0)); fade_gradient.setColorAt(1.0, QColor(0, 0, 0, 128)); p.setCompositionMode(QPainter::CompositionMode_DestinationIn); p.fillRect(reflection.rect(), fade_gradient); p.end(); // Draw on the widget p.begin(this); DrawBar(&p, bar_rect); p.drawImage(reflection_rect, reflection); DrawText(&p, labels_rect); } void FreeSpaceBar::DrawBar(QPainter* p, const QRect& r) { p->setRenderHint(QPainter::Antialiasing, true); p->setRenderHint(QPainter::HighQualityAntialiasing, true); QRect bar_rect(r); bar_rect.setWidth(float(bar_rect.width()) * (float(total_ - free_) / total_)); QLinearGradient background_gradient(r.topLeft(), r.bottomLeft()); background_gradient.setColorAt(0, kColorBg1); background_gradient.setColorAt(1, kColorBg2); QLinearGradient bar_gradient(bar_rect.topLeft(), bar_rect.bottomLeft()); bar_gradient.setColorAt(0, kColorBar1); bar_gradient.setColorAt(1, kColorBar2); // Draw the background p->setPen(Qt::NoPen); p->setBrush(background_gradient); p->drawRoundedRect(r, kBarBorderRadius, kBarBorderRadius); // Create a path to use for clipping the bars QPainterPath clip_path; clip_path.addRoundedRect(r, kBarBorderRadius, kBarBorderRadius); p->setClipPath(clip_path); // Draw any additional space if (additional_) { QRect additional_rect(bar_rect); additional_rect.setLeft(bar_rect.right()); additional_rect.setWidth( float(r.width()) * (float(qMin(free_, additional_)) / total_) + 1); QLinearGradient additional_gradient(additional_rect.topLeft(), additional_rect.bottomLeft()); additional_gradient.setColorAt(0, kColorAdd1); additional_gradient.setColorAt(1, kColorAdd2); p->fillRect(additional_rect, additional_gradient); } // Draw the bar foreground p->fillRect(bar_rect, bar_gradient); // Draw a border p->setClipping(false); p->setPen(kColorBorder); p->setBrush(Qt::NoBrush); p->drawRoundedRect(r, kBarBorderRadius, kBarBorderRadius); // Draw marker lines over the top every few pixels p->setOpacity(0.35); p->setRenderHint(QPainter::Antialiasing, false); p->setPen(QPen(palette().color(QPalette::Light), 1.0)); for (int x = r.left() + kMarkerSpacing; x < r.right(); x += kMarkerSpacing) { p->drawLine(x, r.top() + 2, x, r.bottom() - 2); } p->setOpacity(1.0); } void FreeSpaceBar::DrawText(QPainter* p, const QRect& r) { QFont small_font(font()); small_font.setPointSize(small_font.pointSize() - 1); small_font.setBold(true); QFontMetrics small_metrics(small_font); p->setFont(small_font); // Work out the geometry for the text QList

" + tr("Open in your browser") + "

headers_; const int default_header_height_; int header_spacing_; int header_indent_; int item_indent_; QString header_text_; }; #endif // GROUPEDICONVIEW_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/lineedit.cpp000066400000000000000000000145121260417502300241300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "lineedit.h" #include #include #include #include #include #include ExtendedEditor::ExtendedEditor(QWidget* widget, int extra_right_padding, bool draw_hint) : LineEditInterface(widget), has_clear_button_(true), clear_button_(new QToolButton(widget)), reset_button_(new QToolButton(widget)), extra_right_padding_(extra_right_padding), draw_hint_(draw_hint), font_point_size_(widget->font().pointSizeF() - 1), is_rtl_(false) { clear_button_->setIcon(IconLoader::Load("edit-clear-locationbar-ltr")); clear_button_->setIconSize(QSize(16, 16)); clear_button_->setCursor(Qt::ArrowCursor); clear_button_->setStyleSheet("QToolButton { border: none; padding: 0px; }"); clear_button_->setToolTip(widget->tr("Clear")); clear_button_->setFocusPolicy(Qt::NoFocus); QStyleOption opt; opt.initFrom(widget); reset_button_->setIcon(widget->style()->standardIcon( QStyle::SP_DialogResetButton, &opt, widget)); reset_button_->setIconSize(QSize(16, 16)); reset_button_->setCursor(Qt::ArrowCursor); reset_button_->setStyleSheet("QToolButton { border: none; padding: 0px; }"); reset_button_->setToolTip(widget->tr("Reset")); reset_button_->setFocusPolicy(Qt::NoFocus); reset_button_->hide(); widget->connect(clear_button_, SIGNAL(clicked()), widget, SLOT(clear())); widget->connect(clear_button_, SIGNAL(clicked()), widget, SLOT(setFocus())); UpdateButtonGeometry(); } void ExtendedEditor::set_hint(const QString& hint) { hint_ = hint; widget_->update(); } void ExtendedEditor::set_clear_button(bool visible) { has_clear_button_ = visible; clear_button_->setVisible(visible); UpdateButtonGeometry(); } bool ExtendedEditor::has_reset_button() const { return reset_button_->isVisible(); } void ExtendedEditor::set_reset_button(bool visible) { reset_button_->setVisible(visible); UpdateButtonGeometry(); } void ExtendedEditor::UpdateButtonGeometry() { const int frame_width = widget_->style()->pixelMetric(QStyle::PM_DefaultFrameWidth); const int left = frame_width + 1 + (has_clear_button() ? clear_button_->sizeHint().width() : 0); const int right = frame_width + 1 + (has_reset_button() ? reset_button_->sizeHint().width() : 0); widget_->setStyleSheet( QString("QLineEdit { padding-left: %1px; padding-right: %2px; }") .arg(left) .arg(right)); QSize msz = widget_->minimumSizeHint(); widget_->setMinimumSize( msz.width() + (clear_button_->sizeHint().width() + frame_width + 1) * 2 + extra_right_padding_, qMax(msz.height(), clear_button_->sizeHint().height() + frame_width * 2 + 2)); } void ExtendedEditor::Paint(QPaintDevice* device) { if (!widget_->hasFocus() && is_empty() && !hint_.isEmpty()) { clear_button_->hide(); if (draw_hint_) { QPainter p(device); QFont font; font.setBold(false); font.setPointSizeF(font_point_size_); QFontMetrics m(font); const int kBorder = (device->height() - m.height()) / 2; p.setPen(widget_->palette().color(QPalette::Disabled, QPalette::Text)); p.setFont(font); QRect r(5, kBorder, device->width() - 10, device->height() - kBorder * 2); p.drawText(r, Qt::AlignLeft | Qt::AlignVCenter, m.elidedText(hint_, Qt::ElideRight, r.width())); } } else { clear_button_->setVisible(has_clear_button_); } } void ExtendedEditor::Resize() { const QSize sz = clear_button_->sizeHint(); const int frame_width = widget_->style()->pixelMetric(QStyle::PM_DefaultFrameWidth); const int y = (widget_->rect().height() - sz.height()) / 2; clear_button_->move(frame_width, y); if (!is_rtl_) { reset_button_->move( widget_->width() - frame_width - sz.width() - extra_right_padding_, y); } else { reset_button_->move((has_clear_button() ? sz.width() + 4 : 0) + frame_width, y); } } LineEdit::LineEdit(QWidget* parent) : QLineEdit(parent), ExtendedEditor(this) { connect(reset_button_, SIGNAL(clicked()), SIGNAL(Reset())); connect(this, SIGNAL(textChanged(QString)), SLOT(text_changed(QString))); } void LineEdit::text_changed(const QString& text) { if (text.isEmpty()) { // Consider empty string as LTR set_rtl(false); } else { // For some reason Qt will detect any text with LTR at the end as LTR, so // instead // compare only the first character set_rtl(QString(text.at(0)).isRightToLeft()); } Resize(); } void LineEdit::paintEvent(QPaintEvent* e) { QLineEdit::paintEvent(e); Paint(this); } void LineEdit::resizeEvent(QResizeEvent* e) { QLineEdit::resizeEvent(e); Resize(); } TextEdit::TextEdit(QWidget* parent) : QPlainTextEdit(parent), ExtendedEditor(this) { connect(reset_button_, SIGNAL(clicked()), SIGNAL(Reset())); connect(this, SIGNAL(textChanged()), viewport(), SLOT(update())); // To clear the hint } void TextEdit::paintEvent(QPaintEvent* e) { QPlainTextEdit::paintEvent(e); Paint(viewport()); } void TextEdit::resizeEvent(QResizeEvent* e) { QPlainTextEdit::resizeEvent(e); Resize(); } SpinBox::SpinBox(QWidget* parent) : QSpinBox(parent), ExtendedEditor(this, 14, false) { connect(reset_button_, SIGNAL(clicked()), SIGNAL(Reset())); } void SpinBox::paintEvent(QPaintEvent* e) { QSpinBox::paintEvent(e); Paint(this); } void SpinBox::resizeEvent(QResizeEvent* e) { QSpinBox::resizeEvent(e); Resize(); } QString SpinBox::textFromValue(int val) const { if (val <= 0 && !hint_.isEmpty()) return "-"; return QSpinBox::textFromValue(val); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/lineedit.h000066400000000000000000000117441260417502300236010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef LINEEDIT_H #define LINEEDIT_H #include #include #include #include "ui/iconloader.h" class QToolButton; class LineEditInterface { public: LineEditInterface(QWidget* widget) : widget_(widget) {} QWidget* widget() const { return widget_; } virtual ~LineEditInterface() {} virtual void clear() { set_text(QString()); } virtual void set_focus() = 0; virtual QString text() const = 0; virtual void set_text(const QString& text) = 0; virtual QString hint() const = 0; virtual void set_hint(const QString& hint) = 0; virtual void clear_hint() = 0; virtual void set_enabled(bool enabled) = 0; protected: QWidget* widget_; }; class ExtendedEditor : public LineEditInterface { public: ExtendedEditor(QWidget* widget, int extra_right_padding = 0, bool draw_hint = true); virtual ~ExtendedEditor() {} virtual bool is_empty() const { return text().isEmpty(); } QString hint() const { return hint_; } void set_hint(const QString& hint); void clear_hint() { set_hint(QString()); } bool has_clear_button() const { return has_clear_button_; } void set_clear_button(bool visible); bool has_reset_button() const; void set_reset_button(bool visible); qreal font_point_size() const { return font_point_size_; } void set_font_point_size(qreal size) { font_point_size_ = size; } protected: void Paint(QPaintDevice* device); void Resize(); private: void UpdateButtonGeometry(); protected: QString hint_; bool has_clear_button_; QToolButton* clear_button_; QToolButton* reset_button_; int extra_right_padding_; bool draw_hint_; qreal font_point_size_; bool is_rtl_; }; class LineEdit : public QLineEdit, public ExtendedEditor { Q_OBJECT Q_PROPERTY(QString hint READ hint WRITE set_hint); Q_PROPERTY(qreal font_point_size READ font_point_size WRITE set_font_point_size); Q_PROPERTY(bool has_clear_button READ has_clear_button WRITE set_clear_button); Q_PROPERTY(bool has_reset_button READ has_reset_button WRITE set_reset_button); public: LineEdit(QWidget* parent = nullptr); // ExtendedEditor void set_focus() { QLineEdit::setFocus(); } QString text() const { return QLineEdit::text(); } void set_text(const QString& text) { QLineEdit::setText(text); } void set_enabled(bool enabled) { QLineEdit::setEnabled(enabled); } protected: void paintEvent(QPaintEvent*); void resizeEvent(QResizeEvent*); private: bool is_rtl() const { return is_rtl_; } void set_rtl(bool rtl) { is_rtl_ = rtl; } private slots: void text_changed(const QString& text); signals: void Reset(); }; class TextEdit : public QPlainTextEdit, public ExtendedEditor { Q_OBJECT Q_PROPERTY(QString hint READ hint WRITE set_hint); Q_PROPERTY(bool has_clear_button READ has_clear_button WRITE set_clear_button); Q_PROPERTY(bool has_reset_button READ has_reset_button WRITE set_reset_button); public: TextEdit(QWidget* parent = nullptr); // ExtendedEditor void set_focus() { QPlainTextEdit::setFocus(); } QString text() const { return QPlainTextEdit::toPlainText(); } void set_text(const QString& text) { QPlainTextEdit::setPlainText(text); } void set_enabled(bool enabled) { QPlainTextEdit::setEnabled(enabled); } protected: void paintEvent(QPaintEvent*); void resizeEvent(QResizeEvent*); signals: void Reset(); }; class SpinBox : public QSpinBox, public ExtendedEditor { Q_OBJECT Q_PROPERTY(QString hint READ hint WRITE set_hint); Q_PROPERTY(bool has_clear_button READ has_clear_button WRITE set_clear_button); Q_PROPERTY(bool has_reset_button READ has_reset_button WRITE set_reset_button); public: SpinBox(QWidget* parent = nullptr); // QSpinBox QString textFromValue(int val) const; // ExtendedEditor bool is_empty() const { return text().isEmpty() || text() == "0"; } void set_focus() { QSpinBox::setFocus(); } QString text() const { return QSpinBox::text(); } void set_text(const QString& text) { QSpinBox::setValue(text.toInt()); } void set_enabled(bool enabled) { QSpinBox::setEnabled(enabled); } protected: void paintEvent(QPaintEvent*); void resizeEvent(QResizeEvent*); signals: void Reset(); }; #endif // LINEEDIT_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/linetextedit.cpp000066400000000000000000000030131260417502300250270ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "linetextedit.h" #include LineTextEdit::LineTextEdit(QWidget* parent) : QTextEdit(parent) { setWordWrapMode(QTextOption::NoWrap); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setTabChangesFocus(true); sizePolicy().setVerticalPolicy(QSizePolicy::Fixed); } QSize LineTextEdit::sizeHint() const { QFontMetrics fm(font()); static const int kMargin = 5; int h = 2 * kMargin + qMax(fm.height(), 14); int w = 2 * kMargin + fm.width("W") * 15; return QSize(w, h); } QSize LineTextEdit::minimumSizeHint() const { return sizeHint(); } void LineTextEdit::keyPressEvent(QKeyEvent* e) { if (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return) { e->ignore(); } else { QTextEdit::keyPressEvent(e); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/linetextedit.h000066400000000000000000000020241260417502300244750ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef LINETEXTEDIT_H #define LINETEXTEDIT_H #include class LineTextEdit : public QTextEdit { Q_OBJECT public: LineTextEdit(QWidget* parent = nullptr); QSize sizeHint() const; QSize minimumSizeHint() const; protected: void keyPressEvent(QKeyEvent* e); }; #endif // LINETEXTEDIT_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/loginstatewidget.cpp000066400000000000000000000102411260417502300257030ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "loginstatewidget.h" #include "ui_loginstatewidget.h" #include "ui/iconloader.h" #include #include #include #include LoginStateWidget::LoginStateWidget(QWidget* parent) : QWidget(parent), ui_(new Ui_LoginStateWidget), state_(LoggedOut) { ui_->setupUi(this); ui_->signed_in->hide(); ui_->expires->hide(); ui_->account_type->hide(); ui_->busy->hide(); ui_->sign_out->setIcon(IconLoader::Load("list-remove")); QFont bold_font(font()); bold_font.setBold(true); ui_->signed_out_label->setFont(bold_font); connect(ui_->sign_out, SIGNAL(clicked()), SLOT(Logout())); } LoginStateWidget::~LoginStateWidget() { delete ui_; } void LoginStateWidget::Logout() { SetLoggedIn(LoggedOut); emit LogoutClicked(); } void LoginStateWidget::SetAccountTypeText(const QString& text) { ui_->account_type_label->setText(text); } void LoginStateWidget::SetAccountTypeVisible(bool visible) { ui_->account_type->setVisible(visible); } void LoginStateWidget::SetLoggedIn(State state, const QString& account_name) { State last_state = state_; state_ = state; ui_->signed_in->setVisible(state == LoggedIn); ui_->signed_out->setVisible(state != LoggedIn); ui_->busy->setVisible(state == LoginInProgress); if (account_name.isEmpty()) ui_->signed_in_label->setText("" + tr("You are signed in.") + ""); else ui_->signed_in_label->setText( tr("You are signed in as %1.").arg("" + account_name + "")); for (QWidget* widget : credential_groups_) { widget->setVisible(state != LoggedIn); widget->setEnabled(state != LoginInProgress); } if (state == LoggedOut && last_state == LoginInProgress) { // A login just failed - give focus back to the last crediental field // (usually password). We have to do this after control gets back to the // event loop because the user might have just closed a dialog and our // widget might not be active yet. QTimer::singleShot(0, this, SLOT(FocusLastCredentialField())); } } void LoginStateWidget::FocusLastCredentialField() { if (!credential_fields_.isEmpty()) { QObject* object = credential_fields_.last(); QWidget* widget = qobject_cast(object); QLineEdit* line_edit = qobject_cast(object); if (widget) { widget->setFocus(); } if (line_edit) { line_edit->selectAll(); } } } void LoginStateWidget::HideLoggedInState() { ui_->signed_in->hide(); ui_->signed_out->hide(); } void LoginStateWidget::AddCredentialField(QWidget* widget) { widget->installEventFilter(this); credential_fields_ << widget; } void LoginStateWidget::AddCredentialGroup(QWidget* widget) { credential_groups_ << widget; } bool LoginStateWidget::eventFilter(QObject* object, QEvent* event) { if (!credential_fields_.contains(object)) return QWidget::eventFilter(object, event); if (event->type() == QEvent::KeyPress) { QKeyEvent* key_event = static_cast(event); if (key_event->key() == Qt::Key_Enter || key_event->key() == Qt::Key_Return) { emit LoginClicked(); return true; } } return QWidget::eventFilter(object, event); } void LoginStateWidget::SetExpires(const QDate& expires) { ui_->expires->setVisible(expires.isValid()); if (expires.isValid()) { const QString expires_text = expires.toString(Qt::SystemLocaleLongDate); ui_->expires_label->setText( tr("Expires on %1").arg("" + expires_text + "")); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/loginstatewidget.h000066400000000000000000000041651260417502300253600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef LOGINSTATEWIDGET_H #define LOGINSTATEWIDGET_H #include #include class Ui_LoginStateWidget; class LoginStateWidget : public QWidget { Q_OBJECT public: LoginStateWidget(QWidget* parent = nullptr); ~LoginStateWidget(); enum State { LoggedIn, LoginInProgress, LoggedOut }; // Installs an event handler on the field so that pressing enter will emit // LoginClicked() instead of doing the default action (closing the dialog). void AddCredentialField(QWidget* widget); // This widget (usually a QGroupBox) will be hidden when SetLoggedIn(true) // is called. void AddCredentialGroup(QWidget* widget); // QObject bool eventFilter(QObject* object, QEvent* event); public slots: // Changes the "You are logged in/out" label, shows/hides any QGroupBoxes // added with AddCredentialGroup. void SetLoggedIn(State state, const QString& account_name = QString::null); // Hides the "You are logged in/out" label completely. void HideLoggedInState(); void SetAccountTypeText(const QString& text); void SetAccountTypeVisible(bool visible); void SetExpires(const QDate& expires); signals: void LogoutClicked(); void LoginClicked(); private slots: void Logout(); void FocusLastCredentialField(); private: Ui_LoginStateWidget* ui_; State state_; QList credential_fields_; QList credential_groups_; }; #endif // LOGINSTATEWIDGET_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/loginstatewidget.ui000066400000000000000000000124551260417502300255470ustar00rootroot00000000000000 LoginStateWidget 0 0 526 187 Form 0 0 22 22 0 0 You are not signed in. true 0 22 22 :/icons/22x22/dialog-ok-apply.png 0 0 Qt::RichText true Sign out 0 22 22 :/icons/22x22/user-away.png 0 0 0 22 22 :/icons/22x22/dialog-warning.png Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop 0 0 true Signing in... BusyIndicator QWidget
widgets/busyindicator.h
1
clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/multiloadingindicator.cpp000066400000000000000000000055751260417502300267310ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "multiloadingindicator.h" #include "core/taskmanager.h" #include "widgets/busyindicator.h" #include #include const int MultiLoadingIndicator::kVerticalPadding = 4; const int MultiLoadingIndicator::kHorizontalPadding = 6; const int MultiLoadingIndicator::kSpacing = 6; MultiLoadingIndicator::MultiLoadingIndicator(QWidget* parent) : QWidget(parent), spinner_(new BusyIndicator(this)) { spinner_->move(kHorizontalPadding, kVerticalPadding); setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed); } QSize MultiLoadingIndicator::sizeHint() const { const int width = kHorizontalPadding * 2 + spinner_->sizeHint().width() + kSpacing + fontMetrics().width(text_); const int height = kVerticalPadding * 2 + qMax(spinner_->sizeHint().height(), fontMetrics().height()); return QSize(width, height); } void MultiLoadingIndicator::SetTaskManager(TaskManager* task_manager) { task_manager_ = task_manager; connect(task_manager_, SIGNAL(TasksChanged()), SLOT(UpdateText())); } void MultiLoadingIndicator::UpdateText() { QList tasks = task_manager_->GetTasks(); QStringList strings; for (const TaskManager::Task& task : tasks) { QString task_text(task.name); task_text[0] = task_text[0].toLower(); if (task.progress_max) { int percentage = float(task.progress) / task.progress_max * 100; task_text += QString(" %1%").arg(percentage); } strings << task_text; } text_ = strings.join(", "); if (!text_.isEmpty()) { text_[0] = text_[0].toUpper(); text_ += "..."; } emit TaskCountChange(tasks.count()); update(); updateGeometry(); } void MultiLoadingIndicator::paintEvent(QPaintEvent*) { QPainter p(this); const QRect text_rect( kHorizontalPadding + spinner_->sizeHint().width() + kSpacing, kVerticalPadding, width() - kHorizontalPadding * 2 - spinner_->sizeHint().width() - kSpacing, height() - kVerticalPadding * 2); p.drawText( text_rect, Qt::TextSingleLine | Qt::AlignLeft, fontMetrics().elidedText(text_, Qt::ElideRight, text_rect.width())); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/multiloadingindicator.h000066400000000000000000000026101260417502300263610ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MULTILOADINGINDICATOR_H #define MULTILOADINGINDICATOR_H #include class BusyIndicator; class TaskManager; class MultiLoadingIndicator : public QWidget { Q_OBJECT public: MultiLoadingIndicator(QWidget* parent = nullptr); static const int kVerticalPadding; static const int kHorizontalPadding; static const int kSpacing; void SetTaskManager(TaskManager* task_manager); QSize sizeHint() const; signals: void TaskCountChange(int tasks); protected: void paintEvent(QPaintEvent*); private slots: void UpdateText(); private: TaskManager* task_manager_; BusyIndicator* spinner_; QString text_; }; #endif // MULTILOADINGINDICATOR_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/nowplayingwidget.cpp000066400000000000000000000535471260417502300257410ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "fullscreenhypnotoad.h" #include "nowplayingwidget.h" #include "core/application.h" #include "covers/albumcoverloader.h" #include "covers/coverproviders.h" #include "covers/currentartloader.h" #include "covers/kittenloader.h" #include "library/librarybackend.h" #include "networkremote/networkremote.h" #include "ui/albumcoverchoicecontroller.h" #include "ui/iconloader.h" #include #include #include #include #include #include #include #include #include #include const char* NowPlayingWidget::kSettingsGroup = "NowPlayingWidget"; const char* NowPlayingWidget::kHypnotoadPath = ":/hypnotoad.gif"; // Space between the cover and the details in small mode const int NowPlayingWidget::kPadding = 2; // Width of the transparent to black gradient above and below the text in large // mode const int NowPlayingWidget::kGradientHead = 40; const int NowPlayingWidget::kGradientTail = 20; // Maximum height of the cover in large mode, and offset between the // bottom of the cover and bottom of the widget const int NowPlayingWidget::kMaxCoverSize = 260; const int NowPlayingWidget::kBottomOffset = 0; // Border for large mode const int NowPlayingWidget::kTopBorder = 4; NowPlayingWidget::NowPlayingWidget(QWidget* parent) : QWidget(parent), app_(nullptr), album_cover_choice_controller_(new AlbumCoverChoiceController(this)), mode_(SmallSongDetails), menu_(new QMenu(this)), above_statusbar_action_(nullptr), fit_cover_width_action_(nullptr), visible_(false), small_ideal_height_(0), fit_width_(false), show_hide_animation_(new QTimeLine(500, this)), fade_animation_(new QTimeLine(1000, this)), details_(new QTextDocument(this)), previous_track_opacity_(0.0), bask_in_his_glory_action_(nullptr), downloading_covers_(false), aww_(false), kittens_(nullptr), pending_kitten_(0) { // Load settings QSettings s; s.beginGroup(kSettingsGroup); mode_ = Mode(s.value("mode", SmallSongDetails).toInt()); album_cover_choice_controller_->search_cover_auto_action()->setChecked( s.value("search_for_cover_auto", false).toBool()); fit_width_ = s.value("fit_cover_width", false).toBool(); // Accept drops for setting album art setAcceptDrops(true); // Context menu QActionGroup* mode_group = new QActionGroup(this); QSignalMapper* mode_mapper = new QSignalMapper(this); connect(mode_mapper, SIGNAL(mapped(int)), SLOT(SetMode(int))); CreateModeAction(SmallSongDetails, tr("Small album cover"), mode_group, mode_mapper); CreateModeAction(LargeSongDetails, tr("Large album cover"), mode_group, mode_mapper); CreateModeAction(LargeSongDetailsBelow, tr("Large album cover (details below)"), mode_group, mode_mapper); CreateModeAction(LargeNoSongDetails, tr("Large album cover (no details)"), mode_group, mode_mapper); menu_->addActions(mode_group->actions()); fit_cover_width_action_ = menu_->addAction(tr("Fit cover to width")); fit_cover_width_action_->setCheckable(true); fit_cover_width_action_->setEnabled((mode_ != SmallSongDetails) ? true : false); connect(fit_cover_width_action_, SIGNAL(toggled(bool)), SLOT(FitCoverWidth(bool))); fit_cover_width_action_->setChecked(fit_width_); menu_->addSeparator(); QList actions = album_cover_choice_controller_->GetAllActions(); // Here we add the search automatically action, too! actions.append(album_cover_choice_controller_->search_cover_auto_action()); connect(album_cover_choice_controller_->cover_from_file_action(), SIGNAL(triggered()), this, SLOT(LoadCoverFromFile())); connect(album_cover_choice_controller_->cover_to_file_action(), SIGNAL(triggered()), this, SLOT(SaveCoverToFile())); connect(album_cover_choice_controller_->cover_from_url_action(), SIGNAL(triggered()), this, SLOT(LoadCoverFromURL())); connect(album_cover_choice_controller_->search_for_cover_action(), SIGNAL(triggered()), this, SLOT(SearchForCover())); connect(album_cover_choice_controller_->unset_cover_action(), SIGNAL(triggered()), this, SLOT(UnsetCover())); connect(album_cover_choice_controller_->show_cover_action(), SIGNAL(triggered()), this, SLOT(ShowCover())); connect(album_cover_choice_controller_->search_cover_auto_action(), SIGNAL(triggered()), this, SLOT(SearchCoverAutomatically())); menu_->addActions(actions); menu_->addSeparator(); above_statusbar_action_ = menu_->addAction(tr("Show above status bar")); above_statusbar_action_->setCheckable(true); connect(above_statusbar_action_, SIGNAL(toggled(bool)), SLOT(ShowAboveStatusBar(bool))); above_statusbar_action_->setChecked( s.value("above_status_bar", false).toBool()); bask_in_his_glory_action_ = menu_->addAction(tr("ALL GLORY TO THE HYPNOTOAD")); bask_in_his_glory_action_->setVisible(false); connect(bask_in_his_glory_action_, SIGNAL(triggered()), SLOT(Bask())); // Animations connect(show_hide_animation_, SIGNAL(frameChanged(int)), SLOT(SetHeight(int))); setMaximumHeight(0); connect(fade_animation_, SIGNAL(valueChanged(qreal)), SLOT(FadePreviousTrack(qreal))); fade_animation_->setDirection(QTimeLine::Backward); // 1.0 -> 0.0 // add placeholder text to get the correct height if (mode_ == LargeSongDetailsBelow) { details_->setDefaultStyleSheet( "p {" " font-size: small;" " color: white;" "}"); details_->setHtml(QString("



")); } UpdateHeight(); connect(album_cover_choice_controller_, SIGNAL(AutomaticCoverSearchDone()), this, SLOT(AutomaticCoverSearchDone())); } NowPlayingWidget::~NowPlayingWidget() {} void NowPlayingWidget::SetApplication(Application* app) { app_ = app; album_cover_choice_controller_->SetApplication(app_); connect(app_->current_art_loader(), SIGNAL(ArtLoaded(Song, QString, QImage)), SLOT(AlbumArtLoaded(Song, QString, QImage))); } void NowPlayingWidget::CreateModeAction(Mode mode, const QString& text, QActionGroup* group, QSignalMapper* mapper) { QAction* action = new QAction(text, group); action->setCheckable(true); mapper->setMapping(action, mode); connect(action, SIGNAL(triggered()), mapper, SLOT(map())); if (mode == mode_) action->setChecked(true); } void NowPlayingWidget::set_ideal_height(int height) { small_ideal_height_ = height; UpdateHeight(); } QSize NowPlayingWidget::sizeHint() const { return QSize(cover_loader_options_.desired_height_, total_height_); } void NowPlayingWidget::UpdateHeight() { switch (mode_) { case SmallSongDetails: cover_loader_options_.desired_height_ = small_ideal_height_; total_height_ = small_ideal_height_; break; case LargeSongDetails: case LargeNoSongDetails: if (fit_width_) { cover_loader_options_.desired_height_ = width(); } else { cover_loader_options_.desired_height_ = qMin(kMaxCoverSize, width()); } total_height_ = kTopBorder + cover_loader_options_.desired_height_ + kBottomOffset; break; case LargeSongDetailsBelow: if (fit_width_) { cover_loader_options_.desired_height_ = width(); } else { cover_loader_options_.desired_height_ = qMin(kMaxCoverSize, width()); } total_height_ = kTopBorder + cover_loader_options_.desired_height_ + kBottomOffset + details_->size().height(); break; } // Update the animation settings and resize the widget now if we're visible show_hide_animation_->setFrameRange(0, total_height_); if (visible_ && show_hide_animation_->state() != QTimeLine::Running) setMaximumHeight(total_height_); // Re-scale the current image if (metadata_.is_valid()) { ScaleCover(); } // Tell Qt we've changed size updateGeometry(); } void NowPlayingWidget::Stopped() { SetVisible(false); } void NowPlayingWidget::UpdateDetailsText() { QString html; switch (mode_) { case SmallSongDetails: case LargeNoSongDetails: details_->setTextWidth(-1); details_->setDefaultStyleSheet(""); html += "

"; break; case LargeSongDetails: details_->setTextWidth(cover_loader_options_.desired_height_); details_->setDefaultStyleSheet( "p {" " font-size: small;" " color: white;" "}"); html += "

"; break; case LargeSongDetailsBelow: details_->setTextWidth(cover_loader_options_.desired_height_); if (fit_width_) { details_->setDefaultStyleSheet( "p {" " font-size: small;" "}"); } else { details_->setDefaultStyleSheet( "p {" " font-size: small;" " color: white;" "}"); } html += "

"; break; } // TODO: Make this configurable html += QString("%1
%2
%3").arg( Qt::escape(metadata_.PrettyTitle()), Qt::escape(metadata_.artist()), Qt::escape(metadata_.album())); html += "

"; details_->setHtml(html); // if something spans multiple lines the height needs to change if (mode_ == LargeSongDetailsBelow) { UpdateHeight(); } } void NowPlayingWidget::ScaleCover() { cover_ = QPixmap::fromImage( AlbumCoverLoader::ScaleAndPad(cover_loader_options_, original_)); update(); } void NowPlayingWidget::KittenLoaded(quint64 id, const QImage& image) { if (aww_ && pending_kitten_ == id) { SetImage(image); } } void NowPlayingWidget::AlbumArtLoaded(const Song& metadata, const QString& uri, const QImage& image) { metadata_ = metadata; downloading_covers_ = false; if (aww_) { pending_kitten_ = kittens_->LoadKitten(app_->current_art_loader()->options()); return; } SetImage(image); // Search for cover automatically? GetCoverAutomatically(); } void NowPlayingWidget::SetImage(const QImage& image) { if (visible_) { // Cache the current pixmap so we can fade between them previous_track_ = QPixmap(size()); previous_track_.fill(palette().background().color()); previous_track_opacity_ = 1.0; QPainter p(&previous_track_); DrawContents(&p); p.end(); } original_ = image; UpdateDetailsText(); ScaleCover(); SetVisible(true); // Were we waiting for this cover to load before we started fading? if (!previous_track_.isNull()) { fade_animation_->start(); } } void NowPlayingWidget::SetHeight(int height) { setMaximumHeight(height); } void NowPlayingWidget::SetVisible(bool visible) { if (visible == visible_) return; visible_ = visible; show_hide_animation_->setDirection(visible ? QTimeLine::Forward : QTimeLine::Backward); show_hide_animation_->start(); } void NowPlayingWidget::paintEvent(QPaintEvent* e) { QPainter p(this); DrawContents(&p); // Draw the previous track's image if we're fading if (!previous_track_.isNull()) { p.setOpacity(previous_track_opacity_); p.drawPixmap(0, 0, previous_track_); } } void NowPlayingWidget::DrawContents(QPainter* p) { switch (mode_) { case SmallSongDetails: if (hypnotoad_) { p->drawPixmap(0, 0, small_ideal_height_, small_ideal_height_, hypnotoad_->currentPixmap()); } else { // Draw the cover p->drawPixmap(0, 0, small_ideal_height_, small_ideal_height_, cover_); if (downloading_covers_) { p->drawPixmap(small_ideal_height_ - 18, 6, 16, 16, spinner_animation_->currentPixmap()); } } // Draw the details p->translate(small_ideal_height_ + kPadding, 0); details_->drawContents(p); p->translate(-small_ideal_height_ - kPadding, 0); break; case LargeSongDetails: { const int total_size = fit_width_ ? width() : qMin(kMaxCoverSize, width()); const int x_offset = (width() - cover_loader_options_.desired_height_) / 2; // Draw the black background p->fillRect(QRect(0, kTopBorder, width(), height() - kTopBorder), Qt::black); // Draw the cover if (hypnotoad_) { p->drawPixmap(x_offset, kTopBorder, total_size, total_size, hypnotoad_->currentPixmap()); } else { p->drawPixmap(x_offset, kTopBorder, total_size, total_size, cover_); if (downloading_covers_) { p->drawPixmap(x_offset + 45, 35, 16, 16, spinner_animation_->currentPixmap()); } } // Work out how high the text is going to be const int text_height = details_->size().height(); const int gradient_mid = height() - qMax(text_height, kBottomOffset); // Draw the black fade QLinearGradient gradient(0, gradient_mid - kGradientHead, 0, gradient_mid + kGradientTail); gradient.setColorAt(0, QColor(0, 0, 0, 0)); gradient.setColorAt(1, QColor(0, 0, 0, 255)); p->fillRect(0, gradient_mid - kGradientHead, width(), height() - (gradient_mid - kGradientHead), gradient); // Draw the text on top p->translate(x_offset, height() - text_height); details_->drawContents(p); p->translate(-x_offset, -height() + text_height); break; } case LargeNoSongDetails: { const int total_size = fit_width_ ? width() : qMin(kMaxCoverSize, width()); const int x_offset = (width() - cover_loader_options_.desired_height_) / 2; // Draw the black background p->fillRect(QRect(0, kTopBorder, width(), height() - kTopBorder), Qt::black); // Draw the cover if (hypnotoad_) { p->drawPixmap(x_offset, kTopBorder, total_size, total_size, hypnotoad_->currentPixmap()); } else { p->drawPixmap(x_offset, kTopBorder, total_size, total_size, cover_); if (downloading_covers_) { p->drawPixmap(x_offset + 45, 35, 16, 16, spinner_animation_->currentPixmap()); } } break; } case LargeSongDetailsBelow: // Work out how high the text is going to be const int text_height = details_->size().height(); const int cover_size = fit_width_ ? width() : qMin(kMaxCoverSize, width()); const int x_offset = (width() - cover_loader_options_.desired_height_) / 2; if (!fit_width_) { // Draw the black background p->fillRect(QRect(0, kTopBorder, width(), height() - kTopBorder), Qt::black); } // Draw the cover if (hypnotoad_) { p->drawPixmap(x_offset, kTopBorder, cover_size, cover_size, hypnotoad_->currentPixmap()); } else { p->drawPixmap(x_offset, kTopBorder, cover_size, cover_size, cover_); if (downloading_covers_) { p->drawPixmap(x_offset + 45, 35, 16, 16, spinner_animation_->currentPixmap()); } } // Draw the text below p->translate(x_offset, height() - text_height); details_->drawContents(p); p->translate(-x_offset, -height() + text_height); break; } } void NowPlayingWidget::FadePreviousTrack(qreal value) { previous_track_opacity_ = value; if (qFuzzyCompare(previous_track_opacity_, qreal(0.0))) { previous_track_ = QPixmap(); } update(); } void NowPlayingWidget::SetMode(int mode) { mode_ = Mode(mode); if (mode_ == SmallSongDetails) { fit_cover_width_action_->setEnabled(false); } else { fit_cover_width_action_->setEnabled(true); } UpdateHeight(); UpdateDetailsText(); update(); QSettings s; s.beginGroup(kSettingsGroup); s.setValue("mode", mode_); } void NowPlayingWidget::resizeEvent(QResizeEvent* e) { if (visible_ && e->oldSize() != e->size()) { if (mode_ == LargeSongDetails || mode_ == LargeNoSongDetails || mode_ == LargeSongDetailsBelow) { UpdateHeight(); UpdateDetailsText(); } } } void NowPlayingWidget::contextMenuEvent(QContextMenuEvent* e) { // initial 'enabled' values depending on the kitty mode album_cover_choice_controller_->cover_from_file_action()->setEnabled(!aww_); album_cover_choice_controller_->cover_from_url_action()->setEnabled(!aww_); album_cover_choice_controller_->search_for_cover_action()->setEnabled( !aww_ && app_->cover_providers()->HasAnyProviders()); album_cover_choice_controller_->unset_cover_action()->setEnabled(!aww_); album_cover_choice_controller_->show_cover_action()->setEnabled(!aww_); // some special cases if (!aww_) { const bool art_is_not_set = metadata_.has_manually_unset_cover() || (metadata_.art_automatic().isEmpty() && metadata_.art_manual().isEmpty()); album_cover_choice_controller_->unset_cover_action()->setEnabled( !art_is_not_set); album_cover_choice_controller_->show_cover_action()->setEnabled( !art_is_not_set); } bask_in_his_glory_action_->setVisible(static_cast(hypnotoad_)); // show the menu menu_->popup(mapToGlobal(e->pos())); } void NowPlayingWidget::mouseReleaseEvent(QMouseEvent* e) { // Same behaviour as right-click > Show Fullsize if (e->button() == Qt::LeftButton && !aww_ && !hypnotoad_.get()) { ShowCover(); } } void NowPlayingWidget::ShowAboveStatusBar(bool above) { QSettings s; s.beginGroup(kSettingsGroup); s.setValue("above_status_bar", above); emit ShowAboveStatusBarChanged(above); } bool NowPlayingWidget::show_above_status_bar() const { return above_statusbar_action_->isChecked(); } void NowPlayingWidget::FitCoverWidth(bool fit) { fit_width_ = fit; UpdateHeight(); update(); QSettings s; s.beginGroup(kSettingsGroup); s.setValue("fit_cover_width", fit_width_); } void NowPlayingWidget::AllHail(bool hypnotoad) { if (hypnotoad) { hypnotoad_.reset(new QMovie(kHypnotoadPath, QByteArray(), this)); connect(hypnotoad_.get(), SIGNAL(updated(const QRect&)), SLOT(update())); hypnotoad_->start(); update(); } else { hypnotoad_.reset(); update(); } } void NowPlayingWidget::EnableKittens(bool aww) { if (!kittens_ && aww) { kittens_ = new KittenLoader(this); app_->MoveToNewThread(kittens_); connect(kittens_, SIGNAL(ImageLoaded(quint64, QImage)), SLOT(KittenLoaded(quint64, QImage))); connect(kittens_, SIGNAL(ImageLoaded(quint64, QImage)), app_->network_remote(), SLOT(SendKitten(quint64, QImage))); } aww_ = aww; } void NowPlayingWidget::LoadCoverFromFile() { album_cover_choice_controller_->LoadCoverFromFile(&metadata_); } void NowPlayingWidget::LoadCoverFromURL() { album_cover_choice_controller_->LoadCoverFromURL(&metadata_); } void NowPlayingWidget::SearchForCover() { album_cover_choice_controller_->SearchForCover(&metadata_); } void NowPlayingWidget::SaveCoverToFile() { album_cover_choice_controller_->SaveCoverToFile(metadata_, original_); } void NowPlayingWidget::UnsetCover() { album_cover_choice_controller_->UnsetCover(&metadata_); } void NowPlayingWidget::ShowCover() { album_cover_choice_controller_->ShowCover(metadata_); } void NowPlayingWidget::SearchCoverAutomatically() { QSettings s; s.beginGroup(kSettingsGroup); s.setValue( "search_for_cover_auto", album_cover_choice_controller_->search_cover_auto_action()->isChecked()); // Search for cover automatically? GetCoverAutomatically(); } void NowPlayingWidget::Bask() { QDesktopWidget desktop; int current_screen = desktop.screenNumber(this); big_hypnotoad_.reset(new FullscreenHypnotoad); big_hypnotoad_->setGeometry(desktop.screenGeometry(current_screen)); big_hypnotoad_->showFullScreen(); } void NowPlayingWidget::dragEnterEvent(QDragEnterEvent* e) { if (AlbumCoverChoiceController::CanAcceptDrag(e)) { e->acceptProposedAction(); } QWidget::dragEnterEvent(e); } void NowPlayingWidget::dropEvent(QDropEvent* e) { album_cover_choice_controller_->SaveCover(&metadata_, e); QWidget::dropEvent(e); } bool NowPlayingWidget::GetCoverAutomatically() { // Search for cover automatically? bool search = album_cover_choice_controller_->search_cover_auto_action()->isChecked() && !metadata_.has_manually_unset_cover() && metadata_.art_automatic().isEmpty() && metadata_.art_manual().isEmpty() && !metadata_.artist().isEmpty() && !metadata_.album().isEmpty(); if (search) { qLog(Debug) << "GetCoverAutomatically"; downloading_covers_ = true; album_cover_choice_controller_->SearchCoverAutomatically(metadata_); // Show a spinner animation spinner_animation_.reset(new QMovie(":/spinner.gif", QByteArray(), this)); connect(spinner_animation_.get(), SIGNAL(updated(const QRect&)), SLOT(update())); spinner_animation_->start(); update(); } return search; } void NowPlayingWidget::AutomaticCoverSearchDone() { downloading_covers_ = false; spinner_animation_.reset(); update(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/nowplayingwidget.h000066400000000000000000000101051260417502300253650ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef NOWPLAYINGWIDGET_H #define NOWPLAYINGWIDGET_H #include #include #include "core/song.h" #include "covers/albumcoverloaderoptions.h" class AlbumCoverChoiceController; class Application; class FullscreenHypnotoad; class KittenLoader; class QAction; class QActionGroup; class QMenu; class QMovie; class QSignalMapper; class QTextDocument; class QTimeLine; class NowPlayingWidget : public QWidget { Q_OBJECT public: NowPlayingWidget(QWidget* parent = nullptr); ~NowPlayingWidget(); static const char* kSettingsGroup; static const int kPadding; static const int kGradientHead; static const int kGradientTail; static const int kMaxCoverSize; static const int kBottomOffset; static const int kTopBorder; // Values are saved in QSettings enum Mode { SmallSongDetails = 0, LargeSongDetails = 1, LargeSongDetailsBelow = 2, LargeNoSongDetails = 3, }; void SetApplication(Application* app); void set_ideal_height(int height); bool show_above_status_bar() const; QSize sizeHint() const; signals: void ShowAboveStatusBarChanged(bool above); public slots: void Stopped(); void AllHail(bool hypnotoad); void EnableKittens(bool aww); protected: void paintEvent(QPaintEvent* e); void resizeEvent(QResizeEvent*); void contextMenuEvent(QContextMenuEvent* e); void mouseReleaseEvent(QMouseEvent*); void dragEnterEvent(QDragEnterEvent* e); void dropEvent(QDropEvent* e); private slots: void SetMode(int mode); void ShowAboveStatusBar(bool above); void FitCoverWidth(bool fit); void AlbumArtLoaded(const Song& metadata, const QString& uri, const QImage& image); void KittenLoaded(quint64 id, const QImage& image); void SetVisible(bool visible); void SetHeight(int height); void FadePreviousTrack(qreal value); void LoadCoverFromFile(); void SaveCoverToFile(); void LoadCoverFromURL(); void SearchForCover(); void UnsetCover(); void ShowCover(); void SearchCoverAutomatically(); void Bask(); void AutomaticCoverSearchDone(); private: void CreateModeAction(Mode mode, const QString& text, QActionGroup* group, QSignalMapper* mapper); void UpdateDetailsText(); void UpdateHeight(); void DrawContents(QPainter* p); void SetImage(const QImage& image); void ScaleCover(); bool GetCoverAutomatically(); private: Application* app_; AlbumCoverChoiceController* album_cover_choice_controller_; Mode mode_; QMenu* menu_; QAction* above_statusbar_action_; QAction* fit_cover_width_action_; bool visible_; int small_ideal_height_; AlbumCoverLoaderOptions cover_loader_options_; int total_height_; bool fit_width_; QTimeLine* show_hide_animation_; QTimeLine* fade_animation_; // Information about the current track Song metadata_; QPixmap cover_; // A copy of the original, unscaled album cover. QImage original_; QTextDocument* details_; // Holds the last track while we're fading to the new track QPixmap previous_track_; qreal previous_track_opacity_; static const char* kHypnotoadPath; QAction* bask_in_his_glory_action_; std::unique_ptr hypnotoad_; std::unique_ptr big_hypnotoad_; std::unique_ptr spinner_animation_; bool downloading_covers_; bool aww_; KittenLoader* kittens_; quint64 pending_kitten_; }; #endif // NOWPLAYINGWIDGET_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/osd.cpp000066400000000000000000000311701260417502300231170ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "config.h" #include "core/application.h" #include "core/logging.h" #include "covers/currentartloader.h" #include "osd.h" #include "osdpretty.h" #include "ui/systemtrayicon.h" #ifdef HAVE_DBUS #include "dbus/notification.h" #endif #include #include #include const char* OSD::kSettingsGroup = "OSD"; OSD::OSD(SystemTrayIcon* tray_icon, Application* app, QObject* parent) : QObject(parent), tray_icon_(tray_icon), app_(app), timeout_msec_(5000), behaviour_(Native), show_on_volume_change_(false), show_art_(true), show_on_play_mode_change_(true), show_on_pause_(true), use_custom_text_(false), custom_text1_(QString()), custom_text2_(QString()), preview_mode_(false), force_show_next_(false), ignore_next_stopped_(false), pretty_popup_(new OSDPretty(OSDPretty::Mode_Popup)) { connect(app_->current_art_loader(), SIGNAL(ThumbnailLoaded(Song, QString, QImage)), SLOT(AlbumArtLoaded(Song, QString, QImage))); ReloadSettings(); Init(); } OSD::~OSD() { delete pretty_popup_; } void OSD::ReloadSettings() { QSettings s; s.beginGroup(kSettingsGroup); behaviour_ = OSD::Behaviour(s.value("Behaviour", Native).toInt()); timeout_msec_ = s.value("Timeout", 5000).toInt(); show_on_volume_change_ = s.value("ShowOnVolumeChange", false).toBool(); show_art_ = s.value("ShowArt", true).toBool(); show_on_play_mode_change_ = s.value("ShowOnPlayModeChange", true).toBool(); show_on_pause_ = s.value("ShowOnPausePlayback", true).toBool(); use_custom_text_ = s.value(("CustomTextEnabled"), false).toBool(); custom_text1_ = s.value("CustomText1").toString(); custom_text2_ = s.value("CustomText2").toString(); if (!SupportsNativeNotifications() && behaviour_ == Native) behaviour_ = Pretty; if (!SupportsTrayPopups() && behaviour_ == TrayPopup) behaviour_ = Disabled; ReloadPrettyOSDSettings(); } // Reload just Pretty OSD settings, not everything void OSD::ReloadPrettyOSDSettings() { pretty_popup_->set_popup_duration(timeout_msec_); pretty_popup_->ReloadSettings(); } void OSD::ReshowCurrentSong() { force_show_next_ = true; AlbumArtLoaded(last_song_, last_image_uri_, last_image_); } void OSD::AlbumArtLoaded(const Song& song, const QString& uri, const QImage& image) { // Don't change tray icon details if it's a preview if (!preview_mode_) { tray_icon_->SetNowPlaying(song, uri); } last_song_ = song; last_image_ = image; last_image_uri_ = uri; QStringList message_parts; QString summary; if (!use_custom_text_) { summary = song.PrettyTitle(); if (!song.artist().isEmpty()) summary = QString("%1 - %2").arg(song.artist(), summary); if (!song.album().isEmpty()) message_parts << song.album(); if (song.disc() > 0) message_parts << tr("disc %1").arg(song.disc()); if (song.track() > 0) message_parts << tr("track %1").arg(song.track()); } else { QRegExp variable_replacer("[%][a-z]+[%]"); summary = custom_text1_; QString message(custom_text2_); // Replace the first line int pos = 0; variable_replacer.indexIn(custom_text1_); while ((pos = variable_replacer.indexIn(custom_text1_, pos)) != -1) { QStringList captured = variable_replacer.capturedTexts(); summary.replace(captured[0], ReplaceVariable(captured[0], song)); pos += variable_replacer.matchedLength(); } // Replace the second line pos = 0; variable_replacer.indexIn(custom_text2_); while ((pos = variable_replacer.indexIn(custom_text2_, pos)) != -1) { QStringList captured = variable_replacer.capturedTexts(); message.replace(captured[0], ReplaceVariable(captured[0], song)); pos += variable_replacer.matchedLength(); } message_parts << message; } if (show_art_) { ShowMessage(summary, message_parts.join(", "), "notification-audio-play", image); } else { ShowMessage(summary, message_parts.join(", "), "notification-audio-play", QImage()); } // Reload the saved settings if they were changed for preview if (preview_mode_) { ReloadSettings(); preview_mode_ = false; } } void OSD::Paused() { if (show_on_pause_) { ShowMessage(QCoreApplication::applicationName(), tr("Paused")); } } void OSD::Stopped() { tray_icon_->ClearNowPlaying(); if (ignore_next_stopped_) { ignore_next_stopped_ = false; return; } ShowMessage(QCoreApplication::applicationName(), tr("Stopped")); } void OSD::StopAfterToggle(bool stop) { ShowMessage( QCoreApplication::applicationName(), tr("Stop playing after track: %1").arg(stop ? tr("On") : tr("Off"))); } void OSD::PlaylistFinished() { // We get a PlaylistFinished followed by a Stopped from the player ignore_next_stopped_ = true; ShowMessage(QCoreApplication::applicationName(), tr("Playlist finished")); } void OSD::VolumeChanged(int value) { if (!show_on_volume_change_) return; ShowMessage(QCoreApplication::applicationName(), tr("Volume %1%").arg(value)); } void OSD::MagnatuneDownloadFinished(const QStringList& albums) { QString message; if (albums.count() == 1) message = albums[0]; else message = tr("%1 albums").arg(albums.count()); ShowMessage(tr("Magnatune download finished"), message, QString(), QImage(":/providers/magnatune.png")); } void OSD::ShowMessage(const QString& summary, const QString& message, const QString& icon, const QImage& image) { if (pretty_popup_->toggle_mode()) { pretty_popup_->ShowMessage(summary, message, image); } else { switch (behaviour_) { case Native: if (image.isNull()) { ShowMessageNative(summary, message, icon, QImage()); } else { ShowMessageNative(summary, message, QString(), image); } break; #ifndef Q_OS_DARWIN case TrayPopup: tray_icon_->ShowPopup(summary, message, timeout_msec_); break; #endif case Disabled: if (!force_show_next_) break; force_show_next_ = false; // fallthrough case Pretty: pretty_popup_->ShowMessage(summary, message, image); break; default: break; } } } #ifndef HAVE_DBUS void OSD::CallFinished(QDBusPendingCallWatcher*) {} #endif #ifdef HAVE_WIIMOTEDEV void OSD::WiiremoteActived(int id) { ShowMessage(QString(tr("%1: Wiimotedev module")) .arg(QCoreApplication::applicationName()), tr("Wii Remote %1: actived").arg(QString::number(id))); } void OSD::WiiremoteDeactived(int id) { ShowMessage(QString(tr("%1: Wiimotedev module")) .arg(QCoreApplication::applicationName()), tr("Wii Remote %1: disactived").arg(QString::number(id))); } void OSD::WiiremoteConnected(int id) { ShowMessage(QString(tr("%1: Wiimotedev module")) .arg(QCoreApplication::applicationName()), tr("Wii Remote %1: connected").arg(QString::number(id))); } void OSD::WiiremoteDisconnected(int id) { ShowMessage(QString(tr("%1: Wiimotedev module")) .arg(QCoreApplication::applicationName()), tr("Wii Remote %1: disconnected").arg(QString::number(id))); } void OSD::WiiremoteLowBattery(int id, int live) { ShowMessage(QString(tr("%1: Wiimotedev module")) .arg(QCoreApplication::applicationName()), tr("Wii Remote %1: low battery (%2%)") .arg(QString::number(id), QString::number(live))); } void OSD::WiiremoteCriticalBattery(int id, int live) { ShowMessage(QString(tr("%1: Wiimotedev module")) .arg(QCoreApplication::applicationName()), tr("Wii Remote %1: critical battery (%2%) ") .arg(QString::number(id), QString::number(live))); } #endif void OSD::ShuffleModeChanged(PlaylistSequence::ShuffleMode mode) { if (show_on_play_mode_change_) { QString current_mode = QString(); switch (mode) { case PlaylistSequence::Shuffle_Off: current_mode = tr("Don't shuffle"); break; case PlaylistSequence::Shuffle_All: current_mode = tr("Shuffle all"); break; case PlaylistSequence::Shuffle_InsideAlbum: current_mode = tr("Shuffle tracks in this album"); break; case PlaylistSequence::Shuffle_Albums: current_mode = tr("Shuffle albums"); break; } ShowMessage(QCoreApplication::applicationName(), current_mode); } } void OSD::RepeatModeChanged(PlaylistSequence::RepeatMode mode) { if (show_on_play_mode_change_) { QString current_mode = QString(); switch (mode) { case PlaylistSequence::Repeat_Off: current_mode = tr("Don't repeat"); break; case PlaylistSequence::Repeat_Track: current_mode = tr("Repeat track"); break; case PlaylistSequence::Repeat_Album: current_mode = tr("Repeat album"); break; case PlaylistSequence::Repeat_Playlist: current_mode = tr("Repeat playlist"); break; case PlaylistSequence::Repeat_OneByOne: current_mode = tr("Stop after every track"); break; case PlaylistSequence::Repeat_Intro: current_mode = tr("Intro tracks"); break; } ShowMessage(QCoreApplication::applicationName(), current_mode); } } QString OSD::ReplaceVariable(const QString& variable, const Song& song) { QString return_value; if (variable == "%artist%") { return song.artist(); } else if (variable == "%album%") { return song.album(); } else if (variable == "%title%") { return song.PrettyTitle(); } else if (variable == "%albumartist%") { return song.effective_albumartist(); } else if (variable == "%year%") { return song.PrettyYear(); } else if (variable == "%composer%") { return song.composer(); } else if (variable == "%performer%") { return song.performer(); } else if (variable == "%grouping%") { return song.grouping(); } else if (variable == "%lyrics%") { return song.lyrics(); } else if (variable == "%length%") { return song.PrettyLength(); } else if (variable == "%disc%") { return return_value.setNum(song.disc()); } else if (variable == "%track%") { return return_value.setNum(song.track()); } else if (variable == "%genre%") { return song.genre(); } else if (variable == "%playcount%") { return return_value.setNum(song.playcount()); } else if (variable == "%skipcount%") { return return_value.setNum(song.skipcount()); } else if (variable == "%filename%") { return song.basefilename(); } else if (variable == "%rating%") { return song.PrettyRating(); } else if (variable == "%score%") { return QString::number(song.score()); } else if (variable == "%newline%") { // We need different strings depending on notification type switch (behaviour_) { case Native: #ifdef Q_OS_DARWIN return "\n"; #endif #ifdef Q_OS_LINUX return "
"; #endif #ifdef Q_OS_WIN32 // Other OS don't support native notifications qLog(Debug) << "New line not supported by this notification type under Windows"; return ""; #endif case TrayPopup: qLog(Debug) << "New line not supported by this notification type"; return ""; case Pretty: default: // When notifications are disabled, we force the PrettyOSD return "
"; } } // if the variable is not recognized, just return it return variable; } void OSD::ShowPreview(const Behaviour type, const QString& line1, const QString& line2, const Song& song) { behaviour_ = type; custom_text1_ = line1; custom_text2_ = line2; if (!use_custom_text_) use_custom_text_ = true; // We want to reload the settings, but we can't do this here because the cover // art loading is asynch preview_mode_ = true; AlbumArtLoaded(song, QString(), QImage()); } void OSD::SetPrettyOSDToggleMode(bool toggle) { pretty_popup_->set_toggle_mode(toggle); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/osd.h000066400000000000000000000074241260417502300225710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef OSD_H #define OSD_H #include #include #include #include #include "config.h" #include "engines/engine_fwd.h" #include "core/song.h" #include "playlist/playlistsequence.h" class Application; class OrgFreedesktopNotificationsInterface; class OSDPretty; class SystemTrayIcon; class QDBusPendingCallWatcher; #ifdef HAVE_DBUS #include QDBusArgument& operator<<(QDBusArgument& arg, const QImage& image); const QDBusArgument& operator>>(const QDBusArgument& arg, QImage& image); #endif class OSD : public QObject { Q_OBJECT public: OSD(SystemTrayIcon* tray_icon, Application* app, QObject* parent = nullptr); ~OSD(); static const char* kSettingsGroup; enum Behaviour { Disabled = 0, Native, TrayPopup, Pretty, }; // Implemented in the OS-specific files static bool SupportsNativeNotifications(); static bool SupportsTrayPopups(); void ReloadPrettyOSDSettings(); void SetPrettyOSDToggleMode(bool toggle); public slots: void ReloadSettings(); void Paused(); void Stopped(); void StopAfterToggle(bool stop); void PlaylistFinished(); void VolumeChanged(int value); void MagnatuneDownloadFinished(const QStringList& albums); void RepeatModeChanged(PlaylistSequence::RepeatMode mode); void ShuffleModeChanged(PlaylistSequence::ShuffleMode mode); void ReshowCurrentSong(); #ifdef HAVE_WIIMOTEDEV void WiiremoteActived(int id); void WiiremoteDeactived(int id); void WiiremoteConnected(int id); void WiiremoteDisconnected(int id); void WiiremoteLowBattery(int id, int live); void WiiremoteCriticalBattery(int id, int live); #endif void ShowPreview(const Behaviour type, const QString& line1, const QString& line2, const Song& song); private: void ShowMessage(const QString& summary, const QString& message = QString(), const QString& icon = QString(), const QImage& image = QImage()); // These are implemented in the OS-specific files void Init(); void ShowMessageNative(const QString& summary, const QString& message, const QString& icon = QString(), const QImage& image = QImage()); QString ReplaceVariable(const QString& variable, const Song& song); private slots: void CallFinished(QDBusPendingCallWatcher* watcher); void AlbumArtLoaded(const Song& song, const QString& uri, const QImage& image); private: SystemTrayIcon* tray_icon_; Application* app_; int timeout_msec_; Behaviour behaviour_; bool show_on_volume_change_; bool show_art_; bool show_on_play_mode_change_; bool show_on_pause_; bool use_custom_text_; QString custom_text1_; QString custom_text2_; bool preview_mode_; bool force_show_next_; bool ignore_next_stopped_; OSDPretty* pretty_popup_; Song last_song_; QString last_image_uri_; QImage last_image_; #ifdef HAVE_DBUS std::unique_ptr interface_; uint notification_id_; QDateTime last_notification_time_; #endif }; #endif // OSD_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/osd_mac.mm000066400000000000000000000036131260417502300235670ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "osd.h" #import #include #include #include #include #include "core/scoped_nsobject.h" namespace { void SendNotificationCenterMessage(NSString* title, NSString* subtitle) { NSUserNotificationCenter* notification_center = [NSUserNotificationCenter defaultUserNotificationCenter]; NSUserNotification* notification = [[NSUserNotification alloc] init]; [notification setTitle:title]; [notification setSubtitle:subtitle]; [notification_center deliverNotification:notification]; } } // namespace void OSD::Init() {} bool OSD::SupportsNativeNotifications() { return true; } bool OSD::SupportsTrayPopups() { return false; } void OSD::ShowMessageNative(const QString& summary, const QString& message, const QString& icon, const QImage& image) { Q_UNUSED(icon); scoped_nsobject mac_message( [[NSString alloc] initWithUTF8String:message.toUtf8().constData()]); scoped_nsobject mac_summary( [[NSString alloc] initWithUTF8String:summary.toUtf8().constData()]); SendNotificationCenterMessage(mac_summary.get(), mac_message.get()); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/osd_win.cpp000066400000000000000000000020761260417502300237770ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "osd.h" #include "core/logging.h" #include void OSD::Init() {} bool OSD::SupportsNativeNotifications() { return false; } bool OSD::SupportsTrayPopups() { return true; } void OSD::ShowMessageNative(const QString&, const QString&, const QString&, const QImage&) { qLog(Warning) << "not implemented"; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/osd_x11.cpp000066400000000000000000000105411260417502300236070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "osd.h" #include #include #include "config.h" #include "core/logging.h" #ifdef HAVE_DBUS #include "dbus/notification.h" #include #include QDBusArgument& operator<<(QDBusArgument& arg, const QImage& image) { if (image.isNull()) { // Sometimes this gets called with a null QImage for no obvious reason. arg.beginStructure(); arg << 0 << 0 << 0 << false << 0 << 0 << QByteArray(); arg.endStructure(); return arg; } QImage scaled = image.scaledToHeight(100, Qt::SmoothTransformation); scaled = scaled.convertToFormat(QImage::Format_ARGB32); #if Q_BYTE_ORDER == Q_LITTLE_ENDIAN // ABGR -> ARGB QImage i = scaled.rgbSwapped(); #else // ABGR -> GBAR QImage i(scaled.size(), scaled.format()); for (int y = 0; y < i.height(); ++y) { QRgb* p = (QRgb*)scaled.scanLine(y); QRgb* q = (QRgb*)i.scanLine(y); QRgb* end = p + scaled.width(); while (p < end) { *q = qRgba(qGreen(*p), qBlue(*p), qAlpha(*p), qRed(*p)); p++; q++; } } #endif arg.beginStructure(); arg << i.width(); arg << i.height(); arg << i.bytesPerLine(); arg << i.hasAlphaChannel(); int channels = i.isGrayscale() ? 1 : (i.hasAlphaChannel() ? 4 : 3); arg << i.depth() / channels; arg << channels; arg << QByteArray(reinterpret_cast(i.bits()), i.numBytes()); arg.endStructure(); return arg; } const QDBusArgument& operator>>(const QDBusArgument& arg, QImage& image) { // This is needed to link but shouldn't be called. Q_ASSERT(0); return arg; } #endif // HAVE_DBUS void OSD::Init() { #ifdef HAVE_DBUS notification_id_ = 0; interface_.reset(new OrgFreedesktopNotificationsInterface( OrgFreedesktopNotificationsInterface::staticInterfaceName(), "/org/freedesktop/Notifications", QDBusConnection::sessionBus())); if (!interface_->isValid()) { qLog(Warning) << "Error connecting to notifications service."; } #endif // HAVE_DBUS } bool OSD::SupportsNativeNotifications() { #ifdef HAVE_DBUS return true; #else return false; #endif } bool OSD::SupportsTrayPopups() { return true; } void OSD::ShowMessageNative(const QString& summary, const QString& message, const QString& icon, const QImage& image) { #ifdef HAVE_DBUS if (!interface_) return; QVariantMap hints; if (!image.isNull()) { hints["image_data"] = QVariant(image); } int id = 0; if (last_notification_time_.secsTo(QDateTime::currentDateTime()) * 1000 < timeout_msec_) { // Reuse the existing popup if it's still open. The reason we don't always // reuse the popup is because the notification daemon on KDE4 won't re-show // the bubble if it's already gone to the tray. See issue #118 id = notification_id_; } QDBusPendingReply reply = interface_->Notify(QCoreApplication::applicationName(), id, icon, summary, message, QStringList(), hints, timeout_msec_); QDBusPendingCallWatcher* watcher = new QDBusPendingCallWatcher(reply, this); connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), SLOT(CallFinished(QDBusPendingCallWatcher*))); #else // HAVE_DBUS qLog(Warning) << "not implemented"; #endif // HAVE_DBUS } #ifdef HAVE_DBUS void OSD::CallFinished(QDBusPendingCallWatcher* watcher) { std::unique_ptr w(watcher); QDBusPendingReply reply = *watcher; if (reply.isError()) { qLog(Warning) << "Error sending notification" << reply.error().name(); return; } uint id = reply.value(); if (id != 0) { notification_id_ = id; last_notification_time_ = QDateTime::currentDateTime(); } } #endif clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/osdpretty.cpp000066400000000000000000000325161260417502300243740ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "osdpretty.h" #include "ui_osdpretty.h" #include #include #include #include #include #include #include #include #include #include #include #ifdef Q_WS_X11 #include #endif #ifdef Q_OS_WIN32 #include "qtwin.h" #include #endif const char* OSDPretty::kSettingsGroup = "OSDPretty"; const int OSDPretty::kDropShadowSize = 13; const int OSDPretty::kBorderRadius = 10; const int OSDPretty::kMaxIconSize = 100; const int OSDPretty::kSnapProximity = 20; const QRgb OSDPretty::kPresetBlue = qRgb(102, 150, 227); const QRgb OSDPretty::kPresetOrange = qRgb(254, 156, 67); OSDPretty::OSDPretty(Mode mode, QWidget* parent) : QWidget(parent), ui_(new Ui_OSDPretty), mode_(mode), background_color_(kPresetBlue), background_opacity_(0.85), popup_display_(0), font_(QFont()), disable_duration_(false), timeout_(new QTimer(this)), fading_enabled_(false), fader_(new QTimeLine(300, this)), toggle_mode_(false) { Qt::WindowFlags flags = Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint; setWindowFlags(flags); setAttribute(Qt::WA_TranslucentBackground, true); setAttribute(Qt::WA_X11NetWmWindowTypeNotification, true); setAttribute(Qt::WA_ShowWithoutActivating, true); ui_->setupUi(this); #ifdef Q_OS_WIN32 // Don't show the window in the taskbar. Qt::ToolTip does this too, but it // adds an extra ugly shadow. int ex_style = GetWindowLong(winId(), GWL_EXSTYLE); ex_style |= WS_EX_NOACTIVATE; SetWindowLong(winId(), GWL_EXSTYLE, ex_style); #endif // Mode settings switch (mode_) { case Mode_Popup: setCursor(QCursor(Qt::ArrowCursor)); break; case Mode_Draggable: setCursor(QCursor(Qt::OpenHandCursor)); break; } // Timeout timeout_->setSingleShot(true); timeout_->setInterval(5000); connect(timeout_, SIGNAL(timeout()), SLOT(hide())); ui_->icon->setMaximumSize(kMaxIconSize, kMaxIconSize); // Fader connect(fader_, SIGNAL(valueChanged(qreal)), SLOT(FaderValueChanged(qreal))); connect(fader_, SIGNAL(finished()), SLOT(FaderFinished())); #ifdef Q_OS_WIN32 set_fading_enabled(true); #endif // Load the show edges and corners QImage shadow_edge(":osd_shadow_edge.png"); QImage shadow_corner(":osd_shadow_corner.png"); for (int i = 0; i < 4; ++i) { QTransform rotation = QTransform().rotate(90 * i); shadow_edge_[i] = QPixmap::fromImage(shadow_edge.transformed(rotation)); shadow_corner_[i] = QPixmap::fromImage(shadow_corner.transformed(rotation)); } background_ = QPixmap(":osd_background.png"); // Set the margins to allow for the drop shadow QBoxLayout* l = static_cast(layout()); int margin = l->margin() + kDropShadowSize; l->setMargin(margin); // Get current screen resolution QRect screenResolution = QApplication::desktop()->screenGeometry(); // Leave 200 px for icon ui_->summary->setMaximumWidth(screenResolution.width() - 200); ui_->message->setMaximumWidth(screenResolution.width() - 200); // Set maximum size for the OSD, a little margin here too setMaximumSize(screenResolution.width() - 100, screenResolution.height() - 100); // Don't load settings here, they will be reloaded anyway on creation } OSDPretty::~OSDPretty() { delete ui_; } bool OSDPretty::IsTransparencyAvailable() { #ifdef Q_WS_X11 return QX11Info::isCompositingManagerRunning(); #endif return true; } void OSDPretty::Load() { QSettings s; s.beginGroup(kSettingsGroup); foreground_color_ = QColor(s.value("foreground_color", 0).toInt()); background_color_ = QColor(s.value("background_color", kPresetBlue).toInt()); background_opacity_ = s.value("background_opacity", 0.85).toDouble(); popup_display_ = s.value("popup_display", -1).toInt(); popup_pos_ = s.value("popup_pos", QPoint(0, 0)).toPoint(); font_.fromString(s.value("font", "Verdana,9,-1,5,50,0,0,0,0,0").toString()); disable_duration_ = s.value("disable_duration", false).toBool(); set_font(font()); set_foreground_color(foreground_color()); } void OSDPretty::ReloadSettings() { Load(); if (isVisible()) update(); } QRect OSDPretty::BoxBorder() const { return rect().adjusted(kDropShadowSize, kDropShadowSize, -kDropShadowSize, -kDropShadowSize); } void OSDPretty::paintEvent(QPaintEvent*) { QPainter p(this); p.setRenderHint(QPainter::Antialiasing); p.setRenderHint(QPainter::HighQualityAntialiasing); QRect box(BoxBorder()); // Shadow corners const int kShadowCornerSize = kDropShadowSize + kBorderRadius; p.drawPixmap(0, 0, shadow_corner_[0]); p.drawPixmap(width() - kShadowCornerSize, 0, shadow_corner_[1]); p.drawPixmap(width() - kShadowCornerSize, height() - kShadowCornerSize, shadow_corner_[2]); p.drawPixmap(0, height() - kShadowCornerSize, shadow_corner_[3]); // Shadow edges p.drawTiledPixmap(kShadowCornerSize, 0, width() - kShadowCornerSize * 2, kDropShadowSize, shadow_edge_[0]); p.drawTiledPixmap(width() - kDropShadowSize, kShadowCornerSize, kDropShadowSize, height() - kShadowCornerSize * 2, shadow_edge_[1]); p.drawTiledPixmap(kShadowCornerSize, height() - kDropShadowSize, width() - kShadowCornerSize * 2, kDropShadowSize, shadow_edge_[2]); p.drawTiledPixmap(0, kShadowCornerSize, kDropShadowSize, height() - kShadowCornerSize * 2, shadow_edge_[3]); // Box background p.setBrush(background_color_); p.setPen(QPen()); p.setOpacity(background_opacity_); p.drawRoundedRect(box, kBorderRadius, kBorderRadius); // Background pattern QPainterPath background_path; background_path.addRoundedRect(box, kBorderRadius, kBorderRadius); p.setClipPath(background_path); p.setOpacity(1.0); p.drawPixmap(box.right() - background_.width(), box.bottom() - background_.height(), background_); p.setClipping(false); // Gradient overlay QLinearGradient gradient(0, 0, 0, height()); gradient.setColorAt(0, QColor(255, 255, 255, 130)); gradient.setColorAt(1, QColor(255, 255, 255, 50)); p.setBrush(gradient); p.drawRoundedRect(box, kBorderRadius, kBorderRadius); // Box border p.setBrush(QBrush()); p.setPen(QPen(background_color_.darker(150), 2)); p.drawRoundedRect(box, kBorderRadius, kBorderRadius); } void OSDPretty::SetMessage(const QString& summary, const QString& message, const QImage& image) { if (!image.isNull()) { QImage scaled_image = image.scaled(kMaxIconSize, kMaxIconSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); ui_->icon->setPixmap(QPixmap::fromImage(scaled_image)); ui_->icon->show(); } else { ui_->icon->hide(); } ui_->summary->setText(summary); ui_->message->setText(message); if (isVisible()) Reposition(); } // Set the desired message and then show the OSD void OSDPretty::ShowMessage(const QString& summary, const QString& message, const QImage& image) { SetMessage(summary, message, image); if (isVisible() && mode_ == Mode_Popup) { // The OSD is already visible, toggle or restart the timer if (toggle_mode()) { set_toggle_mode(false); // If timeout is disabled, timer hadn't been started if (!disable_duration()) timeout_->stop(); hide(); } else { if (!disable_duration()) timeout_->start(); // Restart the timer } } else { if (toggle_mode()) set_toggle_mode(false); // The OSD is not visible, show it show(); } } void OSDPretty::showEvent(QShowEvent* e) { setWindowOpacity(fading_enabled_ ? 0.0 : 1.0); QWidget::showEvent(e); Reposition(); if (fading_enabled_) { fader_->setDirection(QTimeLine::Forward); fader_->start(); // Timeout will be started in FaderFinished } else if (mode_ == Mode_Popup) { if (!disable_duration()) timeout_->start(); // Ensures it is above when showing the preview raise(); } } void OSDPretty::setVisible(bool visible) { if (!visible && fading_enabled_ && fader_->direction() == QTimeLine::Forward) { fader_->setDirection(QTimeLine::Backward); fader_->start(); } else { QWidget::setVisible(visible); } } void OSDPretty::FaderFinished() { if (fader_->direction() == QTimeLine::Backward) hide(); else if (mode_ == Mode_Popup && !disable_duration()) timeout_->start(); } void OSDPretty::FaderValueChanged(qreal value) { setWindowOpacity(value); } void OSDPretty::Reposition() { QDesktopWidget* desktop = QApplication::desktop(); // Make the OSD the proper size layout()->activate(); resize(sizeHint()); // Work out where to place the OSD. -1 for x or y means "on the right or // bottom edge". QRect geometry(desktop->availableGeometry(popup_display_)); int x = popup_pos_.x() < 0 ? geometry.right() - width() : geometry.left() + popup_pos_.x(); int y = popup_pos_.y() < 0 ? geometry.bottom() - height() : geometry.top() + popup_pos_.y(); #ifndef Q_OS_WIN32 // windows needs negative coordinates for monitors // to the left or above the primary x = qBound(0, x, geometry.right() - width()); y = qBound(0, y, geometry.bottom() - height()); #endif move(x, y); // Create a mask for the actual area of the OSD QBitmap mask(size()); mask.clear(); QPainter p(&mask); p.setBrush(Qt::color1); p.drawRoundedRect(BoxBorder().adjusted(-1, -1, 0, 0), kBorderRadius, kBorderRadius); p.end(); // If there's no compositing window manager running then we have to set an // XShape mask. if (IsTransparencyAvailable()) clearMask(); else { setMask(mask); } #ifdef Q_OS_WIN32 // On windows, enable blurbehind on the masked area QtWin::enableBlurBehindWindow(this, true, QRegion(mask)); #endif } void OSDPretty::enterEvent(QEvent*) { if (mode_ == Mode_Popup) setWindowOpacity(0.25); } void OSDPretty::leaveEvent(QEvent*) { setWindowOpacity(1.0); } void OSDPretty::mousePressEvent(QMouseEvent* e) { if (mode_ == Mode_Popup) hide(); else { original_window_pos_ = pos(); drag_start_pos_ = e->globalPos(); } } void OSDPretty::mouseMoveEvent(QMouseEvent* e) { if (mode_ == Mode_Draggable) { QPoint delta = e->globalPos() - drag_start_pos_; QPoint new_pos = original_window_pos_ + delta; // Keep it to the bounds of the desktop QDesktopWidget* desktop = QApplication::desktop(); QRect geometry(desktop->availableGeometry(e->globalPos())); new_pos.setX( qBound(geometry.left(), new_pos.x(), geometry.right() - width())); new_pos.setY( qBound(geometry.top(), new_pos.y(), geometry.bottom() - height())); // Snap to center int snap_x = geometry.center().x() - width() / 2; if (new_pos.x() > snap_x - kSnapProximity && new_pos.x() < snap_x + kSnapProximity) { new_pos.setX(snap_x); } move(new_pos); popup_display_ = current_display(); popup_pos_ = current_pos(); } } QPoint OSDPretty::current_pos() const { QDesktopWidget* desktop = QApplication::desktop(); QRect geometry(desktop->availableGeometry(current_display())); int x = pos().x() >= geometry.right() - width() ? -1 : pos().x() - geometry.left(); int y = pos().y() >= geometry.bottom() - height() ? -1 : pos().y() - geometry.top(); return QPoint(x, y); } int OSDPretty::current_display() const { QDesktopWidget* desktop = QApplication::desktop(); return desktop->screenNumber(pos()); } void OSDPretty::set_background_color(QRgb color) { background_color_ = color; if (isVisible()) update(); } void OSDPretty::set_background_opacity(qreal opacity) { background_opacity_ = opacity; if (isVisible()) update(); } void OSDPretty::set_foreground_color(QRgb color) { foreground_color_ = QColor(color); QPalette p; p.setColor(QPalette::WindowText, foreground_color_); ui_->summary->setPalette(p); ui_->message->setPalette(p); } void OSDPretty::set_popup_duration(int msec) { timeout_->setInterval(msec); } void OSDPretty::mouseReleaseEvent(QMouseEvent*) { if (mode_ == Mode_Draggable) { popup_display_ = current_display(); popup_pos_ = current_pos(); } } void OSDPretty::set_font(QFont font) { font_ = font; // Update the UI ui_->summary->setFont(font); ui_->message->setFont(font); // Now adjust OSD size so everything fits ui_->verticalLayout->activate(); resize(sizeHint()); // Update the position after font change Reposition(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/osdpretty.h000066400000000000000000000075661260417502300240500ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef OSDPRETTY_H #define OSDPRETTY_H #include class Ui_OSDPretty; class QTimeLine; class OSDPretty : public QWidget { Q_OBJECT public: enum Mode { Mode_Popup, Mode_Draggable, }; OSDPretty(Mode mode, QWidget* parent = nullptr); ~OSDPretty(); static const char* kSettingsGroup; static const int kDropShadowSize; static const int kBorderRadius; static const int kMaxIconSize; static const int kSnapProximity; static const QRgb kPresetBlue; static const QRgb kPresetOrange; static bool IsTransparencyAvailable(); void SetMessage(const QString& summary, const QString& message, const QImage& image); void ShowMessage(const QString& summary, const QString& message, const QImage& image); // Controls the fader. This is enabled by default on Windows. void set_fading_enabled(bool enabled) { fading_enabled_ = enabled; } // Popup duration in seconds. Only used in Mode_Popup. void set_popup_duration(int msec); // These will get overwritten when ReloadSettings() is called void set_foreground_color(QRgb color); void set_background_color(QRgb color); void set_background_opacity(qreal opacity); void set_font(QFont font); QRgb foreground_color() const { return foreground_color_.rgb(); } QRgb background_color() const { return background_color_.rgb(); } qreal background_opacity() const { return background_opacity_; } int popup_display() const { return popup_display_; } QPoint popup_pos() const { return popup_pos_; } QFont font() const { return font_; } bool disable_duration() const { return disable_duration_; } // When the user has been moving the popup, use these to get its current // position and screen. Note that these return invalid values if the popup // is hidden. int current_display() const; QPoint current_pos() const; // QWidget void setVisible(bool visible); bool toggle_mode() const { return toggle_mode_; } void set_toggle_mode(bool toggle_mode) { toggle_mode_ = toggle_mode; } public slots: void ReloadSettings(); protected: void paintEvent(QPaintEvent*); void enterEvent(QEvent*); void leaveEvent(QEvent*); void mousePressEvent(QMouseEvent*); void showEvent(QShowEvent*); void mouseMoveEvent(QMouseEvent*); void mouseReleaseEvent(QMouseEvent*); private: void Reposition(); void Load(); QRect BoxBorder() const; private slots: void FaderValueChanged(qreal value); void FaderFinished(); private: Ui_OSDPretty* ui_; Mode mode_; // Settings loaded from QSettings QColor foreground_color_; QColor background_color_; float background_opacity_; int popup_display_; // -1 for default QPoint popup_pos_; QFont font_; // The OSD is kept always on top until you click (no timer) bool disable_duration_; // Cached pixmaps QPixmap shadow_edge_[4]; QPixmap shadow_corner_[4]; QPixmap background_; // For dragging the OSD QPoint original_window_pos_; QPoint drag_start_pos_; // For timeout of notification QTimer* timeout_; // For fading bool fading_enabled_; QTimeLine* fader_; // Toggling requested, we have to show or hide the OSD bool toggle_mode_; }; #endif // OSDPRETTY_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/osdpretty.ui000066400000000000000000000045021260417502300242210ustar00rootroot00000000000000 OSDPretty 0 0 396 80 OSDPretty { background-color: transparent; } #summary { font-weight: bold; font-size: larger; } 12 4 0 0 300 0 400 16777215 true 0 0 400 16777215 true Qt::Vertical 0 0 clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/prettyimage.cpp000066400000000000000000000157661260417502300247010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "prettyimage.h" #include "ui/iconloader.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include const int PrettyImage::kTotalHeight = 200; const int PrettyImage::kReflectionHeight = 40; const int PrettyImage::kImageHeight = PrettyImage::kTotalHeight - PrettyImage::kReflectionHeight; const int PrettyImage::kMaxImageWidth = 300; const char* PrettyImage::kSettingsGroup = "PrettyImageView"; PrettyImage::PrettyImage(const QUrl& url, QNetworkAccessManager* network, QWidget* parent) : QWidget(parent), network_(network), state_(State_WaitingForLazyLoad), url_(url), menu_(nullptr) { setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); LazyLoad(); } void PrettyImage::LazyLoad() { if (state_ != State_WaitingForLazyLoad) return; // Start fetching the image QNetworkReply* reply = network_->get(QNetworkRequest(url_)); connect(reply, SIGNAL(finished()), SLOT(ImageFetched())); state_ = State_Fetching; } QSize PrettyImage::image_size() const { if (state_ != State_Finished) return QSize(kImageHeight * 1.6, kImageHeight); QSize ret = image_.size(); ret.scale(kMaxImageWidth, kImageHeight, Qt::KeepAspectRatio); return ret; } QSize PrettyImage::sizeHint() const { return QSize(image_size().width(), kTotalHeight); } void PrettyImage::ImageFetched() { QNetworkReply* reply = qobject_cast(sender()); reply->deleteLater(); QImage image = QImage::fromData(reply->readAll()); if (image.isNull()) { deleteLater(); } else { state_ = State_CreatingThumbnail; image_ = image; QFuture future = QtConcurrent::run(image_, &QImage::scaled, image_size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); QFutureWatcher* watcher = new QFutureWatcher(this); watcher->setFuture(future); connect(watcher, SIGNAL(finished()), SLOT(ImageScaled())); } } void PrettyImage::ImageScaled() { QFutureWatcher* watcher = reinterpret_cast*>(sender()); if (!watcher) return; watcher->deleteLater(); thumbnail_ = QPixmap::fromImage(watcher->result()); state_ = State_Finished; updateGeometry(); update(); emit Loaded(); } void PrettyImage::paintEvent(QPaintEvent*) { // Draw at the bottom of our area QRect image_rect(QPoint(0, 0), image_size()); image_rect.moveBottom(kImageHeight); QPainter p(this); // Draw the main image DrawThumbnail(&p, image_rect); // Draw the reflection // Figure out where to draw it QRect reflection_rect(image_rect); reflection_rect.moveTop(image_rect.bottom()); // Create the reflected pixmap QImage reflection(reflection_rect.size(), QImage::Format_ARGB32_Premultiplied); reflection.fill(palette().color(QPalette::Base).rgba()); QPainter reflection_painter(&reflection); // Set up the transformation QTransform transform; transform.scale(1.0, -1.0); transform.translate(0.0, -reflection_rect.height()); reflection_painter.setTransform(transform); QRect fade_rect(reflection.rect().bottomLeft() - QPoint(0, kReflectionHeight), reflection.rect().bottomRight()); // Draw the reflection into the buffer DrawThumbnail(&reflection_painter, reflection.rect()); // Make it fade out towards the bottom QLinearGradient fade_gradient(fade_rect.topLeft(), fade_rect.bottomLeft()); fade_gradient.setColorAt(0.0, QColor(0, 0, 0, 0)); fade_gradient.setColorAt(1.0, QColor(0, 0, 0, 128)); reflection_painter.setCompositionMode( QPainter::CompositionMode_DestinationIn); reflection_painter.fillRect(fade_rect, fade_gradient); reflection_painter.end(); // Draw the reflection on the image p.drawImage(reflection_rect, reflection); } void PrettyImage::DrawThumbnail(QPainter* p, const QRect& rect) { switch (state_) { case State_WaitingForLazyLoad: case State_Fetching: case State_CreatingThumbnail: p->setPen(palette().color(QPalette::Disabled, QPalette::Text)); p->drawText(rect, Qt::AlignHCenter | Qt::AlignBottom, tr("Loading...")); break; case State_Finished: p->drawPixmap(rect, thumbnail_); break; } } void PrettyImage::contextMenuEvent(QContextMenuEvent* e) { if (e->pos().y() >= kImageHeight) return; if (!menu_) { menu_ = new QMenu(this); menu_->addAction(IconLoader::Load("zoom-in"), tr("Show fullsize..."), this, SLOT(ShowFullsize())); menu_->addAction(IconLoader::Load("document-save"), tr("Save image") + "...", this, SLOT(SaveAs())); } menu_->popup(e->globalPos()); } void PrettyImage::ShowFullsize() { // Work out how large to make the window, based on the size of the screen QRect desktop_rect(QApplication::desktop()->availableGeometry(this)); QSize window_size(qMin(desktop_rect.width() - 20, image_.width()), qMin(desktop_rect.height() - 20, image_.height())); // Create the window QScrollArea* window = new QScrollArea; window->setAttribute(Qt::WA_DeleteOnClose, true); window->setWindowTitle(tr("Clementine image viewer")); window->resize(window_size); // Create the label that displays the image QLabel* label = new QLabel(window); label->setPixmap(QPixmap::fromImage(image_)); // Show the label in the window window->setWidget(label); window->setFrameShape(QFrame::NoFrame); window->show(); } void PrettyImage::SaveAs() { QString filename = QFileInfo(url_.path()).fileName(); if (filename.isEmpty()) filename = "artwork.jpg"; QSettings s; s.beginGroup(kSettingsGroup); QString last_save_dir = s.value("last_save_dir", QDir::homePath()).toString(); QString path = last_save_dir.isEmpty() ? QDir::homePath() : last_save_dir; QFileInfo path_info(path); if (path_info.isDir()) { path += "/" + filename; } else { path = path_info.path() + "/" + filename; } filename = QFileDialog::getSaveFileName(this, tr("Save image"), path); if (filename.isEmpty()) return; image_.save(filename); s.setValue("last_save_dir", last_save_dir); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/prettyimage.h000066400000000000000000000035551260417502300243370ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PRETTYIMAGE_H #define PRETTYIMAGE_H #include #include class QMenu; class QNetworkAccessManager; class QNetworkReply; class PrettyImage : public QWidget { Q_OBJECT public: PrettyImage(const QUrl& url, QNetworkAccessManager* network, QWidget* parent = nullptr); static const int kTotalHeight; static const int kReflectionHeight; static const int kImageHeight; static const int kMaxImageWidth; static const char* kSettingsGroup; QSize sizeHint() const; QSize image_size() const; signals: void Loaded(); public slots: void LazyLoad(); void SaveAs(); void ShowFullsize(); protected: void contextMenuEvent(QContextMenuEvent*); void paintEvent(QPaintEvent*); private slots: void ImageFetched(); void ImageScaled(); private: enum State { State_WaitingForLazyLoad, State_Fetching, State_CreatingThumbnail, State_Finished, }; void DrawThumbnail(QPainter* p, const QRect& rect); private: QNetworkAccessManager* network_; State state_; QUrl url_; QImage image_; QPixmap thumbnail_; QMenu* menu_; QString last_save_dir_; }; #endif // PRETTYIMAGE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/prettyimageview.cpp000066400000000000000000000120761260417502300255630ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "prettyimage.h" #include "prettyimageview.h" #include #include #include #include #include #include PrettyImageView::PrettyImageView(QNetworkAccessManager* network, QWidget* parent) : QScrollArea(parent), network_(network), container_(new QWidget(this)), layout_(new QHBoxLayout(container_)), current_index_(-1), scroll_animation_( new QPropertyAnimation(horizontalScrollBar(), "value", this)), recursion_filter_(false) { setWidget(container_); setWidgetResizable(true); setMinimumHeight(PrettyImage::kTotalHeight + 10); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); setFrameShape(QFrame::NoFrame); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); scroll_animation_->setDuration(250); scroll_animation_->setEasingCurve(QEasingCurve::InOutCubic); connect(horizontalScrollBar(), SIGNAL(sliderReleased()), SLOT(ScrollBarReleased())); connect(horizontalScrollBar(), SIGNAL(actionTriggered(int)), SLOT(ScrollBarAction(int))); layout_->setSizeConstraint(QLayout::SetMinAndMaxSize); layout_->setContentsMargins(6, 6, 6, 6); layout_->setSpacing(6); layout_->addSpacing(200); layout_->addSpacing(200); container_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); } bool PrettyImageView::eventFilter(QObject* obj, QEvent* event) { // Work around infinite recursion in QScrollArea resizes. if (recursion_filter_) { return false; } recursion_filter_ = true; bool ret = QScrollArea::eventFilter(obj, event); recursion_filter_ = false; return ret; } void PrettyImageView::AddImage(const QUrl& url) { PrettyImage* image = new PrettyImage(url, network_, container_); connect(image, SIGNAL(destroyed()), SLOT(ScrollToCurrent())); connect(image, SIGNAL(Loaded()), SLOT(ScrollToCurrent())); layout_->insertWidget(layout_->count() - 1, image); if (current_index_ == -1) ScrollTo(0); } void PrettyImageView::mouseReleaseEvent(QMouseEvent* e) { // Find the image that was clicked on QWidget* widget = container_->childAt(container_->mapFrom(this, e->pos())); if (!widget) return; // Get the index of that image const int index = layout_->indexOf(widget) - 1; if (index == -1) return; if (index == current_index_) { // Show the image fullsize PrettyImage* pretty_image = qobject_cast(widget); if (pretty_image) { pretty_image->ShowFullsize(); } } else { // Scroll to the image ScrollTo(index); } } void PrettyImageView::ScrollTo(int index, bool smooth) { current_index_ = qBound(0, index, layout_->count() - 3); const int layout_index = current_index_ + 1; const QWidget* target_widget = layout_->itemAt(layout_index)->widget(); if (!target_widget) return; const int current_x = horizontalScrollBar()->value(); const int target_x = target_widget->geometry().center().x() - width() / 2; if (current_x == target_x) return; if (smooth) { scroll_animation_->setStartValue(current_x); scroll_animation_->setEndValue(target_x); scroll_animation_->start(); } else { scroll_animation_->stop(); horizontalScrollBar()->setValue(target_x); } } void PrettyImageView::ScrollToCurrent() { ScrollTo(current_index_); } void PrettyImageView::ScrollBarReleased() { // Find the nearest widget to where the scroll bar was released const int current_x = horizontalScrollBar()->value() + width() / 2; int layout_index = 1; for (; layout_index < layout_->count() - 1; ++layout_index) { const QWidget* widget = layout_->itemAt(layout_index)->widget(); if (widget && widget->geometry().right() > current_x) { break; } } ScrollTo(layout_index - 1); } void PrettyImageView::ScrollBarAction(int action) { switch (action) { case QAbstractSlider::SliderSingleStepAdd: case QAbstractSlider::SliderPageStepAdd: ScrollTo(current_index_ + 1); break; case QAbstractSlider::SliderSingleStepSub: case QAbstractSlider::SliderPageStepSub: ScrollTo(current_index_ - 1); break; } } void PrettyImageView::resizeEvent(QResizeEvent* e) { QScrollArea::resizeEvent(e); ScrollTo(current_index_, false); } void PrettyImageView::wheelEvent(QWheelEvent* e) { const int d = e->delta() > 0 ? -1 : 1; ScrollTo(current_index_ + d, true); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/prettyimageview.h000066400000000000000000000033111260417502300252200ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PRETTYIMAGEVIEW_H #define PRETTYIMAGEVIEW_H #include #include #include class QHBoxLayout; class QMenu; class QNetworkAccessManager; class QNetworkReply; class QPropertyAnimation; class QTimeLine; class PrettyImageView : public QScrollArea { Q_OBJECT public: PrettyImageView(QNetworkAccessManager* network, QWidget* parent = nullptr); static const char* kSettingsGroup; public slots: void AddImage(const QUrl& url); protected: void mouseReleaseEvent(QMouseEvent*); void resizeEvent(QResizeEvent* e); void wheelEvent(QWheelEvent* e); private slots: void ScrollBarReleased(); void ScrollBarAction(int action); void ScrollTo(int index, bool smooth = true); void ScrollToCurrent(); private: bool eventFilter(QObject*, QEvent*); QNetworkAccessManager* network_; QWidget* container_; QHBoxLayout* layout_; int current_index_; QPropertyAnimation* scroll_animation_; bool recursion_filter_; }; #endif // PRETTYIMAGEVIEW_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/progressitemdelegate.cpp000066400000000000000000000027531260417502300265550ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "progressitemdelegate.h" #include ProgressItemDelegate::ProgressItemDelegate(QObject* parent) : QStyledItemDelegate(parent) {} void ProgressItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { bool ok = false; int progress = index.data().toInt(&ok); if (ok) { QStyleOptionProgressBar opt; opt.rect = option.rect; opt.minimum = 0; opt.maximum = 100; opt.progress = progress; opt.text = QString::number(progress) + "%"; opt.textVisible = true; QApplication::style()->drawControl(QStyle::CE_ProgressBar, &opt, painter); } else { QStyledItemDelegate::paint(painter, option, index); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/progressitemdelegate.h000066400000000000000000000021251260417502300262130ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PROGRESSITEMDELEGATE_H #define PROGRESSITEMDELEGATE_H #include class ProgressItemDelegate : public QStyledItemDelegate { Q_OBJECT public: ProgressItemDelegate(QObject* parent = nullptr); void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; }; #endif // PROGRESSITEMDELEGATE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/ratingwidget.cpp000066400000000000000000000110511260417502300250160ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "ratingwidget.h" #include #include #include #include const int RatingPainter::kStarCount; const int RatingPainter::kStarSize; RatingPainter::RatingPainter() { // Load the base pixmaps QPixmap on(":/star-on.png"); QPixmap off(":/star-off.png"); // Generate the 10 states, better to do it now than on the fly for (int i = 0; i < kStarCount * 2 + 1; ++i) { const float rating = float(i) / 2.0; // Clear the pixmap stars_[i] = QPixmap(kStarSize * kStarCount, kStarSize); stars_[i].fill(Qt::transparent); QPainter p(&stars_[i]); // Draw the stars int x = 0; for (int i = 0; i < kStarCount; ++i, x += kStarSize) { const QRect rect(x, 0, kStarSize, kStarSize); if (rating - 0.25 <= i) { // Totally empty p.drawPixmap(rect, off); } else if (rating - 0.75 <= i) { // Half full const QRect target_left(rect.x(), rect.y(), kStarSize / 2, kStarSize); const QRect target_right(rect.x() + kStarSize / 2, rect.y(), kStarSize / 2, kStarSize); const QRect source_left(0, 0, kStarSize / 2, kStarSize); const QRect source_right(kStarSize / 2, 0, kStarSize / 2, kStarSize); p.drawPixmap(target_left, on, source_left); p.drawPixmap(target_right, off, source_right); } else { // Totally full p.drawPixmap(rect, on); } } } } QRect RatingPainter::Contents(const QRect& rect) { const int width = kStarSize * kStarCount; const int x = rect.x() + (rect.width() - width) / 2; return QRect(x, rect.y(), width, rect.height()); } double RatingPainter::RatingForPos(const QPoint& pos, const QRect& rect) { const QRect contents = Contents(rect); const double raw = double(pos.x() - contents.left()) / contents.width(); // Round to the nearest 0.1 return double(int(raw * kStarCount * 2 + 0.5)) / (kStarCount * 2); } void RatingPainter::Paint(QPainter* painter, const QRect& rect, float rating) const { QSize size(qMin(kStarSize * kStarCount, rect.width()), qMin(kStarSize, rect.height())); QPoint pos(rect.center() - QPoint(size.width() / 2, size.height() / 2)); rating *= kStarCount; // Draw the stars const int star = qBound(0, int(rating * 2.0 + 0.5), kStarCount * 2); painter->drawPixmap(QRect(pos, size), stars_[star], QRect(QPoint(0, 0), size)); } RatingWidget::RatingWidget(QWidget* parent) : QWidget(parent), rating_(0.0), hover_rating_(-1.0) { setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); setMouseTracking(true); } QSize RatingWidget::sizeHint() const { const int frame_width = 1 + style()->pixelMetric(QStyle::PM_DefaultFrameWidth); return QSize(RatingPainter::kStarSize * (RatingPainter::kStarCount + 2) + frame_width * 2, RatingPainter::kStarSize + frame_width * 2); } void RatingWidget::set_rating(float rating) { rating_ = rating; update(); } void RatingWidget::paintEvent(QPaintEvent* e) { QStylePainter p(this); // Draw the background QStyleOptionFrameV3 opt; opt.initFrom(this); opt.state |= QStyle::State_Sunken; opt.frameShape = QFrame::StyledPanel; opt.lineWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth, &opt, this); opt.midLineWidth = 0; p.drawPrimitive(QStyle::PE_PanelLineEdit, opt); // Draw the stars painter_.Paint(&p, rect(), hover_rating_ == -1.0 ? rating_ : hover_rating_); } void RatingWidget::mousePressEvent(QMouseEvent* e) { rating_ = RatingPainter::RatingForPos(e->pos(), rect()); emit RatingChanged(rating_); } void RatingWidget::mouseMoveEvent(QMouseEvent* e) { hover_rating_ = RatingPainter::RatingForPos(e->pos(), rect()); update(); } void RatingWidget::leaveEvent(QEvent*) { hover_rating_ = -1.0; update(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/ratingwidget.h000066400000000000000000000033211260417502300244640ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef RATINGWIDGET_H #define RATINGWIDGET_H #include #include class RatingPainter { public: RatingPainter(); static const int kStarCount = 5; static const int kStarSize = 15; static QRect Contents(const QRect& rect); static double RatingForPos(const QPoint& pos, const QRect& rect); void Paint(QPainter* painter, const QRect& rect, float rating) const; private: QPixmap stars_[kStarCount * 2 + 1]; }; class RatingWidget : public QWidget { Q_OBJECT Q_PROPERTY(float rating READ rating WRITE set_rating); public: RatingWidget(QWidget* parent = nullptr); QSize sizeHint() const; float rating() const { return rating_; } void set_rating(float rating); signals: void RatingChanged(float rating); protected: void paintEvent(QPaintEvent*); void mousePressEvent(QMouseEvent* e); void mouseMoveEvent(QMouseEvent* e); void leaveEvent(QEvent*); private: RatingPainter painter_; float rating_; float hover_rating_; }; #endif // RATINGWIDGET_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/renametablineedit.cpp000066400000000000000000000023701260417502300260060ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, Andrea Decorte Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "renametablineedit.h" #include RenameTabLineEdit::RenameTabLineEdit(QWidget* parent) : QLineEdit(parent) {} void RenameTabLineEdit::keyPressEvent(QKeyEvent* e) { if (e->key() == Qt::Key_Escape) { e->accept(); emit EditingCanceled(); } else { QLineEdit::keyPressEvent(e); } } void RenameTabLineEdit::focusOutEvent(QFocusEvent* e) { // if the user hasn't explicitly accepted, discard the value emit EditingCanceled(); // we don't call the default event since it will trigger editingFished() } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/renametablineedit.h000066400000000000000000000021131260417502300254460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, Andrea Decorte Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef RENAMETABLINEEDIT_H #define RENAMETABLINEEDIT_H #include class RenameTabLineEdit : public QLineEdit { Q_OBJECT public: RenameTabLineEdit(QWidget* parent = nullptr); signals: void EditingCanceled(); public slots: protected: void focusOutEvent(QFocusEvent* e); void keyPressEvent(QKeyEvent* e); }; #endif // RENAMETABLINEEDIT_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/sliderwidget.cpp000066400000000000000000000302661260417502300250250ustar00rootroot00000000000000/*************************************************************************** amarokslider.cpp - description ------------------- begin : Dec 15 2003 copyright : (C) 2003 by Mark Kretschmann email : markey@web.de copyright : (C) 2005 by Gábor Lehel email : illissius@gmail.com ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "sliderwidget.h" #include #include #include #include #include #include #include #include #include #include #include #include Amarok::Slider::Slider(Qt::Orientation orientation, QWidget* parent, uint max) : QSlider(orientation, parent), m_sliding(false), m_outside(false), m_prevValue(0) { setRange(0, max); } void Amarok::Slider::wheelEvent(QWheelEvent* e) { if (orientation() == Qt::Vertical) { // Will be handled by the parent widget e->ignore(); return; } // Position Slider (horizontal) int step = e->delta() * 1500 / 18; int nval = QSlider::value() + step; nval = qMax(nval, minimum()); nval = qMin(nval, maximum()); QSlider::setValue(nval); emit sliderReleased(value()); } void Amarok::Slider::mouseMoveEvent(QMouseEvent* e) { if (m_sliding) { // feels better, but using set value of 20 is bad of course QRect rect(-20, -20, width() + 40, height() + 40); if (orientation() == Qt::Horizontal && !rect.contains(e->pos())) { if (!m_outside) QSlider::setValue(m_prevValue); m_outside = true; } else { m_outside = false; slideEvent(e); emit sliderMoved(value()); } } else QSlider::mouseMoveEvent(e); } void Amarok::Slider::slideEvent(QMouseEvent* e) { QStyleOptionSlider option; initStyleOption(&option); QRect sliderRect(style()->subControlRect(QStyle::CC_Slider, &option, QStyle::SC_SliderHandle, this)); QSlider::setValue( orientation() == Qt::Horizontal ? ((QApplication::layoutDirection() == Qt::RightToLeft) ? QStyle::sliderValueFromPosition( minimum(), maximum(), width() - (e->pos().x() - sliderRect.width() / 2), width() + sliderRect.width(), true) : QStyle::sliderValueFromPosition( minimum(), maximum(), e->pos().x() - sliderRect.width() / 2, width() - sliderRect.width())) : QStyle::sliderValueFromPosition( minimum(), maximum(), e->pos().y() - sliderRect.height() / 2, height() - sliderRect.height())); } void Amarok::Slider::mousePressEvent(QMouseEvent* e) { QStyleOptionSlider option; initStyleOption(&option); QRect sliderRect(style()->subControlRect(QStyle::CC_Slider, &option, QStyle::SC_SliderHandle, this)); m_sliding = true; m_prevValue = QSlider::value(); if (!sliderRect.contains(e->pos())) mouseMoveEvent(e); } void Amarok::Slider::mouseReleaseEvent(QMouseEvent*) { if (!m_outside && QSlider::value() != m_prevValue) emit sliderReleased(value()); m_sliding = false; m_outside = false; } void Amarok::Slider::setValue(int newValue) { // don't adjust the slider while the user is dragging it! if (!m_sliding || m_outside) QSlider::setValue(adjustValue(newValue)); else m_prevValue = newValue; } ////////////////////////////////////////////////////////////////////////////////////////// /// CLASS PrettySlider ////////////////////////////////////////////////////////////////////////////////////////// #define THICKNESS 7 #define MARGIN 3 Amarok::PrettySlider::PrettySlider(Qt::Orientation orientation, SliderMode mode, QWidget* parent, uint max) : Amarok::Slider(orientation, parent, max), m_mode(mode) { if (m_mode == Pretty) { setFocusPolicy(Qt::NoFocus); } } void Amarok::PrettySlider::mousePressEvent(QMouseEvent* e) { Amarok::Slider::mousePressEvent(e); slideEvent(e); } void Amarok::PrettySlider::slideEvent(QMouseEvent* e) { if (m_mode == Pretty) QSlider::setValue( orientation() == Qt::Horizontal ? QStyle::sliderValueFromPosition(minimum(), maximum(), e->pos().x(), width() - 2) : QStyle::sliderValueFromPosition(minimum(), maximum(), e->pos().y(), height() - 2)); else Amarok::Slider::slideEvent(e); } namespace Amarok { namespace ColorScheme { extern QColor Background; extern QColor Foreground; } } #if 0 /** these functions aren't required in our fixed size world, but they may become useful one day **/ QSize Amarok::PrettySlider::minimumSizeHint() const { return sizeHint(); } QSize Amarok::PrettySlider::sizeHint() const { constPolish(); return (orientation() == Horizontal ? QSize( maxValue(), THICKNESS + MARGIN ) : QSize( THICKNESS + MARGIN, maxValue() )).expandedTo( QApplit ication::globalStrut() ); } #endif ////////////////////////////////////////////////////////////////////////////////////////// /// CLASS VolumeSlider ////////////////////////////////////////////////////////////////////////////////////////// Amarok::VolumeSlider::VolumeSlider(QWidget* parent, uint max) : Amarok::Slider(Qt::Horizontal, parent, max), m_animCount(0), m_animTimer(new QTimer(this)), m_pixmapInset(QPixmap(drawVolumePixmap ())) { setFocusPolicy(Qt::NoFocus); // Store theme colors to check theme change at paintEvent m_previous_theme_text_color = palette().color(QPalette::WindowText); m_previous_theme_highlight_color = palette().color(QPalette::Highlight); drawVolumeSliderHandle(); generateGradient(); setMinimumWidth(m_pixmapInset.width()); setMinimumHeight(m_pixmapInset.height()); connect(m_animTimer, SIGNAL(timeout()), this, SLOT(slotAnimTimer())); } void Amarok::VolumeSlider::generateGradient() { const QImage mask(":volumeslider-gradient.png"); QImage gradient_image(mask.size(), QImage::Format_ARGB32_Premultiplied); QPainter p(&gradient_image); QLinearGradient gradient(gradient_image.rect().topLeft(), gradient_image.rect().topRight()); gradient.setColorAt(0, palette().color(QPalette::Background)); gradient.setColorAt(1, palette().color(QPalette::Highlight)); p.fillRect(gradient_image.rect(), QBrush(gradient)); p.setCompositionMode(QPainter::CompositionMode_DestinationIn); p.drawImage(0, 0, mask); p.end(); m_pixmapGradient = QPixmap::fromImage(gradient_image); } void Amarok::VolumeSlider::slotAnimTimer() // SLOT { if (m_animEnter) { m_animCount++; update(); if (m_animCount == ANIM_MAX - 1) m_animTimer->stop(); } else { m_animCount--; update(); if (m_animCount == 0) m_animTimer->stop(); } } void Amarok::VolumeSlider::mousePressEvent(QMouseEvent* e) { if (e->button() != Qt::RightButton) { Amarok::Slider::mousePressEvent(e); slideEvent(e); } } void Amarok::VolumeSlider::contextMenuEvent(QContextMenuEvent* e) { QMap values; QMenu menu; menu.setTitle("Volume"); values[menu.addAction("100%")] = 100; values[menu.addAction("80%")] = 80; values[menu.addAction("60%")] = 60; values[menu.addAction("40%")] = 40; values[menu.addAction("20%")] = 20; values[menu.addAction("0%")] = 0; QAction* ret = menu.exec(mapToGlobal(e->pos())); if (ret) { QSlider::setValue(values[ret]); emit sliderReleased(values[ret]); } } void Amarok::VolumeSlider::slideEvent(QMouseEvent* e) { QSlider::setValue(QStyle::sliderValueFromPosition(minimum(), maximum(), e->pos().x(), width() - 2)); } void Amarok::VolumeSlider::wheelEvent(QWheelEvent* e) { const uint step = e->delta() / 30; QSlider::setValue(QSlider::value() + step); emit sliderReleased(value()); } void Amarok::VolumeSlider::paintEvent(QPaintEvent*) { QPainter p(this); const int padding = 7; const int offset = int(double((width() - 2 * padding) * value()) / maximum()); // If theme changed since last paintEvent, redraw the volume pixmap with new theme colors if (m_previous_theme_text_color != palette().color(QPalette::WindowText)) { m_pixmapInset = drawVolumePixmap(); m_previous_theme_text_color = palette().color(QPalette::WindowText); } if (m_previous_theme_highlight_color != palette().color(QPalette::Highlight)) { drawVolumeSliderHandle(); m_previous_theme_highlight_color = palette().color(QPalette::Highlight); } p.drawPixmap(0, 0, m_pixmapGradient, 0, 0, offset + padding, 0); p.drawPixmap(0, 0, m_pixmapInset); p.drawPixmap(offset - m_handlePixmaps[0].width() / 2 + padding, 0, m_handlePixmaps[m_animCount]); // Draw percentage number QStyleOptionViewItem opt; p.setPen(opt.palette.color(QPalette::Disabled, QPalette::Text)); QFont vol_font(opt.font); vol_font.setPixelSize(9); p.setFont(vol_font); const QRect rect(0, 0, 34, 15); p.drawText(rect, Qt::AlignRight | Qt::AlignVCenter, QString::number(value()) + '%'); } void Amarok::VolumeSlider::enterEvent(QEvent*) { m_animEnter = true; m_animCount = 0; m_animTimer->start(ANIM_INTERVAL); } void Amarok::VolumeSlider::leaveEvent(QEvent*) { // This can happen if you enter and leave the widget quickly if (m_animCount == 0) m_animCount = 1; m_animEnter = false; m_animTimer->start(ANIM_INTERVAL); } void Amarok::VolumeSlider::paletteChange(const QPalette&) { generateGradient(); } QPixmap Amarok::VolumeSlider::drawVolumePixmap () const { QPixmap pixmap(112, 36); pixmap.fill(Qt::transparent); QPainter painter(&pixmap); QPen pen(palette().color(QPalette::WindowText), 0.3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); painter.setPen(pen); painter.setRenderHint(QPainter::Antialiasing); painter.setRenderHint(QPainter::SmoothPixmapTransform); // Draw volume control pixmap QPolygon poly; poly << QPoint(6, 21) << QPoint(104, 21) << QPoint(104, 7) << QPoint(6, 16) << QPoint(6, 21); QPainterPath path; path.addPolygon(poly); painter.drawPolygon(poly); painter.drawLine(6, 29, 104, 29); // Return QPixmap return pixmap; } void Amarok::VolumeSlider::drawVolumeSliderHandle() { QImage pixmapHandle(":volumeslider-handle.png"); QImage pixmapHandleGlow(":/volumeslider-handle_glow.png"); QImage pixmapHandleGlow_image(pixmapHandleGlow.size(), QImage::Format_ARGB32_Premultiplied); QPainter painter(&pixmapHandleGlow_image); painter.setRenderHint(QPainter::Antialiasing); painter.setRenderHint(QPainter::SmoothPixmapTransform); // repaint volume slider handle glow image with theme highlight color painter.fillRect(pixmapHandleGlow_image.rect(), QBrush(palette().color(QPalette::Highlight))); painter.setCompositionMode(QPainter::CompositionMode_DestinationIn); painter.drawImage(0, 0, pixmapHandleGlow); // Overlay the volume slider handle image painter.setCompositionMode(QPainter::CompositionMode_SourceAtop); painter.drawImage(0, 0, pixmapHandle); // BEGIN Calculate handle animation pixmaps for mouse-over effect float opacity = 0.0; const float step = 1.0 / ANIM_MAX; QImage dst; m_handlePixmaps.clear(); for (int i = 0; i < ANIM_MAX; ++i) { dst = pixmapHandle.copy(); QPainter p(&dst); p.setOpacity(opacity); p.drawImage(0, 0, pixmapHandleGlow_image); p.end(); m_handlePixmaps.append(QPixmap::fromImage(dst)); opacity += step; } // END } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/sliderwidget.h000066400000000000000000000077531260417502300244770ustar00rootroot00000000000000/*************************************************************************** amarokslider.h - description ------------------- begin : Dec 15 2003 copyright : (C) 2003 by Mark Kretschmann email : markey@web.de copyright : (C) 2005 by Gábor Lehel email : illissius@gmail.com ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef AMAROKSLIDER_H #define AMAROKSLIDER_H #include #include #include class QPalette; class QTimer; namespace Amarok { class Slider : public QSlider { Q_OBJECT public: Slider(Qt::Orientation, QWidget*, uint max = 0); virtual void setValue(int); // WARNING non-virtual - and thus only really intended for internal use // this is a major flaw in the class presently, however it suits our // current needs fine int value() const { return adjustValue(QSlider::value()); } signals: // we emit this when the user has specifically changed the slider // so connect to it if valueChanged() is too generic // Qt also emits valueChanged( int ) void sliderReleased(int); protected: virtual void wheelEvent(QWheelEvent*); virtual void mouseMoveEvent(QMouseEvent*); virtual void mouseReleaseEvent(QMouseEvent*); virtual void mousePressEvent(QMouseEvent*); virtual void slideEvent(QMouseEvent*); bool m_sliding; /// we flip the value for vertical sliders int adjustValue(int v) const { int mp = (minimum() + maximum()) / 2; return orientation() == Qt::Vertical ? mp - (v - mp) : v; } private: bool m_outside; int m_prevValue; Slider(const Slider&); // undefined Slider& operator=(const Slider&); // undefined }; class PrettySlider : public Slider { Q_OBJECT public: typedef enum { Normal, // Same behavior as Slider *unless* there's a moodbar Pretty } SliderMode; PrettySlider(Qt::Orientation orientation, SliderMode mode, QWidget* parent, uint max = 0); protected: virtual void slideEvent(QMouseEvent*); virtual void mousePressEvent(QMouseEvent*); private: PrettySlider(const PrettySlider&); // undefined PrettySlider& operator=(const PrettySlider&); // undefined SliderMode m_mode; }; class VolumeSlider : public Slider { Q_OBJECT public: VolumeSlider(QWidget* parent, uint max = 0); protected: virtual void paintEvent(QPaintEvent*); virtual void enterEvent(QEvent*); virtual void leaveEvent(QEvent*); virtual void paletteChange(const QPalette&); virtual void slideEvent(QMouseEvent*); virtual void mousePressEvent(QMouseEvent*); virtual void contextMenuEvent(QContextMenuEvent*); virtual void wheelEvent(QWheelEvent* e); private slots: virtual void slotAnimTimer(); private: void generateGradient(); QPixmap drawVolumePixmap() const; void drawVolumeSliderHandle(); VolumeSlider(const VolumeSlider&); // undefined VolumeSlider& operator=(const VolumeSlider&); // undefined //////////////////////////////////////////////////////////////// static const int ANIM_INTERVAL = 18; static const int ANIM_MAX = 18; bool m_animEnter; int m_animCount; QTimer* m_animTimer; QPixmap m_pixmapInset; QPixmap m_pixmapGradient; QColor m_previous_theme_text_color; QColor m_previous_theme_highlight_color; QList m_handlePixmaps; }; } #endif clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/stickyslider.cpp000066400000000000000000000022131260417502300250370ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "stickyslider.h" StickySlider::StickySlider(QWidget* parent) : QSlider(parent), sticky_center_(-1), sticky_threshold_(10) {} void StickySlider::mouseMoveEvent(QMouseEvent* e) { QSlider::mouseMoveEvent(e); if (sticky_center_ == -1) return; const int v = sliderPosition(); if (v <= sticky_center_ + sticky_threshold_ && v >= sticky_center_ - sticky_threshold_) setSliderPosition(sticky_center_); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/stickyslider.h000066400000000000000000000027101260417502300245060ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef STICKYSLIDER_H #define STICKYSLIDER_H #include class StickySlider : public QSlider { Q_OBJECT Q_PROPERTY(int sticky_center READ sticky_center WRITE set_sticky_center); Q_PROPERTY(int sticky_threshold READ sticky_threshold WRITE set_sticky_threshold); public: StickySlider(QWidget* parent = nullptr); int sticky_center() const { return sticky_center_; } int sticky_threshold() const { return sticky_threshold_; } void set_sticky_center(int center) { sticky_center_ = center; } void set_sticky_threshold(int threshold) { sticky_threshold_ = threshold; } protected: void mouseMoveEvent(QMouseEvent* e); private: int sticky_center_; int sticky_threshold_; }; #endif // STICKYSLIDER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/stretchheaderview.cpp000066400000000000000000000174331260417502300260600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "stretchheaderview.h" #include "core/logging.h" #include #include #include #include const int StretchHeaderView::kMinimumColumnWidth = 20; const int StretchHeaderView::kMagicNumber = 0x502c950f; StretchHeaderView::StretchHeaderView(Qt::Orientation orientation, QWidget* parent) : QHeaderView(orientation, parent), stretch_enabled_(false), in_mouse_move_event_(false) { connect(this, SIGNAL(sectionResized(int, int, int)), SLOT(SectionResized(int, int, int))); setMinimumSectionSize(kMinimumColumnWidth); } void StretchHeaderView::setModel(QAbstractItemModel* model) { QHeaderView::setModel(model); if (stretch_enabled_) { column_widths_.resize(count()); std::fill(column_widths_.begin(), column_widths_.end(), 1.0 / count()); } } void StretchHeaderView::NormaliseWidths(const QList& sections) { if (!stretch_enabled_) return; const ColumnWidthType total_sum = std::accumulate(column_widths_.begin(), column_widths_.end(), 0.0); ColumnWidthType selected_sum = total_sum; if (!sections.isEmpty()) { selected_sum = 0.0; for (int i = 0; i < count(); ++i) if (sections.contains(i)) selected_sum += column_widths_[i]; } if (total_sum != 0.0 && !qFuzzyCompare(total_sum, 1.0)) { const ColumnWidthType mult = (selected_sum + (1.0 - total_sum)) / selected_sum; for (int i = 0; i < column_widths_.count(); ++i) { if (sections.isEmpty() || sections.contains(i)) column_widths_[i] *= mult; } } } void StretchHeaderView::UpdateWidths(const QList& sections) { if (!stretch_enabled_) return; ColumnWidthType total_w = 0.0; for (int i = 0; i < column_widths_.count(); ++i) { const ColumnWidthType w = column_widths_[i]; int pixels = w * width(); if (pixels != 0 && total_w - int(total_w) > 0.5) pixels++; total_w += w; if (!sections.isEmpty() && !sections.contains(i)) continue; if (pixels == 0 && !isSectionHidden(i)) hideSection(i); else if (pixels != 0 && isSectionHidden(i)) { showSection(i); } if (pixels != 0) resizeSection(i, pixels); } } void StretchHeaderView::HideSection(int logical) { // Would this hide the last section? bool all_hidden = true; for (int i = 0; i < count(); ++i) { if (i != logical && !isSectionHidden(i) && sectionSize(i) > 0) { all_hidden = false; break; } } if (all_hidden) { return; } if (!stretch_enabled_) { hideSection(logical); return; } column_widths_[logical] = 0.0; NormaliseWidths(); UpdateWidths(); } void StretchHeaderView::ShowSection(int logical) { if (!stretch_enabled_) { showSection(logical); return; } // How many sections are visible already? int visible_count = 0; for (int i = 0; i < count(); ++i) { if (!isSectionHidden(i)) visible_count++; } column_widths_[logical] = visible_count == 0 ? 1.0 : 1.0 / visible_count; NormaliseWidths(); UpdateWidths(); } void StretchHeaderView::SetSectionHidden(int logical, bool hidden) { if (hidden) { HideSection(logical); } else { ShowSection(logical); } } void StretchHeaderView::resizeEvent(QResizeEvent* event) { QHeaderView::resizeEvent(event); if (!stretch_enabled_) return; UpdateWidths(); } void StretchHeaderView::mouseMoveEvent(QMouseEvent* e) { in_mouse_move_event_ = true; QHeaderView::mouseMoveEvent(e); in_mouse_move_event_ = false; } void StretchHeaderView::SectionResized(int logical, int, int new_size) { if (!stretch_enabled_) return; if (in_mouse_move_event_) { // Update this section's proportional width column_widths_[logical] = ColumnWidthType(new_size) / width(); // Find the visible sections to the right of the section that's being // resized int visual = visualIndex(logical); QList logical_sections_to_resize; for (int i = 0; i < count(); ++i) { if (!isSectionHidden(i) && visualIndex(i) > visual) logical_sections_to_resize << i; } // Resize just those columns if (!logical_sections_to_resize.isEmpty()) { in_mouse_move_event_ = false; UpdateWidths(logical_sections_to_resize); NormaliseWidths(logical_sections_to_resize); in_mouse_move_event_ = true; } } } void StretchHeaderView::ToggleStretchEnabled() { SetStretchEnabled(!is_stretch_enabled()); } void StretchHeaderView::SetStretchEnabled(bool enabled) { stretch_enabled_ = enabled; if (enabled) { // Initialise the list of widths from the current state of the widget column_widths_.resize(count()); for (int i = 0; i < count(); ++i) { column_widths_[i] = ColumnWidthType(sectionSize(i)) / width(); } // Stretch the columns to fill the widget NormaliseWidths(); UpdateWidths(); } emit StretchEnabledChanged(enabled); } void StretchHeaderView::SetColumnWidth(int logical, ColumnWidthType width) { if (!stretch_enabled_) return; column_widths_[logical] = width; QList other_columns; for (int i = 0; i < count(); ++i) if (!isSectionHidden(i) && i != logical) other_columns << i; NormaliseWidths(other_columns); } bool StretchHeaderView::RestoreState(const QByteArray& data) { QDataStream s(data); s.setVersion(QDataStream::Qt_4_6); int magic_number = 0; s >> magic_number; if (magic_number != kMagicNumber || s.atEnd()) { return false; } QList pixel_widths; QList visual_indices; int sort_indicator_order = Qt::AscendingOrder; int sort_indicator_section = 0; s >> stretch_enabled_; s >> pixel_widths; s >> visual_indices; s >> column_widths_; s >> sort_indicator_order; s >> sort_indicator_section; setSortIndicator(sort_indicator_section, Qt::SortOrder(sort_indicator_order)); const int persisted_column_count = qMin(qMin(visual_indices.count(), pixel_widths.count()), column_widths_.count()); // Set column visible state, visual indices and, if we're not in stretch mode, // pixel widths. for (int i = 0; i < count() && i < persisted_column_count; ++i) { setSectionHidden(i, pixel_widths[i] <= kMinimumColumnWidth); moveSection(visualIndex(visual_indices[i]), i); if (!stretch_enabled_) { resizeSection(i, pixel_widths[i]); } } // Have we added more columns since the last time? while (column_widths_.count() < count()) { column_widths_ << 0; } if (stretch_enabled_) { // In stretch mode, we've already set the proportional column widths so // apply // them now. UpdateWidths(); } emit StretchEnabledChanged(stretch_enabled_); return true; } QByteArray StretchHeaderView::SaveState() const { QByteArray ret; QDataStream s(&ret, QIODevice::WriteOnly); QList pixel_widths; QList visual_indices; for (int i = 0; i < count(); ++i) { pixel_widths << sectionSize(i); visual_indices << logicalIndex(i); } s.setVersion(QDataStream::Qt_4_6); s << kMagicNumber; s << stretch_enabled_; s << pixel_widths; s << visual_indices; s << column_widths_; s << int(sortIndicatorOrder()); s << sortIndicatorSection(); return ret; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/stretchheaderview.h000066400000000000000000000057011260417502300255200ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef STRETCHHEADERVIEW_H #define STRETCHHEADERVIEW_H #include class StretchHeaderView : public QHeaderView { Q_OBJECT public: StretchHeaderView(Qt::Orientation orientation, QWidget* parent = nullptr); typedef double ColumnWidthType; static const int kMinimumColumnWidth; static const int kMagicNumber; void setModel(QAbstractItemModel* model); // Serialises the proportional and actual column widths. Use these instead // of QHeaderView::restoreState and QHeaderView::saveState to persist the // proportional values directly and avoid floating point errors over time. bool RestoreState(const QByteArray& data); QByteArray SaveState() const; // Hides a section and resizes all other sections to fill the gap. Does // nothing if you try to hide the last section. void HideSection(int logical); // Shows a section and resizes all other sections to make room. void ShowSection(int logical); // Calls either HideSection or ShowSection. void SetSectionHidden(int logical, bool hidden); // Sets the width of the given column and resizes other columns appropriately. // width is the proportion of the entire width from 0.0 to 1.0. void SetColumnWidth(int logical, ColumnWidthType width); bool is_stretch_enabled() const { return stretch_enabled_; } public slots: // Changes the stretch mode. Enabling stretch mode will initialise the // proportional column widths from the current state of the header. void ToggleStretchEnabled(); void SetStretchEnabled(bool enabled); signals: // Emitted when the stretch mode is changed. void StretchEnabledChanged(bool enabled); protected: // QWidget void mouseMoveEvent(QMouseEvent* e); void resizeEvent(QResizeEvent* event); private: // Scales column_widths_ values so the total is 1.0. void NormaliseWidths(const QList& sections = QList()); // Resizes the actual columns to make them match the proportional values // in column_widths_. void UpdateWidths(const QList& sections = QList()); private slots: void SectionResized(int logical, int old_size, int new_size); private: bool stretch_enabled_; QVector column_widths_; bool in_mouse_move_event_; }; #endif // STRETCHHEADERVIEW_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/stylehelper.cpp000066400000000000000000000167421260417502300247020ustar00rootroot00000000000000/************************************************************************** ** ** This file is part of Qt Creator ** ** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** Commercial Usage ** ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at http://qt.nokia.com/contact. ** **************************************************************************/ #include "stylehelper.h" #include #include #include #include #include #include #include #include // Clamps float color values within (0, 255) static int clamp(float x) { const int val = x > 255 ? 255 : static_cast(x); return val < 0 ? 0 : val; } namespace Utils { qreal StyleHelper::sidebarFontSize() { #if defined(Q_WS_MAC) return 10; #else return 7.5; #endif } QColor StyleHelper::panelTextColor(bool lightColored) { if (!lightColored) return Qt::white; else return Qt::black; } // Invalid by default, setBaseColor needs to be called at least once QColor StyleHelper::m_baseColor; QColor StyleHelper::m_requestedBaseColor; QColor StyleHelper::baseColor(bool lightColored) { if (!lightColored) return m_baseColor; else return m_baseColor.lighter(230); } QColor StyleHelper::highlightColor(bool lightColored) { QColor result = baseColor(lightColored); if (!lightColored) result.setHsv(result.hue(), clamp(result.saturation()), clamp(result.value() * 1.16)); else result.setHsv(result.hue(), clamp(result.saturation()), clamp(result.value() * 1.06)); return result; } QColor StyleHelper::shadowColor(bool lightColored) { QColor result = baseColor(lightColored); result.setHsv(result.hue(), clamp(result.saturation() * 1.1), clamp(result.value() * 0.70)); return result; } QColor StyleHelper::borderColor(bool lightColored) { QColor result = baseColor(lightColored); result.setHsv(result.hue(), result.saturation(), result.value() / 2); return result; } // We try to ensure that the actual color used are within // reasonalbe bounds while generating the actual baseColor // from the users request. void StyleHelper::setBaseColor(const QColor& newcolor) { m_requestedBaseColor = newcolor; QColor color; color.setHsv(newcolor.hue(), newcolor.saturation() * 0.7, 64 + newcolor.value() / 3); if (color.isValid() && color != m_baseColor) { m_baseColor = color; for (QWidget* w : QApplication::topLevelWidgets()) { w->update(); } } } static void verticalGradientHelper(QPainter* p, const QRect& spanRect, const QRect& rect, bool lightColored) { QColor highlight = StyleHelper::highlightColor(lightColored); QColor shadow = StyleHelper::shadowColor(lightColored); QLinearGradient grad(spanRect.topRight(), spanRect.topLeft()); grad.setColorAt(0, highlight.lighter(117)); grad.setColorAt(1, shadow.darker(109)); p->fillRect(rect, grad); QColor light(255, 255, 255, 80); p->setPen(light); p->drawLine(rect.topRight() - QPoint(1, 0), rect.bottomRight() - QPoint(1, 0)); QColor dark(0, 0, 0, 90); p->setPen(dark); p->drawLine(rect.topLeft(), rect.bottomLeft()); } void StyleHelper::verticalGradient(QPainter* painter, const QRect& spanRect, const QRect& clipRect, bool lightColored) { if (StyleHelper::usePixmapCache()) { QString key; QColor keyColor = baseColor(lightColored); key.sprintf("mh_vertical %d %d %d %d %d", spanRect.width(), spanRect.height(), clipRect.width(), clipRect.height(), keyColor.rgb()); ; QPixmap pixmap; if (!QPixmapCache::find(key, pixmap)) { pixmap = QPixmap(clipRect.size()); QPainter p(&pixmap); QRect rect(0, 0, clipRect.width(), clipRect.height()); verticalGradientHelper(&p, spanRect, rect, lightColored); p.end(); QPixmapCache::insert(key, pixmap); } painter->drawPixmap(clipRect.topLeft(), pixmap); } else { verticalGradientHelper(painter, spanRect, clipRect, lightColored); } } // Draws a cached pixmap with shadow void StyleHelper::drawIconWithShadow(const QIcon& icon, const QRect& rect, QPainter* p, QIcon::Mode iconMode, int radius, const QColor& color, const QPoint& offset) { QPixmap cache; QString pixmapName = QString("icon %0 %1 %2").arg(icon.cacheKey()).arg(iconMode).arg( rect.height()); if (!QPixmapCache::find(pixmapName, cache)) { QPixmap px = icon.pixmap(rect.size()); cache = QPixmap(px.size() + QSize(radius * 2, radius * 2)); cache.fill(Qt::transparent); QPainter cachePainter(&cache); if (iconMode == QIcon::Disabled) { QImage im = px.toImage().convertToFormat(QImage::Format_ARGB32); for (int y = 0; y < im.height(); ++y) { QRgb* scanLine = (QRgb*)im.scanLine(y); for (int x = 0; x < im.width(); ++x) { QRgb pixel = *scanLine; char intensity = qGray(pixel); *scanLine = qRgba(intensity, intensity, intensity, qAlpha(pixel)); ++scanLine; } } px = QPixmap::fromImage(im); } // Draw shadow QImage tmp(px.size() + QSize(radius * 2, radius * 2 + 1), QImage::Format_ARGB32_Premultiplied); tmp.fill(Qt::transparent); QPainter tmpPainter(&tmp); tmpPainter.setCompositionMode(QPainter::CompositionMode_Source); tmpPainter.drawPixmap(QPoint(radius, radius), px); tmpPainter.end(); // blur the alpha channel QImage blurred(tmp.size(), QImage::Format_ARGB32_Premultiplied); blurred.fill(Qt::transparent); QPainter blurPainter(&blurred); qt_blurImage(&blurPainter, tmp, radius, false, true); blurPainter.end(); tmp = blurred; // blacken the image... tmpPainter.begin(&tmp); tmpPainter.setCompositionMode(QPainter::CompositionMode_SourceIn); tmpPainter.fillRect(tmp.rect(), color); tmpPainter.end(); tmpPainter.begin(&tmp); tmpPainter.setCompositionMode(QPainter::CompositionMode_SourceIn); tmpPainter.fillRect(tmp.rect(), color); tmpPainter.end(); // draw the blurred drop shadow... cachePainter.drawImage( QRect(0, 0, cache.rect().width(), cache.rect().height()), tmp); // Draw the actual pixmap... cachePainter.drawPixmap(QPoint(radius, radius) + offset, px); QPixmapCache::insert(pixmapName, cache); } QRect targetRect = cache.rect(); targetRect.moveCenter(rect.center()); p->drawPixmap(targetRect.topLeft() - offset, cache); } } // namespace Utils clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/stylehelper.h000066400000000000000000000060511260417502300243370ustar00rootroot00000000000000/************************************************************************** ** ** This file is part of Qt Creator ** ** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** Commercial Usage ** ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at http://qt.nokia.com/contact. ** **************************************************************************/ #ifndef STYLEHELPER_H #define STYLEHELPER_H #include #include #include "ui/qt_blurimage.h" QT_BEGIN_NAMESPACE class QPalette; class QPainter; class QRect; QT_END_NAMESPACE // Helper class holding all custom color values namespace Utils { class StyleHelper { public: static const unsigned int DEFAULT_BASE_COLOR = 0x666666; // Height of the project explorer navigation bar static qreal sidebarFontSize(); // This is our color table, all colors derive from baseColor static QColor requestedBaseColor() { return m_requestedBaseColor; } static QColor baseColor(bool lightColored = false); static QColor panelTextColor(bool lightColored = false); static QColor highlightColor(bool lightColored = false); static QColor shadowColor(bool lightColored = false); static QColor borderColor(bool lightColored = false); static QColor sidebarHighlight() { return QColor(255, 255, 255, 40); } static QColor sidebarShadow() { return QColor(0, 0, 0, 40); } // Sets the base color and makes sure all top level widgets are updated static void setBaseColor(const QColor& color); // Gradients used for panels static void verticalGradient(QPainter* painter, const QRect& spanRect, const QRect& clipRect, bool lightColored = false); static bool usePixmapCache() { return true; } static void drawIconWithShadow(const QIcon& icon, const QRect& rect, QPainter* p, QIcon::Mode iconMode, int radius = 3, const QColor& color = QColor(0, 0, 0, 130), const QPoint& offset = QPoint(1, -2)); private: static QColor m_baseColor; static QColor m_requestedBaseColor; }; } // namespace Utils using Utils::StyleHelper; #endif // STYLEHELPER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/trackslider.cpp000066400000000000000000000116651260417502300246500ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "config.h" #include "trackslider.h" #include "ui_trackslider.h" #include "core/timeconstants.h" #include "core/utilities.h" #include #ifdef HAVE_MOODBAR #include "moodbar/moodbarproxystyle.h" #endif const char* TrackSlider::kSettingsGroup = "MainWindow"; TrackSlider::TrackSlider(QWidget* parent) : QWidget(parent), ui_(new Ui_TrackSlider), moodbar_style_(nullptr), setting_value_(false), show_remaining_time_(true), slider_maximum_value_(0) { ui_->setupUi(this); UpdateLabelWidth(); // Load settings QSettings s; s.beginGroup(kSettingsGroup); show_remaining_time_ = s.value("show_remaining_time").toBool(); connect(ui_->slider, SIGNAL(sliderMoved(int)), SIGNAL(ValueChanged(int))); connect(ui_->slider, SIGNAL(valueChanged(int)), SLOT(ValueMaybeChanged(int))); connect(ui_->slider, SIGNAL(SeekForward()), SIGNAL(SeekForward())); connect(ui_->slider, SIGNAL(SeekBackward()), SIGNAL(SeekBackward())); connect(ui_->remaining, SIGNAL(Clicked()), SLOT(ToggleTimeDisplay())); } TrackSlider::~TrackSlider() { delete ui_; } void TrackSlider::SetApplication(Application* app) { #ifdef HAVE_MOODBAR moodbar_style_ = new MoodbarProxyStyle(app, ui_->slider); #endif } void TrackSlider::UpdateLabelWidth() { // We set the label's minimum size so it won't resize itself when the user // is dragging the slider. UpdateLabelWidth(ui_->elapsed, "0:00:00"); UpdateLabelWidth(ui_->remaining, "-0:00:00"); } void TrackSlider::UpdateLabelWidth(QLabel* label, const QString& text) { QString old_text = label->text(); label->setText(text); label->setMinimumWidth(0); int width = label->sizeHint().width(); label->setText(old_text); label->setMinimumWidth(width); } QSize TrackSlider::sizeHint() const { int width = 500; width += ui_->elapsed->sizeHint().width(); width += ui_->remaining->sizeHint().width(); int height = qMax(ui_->slider->sizeHint().height(), ui_->elapsed->sizeHint().height()); return QSize(width, height); } void TrackSlider::SetValue(int elapsed, int total) { setting_value_ = true; // This is so we don't emit from QAbstractSlider::valueChanged ui_->slider->setMaximum(total); if (!ui_->slider->isSliderDown()) { ui_->slider->setValue(elapsed); } setting_value_ = false; UpdateTimes(elapsed / kMsecPerSec); } void TrackSlider::UpdateTimes(int elapsed) { ui_->elapsed->setText(Utilities::PrettyTime(elapsed)); // update normally if showing remaining time if (show_remaining_time_) { ui_->remaining->setText( "-" + Utilities::PrettyTime((ui_->slider->maximum() / kMsecPerSec) - elapsed)); } else { // check if slider maximum value is changed before updating if (slider_maximum_value_ != ui_->slider->maximum() || !ui_->slider->isEnabled()) { slider_maximum_value_ = ui_->slider->maximum(); ui_->remaining->setText( Utilities::PrettyTime((ui_->slider->maximum() / kMsecPerSec))); } } setEnabled(true); } void TrackSlider::SetStopped() { setEnabled(false); ui_->elapsed->setText("0:00:00"); ui_->remaining->setText("0:00:00"); setting_value_ = true; ui_->slider->setValue(0); slider_maximum_value_ = 0; setting_value_ = false; } void TrackSlider::SetCanSeek(bool can_seek) { ui_->slider->setEnabled(can_seek); } void TrackSlider::Seek(int gap) { if (ui_->slider->isEnabled()) ui_->slider->setValue(ui_->slider->value() + gap * kMsecPerSec); } void TrackSlider::ValueMaybeChanged(int value) { if (setting_value_) return; UpdateTimes(value / kMsecPerSec); emit ValueChangedSeconds(value / kMsecPerSec); } bool TrackSlider::event(QEvent* e) { switch (e->type()) { case QEvent::ApplicationFontChange: case QEvent::StyleChange: UpdateLabelWidth(); break; default: break; } return false; } void TrackSlider::ToggleTimeDisplay() { show_remaining_time_ = !show_remaining_time_; if (!show_remaining_time_) { // we set the value to -1 because the label must be updated slider_maximum_value_ = -1; } UpdateTimes(ui_->slider->value() / kMsecPerSec); // save this setting QSettings s; s.beginGroup(kSettingsGroup); s.setValue("show_remaining_time", show_remaining_time_); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/trackslider.h000066400000000000000000000036101260417502300243040ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef TRACKSLIDER_H #define TRACKSLIDER_H #include class QLabel; class Application; class MoodbarProxyStyle; class Ui_TrackSlider; class TrackSlider : public QWidget { Q_OBJECT public: TrackSlider(QWidget* parent = nullptr); ~TrackSlider(); void SetApplication(Application* app); // QWidget QSize sizeHint() const; // QObject bool event(QEvent*); MoodbarProxyStyle* moodbar_style() const { return moodbar_style_; } static const char* kSettingsGroup; public slots: void SetValue(int elapsed, int total); void SetStopped(); void SetCanSeek(bool can_seek); void Seek(int gap); signals: void ValueChanged(int value); void ValueChangedSeconds(int value); void SeekForward(); void SeekBackward(); private slots: void ValueMaybeChanged(int value); void ToggleTimeDisplay(); private: void UpdateTimes(int elapsed); void UpdateLabelWidth(); void UpdateLabelWidth(QLabel* label, const QString& text); private: Ui_TrackSlider* ui_; MoodbarProxyStyle* moodbar_style_; bool setting_value_; bool show_remaining_time_; int slider_maximum_value_; // we cache it to avoid unnecessary updates }; #endif // TRACKSLIDER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/trackslider.ui000066400000000000000000000032701260417502300244740ustar00rootroot00000000000000 TrackSlider false 0 0 517 33 Form 0 0:00:00 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 10 Qt::Horizontal Click to toggle between remaining time and total time 0:00:00 TrackSliderSlider QSlider
widgets/tracksliderslider.h
ClickableLabel QLabel
widgets/clickablelabel.h
clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/tracksliderpopup.cpp000066400000000000000000000134171260417502300257310ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "tracksliderpopup.h" #include "ui/qt_blurimage.h" #include #include #include #include #include #include #include const int TrackSliderPopup::kTextMargin = 4; const int TrackSliderPopup::kPointLength = 16; const int TrackSliderPopup::kPointWidth = 4; const int TrackSliderPopup::kBorderRadius = 4; const qreal TrackSliderPopup::kBlurRadius = 20.0; TrackSliderPopup::TrackSliderPopup(QWidget* parent) : QWidget(parent), font_metrics_(fontMetrics()), small_font_metrics_(fontMetrics()) { setAttribute(Qt::WA_TransparentForMouseEvents); setMouseTracking(true); font_.setPointSizeF(7.5); font_.setBold(true); small_font_.setPointSizeF(7.5); font_metrics_ = QFontMetrics(font_); small_font_metrics_ = QFontMetrics(small_font_); } void TrackSliderPopup::SetText(const QString& text) { text_ = text; UpdatePixmap(); } void TrackSliderPopup::SetSmallText(const QString& text) { small_text_ = text; UpdatePixmap(); } void TrackSliderPopup::SetPopupPosition(const QPoint& pos) { pos_ = pos; UpdatePosition(); } void TrackSliderPopup::paintEvent(QPaintEvent*) { QPainter p(this); p.drawPixmap(0, 0, pixmap_); } void TrackSliderPopup::UpdatePixmap() { const int text_width = qMax(font_metrics_.width(text_), small_font_metrics_.width(small_text_)); const QRect text_rect1(kBlurRadius + kTextMargin, kBlurRadius + kTextMargin, text_width + 2, font_metrics_.height()); const QRect text_rect2(kBlurRadius + kTextMargin, text_rect1.bottom(), text_width, small_font_metrics_.height()); const int bubble_bottom = text_rect2.bottom() + kTextMargin; const QRect total_rect(0, 0, text_rect1.right() + kBlurRadius + kTextMargin, kBlurRadius + bubble_bottom + kPointLength); const QRect bubble_rect(kBlurRadius, kBlurRadius, total_rect.width() - kBlurRadius * 2, bubble_bottom - kBlurRadius); if (background_cache_.size() != total_rect.size()) { const QColor highlight( palette().color(QPalette::Active, QPalette::Highlight)); const QColor bg_color_1(highlight.lighter(110)); const QColor bg_color_2(highlight.darker(120)); QPolygon pointy; pointy << QPoint(total_rect.width() / 2 - kPointWidth, bubble_bottom) << QPoint(total_rect.width() / 2, total_rect.bottom() - kBlurRadius) << QPoint(total_rect.width() / 2 + kPointWidth, bubble_bottom); QPolygon inner_pointy; inner_pointy << QPoint(pointy[0].x() + 1, pointy[0].y() - 1) << QPoint(pointy[1].x(), pointy[1].y() - 1) << QPoint(pointy[2].x() - 1, pointy[2].y() - 1); background_cache_ = QPixmap(total_rect.size()); background_cache_.fill(Qt::transparent); QPainter p(&background_cache_); p.setRenderHint(QPainter::Antialiasing); p.setRenderHint(QPainter::HighQualityAntialiasing); // Draw the shadow to a different image QImage blur_source(total_rect.size(), QImage::Format_ARGB32); blur_source.fill(Qt::transparent); QPainter blur_painter(&blur_source); blur_painter.setRenderHint(QPainter::Antialiasing); blur_painter.setRenderHint(QPainter::HighQualityAntialiasing); blur_painter.setBrush(bg_color_2); blur_painter.drawRoundedRect(bubble_rect, kBorderRadius, kBorderRadius); blur_painter.drawPolygon(pointy); // Fade the shadow out towards the bottom QLinearGradient fade_gradient(QPoint(0, bubble_bottom), QPoint(0, bubble_bottom + kPointLength)); fade_gradient.setColorAt(0.0, QColor(255, 0, 0, 0)); fade_gradient.setColorAt(1.0, QColor(255, 0, 0, 255)); blur_painter.setCompositionMode(QPainter::CompositionMode_DestinationOut); blur_painter.fillRect(total_rect, fade_gradient); blur_painter.end(); p.save(); qt_blurImage(&p, blur_source, kBlurRadius, true, false); p.restore(); // Outer bubble p.setPen(Qt::NoPen); p.setBrush(bg_color_2); p.drawRoundedRect(bubble_rect, kBorderRadius, kBorderRadius); // Outer pointy p.drawPolygon(pointy); // Inner bubble p.setBrush(bg_color_1); p.drawRoundedRect(bubble_rect.adjusted(1, 1, -1, -1), kBorderRadius, kBorderRadius); // Inner pointy p.drawPolygon(inner_pointy); } pixmap_ = QPixmap(total_rect.size()); pixmap_.fill(Qt::transparent); QPainter p(&pixmap_); p.setRenderHint(QPainter::Antialiasing); p.setRenderHint(QPainter::HighQualityAntialiasing); // Background p.drawPixmap(total_rect.topLeft(), background_cache_); // Text p.setPen(palette().color(QPalette::HighlightedText)); p.setFont(font_); p.drawText(text_rect1, Qt::AlignHCenter, text_); p.setFont(small_font_); p.setOpacity(0.65); p.drawText(text_rect2, Qt::AlignHCenter, small_text_); p.end(); resize(pixmap_.size()); UpdatePosition(); update(); } void TrackSliderPopup::UpdatePosition() { move(pos_.x() - pixmap_.width() / 2, pos_.y() - pixmap_.height() + kBlurRadius); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/tracksliderpopup.h000066400000000000000000000031251260417502300253710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2011, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef TRACKSLIDERPOPUP_H #define TRACKSLIDERPOPUP_H #include class TrackSliderPopup : public QWidget { Q_OBJECT public: TrackSliderPopup(QWidget* parent); public slots: void SetText(const QString& text); void SetSmallText(const QString& small_text); void SetPopupPosition(const QPoint& pos); protected: void paintEvent(QPaintEvent*); private: static const int kTextMargin; static const int kPointLength; static const int kPointWidth; static const int kBorderRadius; static const qreal kBlurRadius; void UpdatePixmap(); void UpdatePosition(); void SendMouseEventToParent(QMouseEvent* e); private: QString text_; QString small_text_; QPoint pos_; QFont font_; QFont small_font_; QFontMetrics font_metrics_; QFontMetrics small_font_metrics_; QPixmap pixmap_; QPixmap background_cache_; }; #endif // TRACKSLIDERPOPUP_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/tracksliderslider.cpp000066400000000000000000000074211260417502300260460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "tracksliderpopup.h" #include "tracksliderslider.h" #include "core/timeconstants.h" #include "core/utilities.h" #include #include #include #include TrackSliderSlider::TrackSliderSlider(QWidget* parent) : QSlider(parent), popup_(new TrackSliderPopup(window())), mouse_hover_seconds_(0) { setMouseTracking(true); connect(this, SIGNAL(valueChanged(int)), SLOT(UpdateDeltaTime())); } void TrackSliderSlider::mousePressEvent(QMouseEvent* e) { // QSlider asks QStyle which mouse button should do what (absolute move or // page step). We force our own behaviour here because it makes more sense // for a music player IMO. Qt::MouseButton new_button = e->button(); if (e->button() == Qt::LeftButton) { int abs_buttons = style()->styleHint(QStyle::SH_Slider_AbsoluteSetButtons); if (abs_buttons & Qt::LeftButton) new_button = Qt::LeftButton; else if (abs_buttons & Qt::MidButton) new_button = Qt::MidButton; else if (abs_buttons & Qt::RightButton) new_button = Qt::RightButton; } QMouseEvent new_event(e->type(), e->pos(), new_button, new_button, e->modifiers()); QSlider::mousePressEvent(&new_event); if (new_event.isAccepted()) e->accept(); } void TrackSliderSlider::mouseReleaseEvent(QMouseEvent* e) { QSlider::mouseReleaseEvent(e); } void TrackSliderSlider::mouseMoveEvent(QMouseEvent* e) { QSlider::mouseMoveEvent(e); // Borrowed from QSliderPrivate::pixelPosToRangeValue QStyleOptionSlider opt; initStyleOption(&opt); QRect gr = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderGroove, this); QRect sr = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this); int slider_length = sr.width(); int slider_min = gr.x(); int slider_max = gr.right() - slider_length + 1; mouse_hover_seconds_ = QStyle::sliderValueFromPosition( minimum() / kMsecPerSec, maximum() / kMsecPerSec, e->x() - slider_length / 2 - slider_min + 1, slider_max - slider_min); popup_->SetText(Utilities::PrettyTime(mouse_hover_seconds_)); UpdateDeltaTime(); popup_->SetPopupPosition( mapTo(window(), QPoint(e->x(), rect().center().y()))); } void TrackSliderSlider::enterEvent(QEvent* e) { QSlider::enterEvent(e); if (isEnabled()) { popup_->show(); } } void TrackSliderSlider::leaveEvent(QEvent* e) { QSlider::leaveEvent(e); popup_->hide(); } void TrackSliderSlider::keyPressEvent(QKeyEvent* event) { if (event->key() == Qt::Key_Left || event->key() == Qt::Key_Down) { emit SeekBackward(); event->accept(); } else if (event->key() == Qt::Key_Right || event->key() == Qt::Key_Up) { emit SeekForward(); event->accept(); } else { QSlider::keyPressEvent(event); } } void TrackSliderSlider::UpdateDeltaTime() { if (popup_->isVisible()) { int delta_seconds = mouse_hover_seconds_ - (value() / kMsecPerSec); popup_->SetSmallText(Utilities::PrettyTimeDelta(delta_seconds)); } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/tracksliderslider.h000066400000000000000000000026211260417502300255100ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef TRACKSLIDERSLIDER_H #define TRACKSLIDERSLIDER_H #include class TrackSliderPopup; // It's the slider inside the TrackSliderSlider class TrackSliderSlider : public QSlider { Q_OBJECT public: TrackSliderSlider(QWidget* parent = nullptr); signals: void SeekForward(); void SeekBackward(); protected: void mousePressEvent(QMouseEvent* e); void mouseReleaseEvent(QMouseEvent* e); void mouseMoveEvent(QMouseEvent* e); void enterEvent(QEvent*); void leaveEvent(QEvent*); void keyPressEvent(QKeyEvent* event); private slots: void UpdateDeltaTime(); private: TrackSliderPopup* popup_; int mouse_hover_seconds_; }; #endif // TRACKSLIDERSLIDER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/widgetfadehelper.cpp000066400000000000000000000116741260417502300256440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "widgetfadehelper.h" #include "ui/qt_blurimage.h" #include #include #include #include const int WidgetFadeHelper::kLoadingPadding = 9; const int WidgetFadeHelper::kLoadingBorderRadius = 10; WidgetFadeHelper::WidgetFadeHelper(QWidget* parent, int msec) : QWidget(parent), parent_(parent), blur_timeline_(new QTimeLine(msec, this)), fade_timeline_(new QTimeLine(msec, this)) { parent->installEventFilter(this); connect(blur_timeline_, SIGNAL(valueChanged(qreal)), SLOT(update())); connect(fade_timeline_, SIGNAL(valueChanged(qreal)), SLOT(update())); connect(fade_timeline_, SIGNAL(finished()), SLOT(FadeFinished())); hide(); } bool WidgetFadeHelper::eventFilter(QObject* obj, QEvent* event) { // We're only interested in our parent's resize events if (obj != parent_ || event->type() != QEvent::Resize) return false; // Don't care if we're hidden if (!isVisible()) return false; QResizeEvent* re = static_cast(event); if (re->oldSize() == re->size()) { // Ignore phoney resize events return false; } // Get a new capture of the parent hide(); CaptureParent(); show(); return false; } void WidgetFadeHelper::StartBlur() { CaptureParent(); // Cover the parent raise(); show(); // Start the timeline blur_timeline_->stop(); blur_timeline_->start(); setAttribute(Qt::WA_TransparentForMouseEvents, false); } void WidgetFadeHelper::CaptureParent() { // Take a "screenshot" of the window original_pixmap_ = QPixmap::grabWidget(parent_); QImage original_image = original_pixmap_.toImage(); // Blur it QImage blurred(original_image.size(), QImage::Format_ARGB32_Premultiplied); blurred.fill(Qt::transparent); QPainter blur_painter(&blurred); blur_painter.save(); qt_blurImage(&blur_painter, original_image, 10.0, true, false); blur_painter.restore(); // Draw some loading text over the top QFont loading_font(font()); loading_font.setBold(true); QFontMetrics loading_font_metrics(loading_font); const QString loading_text = tr("Loading..."); const QSize loading_size( kLoadingPadding * 2 + loading_font_metrics.width(loading_text), kLoadingPadding * 2 + loading_font_metrics.height()); const QRect loading_rect((blurred.width() - loading_size.width()) / 2, 100, loading_size.width(), loading_size.height()); blur_painter.setRenderHint(QPainter::Antialiasing); blur_painter.setRenderHint(QPainter::HighQualityAntialiasing); blur_painter.translate(0.5, 0.5); blur_painter.setPen(QColor(200, 200, 200, 255)); blur_painter.setBrush(QColor(200, 200, 200, 192)); blur_painter.drawRoundedRect(loading_rect, kLoadingBorderRadius, kLoadingBorderRadius); blur_painter.setPen(palette().brush(QPalette::Text).color()); blur_painter.setFont(loading_font); blur_painter.drawText(loading_rect.translated(-1, -1), Qt::AlignCenter, loading_text); blur_painter.translate(-0.5, -0.5); blur_painter.end(); blurred_pixmap_ = QPixmap::fromImage(blurred); resize(parent_->size()); } void WidgetFadeHelper::StartFade() { if (blur_timeline_->state() == QTimeLine::Running) { // Blur timeline is still running, so we need render the current state // into a new pixmap. QPixmap pixmap(original_pixmap_); QPainter painter(&pixmap); painter.setOpacity(blur_timeline_->currentValue()); painter.drawPixmap(0, 0, blurred_pixmap_); painter.end(); blurred_pixmap_ = pixmap; } blur_timeline_->stop(); original_pixmap_ = QPixmap(); // Start the timeline fade_timeline_->stop(); fade_timeline_->start(); setAttribute(Qt::WA_TransparentForMouseEvents, true); } void WidgetFadeHelper::paintEvent(QPaintEvent*) { QPainter p(this); if (fade_timeline_->state() != QTimeLine::Running) { // We're fading in the blur p.drawPixmap(0, 0, original_pixmap_); p.setOpacity(blur_timeline_->currentValue()); } else { // Fading out the blur into the new image p.setOpacity(1.0 - fade_timeline_->currentValue()); } p.drawPixmap(0, 0, blurred_pixmap_); } void WidgetFadeHelper::FadeFinished() { hide(); original_pixmap_ = QPixmap(); blurred_pixmap_ = QPixmap(); } clementine-1.2.3+git1354-gdaddbde+dfsg/src/widgets/widgetfadehelper.h000066400000000000000000000026201260417502300253000ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef WIDGETFADEHELPER_H #define WIDGETFADEHELPER_H #include class QTimeLine; class WidgetFadeHelper : public QWidget { Q_OBJECT public: WidgetFadeHelper(QWidget* parent, int msec = 500); public slots: void StartBlur(); void StartFade(); protected: void paintEvent(QPaintEvent*); bool eventFilter(QObject* obj, QEvent* event); private slots: void FadeFinished(); private: void CaptureParent(); private: static const int kLoadingPadding; static const int kLoadingBorderRadius; QWidget* parent_; QTimeLine* blur_timeline_; QTimeLine* fade_timeline_; QPixmap original_pixmap_; QPixmap blurred_pixmap_; }; #endif // WIDGETFADEHELPER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/wiimotedev/000077500000000000000000000000001260417502300223325ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/src/wiimotedev/consts.h000066400000000000000000000265401260417502300240230ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef WIIMOTEDEV_CONSTS_H #define WIIMOTEDEV_CONSTS_H #define WIIMOTEDEV_CONFIG_FILE "/etc/wiimotedev/wiimotedev.conf" #define WIIMOTEDEV_TCP_PORT 50091 #define WIIMOTEDEV_DBUS_SERVICE_NAME "org.wiimotedev.daemon" #define WIIMOTEDEV_DBUS_IFACE_EVENTS "org.wiimotedev.deviceEvents" #define WIIMOTEDEV_DBUS_IFACE_SERVICE "org.wiimotedev.service" #define WIIMOTEDEV_DBUS_OBJECT_EVENTS "/deviceEvents" #define WIIMOTEDEV_DBUS_OBJECT_SERVICE "/service" /* Compatibility ------------------------------------------------- */ #define WIIMOTEDEV_DBUS_SERVICE_IFACE "org.wiimotedev.service" #define WIIMOTEDEV_DBUS_EVENTS_IFACE "org.wiimotedev.deviceEvents" #define WIIMOTEDEV_DBUS_SERVICE_OBJECT "/service" #define WIIMOTEDEV_DBUS_EVENTS_OBJECT "/deviceEvents" /* Typedefs ------------------------------------------------------ */ typedef unsigned long long uint64; typedef unsigned int uint32; typedef unsigned short uint16; typedef unsigned char uint8; typedef signed long long int64; typedef signed int int32; typedef signed short int16; typedef signed char int8; /* Wiiremote status --------------------------------------------- */ const uint8 STATUS_WIIMOTE_DISCONNECTED = 0x00; const uint8 STATUS_WIIMOTE_CONNECTED = 0x01; const uint8 STATUS_WIIMOTE_NUNCHUK_CONNECTED = 0x02; const uint8 STATUS_WIIMOTE_CLASSIC_CONNECTED = 0x04; #define STATUS_NUNCHUK_CONNECTED STATUS_WIIMOTE_NUNCHUK_CONNECTED #define STATUS_CLASSIC_CONNECTED STATUS_WIIMOTE_CLASSIC_CONNECTED /* Structs --------------------------------------------- */ struct irpoint { int16 size; uint16 x; uint16 y; }; struct accdata { uint8 x; uint8 y; uint8 z; double pitch; double roll; }; struct stickdata { uint8 x; uint8 y; }; enum GENERAL_BUTTONS { // 1.0 API GENERAL_WIIMOTE_BTN_1 = 0, GENERAL_WIIMOTE_BTN_2, GENERAL_WIIMOTE_BTN_A, GENERAL_WIIMOTE_BTN_B, GENERAL_WIIMOTE_BTN_MINUS, GENERAL_WIIMOTE_BTN_PLUS, GENERAL_WIIMOTE_BTN_HOME, GENERAL_WIIMOTE_BTN_RIGHT, GENERAL_WIIMOTE_BTN_LEFT, GENERAL_WIIMOTE_BTN_DOWN, GENERAL_WIIMOTE_BTN_UP, GENERAL_WIIMOTE_BTN_SHIFT_BACKWARD, GENERAL_WIIMOTE_BTN_SHIFT_FORWARD, GENERAL_WIIMOTE_BTN_SHIFT_RIGHT, GENERAL_WIIMOTE_BTN_SHIFT_LEFT, GENERAL_WIIMOTE_BTN_SHIFT_DOWN, GENERAL_WIIMOTE_BTN_SHIFT_UP, GENERAL_WIIMOTE_BTN_TILT_FRONT, GENERAL_WIIMOTE_BTN_TILT_BACK, GENERAL_WIIMOTE_BTN_TILT_RIGHT, GENERAL_WIIMOTE_BTN_TILT_LEFT, GENERAL_NUNCHUK_BTN_C, GENERAL_NUNCHUK_BTN_Z, GENERAL_NUNCHUK_BTN_STICK_RIGHT, GENERAL_NUNCHUK_BTN_STICK_LEFT, GENERAL_NUNCHUK_BTN_STICK_DOWN, GENERAL_NUNCHUK_BTN_STICK_UP, GENERAL_NUNCHUK_BTN_SHIFT_BACKWARD, GENERAL_NUNCHUK_BTN_SHIFT_FORWARD, GENERAL_NUNCHUK_BTN_SHIFT_RIGHT, GENERAL_NUNCHUK_BTN_SHIFT_LEFT, GENERAL_NUNCHUK_BTN_SHIFT_DOWN, GENERAL_NUNCHUK_BTN_SHIFT_UP, GENERAL_NUNCHUK_BTN_TILT_FRONT, GENERAL_NUNCHUK_BTN_TILT_BACK, GENERAL_NUNCHUK_BTN_TILT_RIGHT, GENERAL_NUNCHUK_BTN_TILT_LEFT, GENERAL_CLASSIC_BTN_X, GENERAL_CLASSIC_BTN_Y, GENERAL_CLASSIC_BTN_A, GENERAL_CLASSIC_BTN_B, GENERAL_CLASSIC_BTN_L, GENERAL_CLASSIC_BTN_R, GENERAL_CLASSIC_BTN_ZL, GENERAL_CLASSIC_BTN_ZR, GENERAL_CLASSIC_BTN_MINUS, GENERAL_CLASSIC_BTN_PLUS, GENERAL_CLASSIC_BTN_HOME, GENERAL_CLASSIC_BTN_RIGHT, GENERAL_CLASSIC_BTN_LEFT, GENERAL_CLASSIC_BTN_DOWN, GENERAL_CLASSIC_BTN_UP, GENERAL_CLASSIC_BTN_LSTICK_RIGHT, GENERAL_CLASSIC_BTN_LSTICK_LEFT, GENERAL_CLASSIC_BTN_LSTICK_DOWN, GENERAL_CLASSIC_BTN_LSTICK_UP, GENERAL_CLASSIC_BTN_RSTICK_RIGHT, GENERAL_CLASSIC_BTN_RSTICK_LEFT, GENERAL_CLASSIC_BTN_RSTICK_DOWN, GENERAL_CLASSIC_BTN_RSTICK_UP, // 1.2 API GENERAL_WIIMOTE_BTN_SHIFT_SHAKE, GENERAL_NUNCHUK_BTN_SHIFT_SHAKE }; #define calcbit(x) (static_cast(true) << x) const uint64 WIIMOTE_BTN_1 = calcbit(GENERAL_WIIMOTE_BTN_1); const uint64 WIIMOTE_BTN_2 = calcbit(GENERAL_WIIMOTE_BTN_2); const uint64 WIIMOTE_BTN_A = calcbit(GENERAL_WIIMOTE_BTN_A); const uint64 WIIMOTE_BTN_B = calcbit(GENERAL_WIIMOTE_BTN_B); const uint64 WIIMOTE_BTN_MINUS = calcbit(GENERAL_WIIMOTE_BTN_MINUS); const uint64 WIIMOTE_BTN_PLUS = calcbit(GENERAL_WIIMOTE_BTN_PLUS); const uint64 WIIMOTE_BTN_HOME = calcbit(GENERAL_WIIMOTE_BTN_HOME); const uint64 WIIMOTE_BTN_RIGHT = calcbit(GENERAL_WIIMOTE_BTN_RIGHT); const uint64 WIIMOTE_BTN_LEFT = calcbit(GENERAL_WIIMOTE_BTN_LEFT); const uint64 WIIMOTE_BTN_DOWN = calcbit(GENERAL_WIIMOTE_BTN_DOWN); const uint64 WIIMOTE_BTN_UP = calcbit(GENERAL_WIIMOTE_BTN_UP); const uint64 WIIMOTE_BTN_SHIFT_BACKWARD = calcbit(GENERAL_WIIMOTE_BTN_SHIFT_BACKWARD); const uint64 WIIMOTE_BTN_SHIFT_FORWARD = calcbit(GENERAL_WIIMOTE_BTN_SHIFT_FORWARD); const uint64 WIIMOTE_BTN_SHIFT_RIGHT = calcbit(GENERAL_WIIMOTE_BTN_SHIFT_RIGHT); const uint64 WIIMOTE_BTN_SHIFT_LEFT = calcbit(GENERAL_WIIMOTE_BTN_SHIFT_LEFT); const uint64 WIIMOTE_BTN_SHIFT_DOWN = calcbit(GENERAL_WIIMOTE_BTN_SHIFT_DOWN); const uint64 WIIMOTE_BTN_SHIFT_UP = calcbit(GENERAL_WIIMOTE_BTN_SHIFT_UP); const uint64 WIIMOTE_BTN_TILT_FRONT = calcbit(GENERAL_WIIMOTE_BTN_TILT_FRONT); const uint64 WIIMOTE_BTN_TILT_BACK = calcbit(GENERAL_WIIMOTE_BTN_TILT_BACK); const uint64 WIIMOTE_BTN_TILT_RIGHT = calcbit(GENERAL_WIIMOTE_BTN_TILT_RIGHT); const uint64 WIIMOTE_BTN_TILT_LEFT = calcbit(GENERAL_WIIMOTE_BTN_TILT_LEFT); const uint64 NUNCHUK_BTN_C = calcbit(GENERAL_NUNCHUK_BTN_C); const uint64 NUNCHUK_BTN_Z = calcbit(GENERAL_NUNCHUK_BTN_Z); const uint64 NUNCHUK_BTN_STICK_RIGHT = calcbit(GENERAL_NUNCHUK_BTN_STICK_RIGHT); const uint64 NUNCHUK_BTN_STICK_LEFT = calcbit(GENERAL_NUNCHUK_BTN_STICK_LEFT); const uint64 NUNCHUK_BTN_STICK_DOWN = calcbit(GENERAL_NUNCHUK_BTN_STICK_DOWN); const uint64 NUNCHUK_BTN_STICK_UP = calcbit(GENERAL_NUNCHUK_BTN_STICK_UP); const uint64 NUNCHUK_BTN_SHIFT_BACKWARD = calcbit(GENERAL_NUNCHUK_BTN_SHIFT_BACKWARD); const uint64 NUNCHUK_BTN_SHIFT_FORWARD = calcbit(GENERAL_NUNCHUK_BTN_SHIFT_FORWARD); const uint64 NUNCHUK_BTN_SHIFT_RIGHT = calcbit(GENERAL_NUNCHUK_BTN_SHIFT_RIGHT); const uint64 NUNCHUK_BTN_SHIFT_LEFT = calcbit(GENERAL_NUNCHUK_BTN_SHIFT_LEFT); const uint64 NUNCHUK_BTN_SHIFT_DOWN = calcbit(GENERAL_NUNCHUK_BTN_SHIFT_DOWN); const uint64 NUNCHUK_BTN_SHIFT_UP = calcbit(GENERAL_NUNCHUK_BTN_SHIFT_UP); const uint64 NUNCHUK_BTN_TILT_FRONT = calcbit(GENERAL_NUNCHUK_BTN_TILT_FRONT); const uint64 NUNCHUK_BTN_TILT_BACK = calcbit(GENERAL_NUNCHUK_BTN_TILT_BACK); const uint64 NUNCHUK_BTN_TILT_RIGHT = calcbit(GENERAL_NUNCHUK_BTN_TILT_RIGHT); const uint64 NUNCHUK_BTN_TILT_LEFT = calcbit(GENERAL_NUNCHUK_BTN_TILT_LEFT); const uint64 CLASSIC_BTN_X = calcbit(GENERAL_CLASSIC_BTN_X); const uint64 CLASSIC_BTN_Y = calcbit(GENERAL_CLASSIC_BTN_Y); const uint64 CLASSIC_BTN_A = calcbit(GENERAL_CLASSIC_BTN_A); const uint64 CLASSIC_BTN_B = calcbit(GENERAL_CLASSIC_BTN_B); const uint64 CLASSIC_BTN_L = calcbit(GENERAL_CLASSIC_BTN_L); const uint64 CLASSIC_BTN_R = calcbit(GENERAL_CLASSIC_BTN_R); const uint64 CLASSIC_BTN_ZL = calcbit(GENERAL_CLASSIC_BTN_ZL); const uint64 CLASSIC_BTN_ZR = calcbit(GENERAL_CLASSIC_BTN_ZR); const uint64 CLASSIC_BTN_MINUS = calcbit(GENERAL_CLASSIC_BTN_MINUS); const uint64 CLASSIC_BTN_PLUS = calcbit(GENERAL_CLASSIC_BTN_PLUS); const uint64 CLASSIC_BTN_HOME = calcbit(GENERAL_CLASSIC_BTN_HOME); const uint64 CLASSIC_BTN_RIGHT = calcbit(GENERAL_CLASSIC_BTN_RIGHT); const uint64 CLASSIC_BTN_LEFT = calcbit(GENERAL_CLASSIC_BTN_LEFT); const uint64 CLASSIC_BTN_DOWN = calcbit(GENERAL_CLASSIC_BTN_DOWN); const uint64 CLASSIC_BTN_UP = calcbit(GENERAL_CLASSIC_BTN_UP); const uint64 CLASSIC_BTN_LSTICK_RIGHT = calcbit(GENERAL_CLASSIC_BTN_LSTICK_RIGHT); const uint64 CLASSIC_BTN_LSTICK_LEFT = calcbit(GENERAL_CLASSIC_BTN_LSTICK_LEFT); const uint64 CLASSIC_BTN_LSTICK_DOWN = calcbit(GENERAL_CLASSIC_BTN_LSTICK_DOWN); const uint64 CLASSIC_BTN_LSTICK_UP = calcbit(GENERAL_CLASSIC_BTN_LSTICK_UP); const uint64 CLASSIC_BTN_RSTICK_RIGHT = calcbit(GENERAL_CLASSIC_BTN_RSTICK_RIGHT); const uint64 CLASSIC_BTN_RSTICK_LEFT = calcbit(GENERAL_CLASSIC_BTN_RSTICK_LEFT); const uint64 CLASSIC_BTN_RSTICK_DOWN = calcbit(GENERAL_CLASSIC_BTN_RSTICK_DOWN); const uint64 CLASSIC_BTN_RSTICK_UP = calcbit(GENERAL_CLASSIC_BTN_RSTICK_UP); const uint64 WIIMOTE_BTN_SHIFT_SHAKE = calcbit(GENERAL_WIIMOTE_BTN_SHIFT_SHAKE); const uint64 NUNCHUK_BTN_SHIFT_SHAKE = calcbit(GENERAL_NUNCHUK_BTN_SHIFT_SHAKE); const uint64 WIIMOTE_BUTTON_MASK = WIIMOTE_BTN_1 | WIIMOTE_BTN_2 | WIIMOTE_BTN_A | WIIMOTE_BTN_B | WIIMOTE_BTN_MINUS | WIIMOTE_BTN_PLUS | WIIMOTE_BTN_HOME | WIIMOTE_BTN_RIGHT | WIIMOTE_BTN_LEFT | WIIMOTE_BTN_DOWN | WIIMOTE_BTN_UP; const uint64 WIIMOTE_SHIFT_MASK = WIIMOTE_BTN_SHIFT_BACKWARD | WIIMOTE_BTN_SHIFT_FORWARD | WIIMOTE_BTN_SHIFT_RIGHT | WIIMOTE_BTN_SHIFT_LEFT | WIIMOTE_BTN_SHIFT_DOWN | WIIMOTE_BTN_SHIFT_UP | WIIMOTE_BTN_SHIFT_SHAKE; const uint64 WIIMOTE_TILT_MASK = WIIMOTE_BTN_TILT_FRONT | WIIMOTE_BTN_TILT_BACK | WIIMOTE_BTN_TILT_RIGHT | WIIMOTE_BTN_TILT_LEFT; const uint64 NUNCHUK_BUTTON_MASK = NUNCHUK_BTN_C | NUNCHUK_BTN_Z; const uint64 NUNCHUK_STICK_MASK = NUNCHUK_BTN_STICK_RIGHT | NUNCHUK_BTN_STICK_LEFT | NUNCHUK_BTN_STICK_DOWN | NUNCHUK_BTN_STICK_UP; const uint64 NUNCHUK_SHIFT_MASK = NUNCHUK_BTN_SHIFT_BACKWARD | NUNCHUK_BTN_SHIFT_FORWARD | NUNCHUK_BTN_SHIFT_RIGHT | NUNCHUK_BTN_SHIFT_LEFT | NUNCHUK_BTN_SHIFT_DOWN | NUNCHUK_BTN_SHIFT_UP | NUNCHUK_BTN_SHIFT_SHAKE; const uint64 NUNCHUK_TILT_MASK = NUNCHUK_BTN_TILT_FRONT | NUNCHUK_BTN_TILT_BACK | NUNCHUK_BTN_TILT_RIGHT | NUNCHUK_BTN_TILT_LEFT; const uint64 CLASSIC_BUTTON_MASK = CLASSIC_BTN_X | CLASSIC_BTN_Y | CLASSIC_BTN_A | CLASSIC_BTN_B | CLASSIC_BTN_L | CLASSIC_BTN_R | CLASSIC_BTN_ZL | CLASSIC_BTN_ZR | CLASSIC_BTN_MINUS | CLASSIC_BTN_PLUS | CLASSIC_BTN_HOME | CLASSIC_BTN_RIGHT | CLASSIC_BTN_LEFT | CLASSIC_BTN_DOWN | CLASSIC_BTN_UP; const uint64 CLASSIC_LSTICK_MASK = CLASSIC_BTN_LSTICK_RIGHT | CLASSIC_BTN_LSTICK_LEFT | CLASSIC_BTN_LSTICK_DOWN | CLASSIC_BTN_LSTICK_UP; const uint64 CLASSIC_RSTICK_MASK = CLASSIC_BTN_RSTICK_RIGHT | CLASSIC_BTN_RSTICK_LEFT | CLASSIC_BTN_RSTICK_DOWN | CLASSIC_BTN_RSTICK_UP; const uint64 WIIMOTE_BUTTON_NOTMASK = ~WIIMOTE_BUTTON_MASK; const uint64 WIIMOTE_SHIFT_NOTMASK = ~WIIMOTE_SHIFT_MASK; const uint64 WIIMOTE_TILT_NOTMASK = ~WIIMOTE_TILT_MASK; const uint64 NUNCHUK_BUTTON_NOTMASK = ~NUNCHUK_BUTTON_MASK; const uint64 NUNCHUK_STICK_NOTMASK = ~NUNCHUK_STICK_MASK; const uint64 NUNCHUK_SHIFT_NOTMASK = ~NUNCHUK_SHIFT_MASK; const uint64 NUNCHUK_TILT_NOTMASK = ~NUNCHUK_TILT_MASK; const uint64 CLASSIC_BUTTON_NOTMASK = ~CLASSIC_BUTTON_MASK; const uint64 CLASSIC_LSTICK_NOTMASK = ~CLASSIC_LSTICK_MASK; const uint64 CLASSIC_RSTICK_NOTMASK = ~CLASSIC_RSTICK_MASK; #endif // WIIMOTEDEV_CONSTS_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/wiimotedev/shortcuts.cpp000066400000000000000000000156071260417502300251050ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include #include "wiimotedev/consts.h" #include "wiimotedev/shortcuts.h" const char* WiimotedevShortcuts::kActionsGroup = "WiimotedevActions"; const char* WiimotedevShortcuts::kSettingsGroup = "WiimotedevSettings"; WiimotedevShortcuts::WiimotedevShortcuts(OSD* osd, QWidget* window, QObject* parent) : QObject(parent), osd_(osd), main_window_(window), player_(qobject_cast(parent)), low_battery_notification_(true), critical_battery_notification_(true), actived_(false), wiimotedev_active_(true), wiimotedev_buttons_(0), wiimotedev_device_(1), wiimotedev_enable_(true), wiimotedev_focus_(false), wiimotedev_notification_(true) { connect(this, SIGNAL(WiiremoteActived(int)), osd_, SLOT(WiiremoteActived(int))); connect(this, SIGNAL(WiiremoteDeactived(int)), osd_, SLOT(WiiremoteDeactived(int))); connect(this, SIGNAL(WiiremoteConnected(int)), osd_, SLOT(WiiremoteConnected(int))); connect(this, SIGNAL(WiiremoteDisconnected(int)), osd_, SLOT(WiiremoteDisconnected(int))); connect(this, SIGNAL(WiiremoteLowBattery(int, int)), osd_, SLOT(WiiremoteLowBattery(int, int))); connect(this, SIGNAL(WiiremoteCriticalBattery(int, int)), osd_, SLOT(WiiremoteCriticalBattery(int, int))); ReloadSettings(); } void WiimotedevShortcuts::SetWiimotedevInterfaceActived(bool actived) { if (!QDBusConnection::systemBus().isConnected()) return; // http://code.google.com/p/clementine-player/issues/detail?id=670 // Probably dbus bug, or something else if (actived && !wiimotedev_iface_) { wiimotedev_iface_.reset(new OrgWiimotedevDeviceEventsInterface( WIIMOTEDEV_DBUS_SERVICE_NAME, WIIMOTEDEV_DBUS_EVENTS_OBJECT, QDBusConnection::systemBus(), this)); connect(wiimotedev_iface_.get(), SIGNAL(dbusWiimoteGeneralButtons(uint, qulonglong)), this, SLOT(DbusWiimoteGeneralButtons(uint, qulonglong))); connect(wiimotedev_iface_.get(), SIGNAL(dbusWiimoteConnected(uint)), this, SLOT(DbusWiimoteConnected(uint))); connect(wiimotedev_iface_.get(), SIGNAL(dbusWiimoteDisconnected(uint)), this, SLOT(DbusWiimoteDisconnected(uint))); connect(wiimotedev_iface_.get(), SIGNAL(dbusWiimoteBatteryLife(uint, uchar)), this, SLOT(DbusWiimoteBatteryLife(uint, uchar))); if (!wiimotedev_iface_.get()->isValid()) qWarning("Error connecting to the Wiimotedev-daemon DBUS service"); } if (!actived && wiimotedev_iface_) wiimotedev_iface_.reset(); } void WiimotedevShortcuts::ReloadSettings() { settings_.sync(); actions_.clear(); settings_.beginGroup(WiimotedevShortcuts::kActionsGroup); quint64 fvalue, svalue; bool fvalid, svalid; for (const QString& str : settings_.allKeys()) { fvalue = str.toULongLong(&fvalid, 10); svalue = settings_.value(str, 0).toULongLong(&svalid); if (fvalid && svalid) actions_[fvalue] = svalue; } settings_.endGroup(); settings_.beginGroup(WiimotedevShortcuts::kSettingsGroup); wiimotedev_enable_ = settings_.value("enabled", false).toBool(); wiimotedev_device_ = settings_.value("device", 1).toInt(); wiimotedev_active_ = settings_.value("use_active_action", true).toBool(); wiimotedev_focus_ = settings_.value("only_when_focused", false).toBool(); wiimotedev_notification_ = settings_.value("use_notification", true).toBool(); settings_.endGroup(); SetWiimotedevInterfaceActived(wiimotedev_enable_); } void WiimotedevShortcuts::DbusWiimoteGeneralButtons(uint id, qulonglong value) { if (id != wiimotedev_device_ || !wiimotedev_enable_ || !player_) return; if (wiimotedev_focus_ && !main_window_->isActiveWindow()) return; quint64 buttons = value & ~(WIIMOTE_TILT_MASK | NUNCHUK_TILT_MASK | WIIMOTE_BTN_SHIFT_SHAKE | NUNCHUK_BTN_SHIFT_SHAKE); if (wiimotedev_buttons_ == buttons) return; if (actions_.contains(buttons)) { if (wiimotedev_active_) { if (actions_.value(buttons, ActionNone) == WiimotedevActiveDeactive) { actived_ = !actived_; if (wiimotedev_notification_) { if (actived_) emit WiiremoteActived(id); else emit WiiremoteDeactived(id); } } } if (actived_ || !wiimotedev_active_) { switch (actions_.value(buttons, ActionNone)) { case PlayerNextTrack: player_->Next(); break; case PlayerPreviousTrack: player_->Previous(); break; case PlayerPlay: player_->Play(); break; case PlayerStop: player_->Stop(); break; case PlayerIncVolume: player_->VolumeUp(); break; case PlayerDecVolume: player_->VolumeDown(); break; case PlayerMute: player_->Mute(); break; case PlayerPause: player_->Pause(); break; case PlayerTogglePause: player_->PlayPause(); break; case PlayerSeekBackward: player_->SeekBackward(); break; case PlayerSeekForward: player_->SeekForward(); break; case PlayerStopAfter: player_->Stop(); break; case PlayerShowOSD: player_->ShowOSD(); break; } } } wiimotedev_buttons_ = buttons; } void WiimotedevShortcuts::DbusWiimoteConnected(uint id) { if (wiimotedev_device_ == id && wiimotedev_notification_) emit WiiremoteConnected(id); } void WiimotedevShortcuts::DbusWiimoteDisconnected(uint id) { if (wiimotedev_device_ == id && wiimotedev_notification_) emit WiiremoteDisconnected(id); } void WiimotedevShortcuts::DbusWiimoteBatteryLife(uint id, uchar life) { if (wiimotedev_device_ == id && wiimotedev_notification_) { if (life <= 30 && life > 20 && low_battery_notification_) { low_battery_notification_ = false; emit WiiremoteLowBattery(id, life); } if (life <= 20 && critical_battery_notification_) { critical_battery_notification_ = false; low_battery_notification_ = false; emit WiiremoteCriticalBattery(id, life); } } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/wiimotedev/shortcuts.h000066400000000000000000000047241260417502300245500ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef WIIMOTEDEV_SHORTCUTS_H #define WIIMOTEDEV_SHORTCUTS_H #include #include #include "dbus/wiimotedev.h" #include "core/player.h" #include "widgets/osd.h" class QSettings; class WiimotedevShortcuts : public QObject { Q_OBJECT public: static const char* kActionsGroup; static const char* kSettingsGroup; WiimotedevShortcuts(OSD* osd, QWidget* window, QObject* parent = nullptr); enum Action { WiimotedevActiveDeactive = 0, PlayerNextTrack, PlayerPreviousTrack, PlayerPlay, PlayerStop, PlayerIncVolume, PlayerDecVolume, PlayerMute, PlayerPause, PlayerTogglePause, PlayerSeekBackward, PlayerSeekForward, PlayerStopAfter, PlayerShowOSD, ActionNone = 0xff }; public slots: void SetWiimotedevInterfaceActived(bool actived); void ReloadSettings(); private slots: void DbusWiimoteBatteryLife(uint id, uchar life); void DbusWiimoteConnected(uint id); void DbusWiimoteDisconnected(uint id); void DbusWiimoteGeneralButtons(uint id, qulonglong value); private: OSD* osd_; QWidget* main_window_; Player* player_; bool low_battery_notification_; bool critical_battery_notification_; bool actived_; bool wiimotedev_active_; quint64 wiimotedev_buttons_; quint32 wiimotedev_device_; bool wiimotedev_enable_; bool wiimotedev_focus_; std::unique_ptr wiimotedev_iface_; bool wiimotedev_notification_; QHash actions_; QSettings settings_; signals: void WiiremoteActived(int); void WiiremoteDeactived(int); void WiiremoteConnected(int); void WiiremoteDisconnected(int); void WiiremoteLowBattery(int, int); void WiiremoteCriticalBattery(int, int); }; #endif // WIIMOTEDEV_SHORTCUTS_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/wiimotedev/wiimotesettingspage.cpp000066400000000000000000000262131260417502300271350ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "consts.h" #include "shortcuts.h" #include "wiimotesettingspage.h" #include "wiimoteshortcutgrabber.h" #include "ui_wiimotesettingspage.h" #include WiimoteSettingsPage::WiimoteSettingsPage(SettingsDialog* dialog) : SettingsPage(dialog), ui_(new Ui_WiimoteSettingsPage) { ui_->setupUi(this); ui_->list->header()->setResizeMode(QHeaderView::ResizeToContents); setWindowIcon(QIcon(":/icons/32x32/wiimotedev.png")); text_buttons_.insert(WIIMOTE_BTN_1, "Wiiremote 1"); text_buttons_.insert(WIIMOTE_BTN_2, "Wiiremote 2"); text_buttons_.insert(WIIMOTE_BTN_A, "Wiiremote A"); text_buttons_.insert(WIIMOTE_BTN_B, "Wiiremote B"); text_buttons_.insert(WIIMOTE_BTN_PLUS, "Wiiremote Plus"); text_buttons_.insert(WIIMOTE_BTN_MINUS, "Wiiremote Minus"); text_buttons_.insert(WIIMOTE_BTN_HOME, "Wiiremote Home"); text_buttons_.insert(WIIMOTE_BTN_UP, "Wiiremote Up"); text_buttons_.insert(WIIMOTE_BTN_DOWN, "Wiiremote Down"); text_buttons_.insert(WIIMOTE_BTN_LEFT, "Wiiremote Left"); text_buttons_.insert(WIIMOTE_BTN_RIGHT, "Wiiremote Right"); text_buttons_.insert(WIIMOTE_BTN_SHIFT_UP, "Wiiremote Shift Up"); text_buttons_.insert(WIIMOTE_BTN_SHIFT_DOWN, "Wiiremote Shift Down"); text_buttons_.insert(WIIMOTE_BTN_SHIFT_LEFT, "Wiiremote Shift Left"); text_buttons_.insert(WIIMOTE_BTN_SHIFT_RIGHT, "Wiiremote Shift Right"); text_buttons_.insert(WIIMOTE_BTN_SHIFT_FORWARD, "Wiiremote Shift Forward"); text_buttons_.insert(WIIMOTE_BTN_SHIFT_BACKWARD, "Wiiremote Shift Backward"); text_buttons_.insert(WIIMOTE_BTN_TILT_FRONT, "Wiiremote Tilt Front"); text_buttons_.insert(WIIMOTE_BTN_TILT_BACK, "Wiiremote Tilt Back"); text_buttons_.insert(WIIMOTE_BTN_TILT_LEFT, "Wiiremote Tilt Left"); text_buttons_.insert(WIIMOTE_BTN_TILT_RIGHT, "Wiiremote Tilt Right"); text_buttons_.insert(NUNCHUK_BTN_Z, "Nunchuk Z"); text_buttons_.insert(NUNCHUK_BTN_C, "Nunchuk B"); text_buttons_.insert(NUNCHUK_BTN_STICK_UP, "Nunchuk Stick Up"); text_buttons_.insert(NUNCHUK_BTN_STICK_DOWN, "Nunchuk Stick Down"); text_buttons_.insert(NUNCHUK_BTN_STICK_LEFT, "Nunchuk Stick Left"); text_buttons_.insert(NUNCHUK_BTN_STICK_RIGHT, "Nunchuk Stick Right"); text_buttons_.insert(NUNCHUK_BTN_SHIFT_UP, "Nunchuk Shift Up"); text_buttons_.insert(NUNCHUK_BTN_SHIFT_DOWN, "Nunchuk Shift Down"); text_buttons_.insert(NUNCHUK_BTN_SHIFT_LEFT, "Nunchuk Shift Left"); text_buttons_.insert(NUNCHUK_BTN_SHIFT_RIGHT, "Nunchuk Shift Right"); text_buttons_.insert(NUNCHUK_BTN_SHIFT_FORWARD, "Nunchuk Shift Forward"); text_buttons_.insert(NUNCHUK_BTN_SHIFT_BACKWARD, "Nunchuk Shift Backward"); text_buttons_.insert(NUNCHUK_BTN_TILT_FRONT, "Nunchuk Tilt Front"); text_buttons_.insert(NUNCHUK_BTN_TILT_BACK, "Nunchuk Tilt Back"); text_buttons_.insert(NUNCHUK_BTN_TILT_LEFT, "Nunchuk Tilt Left"); text_buttons_.insert(NUNCHUK_BTN_TILT_RIGHT, "Nunchuk Tilt Right"); text_buttons_.insert(CLASSIC_BTN_X, "Classic X"); text_buttons_.insert(CLASSIC_BTN_Y, "Classic Y"); text_buttons_.insert(CLASSIC_BTN_A, "Classic A"); text_buttons_.insert(CLASSIC_BTN_B, "Classic B"); text_buttons_.insert(CLASSIC_BTN_L, "Classic L"); text_buttons_.insert(CLASSIC_BTN_R, "Classic R"); text_buttons_.insert(CLASSIC_BTN_ZL, "Classic ZL"); text_buttons_.insert(CLASSIC_BTN_ZR, "Classic ZR"); text_buttons_.insert(CLASSIC_BTN_MINUS, "Classic Minus"); text_buttons_.insert(CLASSIC_BTN_PLUS, "Classic Plus"); text_buttons_.insert(CLASSIC_BTN_HOME, "Classic Home"); text_buttons_.insert(CLASSIC_BTN_UP, "Classic Up"); text_buttons_.insert(CLASSIC_BTN_DOWN, "Classic Down"); text_buttons_.insert(CLASSIC_BTN_LEFT, "Classic Left"); text_buttons_.insert(CLASSIC_BTN_RIGHT, "Classic Right"); text_buttons_.insert(CLASSIC_BTN_LSTICK_UP, "Classic Left-Stick Up"); text_buttons_.insert(CLASSIC_BTN_LSTICK_DOWN, "Classic Left-Stick Down"); text_buttons_.insert(CLASSIC_BTN_LSTICK_LEFT, "Classic Left-Stick Left"); text_buttons_.insert(CLASSIC_BTN_LSTICK_RIGHT, "Classic Left-Stick Right"); text_buttons_.insert(CLASSIC_BTN_RSTICK_UP, "Classic Right-Stick Up"); text_buttons_.insert(CLASSIC_BTN_RSTICK_DOWN, "Classic Right-Stick Down"); text_buttons_.insert(CLASSIC_BTN_RSTICK_LEFT, "Classic Right-Stick Left"); text_buttons_.insert(CLASSIC_BTN_RSTICK_RIGHT, "Classic Right-Stick Right"); text_buttons_.insert(WIIMOTE_BTN_SHIFT_SHAKE, "Wiiremote Shift Shake"); text_buttons_.insert(NUNCHUK_BTN_SHIFT_SHAKE, "Nunchuk Shift Shake"); text_actions_.insert(WiimotedevShortcuts::WiimotedevActiveDeactive, tr("Active/deactive Wiiremote")); text_actions_.insert(WiimotedevShortcuts::PlayerNextTrack, tr("Next track")); text_actions_.insert(WiimotedevShortcuts::PlayerPreviousTrack, tr("Previous track")); text_actions_.insert(WiimotedevShortcuts::PlayerPlay, tr("Play")); text_actions_.insert(WiimotedevShortcuts::PlayerStop, tr("Stop")); text_actions_.insert(WiimotedevShortcuts::PlayerIncVolume, tr("Increase volume")); text_actions_.insert(WiimotedevShortcuts::PlayerDecVolume, tr("Decrease volume")); text_actions_.insert(WiimotedevShortcuts::PlayerMute, tr("Mute")); text_actions_.insert(WiimotedevShortcuts::PlayerPause, tr("Pause")); text_actions_.insert(WiimotedevShortcuts::PlayerTogglePause, tr("Play/Pause")); text_actions_.insert(WiimotedevShortcuts::PlayerSeekBackward, tr("Seek backward")); text_actions_.insert(WiimotedevShortcuts::PlayerSeekForward, tr("Seek forward")); text_actions_.insert(WiimotedevShortcuts::PlayerStopAfter, tr("Stop after")); text_actions_.insert(WiimotedevShortcuts::PlayerShowOSD, tr("Show OSD")); connect(ui_->list, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), SLOT(ItemClicked(QTreeWidgetItem*))); connect(ui_->wiimotedev_add_action, SIGNAL(clicked()), this, SLOT(AddAction())); connect(ui_->wiimotedev_delete_action, SIGNAL(clicked()), this, SLOT(DeleteAction())); connect(ui_->wiimotedev_reload, SIGNAL(clicked()), this, SLOT(DefaultSettings())); } void WiimoteSettingsPage::AddShortcut(quint64 button, quint32 action) { for (const Shortcut& shortcut : actions_) { if (shortcut.button == button) { QMessageBox::information(this, tr("Information"), QString(tr("Shortcut for %1 already exists")) .arg(GetReadableWiiremoteSequence(button)), QMessageBox::Ok); return; } } Shortcut s; s.object = new QTreeWidgetItem( ui_->list, QStringList() << GetReadableWiiremoteSequence(button) << text_actions_[action]); s.button = button; s.action = action; actions_ << s; } void WiimoteSettingsPage::Load() { QSettings s; s.beginGroup(WiimotedevShortcuts::kSettingsGroup); ui_->wiimotedev_enable->setChecked(s.value("enabled", false).toBool()); ui_->wiimotedev_active->setChecked( s.value("use_active_action", true).toBool()); ui_->wiimotedev_focus->setChecked( s.value("only_when_focused", false).toBool()); ui_->wiimotedev_notification->setChecked( s.value("use_notification", true).toBool()); ui_->wiimotedev_device->setValue(s.value("device", 1).toUInt()); bool first_conf = s.value("first_conf", true).toBool(); s.endGroup(); if (first_conf) { DefaultSettings(); return; } s.beginGroup(WiimotedevShortcuts::kActionsGroup); ui_->list->clear(); actions_.clear(); quint64 fvalue, svalue; bool fvalid, svalid; for (const QString& str : s.allKeys()) { fvalue = str.toULongLong(&fvalid, 10); svalue = s.value(str, 0).toULongLong(&svalid); if (fvalid && svalid) AddShortcut(fvalue, svalue); } s.endGroup(); ui_->list->sortItems(1, Qt::AscendingOrder); } void WiimoteSettingsPage::Save() { QSettings s; s.beginGroup(WiimotedevShortcuts::kActionsGroup); s.remove(""); for (const Shortcut& shortcut : actions_) s.setValue(QString::number(shortcut.button), shortcut.action); s.endGroup(); s.beginGroup(WiimotedevShortcuts::kSettingsGroup); s.setValue("first_conf", false); s.setValue("enabled", ui_->wiimotedev_enable->isChecked()); s.setValue("only_when_focused", ui_->wiimotedev_focus->isChecked()); s.setValue("use_active_action", ui_->wiimotedev_active->isChecked()); s.setValue("use_notification", ui_->wiimotedev_notification->isChecked()); s.setValue("device", ui_->wiimotedev_device->value()); s.endGroup(); } void WiimoteSettingsPage::DefaultSettings() { ui_->list->clear(); actions_.clear(); AddShortcut(WIIMOTE_BTN_LEFT, WiimotedevShortcuts::PlayerPreviousTrack); AddShortcut(WIIMOTE_BTN_RIGHT, WiimotedevShortcuts::PlayerNextTrack); AddShortcut(WIIMOTE_BTN_SHIFT_LEFT, WiimotedevShortcuts::PlayerPreviousTrack); AddShortcut(WIIMOTE_BTN_SHIFT_RIGHT, WiimotedevShortcuts::PlayerNextTrack); AddShortcut(WIIMOTE_BTN_PLUS, WiimotedevShortcuts::PlayerIncVolume); AddShortcut(WIIMOTE_BTN_MINUS, WiimotedevShortcuts::PlayerDecVolume); AddShortcut(WIIMOTE_BTN_1, WiimotedevShortcuts::PlayerTogglePause); AddShortcut(WIIMOTE_BTN_2, WiimotedevShortcuts::PlayerShowOSD); AddShortcut(WIIMOTE_BTN_A, WiimotedevShortcuts::WiimotedevActiveDeactive); ui_->list->sortItems(1, Qt::AscendingOrder); } void WiimoteSettingsPage::ItemClicked(QTreeWidgetItem* selected_item) { selected_item_ = selected_item; } QString WiimoteSettingsPage::GetReadableWiiremoteSequence(quint64 value) { QMapIterator text(text_buttons_); QStringList list; while (text.hasNext()) { text.next(); if ((text.key() & value) == text.key()) list << text.value(); } QString output; if (!list.isEmpty()) { for (int i = 0; i < (list.count() - 1); ++i) output += list.at(i) + " + "; output += list.last(); } else output = tr("Push Wiiremote button"); return output; } void WiimoteSettingsPage::AddAction() { emit SetWiimotedevInterfaceActived(false); WiimoteShortcutGrabber grabber(0, ui_->wiimotedev_device->value(), this); connect(&grabber, SIGNAL(AddShortcut(quint64, quint32)), this, SLOT(AddShortcut(quint64, quint32)), Qt::QueuedConnection); grabber.exec(); emit SetWiimotedevInterfaceActived(true); ui_->list->sortItems(1, Qt::AscendingOrder); } void WiimoteSettingsPage::DeleteAction() { for (int i = 0; i < actions_.count(); ++i) { if (actions_.at(i).object == selected_item_) { delete selected_item_; actions_.removeAt(i); break; } } } clementine-1.2.3+git1354-gdaddbde+dfsg/src/wiimotedev/wiimotesettingspage.h000066400000000000000000000033221260417502300265760ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef WIIMOTESETTINGSPAGE_H #define WIIMOTESETTINGSPAGE_H #include "ui/settingspage.h" #include class QTreeWidgetItem; class Ui_WiimoteSettingsPage; class WiimoteSettingsPage : public SettingsPage { Q_OBJECT public: WiimoteSettingsPage(SettingsDialog* dialog); void Load(); void Save(); QString GetReadableWiiremoteSequence(quint64 value); QStringList TextActions() const { return text_actions_.values(); } signals: void SetWiimotedevInterfaceActived(bool); private slots: void AddAction(); void AddShortcut(quint64 button, quint32 action); void DefaultSettings(); void DeleteAction(); void ItemClicked(QTreeWidgetItem*); private: struct Shortcut { QTreeWidgetItem* object; quint64 button; quint32 action; }; Ui_WiimoteSettingsPage* ui_; QString current_id_; QList actions_; QMap text_buttons_; QMap text_actions_; QTreeWidgetItem* selected_item_; }; #endif // WIIMOTESETTINGSPAGE_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/wiimotedev/wiimotesettingspage.ui000066400000000000000000000144131260417502300267670ustar00rootroot00000000000000 WiimoteSettingsPage 0 0 507 393 Wiimotedev :/icon.png:/icon.png Enable Wii Remote support You can use your Wii Remote as a remote control for Clementine. <a href="http://www.clementine-player.org/wiimote">See the page on the Clementine wiki</a> for more information. true true Qt::Horizontal false 0 Connect Wii Remotes using active/deactive action true Enable shortcuts only when Clementine is focused Use notifications to report Wii Remote status 0 0 Use Wii Remote 1 999999999 QAbstractItemView::NoEditTriggers true false true Buttons Action 0 0 Add action :/icons/22x22/list-add.png:/icons/22x22/list-add.png Remove action :/icons/22x22/list-remove.png:/icons/22x22/list-remove.png Defaults :/icons/22x22/view-refresh.png:/icons/22x22/view-refresh.png Qt::Horizontal 40 20 wiimotedev_enable toggled(bool) widget setEnabled(bool) 226 19 495 44 clementine-1.2.3+git1354-gdaddbde+dfsg/src/wiimotedev/wiimoteshortcutgrabber.cpp000066400000000000000000000103361260417502300276370ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "consts.h" #include "wiimoteshortcutgrabber.h" #include "ui_wiimoteshortcutgrabber.h" WiimoteShortcutGrabber::WiimoteShortcutGrabber(quint32 action, quint32 device, WiimoteSettingsPage* parent) : QDialog(parent), pref_action_(action), ui_(new Ui_WiimoteShortcutGrabber), config_(parent), wiimotedev_device_(device), wiimotedev_buttons_(0), remember_wiimote_shifts_(0), remember_nunchuk_shifts_(0) { ui_->setupUi(this); if (QDBusConnection::systemBus().isConnected()) { wiimotedev_iface_.reset(new OrgWiimotedevDeviceEventsInterface( WIIMOTEDEV_DBUS_SERVICE_NAME, WIIMOTEDEV_DBUS_EVENTS_OBJECT, QDBusConnection::systemBus(), this)); connect(wiimotedev_iface_.get(), SIGNAL(dbusWiimoteGeneralButtons(uint, qulonglong)), this, SLOT(DbusWiimoteGeneralButtons(uint, qulonglong))); } for (const QString& name : config_->TextActions()) ui_->comboBox->addItem(name); ui_->comboBox->setCurrentIndex(pref_action_); ui_->keep_label->setVisible(false); connect(ui_->remember_shifts, SIGNAL(clicked(bool)), this, SLOT(RememberSwingChecked(bool))); connect(ui_->buttonBox, SIGNAL(rejected()), this, SLOT(close())); connect(&line_, SIGNAL(frameChanged(int)), this, SLOT(Timeout(int))); line_.setFrameRange(4, 0); line_.setEasingCurve(QEasingCurve::Linear); line_.setDuration(line_.startFrame() * 1000); } WiimoteShortcutGrabber::~WiimoteShortcutGrabber() { delete ui_; } void WiimoteShortcutGrabber::Timeout(int secs) { if (!secs) { emit AddShortcut(wiimotedev_buttons_, ui_->comboBox->currentIndex()); close(); } if (secs == 1) ui_->keep_label->setText(QString(tr("Keep buttons for %1 second...")) .arg(QString::number(secs))); else ui_->keep_label->setText(QString(tr("Keep buttons for %1 seconds...")) .arg(QString::number(secs))); } void WiimoteShortcutGrabber::RememberSwingChecked(bool checked) { quint64 buttons = wiimotedev_buttons_; line_.stop(); ui_->keep_label->setVisible(false); if (checked) { buttons |= remember_wiimote_shifts_ | remember_nunchuk_shifts_; ui_->combo->setText(config_->GetReadableWiiremoteSequence(buttons)); } else { remember_wiimote_shifts_ = 0; remember_nunchuk_shifts_ = 0; buttons &= ~(WIIMOTE_SHIFT_MASK | NUNCHUK_SHIFT_MASK); ui_->combo->setText(config_->GetReadableWiiremoteSequence(buttons)); } } void WiimoteShortcutGrabber::DbusWiimoteGeneralButtons(uint id, qulonglong value) { if (wiimotedev_device_ != id) return; quint64 buttons = value & ~(WIIMOTE_TILT_MASK | NUNCHUK_TILT_MASK | WIIMOTE_BTN_SHIFT_SHAKE | NUNCHUK_BTN_SHIFT_SHAKE); if (ui_->remember_shifts->isChecked()) { if (!(buttons & WIIMOTE_SHIFT_MASK)) buttons |= remember_wiimote_shifts_; if (!(buttons & NUNCHUK_SHIFT_MASK)) buttons |= remember_nunchuk_shifts_; } if (wiimotedev_buttons_ == buttons) return; remember_wiimote_shifts_ = buttons & WIIMOTE_SHIFT_MASK; remember_nunchuk_shifts_ = buttons & NUNCHUK_SHIFT_MASK; line_.stop(); if (buttons) line_.start(); ui_->keep_label->setVisible(buttons); ui_->keep_label->setText(QString(tr("Keep buttons for %1 seconds...")) .arg(QString::number(line_.startFrame()))); ui_->combo->setText(config_->GetReadableWiiremoteSequence(buttons)); wiimotedev_buttons_ = buttons; } clementine-1.2.3+git1354-gdaddbde+dfsg/src/wiimotedev/wiimoteshortcutgrabber.h000066400000000000000000000033121260417502300273000ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef WIIMOTESHORTCUTGRABBER_H #define WIIMOTESHORTCUTGRABBER_H #include #include #include #include "wiimotesettingspage.h" #include "dbus/wiimotedev.h" class Ui_WiimoteShortcutGrabber; class WiimoteShortcutGrabber : public QDialog { Q_OBJECT public: WiimoteShortcutGrabber(quint32 action, quint32 device, WiimoteSettingsPage* parent); ~WiimoteShortcutGrabber(); private slots: void DbusWiimoteGeneralButtons(uint id, qulonglong value); void RememberSwingChecked(bool checked); void Timeout(int); private: QTimeLine line_; quint32 pref_action_; Ui_WiimoteShortcutGrabber* ui_; WiimoteSettingsPage* config_; std::unique_ptr wiimotedev_iface_; quint32 wiimotedev_device_; quint64 wiimotedev_buttons_; quint64 remember_wiimote_shifts_; quint64 remember_nunchuk_shifts_; signals: void AddShortcut(quint64 buttons, quint32 action); }; #endif // WIIMOTESHORTCUTGRABBER_H clementine-1.2.3+git1354-gdaddbde+dfsg/src/wiimotedev/wiimoteshortcutgrabber.ui000066400000000000000000000063221260417502300274720ustar00rootroot00000000000000 WiimoteShortcutGrabber 0 0 418 160 Add wiimotedev action :/icons/32x32/wiimotedev.png:/icons/32x32/wiimotedev.png 0 0 Press a button combination to use for Qt::AlignCenter 0 0 0 0 0 40 Push Wiiremote button Qt::PlainText Qt::AlignCenter true Remember Wii remote swing true 0 Keep buttons for %1 seconds... Qt::Horizontal QDialogButtonBox::Cancel clementine-1.2.3+git1354-gdaddbde+dfsg/tests/000077500000000000000000000000001260417502300205315ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/tests/CMakeLists.txt000066400000000000000000000123731260417502300232770ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.6) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -fpermissive -Wno-c++11-narrowing -U__STRICT_ANSI__") if(USE_SYSTEM_GMOCK) include_directories(${GMOCK_INCLUDE_DIRS} ${GTEST_INCLUDE_DIRS}) else(USE_SYSTEM_GMOCK) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/gmock/include) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/gmock/gtest/include) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/gmock/gtest) endif(USE_SYSTEM_GMOCK) include_directories(${CMAKE_SOURCE_DIR}/src) include_directories(${CMAKE_BINARY_DIR}/src) include_directories(${CMAKE_SOURCE_DIR}/ext/clementine-tagreader) include_directories(${CMAKE_SOURCE_DIR}/ext/libclementine-common) include_directories(${CMAKE_SOURCE_DIR}/ext/libclementine-tagreader) include_directories(${CMAKE_BINARY_DIR}/ext/libclementine-tagreader) include_directories(${QT_QTTEST_INCLUDE_DIR}) if(HAVE_LIBGPOD) include_directories(${LIBGPOD_INCLUDE_DIRS}) endif(HAVE_LIBGPOD) if(HAVE_LIBLASTFM) include_directories(${LASTFM_INCLUDE_DIRS}) endif(HAVE_LIBLASTFM) if(NOT USE_SYSTEM_GMOCK) set(GTEST-SOURCES ../3rdparty/gmock/gtest/src/gtest.cc ../3rdparty/gmock/gtest/src/gtest-death-test.cc ../3rdparty/gmock/gtest/src/gtest-filepath.cc ../3rdparty/gmock/gtest/src/gtest-port.cc ../3rdparty/gmock/gtest/src/gtest-test-part.cc ../3rdparty/gmock/gtest/src/gtest-typed-test.cc ) add_library(gtest STATIC EXCLUDE_FROM_ALL ${GTEST-SOURCES}) set(GMOCK-SOURCES ../3rdparty/gmock/src/gmock-cardinalities.cc ../3rdparty/gmock/src/gmock.cc ../3rdparty/gmock/src/gmock-internal-utils.cc ../3rdparty/gmock/src/gmock-matchers.cc ../3rdparty/gmock/src/gmock-printers.cc ../3rdparty/gmock/src/gmock-spec-builders.cc ) add_library(gmock STATIC EXCLUDE_FROM_ALL ${GMOCK-SOURCES}) set(GMOCK_LIBRARIES gmock gtest) endif(NOT USE_SYSTEM_GMOCK) add_definitions(-DGTEST_USE_OWN_TR1_TUPLE=1) set(TESTUTILS-SOURCES mock_networkaccessmanager.cpp mock_playlistitem.cpp test_utils.cpp testobjectdecorators.cpp ${CMAKE_SOURCE_DIR}/ext/libclementine-tagreader/fmpsparser.cpp ) set(TESTUTILS-MOC-HEADERS mock_networkaccessmanager.h test_utils.h testobjectdecorators.h ) qt4_wrap_cpp(TESTUTILS-SOURCES-MOC ${TESTUTILS-MOC-HEADERS}) add_library(test_utils STATIC EXCLUDE_FROM_ALL ${TESTUTILS-SOURCES} ${TESTUTILS-SOURCES-MOC}) target_link_libraries(test_utils ${GMOCK_LIBRARIES} ${QT_LIBRARIES} ${QT_QTTEST_LIBRARY}) add_custom_target(test echo "Running tests" WORKING_DIRECTORY ${CURRENT_BINARY_DIR} ) add_custom_target(build_tests WORKING_DIRECTORY ${CURRENT_BINARY_DIR} ) add_dependencies(test build_tests) qt4_add_resources(TEST-RESOURCE-SOURCES data/testdata.qrc) add_library(test_gui_main STATIC EXCLUDE_FROM_ALL ${TEST-RESOURCE-SOURCES} main.cpp) target_link_libraries(test_gui_main clementine_lib) set_target_properties(test_gui_main PROPERTIES COMPILE_DEFINITIONS GUI) add_library(test_main STATIC EXCLUDE_FROM_ALL ${TEST-RESOURCE-SOURCES} main.cpp) target_link_libraries(test_main clementine_lib) # Given a file foo_test.cpp, creates a target foo_test and adds it to the test target. macro(add_test_file test_source gui_required) get_filename_component(TEST_NAME ${test_source} NAME_WE) add_executable(${TEST_NAME} EXCLUDE_FROM_ALL ${test_source} ) target_link_libraries(${TEST_NAME} ${GMOCK_LIBRARIES} clementine_lib test_utils) set(GUI_REQUIRED ${gui_required}) if (GUI_REQUIRED) target_link_libraries(${TEST_NAME} test_gui_main) else (GUI_REQUIRED) target_link_libraries(${TEST_NAME} test_main) endif (GUI_REQUIRED) check_cxx_compiler_flag("-Wno-bool-conversions" SUPPORTS_NOBOOL) if (SUPPORTS_NOBOOL) set_target_properties(${TEST_NAME} PROPERTIES COMPILE_FLAGS "-Wno-bool-conversions") endif (SUPPORTS_NOBOOL) add_custom_command(TARGET test POST_BUILD COMMAND ./${TEST_NAME}${CMAKE_EXECUTABLE_SUFFIX}) add_dependencies(build_tests ${TEST_NAME}) endmacro (add_test_file) #add_test_file(albumcoverfetcher_test.cpp false) #add_test_file(albumcovermanager_test.cpp true) add_test_file(asxparser_test.cpp false) add_test_file(asxiniparser_test.cpp false) #add_test_file(cueparser_test.cpp false) #add_test_file(database_test.cpp false) #add_test_file(fileformats_test.cpp false) add_test_file(fmpsparser_test.cpp false) #add_test_file(librarybackend_test.cpp false) #add_test_file(librarymodel_test.cpp true) #add_test_file(m3uparser_test.cpp false) add_test_file(mergedproxymodel_test.cpp false) add_test_file(musicbrainzclient_test.cpp false) add_test_file(organiseformat_test.cpp false) add_test_file(organisedialog_test.cpp false) #add_test_file(playlist_test.cpp true) #add_test_file(plsparser_test.cpp false) add_test_file(scopedtransaction_test.cpp false) #add_test_file(songloader_test.cpp false) add_test_file(songplaylistitem_test.cpp false) add_test_file(song_test.cpp false) add_test_file(translations_test.cpp false) add_test_file(utilities_test.cpp false) #add_test_file(xspfparser_test.cpp false) add_test_file(closure_test.cpp false) add_test_file(concurrentrun_test.cpp false) add_test_file(zeroconf_test.cpp false) add_test_file(sqlite_test.cpp false) #if(LINUX AND HAVE_DBUS) # add_test_file(mpris1_test.cpp true) #endif(LINUX AND HAVE_DBUS) clementine-1.2.3+git1354-gdaddbde+dfsg/tests/albumcoverfetcher_test.cpp000066400000000000000000000051611260417502300257770ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "core/albumcoverfetcher.h" #include "core/networkaccessmanager.h" #include #include #include #include #include "mock_networkaccessmanager.h" #include "gtest/gtest.h" namespace { class AlbumCoverFetcherTest : public ::testing::Test { protected: static void SetUpTestCase() { lastfm::ws::ApiKey = "foobar"; // Lastfm takes ownership of this. mock_network_ = new MockNetworkAccessManager; lastfm::setNetworkAccessManager(mock_network_); } void SetUp() { network_ = new NetworkAccessManager(nullptr, mock_network_); } void TearDown() { delete network_; } static void TearDownTestCase() { delete mock_network_; } static MockNetworkAccessManager* mock_network_; NetworkAccessManager* network_; }; MockNetworkAccessManager* AlbumCoverFetcherTest::mock_network_; TEST_F(AlbumCoverFetcherTest, FetchesAlbumCover) { QByteArray data("BarFoo" "http://example.com/image.jpg"); QMap params; params["artist"] = "Foo"; params["album"] = "Bar"; params["api_key"] = "foobar"; params["method"] = "album.getInfo"; MockNetworkReply* get_info_reply = mock_network_->ExpectGet("audioscrobbler", params, 200, data); params.clear(); MockNetworkReply* album_reply = mock_network_->ExpectGet("http://example.com/image.jpg", params, 200, ""); AlbumCoverFetcher fetcher(network_, nullptr); QSignalSpy spy(&fetcher, SIGNAL(AlbumCoverFetched(quint64, const QImage&))); ASSERT_TRUE(spy.isValid()); fetcher.FetchAlbumCover("Foo", "Bar"); get_info_reply->Done(); QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); album_reply->Done(); QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); EXPECT_EQ(1, spy.count()); } } // namespace clementine-1.2.3+git1354-gdaddbde+dfsg/tests/albumcovermanager_test.cpp000066400000000000000000000047321260417502300257740ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "covers/coverproviders.h" #include "ui/albumcovermanager.h" #include "gtest/gtest.h" #include "mock_networkaccessmanager.h" #include class AlbumCoverManagerTest : public ::testing::Test { protected: AlbumCoverManagerTest() : manager_(nullptr, &cover_providers_, nullptr, &mock_network_) { } MockNetworkAccessManager mock_network_; CoverProviders cover_providers_; AlbumCoverManager manager_; }; TEST_F(AlbumCoverManagerTest, HidesItemsWithCover) { QListWidgetItem hidden_item; EXPECT_TRUE(manager_.ShouldHide(hidden_item, QString(), AlbumCoverManager::Hide_WithCovers)); QListWidgetItem shown_item; shown_item.setIcon(manager_.no_cover_icon_); EXPECT_FALSE(manager_.ShouldHide(shown_item, QString(), AlbumCoverManager::Hide_WithCovers)); } TEST_F(AlbumCoverManagerTest, HidesItemsWithoutCover) { QListWidgetItem hidden_item; hidden_item.setIcon(manager_.no_cover_icon_); EXPECT_TRUE(manager_.ShouldHide(hidden_item, QString(), AlbumCoverManager::Hide_WithoutCovers)); QListWidgetItem shown_item; EXPECT_FALSE(manager_.ShouldHide(shown_item, QString(), AlbumCoverManager::Hide_WithoutCovers)); } TEST_F(AlbumCoverManagerTest, HidesItemsWithFilter) { QListWidgetItem hidden_item; hidden_item.setText("barbaz"); EXPECT_TRUE(manager_.ShouldHide(hidden_item, "foo", AlbumCoverManager::Hide_None)); EXPECT_TRUE(manager_.ShouldHide(hidden_item, "foo abc", AlbumCoverManager::Hide_None)); QListWidgetItem shown_item; shown_item.setText("foobar"); EXPECT_FALSE(manager_.ShouldHide(shown_item, "foo", AlbumCoverManager::Hide_None)); EXPECT_TRUE(manager_.ShouldHide(shown_item, "abc bar", AlbumCoverManager::Hide_None)); EXPECT_FALSE(manager_.ShouldHide(shown_item, "bar foo", AlbumCoverManager::Hide_None)); } clementine-1.2.3+git1354-gdaddbde+dfsg/tests/asxiniparser_test.cpp000066400000000000000000000040111260417502300250000ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "test_utils.h" #include "gmock/gmock-matchers.h" #include "gtest/gtest.h" #include "playlistparsers/asxiniparser.h" #include "playlistparsers/playlistparser.h" #include #include class AsxIniParserTest : public ::testing::Test { protected: AsxIniParserTest() : parser_(nullptr) {} AsxIniParser parser_; }; TEST_F(AsxIniParserTest, ParsesBasicTrackList) { QFile file(":/testdata/test.asxini"); file.open(QIODevice::ReadOnly); SongList songs = parser_.Load(&file, "", QDir()); ASSERT_EQ(2, songs.length()); EXPECT_EQ(QUrl("http://195.245.168.21/antena3?MSWMExt=.asf"), songs[0].url()); EXPECT_EQ(QUrl("http://195.245.168.21:80/antena3?MSWMExt=.asf"), songs[1].url()); EXPECT_TRUE(songs[0].is_valid()); EXPECT_TRUE(songs[1].is_valid()); } TEST_F(AsxIniParserTest, Magic) { QFile file(":/testdata/test.asxini"); file.open(QIODevice::ReadOnly); EXPECT_TRUE(parser_.TryMagic(file.read(PlaylistParser::kMagicSize))); } TEST_F(AsxIniParserTest, WritesBasicTrackList) { QByteArray data; QBuffer buffer(&data); buffer.open(QIODevice::WriteOnly); Song song; song.set_url(QUrl("http://www.example.com/foo.mp3")); SongList songs; songs << song; parser_.Save(songs, &buffer); EXPECT_EQ("[Reference]\nRef1=http://www.example.com/foo.mp3\n", QString(data)); } clementine-1.2.3+git1354-gdaddbde+dfsg/tests/asxparser_test.cpp000066400000000000000000000103771260417502300243140ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "test_utils.h" #include "gmock/gmock-matchers.h" #include "gtest/gtest.h" #include "core/timeconstants.h" #include "playlistparsers/asxparser.h" #include #include using ::testing::HasSubstr; class ASXParserTest : public ::testing::Test { }; TEST_F(ASXParserTest, ParsesOneTrackFromXML) { QByteArray data = "foobar" "" "Foo" "Bar" "mumble mumble" ""; QBuffer buffer(&data); buffer.open(QIODevice::ReadOnly); ASXParser parser(nullptr); SongList songs = parser.Load(&buffer); ASSERT_EQ(1, songs.length()); const Song& song = songs[0]; EXPECT_EQ("Foo", song.title()); EXPECT_EQ("Bar", song.artist()); EXPECT_EQ(QUrl("http://example.com/foo.mp3"), song.url()); EXPECT_TRUE(song.is_valid()); } TEST_F(ASXParserTest, ParsesMoreThanOneTrackFromXML) { QByteArray data = "" "" "" "" "" "" "" ""; QBuffer buffer(&data); buffer.open(QIODevice::ReadOnly); ASXParser parser(nullptr); SongList songs = parser.Load(&buffer); ASSERT_EQ(2, songs.length()); EXPECT_EQ(QUrl("http://example.com/foo.mp3"), songs[0].url()); EXPECT_EQ(QUrl("http://example.com/bar.mp3"), songs[1].url()); EXPECT_TRUE(songs[0].is_stream()); EXPECT_TRUE(songs[1].is_stream()); } TEST_F(ASXParserTest, ParsesBrokenXmlEntities) { QByteArray data = "" "DI.fm" "Digitally Imported Radio" "2006 Digitally Imported., Inc" "" " " " " " " " Classic Trance" " Digitally Imported Premium" " " ""; QBuffer buffer(&data); buffer.open(QIODevice::ReadOnly); ASXParser parser(nullptr); SongList songs = parser.Load(&buffer); ASSERT_EQ(1, songs.length()); EXPECT_EQ(QUrl("mms://72.26.204.105/classictrance128k?user=h&pass=xxxxxxxxxxxxxxx"), songs[0].url()); } TEST_F(ASXParserTest, SavesSong) { QByteArray data; QBuffer buffer(&data); buffer.open(QIODevice::WriteOnly); ASXParser parser(nullptr); Song one; one.set_url(QUrl("http://www.example.com/foo.mp3")); one.set_filetype(Song::Type_Stream); one.set_title("foo"); one.set_length_nanosec(123 * kNsecPerSec); one.set_artist("bar"); SongList songs; songs << one; parser.Save(songs, &buffer); EXPECT_THAT(data.constData(), HasSubstr("")); EXPECT_THAT(data.constData(), HasSubstr("foo")); EXPECT_THAT(data.constData(), HasSubstr("bar")); } TEST_F(ASXParserTest, ParsesSomaFM) { QFile somafm(":/testdata/secretagent.asx"); somafm.open(QIODevice::ReadOnly); ASXParser parser(nullptr); SongList songs = parser.Load(&somafm); ASSERT_EQ(4, songs.count()); EXPECT_EQ("SomaFM: Secret Agent", songs[0].title()); EXPECT_EQ("Keep us on the air! Click Support SomaFM above!", songs[0].artist()); EXPECT_EQ(QUrl("http://streamer-ntc-aa03.somafm.com:80/stream/1021"), songs[0].url()); } clementine-1.2.3+git1354-gdaddbde+dfsg/tests/closure_test.cpp000066400000000000000000000064561260417502300237630ustar00rootroot00000000000000#include "gtest/gtest.h" #include #include #include #include #include #include #include "config.h" #include "core/closure.h" #include "test_utils.h" TEST(ClosureTest, ClosureInvokesReceiver) { TestQObject sender; TestQObject receiver; _detail::ClosureBase* closure = NewClosure( &sender, SIGNAL(Emitted()), &receiver, SLOT(Invoke())); EXPECT_EQ(0, receiver.invoked()); sender.Emit(); EXPECT_EQ(1, receiver.invoked()); } TEST(ClosureTest, ClosureDeletesSelf) { TestQObject sender; TestQObject receiver; _detail::ClosureBase* closure = NewClosure( &sender, SIGNAL(Emitted()), &receiver, SLOT(Invoke())); _detail::ObjectHelper* helper = closure->helper(); QSignalSpy spy(helper, SIGNAL(destroyed())); EXPECT_EQ(0, receiver.invoked()); sender.Emit(); EXPECT_EQ(1, receiver.invoked()); EXPECT_EQ(0, spy.count()); QEventLoop loop; QObject::connect(helper, SIGNAL(destroyed()), &loop, SLOT(quit())); loop.exec(); EXPECT_EQ(1, spy.count()); } TEST(ClosureTest, ClosureDoesNotCrashWithSharedPointerSender) { TestQObject receiver; TestQObject* sender; std::unique_ptr spy; QPointer<_detail::ObjectHelper> closure; { QSharedPointer sender_shared(new TestQObject); sender = sender_shared.data(); closure = QPointer<_detail::ObjectHelper>(NewClosure( sender_shared, SIGNAL(Emitted()), &receiver, SLOT(Invoke()))->helper()); spy.reset(new QSignalSpy(sender, SIGNAL(destroyed()))); } ASSERT_EQ(0, receiver.invoked()); sender->Emit(); ASSERT_EQ(1, receiver.invoked()); ASSERT_EQ(0, spy->count()); QEventLoop loop; QObject::connect(sender, SIGNAL(destroyed()), &loop, SLOT(quit())); loop.exec(); ASSERT_EQ(1, spy->count()); EXPECT_TRUE(closure.isNull()); } namespace { void Foo(bool* called, int question, int* answer) { *called = true; *answer = question; } } // namespace TEST(ClosureTest, ClosureWorksWithFunctionPointers) { TestQObject sender; bool called = false; int question = 42; int answer = 0; NewClosure( &sender, SIGNAL(Emitted()), &Foo, &called, question, &answer); EXPECT_FALSE(called); sender.Emit(); EXPECT_TRUE(called); EXPECT_EQ(question, answer); } TEST(ClosureTest, ClosureWorksWithStandardFunctions) { TestQObject sender; bool called = false; int question = 42; int answer = 0; std::function callback(&Foo); NewClosure( &sender, SIGNAL(Emitted()), callback, &called, question, &answer); EXPECT_FALSE(called); sender.Emit(); EXPECT_TRUE(called); EXPECT_EQ(question, answer); } namespace { class Bar { public: explicit Bar(int a) : foo_(a) {} bool Foo(int* answer) { *answer = foo_; return true; } private: int foo_; }; } TEST(ClosureTest, ClosureWorksWithMemberFunctionPointers) { TestQObject sender; Bar receiver(42); int q = 1; NewClosure( &sender, SIGNAL(Emitted()), &receiver, &Bar::Foo, &q); EXPECT_EQ(1, q); sender.Emit(); EXPECT_EQ(42, q); } TEST(ClosureTest, ClosureCallsLambda) { TestQObject sender; bool called = false; NewClosure( &sender, SIGNAL(Emitted()), [&called] () { called = true; }); EXPECT_FALSE(called); sender.Emit(); EXPECT_TRUE(called); } clementine-1.2.3+git1354-gdaddbde+dfsg/tests/concurrentrun_test.cpp000066400000000000000000000075461260417502300252170ustar00rootroot00000000000000#include "gtest/gtest.h" #include #include #include #include #include "core/concurrentrun.h" #include "test_utils.h" int f() { return 1337; } TEST(ConcurrentRunTest, ConcurrentRun0StartAndWait) { QThreadPool threadpool; QFuture future = ConcurrentRun::Run(&threadpool, &f); QFutureWatcher watcher; watcher.setFuture(future); QEventLoop loop; QObject::connect(&watcher, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); EXPECT_EQ(1337, watcher.result()); } int g(int i) { return ++i; } TEST(ConcurrentRunTest, ConcurrentRun1StartAndWait) { QThreadPool threadpool; int i = 1336; QFuture future = ConcurrentRun::Run(&threadpool, &g, i); QFutureWatcher watcher; watcher.setFuture(future); QEventLoop loop; QObject::connect(&watcher, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); EXPECT_EQ(1337, watcher.result()); } int max(int i, int j) { return (i > j ? i : j); } TEST(ConcurrentRunTest, ConcurrentRun2StartAndWait) { int i = 10; int j = 42; QThreadPool threadpool; QFuture future = ConcurrentRun::Run(&threadpool, &max, i, j); QFutureWatcher watcher; watcher.setFuture(future); QEventLoop loop; QObject::connect(&watcher, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); EXPECT_EQ(42, watcher.result()); } int sum(int a, int b, int c) { return a + b + c; } TEST(ConcurrentRunTest, ConcurrentRun3StartAndWait) { int i = 10; int j = 42; int k = 50; QThreadPool threadpool; QFuture future = ConcurrentRun::Run(&threadpool, &sum, i, j, k); QFutureWatcher watcher; watcher.setFuture(future); QEventLoop loop; QObject::connect(&watcher, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); EXPECT_EQ(102, watcher.result()); } void aFunction(int* n) { *n = 1337; } void bFunction(int* n, int *m) { aFunction(n); *m = 1338; } void cFunction(int* n, int *m, int *o) { bFunction(n, m); *o = 1339; } TEST(ConcurrentRunTest, ConcurrentRunVoidFunction1Start) { QThreadPool threadpool; int n = 10; QFuture future = ConcurrentRun::Run(&threadpool, &aFunction, &n); QFutureWatcher watcher; watcher.setFuture(future); QEventLoop loop; QObject::connect(&watcher, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); EXPECT_EQ(1337, n); } TEST(ConcurrentRunTest, ConcurrentRunVoidFunction2Start) { QThreadPool threadpool; int n = 10, m = 11; QFuture future = ConcurrentRun::Run(&threadpool, &bFunction, &n, &m); QFutureWatcher watcher; watcher.setFuture(future); QEventLoop loop; QObject::connect(&watcher, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); EXPECT_EQ(1337, n); EXPECT_EQ(1338, m); } TEST(ConcurrentRunTest, ConcurrentRunVoidFunction3Start) { QThreadPool threadpool; int n = 10, m = 11, o = 12; QFuture future = ConcurrentRun::Run(&threadpool, &cFunction, &n, &m, &o); QFutureWatcher watcher; watcher.setFuture(future); QEventLoop loop; QObject::connect(&watcher, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); EXPECT_EQ(1337, n); EXPECT_EQ(1338, m); EXPECT_EQ(1339, o); } class A { public: void f(int* i) { *i = *i + 1; } }; TEST(ConcurrentRunTest, ConcurrentRunVoidBindFunctionStart) { QThreadPool threadpool; A a; int nb = 10; QFuture future = ConcurrentRun::Run(&threadpool, std::bind(&A::f, &a, &nb)); QFutureWatcher watcher; watcher.setFuture(future); QEventLoop loop; QObject::connect(&watcher, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); EXPECT_EQ(11, nb); } // TODO: add some more complex test cases? (e.g. with several CPU-consuming // tasks launched in parallel, with/without threadpool's threads numbers // decreased, etc.) clementine-1.2.3+git1354-gdaddbde+dfsg/tests/cueparser_test.cpp000066400000000000000000000265021260417502300242720ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "gmock/gmock-matchers.h" #include "gtest/gtest.h" #include "test_utils.h" #include "core/timeconstants.h" #include "playlistparsers/cueparser.h" #include class CueParserTest : public ::testing::Test { protected: CueParserTest() : parser_(nullptr) { } // We believe CUE - all songs with proper CUE entries should be valid. bool validate_songs(SongList songs) { foreach(const Song& song, songs) { if(!song.is_valid()) { return false; } } return true; } qlonglong to_nanosec(int minutes, int seconds, int frames) { return (minutes * 60 * 75 + seconds * 75 + frames) * kNsecPerSec / 75; } CueParser parser_; }; TEST_F(CueParserTest, ParsesASong) { QFile file(":testdata/onesong.cue"); file.open(QIODevice::ReadOnly); SongList song_list = parser_.Load(&file, "CUEPATH", QDir("")); // one song ASSERT_EQ(1, song_list.size()); // with the specified metadata Song first_song = song_list.at(0); ASSERT_EQ("Un soffio caldo", first_song.title()); ASSERT_EQ("Zucchero", first_song.artist()); ASSERT_EQ("Zucchero himself", first_song.albumartist()); ASSERT_EQ("", first_song.album()); ASSERT_EQ(to_nanosec(0, 1, 15), first_song.beginning_nanosec()); ASSERT_EQ(1, first_song.track()); ASSERT_EQ("CUEPATH", first_song.cue_path()); validate_songs(song_list); } TEST_F(CueParserTest, ParsesTwoSongs) { QFile file(":testdata/twosongs.cue"); file.open(QIODevice::ReadOnly); SongList song_list = parser_.Load(&file, "", QDir("")); // two songs ASSERT_EQ(2, song_list.size()); // with the specified metadata Song first_song = song_list.at(0); Song second_song = song_list.at(1); ASSERT_EQ("Un soffio caldo", first_song.title()); ASSERT_EQ("Chocabeck", first_song.album()); ASSERT_EQ("Zucchero himself", first_song.artist()); ASSERT_EQ("Zucchero himself", first_song.albumartist()); ASSERT_EQ(to_nanosec(0, 1, 0), first_song.beginning_nanosec()); ASSERT_EQ(second_song.beginning_nanosec() - first_song.beginning_nanosec(), first_song.length_nanosec()); ASSERT_EQ(1, first_song.track()); ASSERT_EQ("Somewon Else's Tears", second_song.title()); ASSERT_EQ("Chocabeck", second_song.album()); ASSERT_EQ("Zucchero himself", second_song.artist()); ASSERT_EQ("Zucchero himself", second_song.albumartist()); ASSERT_EQ(to_nanosec(5, 3, 68), second_song.beginning_nanosec()); ASSERT_EQ(2, second_song.track()); validate_songs(song_list); } TEST_F(CueParserTest, SkipsBrokenSongs) { QFile file(":testdata/brokensong.cue"); file.open(QIODevice::ReadOnly); SongList song_list = parser_.Load(&file, "", QDir("")); // two songs (the broken one is not in the list) ASSERT_EQ(2, song_list.size()); // with the specified metadata Song first_song = song_list.at(0); Song second_song = song_list.at(1); ASSERT_EQ("Un soffio caldo", first_song.title()); ASSERT_EQ("Chocabeck", first_song.album()); ASSERT_EQ("Zucchero himself", first_song.artist()); ASSERT_EQ("Zucchero himself", first_song.albumartist()); ASSERT_EQ(to_nanosec(0, 1, 0), first_song.beginning_nanosec()); // includes the broken song too; this entry will span from it's // INDEX (beginning) to the end of the next correct song ASSERT_EQ(second_song.beginning_nanosec() - first_song.beginning_nanosec(), first_song.length_nanosec()); ASSERT_EQ(1, first_song.track()); ASSERT_EQ("Somewon Else's Tears", second_song.title()); ASSERT_EQ("Chocabeck", second_song.album()); ASSERT_EQ("Zucchero himself", second_song.artist()); ASSERT_EQ("Zucchero himself", second_song.albumartist()); ASSERT_EQ(to_nanosec(5, 0, 0), second_song.beginning_nanosec()); ASSERT_EQ(2, second_song.track()); validate_songs(song_list); } TEST_F(CueParserTest, UsesAllMetadataInformation) { QFile file(":testdata/fullmetadata.cue"); file.open(QIODevice::ReadOnly); SongList song_list = parser_.Load(&file, "", QDir("")); // two songs ASSERT_EQ(2, song_list.size()); // with the specified metadata Song first_song = song_list.at(0); Song second_song = song_list.at(1); ASSERT_TRUE(first_song.url().toString().endsWith("a_file.mp3")); ASSERT_EQ("Un soffio caldo", first_song.title()); ASSERT_EQ("Album", first_song.album()); ASSERT_EQ("Zucchero", first_song.artist()); ASSERT_EQ("Zucchero himself", first_song.albumartist()); ASSERT_EQ("Some guy", first_song.composer()); ASSERT_EQ(to_nanosec(0, 1, 0), first_song.beginning_nanosec()); ASSERT_EQ(second_song.beginning_nanosec() - first_song.beginning_nanosec(), first_song.length_nanosec()); ASSERT_EQ(1, first_song.track()); ASSERT_TRUE(second_song.url().toString().endsWith("a_file.mp3")); ASSERT_EQ("Hey you!", second_song.title()); ASSERT_EQ("Album", second_song.album()); ASSERT_EQ("Zucchero himself", second_song.artist()); ASSERT_EQ("Zucchero himself", second_song.albumartist()); ASSERT_EQ("Some other guy", second_song.composer()); ASSERT_EQ(to_nanosec(0, 2, 0), second_song.beginning_nanosec()); ASSERT_EQ(2, second_song.track()); validate_songs(song_list); } TEST_F(CueParserTest, AcceptsMultipleFileBasedCues) { QFile file(":testdata/manyfiles.cue"); file.open(QIODevice::ReadOnly); SongList song_list = parser_.Load(&file, "CUEPATH", QDir("")); // five songs ASSERT_EQ(5, song_list.size()); // with the specified metadata Song first_song = song_list.at(0); Song second_song = song_list.at(1); Song third_song = song_list.at(2); Song fourth_song = song_list.at(3); Song fifth_song = song_list.at(4); ASSERT_TRUE(first_song.url().toString().endsWith("files/longer_one.mp3")); ASSERT_EQ("A1Song1", first_song.title()); ASSERT_EQ("Artist One Album", first_song.album()); ASSERT_EQ("Artist One", first_song.artist()); ASSERT_EQ("Artist One", first_song.albumartist()); ASSERT_EQ(to_nanosec(0, 1, 0), first_song.beginning_nanosec()); ASSERT_EQ(second_song.beginning_nanosec() - first_song.beginning_nanosec(), first_song.length_nanosec()); ASSERT_EQ(-1, first_song.track()); ASSERT_EQ("CUEPATH", first_song.cue_path()); ASSERT_TRUE(second_song.url().toString().endsWith("files/longer_one.mp3")); ASSERT_EQ("A1Song2", second_song.title()); ASSERT_EQ("Artist One Album", second_song.album()); ASSERT_EQ("Artist One", second_song.artist()); ASSERT_EQ("Artist One", second_song.albumartist()); ASSERT_EQ(to_nanosec(5, 3, 68), second_song.beginning_nanosec()); ASSERT_EQ(-1, second_song.track()); ASSERT_TRUE(third_song.url().toString().endsWith("files/longer_two_p1.mp3")); ASSERT_EQ("A2P1Song1", third_song.title()); ASSERT_EQ("Artist Two Album", third_song.album()); ASSERT_EQ("Artist X", third_song.artist()); ASSERT_EQ("Artist Two", third_song.albumartist()); ASSERT_EQ(to_nanosec(0, 0, 12), third_song.beginning_nanosec()); ASSERT_EQ(fourth_song.beginning_nanosec() - third_song.beginning_nanosec(), third_song.length_nanosec()); ASSERT_EQ(-1, third_song.track()); ASSERT_EQ("CUEPATH", third_song.cue_path()); ASSERT_TRUE(fourth_song.url().toString().endsWith("files/longer_two_p1.mp3")); ASSERT_EQ("A2P1Song2", fourth_song.title()); ASSERT_EQ("Artist Two Album", fourth_song.album()); ASSERT_EQ("Artist Two", fourth_song.artist()); ASSERT_EQ("Artist Two", fourth_song.albumartist()); ASSERT_EQ(to_nanosec(4, 0, 13), fourth_song.beginning_nanosec()); ASSERT_EQ(-1, fourth_song.track()); ASSERT_TRUE(fifth_song.url().toString().endsWith("files/longer_two_p2.mp3")); ASSERT_EQ("A2P2Song1", fifth_song.title()); ASSERT_EQ("Artist Two Album", fifth_song.album()); ASSERT_EQ("Artist Two", fifth_song.artist()); ASSERT_EQ("Artist Two", fifth_song.albumartist()); ASSERT_EQ(to_nanosec(0, 1, 0), fifth_song.beginning_nanosec()); ASSERT_EQ(-1, fifth_song.track()); ASSERT_EQ("CUEPATH", fifth_song.cue_path()); validate_songs(song_list); } TEST_F(CueParserTest, SkipsBrokenSongsInMultipleFileBasedCues) { QFile file(":testdata/manyfilesbroken.cue"); file.open(QIODevice::ReadOnly); SongList song_list = parser_.Load(&file, "", QDir("")); // four songs ASSERT_EQ(4, song_list.size()); // with the specified metadata Song first_song = song_list.at(0); Song second_song = song_list.at(1); Song third_song = song_list.at(2); Song fourth_song = song_list.at(3); // A* - broken song in the middle ASSERT_TRUE(first_song.url().toString().endsWith("file1.mp3")); ASSERT_EQ("Artist One", first_song.artist()); ASSERT_EQ("Artist One Album", first_song.album()); ASSERT_EQ("A1", first_song.title()); ASSERT_EQ(to_nanosec(0, 1, 15), first_song.beginning_nanosec()); ASSERT_EQ(second_song.beginning_nanosec() - first_song.beginning_nanosec(), first_song.length_nanosec()); ASSERT_EQ(-1, first_song.track()); ASSERT_TRUE(second_song.url().toString().endsWith("file1.mp3")); ASSERT_EQ("Artist One", second_song.artist()); ASSERT_EQ("Artist One Album", second_song.album()); ASSERT_EQ("A3", second_song.title()); ASSERT_EQ(to_nanosec(1, 0, 16), second_song.beginning_nanosec()); ASSERT_EQ(-1, second_song.track()); // all B* songs are broken // C* - broken song at the end ASSERT_TRUE(third_song.url().toString().endsWith("file3.mp3")); ASSERT_EQ("Artist Three", third_song.artist()); ASSERT_EQ("Artist Three Album", third_song.album()); ASSERT_EQ("C1", third_song.title()); ASSERT_EQ(to_nanosec(0, 1, 0), third_song.beginning_nanosec()); ASSERT_EQ(-1, third_song.track()); // D* - broken song at the beginning ASSERT_TRUE(fourth_song.url().toString().endsWith("file4.mp3")); ASSERT_EQ("Artist Four", fourth_song.artist()); ASSERT_EQ("Artist Four Album", fourth_song.album()); ASSERT_EQ("D2", fourth_song.title()); ASSERT_EQ(to_nanosec(15, 55, 66), fourth_song.beginning_nanosec()); ASSERT_EQ(-1, fourth_song.track()); validate_songs(song_list); } TEST_F(CueParserTest, SkipsDataFiles) { QFile file(":testdata/withdatafiles.cue"); file.open(QIODevice::ReadOnly); SongList song_list = parser_.Load(&file, "", QDir("")); // two songs ASSERT_EQ(2, song_list.size()); // with the specified metadata Song first_song = song_list.at(0); Song second_song = song_list.at(1); ASSERT_TRUE(first_song.url().toString().endsWith("file1.mp3")); ASSERT_EQ("Artist One", first_song.artist()); ASSERT_EQ("Artist One Album", first_song.album()); ASSERT_EQ("A1", first_song.title()); ASSERT_EQ(to_nanosec(0, 1, 0), first_song.beginning_nanosec()); ASSERT_EQ(-1, first_song.track()); ASSERT_TRUE(second_song.url().toString().endsWith("file4.mp3")); ASSERT_EQ("Artist Four", second_song.artist()); ASSERT_EQ("Artist Four Album", second_song.album()); ASSERT_EQ("D1", second_song.title()); ASSERT_EQ(to_nanosec(1, 1, 0), second_song.beginning_nanosec()); ASSERT_EQ(-1, second_song.track()); validate_songs(song_list); } clementine-1.2.3+git1354-gdaddbde+dfsg/tests/data/000077500000000000000000000000001260417502300214425ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/tests/data/beep.flac000066400000000000000000000250001260417502300232010ustar00rootroot00000000000000fLaC" @0J |#T v; reference libFLAC 1.2.1 20070917TITLE=Beep flacY<j %i QSv萣Uf+iS. \1˜;) ԡ9$]H%J܅h9 1]6R:IB3C) GHpZ(E3# Adq!D9QR;OTR-H(btB$Z:N(6(`PbE8˫^!H>#)ZnVrAe0gD9'S^m"z|GoS/I jd(A }q@@x-M9|.NE "Etq+VC2^B8DŽ*OrHa"s1ъ#5)il֢O:pk&)ېQ%PMi#gk'k;W2rk!>JpSt:(ܡmTbKg#Ӳ2SbpAqmÈt!rAD9 \0tCT58 q!H$FS2pFrH8#0P@V1L8aR:2c7c L϶i!D9%~cH)(*c.q5}Qۡ*))F9>M (RFtBVT>}Ds0pEecR }ّYRrEkLqp@ PC LS.GGF)7^! JO8)K5GOLvS# 9-9PIO(g'B0[0P!_cO"C|A1F0)8JpB> +&-q'IfR)uQ`:;Z ic McxszC:DuN ƒ EoY'vs95rvT2QcK6Q r0P=!9ZlrEEeGp÷1s ,:el 3epZx 0ج}1^+)#Mj]+b98hXguLtÌtB9L8 T)cs;tQb/7v QXJ>O 1RtQPPa ' bTrG3Ȧ:8Κ&;QR;]TKS ob:g0V)' j8@PCR>E'׈%^ PA؇eG9se#3v}rS9 FӦvVTg%(#Ӑk01vglfVvGkϲ@ʘv|’ghQS-e͝5qv'o̩tvZCjLy=}R8ÛF9;+%Œs r#Ee(~q| 7:Kbk!=saFzePPvgYjaB Jv]RV/1L.,ќC]-I-g;^B ROSAgb MIc.eN!SVq je#S;K"ɡ|joʬÆ T!̬#Ʒ4zg!Q[<9(E03E7nsynEkLq)1„Wj^NQ s[ ~0q(ALFXsTTczV)(1ZvR˫ V0RQEHS/3+}c+*#Eo dVILR`Z̲}-G2C(ϭnAF8ʦb)*tkRnbʜ4vtAClyB+)fѝ.r}RoD92r ^Q"%zaL{AMBR<pkH,i!DaPF1+;Y CODe(’r,'xḚ*MS9%E0PCuk8Yi>EV3]VC$3 B ( Bt/hvV)?N1[NGՋr!fSJNƒhP2+NBV}*WB8bɗO8#Y!ZeF  !M0`UY&Jņ:\y qLLtK2Rba pB;vhRzp"Q\0QKL1nBv #vчP@+ZKF(G3 bJY"X9Z38,jD8ADZgJGeR""SzdT1̭.!J 3y#+IB[ZIqPˆT,(` hSkq'EEIuJITg9SQ!)=TA"Hq au䝼!P'HTV(Nb" Pr*9 ޲*v]ҡTr}%sNK#!S<1H"Gˢ SBဠM .S-܅M AMvqG$L(q:}q rOs@Vʈq0b;bߴBSҐT!I><銈8z8NBO4bv*LJeLi.ܟ8a'\0OoQeELV1IKR8c泌\PAD8ebvQr„ h!bd3!yx,ejMTQ;97ݼtH,VV)Vح%@kyGic1Z0U30epQq&+^b.Uc A(8É1ADL -2bqydGModc:9gg9hQ pehv+ZT\B9:KdO[,=gB DG aDޥ1Ң"aEi+Z؂jg7giszbb 5e >)0YGgs]XZRoژRi)VqcSS:O5R^Gb)-B؞j)1B3)#-EI"91H莕H:^GکʞiݮLp1R+" vB'V*ik;+u3j> "38AK۱H,L*bAD | R|'hqb?hS-ב}t1ɭkr!ICH$;Mפ.R-b\ "Xϴd8c& ĊeE2Ax (!kW2AtV^ PZH {}uOcOAr*" uTB(vTaL Zʎ!1,gN8a9$C xE'iGKTHVaI\yS[;aAI 6*o"TQɣ/vHzBBBGr$Kq?I.vMu"!r;#ZNB#:8Fz['g?q\ т #0pԢEkq nSt ;,HXr,bc+e9:+bZqO$Bt9%ND87gRyb1G"ug| ."хLVs01P&s)IC;E&;Lgc۔j)C%bCs>rJ1P1DeH7quoS97)r91ZAī#Te]5CQnG tH8ADOYuGD8Ñ&+[,aD~ (fC,ءDYx!R1D2L/&N7 LRB E+9e;[9s9 E!I>'ilQ?fۢ'R^!wjO,aDUv*Uk-h(aHҸSARtp'e'Ovg>Eg1Is~aRi_H![c{y (m+1I* p/STR+Y$ Qg"8 80RUk%(ڣqB 8YIT`aӈYQˢ}Z!}gQtBzaQa-*ڸ]*i#;naCjCc,H(a;;.: #F)5$܊jBq "H|cL\ PK#^ 9:K'g()b(E8C.`᫚ 1LRzSEC+ ![]=oءB,#pD# eII!vQֲYG1;^Y:z P`),H8cORZ.M\cCI I(ˆS&+]19 x`>x0Ek8D9בHh ER,gx[aF;L);bH@++>S) jAMЦTt%S*샆Z.!i* ’s,kq Akjv}4vS O-/'S3 0Mבc}YQQ" GV2s)kS@pȿo!B\SzϘ2ݽ%e'E5@Pl9"A̤Z-":xϒ&s) 1؇b UVV+TR.$ŒSTBސ(8;s-hQR0Q8A #;eQ-ڣL1R e70pGc(9T(¶D9/1H5'q"r)n-!cgen}n뵷\:,oڨ'G7c s)ȭ,e"0%כt(’`p`2@ 1 tbxI"+GPʒ"r!I+*IAMKkAaLZBG(IBtp@c@;VAFdEKܦBk>R9v):+xd8tLtvLAĵ%C(V PÙtvq @q1XZrHs}2D)X(g^KRAD9?Kg!c9]ҡb9̢ R\O )9(]clementine-1.2.3+git1354-gdaddbde+dfsg/tests/data/beep.m4a000066400000000000000000000062511260417502300227640ustar00rootroot00000000000000ftypisomisomiso2mp41freemdat6libfaac 1.26.1 (Aug 16 2008) UNSTABLE+! L!,j]"ELO?~][SjmL O~iyySΩ[ݿ~~o oox@ozKMo0h KD$ f}~q񫻹5$a]xwww&˗.Qr(((jEjԊ"  HV +R+PTA`@ ,">h LDDy~8֯wrZTMeYkS{yyyh %HCFf=qr䖖./ˡw:z1qQEQEQDQDQDZDB(-ZjT!SN.E @]@/JD *2 % 8ֵծK$R WCOY`N/i{n<1y<)Kd5rBsNR&Ja"@`&0,D$>h!!H#6o~7Ƶz%ih5T˧}>MryhJ5ѮtkYAo W\zDF3'XZD&bB  "DL Dw08($$ O|sk]ܹ%ŤkBX蟯ּvS9t~QGEtQEQE(QBͳb4FѶv+\@-k LD 0d@ &p>H Nz%JM[Wf|[S|_)S柚~i_)3"p"pJ%iJd "&H 8moovlmvhd|%|%@trak\tkhd|%|%@mdia mdhd|%|%D0U-hdlrsoun SoundHandlerWminfsmhd$dinfdref url stbl[stsdKmp4aD'esds@tstts stscDstsz uunssruuwy@stco ,I,n^>udta6meta"hdlrmdirapplilst trkndataARTdataalbdatacmtdatadaydata0gendata namdataBeep m4a#toodataLavf52.31.0$freeclementine-1.2.3+git1354-gdaddbde+dfsg/tests/data/beep.mp3000066400000000000000000000147261260417502300230100ustar00rootroot00000000000000ID3TIT2 Beep mp3t8U !??bBckk6v3YI2s:69cjB3q11Q 0PѢHPMifb8(cxǏD N@xxx~? 9@9 BÁ0/9NF*=K$cB U(LE 'Ы!_T t= X2VEE%+aaj0I:>BCa.Z Z,`!p<#@` @+`y@e !4EX"" EIDPTDxK< S s$.cddzQH=H'] „euhL3 @, "5&#;q>d@%Y iJɛRf lm+R_c0@=|:1 5 VCAT HN LS4j QS=Bf Y{Q1TK"<K.àmL$DPIB_#t;Cj?))e'UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU2 2d3A95Z0ʇC5KxU5'0B6d,`5iEMgV\07a霏zaFl^lQNah}[پb}^h FĝGp#NabJHSQLˎN UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU22P3%>5Jk0Gl594B05@EgS5JMWZ[a_A!٦ǴH=qX=r͏ z37OaG#aJ+o~?~jb j)qq22D3G5x04z4Çm0B&4ˤk'D5x IMgVzb6ea iVrDbqppbtsj*hҴheYra R[ǔ'A$"HWдٵИf\rp\eUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU2202L4څ0G44ǔ074:3n)55l NIZv00,0Q0BM1U 8u8|1YB95z4Ea4Z20|EFv|%a,bHFoI~\_?fS2㓂%UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU,Sc%s? 8n>Xǽt_ZSӱNޅݯfVc~oi)e'J112Ub3ʱ0>33H0yo1+р3zT61 .Y000t0@0F1Ω>Y=310z0000*'A^"HX0>0 ])YX8eq @A&o9˙sU9sUȜ4F2p\%O{;uȜP(!c&X8zȐLW^ Ǒ.VD7瀯WdzǏ"]X7~tcgjDoD"D# G,]6MuC74ӴmUut]_uhPTU]WeUW}[}UUYՖa} Uum]X~2tu[h뺱̾L(CLABH)R9)sRB)RR9&%sNJ(PJKB)RZl՚Z5Z(PJ[k5FAȜ9'Z(9*:)Z,)X9'%J!JL%C*b,)ZlŘs(ŒJl%X[L9s9'%sNJ(RRksR:)eJ*)XJJ1sNJ!BJ%SJRb+)XJjŘsK1PR%KJ1snAh-c(%cC)b,)cŘs(%ƒJ%X[sNZkmsЩZSLsYsZ(PJZ[9Rb+)XJŘskPJ%XKJ5k5ZŘkjs1Sk5kNZsc&BCVQ!J1A141朔1 R1R2 RRR RkRRj4%(4d% `pA'@pBdH4,1$&(@Et.:B H 7<'RpFGHH!DD4OggS/l:H"<%&%%%%&%%=닷*(8Md7ߌ0 0 z^?x8Tا'=ǯ`nݺyܨު7[t_o!49*7) wnQ*7 St?~L~\" Z7)mέ P K5V*7 St~,^7*7Stߵj7ު7?L]ieު7[tonw*7)St JJJJJJJJJJJJJJJJJJ0\"h蕡tttn DO.8#+G+bKa * ;Z0L$LhHpK fdG&1=>[Nʹ8 8 0\$u\hwijPDW$^{"+OZ- 8 80\$C\+ n1nfwW7;݂.8 8g0L$^ Z^pJg7{qD8 ;05"W֪+8 890L$\E):$:HXD&W8(+c&8` 80\$C\ kN࡮5`]WX0(.9٥+8 80L$B `n`p`CGp`D8/H0'88 80L$\1 ah:;q0tq]WP[ƛjL.M!8 8=0\$\Tn`Ύ:1fwWlX>B+8 80\$C\QNޡ.wWGtwPx<.hk,K8 80L$ p _H \H8,0. ظ8 8g90L$\o :[{'|̰]W '8*3n"  8 890L$u\.AfZw[;Ck؈8 80\$d@`n:'@t|u}W82+= 8 80\$C\) Z^61XwW۶[݂ .8 80L$^hDvqdpjD8 7P8"֨K8 8OggS#.`{,J0L$\A 8p:7mql]W#2L 8 8clementine-1.2.3+git1354-gdaddbde+dfsg/tests/data/beep.wav000066400000000000000000003000541260417502300230760ustar00rootroot00000000000000RIFF$WAVEfmt D b@dataU%'?J?? %?_.h?$?DX??6X?J `?\ ?0~I?u~8~?m ?̪CK?mȫ?8^?5Lg?oB"?J{?D S?@C?ؠ !?!lE2c?P8?QL?ZyZ%?Ji?=1]*?>kb?%sqa?ળ?Ƙ6?ᭆ}?RU??Ø?? ?u87sjm?T>T?w'?V?]S?b%?8/"? ??h? /?v?CWw?}y^D),m¿BȿοQzwҿFlտuSOKؿ ۿ]E BJݿ{r`%࿒y^[ΰ/,lU㿘g俜T| UP*`/_翼/VDX/q>D]D3oH9(p) n鿹_28fq?0 ?:3r9?/t`?w-u?W0&v?Nb?)GÉ9?{X ?85 ? edO5?[ܪ?x"e3?#1V?>`??S>?Ò_s?a:?Ey?|kaH}?HY?M]??hj?D?s ?g?GN?-f`?g/?*L?y?d:?F?0uZ?Sn?GJ?ꃴX?2?')Џ?!vF렿Q'CI|n5<)ٟHǿ鍦/|Ϳ ѿߘԿ7IM׿irڿP4P$ݿ\F߿Y#5;?⿷V.AYBH忢HDH9"KdFEt{%:%s3~ݓHO鿇r,uv-I" P-#33x|zBT 4ù]j߯ 迤h:p翾RԶ忂<'&I/U^⿝{~^j4߿Wjܵܿ$=ٿj׿QN (ԿN+ѿ9̿4ƿ5wc'}Y WG!p?9ϳ?gaE?xΞ?R(?X_q?aڟl?tUS?jRs"?Pu?o?]7u?"P ?zt7?=?}(D.?ش/ ?86k\?B'?0D]xP?D@?s`v? yH?4|? s#;?񊹆?9cP}? J?d:1~?@ٗ?Avhx?;iiڂ??1?~z]?h*3?7C?,S>?刢%?3q?ȣ|<~?g?2?c?vW}?*?S?* ??j?tu?AB,?:b,$p[pr> Rſ,P{̿?yѿԿt ׿ueٿ,6ܿ,eЙ%߿VIY!῿7c 俍Ac\忴ȻeI%SwlknX连TX,,迈ߓAGϟw鿜NʗvrD8tQ鿼}#v鿔}迗)+ 濮ڮ&JMF3k_b\㿤 XrFЈ6f῔߿$ 3ݿIڿx ۶׿-Կ'ǍѿY#Ϳ3^=lǿK8x"`dqU:҉ ^V??|q?3+߽%?|a?Z?R#?B%~?jwS?W?8Ďg?d2V{?B/{?|`g?ݮDnY@?_ES?U?\?pe?\)u ?P[W(?4x1? lR?"?Jx? M?_Nj?R"(z殿-*6nĿ4ޭʿWVp iп!jӿI֠Xֿ 20ٿ_oۿ纏޿Hx ;QLɈ7T.`3Ny[}3/F翬yF:lC l迗1O1Gqwm ?xߧQѤؑI^TbAku cMH MG y\uY"U濔Ţ1)!,WXqU4[⿧Fbῼ,C,R{ݿ8`!ۿn[ؿrg֊;}տ~ҿ0ϿӢȿyq=¿x'sTȒr?7t?h`Ėĺ?÷?g?Z#u?߸{g?m4y?l|.?JM?-lxE?@f?-kHE?R`?1ؚ\?_2?i\?'UGy?h2??ᱬR?k  wE^W!R bÿ@ݘDɿPeoϿۥhIҿkIbYտhXؿ}}f~4Qۿ2|ݿrKBbLZ@wM2Y⿺s ]Rw'8d۩_W忆wb濳dO\翡Q!P迤 ? ϒVU?qsz?|l;WңǿI/! ο"#ҿ^XOտ(t׿E5ڿLlaݿ}5߿gZ2ῇzZƁ o|Rp俸u]4ih+o]D2>:.迅oI 鿨1U oUBDc鿳i Pt鿼hj<[R迕.փIvoa~H |CDjūnjd) FV/´3BQ1޿*b[ܿFٿֿZSJӿ$uпXB#˿]snſ 5<.9忇GHΗADqV7,c}*x4߿Mh`ܿ dBڿ+Žt׿zڎԿ{bxѿR7Ϳ@*uƿ:GĎY9d?V(W?kG?DϾ?ȝDԷ?%7~?/?WA0?5Z_?fr?wz? h?lNT?6 M?/"F? ǩ?Xh??캶?Vϱh?!? b? ?P??v?)2??Կ?/fpyR?_sj ?2 cA-?$,?KnAf̘?tB?, +?8&S?DKoDe?(ib?~4L?u'Ʈ$?qEKI?W/C?[9w?]H?PH0XoQ !7SVq"نݘKڅ@^+YQz*ژ [;迴翑,x/VTzBZvGl Y<'ځm]>G>?۝ݿOli)Lڿ5ƪؿPiW9տupfCҿ@e-vοA{Fȿn>pJpϒ煫˗?4QچQ?͍״?AHJ?͉?{PxQW?tldLY?ۅG?so|?8?v$?܂?MR?k??k?>e-?Ti%?نJB?5?W{i?Q6.?'q&r/?Ġ*al?,"4?f?HmN?_?R7>?zK?-PBJ?t;Fad?hd-?%EeY?XA? *?x9Y?>ucˍ?o~i?n3?+l?577r1?)l?Oh5Y-? 삚?NE(?|{.?S7?]$ڽ??o2`lw$fhR0@z-rÿ įDɿhMrϿ!ӿTqտ尷iؿmDۿ$Vg6޿*{_࿥Bd*|ᾊ8h<6%㿍+1{%@a?&tI.r,(,D[迒Wl&鿘67&f鿫Kq\,(n鿾i)? 5?X=?xW?m?V$c?Œ?㣾{?-9=r??c? =7?%H?E? e?%?RP̲?{1?-nA W?Ǩ r%*$$¿Q2kȿ"(ԙο`nTҿbUJտh*ؿ-/ڿl12D۞ݿns!N$z\ ծW鿜 xZ[k7'25U=p 4= 6g'迪4ru$+wxſbQ翈~ccOy俛g%94R9CU E{bt޿e&Rܿd`ٿliֿ`ӿ# пti˿ Ŀyyr1Rx_W ?y[!?@?l?'?TkEk?lC?IF?0?<%?R?HX$B濈k%U7ܪĪ1-o:L2 ~鿳#:̓Jiz/H3E9[CLxXA*wxҥ'濃m5$" 2C/+gA5U<#Q߿+ͨܿ(Uԙpڿ,;2׿'ZJԿm=Nѿ>sq̿YoIƿ_ai9:$ama?:?i9?poI?|Usq? y=N?'ZJ?E2?:_ԙp?+ͨ?t#Q?F:U?E? /+? 2?Xm5$?w?ե'?,D*w?N?Mx?~[?I3E?Jiz?m̓?#? ~?L?o:?S1?Ī?R7?h?IB? e>?XN?[KfJ?6Ĺ2?W?OM??o%?vR?}&?X(' ?_C?x`:4?a?d?Qi?hUo?L֓>Ʊ(oRſ<*˿_P@пm~ӿIJֿrqرٿ*J-,kܿ7߿dԢzIŖP :P; E>*j濟խd"kEkͿǿ?l{[!DZW J?11R?] zy?(?$ʄi?# ?Ю`?3li?`?'&R?`N{bt?U?R9?=4?;g%?y?fc??،`M?[Nl?܏ecG? ~&q?r?c[G?BvLp=gL/.C-C)Gk鿏t9"w鿵q:`鿟 r-3MZ=?/a+kw=^濡rݨMb䲢俹W*]9⿭kp; ݿslHgAۿx|ؿyIտ2*ҿzvFKϿ:ue ɿ2R¿5ƒ~sHb?j UӪ?d5r0?TMxqn?3? V?dWa?:v0?K? I?\0Q'?UW?鵰?O7׭?o4?Zr?Kc?Op?va*?X?iX?my?0*%?vj)d*|?{_?Vg6?dD?۰i?Jq?!?SMr?euįD?8r?@z?l$fh?Zl?駿PڽR7¿.{.ȿLNE(Ͽu 삚ҿtr5Y-տ)lؿ@7r1ۿ 5lݿ n3ȋo~i῜Bucˍ9Ym* XAa(EeYؕd-翓=Fad翠 -PBJKR7>鿤_鿰mNf!4*al p&r/6.连{i3tJB翛f%濸>e-忷k%㿁pMRῇ}܂࿈m$޿?/ۿNe|ٿ,хGֿadLYӿpPxQWпѪ͉ʿAHJĿ=_״컿P>QچQ ˗-?mJ?>?W{F?e-v?cpfC?2[iW9??ƪ?7vi)L?۝?hC??f]>G?'ځm?ѩ7?v=@?Myw?I??U?x0* ?Ga?U&`?QG?b|?Џ?n1n?}a?V$,?w q?H?]"?fӤp?~ =?o11?G^?$ !?CG0X?H4u׵{u_JGăWǿ*9Ϳ6 ѿ6;Կwg.9??S?ْ?S$?9o?G}?iNKsK?iL]}?sΖ?H"&L?L Q{??G?j?m?խS%?0p{?;$??\w)?Hc7?]1?q?28?`?X?m„?%B?|~[?7 *_?8O? /n? ?D1?|Z9sך?iL\7u𲿇VVo z{F%ƿJ]̿ݎu<ѿ5 49Կ[+@h!׿8PXٿi<1ܿ/6C߿z$57 &'c%ORN,f$|忡YҸR%9#ws._o 迋h@`迡I迻_]DY3ytF鿂RK/BLN鿧P†Pv!"|5 濶3{Ci4BJTZnP㿞Y9G~@V߿w %ݿX\bڿ׿7h Կˇѿ_=iXͿH[?$ǿ9rS|U6~LH?c6r|?5<l?F@? D0Q")5څʼpwĿƍ+ʿ*_п.mӿy2y5zֿ SPٿ8 ܿg |0޿Ϗ:+MZΐHh,L㿨ު( mp(kJ]Mg D&翅RLr迮!{h4sOšoh8$T[鿸NYFiW[puQ鿣hy%F[A迖ױ翴 8XKh++ wWi8O㿖qszʒVUU> ࿒lݿ@CۿEKE :ؿː\O[տtXEfҿhWvο!vȿq3t H¿ݳW߷RM*@!n|? 퓅'?_ЯZ湿dIÿ"ؒɿ4!tϿjҿG< տ{@<嶭ؿ@pۿ1"8޿ i<γP࿩]l}hsD*A4yo:俹i1bIk&S+HaU)$^Ch#鿦-cdBCՋĕ]s˖bF/grwY(鿕f^$^f2֊'UGy濕i\H\2俈Ԛ\N`(kHEZ@f࿴#lxE޿Mۿ?r.ؿpc4yֿ {gӿ?#uпUgɿ÷ÿϼ`ĖĺH*tzr`T?40's?=?Ӣ?0?ԉ? r֊;}?x[?j!?DZ{?;1C,?Fb?oU4[?WX?<)!?Ţ1?չuY"U??4y\? MG? cM?tcAk?I^?pѤ?xߧQ???sFqwm?0O1? l?EF:l?y?3/F?0w[}?h3N?T.?C?/QL? ;?t ?޺?_o?H20?I֠X?-j?Kp i?\ޭ?n?e*6?bϚz?"?wNj_; Maxʥ"ȿU lRοJ?x1ҿ[W(տC)u ؿeڿ?\ݿESDnY@w|`g⿳B/{5V{;ĎgG*>.c\?U ?3c?HU!??<\Й%?6?=ue?e ?Wv?5?y?:{?( R?r?#p[?h:b,?{AB,HA?j  ƿ-S̿&*ѿȉW}Կc׿z2ڿpܿ|<~߿S3q࿪刢% S>o7C"h*3]z]3>iiڂ,xhx迚@ٗ迠;1~b JcP}r#;z4|'yH2`vRD@=B]xPrB'翚3k\մ/ >%D.<=?vt7㿼P 3u࿂o߿ Puܿ\Rs"ڿGtUS׿WڟlԿN잝_qѿ%R(̿xΞƿPaE ϳdo W?V}?ڥc? 4?l+9?N+?Y (?j?$=?jܵ?-^j4??Z^?$/?&?<?Զ?d R?h:p?Xl߯ ?hù? 4?}zB?p$33x?@P-?Q-I"?r,u?;ܓHO?3~?o9%s?{%?E?yKd?EDH9"? H?+AY?V?01;??Y?F?4P$??ir?7IM?I՘?/چ ?Bԍ/|?L)ٟH?fn5?DWQ'C?uF?K)Џvߐ2xXGJſGSn˿vZп@Fӿ{:ֿyٿLܿg/޿rj`GN῵ggs ~Xj[M]翨HY%maH}MGya:,Ē_s鿔>鿇}>`"1VK!e3ܪ edO565 xX LDÉ9濴Kb!T0&v俲-u$t`⿣:3r9s0 )>qݿ:A{ڿv׿<ƿTտDw,} ҿg}.οnsSǿ԰<3|Gգ1W?}w{?8?KXvz?dW?屯qz?DP{?kli?V2s@?`))?鍟?mk?O㣲??Ѣp?Hf?D]?p?/?/VD?;/_?L(?DUP?T|?>g?lU?{/?pu^[?n`%?8< BJ? ?lSOK?TFl?Gzw??(B?m?F2D)?y?Ww8Bw[Khÿp ʿ8/"п1b%ӿB]SֿVؿ'ۿ`GT޿<7sjm࿯ DǘRU㭆}ɘ6翩⪳sqa迢lbH1]*鿥Ki鿰yZ%LL8 lE2c鿼נ !@C.D S({$mB"5Lg8^;jȫCKi 7z8~ ,~I`\ ޿l `ۿӷ6Xؿտ\MҿϿhɿ %ÿG?@%'43333G=:%'?$y??8%?TEh??Jc?h)?x6X?M% `?j \ ?/5~I?Ȃ8~?q ?CK?!qȫ?88^?k5Lg?$rB"?|{? D S?@C?٠ !?R"lE2c?8?VL?yZ%?q?0 ?S:3r9?Ot`?P-u?,[0&v?#Rb?JÉ9?!~X ?D;5 ?edO5?ܪ?#e3?$1V?m>`??>?’_s?a:?Dy?iaH}?HY?:M]??Tj??6s ?g?GN?a`?g/?JL?y? :?tF?uZ?Sn?GJ?UX?X2?D(Џ?vF렿5Q'Cn5P)ٟHǿ/|Ϳ ѿjԿQ7IM׿ irڿ4P$ݿG߿YK9;?⿘V㿁2AY俌H応KDH9"濨Kd濖Ek{%还<%s*3~ݓHO r,u鿜-I"O-D#33x{zB 4ùSh߯ Ch:pRԶ(<忀&Y/㿼Q^'w࿊u^j4߿jܵܿ$=ٿ{j׿lC (ԿN+ѿ9̿4ƿ_Hc|^Wp? iϳ?<aE?7xΞ?x.R(?|_q?lڟl?@tUS?Rs"?\Pu?o?;u?'P ?}t7?h=?+D.?۴/ ?8k\?B'?1F]xP?D@?`v?yH?4|?=s#;?Ê?bP}? J?91~?`@ٗ?Athx?9iiڂ?.?|z]?~h*3?_7C?DS>?刢%?3q?p|<~?]?2?uc?tW}?n*?էS? ??j?HF? AB,?>:b,M$p[Js*U Rſf{̿?yѿԿ ׿2'ueٿ6ܿnЙ%߿࿀]!῱;cy Dc\ȻL%濷wlwpXPV迯,,迀ߓAaGϟwxNʗ鿄urDXsQ~}#v}迡)迵+d濶׮&濒JM忰3k_係\XrFh6fH߿g3ݿeIڿ ۶׿-ԿǍѿpY#Ϳ ]=lǿ}48x"1dqg9҉V?' ?b鼻q?c+߽%?Ra?Z?]#?L%~??l5Ďg?.V{?6B/{?s|`g?|DnY@?ES??\?Xe?暶)u ?[W(?)x1?HkR?"?3x? M?Nj?"Zz殿*6nĿJޭʿap iп,jӿgI֠Xֿ\20ٿ_oۿ𺏔޿| [<QL⿄㿥T.俀4N忨|[}w3/F̹y翾 F:l迭 l迤2O1Gqwmq?xߧQ鿙Ѥ I^+aAk cMg MGҮy\翀 uY"U]Ţ1J)!\WX[U4[NFb$(C,࿯{ݿ,V!ۿId[ؿ\֊;}տsҿz0ϿӢȿ+Z=¿h'sT+r?t?gaĖĺ?,÷?g?#u?{g?x4y?Ȇ.?DM?6lxE?Y@f?j1kHE?V`?ۚ\?c2?i\?l'UGy?Lk2?g?l^?rf?wY(?G/g?s˖?xĕ?BՋ?,-cd?[Ch#?C$?paU? +H?&?Ck?i1b?lro:?"A?uhs?CU?)`<γP?"8?x@p?L,<嶭?p' ?j?e!t?ؒ?AcI?ЯZ?7M$?>?,ᱬR?  t^W!RVbÿ1@ݘDɿ%geoϿhIҿ'TbYտbؿf~4QۿͅݿrKB࿷PZ@wQ2Y⿅w ]R'8俕ީ_Wezb>gO\|Q!P# ?hӒVU?qsz?P@O?^i?++ w?XK? ? ױ?)F[A?hy?uQ?W[?OYF?HT[?kh8?#Nšo?{h4??OLr?GD&?M?eJ?}mp?ت(?.,L?H?#MZ?:?{0?8 ? SP?y5z?W?_?(+?TCw?/Pڅʼ?!)5?(D0?CF@ >lRW)ңǿ`/! ο8.ҿriXOտ\3t׿b5ڿVlaݿ5߿^2Ῠ~ZƁ o\Rpu]4濒i濱q]D2l@:.追pI 鿃1U鿈oU`Dcpi) Pt鿾gj.9GHΗADlV7,}*"4߿BCh`ܿdBڿt׿ڎԿpbxѿ7Ϳ'*uƿ/Ď09dOV?-kG?Ͼ?DԷ?M~?\??A0?ͣZ_?fr?Pz? h?vqNT?o M?#&F?lǩ?k??`캶?ϱh?!? b?b?P??1v?g2?b?Կ?PepyR?_sj ? cA-?$,?kAf̘?ІB?6+?8&S? AKoDe?(ib?z4L?q'Ʈ$?hhEKI?M/C?Q9w? S7oSVqM"†ݘpKڅk^+Y鿞P*ژ [;r)x/Vh zBvGlNY=<'ځm]>GF:?p۝ݿ8bi)Lڿ+ƪؿEiW9տcpfCҿe-vο*{FȿW>AJp˗?QچQ?¼״?XAHJ?͉?:PxQW?mwdLY?VG?y|?B?_$?{܂?MR?n??~k?>e-?"l%?SJB?8?{i?6.?6r&r/?v*al?"4?פf?mN?_?R7>?K?-PBJ?<9Fad?ؐd-?"EeY?XA?*?9Y?:ucˍ?Wo~i?n3?U"l?*-7r1?M)l?]5Y-?삚?hNE(?{.?7?Pڽ?`?8flL$fhR_@zqrÿįDɿHMrϿ!ӿ_qտ iؿwDۿVg6޿{_Fd*|徊8,@6%/1俥(@a̢?&tKL.翟,(D[ qm&T77&fKq\,ni)?95?6=?T?)j?P c?RŒ?[{?/=r??Tc?]z=7?%H?ߖE?e?`%?ZO̲?r{1?lA W?r4:r%:B$$¿h2kȿ(ԙοknTҿ)%UJտN$h*ؿ-/ڿ;2D۞ݿ\ssw!N?~ Wn xZϞkL'苎5鿬=p4= 6mf'4ru +wÿbQ{`cy}g%54⿀R9U࿔;{bt޿&Rܿ`ٿ liֿ `ӿ# пi˿Ŀyy21RpoW ?[!?@l?>?OkkEk?C?TF?,;?Z/?R?'RX"B2nzW7جĪ迄1ro:鿷L鿻 ~ܧ#̓|IizU?I?$/+?T 2? m5$?~ ?ץ'?F*w?T?Ox?Θ[? J3E?2Kiz?̓?`#?$ ~? L?o:?1?Ī?P7?Pf?LB? e>?N?WKfJ? Ĺ2?}?C??o%?ZlR?}&?' ?__C?I:4?J??(Pi?To?PL֓mƱ(oĸRſS*˿_P@пW~ӿ^ֿ{رٿT-,kܿ 8߿;iԢ7z?ɖP 㿘 :俱; VA*}jխd2>aD翮跲t返{='ݲu%ϓv}3~rقȿSzn[ @F 6/迡-iD H濐9?0濢wQOX(Ǽj俨?h㿰FSa@ޜ+6X<߿Rݿ ڿ׿L4FԿUCѿx'kEkͿǿ?l[[!SW on?`1R?HOzy?Q??i?;# ?ù`?ֹli?$`?'R?W{bt?1U?/R9?@4?g%? y? jc??KʿbQ?I+w?4ru?j'?4= 6?=p?Č5?'?xk? xZ?W?T ?9n,$]>?Ռ`M?Kl?ecG?}&q?r?._[G?'rp :=g迻0.-C-)Gkt9"wLq=:`y l迕+3M$=翱,a+翉w=^moݨMF_䲢WY9WkpZ;_܍ ݿilHgAۿlx|ؿ@yIտ)ҿvFKϿ:ue ɿuR¿7h~?5b?jUӪ?5r0? Nxqn?pJ?!V?gWa? v0?rU?I?9Q'?UW?O鵰?\7׭?o4?P^r?ʂKc?qOp?hva*?Z?iX?hmy?2*%?4k)lݿs%n3 o~i῱Fucˍݣ9Y*?XAD+EeYgd-?Fad翀"-PBJpK)R7>n_mNf鿈!4g*alo&r/鿄6.{i迾1JBc%濖>e-Gki})MRx܂d$޿M%ۿZ|ٿƅGֿVdLYӿePxQWп͉ʿAHJĿH0״컿PچQ˗H?J?K>?n{F?? f-v?tpfC?eiW9?BJƪ?Mi)L?H۝?H??ř]>G?!(ځm?7?0u=@?Lyw?I?|=U?7v0* ?/a?FR&`?C?b|?OЏ?j1n?}a?L$,? w q?䐣H?R"?2Ȥp?*~ =?=z11?^?~ !?|E0X?iHTu׵{u_JGŃWǿA9Ϳ6 ѿ6;Կq.9??0S?ْ?S$?0;o?LH}?jNKsK?L]}?;sΖ?"&L?K Q{?>G?:j?1m?ӭS%?p{?,;$?? \w)?_7?r1?qq?i.8?`?2~X?:w„?!%B?~[?)_?\!O?/n?g ?^D1?8sך?L\fu\VoC{F%ƿxJ]̿u<ѿ@ 49Կ5@h!׿pPXٿs<1ܿ/6C߿3zX57 +c%UN,俿'|忪\ҸR9#cws6ao 8h@`I迯`]D3y8tFZRPKIBLNdO†鿱v!"*@5 i0{C4BJT;VnPtY9⿫B~/@V߿m %ݿ X\bڿ7x׿ε7h Կݣˇѿ=iXͿ1[?$ǿ{9Krd|U~LH?*c6r|?E5<l?HF@?݅D0")5pڅʼwĿݍ+ʿ5_п"xӿ=y5zֿA SPٿ8 ܿ|0޿Q:,0MZῑH,L(%mpmJûM翄 D&HTLr4迸"{h4PšoNh8T[FNYF鿙W[CuQhy#F[AXױ OXK-++ wSTi4O|qszlƒVUΏ> bݿ@Cۿ@E :ؿ\O[տiXEfҿVvο vȿt H¿ܳW߷"RM*q|?퓅'?}kaX?}A ?-A?3?]/6?ҁ+&?-]?Trjj?_$c?0t?}Ц?}nM?h?n?J?:2?Gw:?T<_? Hd?1+?Fk,?eA)j?}L?z?,ɰ ?B 9a?? ЯZ湿-dIÿْɿ!tϿjҿF տJ<嶭ؿ@pۿ;"8޿m<γPa{hs .A㿰|o:i1bKkl&翄+HaU迤$0_Ch#g-cd鿤CՋ鿂ĕs˖鿨E/gZwY( f ^c2'UGymi\X2К\㿾J`⿛$kHE@f%lxE޿Mۿg.ؿX4yֿ {gӿ#uпhgɿ÷ÿЍ`ĖĺtrlT?D_'s?=?Ԣ?0??|֊;}?c[?$t!?h{?5C,?BFb?U4[?WX?)!?Ţ1?uY"U? ?ny\? MG?t cM?dAk?hI^?Ѥ?yߧQ???Eqwm?/O1?| l?F:l?y?,3/F?dt[}?I3N?T.??-QL?;?{o ?Ժ?ħ_o?20?I֠X?7 j?@p i?zޭ?xsn?6*6?pz?p"?Njxj Mkxx"ȿ6lRο^Jx1ҿP[W(տ)u ؿeڿ/?\ݿ\ESbDnY@῕|`g⿋B/{R9V{?Ďg5*>ȷ<濩[.翸֤2W8"#]aSW鿘@!-Eg$eMcI r鿪w@9Ĺm1pSztHk-zY7qXh濒yb/=wѐikg(v}G1`J޿tsW<ܿjwSٿ,%~ֿ<#ӿZпѱa˿+߽%ſ\qa簿%Vo;҉?dq?}z8x"?6B^=l?Y#?=Ǎ?w-?X ۶?I?u3??6f?XrF?\?^3k_?XJM?&?@?+?t )?}?0}#v?uQ?wrD?Nʗ?h?Gϟw? ߓA?,,?LQ?hjX?wl?D%?Ȼ?:c\? ? 0c?Q!??RЙ%?6? ue? ?qk? ڞ?y?#{? R?r?#p[?:b,?9AB,tѡ?j< ƿS̿H*ѿW}Կ˲c׿2ڿzܿ|<~߿3q刢%S>7Cth*3_z]}6p@iiڂ,zhx?@ٗ<1~N JOdP}L鿭r#;4|8yH`v迫D@;@]xPB'0k\Ҵ/ !D.応=Urt7㿌P ⿑.u'o߿ Puܿ,Rs"ڿtUS׿1LڟlԿ)ឝ_qѿgQ(̿xΞƿ#9aEϳn, W?}?Ըc?E4?5B9?@N+?c (?#j?($=?jܵ?^j4?u?G^^?/?`&?#<?Զ? R?Xh:p?an߯ ?ù? 4?~zB?%33x?yP-?,-I"?r,u?XۓHO?t3~?7%s?{%?E?Kd?BDH9"?ԅH?'AY?$V?-;??}Y?8F?P4P$?ir?P7IM?tʘ?φ ?/|?8)ٟH?Nn5?(Q'C?BiuF?s*Џ2]ߴX GJſTn˿ vZп,Fӿ*:ֿzٿlLܿ g/޿n`GN΅gs ljdM]翼HYnaH}迬Hya:Ē_s>l>`"1V e3Bܪ edO5迂45 \vX [AÉ9qHb忑P0&v-ut`A:3r90 h>qݿ }A{ڿv׿pTտ/l,} ҿ™}.οWsSǿ=԰ |@գ謶W?*܇w{?(?Xvz?dW?qz?OP{?Zvli?2s@?M3)?2%鍟?k?磲??բp?i?q?? 0 ?:3r9?ot`?*-u?^0&v?dUb? MÉ9?X ?=5 ?edO5?ܪ?$e3?`%1V?>`??>?I’_s?a:?@Cy?haH}?HY?M]?5?@j?|?s ?g?BߢGN?3]`?g/?hL?wy?(:?jF?uZ?Sn?`GJ?"&X?T2? 'Џ?mvF렿ZQ'Cn5d)ٟHǿ8/|Ϳ ѿ?Կ7IM׿/irڿ4P$ݿG߿Ys=;?{V6AYؒH志NDH9"OKdEc{%5>%sk3~ޓHO鿐r,u-I"鿗O-鿬"33xzzB鿭 4fߦùIf߯ h:pORԶ<ا&h/㿇M^⿱r%l^j4߿jܵܿe$=ٿpj׿8 (ԿN+ѿ=9̿z4ƿc^|MWBq?8ϳ?aE?TxΞ?7ER(? _q?wڟl?̲tUS?Rs"?%)Pu?j!o??@u?5+P ?t7? =?%/D.?޴/ ?;k\?pB'?4H]xP?;D@? `v?辉yH?$4|?ns#;??bP}? J?71~?@ٗ?Brhx?(7iiڂ?+?{z]?U{h*3?7C?\S>?U刢%?>3q?|<~?T?p2?롲c?iW}?K*?S? ?=?j??LAB,?Ɨ:b,}$p[$LsQl Rſ}{̿*?yѿԿ ׿m1ueٿ6ܿwЙ%߿E!࿷a!ΰ?c" GHc\ȻN%wl翃rXX!,,xߓAGϟwTTNʗurDwrQ@}#v_ }迬)g+濾Ԯ&HJM3k_俢\XXrF6f߿3ݿBIڿw ۶׿G-Կ|Ǎѿ*ZY#Ϳ]=lǿ8x"dq9҉,٢V?4W ?Jq?+߽%?(-a?3 Z?yh#?GW%~?jwS?ؚW!-?SW?)Ya?#?Ϥ2W8?[.?z?,2Ďg?H+V{?^B/{?T|`g?DnY@?"|ES??\?@e?p)u ?[W(?x1?kR?"?Sx? M?aNj?H"z殿*6nĿaޭʿlp iп|7jӿJ֠Xֿ20ٿ_oۿ޿S ࿠<QL=T.俟4Nu[}3/F컝y翄 F:l l迲3O1{Hqwm?xߧQ,Ѥ@I^`Aki cM迆 MG还y\;uY"U&Ţ1)!俌WXDU4[Fbῌ#C, {ݿL!ۿY[ؿQ֊;}տhҿc0Ͽ ӢȿB=¿X'sXETr?_Et?eIaĖĺ?n÷?g?#u?{g?\4y?#.?=M?-@lxE?@f?5kHE?Z`?ߚ\?f2?i\?C'UGy?m2??<^?轑f?wY(?H/g?ls˖?uĕ?BՋ?k-cd?ZCh#?$?aU?ܗ+H?n&?@k?Zi1b?no:?$A?{qhs?P?[<γP?H"8?x@p?!<嶭? ?j?ܜ!t?ؒ?cI?ϯZ?#?>?_SxᱬR?,)! ^W!RbÿH@ݘDɿ}eoϿhIҿ^bYտ4mؿf~4QۿhݿrKB UZ@wU2YP{ ]Rw'8_WE}bi+O\WQ!P迣 ?גVU?qsz?#DO?]bi?++ w?ޙXK?_ ?>ױ?u+F[A?4hy?uQ?W[?PYF?ZT[?h8?xMšo?{h4??SMLr?+D&?M?bJ?zmp?Ԫ(?w,L?ͿH?[MZ?:?t{0?‹8 ? SP?y5z?L? _?J+?,w?@!څʼ?!)5?D0?F@ >l?jW@ңǿJw/! οO9ҿ@tXOտ=t׿}5ڿP`laݿ5߿/c2ʂZԪƁ oRp@u]40i s]D2B:.qI ]1UpU|Dc/i鿈 Pt鿿fj<鿣O&.迲I翣oat~濰B |C7Cjxn{\) F/*b>1޿olb[ܿxFٿtֿDSJӿuп#˿Enſ]5<.9LGHΗAD㿻hV7,⿇}* 4߿}9h`ܿ dBڿt׿ڎԿyebxѿߢ7Ϳ *uƿsĎY9dĵV<ҙ?ckG?#Ͼ?̥DԷ?d~??'A0?eZ_?fr?(z?Z h?uNT?!M?*F?ǩ?o??캶?! ϱh? !?a b??P??v?2?A?Կ?qdpyR?L_sj ?cA-?$,?iAf̘?.B?@+?W8&S?u=KoDe?(ib?v4L?+m'Ʈ$? _EKI?'D/C?G9w?H7SVq鿕"鿬ݘKڅ鿗^+YlO]*ژ [;0_'x/V{zBvGlYg<'ځma]>GῩ5?۝ݿ"Xi)Lڿ ƪؿ;iW9տQpfCҿe-vο{Fȿ+@>yJA|˗?HYRچQ?״?AHJ?h͉?uPxQW?fdLY?G?|?L?$?܂?-MR?r?? ?k?>e-?n%?̋JB?4:?{i?+6.?Fs&r/?(*al?"4?ˤf?smN?P_?R7>?rK?-PBJ?7Fad?Id-?EeY?XA?*?ܔ9Y?6ucˍ?~o~i?[n3?l? #7r1?)l?R5Y-?삚?NE(?{.?أ7?Bƌڽ?d? ll4%fhT@zrÿįDɿ̕MrϿ!ӿdjqտkiؿDۿGVg6޿F{_CKd*|龊8C6%21+@a忤?&tN.,(D[迀迌n&87&fgKq \,hn@h)?h5?=?P?lf?Kc?Œ?Ӛ{?&=r?ؾ?c?o=7?%H?E?"ޱe?$~%?bO̲?{1?!kA W?fIir%Y$$¿2kȿ](ԙοvnTҿ/UJտ.h*ؿ-/ڿD2D۞ݿw{!N[t 4W@ xZBk`'鿝5=p4= 6 e'*4ru+w翔bQx濸]c|y1zg%14?R9@U2{bt޿&Rܿ`ٿhliֿ`ӿ# пi˿⹷Ŀ͓yy1RLͷW ?M[!?%@l?U?kEk?$C?o_F?E?z9?pR?l[X BpY7ԮĪ&1迷o:鿟LD ~#̓HizKF3E鿛[HxL"=*wͥ't gl5$ٶ 2h/+9-U|#Q߿j{+ͨܿ@ԙpڿ &2׿ 'ZJԿW=Nѿ\sq̿Q+oIƿi9L): apJa? :?i9?؞oI?sq?X=N?h'ZJ?Z2?sԙp?P+ͨ?4#Q?-CU?M?'/+? 2?m5$??ڥ'?H*w?Z?8Qx?[?J3E?Kiz?̓?5#? ~?"L?ko:?1?Ī?BN7?c?MB?P e>?!N? TKfJ?Ĺ2?~y?:??n%?0bR?s}&?' ??_C? 3:4?3??!i?So?ܓL֓Ʊ)oϚRſj*˿_P@п@ɗ~ӿǏֿرٿ]-,kܿx8߿mԢpz4͖P D:; fD*;jo խdA@aDd跲Xt运|=Ňݲu#%ϓW}3r~rق쾬S鿹yn[ C?F6/W-i`A H濜9?0\}wQOX忕Ǽj˖?h㿍FS⿖]@ޜ+:-X<߿RݿڿY׿|)FԿ?ӌ`M?-Il?ecG?}&q?lr?Y[[G? n翕 =g*2.@C-鿫*Gk9t9"wqv:`T 뿁迸)3M=$*a+翨w=^:lݨM[䲢 WU9 kp;ҍ ݿ_lHgAۿx|ؿyIտ ҿXvFKϿ:ue ɿ)R¿ײ ~ "b?UӪ?5r0?$Nxqn?`a?7V?h)Wa?v0?_?I?CQ'?VW?鵰?i7׭?Fo4?ar?Kc?KOp?!va*?%]?XiX?my?3*%?k)8_鿅mNf6!4鿵*aln&r/6. {i远/翀JB`%u>e-k修yMRxt܂࿀Z$޿]ۿP|ٿԻGֿKdLYӿsZPxQWп8͉ʿqAHJĿT״컿?{F?"f-v?pfC?piW9?Tƪ?bi)L? ۝?L??$]>G?>(ځm?~7?s=@?AJyw?I? ;U?qs0* ?a?N&`??? b|?Џ?e1n?}a?B$,?Cw q?CH?G"?p?R~ =? c11?궎^?? !?XMD0X?UHvu׵שu_JG'ŃWǿBuAf̘d$,cA-n_sj hpyRԿr2vP?  br!4ϱh翄캶濠Q^ǩjF㿢 Mῦ_NTm h߿zܿafrٿyZ_ֿsA0Կ}ѿ~˿mXDԷſ9ϾqkGwV?D9d?KĎ?n*u?U8?bx?ڎ?$Žt?@?dB?4jh`?P84?}*?}V7,?{ΗAD?JGH? >.9??S?7ْ?S$?co h@`DI迣a]D鿄3yotF2RKdBLN!N†v!"翘5 -{C54BJTXRnPKY9@>~߆@V߿8d %ݿX\bڿm׿7h Կңˇѿ՗=iXͿ[?$ǿ9$C|U1LH?dc6r|?t5<XO?w?:/! ?ѣ?W? >l?%F@?D0R")5_ ۅʼwĿ`+ʿ+A_пӿGy5zֿ SPٿʼ8 ܿ_|0޿Ԙ:o4MZῐH-L~(@mp忻pJEƻM翠D& VLr远 #{h4Pšo鿛h8S[MYFW[uQ鿎hy "F[Aױ翊 fXK++ wPi1Obqsz’VU > BYݿ@Cۿd6E :ؿ@{\O[տ^XEfҿ2Vvο vȿt H¿ܳW߷[QM* t|?퓅'?waX?}A ?ַA?3?Y:6?dҁ+&?M-]?H|jj?7i$c?F0t?'}Ц?nM?l??J?w:2?!Gw:?z<_?Hd?-1+?Gk,?zfA)j?~L?r?Ȱ ?} 9a??5 ЯZ湿 EdIÿْɿE !tϿjҿQ տ?U<嶭ؿ@pۿD"8޿+r<γPMfῊhs1A-o:i1bNk&翴+H翶aU $P`Ch#(-cdDՋ鿅ĕ鿥s˖D/gAwY(鿫f9^Ќ[a2)'UGyDi\ZU2͚\㿳F`N kHE@@f࿗lxE޿Mۿ].ؿ N4yֿ {gӿ#uп|gɿ`÷ÿ^`Ėĺ mtrT?T's?3=?(Ԣ?0ԩ0?쟪?֊;}?ύ[?0~!? ź{?k:C,?Fb?U4[?WX?F)!?!Ţ1?uY"U??y\? MG? cM?eAk?4I^?IºѤ?yߧQ?0??Eqwm?x.O1? l?F:l?dy?3/F?q[}?*3N?T.?}?+QL?};?j ?˺?՝_o?z20?TI֠X?@j?E5p i?ޭ?@\n?*6?Tz?|"?P5Nj Mx"ȿMlRοqUx1ҿ \W(տ0Ķ)u ؿ-eڿ?\ݿESûDnY@ῳ|`gcB/{<V{DBĎg$*>d<[.翤ؤ2W8迳#!_a҆SWA!-^geM鿾I r鿧w@9gùmupSz_F*zYtnXh|vb9"tѐogg(7G1J޿iW<ܿDjwSٿH"%~ֿ1#ӿOZп$a˿Ê+߽%ſ-q$k簿%V&q;҉?4dq?ۑ8x"?HY^=l?oY#?HǍ?J-? ۶?ϽI?2)3?L?6f?XrF?\?3k_?JM?&?咙?ݷ+?i)?Y}?n}#v?vQ?wrD?Nʗ?,?Gϟw? ߓA?d,,?O?\hX?@wl?VA%?Ȼ?7c\? ?,c?L!?( ?lIЙ%?%6?te?8 ?`?Ξ?y? {? R?8dr?_#p[?:b,?AB, ?jX  ƿT̿k)*ѿW}Կֲc׿2ڿܿX|<~߿13q刢%⿴S>㿬7CƋh*3`z],9Biiڂ,|hx@ٗ3>1~: JdP}||r#;\4|KyH鿜`vD@9>]xP追B':.k\ϴ/ 濗D.=knt7]P  *u򄉁o߿WOuܿRs"ڿ.~tUS׿TAڟlԿ֞_qѿQ(̿ixΞƿ!aEvϳmT W?B}?c?k4?X9?k$N+?n (?j?b$=?jܵ?^j4??}b^?"/?&?~<?Զ?R?h:p?lp߯ ?ù?E 4?zB?%33x?P-?-I"?r,u?tړHO?43~?56%s?{%?nE?,Kd??DH9"?H?N$AY?CV?(;??Y?F?4P$?ir?7IM??Æ ?ݦ/|?$m)ٟH?U7n5?P'C? uF?h1+Џ=2@X"$GJſ(Tn˿6vZпFӿ4:ֿJ zٿLLܿp*g/޿ls`=GNῦgǺs F俁j M]HY翘paH} Jya:qŒ_s>Q鿉>`-!1Ve3鿯ܪ3edO5<25 sX j>É90EbM0&v-ut`߆:3r930 ࿵>qݿsA{ڿ v׿Tտa,} ҿ}.ο@sSǿ԰|գ(W?:w{??0Xvz?}eW?Uȯqz?ZP{?li?2s@?:=)?.鍟?vk?룲??Q٢p? m?cȫ俆CK㿹a ⿐q8~"~I/\ ޿e `ۿ 6XؿտQ7ҿϿhɿە%ÿ8?:%'gffffa=tq%'?2ױ??f%??sh?B?Uy?>?@6X?T9 `?\ ?T>~I?o8~?z ?(CK?xȫ?8^?' 5Lg?7wB"?{?D S?@C?6ܠ !?#lE2c?~8?aL?MxZ%?Hi?1]*?fb?zsqa? ڪ?86?ح}?pRU?T?s??t ?*7sjm?!T?'?V? ]S?;b%?C8/"?Y ?h??u?`Ww?s/yD)rm¿8BȿοrzwҿƝFlտFSOKؿ)ۿMb BJݿF`%࿢^[/⿠lU-gFT|UP|2/_d/VD/cuMAD]鿑4oHA9;o n鿗_2鿽8q?0 ?:3r9?t`?-u?Jb0&v?Xb?OÉ9?[X ??5 ?edO5?ܪ?&e3?9&1V?a>`??>?_s?a:?Ay?OfaH}?nHY?bM]?t?,j??֤s ?g?ۢGN?X`?:g/?L?3y?:?_F?uZ?Sn?1GJ?=X?$2?|&Џ?%>wF렿R'Cfn5x)ٟHǿ-/|Ϳ ѿԿW8IM׿Uirڿ4P$ݿDG߿TYῚA;?\V㿱9AY"H忐QDH9"Kd6EZ{%?%s迬3~鿿ߓHOr,u-I"]O-"33xyzBZ 4迶ݦù@d߯ h:p翗RؖԶq<0&x /QI^;nb^j4߿ڠjܵܿ,$=ٿ^fj׿- (ԿN+ѿuЃ9̿c4ƿ귖c*|WYr?fϳ?aE?sxΞ?[R(?_q?iڟl?XtUS?Rs"?2Pu?*o?Du?d/P ?҅t7?=?x2D.?/ ?H>k\?ɠB'?5J]xP?D@?T`v?ֿyH?4|?s#;?f?aP}? J?61~?@ٗ?Bphx?4iiڂ?4)?yz]?xh*3? 7C?sS>?'刢%?Ͽ3q?|<~?TJ?B2?`c?^W}?)*?]zS?ր ?j?j??$AB,?NU:b,G$p[zsx Rſ{̿U?yѿfԿ8" ׿;ueٿ6ܿbЙ%߿%e!ῖCc 俣Kc\Ȼ忒Q%wl翎tX迳YZ",,qߓA鿖Gϟw鿏1Nʗ鿀trD鿕qQ}#v }迷)+Ѯ&JM心3k_\2XrF⿘{6fῴ߿3ݿIڿ ۶׿t-ԿaǍѿ|CY#Ϳ]=lǿ8x"cq89҉V?r ?0Gq?,߽%?Ca?eZ?hs#?a%~?ȾjwS?W!-?ԁSW?Wa?`#?4ͤ2W8?l[.?ફ?.Ďg?'V{?B/{?6|`g?DnY@?wES?G?\?(e?)u ?[W(?x1?kR?o"?x? M?SNj?"hDz殿*6VnĿxޭʿxp iпrBjӿJ֠Xֿ20ٿ_oۿ޿م <QL㿂T.俾4NB[}f 3/F yJ F:l迃 l4O1+Iqwm?xߧQѤuI^^Ak cM迤 MG]y\^UuY"UŢ1@)!俼WX-U4[⿛FbC,j{ݿB!ۿpO[ؿ.G֊;}տ]ҿL0Ͽ!Ӣȿ+=¿It'sTur?t?dxaĖĺ?÷?(g?#u?{g?4y?.?8M?IlxE?s@f?:kHE?^`?x\? j2?i\?'UGy?Pp2?? ^?]f?ʟwY(?EI/g?Țs˖?rĕ?AՋ?-cd?YCh#?L$?°aU?+H?&?=k?,i1b?sko:?\A?kmhs?L?W<γP? "8?w@p?<嶭? ?wj?T!t?ؒ?cI?ϯZ?#?>?ylᱬR?̇! ^W!Rbÿ_@ݘDɿBeoϿhIҿibYտwؿf~4QۿݿCrKB`YZ@w Z2Y ]R'8_W%bUl_O\1Q!P" ?!ܒVU?qsz?GO?ei?;++ w?ȜXK? ?|ױ?Z-F[A?hy?uQ?W[?yPYF?lT[?Ҹh8?Lšo?{h4?C?KLr?D&?M?&`J?wmp?+Ѫ(?,L?λH?MZ?~:?{0?؁8 ?O SP?vy5z?A?}_?ml+?w?Rمʼ?W!)5?2D0?XF@ >lWWңǿ/! οeDҿXOտRHt׿5ڿjlaݿE5߿g2Z⿰Ɓ o~Rp俄u]4БiAt]D2迕C:..sI 81U鿀pU鿚Dci Ptej~U?]?Ds9?x[?$?^=iX?Pˇ?7h ??x>X\b? %?@V?X~?.Y9?inP?4BJT?@{C? ?x5??"?v!?U†?BLN?K? R?&tF?~3y?[]D?hI?h@`?$Wo ?ws?l9#?MҸR?*|?CN,?c%?57 ?#z?/6C?2C<1?ߥPX?@h!? 49?bu.9忯GH'ΗAD㿏dV7,}*x4߿/h`ܿZdBڿt׿جڎԿWZbxѿ%7Ϳn*uƿĎ)9d_Vŏ?kG?RϾ?CDԷ?{~??A0?Z_?7鿽SVq"鿕ݘ鿅Kڅ^+Y:Nϔ*ژ1 [;$x/V翍zB濠vGl5Y俐<㿪'ځm]>G 1?۝ݿ Ni)Lڿ'ƪؿ80iW9տ?upfCҿ_e-vο {Fȿ(>bJin˗?ҷRچQ?״?AHJ?L,͉?PxQW?_dLY?G?l|?V?h$?܂?tMR?u? ?^k?$>e-?q%?GJB?W<?{i?6.?Vt&r/?ڢ*al?%#4?f?mN?_?qR7>? K?:-PBJ?4Fad?d-?EeY?`XA?*? 9Y?2ucˍ?zo~i?n3?l?7r1?y)l?H5Y-?삚?@NE(?{.?k7?4ڽ??qlx%fhT@z sÿįDɿOMrϿ!ӿuqտiؿDۿVg6޿ {_࿒Od*|8⿴G6%51.@a}?&tRQ.,(翤D[迦o&87&fKq \,n鿂g)?5?=?"M?b?Fc?Œ?J{?=r??c?e=7?%H?fE?<DZe?f%?lO̲?z1?iA W?_r%p$$¿2kȿ(ԙοnTҿ:UJտ39h*ؿ-/ڿlN2D۞ݿ|.!Nw dW xZ鿶kt'S5Y=p4= 6鿤c'i4ruׇ+w#bQ3v濟Zcy|vg% -4R9῿U࿠({bt޿&Rܿ`ٿĄliֿ%`ӿI# пni˿o˹Ŀdyyt1R'z,W ?|[!?Q=@l?l?kEk?/C??jF?$P?C?'ƂR?dXB濇s"\7аĪ1o:鿆L ~1#鿜̓THizXE3EK[@GxF:*w\ʥ'n l5$5 2{/+4⿍(U#Q߿q+ͨܿ6ԙpڿ{2׿>'ZJԿL=Nѿsq̿0oIƿh9:aa?PD:?tj9?oI?řsq?=N?J'ZJ?Me2?}ԙp? +ͨ?$#Q?GU?R?+/+? 2?^m5$??6ݥ'?FK*w?`?Rx?l[?K3E?YLiz? ̓? #? ~?;L?&o:?p1?Ī?K7?`?PB? e>?N?$PKfJ?Ĺ2?u?X1??:n%?XR?}&?' ?_C?T:4??>?i?(0So?gQL֓U̱ƱE)oRſl*˿_P@п*ԗ~ӿҏֿ0رٿg-,kܿ8߿0rԢ࿫z)іP :q ; wG*j խdQBaD跲迳t迌}=dݲub%ϓ8}3~rقSxn[ 鿬=F'6/ -i> H濨9?0zwQOXǼj?hkFS1Y@ޜ+#X<߿LRݿڿ׿FԿ$Cѿ$jEkͿˇǿ?l3[!W d?P1R? zy?m?i?# ?`?li?k9`?'R?j{bt?4U?R9?H4?Zg%?ݢy??pc??.ϿbQ?}+w?4ru?Xm'? 4= 6?=p?Z5?&?k?\ xZ?!W?; ?kj,$]>?^ь`M?Fl?ecG?k}&q?r?W[G?i翹=g这3.QC-_+Gk鿏t9"w{q鿯:`/ i'3M迸=翗'a+ƥw=^iݨMCX䲢TWP9⿪kp0;"ɍ ݿUlHgAۿx|ؿuyIտ ҿǰvFKϿȲ:ue ɿR¿~b?4'UӪ?5r0?$_mNf 4*all&r/鿪~6.D{iz-}JB/^%T>e-fk󽙱v⿚MRo܂P$޿lۿTF|ٿ)Gֿ@dLYӿ9OPxQWпT͉ʿlZAHJĿ_״컿"PچQ?˗I?,J?>?{F?9f-v?…pfC?{iW9?+_ƪ?xi)L?۝??Q??]>G?[ (ځm?T7?lr=@?Hyw?I?8U?p0* ?a?xK&`?7ŃWǿn9Ϳ6 ѿ46;Կ.9??S?ْ?S$?w>o?J}?lNKsK? N]}?sΖ?!&L?J Q{?><G?j? m?ϭS%?p{?;$??\w)?`X7?1?q?%8?`?jX?b„?%B?z~[?)_?O?/n? ?,D1?!7sך?8N\6ŹuVo{F%ƿJ]̿Wu<ѿmV 49ԿK@h!׿PXٿp<1ܿ/6C߿{57 2c%@]N,q.|忼bҸRG9##wsFeo 返h@`迖I迗b]D3y鿦tF RBKBLNL†tv!"迆5 ){C応4BJTtNnP"Y99~῏}@V߿xZ %ݿW\bڿ-c׿ 7h Կǣˇѿ@=iXͿ[?$ǿ9'{UnLH?d6r|?t5<l?ƷF@?,|D0")5L8ۅʼ wĿ= +ʿbL_п ӿjRy5zֿ SPٿ8 ܿ%|0޿W:࿲8MZ῏H⿌-L(\mp忄sJ濸ȻM翼D&WLr"${h4uQšoh8S[dMYFW[uQhy& F[Aױݭ |XK濸++ wBMiI-OHqsz⿳VUῆ}> ࿚Oݿ@Cۿ+E :ؿ|p\O[տSXEfҿVvο vȿ|s H¿ܳW߷dQM*_w|?<'?paX?9}A ?췈A? 3?UE6?ҁ+&?-]??jj?r$c?"0t?r}Ц?nM?fp?U?J?J:2?#Gw:?<_?Hd?1+?Hk,?0gA)j?u~L?k?_Ȱ ? 9a?? ЯZ湿T\dIÿ2ْɿ"!tϿjҿp\ տ_<嶭ؿ@pۿDN"8޿v<γP࿟jῙhs⿛5A㿩o:Ci1b忬Qk|&+H翍aU远$naCh#-cdhDՋ鿈ĕIs˖3D/g)wY(5fh^迦^2S'UGyi\Q2Aɚ\㿪B`kHEῳ@flxE޿Mۿ,S.ؿXC4yֿ {gӿ~#uпgɿ}÷ÿ/`ĖĺtPr|T?c's?=??Ԣ?0??P֊;}?<[?=!?κ{??C,?Fb?U4[?RWX?)!?XŢ1?uY"U?B?y\? MG? cM?fAk?I^?ºѤ?$yߧQ???dDqwm?k-O1? l?F:l?Dy?<3/F?n[}? 3N?T.?z?)QL?7;?of ??_o?Up20?I֠X?Hj? *p i?ޭ?En?*6?̳z?Pz"?Nj Mx"ȿ?dlRο`x1ҿ\W(տζ)u ؿEeڿ?\ݿES#DnY@|`g;B/{n@V{俄EĎg*><2[.翏ڤ2W8C#U`a鿨SW鿇A!-wg鿘eMI r鿤w@9¹m迹pSzHD翐(zY翰kXhfsbd6ppѐucg(G1wJ޿_W<ܿvjwSٿ%~ֿ&#ӿZпMa˿s+߽%ſq;簿hV;҉?Weq?88x"?[p^=l?Y#?TǍ? -?Z ۶?ǿI?23? ?[6f?(XrF?Ω\?3k_?JM?|&??,+?_)?}?~#v?wQ? xrD?)Nʗ??dGϟw? ߓA?,,?M?PfX?wl?>%?Ȼ?D4c\?Y ?)(c?H!??@Й%?O6?te?س ?U?Þ?y?$z? R?_5r?)d#p[?0:b,?AB,/o ?jt! ƿ`T̿4*ѿ\W}Կ಩c׿2ڿOܿ|<~߿3q3刢%⿜S>L7Ch*3bz]; Eiiڂ+~hx迉@ٗ|?1~% JieP}鿪Lr#;4|]yHP`v\D@8<]xPdB'翊+k\̴/ CD.Z=俁jt7.P ⿯%ur鄉o߿OuܿʓRs"ڿstUS׿v6ڟlԿʞ_qѿQ(̿RxΞƿW aEH}ϳ+m8 W?v}?_2c?4?o9?/N+?y (?Lj?%=?jܵ?\^j4?b?f^?%/?&?<?Զ?R?h:p?ur߯ ?wù? 4?zB?8&33x?P-?,I"?yr,u?ٓHO?3~?4%s?{%?E?Kd?6>`T 1V鿨e3ܪEedO5/5 #qX y;É9AbrI0&v$-ut`}:3r9ΐ0  >qݿhA{ڿv׿إTտV,} ҿwl}.ο)sSǿ԰|+գ;W?5w{??GXvz?]eW?ӯqz?weP{?li?C2s@?%G)?08鍟?k??? ݢp?p?% JBvؐ%R=U?<\pΣk_鍟޿)ۿX2s@ٿ6liֿ P{ӿyqzпbdWʿXWvzĿMw{aʭWE!գ?|?3^԰?sS?z!}.?,} ?T?7v?A{?oY>q?0 ?z:3r9?t`?-u?e0&v?[b?RÉ9?X ?B5 ?edO5?ܪ?P'e3?'1V?>`? ?C>?_s?a:?@y?daH}?ZHY?M]??j??&s ? g?֢GN?8T`?g/?L?y?:?)TF?luZ?ESn?GJ?ZȳX?2? &Џ?ޜwF렿@R'Cn5 *ٟHǿD/|Ϳ2 ѿ Կ8IM׿zirڿJ5P$ݿ!G߿ZE;?>VI=AYmH忋TDH9"濜Kd濇EQ{%oA%s3~鿢HO鿚r,u .I"$O-|!33xyzB 4ܦù5b߯ h:pR͓Զ<忉&俇/E^i\Y^j4߿jܵܿ$=ٿ[j׿" (Կ^N+ѿ9̿L4ƿڻcj|B&W<s?ϳ?oaE? yΞ?rR(?#_q?Gڟl?tUS?-Rs"??刢%?_3q?h~|<~?@?2?֌c?TW}?*?cS?i ?sS?j?Ÿ?AB,?:b,}$p[שs RſW{̿?yѿLԿ, ׿Eueٿ6ܿʊЙ%߿5*%j!ῇGct Oc\ȻLT%wl翚vXd[述#,,jߓA0Gϟw NʗsrD鿴pQ}#v) })˧+wή&濷JM3k_\ XrF0w6fj߿43ݿvIڿu ۶׿-ԿFǍѿ,Y#Ϳ]=lǿc7x"_cqC8҉LTV? ?vq?,,߽%?Za?#Z?W~#?l%~?jwS?W?+Ďg?,$V{?B/{?|`g?[DnY@?rES??\?e?{)u ?%[W(?x1?_kR?X"?x?hR M?Mj?:?"z殿M*6nĿޭʿ=p iпiMjӿcJ֠XֿP20ٿ_oۿ ޿_ - <QL⿲T. 4N[}"3/F,yF:l l5O1Iqwmd?鿴xߧQRѤ鿩I^鿯]Ak] cMĽ MG$y\ͬpuY"U濸Ţ1忻)!WXU4[BFb]C,ǁ{ݿ8!ۿE[ؿl<֊;}տRҿX60Ͽ$Ӣȿ?=¿9E's TUlr?t?baĖĺ?6÷??g?[#u?{g?˜4y?ڥ.?2M?JSlxE?@f?S>kHE?b`?;\?m2?Gi\?'UGy?r2?囶?^?f?wY(?J/g?$s˖?nĕ?ZAՋ?-cd?XCh#?$?aU?|+H?_&?:k?i1b?go:?A?]ihs?MH?wR<γP?"8?u@p?& <嶭?G ?{lj?o!t?|ؒ?mcI?wϯZ?e1#?>?-`ᱬR?k! _W!R3bÿv@ݘDɿЪeoϿhIҿ[tbYտؿf~4QۿݿלrKB࿶]Z@w^2Y ]Rw'8)_Wbn翓O\ Q!P迢 ?}VU?qsz?KO?nii?u++ w?XK? ?ױ?@/F[A?Hhy?JuQ?qW[?PYF?T[?h8? Lšo?{h4??ILr?D&?7M?]]J?tmp?ͪ(? ,L?ϷH?MZ?~y:?z{0?w8 ? SP?x5z?7?G_?U+?w?eمʼ?h!)5?b}D0?XF@ ? >lWnңǿ/! ο|Oҿ܉XOտRt׿5ڿslaݿ5߿k2 Z⿋Ɓ oRpu]4ni濉!v]D2)E:.ftI 1UpU鿷Dc鿫iH Ptdj.9GH@ΗADc`V7,⿬}*$4߿%h`ܿ-dBڿt׿άڎԿ7Obxѿlu7ͿW*uƿÎ9dIVOM?BkG?Ͼ?lDԷ?Z~??A0?íZ_?zfr?ԅz?/ h?~NT? !M?1F?lǩ?u??캶?$ϱh?!?ȯ b?j?P??v? 2??Կ?bpyR?_sj ?cA-?М$,?eAf̘?~B?S+?8&S?L6KoDe?X (ib?7n4L?_d'Ʈ$?LEKI?0/C?J39w?37d SVq&"~ݘKڅ^+YM@*ژH [;迬-"x/V翠zBavGl忩Y俺<㿍'ځm⿣]>Go,?j۝ݿCi)Lڿ ƪؿp%iW9տ-jpfCҿe-vο{Fȿ>JJTr˗?]SچQ?I״?AHJ?0C͉?PxQW?WdLY?XG?|?`?$?܂?MR?y??k?D>e-?t%?JB?x>?x{i?6.?fu&r/?*al?x#4?f?mN?_?JR7>?j K?[-PBJ?2Fad?+d-?EeY?+ XA? *?@9Y?m.ucˍ?Ovo~i?/ n3?tl? 7r1?u)l?P=5Y-?՗삚?NE(?u{.?7?'hڽ?D?wl%fhT@z;%sÿįDɿMrϿ!ӿqտ'iؿDۿhVg6޿b{_Sd*|8xK6%p91$2@aU?&tS.#,(v D[op&鿊97&f#Kq \,鿨nf)?Ⱦ5?=?I?^?@c?wŒ?{?=r??Tc?VZ=7?ċ%H?*uE?Ue?O%?t_O̲?hVz1?s+hA W?s#tr%3$$¿2kȿ(ԙοnTҿ~EUJտCh*ؿ-/ڿX2D۞ݿ/࿌!Nῒ迍 返W xZ)k鿉'5鿰=p4= 6@b'迩4ru迼+w翱bQls濅Wc忪yrg%#)4⿻R9=U%{bt޿&Rܿ8`ٿ zliֿ4x`ӿ# пXi˿;Ŀ5yysE1R-W ?[!?T@l??OkEk?:C?uF?Z?M?ςR?mXر?H~?h}~?3y_P@?̾*?.R?'o?TƱ?wnL֓?lYohi$;NԲƿ:4Ϳ `Cѿ^' Կ2~&׿ԨRڿ>o%ݿu{?߿;%Ĺ2oKfJ4NL e>ĨB1vv^7˲Īh1Ao:mLV ~[#g̓GizgD3E[迕Ex@f8*w翨ǥ'g 濸l5$忑 2俎 /+㿜0$U࿼#Q߿g+ͨܿT,ԙpڿ2׿]w'ZJԿ`A=Nѿsq̿oIƿh9:ata?s:?EKj9?oI?sq?=N?+'ZJ?o2?ԙp?+ͨ?-#Q?LU?NV?//+?A 2?m5$??ߥ'?M*w?e!?Tx?[?L3E?Liz?A̓?ᦈ#? ~?SL?o:?1?Ī?I7?Q^?RB? e>?N??LKfJ?Ĺ2?p?(??wn%?MR?e}&?& ?_C?:4??i?­i?rRo?L֓Ʊgt)oERſ<*˿E_P@пߗ~ӿ,ݏֿpرٿq-,kܿR%8߿vԢ䫥zՖP 㿝: ; 忇J*忶j?խdaDaD跲 ùt迉~=ݲu鿢%ϓ}3u~rق2SEwn[ ?ό`M?Cl?/ecG?/}&q?Wr?S[G?e(ԙ?ߚ2k?#$?<"q%??kuA WB}1Q̲%Ŀ0}eʿ٪Eп%Hӿٹ=7ֿdٿۿLh=r޿O{ͪŒ98cg㿄h=5b>翙=g5.dC-,Gkt9"wq:` 輁%3M迁= %a+w=^eݨMT䲢俈WL9SkpΊ;࿅ ݿKlHgAۿ4x|ؿkyIտҿ7vFKϿΛ:ue ɿR¿ySL~b?ͅUӪ? 5r0?hSNxqn?D?dV?m?Wa?.v0?t?0I?VQ'? VW?@鵰?7׭?o4?hr?NKc?Op?&va*?a?iX?my?V5*%?pm)_[mNf鿐 4Q*alk&r/=}6.|{iX+翍zJB`[%3>e-领k6𽙱rRMRkk܂xG$޿|ۿ<|ٿ~Gֿ5dLYӿCPxQWпpu͉ʿ0CAHJĿh״컿(OچQ ˗N?[J?J>?{F? Pf-v?ͅpfC?UiW9?iƪ?i)L?O۝?U??]>G?w(ځm?+7? q=@?Fyw?I?,6U?m0* ?a?H&`?8?b|?Џ?\1n?"ْ}a?.$,?w q?pH?1"?p?~ =?411?7^?g !?WA0X?HAv׵u_JG1UŃWǿ9Ϳ6 ѿ6;Կq.9??5S?ْ?S$?@o?!L}?mNKsK?N]}?sΖ?~!&L?l?1hF@?TD0#)5:gۅʼVwĿ"+ʿW_пӿ]y5zֿ( SPٿ8 ܿX/|0޿ڡ: Eݿ}@Cۿ!E :ؿe\O[տHXEfҿVvοvȿ*s H¿TܳW߷QM*y|?7'?jaX?x~A ?A?J3?QP6?Ӂ+&?-]?4jj?J|$c?Z'0t?}Ц?nM?%t?ɧ?J?:2?%Gw:?<_?mHd?1+?Ik,?gA)j?~L?c?ǰ ? 9a??5 ѯZ湿sdIÿIْɿW9!tϿjҿ(g տj<嶭ؿ@pۿW"8޿L{<γPnῧhsc9A&o:qi1b忈Tk&+HdaU$迍bCh#鿩-cdDՋ鿌ĕs˖xC/gwY(f还^|X\2|'UGyi\lN2Ś\㿟>`⿳kHE'@fzkxE޿}MۿH.ؿ84yֿ {gӿ=x#uпqgɿe÷ÿ`ĖĺtƇr\۔T?s's?=?VԢ?]0??֊;}?[?J!?Rغ{?CC,?NFb?U4[?"WX?P)!?Ţ1?kuY"U??y\? MG? cM?hAk?˕I^?$úѤ?2yߧQ???Cqwm?],O1?< l?,E:l?$y? 3/F?k[}?3N?7Cjh*3dz]濈>xGiiڂ+hx/@ٗ@1~ JeP}؋r#;<4|pyH`v迴D@6:]xP B'(k\ɴ/ D.忹=俗ft7 P ?!uo߿OuܿRs"ڿitUS׿+ڟlԿ_qѿ*Q(̿;xΞƿaENϳ nl W?~?7ac?4?9?:N+? (?j?%=?Ujܵ?^j4?ؑ?j^?)/?X&?4<?Զ?CR?~h:p?t߯ ?&ù? 4?zB?&33x?%Q-?,I"?r,u?ؓHO?3~?2%s?{%?E?Kd?9DH9"?{H?AY?V? ;??AY?PF?4P$?ir?Ȳ7IM?? ?zy/|?>)ٟH?n5?P'C?MtF?,Џd2lX򽿀RGJſVTn˿-vZпFӿI:ֿzٿ LܿT=g/޿g|`࿷GNῗg's 俩j`濨M]HY taH}Lya:鿷ƒ_s鿥>鿖>`|1Vse3鿊ܪXedO5述-5 翆nX 濈8É9濬>bE0&vK-u㿤t`~:3r90 R>qݿ^A{ڿv׿ TտJ,} ҿU}.οsSǿ6԰v|/գdW?w{?K?)_Xvz?<0eW?ޯqz?lpP{?Pli?2s@?Q)?A鍟?~k?a?"?p?s?οӈzwҿXܝFlտ#SOKؿ=ۿu BJݿx`%W^[/ClU;g俸T|忎UP濢7翌/_+/VD/迹wBD]p5oHa9鿝nn鿀_28近q?0 ?۩:3r9?t`? -u?ii0&v?*_b?UÉ9?X ?]D5 ?edO5?7ܪ?(e3?'1V?U>`?(?>?`_s?a:?&?y?baH}?FHY?M]??j?Q?vs ?g?ҢGN?O`?Wg/?xL?y?M:??˫刢%?3q?u|<~?6?2?Lc?)IW}?*?LS?R ?zY?V?HpSz?^ιm?w@9?I r? eM?g?U=!-?'SW?Ua??#?]ɤ2W8?[.??l(Ďg? V{?ָB/{?|`g?DnY@?FnES??\?e? q)u ?[[W(?nw1?kR?A"?Px?O# M?DMj?e"xz殿|*6nĿhޭʿwp iп`Xjӿ %J֠Xֿ20ٿ_oۿ޿ s<QLl_T. 4N܇[}U%3/FLyF:lX l6O1鿊Jqwm鿵?鿦xߧQ徺ѤލI^鿅\Ak؇ cM MGy\<翊uY"U濁Ţ15)!WXU4[|FbC,$x{ݿ-!ۿ:[ؿ1֊;}տGҿ0Ͽ&qӢȿ=¿*'sh)Tbr?at?`aĖĺ?3N÷?Vg?#u?{g?t4y?6.?,M?\lxE?@f?BkHE?f`?\?p2?pi\?ƛ'UGy?Su2??!^?H‘f?wY(?J/g?s˖?kĕ?@Ջ?(-cd?eWCh#?T$?aU?L+H?&?8k?i1b?ydo:?A?Nehs?C?M<γP?!8?uy@p?<嶭??waj?BY!t?eؒ?'cI? HϯZ?"?>?TᱬR? E" 0_W!R}bÿ̍@ݘDɿ_eoϿhIҿbYտfؿf~4Qۿ:ݿkrKB bZ@w0b2Y⿰ ]R'8[_W兿blqO\Q!P" ?VU?qsz?OO?li?++ w?XK? ?ױ?$1F[A?үhy?xuQ?AW[?\QYF?T[?8h8?uKšo?{h4?v? HLr?D&?òM?ZJ?qmp?Uʪ(?S,L?ϳH?MZ?t:?{0?n8 ?y SP?+x5z?,?賥_?>+?}w?wمʼ?8!)5?<<|D0? F@(n >lKWԅңǿD/! οZҿXOտG]t׿Դ5ڿm}laݿʹ5߿Yp2/ZfƁ o㿡Rp u]忴4 i#x]D2迾F:.连uI 1UxqUԄDcii鿧 Ptcj<鿏K.|yId|oa6~x9 |CCjmn俗P) F,/R"1޿Nb[ܿFٿֿ,$SJӿ5uп@К#˿}nſ5<.9tGHYΗAD7\V7,?}*4߿,h`ܿdBڿt׿7ìڎԿDbxѿ^7Ϳ@*uƿIÎ9dmV ? rkG?Ͼ?DԷ?'~??A0?.έZ_?fr?ޅz? h?ZNT?P!M?5F? ǩ?0y??O캶?T'ϱh?!?| b??P??v?]2??Կ?apyR?_sj ?6cA-?ܚ$,?bAf̘?F|B?\+?8&S?2KoDe?x(ib?j4L?_'Ʈ$?JCEKI?&/C?()9w?)7 !SVqn"hݘ鿚Kڅ^+YK鿲*ژ_ [;i翔x/V翴zB#vGlYG'?࿽۝ݿ9i)Lڿ>ƪؿiW9տ_pfCҿne-vοͅ{Fȿ,>3J˗?tSچQ?x״?C+AHJ?Z͉?&PxQW?PdLY?G?|?j?p$?܂?MR?}?s?? k?f>e-?]w%?:JB?@?@{i?q6.?vv&r/?=*al?#4?f?2mN?_?#R7>? K?|-PBJ?\0Fad?d-?0EeY?XA?*?q9Y?X*ucˍ?qo~i?n3?l?7r1?j)l?25Y-?ʗ삚?~NE(?^{.?Ғ7?9ڽ?y?]}lP&fhU@z~a+? =?83M?ˁ?s ?:`?%q?H"w?t9?%Gk?C-?&.?=g??=tb>?5?=?>F?3[?;c?-Œ?9{? =r??c?O=7?ʀ%H?iE?oe?n8%?|0O̲?y1?EfA W?r%$$¿ě2kȿ8(ԙοnTҿDPUJտNh*ؿ"-/ڿa2D۞ݿ˅!N῭ ĴW鿶 xZ鿜k鿞'鿽5=p4= 6`'4ru迣+w?bQ翤plTcAyog%&%4zR9ΏU࿬{bt޿&Rܿܕ`ٿ|oliֿAm`ӿ߈# п-Ai˿Ŀ yy31RW ?ۣ[!?l@l? ?kEk?EC?F?e?W?قR?ǨBx`7ǴĪ 1迆o:TL ~鿅#1̓,GiztC3E鿬[Cx; 6*wĥ'` al5$ 2信/+j,⿦U\#Q߿]+ͨܿ"ԙpڿZ2׿|l'ZJԿ96=Nѿsq̿oIƿEwh9:^aa?:?zj9?>oI?Lsq?ΰ=N? 'ZJ?nz2?Dԙp?+ͨ?R7#Q?PU?Z?3/+? 2? m5$??'?P*w?k#?;Vx? [?M3E?Miz?v̓?#? ~?lL? o:?.1? Ī?EG7?[?TB?e e>?NN?YHKfJ?`ù2?9l???n%?CR?}&?& ?_C?94??zR?i?=Qo?}L֓*ƱE)opRſ *˿s_P@п~ӿ珛ֿرٿt{-,kܿ.8߿%{ԢzٖP J:2; 忘M*tj濦խdqFaD翅 跲fĹt迆=鿡ݲu%ϓ}3~rقUS vn[ :FD6/x-i9 H濾9?0濌swQOXǼj4?h$FSgP@ޜ+jX<߿nRݿڿ׿ FԿ˜CѿjEkͿǿ9k?lԡ[!FشW [?1R? {y?!?j?̌`M?hAl?DecG?}&q?́r?O[G?aޱ q`k*  _. Seӫ Se}FC|K)9>A\' en-gbt E˖Vܷ Ser@iM[_\D+Pÿa aD> @Rц1HdARц1HWindows Media Audio V8a@^PPeakValuegAverageLeveldH WM/AudioFileURLWM/AuthorURL$WM/AudioSourceURL3&ufbl4Beep wma6&ufbl2 ] @ (2???~XcV5p 8%9GO!#3~=yĶx $|>W [> OEXo~_S~vw>K))R!)B!)B NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNJ @`R./8{`h "^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNy @&~KNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN @`\yUp/NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN]. @ o~.x L]?~ҀHxNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN @hF~<Vb^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNclementine-1.2.3+git1354-gdaddbde+dfsg/tests/data/brokensong.cue000066400000000000000000000004041260417502300243050ustar00rootroot00000000000000PERFORMER "Zucchero himself" TITLE "Chocabeck" FILE files/longer.mp3 WAVE TRACK 01 AUDIO TITLE "Un soffio caldo" INDEX 01 00:01:00 TRACK 02 AUDIO TITLE "No index - broken" TRACK 02 AUDIO TITLE "Somewon Else's Tears" INDEX 01 05:00:00 clementine-1.2.3+git1354-gdaddbde+dfsg/tests/data/discid_2cd.xml000066400000000000000000000375271260417502300241710ustar00rootroot00000000000000 267785 Live on the Edge of Forever Official normal eng Symphony X Symphony X 2001-11-13 US 2001-11-13 United States United States US false 0 false false 1 CD 213610 1 1 98266 Prelude 98266 2 2 318400 Evolution (The Grand Design) 318400 3 3 390826 Fallen / Transcendence 390826 4 4 459040 Communion and the Oracle 459040 5 5 219760 The Bird-Serpent War 219760 6 6 309573 On the Breath of Poseidon 309573 7 7 425226 Egypt 425226 8 8 352666 The Death of Balance / Candlelight Fantasia 352666 9 9 272373 The Eyes of Medusa 272373 2 CD 267785 1 1 394600 Smoke and Mirrors 394600 2 2 441866 Church of the Machine 441866 3 3 849426 Through the Looking Glass 849426 4 4 442773 Of Sins and Shadows 442773 5 5 245160 Sea of Lies 245160 6 6 1194640 The Divine Wings of Tragedy 1194640 Live on the Edge of Forever Official normal eng Symphony X Symphony X 2001-10-22 DE 2001-10-22 Germany Germany DE B00005Q8VB false 0 false false 1 213610 1 1 98266 Prelude 98266 2 2 318400 Evolution (The Grand Design) 318400 3 3 390826 Fallen / Transcendence 390826 4 4 459040 Communion and the Oracle 459040 5 5 219760 The Bird-Serpent War 219760 6 6 309573 On the Breath of Poseidon 309573 7 7 425226 Egypt 425226 8 8 352666 The Death of Balance / Candlelight Fantasia 352666 9 9 272373 The Eyes of Medusa 272373 2 267785 1 1 394600 Smoke and Mirrors 394600 2 2 441866 Church of the Machine 441866 3 3 849426 Through the Looking Glass 849426 4 4 442773 Of Sins and Shadows 442773 5 5 245160 Sea of Lies 245160 6 6 1194640 The Divine Wings of Tragedy 1194640 clementine-1.2.3+git1354-gdaddbde+dfsg/tests/data/fmpsplaycount.mp3000066400000000000000000000147261260417502300250010ustar00rootroot00000000000000ID3TIT2 Beep mp3TXXXFMPS_PlayCount123.0t8U !??bBckk6v3YI2s:69cjB3q11Q 0PѢHPMifb8(cxǏD N@xxx~? 9@9 BÁ0/9NF*=K$cB U(LE 'Ы!_T t= X2VEE%+aaj0I:>BCa.Z Z,`!p<#@` @+`y@e !4EX"" EIDPTDxK< S s$.cddzQH=H'] „euhL3 @, "5&#;q>d@%Y iJɛRf lm+R_c0@=|:1 5 VCAT HN LS4j QS=Bf Y{Q1TK"<K.àmL$DPIB_#t;Cj?))e'UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU2 2d3A95Z0ʇC5KxU5'0B6d,`5iEMgV\07a霏zaFl^lQNah}[پb}^h FĝGp#NabJHSQLˎN UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU22P3%>5Jk0Gl594B05@EgS5JMWZ[a_A!٦ǴH=qX=r͏ z37OaG#aJ+o~?~jb j)qq22D3G5x04z4Çm0B&4ˤk'D5x IMgVzb6ea iVrDbqppbtsj*hҴheYra R[ǔ'A$"HWдٵИf\rp\eUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU2202L4څ0G44ǔ074:3n)55l NIZv00,0Q0BM1U 8u8|1YB95z4Ea4Z20|EFv|%a,bHFoI~\_?fS2㓂%UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU,Sc%s? 8n>Xǽt_ZSӱNޅݯfVc~oi)e'J112Ub3ʱ0>33H0yo1+р3zT61 .Y000t0@0F1Ω>Y=310z0000*'A^"HX0>0 ])YX8eq @A&o9˙sU9sUȜ4F2p\%O{;uȜP(!c&X8zȐLW^ Ǒ.VD7瀯WdzǏ"]X7~tcgjDoD"DBCa.Z Z,`!p<#@` @+`y@e !4EX"" EIDPTDxK< S s$.cddzQH=H'] „euhL3 @, "5&#;q>d@%Y iJɛRf lm+R_c0@=|:1 5 VCAT HN LS4j QS=Bf Y{Q1TK"<K.àmL$DPIB_#t;Cj?))e'UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU2 2d3A95Z0ʇC5KxU5'0B6d,`5iEMgV\07a霏zaFl^lQNah}[پb}^h FĝGp#NabJHSQLˎN UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU22P3%>5Jk0Gl594B05@EgS5JMWZ[a_A!٦ǴH=qX=r͏ z37OaG#aJ+o~?~jb j)qq22D3G5x04z4Çm0B&4ˤk'D5x IMgVzb6ea iVrDbqppbtsj*hҴheYra R[ǔ'A$"HWдٵИf\rp\eUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU2202L4څ0G44ǔ074:3n)55l NIZv00,0Q0BM1U 8u8|1YB95z4Ea4Z20|EFv|%a,bHFoI~\_?fS2㓂%UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU,Sc%s? 8n>Xǽt_ZSӱNޅݯfVc~oi)e'J112Ub3ʱ0>33H0yo1+р3zT61 .Y000t0@0F1Ω>Y=310z0000*'A^"HX0>0 ])YX8eq @A&o9˙sU9sUȜ4F2p\%O{;uȜP(!c&X8zȐLW^ Ǒ.VD7瀯WdzǏ"]X7~tcgjDoD"DBCa.Z Z,`!p<#@` @+`y@e !4EX"" EIDPTDxK< S s$.cddzQH=H'] „euhL3 @, "5&#;q>d@%Y iJɛRf lm+R_c0@=|:1 5 VCAT HN LS4j QS=Bf Y{Q1TK"<K.àmL$DPIB_#t;Cj?))e'UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU2 2d3A95Z0ʇC5KxU5'0B6d,`5iEMgV\07a霏zaFl^lQNah}[پb}^h FĝGp#NabJHSQLˎN UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU22P3%>5Jk0Gl594B05@EgS5JMWZ[a_A!٦ǴH=qX=r͏ z37OaG#aJ+o~?~jb j)qq22D3G5x04z4Çm0B&4ˤk'D5x IMgVzb6ea iVrDbqppbtsj*hҴheYra R[ǔ'A$"HWдٵИf\rp\eUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU2202L4څ0G44ǔ074:3n)55l NIZv00,0Q0BM1U 8u8|1YB95z4Ea4Z20|EFv|%a,bHFoI~\_?fS2㓂%UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU,Sc%s? 8n>Xǽt_ZSӱNޅݯfVc~oi)e'J112Ub3ʱ0>33H0yo1+р3zT61 .Y000t0@0F1Ω>Y=310z0000*'A^"HX0>0 ])YX8eq @A&o9˙sU9sUȜ4F2p\%O{;uȜP(!c&X8zȐLW^ Ǒ.VD7瀯WdzǏ"]X7~tcgjDoD"DBCa.Z Z,`!p<#@` @+`y@e !4EX"" EIDPTDxK< S s$.cddzQH=H'] „euhL3 @, "5&#;q>d@%Y iJɛRf lm+R_c0@=|:1 5 VCAT HN LS4j QS=Bf Y{Q1TK"<K.àmL$DPIB_#t;Cj?))e'UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU2 2d3A95Z0ʇC5KxU5'0B6d,`5iEMgV\07a霏zaFl^lQNah}[پb}^h FĝGp#NabJHSQLˎN UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU22P3%>5Jk0Gl594B05@EgS5JMWZ[a_A!٦ǴH=qX=r͏ z37OaG#aJ+o~?~jb j)qq22D3G5x04z4Çm0B&4ˤk'D5x IMgVzb6ea iVrDbqppbtsj*hҴheYra R[ǔ'A$"HWдٵИf\rp\eUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU2202L4څ0G44ǔ074:3n)55l NIZv00,0Q0BM1U 8u8|1YB95z4Ea4Z20|EFv|%a,bHFoI~\_?fS2㓂%UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU,Sc%s? 8n>Xǽt_ZSӱNޅݯfVc~oi)e'J112Ub3ʱ0>33H0yo1+р3zT61 .Y000t0@0F1Ω>Y=310z0000*'A^"HX0>0 ])YX8eq @A&o9˙sU9sUȜ4F2p\%O{;uȜP(!c&X8zȐLW^ Ǒ.VD7瀯WdzǏ"]X7~tcgjDoD"DBCa.Z Z,`!p<#@` @+`y@e !4EX"" EIDPTDxK< S s$.cddzQH=H'] „euhL3 @, "5&#;q>d@%Y iJɛRf lm+R_c0@=|:1 5 VCAT HN LS4j QS=Bf Y{Q1TK"<K.àmL$DPIB_#t;Cj?))e'UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU2 2d3A95Z0ʇC5KxU5'0B6d,`5iEMgV\07a霏zaFl^lQNah}[پb}^h FĝGp#NabJHSQLˎN UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU22P3%>5Jk0Gl594B05@EgS5JMWZ[a_A!٦ǴH=qX=r͏ z37OaG#aJ+o~?~jb j)qq22D3G5x04z4Çm0B&4ˤk'D5x IMgVzb6ea iVrDbqppbtsj*hҴheYra R[ǔ'A$"HWдٵИf\rp\eUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU2202L4څ0G44ǔ074:3n)55l NIZv00,0Q0BM1U 8u8|1YB95z4Ea4Z20|EFv|%a,bHFoI~\_?fS2㓂%UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU,Sc%s? 8n>Xǽt_ZSӱNޅݯfVc~oi)e'J112Ub3ʱ0>33H0yo1+р3zT61 .Y000t0@0F1Ω>Y=310z0000*'A^"HX0>0 ])YX8eq @A&o9˙sU9sUȜ4F2p\%O{;uȜP(!c&X8zȐLW^ Ǒ.VD7瀯WdzǏ"]X7~tcgjDoD"DBCa.Z Z,`!p<#@` @+`y@e !4EX"" EIDPTDxK< S s$.cddzQH=H'] „euhL3 @, "5&#;q>d@%Y iJɛRf lm+R_c0@=|:1 5 VCAT HN LS4j QS=Bf Y{Q1TK"<K.àmL$DPIB_#t;Cj?))e'UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU2 2d3A95Z0ʇC5KxU5'0B6d,`5iEMgV\07a霏zaFl^lQNah}[پb}^h FĝGp#NabJHSQLˎN UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU22P3%>5Jk0Gl594B05@EgS5JMWZ[a_A!٦ǴH=qX=r͏ z37OaG#aJ+o~?~jb j)qq22D3G5x04z4Çm0B&4ˤk'D5x IMgVzb6ea iVrDbqppbtsj*hҴheYra R[ǔ'A$"HWдٵИf\rp\eUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU2202L4څ0G44ǔ074:3n)55l NIZv00,0Q0BM1U 8u8|1YB95z4Ea4Z20|EFv|%a,bHFoI~\_?fS2㓂%UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU,Sc%s? 8n>Xǽt_ZSӱNޅݯfVc~oi)e'J112Ub3ʱ0>33H0yo1+р3zT61 .Y000t0@0F1Ω>Y=310z0000*'A^"HX0>0 ])YX8eq @A&o9˙sU9sUȜ4F2p\%O{;uȜP(!c&X8zȐLW^ Ǒ.VD7瀯WdzǏ"]X7~tcgjDoD"DBCa.Z Z,`!p<#@` @+`y@e !4EX"" EIDPTDxK< S s$.cddzQH=H'] „euhL3 @, "5&#;q>d@%Y iJɛRf lm+R_c0@=|:1 5 VCAT HN LS4j QS=Bf Y{Q1TK"<K.àmL$DPIB_#t;Cj?))e'UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU2 2d3A95Z0ʇC5KxU5'0B6d,`5iEMgV\07a霏zaFl^lQNah}[پb}^h FĝGp#NabJHSQLˎN UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU22P3%>5Jk0Gl594B05@EgS5JMWZ[a_A!٦ǴH=qX=r͏ z37OaG#aJ+o~?~jb j)qq22D3G5x04z4Çm0B&4ˤk'D5x IMgVzb6ea iVrDbqppbtsj*hҴheYra R[ǔ'A$"HWдٵИf\rp\eUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU2202L4څ0G44ǔ074:3n)55l NIZv00,0Q0BM1U 8u8|1YB95z4Ea4Z20|EFv|%a,bHFoI~\_?fS2㓂%UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU,Sc%s? 8n>Xǽt_ZSӱNޅݯfVc~oi)e'J112Ub3ʱ0>33H0yo1+р3zT61 .Y000t0@0F1Ω>Y=310z0000*'A^"HX0>0 ])YX8eq @A&o9˙sU9sUȜ4F2p\%O{;uȜP(!c&X8zȐLW^ Ǒ.VD7瀯WdzǏ"]X7~tcgjDoD"DBCa.Z Z,`!p<#@` @+`y@e !4EX"" EIDPTDxK< S s$.cddzQH=H'] „euhL3 @, "5&#;q>d@%Y iJɛRf lm+R_c0@=|:1 5 VCAT HN LS4j QS=Bf Y{Q1TK"<K.àmL$DPIB_#t;Cj?))e'UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU2 2d3A95Z0ʇC5KxU5'0B6d,`5iEMgV\07a霏zaFl^lQNah}[پb}^h FĝGp#NabJHSQLˎN UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU22P3%>5Jk0Gl594B05@EgS5JMWZ[a_A!٦ǴH=qX=r͏ z37OaG#aJ+o~?~jb j)qq22D3G5x04z4Çm0B&4ˤk'D5x IMgVzb6ea iVrDbqppbtsj*hҴheYra R[ǔ'A$"HWдٵИf\rp\eUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU2202L4څ0G44ǔ074:3n)55l NIZv00,0Q0BM1U 8u8|1YB95z4Ea4Z20|EFv|%a,bHFoI~\_?fS2㓂%UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU,Sc%s? 8n>Xǽt_ZSӱNޅݯfVc~oi)e'J112Ub3ʱ0>33H0yo1+р3zT61 .Y000t0@0F1Ω>Y=310z0000*'A^"HX0>0 ])YX8eq @A&o9˙sU9sUȜ4F2p\%O{;uȜP(!c&X8zȐLW^ Ǒ.VD7瀯WdzǏ"]X7~tcgjDoD"D Victoria und ihr Husar: Pardon Madame 203906 Paul Abraham Abraham, Paul An Evening at the Operetta Official normal Jewel Case deu 1992 1992 8712157906266 1 CD 6 6 Victoria und ihr Husar: Pardon Madame 203906 clementine-1.2.3+git1354-gdaddbde+dfsg/tests/data/recording_with_multiple_releases.xml000066400000000000000000000244421260417502300307770ustar00rootroot00000000000000 Symphony no. 40 in G minor, K. 550 "Great": I. Allegro molto 458386 Hans Graf Graf, Hans Mozarteum Orchester Salzburg Mozarteum Orchester Salzburg Masters of Classical Music, Volume 1 Official normal Jewel Case eng 1988 US 1988 United States United States US 018111580120 1 CD 4 4 Symphony no. 40 in G minor, K. 550 "Great": I. Allegro molto 458960 The Classic Composers, Volume 3: Musical Masterpieces Promotion normal eng 2005 US 2005 United States United States US 1 CD 9 9 Symphony No. 40 in G minor with clarinets, K. 550: I. Allegro molto 458386 Masters of Classical Music, Volume 1 Official normal Jewel Case eng 2010-10-18 DE 2010-10-18 Germany Germany DE 4006408158011 1 CD 4 4 Symphony no. 40 in G minor, K. 550 "Great": I. Allegro molto 458960 Les grands compositeurs : Mozart prodige musical Official normal Other 2003 FR 2003 France France FR 1 CD 9 9 Symphonie n° 40, K 550 : 1er mouvement 456000 The Classic Composers, Volume 3: Musical Masterpieces Promotion normal eng 2002 GB 2002 United Kingdom United Kingdom GB 1 9 9 Symphony No. 40 in G minor with clarinets, K. 550: I. Allegro molto 458386 Klassiset säveltäjät: Taitoa ja mielikuvitusta normal Other fin FI Finland Finland FI 1 CD 9 9 Sinfonia nro 40 G-molli, KV 550: 1. osa 458386 The Classic Composers, Volume 3: Musical Masterpieces Official normal Other eng DE Germany Germany DE 1 CD 9 9 Symphony no. 40 in G minor, K. 550 "Great": I. Allegro molto 458000 clementine-1.2.3+git1354-gdaddbde+dfsg/tests/data/secretagent.asx000066400000000000000000000025351260417502300244700ustar00rootroot00000000000000 Loading: Secret Agent from SomaFM.com SomaFM: Secret Agent Keep us on the air! Click Support SomaFM above! Loading: Secret Agent from SomaFM.com SomaFM: Secret Agent Keep us on the air! Click Support SomaFM above! Loading: Secret Agent from SomaFM.com SomaFM: Secret Agent Keep us on the air! Click Support SomaFM above! Loading firewall friendly stream: Secret Agent from SomaFM.com SomaFM: Secret Agent Keep us on the air! Click Support SomaFM above! clementine-1.2.3+git1354-gdaddbde+dfsg/tests/data/secretagent.pls000066400000000000000000000014601260417502300244670ustar00rootroot00000000000000[playlist] numberofentries=4 File1=http://streamer-ntc-aa03.somafm.com:80/stream/1021 Title1=SomaFM: Secret Agent (#1 128k mp3): The soundtrack for your stylish, mysterious, dangerous life. For Spies and PIs too! Length1=-1 File2=http://streamer-mtc-aa04.somafm.com:80/stream/1021 Title2=SomaFM: Secret Agent (#2 128k mp3): The soundtrack for your stylish, mysterious, dangerous life. For Spies and PIs too! Length2=-1 File3=http://streamer-dtc-aa05.somafm.com:80/stream/1021 Title3=SomaFM: Secret Agent (#3 128k mp3): The soundtrack for your stylish, mysterious, dangerous life. For Spies and PIs too! Length3=-1 File4=http://ice.somafm.com/secretagent Title4=SomaFM: Secret Agent (Firewall-friendly 128k mp3) The soundtrack for your stylish, mysterious, dangerous life. For Spies and PIs too! Length4=-1 Version=2 clementine-1.2.3+git1354-gdaddbde+dfsg/tests/data/test.asx000066400000000000000000000002751260417502300231420ustar00rootroot00000000000000foobar Foo Bar mumble mumble clementine-1.2.3+git1354-gdaddbde+dfsg/tests/data/test.asxini000066400000000000000000000001621260417502300236350ustar00rootroot00000000000000[Reference] Ref1=http://195.245.168.21/antena3?MSWMExt=.asf Ref2=http://195.245.168.21:80/antena3?MSWMExt=.asf clementine-1.2.3+git1354-gdaddbde+dfsg/tests/data/test.m3u000066400000000000000000001161571260417502300230620ustar00rootroot00000000000000#EXTM3U #EXTINF:203,gravity /home/kadai/Music/COLLECTION/2003/Various Artists/Wolf's Rain O.S.T/20 - gravity.mp3 #EXTINF:346,LONELY ROLLING STAR /home/kadai/Music/COLLECTION/2004/Various Artists/塊魂 サウンドトラック 塊フォルテッシモ魂/06.mp3 #EXTINF:118,なないろグラデーション /home/kadai/Music/COLLECTION/2009/Various Artists/Let's TAP SOUNDTRACK/06.mp3 #EXTINF:169,VF-X 2 テーマ 〜 TYPE-R /home/kadai/Music/COLLECTION/1999/Various Artists/マクロス VF-X2 オリジナル・サウンドトラック/05 - VF-X 2 テーマ 〜 TYPE-R.mp3 #EXTINF:76,Stage Select /home/kadai/Music/COLLECTION/2006/堀山俊彦/Rockman Rockman _ Mega Man_ Powered Up/05 - Stage Select.mp3 #EXTINF:177,Holy Land (Area Zero Camp) /home/kadai/Music/COLLECTION/2005/Various Artists/Rockman Zero 4 _ Mega Man Zero 4/05 - Holy Land (Area Zero Camp).mp3 #EXTINF:226,古代図書館 /home/kadai/Music/COLLECTION/2008/Various Artists/Diliculo/05.mp3 #EXTINF:333,Sayonara Rolling Star /home/kadai/Music/COLLECTION/2007/Various Artists/ビューティフル塊魂 オリジナル・サウンドトラック 「塊ステキ魂」/05.mp3 #EXTINF:123,ステラ牧場 /home/kadai/Music/COLLECTION/2008/Various Artists/チョコボの不思議なダンジョン 時忘れの迷宮 オリジナル・サウンドトラック/04 - ステラ牧場.mp3 #EXTINF:173,Theme of Geffen (Blueberry mix) /home/kadai/Music/COLLECTION/2002/Various Artists/Ragnarok Online soundTeMP Special Remix!!/04 - Theme of Geffen (Blueberry mix).mp3 #EXTINF:78,High School Life /home/kadai/Music/COLLECTION/2008/Various Artists/マクロスフロンティア_ 娘トラ/04 - High School Life.mp3 #EXTINF:89,シドのテーマ /home/kadai/Music/COLLECTION/1999/伊藤賢治/チョコボレーシング~幻界へのロード オリジナル・サウンドトラック/04 - シドのテーマ.mp3 #EXTINF:99,TAPでパパパヤ /home/kadai/Music/COLLECTION/2009/Various Artists/Let's TAP SOUNDTRACK/04.mp3 #EXTINF:284,Hunter's Chance /home/kadai/Music/COLLECTION/2004/The Black Mages/THE BLACK MAGES II The Skies Above/04.mp3 #EXTINF:275,火の鳥 /home/kadai/Music/COLLECTION/2005/中島美嘉/MUSIC/03 - 火の鳥.mp3 #EXTINF:161,愛・おぼえていますか -デカルチャーエディションsize- /home/kadai/Music/COLLECTION/2008/Various Artists/星間飛行/03 - 愛・おぼえていますか -デカルチャーエディションsize-.mp3 #EXTINF:124,Tread on the Ground (Millennium mix) /home/kadai/Music/COLLECTION/2002/Various Artists/Ragnarok Online soundTeMP Special Remix!!/03 - Tread on the Ground (Millennium mix).mp3 #EXTINF:252,Snow Brothers 'Go Blow Snow for a Year' OC ReMix /home/kadai/Music/COLLECTION/2007/Various Artists/[non-album tracks]/03 - Snow Brothers 'Go Blow Snow for a Year' OC ReMix.mp3 #EXTINF:355,Rolanberry Fields /home/kadai/Music/COLLECTION/2005/The Star Onions/Final Fantasy XI_ Music From the Other Side of Vana'diel/03 - Rolanberry Fields.mp3 #EXTINF:148,Angel Island Zone Act 1 /home/kadai/Music/COLLECTION/1994/瀬上純/Sonic 3/03 - Angel Island Zone Act 1.mp3 #EXTINF:331,Hegira /home/kadai/Music/COLLECTION/2009/Various Artists/1Chain/03.mp3 #EXTINF:298,*ハロー、プラネット。 /home/kadai/Music/COLLECTION/2009/Various Artists/EXIT TUNES PRESENTS STARDOM 2/03.mp3 #EXTINF:239,カザナミ /home/kadai/Music/COLLECTION/2009/Various Artists/Kangaroo Dog/03.mp3 #EXTINF:231,燃えるハロウィンタウン Stage A-1,Staff /home/kadai/Music/COLLECTION/2008/Various Artists/デススマイルズ オリジナルサウンドトラック/02 - 燃えるハロウィンタウン Stage A-1,Staff.mp3 #EXTINF:120,悪魔の箱のテーマ /home/kadai/Music/COLLECTION/2008/西浦智仁/レイトン教授メインテーマ トリロジーCD/02 - 悪魔の箱のテーマ.mp3 #EXTINF:346,射手座☆午後九時Don't be late /home/kadai/Music/COLLECTION/2007/Various Artists/ダイアモンド クレバス _ 射手座☆午後九時Don't be late/02 - 射手座☆午後九時Don't be late.mp3 #EXTINF:290,天使の絵の具 /home/kadai/Music/COLLECTION/1999/飯島真理/Gold_ MARI IIJIMA Best Takes/02 - 天使の絵の具.mp3 #EXTINF:276,Seven ~10th Memorial Version~ /home/kadai/Music/COLLECTION/2009/Various Artists/Butter-Fly~Strong Version~/02 - Seven ~10th Memorial Version~.mp3 #EXTINF:39,Morning Sunlight /home/kadai/Music/COLLECTION/2008/Mathew Valente/Chrono Trigger Resurrection Premium OST Second Edit/02 - Morning Sunlight.mp3 #EXTINF:185,エンカ /home/kadai/Music/COLLECTION/2001/Various Artists/地球少女アルジュナ2 オンナの港/02 - エンカ.mp3 #EXTINF:155,探求 ~elementary labyrinth /home/kadai/Music/COLLECTION/2008/136/霊夢と魔理沙と冒険モノ。/02.mp3 #EXTINF:257,Seven /home/kadai/Music/COLLECTION/1999/Various Artists/Butter-Fly/02.mp3 #EXTINF:251,クロノ・トリガーメドレー 〜Orchestra Version〜 /home/kadai/Music/COLLECTION/2008/亀岡夏海/クロノ・トリガー オーケストラ エクストラ サウンドトラック/02.mp3 #EXTINF:276,Elecman mix /home/kadai/Music/COLLECTION/2007/Various Artists/20thアニバーサリー ロックマン1~6 Techno Arrange Ver/02.mp3 #EXTINF:149,Clamato Fever (Menu) /home/kadai/Music/COLLECTION/2008/Various Artists/OC ReMix ・スーパーストリートファイターIIX HD Remix オフィシャルサウンドトラック/02.mp3 #EXTINF:84,タイトル画面 /home/kadai/Music/COLLECTION/2007/内山修作/ロックマン8 メタルヒーローズ オリジナル・サウンドトラック/01 - タイトル画面.mp3 #EXTINF:301,月の明り -ファイナルファンタジーIV 愛のテーマ- /home/kadai/Music/COLLECTION/2007/Various Artists/月の明り-ファイナルファンタジーIV 愛のテーマ-/01 - 月の明り -ファイナルファンタジーIV 愛のテーマ-.mp3 #EXTINF:144,時忘れの迷宮 /home/kadai/Music/COLLECTION/2008/Various Artists/チョコボの不思議なダンジョン 時忘れの迷宮 オリジナル・サウンドトラック/01 - 時忘れの迷宮.mp3 #EXTINF:234,星間飛行 /home/kadai/Music/COLLECTION/2008/Various Artists/星間飛行/01 - 星間飛行.mp3 #EXTINF:261,奇跡の海 /home/kadai/Music/COLLECTION/1998/Various Artists/奇跡の海/01 - 奇跡の海.mp3 #EXTINF:262,Intro Theme /home/kadai/Music/COLLECTION/2007/菅野よう子/RAGNAROK Online II Original Sound Track/01 - Intro Theme.mp3 #EXTINF:53,"Introduccion" from Suite Punta del Este (12 Monkeys Theme) /home/kadai/Music/COLLECTION/1995/Various Artists/12 Monkeys/01 - _Introduccion_ from Suite Punta del Este (12 Monkeys Theme) (Astor Piazzola).mp3 #EXTINF:181,Frontier 2059 /home/kadai/Music/COLLECTION/2008/Various Artists/マクロスフロンティア_ 娘フロ/01 - Frontier 2059.mp3 #EXTINF:163,Chrono Trigger - Corridors (ID: 35626) /home/kadai/Music/COLLECTION/2008/Various Artists/[non-album tracks]/01 - Chrono Trigger - Corridors (ID_ 35626).mp3 #EXTINF:130,オープニングテーマ /home/kadai/Music/COLLECTION/2002/エクセルシア/ファイナルファンタジー 2NDベストコレクション/01 - オープニングテーマ.mp3 #EXTINF:357,ダイアモンド クレバス /home/kadai/Music/COLLECTION/2007/Various Artists/ダイアモンド クレバス _ 射手座☆午後九時Don't be late/01 - ダイアモンド クレバス.mp3 #EXTINF:180,trezire de spirit ~BIGボーナス~ /home/kadai/Music/COLLECTION/2009/Various Artists/パチスロ悪魔城ドラキュラ ORIGINAL SOUNDTRACK/01.mp3 #EXTINF:127,クロノ・トリガー 〜Orchestra Version〜 /home/kadai/Music/COLLECTION/2008/亀岡夏海/クロノ・トリガー オーケストラ エクストラ サウンドトラック/01.mp3 #EXTINF:259,Battle Scene (Final Fantasy I) /home/kadai/Music/COLLECTION/2003/The Black Mages/The Black Mages/01.mp3 #EXTINF:217,バトルフロンティア /home/kadai/Music/COLLECTION/2005/Various Artists/バトルフロンティア_ポケモンかぞえうた/01.mp3 #EXTINF:145,バトル2 /home/kadai/Music/COLLECTION/2002/エクセルシア/ファイナルファンタジー 2NDベストコレクション/14 - バトル2.mp3 #EXTINF:129,果てしなき大海原 /home/kadai/Music/COLLECTION/2002/エクセルシア/スクウェアベストシリーズ Vol.2 ファイナルファンタジー ベストコレクション/13 - 果てしなき大海原.mp3 #EXTINF:236,思い出はおっくせんまん! (JAM Project version) /home/kadai/Music/COLLECTION/2009/Various Artists/ニコニコ動画せれくちょん 〜才能の無駄遣い〜/13 - 思い出はおっくせんまん!(JAM Project version).mp3 #EXTINF:154,The Brink of Time /home/kadai/Music/COLLECTION/2008/Mathew Valente/Chrono Trigger Resurrection Premium OST Second Edit/13 - The Brink of Time.mp3 #EXTINF:210,Prontera Field /home/kadai/Music/COLLECTION/2007/菅野よう子/RAGNAROK Online II Original Sound Track/13 - Prontera Field.mp3 #EXTINF:123,Ice Brain /home/kadai/Music/COLLECTION/2004/Various Artists/ロックマン ゼロ ゲーム音楽大全集 -ロックマン ゼロ 1~3-/135 - Ice Brain.mp3 #EXTINF:44,Dr.RIGHT /home/kadai/Music/COLLECTION/2003/Various Artists/カプコンミュージックジェネレーション ロックマンX1~6/131.mp3 #EXTINF:144,Angel Island Zone /home/kadai/Music/COLLECTION/2001/Various Artists/Sonic the Hedgehog 10th Anniversary/13.mp3 #EXTINF:134,さあ、走りだそう! /home/kadai/Music/COLLECTION/1999/Various Artists/デジモンアドベンチャー 歌と音楽集 Ver.2/12 - さあ、走りだそう!.mp3 #EXTINF:303,真空のダイアモンド クレバス /home/kadai/Music/COLLECTION/2008/Various Artists/マクロスフロンティア_ 娘トラ/12 - 真空のダイアモンド クレバス.mp3 #EXTINF:90,Prologue /home/kadai/Music/COLLECTION/1993/Various Artists/ラングリッサー 光輝の末裔/12 - Prologue.mp3 #EXTINF:151,Private Army /home/kadai/Music/COLLECTION/2008/Various Artists/マクロスフロンティア_ 娘フロ/12 - Private Army.mp3 #EXTINF:262,コルドバの町 /home/kadai/Music/COLLECTION/2005/Various Artists/悪魔城ドラキュラ-闇の呪印- オリジナルサウンドトラック/128 - コルドバの町.mp3 #EXTINF:84,ダーティー・ヒーロー /home/kadai/Music/COLLECTION/1997/Various Artists/MACROSS THE COMPLETE/128 - ダーティー・ヒーロー.mp3 #EXTINF:268,MOLTEN MINE /home/kadai/Music/COLLECTION/2009/Various Artists/ソニックと暗黒の騎士 ORIGINAL SOUNDTRAX “TALES OF KNIGHTHOOD”/128.mp3 #EXTINF:137,A Proposal /home/kadai/Music/COLLECTION/2006/Various Artists/Dirge of Cerberus -Final Fantasy VII- Original Soundtrack/127.mp3 #EXTINF:221,Desert /home/kadai/Music/COLLECTION/2009/Various Artists/ラグナロクオンライン コンプリート サウンドトラック/124.mp3 #EXTINF:160,We're The Robots /home/kadai/Music/COLLECTION/2008/Various Artists/ロックマン9 アレンジサウンドトラック/11 - We're The Robots.mp3 #EXTINF:154,Prenonition - Main Theme -orchestral mix- /home/kadai/Music/COLLECTION/2000/Lix/Experience/11 - Prenonition - Main Theme -orchestral mix-.mp3 #EXTINF:212,A5 B24 C135 D45 E2 (Password Theme) /home/kadai/Music/COLLECTION/2008/8 Bit Instrumental/Mega Man 2 Soundtrack_ Beat the 8 Super Robots With 8 Bit Instrumental/11 - A5 B24 C135 D45 E2 (Password Theme).mp3 #EXTINF:160,「ファイナルファンタジーIV メインテーマ -arrange-」from FINAL FANTASY IV /home/kadai/Music/COLLECTION/2008/Various Artists/Dissidia -Final Fantasy- Original Soundtrack/118 - 「ファイナルファンタジーIV メインテーマ -arrange-」from FINAL FANTASY IV.mp3 #EXTINF:322,ガリバルディ大聖堂 /home/kadai/Music/COLLECTION/2005/Various Artists/悪魔城ドラキュラ-闇の呪印- オリジナルサウンドトラック/117 - ガリバルディ大聖堂.mp3 #EXTINF:303,ライオン /home/kadai/Music/COLLECTION/2009/Various Artists/YOKO KANNO SEATBELTS 来地球記念コレクションアルバム スペース バイオチャージ/117 - ライオン.mp3 #EXTINF:109,Rainbow Road /home/kadai/Music/COLLECTION/2008/Various Artists/Mario Kart Wii - Complete Soundtrack/116 - Rainbow Road.mp3 #EXTINF:214,焦土の大厳 /home/kadai/Music/COLLECTION/2008/Various Artists/悪魔城ドラキュラ 奪われた刻印 ORIGINAL SOUNDTRACK/116.mp3 #EXTINF:161,ベリアウルデ /home/kadai/Music/COLLECTION/2009/Various Artists/ファイナルファンタジー・クリスタルクロニクル エコーズ・オブ・タイム オリジナル・サウンドトラック/116.mp3 #EXTINF:182,「バトル2 -arrange-」from FINAL FANTASY III /home/kadai/Music/COLLECTION/2008/Various Artists/Dissidia -Final Fantasy- Original Soundtrack/115 - 「バトル2 -arrange-」from FINAL FANTASY III.mp3 #EXTINF:139,ガリバルディの中庭 /home/kadai/Music/COLLECTION/2005/Various Artists/悪魔城ドラキュラ-闇の呪印- オリジナルサウンドトラック/114 - ガリバルディの中庭.mp3 #EXTINF:143,バトル2 /home/kadai/Music/COLLECTION/2008/Various Artists/ファイナルファンタジーIV オリジナルサウンドトラック/114 - バトル2.mp3 #EXTINF:227,古代図書館 /home/kadai/Music/COLLECTION/2009/Various Artists/ファイナルファンタジー・クリスタルクロニクル エコーズ・オブ・タイム オリジナル・サウンドトラック/113.mp3 #EXTINF:181,Theme of Geffen /home/kadai/Music/COLLECTION/2009/Various Artists/ラグナロクオンライン コンプリート サウンドトラック/113.mp3 #EXTINF:148,Coffee with bullet (日常I) /home/kadai/Music/COLLECTION/2001/Various Artists/シャドウハーツ オリジナルサウンドトラック プラス1/112 - Coffee with bullet (日常I).mp3 #EXTINF:124,おもちゃばこのロンド /home/kadai/Music/COLLECTION/2006/Various Artists/Pop'n Music 14 AC ♥ CS Pop'n Music 12 & 13/112 - おもちゃばこのロンド.mp3 #EXTINF:86,Maple Treeway /home/kadai/Music/COLLECTION/2008/Various Artists/Mario Kart Wii - Complete Soundtrack/111 - Maple Treeway.mp3 #EXTINF:177,Beautiful Morning /home/kadai/Music/COLLECTION/2000/Various Artists/幻想水滸外伝 Vol.1 ハルモニアの剣士 オリジナル サウンドトラック/111 - Beautiful Morning.mp3 #EXTINF:141,マックス・ヒート /home/kadai/Music/COLLECTION/2005/Various Artists/リマスタートラック ロックマンゼロ・ピュシス/111 - マックス・ヒート.mp3 #EXTINF:117,Moonlit Wilderness /home/kadai/Music/COLLECTION/2006/Various Artists/Tekken 5 & Tekken Dark Resurrection Original Soundtrack/110 - Moonlit Wilderness.mp3 #EXTINF:116,「メインテーマ -arrange-」from FINAL FANTASY II /home/kadai/Music/COLLECTION/2008/Various Artists/Dissidia -Final Fantasy- Original Soundtrack/110 - 「メインテーマ -arrange-」from FINAL FANTASY II.mp3 #EXTINF:270,SNOWMAN /home/kadai/Music/COLLECTION/2008/Various Artists/大乱闘スマッシュブラザーズX オリジナル・サウンドトラック/1101.mp3 #EXTINF:75,対モンスター戦 /home/kadai/Music/COLLECTION/1996/下村陽子/スーパーマリオRPGオリジナル・サウンド・ヴァージョン/110.mp3 #EXTINF:205,WANDA WANDA /home/kadai/Music/COLLECTION/2004/Various Artists/塊魂 サウンドトラック 塊フォルテッシモ魂/11.mp3 #EXTINF:130,Violet Interspace /home/kadai/Music/COLLECTION/2009/Various Artists/Let's TAP SOUNDTRACK/11.mp3 #EXTINF:306,Theme of Sand Ruins /home/kadai/Music/COLLECTION/2006/Various Artists/sonic riders original soundtrack_ speedbeats grand prix/11.mp3 #EXTINF:211,ダンジョンヒーローXのテーマ /home/kadai/Music/COLLECTION/2008/Various Artists/チョコボの不思議なダンジョン 時忘れの迷宮 オリジナル・サウンドトラック/10 - ダンジョンヒーローXのテーマ.mp3 #EXTINF:141,Nocturne /home/kadai/Music/COLLECTION/2008/Various Artists/Castlevania_ Symphony of the Night - Resurrection/10 - Nocturne.mp3 #EXTINF:325,バルジッド山脈 /home/kadai/Music/COLLECTION/2005/Various Artists/悪魔城ドラキュラ-闇の呪印- オリジナルサウンドトラック/109 - バルジッド山脈.mp3 #EXTINF:153,SOLEANNA CASTLE TOWN /home/kadai/Music/COLLECTION/2007/Various Artists/Sonic the Hedgehog Original Sound Track/109.mp3 #EXTINF:116,Bloody Tears :Stage4 /home/kadai/Music/COLLECTION/2001/Various Artists/悪魔城年代記 悪魔城ドラキュラ Original Soundtrack/109.mp3 #EXTINF:234,闇の従者たち -その1- /home/kadai/Music/COLLECTION/2005/Various Artists/悪魔城ドラキュラ-闇の呪印- オリジナルサウンドトラック/108 - 闇の従者たち -その1-.mp3 #EXTINF:145,ケノーピ火山 /home/kadai/Music/COLLECTION/2008/神藤由東大/ツヴァイ!! オリジナル・サウンドトラック 2008/108 - ケノーピ火山.mp3 #EXTINF:267,HIGH AND BROKEN /home/kadai/Music/COLLECTION/2007/Various Artists/SEVEN RINGS IN HAND ソニックと秘密のリング オリジナルサウンドトラック/108.mp3 #EXTINF:219,エスペラント /home/kadai/Music/COLLECTION/2005/Various Artists/リマスタートラック ロックマンゼロ・ピュシス/107 - エスペラント.mp3 #EXTINF:221,Desert /home/kadai/Music/COLLECTION/2006/Various Artists/The Memory of RAGNAROK/107.mp3 #EXTINF:74,バトル1 /home/kadai/Music/COLLECTION/1992/植松伸夫/ファイナルファンタジー V オリジナル・サウンド・ヴァージョン/107.mp3 #EXTINF:69,VAVA 2 /home/kadai/Music/COLLECTION/2003/Various Artists/カプコンミュージックジェネレーション ロックマンX1~6/106.mp3 #EXTINF:335,廃城 ~闇の呪印~ /home/kadai/Music/COLLECTION/2005/Various Artists/悪魔城ドラキュラ-闇の呪印- オリジナルサウンドトラック/105 - 廃城 ~闇の呪印~.mp3 #EXTINF:194,ホーリー・ランド /home/kadai/Music/COLLECTION/2005/Various Artists/リマスタートラック ロックマンゼロ・ピュシス/105 - ホーリー・ランド.mp3 #EXTINF:138,世界地図 /home/kadai/Music/COLLECTION/2007/Various Artists/「オーディンスフィア」 オリジナル・サウンドトラック/105.mp3 #EXTINF:183,浮遊大陸アルジェス -Main Theme- /home/kadai/Music/COLLECTION/2008/神藤由東大/ツヴァイ!! オリジナル・サウンドトラック 2008/104 - 浮遊大陸アルジェス -Main Theme-.mp3 #EXTINF:39,朝の日ざし /home/kadai/Music/COLLECTION/2009/Various Artists/DS版 クロノ・トリガー オリジナル・サウンドトラック/103 - 朝の日ざし.mp3 #EXTINF:152,Peaceful Forest /home/kadai/Music/COLLECTION/2009/Various Artists/ラグナロクオンライン コンプリート サウンドトラック/103.mp3 #EXTINF:85,PASS WORD /home/kadai/Music/COLLECTION/2003/Various Artists/カプコンミュージックジェネレーション ロックマンX1~6/103.mp3 #EXTINF:117,碧の小夜曲 /home/kadai/Music/COLLECTION/2005/Various Artists/悪魔城ドラキュラ-闇の呪印- オリジナルサウンドトラック/102 - 碧の小夜曲.mp3 #EXTINF:116,プロローグ-果てしなき戦いへ /home/kadai/Music/COLLECTION/2004/Various Artists/リマスタートラック ロックマンゼロ・イデア/102 - プロローグ-果てしなき戦いへ.mp3 #EXTINF:89,星くず祭 /home/kadai/Music/COLLECTION/2008/Various Artists/スーパーマリオギャラクシーサウンドトラック プラチナバージョン/102.mp3 #EXTINF:69,黄昏の聖痕 /home/kadai/Music/COLLECTION/2008/Various Artists/悪魔城ドラキュラ 奪われた刻印 ORIGINAL SOUNDTRACK/101.mp3 #EXTINF:243,攻撃 /home/kadai/Music/COLLECTION/2008/Various Artists/大乱闘スマッシュブラザーズX オリジナル・サウンドトラック/1008.mp3 #EXTINF:141,夜曲 /home/kadai/Music/COLLECTION/1997/Various Artists/悪魔城ドラキュラX~月下の夜想曲~ ORIGINAL GAME SOUNDTRACK/10.mp3 #EXTINF:373,Insanity Science /home/kadai/Music/COLLECTION/2008/Various Artists/セレスティアル スコア/10.mp3 #EXTINF:134,face on /home/kadai/Music/COLLECTION/2004/Various Artists/Wolf's Rain O.S.T. 2/10.mp3 #EXTINF:303,strangers /home/kadai/Music/COLLECTION/2003/Various Artists/Wolf's Rain O.S.T/09 - strangers.mp3 #EXTINF:344,Starfox 'Godspeed' OC ReMix /home/kadai/Music/COLLECTION/2003/Various Artists/[non-album tracks]/09 - Starfox 'Godspeed' OC ReMix.mp3 #EXTINF:168,Innocent green /home/kadai/Music/COLLECTION/2008/Various Artists/マクロスフロンティア_ 娘フロ/09 - Innocent green.mp3 #EXTINF:108,バトル2 /home/kadai/Music/COLLECTION/2009/Various Artists/ファイナルファンタジーIII/09 - バトル2.mp3 #EXTINF:153,フィドル・デ・チョコボ /home/kadai/Music/COLLECTION/2007/高橋雄蔵/チョコボと魔法の絵本/09 - フィドル・デ・チョコボ.mp3 #EXTINF:260,We Can Fly /home/kadai/Music/COLLECTION/1990/Various Artists/ソルビアンカ~黄金の宇宙船~ オリジナルサウンドトラック/09 - We Can Fly.mp3 #EXTINF:163,THUNDER TORNADO (TORNADO MAN STAGE) /home/kadai/Music/COLLECTION/2008/Various Artists/ロックマン9 野望の復活!! オリジナルサウンドトラック/09.mp3 #EXTINF:252,僕は僕だって /home/kadai/Music/COLLECTION/2001/和田光司/all of my mind/08 - 僕は僕だって.mp3 #EXTINF:143,Strange World /home/kadai/Music/COLLECTION/2008/Various Artists/ロックマン9 アレンジサウンドトラック/08 - Strange World.mp3 #EXTINF:251,Groove Basin /home/kadai/Music/COLLECTION/2006/Various Artists/Project Chaos - A Sonic 3 and Knuckles Arrangement Album (Bonus Disc)/08 - Groove Basin.mp3 #EXTINF:208,Aquatic Ambiance /home/kadai/Music/COLLECTION/1995/Various Artists/DK Jamz_ The Original Donkey Kong Country Soundtrack/08.mp3 #EXTINF:116,街の夜 /home/kadai/Music/COLLECTION/2008/Various Artists/チョコボの不思議なダンジョン 時忘れの迷宮 オリジナル・サウンドトラック/07 - 街の夜.mp3 #EXTINF:192,炎の守護者2 /home/kadai/Music/COLLECTION/2007/Various Artists/チョコボの不思議なダンジョン 時忘れの迷宮 オリジナル・サウンドトラック Unreleased Tracks/07 - 炎の守護者2.mp3 #EXTINF:123,氷ステージ /home/kadai/Music/COLLECTION/2007/内山修作/ロックマン8 メタルヒーローズ オリジナル・サウンドトラック/07 - 氷ステージ.mp3 #EXTINF:254,悠久の風 /home/kadai/Music/COLLECTION/2009/Various Artists/ファイナルファンタジーIII/07 - 悠久の風.mp3 #EXTINF:255,Why /home/kadai/Music/COLLECTION/2002/飯島真理/超時空要塞マクロス MARI IIJIMA sings LYNN MINMAY/07 - Why.mp3 #EXTINF:379,Under Construction (Wow Wow 70's Mix) /home/kadai/Music/COLLECTION/1997/Go Katsuura & Toshinori Miura/A Nights Remix - Another Dreams/07 - Under Construction (Wow Wow 70's Mix).mp3 #EXTINF:189,MISSION 2&8 テーマ /home/kadai/Music/COLLECTION/1999/Various Artists/マクロス VF-X2 オリジナル・サウンドトラック/07 - MISSION 2&8 テーマ.mp3 #EXTINF:196,External Excavation /home/kadai/Music/COLLECTION/2006/Various Artists/Project Chaos - A Sonic 3 and Knuckles Arrangement Album (Bonus Disc)/07 - External Excavation.mp3 #EXTINF:127,クローン /home/kadai/Music/COLLECTION/2001/Various Artists/地球少女アルジュナ into the another world/07 - クローン.mp3 #EXTINF:111,シティナイトライン /home/kadai/Music/COLLECTION/2009/Various Artists/Let's TAP SOUNDTRACK/07.mp3 #EXTINF:247,透明シェルター /home/kadai/Music/COLLECTION/2007/kukui/ローゼンメイデンボーカルアルバム Leer Lied/06 - 透明シェルター.mp3 #EXTINF:258,悠久の風 /home/kadai/Music/COLLECTION/2009/Various Artists/ファイナルファンタジーIII/06 - 悠久の風.mp3 #EXTINF:104,Nightvision /home/kadai/Music/COLLECTION/2001/Daft Punk/Discovery/06 - Nightvision.mp3 #EXTINF:242,MISSION 1&12 テーマ /home/kadai/Music/COLLECTION/1999/Various Artists/マクロス VF-X2 オリジナル・サウンドトラック/06 - MISSION 1&12 テーマ.mp3 #EXTINF:416,Chaos of Moon - Earthlight Impluse mix ver1.1 /home/kadai/Music/COLLECTION/2005/Lix/Clsade/06 - Chaos of Moon - Earthlight Impluse mix ver1.1.mp3 #EXTINF:79,Apprehensive Cinnamon! /home/kadai/Music/COLLECTION/2004/Various Artists/ロックマンX コマンドミッション オリジナル・サウンドトラック/06 - Apprehensive Cinnamon!.mp3 #EXTINF:231,感情の摩天楼 〜 Cosmic Mind /home/kadai/Music/COLLECTION/2009/彩音 ~xi-on~/東方志奏 4th Spell -Gust of Wind-/06.mp3 #EXTINF:398,恋の稲刈り /home/kadai/Music/COLLECTION/2007/Various Artists/ビューティフル塊魂 オリジナル・サウンドトラック 「塊ステキ魂」/06.mp3 #EXTINF:281,Selaginella 9 /home/kadai/Music/COLLECTION/2008/鷹/Crossfire Barrage/06.mp3 #EXTINF:262,チーターマン2オーケストラ風 /home/kadai/Music/COLLECTION/2007/Various Artists/[non-album tracks]/チーターマン2オーケストラ風.mp3 #EXTINF:123,愛・おぼえていますか /home/kadai/Music/COLLECTION/2008/Various Artists/[non-album tracks]/愛・おぼえていますか.mp3 #EXTINF:80,Title Theme /home/kadai/Music/COLLECTION/1999/木村雅彦/悪魔城ドラキュラ黙示録外伝 LEGEND OF CORNELL/Title Theme.mp3 #EXTINF:31,~Stage Select~ /home/kadai/Music/COLLECTION/2005/Various Artists/[non-album tracks]/~Stage Select~.mp3 #EXTINF:239,Needleman Stage -Sharp Needle mix- /home/kadai/Music/COLLECTION/2004/Various Artists/[non-album tracks]/Needleman Stage -Sharp Needle mix-.mp3 #EXTINF:449,Mega Man 9 Medley /home/kadai/Music/COLLECTION/2008/Various Artists/[non-album tracks]/Mega Man 9 Medley.mp3 #EXTINF:121,Battle 1 -Recurrence of R4- /home/kadai/Music/COLLECTION/2004/Various Artists/[non-album tracks]/Battle 1 -Recurrence of R4-.mp3 #EXTINF:133,Sinister Sundown /home/kadai/Music/COLLECTION/2007/Various Artists/Kingdom Hearts Original Soundtrack Complete Box/813.mp3 #EXTINF:213,悠久の風 -.333 mix- /home/kadai/Music/COLLECTION/2006/Various Artists/ファイナルファンタジーIII オリジナル・サウンドトラック/60 - 悠久の風 -.333 mix-.mp3 #EXTINF:77,Epsilon 1st Movement /home/kadai/Music/COLLECTION/2004/Various Artists/ロックマンX コマンドミッション オリジナル・サウンドトラック/44 - Epsilon 1st Movement.mp3 #EXTINF:253,Monastery In Disguise /home/kadai/Music/COLLECTION/2009/Various Artists/ラグナロクオンライン コンプリート サウンドトラック/423.mp3 #EXTINF:299,Kiss Me Good-Bye-featured in FINAL FANTASY XII- /home/kadai/Music/COLLECTION/2006/Various Artists/ファイナルファンタジーXII オリジナル・サウンドトラック Limited Edition/419.mp3 #EXTINF:177,BURN DINOREX STAGE /home/kadai/Music/COLLECTION/2003/Various Artists/カプコンミュージックジェネレーション ロックマンX1~6/417.mp3 #EXTINF:133,Rose of Sharon /home/kadai/Music/COLLECTION/2009/Various Artists/ラグナロクオンライン コンプリート サウンドトラック/415.mp3 #EXTINF:106,Top Hoppy /home/kadai/Music/COLLECTION/2009/Various Artists/ラグナロクオンライン コンプリート サウンドトラック/408.mp3 #EXTINF:112,Dance of the Daring /home/kadai/Music/COLLECTION/2007/Various Artists/Kingdom Hearts Original Soundtrack Complete Box/407.mp3 #EXTINF:126,Waltz of the Damned /home/kadai/Music/COLLECTION/2007/Various Artists/Kingdom Hearts Original Soundtrack Complete Box/406.mp3 #EXTINF:109,Underneath The Temple /home/kadai/Music/COLLECTION/2009/Various Artists/ラグナロクオンライン コンプリート サウンドトラック/405.mp3 #EXTINF:130,Latinnova /home/kadai/Music/COLLECTION/2009/Various Artists/ラグナロクオンライン コンプリート サウンドトラック/403.mp3 #EXTINF:85,Esperanto (Capcom Site Remix) /home/kadai/Music/COLLECTION/2005/Various Artists/Rockman Zero 4 _ Mega Man Zero 4/35 - Esperanto (Capcom Site Remix).mp3 #EXTINF:292,月雪に舞う花のように /home/kadai/Music/COLLECTION/2006/Various Artists/Pop'n Music 14 AC ♥ CS Pop'n Music 12 & 13/332 - 月雪に舞う花のように.mp3 #EXTINF:304,大海原 /home/kadai/Music/COLLECTION/2008/Various Artists/大乱闘スマッシュブラザーズX オリジナル・サウンドトラック/316.mp3 #EXTINF:155,FROST KIBATODOS STAGE 2 /home/kadai/Music/COLLECTION/2003/Various Artists/カプコンミュージックジェネレーション ロックマンX1~6/316.mp3 #EXTINF:141,Big Guys Love This /home/kadai/Music/COLLECTION/2009/Various Artists/ラグナロクオンライン コンプリート サウンドトラック/312.mp3 #EXTINF:80,果てしなき大海原 /home/kadai/Music/COLLECTION/2006/Various Artists/ファイナルファンタジーIII オリジナル・サウンドトラック/30 - 果てしなき大海原.mp3 #EXTINF:159,Tension Rising /home/kadai/Music/COLLECTION/2007/Various Artists/Kingdom Hearts Original Soundtrack Complete Box/309.mp3 #EXTINF:128,Sinister Sundown /home/kadai/Music/COLLECTION/2007/Various Artists/Kingdom Hearts Original Soundtrack Complete Box/305.mp3 #EXTINF:180,Into The Abyss /home/kadai/Music/COLLECTION/2009/Various Artists/ラグナロクオンライン コンプリート サウンドトラック/305.mp3 #EXTINF:183,時の回廊 /home/kadai/Music/COLLECTION/2009/Various Artists/DS版 クロノ・トリガー オリジナル・サウンドトラック/304 - 時の回廊.mp3 #EXTINF:197,乾坤の血族 Ver.511 ~ドラキュラバトル 螺旋階段ステージ~ /home/kadai/Music/COLLECTION/2009/Various Artists/パチスロ悪魔城ドラキュラ ORIGINAL SOUNDTRACK/30.mp3 #EXTINF:90,友情~闘いのテーマ~ (From “Seven”) /home/kadai/Music/COLLECTION/1999/Various Artists/デジモンアドベンチャー 歌と音楽集 Ver.1/28.mp3 #EXTINF:49,WIN! /home/kadai/Music/COLLECTION/1999/伊藤賢治/チョコボレーシング~幻界へのロード オリジナル・サウンドトラック/27 - WIN!.mp3 #EXTINF:308,Fields of Hope /home/kadai/Music/COLLECTION/2004/Various Artists/機動戦士ガンダムSEED DESTINY ORIGINAL SOUNDTRACK Ⅰ/27.mp3 #EXTINF:123,STRANGE WORLD (DR. WILY STAGE 3) /home/kadai/Music/COLLECTION/2008/Various Artists/ロックマン9 野望の復活!! オリジナルサウンドトラック/26.mp3 #EXTINF:28,LAST BOSS /home/kadai/Music/COLLECTION/2002/Various Artists/カプコン ミュージックジェネレーション ファミコン音楽全集 ロックマン1~6/249.mp3 #EXTINF:106,Dr.WILY STAGE 2 /home/kadai/Music/COLLECTION/2002/Various Artists/カプコン ミュージックジェネレーション ファミコン音楽全集 ロックマン1~6/248.mp3 #EXTINF:120,Dr.COSSACK STAGE 2 /home/kadai/Music/COLLECTION/2002/Various Artists/カプコン ミュージックジェネレーション ファミコン音楽全集 ロックマン1~6/245.mp3 #EXTINF:103,ブリーフィング /home/kadai/Music/COLLECTION/1999/Various Artists/マクロス VF-X2 オリジナル・サウンドトラック/24 - ブリーフィング.mp3 #EXTINF:108,フェニックス戦 /home/kadai/Music/COLLECTION/2008/Various Artists/チョコボの不思議なダンジョン 時忘れの迷宮 オリジナル・サウンドトラック/23 - フェニックス戦.mp3 #EXTINF:120,ワイリーステージ 2 /home/kadai/Music/COLLECTION/2007/内山修作/ロックマン8 メタルヒーローズ オリジナル・サウンドトラック/23 - ワイリーステージ 2.mp3 #EXTINF:216,Event: The Last Scene /home/kadai/Music/COLLECTION/2001/Various Artists/Multi-Dimensional_ Sonic Adventure 2 Original Sound Track/230 - Event_ The Last Scene.mp3 #EXTINF:239,亜空の使者 ボス戦闘曲1 /home/kadai/Music/COLLECTION/2008/Various Artists/大乱闘スマッシュブラザーズX オリジナル・サウンドトラック/2305.mp3 #EXTINF:84,亜空の使者 アドベンチャーマップ /home/kadai/Music/COLLECTION/2008/Various Artists/大乱闘スマッシュブラザーズX オリジナル・サウンドトラック/2301.mp3 #EXTINF:118,Aeon /home/kadai/Music/COLLECTION/2009/Various Artists/ラグナロクオンライン コンプリート サウンドトラック/230.mp3 #EXTINF:109,Take Off /home/kadai/Music/COLLECTION/2008/Various Artists/マクロスフロンティア_ 娘フロ/22 - Take Off.mp3 #EXTINF:132,Endless Mine /home/kadai/Music/COLLECTION/1994/瀬上純/Sonic 3/22 - Endless Mine.mp3 #EXTINF:171,黄昏の聖痕 /home/kadai/Music/COLLECTION/2008/Various Artists/悪魔城ドラキュラ 奪われた刻印 ORIGINAL SOUNDTRACK/222.mp3 #EXTINF:51,シンプル:結果表示画面 /home/kadai/Music/COLLECTION/2008/Various Artists/大乱闘スマッシュブラザーズX オリジナル・サウンドトラック/2213.mp3 #EXTINF:147,ワイリーステージ 1 /home/kadai/Music/COLLECTION/2007/内山修作/ロックマン8 メタルヒーローズ オリジナル・サウンドトラック/22 - ワイリーステージ 1.mp3 #EXTINF:169,地球へ /home/kadai/Music/COLLECTION/1999/長岡成貢/太陽の船ソルビアンカ — オリジナル・サウンドトラック/21 - 地球へ.mp3 #EXTINF:179,武器工場 /home/kadai/Music/COLLECTION/1996/下村陽子/スーパーマリオRPGオリジナル・サウンド・ヴァージョン/217.mp3 #EXTINF:163,Theme of Cammy -SF IV Arrange- /home/kadai/Music/COLLECTION/2009/Various Artists/ストリートファイターIV オリジナル・サウンドトラック/216 - Theme of Cammy -SF IV Arrange-.mp3 #EXTINF:120,宇宙幻想 /home/kadai/Music/COLLECTION/2008/Various Artists/スーパーマリオギャラクシーサウンドトラック プラチナバージョン/216.mp3 #EXTINF:153,時の最果て /home/kadai/Music/COLLECTION/2009/Various Artists/DS版 クロノ・トリガー オリジナル・サウンドトラック/213 - 時の最果て.mp3 #EXTINF:69,SPARKMAN STAGE /home/kadai/Music/COLLECTION/2002/Various Artists/カプコン ミュージックジェネレーション ファミコン音楽全集 ロックマン1~6/212.mp3 #EXTINF:141,Cossack Stages 2 /home/kadai/Music/COLLECTION/1999/宮脇拓也、田中直人、梶野俊夫/ロックマン 4 新たなる野望!! [Complete Works Remix]/21.mp3 #EXTINF:166,Battle in the Sky /home/kadai/Music/COLLECTION/1992/岩月博之/奇々怪界~謎の黒マント オリジナル・サウンドトラック/20 - Battle in the Sky.mp3 #EXTINF:99,HARDMAN STAGE /home/kadai/Music/COLLECTION/2002/Various Artists/カプコン ミュージックジェネレーション ファミコン音楽全集 ロックマン1~6/209.mp3 #EXTINF:264,真実の嘆き~レオンのテーマ~ /home/kadai/Music/COLLECTION/2005/山根ミチル/キャッスルヴァニア Original Soundtrack/205.mp3 #EXTINF:166,Escape From Enemy Base /home/kadai/Music/COLLECTION/2003/桜庭統/テイルズ・オブ・シンフォニア オリジナル・サウンドトラック/204 - Escape From Enemy Base.mp3 #EXTINF:180,黄昏の聖痕 /home/kadai/Music/COLLECTION/2008/Various Artists/悪魔城ドラキュラ 奪われた刻印 ORIGINAL SOUNDTRACK/204.mp3 #EXTINF:157,Pampas Upas /home/kadai/Music/COLLECTION/2009/Various Artists/ラグナロクオンライン コンプリート サウンドトラック/204.mp3 #EXTINF:322,Labyrinth Suite (ステージ7) /home/kadai/Music/COLLECTION/2005/Various Artists/ラグナロクバトルオフライン オリジナルサウンドトラック アドベンチャラーズ イン/201 - Labyrinth Suite (ステージ7).mp3 #EXTINF:276,ANGEL ISLAND ZONE /home/kadai/Music/COLLECTION/2008/Various Artists/大乱闘スマッシュブラザーズX オリジナル・サウンドトラック/2004.mp3 #EXTINF:95,プロトカルチュア /home/kadai/Music/COLLECTION/2008/Various Artists/マクロスフロンティア_ 娘トラ/20 - プロトカルチュア.mp3 #EXTINF:163,水の守護者2 /home/kadai/Music/COLLECTION/2008/Various Artists/チョコボの不思議なダンジョン 時忘れの迷宮 オリジナル・サウンドトラック/19 - 水の守護者2.mp3 #EXTINF:279,To the Amusement Park! (Mission 18) /home/kadai/Music/COLLECTION/2006/佐藤直之/Elebits Original Soundtrack/19 - To the Amusement Park! (Mission 18).mp3 #EXTINF:114,ニンギョヒメ ~Short Ver.~ /home/kadai/Music/COLLECTION/2002/Various Artists/ちょびっツ オリジナルサウンドトラック002/19 - ニンギョヒメ ~Short Ver.~.mp3 #EXTINF:352,The Target /home/kadai/Music/COLLECTION/2008/Various Artists/マクロスフロンティア_ 娘フロ/18 - The Target.mp3 #EXTINF:237,Maze Of Death /home/kadai/Music/COLLECTION/2008/Various Artists/ロックマン9 アレンジサウンドトラック/18 - Maze Of Death.mp3 #EXTINF:75,Mad Man's Sanctuary /home/kadai/Music/COLLECTION/1998/Various Artists/Rockman & Forte (Super Famicom) Original Soundtrack/18 - Mad Man's Sanctuary.mp3 #EXTINF:184,Haunted House /home/kadai/Music/COLLECTION/1992/岩月博之/奇々怪界~謎の黒マント オリジナル・サウンドトラック/18 - Haunted House.mp3 #EXTINF:121,レナのテーマ /home/kadai/Music/COLLECTION/2002/エクセルシア/ファイナルファンタジー 2NDベストコレクション/18 - レナのテーマ.mp3 #EXTINF:150,Scramble /home/kadai/Music/COLLECTION/1993/Various Artists/ラングリッサー 光輝の末裔/17 - Scramble.mp3 #EXTINF:143,Stickerbush Symphony (Bramble Blast) /home/kadai/Music/COLLECTION/1995/David Wise/Donkey Kong Country 2_ Diddy's Kong Quest/17.mp3 #EXTINF:112,Sinister Sundown /home/kadai/Music/COLLECTION/2006/blue.nocturne/Kingdom Hearts Chain of Memories Arranged Album/16 - Sinister Sundown.mp3 #EXTINF:183,Shadow Buster /home/kadai/Music/COLLECTION/2008/goat/Unchosen Paths/16 - Shadow Buster.mp3 #EXTINF:159,Hard Battle /home/kadai/Music/COLLECTION/1993/Various Artists/ラングリッサー 光輝の末裔/16 - Hard Battle.mp3 #EXTINF:300,Zero Gravity Area - StarMan Stage /home/kadai/Music/COLLECTION/2003/Various Artists/Rockman EXE Transmission _ Mega Man Network Transmission/15 - Zero Gravity Area - StarMan Stage.mp3 #EXTINF:173,Sword of Holy /home/kadai/Music/COLLECTION/1993/Various Artists/ラングリッサー 光輝の末裔/15 - Sword of Holy.mp3 #EXTINF:163,Lazy Afternoons /home/kadai/Music/COLLECTION/2006/blue.nocturne/Kingdom Hearts Chain of Memories Arranged Album/15 - Lazy Afternoons.mp3 #EXTINF:150,is this LOVE? /home/kadai/Music/COLLECTION/2008/Various Artists/マクロスフロンティア_ 娘トラ/15 - is this LOVE_.mp3 #EXTINF:98,CRISTAR MYMINE STAGE /home/kadai/Music/COLLECTION/2003/Various Artists/カプコンミュージックジェネレーション ロックマンX1~6/153.mp3 #EXTINF:66,WHEEL ALLIGATES STAGE /home/kadai/Music/COLLECTION/2003/Various Artists/カプコンミュージックジェネレーション ロックマンX1~6/152.mp3 #EXTINF:112,BUBBLY CRABLOS STAGE /home/kadai/Music/COLLECTION/2003/Various Artists/カプコンミュージックジェネレーション ロックマンX1~6/151.mp3 #EXTINF:122,異次元ステージ /home/kadai/Music/COLLECTION/2007/内山修作/ロックマン8 メタルヒーローズ オリジナル・サウンドトラック/14 - 異次元ステージ.mp3 #EXTINF:198,Vacation in Miranda's Beach? /home/kadai/Music/COLLECTION/2008/8 Bit Instrumental/Mega Man 2 Soundtrack_ Beat the 8 Super Robots With 8 Bit Instrumental/14 - Vacation in Miranda's Beach_ (Ending Theme).mp3 #EXTINF:135,Kingdom Knight Ledin /home/kadai/Music/COLLECTION/1993/Various Artists/ラングリッサー 光輝の末裔/14 - Kingdom Knight Ledin.mp3 #EXTINF:85,ほっぴンちょっぴン /home/kadai/Music/COLLECTION/2005/Various Artists/Dance Dance Revolution with Mario/14 - ほっぴンちょっぴン.mp3 clementine-1.2.3+git1354-gdaddbde+dfsg/tests/data/test.xspf000066400000000000000000000004441260417502300233250ustar00rootroot00000000000000 http://example.com/foo.mp3 Foo Bar Baz 60000 http://example.com/albumcover.jpg http://example.com clementine-1.2.3+git1354-gdaddbde+dfsg/tests/data/testdata.qrc000066400000000000000000000023101260417502300237560ustar00rootroot00000000000000 beep.flac beep.mp3 beep.ogg beep.spx beep.wav beep.wma beep.m4a brokensong.cue discid_2cd.xml fmpsplaycount.mp3 fmpsplaycountboth.mp3 fmpsplaycountuser.mp3 fmpspopmrating.mp3 fmpsrating.mp3 fmpsratingboth.mp3 fmpsratinguser.mp3 fullmetadata.cue manyfiles.cue manyfilesbroken.cue onesong.cue popmrating.mp3 pls_one.pls pls_somafm.pls recording.xml recording_with_multiple_releases.xml secretagent.asx secretagent.pls test.m3u test.xspf test.asx test.asxini twosongs.cue withdatafiles.cue clementine-1.2.3+git1354-gdaddbde+dfsg/tests/data/twosongs.cue000066400000000000000000000003251260417502300240230ustar00rootroot00000000000000PERFORMER "Zucchero himself" TITLE "Chocabeck" FILE files/longer.mp3 WAVE TRACK 01 AUDIO TITLE "Un soffio caldo" INDEX 01 00:01:00 TRACK 02 AUDIO TITLE "Somewon Else's Tears" INDEX 01 05:03:68 clementine-1.2.3+git1354-gdaddbde+dfsg/tests/data/withdatafiles.cue000066400000000000000000000007621260417502300247750ustar00rootroot00000000000000FILE file1.mp3 PERFORMER "Artist One" TITLE "Artist One Album" TRACK 01 AUDIO TITLE "A1" INDEX 01 00:01:00 FILE file2.mp3 BINARY PERFORMER "Artist Two" TITLE "Artist Two Album" TRACK 01 AUDIO TITLE "B1" INDEX 00 00:01:00 FILE file3.mp3 MOTOROLA PERFORMER "Artist Three" TITLE "Artist Three Album" TRACK 01 AUDIO TITLE "C1" INDEX 00 00:01:00 FILE file4.mp3 MP3 PERFORMER "Artist Four" TITLE "Artist Four Album" TRACK 01 AUDIO TITLE "D1" INDEX 00 01:01:00 clementine-1.2.3+git1354-gdaddbde+dfsg/tests/database_test.cpp000066400000000000000000000122611260417502300240420ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include #include "test_utils.h" #include "gtest/gtest.h" #include "core/database.h" #include #include #include class DatabaseTest : public ::testing::Test { protected: virtual void SetUp() { database_.reset(new MemoryDatabase); } std::unique_ptr database_; }; TEST_F(DatabaseTest, DatabaseInitialises) { // Check that these tables exist QStringList tables = database_->Connect().tables(); EXPECT_TRUE(tables.contains("songs")); EXPECT_TRUE(tables.contains("directories")); EXPECT_TRUE(tables.contains("subdirectories")); EXPECT_TRUE(tables.contains("playlists")); EXPECT_TRUE(tables.contains("playlist_items")); ASSERT_TRUE(tables.contains("schema_version")); // Check the schema version is correct QSqlQuery q("SELECT version FROM schema_version", database_->Connect()); ASSERT_TRUE(q.exec()); ASSERT_TRUE(q.next()); EXPECT_EQ(Database::kSchemaVersion, q.value(0).toInt()); EXPECT_FALSE(q.next()); } TEST_F(DatabaseTest, FTSOpenParsesSimpleInput) { sqlite3_tokenizer_cursor* cursor = nullptr; Database::FTSOpen(nullptr, "foo", 3, &cursor); ASSERT_TRUE(cursor); Database::UnicodeTokenizerCursor* real_cursor = reinterpret_cast(cursor); QList tokens = real_cursor->tokens; ASSERT_EQ(1, tokens.length()); EXPECT_EQ(0, real_cursor->position); EXPECT_TRUE(real_cursor->current_utf8.isEmpty()); EXPECT_EQ("foo", tokens[0].token); EXPECT_EQ(0, tokens[0].start_offset); EXPECT_EQ(3, tokens[0].end_offset); } TEST_F(DatabaseTest, FTSOpenParsesUTF8Input) { sqlite3_tokenizer_cursor* cursor = nullptr; Database::FTSOpen(nullptr, "Röyksopp", 9, &cursor); ASSERT_TRUE(cursor); Database::UnicodeTokenizerCursor* real_cursor = reinterpret_cast(cursor); QList tokens = real_cursor->tokens; ASSERT_EQ(1, tokens.length()); EXPECT_EQ(0, real_cursor->position); EXPECT_TRUE(real_cursor->current_utf8.isEmpty()); EXPECT_EQ("royksopp", tokens[0].token); EXPECT_EQ(0, tokens[0].start_offset); EXPECT_EQ(9, tokens[0].end_offset); } TEST_F(DatabaseTest, FTSOpenParsesMultipleTokens) { sqlite3_tokenizer_cursor* cursor = nullptr; Database::FTSOpen(nullptr, "Röyksopp foo", 13, &cursor); ASSERT_TRUE(cursor); Database::UnicodeTokenizerCursor* real_cursor = reinterpret_cast(cursor); QList tokens = real_cursor->tokens; ASSERT_EQ(2, tokens.length()); EXPECT_EQ(0, real_cursor->position); EXPECT_TRUE(real_cursor->current_utf8.isEmpty()); EXPECT_EQ("royksopp", tokens[0].token); EXPECT_EQ(0, tokens[0].start_offset); EXPECT_EQ(9, tokens[0].end_offset); EXPECT_EQ("foo", tokens[1].token); EXPECT_EQ(10, tokens[1].start_offset); EXPECT_EQ(13, tokens[1].end_offset); } TEST_F(DatabaseTest, FTSOpenLeavesCyrillicQueries) { sqlite3_tokenizer_cursor* cursor = nullptr; const char* query = "Снег"; Database::FTSOpen(nullptr, query, strlen(query), &cursor); ASSERT_TRUE(cursor); Database::UnicodeTokenizerCursor* real_cursor = reinterpret_cast(cursor); QList tokens = real_cursor->tokens; ASSERT_EQ(1, tokens.length()); EXPECT_EQ(0, real_cursor->position); EXPECT_TRUE(real_cursor->current_utf8.isEmpty()); EXPECT_EQ(QString::fromUtf8("снег"), tokens[0].token); EXPECT_EQ(0, tokens[0].start_offset); EXPECT_EQ(strlen(query), tokens[0].end_offset); } TEST_F(DatabaseTest, FTSCursorWorks) { sqlite3_tokenizer_cursor* cursor = nullptr; Database::FTSOpen(nullptr, "Röyksopp foo", 13, &cursor); ASSERT_TRUE(cursor); Database::UnicodeTokenizerCursor* real_cursor = reinterpret_cast(cursor); const char* token; int bytes = 0; int start_offset = 42; int end_offset = 0; int position = 42; int rc = Database::FTSNext(cursor, &token, &bytes, &start_offset, &end_offset, &position); EXPECT_EQ(SQLITE_OK, rc); EXPECT_STREQ("royksopp", token); EXPECT_EQ(8, bytes); EXPECT_EQ(0, start_offset); EXPECT_EQ(9, end_offset); EXPECT_EQ(0, position); rc = Database::FTSNext(cursor, &token, &bytes, &start_offset, &end_offset, &position); EXPECT_EQ(rc, SQLITE_OK); EXPECT_STREQ("foo", token); EXPECT_EQ(3, bytes); EXPECT_EQ(10, start_offset); EXPECT_EQ(13, end_offset); EXPECT_EQ(1, position); rc = Database::FTSNext(cursor, &token, &bytes, &start_offset, &end_offset, &position); EXPECT_EQ(SQLITE_DONE, rc); } clementine-1.2.3+git1354-gdaddbde+dfsg/tests/fileformats_test.cpp000066400000000000000000000045471260417502300246210ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "core/song.h" #include "engines/gstengine.h" #include "gmock/gmock.h" #include "gtest/gtest.h" #include "test_utils.h" #include #include #include #include #include #include namespace { class FileformatsTest : public ::testing::TestWithParam { public: static void SetUpTestCase() { sGstEngine = new GstEngine; ASSERT_TRUE(sGstEngine->Init()); } static void TearDownTestCase() { delete sGstEngine; sGstEngine = nullptr; } protected: FileformatsTest() { kFormatsWithoutMetadata.insert("wav"); } void SetUp() { format_ = GetParam(); resource_filename_ = ":/testdata/beep." + format_; temp_filetemplate_ = QDir::tempPath() + "/fileformatstest-XXXXXX." + format_; } void SaveToTempFile(QTemporaryFile* file) { QFile resource(resource_filename_); resource.open(QIODevice::ReadOnly); QByteArray data(resource.readAll()); resource.close(); file->open(); file->write(data); file->flush(); } static GstEngine* sGstEngine; QSet kFormatsWithoutMetadata; QString format_; QString resource_filename_; QString temp_filetemplate_; }; GstEngine* FileformatsTest::sGstEngine = nullptr; TEST_P(FileformatsTest, Exists) { EXPECT_TRUE(QFile::exists(resource_filename_)); } TEST_P(FileformatsTest, LoadsTags) { QTemporaryFile temp(temp_filetemplate_); SaveToTempFile(&temp); Song song; song.InitFromFile(temp.fileName(), -1); ASSERT_TRUE(song.is_valid()); if (!kFormatsWithoutMetadata.contains(format_)) { EXPECT_EQ("Beep " + format_, song.title()); } } } // namespace clementine-1.2.3+git1354-gdaddbde+dfsg/tests/fmpsparser_test.cpp000066400000000000000000000171131260417502300244610ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "test_utils.h" #include "gtest/gtest.h" #include "fmpsparser.h" #include class FMPSParserTest : public testing::Test { protected: FMPSParser parser_; }; TEST_F(FMPSParserTest, ParseFloats) { QVariant value; EXPECT_EQ(1, parser_.ParseValue("0", &value)); EXPECT_EQ(QVariant::Double, value.type()); EXPECT_EQ(0, value.toDouble()); EXPECT_EQ(3, parser_.ParseValue("123", &value)); EXPECT_EQ(QVariant::Double, value.type()); EXPECT_EQ(123, value.toDouble()); EXPECT_EQ(3, parser_.ParseValue("0.0", &value)); EXPECT_EQ(QVariant::Double, value.type()); EXPECT_EQ(0, value.toDouble()); EXPECT_EQ(2, parser_.ParseValue("-1", &value)); EXPECT_EQ(QVariant::Double, value.type()); EXPECT_EQ(-1, value.toDouble()); EXPECT_EQ(5, parser_.ParseValue("-1.23", &value)); EXPECT_EQ(QVariant::Double, value.type()); EXPECT_EQ(-1.23, value.toDouble()); EXPECT_EQ(4, parser_.ParseValue("+123", &value)); EXPECT_EQ(QVariant::Double, value.type()); EXPECT_EQ(123, value.toDouble()); parser_.ParseValue("1.", &value); EXPECT_NE(QVariant::Double, value.type()); parser_.ParseValue("abc", &value); EXPECT_NE(QVariant::Double, value.type()); } TEST_F(FMPSParserTest, ParseStrings) { QVariant value; EXPECT_EQ(3, parser_.ParseValue("abc", &value)); EXPECT_EQ(QVariant::String, value.type()); EXPECT_EQ("abc", value.toString()); EXPECT_EQ(8, parser_.ParseValue("foo\\\\bar", &value)); EXPECT_EQ(QVariant::String, value.type()); EXPECT_EQ("foo\\bar", value.toString()); EXPECT_EQ(8, parser_.ParseValue("foo\\:bar", &value)); EXPECT_EQ(QVariant::String, value.type()); EXPECT_EQ("foo:bar", value.toString()); EXPECT_EQ(8, parser_.ParseValue("foo\\;bar", &value)); EXPECT_EQ(QVariant::String, value.type()); EXPECT_EQ("foo;bar", value.toString()); EXPECT_EQ(12, parser_.ParseValue("foo\\\\\\:\\;bar", &value)); EXPECT_EQ(QVariant::String, value.type()); EXPECT_EQ("foo\\:;bar", value.toString()); EXPECT_EQ(2, parser_.ParseValue("1.", &value)); EXPECT_EQ(QVariant::String, value.type()); EXPECT_EQ("1.", value.toString()); EXPECT_EQ(5, parser_.ParseValue("1.abc", &value)); EXPECT_EQ(QVariant::String, value.type()); EXPECT_EQ("1.abc", value.toString()); EXPECT_EQ(-1, parser_.ParseValue("foo\\bar", &value)); EXPECT_EQ(-1, parser_.ParseValue("foo:bar", &value)); EXPECT_EQ(-1, parser_.ParseValue("foo;bar", &value)); } TEST_F(FMPSParserTest, ParseLists) { QVariantList value; EXPECT_EQ(3, parser_.ParseList("abc", &value)); EXPECT_EQ(1, value.length()); EXPECT_EQ("abc", value[0]); EXPECT_EQ(3, parser_.ParseList("123", &value)); EXPECT_EQ(1, value.length()); EXPECT_EQ(123, value[0]); EXPECT_EQ(8, parser_.ParseList("abc::def", &value)); EXPECT_EQ(2, value.length()); EXPECT_EQ("abc", value[0]); EXPECT_EQ("def", value[1]); EXPECT_EQ(13, parser_.ParseList("abc::def::ghi", &value)); EXPECT_EQ(3, value.length()); EXPECT_EQ("abc", value[0]); EXPECT_EQ("def", value[1]); EXPECT_EQ("ghi", value[2]); EXPECT_EQ(12, parser_.ParseList("ab\\:c::\\\\def", &value)); EXPECT_EQ(2, value.length()); EXPECT_EQ("ab:c", value[0]); EXPECT_EQ("\\def", value[1]); EXPECT_EQ(5, parser_.ParseList("abc::def:", &value)); EXPECT_EQ(1, value.length()); EXPECT_EQ("abc", value[0]); } TEST_F(FMPSParserTest, ParseListLists) { FMPSParser::Result value; EXPECT_EQ(8, parser_.ParseListList("abc::def", &value)); EXPECT_EQ(1, value.length()); EXPECT_EQ(2, value[0].length()); EXPECT_EQ("abc", value[0][0]); EXPECT_EQ("def", value[0][1]); EXPECT_EQ(18, parser_.ParseListList("abc::def;;123::456", &value)); EXPECT_EQ(2, value.length()); EXPECT_EQ(2, value[0].length()); EXPECT_EQ(2, value[1].length()); EXPECT_EQ("abc", value[0][0]); EXPECT_EQ("def", value[0][1]); EXPECT_EQ(123, value[1][0]); EXPECT_EQ(456, value[1][1]); } TEST_F(FMPSParserTest, Parse) { EXPECT_TRUE(parser_.Parse("abc")); EXPECT_TRUE(parser_.Parse("abc::def")); EXPECT_TRUE(parser_.Parse("abc::def;;123::456;;foo::bar")); EXPECT_TRUE(parser_.Parse("1.")); EXPECT_TRUE(parser_.Parse("1.abc")); EXPECT_FALSE(parser_.Parse("1:")); EXPECT_FALSE(parser_.Parse("1;")); EXPECT_FALSE(parser_.Parse("1:abc")); EXPECT_FALSE(parser_.Parse("abc;")); } TEST_F(FMPSParserTest, SpecExamples) { FMPSParser::Result expected; expected.clear(); expected << (QVariantList() << "Alice Abba" << 0.6); expected << (QVariantList() << "Bob Beatles" << 0.8); ASSERT_TRUE(parser_.Parse("Alice Abba::0.6;;Bob Beatles::0.8")); EXPECT_EQ(expected, parser_.result()); expected.clear(); expected << (QVariantList() << "Rolling Stone" << "Ralph Gleason" << 0.83); expected << (QVariantList() << "musicOMH.com" << "FMPS_Nothing" << 0.76); expected << (QVariantList() << "Metacritic" << "FMPS_Nothing" << 0.8); expected << (QVariantList() << "FMPS_Nothing" << "Some Dude" << 0.9); ASSERT_TRUE(parser_.Parse("Rolling Stone::Ralph Gleason::0.83;;musicOMH.com::FMPS_Nothing::0.76;;Metacritic::FMPS_Nothing::0.8;;FMPS_Nothing::Some Dude::0.9")); EXPECT_EQ(expected, parser_.result()); expected.clear(); expected << (QVariantList() << "Amarok" << "AutoRate" << 0.52); expected << (QVariantList() << "VLC" << "Standard" << 0.6); expected << (QVariantList() << "QuodLibet" << "RatingPlugin:X" << 0.35); expected << (QVariantList() << "The Free Music Player Alliance" << "Rating Algorithm 1" << 0.5); ASSERT_TRUE(parser_.Parse("Amarok::AutoRate::0.52;;VLC::Standard::0.6;;QuodLibet::RatingPlugin\\:X::0.35;;The Free Music Player Alliance::Rating Algorithm 1::0.5")); EXPECT_EQ(expected, parser_.result()); expected.clear(); expected << (QVariantList() << "Willy Nelson" << "Guitar"); expected << (QVariantList() << "Eric Clapton" << "Guitar (Backup)"); expected << (QVariantList() << "B.B. King" << "Vocals"); ASSERT_TRUE(parser_.Parse("Willy Nelson::Guitar;;Eric Clapton::Guitar (Backup);;B.B. King::Vocals")); EXPECT_EQ(expected, parser_.result()); expected.clear(); expected << (QVariantList() << "Alice Aardvark" << "[lyrics]"); expected << (QVariantList() << "Bob Baboon" << "[lyrics]"); expected << (QVariantList() << "http://www.lyricssite.net" << "[lyrics]"); ASSERT_TRUE(parser_.Parse("Alice Aardvark::[lyrics];;Bob Baboon::[lyrics];;http\\://www.lyricssite.net::[lyrics]")); EXPECT_EQ(expected, parser_.result()); expected.clear(); expected << (QVariantList() << "Amarok" << "Album" << "2982ab29ef"); expected << (QVariantList() << "AmarokUser" << "Compilation" << "My Compilation"); expected << (QVariantList() << "Banshee" << "Compilation" << "ad8slpbzl229zier"); expected << (QVariantList() << "FMPSAlliance" << "Album" << "de9f2c7fd25e1b3afad3e85a0bd17d9b100db4b3"); ASSERT_TRUE(parser_.Parse("Amarok::Album::2982ab29ef;;AmarokUser::Compilation::My Compilation;;Banshee::Compilation::ad8slpbzl229zier;;FMPSAlliance::Album::de9f2c7fd25e1b3afad3e85a0bd17d9b100db4b3")); EXPECT_EQ(expected, parser_.result()); } clementine-1.2.3+git1354-gdaddbde+dfsg/tests/librarybackend_test.cpp000066400000000000000000000234111260417502300252510ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include #include "test_utils.h" #include "gtest/gtest.h" #include #include #include #include #include "library/librarybackend.h" #include "library/library.h" #include "core/song.h" #include "core/database.h" namespace { class LibraryBackendTest : public ::testing::Test { protected: virtual void SetUp() { database_.reset(new MemoryDatabase); backend_.reset(new LibraryBackend); backend_->Init(database_, Library::kSongsTable, Library::kDirsTable, Library::kSubdirsTable, Library::kFtsTable); } Song MakeDummySong(int directory_id) { // Returns a valid song with all the required fields set Song ret; ret.set_directory_id(directory_id); ret.set_url(QUrl::fromLocalFile("foo.mp3")); ret.set_mtime(1); ret.set_ctime(1); ret.set_filesize(1); return ret; } std::shared_ptr database_; std::unique_ptr backend_; }; TEST_F(LibraryBackendTest, EmptyDatabase) { // Check the database is empty to start with QStringList artists = backend_->GetAllArtists(); EXPECT_TRUE(artists.isEmpty()); LibraryBackend::AlbumList albums = backend_->GetAllAlbums(); EXPECT_TRUE(albums.isEmpty()); } TEST_F(LibraryBackendTest, AddDirectory) { QSignalSpy spy(backend_.get(), SIGNAL(DirectoryDiscovered(Directory, SubdirectoryList))); backend_->AddDirectory("/tmp"); // Check the signal was emitted correctly ASSERT_EQ(1, spy.count()); Directory dir = spy[0][0].value(); EXPECT_EQ(QFileInfo("/tmp").canonicalFilePath(), dir.path); EXPECT_EQ(1, dir.id); EXPECT_EQ(0, spy[0][1].value().size()); } TEST_F(LibraryBackendTest, RemoveDirectory) { // Add a directory Directory dir; dir.id = 1; dir.path = "/tmp"; backend_->AddDirectory(dir.path); QSignalSpy spy(backend_.get(), SIGNAL(DirectoryDeleted(Directory))); // Remove the directory again backend_->RemoveDirectory(dir); // Check the signal was emitted correctly ASSERT_EQ(1, spy.count()); dir = spy[0][0].value(); EXPECT_EQ("/tmp", dir.path); EXPECT_EQ(1, dir.id); } TEST_F(LibraryBackendTest, AddInvalidSong) { // Adding a song without certain fields set should fail backend_->AddDirectory("/tmp"); Song s; s.set_directory_id(1); QSignalSpy spy(database_.get(), SIGNAL(Error(QString))); backend_->AddOrUpdateSongs(SongList() << s); ASSERT_EQ(1, spy.count()); spy.takeFirst(); s.set_url(QUrl::fromLocalFile("foo")); backend_->AddOrUpdateSongs(SongList() << s); ASSERT_EQ(1, spy.count()); spy.takeFirst(); s.set_filesize(100); backend_->AddOrUpdateSongs(SongList() << s); ASSERT_EQ(1, spy.count()); spy.takeFirst(); s.set_mtime(100); backend_->AddOrUpdateSongs(SongList() << s); ASSERT_EQ(1, spy.count()); spy.takeFirst(); s.set_ctime(100); backend_->AddOrUpdateSongs(SongList() << s); ASSERT_EQ(0, spy.count()); } TEST_F(LibraryBackendTest, GetAlbumArtNonExistent) { } // Test adding a single song to the database, then getting various information // back about it. class SingleSong : public LibraryBackendTest { protected: virtual void SetUp() { LibraryBackendTest::SetUp(); // Add a directory - this will get ID 1 backend_->AddDirectory("/tmp"); // Make a song in that directory song_ = MakeDummySong(1); song_.set_title("Title"); song_.set_artist("Artist"); song_.set_album("Album"); } void AddDummySong() { QSignalSpy added_spy(backend_.get(), SIGNAL(SongsDiscovered(SongList))); QSignalSpy deleted_spy(backend_.get(), SIGNAL(SongsDeleted(SongList))); // Add the song backend_->AddOrUpdateSongs(SongList() << song_); // Check the correct signals were emitted EXPECT_EQ(0, deleted_spy.count()); ASSERT_EQ(1, added_spy.count()); SongList list = *(reinterpret_cast(added_spy[0][0].data())); ASSERT_EQ(1, list.count()); EXPECT_EQ(song_.title(), list[0].title()); EXPECT_EQ(song_.artist(), list[0].artist()); EXPECT_EQ(song_.album(), list[0].album()); EXPECT_EQ(1, list[0].id()); EXPECT_EQ(1, list[0].directory_id()); } Song song_; }; TEST_F(SingleSong, GetSongWithNoAlbum) { song_.set_album(""); AddDummySong(); if (HasFatalFailure()) return; EXPECT_EQ(1, backend_->GetAllArtists().size()); LibraryBackend::AlbumList albums = backend_->GetAllAlbums(); EXPECT_EQ(1, albums.size()); EXPECT_EQ("Artist", albums[0].artist); EXPECT_EQ("", albums[0].album_name); } TEST_F(SingleSong, GetAllArtists) { AddDummySong(); if (HasFatalFailure()) return; QStringList artists = backend_->GetAllArtists(); ASSERT_EQ(1, artists.size()); EXPECT_EQ(song_.artist(), artists[0]); } TEST_F(SingleSong, GetAllAlbums) { AddDummySong(); if (HasFatalFailure()) return; LibraryBackend::AlbumList albums = backend_->GetAllAlbums(); ASSERT_EQ(1, albums.size()); EXPECT_EQ(song_.album(), albums[0].album_name); EXPECT_EQ(song_.artist(), albums[0].artist); } TEST_F(SingleSong, GetAlbumsByArtist) { AddDummySong(); if (HasFatalFailure()) return; LibraryBackend::AlbumList albums = backend_->GetAlbumsByArtist("Artist"); ASSERT_EQ(1, albums.size()); EXPECT_EQ(song_.album(), albums[0].album_name); EXPECT_EQ(song_.artist(), albums[0].artist); } TEST_F(SingleSong, GetAlbumArt) { AddDummySong(); if (HasFatalFailure()) return; LibraryBackend::Album album = backend_->GetAlbumArt("Artist", "Album"); EXPECT_EQ(song_.album(), album.album_name); EXPECT_EQ(song_.artist(), album.artist); } TEST_F(SingleSong, GetSongs) { AddDummySong(); if (HasFatalFailure()) return; SongList songs = backend_->GetSongs("Artist", "Album"); ASSERT_EQ(1, songs.size()); EXPECT_EQ(song_.album(), songs[0].album()); EXPECT_EQ(song_.artist(), songs[0].artist()); EXPECT_EQ(song_.title(), songs[0].title()); EXPECT_EQ(1, songs[0].id()); } TEST_F(SingleSong, GetSongById) { AddDummySong(); if (HasFatalFailure()) return; Song song = backend_->GetSongById(1); EXPECT_EQ(song_.album(), song.album()); EXPECT_EQ(song_.artist(), song.artist()); EXPECT_EQ(song_.title(), song.title()); EXPECT_EQ(1, song.id()); } TEST_F(SingleSong, FindSongsInDirectory) { AddDummySong(); if (HasFatalFailure()) return; SongList songs = backend_->FindSongsInDirectory(1); ASSERT_EQ(1, songs.size()); EXPECT_EQ(song_.album(), songs[0].album()); EXPECT_EQ(song_.artist(), songs[0].artist()); EXPECT_EQ(song_.title(), songs[0].title()); EXPECT_EQ(1, songs[0].id()); } TEST_F(SingleSong, UpdateSong) { AddDummySong(); if (HasFatalFailure()) return; Song new_song(song_); new_song.set_id(1); new_song.set_title("A different title"); QSignalSpy deleted_spy(backend_.get(), SIGNAL(SongsDeleted(SongList))); QSignalSpy added_spy(backend_.get(), SIGNAL(SongsDiscovered(SongList))); backend_->AddOrUpdateSongs(SongList() << new_song); ASSERT_EQ(1, added_spy.size()); ASSERT_EQ(1, deleted_spy.size()); SongList songs_added = *(reinterpret_cast(added_spy[0][0].data())); SongList songs_deleted = *(reinterpret_cast(deleted_spy[0][0].data())); ASSERT_EQ(1, songs_added.size()); ASSERT_EQ(1, songs_deleted.size()); EXPECT_EQ("Title", songs_deleted[0].title()); EXPECT_EQ("A different title", songs_added[0].title()); EXPECT_EQ(1, songs_deleted[0].id()); EXPECT_EQ(1, songs_added[0].id()); } TEST_F(SingleSong, DeleteSongs) { AddDummySong(); if (HasFatalFailure()) return; Song new_song(song_); new_song.set_id(1); QSignalSpy deleted_spy(backend_.get(), SIGNAL(SongsDeleted(SongList))); backend_->DeleteSongs(SongList() << new_song); ASSERT_EQ(1, deleted_spy.size()); SongList songs_deleted = *(reinterpret_cast(deleted_spy[0][0].data())); ASSERT_EQ(1, songs_deleted.size()); EXPECT_EQ("Title", songs_deleted[0].title()); EXPECT_EQ(1, songs_deleted[0].id()); // Check we can't retreive that song any more Song song = backend_->GetSongById(1); EXPECT_FALSE(song.is_valid()); EXPECT_EQ(-1, song.id()); // And the artist or album shouldn't show up either QStringList artists = backend_->GetAllArtists(); EXPECT_EQ(0, artists.size()); LibraryBackend::AlbumList albums = backend_->GetAllAlbums(); EXPECT_EQ(0, albums.size()); } TEST_F(SingleSong, MarkSongsUnavailable) { AddDummySong(); if (HasFatalFailure()) return; Song new_song(song_); new_song.set_id(1); QSignalSpy deleted_spy(backend_.get(), SIGNAL(SongsDeleted(SongList))); backend_->MarkSongsUnavailable(SongList() << new_song); ASSERT_EQ(1, deleted_spy.size()); SongList songs_deleted = *(reinterpret_cast(deleted_spy[0][0].data())); ASSERT_EQ(1, songs_deleted.size()); EXPECT_EQ("Title", songs_deleted[0].title()); EXPECT_EQ(1, songs_deleted[0].id()); // Check the song is marked as deleted. Song song = backend_->GetSongById(1); EXPECT_TRUE(song.is_valid()); EXPECT_TRUE(song.is_unavailable()); // And the artist or album shouldn't show up either QStringList artists = backend_->GetAllArtists(); EXPECT_EQ(0, artists.size()); LibraryBackend::AlbumList albums = backend_->GetAllAlbums(); EXPECT_EQ(0, albums.size()); } } // namespace clementine-1.2.3+git1354-gdaddbde+dfsg/tests/librarymodel_test.cpp000066400000000000000000000254561260417502300247750ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include #include "test_utils.h" #include "gtest/gtest.h" #include "core/database.h" #include "library/librarymodel.h" #include "library/librarybackend.h" #include "library/library.h" #include #include #include #include namespace { class LibraryModelTest : public ::testing::Test { protected: void SetUp() { database_.reset(new MemoryDatabase); backend_.reset(new LibraryBackend); backend_->Init(database_, Library::kSongsTable, Library::kDirsTable, Library::kSubdirsTable, Library::kFtsTable); model_.reset(new LibraryModel(backend_.get(), nullptr)); added_dir_ = false; model_sorted_.reset(new QSortFilterProxyModel); model_sorted_->setSourceModel(model_.get()); model_sorted_->setSortRole(LibraryModel::Role_SortText); model_sorted_->setDynamicSortFilter(true); model_sorted_->sort(0); } Song AddSong(Song& song) { song.set_directory_id(1); if (song.mtime() == -1) song.set_mtime(1); if (song.ctime() == -1) song.set_ctime(1); if (song.url().isEmpty()) song.set_url(QUrl("file:///tmp/foo")); if (song.filesize() == -1) song.set_filesize(1); if (!added_dir_) { backend_->AddDirectory("/tmp"); added_dir_ = true; } backend_->AddOrUpdateSongs(SongList() << song); return song; } Song AddSong(const QString& title, const QString& artist, const QString& album, int length) { Song song; song.Init(title, artist, album, length); return AddSong(song); } std::shared_ptr database_; std::unique_ptr backend_; std::unique_ptr model_; std::unique_ptr model_sorted_; bool added_dir_; }; TEST_F(LibraryModelTest, Initialisation) { EXPECT_EQ(0, model_->rowCount(QModelIndex())); } TEST_F(LibraryModelTest, WithInitialArtists) { AddSong("Title", "Artist 1", "Album", 123); AddSong("Title", "Artist 2", "Album", 123); AddSong("Title", "Foo", "Album", 123); model_->Init(false); ASSERT_EQ(5, model_sorted_->rowCount(QModelIndex())); EXPECT_EQ("A", model_sorted_->index(0, 0, QModelIndex()).data().toString()); EXPECT_EQ("Artist 1", model_sorted_->index(1, 0, QModelIndex()).data().toString()); EXPECT_EQ("Artist 2", model_sorted_->index(2, 0, QModelIndex()).data().toString()); EXPECT_EQ("F", model_sorted_->index(3, 0, QModelIndex()).data().toString()); EXPECT_EQ("Foo", model_sorted_->index(4, 0, QModelIndex()).data().toString()); } TEST_F(LibraryModelTest, CompilationAlbums) { Song song; song.Init("Title", "Artist", "Album", 123); song.set_compilation(true); AddSong(song); model_->Init(false); model_->fetchMore(model_->index(0, 0)); ASSERT_EQ(1, model_->rowCount(QModelIndex())); QModelIndex va_index = model_->index(0, 0, QModelIndex()); EXPECT_EQ("Various artists", va_index.data().toString()); EXPECT_TRUE(model_->hasChildren(va_index)); ASSERT_EQ(model_->rowCount(va_index), 1); QModelIndex album_index = model_->index(0, 0, va_index); EXPECT_EQ(model_->data(album_index).toString(), "Album"); EXPECT_TRUE(model_->hasChildren(album_index)); } TEST_F(LibraryModelTest, NumericHeaders) { AddSong("Title", "1artist", "Album", 123); AddSong("Title", "2artist", "Album", 123); AddSong("Title", "0artist", "Album", 123); AddSong("Title", "zartist", "Album", 123); model_->Init(false); ASSERT_EQ(6, model_sorted_->rowCount(QModelIndex())); EXPECT_EQ("0-9", model_sorted_->index(0, 0, QModelIndex()).data().toString()); EXPECT_EQ("0artist", model_sorted_->index(1, 0, QModelIndex()).data().toString()); EXPECT_EQ("1artist", model_sorted_->index(2, 0, QModelIndex()).data().toString()); EXPECT_EQ("2artist", model_sorted_->index(3, 0, QModelIndex()).data().toString()); EXPECT_EQ("Z", model_sorted_->index(4, 0, QModelIndex()).data().toString()); EXPECT_EQ("zartist", model_sorted_->index(5, 0, QModelIndex()).data().toString()); } TEST_F(LibraryModelTest, MixedCaseHeaders) { AddSong("Title", "Artist", "Album", 123); AddSong("Title", "artist", "Album", 123); model_->Init(false); ASSERT_EQ(3, model_sorted_->rowCount(QModelIndex())); EXPECT_EQ("A", model_sorted_->index(0, 0, QModelIndex()).data().toString()); EXPECT_EQ("Artist", model_sorted_->index(1, 0, QModelIndex()).data().toString()); EXPECT_EQ("artist", model_sorted_->index(2, 0, QModelIndex()).data().toString()); } TEST_F(LibraryModelTest, UnknownArtists) { AddSong("Title", "", "Album", 123); model_->Init(false); model_->fetchMore(model_->index(0, 0)); ASSERT_EQ(1, model_->rowCount(QModelIndex())); QModelIndex unknown_index = model_->index(0, 0, QModelIndex()); EXPECT_EQ("Unknown", unknown_index.data().toString()); ASSERT_EQ(1, model_->rowCount(unknown_index)); EXPECT_EQ("Album", model_->index(0, 0, unknown_index).data().toString()); } TEST_F(LibraryModelTest, UnknownAlbums) { AddSong("Title", "Artist", "", 123); AddSong("Title", "Artist", "Album", 123); model_->Init(false); model_->fetchMore(model_->index(0, 0)); QModelIndex artist_index = model_->index(0, 0, QModelIndex()); ASSERT_EQ(2, model_->rowCount(artist_index)); QModelIndex unknown_album_index = model_->index(0, 0, artist_index); QModelIndex real_album_index = model_->index(1, 0, artist_index); EXPECT_EQ("Unknown", unknown_album_index.data().toString()); EXPECT_EQ("Album", real_album_index.data().toString()); } TEST_F(LibraryModelTest, VariousArtistSongs) { SongList songs; for (int i=0 ; i<4 ; ++i) { QString n = QString::number(i+1); Song song; song.Init("Title " + n, "Artist " + n, "Album", 0); songs << song; } // Different ways of putting songs in "Various Artist". Make sure they all work songs[0].set_sampler(true); songs[1].set_compilation(true); songs[2].set_forced_compilation_on(true); songs[3].set_sampler(true); songs[3].set_artist("Various Artists"); for (int i=0 ; i<4 ; ++i) AddSong(songs[i]); model_->Init(false); QModelIndex artist_index = model_->index(0, 0, QModelIndex()); model_->fetchMore(artist_index); ASSERT_EQ(1, model_->rowCount(artist_index)); QModelIndex album_index = model_->index(0, 0, artist_index); model_->fetchMore(album_index); ASSERT_EQ(4, model_->rowCount(album_index)); EXPECT_EQ("Artist 1 - Title 1", model_->index(0, 0, album_index).data().toString()); EXPECT_EQ("Artist 2 - Title 2", model_->index(1, 0, album_index).data().toString()); EXPECT_EQ("Artist 3 - Title 3", model_->index(2, 0, album_index).data().toString()); EXPECT_EQ("Title 4", model_->index(3, 0, album_index).data().toString()); } TEST_F(LibraryModelTest, RemoveSongsLazyLoaded) { Song one = AddSong("Title 1", "Artist", "Album", 123); one.set_id(1); Song two = AddSong("Title 2", "Artist", "Album", 123); two.set_id(2); AddSong("Title 3", "Artist", "Album", 123); model_->Init(false); // Lazy load the items QModelIndex artist_index = model_->index(0, 0, QModelIndex()); model_->fetchMore(artist_index); ASSERT_EQ(1, model_->rowCount(artist_index)); QModelIndex album_index = model_->index(0, 0, artist_index); model_->fetchMore(album_index); ASSERT_EQ(3, model_->rowCount(album_index)); // Remove the first two songs QSignalSpy spy_preremove(model_.get(), SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int))); QSignalSpy spy_remove(model_.get(), SIGNAL(rowsRemoved(QModelIndex,int,int))); QSignalSpy spy_reset(model_.get(), SIGNAL(modelReset())); backend_->DeleteSongs(SongList() << one << two); ASSERT_EQ(2, spy_preremove.count()); ASSERT_EQ(2, spy_remove.count()); ASSERT_EQ(0, spy_reset.count()); artist_index = model_->index(0, 0, QModelIndex()); ASSERT_EQ(1, model_->rowCount(artist_index)); album_index = model_->index(0, 0, artist_index); ASSERT_EQ(1, model_->rowCount(album_index)); EXPECT_EQ("Title 3", model_->index(0, 0, album_index).data().toString()); } TEST_F(LibraryModelTest, RemoveSongsNotLazyLoaded) { Song one = AddSong("Title 1", "Artist", "Album", 123); one.set_id(1); Song two = AddSong("Title 2", "Artist", "Album", 123); two.set_id(2); model_->Init(false); // Remove the first two songs QSignalSpy spy_preremove(model_.get(), SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int))); QSignalSpy spy_remove(model_.get(), SIGNAL(rowsRemoved(QModelIndex,int,int))); QSignalSpy spy_reset(model_.get(), SIGNAL(modelReset())); backend_->DeleteSongs(SongList() << one << two); ASSERT_EQ(0, spy_preremove.count()); ASSERT_EQ(0, spy_remove.count()); ASSERT_EQ(1, spy_reset.count()); } TEST_F(LibraryModelTest, RemoveEmptyAlbums) { Song one = AddSong("Title 1", "Artist", "Album 1", 123); one.set_id(1); Song two = AddSong("Title 2", "Artist", "Album 2", 123); two.set_id(2); Song three = AddSong("Title 3", "Artist", "Album 2", 123); three.set_id(3); model_->Init(false); QModelIndex artist_index = model_->index(0, 0, QModelIndex()); model_->fetchMore(artist_index); ASSERT_EQ(2, model_->rowCount(artist_index)); // Remove one song from each album backend_->DeleteSongs(SongList() << one << two); // Check the model artist_index = model_->index(0, 0, QModelIndex()); model_->fetchMore(artist_index); ASSERT_EQ(1, model_->rowCount(artist_index)); QModelIndex album_index = model_->index(0, 0, artist_index); model_->fetchMore(album_index); EXPECT_EQ("Album 2", album_index.data().toString()); ASSERT_EQ(1, model_->rowCount(album_index)); EXPECT_EQ("Title 3", model_->index(0, 0, album_index).data().toString()); } TEST_F(LibraryModelTest, RemoveEmptyArtists) { Song one = AddSong("Title", "Artist", "Album", 123); one.set_id(1); model_->Init(false); // Lazy load the items QModelIndex artist_index = model_->index(0, 0, QModelIndex()); model_->fetchMore(artist_index); ASSERT_EQ(1, model_->rowCount(artist_index)); QModelIndex album_index = model_->index(0, 0, artist_index); model_->fetchMore(album_index); ASSERT_EQ(1, model_->rowCount(album_index)); // The artist header is there too right? ASSERT_EQ(2, model_->rowCount(QModelIndex())); // Remove the song backend_->DeleteSongs(SongList() << one); // Everything should be gone - even the artist header ASSERT_EQ(0, model_->rowCount(QModelIndex())); } } // namespace clementine-1.2.3+git1354-gdaddbde+dfsg/tests/logging_env.h000066400000000000000000000017461260417502300232100ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef LOGGING_ENV_H #define LOGGING_ENV_H #include #include "core/logging.h" class LoggingEnvironment : public ::testing::Environment { public: void SetUp() { logging::Init(); logging::SetLevels("*:4"); } }; #endif // LOGGING_ENV_H clementine-1.2.3+git1354-gdaddbde+dfsg/tests/m3uparser_test.cpp000066400000000000000000000127451260417502300242260ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "gmock/gmock-matchers.h" #include "gtest/gtest.h" #include "test_utils.h" #include "core/timeconstants.h" #include "playlistparsers/m3uparser.h" #include #include using ::testing::HasSubstr; class M3UParserTest : public ::testing::Test { protected: M3UParserTest() : parser_(nullptr) { } M3UParser parser_; }; TEST_F(M3UParserTest, ParsesMetadata) { QString line("#EXTINF:123,Foo artist - Foo track"); M3UParser::Metadata metadata; ASSERT_TRUE(parser_.ParseMetadata(line, &metadata)); EXPECT_EQ("Foo artist", metadata.artist.toStdString()); EXPECT_EQ("Foo track", metadata.title.toStdString()); EXPECT_EQ(123 * kNsecPerSec, metadata.length); } TEST_F(M3UParserTest, ParsesTrackLocation) { QTemporaryFile temp; temp.open(); taglib_.ExpectCall(temp.fileName(), "foo", "bar", "baz"); Song song(&taglib_); QString line(temp.fileName()); parser_.LoadSong(line, 0, QDir(), &song); ASSERT_EQ(QUrl::fromLocalFile(temp.fileName()), song.url()); song.InitFromFile(song.url().toLocalFile(), -1); EXPECT_EQ("foo", song.title()); EXPECT_EQ("bar", song.artist()); EXPECT_EQ("baz", song.album()); } TEST_F(M3UParserTest, ParsesTrackLocationRelative) { QTemporaryFile temp; temp.open(); QFileInfo info(temp); taglib_.ExpectCall(temp.fileName(), "foo", "bar", "baz"); M3UParser parser(nullptr); QString line(info.fileName()); Song song(&taglib_); parser.LoadSong(line, 0, info.dir(), &song); ASSERT_EQ(QUrl::fromLocalFile(temp.fileName()), song.url()); song.InitFromFile(song.url().toLocalFile(), -1); EXPECT_EQ("foo", song.title()); } TEST_F(M3UParserTest, ParsesTrackLocationHttp) { QString line("http://example.com/foo/bar.mp3"); Song song; parser_.LoadSong(line, 0, QDir(), &song); EXPECT_EQ(QUrl("http://example.com/foo/bar.mp3"), song.url()); } TEST_F(M3UParserTest, ParsesSongsFromDevice) { QByteArray data = "#EXTM3U\n" "#EXTINF:123,Some Artist - Some Title\n" "http://foo.com/bar/somefile.mp3\n"; QBuffer buffer(&data); buffer.open(QIODevice::ReadOnly); M3UParser parser(nullptr); SongList songs = parser.Load(&buffer); ASSERT_EQ(1, songs.size()); Song s = songs[0]; EXPECT_EQ("Some Artist", s.artist()); EXPECT_EQ("Some Title", s.title()); EXPECT_EQ(123 * kNsecPerSec, s.length_nanosec()); EXPECT_EQ(QUrl("http://foo.com/bar/somefile.mp3"), s.url()); } TEST_F(M3UParserTest, ParsesNonExtendedM3U) { QByteArray data = "http://foo.com/bar/somefile.mp3\n" "http://baz.com/thing.mp3\n"; QBuffer buffer(&data); buffer.open(QIODevice::ReadOnly); M3UParser parser(nullptr); SongList songs = parser.Load(&buffer, "", QDir("somedir")); ASSERT_EQ(2, songs.size()); EXPECT_EQ(QUrl("http://foo.com/bar/somefile.mp3"), songs[0].url()); EXPECT_EQ(QUrl("http://baz.com/thing.mp3"), songs[1].url()); EXPECT_EQ(-1, songs[0].length_nanosec()); EXPECT_EQ(-1, songs[1].length_nanosec()); EXPECT_TRUE(songs[0].artist().isEmpty()); } TEST_F(M3UParserTest, ParsesActualM3U) { QFile file(":testdata/test.m3u"); file.open(QIODevice::ReadOnly); M3UParser parser(nullptr); SongList songs = parser.Load(&file, "", QDir("somedir")); ASSERT_EQ(239, songs.size()); EXPECT_EQ("gravity", songs[0].title()); EXPECT_EQ(203 * kNsecPerSec, songs[0].length_nanosec()); EXPECT_EQ(QString::fromUtf8("ほっぴンちょっぴン"), songs.back().title()); EXPECT_EQ(85 * kNsecPerSec, songs.back().length_nanosec()); } TEST_F(M3UParserTest, SavesSong) { QByteArray data; QBuffer buffer(&data); buffer.open(QIODevice::WriteOnly); Song one; one.set_filetype(Song::Type_Stream); one.set_title("foo"); one.set_artist("bar"); one.set_length_nanosec(123 * kNsecPerSec); one.set_url(QUrl("http://www.example.com/foo.mp3")); SongList songs; songs << one; M3UParser parser(nullptr); parser.Save(songs, &buffer); EXPECT_THAT(data.constData(), HasSubstr("#EXTM3U")); EXPECT_THAT(data.constData(), HasSubstr("#EXTINF:123,bar - foo")); EXPECT_THAT(data.constData(), HasSubstr("http://www.example.com/foo.mp3")); } TEST_F(M3UParserTest, ParsesUTF8) { QByteArray data = "#EXTM3U\n" "#EXTINF:123,Разные - исполнители\n" "/foo/Разные/исполнители.mp3\n"; QBuffer buffer(&data); buffer.open(QIODevice::ReadOnly); M3UParser parser(nullptr); SongList songs = parser.Load(&buffer); ASSERT_EQ(1, songs.length()); EXPECT_EQ(6, songs[0].artist().length()); EXPECT_EQ(11, songs[0].title().length()); EXPECT_EQ(QString::fromUtf8("Разные"), songs[0].artist()); EXPECT_EQ(QString::fromUtf8("исполнители"), songs[0].title()); EXPECT_EQ(QUrl::fromLocalFile(QString::fromUtf8("/foo/Разные/исполнители.mp3")), songs[0].url()); } clementine-1.2.3+git1354-gdaddbde+dfsg/tests/main.cpp000066400000000000000000000024511260417502300221630ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include #include #include "logging_env.h" #include "metatypes_env.h" #include "resources_env.h" #ifndef Q_WS_X11 # include Q_IMPORT_PLUGIN(qsqlite) #endif int main(int argc, char** argv) { testing::InitGoogleMock(&argc, argv); testing::AddGlobalTestEnvironment(new MetatypesEnvironment); #ifdef GUI QApplication a(argc, argv); #else QCoreApplication a(argc, argv); #endif testing::AddGlobalTestEnvironment(new ResourcesEnvironment); testing::AddGlobalTestEnvironment(new LoggingEnvironment); return RUN_ALL_TESTS(); } clementine-1.2.3+git1354-gdaddbde+dfsg/tests/mergedproxymodel_test.cpp000066400000000000000000000127761260417502300256770ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "gtest/gtest.h" #include "test_utils.h" #include "core/mergedproxymodel.h" #include #include class MergedProxyModelTest : public ::testing::Test { protected: void SetUp() { merged_.setSourceModel(&source_); } QStandardItemModel source_; MergedProxyModel merged_; }; TEST_F(MergedProxyModelTest, Flat) { source_.appendRow(new QStandardItem("one")); source_.appendRow(new QStandardItem("two")); ASSERT_EQ(2, merged_.rowCount(QModelIndex())); QModelIndex one_i = merged_.index(0, 0, QModelIndex()); QModelIndex two_i = merged_.index(1, 0, QModelIndex()); EXPECT_EQ("one", one_i.data().toString()); EXPECT_EQ("two", two_i.data().toString()); EXPECT_FALSE(merged_.parent(one_i).isValid()); EXPECT_FALSE(merged_.hasChildren(one_i)); } TEST_F(MergedProxyModelTest, Tree) { QStandardItem* one = new QStandardItem("one"); QStandardItem* two = new QStandardItem("two"); source_.appendRow(one); one->appendRow(two); ASSERT_EQ(1, merged_.rowCount(QModelIndex())); QModelIndex one_i = merged_.index(0, 0, QModelIndex()); ASSERT_EQ(1, merged_.rowCount(one_i)); QModelIndex two_i = merged_.index(0, 0, one_i); EXPECT_EQ("one", one_i.data().toString()); EXPECT_EQ("two", two_i.data().toString()); EXPECT_EQ("one", two_i.parent().data().toString()); } TEST_F(MergedProxyModelTest, Merged) { source_.appendRow(new QStandardItem("one")); QStandardItemModel submodel; submodel.appendRow(new QStandardItem("two")); merged_.AddSubModel(source_.index(0, 0, QModelIndex()), &submodel); ASSERT_EQ(1, merged_.rowCount(QModelIndex())); QModelIndex one_i = merged_.index(0, 0, QModelIndex()); EXPECT_EQ("one", merged_.data(one_i).toString()); EXPECT_TRUE(merged_.hasChildren(one_i)); ASSERT_EQ(1, merged_.rowCount(one_i)); QModelIndex two_i = merged_.index(0, 0, one_i); EXPECT_EQ("two", merged_.data(two_i).toString()); EXPECT_EQ(0, merged_.rowCount(two_i)); EXPECT_FALSE(merged_.hasChildren(two_i)); } TEST_F(MergedProxyModelTest, SourceInsert) { QSignalSpy before_spy(&merged_, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int))); QSignalSpy after_spy(&merged_, SIGNAL(rowsInserted(QModelIndex,int,int))); source_.appendRow(new QStandardItem("one")); ASSERT_EQ(1, before_spy.count()); ASSERT_EQ(1, after_spy.count()); EXPECT_FALSE(before_spy[0][0].value().isValid()); EXPECT_EQ(0, before_spy[0][1].toInt()); EXPECT_EQ(0, before_spy[0][2].toInt()); EXPECT_FALSE(after_spy[0][0].value().isValid()); EXPECT_EQ(0, after_spy[0][1].toInt()); EXPECT_EQ(0, after_spy[0][2].toInt()); } TEST_F(MergedProxyModelTest, SourceRemove) { source_.appendRow(new QStandardItem("one")); QSignalSpy before_spy(&merged_, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int))); QSignalSpy after_spy(&merged_, SIGNAL(rowsRemoved(QModelIndex,int,int))); source_.removeRow(0, QModelIndex()); ASSERT_EQ(1, before_spy.count()); ASSERT_EQ(1, after_spy.count()); EXPECT_FALSE(before_spy[0][0].value().isValid()); EXPECT_EQ(0, before_spy[0][1].toInt()); EXPECT_EQ(0, before_spy[0][2].toInt()); EXPECT_FALSE(after_spy[0][0].value().isValid()); EXPECT_EQ(0, after_spy[0][1].toInt()); EXPECT_EQ(0, after_spy[0][2].toInt()); } TEST_F(MergedProxyModelTest, SubInsert) { source_.appendRow(new QStandardItem("one")); QStandardItemModel submodel; merged_.AddSubModel(source_.index(0, 0, QModelIndex()), &submodel); QSignalSpy before_spy(&merged_, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int))); QSignalSpy after_spy(&merged_, SIGNAL(rowsInserted(QModelIndex,int,int))); submodel.appendRow(new QStandardItem("two")); ASSERT_EQ(1, before_spy.count()); ASSERT_EQ(1, after_spy.count()); EXPECT_EQ("one", before_spy[0][0].value().data()); EXPECT_EQ(0, before_spy[0][1].toInt()); EXPECT_EQ(0, before_spy[0][2].toInt()); EXPECT_EQ("one", after_spy[0][0].value().data()); EXPECT_EQ(0, after_spy[0][1].toInt()); EXPECT_EQ(0, after_spy[0][2].toInt()); } TEST_F(MergedProxyModelTest, SubRemove) { source_.appendRow(new QStandardItem("one")); QStandardItemModel submodel; merged_.AddSubModel(source_.index(0, 0, QModelIndex()), &submodel); submodel.appendRow(new QStandardItem("two")); QSignalSpy before_spy(&merged_, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int))); QSignalSpy after_spy(&merged_, SIGNAL(rowsRemoved(QModelIndex,int,int))); submodel.removeRow(0, QModelIndex()); ASSERT_EQ(1, before_spy.count()); ASSERT_EQ(1, after_spy.count()); EXPECT_EQ("one", before_spy[0][0].value().data()); EXPECT_EQ(0, before_spy[0][1].toInt()); EXPECT_EQ(0, before_spy[0][2].toInt()); EXPECT_EQ("one", after_spy[0][0].value().data()); EXPECT_EQ(0, after_spy[0][1].toInt()); EXPECT_EQ(0, after_spy[0][2].toInt()); } clementine-1.2.3+git1354-gdaddbde+dfsg/tests/metatypes_env.h000066400000000000000000000026311260417502300235670ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef METATYPES_ENV_H #define METATYPES_ENV_H #include #include #include #include "core/song.h" #include "core/songloader.h" #include "library/directory.h" class MetatypesEnvironment : public ::testing::Environment { public: void SetUp() { qRegisterMetaType("Directory"); qRegisterMetaType("DirectoryList"); qRegisterMetaType("Subdirectory"); qRegisterMetaType("SubdirectoryList"); qRegisterMetaType("SongList"); qRegisterMetaType("QModelIndex"); qRegisterMetaType("SongLoader::Result"); } }; #endif // RESOURCES_ENV_H clementine-1.2.3+git1354-gdaddbde+dfsg/tests/mock_backgroundthread.h000066400000000000000000000031571260417502300252300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MOCK_BACKGROUNDTHREAD_H #define MOCK_BACKGROUNDTHREAD_H #include "backgroundthread.h" template class FakeBackgroundThread : public BackgroundThread { public: FakeBackgroundThread(QObject* parent) : BackgroundThread(parent) { // We have to create the actual worker here instead of in Start() so that // tests can set mock expectations on it before Initialised is emitted. BackgroundThread::worker_.reset(new DerivedType); } void Start() { emit BackgroundThreadBase::Initialised(); } }; template class FakeBackgroundThreadFactory : public BackgroundThreadFactory { public: BackgroundThread* GetThread(QObject* parent) { return new FakeBackgroundThread(parent); } }; #endif clementine-1.2.3+git1354-gdaddbde+dfsg/tests/mock_engine.h000066400000000000000000000030311260417502300231550ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MOCK_ENGINE_H #define MOCK_ENGINE_H #include #include "engines/enginebase.h" class MockEngine : public Engine::Base { public: MOCK_METHOD0(Init, bool()); MOCK_METHOD1(CanDecode, bool(const QUrl&)); MOCK_METHOD1(StartPreloading, void(const QUrl&)); MOCK_METHOD1(Play, bool(quint64)); MOCK_METHOD0(Stop, void()); MOCK_METHOD0(Pause, void()); MOCK_METHOD0(Unpause, void()); MOCK_METHOD1(Seek, void(quint64)); MOCK_METHOD1(AddBackgroundStream, int(const QUrl&)); MOCK_METHOD1(StopBackgroundStream, void(int)); MOCK_METHOD2(SetBackgroundStreamVolume, void(int, int)); MOCK_CONST_METHOD0(state, Engine::State()); MOCK_CONST_METHOD0(position_nanosec, qint64()); MOCK_CONST_METHOD0(length_nanosec, qint64()); MOCK_METHOD1(SetVolumeSW, void(uint)); }; #endif // MOCK_ENGINE_H clementine-1.2.3+git1354-gdaddbde+dfsg/tests/mock_librarybackend.h000066400000000000000000000046471260417502300247020ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MOCKLIBRARYBACKEND_H #define MOCKLIBRARYBACKEND_H #include #include "library/librarybackend.h" class MockLibraryBackend : public LibraryBackendInterface { public: MOCK_CONST_METHOD0(songs_table, QString()); // Get a list of directories in the library. Emits DirectoriesDiscovered. MOCK_METHOD0(LoadDirectoriesAsync, void()); // Counts the songs in the library. Emits TotalSongCountUpdated MOCK_METHOD0(UpdateTotalSongCountAsync, void()); MOCK_METHOD1(FindSongsInDirectory, SongList(int)); MOCK_METHOD1(SubdirsInDirectory, SubdirectoryList(int)); MOCK_METHOD0(GetAllDirectories, DirectoryList()); MOCK_METHOD3(ChangeDirPath, void(int, const QString&, const QString&)); MOCK_METHOD1(GetAllArtists, QStringList(const QueryOptions&)); MOCK_METHOD1(GetAllArtistsWithAlbums, QStringList(const QueryOptions&)); MOCK_METHOD3(GetSongs, SongList(const QString&, const QString&, const QueryOptions&)); MOCK_METHOD2(GetCompilationSongs, SongList(const QString&, const QueryOptions&)); MOCK_METHOD1(GetAllAlbums, AlbumList(const QueryOptions&)); MOCK_METHOD2(GetAlbumsByArtist, AlbumList(const QString&, const QueryOptions&)); MOCK_METHOD1(GetCompilationAlbums, AlbumList(const QueryOptions&)); MOCK_METHOD3(UpdateManualAlbumArtAsync, void(const QString&, const QString&, const QString&)); MOCK_METHOD2(GetAlbumArt, Album(const QString&, const QString&)); MOCK_METHOD1(GetSongById, Song(int)); MOCK_METHOD1(GetSongsByUrl, SongList(const QUrl&)); MOCK_METHOD2(GetSongByUrl, Song(const QUrl&, qint64)); MOCK_METHOD1(AddDirectory, void(const QString&)); MOCK_METHOD1(RemoveDirectory, void(const Directory&)); MOCK_METHOD1(ExecQuery, bool(LibraryQuery*)); }; #endif clementine-1.2.3+git1354-gdaddbde+dfsg/tests/mock_networkaccessmanager.cpp000066400000000000000000000071641260417502300264640ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "mock_networkaccessmanager.h" #include #include using std::min; using ::testing::MakeMatcher; using ::testing::Matcher; using ::testing::MatcherInterface; using ::testing::MatchResultListener; using ::testing::Return; class RequestForUrlMatcher : public MatcherInterface { public: RequestForUrlMatcher(const QString& contains, const QMap& expected_params) : contains_(contains), expected_params_(expected_params) { } virtual ~RequestForUrlMatcher() {} virtual bool Matches(const QNetworkRequest& req) const { const QUrl& url = req.url(); if (!url.toString().contains(contains_)) { return false; } for (QMap::const_iterator it = expected_params_.constBegin(); it != expected_params_.constEnd(); ++it) { if (!url.hasQueryItem(it.key()) || url.queryItemValue(it.key()) != it.value()) { return false; } } return true; } virtual bool MatchAndExplain(const QNetworkRequest& req, MatchResultListener* listener) const { *listener << "which is " << req.url().toString().toUtf8().constData(); return Matches(req); } virtual void DescribeTo(::std::ostream* os) const { *os << "matches url"; } private: QString contains_; QMap expected_params_; }; inline Matcher RequestForUrl( const QString& contains, const QMap& params) { return MakeMatcher(new RequestForUrlMatcher(contains, params)); } MockNetworkReply* MockNetworkAccessManager::ExpectGet( const QString& contains, const QMap& expected_params, int status, const QByteArray& data) { MockNetworkReply* reply = new MockNetworkReply(data); reply->setAttribute(QNetworkRequest::HttpStatusCodeAttribute, status); EXPECT_CALL(*this, createRequest( GetOperation, RequestForUrl(contains, expected_params), nullptr)). WillOnce(Return(reply)); return reply; } MockNetworkReply::MockNetworkReply() : data_(nullptr) { } MockNetworkReply::MockNetworkReply(const QByteArray& data) : data_(data), pos_(0) { } void MockNetworkReply::SetData(const QByteArray& data) { data_ = data; pos_ = 0; } qint64 MockNetworkReply::readData(char* data, qint64 size) { if (data_.size() == pos_) { return -1; } qint64 bytes_to_read = min(data_.size() - pos_, size); memcpy(data, data_.constData() + pos_, bytes_to_read); pos_ += bytes_to_read; return bytes_to_read; } qint64 MockNetworkReply::writeData(const char* data, qint64) { ADD_FAILURE() << "Something tried to write to a QNetworkReply"; return -1; } void MockNetworkReply::Done() { setOpenMode(QIODevice::ReadOnly); emit finished(); } void MockNetworkReply::setAttribute(QNetworkRequest::Attribute code, const QVariant& value) { QNetworkReply::setAttribute(code, value); } clementine-1.2.3+git1354-gdaddbde+dfsg/tests/mock_networkaccessmanager.h000066400000000000000000000043241260417502300261240ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MOCK_NETWORKACCESSAMANGER_H #define MOCK_NETWORKACCESSMANAGER_H #include #include #include #include #include #include "test_utils.h" #include "gmock/gmock.h" // Usage: // Create a MockNetworkAccessManager. // Call ExpectGet() with appropriate expectations and the data you want back. // This will return a MockNetworkReply*. When you are ready for the reply to // arrive, call MockNetworkReply::Done(). class MockNetworkReply : public QNetworkReply { Q_OBJECT public: MockNetworkReply(); MockNetworkReply(const QByteArray& data); // Use these to set expectations. void SetData(const QByteArray& data); virtual void setAttribute(QNetworkRequest::Attribute code, const QVariant& value); // Call this when you are ready for the finished() signal. void Done(); protected: MOCK_METHOD0(abort, void()); virtual qint64 readData(char* data, qint64); virtual qint64 writeData(const char* data, qint64); QByteArray data_; qint64 pos_; }; class MockNetworkAccessManager : public QNetworkAccessManager { Q_OBJECT public: MockNetworkReply* ExpectGet( const QString& contains, // A string that should be present in the URL. const QMap& params, // Required URL parameters. int status, // Returned HTTP status code. const QByteArray& ret_data); // Returned data. protected: MOCK_METHOD3(createRequest, QNetworkReply*(Operation, const QNetworkRequest&, QIODevice*)); }; #endif clementine-1.2.3+git1354-gdaddbde+dfsg/tests/mock_player.h000066400000000000000000000040361260417502300232120ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MOCK_PLAYER_H #define MOCK_PLAYER_H #include "core/player.h" #include "core/song.h" #include "core/settingsprovider.h" #include "library/sqlrow.h" #include class MockPlayer : public PlayerInterface { public: MockPlayer() {} MOCK_CONST_METHOD0(engine, EngineBase*()); MOCK_CONST_METHOD0(GetState, Engine::State()); MOCK_CONST_METHOD0(GetVolume, int()); MOCK_CONST_METHOD0(GetCurrentItem, PlaylistItemPtr()); MOCK_CONST_METHOD1(GetItemAt, PlaylistItemPtr(int)); MOCK_CONST_METHOD0(playlists, PlaylistManagerInterface*()); MOCK_METHOD1(RegisterUrlHandler, void(UrlHandler*)); MOCK_METHOD1(UnregisterUrlHandler, void(UrlHandler*)); MOCK_METHOD0(ReloadSettings, void()); MOCK_METHOD3(PlayAt, void(int, Engine::TrackChangeFlags, bool)); MOCK_METHOD0(PlayPause, void()); MOCK_METHOD0(Next, void()); MOCK_METHOD0(Previous, void()); MOCK_METHOD1(SetVolume, void(int)); MOCK_METHOD0(VolumeUp, void()); MOCK_METHOD0(VolumeDown, void()); MOCK_METHOD1(SeekTo, void(int)); MOCK_METHOD0(SeekForward, void()); MOCK_METHOD0(SeekBackward, void()); MOCK_METHOD1(CurrentMetadataChanged, void(const Song&)); MOCK_METHOD0(Mute, void()); MOCK_METHOD0(Pause, void()); MOCK_METHOD0(Stop, void()); MOCK_METHOD0(Play, void()); MOCK_METHOD0(ShowOSD, void()); }; #endif // MOCK_PLAYER_H clementine-1.2.3+git1354-gdaddbde+dfsg/tests/mock_playlistitem.cpp000066400000000000000000000015611260417502300247710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "mock_playlistitem.h" using ::testing::_; using ::testing::Return; MockPlaylistItem::MockPlaylistItem() : PlaylistItem("DummyType") { } clementine-1.2.3+git1354-gdaddbde+dfsg/tests/mock_playlistitem.h000066400000000000000000000027071260417502300244410ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MOCK_PLAYLISTITEM_H #define MOCK_PLAYLISTITEM_H #include "core/song.h" #include "core/settingsprovider.h" #include "library/sqlrow.h" #include "playlist/playlistitem.h" #include class MockPlaylistItem : public PlaylistItem { public: MockPlaylistItem(); MOCK_CONST_METHOD0(options, Options()); MOCK_METHOD1(InitFromQuery, bool(const SqlRow& settings)); MOCK_METHOD0(Reload, void()); MOCK_CONST_METHOD0(Metadata, Song()); MOCK_CONST_METHOD0(Url, QUrl()); MOCK_METHOD1(SetTemporaryMetadata, void(const Song& metadata)); MOCK_METHOD0(ClearTemporaryMetadata, void()); MOCK_METHOD1(DatabaseValue, QVariant(DatabaseColumn)); }; #endif // MOCK_PLAYLISTITEM_H clementine-1.2.3+git1354-gdaddbde+dfsg/tests/mock_playlistmanager.h000066400000000000000000000063641260417502300251200ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MOCK_PLAYLISTMANAGER_H #define MOCK_PLAYLISTMANAGER_H #include "playlist/playlistmanager.h" class MockPlaylistManager : public PlaylistManagerInterface { public: MockPlaylistManager(QObject* parent = NULL) : PlaylistManagerInterface(parent) {} MOCK_CONST_METHOD0(current_id, int()); MOCK_CONST_METHOD0(active_id, int()); MOCK_CONST_METHOD1(playlist, Playlist*(int)); MOCK_CONST_METHOD0(current, Playlist*()); MOCK_CONST_METHOD0(active, Playlist*()); MOCK_CONST_METHOD0(GetAllPlaylists, QList()); MOCK_METHOD0(InvalidateDeletedSongs, void()); MOCK_METHOD0(RemoveDeletedSongs, void()); MOCK_CONST_METHOD1(selection, QItemSelection(int)); MOCK_CONST_METHOD0(current_selection, QItemSelection()); MOCK_CONST_METHOD0(active_selection, QItemSelection()); MOCK_CONST_METHOD1(GetPlaylistName, QString(int)); MOCK_CONST_METHOD0(task_manager, TaskManager*()); MOCK_CONST_METHOD0(library_backend, LibraryBackend*()); MOCK_CONST_METHOD0(playlist_backend, PlaylistBackend*()); MOCK_CONST_METHOD0(sequence, PlaylistSequence*()); MOCK_CONST_METHOD0(parser, PlaylistParser*()); MOCK_CONST_METHOD0(playlist_container, PlaylistContainer*()); MOCK_METHOD1(RegisterSpecialPlaylistType, void(SpecialPlaylistType*)); MOCK_METHOD1(UnregisterSpecialPlaylistType, void(SpecialPlaylistType*)); MOCK_CONST_METHOD1(GetPlaylistType, SpecialPlaylistType*(const QString&)); MOCK_METHOD3(New, void(const QString&, const SongList&, const QString&)); MOCK_METHOD1(Load, void(const QString&)); MOCK_METHOD2(Save, void(int, const QString&)); MOCK_METHOD2(Rename, void(int, const QString&)); MOCK_METHOD1(Remove, void(int)); MOCK_METHOD1(ChangePlaylistOrder, void(const QList&)); MOCK_METHOD1(SetCurrentPlaylist, void(int)); MOCK_METHOD1(SetActivePlaylist, void(int)); MOCK_METHOD0(SetActiveToCurrent, void()); MOCK_METHOD1(SelectionChanged, void(const QItemSelection&)); MOCK_METHOD0(ClearCurrent, void()); MOCK_METHOD0(ShuffleCurrent, void()); MOCK_METHOD0(SetActivePlaying, void()); MOCK_METHOD0(SetActivePaused, void()); MOCK_METHOD0(SetActiveStopped, void()); MOCK_METHOD2(SetActiveStreamMetadata, void(const QUrl&, const Song&)); MOCK_METHOD1(RateCurrentSong, void(double)); MOCK_METHOD1(RateCurrentSong, void(int)); MOCK_METHOD2(SongChangeRequestProcessed, void(const QUrl& url, bool)); MOCK_METHOD3(PlaySmartPlaylist, void(smart_playlists::GeneratorPtr, bool, bool)); void EmitPlaylistManagerInitialized() { emit PlaylistManagerInitialized(); } }; #endif // MOCK_PLAYLISTMANAGER_H clementine-1.2.3+git1354-gdaddbde+dfsg/tests/mock_settingsprovider.h000066400000000000000000000035131260417502300253300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MOCK_SETTINGSPROVIDER_H #define MOCK_SETTINGSPROVIDER_H #include "core/settingsprovider.h" #include class MockSettingsProvider : public SettingsProvider { public: MOCK_METHOD1(set_group, void(const char* group)); MOCK_CONST_METHOD2(value, QVariant(const QString& key, const QVariant& default_value)); MOCK_METHOD2(setValue, void(const QString& key, const QVariant& value)); MOCK_METHOD1(beginReadArray, int(const QString& prefix)); MOCK_METHOD2(beginWriteArray, void(const QString& prefix, int size)); MOCK_METHOD1(setArrayIndex, void(int i)); MOCK_METHOD0(endArray, void()); }; class DummySettingsProvider : public SettingsProvider { public: DummySettingsProvider() {} void set_group(const char *group) {} QVariant value(const QString&, const QVariant& = QVariant()) const { return QVariant(); } void setValue(const QString&, const QVariant&) {} int beginReadArray(const QString&) { return 0; } void beginWriteArray(const QString&, int = -1) {} void setArrayIndex(int) {} void endArray() {} }; #endif // MOCK_SETTINGSPROVIDER_H clementine-1.2.3+git1354-gdaddbde+dfsg/tests/mock_sqldriver.h000066400000000000000000000055211260417502300237310ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include #include #include #include #include class MockSqlDriver : public QSqlDriver { public: virtual ~MockSqlDriver() {} MOCK_METHOD0(beginTransaction, bool()); MOCK_METHOD0(close, void()); MOCK_METHOD0(commitTransaction, bool()); MOCK_CONST_METHOD0(createResult, QSqlResult*()); MOCK_CONST_METHOD2(escapeIdentifier, QString(const QString&, IdentifierType)); MOCK_CONST_METHOD2(formatValue, QString(const QSqlField&, bool)); MOCK_CONST_METHOD0(handle, QVariant()); MOCK_CONST_METHOD1(hasFeature, bool(DriverFeature)); MOCK_CONST_METHOD0(isOpen, bool()); MOCK_METHOD6(open, bool(const QString&, const QString&, const QString&, const QString&, int, const QString&)); MOCK_CONST_METHOD1(primaryIndex, QSqlIndex(const QString&)); MOCK_CONST_METHOD1(record, QSqlRecord(const QString&)); MOCK_METHOD0(rollbackTransaction, bool()); MOCK_CONST_METHOD4(sqlStatement, QString(StatementType, const QString&, const QSqlRecord&, bool)); MOCK_CONST_METHOD1(tables, QStringList(QSql::TableType)); MOCK_METHOD1(setLastError, void(const QSqlError&)); MOCK_METHOD1(setOpen, void(bool)); MOCK_METHOD1(setOpenError, void(bool)); }; class MockSqlResult : public QSqlResult { public: MockSqlResult(QSqlDriver* driver) : QSqlResult(driver) { } virtual ~MockSqlResult() {} MOCK_METHOD3(bindValue, void(int, const QVariant&, QSql::ParamType)); MOCK_METHOD3(bindValue, void(const QString&, const QVariant&, QSql::ParamType)); MOCK_METHOD1(data, QVariant(int)); MOCK_METHOD0(exec, bool()); MOCK_METHOD1(fetch, bool(int)); MOCK_METHOD0(fetchFirst, bool()); MOCK_METHOD0(fetchLast, bool()); MOCK_METHOD1(isNull, bool(int)); MOCK_CONST_METHOD0(lastInsertId, QVariant()); MOCK_METHOD0(numRowsAffected, int()); MOCK_METHOD1(prepare, bool(const QString&)); MOCK_METHOD1(reset, bool(const QString&)); MOCK_METHOD0(size, int()); void hackSetActive(const QString&) { setActive(true); setAt(0); setSelect(true); } void hackSetActiveVoid() { hackSetActive(QString()); } void setAt(int i) { QSqlResult::setAt(i); } }; clementine-1.2.3+git1354-gdaddbde+dfsg/tests/mpris1_test.cpp000066400000000000000000000164701260417502300235170ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include #include "core/encoding.h" #include "core/mpris1.h" #include "core/song.h" #include "playlist/playlistmanager.h" #include "playlist/playlistsequence.h" #ifdef HAVE_LIBLASTFM #include "internet/lastfm/lastfmcompat.h" #endif #include "gmock/gmock.h" #include "gtest/gtest.h" #include "test_utils.h" #include "mock_engine.h" #include "mock_player.h" #include "mock_playlistmanager.h" #include #include #include #include #include #include using ::testing::_; using ::testing::Return; namespace { class Mpris1BasicTest : public ::testing::Test { protected: void SetUp() { sequence_.reset(new PlaylistSequence); EXPECT_CALL(player_, engine()).WillRepeatedly(Return(&engine_)); EXPECT_CALL(player_, playlists()).WillRepeatedly(Return(&playlists_)); EXPECT_CALL(playlists_, sequence()).WillRepeatedly(Return(sequence_.get())); } QString service_name() const { return "org.clementine.unittest" + QString::number(QCoreApplication::applicationPid()); } MockEngine engine_; MockPlayer player_; MockPlaylistManager playlists_; std::unique_ptr sequence_; }; TEST_F(Mpris1BasicTest, CreatesDBusService) { EXPECT_FALSE(QDBusConnection::sessionBus().interface()-> isServiceRegistered(service_name())); std::unique_ptr mpris( new mpris::Mpris1(&player_, nullptr, nullptr, service_name())); EXPECT_TRUE(QDBusConnection::sessionBus().interface()-> isServiceRegistered(service_name())); mpris.reset(); EXPECT_FALSE(QDBusConnection::sessionBus().interface()-> isServiceRegistered(service_name())); } class Mpris1Test : public Mpris1BasicTest { protected: void SetUp() { Mpris1BasicTest::SetUp(); mpris_.reset(new mpris::Mpris1(&player_, nullptr, nullptr, service_name())); } std::unique_ptr mpris_; }; TEST_F(Mpris1Test, CorrectNameAndVersion) { QCoreApplication::setApplicationName("Banana"); QCoreApplication::setApplicationVersion("Cheese"); EXPECT_EQ("Banana Cheese", mpris_->root()->Identity()); Version version = mpris_->root()->MprisVersion(); EXPECT_EQ(1, version.major); EXPECT_EQ(0, version.minor); } TEST_F(Mpris1Test, Mutes) { EXPECT_CALL(player_, Mute()); mpris_->player()->Mute(); } TEST_F(Mpris1Test, GetsVolume) { EXPECT_CALL(player_, GetVolume()).WillOnce(Return(50)); EXPECT_EQ(50, mpris_->player()->VolumeGet()); } TEST_F(Mpris1Test, SetsVolume) { EXPECT_CALL(player_, SetVolume(42)); mpris_->player()->VolumeSet(42); } TEST_F(Mpris1Test, RaisesVolume) { EXPECT_CALL(player_, GetVolume()).WillOnce(Return(50)); EXPECT_CALL(player_, SetVolume(51)); mpris_->player()->VolumeUp(1); } TEST_F(Mpris1Test, LowersVolume) { EXPECT_CALL(player_, GetVolume()).WillOnce(Return(50)); EXPECT_CALL(player_, SetVolume(49)); mpris_->player()->VolumeDown(1); } TEST_F(Mpris1Test, Pauses) { EXPECT_CALL(player_, PlayPause()); mpris_->player()->Pause(); } TEST_F(Mpris1Test, Stops) { EXPECT_CALL(player_, Stop()); mpris_->player()->Stop(); } TEST_F(Mpris1Test, Plays) { EXPECT_CALL(player_, Play()); mpris_->player()->Play(); } TEST_F(Mpris1Test, GoesPrevious) { EXPECT_CALL(player_, Previous()); mpris_->player()->Prev(); } TEST_F(Mpris1Test, GoesNext) { EXPECT_CALL(player_, Next()); mpris_->player()->Next(); } TEST_F(Mpris1Test, SetsPosition) { EXPECT_CALL(player_, SeekTo(42)); mpris_->player()->PositionSet(42000); } TEST_F(Mpris1Test, GetsStatus) { // Engine statuses EXPECT_CALL(player_, GetState()).WillOnce(Return(Engine::Empty)); DBusStatus status = mpris_->player()->GetStatus(); EXPECT_EQ(DBusStatus::Mpris_Stopped, status.play); EXPECT_CALL(player_, GetState()).WillOnce(Return(Engine::Idle)); status = mpris_->player()->GetStatus(); EXPECT_EQ(DBusStatus::Mpris_Stopped, status.play); EXPECT_CALL(player_, GetState()).WillOnce(Return(Engine::Paused)); status = mpris_->player()->GetStatus(); EXPECT_EQ(DBusStatus::Mpris_Paused, status.play); EXPECT_CALL(player_, GetState()).WillOnce(Return(Engine::Playing)); status = mpris_->player()->GetStatus(); EXPECT_EQ(DBusStatus::Mpris_Playing, status.play); EXPECT_CALL(player_, GetState()).WillRepeatedly(Return(Engine::Empty)); // Repeat modes sequence_->SetRepeatMode(PlaylistSequence::Repeat_Off); status = mpris_->player()->GetStatus(); EXPECT_EQ(0, status.repeat); EXPECT_EQ(0, status.repeat_playlist); sequence_->SetRepeatMode(PlaylistSequence::Repeat_Album); status = mpris_->player()->GetStatus(); EXPECT_EQ(0, status.repeat); EXPECT_EQ(1, status.repeat_playlist); sequence_->SetRepeatMode(PlaylistSequence::Repeat_Playlist); status = mpris_->player()->GetStatus(); EXPECT_EQ(0, status.repeat); EXPECT_EQ(1, status.repeat_playlist); sequence_->SetRepeatMode(PlaylistSequence::Repeat_Track); status = mpris_->player()->GetStatus(); EXPECT_EQ(1, status.repeat); EXPECT_EQ(1, status.repeat_playlist); // Shuffle modes sequence_->SetShuffleMode(PlaylistSequence::Shuffle_Off); status = mpris_->player()->GetStatus(); EXPECT_EQ(0, status.random); sequence_->SetShuffleMode(PlaylistSequence::Shuffle_InsideAlbum); status = mpris_->player()->GetStatus(); EXPECT_EQ(1, status.random); sequence_->SetShuffleMode(PlaylistSequence::Shuffle_Albums); status = mpris_->player()->GetStatus(); EXPECT_EQ(1, status.random); sequence_->SetShuffleMode(PlaylistSequence::Shuffle_All); status = mpris_->player()->GetStatus(); EXPECT_EQ(1, status.random); } TEST_F(Mpris1Test, HandlesShuffleModeChanged) { sequence_->SetShuffleMode(PlaylistSequence::Shuffle_Off); EXPECT_CALL(player_, GetState()).WillRepeatedly(Return(Engine::Empty)); QSignalSpy spy(mpris_->player(), SIGNAL(StatusChange(DBusStatus))); playlists_.EmitPlaylistManagerInitialized(); EXPECT_EQ(0, spy.count()); sequence_->SetShuffleMode(PlaylistSequence::Shuffle_All); ASSERT_EQ(1, spy.count()); EXPECT_EQ(1, spy[0][0].value().random); spy.clear(); sequence_->SetShuffleMode(PlaylistSequence::Shuffle_All); ASSERT_EQ(0, spy.count()); sequence_->SetShuffleMode(PlaylistSequence::Shuffle_InsideAlbum); ASSERT_EQ(1, spy.count()); EXPECT_EQ(1, spy[0][0].value().random); spy.clear(); sequence_->SetShuffleMode(PlaylistSequence::Shuffle_Albums); ASSERT_EQ(1, spy.count()); EXPECT_EQ(1, spy[0][0].value().random); spy.clear(); sequence_->SetShuffleMode(PlaylistSequence::Shuffle_Off); ASSERT_EQ(1, spy.count()); EXPECT_EQ(0, spy[0][0].value().random); spy.clear(); } } // namespace clementine-1.2.3+git1354-gdaddbde+dfsg/tests/musicbrainzclient_test.cpp000066400000000000000000000220741260417502300260260ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include #include "core/logging.h" #include "musicbrainz/musicbrainzclient.h" #include #include #include #include #include #include #include #include "mock_networkaccessmanager.h" #include "gtest/gtest.h" #include "test_utils.h" typedef QList ResultList; Q_DECLARE_METATYPE(ResultList); class MusicBrainzClientTest : public ::testing::Test { protected: static void SetUpTestCase() { qRegisterMetaType("MusicBrainzClient::ResultList"); } void SetUp() { mock_network_.reset(new MockNetworkAccessManager); } // Reads the data from a file into a QByteArray and returns it. QByteArray ReadDataFromFile(const QString& filename) { QFile file(filename); file.open(QIODevice::ReadOnly); QByteArray data = file.readAll(); return data; } std::unique_ptr mock_network_; }; // Test if a discid that do not exist in the musicbrainz database // generates an empty result. TEST_F(MusicBrainzClientTest, DiscIdNotFound) { QByteArray data = "Not " "FoundFor usage, please see: " "http://musicbrainz.org/development/mmd"; // Create a MusicBrainzClient instance with mock_network_. MusicBrainzClient musicbrainz_client(nullptr, mock_network_.get()); // Hook the data as the response to a query of a given type. QMap params; params["inc"] = "artists+recordings"; MockNetworkReply* discid_reply = mock_network_->ExpectGet("discid", params, 200, data); // Set up a QSignalSpy which stores the result. QSignalSpy spy(&musicbrainz_client, SIGNAL(Finished(const QString&, const QString, const MusicBrainzClient::ResultList&))); ASSERT_TRUE(spy.isValid()); EXPECT_EQ(0, spy.count()); // Start the request and get a result. The argument doesn't matter // in the test. musicbrainz_client.StartDiscIdRequest("fooDiscid"); discid_reply->Done(); QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); EXPECT_EQ(1, spy.count()); QList result = spy.takeFirst(); QString artist = result.takeFirst().toString(); QString album = result.takeFirst().toString(); ResultList tracks = result.takeFirst().value(); // Check that title and artist are empty, and that there are zero tracks. EXPECT_TRUE(artist.isEmpty()); EXPECT_TRUE(album.isEmpty()); EXPECT_EQ(0, tracks.count()); } // Test if MusicBrainzClient::StartDiscIdRequest() parses a discid // correctly. TEST_F(MusicBrainzClientTest, ParseDiscID) { QByteArray data = ReadDataFromFile(":testdata/discid_2cd.xml"); ASSERT_FALSE(data.isEmpty()); // The following are the expected values given for the test file // discid_2cd.xml. The discid corresponds to the 2nd disc in the // set. The test file contains two releases but we only parse the first. const QString expected_artist = "Symphony X"; const QString expected_title = "Live on the Edge of Forever"; const int expected_number_of_tracks = 6; const int expected_year = 2001; // Create a MusicBrainzClient instance with mock_network_. MusicBrainzClient musicbrainz_client(nullptr, mock_network_.get()); // Hook the data as the response to a query of a given type. QMap params; params["inc"] = "artists+recordings"; MockNetworkReply* discid_reply = mock_network_->ExpectGet("discid", params, 200, data); // Set up a QSignalSpy which stores the result. QSignalSpy spy(&musicbrainz_client, SIGNAL(Finished(const QString&, const QString, const MusicBrainzClient::ResultList&))); ASSERT_TRUE(spy.isValid()); EXPECT_EQ(0, spy.count()); // Start the request and get a result. The argument doesn't matter // in the test. It is here set to the discid of the requested disc. musicbrainz_client.StartDiscIdRequest("lvcH9_vbw_rJAbXieTOo1CbyNmQ-"); discid_reply->Done(); QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); EXPECT_EQ(1, spy.count()); QList result = spy.takeFirst(); QString artist = result.takeFirst().toString(); QString album = result.takeFirst().toString(); ResultList tracks = result.takeFirst().value(); // Check that title and artist are correct. EXPECT_EQ(expected_artist, artist); EXPECT_EQ(expected_title, album); // Check that we get the correct number of tracks, i.e. that the // correct disc is chosen in a multi-disc release. EXPECT_EQ(expected_number_of_tracks, tracks.count()); // Check that the tracks is ordered by track number in ascending // order and that the expected year is added to all tracks. for (int i = 0; i < tracks.count(); ++i) { EXPECT_EQ(i + 1, tracks[i].track_); EXPECT_EQ(expected_year, tracks[i].year_); } // Check some track information. EXPECT_EQ("Smoke and Mirrors", tracks[0].title_); EXPECT_EQ(1, tracks[0].track_); EXPECT_EQ(394600, tracks[0].duration_msec_); EXPECT_EQ("Church of the Machine", tracks[1].title_); EXPECT_EQ(2, tracks[1].track_); EXPECT_EQ(441866, tracks[1].duration_msec_); } // Test if MusicBrainzClient::Start() parses a track correctly. TEST_F(MusicBrainzClientTest, ParseTrack) { QByteArray data = ReadDataFromFile(":testdata/recording.xml"); ASSERT_FALSE(data.isEmpty()); // Expected results from the test file recording.xml: const int expected_track_number = 6; const QString expected_title = "Victoria und ihr Husar: Pardon Madame"; const QString expected_artist = "Paul Abraham"; const QString expected_album = "An Evening at the Operetta"; const int expected_year = 1992; // Create a MusicBrainzClient instance with mock_network_. MusicBrainzClient musicbrainz_client(nullptr, mock_network_.get()); // Hook the data as the response to a query of a given type. QMap params; params["inc"] = "artists+releases+media"; MockNetworkReply* discid_reply = mock_network_->ExpectGet("recording", params, 200, data); QSignalSpy spy(&musicbrainz_client, SIGNAL(Finished(int, const MusicBrainzClient::ResultList&))); ASSERT_TRUE(spy.isValid()); EXPECT_EQ(0, spy.count()); // Start the request and get a result. // The mbid argument doesn't matter in the test. const int sent_id = 0; musicbrainz_client.Start(sent_id, QStringList() << "fooMbid"); discid_reply->Done(); QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); EXPECT_EQ(1, spy.count()); QList result = spy.takeFirst(); int id = result.takeFirst().toInt(); EXPECT_EQ(sent_id, id); ResultList tracks = result.takeFirst().value(); for (const MusicBrainzClient::Result& track : tracks) { EXPECT_EQ(expected_track_number, track.track_); EXPECT_EQ(expected_title, track.title_); EXPECT_EQ(expected_artist, track.artist_); EXPECT_EQ(expected_album, track.album_); EXPECT_EQ(expected_year, track.year_); } } // For a recording with multiple releases, we should get them all. TEST_F(MusicBrainzClientTest, ParseTrackWithMultipleReleases) { QByteArray data = ReadDataFromFile(":testdata/recording_with_multiple_releases.xml"); ASSERT_FALSE(data.isEmpty()); const int expected_number_of_releases = 7; // Create a MusicBrainzClient instance with mock_network_. MusicBrainzClient musicbrainz_client(nullptr, mock_network_.get()); // Hook the data as the response to a query of a given type. QMap params; params["inc"] = "artists+releases+media"; MockNetworkReply* discid_reply = mock_network_->ExpectGet("recording", params, 200, data); QSignalSpy spy(&musicbrainz_client, SIGNAL(Finished(int, const MusicBrainzClient::ResultList&))); ASSERT_TRUE(spy.isValid()); EXPECT_EQ(0, spy.count()); // Start the request and get a result. // The mbid argument doesn't matter in the test. const int sent_id = 0; musicbrainz_client.Start(sent_id, QStringList() << "fooMbid"); discid_reply->Done(); QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); EXPECT_EQ(1, spy.count()); QList result = spy.takeFirst(); int id = result.takeFirst().toInt(); EXPECT_EQ(sent_id, id); ResultList tracks = result.takeFirst().value(); EXPECT_EQ(expected_number_of_releases, tracks.count()); } clementine-1.2.3+git1354-gdaddbde+dfsg/tests/organisedialog_test.cpp000066400000000000000000000043161260417502300252670ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2014, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "gtest/gtest.h" #include "test_utils.h" #include "core/song.h" #include "core/organiseformat.h" #include "ui/organisedialog.h" TEST(OrganiseDialogTest, ComputeNewSongsFilenamesTest) { // Create some songs, with multiple similar songs SongList songs; { Song song; song.set_title("Test1"); song.set_album("Album"); songs << song; } // Empty song { Song song; song.set_basefilename("filename.mp3"); songs << song; } // Without extension for (int i = 0; i < 2; i++) { Song song; song.set_title("Test2"); song.set_url(QUrl("file://test" + QString::number(i))); songs << song; } // With file extension for (int i = 0; i < 3; i++) { Song song; song.set_artist("Foo"); song.set_title("Bar"); song.set_url(QUrl("file://foobar" + QString::number(i) + ".mp3")); songs << song; } // Generate new filenames OrganiseFormat format; format.set_format(OrganiseDialog::kDefaultFormat); Organise::NewSongInfoList new_songs_info = OrganiseDialog::ComputeNewSongsFilenames(songs, format); EXPECT_EQ("/Album/Test1.", new_songs_info[0].new_filename_); EXPECT_EQ("//filename.mp3", new_songs_info[1].new_filename_); EXPECT_EQ("//Test2.", new_songs_info[2].new_filename_); EXPECT_EQ("//Test2(2).", new_songs_info[3].new_filename_); EXPECT_EQ("Foo//Bar.mp3", new_songs_info[4].new_filename_); EXPECT_EQ("Foo//Bar(2).mp3", new_songs_info[5].new_filename_); EXPECT_EQ("Foo//Bar(3).mp3", new_songs_info[6].new_filename_); } clementine-1.2.3+git1354-gdaddbde+dfsg/tests/organiseformat_test.cpp000066400000000000000000000112021260417502300253100ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "gtest/gtest.h" #include "test_utils.h" #include "core/organiseformat.h" #include "core/timeconstants.h" #include class OrganiseFormatTest : public ::testing::Test { protected: OrganiseFormat format_; Song song_; }; TEST_F(OrganiseFormatTest, BasicReplace) { song_.set_album("album"); song_.set_albumartist("albumartist"); song_.set_artist("artist"); song_.set_bitrate(123); song_.set_bpm(4.56); song_.set_comment("comment"); song_.set_composer("composer"); song_.set_performer("performer"); song_.set_grouping("grouping"); song_.set_disc(789); song_.set_genre("genre"); song_.set_length_nanosec(987 * kNsecPerSec); song_.set_samplerate(654); song_.set_title("title"); song_.set_track(321); song_.set_year(2010); format_.set_format("%album %albumartist %bitrate %bpm %comment %composer " "%performer %grouping " "%disc %genre %length %samplerate %title %track %year"); ASSERT_TRUE(format_.IsValid()); EXPECT_EQ("album albumartist 123 4.56 comment composer performer grouping 789 genre 987 654 title 321 2010", format_.GetFilenameForSong(song_)); } TEST_F(OrganiseFormatTest, Extension) { song_.set_url(QUrl("file:///some/path/filename.mp3")); format_.set_format("%extension"); ASSERT_TRUE(format_.IsValid()); EXPECT_EQ("mp3", format_.GetFilenameForSong(song_)); } TEST_F(OrganiseFormatTest, ArtistInitial) { song_.set_artist("bob"); format_.set_format("%artistinitial"); ASSERT_TRUE(format_.IsValid()); EXPECT_EQ("B", format_.GetFilenameForSong(song_)); } TEST_F(OrganiseFormatTest, AlbumArtistInitial) { song_.set_albumartist("bob"); format_.set_format("%artistinitial"); ASSERT_TRUE(format_.IsValid()); EXPECT_EQ("B", format_.GetFilenameForSong(song_)); } TEST_F(OrganiseFormatTest, InvalidTag) { format_.set_format("%invalid"); EXPECT_FALSE(format_.IsValid()); } TEST_F(OrganiseFormatTest, Blocks) { format_.set_format("Before{Inside%year}After"); ASSERT_TRUE(format_.IsValid()); song_.set_year(-1); EXPECT_EQ("BeforeAfter", format_.GetFilenameForSong(song_)); song_.set_year(0); EXPECT_EQ("BeforeAfter", format_.GetFilenameForSong(song_)); song_.set_year(123); EXPECT_EQ("BeforeInside123After", format_.GetFilenameForSong(song_)); } TEST_F(OrganiseFormatTest, ReplaceSpaces) { song_.set_title("The Song Title"); format_.set_format("The Format String %title"); EXPECT_EQ("The Format String The Song Title", format_.GetFilenameForSong(song_)); format_.set_replace_spaces(true); EXPECT_EQ("The_Format_String_The_Song_Title", format_.GetFilenameForSong(song_)); } TEST_F(OrganiseFormatTest, ReplaceThe) { song_.set_title("The Title"); song_.set_artist("The Artist"); format_.set_format("%artist %title"); EXPECT_EQ("The Artist The Title", format_.GetFilenameForSong(song_)); format_.set_replace_the(true); EXPECT_EQ("Artist The Title", format_.GetFilenameForSong(song_)); } TEST_F(OrganiseFormatTest, ReplaceNonAscii) { song_.set_artist(QString::fromUtf8("Röyksopp")); format_.set_format("%artist"); EXPECT_EQ(QString::fromUtf8("Röyksopp"), format_.GetFilenameForSong(song_)); format_.set_replace_non_ascii(true); EXPECT_EQ("Royksopp", format_.GetFilenameForSong(song_)); song_.set_artist(QString::fromUtf8("Владимир Высоцкий")); EXPECT_EQ("________ ________", format_.GetFilenameForSong(song_)); } TEST_F(OrganiseFormatTest, TrackNumberPadding) { format_.set_format("%track"); song_.set_track(9); EXPECT_EQ("09", format_.GetFilenameForSong(song_)); song_.set_track(99); EXPECT_EQ("99", format_.GetFilenameForSong(song_)); song_.set_track(999); EXPECT_EQ("999", format_.GetFilenameForSong(song_)); song_.set_track(0); EXPECT_EQ("", format_.GetFilenameForSong(song_)); } TEST_F(OrganiseFormatTest, ReplaceSlashes) { format_.set_format("%title"); song_.set_title("foo/bar\\baz"); EXPECT_EQ("foo_bar_baz", format_.GetFilenameForSong(song_)); } clementine-1.2.3+git1354-gdaddbde+dfsg/tests/playlist_test.cpp000066400000000000000000000407661260417502300241520ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include #include "test_utils.h" #include "gtest/gtest.h" #include "library/libraryplaylistitem.h" #include "playlist/playlist.h" #include "mock_settingsprovider.h" #include "mock_playlistitem.h" #include #include using std::shared_ptr; using ::testing::Return; namespace { class PlaylistTest : public ::testing::Test { protected: PlaylistTest() : playlist_(nullptr, nullptr, nullptr, 1), sequence_(nullptr, new DummySettingsProvider) { } void SetUp() { playlist_.set_sequence(&sequence_); } MockPlaylistItem* MakeMockItem(const QString& title, const QString& artist = QString(), const QString& album = QString(), int length = 123) const { Song metadata; metadata.Init(title, artist, album, length); MockPlaylistItem* ret = new MockPlaylistItem; EXPECT_CALL(*ret, Metadata()) .WillRepeatedly(Return(metadata)); return ret; } shared_ptr MakeMockItemP( const QString& title, const QString& artist = QString(), const QString& album = QString(), int length = 123) const { return shared_ptr(MakeMockItem(title, artist, album, length)); } Playlist playlist_; PlaylistSequence sequence_; }; TEST_F(PlaylistTest, Basic) { EXPECT_EQ(0, playlist_.rowCount(QModelIndex())); } TEST_F(PlaylistTest, InsertItems) { MockPlaylistItem* item = MakeMockItem("Title", "Artist", "Album", 123); shared_ptr item_ptr(item); // Insert the item EXPECT_EQ(0, playlist_.rowCount(QModelIndex())); playlist_.InsertItems(PlaylistItemList() << item_ptr, -1); ASSERT_EQ(1, playlist_.rowCount(QModelIndex())); // Get the metadata EXPECT_EQ("Title", playlist_.data(playlist_.index(0, Playlist::Column_Title))); EXPECT_EQ("Artist", playlist_.data(playlist_.index(0, Playlist::Column_Artist))); EXPECT_EQ("Album", playlist_.data(playlist_.index(0, Playlist::Column_Album))); EXPECT_EQ(123, playlist_.data(playlist_.index(0, Playlist::Column_Length))); } TEST_F(PlaylistTest, Indexes) { playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("One") << MakeMockItemP("Two") << MakeMockItemP("Three")); ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); // Start "playing" track 1 playlist_.set_current_row(0); EXPECT_EQ(0, playlist_.current_row()); EXPECT_EQ("One", playlist_.current_item()->Metadata().title()); EXPECT_EQ(-1, playlist_.previous_row()); EXPECT_EQ(1, playlist_.next_row()); // Stop playing EXPECT_EQ(0, playlist_.last_played_row()); playlist_.set_current_row(-1); EXPECT_EQ(0, playlist_.last_played_row()); EXPECT_EQ(-1, playlist_.current_row()); // Play track 2 playlist_.set_current_row(1); EXPECT_EQ(1, playlist_.current_row()); EXPECT_EQ("Two", playlist_.current_item()->Metadata().title()); EXPECT_EQ(0, playlist_.previous_row()); EXPECT_EQ(2, playlist_.next_row()); // Play track 3 playlist_.set_current_row(2); EXPECT_EQ(2, playlist_.current_row()); EXPECT_EQ("Three", playlist_.current_item()->Metadata().title()); EXPECT_EQ(1, playlist_.previous_row()); EXPECT_EQ(-1, playlist_.next_row()); } TEST_F(PlaylistTest, RepeatPlaylist) { playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("One") << MakeMockItemP("Two") << MakeMockItemP("Three")); ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); playlist_.sequence()->SetRepeatMode(PlaylistSequence::Repeat_Playlist); playlist_.set_current_row(0); EXPECT_EQ(1, playlist_.next_row()); playlist_.set_current_row(1); EXPECT_EQ(2, playlist_.next_row()); playlist_.set_current_row(2); EXPECT_EQ(0, playlist_.next_row()); } TEST_F(PlaylistTest, RepeatTrack) { playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("One") << MakeMockItemP("Two") << MakeMockItemP("Three")); ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); playlist_.sequence()->SetRepeatMode(PlaylistSequence::Repeat_Track); playlist_.set_current_row(0); EXPECT_EQ(0, playlist_.next_row()); } TEST_F(PlaylistTest, RepeatAlbum) { playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("One", "Album one") << MakeMockItemP("Two", "Album two") << MakeMockItemP("Three", "Album one")); ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); playlist_.sequence()->SetRepeatMode(PlaylistSequence::Repeat_Album); playlist_.set_current_row(0); EXPECT_EQ(2, playlist_.next_row()); playlist_.set_current_row(2); EXPECT_EQ(0, playlist_.next_row()); } TEST_F(PlaylistTest, RemoveBeforeCurrent) { playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("One") << MakeMockItemP("Two") << MakeMockItemP("Three")); ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); // Remove a row before the currently playing track playlist_.set_current_row(2); EXPECT_EQ(2, playlist_.current_row()); playlist_.removeRow(1, QModelIndex()); EXPECT_EQ(1, playlist_.current_row()); EXPECT_EQ(1, playlist_.last_played_row()); EXPECT_EQ(0, playlist_.previous_row()); EXPECT_EQ(-1, playlist_.next_row()); } TEST_F(PlaylistTest, RemoveAfterCurrent) { playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("One") << MakeMockItemP("Two") << MakeMockItemP("Three")); ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); // Remove a row after the currently playing track playlist_.set_current_row(0); EXPECT_EQ(0, playlist_.current_row()); playlist_.removeRow(1, QModelIndex()); EXPECT_EQ(0, playlist_.current_row()); EXPECT_EQ(0, playlist_.last_played_row()); EXPECT_EQ(-1, playlist_.previous_row()); EXPECT_EQ(1, playlist_.next_row()); playlist_.set_current_row(1); EXPECT_EQ(-1, playlist_.next_row()); } TEST_F(PlaylistTest, RemoveCurrent) { playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("One") << MakeMockItemP("Two") << MakeMockItemP("Three")); ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); // Remove the currently playing track's row playlist_.set_current_row(1); EXPECT_EQ(1, playlist_.current_row()); playlist_.removeRow(1, QModelIndex()); EXPECT_EQ(-1, playlist_.current_row()); EXPECT_EQ(-1, playlist_.last_played_row()); EXPECT_EQ(-1, playlist_.previous_row()); EXPECT_EQ(0, playlist_.next_row()); } TEST_F(PlaylistTest, InsertBeforeCurrent) { playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("One") << MakeMockItemP("Two") << MakeMockItemP("Three")); ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); playlist_.set_current_row(1); EXPECT_EQ(1, playlist_.current_row()); playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("Four"), 0); ASSERT_EQ(4, playlist_.rowCount(QModelIndex())); EXPECT_EQ(2, playlist_.current_row()); EXPECT_EQ(2, playlist_.last_played_row()); EXPECT_EQ(1, playlist_.previous_row()); EXPECT_EQ(3, playlist_.next_row()); EXPECT_EQ("Four", playlist_.data(playlist_.index(0, Playlist::Column_Title))); EXPECT_EQ("One", playlist_.data(playlist_.index(1, Playlist::Column_Title))); } TEST_F(PlaylistTest, InsertAfterCurrent) { playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("One") << MakeMockItemP("Two") << MakeMockItemP("Three")); ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); playlist_.set_current_row(1); EXPECT_EQ(1, playlist_.current_row()); playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("Four"), 2); ASSERT_EQ(4, playlist_.rowCount(QModelIndex())); EXPECT_EQ(1, playlist_.current_row()); EXPECT_EQ(1, playlist_.last_played_row()); EXPECT_EQ(0, playlist_.previous_row()); EXPECT_EQ(2, playlist_.next_row()); EXPECT_EQ("Two", playlist_.data(playlist_.index(1, Playlist::Column_Title))); EXPECT_EQ("Four", playlist_.data(playlist_.index(2, Playlist::Column_Title))); EXPECT_EQ("Three", playlist_.data(playlist_.index(3, Playlist::Column_Title))); } TEST_F(PlaylistTest, Clear) { playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("One") << MakeMockItemP("Two") << MakeMockItemP("Three")); ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); playlist_.set_current_row(1); EXPECT_EQ(1, playlist_.current_row()); playlist_.Clear(); EXPECT_EQ(0, playlist_.rowCount(QModelIndex())); EXPECT_EQ(-1, playlist_.current_row()); EXPECT_EQ(-1, playlist_.last_played_row()); EXPECT_EQ(-1, playlist_.previous_row()); EXPECT_EQ(-1, playlist_.next_row()); } TEST_F(PlaylistTest, UndoAdd) { EXPECT_FALSE(playlist_.undo_stack()->canUndo()); EXPECT_FALSE(playlist_.undo_stack()->canRedo()); playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("Title")); EXPECT_EQ(1, playlist_.rowCount(QModelIndex())); EXPECT_FALSE(playlist_.undo_stack()->canRedo()); ASSERT_TRUE(playlist_.undo_stack()->canUndo()); playlist_.undo_stack()->undo(); EXPECT_EQ(0, playlist_.rowCount(QModelIndex())); EXPECT_FALSE(playlist_.undo_stack()->canUndo()); ASSERT_TRUE(playlist_.undo_stack()->canRedo()); playlist_.undo_stack()->redo(); EXPECT_EQ(1, playlist_.rowCount(QModelIndex())); EXPECT_FALSE(playlist_.undo_stack()->canRedo()); EXPECT_TRUE(playlist_.undo_stack()->canUndo()); EXPECT_EQ("Title", playlist_.data(playlist_.index(0, Playlist::Column_Title))); } TEST_F(PlaylistTest, UndoMultiAdd) { // Add 1 item playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("One")); // Add 2 items playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("Two") << MakeMockItemP("Three")); // Undo adding 2 items ASSERT_TRUE(playlist_.undo_stack()->canUndo()); EXPECT_EQ("add 2 songs", playlist_.undo_stack()->undoText()); playlist_.undo_stack()->undo(); // Undo adding 1 item ASSERT_TRUE(playlist_.undo_stack()->canUndo()); EXPECT_EQ("add 1 songs", playlist_.undo_stack()->undoText()); playlist_.undo_stack()->undo(); EXPECT_FALSE(playlist_.undo_stack()->canUndo()); } TEST_F(PlaylistTest, UndoRemove) { EXPECT_FALSE(playlist_.undo_stack()->canUndo()); EXPECT_FALSE(playlist_.undo_stack()->canRedo()); playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("Title")); playlist_.removeRow(0); EXPECT_EQ(0, playlist_.rowCount(QModelIndex())); EXPECT_FALSE(playlist_.undo_stack()->canRedo()); ASSERT_TRUE(playlist_.undo_stack()->canUndo()); playlist_.undo_stack()->undo(); EXPECT_EQ(1, playlist_.rowCount(QModelIndex())); ASSERT_TRUE(playlist_.undo_stack()->canRedo()); EXPECT_EQ("Title", playlist_.data(playlist_.index(0, Playlist::Column_Title))); playlist_.undo_stack()->redo(); EXPECT_EQ(0, playlist_.rowCount(QModelIndex())); EXPECT_FALSE(playlist_.undo_stack()->canRedo()); EXPECT_TRUE(playlist_.undo_stack()->canUndo()); } TEST_F(PlaylistTest, UndoMultiRemove) { // Add 3 items playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("One") << MakeMockItemP("Two") << MakeMockItemP("Three")); ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); // Remove 1 item playlist_.removeRow(1); // Item "Two" // Remove 2 items playlist_.removeRows(0, 2); // "One" and "Three" ASSERT_EQ(0, playlist_.rowCount(QModelIndex())); // Undo removing all 3 items ASSERT_TRUE(playlist_.undo_stack()->canUndo()); EXPECT_EQ("remove 3 songs", playlist_.undo_stack()->undoText()); playlist_.undo_stack()->undo(); ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); } TEST_F(PlaylistTest, UndoClear) { playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("One") << MakeMockItemP("Two") << MakeMockItemP("Three")); ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); playlist_.Clear(); ASSERT_EQ(0, playlist_.rowCount(QModelIndex())); ASSERT_TRUE(playlist_.undo_stack()->canUndo()); EXPECT_EQ("remove 3 songs", playlist_.undo_stack()->undoText()); playlist_.undo_stack()->undo(); ASSERT_EQ(3, playlist_.rowCount(QModelIndex())); } TEST_F(PlaylistTest, UndoRemoveCurrent) { playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("Title")); playlist_.set_current_row(0); EXPECT_EQ(0, playlist_.current_row()); EXPECT_EQ(0, playlist_.last_played_row()); playlist_.removeRow(0); EXPECT_EQ(-1, playlist_.current_row()); EXPECT_EQ(-1, playlist_.last_played_row()); playlist_.undo_stack()->undo(); EXPECT_EQ(0, playlist_.current_row()); EXPECT_EQ(0, playlist_.last_played_row()); } TEST_F(PlaylistTest, UndoRemoveOldCurrent) { playlist_.InsertItems(PlaylistItemList() << MakeMockItemP("Title")); playlist_.set_current_row(0); EXPECT_EQ(0, playlist_.current_row()); EXPECT_EQ(0, playlist_.last_played_row()); playlist_.removeRow(0); EXPECT_EQ(-1, playlist_.current_row()); EXPECT_EQ(-1, playlist_.last_played_row()); playlist_.set_current_row(-1); playlist_.undo_stack()->undo(); EXPECT_EQ(0, playlist_.current_row()); EXPECT_EQ(0, playlist_.last_played_row()); } TEST_F(PlaylistTest, ShuffleThenNext) { // Add 100 items PlaylistItemList items; for (int i=0 ; i<100 ; ++i) items << MakeMockItemP("Item " + QString::number(i)); playlist_.InsertItems(items); playlist_.set_current_row(0); // Shuffle until the current index is not at the end forever { playlist_.Shuffle(); if (playlist_.current_row() != items.count()-1) break; } int index = playlist_.current_row(); EXPECT_EQ("Item 0", playlist_.current_item()->Metadata().title()); EXPECT_EQ("Item 0", playlist_.data(playlist_.index(index, Playlist::Column_Title))); EXPECT_EQ(index, playlist_.last_played_row()); EXPECT_EQ(index + 1, playlist_.next_row()); // Shuffle until the current index *is* at the end forever { playlist_.Shuffle(); if (playlist_.current_row() == items.count()-1) break; } index = playlist_.current_row(); EXPECT_EQ("Item 0", playlist_.current_item()->Metadata().title()); EXPECT_EQ("Item 0", playlist_.data(playlist_.index(index, Playlist::Column_Title))); EXPECT_EQ(index, playlist_.last_played_row()); EXPECT_EQ(-1, playlist_.next_row()); EXPECT_EQ(index-1, playlist_.previous_row()); } TEST_F(PlaylistTest, LibraryIdMapSingle) { Song song; song.Init("title", "artist", "album", 123); song.set_id(1); PlaylistItemPtr item(new LibraryPlaylistItem(song)); playlist_.InsertItems(PlaylistItemList() << item); EXPECT_EQ(0, playlist_.library_items_by_id(-1).count()); EXPECT_EQ(0, playlist_.library_items_by_id(0).count()); EXPECT_EQ(0, playlist_.library_items_by_id(2).count()); ASSERT_EQ(1, playlist_.library_items_by_id(1).count()); EXPECT_EQ(song.title(), playlist_.library_items_by_id(1)[0]->Metadata().title()); playlist_.Clear(); EXPECT_EQ(0, playlist_.library_items_by_id(1).count()); } TEST_F(PlaylistTest, LibraryIdMapInvalid) { Song invalid; invalid.Init("title", "artist", "album", 123); ASSERT_EQ(-1, invalid.id()); PlaylistItemPtr item(new LibraryPlaylistItem(invalid)); playlist_.InsertItems(PlaylistItemList() << item); EXPECT_EQ(0, playlist_.library_items_by_id(-1).count()); EXPECT_EQ(0, playlist_.library_items_by_id(0).count()); EXPECT_EQ(0, playlist_.library_items_by_id(1).count()); EXPECT_EQ(0, playlist_.library_items_by_id(2).count()); } TEST_F(PlaylistTest, LibraryIdMapMulti) { Song one; one.Init("title", "artist", "album", 123); one.set_id(1); Song two; two.Init("title 2", "artist 2", "album 2", 123); two.set_id(2); PlaylistItemPtr item_one(new LibraryPlaylistItem(one)); PlaylistItemPtr item_two(new LibraryPlaylistItem(two)); PlaylistItemPtr item_three(new LibraryPlaylistItem(one)); playlist_.InsertItems(PlaylistItemList() << item_one << item_two << item_three); EXPECT_EQ(2, playlist_.library_items_by_id(1).count()); EXPECT_EQ(1, playlist_.library_items_by_id(2).count()); playlist_.removeRow(1); // item_two EXPECT_EQ(2, playlist_.library_items_by_id(1).count()); EXPECT_EQ(0, playlist_.library_items_by_id(2).count()); playlist_.removeRow(1); // item_three EXPECT_EQ(1, playlist_.library_items_by_id(1).count()); EXPECT_EQ(0, playlist_.library_items_by_id(2).count()); playlist_.removeRow(0); // item_one EXPECT_EQ(0, playlist_.library_items_by_id(1).count()); EXPECT_EQ(0, playlist_.library_items_by_id(2).count()); } } // namespace clementine-1.2.3+git1354-gdaddbde+dfsg/tests/plsparser_test.cpp000066400000000000000000000106301260417502300243070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include #include "test_utils.h" #include "gtest/gtest.h" #include "core/timeconstants.h" #include "playlistparsers/plsparser.h" #include #include #include #include #include using std::shared_ptr; class PLSParserTest : public ::testing::Test { protected: PLSParserTest() : parser_(nullptr) {} shared_ptr Open(const QString& filename) { shared_ptr ret(new QFile(":/testdata/" + filename)); if (!ret->open(QIODevice::ReadOnly)) ret.reset(); return ret; } PLSParser parser_; }; TEST_F(PLSParserTest, ParseOneTrack) { shared_ptr file(Open("pls_one.pls")); SongList songs = parser_.Load(file.get(), "", QDir("/relative/to/")); ASSERT_EQ(1, songs.length()); EXPECT_EQ(QUrl("file:///relative/to/filename with spaces.mp3"), songs[0].url()); EXPECT_EQ("Title", songs[0].title()); EXPECT_EQ(123 * kNsecPerSec, songs[0].length_nanosec()); } TEST_F(PLSParserTest, ParseSomaFM) { shared_ptr file(Open("pls_somafm.pls")); SongList songs = parser_.Load(file.get()); ASSERT_EQ(4, songs.length()); EXPECT_EQ(QUrl("http://streamer-dtc-aa05.somafm.com:80/stream/1018"), songs[0].url()); EXPECT_EQ(QUrl("http://streamer-mtc-aa03.somafm.com:80/stream/1018"), songs[1].url()); EXPECT_EQ(QUrl("http://streamer-ntc-aa04.somafm.com:80/stream/1018"), songs[2].url()); EXPECT_EQ(QUrl("http://ice.somafm.com/groovesalad"), songs[3].url()); EXPECT_EQ("SomaFM: Groove Salad (#1 128k mp3): A nicely chilled plate of ambient beats and grooves.", songs[0].title()); EXPECT_EQ("SomaFM: Groove Salad (#2 128k mp3): A nicely chilled plate of ambient beats and grooves.", songs[1].title()); EXPECT_EQ("SomaFM: Groove Salad (#3 128k mp3): A nicely chilled plate of ambient beats and grooves.", songs[2].title()); EXPECT_EQ(-1, songs[0].length_nanosec()); EXPECT_TRUE(songs[0].is_stream()); } TEST_F(PLSParserTest, ParseSomaFM2) { shared_ptr file(Open("secretagent.pls")); SongList songs = parser_.Load(file.get()); ASSERT_EQ(4, songs.length()); EXPECT_EQ(QUrl("http://streamer-ntc-aa03.somafm.com:80/stream/1021"), songs[0].url()); EXPECT_EQ(QUrl("http://streamer-mtc-aa04.somafm.com:80/stream/1021"), songs[1].url()); EXPECT_EQ(QUrl("http://streamer-dtc-aa05.somafm.com:80/stream/1021"), songs[2].url()); EXPECT_EQ(QUrl("http://ice.somafm.com/secretagent"), songs[3].url()); EXPECT_EQ("SomaFM: Secret Agent (#1 128k mp3): The soundtrack for your stylish, mysterious, dangerous life. For Spies and PIs too!", songs[0].title()); EXPECT_EQ("SomaFM: Secret Agent (#2 128k mp3): The soundtrack for your stylish, mysterious, dangerous life. For Spies and PIs too!", songs[1].title()); EXPECT_EQ("SomaFM: Secret Agent (#3 128k mp3): The soundtrack for your stylish, mysterious, dangerous life. For Spies and PIs too!", songs[2].title()); EXPECT_EQ(-1, songs[0].length_nanosec()); EXPECT_TRUE(songs[0].is_stream()); } TEST_F(PLSParserTest, SaveAndLoad) { Song one; one.set_url(QUrl("http://www.example.com/foo.mp3")); one.set_title("Foo, with, some, commas"); Song two; two.set_url(QUrl("relative/bar.mp3")); two.set_title("Bar"); two.set_length_nanosec(123 * kNsecPerSec); SongList songs; songs << one << two; QTemporaryFile temp; temp.open(); parser_.Save(songs, &temp); temp.seek(0); songs = parser_.Load(&temp, "", QDir("/meep")); ASSERT_EQ(2, songs.count()); EXPECT_EQ(one.url(), songs[0].url()); EXPECT_EQ(QUrl("file:///meep/relative/bar.mp3"), songs[1].url()); EXPECT_EQ(one.title(), songs[0].title()); EXPECT_EQ(two.title(), songs[1].title()); EXPECT_EQ(one.length_nanosec(), songs[0].length_nanosec()); EXPECT_EQ(two.length_nanosec(), songs[1].length_nanosec()); } clementine-1.2.3+git1354-gdaddbde+dfsg/tests/resources_env.h000066400000000000000000000020221260417502300235600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef RESOURCES_ENV_H #define RESOURCES_ENV_H #include #include class ResourcesEnvironment : public ::testing::Environment { public: void SetUp() { Q_INIT_RESOURCE(data); Q_INIT_RESOURCE(translations); Q_INIT_RESOURCE(testdata); } }; #endif // RESOURCES_ENV_H clementine-1.2.3+git1354-gdaddbde+dfsg/tests/scopedtransaction_test.cpp000066400000000000000000000046331260417502300260250ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "test_utils.h" #include "gtest/gtest.h" #include "core/scopedtransaction.h" #include #include #include #include #include namespace { class ScopedTransactionTest : public ::testing::Test { protected: void SetUp() { database_ = QSqlDatabase::addDatabase("QSQLITE"); database_.setDatabaseName(":memory:"); ASSERT_TRUE(database_.open()); } void TearDown() { // Make sure Qt does not re-use the connection. QString name = database_.connectionName(); database_ = QSqlDatabase(); QSqlDatabase::removeDatabase(name); } QSqlDatabase database_; }; TEST_F(ScopedTransactionTest, OpensATransaction) { // False because there is no transaction to roll back EXPECT_FALSE(database_.rollback()); ScopedTransaction t(&database_); // There should now be a transaction EXPECT_TRUE(database_.rollback()); } TEST_F(ScopedTransactionTest, RollbackOnDtor) { database_.exec("CREATE TABLE foo (bar INTEGER)"); { ScopedTransaction t(&database_); database_.exec("INSERT INTO foo (bar) VALUES (42)"); QSqlQuery q("SELECT * FROM foo", database_); ASSERT_TRUE(q.exec()); ASSERT_TRUE(q.next()); EXPECT_EQ(42, q.value(0).toInt()); } QSqlQuery q("SELECT * FROM foo", database_); ASSERT_TRUE(q.exec()); ASSERT_FALSE(q.next()); } TEST_F(ScopedTransactionTest, Commit) { database_.exec("CREATE TABLE foo (bar INTEGER)"); { ScopedTransaction t(&database_); database_.exec("INSERT INTO foo (bar) VALUES (42)"); t.Commit(); } QSqlQuery q("SELECT * FROM foo", database_); ASSERT_TRUE(q.exec()); ASSERT_TRUE(q.next()); EXPECT_EQ(42, q.value(0).toInt()); } } // namespace clementine-1.2.3+git1354-gdaddbde+dfsg/tests/song_test.cpp000066400000000000000000000270731260417502300232530ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "config.h" #include "tagreader.h" #include "core/song.h" #ifdef HAVE_LIBLASTFM #include "internet/lastfm/lastfmcompat.h" #endif #include "gmock/gmock.h" #include "gtest/gtest.h" #include "test_utils.h" #include #include #include #include namespace { class SongTest : public ::testing::Test { protected: static void SetUpTestCase() { // Return something from uninteresting mock functions. testing::DefaultValue::Set("foobarbaz"); } static Song ReadSongFromFile(const QString& filename) { TagReader tag_reader; Song song; ::pb::tagreader::SongMetadata pb_song; // We need to init protobuf object from a Song object, to have default // values initialized correctly. For example, Song's rating is -1 by // default: using protobuf directly would lead to 0 by default, which is not // what we want. song.ToProtobuf(&pb_song); tag_reader.ReadFile(filename, &pb_song); song.InitFromProtobuf(pb_song); return song; } static void WriteSongToFile(const Song& song, const QString& filename) { TagReader tag_reader; ::pb::tagreader::SongMetadata pb_song; song.ToProtobuf(&pb_song); tag_reader.SaveFile(filename, pb_song); } static void WriteSongStatisticsToFile(const Song& song, const QString& filename) { TagReader tag_reader; ::pb::tagreader::SongMetadata pb_song; song.ToProtobuf(&pb_song); tag_reader.SaveSongStatisticsToFile(filename, pb_song); } static void WriteSongRatingToFile(const Song& song, const QString& filename) { TagReader tag_reader; ::pb::tagreader::SongMetadata pb_song; song.ToProtobuf(&pb_song); tag_reader.SaveSongRatingToFile(filename, pb_song); } }; #ifdef HAVE_LIBLASTFM TEST_F(SongTest, InitsFromLastFM) { Song song; lastfm::MutableTrack track; track.setTitle("Foo"); lastfm::Artist artist("Bar"); track.setArtist(artist); lastfm::Album album(artist, "Baz"); track.setAlbum(album); song.InitFromLastFM(track); EXPECT_EQ("Foo", song.title()); EXPECT_EQ("Baz", song.album()); EXPECT_EQ("Bar", song.artist()); } #endif // HAVE_LIBLASTFM /*TEST_F(SongTest, InitsFromFile) { QTemporaryFile temp; temp.open(); mock_factory_.ExpectCall(temp.fileName(), "Foo", "Bar", "Baz"); Song song(&mock_factory_); song.InitFromFile(temp.fileName(), 42); EXPECT_EQ("Foo", song.title()); EXPECT_EQ("Bar", song.artist()); EXPECT_EQ("Baz", song.album()); }*/ TEST_F(SongTest, FMPSRating) { TemporaryResource r(":/testdata/fmpsrating.mp3"); Song song = ReadSongFromFile(r.fileName()); EXPECT_FLOAT_EQ(0.42, song.rating()); } TEST_F(SongTest, FMPSRatingUser) { TemporaryResource r(":/testdata/fmpsratinguser.mp3"); Song song = ReadSongFromFile(r.fileName()); EXPECT_FLOAT_EQ(0.10, song.rating()); song.set_rating(0.20); WriteSongRatingToFile(song, r.fileName()); Song new_song = ReadSongFromFile(r.fileName()); EXPECT_FLOAT_EQ(0.20, new_song.rating()); } TEST_F(SongTest, FMPSRatingBoth) { TemporaryResource r(":/testdata/fmpsratingboth.mp3"); Song song = ReadSongFromFile(r.fileName()); EXPECT_FLOAT_EQ(0.42, song.rating()); } TEST_F(SongTest, FMPSPlayCount) { TemporaryResource r(":/testdata/fmpsplaycount.mp3"); Song song = ReadSongFromFile(r.fileName()); EXPECT_EQ(123, song.playcount()); song.set_playcount(69); WriteSongStatisticsToFile(song, r.fileName()); Song new_song = ReadSongFromFile(r.fileName()); EXPECT_EQ(69, new_song.playcount()); } TEST_F(SongTest, FMPSPlayCountUser) { TemporaryResource r(":/testdata/fmpsplaycountuser.mp3"); Song song = ReadSongFromFile(r.fileName()); EXPECT_EQ(42, song.playcount()); } TEST_F(SongTest, FMPSPlayCountBoth) { TemporaryResource r(":/testdata/fmpsplaycountboth.mp3"); Song song = ReadSongFromFile(r.fileName()); EXPECT_EQ(123, song.playcount()); } TEST_F(SongTest, FMPSUnrated) { QStringList files_to_test; files_to_test << ":/testdata/beep.m4a" << ":/testdata/beep.mp3" << ":/testdata/beep.flac" << ":/testdata/beep.ogg" << ":/testdata/beep.spx" << ":/testdata/beep.wav" << ":/testdata/beep.wma"; for (const QString& test_filename : files_to_test) { TemporaryResource r(test_filename); Song song = ReadSongFromFile(r.fileName()); // beep files don't contain rating info, so they should be considered as // "unrated" i.e. rating == -1 EXPECT_EQ(-1, song.rating()); // Writing -1 i.e. "unrated" to a file shouldn't write anything WriteSongRatingToFile(song, r.fileName()); // Compare files QFile orig_file(test_filename); orig_file.open(QIODevice::ReadOnly); QByteArray orig_file_data = orig_file.readAll(); QFile temp_file(r.fileName()); temp_file.open(QIODevice::ReadOnly); QByteArray temp_file_data = temp_file.readAll(); EXPECT_TRUE(!orig_file_data.isEmpty()); EXPECT_TRUE(!temp_file_data.isEmpty()); EXPECT_TRUE(orig_file_data == temp_file_data); } } TEST_F(SongTest, FMPSScore) { TemporaryResource r(":/testdata/beep.mp3"); { Song song = ReadSongFromFile(r.fileName()); song.set_score(87); WriteSongStatisticsToFile(song, r.fileName()); } Song new_song = ReadSongFromFile(r.fileName()); EXPECT_EQ(87, new_song.score()); } TEST_F(SongTest, POPMRating) { TemporaryResource r(":/testdata/popmrating.mp3"); Song song = ReadSongFromFile(r.fileName()); EXPECT_FLOAT_EQ(0.60, song.rating()); } TEST_F(SongTest, BothFMPSPOPMRating) { // fmpspopmrating.mp3 contains FMPS with rating 0.42 and POPM with 0x80 // (corresponds to 0.60 rating for us): check that FMPS tag has precedence TemporaryResource r(":/testdata/fmpspopmrating.mp3"); Song song = ReadSongFromFile(r.fileName()); EXPECT_FLOAT_EQ(0.42, song.rating()); } TEST_F(SongTest, RatingOgg) { TemporaryResource r(":/testdata/beep.ogg"); { Song song = ReadSongFromFile(r.fileName()); song.set_rating(0.20); WriteSongRatingToFile(song, r.fileName()); } Song new_song = ReadSongFromFile(r.fileName()); EXPECT_FLOAT_EQ(0.20, new_song.rating()); } TEST_F(SongTest, StatisticsOgg) { TemporaryResource r(":/testdata/beep.ogg"); { Song song = ReadSongFromFile(r.fileName()); song.set_playcount(1337); song.set_score(87); WriteSongStatisticsToFile(song, r.fileName()); } Song new_song = ReadSongFromFile(r.fileName()); EXPECT_EQ(1337, new_song.playcount()); EXPECT_EQ(87, new_song.score()); } TEST_F(SongTest, TagsOgg) { TemporaryResource r(":/testdata/beep.ogg"); { Song song = ReadSongFromFile(r.fileName()); song.set_title("beep title"); song.set_artist("beep artist"); song.set_album("beep album"); song.set_albumartist("beep album artist"); song.set_composer("beep composer"); song.set_performer("beep performer"); song.set_grouping("beep grouping"); song.set_genre("beep genre"); song.set_comment("beep comment"); song.set_track(12); song.set_disc(1234); song.set_year(2015); WriteSongToFile(song, r.fileName()); } Song new_song = ReadSongFromFile(r.fileName()); EXPECT_EQ("beep title", new_song.title()); EXPECT_EQ("beep artist", new_song.artist()); EXPECT_EQ("beep album", new_song.album()); EXPECT_EQ("beep album artist", new_song.albumartist()); EXPECT_EQ("beep composer", new_song.composer()); EXPECT_EQ("beep performer", new_song.performer()); EXPECT_EQ("beep grouping", new_song.grouping()); EXPECT_EQ("beep genre", new_song.genre()); EXPECT_EQ("beep comment", new_song.comment()); EXPECT_EQ(12, new_song.track()); EXPECT_EQ(1234, new_song.disc()); EXPECT_EQ(2015, new_song.year()); } TEST_F(SongTest, RatingFLAC) { TemporaryResource r(":/testdata/beep.flac"); { Song song = ReadSongFromFile(r.fileName()); song.set_rating(0.20); WriteSongRatingToFile(song, r.fileName()); } Song new_song = ReadSongFromFile(r.fileName()); EXPECT_FLOAT_EQ(0.20, new_song.rating()); } TEST_F(SongTest, StatisticsFLAC) { TemporaryResource r(":/testdata/beep.flac"); { Song song = ReadSongFromFile(r.fileName()); song.set_playcount(1337); song.set_score(87); WriteSongStatisticsToFile(song, r.fileName()); } Song new_song = ReadSongFromFile(r.fileName()); EXPECT_EQ(1337, new_song.playcount()); EXPECT_EQ(87, new_song.score()); } TEST_F(SongTest, TagsFLAC) { TemporaryResource r(":/testdata/beep.flac"); { Song song = ReadSongFromFile(r.fileName()); song.set_title("beep title"); song.set_artist("beep artist"); song.set_album("beep album"); song.set_albumartist("beep album artist"); song.set_composer("beep composer"); song.set_performer("beep performer"); song.set_grouping("beep grouping"); song.set_genre("beep genre"); song.set_comment("beep comment"); song.set_track(12); song.set_disc(1234); song.set_year(2015); WriteSongToFile(song, r.fileName()); } Song new_song = ReadSongFromFile(r.fileName()); EXPECT_EQ("beep title", new_song.title()); EXPECT_EQ("beep artist", new_song.artist()); EXPECT_EQ("beep album", new_song.album()); EXPECT_EQ("beep album artist", new_song.albumartist()); EXPECT_EQ("beep composer", new_song.composer()); EXPECT_EQ("beep performer", new_song.performer()); EXPECT_EQ("beep grouping", new_song.grouping()); EXPECT_EQ("beep genre", new_song.genre()); EXPECT_EQ("beep comment", new_song.comment()); EXPECT_EQ(12, new_song.track()); EXPECT_EQ(1234, new_song.disc()); EXPECT_EQ(2015, new_song.year()); } #ifdef TAGLIB_WITH_ASF TEST_F(SongTest, RatingASF) { TemporaryResource r(":/testdata/beep.wma"); { Song song = ReadSongFromFile(r.fileName()); song.set_rating(0.20); WriteSongRatingToFile(song, r.fileName()); } Song new_song = ReadSongFromFile(r.fileName()); EXPECT_FLOAT_EQ(0.20, new_song.rating()); } TEST_F(SongTest, StatisticsASF) { TemporaryResource r(":/testdata/beep.wma"); { Song song = ReadSongFromFile(r.fileName()); song.set_playcount(1337); song.set_score(87); WriteSongStatisticsToFile(song, r.fileName()); } Song new_song = ReadSongFromFile(r.fileName()); EXPECT_EQ(1337, new_song.playcount()); EXPECT_EQ(87, new_song.score()); } #endif // TAGLIB_WITH_ASF TEST_F(SongTest, RatingMP4) { TemporaryResource r(":/testdata/beep.m4a"); { Song song = ReadSongFromFile(r.fileName()); song.set_rating(0.20); WriteSongRatingToFile(song, r.fileName()); } Song new_song = ReadSongFromFile(r.fileName()); EXPECT_FLOAT_EQ(0.20, new_song.rating()); } TEST_F(SongTest, StatisticsMP4) { TemporaryResource r(":/testdata/beep.m4a"); { Song song = ReadSongFromFile(r.fileName()); song.set_playcount(1337); song.set_score(87); WriteSongStatisticsToFile(song, r.fileName()); } Song new_song = ReadSongFromFile(r.fileName()); EXPECT_EQ(1337, new_song.playcount()); EXPECT_EQ(87, new_song.score()); } } // namespace clementine-1.2.3+git1354-gdaddbde+dfsg/tests/songloader_test.cpp000066400000000000000000000254121260417502300244350ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include #include #include #include #include #include #include #include "test_utils.h" #include "gmock/gmock-matchers.h" #include "gtest/gtest.h" #include "mock_librarybackend.h" #include "core/songloader.h" #include "engines/gstengine.h" using ::testing::_; using ::testing::Return; class SongLoaderTest : public ::testing::Test { public: static void SetUpTestCase() { sGstEngine = new GstEngine; ASSERT_TRUE(sGstEngine->Init()); sGstEngine->EnsureInitialised(); } static void TearDownTestCase() { delete sGstEngine; sGstEngine = nullptr; } protected: void SetUp() { library_.reset(new MockLibraryBackend); loader_.reset(new SongLoader(library_.get(), nullptr)); loader_->set_timeout(20000); // the thing we return is not really important EXPECT_CALL(*library_.get(), GetSongByUrl(_, _)).WillRepeatedly(Return(Song())); } void LoadLocalDirectory(const QString& dir); static const char* kRemoteUrl; static GstEngine* sGstEngine; std::unique_ptr loader_; std::unique_ptr library_; }; const char* SongLoaderTest::kRemoteUrl = "http://remotetestdata.clementine-player.org"; GstEngine* SongLoaderTest::sGstEngine = nullptr; TEST_F(SongLoaderTest, LoadLocalMp3) { TemporaryResource file(":/testdata/beep.mp3"); SongLoader::Result ret = loader_->Load(QUrl::fromLocalFile(file.fileName())); ASSERT_EQ(SongLoader::Success, ret); ASSERT_EQ(1, loader_->songs().count()); EXPECT_TRUE(loader_->songs()[0].is_valid()); EXPECT_EQ("Beep mp3", loader_->songs()[0].title()); } TEST_F(SongLoaderTest, LoadLocalFileQueryExecutesButEmpty) { EXPECT_CALL(*library_.get(), ExecQuery(_)).WillOnce(Return(true)); TemporaryResource file(":/testdata/beep.mp3"); SongLoader::Result ret = loader_->Load(QUrl::fromLocalFile(file.fileName())); ASSERT_EQ(SongLoader::Success, ret); ASSERT_EQ(1, loader_->songs().count()); EXPECT_TRUE(loader_->songs()[0].is_valid()); EXPECT_EQ("Beep mp3", loader_->songs()[0].title()); } TEST_F(SongLoaderTest, LoadLocalPls) { TemporaryResource file(":/testdata/pls_one.pls"); SongLoader::Result ret = loader_->Load(QUrl::fromLocalFile(file.fileName())); ASSERT_EQ(SongLoader::WillLoadAsync, ret); QSignalSpy spy(loader_.get(), SIGNAL(LoadFinished(bool))); // Start an event loop to wait for gstreamer to do its thing QEventLoop loop; QObject::connect(loader_.get(), SIGNAL(LoadFinished(bool)), &loop, SLOT(quit())); loop.exec(QEventLoop::ExcludeUserInputEvents); // Check the signal was emitted with Success ASSERT_EQ(1, spy.count()); EXPECT_EQ(true, spy[0][0].toBool()); // Check the song got loaded ASSERT_EQ(1, loader_->songs().count()); EXPECT_EQ("Title", loader_->songs()[0].title()); EXPECT_EQ(123 * kNsecPerSec, loader_->songs()[0].length_nanosec()); } TEST_F(SongLoaderTest, LoadLocalM3U) { TemporaryResource file(":/testdata/test.m3u"); SongLoader::Result ret = loader_->Load(QUrl::fromLocalFile(file.fileName())); QSignalSpy spy(loader_.get(), SIGNAL(LoadFinished(bool))); QEventLoop loop; QObject::connect(loader_.get(), SIGNAL(LoadFinished(bool)), &loop, SLOT(quit())); loop.exec(QEventLoop::ExcludeUserInputEvents); // Check the signal was emitted with Success ASSERT_EQ(1, spy.count()); EXPECT_EQ(true, spy[0][0].toBool()); ASSERT_EQ(SongLoader::WillLoadAsync, ret); ASSERT_EQ(239, loader_->songs().count()); } TEST_F(SongLoaderTest, LoadLocalXSPF) { TemporaryResource file(":/testdata/test.xspf"); SongLoader::Result ret = loader_->Load(QUrl::fromLocalFile(file.fileName())); QSignalSpy spy(loader_.get(), SIGNAL(LoadFinished(bool))); QEventLoop loop; QObject::connect(loader_.get(), SIGNAL(LoadFinished(bool)), &loop, SLOT(quit())); loop.exec(QEventLoop::ExcludeUserInputEvents); // Check the signal was emitted with Success ASSERT_EQ(1, spy.count()); EXPECT_EQ(true, spy[0][0].toBool()); ASSERT_EQ(SongLoader::WillLoadAsync, ret); ASSERT_EQ(1, loader_->songs().count()); EXPECT_EQ("Foo", loader_->songs()[0].title()); } TEST_F(SongLoaderTest, LoadLocalASX) { TemporaryResource file(":/testdata/test.asx"); SongLoader::Result ret = loader_->Load(QUrl::fromLocalFile(file.fileName())); QSignalSpy spy(loader_.get(), SIGNAL(LoadFinished(bool))); QEventLoop loop; QObject::connect(loader_.get(), SIGNAL(LoadFinished(bool)), &loop, SLOT(quit())); loop.exec(QEventLoop::ExcludeUserInputEvents); // Check the signal was emitted with Success ASSERT_EQ(1, spy.count()); EXPECT_EQ(true, spy[0][0].toBool()); ASSERT_EQ(SongLoader::WillLoadAsync, ret); ASSERT_EQ(1, loader_->songs().count()); EXPECT_EQ("Foo", loader_->songs()[0].title()); } TEST_F(SongLoaderTest, LoadRemoteMp3) { SongLoader::Result ret = loader_->Load(QString(kRemoteUrl) + "/beep.mp3"); ASSERT_EQ(SongLoader::WillLoadAsync, ret); QSignalSpy spy(loader_.get(), SIGNAL(LoadFinished(bool))); // Start an event loop to wait for gstreamer to do its thing QEventLoop loop; QObject::connect(loader_.get(), SIGNAL(LoadFinished(bool)), &loop, SLOT(quit())); loop.exec(QEventLoop::ExcludeUserInputEvents); // Check the signal was emitted with Success ASSERT_EQ(1, spy.count()); EXPECT_EQ(true, spy[0][0].toBool()); // Check the song got loaded ASSERT_EQ(1, loader_->songs().count()); EXPECT_EQ(QUrl(QString(kRemoteUrl) + "/beep.mp3"), loader_->songs()[0].url()); } TEST_F(SongLoaderTest, LoadRemote404) { SongLoader::Result ret = loader_->Load(QString(kRemoteUrl) + "/404.mp3"); ASSERT_EQ(SongLoader::WillLoadAsync, ret); QSignalSpy spy(loader_.get(), SIGNAL(LoadFinished(bool))); // Start an event loop to wait for gstreamer to do its thing QEventLoop loop; QObject::connect(loader_.get(), SIGNAL(LoadFinished(bool)), &loop, SLOT(quit())); loop.exec(QEventLoop::ExcludeUserInputEvents); // Check the signal was emitted with Error ASSERT_EQ(1, spy.count()); EXPECT_EQ(false, spy[0][0].toBool()); } TEST_F(SongLoaderTest, LoadRemotePls) { SongLoader::Result ret = loader_->Load(QString(kRemoteUrl) + "/pls_somafm.pls"); ASSERT_EQ(SongLoader::WillLoadAsync, ret); QSignalSpy spy(loader_.get(), SIGNAL(LoadFinished(bool))); // Start an event loop to wait for gstreamer to do its thing QEventLoop loop; QObject::connect(loader_.get(), SIGNAL(LoadFinished(bool)), &loop, SLOT(quit())); loop.exec(QEventLoop::ExcludeUserInputEvents); // Check the signal was emitted with Success ASSERT_EQ(1, spy.count()); EXPECT_EQ(true, spy[0][0].toBool()); // Check some metadata ASSERT_EQ(4, loader_->songs().count()); EXPECT_EQ("SomaFM: Groove Salad (#3 128k mp3): A nicely chilled plate of ambient beats and grooves.", loader_->songs()[2].title()); EXPECT_EQ(QUrl("http://ice.somafm.com/groovesalad"), loader_->songs()[3].url()); } TEST_F(SongLoaderTest, LoadRemotePlainText) { SongLoader::Result ret = loader_->Load(QString(kRemoteUrl) + "/notaplaylist.txt"); ASSERT_EQ(SongLoader::WillLoadAsync, ret); QSignalSpy spy(loader_.get(), SIGNAL(LoadFinished(bool))); // Start an event loop to wait for gstreamer to do its thing QEventLoop loop; QObject::connect(loader_.get(), SIGNAL(LoadFinished(bool)), &loop, SLOT(quit())); loop.exec(QEventLoop::ExcludeUserInputEvents); // Check the signal was emitted with Error ASSERT_EQ(1, spy.count()); EXPECT_EQ(false, spy[0][0].toBool()); } TEST_F(SongLoaderTest, LoadRemotePlainM3U) { SongLoader::Result ret = loader_->Load(QString(kRemoteUrl) + "/plainm3u.m3u"); ASSERT_EQ(SongLoader::WillLoadAsync, ret); QSignalSpy spy(loader_.get(), SIGNAL(LoadFinished(bool))); // Start an event loop to wait for gstreamer to do its thing QEventLoop loop; QObject::connect(loader_.get(), SIGNAL(LoadFinished(bool)), &loop, SLOT(quit())); loop.exec(QEventLoop::ExcludeUserInputEvents); // Check the signal was emitted with Success ASSERT_EQ(1, spy.count()); EXPECT_EQ(true, spy[0][0].toBool()); ASSERT_EQ(2, loader_->songs().count()); EXPECT_EQ(QUrl("http://www.example.com/one.mp3"), loader_->songs()[0].url()); EXPECT_EQ(QUrl("http://www.example.com/two.mp3"), loader_->songs()[1].url()); } TEST_F(SongLoaderTest, LoadLocalDirectory) { // Make a directory and shove some files in it QString dir; { QTemporaryFile ffffuuuuuuuu; ffffuuuuuuuu.open(); dir = ffffuuuuuuuu.fileName(); } QDir d; ASSERT_TRUE(d.mkdir(dir)); QFile resource(":/testdata/beep.mp3"); resource.open(QIODevice::ReadOnly); QByteArray data(resource.readAll()); // Write 3 MP3 files for (int i=0 ; i<3 ; ++i) { QFile mp3(QString("%1/%2.mp3").arg(dir).arg(i)); mp3.open(QIODevice::WriteOnly); mp3.write(data); } // And one file that isn't an MP3 QFile somethingelse(QString(dir) + "/somethingelse.foo"); somethingelse.open(QIODevice::WriteOnly); somethingelse.write("I'm not an MP3!"); somethingelse.close(); // The actual test happens in another function so we can always clean up if // it asserts LoadLocalDirectory(dir); QFile::remove(QString(dir) + "/0.mp3"); QFile::remove(QString(dir) + "/1.mp3"); QFile::remove(QString(dir) + "/2.mp3"); QFile::remove(QString(dir) + "/somethingelse.foo"); d.rmdir(dir); } void SongLoaderTest::LoadLocalDirectory(const QString &filename) { // Load the directory SongLoader::Result ret = loader_->Load(QUrl::fromLocalFile(filename)); ASSERT_EQ(SongLoader::WillLoadAsync, ret); QSignalSpy spy(loader_.get(), SIGNAL(LoadFinished(bool))); // Start an event loop to wait for it to read the directory QEventLoop loop; QObject::connect(loader_.get(), SIGNAL(LoadFinished(bool)), &loop, SLOT(quit())); loop.exec(QEventLoop::ExcludeUserInputEvents); loader_.get()->EffectiveSongsLoad(); // Check the signal was emitted with Success ASSERT_EQ(1, spy.count()); EXPECT_EQ(true, spy[0][0].toBool()); // Check it loaded three files ASSERT_EQ(3, loader_->songs().count()); EXPECT_EQ("Beep mp3", loader_->songs()[2].title()); } clementine-1.2.3+git1354-gdaddbde+dfsg/tests/songplaylistitem_test.cpp000066400000000000000000000037241260417502300257110ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include #include "playlist/songplaylistitem.h" #include "test_utils.h" #include #include #include #include namespace { class SongPlaylistItemTest : public ::testing::TestWithParam { protected: SongPlaylistItemTest() : temp_file_(GetParam()) {} void SetUp() { // SongPlaylistItem::Url() checks if the file exists, so we need a real file temp_file_.open(); absolute_file_name_ = QFileInfo(temp_file_.fileName()).absoluteFilePath(); song_.Init("Title", "Artist", "Album", 123); song_.set_url(QUrl::fromLocalFile(absolute_file_name_)); item_.reset(new SongPlaylistItem(song_)); if (!absolute_file_name_.startsWith('/')) absolute_file_name_.prepend('/'); } Song song_; QTemporaryFile temp_file_; QString absolute_file_name_; std::unique_ptr item_; }; INSTANTIATE_TEST_CASE_P(RealFiles, SongPlaylistItemTest, testing::Values( "normalfile.mp3", "file with spaces.mp3", "file with # hash.mp3", "file with ? question.mp3" )); TEST_P(SongPlaylistItemTest, Url) { QUrl expected; expected.setScheme("file"); expected.setPath(absolute_file_name_); EXPECT_EQ(expected, item_->Url()); } } //namespace clementine-1.2.3+git1354-gdaddbde+dfsg/tests/sqlite_test.cpp000066400000000000000000000005661260417502300236040ustar00rootroot00000000000000#include "gtest/gtest.h" #include TEST(SqliteTest, FTS3SupportEnabled) { sqlite3* db = nullptr; int rc = sqlite3_open(":memory:", &db); ASSERT_EQ(0, rc); char* errmsg = nullptr; rc = sqlite3_exec( db, "CREATE VIRTUAL TABLE foo USING fts3(content, TEXT)", nullptr, nullptr, &errmsg); ASSERT_EQ(0, rc) << errmsg; sqlite3_close(db); } clementine-1.2.3+git1354-gdaddbde+dfsg/tests/test_utils.cpp000066400000000000000000000041051260417502300234340ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "test_utils.h" #include #include #include #include std::ostream& operator<<(std::ostream& stream, const QString& str) { stream << str.toStdString(); return stream; } std::ostream& operator <<(std::ostream& stream, const QUrl& url) { stream << url.toString().toStdString(); return stream; } std::ostream& operator <<(std::ostream& stream, const QNetworkRequest& req) { stream << req.url().toString().toStdString(); return stream; } std::ostream& operator <<(std::ostream& stream, const QVariant& var) { stream << var.toString().toStdString(); return stream; } void PrintTo(const ::QString& str, std::ostream& os) { os << str.toStdString(); } void PrintTo(const ::QVariant& var, std::ostream& os) { os << var.toString().toStdString(); } void PrintTo(const ::QUrl& url, std::ostream& os) { os << url.toString().toStdString(); } TemporaryResource::TemporaryResource(const QString& filename) { setFileTemplate(QDir::tempPath() + "/clementine_test-XXXXXX." + filename.section('.', -1, -1)); open(); QFile resource(filename); resource.open(QIODevice::ReadOnly); write(resource.readAll()); reset(); } TestQObject::TestQObject(QObject* parent) : QObject(parent), invoked_(0) { } void TestQObject::Emit() { emit Emitted(); } void TestQObject::Invoke() { ++invoked_; } clementine-1.2.3+git1354-gdaddbde+dfsg/tests/test_utils.h000066400000000000000000000043121260417502300231010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef TEST_UTILS_H #define TEST_UTILS_H #include #include #include #include class QNetworkRequest; class QString; class QUrl; class QVariant; std::ostream& operator <<(std::ostream& stream, const QString& str); std::ostream& operator <<(std::ostream& stream, const QVariant& var); std::ostream& operator <<(std::ostream& stream, const QUrl& url); std::ostream& operator <<(std::ostream& stream, const QNetworkRequest& req); template std::ostream& operator <<(std::ostream& stream, const QList& list) { stream << "QList("; foreach (const T& item, list) { stream << item << ","; } stream << ")"; return stream; } void PrintTo(const ::QString& str, std::ostream& os); void PrintTo(const ::QVariant& var, std::ostream& os); void PrintTo(const ::QUrl& url, std::ostream& os); #define EXPOSE_SIGNAL0(n) \ void Emit##n() { emit n(); } #define EXPOSE_SIGNAL1(n, t1) \ void Emit##n(const t1& a1) { emit n(a1); } #define EXPOSE_SIGNAL2(n, t1, t2) \ void Emit##n(const t1& a1, const t2& a2) { emit n(a1, a2); } Q_DECLARE_METATYPE(QModelIndex); class TemporaryResource : public QTemporaryFile { public: TemporaryResource(const QString& filename); }; class TestQObject : public QObject { Q_OBJECT public: TestQObject(QObject* parent = 0); void Emit(); int invoked() const { return invoked_; } signals: void Emitted(); public slots: void Invoke(); private: int invoked_; }; #endif // TEST_UTILS_H clementine-1.2.3+git1354-gdaddbde+dfsg/tests/testobjectdecorators.cpp000066400000000000000000000017021260417502300254710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #define protected public #include #undef protected #include "testobjectdecorators.h" void TestObjectDecorators::initStyleOption(QProgressBar* self, QStyleOptionProgressBar* opt) { self->initStyleOption(opt); } clementine-1.2.3+git1354-gdaddbde+dfsg/tests/testobjectdecorators.h000066400000000000000000000020321260417502300251330ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef TESTOBJECTDECORATORS_H #define TESTOBJECTDECORATORS_H #include class QProgressBar; class QStyleOptionProgressBar; class TestObjectDecorators : public QObject { Q_OBJECT public slots: void initStyleOption(QProgressBar* self, QStyleOptionProgressBar* opt); }; #endif // TESTOBJECTDECORATORS_H clementine-1.2.3+git1354-gdaddbde+dfsg/tests/translations_test.cpp000066400000000000000000000023111260417502300250120ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include #include #include "core/potranslator.h" #include "test_utils.h" TEST(Translations, Basic) { ASSERT_TRUE(QFile::exists(":/translations")); ASSERT_TRUE(QFile::exists(":/translations/clementine_es.qm")); PoTranslator t; t.load("clementine_es.qm", ":/translations"); EXPECT_EQ(QString::fromUtf8("Colección"), t.translate("MainWindow", "Library")); EXPECT_EQ(QString::fromUtf8("Colección"), t.translate("", "Library")); } clementine-1.2.3+git1354-gdaddbde+dfsg/tests/utilities_test.cpp000066400000000000000000000036331260417502300243140ustar00rootroot00000000000000 /* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "test_utils.h" #include "gtest/gtest.h" #include "core/utilities.h" #include #include TEST(UtilitiesTest, HmacFunctions) { QString key("key"); QString data("The quick brown fox jumps over the lazy dog"); // Test Hmac Md5 QByteArray result_hash_md5 = Utilities::HmacMd5(key.toLocal8Bit(), data.toLocal8Bit()).toHex(); bool result_md5 = result_hash_md5 == QString("80070713463e7749b90c2dc24911e275"); EXPECT_TRUE(result_md5); // Test Hmac Sha256 QByteArray result_hash_sha256 = Utilities::HmacSha256(key.toLocal8Bit(), data.toLocal8Bit()).toHex(); bool result_sha256 = result_hash_sha256 == QString("f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8"); EXPECT_TRUE(result_sha256); } TEST(UtilitiesTest, ParseRFC822DateTim) { QDateTime result_DateTime = Utilities::ParseRFC822DateTime(QString("22 Feb 2008 00:16:17 GMT")); EXPECT_TRUE(result_DateTime.isValid()); result_DateTime = Utilities::ParseRFC822DateTime(QString("Thu, 13 Dec 2012 13:27:52 +0000")); EXPECT_TRUE(result_DateTime.isValid()); result_DateTime = Utilities::ParseRFC822DateTime(QString("Mon, 12 March 2012 20:00:00 +0100")); EXPECT_TRUE(result_DateTime.isValid()); } clementine-1.2.3+git1354-gdaddbde+dfsg/tests/xspfparser_test.cpp000066400000000000000000000111021260417502300244640ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "test_utils.h" #include "gmock/gmock-matchers.h" #include "gtest/gtest.h" #include "core/timeconstants.h" #include "playlistparsers/xspfparser.h" #include #include using ::testing::HasSubstr; class XSPFParserTest : public ::testing::Test { }; TEST_F(XSPFParserTest, ParsesOneTrackFromXML) { QByteArray data = "" "http://example.com/foo.mp3" "Foo" "Bar" "Baz" "60000" "http://example.com/albumcover.jpg" "http://example.com" ""; QBuffer buffer(&data); buffer.open(QIODevice::ReadOnly); XSPFParser parser(nullptr); SongList songs = parser.Load(&buffer); ASSERT_EQ(1, songs.length()); const Song& song = songs[0]; EXPECT_EQ("Foo", song.title()); EXPECT_EQ("Bar", song.artist()); EXPECT_EQ("Baz", song.album()); EXPECT_EQ(QUrl("http://example.com/foo.mp3"), song.url()); EXPECT_EQ(60 * kNsecPerSec, song.length_nanosec()); EXPECT_TRUE(song.is_valid()); } TEST_F(XSPFParserTest, ParsesMoreThanOneTrackFromXML) { QByteArray data = "" "" "http://example.com/foo.mp3" "" "" "http://example.com/bar.mp3" "" ""; QBuffer buffer(&data); buffer.open(QIODevice::ReadOnly); XSPFParser parser(nullptr); SongList songs = parser.Load(&buffer); ASSERT_EQ(2, songs.length()); EXPECT_EQ(QUrl("http://example.com/foo.mp3"), songs[0].url()); EXPECT_EQ(QUrl("http://example.com/bar.mp3"), songs[1].url()); EXPECT_TRUE(songs[0].is_stream()); EXPECT_TRUE(songs[1].is_stream()); } TEST_F(XSPFParserTest, IgnoresInvalidLength) { QByteArray data = "" "http://example.com/foo.mp3" "Foo" "Bar" "Baz" "60000qwerty" "http://example.com/albumcover.jpg" "http://example.com" ""; QBuffer buffer(&data); buffer.open(QIODevice::ReadOnly); XSPFParser parser(nullptr); SongList songs = parser.Load(&buffer); ASSERT_EQ(1, songs.length()); EXPECT_EQ(-1, songs[0].length_nanosec()); } TEST_F(XSPFParserTest, SavesSong) { QByteArray data; QBuffer buffer(&data); buffer.open(QIODevice::WriteOnly); XSPFParser parser(nullptr); Song one; one.set_url(QUrl("http://www.example.com/foo.mp3")); one.set_filetype(Song::Type_Stream); one.set_title("foo"); one.set_length_nanosec(123 * kNsecPerSec); one.set_artist("bar"); SongList songs; songs << one; parser.Save(songs, &buffer); EXPECT_THAT(data.constData(), HasSubstr("http://www.example.com/foo.mp3")); EXPECT_THAT(data.constData(), HasSubstr("123000")); EXPECT_THAT(data.constData(), HasSubstr("foo")); EXPECT_THAT(data.constData(), HasSubstr("bar")); } TEST_F(XSPFParserTest, SavesLocalFile) { QByteArray data; QBuffer buffer(&data); buffer.open(QIODevice::WriteOnly); XSPFParser parser(nullptr); Song one; one.set_url(QUrl("file:///bar/foo.mp3")); one.set_filetype(Song::Type_Mpeg); one.set_title("foo"); one.set_length_nanosec(123 * kNsecPerSec); one.set_artist("bar"); SongList songs; songs << one; parser.Save(songs, &buffer); EXPECT_THAT(data.constData(), HasSubstr("file:///bar/foo.mp3")); EXPECT_THAT(data.constData(), HasSubstr("123000")); EXPECT_THAT(data.constData(), HasSubstr("foo")); EXPECT_THAT(data.constData(), HasSubstr("bar")); } clementine-1.2.3+git1354-gdaddbde+dfsg/tests/zeroconf_test.cpp000066400000000000000000000020611260417502300241200ustar00rootroot00000000000000#include "gtest/gtest.h" #include "networkremote/zeroconf.h" namespace { static const char k64CharAscii[] = "aaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaa"; static const char kShortMultiByteString[] = "我会说一点汉语"; static const char kLongMultiByteString[] = "我会说一点汉语" "我会说一点汉语" "我会说一点汉语" "我会说一点汉语"; TEST(ZeroconfTest, TruncatesAscii) { QByteArray truncated = Zeroconf::TruncateName( QString::fromAscii(k64CharAscii)); EXPECT_EQ(63, truncated.size()); EXPECT_TRUE(truncated.endsWith('\0')); } TEST(ZeroconfTest, DoesNotTruncateShortMultiByteUTF8) { EXPECT_EQ( sizeof(kShortMultiByteString), Zeroconf::TruncateName(QString::fromUtf8(kShortMultiByteString)).size()); } TEST(ZeroconfTest, TruncatesLongMultiByteUTF8) { QByteArray truncated = Zeroconf::TruncateName( QString::fromAscii(kLongMultiByteString)); EXPECT_LE(63, truncated.size()); EXPECT_TRUE(truncated.endsWith('\0')); } } // namespace clementine-1.2.3+git1354-gdaddbde+dfsg/tools/000077500000000000000000000000001260417502300205275ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/tools/ultimate_lyrics_parser/000077500000000000000000000000001260417502300253145ustar00rootroot00000000000000clementine-1.2.3+git1354-gdaddbde+dfsg/tools/ultimate_lyrics_parser/CMakeLists.txt000066400000000000000000000004501260417502300300530ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.6) set(CMAKE_C_FLAGS "-Wall ${CMAKE_C_FLAGS}") set(CMAKE_CXX_FLAGS "-Woverloaded-virtual -Wall -Wno-sign-compare ${CMAKE_CXX_FLAGS}") add_executable(ultimate_lyrics_parser EXCLUDE_FROM_ALL main.cpp) target_link_libraries(ultimate_lyrics_parser ${QT_LIBRARIES}) clementine-1.2.3+git1354-gdaddbde+dfsg/tools/ultimate_lyrics_parser/main.cpp000066400000000000000000000122261260417502300267470ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include #include #include #include #include #include int ShowUsage() { qWarning() << "Usage:" << qApp->arguments()[0].toUtf8().constData() << "sites.js\n"; qWarning() << "This tool parses a sites.js file from the Ultimate Lyrics Amarok script"; qWarning() << "and outputs an XML file that can be used by Clementine."; return 2; } void WriteRuleItem(QXmlStreamWriter& writer, const QVariant& value) { if (value.type() == QVariant::String) { writer.writeStartElement("item"); writer.writeAttribute("tag", value.toString()); writer.writeEndElement(); } else if (value.type() == QVariant::List) { QVariantList list = value.toList(); writer.writeStartElement("item"); writer.writeAttribute("begin", list[0].toString()); writer.writeAttribute("end", list[1].toString()); writer.writeEndElement(); } } void WriteRules(QXmlStreamWriter& writer, const QString& name, const QVariantMap& map) { for (int i=1 ; i<=4 ; ++i) { const QString map_name = name + (i == 1 ? "" : QString::number(i)); if (!map.contains(map_name)) continue; writer.writeStartElement(name); QVariant value = map[map_name]; if (value.type() == QVariant::String) { WriteRuleItem(writer, value); } else if (value.type() == QVariant::List) { foreach (const QVariant& child, value.toList()) { WriteRuleItem(writer, child); } } writer.writeEndElement(); } } void WriteList(QXmlStreamWriter& writer, const QString& name, const QVariantMap& map) { if (!map.contains(name)) return; QVariant value = map[name]; if (value.type() == QVariant::String) { writer.writeStartElement(name); writer.writeAttribute("value", value.toString()); writer.writeEndElement(); } else if (value.type() == QVariant::List) { foreach (const QVariant& child, value.toList()) { writer.writeStartElement(name); writer.writeAttribute("value", child.toString()); writer.writeEndElement(); } } } void WriteUrlFormat(QXmlStreamWriter& writer, const QVariantList& list) { foreach (const QVariant& child, list) { if (child.type() != QVariant::Map) continue; QVariantMap map = child.toMap(); if (!map.contains("rep") || !map.contains("punct")) continue; writer.writeStartElement("urlFormat"); writer.writeAttribute("replace", map["punct"].toString()); writer.writeAttribute("with", map["rep"].toString()); writer.writeEndElement(); } } void WriteProvider(QXmlStreamWriter& writer, const QString& name, const QVariant& data) { QVariantMap map = data.toMap(); if (!map.contains("url") || map.contains("getReply")) return; writer.writeStartElement("provider"); writer.writeAttribute("name", name); writer.writeAttribute("title", map["title"].toString()); writer.writeAttribute("charset", map["charset"].toString()); writer.writeAttribute("url", map["url"].toString()); WriteUrlFormat(writer, map["urlFormat"].toList()); WriteRules(writer, "extract", map); WriteRules(writer, "exclude", map); WriteList(writer, "invalidIndicator", map); writer.writeEndElement(); } int main(int argc, char** argv) { QApplication a(argc, argv); // Parse commandline arguments if (a.arguments().count() != 2) return ShowUsage(); QString sites_filename = a.arguments()[1]; if (!QFile::exists(sites_filename)) { qWarning() << "Error:" << sites_filename << "does not exist"; return 1; } // Load the javascript file QFile sites_file(sites_filename); if (!sites_file.open(QIODevice::ReadOnly)) { qWarning() << "Error: could not open" << sites_filename; return 1; } QString javascript = QString::fromUtf8(sites_file.readAll()); javascript = javascript.section("\n}", 0, 0, QString::SectionIncludeTrailingSep); javascript.append(";\n(siteDescriptors)"); // Parse the javascript QWebPage page; QVariant data = page.mainFrame()->evaluateJavaScript(javascript); // Open the document QFile stdout(NULL); stdout.open(1, QIODevice::WriteOnly); QXmlStreamWriter writer(&stdout); writer.setAutoFormatting(true); writer.setAutoFormattingIndent(2); // Begin writing writer.writeStartDocument(); writer.writeStartElement("lyricproviders"); foreach (const QString& provider_name, data.toMap().keys()) { WriteProvider(writer, provider_name, data.toMap()[provider_name]); } writer.writeEndElement(); writer.writeEndDocument(); return 0; } clementine-1.2.3+git1354-gdaddbde+dfsg/tools/ultimate_lyrics_parser/sites.js000066400000000000000000000451101260417502300270020ustar00rootroot00000000000000/* descriptor fields specification: - url - parameters: {artist},{title},{album},{Artist},{Title},{Album},{a} - urlFormat - specify character replacements for url parameters - title - use {artist} - {title} lyrics for extracting artist and title from returned html - charset - extract - short rule(s) for extracting reply from returned html - exclude - similar as extract but inverse - invalidIndicator - string(s) that identify returned page as invalid if page contains the invalidIndicator(s) - getReply - javascript function that manually extract reply from a html page extract, exclude and invalidIndicator fields are alternative to getReply extract, exclude and invalidIndicator fields can be catenated in an array extract, exclude fields specification (2 formats): - string - an html tag - 2 lenght array - specify starting and ending string that surround data alternative (fallback) rules for extract are named extract2,extract3,extract4 (useful when a site use multiple templates) */ /* var reply = "13. Payback" var start = reply.search(new RegExp("\\d+. Payback<\\/b>","i")); Amarok.alert(start); */ const siteDescriptors = { "lyrics.wikia.com": { title: "{artist}:{title} Lyrics - ", charset: "utf-8", extract: [["
","','']], exclude: ['',['[',']'],['[',']']], url: "http://www.azlyrics.com/lyrics/{artist}/{title}.html", urlFormat : [ {rep: "", punct: " ._@,;&\\/'\"-" }, ] }, "metrolyrics.com": { title: "{artist} - {title} LYRICS", charset: "utf-8", invalidIndicator: "These lyrics are missing", extract: '', extract2: '
', exclude: '
', url: "http://www.metrolyrics.com/{title}-lyrics-{artist}.html", urlFormat : [ {rep: "-", punct: " _@,;&\\/\"" }, {rep: "", punct: "'." }, ] }, "jamendo.com": { charset: "utf-8", getReply: function(reply){ if(reply.indexOf('0) reply = reply.extractXmlTag('
'); else reply = reply.replace(/\n/g,"
") return reply; }, url: "http://www.jamendo.com/en/get/track/list/track-artist/lyricstext/plain/?searchterm={Title}&artist_searchterm={Artist}", // url: "http://www.jamendo.com/en/get/track/list/track-artist-album/lyricstext/plain/?searchterm={title}&artist_searchterm={artist}", urlFormat : [] }, "mp3lyrics.org": { title: "{artist} "{title}" Lyrics", charset: "utf-8", invalidIndicator: "Something went wrong", extract: "", extract2: '
', exclude: ["",["",":"],["Lyrics",""]], url: "http://www.mp3lyrics.org/{a}/{artist}/{title}/", urlFormat : [ {rep: "-", punct: " _@,;&\\/\"" }, {rep: "", punct: "'." }, ] }, "songlyrics.com": { title: "{title} LYRICS - {artist}", charset: "utf-8", invalidIndicator: ["Sorry, we have no", "This is an upcoming album and we do not have the"], extract: '

', exclude: [['\n[','] ']], url: "http://www.songlyrics.com/{artist}/{title}-lyrics/", urlFormat : [ {rep: "-", punct: " ._@,;&\\/\"" }, {rep: "_", punct: "'" }, ] }, "darklyrics.com": { title: "{artist} LYRICS - {title}", charset: "utf-8", getReply: function(reply, info){ // var start = reply.search(new RegExp(("\d+. " + info.arrange(info.title,this.urlFormat,false) + "").escapeRegExp(),"i")); var start = reply.search(new RegExp("\\d+. " + info.arrange(info.title,SearchInfo.prototype.defaultReplaces,false) + "[^<]*<\\/b>","i")); // var start = reply.search(new RegExp("","i")); if (start<0) return ""; // Amarok.alert(start); reply = reply.substring(start); var end = reply.search(new RegExp("")+4); reply = reply.replace(/<\/font>/ig,""); reply = reply.replace(//ig,""); return reply; }, /* matchInfo:function(reply,info,info2){ if (info2){ info.matchedTitle = info2.title; info.matchedArtist = info2.artist; // Amarok.alert(info.matchedTitle + " | " + info.matchedArtist); }else{ LyricsClass.prototype.matchInfo.call(this,reply,info); if (!info.arrange) return; var title = reply.match(new RegExp("\\d+. (" + info.arrange(info.title,SearchInfo.prototype.defaultReplaces,false) + "[^<]*)<\\/b>","i")); if (title) info.matchedTitle = title[1]; } Amarok.alert(info.matchedTitle + " | " + info.matchedArtist); }, */ invalidIndicator: "Not Found", url: "http://www.darklyrics.com/lyrics/{artist}/{album}.html", urlFormat : [ {rep: "", punct: " _@,;&\\/\"'." }, ] }, "lyricsmode.com": { title: "{artist} - {title} lyrics", charset: "iso-8859-1", invalidIndicator: "Sorry, we have no", // extract: '

', // extract2: '', extract: "
", url: "http://www.lyricsmode.com/lyrics/{a}/{artist}/{title}.html", urlFormat : [ {rep: "_", punct: " ._@,;&\\/\"" }, ] }, "elyrics.net": { title: "{title} Lyrics - {artist}", charset: "iso-8859-1", invalidIndicator: "Page not Found", extract : "
", exclude : ["",""], url: "http://www.elyrics.net/read/{a}/{artist}-lyrics/{title}-lyrics.html", urlFormat : [ {rep: "-", punct: " _@;&\\/\"" }, // removed , {rep: "_", punct: "'" }, ] }, "lyricsdownload.com": { title: "{artist} - {title} LYRICS", charset: "utf-8", invalidIndicator: "We haven't lyrics of this song", extract : '
', url: "http://www.lyricsdownload.com/{artist}-{title}-lyrics.html", urlFormat : [ {rep: "-", punct: " _@,;&\\/\"" }, {rep: "", punct: "." }, ] }, "lyrics.com": { title: "{artist} - {title} Lyrics", charset: "utf-8", invalidIndicator: "we do not have the lyric for this song", extract: '
', // extract: '
', url: "http://www.lyrics.com/lyrics/{artist}/{title}.html", urlFormat : [ {rep: "-", punct: " _@,;&\\/\"" }, {rep: "", punct: "'." }, ] }, "lyriki.com": { charset: "utf-8", extract: [['','
'],'

'], url: "http://www.lyriki.com/{artist}:{title}", urlFormat : [ {rep: "_", punct: " _@,;&\\/\"" }, {rep: "", punct: "." }, ] }, "lyricsbay.com": { title: "{title} lyrics {artist}", charset: "iso-8859-1", extract: "

", exclude: '